pax_global_header00006660000000000000000000000064136132516700014516gustar00rootroot0000000000000052 comment=208ede320abb5ffadf16dbb590116a3aff86d7cf s3d-0.2.2.1/000077500000000000000000000000001361325167000123475ustar00rootroot00000000000000s3d-0.2.2.1/.reuse/000077500000000000000000000000001361325167000135505ustar00rootroot00000000000000s3d-0.2.2.1/.reuse/dep5000066400000000000000000000017221361325167000143320ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: s3d Upstream-Contact: Simon Wunderlich Source: http://s3d.sourceforge.net/ Files: objs/* Copyright: 2006-2011, Andreas Langer 2006-2011, Christiane Weidauer 2006-2011, Mike Graenz 2006-2011, Simon Wunderlich License: GPL-2.0-or-later Files: Documentation/*/*.docbook Documentation/manpages/man*/* Documentation/Maintain.txt Documentation/README Documentation/RelNotes* Documentation/SubmittingPatches Documentation/bookinfo.docbook Documentation/*.docbook Copyright: 2006-2011, Simon Wunderlich License: GPL-2.0-or-later Files: */TODO TODO experimental/ROADMAP server/THREADS CREDIT INSTALL */README README apps/meshs3d/*.data Copyright: 2006-2011, Simon Wunderlich License: CC0-1.0 s3d-0.2.2.1/CMakeLists.txt000066400000000000000000000027651361325167000151210ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(s3d C CXX) set(VERSION 0.2.2.1) cmake_minimum_required(VERSION 3.9) # set cmake policies cmake_policy(SET CMP0003 NEW) cmake_policy(SET CMP0072 NEW) # Add directory with library checks to search path list(APPEND CMAKE_MODULE_PATH "${s3d_SOURCE_DIR}/cmake/modules") include(S3DInternals) # set path to objects set(OBJECTPATH "${S3D_DATA_INSTALL_DIR}") STRING(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE) if (NOT BUILD_TYPE MATCHES "REL(WITHDEBINFO|EASE)") set(OBJECTPATH "${OBJECTPATH}:${s3d_SOURCE_DIR}/objs") endif (NOT BUILD_TYPE MATCHES "REL(WITHDEBINFO|EASE)") # set debug level with -DDEBUG=level include(SetDebugLevel) # Enable profiling support with -DPROFILING include(EnableProfiling) # Set some compiler flags include(SetCCWarnFlags) # Enable C9X if possible # disabled because s3d uses c9x features but doesnt compile with it #include(SetC9X) # Run configure stuff include(ConfigureChecks.cmake) add_subdirectory(libs3d) add_subdirectory(libs3dw) add_subdirectory(apps) add_subdirectory(cmake) add_subdirectory(Documentation) add_subdirectory(example) add_subdirectory(objs) add_subdirectory(server) file(GLOB INCLUDE_EXPERIMENTAL experimental) if (INCLUDE_EXPERIMENTAL) add_subdirectory(experimental) endif (INCLUDE_EXPERIMENTAL) # Generate s3drc configure_file(s3drc.cmake "${s3d_BINARY_DIR}/s3drc") install(PROGRAMS "${s3d_BINARY_DIR}/s3drc" DESTINATION "${CFG_INSTALL_DIR}") s3d-0.2.2.1/CREDITS000066400000000000000000000006241361325167000133710ustar00rootroot00000000000000server/cull.c - culling code adapted from Ruud van Gaal client/sei_*.c Implementation of the fast polygon triangulation algorithm by R.Seidel (1991), implementation by Narkhede A. and Manocha D. (1994) apps/s3dvt/s3dvt.c - much of the code comes from glterm by objs/AUTHORS - see this file for the model artists - some win32 addition come from rudi. s3d-0.2.2.1/ConfigureChecks.cmake000066400000000000000000000121211361325167000164100ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(LateErrors) include(LateStatus) include(LateStatusPartial) find_package(PkgConfig) if (NOT PKG_CONFIG_FOUND) message(FATAL_ERROR "Could not find pkg-config (pkg name: pkg-config)") endif (NOT PKG_CONFIG_FOUND) # find required lib and add include dir for FREETYPE pkg_search_module(FREETYPE freetype2) if (FREETYPE_FOUND) include_directories(${FREETYPE_INCLUDE_DIRS}) else (FREETYPE_FOUND) PkgError_Later("Could not find FreeType (pkg name: libfreetype6-dev)") endif (FREETYPE_FOUND) # find required lib and add include dir for FONTCONFIG pkg_search_module(FONTCONFIG fontconfig) if (FONTCONFIG_FOUND) include_directories(${FONTCONFIG_INCLUDE_DIRS}) else (FONTCONFIG_FOUND) PkgError_Later("Could not find Fontconfig (pkg name: libfontconfig-dev)") endif (FONTCONFIG_FOUND) # find required lib and add include dir for GLIB pkg_search_module(GLIB2 glib-2.0) if (GLIB2_FOUND) include_directories(${GLIB2_INCLUDE_DIRS}) add_definitions(${GLIB2_DEFINITIONS}) else (GLIB2_FOUND) PkgError_Later("Could not find GLIB2 (pkg name: libglib2.0-dev)") endif (GLIB2_FOUND) # find required lib and add include dir for G3D pkg_search_module(G3D libg3d>=0.0.7) if (G3D_FOUND) include_directories(${G3D_INCLUDE_DIRS}) add_definitions(${G3D_DEFINITIONS}) else (G3D_FOUND) PkgError_Later("Could not find libg3d >=0.0.7 (pkg name: libg3d-dev)") endif (G3D_FOUND) # find required lib and add include dir for G3D find_package(Math) if (MATH_FOUND) else (MATH_FOUND) PkgError_Later("Could not find libm") endif (MATH_FOUND) # find required lib and add include dir for OPENGL find_package(OpenGL COMPONENTS OpenGL) if (TARGET OpenGL::OpenGL) include_directories(${OPENGL_INCLUDE_DIR}) else (TARGET OpenGL::OpenGL) PkgError_Later("Could not find OpenGL libs and headers (pkg name: libopengl-dev or libglvn-dev)") endif (TARGET OpenGL::OpenGL) # try to find lib and add include dir for SDL find_package(SDL2) if (SDL2_FOUND) include_directories(${SDL2_INCLUDE_DIR}) set(G_SDL SDL2_FOUND) else (SDL2_FOUND) find_package(SDL) if (SDL_FOUND) include_directories(${SDL_INCLUDE_DIR}) set(G_SDL SDL_FOUND) else (SDL_FOUND) PkgError_Later("Could not find SDL or SDL2 (pkg name: libsdl-dev/libsdl2-dev)") endif (SDL_FOUND) endif (SDL2_FOUND) # find lib and add include dir for CWiid pkg_search_module(CWIID cwiid) if (CWIID_FOUND) include_directories(${CWIID_INCLUDE_DIRS}) endif (CWIID_FOUND) # try to find docbook find_package(Docbook) # try to find lib and add include dir for GPS pkg_search_module(GPS libgps>=2.90) if (GPS_FOUND) set(HAVE_GPS GPS_FOUND) include_directories(${GPS_INCLUDE_DIRS}) endif (GPS_FOUND) # try to find lib and add include dir for PThreads find_package(PThreads) if (PTHREADS_FOUND) include_directories(${PTHREADS_INCLUDE_DIRS}) endif (PTHREADS_FOUND) # try to find lib and add include dir for SQLite3 pkg_search_module(SQLITE3 sqlite3) if (SQLITE3_FOUND) include_directories(${SQLITE3_INCLUDE_DIRS}) add_definitions(${SQLITE3_DEFINITIONS}) endif (SQLITE3_FOUND) # try to find lib and add include dir for LibXml2 find_package(LibXml2) if (LIBXML2_FOUND) include_directories(${LIBXML2_INCLUDE_DIR}) add_definitions(${LIBXML2_DEFINITIONS}) endif (LIBXML2_FOUND) # try to find lib and add include dir for Xcomposite pkg_search_module(XCOMPOSITE xcomposite) if (XCOMPOSITE_FOUND) include_directories(${XCOMPOSITE_INCLUDE_DIRS}) add_definitions(${XCOMPOSITE_DEFINITIONS}) endif (XCOMPOSITE_FOUND) # try to find lib and add include dir for Xdamage pkg_search_module(XDAMAGE xdamage) if (XDAMAGE_FOUND) include_directories(${XDAMAGE_INCLUDE_DIRS}) add_definitions(${XDAMAGE_DEFINITIONS}) endif (XDAMAGE_FOUND) # try to find lib and add include dir for Xfixes pkg_search_module(XFIXES xfixes) if (XFIXES_FOUND) include_directories(${XFIXES_INCLUDE_DIRS}) add_definitions(${XFIXES_DEFINITIONS}) endif (XFIXES_FOUND) # try to find lib and add include dir for Xrender pkg_search_module(XRENDER xrender) if (XRENDER_FOUND) include_directories(${XRENDER_INCLUDE_DIRS}) add_definitions(${XRENDER_DEFINITIONS}) endif (XRENDER_FOUND) # try to find lib and add include dir for Xtst pkg_search_module(XTST xtst) if (XTST_FOUND) include_directories(${XTST_INCLUDE_DIRS}) add_definitions(${XTST_DEFINITIONS}) endif (XTST_FOUND) # try to find lib and add include dir for Xtst find_package(X11) if (X11_FOUND) include_directories(${X11_INCLUDE_DIRS}) add_definitions(${X11_DEFINITIONS}) endif (X11_FOUND) # test for shm include(TestForSHM) if (HAVE_SHM) set(SHM HAVE_SHM) endif (HAVE_SHM) # test for signal include(TestForSIGS) if (HAVE_SIGS) set(SIGS HAVE_SIGS) endif (HAVE_SIGS) # test for socket include(TestForTCP) if (HAVE_TCP) set(TCP HAVE_TCP) endif (HAVE_TCP) # test for -fvisibility=hidden include(TestGCCVisibility) # test how to mark parameter as explicit unused include(TestUnusedParam) # print errors (if found) Collected_PkgErrors() # Create config.h and add path to config.h to include search path configure_file(config.h.cmake ${s3d_BINARY_DIR}/config-s3d.h) include_directories(${s3d_BINARY_DIR}) s3d-0.2.2.1/Documentation/000077500000000000000000000000001361325167000151605ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/CMakeLists.txt000066400000000000000000000031361361325167000177230ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann add_subdirectory(libs3d) add_subdirectory(libs3dw) add_subdirectory(server) project(Documentation C) if (DOCBOOK2HTML_COMPILER) add_custom_command( OUTPUT ${Documentation_BINARY_DIR}/doc_output/index.html COMMAND ${DOCBOOK2HTML_COMPILER} ARGS ${DOCBOOK2HTML_ARGS} ${Documentation_SOURCE_DIR}/s3d.docbook -o ${Documentation_BINARY_DIR}/doc_output DEPENDS ${Documentation_SOURCE_DIR}/s3d.docbook ${Documentation_SOURCE_DIR}/bookinfo.docbook ${Documentation_SOURCE_DIR}/server/server.docbook ${Documentation_SOURCE_DIR}/libs3dw/libs3dw.docbook ${Documentation_SOURCE_DIR}/libs3dw/functions.docbook ${Documentation_SOURCE_DIR}/libs3dw/structs.docbook ${Documentation_SOURCE_DIR}/libs3dw/typedefs.docbook ${Documentation_SOURCE_DIR}/libs3d/libs3d.docbook ${Documentation_SOURCE_DIR}/libs3d/functions.docbook ${Documentation_SOURCE_DIR}/libs3d/structs.docbook ${Documentation_SOURCE_DIR}/libs3d/typedefs.docbook COMMENT "Build s3d documentation" ) add_custom_target(documentation ALL echo DEPENDS ${Documentation_BINARY_DIR}/doc_output/index.html ) # install install(CODE "file(GLOB DOCS ${Documentation_BINARY_DIR}/doc_output/*)\n foreach(file \${DOCS}) \n file(INSTALL DESTINATION \"${HTML_INSTALL_DIR}\" TYPE FILE FILES \"\${file}\") \n endforeach (file \"\${DOCS}\")") else (DOCBOOK2HTML_COMPILER) PkgStatus_Later("xmlto (pkg name: xmlto)") # print late status Collected_PkgStatus("documentation") endif (DOCBOOK2HTML_COMPILER) add_subdirectory(manpages) s3d-0.2.2.1/Documentation/Maintain.txt000066400000000000000000000077001361325167000174650ustar00rootroot00000000000000Layout: - 'master' branch is used to prepare for the next feature release. The formal definition for a feature release is given later. - 'maint' branch is used to prepare the next maintenance release. After the release of an feature release this branch is set to this version and bug fixes will accumulated in this branch. After some time this version is tagged as a maintenance release. The formal definition of a feature release is given later. Setting this branch to the release is done by _merging_ the release into maint. master will merge maint from time to time. In a perfect feature release 'maint' is merged into master, master merged to maint and the feature release is tagged from the master branch. Further feature modifications are done in master and maintenance is done in maint. Feature release: - A feature release is named vX.Y.Z. It should include bugfixes and enhancements. It should be free of known bugs and regressions. A new feature release will stop the current maintenance of the old feature release. All changes in the maint branch must be included into the master branch. Maintenance release: - A maintenance release is named vX.Y.Z.W and includes only bugfixes for the vX.Y.Z feature release and previous maintenance releases of the vX.Y.Z feature release. Preparing a release: - Check if you are using git 1.6.x or better - otherwise the experimental directory will not be stripped from release tarball - Check again that you are on the right branch. 'maint' for a maintenance release vX.Y.Z.W and master for a feature release vX.Y.Z - Check the mailing list if there are any patches for the maint branch - Merge branch maint if needed - Update the version number at the beginning of /CMakeLists.txt - Test if the whole repository builds with all dependencies fulfilled. - Try build with configure options -DBUILD_LTO=ON and-DBUILD_LTO=OFF - Try to compile it with stricter linker flags to test correct linking behavior of all libraries and executables $ mkdir build $ cd build $ LDFLAGS="-Wl,--no-add-needed -Wl,--no-undefined" cmake .. $ make --no-add-needed can be omitted with GNU gold as it doesn't support the option but uses the behavior as default. - Search for existing bugs which are blockers for the upcoming release - Update the release notes in Documentation/RelNotes-X.Y.Z.txt - Tag the current version with `git tag -s vX.Y.Z -m 's3d X.Y.Z'` - Push heads and tags with $ git push $ git push --tags - Create compressed source tarballs with $ VERSION=X.Y.Z $ git archive --format=tar --prefix="s3d-$VERSION/" "v$VERSION" > "s3d-$VERSION.tar" $ gzip -n -m -c "s3d-$VERSION.tar" > "s3d-$VERSION.tar.gz" $ xz "s3d-$VERSION.tar" - Create the api tarballs with $ VERSION=X.Y.Z $ rm -rf api_build $ mkdir api_build $ cd api_build $ cmake .. $ cd Documentation $ make $ mv doc_output s3dapi_doc-"$VERSION" $ find s3dapi_doc-"$VERSION" -type f |sed 's/^\.*\/*//'|sort > manifest $ tar cf s3dapi_doc-"$VERSION".tar --owner 0 --group 0 --numeric-owner --mode 0644 --files-from manifest $ gzip -n -m -c "s3dapi_doc-$VERSION.tar" > "s3dapi_doc-$VERSION.tar.gz" $ xz "s3dapi_doc-$VERSION.tar" - Add files to SourceForge using https://sourceforge.net/projects/s3d/files/ - Add RelNotes-* as README to the same folder - Get current webpage from web.sourceforge.net $ rsync -aPc USERNAME@web.sourceforge.net:/home/project-web/s3d/htdocs/ s3d_htdocs $ s3d_htdocs - Change index.xhtml to announce the new release - Extract api tarball to doc/X.Y.Z - Add it to repository with `git add doc/X.Y.Z` and insert it to doc/index.xhtml - Commit the changes - Sync the webpage $ rsync -aPc . USERNAME@web.sourceforge.net:/home/project-web/s3d/htdocs/ - Add a release note to http://freshmeat.net/projects/s3d_ s3d-0.2.2.1/Documentation/README000066400000000000000000000015761361325167000160510ustar00rootroot00000000000000You can read this online on http://s3d.sourceforge.net/doc or compile it yourself, for example with docbook2html s3d.docbook These source files are partially automatic generated. To update them you must run "doxygen xml.doxygen" and ./extractdefinitions.py afterwards. manpages can then be generated by running "cd manpages && ./build-manpages.sh" and normal html help will be generated by the normal build process. When new documentation should generated following files generated by the mentioned steps are important for the scm: libs3d/functions.docbook libs3d/structs.docbook libs3d/typedefs.docbook libs3dw/functions.docbook libs3dw/structs.docbook libs3dw/typedefs.docbook manpages/man1/*.1 manpages/man3/*.3 (sgml must not be added to the scm after running ./build-manpages.sh) manpages/man9/*.9 (sgml must not be added to the scm after running ./build-manpages.sh) build-manpages.sh s3d-0.2.2.1/Documentation/RelNotes-0.0.1.txt000066400000000000000000000036671361325167000201220ustar00rootroot00000000000000S3D v0.0.1 Release Notes ======================== 2005-01-27 Simon Wunderlich * dot_mcp close button works :D * fixed picking problems * some Makefile enhancements 2005-01-22 Simon Wunderlich * removed funky debugging colors from freetype.c * fixed drawing problems in s3dvt.c * saving font file in memory for performance reasons * icons in the mcp * changed the link-loop in the right direction with a recursive solution 2005-01-21 Simon Wunderlich * fixed some little picking glitch * polygon packet fragmentation 2005-01-12 Simon Wunderlich * client is now operating with sigio * some advances in dot_mcp and minor fixes 2005-01-08 Simon Wunderlich * merged headerfiles graphics.h, user.h into global.h * masking flags private * some cleanup in user.c, mousewheel can now be used, using mouse-move-difference now. * the camera is now an object * implemented rotate and scale * picking now goes throu render_mcp() 2005-01-07 Simon Wunderlich * implemented mcp-focus, unlinking and changing targets for clones * freetype fonts normalized to height 1 2005-01-06 Simon Wunderlich * cleared some bad code, s3dvt works now * changed SIGIO so polling will only be called throu network_main(), because things are not thread-safe now. 2005-01-04 Simon Wunderlich * changed the malloc(), memcpy()-rest things to realloc() 2005-01-03 Simon Wunderlich * changed network polling to SIGIO * some minor cleanups 2005-01-02 Simon Wunderlich * started changelog ;) * finished basic truetype support * s3dvt.c started * some minor graphics optimizations * added usleep() into 3dsloader.c ... 2004-08-?? Simon Wunderlich * s3d started. dunno the correct date thou :X s3d-0.2.2.1/Documentation/RelNotes-0.0.2.txt000066400000000000000000000007751361325167000201200ustar00rootroot00000000000000S3D v0.0.2 Release Notes ======================== 2005-01-30 Simon Wunderlich * args are now removed after read by s3d_init() * changed the s3d_init() call to use pointer * removed a few examples which showed just nothing * search ttf files over the Xfontpath now * added clock.c * some Makefile changes and server bugfixes * client now listens to S3D-env again 2005-01-28 Simon Wunderlich * have a standard url to connect to (s3d://127.0.0.1:6066) s3d-0.2.2.1/Documentation/RelNotes-0.1.1.txt000066400000000000000000000002311361325167000201030ustar00rootroot00000000000000S3D v0.1.1 Release Notes ======================== * client is now libs3d. * added widget library libs3dw. * olsrs3d uses widgets for search input. s3d-0.2.2.1/Documentation/RelNotes-0.1.txt000066400000000000000000000377341361325167000177660ustar00rootroot00000000000000S3D v0.1 Release Notes ====================== 2006-03-19 Simon Wunderlich * FINALLY, PROUDLY PRESENTING: S3D VERSION 0.1!!! * this changelog is pretty incomplete. Please use the subversion ChangeLog (by typing svn log) for updates. * We will stop this Changelog now, as svn does the dirty work :) 2006-03-15 Andreas Kohn * some configure.ac changes to fix glut/sdl detection code * some autoconf magic to fix pthread detection for esoteric arch's. * a big hammer to prevent fortran checks 2006-03-14 Simon Wunderlich * added push/pep/pop-line and pep-vertex * dot_mcp now has egoshooter-mode (w,a,s,d) * added some Documentation entries 2006-03-10 Simon Wunderlich * added rc functionality: use /etc/s3drc or ~/.s3drc to automatically fire up your mcp or anything you want. 2006-03-07 Simon Wunderlich * fixed -O2 problem 2006-03-03 Simon Wunderlich * using values from config.h, user does not have to edit server/config.h or clients/config.h anymore to fit his/her needs * Finally, Font triangulating is stable (at least it seems so ;) 2006-02-27 Simon Wunderlich * added GPL/LGPL copyright notes (phew -.-) * implemented object search path as : delimited list * INFINITY define into #ifndef * splitting README and INSTALL * security check for strncat and strncpy functions 2006-02-22 Simon Wunderlich * only select the nearest hit when clicking, not all on the line * fopen errors are not that important when looking through the search path ... * SIGNAL -> WITH_SIGNALS 2006-02-20 Simon Wunderlich * added mplayer patch: patch your mplayer, use -vo s3d on the commandline and watch your videos in s3d in 3d space - yay 2006-02-18 Simon Wunderlich * by commenting out DEBUG define, all debug messages will not even be [call]ed * dot_mcp added view reset button, fixed rotate button * dot_mcp has now some "GO!!" menu * 3dsread.c x-axis inversion fixed * fixed 0.0 size application problem * removed c++ styles in olsrs3d 2006-02-17 Simon Wunderlich * gintl() and gints() added in 3dsread.c, hopefully improving endianess compatibility * moved dot_mcp to apps * abadoning my own tries and the glu-tesselator for triangulating the fonts and using public domain code for seidels algorithm by Narkhede A. and Manocha D. 2006-01-30 Andreas Kohn * rework larger parts of the build infrastructure, use automake and libtool. 2005-12-22 Simon Wunderlich * fixed: server did not unfocus when app quits ... * mcp got some nice rotation mode 2005-12-21 Simon Wunderlich * fixed some focusing/camera update issues * perfomance improvement in olsrs3d 2005-12-16 Simon Wunderlich * telling the mcp/programs aspect ratio of the cam * new layout in the mcp. 2005-12-12 Simon Wunderlich * tuning on the configure/make system * added glutInit(), to make glut happy 2005-12-05 Simon Wunderlich * some more work on the olsr visualizer, testing with more graphs, hope it won't explode anymore ;) 2005-11-27 Simon Wunderlich * finished olsrs3d, the olsr-visualizer 2005-11-26 Simon Wunderlich * removed some race condition bug in the server 2005-11-25 Simon Wunderlich * starting olsrs3d 2005-10-24 Simon Wunderlich * some more bugfixes in the autoconf-script. 2005-10-23 Simon Wunderlich * autoconf script nearly completed, it only compiled the apps you have the right libraries available. 2005-10-14 Simon Wunderlich * so long no update ... project is kind of sleeping :( * autoconf configure script started. Now you can check for your libs before compiling. 2005-07-10 Simon Wunderlich * filebrowser is now some cake with pies to select :) 2005-07-04 Simon Wunderlich * massive cleanup in s3dvt, removing nextchar in linestructures-weirdness, just having cx/cy as cursor positions. 2005-07-03 Simon Wunderlich * fixed backspace and startup race-condition in s3dvt * fixed some CR/LF confusion in s3dvt 2005-06-27 Simon Wunderlich * logical and won't work on OF_CAM as it has 2 bits set - fixed some code handling this. 2005-06-26 Simon Wunderlich * forgot to check if link-request wants to link on itself * internal cleanup, like renaming obj_link_remove into obj_unlink in the server * removed some bugs which caused a segfault when trying to pep/delete something which is not present. * mcp does not use ring-structure anymore, places apps at the bottom of the screen. 2005-06-25 Simon Wunderlich * added ignore-callback into client-lib ... keeps the event-stack clean. * some standard-signal-handlers for sigint/sigterm added into s3d_init() 2005-06-22 Simon Wunderlich * some fixing in the clones-radius calculations * system-apps are now properly transfered 2005-06-21 Simon Wunderlich * transferring system-positions (like cams etc) to app-space and reporting it. this is useful for HUD-like things in apps. (e.g. linking things to the cam). * some fixes with clone/system confusion * somehow I passed the 10.000-line-mark O_o 2005-06-20 Simon Wunderlich * mcp-objects will be added when app logs in * no static cam-object anymore * each app get it's copy of system objects 2005-06-19 Simon Wunderlich * scale now only has one parameter for uniform scale, no x/y/z-scale anymore... it's too much trouble for me. 2005-06-16 Simon Wunderlich * fixed camera navigation * put some rounding error-workaround into myInvert(), no more flickering in the camera 2005-06-15 Simon Wunderlich * rotation order changed, now this order: y,x,z this would logically be the earth position order: placing at longitude/latitude(y/x), and spin yourself at this place (z) :) 2005-06-14 Simon Wunderlich * linking to camera works now ... somehow :) * shm does not segfault on after quit-signal anymore * added s3d_object_info, to replace the mcp_* things later * camera info is now transferred to client * some minor fixes 2005-06-13 Simon Wunderlich * added some flags O_o 2005-06-07 Simon Wunderlich * shm checks for connection after some idle time * removed stupid usleep in shm_writen/shm_readn which is now only called after buffer was full 2005-06-04 Simon Wunderlich * matrix inverse works now. 2005-06-03 Simon Wunderlich * started matrix inverse (the buggy base) 2005-05-29 Simon Wunderlich * changed matrix-type name from t_mat to t_mtrx so it can't be confused with struct t_mat * started cull.c, should speed things up by culling 2005-05-26 Simon Wunderlich * s3d_x11gate now sends key-events to the server, thou special keys are not properly supported yet. support for different depths added. 2005-05-25 Simon Wunderlich * calibrated card positions of s3dgps 2005-05-22 Simon Wunderlich * seperated the mcp-menu into s3d_appstarter.c * changed the mcp-display structure to a ring/planet like one 2005-05-16 Simon Wunderlich * fixed a bug in matrix.c which was responsible for bad calculation of the z-axis in object radius * wiped obsolete find_cloneparent() and get_obj_by_oid() in server 2005-05-15 Simon Wunderlich * s3dgps now draws gpsdrive-downloaded maps and marks position acquired from gpsd 2005-05-14 Simon Wunderlich * lots of cleanup * passing struct t_process pointers instead of pids internally * fixed bad order in transformations in the server, it first rotated, then scaled 2005-05-11 Simon Wunderlich * fixed some bugs with new process managment and mcp * focus_pid becomes focus_oid * shm works ;) 2005-05-08 Simon Wunderlich * reimplementation of process-managment * added apps/ directory for some programs which are (/supposed to be) more than plain examples * started s3dgps.c 2005-05-06 Simon Wunderlich * client can now connect to shm by url 2005-05-05 Simon Wunderlich * fixed server picking code * fixed Makefile * implemented shm.c and shm_ringbuffer.c in both client and server, phew ... * server: created tcp.c, removing tcp-special things from network.c to make things generic for upcoming shm and other ways to communicate. * server: cleaned up prot_com_in() and prot_com_out() 2005-04-30 Simon Wunderlich * put some (u)intXX_t's into the client code 2005-04-29 Simon Wunderlich * added a running cat (katze.c) in examples * renamed s3d_clone_object to s3d_clone and s3d_change_clone_target to s3d_clone_target 2005-04-28 Simon Wunderlich * now checking FD_SETSIZE so we don't overflow * snowman is now spinning ;) * all files compile with -pedantic now (removed C++ style // comments and such) * removed bad signal handling which only worked with -O2 2005-04-26 Simon Wunderlich * some cleanup in server/object.c * scaled clone objects are properly handled now * introducing OF_CLONE_SRC and OF_LINK_SRC * using fstat() to get filesize 2005-04-22 Simon Wunderlich * added snowman.c in examples 2005-04-21 Simon Wunderlich * s3d_x11gate only updating changed scanlines * cleaned up the typemess in server. objects are now declared as uint32_t there. 2005-04-20 Simon Wunderlich * s3d_x11gate added, can display some x11-screen into an s3d-texture 2005-04-19 Simon Wunderlich * fixed some bug in texture loading * mplayer vo-plugin is working ;) 2005-04-17 Simon Wunderlich * repaired texture functions so any texture size can now be applied. * added make install/uninstall * started some simple mplayer vo plugin * added s3d_pep_texture() in client 2005-04-16 Simon Wunderlich * remove -O3 as it breaks on functions with many arguments * added texture handling functions for both client and server * added texturetest.c - textures finally work! * renamed s3d_push_polygon_array to s3d_push_polygons and other *_array* functions like that 2005-04-13 Simon Wunderlich * added full load/pepping for texture coords, normals and materials in the server. * repaired some things in the s3dvt 2005-04-09 Simon Wunderlich * no obj_size_update() in obj_push_vertex, using "realtime updating" for performance. 2005-04-06 Simon Wunderlich * app radius and object radius is now recalculated instantly using obj_size_update(), obj_pos_update() and obj_check_biggest_obj() * NULL-pointers at the end of the object stack will be freed now using macro obj_valid() to obtain object (and check) * lots of bugfixing 2005-04-05 Simon Wunderlich * checking for circular links when calling obj_link() * added obj_pos_update() * no clone-forwarding now! it's only confusing anyways ... * link/clone references of mcp-objects get handled when a process disappears 2005-04-04 Simon Wunderlich * some changes in obj_clone_change and others so clone chains can't be build anymore. 2005-04-02 Simon Wunderlich * started some simple configure script 2005-04-01 Simon Wunderlich * some optimizations in s3dvt.c * s3d gives focus to latest entered program if there is no mcp 2005-03-25 Simon Wunderlich * mcp_focus gave focus to mcp-object, not pid - fixed. 2005-03-24 Simon Wunderlich * checking clone container for unallowed, e.g. virtual objects before cloning * fixed s3dvt.c for pipe mode, but it does not really satisfies (ssh does not work, weird behavior). * pipe mode will only work as fallback now. * fixed minor bugs in dot_mcp.c. added a transparent sphere around the objects 2005-03-23 Simon Wunderlich * client/object_queue.c created. object adding is now cached and MUCH faster! * remove clone call. it works now with changing clone target. 2005-03-19 Simon Wunderlich * changed example/s3dvt.c to work with pipes instead of tty's 2005-03-18 Simon Wunderlich * server/object.c: can't upload data to OF_VIRTUAL-objects now. 2005-03-17 Simon Wunderlich * fixed some bug in freetype.c (char overflowing) 2005-03-16 Simon Wunderlich * fixed some error in matrix.c, radius is now calculated correctly for app objects (I hope) * s3d_pep_material[_a]() added 2005-03-13 Simon Wunderlich * added alpha transparency * using into_position into render_by_mcp() now. 2005-03-12 Simon Wunderlich * obj_load_tex() written * added a simple menu in dot_mcp.c 2005-03-08 Simon Wunderlich * now telling mcp about resizing (buggy) * some more caching in size calculation * filebrowser minor things * mcp updates apps now. 2005-03-01 Simon Wunderlich * started the Documentation. 2005-02-28 Simon Wunderlich * now caching tesselated glyphs (but seems not to be a big performance boost...) 2005-02-27 Simon Wunderlich * prepared proto.h for textures * removed some bug which deleted display lists of clone parents if the clone is deleted * some more work on the filebrowser 2005-02-17 Simon Wunderlich * introducing s3d_mainloop, changing all examples for new api... * deleted example/picktest.c (it's useless) * added client/config.h 2005-02-16 Simon Wunderlich * made local cvs, including proto.h with -I compiler option now instead of symlinking it. 2005-02-14 Simon Wunderlich * added libfontconfig support for fontselect.c 2005-02-12 Simon Wunderlich * removed some stupid bug in event.c :) * fontselect.c for selecting the right font * implemented smoothing groups for 3dsreader.c * some more malloc()s and free()s in client removed * renamed s3d_add_* to s3d_push_* as / s3d_del_* s3d_pop_* to match protocol better. * added S3D_P_C_PEP_POLY_NORMAL to protocol,server client 2005-02-11 Simon Wunderlich * callback system implemented in client 2005-02-10 Simon Wunderlich * finished obj_get_maximum() for clones and links and applications. * added find_cloneparent() * added matrix.c 2005-02-09 Simon Wunderlich * made SIGIO optional, fixed G_GLUT/G_SDL config options * attempt to make code a little bit more win32-friendly 2005-02-08 Simon Wunderlich * client shared lib is now compiling with -fPIC for x86_64 2005-02-05 Simon Wunderlich * fixed some bug in (the bad) font selection code * added get_radius() and sizing things to the protocol * added get_maximum() to find size of an object * normalizing has it's own function now, calc_normal() * cleaned up obj_render() somehow 2005-02-02 Simon Wunderlich * remove static font paths. * eliminated some bad malloc in proto.c :) s3d-0.2.2.1/Documentation/RelNotes-0.2.1.1.txt000066400000000000000000000014541361325167000202530ustar00rootroot00000000000000S3D v0.2.1.1 Release Notes ========================== * Fixes sigbus on MIPS. * Fix wrong commands send by libs3d. * Generate endian safe floats when sending over the network. * Allow to go more then two levels deep in s3dfm. * Depend on libg3d 0.0.7 to fix orientation of loaded objects. * Fix build warnings and errors with newer cmake, gpsd. * Correct parsing of libs3d parameters in some situations. * Port s3dosm to api version 0.6 of OpenstreetMap.org. * Added extra checks to fix crashes in unlikely situations. * Remove object files with unknown copyright situation. * Reduce number of libraries an executable links against. * Enable compilation under cygwin. * Correct file loading on systems with CRLF newlines. * Build API documentation with xmlto instead of docbook2html. s3d-0.2.2.1/Documentation/RelNotes-0.2.1.txt000066400000000000000000000007041361325167000201110ustar00rootroot00000000000000S3D v0.2.1 Release Notes ======================== * GLUT specific parts were removed from server. * server will generate mipmaps for textures. * SHM connected server and clients will now share their texture buffers over shm. Clients will only send update notices to inform the server. * s3dosm is now OSM api 0.5 compatible. * C++ compatible api headers (no abi changes). * of course: fixed various bugs (Thanks Sven for your effort!!). s3d-0.2.2.1/Documentation/RelNotes-0.2.2.1.txt000066400000000000000000000017411361325167000202530ustar00rootroot00000000000000S3D v0.2.2.1 Release Notes ========================== * Fix minor typographical errors in documentation. * Change all references from berlios to the new hoster sourceforge. * Update mail information for Marek Lindner, Simon Wunderlich and Andreas Langer. * Fail earlier in s3dvt during the start of the shell when setuid/setgid fails to change euid/egid/fsuid/.. to the uid/gid and don't wait for bash to handle it for the terminal emulator. (CVE-2013-6876, CVE-2014-1226) Thanks to Hector Marco and Ismael Ripoll for reporting * Use versioned symbols for exported libraries to make migration to an incompatible ABI easier. * Support libgps API 9 in s3dosm. * Add support for glibc 2.30 * Switch to SDL2 and vendor neutral OpenGL dispatcher * Replace build optimization via ENABLE_FINAL with cmake 3.9 based BUILD_LTO * Fix various memory and socket leaks * Fix rendering of letters with unexpected 0 size areas s3d-0.2.2.1/Documentation/RelNotes-0.2.2.txt000066400000000000000000000016001361325167000201060ustar00rootroot00000000000000S3D v0.2.2 Release Notes ======================== * Generate documentation from source code. * Allow pseudo global optimisations for each module using -DENABLE_FINAL=ON as cmake parameter. * Support batman-adv visualisation output and IPv6 addresses in meshs3d. * Stricter const usage for strings to better integrate into (e)glibc's stricter const usage in version 2.10. * Added better support for libraries in unusual places using pkg-config. * Support of systems with unusual named OpenGL headers through SDL. * Reduced library dependencies of compiled shared objects. * Depend on libgps 2.90 for s3dosm GPS support as it is the first version with longer binary and API stability. * Removed BSD PTY support in favor of Unix98 PTYs for s3dvt. * Support to build s3d as position independent executable using gcc's -pie and -fPIE option without breaking libs3d(w). s3d-0.2.2.1/Documentation/RelNotes-0.2.txt000066400000000000000000000013351361325167000177530ustar00rootroot00000000000000S3D v0.2 Release Notes ====================== * Released S3D Version 0.2. * now using cmake instead of autohell, which seems to be faster, more configurable and at least comprehensible (Thanks to Sven Eckelmann). * meshs3d is a complete rewrite of olsrs3d, using faster data structures and clean design (implemented by Andreas Langer). * s3dosm is a new program to navigate on openstreetmap maps. it has gps-support, superseding the old s3dgps which operated on bitmap map files. * kism3d (implemented by Marek Lindner) visualizes the wireless networks and works as a frontend to kismet. * texture support is now using mipmaps. * added a few widgets (textbox/scrollbars). * of course: fixed various bugs. s3d-0.2.2.1/Documentation/SubmittingPatches000066400000000000000000000041111361325167000205350ustar00rootroot00000000000000Patches will be applied directly using ‘git am‘ ‐ so please send your mail as text/plain without PGP encryption applied. The subject line should act as summary of your patch and the body should have a meaningful commit message with information about motivations for this patch and how it changes the behavior. Don’t commit commented code and follow the coding style described at http://s3d.sourceforge.net/style_guide The patch must apply without any problems on the desired branch. So if it is a bug fix then it must apply against the maint branch and if it is new feature or a bug fix only available in the master branch then it must apply against the master branch. ‘git format‐patch ‐M‘ should be used to create these patches. Further changes to this file should only be done in rare situations. An example could be to add v2 to [Patch v2] to inform other users that this makes another unapplied patch obsolete. If you want to add other information to the patch which should not go into the commit message then write an extra summary mail or add these information in the part between ‐‐‐ and the diffstat ‐ please test afterward if the patch still applies cleanly. Don’t paste the patch into your mailer ‐ this will ruin the patch in most cases. Try to use ‘git send‐email‘ or read Documentation/email‐clients.txt inside the linux kernel tree. Read Documentation/SubmittingPatches inside the git and linux‐2.6 tree. Anything but the application specific information should be the same for s3d. They are also describing what a good commit messages is, why it is important to send the mail like it was generated by ‘git format‐patch‘ and what the Signed‐off‐by means and how it should be used. Your patch must be licensed under the GPL2+ (or LGPL2.1+ for libs3d and libs3dw). If you think that your patch is ready for inclusion then send it to s3d‐devel@lists.sourceforge.net You must be subscribed to the mailing list or otherwise your mail will be dropped without further notice. s3d-0.2.2.1/Documentation/TODO000066400000000000000000000000441361325167000156460ustar00rootroot00000000000000* libs3d - texture start position s3d-0.2.2.1/Documentation/bookinfo.docbook000066400000000000000000000007751361325167000203410ustar00rootroot00000000000000 S3D - a 3D Desktop Environment Simon Wunderlich 06/05/2006 0.2 This is the Documentation for the S3D and it's Development Libraries. s3d API handbook guide s3d-0.2.2.1/Documentation/extractdefinitions.py000077500000000000000000000536721361325167000214600ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8; -*- # SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann import xml.dom.minidom from xml.dom.minidom import Node import os import re def main(): print('reading with "doxygen xml.doxygen" generated files') refidlist = [] libs3d = xml.dom.minidom.parse("xml/s3d_8h.xml") libs3dw = xml.dom.minidom.parse("xml/s3dw_8h.xml") libs3d_func = extract_functions(libs3d) libs3dw_func = extract_functions(libs3dw) refidlist += libs3d_func + libs3dw_func libs3d_struct = extract_structs(libs3d) libs3dw_struct = extract_structs(libs3dw) refidlist += libs3d_struct + libs3dw_struct libs3d_typedef = extract_typedefs(libs3d) libs3dw_typedef = extract_typedefs(libs3dw) refidlist += libs3d_typedef + libs3dw_typedef docbook_functions.generate('libs3d', "s3d.h", libs3d_func, refidlist) docbook_functions.generate('libs3dw', "s3dw.h", libs3dw_func, refidlist) docbook_structs.generate('libs3d', libs3d_struct, refidlist) docbook_structs.generate('libs3dw', libs3dw_struct, refidlist) docbook_typedefs.generate('libs3d', libs3d_typedef, refidlist) docbook_typedefs.generate('libs3dw', libs3dw_typedef, refidlist) rm_files('./manpages/man3/') manpage_functions.generate("s3d.h", libs3d_func) manpage_functions.generate("s3dw.h", libs3dw_func) rm_files('./manpages/man9/') manpage_structs.generate("s3d.h", libs3d_struct) manpage_structs.generate("s3dw.h", libs3dw_struct) """ Remove all files in a directory and creates it when it does not exist """ def rm_files(top): try: os.makedirs(top) except OSError: pass for entry in os.listdir(top): if os.path.isfile(os.path.join(top, entry)): os.remove(os.path.join(top, entry)) """ Removes _ from beginning of a string """ def cleanup_stringbegin(string): new_str = string while new_str[0] in ['_']: new_str = new_str[1:] return new_str """ Generate text from all childNodes """ def get_text(node): t = '' for node in node.childNodes: if node.nodeType == Node.TEXT_NODE: t += node.data else: t += get_text(node) return t """ Add references to docbook dom """ def link_refids(dom, refidlist): for refitem in refidlist: link_refid(dom, refitem['name'], refitem['id']) """ Search text in dom for name to replace it by link to refid """ def link_refid(dom, name, refid): num_nodes = len(dom.childNodes) i = 0 while i < num_nodes: node = dom.childNodes[i] if node.nodeType == Node.TEXT_NODE: string = node.data valid_suround = ['', ',', '.', ' ', '(', ')', '\n', '\r', '!', '?'] found = 0 while found != -1: found = string.find(name, found) if found != -1: next_char = '' prev_char = '' # check for valid surounding chars if (found + len(name)) < len(string): next_char = string[found + len(name)] if found > 0: prev_char = string[found - 1] if next_char in valid_suround and prev_char in valid_suround: # suroundings chars ok -> safe beginning and link create_before_text(dom, string[:found], node) link = create_before(dom, 'link', node) link.setAttribute('linkend', refid) create_append_text(link, name) num_nodes = num_nodes + 2 i = i + 2 # continue search after laster found string = string[(found + len(name)):] found = 0 else: #no valid surounding chars found -> move on found = found + 1 else: # finishes search and can now remove old strings create_before_text(dom, string, node) dom.removeChild(node) else: if node.nodeName not in ['funcprototype', 'title']: link_refid(node, name, refid) i = i + 1 class detaileddescription: t = [] def __init__(self, node): self.t = [] self.__get_text_complex(node) self.__complex2simplearray() """ Generate linear list of text and section types """ def __get_text_complex(self, node): for node in node.childNodes: if node.nodeType == Node.TEXT_NODE: self.t.append(node.data) else: if node.nodeName == 'sp': self.t.append(" ") elif node.nodeName == 'para': self.t.append({'type': 'para', 'text': ''}) self.__get_text_complex(node) elif node.nodeName == 'programlisting': self.t.append({'type': 'programlisting', 'text': ''}) self.__get_text_complex(node) self.t.append({'type': 'para', 'text': ''}) elif node.nodeName == 'simplesect': if node.attributes['kind'].nodeValue == 'remark': self.t.append({'type': 'warning', 'text': ''}) self.__get_text_complex(node) self.t.append({'type': 'para', 'text': ''}) else: self.t.append({'type': 'para', 'text': ''}) self.__get_text_complex(node) else: self.__get_text_complex(node) """ Convert linear list of text and section types to list of section types with corresponding text """ def __complex2simplearray(self): cur_object = 0 array = [] for element in self.t: if type(element) != dict: # add text to last section type if cur_object == 0: array.append({'type': 'para', 'text': element}) cur_object = array[0] else: cur_object['text'] += element else: # add new section type if element['type'] == 'para' and len(array) != 0 and array[-1]['type'] in ['warning']: # ignore para inside warning and add text to last section type cur_object['text'] += element['text'] else: cur_object = element array.append(element) self.t = array """ Append complex help section to dom """ def dom_append(self, sect): for p in self.t: if p['text'] != '': if p['type'] in ['warning']: # add para in warning before adding help text extra_para = create_append(sect, p['type']) para = create_append(extra_para, 'para') create_append_text(para, p['text']) else: if p['text'].strip() == '': continue para = create_append(sect, p['type']) create_append_text(para, p['text']) def isempty(self): return (len(self.t) == 0) or (len(self.t) == 1 and self.t[0]['text'].strip() == '') class function_param: def __init__(self, node): self.param = {'type' : '', 'declname' : '', 'array' : ''} for n in node.childNodes: if n.nodeName == 'type': self.param['type'] = get_text(n) if n.nodeName == 'declname': self.param['declname'] = get_text(n) if n.nodeName == 'array': self.param['array'] = get_text(n) def dom_append(self, funcprototype, intent = ""): paramdef = create_append(funcprototype, 'paramdef') create_append_text(paramdef, intent+self.param['type']) if self.param['declname'] != '': if self.param['type'][-1:] != "*": # dont add space between * and name create_append_text(paramdef, " ") parameter = create_append(paramdef, 'parameter') create_append_text(parameter, self.param['declname']) if self.param['array'] != '': create_append_text(paramdef, self.param['array']) def is_void(self): if self.param['type'] == 'void' and self.param['declname'] == '': return 1 else: return 0 class struct_element: def __init__(self, node): self.element = {'type': '', 'name' : '', 'help': []} for node2 in node.childNodes: if node2.nodeName == "name": self.element['name'] = get_text(node2) if node2.nodeName == "type": self.element['type'] = get_text(node2) if node2.nodeName == 'detaileddescription': self.element['help'] = detaileddescription(node2) def dom_append(self, programlisting): create_append_text(programlisting, '\t'+self.element['type']) if self.element['type'][-1:] != "*": # dont add space between * and name create_append_text(programlisting, " ") create_append_text(programlisting, self.element['name']+';\n') def dom_append_help(self, variablelist): # ignore members with empty help texts if self.element['help'].isempty(): return varlistentry = create_append(variablelist, 'varlistentry') term = create_append(varlistentry, 'term') create_append_text(term, self.element['name']) listitem = create_append(varlistentry, 'listitem') # add help to struct member self.element['help'].dom_append(listitem) def remove_exportdefinitions(function_return): exports = ["S3DEXPORT", "S3DWEXPORT"] for export in exports: if function_return[:len(export)] == export: return function_return[len(export):].strip() """ Create new node with tag name node_type and add it to father """ def create_append(father, node_type): if father.ownerDocument: t = father.ownerDocument.createElement(node_type) else: # no father -> so it must be a document t = father.createElement(node_type) father.appendChild(t) return t """ Create new processing instruction with tag name node_type and add it to father """ def create_append_pi(father, node_type, instruction): if father.ownerDocument: t = father.ownerDocument.createProcessingInstruction(node_type, instruction) else: # no father -> so it must be a document t = father.createProcessingInstruction(node_type, instruction) father.appendChild(t) return t """ Create new text node with text and add it to father """ def create_append_text(father, text): if father.ownerDocument: t = father.ownerDocument.createTextNode(text) else: # no father -> so it must be a document t = father.createTextNode(text) father.appendChild(t) return t """ Create new node with tag name node_type and add it to father before refnode """ def create_before(father, node_type, refnode): if father.ownerDocument: t = father.ownerDocument.createElement(node_type) else: # no father -> so it must be a document t = father.createElement(text) father.insertBefore(t, refnode) return t """ Create new text node with text and add it to father before refnode """ def create_before_text(father, text, refnode): if father.ownerDocument: t = father.ownerDocument.createTextNode(text) else: # no father -> so it must be a document t = father.createTextNode(text) father.insertBefore(t, refnode) return t """ Extract function information from doxygen dom """ def extract_functions(dom): functionlist = [] for node in dom.getElementsByTagName("memberdef"): # find nodes with functions information if node.attributes['kind'].nodeValue != 'function': continue function = {'return': '', 'name': '', 'id': '', 'param': [], 'brief': '', 'help': []} for node2 in node.childNodes: if node2.nodeName == "name": function['name'] = get_text(node2) function['id'] = function['name'] if node2.nodeName == "type": function['return'] = remove_exportdefinitions(get_text(node2)) if node2.nodeName == "param": function['param'].append(function_param(node2)) if node2.nodeName == "briefdescription": function['brief'] = get_text(node2) if node2.nodeName == 'detaileddescription': function['help'] = detaileddescription(node2) functionlist.append(function) return functionlist """ Extract struct information from doxygen dom """ def extract_structs(dom): structlist = [] # find refs (names of xml files) of structs for node in dom.getElementsByTagName("innerclass"): struct = {'name': '', 'id': '', 'ref': '', 'elements': [], 'brief': '', 'help': []} struct['name'] = get_text(node) struct['id'] = 'struct'+struct['name'] struct['ref'] = node.attributes['refid'].nodeValue structlist.append(struct) # open xml files and extract information from them for struct in structlist: dom = xml.dom.minidom.parse("xml/"+struct['ref']+".xml") for node in dom.getElementsByTagName('compounddef')[0].childNodes: if node.nodeName == "briefdescription": struct['brief'] = get_text(node) if node.nodeName == 'detaileddescription': struct['help'] = detaileddescription(node) for node in dom.getElementsByTagName("memberdef"): struct['elements'].append(struct_element(node)) return structlist """ Extract typedef information from doxygen dom """ def extract_typedefs(dom): typedeflist = [] for node in dom.getElementsByTagName("memberdef"): # find nodes with typedef information if node.attributes['kind'].nodeValue != 'typedef': continue typedef = {'name': '', 'id': '', 'definition': '', 'help': []} for node2 in node.childNodes: if node2.nodeName == 'name': typedef['name'] = get_text(node2) typedef['id'] = typedef['name'] if node2.nodeName == 'definition': typedef['definition'] = get_text(node2) if node2.nodeName == 'detaileddescription': typedef['help'] = detaileddescription(node2) typedeflist.append(typedef) return typedeflist class docbook_functions: """ Generate docbook file with information to all functions """ def generate(name, synopsis, functionlist, refidlist): func_file = open(name+'/functions.docbook', "w") for func in functionlist: sgml = docbook_functions.generate_sgml(func, synopsis) link_refids(sgml, refidlist) cleanml = sgml.toxml()+'\n' func_file.write(cleanml) func_file.close() """ Generate docbook sect2 dom with information to a specific function """ def generate_sgml(function, synopsis): sgml = xml.dom.minidom.Document() sect2 = create_append(sgml, 'sect2') sect2.setAttribute('id', function['id']) title = create_append(sect2, 'title') create_append_text(title, function['name']) # synopsis funcsynopsis = create_append(sect2, 'funcsynopsis') funcsynopsisinfo = create_append(funcsynopsis, 'funcsynopsisinfo') create_append_text(funcsynopsisinfo, "#include <"+synopsis+">") # prototype funcprototype = create_append(funcsynopsis, 'funcprototype') dbhtml = create_append_pi(funcsynopsis, 'dbhtml', "funcsynopsis-style='ansi'") funcdef = create_append(funcprototype, 'funcdef') create_append_text(funcdef, function['return']) if function['return'][-1:] != "*": # dont add space between * and name create_append_text(funcdef, " ") func = create_append(funcdef, 'function') create_append_text(func, function['name']) # add parameter to function definition param_num = len(function['param']) if param_num == 1 and function['param'][0].is_void(): void = create_append(funcprototype, 'void') else: for i in range(0, param_num): function['param'][i].dom_append(funcprototype) # add help to function function['help'].dom_append(sect2) return sect2 # make functions "static" generate = staticmethod(generate) generate_sgml = staticmethod(generate_sgml) class docbook_structs: """ Generate docbook file with information to all structs """ def generate(name, structlist, refidlist): struct_file = open(name+'/structs.docbook', "w") for struct in structlist: sgml = docbook_structs.generate_sgml(struct) link_refids(sgml, refidlist) cleanml = sgml.toxml()+'\n' struct_file.write(cleanml) struct_file.close() """ Generate docbook sect2 dom with information to a specific struct """ def generate_sgml(struct): sgml = xml.dom.minidom.Document() sect2 = create_append(sgml, 'sect2') sect2.setAttribute('id', struct['id']) title = create_append(sect2, 'title') create_append_text(title, 'struct '+struct['name']) # add definition of struct programlisting = create_append(sect2, 'programlisting') create_append_text(programlisting, 'struct '+struct['name']+' {\n') for element in struct['elements']: element.dom_append(programlisting) create_append_text(programlisting, '}') # add help to struct struct['help'].dom_append(sect2) # add list of struct members with their help variablelist = create_append(sect2, 'variablelist') for element in struct['elements']: element.dom_append_help(variablelist) # remove empty variablelist if len(variablelist.childNodes) == 0: sect2.removeChild(variablelist) return sect2 # make functions "static" generate = staticmethod(generate) generate_sgml = staticmethod(generate_sgml) class docbook_typedefs: """ Generate docbook file with information to all typedefs """ def generate(name, typedeflist, refidlist): typedef_file = open(name+'/typedefs.docbook', "w") for typedef in typedeflist: sgml = docbook_typedefs.generate_sgml(typedef) link_refids(sgml, refidlist) cleanml = sgml.toxml()+'\n' typedef_file.write(cleanml) typedef_file.close() """ Generate docbook sect2 dom with information to a specific typedef """ def generate_sgml(typedef): sgml = xml.dom.minidom.Document() sect2 = create_append(sgml, 'sect2') sect2.setAttribute('id', typedef['id']) title = create_append(sect2, 'title') create_append_text(title, 'typedef '+typedef['name']) # add definition of typedef programlisting = create_append(sect2, 'programlisting') create_append_text(programlisting, typedef['definition']) # add help to typedef typedef['help'].dom_append(sect2) return sect2 # make functions "static" generate = staticmethod(generate) generate_sgml = staticmethod(generate_sgml) def manpage_header(root, name, refid, mannum, ref_name, ref_namediv, synopsisinfo): refentry = create_append(root, 'refentry') refentry.setAttribute('id', cleanup_stringbegin(refid)) refentryinfo = create_append(refentry, 'refentryinfo') productname = create_append(refentryinfo, 'productname') create_append_text(productname, 's3d') author = create_append(refentryinfo, 'author') firstname = create_append(author, 'firstname') create_append_text(firstname, 'Simon') surname = create_append(author, 'surname') create_append_text(surname, 'Wunderlich') contrib = create_append(author, 'contrib') create_append_text(contrib, 'Author of s3d') refmeta = create_append(refentry, 'refmeta') refentrytitle = create_append(refmeta, 'refentrytitle') create_append_text(refentrytitle, name) manvolnum = create_append(refmeta, 'manvolnum') create_append_text(manvolnum, mannum) refmiscinfo_manual = create_append(refmeta, 'refmiscinfo') refmiscinfo_manual.setAttribute('class', 'manual') create_append_text(refmiscinfo_manual, 's3d Manual') refmiscinfo_source = create_append(refmeta, 'refmiscinfo') refmiscinfo_source.setAttribute('class', 'source') create_append_text(refmiscinfo_source, 's3d') refnamediv = create_append(refentry, 'refnamediv') refname = create_append(refnamediv, 'refname') create_append_text(refname, cleanup_stringbegin(ref_name)) refpurpose = create_append(refnamediv, 'refpurpose') create_append_text(refpurpose, ref_namediv) # synopsis refsynopsisdiv = create_append(refentry, 'refsynopsisdiv') funcsynopsis = create_append(refsynopsisdiv, 'funcsynopsis') funcsynopsisinfo = create_append(funcsynopsis, 'funcsynopsisinfo') create_append_text(funcsynopsisinfo, synopsisinfo) return (refentry, funcsynopsis) class manpage_functions: """ Generate manpage docbook file with information to functions """ def generate(synopsis, functionlist): for func in functionlist: func_file = open('./manpages/man3/'+cleanup_stringbegin(func['name'])+'.sgml', "w") func_file.write('\n') sgml = manpage_functions.generate_sgml(func, synopsis) sgml.writexml(func_file) func_file.close() """ Generate manpage docbook dom with information to a specific function """ def generate_sgml(function, synopsis): sgml = xml.dom.minidom.Document() (refentry, funcsynopsis) = manpage_header(sgml, function['name'], function['id'], '3', function['name'], function['brief'].strip(), "#include <"+synopsis+">") # prototype funcprototype = create_append(funcsynopsis, 'funcprototype') dbhtml = create_append_pi(funcsynopsis, 'dbhtml', "funcsynopsis-style='ansi'") funcdef = create_append(funcprototype, 'funcdef') create_append_text(funcdef, function['return']) if function['return'][-1:] != "*": # dont add space between * and name create_append_text(funcdef, " ") func = create_append(funcdef, 'function') create_append_text(func, function['name']) # add parameter to function definition param_num = len(function['param']) if param_num == 1 and function['param'][0].is_void(): void = create_append(funcprototype, 'void') else: for i in range(0, param_num): function['param'][i].dom_append(funcprototype, "\t") # add help to function refsect1 = create_append(refentry, 'refsect1') title = create_append(refsect1, 'title') create_append_text(title, "Description") function['help'].dom_append(refsect1) return refentry # make functions "static" generate = staticmethod(generate) generate_sgml = staticmethod(generate_sgml) class manpage_structs: """ Generate manpage docbook file with information to all structs """ def generate(synopsis, structlist): for func in structlist: func_file = open('./manpages/man9/'+cleanup_stringbegin(func['name'])+'.sgml', "w") func_file.write('\n') sgml = manpage_structs.generate_sgml(func, synopsis) sgml.writexml(func_file) func_file.close() """ Generate manpage docbook dom with information to a specific struct """ def generate_sgml(struct, synopsis): sgml = xml.dom.minidom.Document() (refentry, funcsynopsis) = manpage_header(sgml, struct['name'], struct['id'], '9', struct['name'], struct['brief'].strip(), "#include <"+synopsis+">") # add definition of struct refsect1 = create_append(refentry, 'refsect1') title = create_append(refsect1, 'title') create_append_text(title, "Structure Members") programlisting = create_append(refsect1, 'programlisting') create_append_text(programlisting, 'struct '+struct['name']+' {\n') for element in struct['elements']: element.dom_append(programlisting) create_append_text(programlisting, '}') # add help to struct refsect1 = create_append(refentry, 'refsect1') title = create_append(refsect1, 'title') create_append_text(title, "Description") struct['help'].dom_append(refsect1) # add list of struct members with their help variablelist = create_append(refsect1, 'variablelist') for element in struct['elements']: element.dom_append_help(variablelist) # remove empty variablelist if len(variablelist.childNodes) == 0: refsect1.removeChild(variablelist) return refentry # make functions "static" generate = staticmethod(generate) generate_sgml = staticmethod(generate_sgml) if __name__ == '__main__': main() s3d-0.2.2.1/Documentation/libs3d/000077500000000000000000000000001361325167000163405ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/libs3d/CMakeLists.txt000066400000000000000000000001611361325167000210760ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann s3d-0.2.2.1/Documentation/libs3d/functions.docbook000066400000000000000000001423411361325167000217170ustar00rootroot00000000000000s3d_usage#include <s3d.h>void s3d_usagePrints the possible parameter for the client library (which can be passed in s3d_init()) s3d_init#include <s3d.h>int s3d_initint *argcchar ***argvconst char *nameThis will initialize the s3d-library and the connection to the Server. It will return 0 on success in server initialization. name specifies the your programs name. int main(char argc, char **argv) { if (!s3d_init(&argc, &argv, "Hello world")) { ... s3d_quit(); } return 0; } s3d_quit#include <s3d.h>int s3d_quitCloses the connection and clears the event-stack. It can also be used to leave the s3d_mainloop(). s3d_mainloop#include <s3d.h>int s3d_mainloopvoid(*)(void) fTakes a function as argument. It will loop this function until a quit-event is received. You can pass NULL if you have no function to be looped, but its better to sleep some time if you have nothing to do anyway to save cpu-time. void mainloop(void) { usleep(1000); // sleep 1 ms in every cycle } ... s3d_mainloop(mainloop()); s3d_push_vertex#include <s3d.h>int s3d_push_vertexint objectfloat xfloat yfloat zPushes a vertex onto the vertex stack. Make sure that you count how many vertices you've pushed because you'll need that for referencing when you push your polygons. s3d_push_vertices#include <s3d.h>int s3d_push_verticesint objectconst float *vbufuint16_t nPush some vertices from an array. that's much better for performing than using s3d_push_vertex() if you have a lot of vertices (and that's probably the usual case). float vertices[] = { 0.0, 0.0, 0.0, 1.0, 2.0, 3.0, 3.0, 2.0, 1.0}; s3d_push_vertices(object, vertices, 3); // pushing 3 vertices s3d_push_material#include <s3d.h>int s3d_push_materialint objectfloat amb_rfloat amb_gfloat amb_bfloat spec_rfloat spec_gfloat spec_bfloat diff_rfloat diff_gfloat diff_bPushes a material for an object. you will have to count them yourself too, as polygons will ask for the material index number. The material properties are given in rgb (red/green/blue) color codes, in float. 0.0 is the minimum, 1.0 is the maximum a color value can be. The specular color is the color which is directly reflected from the light source. The diffuse color is the color which can be seen in the bright side of the object, and the ambience color is the color of the shadow side of the object. s3d_pep_material#include <s3d.h>int s3d_pep_materialint objectfloat amb_rfloat amb_gfloat amb_bfloat spec_rfloat spec_gfloat spec_bfloat diff_rfloat diff_gfloat diff_bOverwriting the latest pushed material, overwriting the current value with the specified one. See s3d_pep_materials_a if you want to pep more materials. s3d_push_material_a#include <s3d.h>int s3d_push_material_aint objectfloat amb_rfloat amb_gfloat amb_bfloat amb_afloat spec_rfloat spec_gfloat spec_bfloat spec_afloat diff_rfloat diff_gfloat diff_bfloat diff_aSame as s3d_push_material, but color has alpha value added. Use s3d_push_materials_a() if you have a lot of materials to push. s3d_push_materials_a#include <s3d.h>int s3d_push_materials_aint objectconst float *mbufuint16_t nPushes a buffer of materials. Those materials are in the format float[n*12], with mbuf[n*12 + 0-3] - ambiencembuf[n*12 + 4-7] - specularmbuf[n *12 + 8-11] - diffusion values of each entry. n is the number of materials pushed. The values are in the order r,g,b,a. If you only want to push one material, use the more easy s3d_push_material_a() function. // each line has r,g,b,a value float bla[24]= {1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}; s3d_push_materials_a(object, bla, 2); // push a red and a cyan material s3d_pep_material_a#include <s3d.h>int s3d_pep_material_aint objectfloat amb_rfloat amb_gfloat amb_bfloat amb_afloat spec_rfloat spec_gfloat spec_bfloat spec_afloat diff_rfloat diff_gfloat diff_bfloat diff_aOverwriting the latest pushed material, overwriting the current value with the specified one, with alpha value in contrast to s3d_pep_material See s3d_push_materials_a if you want to pep more materials. s3d_pep_materials_a#include <s3d.h>int s3d_pep_materials_aint objectconst float *mbufuint16_t nAlters the last n pushed materials. See s3d_push_materials_a() for more information how mbuf should look like. Use s3d_pep_material_a() if you only want to alter the latest material. s3d_load_materials_a#include <s3d.h>int s3d_load_materials_aint objectconst float *mbufuint32_t startuint16_t nLoads n materials starting from index position start into the material stack. See s3d_push_materials_a for more information about the values in mbuf. s3d_push_polygon#include <s3d.h>int s3d_push_polygonint objectuint32_t v1uint32_t v2uint32_t v3uint32_t materialPush one polygon on the polygon stack of the object. It takes 3 vertex-index numbers and one material material-index-no. as argument. int oid = s3d_new_object(); // create a new object s3d_push_vertex(oid, 0.0, 0.0, 0.0); s3d_push_vertex(oid, 0.0, 1.0, 0.0); s3d_push_vertex(oid, 1.0, 0.0, 0.0); s3d_push_material(oid, 0.3, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0); s3d_push_polygon(oid, 0, 1, 2, 0); // this will create a red polygon s3d_push_polygons#include <s3d.h>int s3d_push_polygonsint objectconst uint32_t *pbufuint16_t nAs for vertices, you can push arrays of polygons to have greater performance. The pbuf should contain n polygons which consist of 4 uint32_t values of 3 vertices indices and 1 material index. uint32_t pbuf[] = { 0, 1, 2, 0}; int oid = s3d_new_object(); // create a new object s3d_push_vertex(oid, 0.0, 0.0, 0.0); s3d_push_vertex(oid, 0.0, 1.0, 0.0); s3d_push_vertex(oid, 1.0, 0.0, 0.0); s3d_push_material(oid, 0.3, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0); s3d_push_polygons(oid, pbuf, 1); // push one polygon with the pbuf data s3d_push_line#include <s3d.h>int s3d_push_lineint objectuint32_t v1uint32_t v2uint32_t materialPush one line on the line stack of the object. It takes 2 vertex-index-no, and one material material-index-no. as argument. If you have a lot of lines to push, use s3d_push_lines() s3d_push_lines#include <s3d.h>int s3d_push_linesint objectconst uint32_t *lbufuint16_t nPushing n lines on the line stack of the object, each lbuf has a size of n*3, each entry has the index number of the first vertex, second vertex and material number just as in s3d_push_line(). s3d_push_texture#include <s3d.h>int s3d_push_textureint objectuint16_t wuint16_t hAdds a new texture with height w and height h on the texture stack. s3d_push_textures#include <s3d.h>int s3d_push_texturesint objectconst uint16_t *tbufuint16_t nAs for vertices, you can push arrays of textures on the texture stack to have greater performance. The tbuf should contain n texture sizes which consist of 2 uint16_t values for width and height for each texture. s3d_pop_vertex#include <s3d.h>int s3d_pop_vertexint objectuint32_t nDeletes the latest n vertices from the vertex stack of the object. s3d_pop_polygon#include <s3d.h>int s3d_pop_polygonint objectuint32_t nDeletes the latest n polygon from the polygon stack of the object. s3d_pop_material#include <s3d.h>int s3d_pop_materialint objectuint32_t nDeletes the latest n material from the material stack of the object. s3d_pop_texture#include <s3d.h>int s3d_pop_textureint objectuint32_t nDeletes the latest n textures from the texture stack of the object. s3d_pop_line#include <s3d.h>int s3d_pop_lineint objectuint32_t nDeletes the latest n lines from the line stack of the object. s3d_pep_line_normals#include <s3d.h>int s3d_pep_line_normalsint objectconst float *nbufuint16_t nAdds normal information to lines, giving each vertex of a line a normal information. This makes lines somewhat nicer, you'll need that especially when you're going to build wireframe models.nbuf should contain n * 6 float values, for each vertex a normal vector (x,y,z), and you have 2 vertices for each line so that makes 6 float values per line in total. s3d_pep_polygon_normals#include <s3d.h>int s3d_pep_polygon_normalsint objectconst float *nbufuint16_t nAdds normal information to polygons, giving each vertex of a polygon a normal information. With this, you can achieve smoothed edge effects.nbuf should contain n * 9 float values, for each vertex a normal vector (x,y,z), and you have 3 vertices for each Polygon so that makes 9 float values per Polygon in total. Don't worry if you don't use this, it's kind of hard to calculate and the server will always use some proper normal values (same for every vertex, calculated by the plane which is defined by the 3 points of the polygon. s3d_pep_polygon_tex_coord#include <s3d.h>int s3d_pep_polygon_tex_coordint objectfloat x1float y1float x2float y2float x3float y3Pimp the last polygon pushed with some textures coordinates, x and y values for each vertex point respectively. Those values may be between 0 and 1 and are vertex points on the texture defined in the material of the polygon. If you have more polygons which should get a texture, use s3d_pep_polygon_tex_coords() s3d_pep_polygon_tex_coords#include <s3d.h>int s3d_pep_polygon_tex_coordsint objectconst float *tbufuint16_t nPimp the latest n polygons with texture coordinates. tbuf has 6*n float values for its entries, which are supplied in the order as in s3d_pep_polygon_tex_coord() s3d_pep_material_texture#include <s3d.h>int s3d_pep_material_textureint objectuint32_t texAssign the latest material a texture referenced by the index tex. Of course, you will have pushed this texture with s3d_push_texture() s3d_pep_vertex#include <s3d.h>int s3d_pep_vertexint objectfloat xfloat yfloat zAlter the latest pushed vertex, overwriting with the supplied values. s3d_pep_vertices#include <s3d.h>int s3d_pep_verticesint objectconst float *vbufuint16_t nAlter the latest n pushed vertex. vbuf holds the values which are used to overwrite the old data, n entries with each 3 floats specifying x,y,z of the vertices. s3d_pep_line#include <s3d.h>int s3d_pep_lineint objectint v1int v2int materialAlter the latest pushed line, overwriting with the supplied values. s3d_pep_lines#include <s3d.h>int s3d_pep_linesint objectconst uint32_t *lbufuint16_t nAlter the latest n pushed lines. lbuf holds the values which are used to overwrite the old data, n entries with each 3 uint32_t specifying first, second vertex and material of each line. s3d_load_line_normals#include <s3d.h>int s3d_load_line_normalsint objectconst float *nbufuint32_t startuint16_t nJust as s3d_pep_line_normals(), with the difference you won't alter the latest n lines but n lines starting with index start. s3d_load_polygon_normals#include <s3d.h>int s3d_load_polygon_normalsint objectconst float *nbufuint32_t startuint16_t nJust as s3d_pep_polygon_normals(), with the difference you won't alter the latest n polygons but n polygons starting with index start. s3d_load_polygon_tex_coords#include <s3d.h>int s3d_load_polygon_tex_coordsint objectconst float *tbufuint32_t startuint16_t nJust as s3d_pep_polygon_tex_coords(), with the difference you won't alter the latest n polygons but n polygons starting with index start. s3d_load_texture#include <s3d.h>int s3d_load_textureint objectuint32_t texuint16_t xposuint16_t yposuint16_t wuint16_t hconst uint8_t *dataThis will load an 32bit rgba image supplied in data at position xpos,ypos of the texture tex. The image has the width w and height h. This can be used to update only parts of the texture. It's no problem to supply big textures, as the image will be sent to server in fragments. Of course, you will have created the texture with s3d_push_texture, have an material assigned to the texture with s3d_pep_material_texture() and have your polygons set sane polygon texture coords using s3d_pep_polygon_tex_coord(). s3d_new_object#include <s3d.h>int s3d_new_objectCreates a new object, returning the object id.Of course, you won't forget to toggle it visible, won't you? s3d_del_object#include <s3d.h>int s3d_del_objectint oidDeletes the object referenced by oid. s3d_clone#include <s3d.h>int s3d_cloneint oidClones an already existing object. They get just look the same as the parent-object and will change when the parent-object changes. Cloning especially makes sense if you want to use the same object a lot of times. Move and transform is independent from the parent. The function returns the children object id. s3d_clone_target#include <s3d.h>int s3d_clone_targetint oidint toidChanges the clone target of oid to another object (toid). This assumes you've got oid from s3d_clone before. s3d_link#include <s3d.h>int s3d_linkint oid_fromint oid_toA linked object will move along with it's link parent. For example if you have a book on a table, you can link the book to the table so the book will "keep on the table" if you move the table around in space. It will also rotate with the table etc. s3d_unlink#include <s3d.h>int s3d_unlinkint oidRemove the link of object oid to its target. s3d_flags_on#include <s3d.h>int s3d_flags_onint objectuint32_t flagsTurn some flags on for object.If you don't toggle OF_VISIBLE on, you won't see your object. usually you want this. (at least after you *push()d all your content) s3d_flags_off#include <s3d.h>int s3d_flags_offint objectuint32_t flagsTurn some flags off for object. s3d_translate#include <s3d.h>int s3d_translateint objectfloat xfloat yfloat zMove the object to some position in space. when you create an object, it's always located at 0.0 , 0.0, 0.0.Translation is absolute, not relative! s3d_translate(object, 2, 0, 0); s3d_translate(object, 4, 0, 0); // object will end up at 4,0,0 and not 6,0,0!! s3d_rotate#include <s3d.h>int s3d_rotateint objectfloat xfloat yfloat zRotate an object around the x, y and z-axis respectively. x,y,z may have values between [0,360] degrees.You will usually only rotate around one axis, leaving the unused fields on 0, I guess. If you want to rotate around more than one axis, please note: The order of the rotation applies is y-axis, x-axis, and then z-axis. You can think of it as the earth position coordinates: x is the longitude, y is the latitude, and z is the rotation at this point of the earth around your bodies axis. (I wonder if that makes it any clearer ;)Rotate is absolute, not relative! s3d_rotate(object, 90, 0, 0); s3d_rotate(object, 180, 0, 0); // object will be rotated 180 degrees around the x-axis, not 270 degress! s3d_scale#include <s3d.h>int s3d_scaleint objectfloat sScales the object. about factor s. s=1 will be the original size, -1 will mirror it.s=0 is forbidden and will be ignored! s3d_scale is also absolute, not relative! s3d_import_model_file#include <s3d.h>int s3d_import_model_fileconst char *fnameImports an 3d object file and returns the object number. Quite a number of formats are supported, like 3D Studio (.3ds, .prj), Lightwave (.lw, .lwb, .lwo), Quake Models (.md3), or simply everything libg3d supports. :)Of course, you won't forget to toggle it visible, won't you? s3d_open_file#include <s3d.h>int s3d_open_fileconst char *fnamechar **pointerThis opens the file fname, setting *pointer to it's memory position. the function will return the size of buffer. you can free() the pointer when you're finished. s3d_select_font#include <s3d.h>int s3d_select_fontconst char *maskThis selects a font for the s3d_draw_string() function.Of course, you won't forget to toggle it visible, won't you? s3d_select_font("vera"); // will use the vera font face s3d_draw_string#include <s3d.h>int s3d_draw_stringconst char *strfloat *xlenRenders the string str with in Truetype format with the height 1, returns the length of the rendered string in *xlen (or set len=NULL to disable this). char str="hello world!"; float len; s3d_select_font("vera"); s3d_draw_string(str, len); // not interested in the length? do that: s3d_draw_string(str, NULL); s3d_strlen#include <s3d.h>float s3d_strlenconst char *strReturns the length of the string if it were rendered with the currently selected font. That might be useful to estimate the size used for a text and render the background or bounding box before inserting the text. s3d_vector_length#include <s3d.h>float s3d_vector_lengthconst float vector[]Calculates and returns the length of the given vector (which should be of the type float[3]). More info on wikipedia http://en.wikipedia.org/wiki/Vector_(spatial) s3d_vector_dot_product#include <s3d.h>float s3d_vector_dot_productconst float vector1[]const float vector2[]Calculates and returns the dot product of vector1 and vector2. All vectors should have the format float[3]. More info on wikipedia. http://en.wikipedia.org/wiki/Vector_(spatial) s3d_vector_subtract#include <s3d.h>void s3d_vector_subtractconst float vector1[]const float vector2[]float result_vector[]Subtracts vector1 from vector2, writing result into result_vector. All vectors should have the format float[3]. More info on wikipedia. http://en.wikipedia.org/wiki/Vector_(spatial) s3d_vector_angle#include <s3d.h>float s3d_vector_angleconst float vector1[]const float vector2[]Calculates and returns the angle between vector1 and vector2. Please note that the resulting angle is between 0 and PI, therefore not covering the whole period! To convert in degrees just do result*180/M_PI. All vectors should have the format float[3]. More info on wikipedia. http://en.wikipedia.org/wiki/Vector_(spatial) s3d_angle_to_cam#include <s3d.h>float s3d_angle_to_camconst float obj_pos[]const float cam_pos[]float *angle_radGiven obj_pos and cam_pos in the format float[3], angle_rad about which angle the object should be rotated around the y-axis so that it faces the camera. This might become handy if you have some text floating in space and want it to face the camera. http://en.wikipedia.org/wiki/Vector_(spatial) s3d_vector_cross_product#include <s3d.h>void s3d_vector_cross_productconst float vector1[]const float vector2[]float result_vector[]Calculates and returns the cross product of vector1 and vector2. All vectors should have the format float[3]. More info on wikipedia. http://en.wikipedia.org/wiki/Vector_(spatial) s3d_push_event#include <s3d.h>void s3d_push_eventstruct s3d_evt *newevtPushes an event onto the event-stack. Usually you don't need to do this manually. s3d_pop_event#include <s3d.h>struct s3d_evt *s3d_pop_eventPops the latest event from the stack. Don't forget to free() both the event and its buffer! Returns a pointer to struct s3d_evt. s3d_find_event#include <s3d.h>struct s3d_evt *s3d_find_eventuint8_t eventFinds the latest occurrence of an event, giving the event type as argument. Returns a pointer to struct s3d_evt. s3d_delete_event#include <s3d.h>int s3d_delete_eventconst struct s3d_evt *devtDeletes an event, the argument is the pointer to the event which is to be deleted (maybe obtained from s3d_find_event). s3d_set_callback#include <s3d.h>void s3d_set_callbackuint8_t events3d_cb funcSets a callback for a certain event. this is very useful for event-oriented applications. event callbacks will not interrupt each other or the mainloop.Defining callbacks will only work after calling s3d_init() #include <inttypes.h> void obj_click(struct s3d_evt event) { printf("object id %"PRIu32" got clicked", *((uint32_t *)event->buf)); } ... s3d_set_callback(S3D_EVENT_NEW_OBJECT, obj_click); // this will tell you when a object got clicked s3d_clear_callback#include <s3d.h>void s3d_clear_callbackuint8_t eventClears the callback which is associated with the event. s3d_ignore_callback#include <s3d.h>void s3d_ignore_callbackuint8_t eventSets the callback on ignore, that means it won't be queued up for later use. An incoming event of this type will simply be skipped. s3d_get_callback#include <s3d.h>s3d_cb s3d_get_callbackuint8_t eventReturns the Callback-function of the event. struct s3d_evt e; ... s3d_get_callback(S3D_EVENT_KEY)(e); // will call the key-handling function with argument e. s3d_process_stack#include <s3d.h>void s3d_process_stackThis function goes through all function of the event-stack and will call functions. this is useful when you define a new function but still have a lot of events of this type on the stack.DeprecatedThis is probably obsolete s3d_mcp_focus#include <s3d.h>int s3d_mcp_focusint objectThis is an mcp-only function. It gives focus (for receiving key-strokes etc.) to an app referenced by it's mcp-object-id. s3d_net_check#include <s3d.h>int s3d_net_checkThis functions is for programs which do not employ a mainloop, hence they need to check for new events on their own. Programs like these must make sure to call this function from time to time to convince the server that they did not freeze or bail out. s3d-0.2.2.1/Documentation/libs3d/libs3d.docbook000066400000000000000000000134531361325167000210700ustar00rootroot00000000000000 libs3d - The S3D API Using the <application>s3d</application> library Setting <application>s3d</application> up Install the lib using the usual usual mechanism: cmake . make make install You might need to have superuser rights in order to do make install. You should now have the server, the library and some applications installed somewhere. Getting started After having s3d installed, you can write your own s3d programs (yeah, that is what this guide is about ;) ]]> should be enough to access the 3d functions. If you want to use keyboard interaction, do ]]> for the keycode table. Now you can compile your program with bash$ gcc program.c -ls3d -o program That wasn't that hard, wasn't it? function reference &libs3d_func; Data types &libs3d_struct; &libs3d_typedef; Definitions S3D events This defines the callback format. Each callback should return void and take an argument of struct s3d_evt *. Callbacks can be defined with s3d_set_callback(). S3D_EVENT_OBJ_CLICK An object got clicked (when you set the flag S3D_OF_SELECTABLE), buf will contain the object id of the object which got clicked (uint32_t) S3D_EVENT_KEY A key was pressed, buf will contain a keycode. use ]]> to have the keycodes available. buf is a 2 byte unsigned short keycode. S3D_EVENT_MBUTTON A mouse button was clicked. Use struct s3d_but_info on buf to get more info. S3D_EVENT_NEW_OBJECT deprecated, will use S3D_EVENT_OBJ_INFO S3D_EVENT_OBJ_INFO Something happened to an object. This can happen if the camera was moved, the mouse (pointer) was moved or an application appeared/changed in the mcp S3D_MCP_OBJECT As the name suggests, those will only happen to the MCP. This tells it about new/changed application object. struct mcp_object can be used on buf. To be removed in the future. S3D_MCP_DEL_OBJECT As the name suggests, those will only happen to the MCP. This tells it about deleted application object. struct mcp_object can be used on buf. To be removed in the future. S3D_EVENT_QUIT Server sent the quit signal, or the connection was terminated. Usually, this is only processed internally. /* a callback handler could look like this: */ void my_key_handler(struct s3d_evt *event_data) { ... } S3D Object Flags Objects can have several flags to change their behavior in the server and can be set with s3d_flags_on() and s3d_flags_off() S3D_OF_VISIBLE default:off Obviously, if this flag is toggled the user can see it, if not it will be hidden. ;) When an object is created it's turned off, so you will be able push your geometry data and turn it on after you're done. That avoids flickering and stuff. S3D_OF_SELECTABLE default:off When this is toggled on, you will receive click events. Don't use it if you don't need it, it will eat performance. S3D_OF_POINTABLE default:off Placeholder for pointer (onmouseover-event enabler) events. Not implemented yet. Additional Notes About alpha transparency Alpha transparency works, but polygons don't get ordered in view direction on the server yet. So please don't use this feature yet. If you have an easy idea how to do that with OpenGL please drop me a line. s3d-0.2.2.1/Documentation/libs3d/structs.docbook000066400000000000000000000053171361325167000214170ustar00rootroot00000000000000struct s3d_evtstruct s3d_evt { uint8_t event; int length; char *buf; struct s3d_evt *next; }This is the event information holder. eventgives the event type lengthgives the length of the buffer *buf bufis the pointer to the multiple purpose buffer, which will have more specific information about the object nextcan be safely ignored ;) struct mcp_objectstruct mcp_object { uint32_t object; float trans_x; float trans_y; float trans_z; float r; char name; }Deprecateddon't use, to be removed soon (use struct s3d_but_info). ;) struct s3d_obj_infostruct s3d_obj_info { uint32_t object; uint32_t flags; float trans_x; float trans_y; float trans_z; float rot_x; float rot_y; float rot_z; float scale; float r; char name; }Can be used on the buffer of an event of type S3D_EVENT_OBJ_INFO. name will usually contain nothing for usual objects, but mcp objects will contain the applications names here. r is the radius of the convex sphere an object, which will also be interesting for the mcp.Special objects like camera, pointer will have the "sys_" prefix in the name and will be named "pointer0", "pointer1" ... or "cam0", "cam1" ... For cam object, scale will contain the aspect ratio. struct s3d_but_infostruct s3d_but_info { uint8_t button; uint8_t state; }Can be used on the buffer of an event of type S3D_EVENT_MBUTTON. struct s3d_key_eventstruct s3d_key_event { uint16_t keysym; uint16_t unicode; uint16_t modifier; uint16_t state; }Can be used on the buffer of an event of type S3D_EVENT_KEY*. s3d-0.2.2.1/Documentation/libs3d/typedefs.docbook000066400000000000000000000007051361325167000215270ustar00rootroot00000000000000typedef s3d_cbtypedef int(* s3d_cb)(struct s3d_evt *)This defines the callback format. Each callback should return void and take an argument of struct s3d_evt *. Callbacks can be defined with s3d_set_callback(). s3d-0.2.2.1/Documentation/libs3dw/000077500000000000000000000000001361325167000165275ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/libs3dw/CMakeLists.txt000066400000000000000000000001611361325167000212650ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann s3d-0.2.2.1/Documentation/libs3dw/functions.docbook000066400000000000000000000350071361325167000221060ustar00rootroot00000000000000s3dw_button_new#include <s3dw.h>s3dw_button *s3dw_button_newconst s3dw_surface *surfaceconst char *textfloat posxfloat posyCreates a new button on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface.See s3dw_button for information about callbacks which may be defined. s3dw_label_new#include <s3dw.h>s3dw_label *s3dw_label_newconst s3dw_surface *surfaceconst char *textfloat posxfloat posyCreates a new label on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface.See s3dw_label for information about callbacks which may be defined. s3dw_input_new#include <s3dw.h>s3dw_input *s3dw_input_newconst s3dw_surface *surfacefloat widthfloat posxfloat posyCreates a new input-box on the surface with a input width of "width", the upper left corner at (posx,posy) on the surface. The input-box is empty on creation and can be change with s3dw_input_change_text, and received with s3dw_input_gettextSee s3dw_input for information about callbacks which may be defined. s3dw_textbox_new#include <s3dw.h>s3dw_textbox *s3dw_textbox_newconst s3dw_surface *surfaceconst char *textfloat posxfloat posyfloat widthfloat heightCreates a new textbox on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface. Width and height define the size of the textbox including scrollbars which are rendered around the textfield.See s3dw_textbox for information about callbacks which may be defined. s3dw_input_gettext#include <s3dw.h>char *s3dw_input_gettexts3dw_input *inputReturns the text which is currently entered in the referenced input-box. s3dw_input_change_text#include <s3dw.h>void s3dw_input_change_texts3dw_input *inputconst char *textChange the text in the referenced input-box to the specified text. s3dw_label_change_text#include <s3dw.h>void s3dw_label_change_texts3dw_label *labelconst char *textChange the text in the referenced label to the specified text. s3dw_surface_new#include <s3dw.h>s3dw_surface *s3dw_surface_newconst char *titlefloat widthfloat heightCreates a new surface (a new window) with title "title" and dimension "width" x "height".See s3dw_surface for information about callbacks which may be defined. s3dw_getroot#include <s3dw.h>s3dw_widget *s3dw_getrootReturns the root-widget, which holds all the surfaces. E.g. if you want to move all widgets at once, adjust the root-widgets x,y,z and use s3dw_moveit() s3dw_widget *root = s3dw_getroot(); // move widget center to (0,5,0). upon creation, it's centered at (0,0,0), // so this might move it up root->x=0; root->y=5; root->z=0; s3dw_moveit(root); s3dw_moveit#include <s3dw.h>void s3dw_moveits3dw_widget *widgetMoves/translates the widget as you specified in it's private s3dw_widget structure. Should be casted with S3DWIDGET(). s3dw_delete#include <s3dw.h>void s3dw_deletes3dw_widget *widgetDeletes any widget. Should be casted with S3DWIDGET(). s3dw_show#include <s3dw.h>void s3dw_shows3dw_widget *widgetSwitches a widget visible. Should be casted with S3DWIDGET(). s3dw_focus#include <s3dw.h>void s3dw_focuss3dw_widget *focusGives focus to the widget, relative to its parent. That means you can focus a surface, and each surface can focus one of its element, e.g. an input field. Should be casted with S3DWIDGET(). s3dw_textbox_scrollup#include <s3dw.h>void s3dw_textbox_scrollups3dw_textbox *textboxScrolls the text in the textbox up by one line, if possible. s3dw_textbox_scrolldown#include <s3dw.h>void s3dw_textbox_scrolldowns3dw_textbox *textboxScrolls the text in the textbox down by one line, if possible. s3dw_textbox_scrollleft#include <s3dw.h>void s3dw_textbox_scrolllefts3dw_textbox *textboxScrolls the text in the textbox to the left by one character, if possible. s3dw_textbox_scrollright#include <s3dw.h>void s3dw_textbox_scrollrights3dw_textbox *textboxScrolls the text in the textbox to the right by one character, if possible. s3dw_textbox_scrollto#include <s3dw.h>void s3dw_textbox_scrolltos3dw_textbox *textboxint xint yScrolls the text in the textbox so that the character in row y, column x is in the top left corner of the textbox. s3dw_textbox_change_text#include <s3dw.h>void s3dw_textbox_change_texts3dw_textbox *textboxconst char *textChange the text in the referenced textbox to the specified text. s3dw_handle_click#include <s3dw.h>int s3dw_handle_clickconst struct s3d_evt *eventIf you want your widgets on mouseclicks (believe me, you want that), you have to call this either in your clickhandler-function or specify it itself as the clickhandler. // way 1: s3d_set_callback(S3D_EVENT_OBJ_CLICK,s3dw_handle_click); // way 2: ... void click(struct s3d_evt *evt) { s3dw_handle_click(evt); .... // your own clickhandler code ... } .... s3d_set_callback(S3D_EVENT_OBJ_CLICK,click); s3dw_handle_key#include <s3dw.h>int s3dw_handle_keyconst struct s3d_evt *eventThis is somehow useful to call in your keyhandler functions if you want to have input-boxes work. ;) // way 1: s3d_set_callback(S3D_EVENT_KEY,s3dw_handle_key); // way 2: ... void key(struct s3d_evt *evt) { s3dw_handle_key(evt); .... // your own keyhandler code ... } .... s3d_set_callback(S3D_EVENT_KEY,key); s3dw_object_info#include <s3dw.h>int s3dw_object_infostruct s3d_evt *eventThis can be used to let s3dw handle S3D_EVENT_OBJ_INFO-events. With this, s3dw can consider the camera position and makes things like following the camera possible. s3dw_ani_mate#include <s3dw.h>void s3dw_ani_mateJust call this in your mainloop if you want some nice window sliding animations. it's somewhat bloating, but you don't want to miss it ;) #include <time.h> // nanosleep() static struct timespec t={0.33*1000*1000}; // 33 mili seconds void mainloop() { // keep this in your mainloop. this will do smooth animations for you ... s3dw_ani_mate(); nanosleep(&t,NULL); } .... s3d_mainloop(mainloop); s3d-0.2.2.1/Documentation/libs3dw/libs3dw.docbook000066400000000000000000000020101361325167000214310ustar00rootroot00000000000000 libs3dw - The S3D Widget Library Using the <application>s3d</application> widget library Getting started Assuming you have already read about the low level libs3d s3d api, the s3d widget library is build on top of it and should be (hopefully) easy to use as any other widget library. Just include ]]> and link with -ls3dw -ls3d, and everything should be fine. :) bash$ gcc program.c -ls3dw -ls3d -o program function reference &libs3dw_func; Data types &libs3dw_struct; &libs3dw_typedef; s3d-0.2.2.1/Documentation/libs3dw/structs.docbook000066400000000000000000000126111361325167000216010ustar00rootroot00000000000000struct _s3dw_stylestruct _s3dw_style { const char *name; const char *fontface; float surface_mat; float input_mat; float inputback_mat; float text_mat; float title_mat; float title_text_mat; }With s3dw_style you can change the colors/materials of your widgets. materials are in the same as in s3d_push_materials_a, that means red,green,blue and alpha float values (between 0.0 and 1.0) for ambience, specular and diffuse color. namename of the style ... kind of redundant fontfacefont face for all used fonts surface_matmaterial for the surface background input_matmaterial for button boxes and other widgets inputback_matmaterial for input field background text_matmaterial for the text on buttons and inputs title_matmaterial for the title bar title_text_matmaterial for the text on the title bar struct _s3dw_widgetstruct _s3dw_widget { int type; s3dw_widget *parent; s3dw_style *style; int nobj; s3dw_widget **pobj; int focus; int flags; float ax; float ay; float az; float as; float arx; float ary; float arz; float width; float height; uint32_t oid; void *ptr; float x; float y; float z; float s; float rx; float ry; float rz; }This is the most basic widget type, it contains all the "general" widget information. If you want to move a widget, you'd change x,y,z,s and rx,ry,rz and call s3dw_moveit to turn your action reality. Every other widget has this type as first entry, so a simple typecast to s3dw_widget will give you the widgets "general" information. For typecast, you may use S3DWIDGET().The pointer ptr allows linking to user-specific data structures. That comes in handy if the widget is called back by an event, and the program must now find out on which data the user reacted. struct _s3dw_buttonstruct _s3dw_button { s3dw_widget widget; char *text; uint32_t oid_text; s3dw_callback onclick; }The buttons is just a button as you would expect it in a 2D widget library. It only reacts on clicks. struct _s3dw_labelstruct _s3dw_label { s3dw_widget widget; char *text; s3dw_callback onclick; }The labels is an label-field where a user may type things. onclick reacts on click in the field. struct _s3dw_scrollbarstruct _s3dw_scrollbar { s3dw_widget widget; float pos; float max; int type; int loid; int roid; int baroid; s3dw_callback lonclick; s3dw_callback ronclick; }The Scrollbar should be placed around scrollable content. Currently only the left and right icons are clickable (lonclick and ronclick callbacks), in vertical mode lonclick is the callback for the up icon, ronclick the callback for the down icon. struct _s3dw_textboxstruct _s3dw_textbox { s3dw_widget widget; s3dw_scrollbar *scroll_vertical; s3dw_scrollbar *scroll_horizontal; char *text; int n_lineoids; int *p_lineoids; int window_x; int window_y; s3dw_callback onclick; }A textbox shows some text with scrollbars to scroll around. It can currently only react to a click event. struct _s3dw_inputstruct _s3dw_input { s3dw_widget widget; char *text; uint32_t oid_text; s3dw_callback onclick; s3dw_callback onedit; }The inputs is an input-field where a user may type things. onclick reacts on click in the field, onedit notifies you when someone writes in the field. struct _s3dw_surfacestruct _s3dw_surface { s3dw_widget widget; uint32_t oid_title; uint32_t oid_tbar; char *title; }A surface is the window of this widget library, holding all of our elements like buttons, input fields etc ... s3d-0.2.2.1/Documentation/libs3dw/typedefs.docbook000066400000000000000000000042531361325167000217200ustar00rootroot00000000000000typedef s3dw_widgettypedef struct _s3dw_widget s3dw_widget typedef s3dw_buttontypedef struct _s3dw_button s3dw_button typedef s3dw_labeltypedef struct _s3dw_label s3dw_label typedef s3dw_textboxtypedef struct _s3dw_textbox s3dw_textbox typedef s3dw_scrollbartypedef struct _s3dw_scrollbar s3dw_scrollbar typedef s3dw_inputtypedef struct _s3dw_input s3dw_input typedef s3dw_surfacetypedef struct _s3dw_surface s3dw_surface typedef s3dw_styletypedef struct _s3dw_style s3dw_style typedef s3dw_callbacktypedef void(* s3dw_callback)(s3dw_widget *)The callback type. Receive the widget which is affected as argument. // example void my_handler(s3dw_widget *widget) { // do something with the widget ... } s3d-0.2.2.1/Documentation/manpages/000077500000000000000000000000001361325167000167535ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/manpages/CMakeLists.txt000066400000000000000000000007511361325167000215160ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann file(GLOB man1 "${Documentation_SOURCE_DIR}/manpages/man1/*.1") install(FILES ${man1} DESTINATION "${MAN_INSTALL_DIR}/man1") file(GLOB man3 "${Documentation_SOURCE_DIR}/manpages/man3/*.3") install(FILES ${man3} DESTINATION "${MAN_INSTALL_DIR}/man3") file(GLOB man9 "${Documentation_SOURCE_DIR}/manpages/man9/*.9") install(FILES ${man9} DESTINATION "${MAN_INSTALL_DIR}/man9") s3d-0.2.2.1/Documentation/manpages/build-manpages.sh000077500000000000000000000010571361325167000222050ustar00rootroot00000000000000#! /bin/sh -e # SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann for i in 1 3 9; do for man in man${i}/*.sgml; do if [ -e ${man} ] ; then xmlto man ${man} -o `dirname ${man}` sed -i 's/^\(\.\\"\s* Generator: DocBook XSL Stylesheets\).*$/\1/' ${man%.sgml}.${i} sed -i 's/^\(\.\\"\)\s*Date.*$/\1/' ${man%.sgml}.${i} sed -i 's/^\(\.TH "[^"]*" "[^"]*" "\)[^"]*\(".*\)$/\1\2/' ${man%.sgml}.${i} # remove trailing spaces sed -i 's/^\(.*\)\s\s*$/\1/' ${man%.sgml}.${i} fi done done s3d-0.2.2.1/Documentation/manpages/man1/000077500000000000000000000000001361325167000176075ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/manpages/man1/dot_mcp.1000066400000000000000000000034501361325167000213200ustar00rootroot00000000000000'\" t .\" Title: dot_mcp .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "DOT_MCP" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dot_mcp \- mcp for s3d .SH "SYNOPSIS" .HP \w'\fBdot_mcp\fR\ 'u \fBdot_mcp\fR [\-\-s3d\-url\ \fIurl\fR] .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBdot_mcp\fR is below\&. .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "DESCRIPTION" .PP \fBdot_mcp(1)\fR is a mcp (which is the window manager in s3d\-terms) for s3d\&. .PP .SH "SEE ALSO" .PP \fBs3d\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/dot_mcp.sgml000066400000000000000000000034271361325167000221260ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; mcp for s3d &program; --s3d-url url OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. skip S3D environment and connect to this url DESCRIPTION &program;(1) is a mcp (which is the window manager in s3d-terms) for s3d. SEE ALSO s3d(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/kism3d.1000066400000000000000000000035031361325167000210640ustar00rootroot00000000000000'\" t .\" Title: kism3d .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "KISM3D" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" kism3d \- 802\&.11 visualizer for s3d .SH "SYNOPSIS" .HP \w'\fBkism3d\fR\ 'u \fBkism3d\fR [\-\-s3d\-url\ \fIurl\fR] \fIHOST\fR:\fIPORT\fR .SH "DESCRIPTION" .PP \fBkism3d(1)\fR is a 3D 802\&.11 visualizer for kismet\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBkism3d\fR is below\&. .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "SEE ALSO" .PP \fBs3d\fR(1), \fBkismet\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/kism3d.sgml000066400000000000000000000036241361325167000216720ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; 802.11 visualizer for s3d &program; --s3d-url url HOST:PORT DESCRIPTION &program;(1) is a 3D 802.11 visualizer for kismet. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. skip S3D environment and connect to this url SEE ALSO s3d(1), kismet(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/meshs3d.1000066400000000000000000000041531361325167000212420ustar00rootroot00000000000000'\" t .\" Title: meshs3d .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "MESHS3D" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" meshs3d \- olsr/batman topology visualizer for s3d .SH "SYNOPSIS" .HP \w'\fBmeshs3d\fR\ 'u \fBmeshs3d\fR [\-d] [\-H\ \fInode\fR] [\-h|\-\-help] [\-\-s3d\-url\ \fIurl\fR] .SH "DESCRIPTION" .PP \fBmeshs3d(1)\fR is a 3D topology visualizer for olsr/batman and compatible data\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBmeshs3d\fR is below\&. .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Show summary of options and exit\&. .RE .PP \fB\-d\fR .RS 4 Enable debug mode .RE .PP \fB\-H \fR\fB\fInode\fR\fR .RS 4 connect to olsr node\&. By default meshs3d uses localhost .RE .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "SEE ALSO" .PP \fBs3d\fR(1), \fBolsrd\fR(8), \fBbatmand\fR (8)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/meshs3d.sgml000066400000000000000000000050561361325167000220470ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; olsr/batman topology visualizer for s3d &program; -d -H node -h|--help --s3d-url url DESCRIPTION &program;(1) is a 3D topology visualizer for olsr/batman and compatible data. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Show summary of options and exit. Enable debug mode connect to olsr node. By default &program; uses localhost skip S3D environment and connect to this url SEE ALSO s3d(1), olsrd(8), batmand (8). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/s3d.1000066400000000000000000000044611361325167000203670ustar00rootroot00000000000000'\" t .\" Title: s3d .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d \- network display server .SH "SYNOPSIS" .HP \w'\fBs3d\fR\ 'u \fBs3d\fR [\-s|\-\-use\-sdl] [\-r|\-\-rc\ \fIrc\-script\fR] [\-n|\-\-no\-rc] .SH "DESCRIPTION" .PP \fBs3d(1)\fR is a network display server which can be used as 3d desktop environment\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBs3d\fR is below\&. .PP \fB\-s\fR, \fB\-\-use\-sdl\fR .RS 4 Tells s3d to use SDL as graphics framework system\&. .RE .PP \fB\-r \fR\fB\fIrc\-script\fR\fR, \fB\-\-rc \fR\fB\fIrc\-script\fR\fR .RS 4 Use the specified file as rc\-script\&. By default s3d uses ~/\&.s3drc as per\-user rc\-script and /etc/s3drc as system\-wide rc\-script .RE .PP \fB\-n\fR, \fB\-\-no\-rc\fR .RS 4 Don\*(Aqt use rc\-scripts even if the exist in the apropriate locations\&. .RE .SH "SEE ALSO" .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP This manual page was written by Timo Schneider timo\&.schneider@s2004\&.tu\-chemnitz\&.de for the Debian(TM) project (but may be used by others)\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/s3d.sgml000066400000000000000000000053141361325167000211670ustar00rootroot00000000000000GNU"> Debian"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; network display server &program; -s|--use-sdl -r|--rc rc-script -n|--no-rc DESCRIPTION &program;(1) is a network display server which can be used as 3d desktop environment. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Tells &program; to use SDL as graphics framework system. , Use the specified file as rc-script. By default &program; uses ~/.s3drc as per-user rc-script and /etc/s3drc as system-wide rc-script , Don't use rc-scripts even if the exist in the apropriate locations. SEE ALSO s3d project page on SourceForge AUTHOR This manual page was written by Timo Schneider timo.schneider@s2004.tu-chemnitz.de for the &debian; project (but may be used by others). s3d-0.2.2.1/Documentation/manpages/man1/s3d_x11gate.1000066400000000000000000000036241361325167000217210ustar00rootroot00000000000000'\" t .\" Title: s3d_x11gate .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_X11GATE" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_x11gate \- 3d gateway for x11 desktops .SH "SYNOPSIS" .HP \w'\fBs3d_x11gate\fR\ 'u \fBs3d_x11gate\fR [\-h|\-\-help] [\-\-s3d\-url\ \fIurl\fR] .SH "DESCRIPTION" .PP \fBs3d_x11gate(1)\fR is a 3D gateway for x11 desktops\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBs3d_x11gate\fR is below\&. .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Show summary of options and exit\&. .RE .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "SEE ALSO" .PP \fBs3d\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/s3d_x11gate.sgml000066400000000000000000000037531361325167000225260ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; 3d gateway for x11 desktops &program; -h|--help --s3d-url url DESCRIPTION &program;(1) is a 3D gateway for x11 desktops. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Show summary of options and exit. skip S3D environment and connect to this url SEE ALSO s3d(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/s3dfm.1000066400000000000000000000035231361325167000207100ustar00rootroot00000000000000'\" t .\" Title: s3dfm .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DFM" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dfm \- s3d file manager .SH "SYNOPSIS" .HP \w'\fBs3dfm\fR\ 'u \fBs3dfm\fR [\-h|\-\-help] [\-\-s3d\-url\ \fIurl\fR] .SH "DESCRIPTION" .PP \fBs3dfm(1)\fR is a 3D file manager\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBs3dfm\fR is below\&. .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Show summary of options and exit\&. .RE .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "SEE ALSO" .PP \fBs3d\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/s3dfm.sgml000066400000000000000000000037431361325167000215160ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; s3d file manager &program; -h|--help --s3d-url url DESCRIPTION &program;(1) is a 3D file manager. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Show summary of options and exit. skip S3D environment and connect to this url SEE ALSO s3d(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/s3dosm.1000066400000000000000000000045201361325167000211020ustar00rootroot00000000000000'\" t .\" Title: s3dosm .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DOSM" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dosm \- gps card application for s3d .SH "SYNOPSIS" .HP \w'\fBs3dosm\fR\ 'u \fBs3dosm\fR [\-o|\-\-osm\ \fIMINLAT\fR,\fIMINLON\fR,\fIMAXLAT\fR,\fIMAXLON\fR] [\-h|\-\-help] [\-\-s3d\-url\ \fIurl\fR] [\fIfiles\fR] .SH "DESCRIPTION" .PP \fBs3dosm(1)\fR is a 3D gps card application for openstreetmap/kismet xml card data\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBs3dosm\fR is below\&. .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Show summary of options and exit\&. .RE .PP \fB\-o\fR, \fB\-\-osm\fR \fIMINLAT\fR,\fIMINLON\fR,\fIMAXLAT\fR,\fIMAXLON\fR .RS 4 Load a map with the given bounding box from the openstreetmap server\&. .RE .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "EXAMPLES" .PP .sp .if n \{\ .RS 4 .\} .nf $ \fBs3osm \-\-osm \fR\fB\fI12\&.90142,50\&.82475,12\&.93352,50\&.84592\fR\fR $ \fBs3osm \fR\fB\fIosmdata\fR\fR\fB\&.xml\fR .fi .if n \{\ .RE .\} .sp .SH "SEE ALSO" .PP \fBs3d\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/s3dosm.sgml000066400000000000000000000056011361325167000217050ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; gps card application for s3d &program; -o|--osm MINLAT,MINLON,MAXLAT,MAXLON -h|--help --s3d-url url files DESCRIPTION &program;(1) is a 3D gps card application for openstreetmap/kismet xml card data. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Show summary of options and exit. , MINLAT,MINLON,MAXLAT,MAXLON Load a map with the given bounding box from the openstreetmap server. skip S3D environment and connect to this url EXAMPLES $ s3osm --osm 12.90142,50.82475,12.93352,50.84592 $ s3osm osmdata.xml SEE ALSO s3d(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man1/s3dvt.1000066400000000000000000000035411361325167000207370ustar00rootroot00000000000000'\" t .\" Title: s3dvt .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DVT" "1" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dvt \- 3d terminal emulator for s3d .SH "SYNOPSIS" .HP \w'\fBs3dvt\fR\ 'u \fBs3dvt\fR [\-h|\-\-help] [\-\-s3d\-url\ \fIurl\fR] .SH "DESCRIPTION" .PP \fBs3dvt(1)\fR is a terminal emulator\&. .PP .SH "OPTIONS" .PP This program follows the usual GNU command line syntax\&. A summary of the options supported by \fBs3dvt\fR is below\&. .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Show summary of options and exit\&. .RE .PP \fB\-\-s3d\-url \fR\fB\fIurl\fR\fR .RS 4 skip S3D environment and connect to this url .RE .SH "SEE ALSO" .PP \fBs3d\fR(1)\&. .PP \m[blue]\fBs3d project page on SourceForge\fR\m[]\&\s-2\u[1]\d\s+2 .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE .SH "NOTES" .IP " 1." 4 s3d project page on SourceForge .RS 4 \%http://s3d.sourceforge.net/ .RE s3d-0.2.2.1/Documentation/manpages/man1/s3dvt.sgml000066400000000000000000000037301361325167000215410ustar00rootroot00000000000000GNU"> ]> s3d Simon Wunderlich Author of s3d &program; 1 s3d Manual s3d &program; 3d terminal emulator for s3d &program; -h|--help --s3d-url url DESCRIPTION &program;(1) is a terminal emulator. OPTIONS This program follows the usual &gnu; command line syntax. A summary of the options supported by &program; is below. , Show summary of options and exit. skip S3D environment and connect to this url SEE ALSO s3d(1). s3d project page on SourceForge s3d-0.2.2.1/Documentation/manpages/man3/000077500000000000000000000000001361325167000176115ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/manpages/man3/s3d_angle_to_cam.3000066400000000000000000000034031361325167000230560ustar00rootroot00000000000000'\" t .\" Title: s3d_angle_to_cam .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_ANGLE_TO_CAM" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_angle_to_cam \- calculate angle between vector and cam .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'float\ s3d_angle_to_cam('u .BI "float s3d_angle_to_cam(const\ float\ " "obj_pos" "[], const\ float\ " "cam_pos" "[], float\ *" "angle_rad" ");" .SH "DESCRIPTION" .PP Given obj_pos and cam_pos in the format float[3], angle_rad about which angle the object should be rotated around the y\-axis so that it faces the camera\&. This might become handy if you have some text floating in space and want it to face the camera\&. http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_clear_callback.3000066400000000000000000000026761361325167000233630ustar00rootroot00000000000000'\" t .\" Title: s3d_clear_callback .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_CLEAR_CALLBACK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_clear_callback \- clears a callback .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_clear_callback('u .BI "void s3d_clear_callback(uint8_t\ " "event" ");" .SH "DESCRIPTION" .PP Clears the callback which is associated with the event\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_clone.3000066400000000000000000000032141361325167000215460ustar00rootroot00000000000000'\" t .\" Title: s3d_clone .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_CLONE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_clone \- clone object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_clone('u .BI "int s3d_clone(int\ " "oid" ");" .SH "DESCRIPTION" .PP Clones an already existing object\&. They get just look the same as the parent\-object and will change when the parent\-object changes\&. Cloning especially makes sense if you want to use the same object a lot of times\&. Move and transform is independent from the parent\&. The function returns the children object id\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_clone_target.3000066400000000000000000000030141361325167000231120ustar00rootroot00000000000000'\" t .\" Title: s3d_clone_target .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_CLONE_TARGET" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_clone_target \- changes the target of a clone\-object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_clone_target('u .BI "int s3d_clone_target(int\ " "oid" ", int\ " "toid" ");" .SH "DESCRIPTION" .PP Changes the clone target of oid to another object (toid)\&. This assumes you\*(Aqve got oid from s3d_clone before\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_del_object.3000066400000000000000000000026171361325167000225460ustar00rootroot00000000000000'\" t .\" Title: s3d_del_object .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_DEL_OBJECT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_del_object \- delete an object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_del_object('u .BI "int s3d_del_object(int\ " "oid" ");" .SH "DESCRIPTION" .PP Deletes the object referenced by oid\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_delete_event.3000066400000000000000000000030071361325167000231110ustar00rootroot00000000000000'\" t .\" Title: s3d_delete_event .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_DELETE_EVENT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_delete_event \- delete event from stack .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_delete_event('u .BI "int s3d_delete_event(const\ struct\ s3d_evt\ *" "devt" ");" .SH "DESCRIPTION" .PP Deletes an event, the argument is the pointer to the event which is to be deleted (maybe obtained from s3d_find_event)\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_draw_string.3000066400000000000000000000033751361325167000230010ustar00rootroot00000000000000'\" t .\" Title: s3d_draw_string .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_DRAW_STRING" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_draw_string \- draw a simple string .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_draw_string('u .BI "int s3d_draw_string(const\ char\ *" "str" ", float\ *" "xlen" ");" .SH "DESCRIPTION" .PP Renders the string str with in Truetype format with the height 1, returns the length of the rendered string in *xlen (or set len=NULL to disable this)\&. .sp .if n \{\ .RS 4 .\} .nf char str="hello world!"; float len; s3d_select_font("vera"); s3d_draw_string(str, len); // not interested in the length? do that: s3d_draw_string(str, NULL); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_find_event.3000066400000000000000000000027761361325167000226030ustar00rootroot00000000000000'\" t .\" Title: s3d_find_event .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_FIND_EVENT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_find_event \- find eevnt on stack .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'struct\ s3d_evt\ *s3d_find_event('u .BI "struct s3d_evt *s3d_find_event(uint8_t\ " "event" ");" .SH "DESCRIPTION" .PP Finds the latest occurrence of an event, giving the event type as argument\&. Returns a pointer to struct s3d_evt\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_flags_off.3000066400000000000000000000026451361325167000224030ustar00rootroot00000000000000'\" t .\" Title: s3d_flags_off .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_FLAGS_OFF" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_flags_off \- disable flags of object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_flags_off('u .BI "int s3d_flags_off(int\ " "object" ", uint32_t\ " "flags" ");" .SH "DESCRIPTION" .PP Turn some flags off for object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_flags_on.3000066400000000000000000000032631361325167000222420ustar00rootroot00000000000000'\" t .\" Title: s3d_flags_on .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_FLAGS_ON" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_flags_on \- enable flags of object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_flags_on('u .BI "int s3d_flags_on(int\ " "object" ", uint32_t\ " "flags" ");" .SH "DESCRIPTION" .PP Turn some flags on for object\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP If you don\*(Aqt toggle OF_VISIBLE on, you won\*(Aqt see your object\&. usually you want this\&. (at least after you *push()d all your content) .sp .5v .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_get_callback.3000066400000000000000000000031421361325167000230410ustar00rootroot00000000000000'\" t .\" Title: s3d_get_callback .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_GET_CALLBACK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_get_callback \- get callback of event .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3d_cb\ s3d_get_callback('u .BI "s3d_cb s3d_get_callback(uint8_t\ " "event" ");" .SH "DESCRIPTION" .PP Returns the Callback\-function of the event\&. .sp .if n \{\ .RS 4 .\} .nf struct s3d_evt e; \&.\&.\&. s3d_get_callback(S3D_EVENT_KEY)(e); // will call the key\-handling function with argument e\&. .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_ignore_callback.3000066400000000000000000000030241361325167000235440ustar00rootroot00000000000000'\" t .\" Title: s3d_ignore_callback .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_IGNORE_CALLBACK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_ignore_callback \- ignores an event .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_ignore_callback('u .BI "void s3d_ignore_callback(uint8_t\ " "event" ");" .SH "DESCRIPTION" .PP Sets the callback on ignore, that means it won\*(Aqt be queued up for later use\&. An incoming event of this type will simply be skipped\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_import_model_file.3000066400000000000000000000035141361325167000241420ustar00rootroot00000000000000'\" t .\" Title: s3d_import_model_file .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_IMPORT_MODEL_FIL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_import_model_file \- read model from file .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_import_model_file('u .BI "int s3d_import_model_file(const\ char\ *" "fname" ");" .SH "DESCRIPTION" .PP Imports an 3d object file and returns the object number\&. Quite a number of formats are supported, like 3D Studio (\&.3ds, \&.prj), Lightwave (\&.lw, \&.lwb, \&.lwo), Quake Models (\&.md3), or simply everything libg3d supports\&. :) .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Of course, you won\*(Aqt forget to toggle it visible, won\*(Aqt you? .sp .5v .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_init.3000066400000000000000000000034331361325167000214140ustar00rootroot00000000000000'\" t .\" Title: s3d_init .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_INIT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_init \- initialize s3d library .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_init('u .BI "int s3d_init(int\ *" "argc" ", char\ ***" "argv" ", const\ char\ *" "name" ");" .SH "DESCRIPTION" .PP This will initialize the s3d\-library and the connection to the Server\&. It will return 0 on success in server initialization\&. name specifies the your programs name\&. .sp .if n \{\ .RS 4 .\} .nf int main(char argc, char **argv) { if (!s3d_init(&argc, &argv, "Hello world")) { \&.\&.\&. s3d_quit(); } return 0; } .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_link.3000066400000000000000000000031561361325167000214100ustar00rootroot00000000000000'\" t .\" Title: s3d_link .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LINK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_link \- link object to another one .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_link('u .BI "int s3d_link(int\ " "oid_from" ", int\ " "oid_to" ");" .SH "DESCRIPTION" .PP A linked object will move along with it\*(Aqs link parent\&. For example if you have a book on a table, you can link the book to the table so the book will "keep on the table" if you move the table around in space\&. It will also rotate with the table etc\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_load_line_normals.3000066400000000000000000000031301361325167000241240ustar00rootroot00000000000000'\" t .\" Title: s3d_load_line_normals .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LOAD_LINE_NORMAL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_load_line_normals \- add normals to line .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_load_line_normals('u .BI "int s3d_load_line_normals(int\ " "object" ", const\ float\ *" "nbuf" ", uint32_t\ " "start" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Just as s3d_pep_line_normals(), with the difference you won\*(Aqt alter the latest n lines but n lines starting with index start\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_load_materials_a.3000066400000000000000000000031731361325167000237320ustar00rootroot00000000000000'\" t .\" Title: s3d_load_materials_a .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LOAD_MATERIALS_A" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_load_materials_a \- add materials with alpha to polygons .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_load_materials_a('u .BI "int s3d_load_materials_a(int\ " "object" ", const\ float\ *" "mbuf" ", uint32_t\ " "start" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Loads n materials starting from index position start into the material stack\&. See s3d_push_materials_a for more information about the values in mbuf\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_load_polygon_normals.3000066400000000000000000000031601361325167000246670ustar00rootroot00000000000000'\" t .\" Title: s3d_load_polygon_normals .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LOAD_POLYGON_NOR" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_load_polygon_normals \- add normals to polygon .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_load_polygon_normals('u .BI "int s3d_load_polygon_normals(int\ " "object" ", const\ float\ *" "nbuf" ", uint32_t\ " "start" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Just as s3d_pep_polygon_normals(), with the difference you won\*(Aqt alter the latest n polygons but n polygons starting with index start\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_load_polygon_tex_coords.3000066400000000000000000000032141361325167000253650ustar00rootroot00000000000000'\" t .\" Title: s3d_load_polygon_tex_coords .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LOAD_POLYGON_TEX" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_load_polygon_tex_coords \- add texture coordinates to polygons .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_load_polygon_tex_coords('u .BI "int s3d_load_polygon_tex_coords(int\ " "object" ", const\ float\ *" "tbuf" ", uint32_t\ " "start" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Just as s3d_pep_polygon_tex_coords(), with the difference you won\*(Aqt alter the latest n polygons but n polygons starting with index start\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_load_texture.3000066400000000000000000000040131361325167000231430ustar00rootroot00000000000000'\" t .\" Title: s3d_load_texture .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_LOAD_TEXTURE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_load_texture \- load texture from memory .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_load_texture('u .BI "int s3d_load_texture(int\ " "object" ", uint32_t\ " "tex" ", uint16_t\ " "xpos" ", uint16_t\ " "ypos" ", uint16_t\ " "w" ", uint16_t\ " "h" ", const\ uint8_t\ *" "data" ");" .SH "DESCRIPTION" .PP This will load an 32bit rgba image supplied in data at position xpos,ypos of the texture tex\&. The image has the width w and height h\&. This can be used to update only parts of the texture\&. It\*(Aqs no problem to supply big textures, as the image will be sent to server in fragments\&. Of course, you will have created the texture with s3d_push_texture, have an material assigned to the texture with s3d_pep_material_texture() and have your polygons set sane polygon texture coords using s3d_pep_polygon_tex_coord()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_mainloop.3000066400000000000000000000034021361325167000222630ustar00rootroot00000000000000'\" t .\" Title: s3d_mainloop .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_MAINLOOP" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_mainloop \- set mainloop of program .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_mainloop('u .BI "int s3d_mainloop(void(*)(void)\ " "f" ");" .SH "DESCRIPTION" .PP Takes a function as argument\&. It will loop this function until a quit\-event is received\&. You can pass NULL if you have no function to be looped, but its better to sleep some time if you have nothing to do anyway to save cpu\-time\&. .sp .if n \{\ .RS 4 .\} .nf void mainloop(void) { usleep(1000); // sleep 1 ms in every cycle } \&.\&.\&. s3d_mainloop(mainloop()); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_mcp_focus.3000066400000000000000000000027551361325167000224350ustar00rootroot00000000000000'\" t .\" Title: s3d_mcp_focus .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_MCP_FOCUS" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_mcp_focus \- focus mcp object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_mcp_focus('u .BI "int s3d_mcp_focus(int\ " "object" ");" .SH "DESCRIPTION" .PP This is an mcp\-only function\&. It gives focus (for receiving key\-strokes etc\&.) to an app referenced by it\*(Aqs mcp\-object\-id\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_net_check.3000066400000000000000000000031371361325167000223750ustar00rootroot00000000000000'\" t .\" Title: s3d_net_check .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_NET_CHECK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_net_check \- get events from server .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_net_check('u .BI "int s3d_net_check(void);" .SH "DESCRIPTION" .PP This functions is for programs which do not employ a mainloop, hence they need to check for new events on their own\&. Programs like these must make sure to call this function from time to time to convince the server that they did not freeze or bail out\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_new_object.3000066400000000000000000000031311361325167000225630ustar00rootroot00000000000000'\" t .\" Title: s3d_new_object .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_NEW_OBJECT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_new_object \- create new object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_new_object('u .BI "int s3d_new_object(void);" .SH "DESCRIPTION" .PP Creates a new object, returning the object id\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Of course, you won\*(Aqt forget to toggle it visible, won\*(Aqt you? .sp .5v .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_open_file.3000066400000000000000000000030721361325167000224100ustar00rootroot00000000000000'\" t .\" Title: s3d_open_file .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_OPEN_FILE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_open_file \- copy file into memory .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_open_file('u .BI "int s3d_open_file(const\ char\ *" "fname" ", char\ **" "pointer" ");" .SH "DESCRIPTION" .PP This opens the file fname, setting *pointer to it\*(Aqs memory position\&. the function will return the size of buffer\&. you can free() the pointer when you\*(Aqre finished\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_line.3000066400000000000000000000027251361325167000222470ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_line .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_LINE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_line \- rewrite line .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_line('u .BI "int s3d_pep_line(int\ " "object" ", int\ " "v1" ", int\ " "v2" ", int\ " "material" ");" .SH "DESCRIPTION" .PP Alter the latest pushed line, overwriting with the supplied values\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_line_normals.3000066400000000000000000000034621361325167000240010ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_line_normals .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_LINE_NORMALS" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_line_normals \- add normals to lines .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_line_normals('u .BI "int s3d_pep_line_normals(int\ " "object" ", const\ float\ *" "nbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Adds normal information to lines, giving each vertex of a line a normal information\&. This makes lines somewhat nicer, you\*(Aqll need that especially when you\*(Aqre going to build wireframe models\&. .PP nbuf should contain n * 6 float values, for each vertex a normal vector (x,y,z), and you have 2 vertices for each line so that makes 6 float values per line in total\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_lines.3000066400000000000000000000031221361325167000224220ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_lines .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_LINES" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_lines \- rewrite lines .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_lines('u .BI "int s3d_pep_lines(int\ " "object" ", const\ uint32_t\ *" "lbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Alter the latest n pushed lines\&. lbuf holds the values which are used to overwrite the old data, n entries with each 3 uint32_t specifying first, second vertex and material of each line\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_material.3000066400000000000000000000033131361325167000231100ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_material .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_MATERIAL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_material \- rewrite material .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_material('u .BI "int s3d_pep_material(int\ " "object" ", float\ " "amb_r" ", float\ " "amb_g" ", float\ " "amb_b" ", float\ " "spec_r" ", float\ " "spec_g" ", float\ " "spec_b" ", float\ " "diff_r" ", float\ " "diff_g" ", float\ " "diff_b" ");" .SH "DESCRIPTION" .PP Overwriting the latest pushed material, overwriting the current value with the specified one\&. See s3d_pep_materials_a if you want to pep more materials\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_material_a.3000066400000000000000000000035161361325167000234150ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_material_a .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_MATERIAL_A" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_material_a \- rewrite material with alpha .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_material_a('u .BI "int s3d_pep_material_a(int\ " "object" ", float\ " "amb_r" ", float\ " "amb_g" ", float\ " "amb_b" ", float\ " "amb_a" ", float\ " "spec_r" ", float\ " "spec_g" ", float\ " "spec_b" ", float\ " "spec_a" ", float\ " "diff_r" ", float\ " "diff_g" ", float\ " "diff_b" ", float\ " "diff_a" ");" .SH "DESCRIPTION" .PP Overwriting the latest pushed material, overwriting the current value with the specified one, with alpha value in contrast to s3d_pep_material See s3d_push_materials_a if you want to pep more materials\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_material_texture.3000066400000000000000000000030751361325167000246750ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_material_texture .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_MATERIAL_TEX" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_material_texture \- add texture to material .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_material_texture('u .BI "int s3d_pep_material_texture(int\ " "object" ", uint32_t\ " "tex" ");" .SH "DESCRIPTION" .PP Assign the latest material a texture referenced by the index tex\&. Of course, you will have pushed this texture with s3d_push_texture() .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_materials_a.3000066400000000000000000000031721361325167000235760ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_materials_a .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_MATERIALS_A" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_materials_a \- rewrite materials with alpha .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_materials_a('u .BI "int s3d_pep_materials_a(int\ " "object" ", const\ float\ *" "mbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Alters the last n pushed materials\&. See s3d_push_materials_a() for more information how mbuf should look like\&. Use s3d_pep_material_a() if you only want to alter the latest material\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_polygon_normals.3000066400000000000000000000037661361325167000245500ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_polygon_normals .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_POLYGON_NORM" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_polygon_normals \- add normals to polygon .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_polygon_normals('u .BI "int s3d_pep_polygon_normals(int\ " "object" ", const\ float\ *" "nbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Adds normal information to polygons, giving each vertex of a polygon a normal information\&. With this, you can achieve smoothed edge effects\&. .PP nbuf should contain n * 9 float values, for each vertex a normal vector (x,y,z), and you have 3 vertices for each Polygon so that makes 9 float values per Polygon in total\&. Don\*(Aqt worry if you don\*(Aqt use this, it\*(Aqs kind of hard to calculate and the server will always use some proper normal values (same for every vertex, calculated by the plane which is defined by the 3 points of the polygon\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_polygon_tex_coord.3000066400000000000000000000035201361325167000250470ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_polygon_tex_coord .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_POLYGON_TEX_" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_polygon_tex_coord \- add texture coordinates to polygon .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_polygon_tex_coord('u .BI "int s3d_pep_polygon_tex_coord(int\ " "object" ", float\ " "x1" ", float\ " "y1" ", float\ " "x2" ", float\ " "y2" ", float\ " "x3" ", float\ " "y3" ");" .SH "DESCRIPTION" .PP Pimp the last polygon pushed with some textures coordinates, x and y values for each vertex point respectively\&. Those values may be between 0 and 1 and are vertex points on the texture defined in the material of the polygon\&. If you have more polygons which should get a texture, use s3d_pep_polygon_tex_coords() .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_polygon_tex_coords.3000066400000000000000000000032051361325167000252320ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_polygon_tex_coords .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_POLYGON_TEX_" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_polygon_tex_coords \- add texture coordinates to polygons .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_polygon_tex_coords('u .BI "int s3d_pep_polygon_tex_coords(int\ " "object" ", const\ float\ *" "tbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Pimp the latest n polygons with texture coordinates\&. tbuf has 6*n float values for its entries, which are supplied in the order as in s3d_pep_polygon_tex_coord() .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_vertex.3000066400000000000000000000027401361325167000226320ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_vertex .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_VERTEX" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_vertex \- rewrite vertex .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_vertex('u .BI "int s3d_pep_vertex(int\ " "object" ", float\ " "x" ", float\ " "y" ", float\ " "z" ");" .SH "DESCRIPTION" .PP Alter the latest pushed vertex, overwriting with the supplied values\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pep_vertices.3000066400000000000000000000031041361325167000231340ustar00rootroot00000000000000'\" t .\" Title: s3d_pep_vertices .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PEP_VERTICES" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pep_vertices \- rewrite lines .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pep_vertices('u .BI "int s3d_pep_vertices(int\ " "object" ", const\ float\ *" "vbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Alter the latest n pushed vertex\&. vbuf holds the values which are used to overwrite the old data, n entries with each 3 floats specifying x,y,z of the vertices\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_event.3000066400000000000000000000027761361325167000224610ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_event .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_EVENT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_event \- pop event from stack .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'struct\ s3d_evt\ *s3d_pop_event('u .BI "struct s3d_evt *s3d_pop_event(void);" .SH "DESCRIPTION" .PP Pops the latest event from the stack\&. Don\*(Aqt forget to free() both the event and its buffer! Returns a pointer to struct s3d_evt\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_line.3000066400000000000000000000026571361325167000222650ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_line .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_LINE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_line \- remove lines .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pop_line('u .BI "int s3d_pop_line(int\ " "object" ", uint32_t\ " "n" ");" .SH "DESCRIPTION" .PP Deletes the latest n lines from the line stack of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_material.3000066400000000000000000000027161361325167000231300ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_material .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_MATERIAL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_material \- remove materials .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pop_material('u .BI "int s3d_pop_material(int\ " "object" ", uint32_t\ " "n" ");" .SH "DESCRIPTION" .PP Deletes the latest n material from the material stack of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_polygon.3000066400000000000000000000027061361325167000230200ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_polygon .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_POLYGON" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_polygon \- remove polygons .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pop_polygon('u .BI "int s3d_pop_polygon(int\ " "object" ", uint32_t\ " "n" ");" .SH "DESCRIPTION" .PP Deletes the latest n polygon from the polygon stack of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_texture.3000066400000000000000000000027071361325167000230320ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_texture .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_TEXTURE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_texture \- remove textures .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pop_texture('u .BI "int s3d_pop_texture(int\ " "object" ", uint32_t\ " "n" ");" .SH "DESCRIPTION" .PP Deletes the latest n textures from the texture stack of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_pop_vertex.3000066400000000000000000000027011361325167000226410ustar00rootroot00000000000000'\" t .\" Title: s3d_pop_vertex .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_POP_VERTEX" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_pop_vertex \- remove vertices .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_pop_vertex('u .BI "int s3d_pop_vertex(int\ " "object" ", uint32_t\ " "n" ");" .SH "DESCRIPTION" .PP Deletes the latest n vertices from the vertex stack of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_process_stack.3000066400000000000000000000031471361325167000233160ustar00rootroot00000000000000'\" t .\" Title: s3d_process_stack .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PROCESS_STACK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_process_stack \- process all events on stack .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_process_stack('u .BI "void s3d_process_stack(void);" .SH "DESCRIPTION" .PP This function goes through all function of the event\-stack and will call functions\&. this is useful when you define a new function but still have a lot of events of this type on the stack\&. .PP Deprecated .PP This is probably obsolete .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_event.3000066400000000000000000000027311361325167000226310ustar00rootroot00000000000000'\" t .\" Title: s3d_push_event .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_EVENT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_event \- push event onto stack .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_push_event('u .BI "void s3d_push_event(struct\ s3d_evt\ *" "newevt" ");" .SH "DESCRIPTION" .PP Pushes an event onto the event\-stack\&. Usually you don\*(Aqt need to do this manually\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_line.3000066400000000000000000000031371361325167000224400ustar00rootroot00000000000000'\" t .\" Title: s3d_push_line .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_LINE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_line \- push line .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_line('u .BI "int s3d_push_line(int\ " "object" ", uint32_t\ " "v1" ", uint32_t\ " "v2" ", uint32_t\ " "material" ");" .SH "DESCRIPTION" .PP Push one line on the line stack of the object\&. It takes 2 vertex\-index\-no, and one material material\-index\-no\&. as argument\&. If you have a lot of lines to push, use s3d_push_lines() .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_lines.3000066400000000000000000000031351361325167000226210ustar00rootroot00000000000000'\" t .\" Title: s3d_push_lines .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_LINES" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_lines \- push many lines .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_lines('u .BI "int s3d_push_lines(int\ " "object" ", const\ uint32_t\ *" "lbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Pushing n lines on the line stack of the object, each lbuf has a size of n*3, each entry has the index number of the first vertex, second vertex and material number just as in s3d_push_line()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_material.3000066400000000000000000000040711361325167000233050ustar00rootroot00000000000000'\" t .\" Title: s3d_push_material .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_MATERIAL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_material \- push material .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_material('u .BI "int s3d_push_material(int\ " "object" ", float\ " "amb_r" ", float\ " "amb_g" ", float\ " "amb_b" ", float\ " "spec_r" ", float\ " "spec_g" ", float\ " "spec_b" ", float\ " "diff_r" ", float\ " "diff_g" ", float\ " "diff_b" ");" .SH "DESCRIPTION" .PP Pushes a material for an object\&. you will have to count them yourself too, as polygons will ask for the material index number\&. The material properties are given in rgb (red/green/blue) color codes, in float\&. 0\&.0 is the minimum, 1\&.0 is the maximum a color value can be\&. The specular color is the color which is directly reflected from the light source\&. The diffuse color is the color which can be seen in the bright side of the object, and the ambience color is the color of the shadow side of the object\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_material_a.3000066400000000000000000000034061361325167000236060ustar00rootroot00000000000000'\" t .\" Title: s3d_push_material_a .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_MATERIAL_A" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_material_a \- push material with alpha .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_material_a('u .BI "int s3d_push_material_a(int\ " "object" ", float\ " "amb_r" ", float\ " "amb_g" ", float\ " "amb_b" ", float\ " "amb_a" ", float\ " "spec_r" ", float\ " "spec_g" ", float\ " "spec_b" ", float\ " "spec_a" ", float\ " "diff_r" ", float\ " "diff_g" ", float\ " "diff_b" ", float\ " "diff_a" ");" .SH "DESCRIPTION" .PP Same as s3d_push_material, but color has alpha value added\&. Use s3d_push_materials_a() if you have a lot of materials to push\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_materials_a.3000066400000000000000000000041541361325167000237720ustar00rootroot00000000000000'\" t .\" Title: s3d_push_materials_a .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_MATERIALS_A" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_materials_a \- push many materials .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_materials_a('u .BI "int s3d_push_materials_a(int\ " "object" ", const\ float\ *" "mbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Pushes a buffer of materials\&. Those materials are in the format float[n*12], with .PP mbuf[n*12 + 0\-3] \- ambience .PP mbuf[n*12 + 4\-7] \- specular .PP mbuf[n *12 + 8\-11] \- diffusion values .PP of each entry\&. n is the number of materials pushed\&. The values are in the order r,g,b,a\&. If you only want to push one material, use the more easy s3d_push_material_a() function\&. .sp .if n \{\ .RS 4 .\} .nf // each line has r,g,b,a value float bla[24]= {1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}; s3d_push_materials_a(object, bla, 2); // push a red and a cyan material .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_polygon.3000066400000000000000000000037401361325167000232000ustar00rootroot00000000000000'\" t .\" Title: s3d_push_polygon .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_POLYGON" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_polygon \- push polygon .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_polygon('u .BI "int s3d_push_polygon(int\ " "object" ", uint32_t\ " "v1" ", uint32_t\ " "v2" ", uint32_t\ " "v3" ", uint32_t\ " "material" ");" .SH "DESCRIPTION" .PP Push one polygon on the polygon stack of the object\&. It takes 3 vertex\-index numbers and one material material\-index\-no\&. as argument\&. .sp .if n \{\ .RS 4 .\} .nf int oid = s3d_new_object(); // create a new object s3d_push_vertex(oid, 0\&.0, 0\&.0, 0\&.0); s3d_push_vertex(oid, 0\&.0, 1\&.0, 0\&.0); s3d_push_vertex(oid, 1\&.0, 0\&.0, 0\&.0); s3d_push_material(oid, 0\&.3, 0\&.0, 0\&.0, 1\&.0, 1\&.0, 1\&.0, 1\&.0, 0\&.0, 0\&.0); s3d_push_polygon(oid, 0, 1, 2, 0); // this will create a red polygon .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_polygons.3000066400000000000000000000040401361325167000233550ustar00rootroot00000000000000'\" t .\" Title: s3d_push_polygons .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_POLYGONS" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_polygons \- push many polygons .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_polygons('u .BI "int s3d_push_polygons(int\ " "object" ", const\ uint32_t\ *" "pbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP As for vertices, you can push arrays of polygons to have greater performance\&. The pbuf should contain n polygons which consist of 4 uint32_t values of 3 vertices indices and 1 material index\&. .sp .if n \{\ .RS 4 .\} .nf uint32_t pbuf[] = { 0, 1, 2, 0}; int oid = s3d_new_object(); // create a new object s3d_push_vertex(oid, 0\&.0, 0\&.0, 0\&.0); s3d_push_vertex(oid, 0\&.0, 1\&.0, 0\&.0); s3d_push_vertex(oid, 1\&.0, 0\&.0, 0\&.0); s3d_push_material(oid, 0\&.3, 0\&.0, 0\&.0, 1\&.0, 1\&.0, 1\&.0, 1\&.0, 0\&.0, 0\&.0); s3d_push_polygons(oid, pbuf, 1); // push one polygon with the pbuf data .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_texture.3000066400000000000000000000027341361325167000232130ustar00rootroot00000000000000'\" t .\" Title: s3d_push_texture .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_TEXTURE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_texture \- push texture .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_texture('u .BI "int s3d_push_texture(int\ " "object" ", uint16_t\ " "w" ", uint16_t\ " "h" ");" .SH "DESCRIPTION" .PP Adds a new texture with height w and height h on the texture stack\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_textures.3000066400000000000000000000032051361325167000233700ustar00rootroot00000000000000'\" t .\" Title: s3d_push_textures .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_TEXTURES" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_textures \- push many textures .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_textures('u .BI "int s3d_push_textures(int\ " "object" ", const\ uint16_t\ *" "tbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP As for vertices, you can push arrays of textures on the texture stack to have greater performance\&. The tbuf should contain n texture sizes which consist of 2 uint16_t values for width and height for each texture\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_vertex.3000066400000000000000000000031141361325167000230210ustar00rootroot00000000000000'\" t .\" Title: s3d_push_vertex .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_VERTEX" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_vertex \- push vertex .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_vertex('u .BI "int s3d_push_vertex(int\ " "object" ", float\ " "x" ", float\ " "y" ", float\ " "z" ");" .SH "DESCRIPTION" .PP Pushes a vertex onto the vertex stack\&. Make sure that you count how many vertices you\*(Aqve pushed because you\*(Aqll need that for referencing when you push your polygons\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_push_vertices.3000066400000000000000000000035151361325167000233350ustar00rootroot00000000000000'\" t .\" Title: s3d_push_vertices .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_PUSH_VERTICES" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_push_vertices \- push many vertices .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_push_vertices('u .BI "int s3d_push_vertices(int\ " "object" ", const\ float\ *" "vbuf" ", uint16_t\ " "n" ");" .SH "DESCRIPTION" .PP Push some vertices from an array\&. that\*(Aqs much better for performing than using s3d_push_vertex() if you have a lot of vertices (and that\*(Aqs probably the usual case)\&. .sp .if n \{\ .RS 4 .\} .nf float vertices[] = { 0\&.0, 0\&.0, 0\&.0, 1\&.0, 2\&.0, 3\&.0, 3\&.0, 2\&.0, 1\&.0}; s3d_push_vertices(object, vertices, 3); // pushing 3 vertices .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_quit.3000066400000000000000000000026531361325167000214360ustar00rootroot00000000000000'\" t .\" Title: s3d_quit .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_QUIT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_quit \- shutdown s3d library .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_quit('u .BI "int s3d_quit(void);" .SH "DESCRIPTION" .PP Closes the connection and clears the event\-stack\&. It can also be used to leave the s3d_mainloop()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_rotate.3000066400000000000000000000044201361325167000217440ustar00rootroot00000000000000'\" t .\" Title: s3d_rotate .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_ROTATE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_rotate \- rotate object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_rotate('u .BI "int s3d_rotate(int\ " "object" ", float\ " "x" ", float\ " "y" ", float\ " "z" ");" .SH "DESCRIPTION" .PP Rotate an object around the x, y and z\-axis respectively\&. x,y,z may have values between [0,360] degrees\&. .PP You will usually only rotate around one axis, leaving the unused fields on 0, I guess\&. If you want to rotate around more than one axis, please note: The order of the rotation applies is y\-axis, x\-axis, and then z\-axis\&. You can think of it as the earth position coordinates: x is the longitude, y is the latitude, and z is the rotation at this point of the earth around your bodies axis\&. (I wonder if that makes it any clearer ;) .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Rotate is absolute, not relative! .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf s3d_rotate(object, 90, 0, 0); s3d_rotate(object, 180, 0, 0); // object will be rotated 180 degrees around the x\-axis, not 270 degress! .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_scale.3000066400000000000000000000032161361325167000215370ustar00rootroot00000000000000'\" t .\" Title: s3d_scale .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_SCALE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_scale \- scale object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_scale('u .BI "int s3d_scale(int\ " "object" ", float\ " "s" ");" .SH "DESCRIPTION" .PP Scales the object\&. about factor s\&. s=1 will be the original size, \-1 will mirror it\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP s=0 is forbidden and will be ignored! s3d_scale is also absolute, not relative! .sp .5v .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_select_font.3000066400000000000000000000033401361325167000227530ustar00rootroot00000000000000'\" t .\" Title: s3d_select_font .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_SELECT_FONT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_select_font \- select font .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_select_font('u .BI "int s3d_select_font(const\ char\ *" "mask" ");" .SH "DESCRIPTION" .PP This selects a font for the s3d_draw_string() function\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Of course, you won\*(Aqt forget to toggle it visible, won\*(Aqt you? .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf s3d_select_font("vera"); // will use the vera font face .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_set_callback.3000066400000000000000000000040441361325167000230570ustar00rootroot00000000000000'\" t .\" Title: s3d_set_callback .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_SET_CALLBACK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_set_callback \- sets a callback .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_set_callback('u .BI "void s3d_set_callback(uint8_t\ " "event" ", s3d_cb\ " "func" ");" .SH "DESCRIPTION" .PP Sets a callback for a certain event\&. this is very useful for event\-oriented applications\&. event callbacks will not interrupt each other or the mainloop\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Defining callbacks will only work after calling s3d_init() .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf #include void obj_click(struct s3d_evt event) { printf("object id %"PRIu32" got clicked", *((uint32_t *)event\->buf)); } \&.\&.\&. s3d_set_callback(S3D_EVENT_NEW_OBJECT, obj_click); // this will tell you when a object got clicked .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_strlen.3000066400000000000000000000031021361325167000217510ustar00rootroot00000000000000'\" t .\" Title: s3d_strlen .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_STRLEN" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_strlen \- get rendered string size .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'float\ s3d_strlen('u .BI "float s3d_strlen(const\ char\ *" "str" ");" .SH "DESCRIPTION" .PP Returns the length of the string if it were rendered with the currently selected font\&. That might be useful to estimate the size used for a text and render the background or bounding box before inserting the text\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_translate.3000066400000000000000000000035601361325167000224470ustar00rootroot00000000000000'\" t .\" Title: s3d_translate .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_TRANSLATE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_translate \- move object to absolute position .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_translate('u .BI "int s3d_translate(int\ " "object" ", float\ " "x" ", float\ " "y" ", float\ " "z" ");" .SH "DESCRIPTION" .PP Move the object to some position in space\&. when you create an object, it\*(Aqs always located at 0\&.0 , 0\&.0, 0\&.0\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Translation is absolute, not relative! .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf s3d_translate(object, 2, 0, 0); s3d_translate(object, 4, 0, 0); // object will end up at 4,0,0 and not 6,0,0!! .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_unlink.3000066400000000000000000000026221361325167000217500ustar00rootroot00000000000000'\" t .\" Title: s3d_unlink .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_UNLINK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_unlink \- removes link from another object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3d_unlink('u .BI "int s3d_unlink(int\ " "oid" ");" .SH "DESCRIPTION" .PP Remove the link of object oid to its target\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_usage.3000066400000000000000000000026421361325167000215560ustar00rootroot00000000000000'\" t .\" Title: s3d_usage .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_USAGE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_usage \- print s3d parameter .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_usage('u .BI "void s3d_usage(void);" .SH "DESCRIPTION" .PP Prints the possible parameter for the client library (which can be passed in s3d_init()) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_vector_angle.3000066400000000000000000000034051361325167000231200ustar00rootroot00000000000000'\" t .\" Title: s3d_vector_angle .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_VECTOR_ANGLE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_vector_angle \- calculate angle between two vectors .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'float\ s3d_vector_angle('u .BI "float s3d_vector_angle(const\ float\ " "vector1" "[], const\ float\ " "vector2" "[]);" .SH "DESCRIPTION" .PP Calculates and returns the angle between vector1 and vector2\&. Please note that the resulting angle is between 0 and PI, therefore not covering the whole period! To convert in degrees just do result*180/M_PI\&. All vectors should have the format float[3]\&. More info on wikipedia\&. http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_vector_cross_product.3000066400000000000000000000032671361325167000247310ustar00rootroot00000000000000'\" t .\" Title: s3d_vector_cross_product .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_VECTOR_CROSS_PRO" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_vector_cross_product \- calculate cross product of two vectors .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_vector_cross_product('u .BI "void s3d_vector_cross_product(const\ float\ " "vector1" "[], const\ float\ " "vector2" "[], float\ " "result_vector" "[]);" .SH "DESCRIPTION" .PP Calculates and returns the cross product of vector1 and vector2\&. All vectors should have the format float[3]\&. More info on wikipedia\&. http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_vector_dot_product.3000066400000000000000000000032171361325167000243610ustar00rootroot00000000000000'\" t .\" Title: s3d_vector_dot_product .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_VECTOR_DOT_PRODU" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_vector_dot_product \- calculate dot product of two vectors .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'float\ s3d_vector_dot_product('u .BI "float s3d_vector_dot_product(const\ float\ " "vector1" "[], const\ float\ " "vector2" "[]);" .SH "DESCRIPTION" .PP Calculates and returns the dot product of vector1 and vector2\&. All vectors should have the format float[3]\&. More info on wikipedia\&. http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_vector_length.3000066400000000000000000000030731361325167000233140ustar00rootroot00000000000000'\" t .\" Title: s3d_vector_length .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_VECTOR_LENGTH" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_vector_length \- calculate length of vector .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'float\ s3d_vector_length('u .BI "float s3d_vector_length(const\ float\ " "vector" "[]);" .SH "DESCRIPTION" .PP Calculates and returns the length of the given vector (which should be of the type float[3])\&. More info on wikipedia http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3d_vector_subtract.3000066400000000000000000000032221361325167000236560ustar00rootroot00000000000000'\" t .\" Title: s3d_vector_subtract .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_VECTOR_SUBTRACT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_vector_subtract \- subtract two vectors .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3d_vector_subtract('u .BI "void s3d_vector_subtract(const\ float\ " "vector1" "[], const\ float\ " "vector2" "[], float\ " "result_vector" "[]);" .SH "DESCRIPTION" .PP Subtracts vector1 from vector2, writing result into result_vector\&. All vectors should have the format float[3]\&. More info on wikipedia\&. http://en\&.wikipedia\&.org/wiki/Vector_(spatial) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_ani_mate.3000066400000000000000000000035501361325167000224150ustar00rootroot00000000000000'\" t .\" Title: s3dw_ani_mate .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_ANI_MATE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_ani_mate \- doing the whole animation thing .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_ani_mate('u .BI "void s3dw_ani_mate(void);" .SH "DESCRIPTION" .PP Just call this in your mainloop if you want some nice window sliding animations\&. it\*(Aqs somewhat bloating, but you don\*(Aqt want to miss it ;) .sp .if n \{\ .RS 4 .\} .nf #include // nanosleep() static struct timespec t={0\&.33*1000*1000}; // 33 mili seconds void mainloop() { // keep this in your mainloop\&. this will do smooth animations for you \&.\&.\&. s3dw_ani_mate(); nanosleep(&t,NULL); } \&.\&.\&.\&. s3d_mainloop(mainloop); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_button_new.3000066400000000000000000000032541361325167000230250ustar00rootroot00000000000000'\" t .\" Title: s3dw_button_new .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_BUTTON_NEW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_button_new \- create a new button in the surface .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_button\ *s3dw_button_new('u .BI "s3dw_button *s3dw_button_new(const\ s3dw_surface\ *" "surface" ", const\ char\ *" "text" ", float\ " "posx" ", float\ " "posy" ");" .SH "DESCRIPTION" .PP Creates a new button on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface\&. .PP See s3dw_button for information about callbacks which may be defined\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_delete.3000066400000000000000000000026371361325167000221070ustar00rootroot00000000000000'\" t .\" Title: s3dw_delete .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_DELETE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_delete \- delete widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_delete('u .BI "void s3dw_delete(s3dw_widget\ *" "widget" ");" .SH "DESCRIPTION" .PP Deletes any widget\&. Should be casted with S3DWIDGET()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_focus.3000066400000000000000000000030521361325167000217540ustar00rootroot00000000000000'\" t .\" Title: s3dw_focus .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_FOCUS" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_focus \- give widget focus .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_focus('u .BI "void s3dw_focus(s3dw_widget\ *" "focus" ");" .SH "DESCRIPTION" .PP Gives focus to the widget, relative to its parent\&. That means you can focus a surface, and each surface can focus one of its element, e\&.g\&. an input field\&. Should be casted with S3DWIDGET()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_getroot.3000066400000000000000000000034041361325167000223210ustar00rootroot00000000000000'\" t .\" Title: s3dw_getroot .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_GETROOT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_getroot \- get the root .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_widget\ *s3dw_getroot('u .BI "s3dw_widget *s3dw_getroot(void);" .SH "DESCRIPTION" .PP Returns the root\-widget, which holds all the surfaces\&. E\&.g\&. if you want to move all widgets at once, adjust the root\-widgets x,y,z and use s3dw_moveit() .sp .if n \{\ .RS 4 .\} .nf s3dw_widget *root = s3dw_getroot(); // move widget center to (0,5,0)\&. upon creation, it\*(Aqs centered at (0,0,0), // so this might move it up root\->x=0; root\->y=5; root\->z=0; s3dw_moveit(root); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_handle_click.3000066400000000000000000000036421361325167000232420ustar00rootroot00000000000000'\" t .\" Title: s3dw_handle_click .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_HANDLE_CLICK" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_handle_click \- handle click on widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3dw_handle_click('u .BI "int s3dw_handle_click(const\ struct\ s3d_evt\ *" "event" ");" .SH "DESCRIPTION" .PP If you want your widgets on mouseclicks (believe me, you want that), you have to call this either in your clickhandler\-function or specify it itself as the clickhandler\&. .sp .if n \{\ .RS 4 .\} .nf // way 1: s3d_set_callback(S3D_EVENT_OBJ_CLICK,s3dw_handle_click); // way 2: \&.\&.\&. void click(struct s3d_evt *evt) { s3dw_handle_click(evt); \&.\&.\&.\&. // your own clickhandler code \&.\&.\&. } \&.\&.\&.\&. s3d_set_callback(S3D_EVENT_OBJ_CLICK,click); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_handle_key.3000066400000000000000000000035011361325167000227370ustar00rootroot00000000000000'\" t .\" Title: s3dw_handle_key .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_HANDLE_KEY" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_handle_key \- handle key input on widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3dw_handle_key('u .BI "int s3dw_handle_key(const\ struct\ s3d_evt\ *" "event" ");" .SH "DESCRIPTION" .PP This is somehow useful to call in your keyhandler functions if you want to have input\-boxes work\&. ;) .sp .if n \{\ .RS 4 .\} .nf // way 1: s3d_set_callback(S3D_EVENT_KEY,s3dw_handle_key); // way 2: \&.\&.\&. void key(struct s3d_evt *evt) { s3dw_handle_key(evt); \&.\&.\&.\&. // your own keyhandler code \&.\&.\&. } \&.\&.\&.\&. s3d_set_callback(S3D_EVENT_KEY,key); .fi .if n \{\ .RE .\} .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_input_change_text.3000066400000000000000000000030071361325167000243450ustar00rootroot00000000000000'\" t .\" Title: s3dw_input_change_text .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_INPUT_CHANGE_TE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_input_change_text \- changes the text of the input .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_input_change_text('u .BI "void s3dw_input_change_text(s3dw_input\ *" "input" ", const\ char\ *" "text" ");" .SH "DESCRIPTION" .PP Change the text in the referenced input\-box to the specified text\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_input_gettext.3000066400000000000000000000027271361325167000235500ustar00rootroot00000000000000'\" t .\" Title: s3dw_input_gettext .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_INPUT_GETTEXT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_input_gettext \- get text of input .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'char\ *s3dw_input_gettext('u .BI "char *s3dw_input_gettext(s3dw_input\ *" "input" ");" .SH "DESCRIPTION" .PP Returns the text which is currently entered in the referenced input\-box\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_input_new.3000066400000000000000000000034311361325167000226460ustar00rootroot00000000000000'\" t .\" Title: s3dw_input_new .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_INPUT_NEW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_input_new \- create a new input in the surface .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_input\ *s3dw_input_new('u .BI "s3dw_input *s3dw_input_new(const\ s3dw_surface\ *" "surface" ", float\ " "width" ", float\ " "posx" ", float\ " "posy" ");" .SH "DESCRIPTION" .PP Creates a new input\-box on the surface with a input width of "width", the upper left corner at (posx,posy) on the surface\&. The input\-box is empty on creation and can be change with s3dw_input_change_text, and received with s3dw_input_gettext .PP See s3dw_input for information about callbacks which may be defined\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_label_change_text.3000066400000000000000000000027661361325167000243000ustar00rootroot00000000000000'\" t .\" Title: s3dw_label_change_text .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_LABEL_CHANGE_TE" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_label_change_text \- change label text .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_label_change_text('u .BI "void s3dw_label_change_text(s3dw_label\ *" "label" ", const\ char\ *" "text" ");" .SH "DESCRIPTION" .PP Change the text in the referenced label to the specified text\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_label_new.3000066400000000000000000000032421361325167000225660ustar00rootroot00000000000000'\" t .\" Title: s3dw_label_new .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_LABEL_NEW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_label_new \- create a new label in the surface .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_label\ *s3dw_label_new('u .BI "s3dw_label *s3dw_label_new(const\ s3dw_surface\ *" "surface" ", const\ char\ *" "text" ", float\ " "posx" ", float\ " "posy" ");" .SH "DESCRIPTION" .PP Creates a new label on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface\&. .PP See s3dw_label for information about callbacks which may be defined\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_moveit.3000066400000000000000000000027631361325167000221500ustar00rootroot00000000000000'\" t .\" Title: s3dw_moveit .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_MOVEIT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_moveit \- apply widgets moving function .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_moveit('u .BI "void s3dw_moveit(s3dw_widget\ *" "widget" ");" .SH "DESCRIPTION" .PP Moves/translates the widget as you specified in it\*(Aqs private s3dw_widget structure\&. Should be casted with S3DWIDGET()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_object_info.3000066400000000000000000000030641361325167000231210ustar00rootroot00000000000000'\" t .\" Title: s3dw_object_info .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_OBJECT_INFO" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_object_info \- handle object info events .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'int\ s3dw_object_info('u .BI "int s3dw_object_info(struct\ s3d_evt\ *" "event" ");" .SH "DESCRIPTION" .PP This can be used to let s3dw handle S3D_EVENT_OBJ_INFO\-events\&. With this, s3dw can consider the camera position and makes things like following the camera possible\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_show.3000066400000000000000000000026421361325167000216210ustar00rootroot00000000000000'\" t .\" Title: s3dw_show .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_SHOW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_show \- make widget visible .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_show('u .BI "void s3dw_show(s3dw_widget\ *" "widget" ");" .SH "DESCRIPTION" .PP Switches a widget visible\&. Should be casted with S3DWIDGET()\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_surface_new.3000066400000000000000000000031471361325167000231430ustar00rootroot00000000000000'\" t .\" Title: s3dw_surface_new .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_SURFACE_NEW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_surface_new \- create a new surface .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_surface\ *s3dw_surface_new('u .BI "s3dw_surface *s3dw_surface_new(const\ char\ *" "title" ", float\ " "width" ", float\ " "height" ");" .SH "DESCRIPTION" .PP Creates a new surface (a new window) with title "title" and dimension "width" x "height"\&. .PP See s3dw_surface for information about callbacks which may be defined\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_change_text.3000066400000000000000000000027761361325167000247170ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_change_text .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_CHANGE_" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_change_text \- change text .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_change_text('u .BI "void s3dw_textbox_change_text(s3dw_textbox\ *" "textbox" ", const\ char\ *" "text" ");" .SH "DESCRIPTION" .PP Change the text in the referenced textbox to the specified text\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_new.3000066400000000000000000000035171361325167000232110ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_new .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_NEW" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_new \- create a new textbox in the surface .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w's3dw_textbox\ *s3dw_textbox_new('u .BI "s3dw_textbox *s3dw_textbox_new(const\ s3dw_surface\ *" "surface" ", const\ char\ *" "text" ", float\ " "posx" ", float\ " "posy" ", float\ " "width" ", float\ " "height" ");" .SH "DESCRIPTION" .PP Creates a new textbox on the surface, with "text" written on it and the upper left corner at (posx,posy) on the surface\&. Width and height define the size of the textbox including scrollbars which are rendered around the textfield\&. .PP See s3dw_textbox for information about callbacks which may be defined\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_scrolldown.3000066400000000000000000000027431361325167000246060ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_scrolldown .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_SCROLLD" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_scrolldown \- scroll text down .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_scrolldown('u .BI "void s3dw_textbox_scrolldown(s3dw_textbox\ *" "textbox" ");" .SH "DESCRIPTION" .PP Scrolls the text in the textbox down by one line, if possible\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_scrollleft.3000066400000000000000000000027571361325167000245760ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_scrollleft .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_SCROLLL" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_scrollleft \- scroll text left .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_scrollleft('u .BI "void s3dw_textbox_scrollleft(s3dw_textbox\ *" "textbox" ");" .SH "DESCRIPTION" .PP Scrolls the text in the textbox to the left by one character, if possible\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_scrollright.3000066400000000000000000000027651361325167000247600ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_scrollright .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_SCROLLR" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_scrollright \- scroll text right .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_scrollright('u .BI "void s3dw_textbox_scrollright(s3dw_textbox\ *" "textbox" ");" .SH "DESCRIPTION" .PP Scrolls the text in the textbox to the right by one character, if possible\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_scrollto.3000066400000000000000000000030621361325167000242540ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_scrollto .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_SCROLLT" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_scrollto \- scroll text to position .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_scrollto('u .BI "void s3dw_textbox_scrollto(s3dw_textbox\ *" "textbox" ", int\ " "x" ", int\ " "y" ");" .SH "DESCRIPTION" .PP Scrolls the text in the textbox so that the character in row y, column x is in the top left corner of the textbox\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man3/s3dw_textbox_scrollup.3000066400000000000000000000027271361325167000242650ustar00rootroot00000000000000'\" t .\" Title: s3dw_textbox_scrollup .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3DW_TEXTBOX_SCROLLU" "3" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox_scrollup \- scroll text up .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .HP \w'void\ s3dw_textbox_scrollup('u .BI "void s3dw_textbox_scrollup(s3dw_textbox\ *" "textbox" ");" .SH "DESCRIPTION" .PP Scrolls the text in the textbox up by one line, if possible\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/000077500000000000000000000000001361325167000176175ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/manpages/man9/mcp_object.9000066400000000000000000000030511361325167000220150ustar00rootroot00000000000000'\" t .\" Title: mcp_object .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "MCP_OBJECT" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" mcp_object \- master control program object .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct mcp_object { uint32_t object; float trans_x; float trans_y; float trans_z; float r; char name; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP Deprecated .PP don\*(Aqt use, to be removed soon (use struct s3d_but_info)\&. ;) .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3d_but_info.9000066400000000000000000000027411361325167000222730ustar00rootroot00000000000000'\" t .\" Title: s3d_but_info .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_BUT_INFO" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_but_info \- status of a button .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct s3d_but_info { uint8_t button; uint8_t state; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP Can be used on the buffer of an event of type S3D_EVENT_MBUTTON\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3d_evt.9000066400000000000000000000033321361325167000212610ustar00rootroot00000000000000'\" t .\" Title: s3d_evt .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_EVT" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_evt \- event information .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct s3d_evt { uint8_t event; int length; char *buf; struct s3d_evt *next; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP This is the event information holder\&. .PP event .RS 4 gives the event type .RE .PP length .RS 4 gives the length of the buffer *buf .RE .PP buf .RS 4 is the pointer to the multiple purpose buffer, which will have more specific information about the object .RE .PP next .RS 4 can be safely ignored ;) .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3d_key_event.9000066400000000000000000000030161361325167000224530ustar00rootroot00000000000000'\" t .\" Title: s3d_key_event .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_KEY_EVENT" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_key_event \- key event information .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct s3d_key_event { uint16_t keysym; uint16_t unicode; uint16_t modifier; uint16_t state; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP Can be used on the buffer of an event of type S3D_EVENT_KEY*\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3d_obj_info.9000066400000000000000000000040101361325167000222420ustar00rootroot00000000000000'\" t .\" Title: s3d_obj_info .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "S3D_OBJ_INFO" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3d_obj_info \- object information .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct s3d_obj_info { uint32_t object; uint32_t flags; float trans_x; float trans_y; float trans_z; float rot_x; float rot_y; float rot_z; float scale; float r; char name; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP Can be used on the buffer of an event of type S3D_EVENT_OBJ_INFO\&. name will usually contain nothing for usual objects, but mcp objects will contain the applications names here\&. r is the radius of the convex sphere an object, which will also be interesting for the mcp\&. .PP Special objects like camera, pointer will have the "sys_" prefix in the name and will be named "pointer0", "pointer1" \&.\&.\&. or "cam0", "cam1" \&.\&.\&. For cam object, scale will contain the aspect ratio\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_button.9000066400000000000000000000030671361325167000221720ustar00rootroot00000000000000'\" t .\" Title: _s3dw_button .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_BUTTON" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_button \- button of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_button { s3dw_widget widget; char *text; uint32_t oid_text; s3dw_callback onclick; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP The buttons is just a button as you would expect it in a 2D widget library\&. It only reacts on clicks\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_input.9000066400000000000000000000032011361325167000220040ustar00rootroot00000000000000'\" t .\" Title: _s3dw_input .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_INPUT" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_input \- input field of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_input { s3dw_widget widget; char *text; uint32_t oid_text; s3dw_callback onclick; s3dw_callback onedit; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP The inputs is an input\-field where a user may type things\&. onclick reacts on click in the field, onedit notifies you when someone writes in the field\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_label.9000066400000000000000000000030321361325167000217260ustar00rootroot00000000000000'\" t .\" Title: _s3dw_label .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_LABEL" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_label \- label of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_label { s3dw_widget widget; char *text; s3dw_callback onclick; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP The labels is an label\-field where a user may type things\&. onclick reacts on click in the field\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_scrollbar.9000066400000000000000000000034261361325167000226410ustar00rootroot00000000000000'\" t .\" Title: _s3dw_scrollbar .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_SCROLLBAR" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_scrollbar \- scrollbar of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_scrollbar { s3dw_widget widget; float pos; float max; int type; int loid; int roid; int baroid; s3dw_callback lonclick; s3dw_callback ronclick; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP The Scrollbar should be placed around scrollable content\&. Currently only the left and right icons are clickable (lonclick and ronclick callbacks), in vertical mode lonclick is the callback for the up icon, ronclick the callback for the down icon\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_style.9000066400000000000000000000043771361325167000220240ustar00rootroot00000000000000'\" t .\" Title: _s3dw_style .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_STYLE" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_style \- style of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_style { const char *name; const char *fontface; float surface_mat; float input_mat; float inputback_mat; float text_mat; float title_mat; float title_text_mat; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP With s3dw_style you can change the colors/materials of your widgets\&. materials are in the same as in s3d_push_materials_a, that means red,green,blue and alpha float values (between 0\&.0 and 1\&.0) for ambience, specular and diffuse color\&. .PP name .RS 4 name of the style \&.\&.\&. kind of redundant .RE .PP fontface .RS 4 font face for all used fonts .RE .PP surface_mat .RS 4 material for the surface background .RE .PP input_mat .RS 4 material for button boxes and other widgets .RE .PP inputback_mat .RS 4 material for input field background .RE .PP text_mat .RS 4 material for the text on buttons and inputs .RE .PP title_mat .RS 4 material for the title bar .RE .PP title_text_mat .RS 4 material for the text on the title bar .RE .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_surface.9000066400000000000000000000031021361325167000222750ustar00rootroot00000000000000'\" t .\" Title: _s3dw_surface .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_SURFACE" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_surface \- root of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_surface { s3dw_widget widget; uint32_t oid_title; uint32_t oid_tbar; char *title; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP A surface is the window of this widget library, holding all of our elements like buttons, input fields etc \&.\&.\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_textbox.9000066400000000000000000000032631361325167000223520ustar00rootroot00000000000000'\" t .\" Title: _s3dw_textbox .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_TEXTBOX" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_textbox \- textbox of s3d widget .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_textbox { s3dw_widget widget; s3dw_scrollbar *scroll_vertical; s3dw_scrollbar *scroll_horizontal; char *text; int n_lineoids; int *p_lineoids; int window_x; int window_y; s3dw_callback onclick; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP A textbox shows some text with scrollbars to scroll around\&. It can currently only react to a click event\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/manpages/man9/s3dw_widget.9000066400000000000000000000044121361325167000221350ustar00rootroot00000000000000'\" t .\" Title: _s3dw_widget .\" Author: Simon Wunderlich .\" Generator: DocBook XSL Stylesheets .\" .\" Manual: s3d Manual .\" Source: s3d .\" Language: English .\" .TH "_S3DW_WIDGET" "9" "" "s3d" "s3d Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" s3dw_widget \- s3d widget information .SH "SYNOPSIS" .sp .ft B .nf #include .fi .ft .SH "STRUCTURE MEMBERS" .sp .if n \{\ .RS 4 .\} .nf struct _s3dw_widget { int type; s3dw_widget *parent; s3dw_style *style; int nobj; s3dw_widget **pobj; int focus; int flags; float ax; float ay; float az; float as; float arx; float ary; float arz; float width; float height; uint32_t oid; void *ptr; float x; float y; float z; float s; float rx; float ry; float rz; } .fi .if n \{\ .RE .\} .SH "DESCRIPTION" .PP This is the most basic widget type, it contains all the "general" widget information\&. If you want to move a widget, you\*(Aqd change x,y,z,s and rx,ry,rz and call s3dw_moveit to turn your action reality\&. Every other widget has this type as first entry, so a simple typecast to s3dw_widget will give you the widgets "general" information\&. For typecast, you may use S3DWIDGET()\&. .PP The pointer ptr allows linking to user\-specific data structures\&. That comes in handy if the widget is called back by an event, and the program must now find out on which data the user reacted\&. .SH "AUTHOR" .PP \fBSimon Wunderlich\fR .RS 4 Author of s3d .RE s3d-0.2.2.1/Documentation/s3d.docbook000066400000000000000000000014331361325167000172140ustar00rootroot00000000000000 ]> &bookinfo; &server; &libs3d; &libs3dw; s3d-0.2.2.1/Documentation/server/000077500000000000000000000000001361325167000164665ustar00rootroot00000000000000s3d-0.2.2.1/Documentation/server/CMakeLists.txt000066400000000000000000000001611361325167000212240ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann s3d-0.2.2.1/Documentation/server/server.docbook000066400000000000000000000054721361325167000213460ustar00rootroot00000000000000 s3d - the server Client-Server Architecture s3d is build as client-server architecture, similar to the xserver. The s3d-server is the program executed on the users desktop and waits for incoming connections, the applications, which give their content they want to have displayed to the server. The server will then display the content to the user, who can move to the 3D space, and interact (mouse moving/clicking, keyboard), and the client will receive these signals over the network from the server. Just like on the X-Server, it may seem unusual to have the "server" on the own machine, while the "client" may be on any other machine with network connection. But this makes features possible like browsing files on your file server or even access point. ;) Don't let the server-client thing confuse you too much for now, on a properly installed system the s3d will startup with the mcp (which is the window manager in s3d-terms) which will give you a complete look and feel just as you would expect. More (internal) information about the server will be presented here as soon as someone is interested. ;) Moving in s3d this is not the final version for movement, but ... hold middle mouse button (or left+right at once if you have middle-mousebutton-emulation) and move your mouse to move around the world hold right mouse button and move mouse to rotate the mouse (look around) left mouse button is for clicking :) press f2 to get in ego-shooter mode :D you can use w,a,s,d for movement now. f2 again to deactivate. this only works with dot_mcp, the others above work out-of-the box within the server. The s3drc file You can automatically fire up the mcp or anything you want with s3d and have it closed when s3d goes down or vice versa: just create a shellscript at position /etc/s3drc or ~/.s3drc, for example have it starting the mcp. Don't forget to toggle it executable (chmod 755 or so). When s3d starts, it will look for ~/.s3drc or /etc/s3drc (in this order), and will start it along with the server. E.g. when you log out off your mcp, the s3d server is shut down too. You can disable this behavior with s3d --no-rc For example my .s3drc looks like this: $ cat ~/.s3drc #!/bin/sh cd ~/msrc/s3d/apps/dot_mcp/ ./dot_mcp s3d-0.2.2.1/Documentation/xml.doxygen000066400000000000000000000114641361325167000173650ustar00rootroot00000000000000# Doxyfile 1.5.6 # SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = libs3d PROJECT_NUMBER = 0.2.1 OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 3 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = NO SHOW_DIRECTORIES = NO SHOW_FILES = NO SHOW_NAMESPACES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../libs3d \ ../libs3dw INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.h RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = YES XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO GENERATE_HTML = NO GENERATE_LATEX = NO s3d-0.2.2.1/INSTALL000066400000000000000000000054641361325167000134110ustar00rootroot00000000000000 ________ / \________ _______ \ \ \| \ ____\ ___/____ /|_ \ / \ \ \ \ | \ \ \____\_ \| \ \___________/ \ | / s3D \__________/________/ INSTALL 1. Preparing ------------ Before being able to install s3d and the sample programs, you need to prepare the build, and compile s3d. You will need to setup CMake first. The following assumes that cmake 2.4.4 or better is available and installed into a directory listed in the $PATH environment variable. It is possible to run cmake direct from the source directory, but we recommend to create a directory from where you start cmake. $ mkdir build $ cd build $ cmake .. [-DPROFILING=ON|OFF] [-DDEBUG=VLOW|LOW|MED|HIGH|VHIGH] \ [-DBUILD_LTO=ON|OFF] [-DEXAMPLES=ON|OFF] \ [-DCMAKE_INSTALL_PREFIX=...] This will configure s3d. Use the -DCMAKE_INSTALL_PREFIX command line argument to select a different prefix to install s3d into. The default is /usr/local, so binaries will get installed into /usr/local/bin, libraries into /usr/local/lib, and documentation into /usr/local/share/doc/s3d-version. If you are intending to work on s3d, you can use the -DDEBUG argument to enable building a debug version. Likewise, -DPROFILING=ON will enable a version compiled for profiling. Link time optimisation can be enabled by setting -DBUILD_LTO=ON. You can use ccmake to ccmake to set additional cmake cache variables. $ ccmake .. 2. Building ----------- After configure has finished, you can start the build of s3d: $ make in the build directory will compile server, client-lib and the examples for you. 3. Installing ------------- Because of the new plugins, things need to be installed before you can test. $ make install installs s3d in the selected prefix (default /usr/local/*), you may need to become root first. $ s3d --no-rc fires up the server. Uf you're lucky, a X11 window appears. Now the s3d is listening on TCP port 6066. Now it's time to test some things. on another terminal: $ cd examples $ ./modelloader ../objs/miu.3ds now there should appear a rotating cat. you can move with with the middle mouse-button pushed. now you can try the MCP, which is something like a windowmanager in X: $ cd apps/dot_mcp $ ./dot_mcp now you should get some fancy window decorations :D there are a few other examples, just play around 4. s3drc -------- We recommend to make use of the .s3drc. The idea is the same as in .xinitrc, starting the window manager (the mcp) along with the server. When the .s3drc is finished, the server will go down with it (so you can press a "quit" button in the mcp). Give it a try: $ cat << EOF > ~/.s3drc #!/bin/sh dot_mcp EOF $ s3d (note, this time without --no-rc) s3d-0.2.2.1/LICENSES/000077500000000000000000000000001361325167000135545ustar00rootroot00000000000000s3d-0.2.2.1/LICENSES/BSD-3-Clause.txt000066400000000000000000000027101361325167000162770ustar00rootroot00000000000000Copyright (c) . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of 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 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. s3d-0.2.2.1/LICENSES/CC0-1.0.txt000066400000000000000000000154041361325167000151620ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. s3d-0.2.2.1/LICENSES/GPL-2.0-or-later.txt000066400000000000000000000423261361325167000167660ustar00rootroot00000000000000GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 Lesser 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. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 Lesser General Public License instead of this License. s3d-0.2.2.1/LICENSES/LGPL-2.1-or-later.txt000066400000000000000000000624621361325167000171060ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. < signature of Ty Coon > , 1 April 1990 Ty Coon, President of Vice That's all there is to it! s3d-0.2.2.1/README000066400000000000000000000051241361325167000132310ustar00rootroot00000000000000 ________ / \________ _______ \ \ \| \ ____\ ___/____ /|_ \ / \ \ \ \ | \ \ \____\_ \| \ \___________/ \ | / s3D \__________/________/ 1.REASONS --------- Many people, have been fascinated by 3D Desktops. There were/are projects like 3dwm and SUNs Looking Glass among others which try to replace your daily boring 2D Desktop. However, 3D GUIs are still hard and uncomfortable to use. S3d unfortunately does not change that, but gives you a big playground to try your own ideas of 3D GUIs. With the simple API you can easily implement own interfaces without caring about writing object interaction, model loading or 3D widgets yourself. Many 3D applications can coexist in the same space (unlike usual OpenGL apps), just as the windows on your screen. And who knows, maybe we can really have a complete usable 3D desktop someday? :) 2.INSTALL --------- see the INSTALL file 3. WARRANTY ----------- I've written this program to satisfy myself (in some way), so please don't assume that it could have ANY USEFULNESS. I just published it because I thought someone might find it interesting, but there is no warranty for anything. if you find bugs or you have ideas what you would like to see implemented, or patches, please drop me a line. 4. LICENSE ---------- All those things are published under the GPLv2 or later at your option. The Library is licensed under the GNU Lesser GPL (LGPL), so you can also write close-sourced thing which links to the library (if you really have to ...). COPYING for the GPLv2 and COPYING.LESSER for the LGPLv2.1 are included too. if I'm mistaken in any ownership-concerns, please tell me and don't be too mad at me, as I have had no idea of licensing at all. Applications (GPLv2 or later): * apps/dot_mcp * apps/kism3d * apps/meshs3d * apps/s3d_x11gate * apps/s3dfm * apps/s3dosm * apps/s3dvt * example/* * server Librarys (LGPLv2.1 or later) * libs3d * libs3dw 5. DOCUMENTATION ---------------- please see the "Documentation" folder 6. CONTACT ---------- MAIL: sw@simonwunderlich.de IRC: #s3d @ irc.freenode.org WWW: http://s3d.sourceforge.net Any Feedback is welcome!! 7. TEAM ------- Sven Eckelmann Mike Graenz Andreas Kohn Andreas Langer Marek Lindner Timo Schneider Christiane Weidauer Simon Wunderlich s3d-0.2.2.1/TODO000066400000000000000000000002111361325167000130310ustar00rootroot00000000000000general: * FULLSCREEN! dot_mcp: * sane paths for applications cmake: * Apple todo: won't find -lX11 (for s3d_x11gate) while compiling s3d-0.2.2.1/apps/000077500000000000000000000000001361325167000133125ustar00rootroot00000000000000s3d-0.2.2.1/apps/CMakeLists.txt000066400000000000000000000004461361325167000160560ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann add_subdirectory(dot_mcp) add_subdirectory(kism3d) add_subdirectory(meshs3d) add_subdirectory(s3dfm) add_subdirectory(s3dosm) add_subdirectory(s3dvt) add_subdirectory(s3d_x11gate) s3d-0.2.2.1/apps/dot_mcp/000077500000000000000000000000001361325167000147375ustar00rootroot00000000000000s3d-0.2.2.1/apps/dot_mcp/CMakeLists.txt000066400000000000000000000005351361325167000175020ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(dot_mcp C) include_directories(${s3d_SOURCE_DIR}/libs3d) add_executable(dot_mcp main.c menu.c) target_link_libraries(dot_mcp s3d ${MATH_LIBRARIES}) # install install(TARGETS dot_mcp RUNTIME DESTINATION "${BIN_INSTALL_DIR}") s3d-0.2.2.1/apps/dot_mcp/TODO000066400000000000000000000000551361325167000154270ustar00rootroot00000000000000- update navigation ... wasd is no good idea s3d-0.2.2.1/apps/dot_mcp/dot_mcp.h000066400000000000000000000006461361325167000165430ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #ifndef DOTMCPUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define DOTMCPUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define DOTMCPUNUSED(x) /* x */ #else #define DOTMCPUNUSED(x) x #endif #endif int menu_init(void); void menu_click(int oid); s3d-0.2.2.1/apps/dot_mcp/main.c000066400000000000000000000301731361325167000160330ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include #include "dot_mcp.h" #include /* uint32_t */ #include /* sleep() */ #include /* free(), malloc() */ #include /* strncpy() */ #include /* printf() */ #include /* sin(), cos() */ #include /* nanosleep() */ static struct timespec t = { 0, 33*1000*1000 }; #define bsize 0.2 struct tver { float x, y, z; }; static struct tver campos, camrot; static float xdif = 0, ydif = 0; struct app { int oid; float r; int init; float trans_x, trans_y, trans_z; float textw; char name[256]; int min_but, close_but, title; int sphere; struct app *next; }; static int ego_mode = 0; static float asp = 1.0; static struct app *apps = NULL; static float bottom = -1.0; static float left = -1.0; static float zoom = 5.0; static int n_app = 0; static int rot_flag = 0; static struct app *focus = NULL; static float focus_r = 0; static float alpha = 0; static int rotate, reset, min_but, close_but, sphere, menu = -1; static void place_apps(void); #define SIDES 60 #define RINGS 60 static int greentorus(void) { int o, i, j; float R, r, a; float ia, ja, iap, jap; float v[SIDES*RINGS*3]; float n[SIDES*12]; /* normals */ uint32_t l[SIDES*RINGS*6]; o = s3d_new_object(); R = 100; /* outer radius */ r = 100; /* inner radius */ a = M_PI / 180; s3d_push_material_a(o, 0.2, 0.6, 0.2, 0.5, 1 , 1 , 1 , 0.5, 0.2, 0.6, 0.2, 0.5); for (i = 0; i < RINGS; i++) { for (j = 0; j < SIDES; j++) { ia = a * ((float)i * 360.0 / RINGS); ja = a * ((float)j * 360.0 / SIDES); iap = a * ((float)(i + 1) * 360.0 / RINGS); jap = a * ((float)(j + 1) * 360.0 / SIDES); v[i*SIDES*3+ j*3 +0] = (R + r * cos(ja)) * cos(ia); v[i*SIDES*3+ j*3 +1] = r * sin(ja); v[i*SIDES*3+ j*3 +2] = (R + r * cos(ja)) * sin(ia); l[i*SIDES*6+ j*6 +0] = i * SIDES + j; l[i*SIDES*6+ j*6 +1] = i * SIDES + (j + 1) % SIDES; l[i*SIDES*6+ j*6 +2] = 0; l[i*SIDES*6+ j*6 +3] = i * SIDES + j; l[i*SIDES*6+ j*6 +4] = ((i + 1) % RINGS) * SIDES + j; l[i*SIDES*6+ j*6 +5] = 0; n[j*12 +0] = R * r * cos(ja) * cos(ia) + r * r * cos(ja) * cos(ia) * cos(ia); n[j*12 +1] = R * r * sin(ja) * cos(ia) + r * r * sin(ja) * cos(ia) * cos(ia); n[j*12 +2] = R * r * sin(ia) + r * r * sin(ia) * cos(ia); n[j*12 +3] = R * r * cos(jap) * cos(ia) + r * r * cos(jap) * cos(ia) * cos(ia); n[j*12 +4] = R * r * sin(jap) * cos(ia) + r * r * sin(jap) * cos(ia) * cos(ia); n[j*12 +5] = R * r * sin(ia) + r * r * sin(ia) * cos(ia); n[j*12 +6] = R * r * cos(ja) * cos(ia) + r * r * cos(ja) * cos(ia) * cos(ia); n[j*12 +7] = R * r * sin(ja) * cos(ia) + r * r * sin(ja) * cos(ia) * cos(ia); n[j*12 +8] = R * r * sin(ia) + r * r * sin(ia) * cos(ia); n[j*12 +9] = R * r * cos(ja) * cos(iap) + r * r * cos(ja) * cos(iap) * cos(iap); n[j*12 +10] = R * r * sin(ja) * cos(iap) + r * r * sin(ja) * cos(iap) * cos(iap); n[j*12 +11] = R * r * sin(iap) + r * r * sin(iap) * cos(iap); } s3d_push_vertices(o, &v[i*SIDES*3], SIDES); s3d_push_lines(o, &l[i*SIDES*6], SIDES*2); s3d_pep_line_normals(o, n, SIDES*2); } /* s3d_push_vertices(o,v,SIDES*RINGS); s3d_push_lines(o, l,SIDES*RINGS*2);*/ s3d_flags_on(o, S3D_OF_VISIBLE); return o; } static void set_focus(struct app *a) { if (focus != a) /* resetting old focus */ if (focus != NULL) { printf("unfocusing app name %s\n", focus->name); s3d_scale(focus->oid, 1 / focus->r); s3d_scale(focus->sphere, focus->r); s3d_flags_on(focus->sphere, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(focus->min_but, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_translate(focus->title, -focus->textw - 1.2, 0.0, 0); s3d_translate(focus->close_but, bsize*focus->textw / 2, 1.2, 0); s3d_link(focus->close_but, focus->sphere); s3d_link(focus->oid, 0); } focus = a; if (a == NULL) { focus_r = n_app; s3d_mcp_focus(-1); s3d_flags_off(rotate, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(reset, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); rot_flag = 0; } else { /* set the new focus app up */ s3d_translate(a->title, -a->textw - 9.6, 0.0, 0); s3d_translate(reset, -7.2, 0.0, 0); s3d_translate(rotate, -4.8, 0.0, 0); s3d_translate(a->min_but, -2.4, 0.0, 0); s3d_link(a->close_but, 0); s3d_link(rotate, a->close_but); s3d_link(reset, a->close_but); s3d_flags_on(a->min_but, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(rotate, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(reset, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(a->sphere, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_unlink(a->oid); s3d_rotate(a->oid, 0, 0, 0); s3d_translate(a->oid, 0, 0, 0); focus_r = a->r; s3d_scale(a->oid, 1); s3d_mcp_focus(a->oid); } place_apps(); } static int add_app(struct app *a) { struct app *prev = NULL, *a2 = apps; while ((a2) != NULL) { prev = a2; if (a2->oid == a->oid) { /* already added, so free() and return */ free(a); return 1; } a2 = a2->next; /* go to the end */ } a->next = NULL; if (prev == NULL) apps = a; else prev->next = a; n_app += 1; return 0; } static struct app* find_app(int oid) { struct app *a = apps; while (a != NULL) { if (oid == a->oid) break; a = a->next; } return a; } static void* del_app(int oid) { struct app *prev = NULL, *a = apps; while ((a != NULL) && (a->oid != oid)) { prev = a; a = a->next; } if (a != NULL) { /* found ... */ if (a->init) { s3d_del_object(a->close_but); s3d_del_object(a->min_but); s3d_del_object(a->title); s3d_del_object(a->sphere); s3d_del_object(a->oid); } if (prev == NULL) apps = a->next; /* new head */ else prev->next = a->next; n_app--; if (focus == a) { set_focus(NULL); focus = NULL; } free(a); a = NULL; place_apps(); } return a; } static int stop(struct s3d_evt* DOTMCPUNUSED(evt)) { s3d_quit(); return 0; } static void place_apps(void) { struct app *a = apps; int j = 0; while (a != NULL) { if (a->init) { /* printf("placing app [%d,'%s'], oid %d, r=%f\n",j,a->name,a->oid,a->r); */ if (focus == a) { s3d_translate(a->close_but, (-left)*zoom - 0.4, (-bottom)*zoom - 0.4, -zoom); } else { s3d_translate(a->oid, zoom*(left) + j*2 + 1.0, zoom*bottom + 1.0, -zoom); s3d_rotate(a->oid, 0, 10, 0); j++; } } a = a->next; } s3d_translate(menu, left*zoom + 0.4, (-bottom)*zoom - 0.4, -zoom); s3d_rotate(menu, 0 , 30, 0); } static int mcp_object(struct s3d_evt *hrmz) { struct mcp_object *mo; struct app *a; mo = (struct mcp_object *)hrmz->buf; if (NULL == (a = find_app(mo->object))) { printf("adding new object ......"); a = (struct app*)malloc(sizeof(struct app)); a->oid = mo->object; a->r = mo->r; strncpy(a->name, mo->name, sizeof(a->name)); a->name[sizeof(a->name) - 1] = '\0'; a->init = 0; printf("..%s\n", a->name); add_app(a); place_apps(); } else { /* printf("updating app %d\n",a->oid);*/ a->trans_x = mo->trans_x; a->trans_y = mo->trans_y; a->trans_z = mo->trans_z; a->r = mo->r; if (a->init) { if (a == focus) { focus_r = a->r; } else { s3d_scale(a->sphere, a->r); s3d_scale(a->oid, 1 / a->r); } } place_apps(); } return 0; } static void app_init(struct app *a) { printf("building some window decorations on %d ['%s']\n", a->oid, a->name); printf("radius of object %d is %f\n", a->oid, a->r); s3d_scale(a->oid, 1 / a->r); a->sphere = s3d_clone(sphere); s3d_scale(a->sphere, a->r); s3d_link(a->sphere, a->oid); s3d_flags_on(a->sphere, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); a->title = s3d_draw_string(a->name, &a->textw); a->close_but = s3d_clone(close_but); s3d_translate(a->close_but, bsize*a->textw / 2.0, 1.2f, 0.0f); s3d_link(a->close_but, a->sphere); s3d_flags_on(a->close_but, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_translate(a->title, -a->textw - 1.2f, 0.0f, 0.0f); s3d_link(a->title, a->close_but); s3d_flags_on(a->title, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); a->min_but = s3d_clone(min_but); s3d_link(a->min_but, a->close_but); s3d_scale(a->close_but, bsize); s3d_link(a->oid, 0); a->init = 1; /* if (focus==NULL) set_focus(a); else*/ place_apps(); } static int mcp_del_object(struct s3d_evt *hrmz) { struct mcp_object *mo; mo = (struct mcp_object *)hrmz->buf; del_app(mo->object); return 0; } static int object_click(struct s3d_evt *hrmz) { struct app *a; unsigned int i; int oid; oid = *((int *)hrmz->buf); a = apps; i = 0; if (oid == rotate) { rot_flag = !rot_flag; return 0; } if (oid == reset) { s3d_translate(0, 0.0, 0.0, 5.0); s3d_rotate(0, 0, 0, 0); } while (a != NULL) { if (oid == a->close_but) { del_app(a->oid); return 0; } else if (oid == a->min_but) { if (a == focus) { set_focus(NULL); /* nothing is focused now */ } return 0; } else if (((oid == a->title) || (oid == a->sphere)) || (oid == a->oid)) { printf("giving focus to [%s], %d\n", a->name, oid); set_focus(a); return 0; } i++; a = a->next; } menu_click(oid); return 0; } static int object_info(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; if (inf->object == 0) { campos.x = inf->trans_x; campos.y = inf->trans_y; campos.z = inf->trans_z; camrot.x = inf->rot_x; camrot.y = inf->rot_y; camrot.z = inf->rot_z; if (asp != inf->scale) { asp = inf->scale; printf("screen aspect: %f\n", asp); if (asp > 1.0) { /* wide screen */ bottom = -1.0; left = -asp; } else { /* high screen */ bottom = (-1.0 / asp); left = -1.0; } place_apps(); /* replace apps */ } } return 0; } static void mainloop(void) { struct app *a; float al, r; int i; a = apps; i = 0; while (a != NULL) { if (!a->init) app_init(a); i++; a = a->next; } if (rot_flag) { al = (alpha * M_PI / 180); r = (focus_r > 20.0) ? 20.0 : focus_r; s3d_translate(0, sin(al)*(r + 5), 0, cos(al)*(r + 5)); s3d_rotate(0, 0, alpha, 0); alpha = alpha + 0.1; if (alpha > 360.0) alpha = 0.0; } if (ego_mode) { if ((ydif != 0) || (xdif != 0)) { campos.x += ydif * sin((camrot.y * M_PI) / 180); campos.z += ydif * cos((camrot.y * M_PI) / 180); campos.x += xdif * cos((-camrot.y * M_PI) / 180); campos.z += xdif * sin((-camrot.y * M_PI) / 180); campos.y += ydif * sin((-camrot.x * M_PI) / 180); s3d_translate(0, campos.x, campos.y, campos.z); } } nanosleep(&t, NULL); } static int keydown(struct s3d_evt *event) { struct s3d_key_event *keys = (struct s3d_key_event *)event->buf; switch (keys->keysym) { case S3DK_F2: ego_mode = (ego_mode + 1) % 2; xdif = 0; ydif = 0; printf("ego mode %d\n", ego_mode); break; case 'w': ydif += -1.0; break; case 'a': xdif += -1.0; break; case 's': ydif += 1.0; break; case 'd': xdif += 1.0; break; } return 0; } static int keyup(struct s3d_evt *event) { struct s3d_key_event *keys = (struct s3d_key_event *)event->buf; switch (keys->keysym) { case 'w': ydif -= -1.0; break; case 'a': xdif -= -1.0; break; case 's': ydif -= 1.0; break; case 'd': xdif -= 1.0; break; } return 0; } int main(int argc, char **argv) { s3d_set_callback(S3D_EVENT_OBJ_INFO, object_info); s3d_set_callback(S3D_MCP_OBJECT, mcp_object); s3d_set_callback(S3D_EVENT_QUIT, stop); s3d_set_callback(S3D_MCP_DEL_OBJECT, mcp_del_object); s3d_set_callback(S3D_EVENT_OBJ_CLICK, object_click); s3d_set_callback(S3D_EVENT_KEYDOWN, keydown); s3d_set_callback(S3D_EVENT_KEYUP, keyup); if (!s3d_init(&argc, &argv, "mcp")) { if (!((argc > 1) && (0 == strcmp(argv[1], "--notorus")))) greentorus(); /* just call ... */ if (s3d_select_font("vera")) { printf("font not found\n"); } min_but = s3d_import_model_file("objs/btn_minimize.3ds"); rotate = s3d_import_model_file("objs/btn_rotate.3ds"); reset = s3d_import_model_file("objs/reset.3ds"); close_but = s3d_import_model_file("objs/btn_close.3ds"); sphere = s3d_import_model_file("objs/ringsystem.3ds"); menu = menu_init(); s3d_link(menu, 0); s3d_scale(menu, bsize); place_apps(); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/apps/dot_mcp/menu.c000066400000000000000000000057021361325167000160530ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "dot_mcp.h" #include /* fork(), execl() */ #include /* printf() */ #include /* exit() */ #include /* strlen(),strncpy(), strncat() */ struct menu_entry { const char *icon, *name, *path; int icon_oid, str_oid; }; static int go = -1; static int act; static struct menu_entry menu_items[] = { {"objs/comp.3ds", "terminal", "s3dvt", 0, 0}, {"objs/comp.3ds", "meshs3d", "meshs3d", 0, 0}, {"objs/comp.3ds", "s3d_x11gate", "s3d_x11gate", 0, 0}, {"objs/comp.3ds", "s3dfm", "s3dfm", 0, 0}, {"objs/comp.3ds", "logout", "LOGOUT", 0, 0}, }; void menu_click(int oid) { unsigned int i; char exec[256]; printf("%d got clicked\n", oid); if (oid == go) { act = !act; for (i = 0; i < (sizeof(menu_items) / sizeof(struct menu_entry)); i++) { if (act) { s3d_flags_on(menu_items[i].icon_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(menu_items[i].str_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } else { s3d_flags_off(menu_items[i].icon_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(menu_items[i].str_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } } return; } if (act) { for (i = 0; i < (sizeof(menu_items) / sizeof(struct menu_entry)); i++) { if ((oid == menu_items[i].icon_oid) || (oid == menu_items[i].str_oid)) { size_t len; if (0 == strncmp(menu_items[i].path, "LOGOUT", 6)) { s3d_quit(); return; } strncpy(exec, menu_items[i].path, sizeof(exec)); exec[sizeof(exec) - 1]= '\0'; len = strlen(exec); if (len < sizeof(exec)) { strncat(exec, "> /dev/null 2>&1 &", sizeof(exec) - 1 - len); /* ignoring output, starting in background */ printf("executing [%s]\n", exec); system(exec); } else { fprintf(stderr, "path too long to execute\n"); } return; } } } } int menu_init(void) { unsigned int i; int menu_o; menu_o = s3d_new_object(); act = 0; /* menu deactived */ go = s3d_import_model_file("objs/s3dstart.3ds"); s3d_flags_on(go, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_link(go, menu_o); for (i = 0; i < (sizeof(menu_items) / sizeof(struct menu_entry)); i++) { if (-1 == (menu_items[i].icon_oid = s3d_import_model_file(menu_items[i].icon))) menu_items[i].icon_oid = s3d_new_object(); menu_items[i].str_oid = s3d_draw_string(menu_items[i].name, NULL); s3d_link(menu_items[i].str_oid, menu_items[i].icon_oid); s3d_link(menu_items[i].icon_oid, menu_o); s3d_translate(menu_items[i].icon_oid, 0, -3 + (-3 * (signed)i), 0); s3d_translate(menu_items[i].str_oid, 2, 0, 0); /* s3d_flags_on(menu_items[i].icon_oid,S3D_OF_VISIBLE|S3D_OF_SELECTABLE); s3d_flags_on(menu_items[i].str_oid,S3D_OF_VISIBLE|S3D_OF_SELECTABLE);*/ printf("menu item menu[%d], icon_oid=%d, icon_str=%d\n", i, menu_items[i].icon_oid, menu_items[i].str_oid); } return menu_o; } s3d-0.2.2.1/apps/kism3d/000077500000000000000000000000001361325167000145045ustar00rootroot00000000000000s3d-0.2.2.1/apps/kism3d/CMakeLists.txt000066400000000000000000000011211361325167000172370ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(kism3d C) if (PTHREADS_FOUND) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(kism3d client.c gui.c kism3d.c network.c) target_link_libraries(kism3d s3d s3dw ${PTHREADS_LIBRARIES} ${MATH_LIBRARIES}) # install install(TARGETS kism3d RUNTIME DESTINATION "${BIN_INSTALL_DIR}") else (PTHREADS_FOUND) PkgStatus_Later("pthreads") # print late status Collected_PkgStatus("kism3d") endif (PTHREADS_FOUND) s3d-0.2.2.1/apps/kism3d/client.c000066400000000000000000000025271361325167000161340ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include "kism3d.h" #include /* strncmp(), strncpy() */ #include /* rand() */ struct wlan_client *get_wlan_client(char *mac) { struct list_head *client_pos; struct wlan_client *wlan_client; list_for_each(client_pos, &Client_list) { wlan_client = list_entry(client_pos, struct wlan_client, list); if (strncmp(wlan_client->mac, mac, 18) == 0) return wlan_client; } /* we reached the end of the list and must create a new wlan_network */ wlan_client = (struct wlan_client*)alloc_memory(sizeof(struct wlan_client)); INIT_LIST_HEAD(&wlan_client->list); strncpy(wlan_client->mac, mac, sizeof(wlan_client->mac)); wlan_client->mac[sizeof(wlan_client->mac) - 1] = '\0'; wlan_client->wlan_network = NULL; wlan_client->props_changed = 1; wlan_client->visible = 1; wlan_client->pos_vec[0] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; wlan_client->pos_vec[1] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; wlan_client->pos_vec[2] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; wlan_client->mov_vec[0] = wlan_client->mov_vec[1] = wlan_client->mov_vec[2] = 0.0; wlan_client->obj_id = -1; wlan_client->ip_id = -1; list_add_tail(&wlan_client->list, &Client_list); return wlan_client; } s3d-0.2.2.1/apps/kism3d/gui.c000066400000000000000000000265351361325167000154470ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include "kism3d.h" #include #include #include /* M_PI, cos(), sin() */ #include /* malloc(), free() */ #include /* printf() */ #include /* nanosleep() */ #include static float CamPosition[2][3]; /* CamPosition[trans|rot][x-z] */ static int Last_Click_Oid = 0; static unsigned int Last_Click_Time = 0; static void *Cam_target = NULL; static int Client_obj; static struct timespec sleeptime = { 0, 100 * 1000 * 1000 }; /* 100 mili seconds */ static int wire_sphere(int slices, int stacks) { int x, y, i, o; int num_v, num_l; float *v, *n; /* vertices, normals */ float alpha, beta; unsigned int *l; /* lines */ num_v = (stacks + 1) * slices; num_l = stacks * slices + (stacks - 1) * slices; /* vertical + horizontal */ v = (float*)malloc(sizeof(float) * 3 * num_v); n = (float*)malloc(sizeof(float) * 6 * num_l); l = (unsigned int*)malloc(sizeof(unsigned int) * 3 * num_l); i = 0; for (x = 0; x < slices; x++) { alpha = (x * 360.0 / slices) * M_PI / 180.0; for (y = 0; y < (stacks + 1); y++) { beta = ((y * 180 / slices) - 90.0) * M_PI / 180.0; v[i*3+0] = cos(alpha) * cos(beta); v[i*3+1] = sin(beta); v[i*3+2] = sin(alpha) * cos(beta); i++; } } i = 0; for (x = 0; x < slices; x++) { for (y = 0; y < stacks; y++) { if ((y != 0) && (y != stacks)) { /* no horizontal lines at the poles */ l[i*3+0] = (x * (stacks + 1)) + y; l[i*3+1] = (((x + 1) % slices) * (stacks + 1)) + y; l[i*3+2] = 0; n[i*6+0] = v[ l[i*3+0] * 3 + 0]; n[i*6+1] = v[ l[i*3+0] * 3 + 1]; n[i*6+2] = v[ l[i*3+0] * 3 + 2]; n[i*6+3] = v[ l[i*3+1] * 3 + 0]; n[i*6+4] = v[ l[i*3+1] * 3 + 1]; n[i*6+5] = v[ l[i*3+1] * 3 + 2]; i++; } /* vertical lines */ l[i*3+0] = (x * (stacks + 1)) + y; l[i*3+1] = (x * (stacks + 1)) + y + 1; l[i*3+2] = 0; n[i*6+0] = v[ l[i*3+0] * 3 + 0]; n[i*6+1] = v[ l[i*3+0] * 3 + 1]; n[i*6+2] = v[ l[i*3+0] * 3 + 2]; n[i*6+3] = v[ l[i*3+1] * 3 + 0]; n[i*6+4] = v[ l[i*3+1] * 3 + 1]; n[i*6+5] = v[ l[i*3+1] * 3 + 2]; i++; } } o = s3d_new_object(); s3d_push_material(o, 0, 0, 1, 1, 0, 0, 0, 1, 0); s3d_push_vertices(o, v, num_v); s3d_push_lines(o, l, num_l); s3d_load_line_normals(o, n, 0, num_l); free(v); free(n); free(l); return o; } static int handle_networks(void) { struct list_head *network_pos; struct wlan_network *wlan_network; float real_node_pos_x, real_node_pos_z, angle, angle_rad; int network_index = 0; char label_str[101]; /* safe to do as long as we use strn* functions */ float maxlen, templen; pthread_mutex_lock(&Network_list_mutex); list_for_each(network_pos, &Network_list) { wlan_network = list_entry(network_pos, struct wlan_network, list); if (wlan_network->visible) { network_index++; if (wlan_network->obj_id == -1) { wlan_network->obj_id = s3d_new_object(); wlan_network->wrsphr_id = wire_sphere(30, 30); s3d_link(wlan_network->wrsphr_id, wlan_network->obj_id); s3d_flags_on(wlan_network->wrsphr_id, S3D_OF_VISIBLE); } wlan_network->scale_fac = wlan_network->num_wlan_clients + 2; s3d_translate(wlan_network->wrsphr_id, 0, /*-6 + wlan_network->scale_fac*/ 0, 0); s3d_scale(wlan_network->obj_id, wlan_network->scale_fac); real_node_pos_x = sin(2.0 * M_PI * network_index / ((float) Num_networks)) * (((1 * Num_networks) / 2 * M_PI)); real_node_pos_z = cos(2.0 * M_PI * network_index / ((float) Num_networks)) * (((1 * Num_networks) / 2 * M_PI)); if ((fabs(wlan_network->pos_vec[0] - real_node_pos_x) > 0.5) || (fabs(wlan_network->pos_vec[2] - real_node_pos_z) > 0.5)) { if (fabs(wlan_network->pos_vec[0] - real_node_pos_x) > 0.5) wlan_network->pos_vec[0] = ((wlan_network->pos_vec[0] * 9 + real_node_pos_x) / 10); if (fabs(wlan_network->pos_vec[2] - real_node_pos_z) > 0.5) wlan_network->pos_vec[2] = ((wlan_network->pos_vec[2] * 9 + real_node_pos_z) / 10); s3d_translate(wlan_network->obj_id, wlan_network->pos_vec[0], wlan_network->pos_vec[1], wlan_network->pos_vec[2]); } if (wlan_network->props_changed) { snprintf(label_str, 100, "Type: %s, CH: %i, Clients: %i", (wlan_network->type == 0 ? "Managed" : (wlan_network->type == 1 ? "Ad-Hoc" : (wlan_network->type == 2 ? "Prober" : "unknown"))), wlan_network->chan, wlan_network->num_wlan_clients); /* determine our longest string which we draw */ maxlen = s3d_strlen(label_str); if ((templen = s3d_strlen(wlan_network->ssid)) > maxlen) maxlen = templen; if ((templen = s3d_strlen(wlan_network->bssid)) > maxlen) maxlen = templen; wlan_network->props_changed = 0; if (wlan_network->ssid_id != -1) s3d_del_object(wlan_network->ssid_id); if (wlan_network->misc_id != -1) s3d_del_object(wlan_network->misc_id); if (wlan_network->bssid_id == -1) { wlan_network->bssid_id = s3d_draw_string(wlan_network->bssid, NULL); wlan_network->text_width = maxlen; /* the other strings might be longer, so we use the longest string for calculating our rotation. */ s3d_link(wlan_network->bssid_id, wlan_network->obj_id); s3d_translate(wlan_network->bssid_id, - maxlen / 2, 2 + wlan_network->scale_fac, 0); s3d_scale(wlan_network->bssid_id, NETWORK_TEXT_SCALE); s3d_flags_on(wlan_network->bssid_id, S3D_OF_VISIBLE); wlan_network->click_id = s3d_new_object(); s3d_link(wlan_network->click_id, wlan_network->bssid_id); s3d_push_material(wlan_network->click_id, 0, 0, 0, 0, 0, 0, 0, 0, 0); s3d_push_vertex(wlan_network->click_id, 0, 1, 0.1); s3d_push_vertex(wlan_network->click_id, maxlen, 1, 0.1); s3d_push_vertex(wlan_network->click_id, maxlen, -2.5, 0.1); /* 3 lines of text + some mor space for low characters, like g,q,p ... */ s3d_push_vertex(wlan_network->click_id, 0, -2.5, 0.1); s3d_push_polygon(wlan_network->click_id, 0, 1, 2, 0); s3d_push_polygon(wlan_network->click_id, 0, 2, 3, 0); s3d_flags_on(wlan_network->click_id, S3D_OF_SELECTABLE); } wlan_network->ssid_id = s3d_draw_string(wlan_network->ssid, NULL); s3d_link(wlan_network->ssid_id, wlan_network->bssid_id); s3d_translate(wlan_network->ssid_id, 0, -1, 0); s3d_flags_on(wlan_network->ssid_id, S3D_OF_VISIBLE); wlan_network->misc_id = s3d_draw_string(label_str, NULL); s3d_link(wlan_network->misc_id, wlan_network->ssid_id); s3d_translate(wlan_network->misc_id, 0, -1, 0); s3d_flags_on(wlan_network->misc_id, S3D_OF_VISIBLE); } angle = s3d_angle_to_cam(wlan_network->pos_vec, CamPosition[0], &angle_rad); s3d_rotate(wlan_network->bssid_id, 0, angle , 0); s3d_translate(wlan_network->bssid_id, -cos(angle_rad) * NETWORK_TEXT_SCALE * wlan_network->text_width / 2 , 2 , sin(angle_rad) * NETWORK_TEXT_SCALE * wlan_network->text_width / 2); wlan_network->rotation = (wlan_network->rotation + 1) % 360; s3d_rotate(wlan_network->wrsphr_id, 0, wlan_network->rotation, 0); } } pthread_mutex_unlock(&Network_list_mutex); return 0; } static int handle_clients(void) { struct list_head *client_pos; struct wlan_client *wlan_client; float angle, angle_rad; pthread_mutex_lock(&Client_list_mutex); list_for_each(client_pos, &Client_list) { wlan_client = list_entry(client_pos, struct wlan_client, list); if (wlan_client->visible) { if (wlan_client->obj_id == -1) { wlan_client->obj_id = s3d_new_object(); wlan_client->symbol_id = s3d_clone(Client_obj); s3d_link(wlan_client->symbol_id, wlan_client->obj_id); s3d_flags_on(wlan_client->symbol_id, S3D_OF_VISIBLE); } if (wlan_client->props_changed) { wlan_client->props_changed = 0; if (wlan_client->ip_id != -1) s3d_del_object(wlan_client->ip_id); wlan_client->ip_id = s3d_draw_string(wlan_client->ip, &wlan_client->ip_len); s3d_link(wlan_client->ip_id, wlan_client->obj_id); s3d_translate(wlan_client->ip_id, - wlan_client->ip_len / 2, 2, 0); s3d_scale(wlan_client->ip_id, CLIENT_TEXT_SCALE); s3d_flags_on(wlan_client->ip_id, S3D_OF_VISIBLE); } angle = s3d_angle_to_cam(wlan_client->pos_vec, CamPosition[0], &angle_rad); s3d_rotate(wlan_client->ip_id, 0, angle , 0); s3d_translate(wlan_client->ip_id, -cos(angle_rad) * CLIENT_TEXT_SCALE * wlan_client->ip_len / 2 , 2 , sin(angle_rad) * CLIENT_TEXT_SCALE * wlan_client->ip_len / 2); } } pthread_mutex_unlock(&Client_list_mutex); return 0; } /*** * * eventhandler when object clicked * ***/ static int object_click(struct s3d_evt *evt) { struct list_head *network_pos; struct wlan_network *wlan_network; int clicked_id = (int) * ((uint32_t *)evt->buf); s3dw_handle_click(evt); /* emulate double click */ if ((Last_Click_Oid == clicked_id) && (Last_Click_Time + 250 > get_time())) { list_for_each(network_pos, &Network_list) { wlan_network = list_entry(network_pos, struct wlan_network, list); if (wlan_network->click_id == clicked_id) { Cam_target = wlan_network; break; } } } Last_Click_Oid = clicked_id; Last_Click_Time = get_time(); return 0; } /*** * * eventhandler when object change by user * such as Cam * ***/ static int object_info(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; s3dw_object_info(hrmz); if (inf->object == 0) { CamPosition[0][0] = inf->trans_x; CamPosition[0][1] = inf->trans_y; CamPosition[0][2] = inf->trans_z; CamPosition[1][0] = inf->rot_x; CamPosition[1][1] = inf->rot_y; CamPosition[1][2] = inf->rot_z; } return 0; } static void mainloop(void) { float angle, diff_vec[3], tmp_vec[3] = { 0.0, 0.0, -1.0 }; handle_networks(); handle_clients(); if (Cam_target != NULL) { /* move to target */ /* printf( "Moving to Network: %s, %s\n", ((struct wlan_network *)Cam_target)->bssid, ((struct wlan_network *)Cam_target)->ssid ); */ CamPosition[0][0] = (CamPosition[0][0] * 4 + ((struct wlan_network *)Cam_target)->pos_vec[0] + 10) / 5; CamPosition[0][1] = (CamPosition[0][1] * 4 + ((struct wlan_network *)Cam_target)->pos_vec[1]) / 5; CamPosition[0][2] = (CamPosition[0][2] * 4 + ((struct wlan_network *)Cam_target)->pos_vec[2]) / 5; diff_vec[0] = CamPosition[0][0] - ((struct wlan_network *)Cam_target)->pos_vec[0]; diff_vec[1] = 0.0; diff_vec[2] = CamPosition[0][2] - ((struct wlan_network *)Cam_target)->pos_vec[2]; angle = s3d_vector_angle(diff_vec, tmp_vec); angle = 180 - (180 / M_PI * angle); CamPosition[1][1] = (CamPosition[1][1] * 4 + angle) / 5; s3d_translate(0, CamPosition[0][0], CamPosition[0][1], CamPosition[0][2]); s3d_rotate(0, CamPosition[1][0], CamPosition[1][1], CamPosition[1][2]); if ((fabs(diff_vec[0]) < 11.0) && (fabs(CamPosition[0][1] - ((struct wlan_network *)Cam_target)->pos_vec[1]) < 1.0) && (fabs(diff_vec[2]) < 1.0)) Cam_target = NULL; } if (Kism3d_aborted) s3d_quit(); nanosleep(&sleeptime, NULL); } void* gui_main(void *KISM3DUNUSED(unused)) { if (!s3d_init(NULL, NULL, "kism3d")) { if (s3d_select_font("vera")) { printf("font 'vera' not found\n"); } else { s3d_set_callback(S3D_EVENT_OBJ_INFO, object_info); s3d_set_callback(S3D_EVENT_OBJ_CLICK, object_click); Client_obj = s3d_import_model_file("objs/accesspoint.3ds"); s3d_mainloop(mainloop); } s3d_quit(); } Kism3d_aborted = 1; return NULL; } s3d-0.2.2.1/apps/kism3d/kism3d.c000066400000000000000000000306401361325167000160450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include "kism3d.h" #include /* malloc() */ #include /* printf() */ #include /* memset(), strncmp(), strncpy() */ #include /* errno */ #include /* write() */ #include #include /* gettimeofday() */ #include /* inet_pton(), inet_aton() */ #include #include static DEFINE_LIST_HEAD(kismet_src_list); DEFINE_LIST_HEAD(Network_list); DEFINE_LIST_HEAD(Client_list); static pthread_t s3d_thread_id; pthread_mutex_t Network_list_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Client_list_mutex = PTHREAD_MUTEX_INITIALIZER; static int thread_running = 0; int Kism3d_aborted = 0; int Num_networks = 0; void *alloc_memory(int len) { void *res = malloc(len); if (res == NULL) { printf("Error - can't allocate memory: %s\n", strerror(errno)); exit(1); } memset(res, 0, len); return res; } unsigned int get_time(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } static void parse_buffer(struct kismet_src *kismet_src) { struct wlan_network *wlan_network; struct wlan_client *wlan_client; char enable_network[] = "!0 ENABLE NETWORK bssid,type,channel,ssid\n", enable_client[] = "!0 ENABLE CLIENT bssid,mac,ip\n", enable_alert[] = "!0 ENABLE ALERT *\n"; char *read_ptr, *line_ptr, *last_cr_ptr = NULL, *parse_begin_ptr, *parse_end_ptr; char *bssid, *channel, *type, *ssid, *mac, *ip; int count; size_t ssid_len; read_ptr = kismet_src->recv_buff; line_ptr = kismet_src->recv_buff; while ((*read_ptr) != '\0') { if ((*read_ptr) == '\n') { last_cr_ptr = read_ptr; *last_cr_ptr = '\0'; bssid = channel = type = ssid = mac = ip = NULL; /* printf( "line: %s\n", line_ptr ); */ if (strncmp(line_ptr, "*TIME: ", strlen("*TIME: ")) == 0) { if (kismet_src->enable_level < 4) { switch (kismet_src->enable_level) { case 0: if (write(kismet_src->sock, enable_alert, sizeof(enable_alert)) < 0) { printf("Warning - can't send ENABLE ALERT message to kismet server (%s:%i): %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); } break; case 1: if (write(kismet_src->sock, enable_client, sizeof(enable_client)) < 0) { printf("Warning - can't send ENABLE CLIENT message to kismet server (%s:%i): %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); } break; case 2: if (write(kismet_src->sock, enable_network, sizeof(enable_network)) < 0) { printf("Warning - can't send ENABLE NETWORK message to kismet server (%s:%i): %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); } break; case 3: if (!thread_running) { thread_running++; pthread_create(&s3d_thread_id, NULL, &gui_main, NULL); } break; } kismet_src->enable_level++; } } else if (strncmp(line_ptr, "*NETWORK: ", strlen("*NETWORK: ")) == 0) { /* printf( "line: %s\n", line_ptr ); */ parse_begin_ptr = parse_end_ptr = line_ptr + strlen("*NETWORK: "); count = 0; while ((*parse_end_ptr) != '\0') { if ((*parse_end_ptr) == ' ') { switch (count) { case 0: bssid = parse_begin_ptr; break; case 1: type = parse_begin_ptr; break; case 2: channel = parse_begin_ptr; break; case 3: /* ssids with spaces are quoted by kismet */ if (parse_begin_ptr[0] == '\001') { parse_begin_ptr++; parse_end_ptr = strchr(parse_begin_ptr, '\001'); *parse_end_ptr = '\0'; count++; } ssid = parse_begin_ptr; break; } if (count == 4) break; *parse_end_ptr = '\0'; parse_begin_ptr = parse_end_ptr + 1; count++; } parse_end_ptr++; } pthread_mutex_lock(&Network_list_mutex); wlan_network = get_wlan_network(bssid); if ((wlan_network->type != -1) && (wlan_network->chan != -1) && (wlan_network->ssid != NULL)) { /* network properties have changed - alert user */ } if (channel != NULL) wlan_network->chan = atoi(channel); else wlan_network->chan = 0; if (type != NULL) wlan_network->type = atoi(type); else wlan_network->type = 0; if (wlan_network->ssid != NULL) free(wlan_network->ssid); ssid_len = strlen(ssid) + 1; wlan_network->ssid = (char*)alloc_memory(ssid_len); strncpy(wlan_network->ssid, ssid, ssid_len); wlan_network->ssid[ssid_len - 1] = '\0'; pthread_mutex_unlock(&Network_list_mutex); /* printf( "network found - bssid %s, type %s, channel %s, ssid '%s' <> '%s'\n", bssid, type, channel, ssid, wlan_network->ssid ); */ } else if (strncmp(line_ptr, "*CLIENT: ", strlen("*CLIENT: ")) == 0) { parse_begin_ptr = parse_end_ptr = line_ptr + strlen("*CLIENT: "); count = 0; while ((*parse_end_ptr) != '\0') { if ((*parse_end_ptr) == ' ') { switch (count) { case 0: bssid = parse_begin_ptr; break; case 1: mac = parse_begin_ptr; break; case 2: ip = parse_begin_ptr; break; } if (count == 2) break; *parse_end_ptr = '\0'; parse_begin_ptr = parse_end_ptr + 1; count++; } parse_end_ptr++; } wlan_client = get_wlan_client(mac); /*if ( ( wlan_client->type != -1 ) && ( wlan_client->channel != -1 ) && ( wlan_client->ssid != NULL ) ) { client properties have changed - alert user }*/ strncpy(wlan_client->bssid, bssid, sizeof(wlan_client->bssid)); wlan_client->bssid[sizeof(wlan_client->bssid) - 1] = '\0'; strncpy(wlan_client->ip, ip, sizeof(wlan_client->ip)); wlan_client->ip[sizeof(wlan_client->ip) - 1] = '\0'; wlan_network = find_wlan_network(wlan_client->bssid); if (wlan_client->wlan_network != wlan_network) { if (wlan_client->wlan_network != NULL) { wlan_client->wlan_network->num_wlan_clients--; wlan_client->wlan_network->props_changed = 1; } if (wlan_network != NULL) { wlan_network->num_wlan_clients++; wlan_network->props_changed = 1; } wlan_client->wlan_network = wlan_network; } /* printf( "client found - bssid %s, mac %s, ip %s\n", bssid, mac, ip ); */ } else if (strncmp(line_ptr, "*ALERT: ", strlen("*ALERT: ")) == 0) { /* printf( "alert: %s\n", line_ptr + strlen( "*ALERT: " ) ); */ } *last_cr_ptr = '\n'; line_ptr = last_cr_ptr + 1; } read_ptr++; } if (last_cr_ptr != NULL) memmove(kismet_src->recv_buff, last_cr_ptr + 1, strlen(last_cr_ptr)); } int main(int argc, char *argv[]) { struct in_addr tmp_ip_holder; struct kismet_src *kismet_src; struct list_head *kismet_pos, *kismet_pos_tmp; /* struct wlan_network *wlan_network; struct wlan_client *wlan_client; */ struct timeval tv; int num_kismet_sources = 0, found_args = 1, max_sock = -1, res, status; char *colon_ptr, buff[1000]; fd_set wait_sockets, tmp_wait_sockets; FD_ZERO(&wait_sockets); while (argc > found_args) { kismet_src = (struct kismet_src*)alloc_memory(sizeof(struct kismet_src)); INIT_LIST_HEAD(&kismet_src->list); kismet_src->enable_level = 0; /* get ip and port from argument */ if ((colon_ptr = strchr(argv[found_args], ':')) != NULL) { *colon_ptr = '\0'; colon_ptr++; } if (inet_pton(AF_INET, argv[found_args], &tmp_ip_holder) < 1) { printf("Invalid kismet IP specified: %s\n", argv[found_args]); free(kismet_src); found_args++; continue; } else { kismet_src->ip = tmp_ip_holder.s_addr; } if (colon_ptr != NULL) { kismet_src->port = strtol(colon_ptr, NULL , 10); if (kismet_src->port < 1 || kismet_src->port > 65535) { printf("Invalid kismet PORT specified: %s\n", colon_ptr); free(kismet_src); found_args++; continue; } } else { kismet_src->port = 2501; } kismet_src->kismet_addr.sin_family = AF_INET; kismet_src->kismet_addr.sin_port = htons(kismet_src->port); kismet_src->kismet_addr.sin_addr.s_addr = kismet_src->ip; kismet_src->kismet_ip = (char*)alloc_memory(16); inet_ntop(AF_INET, &kismet_src->ip, kismet_src->kismet_ip, 16); /* connect to kismet server */ if ((kismet_src->sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("Error - can't create tcp socket (%s:%i): %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); free(kismet_src->kismet_ip); free(kismet_src); found_args++; continue; } if (connect(kismet_src->sock, (struct sockaddr *)&kismet_src->kismet_addr, sizeof(struct sockaddr)) < 0) { printf("Error - can't connect to kismet server (%s:%i): %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); close(kismet_src->sock); free(kismet_src->kismet_ip); free(kismet_src); found_args++; continue; } kismet_src->recv_buff = (char*)alloc_memory(1500); FD_SET(kismet_src->sock, &wait_sockets); if (kismet_src->sock > max_sock) max_sock = kismet_src->sock; list_add_tail(&kismet_src->list, &kismet_src_list); num_kismet_sources++; found_args++; } if (num_kismet_sources == 0) { printf("Exiting - can't find any valid kismet server\n"); exit(EXIT_FAILURE); } while ((num_kismet_sources > 0) && !(Kism3d_aborted)) { tv.tv_sec = 0; tv.tv_usec = 250; tmp_wait_sockets = wait_sockets; res = select(max_sock + 1, &tmp_wait_sockets, NULL, NULL, &tv); if (res > 0) { max_sock = -1; list_for_each_safe(kismet_pos, kismet_pos_tmp, &kismet_src_list) { kismet_src = list_entry(kismet_pos, struct kismet_src, list); if (FD_ISSET(kismet_src->sock, &tmp_wait_sockets)) { status = read(kismet_src->sock, buff, sizeof(buff)); if (status > 0) { if (kismet_src->sock > max_sock) max_sock = kismet_src->sock; buff[status] = '\0'; /* check for potential buffer overflow */ if ((strlen(kismet_src->recv_buff) + strlen(buff)) < 1500) { strncat(kismet_src->recv_buff, buff, 1000); } else { /* hope that carriage return is now in buffer */ if (strlen(kismet_src->recv_buff) < 1500) { printf("WARNING: receive buffer almost filled without *any* carriage return within that data !\nAppending truncated buffer to receive buffer to prevent buffer overflow.\n"); strncat(kismet_src->recv_buff, buff, 1500 - strlen(kismet_src->recv_buff)); } else { printf("ERROR: receive buffer filled without *any* carriage return within that data !\nClearing receive buffer to prevent buffer overflow.\n"); strncpy(kismet_src->recv_buff, buff, 1000); kismet_src->recv_buff[999] = '\0'; } } parse_buffer(kismet_src); /* printf( "buffer length: %i\n", strlen( kismet_src->recv_buff ) ); */ } else { if (status < 0) { printf("Error - can't read message from %s:%i: %s\n", kismet_src->kismet_ip, kismet_src->port, strerror(errno)); } else { printf("Kismet server %s:%i closed connection ...\n", kismet_src->kismet_ip, kismet_src->port); } FD_CLR(kismet_src->sock, &wait_sockets); close(kismet_src->sock); list_del(kismet_pos); free(kismet_src->kismet_ip); free(kismet_pos); num_kismet_sources--; } } else { if (kismet_src->sock > max_sock) max_sock = kismet_src->sock; } } } else if ((res < 0) && (errno != EINTR)) { printf("Error - can't select: %s\n", strerror(errno)); break; } /* printf( "\nCurrent network list:\n" ); list_for_each_safe(kismet_pos, kismet_pos_tmp, &Network_list) { wlan_network = list_entry(kismet_pos, struct wlan_network, list); printf( " => %s\n", wlan_network->bssid ); } printf( "\nCurrent client list:\n" ); list_for_each_safe(kismet_pos, kismet_pos_tmp, &Client_list) { wlan_client = list_entry(kismet_pos, struct wlan_client, list); printf( " => %s belonging to %s\n", wlan_client->mac, ( wlan_client->wlan_network == NULL ? "unknown" : wlan_client->wlan_network->bssid ) ); } */ } if (Kism3d_aborted) { printf("Closing all sockets ... \n"); list_for_each(kismet_pos, &kismet_src_list) { kismet_src = list_entry(kismet_pos, struct kismet_src, list); close(kismet_src->sock); } } else { Kism3d_aborted = 1; pthread_join(s3d_thread_id, NULL); } return 0; } s3d-0.2.2.1/apps/kism3d/kism3d.h000066400000000000000000000034161361325167000160530ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #ifndef _KISM3D_H_ #define _KISM3D_H_ #include "list.h" #include #include /* sockaddr_in */ #include #ifndef KISM3DUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define KISM3DUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define KISM3DUNUSED(x) /* x */ #else #define KISM3DUNUSED(x) x #endif #endif #define NETWORK_TEXT_SCALE 0.2 #define CLIENT_TEXT_SCALE 0.2 struct kismet_src { struct list_head list; unsigned int ip; int port; int sock; char *kismet_ip; char *recv_buff; struct sockaddr_in kismet_addr; int enable_level; }; struct wlan_network { struct list_head list; char bssid[18]; char *ssid; int type; int chan; int num_wlan_clients; int props_changed; int visible; float pos_vec[3]; int obj_id; int wrsphr_id; int bssid_id; int click_id; int ssid_id; int misc_id; int rotation; int scale_fac; float text_width; }; struct wlan_client { struct list_head list; char bssid[18]; char mac[18]; char ip[16]; struct wlan_network *wlan_network; int props_changed; int visible; float pos_vec[3]; float mov_vec[3]; int obj_id; int symbol_id; int ip_id; float ip_len; }; void *alloc_memory(int len); unsigned int get_time(void); struct wlan_network *get_wlan_network(char *bssid); struct wlan_network *find_wlan_network(char *bssid); struct wlan_client *get_wlan_client(char *mac); void* gui_main(void *unused); extern struct list_head Network_list; extern struct list_head Client_list; extern pthread_mutex_t Network_list_mutex; extern pthread_mutex_t Client_list_mutex; extern int Kism3d_aborted; extern int Num_networks; #endif /* _KISM3D_H_ */ s3d-0.2.2.1/apps/kism3d/list.h000066400000000000000000000052611361325167000156340ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #ifndef _LIST_H_ #define _LIST_H_ #include struct list_head { struct list_head *next, *prev; }; #define DEFINE_LIST_HEAD(name) \ struct list_head name = { &(name), &(name) } #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */ #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); \ pos = pos->next) /** * list_for_each_safe - iterate over a list safe against removal of list entry * @pos: the &struct list_head to use as a loop counter. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */ #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) /** * list_entry - get the struct for this entry * @ptr: the &struct list_head pointer. * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) /** * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_add(struct list_head *n, struct list_head *prev, struct list_head *next) { next->prev = n; n->next = next; n->prev = prev; prev->next = n; } /** * list_add_tail - add a new entry * @n: new entry to be added * @head: list head to add it before * * Insert a new entry before the specified head. * This is useful for implementing queues. */ static inline void list_add_tail(struct list_head *n, struct list_head *head) { __list_add(n, head->prev, head); } /** * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_del(struct list_head *prev, struct list_head *next) { next->prev = prev; prev->next = next; } /** * list_del - deletes entry from list. * @entry: the element to delete from the list. * Note: list_empty on entry does not return true after this, the entry is in an undefined state. */ static inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->next = NULL; entry->prev = NULL; } #endif /* _LIST_H_ */ s3d-0.2.2.1/apps/kism3d/network.c000066400000000000000000000031461361325167000163450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include "kism3d.h" #include /* strncmp(), strncpy() */ #include /* rand() */ struct wlan_network *get_wlan_network(char *bssid) { struct wlan_network *wlan_network; wlan_network = find_wlan_network(bssid); if (wlan_network != NULL) return wlan_network; /* we reached the end of the list and must create a new wlan_network */ wlan_network = (struct wlan_network*)alloc_memory(sizeof(struct wlan_network)); INIT_LIST_HEAD(&wlan_network->list); strncpy(wlan_network->bssid, bssid, sizeof(wlan_network->bssid)); wlan_network->bssid[sizeof(wlan_network->bssid) - 1] = '\0'; wlan_network->type = -1; wlan_network->chan = -1; wlan_network->ssid = NULL; wlan_network->num_wlan_clients = 0; wlan_network->visible = 1; wlan_network->pos_vec[0] = wlan_network->pos_vec[1] = wlan_network->pos_vec[2] = 0; wlan_network->obj_id = -1; wlan_network->bssid_id = -1; wlan_network->ssid_id = -1; wlan_network->misc_id = -1; wlan_network->rotation = 0; wlan_network->scale_fac = 0; wlan_network->props_changed = 1; list_add_tail(&wlan_network->list, &Network_list); Num_networks++; return wlan_network; } struct wlan_network *find_wlan_network(char *bssid) { struct list_head *network_pos; struct wlan_network *wlan_network; list_for_each(network_pos, &Network_list) { wlan_network = list_entry(network_pos, struct wlan_network, list); if (strncmp(wlan_network->bssid, bssid, 18) == 0) return wlan_network; } return NULL; } s3d-0.2.2.1/apps/meshs3d/000077500000000000000000000000001361325167000146605ustar00rootroot00000000000000s3d-0.2.2.1/apps/meshs3d/CMakeLists.txt000066400000000000000000000006141361325167000174210ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(meshs3d C) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(meshs3d hash.c main.c net.c process.c) target_link_libraries(meshs3d s3d s3dw ${MATH_LIBRARIES}) # install install(TARGETS meshs3d RUNTIME DESTINATION "${BIN_INSTALL_DIR}") s3d-0.2.2.1/apps/meshs3d/allocate.c000066400000000000000000000163071361325167000166170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include #include #include #include "allocate.h" #define DEBUG_MALLOC #define MEMORY_USAGE #define MAGIC_NUMBER 0x12345678 #if defined DEBUG_MALLOC static struct chunkHeader *chunkList = NULL; struct chunkHeader { struct chunkHeader *next; uint32_t length; int32_t tag; uint32_t magicNumber; }; struct chunkTrailer { uint32_t magicNumber; }; #if defined MEMORY_USAGE static struct memoryUsage *memoryList = NULL; struct memoryUsage { struct memoryUsage *next; uint32_t length; uint32_t counter; int32_t tag; }; static void addMemory(uint32_t length, int32_t tag) { struct memoryUsage *walker; for (walker = memoryList; walker != NULL; walker = walker->next) { if (walker->tag == tag) { walker->counter++; break; } } if (walker == NULL) { walker = (struct memoryUsage*)malloc(sizeof(struct memoryUsage)); walker->length = length; walker->tag = tag; walker->counter = 1; walker->next = memoryList; memoryList = walker; } } static void removeMemory(int32_t tag, int32_t freetag) { struct memoryUsage *walker; for (walker = memoryList; walker != NULL; walker = walker->next) { if (walker->tag == tag) { if (walker->counter == 0) { fprintf(stderr, "Freeing more memory than was allocated: malloc tag = %d, free tag = %d\n", tag, freetag); exit(1); } walker->counter--; break; } } if (walker == NULL) { fprintf(stderr, "Freeing memory that was never allocated: malloc tag = %d, free tag = %d\n", tag, freetag); exit(1); } } #endif void checkIntegrity(void) { struct chunkHeader *walker; struct chunkTrailer *chunkTrailer; unsigned char *memory; #if defined MEMORY_USAGE struct memoryUsage *memoryWalker; fprintf(stderr, " \nMemory usage information:\n"); for (memoryWalker = memoryList; memoryWalker != NULL; memoryWalker = memoryWalker->next) { if (memoryWalker->counter != 0) fprintf(stderr, " tag: %d, num malloc: %4i, bytes per malloc: %u, total: %6i\n", memoryWalker->tag, memoryWalker->counter, memoryWalker->length, memoryWalker->counter * memoryWalker->length); } #endif for (walker = chunkList; walker != NULL; walker = walker->next) { if (walker->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "checkIntegrity - invalid magic number in header: %08x, malloc tag = %d\n", walker->magicNumber, walker->tag); exit(1); } memory = (unsigned char *)walker; chunkTrailer = (struct chunkTrailer *)(memory + sizeof(struct chunkHeader) + walker->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "checkIntegrity - invalid magic number in trailer: %08x, malloc tag = %d\n", chunkTrailer->magicNumber, walker->tag); exit(1); } } } void checkLeak(void) { struct chunkHeader *walker; for (walker = chunkList; walker != NULL; walker = walker->next) fprintf(stderr, "Memory leak detected, malloc tag = %d\n", walker->tag); } void *debugMalloc(uint32_t length, int32_t tag) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; unsigned char *chunk; /* printf("sizeof(struct chunkHeader) = %u, sizeof (struct chunkTrailer) = %u\n", sizeof (struct chunkHeader), sizeof (struct chunkTrailer)); */ memory = (unsigned char*)malloc(length + sizeof(struct chunkHeader) + sizeof(struct chunkTrailer)); if (memory == NULL) { fprintf(stderr, "Cannot allocate %u bytes, malloc tag = %d\n", (unsigned int)(length + sizeof(struct chunkHeader) + sizeof(struct chunkTrailer)), tag); exit(1); } chunkHeader = (struct chunkHeader *)memory; chunk = memory + sizeof(struct chunkHeader); chunkTrailer = (struct chunkTrailer *)(memory + sizeof(struct chunkHeader) + length); chunkHeader->length = length; chunkHeader->tag = tag; chunkHeader->magicNumber = MAGIC_NUMBER; chunkTrailer->magicNumber = MAGIC_NUMBER; chunkHeader->next = chunkList; chunkList = chunkHeader; #if defined MEMORY_USAGE addMemory(length, tag); #endif return chunk; } void *debugRealloc(void *memoryParameter, uint32_t length, int32_t tag) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; unsigned char *result; uint32_t copyLength; if (memoryParameter) { /* if memoryParameter==NULL, realloc() should work like malloc() !! */ memory = (unsigned char*)memoryParameter; chunkHeader = (struct chunkHeader *)(memory - sizeof(struct chunkHeader)); if (chunkHeader->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "debugRealloc - invalid magic number in header: %08x, malloc tag = %d\n", chunkHeader->magicNumber, chunkHeader->tag); exit(1); } chunkTrailer = (struct chunkTrailer *)(memory + chunkHeader->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "debugRealloc - invalid magic number in trailer: %08x, malloc tag = %d\n", chunkTrailer->magicNumber, chunkHeader->tag); exit(1); } } result = (unsigned char*)debugMalloc(length, tag); if (memoryParameter) { copyLength = length; if (copyLength > chunkHeader->length) copyLength = chunkHeader->length; memcpy(result, memoryParameter, copyLength); debugFree(memoryParameter, 9999); } return result; } void debugFree(void *memoryParameter, int32_t tag) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; struct chunkHeader *walker; struct chunkHeader *previous; memory = (unsigned char*)memoryParameter; chunkHeader = (struct chunkHeader *)(memory - sizeof(struct chunkHeader)); if (chunkHeader->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "debugFree - invalid magic number in header: %08x, malloc tag = %d, free tag = %d\n", chunkHeader->magicNumber, chunkHeader->tag, tag); exit(1); } previous = NULL; for (walker = chunkList; walker != NULL; walker = walker->next) { if (walker == chunkHeader) break; previous = walker; } if (walker == NULL) { fprintf(stderr, "Double free detected, malloc tag = %d, free tag = %d\n", chunkHeader->tag, tag); exit(1); } if (previous == NULL) chunkList = walker->next; else previous->next = walker->next; chunkTrailer = (struct chunkTrailer *)(memory + chunkHeader->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "debugFree - invalid magic number in trailer: %08x, malloc tag = %d, free tag = %d\n", chunkTrailer->magicNumber, chunkHeader->tag, tag); exit(1); } #if defined MEMORY_USAGE removeMemory(chunkHeader->tag, tag); #endif free(chunkHeader); } #else void checkIntegrity(void) { } void checkLeak(void) { } void *debugMalloc(uint32_t length, int32_t tag) { void *result; result = malloc(length); if (result == NULL) { fprintf(stderr, "Cannot allocate %u bytes, malloc tag = %d\n", length, tag); exit(1); } return result; } void *debugRealloc(void *memory, uint32_t length, int32_t tag) { void *result; result = realloc(memory, length); if (result == NULL) { fprintf(stderr, "Cannot re-allocate %u bytes, malloc tag = %d\n", length, tag); exit(1); } return result; } void debugFree(void *memory, int32_t tag) { free(memory); } #endif s3d-0.2.2.1/apps/meshs3d/allocate.h000066400000000000000000000007651361325167000166250ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #ifndef _ALLOCATE_H #define _ALLOCATE_H 1 #include void checkIntegrity(void); void checkLeak(void); void *debugMalloc(uint32_t length, int32_t tag); void *debugRealloc(void *memory, uint32_t length, int32_t tag); void debugFree(void *memoryParameter, int32_t tag); #endif s3d-0.2.2.1/apps/meshs3d/batman-adv.data000066400000000000000000000020371361325167000175270ustar00rootroot00000000000000digraph { "02:00:00:00:00:01" -> "02:00:00:00:00:02" [label="1.7"] "02:00:00:00:00:01" -> "02:00:00:00:00:03" [label="1.0"] "02:00:00:00:00:01" -> "02:00:00:00:00:04" [label="1.0"] "02:00:00:00:00:01" -> "00:ff:1c:68:00:00" [label="HNA"] "02:00:00:00:00:04" -> "02:00:00:00:00:02" [label="1.0"] "02:00:00:00:00:04" -> "02:00:00:00:00:03" [label="1.0"] "02:00:00:00:00:04" -> "02:00:00:00:00:01" [label="1.0"] "02:00:00:00:00:04" -> "00:ff:13:02:00:00" [label="HNA"] "02:00:00:00:00:02" -> "02:00:00:00:00:03" [label="1.0"] "02:00:00:00:00:02" -> "02:00:00:00:00:01" [label="1.15"] "02:00:00:00:00:02" -> "02:00:00:00:00:04" [label="1.0"] "02:00:00:00:00:02" -> "00:ff:50:38:00:00" [label="HNA"] "02:00:00:00:00:03" -> "02:00:00:00:00:02" [label="1.15"] "02:00:00:00:00:03" -> "02:00:00:00:00:01" [label="1.15"] "02:00:00:00:00:03" -> "02:00:00:00:00:04" [label="1.0"] "02:00:00:00:00:03" -> "00:ff:e2:83:00:00" [label="HNA"] } s3d-0.2.2.1/apps/meshs3d/dump.data000066400000000000000000004157141361325167000164740ustar00rootroot00000000000000digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="58.29", style=solid]; "104.131.0.42"[shape=box]; "104.131.131.1" -> "104.131.0.55"[label="7.02", style=solid]; "104.131.131.1" -> "104.131.1.2"[label="38.03", style=solid]; "104.131.1.2"[shape=box]; "104.131.131.1" -> "104.131.0.3"[label="1.67", style=solid]; "104.131.0.3"[shape=box]; "104.131.131.1" -> "104.131.131.3"[label="53.68", style=solid]; "104.131.131.3"[shape=box]; "104.131.131.1" -> "104.131.83.77"[label="24.95", style=solid]; "104.131.83.77"[shape=box]; "104.131.131.1" -> "104.131.0.147"[label="0.00", style=dashed]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.129.0.107" -> "104.129.0.77"[label="1.52"]; "104.129.0.107" -> "104.129.81.1"[label="1.67"]; "104.129.0.107" -> "104.129.1.43"[label="1.42"]; "104.129.0.107" -> "104.129.1.44"[label="1.04"]; "104.65.0.42" -> "104.0.7.254"[label="11.56"]; "104.65.0.42" -> "104.0.0.6"[label="6.54"]; "104.129.0.234" -> "104.129.37.2"[label="2.14"]; "104.129.108.1" -> "104.129.105.2"[label="1.80"]; "104.129.108.1" -> "104.129.105.10"[label="1.18"]; "104.129.108.1" -> "104.129.103.1"[label="1.16"]; "104.129.108.1" -> "104.129.103.19"[label="1.30"]; "104.129.108.1" -> "104.129.0.91"[label="1.17"]; "104.129.108.1" -> "104.129.0.165"[label="4.82"]; "104.66.0.46" -> "104.66.0.8"[label="1.23"]; "104.66.0.46" -> "104.66.0.24"[label="1.46"]; "104.129.0.108" -> "104.129.0.239"[label="1.50"]; "104.129.0.108" -> "104.129.0.95"[label="1.24"]; "104.129.0.108" -> "104.129.0.8"[label="1.50"]; "104.130.1.110" -> "104.130.1.97"[label="36.78"]; "104.130.1.110" -> "104.130.27.176"[label="7.95"]; "104.130.1.110" -> "104.130.3.3"[label="18.30"]; "104.130.1.110" -> "104.130.17.17"[label="2.80"]; "104.130.1.110" -> "104.130.1.157"[label="2.09"]; "104.129.0.239" -> "104.129.0.108"[label="1.53"]; "104.129.0.239" -> "104.129.0.125"[label="0.00"]; "104.129.0.239" -> "104.129.0.95"[label="1.38"]; "104.129.0.239" -> "104.129.37.2"[label="2.55"]; "104.129.0.239" -> "104.129.0.8"[label="1.63"]; "104.129.0.239" -> "104.129.1.10"[label="53.87"]; "104.129.0.239" -> "104.129.1.17"[label="0.00"]; "104.129.0.110" -> "104.129.0.123"[label="0.00"]; "104.129.0.110" -> "104.129.0.219"[label="0.00"]; "104.129.0.110" -> "104.129.0.82"[label="7.90"]; "104.129.0.110" -> "104.129.37.2"[label="27.44"]; "104.129.0.110" -> "104.129.1.17"[label="110.59"]; "104.192.0.32" -> "104.192.192.1"[label="40.14"]; "104.192.0.32" -> "104.192.192.225"[label="2.20"]; "104.192.0.32" -> "104.192.0.39"[label="3.94"]; "104.192.0.32" -> "104.192.192.199"[label="4.01"]; "104.66.0.34" -> "104.66.0.30"[label="7.36"]; "104.66.0.34" -> "104.66.107.4"[label="3.63"]; "104.66.0.34" -> "104.66.0.249"[label="1.15"]; "104.66.0.34" -> "104.66.0.203"[label="1.90"]; "104.66.0.34" -> "104.66.77.4"[label="14.34"]; "104.192.192.225" -> "104.135.0.1"[label="19.03"]; "104.192.192.225" -> "104.192.0.32"[label="8.60"]; "104.192.192.225" -> "104.192.192.99"[label="1.02"]; "104.192.192.225" -> "104.192.0.39"[label="0.00"]; "104.192.192.225" -> "104.130.1.65"[label="0.00"]; "104.192.192.225" -> "104.192.192.66"[label="1.00"]; "104.192.192.225" -> "104.192.192.199"[label="1.00"]; "104.192.192.225" -> "104.198.65.81"[label="3.34"]; "104.192.192.225" -> "104.192.192.33"[label="1.01"]; "104.192.192.225" -> "104.192.192.166"[label="1.00"]; "104.192.192.225" -> "104.192.192.177"[label="1.00"]; "104.192.192.225" -> "104.192.192.1"[label="1.00"]; "104.192.192.225" -> "104.130.100.100"[label="10.15"]; "104.192.192.225" -> "104.192.192.133"[label="1.00"]; "104.130.1.97" -> "104.130.17.17"[label="0.00"]; "104.130.1.97" -> "104.130.1.110"[label="17.82"]; "104.130.1.97" -> "104.130.27.176"[label="106.60"]; "104.130.1.97" -> "104.130.3.3"[label="0.00"]; "104.130.1.97" -> "104.130.1.157"[label="1.56"]; "104.192.192.99" -> "104.192.192.225"[label="1.00"]; "104.192.192.99" -> "104.192.0.52"[label="31.64"]; "104.192.192.99" -> "104.192.192.66"[label="1.00"]; "104.192.192.99" -> "104.192.192.199"[label="1.00"]; "104.192.192.99" -> "104.66.0.30"[label="9.34"]; "104.192.192.99" -> "104.192.192.33"[label="1.00"]; "104.192.192.99" -> "104.192.103.3"[label="3.38"]; "104.192.192.99" -> "104.192.192.166"[label="1.00"]; "104.192.192.99" -> "104.193.24.100"[label="4.11"]; "104.192.192.99" -> "104.192.192.177"[label="2.01"]; "104.192.192.99" -> "104.66.77.4"[label="4.17"]; "104.192.192.99" -> "104.66.0.201"[label="4.61"]; "104.192.192.99" -> "104.192.192.1"[label="1.00"]; "104.192.192.99" -> "104.192.192.133"[label="1.00"]; "104.0.7.100" -> "104.0.7.254"[label="2.68"]; "104.198.65.97" -> "104.130.77.5"[label="3.21"]; "104.198.65.97" -> "104.130.77.1"[label="3.98"]; "104.198.65.97" -> "104.130.1.66"[label="46.12"]; "104.198.65.97" -> "104.198.65.65"[label="1.46"]; "104.198.65.97" -> "104.130.77.78"[label="0.00"]; "104.192.0.38" -> "104.130.1.65"[label="4.36"]; "104.192.0.38" -> "104.12.1.6"[label="7.37"]; "104.130.10.111" -> "104.12.1.6"[label="2.50"]; "104.130.10.111" -> "104.131.25.14"[label="20.58"]; "104.192.0.39" -> "104.192.0.32"[label="4.61"]; "104.192.0.39" -> "104.192.192.225"[label="16.67"]; "104.66.0.58" -> "104.66.0.49"[label="8.60"]; "104.0.7.254" -> "104.131.9.1"[label="10.63"]; "104.0.7.254" -> "104.7.2.1"[label="56.06"]; "104.0.7.254" -> "104.23.0.2"[label="11.09"]; "104.0.7.254" -> "104.0.7.100"[label="2.58"]; "104.0.7.254" -> "104.69.0.69"[label="62.83"]; "104.0.7.254" -> "104.65.0.42"[label="10.92"]; "104.129.0.123" -> "104.129.0.110"[label="29.21"]; "104.129.0.123" -> "104.129.0.77"[label="22.83"]; "104.129.0.123" -> "104.129.0.161"[label="4.11"]; "104.129.0.123" -> "104.129.37.2"[label="36.86"]; "104.129.0.123" -> "104.129.0.8"[label="182.14"]; "104.129.0.123" -> "104.131.9.1"[label="37.81"]; "104.129.0.125" -> "104.129.0.239"[label="50.49"]; "104.129.0.125" -> "104.129.0.219"[label="14.83"]; "104.129.0.125" -> "104.129.0.95"[label="5.04"]; "104.129.0.125" -> "104.192.192.166"[label="270.94"]; "104.129.0.125" -> "104.129.0.8"[label="81.79"]; "104.129.0.125" -> "104.129.1.10"[label="6.36"]; "104.129.0.125" -> "104.129.1.11"[label="12.47"]; "104.129.0.125" -> "104.192.192.133"[label="0.00"]; "104.131.21.104" -> "104.131.21.101"[label="0.00"]; "104.131.21.104" -> "104.131.21.21"[label="4.93"]; "104.131.21.104" -> "104.131.21.1"[label="18.53"]; "104.202.53.1" -> "104.203.0.1"[label="2.11"]; "104.202.53.1" -> "104.192.192.66"[label="162.56"]; "104.202.53.1" -> "104.202.19.1"[label="1.55"]; "104.202.53.1" -> "104.192.192.33"[label="0.00"]; "104.202.53.1" -> "104.0.0.6"[label="41.68"]; "104.131.21.105" -> "104.131.21.101"[label="0.00"]; "104.131.21.105" -> "104.131.21.21"[label="1.80"]; "104.131.21.105" -> "104.131.21.1"[label="8.42"]; "104.131.21.102" -> "104.131.21.101"[label="1.06"]; "104.131.21.102" -> "104.131.21.34"[label="1.06"]; "104.131.21.102" -> "104.131.21.21"[label="1.21"]; "104.131.21.102" -> "104.131.21.12"[label="1.02"]; "104.66.0.49" -> "104.66.0.58"[label="35.42"]; "104.66.0.49" -> "104.66.0.203"[label="4.03"]; "104.131.21.101" -> "104.131.21.104"[label="0.00"]; "104.131.21.101" -> "104.131.21.102"[label="1.12"]; "104.131.21.101" -> "104.131.21.34"[label="1.09"]; "104.131.21.101" -> "104.131.21.21"[label="1.88"]; "104.131.21.101" -> "104.131.21.12"[label="1.13"]; "104.131.21.101" -> "104.131.21.1"[label="9.22"]; "104.192.0.52" -> "104.192.192.99"[label="28.62"]; "104.192.0.52" -> "104.192.192.66"[label="2.40"]; "104.192.0.52" -> "104.192.0.20"[label="3.27"]; "104.192.0.52" -> "104.192.192.33"[label="5.68"]; "104.192.0.52" -> "104.193.24.100"[label="67.73"]; "104.192.0.52" -> "104.192.0.75"[label="1.25"]; "104.131.0.245" -> "104.131.25.12"[label="1.12"]; "104.0.200.1" -> "104.12.0.225"[label="1.45"]; "104.0.200.1" -> "104.13.1.97"[label="2.80"]; "104.0.200.1" -> "104.12.0.105"[label="9.96"]; "104.0.200.1" -> "104.13.3.241"[label="5.86"]; "104.0.200.1" -> "104.12.9.89"[label="1.27"]; "104.0.200.1" -> "104.13.3.33"[label="1.14"]; "104.0.200.1" -> "104.12.0.183"[label="29.61"]; "104.0.200.1" -> "104.13.0.50"[label="3.03"]; "104.0.200.1" -> "104.13.3.57"[label="9.51"]; "104.0.200.1" -> "104.13.1.2"[label="14.77"]; "104.0.200.1" -> "104.12.0.8"[label="1.58"]; "104.0.200.1" -> "104.13.138.1"[label="3.66"]; "104.0.200.1" -> "104.13.0.17"[label="2.53"]; "104.0.200.1" -> "104.13.0.155"[label="33.29"]; "104.72.0.1" -> "104.202.19.1"[label="10.04"]; "104.131.0.74" -> "104.131.25.14"[label="2.56"]; "104.200.0.1" -> "104.200.0.10"[label="1.00"]; "104.192.103.109" -> "104.192.103.200"[label="35.65"]; "104.192.103.109" -> "104.192.99.103"[label="1.36"]; "104.192.103.109" -> "104.192.103.44"[label="3.73"]; "104.192.103.109" -> "104.192.192.133"[label="52.44"]; "104.203.0.1" -> "104.202.53.1"[label="2.09"]; "104.203.0.1" -> "104.202.19.1"[label="1.43"]; "104.130.77.5" -> "104.198.65.97"[label="4.47"]; "104.130.77.5" -> "104.130.77.1"[label="2.06"]; "104.130.77.5" -> "104.130.1.66"[label="23.06"]; "104.130.77.5" -> "104.130.77.79"[label="1.00"]; "104.130.77.5" -> "104.130.77.78"[label="1.00"]; "104.130.77.5" -> "104.130.77.77"[label="1.00"]; "104.201.0.3" -> "104.201.0.4"[label="1.59"]; "104.201.0.3" -> "104.0.0.6"[label="3.13"]; "104.130.1.73" -> "104.130.1.67"[label="3.84"]; "104.130.1.73" -> "104.65.5.3"[label="130.05"]; "104.130.1.73" -> "104.131.34.1"[label="4.94"]; "104.130.1.73" -> "104.130.77.77"[label="67.73"]; "104.130.1.73" -> "104.129.31.3"[label="6.03"]; "104.66.0.8" -> "104.66.0.46"[label="1.27"]; "104.66.0.8" -> "104.66.0.24"[label="1.37"]; "104.129.46.100" -> "104.129.0.77"[label="2.80"]; "104.129.46.100" -> "104.129.81.1"[label="1.54"]; "104.129.46.100" -> "104.129.18.1"[label="2.72"]; "104.12.0.192" -> "104.12.0.43"[label="106.60"]; "104.12.0.192" -> "104.12.0.136"[label="1.71"]; "104.129.0.77" -> "104.129.0.107"[label="1.93"]; "104.129.0.77" -> "104.129.0.123"[label="38.89"]; "104.129.0.77" -> "104.129.46.100"[label="2.80"]; "104.129.0.77" -> "104.129.81.1"[label="1.37"]; "104.129.0.77" -> "104.129.1.43"[label="2.07"]; "104.129.0.77" -> "104.129.1.44"[label="8.08"]; "104.0.4.200" -> "104.0.4.65"[label="15.88"]; "104.0.4.200" -> "104.0.4.161"[label="17.48"]; "104.0.4.200" -> "104.0.0.17"[label="1.00"]; "104.201.0.4" -> "104.201.0.3"[label="1.18"]; "104.198.65.73" -> "104.198.65.81"[label="1.27"]; "104.130.77.1" -> "104.198.65.97"[label="5.22"]; "104.130.77.1" -> "104.130.77.5"[label="1.61"]; "104.130.77.1" -> "104.130.77.79"[label="1.40"]; "104.130.77.1" -> "104.130.77.77"[label="2.06"]; "104.65.5.4" -> "104.65.5.3"[label="2.31"]; "104.65.5.4" -> "104.192.192.199"[label="4.48"]; "104.65.5.4" -> "104.192.192.166"[label="6.34"]; "104.130.1.67" -> "104.130.1.73"[label="3.15"]; "104.130.1.67" -> "104.130.1.66"[label="1.00"]; "104.130.1.67" -> "104.130.1.65"[label="1.00"]; "104.130.1.67" -> "104.0.4.65"[label="1.00"]; "104.130.1.67" -> "104.131.34.1"[label="2.87"]; "104.130.1.67" -> "104.131.9.2"[label="6.89"]; "104.130.1.67" -> "104.131.9.1"[label="38.64"]; "104.130.1.67" -> "104.131.10.2"[label="7.16"]; "104.130.1.67" -> "104.12.1.6"[label="56.30"]; "104.130.1.67" -> "104.131.9.6"[label="0.00"]; "104.130.1.67" -> "104.130.1.131"[label="5.37"]; "104.130.1.67" -> "104.130.1.6"[label="9.11"]; "104.130.1.67" -> "104.130.1.154"[label="0.00"]; "104.130.1.67" -> "104.129.1.28"[label="10.43"]; "104.130.1.67" -> "104.131.83.77"[label="34.30"]; "104.130.1.67" -> "104.129.31.3"[label="10.21"]; "104.130.1.67" -> "104.130.30.1"[label="3.85"]; "104.130.1.67" -> "104.130.30.3"[label="29.03"]; "104.130.1.67" -> "104.130.1.16"[label="2.55"]; "104.130.1.67" -> "104.130.30.9"[label="7.36"]; "104.192.2.2" -> "104.192.103.3"[label="1.12"]; "104.193.1.1" -> "104.0.3.81"[label="1.00"]; "104.130.1.66" -> "104.192.192.225"[label="0.00"]; "104.130.1.66" -> "104.198.65.97"[label="46.92"]; "104.130.1.66" -> "104.130.77.5"[label="14.45"]; "104.130.1.66" -> "104.130.1.67"[label="1.00"]; "104.130.1.66" -> "104.130.1.65"[label="1.00"]; "104.130.1.66" -> "104.0.4.65"[label="1.00"]; "104.130.1.66" -> "104.198.23.1"[label="92.63"]; "104.130.1.66" -> "104.130.1.45"[label="3.68"]; "104.130.1.66" -> "104.130.1.162"[label="2.84"]; "104.130.1.66" -> "104.130.77.79"[label="6.45"]; "104.130.1.66" -> "104.130.77.77"[label="3.46"]; "104.130.1.66" -> "104.130.100.100"[label="8.24"]; "104.130.1.66" -> "104.130.1.6"[label="1.84"]; "104.130.1.66" -> "104.135.0.1"[label="68.30"]; "104.130.1.66" -> "104.130.1.154"[label="1.00"]; "104.130.1.66" -> "104.130.30.1"[label="0.00"]; "104.200.0.10" -> "104.200.0.1"[label="1.00"]; "104.200.0.10" -> "104.192.192.33"[label="3.27"]; "104.192.192.66" -> "104.192.192.225"[label="1.00"]; "104.192.192.66" -> "104.192.192.99"[label="1.00"]; "104.192.192.66" -> "104.192.0.52"[label="2.44"]; "104.192.192.66" -> "104.193.0.2"[label="1.52"]; "104.192.192.66" -> "104.192.192.199"[label="1.00"]; "104.192.192.66" -> "104.192.0.20"[label="1.54"]; "104.192.192.66" -> "104.192.192.33"[label="1.00"]; "104.192.192.66" -> "104.192.192.166"[label="1.00"]; "104.192.192.66" -> "104.193.24.100"[label="2.07"]; "104.192.192.66" -> "104.192.192.177"[label="2.01"]; "104.192.192.66" -> "104.192.192.1"[label="1.00"]; "104.192.192.66" -> "104.192.192.133"[label="1.00"]; "104.130.1.65" -> "104.192.192.225"[label="0.00"]; "104.130.1.65" -> "104.192.0.38"[label="3.79"]; "104.130.1.65" -> "104.130.1.67"[label="1.00"]; "104.130.1.65" -> "104.130.1.66"[label="1.00"]; "104.130.1.65" -> "104.0.4.65"[label="1.00"]; "104.130.1.65" -> "104.65.5.3"[label="9.66"]; "104.130.1.65" -> "104.192.192.199"[label="14.61"]; "104.130.1.65" -> "104.131.34.1"[label="127.50"]; "104.130.1.65" -> "104.130.77.77"[label="11.18"]; "104.130.1.65" -> "104.130.1.154"[label="1.00"]; "104.131.0.192" -> "104.131.25.16"[label="2.24"]; "104.193.0.2" -> "104.192.192.66"[label="1.60"]; "104.13.0.73" -> "104.13.0.97"[label="3.81"]; "104.13.0.73" -> "104.13.0.71"[label="2.04"]; "104.13.0.73" -> "104.13.0.74"[label="1.36"]; "104.13.0.73" -> "104.13.0.38"[label="2.13"]; "104.13.0.73" -> "104.13.3.33"[label="1.00"]; "104.7.2.193" -> "104.7.2.65"[label="1.33"]; "104.7.2.65" -> "104.7.2.193"[label="1.11"]; "104.7.2.65" -> "104.7.2.1"[label="2.37"]; "104.131.0.71" -> "104.131.1.2"[label="8.56"]; "104.0.4.65" -> "104.0.4.200"[label="18.11"]; "104.0.4.65" -> "104.130.1.67"[label="1.00"]; "104.0.4.65" -> "104.130.1.66"[label="1.00"]; "104.0.4.65" -> "104.130.1.65"[label="1.00"]; "104.0.4.65" -> "104.0.4.161"[label="20.41"]; "104.0.4.65" -> "104.130.1.154"[label="1.00"]; "104.0.4.65" -> "104.0.0.17"[label="2.38"]; "104.198.65.65" -> "104.198.65.97"[label="1.46"]; "104.192.192.199" -> "104.192.0.32"[label="17.53"]; "104.192.192.199" -> "104.192.192.225"[label="1.00"]; "104.192.192.199" -> "104.192.192.99"[label="1.00"]; "104.192.192.199" -> "104.65.5.4"[label="4.88"]; "104.192.192.199" -> "104.130.1.65"[label="17.84"]; "104.192.192.199" -> "104.192.192.66"[label="1.00"]; "104.192.192.199" -> "104.131.34.1"[label="0.00"]; "104.192.192.199" -> "104.192.192.33"[label="1.00"]; "104.192.192.199" -> "104.192.192.166"[label="1.00"]; "104.192.192.199" -> "104.192.192.177"[label="1.00"]; "104.192.192.199" -> "104.192.192.1"[label="1.00"]; "104.192.192.199" -> "104.192.192.133"[label="1.00"]; "104.192.192.199" -> "104.135.0.1"[label="17.93"]; "104.129.1.71" -> "104.129.37.2"[label="8.49"]; "104.129.1.71" -> "104.129.1.18"[label="1.57"]; "104.65.5.3" -> "104.130.1.73"[label="123.86"]; "104.65.5.3" -> "104.65.5.4"[label="2.16"]; "104.65.5.3" -> "104.130.1.65"[label="11.38"]; "104.65.5.3" -> "104.12.1.6"[label="22.90"]; "104.202.19.1" -> "104.202.53.1"[label="1.33"]; "104.202.19.1" -> "104.202.0.2"[label="3.70"]; "104.202.19.1" -> "104.72.0.1"[label="8.93"]; "104.202.19.1" -> "104.203.0.1"[label="1.59"]; "104.198.65.94" -> "104.198.65.81"[label="1.00"]; "104.129.0.219" -> "104.129.0.125"[label="73.72"]; "104.129.0.219" -> "104.129.0.110"[label="1.40"]; "104.129.0.219" -> "104.129.0.82"[label="4.52"]; "104.66.0.24" -> "104.66.0.46"[label="1.43"]; "104.66.0.24" -> "104.66.0.8"[label="1.35"]; "104.66.0.24" -> "104.130.1.154"[label="1.34"]; "104.66.0.30" -> "104.192.192.99"[label="8.23"]; "104.66.0.30" -> "104.66.107.4"[label="7.01"]; "104.66.0.30" -> "104.192.103.3"[label="1.80"]; "104.66.0.30" -> "104.192.192.166"[label="27.16"]; "104.66.0.30" -> "104.66.0.203"[label="2.36"]; "104.66.0.30" -> "104.66.77.4"[label="0.00"]; "104.66.0.30" -> "104.192.192.133"[label="3.72"]; "104.129.0.95" -> "104.129.0.108"[label="1.20"]; "104.129.0.95" -> "104.129.0.239"[label="1.42"]; "104.129.0.95" -> "104.129.0.125"[label="0.00"]; "104.129.0.95" -> "104.129.0.8"[label="1.82"]; "104.129.0.95" -> "104.129.1.10"[label="43.01"]; "104.66.0.18" -> "104.66.24.111"[label="4.11"]; "104.198.23.1" -> "104.130.1.66"[label="55.58"]; "104.129.81.1" -> "104.129.0.107"[label="2.38"]; "104.129.81.1" -> "104.129.103.1"[label="8.87"]; "104.129.81.1" -> "104.129.46.100"[label="1.65"]; "104.129.81.1" -> "104.129.0.77"[label="1.40"]; "104.129.81.1" -> "104.129.1.43"[label="2.02"]; "104.129.81.1" -> "104.129.1.44"[label="2.19"]; "104.129.81.1" -> "104.129.0.138"[label="26.27"]; "104.0.3.81" -> "104.193.1.1"[label="1.00"]; "104.0.3.81" -> "104.0.3.13"[label="28.00"]; "104.0.3.81" -> "104.0.0.5"[label="14.34"]; "104.192.0.20" -> "104.192.0.52"[label="3.35"]; "104.192.0.20" -> "104.192.192.66"[label="1.52"]; "104.192.0.20" -> "104.192.192.33"[label="1.60"]; "104.192.0.20" -> "104.192.192.1"[label="5.09"]; "104.12.0.89" -> "104.12.0.73"[label="2.00"]; "104.12.0.89" -> "104.13.3.33"[label="0.00"]; "104.12.0.89" -> "104.13.0.189"[label="0.00"]; "104.198.65.81" -> "104.192.192.225"[label="4.23"]; "104.198.65.81" -> "104.198.65.73"[label="1.21"]; "104.198.65.81" -> "104.198.65.94"[label="1.00"]; "104.198.65.81" -> "104.192.192.1"[label="3.12"]; "104.131.0.42" -> "104.131.131.1"[label="0.00"]; "104.131.0.42" -> "104.131.1.2"[label="36.86"]; "104.131.0.42" -> "104.131.131.3"[label="18.43"]; "104.131.0.42" -> "104.131.0.146"[label="1.05"]; "104.130.27.176" -> "104.130.1.97"[label="0.00"]; "104.130.27.176" -> "104.130.1.110"[label="5.74"]; "104.130.27.176" -> "104.130.1.10"[label="0.00"]; "104.130.27.176" -> "104.130.3.3"[label="104.21"]; "104.130.27.176" -> "104.130.17.17"[label="60.77"]; "104.130.27.176" -> "104.130.1.157"[label="30.31"]; "104.129.44.7" -> "104.131.0.147"[label="6.88"]; "104.129.44.7" -> "104.131.0.148"[label="4.10"]; "104.129.1.43" -> "104.129.0.107"[label="1.40"]; "104.129.1.43" -> "104.129.46.100"[label="46.45"]; "104.129.1.43" -> "104.129.0.77"[label="1.92"]; "104.129.1.43" -> "104.129.81.1"[label="2.08"]; "104.129.1.43" -> "104.129.1.44"[label="1.21"]; "104.129.1.43" -> "104.129.6.1"[label="2.23"]; "104.161.0.10" -> "104.161.0.1"[label="1.65"]; "104.129.1.44" -> "104.129.0.107"[label="1.04"]; "104.129.1.44" -> "104.129.81.1"[label="2.19"]; "104.129.1.44" -> "104.129.1.43"[label="1.37"]; "104.66.107.4" -> "104.66.0.34"[label="6.90"]; "104.66.107.4" -> "104.66.0.30"[label="4.26"]; "104.66.107.4" -> "104.66.0.203"[label="1.97"]; "104.66.107.4" -> "104.66.77.4"[label="1.00"]; "104.66.107.4" -> "104.66.0.201"[label="10.74"]; "104.130.1.45" -> "104.130.1.66"[label="3.72"]; "104.129.0.161" -> "104.129.0.123"[label="2.03"]; "104.161.0.1" -> "104.0.4.161"[label="1.00"]; "104.131.34.1" -> "104.130.1.73"[label="5.50"]; "104.131.34.1" -> "104.130.1.67"[label="2.81"]; "104.131.34.1" -> "104.192.192.166"[label="928.93"]; "104.131.34.1" -> "104.131.9.6"[label="10.63"]; "104.131.34.1" -> "104.130.1.131"[label="2.32"]; "104.131.34.1" -> "104.131.21.21"[label="18.20"]; "104.131.34.1" -> "104.130.17.20"[label="34.37"]; "104.131.34.1" -> "104.130.1.16"[label="0.00"]; "104.130.1.162" -> "104.130.1.66"[label="2.84"]; "104.192.192.33" -> "104.192.192.225"[label="1.00"]; "104.192.192.33" -> "104.192.192.99"[label="1.00"]; "104.192.192.33" -> "104.202.53.1"[label="0.00"]; "104.192.192.33" -> "104.192.0.52"[label="5.81"]; "104.192.192.33" -> "104.200.0.10"[label="4.74"]; "104.192.192.33" -> "104.192.192.66"[label="1.00"]; "104.192.192.33" -> "104.192.192.199"[label="0.00"]; "104.192.192.33" -> "104.192.0.20"[label="1.62"]; "104.192.192.33" -> "104.192.192.166"[label="1.00"]; "104.192.192.33" -> "104.193.24.100"[label="5.88"]; "104.192.192.33" -> "104.192.192.177"[label="1.00"]; "104.192.192.33" -> "104.192.0.75"[label="58.85"]; "104.192.192.33" -> "104.192.192.1"[label="1.00"]; "104.192.192.33" -> "104.192.192.133"[label="1.00"]; "104.161.0.2" -> "104.161.0.1"[label="2.37"]; "104.129.0.165" -> "104.129.105.2"[label="1.63"]; "104.129.0.165" -> "104.129.108.1"[label="5.73"]; "104.129.0.165" -> "104.129.105.10"[label="1.40"]; "104.129.0.165" -> "104.129.103.1"[label="1.08"]; "104.129.0.165" -> "104.129.103.19"[label="1.44"]; "104.129.0.165" -> "104.129.0.91"[label="1.21"]; "104.192.103.3" -> "104.192.192.99"[label="4.54"]; "104.192.103.3" -> "104.192.2.2"[label="1.16"]; "104.192.103.3" -> "104.66.0.30"[label="1.50"]; "104.192.103.3" -> "104.66.0.201"[label="1.28"]; "104.192.103.3" -> "104.66.77.4"[label="1.53"]; "104.192.103.3" -> "104.192.192.133"[label="2.67"]; "104.0.4.161" -> "104.0.4.200"[label="17.48"]; "104.0.4.161" -> "104.0.4.65"[label="14.26"]; "104.0.4.161" -> "104.161.0.1"[label="1.00"]; "104.0.4.161" -> "104.0.0.17"[label="1.12"]; "104.129.37.2" -> "104.129.0.234"[label="2.06"]; "104.129.37.2" -> "104.129.0.239"[label="2.59"]; "104.129.37.2" -> "104.129.0.110"[label="15.47"]; "104.129.37.2" -> "104.129.0.123"[label="22.94"]; "104.129.37.2" -> "104.129.1.71"[label="7.26"]; "104.129.37.2" -> "104.129.0.8"[label="13.19"]; "104.129.37.2" -> "104.129.1.10"[label="25.93"]; "104.129.37.2" -> "104.129.1.1"[label="2.82"]; "104.129.37.2" -> "104.129.1.17"[label="3.18"]; "104.129.37.2" -> "104.129.1.18"[label="25.01"]; "104.192.192.166" -> "104.192.0.40"[label="2.04"]; "104.192.192.166" -> "104.192.192.225"[label="1.00"]; "104.192.192.166" -> "104.192.192.99"[label="1.01"]; "104.192.192.166" -> "104.129.0.125"[label="165.88"]; "104.192.192.166" -> "104.65.5.4"[label="7.94"]; "104.192.192.166" -> "104.192.192.66"[label="1.00"]; "104.192.192.166" -> "104.192.192.199"[label="1.00"]; "104.192.192.166" -> "104.66.0.30"[label="39.41"]; "104.192.192.166" -> "104.131.34.1"[label="331.76"]; "104.192.192.166" -> "104.192.192.33"[label="1.00"]; "104.192.192.166" -> "104.192.192.177"[label="2.01"]; "104.192.192.166" -> "104.66.77.4"[label="78.82"]; "104.192.192.166" -> "104.66.0.201"[label="6.54"]; "104.192.192.166" -> "104.192.192.1"[label="1.00"]; "104.192.192.166" -> "104.192.192.133"[label="1.00"]; "104.129.0.187" -> "104.129.1.28"[label="30.39"]; "104.131.0.184" -> "104.131.131.3"[label="1.63"]; "104.66.0.249" -> "104.66.0.34"[label="1.15"]; "104.66.0.249" -> "104.66.0.23"[label="2.51"]; "104.66.0.249" -> "104.66.0.203"[label="1.79"]; "104.66.0.249" -> "104.66.0.201"[label="3.33"]; "104.12.0.176" -> "104.5.0.222"[label="33.87"]; "104.12.0.176" -> "104.12.0.1"[label="1.47"]; "104.12.0.176" -> "104.12.1.11"[label="6.06"]; "104.12.0.176" -> "104.12.0.19"[label="7.31"]; "104.12.0.176" -> "104.12.0.30"[label="1.52"]; "104.193.24.100" -> "104.192.192.99"[label="3.80"]; "104.193.24.100" -> "104.192.0.52"[label="57.95"]; "104.193.24.100" -> "104.192.192.66"[label="1.82"]; "104.193.24.100" -> "104.192.192.33"[label="4.76"]; "104.193.24.100" -> "104.192.192.1"[label="0.00"]; "104.192.192.177" -> "104.192.192.225"[label="1.00"]; "104.192.192.177" -> "104.192.192.99"[label="2.01"]; "104.192.192.177" -> "104.192.192.66"[label="2.01"]; "104.192.192.177" -> "104.192.192.199"[label="1.00"]; "104.192.192.177" -> "104.192.192.33"[label="1.00"]; "104.192.192.177" -> "104.192.192.166"[label="2.01"]; "104.192.192.177" -> "104.192.192.178"[label="1.05"]; "104.192.192.177" -> "104.192.192.1"[label="1.00"]; "104.192.192.177" -> "104.192.192.133"[label="2.01"]; "104.192.192.178" -> "104.192.192.177"[label="1.12"]; "104.192.192.178" -> "104.129.29.29"[label="1.00"]; "104.131.0.55" -> "104.131.131.1"[label="7.70"]; "104.131.0.55" -> "104.131.0.3"[label="1.83"]; "104.131.21.34" -> "104.131.21.102"[label="1.07"]; "104.131.21.34" -> "104.131.21.101"[label="1.06"]; "104.131.21.34" -> "104.131.34.1"[label="260.10"]; "104.131.21.34" -> "104.131.21.21"[label="1.37"]; "104.131.21.34" -> "104.131.21.12"[label="1.55"]; "104.131.21.34" -> "104.131.21.1"[label="17.73"]; "104.66.24.111" -> "104.66.0.18"[label="4.20"]; "104.66.24.111" -> "104.0.3.13"[label="1.00"]; "104.131.10.1" -> "104.131.10.2"[label="1.49"]; "104.131.9.2" -> "104.130.1.67"[label="12.35"]; "104.131.9.2" -> "104.130.1.65"[label="136.61"]; "104.131.9.2" -> "104.129.0.138"[label="0.00"]; "104.131.9.2" -> "104.131.9.1"[label="1.00"]; "104.131.9.2" -> "104.131.9.6"[label="12.39"]; "104.131.9.2" -> "104.131.9.4"[label="1.00"]; "104.131.9.2" -> "104.131.9.5"[label="26.56"]; "104.131.9.2" -> "104.131.0.147"[label="30.53"]; "104.131.9.2" -> "104.131.0.148"[label="26.22"]; "104.129.0.8" -> "104.129.0.108"[label="1.65"]; "104.129.0.8" -> "104.129.0.239"[label="2.31"]; "104.129.0.8" -> "104.129.0.123"[label="38.16"]; "104.129.0.8" -> "104.129.0.125"[label="216.03"]; "104.129.0.8" -> "104.129.0.95"[label="2.15"]; "104.129.0.8" -> "104.129.37.2"[label="19.35"]; "104.129.0.8" -> "104.129.1.17"[label="37.81"]; "104.129.0.8" -> "104.129.1.10"[label="0.00"]; "104.66.0.203" -> "104.66.0.34"[label="1.88"]; "104.66.0.203" -> "104.66.0.49"[label="3.45"]; "104.66.0.203" -> "104.66.0.30"[label="1.96"]; "104.66.0.203" -> "104.66.107.4"[label="1.62"]; "104.66.0.203" -> "104.192.103.3"[label="19.24"]; "104.66.0.203" -> "104.66.0.249"[label="1.83"]; "104.66.0.203" -> "104.66.0.201"[label="1.00"]; "104.66.0.203" -> "104.66.77.4"[label="1.58"]; "104.66.0.203" -> "104.66.68.16"[label="7.01"]; "104.130.1.10" -> "104.130.1.14"[label="1.00"]; "104.130.1.10" -> "104.136.12.5"[label="3.05"]; "104.130.1.10" -> "104.130.3.3"[label="10.60"]; "104.130.1.10" -> "104.130.17.17"[label="5.42"]; "104.130.1.10" -> "104.130.1.16"[label="1.04"]; "104.129.1.10" -> "104.129.0.239"[label="57.95"]; "104.129.1.10" -> "104.129.0.125"[label="5.65"]; "104.129.1.10" -> "104.129.0.95"[label="27.37"]; "104.129.1.10" -> "104.129.37.2"[label="25.16"]; "104.129.1.10" -> "104.129.0.8"[label="11.70"]; "104.131.25.16" -> "104.131.0.192"[label="2.17"]; "104.131.25.16" -> "104.130.1.14"[label="2.74"]; "104.131.25.16" -> "104.131.25.14"[label="1.00"]; "104.131.25.16" -> "104.131.25.12"[label="1.00"]; "104.192.103.44" -> "104.192.103.200"[label="1.46"]; "104.192.103.44" -> "104.192.103.109"[label="6.27"]; "104.192.103.44" -> "104.192.99.103"[label="1.68"]; "104.129.0.138" -> "104.129.0.77"[label="0.00"]; "104.129.0.138" -> "104.129.81.1"[label="32.11"]; "104.129.0.138" -> "104.131.9.2"[label="22.52"]; "104.129.0.138" -> "104.130.1.10"[label="0.00"]; "104.129.0.138" -> "104.131.9.1"[label="11.61"]; "104.129.0.138" -> "104.131.21.1"[label="0.00"]; "104.137.0.2" -> "104.12.1.6"[label="1.56"]; "104.12.1.6" -> "104.192.0.38"[label="14.47"]; "104.12.1.6" -> "104.130.10.111"[label="2.47"]; "104.12.1.6" -> "104.130.1.67"[label="36.86"]; "104.12.1.6" -> "104.65.5.3"[label="19.45"]; "104.12.1.6" -> "104.137.0.2"[label="1.59"]; "104.12.1.6" -> "104.6.0.6"[label="13.88"]; "104.12.1.6" -> "104.130.1.131"[label="4.40"]; "104.192.0.75" -> "104.192.0.52"[label="1.27"]; "104.192.0.75" -> "104.192.192.33"[label="30.39"]; "104.131.9.1" -> "104.129.0.123"[label="27.32"]; "104.131.9.1" -> "104.0.7.254"[label="29.22"]; "104.131.9.1" -> "104.130.1.67"[label="66.35"]; "104.131.9.1" -> "104.131.9.2"[label="1.00"]; "104.131.9.1" -> "104.129.0.138"[label="10.89"]; "104.131.9.1" -> "104.131.9.4"[label="1.00"]; "104.131.9.1" -> "104.131.9.5"[label="1.93"]; "104.131.9.1" -> "104.131.0.147"[label="5.87"]; "104.131.9.1" -> "104.131.0.148"[label="295.57"]; "104.131.9.1" -> "104.131.21.1"[label="4.37"]; "104.66.0.201" -> "104.192.192.99"[label="4.67"]; "104.66.0.201" -> "104.66.107.4"[label="4.12"]; "104.66.0.201" -> "104.192.103.3"[label="1.26"]; "104.66.0.201" -> "104.192.192.166"[label="2.12"]; "104.66.0.201" -> "104.66.0.249"[label="3.51"]; "104.66.0.201" -> "104.66.0.203"[label="1.00"]; "104.66.0.201" -> "104.66.77.4"[label="2.28"]; "104.66.0.201" -> "104.192.192.133"[label="1.96"]; "104.66.77.4" -> "104.66.0.34"[label="15.15"]; "104.66.77.4" -> "104.192.192.99"[label="3.91"]; "104.66.77.4" -> "104.66.0.30"[label="1.65"]; "104.66.77.4" -> "104.66.107.4"[label="1.00"]; "104.66.77.4" -> "104.192.103.3"[label="1.43"]; "104.66.77.4" -> "104.192.192.166"[label="250.10"]; "104.66.77.4" -> "104.66.0.203"[label="1.63"]; "104.66.77.4" -> "104.66.0.201"[label="2.32"]; "104.66.77.4" -> "104.192.192.133"[label="3.71"]; "104.66.77.4" -> "104.66.68.16"[label="5.43"]; "104.131.10.2" -> "104.130.1.67"[label="13.32"]; "104.131.10.2" -> "104.131.10.1"[label="1.46"]; "104.131.10.2" -> "104.131.83.77"[label="1.00"]; "104.131.9.6" -> "104.130.1.67"[label="8.46"]; "104.131.9.6" -> "104.131.34.1"[label="15.56"]; "104.131.9.6" -> "104.131.9.2"[label="12.39"]; "104.131.9.6" -> "104.131.0.147"[label="1.86"]; "104.131.9.6" -> "104.131.21.1"[label="31.64"]; "104.131.9.6" -> "104.131.0.148"[label="216.75"]; "104.136.12.9" -> "104.136.22.22"[label="1.08"]; "104.136.12.9" -> "104.136.12.7"[label="1.00"]; "104.136.12.9" -> "104.136.12.30"[label="1.00"]; "104.130.1.14" -> "104.130.1.10"[label="1.00"]; "104.130.1.14" -> "104.131.25.16"[label="2.89"]; "104.130.1.14" -> "104.130.1.16"[label="1.04"]; "104.0.3.13" -> "104.0.3.81"[label="28.00"]; "104.0.3.13" -> "104.66.24.111"[label="1.00"]; "104.0.3.13" -> "104.0.0.5"[label="1.29"]; "104.131.9.4" -> "104.131.9.2"[label="1.00"]; "104.131.9.4" -> "104.131.9.1"[label="1.00"]; "104.131.9.4" -> "104.131.9.5"[label="5.46"]; "104.131.9.5" -> "104.131.9.2"[label="19.14"]; "104.131.9.5" -> "104.131.9.1"[label="2.00"]; "104.131.9.5" -> "104.131.9.4"[label="4.21"]; "104.136.0.7" -> "104.136.22.22"[label="1.25"]; "104.6.0.6" -> "104.12.1.6"[label="18.75"]; "104.6.0.6" -> "104.6.0.11"[label="4.31"]; "104.6.0.6" -> "104.8.0.24"[label="20.37"]; "104.69.0.69" -> "104.0.7.254"[label="57.80"]; "104.131.0.3" -> "104.131.131.1"[label="1.62"]; "104.131.0.3" -> "104.131.1.2"[label="0.00"]; "104.131.0.3" -> "104.131.131.3"[label="2.58"]; "104.131.0.3" -> "104.131.0.55"[label="1.86"]; "104.130.77.79" -> "104.130.77.5"[label="1.00"]; "104.130.77.79" -> "104.130.77.1"[label="1.60"]; "104.130.77.79" -> "104.130.1.66"[label="7.26"]; "104.130.77.79" -> "104.130.77.232"[label="2.90"]; "104.130.77.79" -> "104.130.77.78"[label="1.00"]; "104.130.77.79" -> "104.130.77.77"[label="1.00"]; "104.131.1.2" -> "104.131.131.3"[label="0.00"]; "104.131.1.2" -> "104.131.83.77"[label="77.41"]; "104.130.1.131" -> "104.130.1.67"[label="4.95"]; "104.130.1.131" -> "104.131.34.1"[label="2.27"]; "104.130.1.131" -> "104.12.1.6"[label="4.13"]; "104.130.1.131" -> "104.130.1.16"[label="0.00"]; "104.129.1.1" -> "104.129.37.2"[label="2.82"]; "104.129.1.1" -> "104.0.0.30"[label="1.00"]; "104.129.1.1" -> "104.129.1.17"[label="2.66"]; "104.129.1.1" -> "104.0.0.17"[label="1.00"]; "104.130.77.78" -> "104.130.77.79"[label="1.00"]; "104.130.77.78" -> "104.130.77.77"[label="1.00"]; "104.130.77.78" -> "104.130.77.5"[label="1.00"]; "104.192.192.1" -> "104.192.0.32"[label="173.40"]; "104.192.192.1" -> "104.192.192.225"[label="1.00"]; "104.192.192.1" -> "104.192.192.99"[label="1.00"]; "104.192.192.1" -> "104.192.192.66"[label="1.00"]; "104.192.192.1" -> "104.192.192.199"[label="1.00"]; "104.192.192.1" -> "104.192.0.20"[label="4.90"]; "104.192.192.1" -> "104.198.65.81"[label="2.95"]; "104.192.192.1" -> "104.192.192.33"[label="1.00"]; "104.192.192.1" -> "104.192.192.166"[label="1.00"]; "104.192.192.1" -> "104.192.192.177"[label="1.00"]; "104.192.192.1" -> "104.192.192.133"[label="1.00"]; "104.129.29.29" -> "104.192.192.178"[label="1.00"]; "104.136.12.5" -> "104.130.1.10"[label="1.43"]; "104.136.12.5" -> "104.130.3.3"[label="2167.50"]; "104.136.12.5" -> "104.130.5.5"[label="1.17"]; "104.136.12.5" -> "104.130.17.17"[label="7.52"]; "104.130.17.17" -> "104.130.1.110"[label="2.57"]; "104.130.17.17" -> "104.130.1.97"[label="0.00"]; "104.130.17.17" -> "104.130.27.176"[label="61.34"]; "104.130.17.17" -> "104.130.1.52"[label="47.33"]; "104.130.17.17" -> "104.130.1.10"[label="8.69"]; "104.130.17.17" -> "104.136.12.5"[label="7.21"]; "104.130.17.17" -> "104.130.3.3"[label="2.33"]; "104.130.17.17" -> "104.130.1.157"[label="22.84"]; "104.130.17.17" -> "104.130.1.16"[label="844.48"]; "104.130.3.3" -> "104.130.1.110"[label="17.87"]; "104.130.3.3" -> "104.130.1.97"[label="0.00"]; "104.130.3.3" -> "104.130.27.176"[label="0.00"]; "104.130.3.3" -> "104.130.1.10"[label="14.03"]; "104.130.3.3" -> "104.136.12.5"[label="2167.50"]; "104.130.3.3" -> "104.130.17.17"[label="3.05"]; "104.130.3.3" -> "104.130.1.157"[label="0.00"]; "104.131.131.2" -> "104.131.131.3"[label="1.67"]; "104.130.77.77" -> "104.130.1.73"[label="77.41"]; "104.130.77.77" -> "104.130.77.5"[label="1.00"]; "104.130.77.77" -> "104.130.77.1"[label="3.12"]; "104.130.77.77" -> "104.130.1.67"[label="0.00"]; "104.130.77.77" -> "104.130.1.66"[label="4.05"]; "104.130.77.77" -> "104.130.1.65"[label="11.80"]; "104.130.77.77" -> "104.130.77.79"[label="1.00"]; "104.130.77.77" -> "104.130.77.78"[label="1.00"]; "104.130.100.100" -> "104.192.192.225"[label="0.00"]; "104.130.100.100" -> "104.130.1.66"[label="9.61"]; "104.130.5.5" -> "104.136.12.5"[label="1.18"]; "104.132.22.17" -> "104.132.24.12"[label="1.13"]; "104.131.13.13" -> "104.131.21.1"[label="16.13"]; "104.136.12.7" -> "104.136.12.9"[label="1.00"]; "104.136.12.7" -> "104.136.12.30"[label="1.00"]; "104.136.12.7" -> "104.131.25.12"[label="1.59"]; "104.131.131.3" -> "104.131.0.184"[label="1.63"]; "104.131.131.3" -> "104.131.1.2"[label="0.00"]; "104.131.131.3" -> "104.131.0.3"[label="2.42"]; "104.131.131.3" -> "104.131.131.2"[label="1.70"]; "104.131.131.3" -> "104.131.83.77"[label="8.18"]; "104.131.131.3" -> "104.131.0.146"[label="9.71"]; "104.131.21.21" -> "104.131.21.104"[label="3.27"]; "104.131.21.21" -> "104.131.21.105"[label="1.66"]; "104.131.21.21" -> "104.131.21.102"[label="1.19"]; "104.131.21.21" -> "104.131.21.101"[label="1.35"]; "104.131.21.21" -> "104.131.34.1"[label="18.21"]; "104.131.21.21" -> "104.131.21.34"[label="1.34"]; "104.131.21.21" -> "104.131.21.12"[label="1.21"]; "104.131.21.21" -> "104.131.21.1"[label="8.73"]; "104.7.2.1" -> "104.0.7.254"[label="10.20"]; "104.7.2.1" -> "104.7.2.65"[label="2.22"]; "104.130.1.6" -> "104.130.1.67"[label="8.32"]; "104.130.1.6" -> "104.130.1.66"[label="2.09"]; "104.0.0.5" -> "104.0.3.81"[label="13.23"]; "104.0.0.5" -> "104.0.3.13"[label="1.25"]; "104.0.0.5" -> "104.0.0.6"[label="1.00"]; "104.0.0.5" -> "104.0.0.17"[label="1.08"]; "104.192.192.133" -> "104.192.103.109"[label="44.84"]; "104.192.192.133" -> "104.192.0.74"[label="0.00"]; "104.192.192.133" -> "104.192.192.225"[label="1.00"]; "104.192.192.133" -> "104.192.192.99"[label="1.02"]; "104.192.192.133" -> "104.129.0.125"[label="153.00"]; "104.192.192.133" -> "104.66.0.49"[label="9.31"]; "104.192.192.133" -> "104.192.192.66"[label="1.00"]; "104.192.192.133" -> "104.192.192.199"[label="1.00"]; "104.192.192.133" -> "104.66.0.30"[label="2.63"]; "104.192.192.133" -> "104.192.192.33"[label="1.01"]; "104.192.192.133" -> "104.192.103.3"[label="2.56"]; "104.192.192.133" -> "104.192.192.166"[label="1.00"]; "104.192.192.133" -> "104.192.192.177"[label="2.01"]; "104.192.192.133" -> "104.66.77.4"[label="4.65"]; "104.192.192.133" -> "104.66.0.201"[label="2.27"]; "104.192.192.133" -> "104.192.192.1"[label="1.00"]; "104.192.192.133" -> "104.192.99.160"[label="30.39"]; "104.10.2.14" -> "104.10.2.34"[label="1.00"]; "104.10.2.14" -> "104.6.0.11"[label="1.39"]; "104.10.2.14" -> "104.10.2.24"[label="1.00"]; "104.135.0.1" -> "104.192.192.225"[label="36.86"]; "104.135.0.1" -> "104.130.1.66"[label="65.68"]; "104.129.6.1" -> "104.129.1.43"[label="2.29"]; "104.0.0.6" -> "104.65.0.42"[label="1.54"]; "104.0.0.6" -> "104.202.53.1"[label="22.74"]; "104.0.0.6" -> "104.201.0.3"[label="4.11"]; "104.0.0.6" -> "104.201.0.4"[label="1.20"]; "104.0.0.6" -> "104.202.19.1"[label="1.93"]; "104.0.0.6" -> "104.0.0.5"[label="1.00"]; "104.132.0.3" -> "104.132.24.7"[label="90.31"]; "104.132.0.3" -> "104.132.24.3"[label="22.50"]; "104.130.17.20" -> "104.131.34.1"[label="24.19"]; "104.130.17.20" -> "104.130.1.16"[label="4.98"]; "104.12.0.20" -> "104.12.0.200"[label="361.25"]; "104.12.0.20" -> "104.12.34.6"[label="2.33"]; "104.12.0.20" -> "104.13.3.33"[label="1.06"]; "104.12.0.20" -> "104.12.0.46"[label="1.32"]; "104.12.0.20" -> "104.12.0.43"[label="0.00"]; "104.12.0.20" -> "104.13.0.50"[label="137.47"]; "104.132.24.4" -> "104.132.24.7"[label="1.06"]; "104.132.24.4" -> "104.132.24.1"[label="1.14"]; "104.132.24.4" -> "104.132.24.2"[label="2.80"]; "104.132.24.4" -> "104.132.24.3"[label="1.48"]; "104.132.24.4" -> "104.132.24.8"[label="1.16"]; "104.132.24.4" -> "104.132.24.9"[label="11.35"]; "104.132.24.5" -> "104.132.24.1"[label="2.61"]; "104.132.24.5" -> "104.132.24.2"[label="3.97"]; "104.132.24.5" -> "104.132.24.3"[label="1.43"]; "104.132.24.5" -> "104.132.24.9"[label="117.80"]; "104.130.1.154" -> "104.130.1.67"[label="1.00"]; "104.130.1.154" -> "104.130.1.66"[label="1.00"]; "104.130.1.154" -> "104.130.1.65"[label="1.00"]; "104.130.1.154" -> "104.0.4.65"[label="1.00"]; "104.130.1.154" -> "104.66.0.24"[label="1.31"]; "104.136.12.30" -> "104.132.24.1"[label="1.02"]; "104.136.12.30" -> "104.136.12.7"[label="1.00"]; "104.136.12.30" -> "104.136.12.9"[label="1.00"]; "104.136.12.30" -> "104.136.22.22"[label="1.58"]; "104.131.21.12" -> "104.131.21.102"[label="1.16"]; "104.131.21.12" -> "104.131.21.101"[label="1.13"]; "104.131.21.12" -> "104.131.21.34"[label="1.94"]; "104.131.21.12" -> "104.131.21.21"[label="1.56"]; "104.131.21.12" -> "104.131.21.1"[label="16.60"]; "104.132.24.7" -> "104.132.0.3"[label="197.05"]; "104.132.24.7" -> "104.132.24.4"[label="1.10"]; "104.132.24.7" -> "104.132.24.1"[label="2.27"]; "104.132.24.7" -> "104.132.24.2"[label="14.99"]; "104.132.24.7" -> "104.132.24.9"[label="11.87"]; "104.129.1.28" -> "104.130.1.67"[label="5.85"]; "104.129.1.28" -> "104.129.0.187"[label="61.34"]; "104.132.24.1" -> "104.132.24.4"[label="1.32"]; "104.132.24.1" -> "104.132.24.5"[label="15.18"]; "104.132.24.1" -> "104.136.12.30"[label="1.02"]; "104.132.24.1" -> "104.132.24.7"[label="2.07"]; "104.132.24.1" -> "104.132.24.3"[label="1.63"]; "104.132.24.1" -> "104.132.24.8"[label="1.16"]; "104.132.24.1" -> "104.132.24.9"[label="1.07"]; "104.130.30.1" -> "104.130.1.67"[label="4.03"]; "104.130.30.1" -> "104.130.30.3"[label="1.58"]; "104.130.30.1" -> "104.130.30.9"[label="1.36"]; "104.129.31.3" -> "104.130.1.73"[label="4.67"]; "104.129.31.3" -> "104.130.1.67"[label="10.77"]; "104.129.31.3" -> "104.129.31.14"[label="1.21"]; "104.0.0.29" -> "104.0.0.30"[label="1.30"]; "104.131.83.77" -> "104.130.1.67"[label="54.64"]; "104.131.83.77" -> "104.131.10.2"[label="1.00"]; "104.131.83.77" -> "104.131.1.2"[label="0.00"]; "104.131.83.77" -> "104.131.131.1"[label="25.80"]; "104.131.83.77" -> "104.131.131.3"[label="8.28"]; "104.0.0.30" -> "104.129.1.1"[label="1.00"]; "104.0.0.30" -> "104.0.0.29"[label="1.30"]; "104.0.0.30" -> "104.0.0.17"[label="1.00"]; "104.130.1.157" -> "104.130.1.110"[label="2.03"]; "104.130.1.157" -> "104.130.1.97"[label="4.64"]; "104.130.1.157" -> "104.130.27.176"[label="28.56"]; "104.130.1.157" -> "104.130.3.3"[label="0.00"]; "104.130.1.157" -> "104.130.17.17"[label="22.84"]; "104.130.30.3" -> "104.130.1.67"[label="0.00"]; "104.130.30.3" -> "104.130.30.1"[label="1.58"]; "104.130.30.3" -> "104.130.30.9"[label="1.06"]; "104.132.24.3" -> "104.132.0.3"[label="32.03"]; "104.132.24.3" -> "104.132.24.4"[label="2.01"]; "104.132.24.3" -> "104.132.24.5"[label="20.74"]; "104.132.24.3" -> "104.132.24.1"[label="13.68"]; "104.132.24.3" -> "104.132.24.9"[label="11.68"]; "104.132.24.12" -> "104.132.22.17"[label="1.14"]; "104.132.24.12" -> "104.132.24.2"[label="1.00"]; "104.8.0.24" -> "104.6.0.11"[label="3.27"]; "104.8.0.24" -> "104.6.0.6"[label="22.52"]; "104.8.0.24" -> "104.8.0.22"[label="1.00"]; "104.131.0.147" -> "104.131.9.2"[label="7.27"]; "104.131.0.147" -> "104.131.9.1"[label="5.96"]; "104.131.0.147" -> "104.131.9.6"[label="1.44"]; "104.131.0.147" -> "104.131.0.148"[label="1.63"]; "104.131.0.146" -> "104.131.0.42"[label="1.20"]; "104.131.0.146" -> "104.131.1.2"[label="0.00"]; "104.129.1.17" -> "104.129.0.110"[label="0.00"]; "104.129.1.17" -> "104.129.37.2"[label="3.54"]; "104.129.1.17" -> "104.129.0.8"[label="40.59"]; "104.129.1.17" -> "104.129.1.1"[label="3.00"]; "104.129.1.17" -> "104.129.1.18"[label="1.00"]; "104.0.0.17" -> "104.0.4.200"[label="1.03"]; "104.0.0.17" -> "104.0.4.65"[label="1.25"]; "104.0.0.17" -> "104.0.4.161"[label="1.16"]; "104.0.0.17" -> "104.129.1.1"[label="1.00"]; "104.0.0.17" -> "104.0.0.5"[label="1.21"]; "104.0.0.17" -> "104.0.0.30"[label="1.00"]; "104.129.18.1" -> "104.129.46.100"[label="2.72"]; "104.129.1.18" -> "104.129.1.71"[label="1.41"]; "104.129.1.18" -> "104.129.37.2"[label="25.32"]; "104.129.1.18" -> "104.129.1.17"[label="1.00"]; "104.23.0.4" -> "104.23.0.2"[label="1.14"]; "104.130.1.16" -> "104.130.1.67"[label="2.61"]; "104.130.1.16" -> "104.131.34.1"[label="23.47"]; "104.130.1.16" -> "104.130.1.10"[label="1.04"]; "104.130.1.16" -> "104.130.1.14"[label="1.04"]; "104.130.1.16" -> "104.130.1.131"[label="25.09"]; "104.130.1.16" -> "104.130.17.17"[label="844.48"]; "104.130.1.16" -> "104.130.17.20"[label="4.90"]; "104.131.25.14" -> "104.130.10.111"[label="17.96"]; "104.131.25.14" -> "104.131.0.74"[label="2.43"]; "104.131.25.14" -> "104.131.25.16"[label="1.00"]; "104.131.25.14" -> "104.131.25.12"[label="1.00"]; "104.132.24.8" -> "104.132.24.7"[label="0.00"]; "104.132.24.8" -> "104.132.24.4"[label="1.10"]; "104.132.24.8" -> "104.132.24.1"[label="1.19"]; "104.132.24.8" -> "104.132.24.9"[label="2.16"]; "104.130.30.9" -> "104.130.30.1"[label="1.35"]; "104.130.30.9" -> "104.130.1.67"[label="9.00"]; "104.130.30.9" -> "104.130.30.3"[label="1.06"]; "104.132.24.9" -> "104.132.24.4"[label="12.52"]; "104.132.24.9" -> "104.132.24.5"[label="134.35"]; "104.132.24.9" -> "104.132.24.7"[label="12.69"]; "104.132.24.9" -> "104.132.24.1"[label="1.34"]; "104.132.24.9" -> "104.132.24.3"[label="13.35"]; "104.132.24.9" -> "104.132.24.8"[label="2.35"]; "104.23.0.2" -> "104.0.7.254"[label="10.63"]; "104.23.0.2" -> "104.23.0.4"[label="1.09"]; "104.66.68.16" -> "104.66.0.23"[label="1.24"]; "104.66.68.16" -> "104.66.0.203"[label="6.19"]; "104.66.68.16" -> "104.66.77.4"[label="6.13"]; "104.131.25.12" -> "104.131.0.245"[label="1.13"]; "104.131.25.12" -> "104.131.25.16"[label="1.00"]; "104.131.25.12" -> "104.136.12.7"[label="1.51"]; "104.131.25.12" -> "104.131.25.14"[label="1.00"]; "104.131.21.1" -> "104.131.21.104"[label="8.80"]; "104.131.21.1" -> "104.131.21.105"[label="3.55"]; "104.131.21.1" -> "104.131.21.101"[label="20.53"]; "104.131.21.1" -> "104.131.34.1"[label="0.00"]; "104.131.21.1" -> "104.131.21.34"[label="20.03"]; "104.131.21.1" -> "104.131.9.2"[label="4.90"]; "104.131.21.1" -> "104.131.9.1"[label="3.82"]; "104.131.21.1" -> "104.131.21.21"[label="5.03"]; "104.131.21.1" -> "104.131.21.12"[label="24.19"]; "104.131.0.148" -> "104.129.44.7"[label="0.00"]; "104.131.0.148" -> "104.131.9.2"[label="32.14"]; "104.131.0.148" -> "104.131.9.1"[label="244.45"]; "104.131.0.148" -> "104.131.9.6"[label="50.41"]; "104.131.0.148" -> "104.131.0.147"[label="1.45"]; "104.65.0.42" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.0.7.254" -> "10.63.0.0/255.255.0.0"[label="HNA"]; "10.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "104.63.0.0/255.255.0.0"[label="HNA"]; "104.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "104.61.0.0/255.255.0.0"[label="HNA"]; "104.61.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "10.99.0.0/255.255.0.0"[label="HNA"]; "10.99.0.0/255.255.0.0"[shape=diamond]; "104.131.0.245" -> "104.131.0.145/255.255.255.255"[label="HNA"]; "104.131.0.145/255.255.255.255"[shape=diamond]; "104.129.37.2" -> "104.129.37.3/255.255.255.255"[label="HNA"]; "104.129.37.3/255.255.255.255"[shape=diamond]; "104.129.37.2" -> "104.129.37.1/255.255.255.255"[label="HNA"]; "104.129.37.1/255.255.255.255"[shape=diamond]; "104.131.0.55" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.9.1" -> "104.131.9.77/255.255.255.255"[label="HNA"]; "104.131.9.77/255.255.255.255"[shape=diamond]; "104.131.9.5" -> "104.131.9.136/255.255.255.248"[label="HNA"]; "104.131.9.136/255.255.255.248"[shape=diamond]; "104.130.17.17" -> "104.136.12.12/255.255.255.255"[label="HNA"]; "104.136.12.12/255.255.255.255"[shape=diamond]; "104.136.12.7" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.21.21" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.132.24.1" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.130.30.1" -> "104.130.30.30/255.255.255.255"[label="HNA"]; "104.130.30.30/255.255.255.255"[shape=diamond]; "104.130.1.16" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.132.24.8" -> "104.136.12.13/255.255.255.255"[label="HNA"]; "104.136.12.13/255.255.255.255"[shape=diamond]; "104.132.24.9" -> "104.132.24.250/255.255.255.255"[label="HNA"]; "104.132.24.250/255.255.255.255"[shape=diamond]; "104.23.0.2" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.23.0.2" -> "104.23.0.5/255.255.255.255"[label="HNA"]; "104.23.0.5/255.255.255.255"[shape=diamond]; } digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="130.10", style=solid]; "104.131.0.42"[shape=box]; "104.131.131.1" -> "104.131.0.55"[label="7.51", style=solid]; "104.131.131.1" -> "104.131.1.2"[label="40.26", style=solid]; "104.131.1.2"[shape=box]; "104.131.131.1" -> "104.131.0.3"[label="1.80", style=solid]; "104.131.0.3"[shape=box]; "104.131.131.1" -> "104.131.131.3"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.83.77"[label="24.95", style=solid]; "104.131.83.77"[shape=box]; "104.131.131.1" -> "104.131.0.147"[label="0.00", style=dashed]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.129.0.107" -> "104.129.0.77"[label="1.52"]; "104.129.0.107" -> "104.129.81.1"[label="1.67"]; "104.129.0.107" -> "104.129.1.43"[label="1.42"]; "104.129.0.107" -> "104.129.1.44"[label="1.04"]; "104.65.0.42" -> "104.0.7.254"[label="17.91"]; "104.65.0.42" -> "104.0.0.6"[label="6.54"]; "104.129.0.234" -> "104.129.37.2"[label="2.01"]; "104.129.108.1" -> "104.129.105.2"[label="1.80"]; "104.129.108.1" -> "104.129.105.10"[label="1.18"]; "104.129.108.1" -> "104.129.103.1"[label="1.16"]; "104.129.108.1" -> "104.129.103.19"[label="1.30"]; "104.129.108.1" -> "104.129.0.91"[label="1.17"]; "104.129.108.1" -> "104.129.0.165"[label="4.82"]; "104.66.0.46" -> "104.66.0.8"[label="1.23"]; "104.66.0.46" -> "104.66.0.24"[label="1.46"]; "104.129.0.108" -> "104.129.0.239"[label="1.50"]; "104.129.0.108" -> "104.129.0.95"[label="1.24"]; "104.129.0.108" -> "104.129.0.8"[label="1.50"]; "104.130.1.110" -> "104.130.1.97"[label="36.78"]; "104.130.1.110" -> "104.130.27.176"[label="5.08"]; "104.130.1.110" -> "104.130.3.3"[label="17.71"]; "104.130.1.110" -> "104.130.17.17"[label="1.59"]; "104.130.1.110" -> "104.130.1.157"[label="1.94"]; "104.129.0.239" -> "104.129.0.108"[label="1.53"]; "104.129.0.239" -> "104.129.0.125"[label="0.00"]; "104.129.0.239" -> "104.129.0.95"[label="1.38"]; "104.129.0.239" -> "104.129.37.2"[label="2.55"]; "104.129.0.239" -> "104.129.0.8"[label="1.63"]; "104.129.0.239" -> "104.129.1.10"[label="53.87"]; "104.129.0.239" -> "104.129.1.17"[label="0.00"]; "104.129.0.110" -> "104.129.0.123"[label="0.00"]; "104.129.0.110" -> "104.129.0.219"[label="0.00"]; "104.129.0.110" -> "104.129.0.82"[label="7.90"]; "104.129.0.110" -> "104.129.37.2"[label="27.44"]; "104.129.0.110" -> "104.129.1.17"[label="110.59"]; "104.192.0.32" -> "104.192.192.1"[label="40.14"]; "104.192.0.32" -> "104.192.192.225"[label="2.20"]; "104.192.0.32" -> "104.192.0.39"[label="3.94"]; "104.192.0.32" -> "104.192.192.199"[label="4.01"]; "104.66.0.34" -> "104.66.0.30"[label="7.70"]; "104.66.0.34" -> "104.66.107.4"[label="3.33"]; "104.66.0.34" -> "104.66.0.249"[label="1.19"]; "104.66.0.34" -> "104.66.0.203"[label="1.82"]; "104.66.0.34" -> "104.66.77.4"[label="14.34"]; "104.192.192.225" -> "104.192.0.32"[label="3.41"]; "104.192.192.225" -> "104.192.192.99"[label="1.00"]; "104.192.192.225" -> "104.192.0.39"[label="9.97"]; "104.192.192.225" -> "104.130.1.65"[label="35.42"]; "104.192.192.225" -> "104.192.192.66"[label="1.00"]; "104.192.192.225" -> "104.192.192.199"[label="1.00"]; "104.192.192.225" -> "104.198.65.81"[label="3.31"]; "104.192.192.225" -> "104.192.192.33"[label="1.00"]; "104.192.192.225" -> "104.192.192.166"[label="1.00"]; "104.192.192.225" -> "104.192.192.177"[label="1.00"]; "104.192.192.225" -> "104.192.192.1"[label="1.00"]; "104.192.192.225" -> "104.130.100.100"[label="0.00"]; "104.192.192.225" -> "104.192.192.133"[label="1.00"]; "104.130.1.97" -> "104.130.17.17"[label="0.00"]; "104.130.1.97" -> "104.130.1.110"[label="17.82"]; "104.130.1.97" -> "104.130.27.176"[label="106.60"]; "104.130.1.97" -> "104.130.3.3"[label="0.00"]; "104.130.1.97" -> "104.130.1.157"[label="1.56"]; "104.192.192.99" -> "104.192.192.225"[label="1.00"]; "104.192.192.99" -> "104.192.0.52"[label="0.00"]; "104.192.192.99" -> "104.192.192.66"[label="1.00"]; "104.192.192.99" -> "104.192.192.199"[label="1.00"]; "104.192.192.99" -> "104.66.0.30"[label="7.28"]; "104.192.192.99" -> "104.192.192.33"[label="1.00"]; "104.192.192.99" -> "104.192.103.3"[label="4.18"]; "104.192.192.99" -> "104.192.192.166"[label="1.00"]; "104.192.192.99" -> "104.193.24.100"[label="3.64"]; "104.192.192.99" -> "104.192.192.177"[label="2.01"]; "104.192.192.99" -> "104.66.77.4"[label="4.33"]; "104.192.192.99" -> "104.66.0.201"[label="5.21"]; "104.192.192.99" -> "104.192.192.1"[label="1.00"]; "104.192.192.99" -> "104.192.192.133"[label="1.00"]; "104.0.7.100" -> "104.0.7.254"[label="2.68"]; "104.198.65.97" -> "104.130.77.5"[label="3.21"]; "104.198.65.97" -> "104.130.77.1"[label="3.98"]; "104.198.65.97" -> "104.130.1.66"[label="46.12"]; "104.198.65.97" -> "104.198.65.65"[label="1.46"]; "104.198.65.97" -> "104.130.77.78"[label="0.00"]; "104.192.0.38" -> "104.130.1.65"[label="4.36"]; "104.192.0.38" -> "104.12.1.6"[label="7.37"]; "104.130.10.111" -> "104.12.1.6"[label="2.50"]; "104.130.10.111" -> "104.131.25.14"[label="20.58"]; "104.192.0.39" -> "104.192.0.32"[label="4.61"]; "104.192.0.39" -> "104.192.192.225"[label="16.67"]; "104.66.0.58" -> "104.66.0.49"[label="21.25"]; "104.0.7.254" -> "104.131.9.1"[label="10.63"]; "104.0.7.254" -> "104.7.2.1"[label="56.06"]; "104.0.7.254" -> "104.23.0.2"[label="11.09"]; "104.0.7.254" -> "104.0.7.100"[label="2.58"]; "104.0.7.254" -> "104.69.0.69"[label="62.83"]; "104.0.7.254" -> "104.65.0.42"[label="10.92"]; "104.129.0.123" -> "104.129.0.110"[label="29.21"]; "104.129.0.123" -> "104.129.0.77"[label="22.83"]; "104.129.0.123" -> "104.129.0.161"[label="4.11"]; "104.129.0.123" -> "104.129.37.2"[label="36.86"]; "104.129.0.123" -> "104.129.0.8"[label="182.14"]; "104.129.0.123" -> "104.131.9.1"[label="37.81"]; "104.129.0.125" -> "104.129.0.239"[label="50.49"]; "104.129.0.125" -> "104.129.0.219"[label="14.83"]; "104.129.0.125" -> "104.129.0.95"[label="5.04"]; "104.129.0.125" -> "104.192.192.166"[label="270.94"]; "104.129.0.125" -> "104.129.0.8"[label="81.79"]; "104.129.0.125" -> "104.129.1.10"[label="6.36"]; "104.129.0.125" -> "104.129.1.11"[label="12.47"]; "104.129.0.125" -> "104.192.192.133"[label="0.00"]; "104.131.21.104" -> "104.131.21.101"[label="0.00"]; "104.131.21.104" -> "104.131.21.21"[label="3.36"]; "104.131.21.104" -> "104.131.21.1"[label="18.69"]; "104.202.53.1" -> "104.203.0.1"[label="2.18"]; "104.202.53.1" -> "104.192.192.66"[label="0.00"]; "104.202.53.1" -> "104.202.19.1"[label="1.34"]; "104.202.53.1" -> "104.192.192.33"[label="53.26"]; "104.202.53.1" -> "104.0.0.6"[label="9.92"]; "104.131.21.105" -> "104.131.21.21"[label="1.97"]; "104.131.21.105" -> "104.131.21.1"[label="7.72"]; "104.131.21.102" -> "104.131.21.101"[label="1.12"]; "104.131.21.102" -> "104.131.21.34"[label="1.24"]; "104.131.21.102" -> "104.131.21.21"[label="1.45"]; "104.131.21.102" -> "104.131.21.12"[label="1.12"]; "104.66.0.49" -> "104.66.0.58"[label="19.23"]; "104.66.0.49" -> "104.66.0.203"[label="3.58"]; "104.66.0.49" -> "104.192.192.133"[label="20.32"]; "104.131.21.101" -> "104.131.21.104"[label="0.00"]; "104.131.21.101" -> "104.131.21.102"[label="1.13"]; "104.131.21.101" -> "104.131.21.34"[label="1.10"]; "104.131.21.101" -> "104.131.21.21"[label="2.16"]; "104.131.21.101" -> "104.131.21.12"[label="1.23"]; "104.131.21.101" -> "104.131.21.1"[label="8.95"]; "104.192.0.52" -> "104.192.192.99"[label="0.00"]; "104.192.0.52" -> "104.192.192.66"[label="2.20"]; "104.192.0.52" -> "104.192.0.20"[label="2.83"]; "104.192.0.52" -> "104.192.192.33"[label="6.75"]; "104.192.0.52" -> "104.193.24.100"[label="57.95"]; "104.192.0.52" -> "104.192.0.75"[label="1.32"]; "104.131.0.245" -> "104.131.25.12"[label="1.12"]; "104.0.200.1" -> "104.12.0.225"[label="1.45"]; "104.0.200.1" -> "104.13.1.97"[label="2.80"]; "104.0.200.1" -> "104.12.0.105"[label="9.96"]; "104.0.200.1" -> "104.13.3.241"[label="5.86"]; "104.0.200.1" -> "104.12.9.89"[label="1.27"]; "104.0.200.1" -> "104.13.3.33"[label="1.14"]; "104.0.200.1" -> "104.12.0.183"[label="29.61"]; "104.0.200.1" -> "104.13.0.50"[label="3.03"]; "104.0.200.1" -> "104.13.3.57"[label="9.51"]; "104.0.200.1" -> "104.13.1.2"[label="14.77"]; "104.0.200.1" -> "104.12.0.8"[label="1.58"]; "104.0.200.1" -> "104.13.138.1"[label="3.66"]; "104.0.200.1" -> "104.13.0.17"[label="2.53"]; "104.0.200.1" -> "104.13.0.155"[label="33.29"]; "104.72.0.1" -> "104.202.19.1"[label="10.04"]; "104.131.0.74" -> "104.131.25.14"[label="2.56"]; "104.200.0.1" -> "104.200.0.10"[label="1.00"]; "104.192.103.109" -> "104.192.103.200"[label="35.65"]; "104.192.103.109" -> "104.192.99.103"[label="1.36"]; "104.192.103.109" -> "104.192.103.44"[label="3.73"]; "104.192.103.109" -> "104.192.192.133"[label="52.44"]; "104.203.0.1" -> "104.202.53.1"[label="2.09"]; "104.203.0.1" -> "104.202.19.1"[label="1.43"]; "104.130.77.5" -> "104.198.65.97"[label="4.47"]; "104.130.77.5" -> "104.130.77.1"[label="2.06"]; "104.130.77.5" -> "104.130.1.66"[label="23.06"]; "104.130.77.5" -> "104.130.77.79"[label="1.00"]; "104.130.77.5" -> "104.130.77.78"[label="1.00"]; "104.130.77.5" -> "104.130.77.77"[label="1.00"]; "104.201.0.3" -> "104.201.0.4"[label="1.47"]; "104.201.0.3" -> "104.0.0.6"[label="2.88"]; "104.130.1.73" -> "104.130.77.77"[label="45.16"]; "104.130.1.73" -> "104.130.1.67"[label="3.84"]; "104.130.1.73" -> "104.65.5.3"[label="185.79"]; "104.130.1.73" -> "104.131.34.1"[label="4.37"]; "104.130.1.73" -> "104.129.31.3"[label="5.23"]; "104.66.0.8" -> "104.66.0.46"[label="1.27"]; "104.66.0.8" -> "104.66.0.24"[label="1.37"]; "104.129.46.100" -> "104.129.0.77"[label="2.80"]; "104.129.46.100" -> "104.129.81.1"[label="1.54"]; "104.129.46.100" -> "104.129.18.1"[label="2.72"]; "104.12.0.192" -> "104.12.0.43"[label="106.60"]; "104.12.0.192" -> "104.12.0.136"[label="1.71"]; "104.129.0.77" -> "104.129.0.107"[label="1.93"]; "104.129.0.77" -> "104.129.0.123"[label="38.89"]; "104.129.0.77" -> "104.129.46.100"[label="2.80"]; "104.129.0.77" -> "104.129.81.1"[label="1.37"]; "104.129.0.77" -> "104.129.1.43"[label="2.07"]; "104.129.0.77" -> "104.129.1.44"[label="8.08"]; "104.0.4.200" -> "104.0.4.65"[label="22.31"]; "104.0.4.200" -> "104.0.4.161"[label="18.07"]; "104.0.4.200" -> "104.0.0.17"[label="1.01"]; "104.201.0.4" -> "104.201.0.3"[label="1.45"]; "104.198.65.73" -> "104.198.65.81"[label="1.27"]; "104.130.77.1" -> "104.198.65.97"[label="5.22"]; "104.130.77.1" -> "104.130.77.5"[label="1.61"]; "104.130.77.1" -> "104.130.77.79"[label="1.40"]; "104.130.77.1" -> "104.130.77.77"[label="2.06"]; "104.65.5.4" -> "104.65.5.3"[label="2.65"]; "104.65.5.4" -> "104.192.192.199"[label="5.45"]; "104.65.5.4" -> "104.192.192.166"[label="0.00"]; "104.130.1.67" -> "104.130.1.73"[label="3.15"]; "104.130.1.67" -> "104.130.1.66"[label="1.00"]; "104.130.1.67" -> "104.130.1.65"[label="1.00"]; "104.130.1.67" -> "104.0.4.65"[label="1.00"]; "104.130.1.67" -> "104.131.34.1"[label="2.87"]; "104.130.1.67" -> "104.131.9.2"[label="6.89"]; "104.130.1.67" -> "104.131.9.1"[label="38.64"]; "104.130.1.67" -> "104.131.10.2"[label="7.16"]; "104.130.1.67" -> "104.12.1.6"[label="56.30"]; "104.130.1.67" -> "104.131.9.6"[label="0.00"]; "104.130.1.67" -> "104.130.1.131"[label="5.37"]; "104.130.1.67" -> "104.130.1.6"[label="9.11"]; "104.130.1.67" -> "104.130.1.154"[label="0.00"]; "104.130.1.67" -> "104.129.1.28"[label="10.43"]; "104.130.1.67" -> "104.131.83.77"[label="34.30"]; "104.130.1.67" -> "104.129.31.3"[label="10.21"]; "104.130.1.67" -> "104.130.30.1"[label="3.85"]; "104.130.1.67" -> "104.130.30.3"[label="29.03"]; "104.130.1.67" -> "104.130.1.16"[label="2.55"]; "104.130.1.67" -> "104.130.30.9"[label="7.36"]; "104.192.2.2" -> "104.192.103.3"[label="1.13"]; "104.193.1.1" -> "104.0.3.81"[label="1.00"]; "104.130.1.66" -> "104.192.192.225"[label="0.00"]; "104.130.1.66" -> "104.198.65.97"[label="46.92"]; "104.130.1.66" -> "104.130.77.5"[label="14.45"]; "104.130.1.66" -> "104.130.1.67"[label="1.00"]; "104.130.1.66" -> "104.130.1.65"[label="1.00"]; "104.130.1.66" -> "104.0.4.65"[label="1.00"]; "104.130.1.66" -> "104.198.23.1"[label="92.63"]; "104.130.1.66" -> "104.130.1.45"[label="3.68"]; "104.130.1.66" -> "104.130.1.162"[label="2.84"]; "104.130.1.66" -> "104.130.77.79"[label="6.45"]; "104.130.1.66" -> "104.130.77.77"[label="3.46"]; "104.130.1.66" -> "104.130.100.100"[label="8.24"]; "104.130.1.66" -> "104.130.1.6"[label="1.84"]; "104.130.1.66" -> "104.135.0.1"[label="68.30"]; "104.130.1.66" -> "104.130.1.154"[label="1.00"]; "104.130.1.66" -> "104.130.30.1"[label="0.00"]; "104.200.0.10" -> "104.200.0.1"[label="1.00"]; "104.200.0.10" -> "104.192.192.33"[label="3.27"]; "104.192.192.66" -> "104.192.192.225"[label="1.00"]; "104.192.192.66" -> "104.192.192.99"[label="1.00"]; "104.192.192.66" -> "104.202.53.1"[label="23.69"]; "104.192.192.66" -> "104.192.0.52"[label="2.18"]; "104.192.192.66" -> "104.193.0.2"[label="1.81"]; "104.192.192.66" -> "104.192.192.199"[label="1.00"]; "104.192.192.66" -> "104.192.0.20"[label="1.44"]; "104.192.192.66" -> "104.192.192.33"[label="1.00"]; "104.192.192.66" -> "104.192.192.166"[label="1.00"]; "104.192.192.66" -> "104.193.24.100"[label="1.67"]; "104.192.192.66" -> "104.192.192.177"[label="2.01"]; "104.192.192.66" -> "104.192.192.1"[label="1.00"]; "104.192.192.66" -> "104.192.192.133"[label="1.00"]; "104.130.1.65" -> "104.192.192.225"[label="0.00"]; "104.130.1.65" -> "104.192.0.38"[label="4.60"]; "104.130.1.65" -> "104.130.1.67"[label="1.00"]; "104.130.1.65" -> "104.130.1.66"[label="1.00"]; "104.130.1.65" -> "104.0.4.65"[label="1.00"]; "104.130.1.65" -> "104.65.5.3"[label="19.52"]; "104.130.1.65" -> "104.192.192.199"[label="10.83"]; "104.130.1.65" -> "104.131.34.1"[label="371.57"]; "104.130.1.65" -> "104.130.77.77"[label="28.33"]; "104.130.1.65" -> "104.130.1.154"[label="1.00"]; "104.130.1.65" -> "104.130.30.1"[label="0.00"]; "104.131.0.192" -> "104.131.25.16"[label="1.95"]; "104.193.0.2" -> "104.192.192.66"[label="1.71"]; "104.13.0.73" -> "104.13.0.97"[label="3.81"]; "104.13.0.73" -> "104.13.0.71"[label="2.04"]; "104.13.0.73" -> "104.13.0.74"[label="1.36"]; "104.13.0.73" -> "104.13.0.38"[label="2.13"]; "104.13.0.73" -> "104.13.3.33"[label="1.00"]; "104.7.2.193" -> "104.7.2.65"[label="1.33"]; "104.7.2.65" -> "104.7.2.193"[label="1.11"]; "104.7.2.65" -> "104.7.2.1"[label="2.37"]; "104.131.0.71" -> "104.131.1.2"[label="8.56"]; "104.0.4.65" -> "104.0.4.200"[label="21.96"]; "104.0.4.65" -> "104.130.1.67"[label="1.00"]; "104.0.4.65" -> "104.130.1.66"[label="1.00"]; "104.0.4.65" -> "104.130.1.65"[label="1.00"]; "104.0.4.65" -> "104.0.4.161"[label="28.26"]; "104.0.4.65" -> "104.130.1.154"[label="1.00"]; "104.0.4.65" -> "104.0.0.17"[label="2.58"]; "104.198.65.65" -> "104.198.65.97"[label="1.46"]; "104.192.192.199" -> "104.192.0.32"[label="18.96"]; "104.192.192.199" -> "104.192.192.225"[label="1.00"]; "104.192.192.199" -> "104.192.192.99"[label="1.00"]; "104.192.192.199" -> "104.65.5.4"[label="5.19"]; "104.192.192.199" -> "104.130.1.65"[label="19.79"]; "104.192.192.199" -> "104.192.192.66"[label="1.00"]; "104.192.192.199" -> "104.131.34.1"[label="13.05"]; "104.192.192.199" -> "104.192.192.33"[label="1.00"]; "104.192.192.199" -> "104.192.192.166"[label="1.00"]; "104.192.192.199" -> "104.192.192.177"[label="1.00"]; "104.192.192.199" -> "104.192.192.1"[label="1.00"]; "104.192.192.199" -> "104.192.192.133"[label="1.00"]; "104.192.192.199" -> "104.135.0.1"[label="21.38"]; "104.129.1.71" -> "104.129.37.2"[label="8.49"]; "104.129.1.71" -> "104.129.1.18"[label="1.57"]; "104.65.5.3" -> "104.130.1.73"[label="86.70"]; "104.65.5.3" -> "104.65.5.4"[label="2.45"]; "104.65.5.3" -> "104.130.1.65"[label="18.21"]; "104.65.5.3" -> "104.12.1.6"[label="17.18"]; "104.202.19.1" -> "104.202.53.1"[label="1.34"]; "104.202.19.1" -> "104.202.0.2"[label="3.58"]; "104.202.19.1" -> "104.72.0.1"[label="8.62"]; "104.202.19.1" -> "104.203.0.1"[label="1.76"]; "104.198.65.94" -> "104.198.65.81"[label="1.00"]; "104.129.0.219" -> "104.129.0.125"[label="73.72"]; "104.129.0.219" -> "104.129.0.110"[label="1.40"]; "104.129.0.219" -> "104.129.0.82"[label="4.52"]; "104.66.0.24" -> "104.66.0.46"[label="1.44"]; "104.66.0.24" -> "104.66.0.8"[label="1.36"]; "104.66.0.24" -> "104.130.1.154"[label="1.34"]; "104.66.0.30" -> "104.66.0.34"[label="8.03"]; "104.66.0.30" -> "104.192.192.99"[label="7.52"]; "104.66.0.30" -> "104.66.107.4"[label="2.34"]; "104.66.0.30" -> "104.192.103.3"[label="1.52"]; "104.66.0.30" -> "104.192.192.166"[label="0.00"]; "104.66.0.30" -> "104.66.0.203"[label="0.00"]; "104.66.0.30" -> "104.66.77.4"[label="1.66"]; "104.66.0.30" -> "104.192.192.133"[label="3.76"]; "104.129.0.95" -> "104.129.0.108"[label="1.20"]; "104.129.0.95" -> "104.129.0.239"[label="1.42"]; "104.129.0.95" -> "104.129.0.125"[label="5.86"]; "104.129.0.95" -> "104.129.0.8"[label="1.86"]; "104.129.0.95" -> "104.129.1.10"[label="43.01"]; "104.66.0.18" -> "104.66.24.111"[label="4.11"]; "104.198.23.1" -> "104.130.1.66"[label="69.47"]; "104.129.81.1" -> "104.129.0.107"[label="2.38"]; "104.129.81.1" -> "104.129.103.1"[label="8.87"]; "104.129.81.1" -> "104.129.46.100"[label="1.65"]; "104.129.81.1" -> "104.129.0.77"[label="1.40"]; "104.129.81.1" -> "104.129.1.43"[label="2.02"]; "104.129.81.1" -> "104.129.1.44"[label="2.19"]; "104.129.81.1" -> "104.129.0.138"[label="26.27"]; "104.0.3.81" -> "104.193.1.1"[label="1.00"]; "104.0.3.81" -> "104.0.3.13"[label="28.00"]; "104.0.3.81" -> "104.0.0.5"[label="14.14"]; "104.192.0.20" -> "104.192.0.52"[label="3.05"]; "104.192.0.20" -> "104.192.192.66"[label="1.44"]; "104.192.0.20" -> "104.192.192.33"[label="1.57"]; "104.192.0.20" -> "104.192.192.1"[label="5.49"]; "104.12.0.89" -> "104.12.0.73"[label="2.00"]; "104.12.0.89" -> "104.13.3.33"[label="0.00"]; "104.12.0.89" -> "104.13.0.189"[label="0.00"]; "104.198.65.81" -> "104.192.192.225"[label="3.28"]; "104.198.65.81" -> "104.198.65.73"[label="1.21"]; "104.198.65.81" -> "104.198.65.94"[label="1.00"]; "104.198.65.81" -> "104.192.192.1"[label="3.41"]; "104.130.27.176" -> "104.130.1.110"[label="5.05"]; "104.130.27.176" -> "104.130.1.97"[label="0.00"]; "104.130.27.176" -> "104.130.17.17"[label="42.03"]; "104.130.27.176" -> "104.130.3.3"[label="106.25"]; "104.130.27.176" -> "104.130.1.157"[label="30.79"]; "104.130.27.176" -> "104.130.1.10"[label="0.00"]; "104.129.44.7" -> "104.131.0.147"[label="6.88"]; "104.129.44.7" -> "104.131.0.148"[label="4.10"]; "104.129.1.43" -> "104.129.0.107"[label="1.40"]; "104.129.1.43" -> "104.129.46.100"[label="46.45"]; "104.129.1.43" -> "104.129.0.77"[label="1.92"]; "104.129.1.43" -> "104.129.81.1"[label="2.08"]; "104.129.1.43" -> "104.129.1.44"[label="1.21"]; "104.129.1.43" -> "104.129.6.1"[label="2.23"]; "104.161.0.10" -> "104.161.0.1"[label="1.70"]; "104.129.1.44" -> "104.129.0.107"[label="1.04"]; "104.129.1.44" -> "104.129.81.1"[label="2.19"]; "104.129.1.44" -> "104.129.1.43"[label="1.37"]; "104.66.107.4" -> "104.66.0.34"[label="6.90"]; "104.66.107.4" -> "104.66.0.30"[label="4.26"]; "104.66.107.4" -> "104.66.0.203"[label="1.97"]; "104.66.107.4" -> "104.66.77.4"[label="1.00"]; "104.66.107.4" -> "104.66.0.201"[label="10.74"]; "104.130.1.45" -> "104.130.1.66"[label="4.04"]; "104.129.0.161" -> "104.129.0.123"[label="2.03"]; "104.161.0.1" -> "104.161.0.10"[label="1.72"]; "104.161.0.1" -> "104.161.0.2"[label="2.30"]; "104.161.0.1" -> "104.0.4.161"[label="1.00"]; "104.131.34.1" -> "104.130.1.73"[label="3.28"]; "104.131.34.1" -> "104.130.1.67"[label="2.84"]; "104.131.34.1" -> "104.130.1.65"[label="0.00"]; "104.131.34.1" -> "104.192.192.199"[label="25.01"]; "104.131.34.1" -> "104.192.192.166"[label="591.14"]; "104.131.34.1" -> "104.131.21.34"[label="49.26"]; "104.131.34.1" -> "104.131.9.6"[label="9.11"]; "104.131.34.1" -> "104.130.1.131"[label="1.79"]; "104.131.34.1" -> "104.131.21.21"[label="11.73"]; "104.131.34.1" -> "104.130.17.20"[label="19.32"]; "104.131.34.1" -> "104.130.1.16"[label="21.85"]; "104.130.1.162" -> "104.130.1.66"[label="3.10"]; "104.192.192.33" -> "104.192.192.225"[label="1.00"]; "104.192.192.33" -> "104.192.192.99"[label="1.00"]; "104.192.192.33" -> "104.202.53.1"[label="54.73"]; "104.192.192.33" -> "104.192.0.52"[label="6.75"]; "104.192.192.33" -> "104.200.0.10"[label="2.20"]; "104.192.192.33" -> "104.192.192.66"[label="1.00"]; "104.192.192.33" -> "104.192.192.199"[label="1.00"]; "104.192.192.33" -> "104.192.0.20"[label="1.54"]; "104.192.192.33" -> "104.192.192.166"[label="1.00"]; "104.192.192.33" -> "104.193.24.100"[label="4.40"]; "104.192.192.33" -> "104.192.192.177"[label="1.00"]; "104.192.192.33" -> "104.192.192.1"[label="1.00"]; "104.192.192.33" -> "104.192.192.133"[label="1.00"]; "104.161.0.2" -> "104.161.0.1"[label="2.37"]; "104.129.0.165" -> "104.129.105.2"[label="1.63"]; "104.129.0.165" -> "104.129.108.1"[label="5.73"]; "104.129.0.165" -> "104.129.105.10"[label="1.40"]; "104.129.0.165" -> "104.129.103.1"[label="1.08"]; "104.129.0.165" -> "104.129.103.19"[label="1.44"]; "104.129.0.165" -> "104.129.0.91"[label="1.21"]; "104.192.103.3" -> "104.192.192.99"[label="4.57"]; "104.192.103.3" -> "104.192.2.2"[label="1.13"]; "104.192.103.3" -> "104.66.0.30"[label="1.50"]; "104.192.103.3" -> "104.66.0.203"[label="0.00"]; "104.192.103.3" -> "104.66.0.201"[label="1.24"]; "104.192.103.3" -> "104.66.77.4"[label="1.44"]; "104.192.103.3" -> "104.192.192.133"[label="2.93"]; "104.0.4.161" -> "104.0.4.200"[label="18.38"]; "104.0.4.161" -> "104.0.4.65"[label="28.26"]; "104.0.4.161" -> "104.161.0.1"[label="1.00"]; "104.0.4.161" -> "104.0.0.17"[label="1.11"]; "104.129.37.2" -> "104.129.0.234"[label="2.01"]; "104.129.37.2" -> "104.129.0.239"[label="2.65"]; "104.129.37.2" -> "104.129.0.110"[label="14.80"]; "104.129.37.2" -> "104.129.0.123"[label="22.94"]; "104.129.37.2" -> "104.129.1.71"[label="6.75"]; "104.129.37.2" -> "104.129.0.8"[label="13.47"]; "104.129.37.2" -> "104.129.1.10"[label="24.10"]; "104.129.37.2" -> "104.129.1.1"[label="3.04"]; "104.129.37.2" -> "104.129.1.17"[label="3.29"]; "104.129.37.2" -> "104.129.1.18"[label="25.01"]; "104.192.192.166" -> "104.192.192.66"[label="1.00"]; "104.192.192.166" -> "104.192.192.199"[label="1.00"]; "104.192.192.166" -> "104.66.0.30"[label="0.00"]; "104.192.192.166" -> "104.192.192.33"[label="1.00"]; "104.192.192.166" -> "104.192.192.177"[label="2.01"]; "104.192.192.166" -> "104.66.77.4"[label="151.57"]; "104.192.192.166" -> "104.66.0.201"[label="2.00"]; "104.192.192.166" -> "104.192.192.1"[label="1.00"]; "104.192.192.166" -> "104.192.192.133"[label="1.00"]; "104.129.0.187" -> "104.129.1.28"[label="30.39"]; "104.131.0.184" -> "104.131.131.3"[label="1.60"]; "104.66.0.249" -> "104.66.0.34"[label="1.17"]; "104.66.0.249" -> "104.66.0.23"[label="2.51"]; "104.66.0.249" -> "104.66.0.203"[label="1.74"]; "104.66.0.249" -> "104.66.0.201"[label="3.02"]; "104.12.0.176" -> "104.5.0.222"[label="33.87"]; "104.12.0.176" -> "104.12.0.1"[label="1.47"]; "104.12.0.176" -> "104.12.1.11"[label="6.06"]; "104.12.0.176" -> "104.12.0.19"[label="7.31"]; "104.12.0.176" -> "104.12.0.30"[label="1.52"]; "104.193.24.100" -> "104.192.192.99"[label="3.35"]; "104.193.24.100" -> "104.192.0.52"[label="57.95"]; "104.193.24.100" -> "104.192.192.66"[label="1.73"]; "104.193.24.100" -> "104.192.192.33"[label="4.34"]; "104.193.24.100" -> "104.192.192.1"[label="0.00"]; "104.192.192.177" -> "104.192.192.225"[label="1.00"]; "104.192.192.177" -> "104.192.192.99"[label="2.01"]; "104.192.192.177" -> "104.192.192.66"[label="2.01"]; "104.192.192.177" -> "104.192.192.199"[label="1.00"]; "104.192.192.177" -> "104.192.192.33"[label="1.00"]; "104.192.192.177" -> "104.192.192.166"[label="2.01"]; "104.192.192.177" -> "104.192.192.178"[label="1.03"]; "104.192.192.177" -> "104.192.192.1"[label="1.00"]; "104.192.192.177" -> "104.192.192.133"[label="2.01"]; "104.192.192.178" -> "104.192.192.177"[label="1.04"]; "104.192.192.178" -> "104.129.29.29"[label="1.00"]; "104.131.0.55" -> "104.131.131.1"[label="8.17"]; "104.131.0.55" -> "104.131.0.3"[label="1.78"]; "104.131.21.34" -> "104.131.21.102"[label="1.24"]; "104.131.21.34" -> "104.131.21.101"[label="1.11"]; "104.131.21.34" -> "104.131.34.1"[label="0.00"]; "104.131.21.34" -> "104.131.21.21"[label="1.84"]; "104.131.21.34" -> "104.131.21.12"[label="2.25"]; "104.131.21.34" -> "104.131.21.1"[label="12.90"]; "104.66.24.111" -> "104.66.0.18"[label="3.51"]; "104.66.24.111" -> "104.0.3.13"[label="1.00"]; "104.130.1.52" -> "104.130.17.17"[label="42.50"]; "104.131.10.1" -> "104.131.10.2"[label="0.00"]; "104.131.9.2" -> "104.130.1.67"[label="12.68"]; "104.131.9.2" -> "104.130.1.65"[label="136.61"]; "104.131.9.2" -> "104.129.0.138"[label="0.00"]; "104.131.9.2" -> "104.131.9.1"[label="1.00"]; "104.131.9.2" -> "104.131.9.6"[label="12.39"]; "104.131.9.2" -> "104.131.9.4"[label="1.00"]; "104.131.9.2" -> "104.131.9.5"[label="30.10"]; "104.131.9.2" -> "104.131.0.147"[label="30.53"]; "104.131.9.2" -> "104.131.0.148"[label="26.22"]; "104.131.9.2" -> "104.131.21.1"[label="11.87"]; "104.129.0.8" -> "104.129.0.108"[label="1.65"]; "104.129.0.8" -> "104.129.0.239"[label="2.31"]; "104.129.0.8" -> "104.129.0.123"[label="38.16"]; "104.129.0.8" -> "104.129.0.125"[label="216.03"]; "104.129.0.8" -> "104.129.0.95"[label="2.15"]; "104.129.0.8" -> "104.129.37.2"[label="19.35"]; "104.129.0.8" -> "104.129.1.17"[label="37.81"]; "104.129.0.8" -> "104.129.1.10"[label="0.00"]; "104.66.0.203" -> "104.66.0.34"[label="1.88"]; "104.66.0.203" -> "104.66.0.49"[label="3.41"]; "104.66.0.203" -> "104.66.0.30"[label="1.81"]; "104.66.0.203" -> "104.66.107.4"[label="1.54"]; "104.66.0.203" -> "104.192.103.3"[label="24.86"]; "104.66.0.203" -> "104.66.0.249"[label="1.67"]; "104.66.0.203" -> "104.66.0.201"[label="1.00"]; "104.66.0.203" -> "104.66.77.4"[label="1.67"]; "104.66.0.203" -> "104.66.68.16"[label="5.82"]; "104.130.1.10" -> "104.130.1.14"[label="1.00"]; "104.130.1.10" -> "104.136.12.5"[label="3.05"]; "104.130.1.10" -> "104.130.3.3"[label="10.90"]; "104.130.1.10" -> "104.130.17.17"[label="3.71"]; "104.130.1.10" -> "104.130.1.16"[label="1.04"]; "104.129.1.10" -> "104.129.0.239"[label="57.95"]; "104.129.1.10" -> "104.129.0.125"[label="5.65"]; "104.129.1.10" -> "104.129.0.95"[label="27.37"]; "104.129.1.10" -> "104.129.37.2"[label="25.16"]; "104.129.1.10" -> "104.129.0.8"[label="11.70"]; "104.131.25.16" -> "104.131.0.192"[label="2.09"]; "104.131.25.16" -> "104.130.1.14"[label="2.63"]; "104.131.25.16" -> "104.131.25.14"[label="1.00"]; "104.131.25.16" -> "104.131.25.12"[label="1.00"]; "104.192.103.44" -> "104.192.103.200"[label="1.46"]; "104.192.103.44" -> "104.192.103.109"[label="6.27"]; "104.192.103.44" -> "104.192.99.103"[label="1.68"]; "104.129.0.138" -> "104.129.0.77"[label="24.86"]; "104.129.0.138" -> "104.129.81.1"[label="18.21"]; "104.129.0.138" -> "104.130.1.10"[label="0.00"]; "104.129.0.138" -> "104.131.21.1"[label="0.00"]; "104.137.0.2" -> "104.12.1.6"[label="1.56"]; "104.12.1.6" -> "104.192.0.38"[label="14.47"]; "104.12.1.6" -> "104.130.10.111"[label="2.47"]; "104.12.1.6" -> "104.130.1.67"[label="36.86"]; "104.12.1.6" -> "104.65.5.3"[label="19.45"]; "104.12.1.6" -> "104.137.0.2"[label="1.59"]; "104.12.1.6" -> "104.6.0.6"[label="13.88"]; "104.12.1.6" -> "104.130.1.131"[label="4.40"]; "104.192.0.75" -> "104.192.0.52"[label="1.27"]; "104.192.0.75" -> "104.192.192.33"[label="30.39"]; "104.131.9.1" -> "104.0.7.254"[label="10.20"]; "104.131.9.1" -> "104.129.0.123"[label="21.00"]; "104.131.9.1" -> "104.130.1.67"[label="61.34"]; "104.131.9.1" -> "104.131.9.2"[label="1.00"]; "104.131.9.1" -> "104.131.9.4"[label="1.00"]; "104.131.9.1" -> "104.131.9.5"[label="2.01"]; "104.131.9.1" -> "104.131.0.147"[label="14.93"]; "104.131.9.1" -> "104.131.0.148"[label="295.57"]; "104.131.9.1" -> "104.131.21.1"[label="5.92"]; "104.66.0.201" -> "104.192.192.99"[label="4.67"]; "104.66.0.201" -> "104.66.107.4"[label="4.12"]; "104.66.0.201" -> "104.192.103.3"[label="1.26"]; "104.66.0.201" -> "104.192.192.166"[label="2.12"]; "104.66.0.201" -> "104.66.0.249"[label="3.51"]; "104.66.0.201" -> "104.66.0.203"[label="1.00"]; "104.66.0.201" -> "104.66.77.4"[label="2.28"]; "104.66.0.201" -> "104.192.192.133"[label="1.96"]; "104.66.77.4" -> "104.66.0.34"[label="16.13"]; "104.66.77.4" -> "104.192.192.99"[label="3.63"]; "104.66.77.4" -> "104.66.0.30"[label="1.60"]; "104.66.77.4" -> "104.66.107.4"[label="1.00"]; "104.66.77.4" -> "104.192.103.3"[label="1.43"]; "104.66.77.4" -> "104.192.192.166"[label="250.10"]; "104.66.77.4" -> "104.66.0.203"[label="0.00"]; "104.66.77.4" -> "104.66.0.201"[label="2.32"]; "104.66.77.4" -> "104.192.192.133"[label="3.31"]; "104.66.77.4" -> "104.66.68.16"[label="4.61"]; "104.131.10.2" -> "104.130.1.67"[label="13.72"]; "104.131.10.2" -> "104.131.10.1"[label="1.42"]; "104.131.10.2" -> "104.131.83.77"[label="1.00"]; "104.131.9.6" -> "104.130.1.67"[label="8.46"]; "104.131.9.6" -> "104.131.34.1"[label="15.56"]; "104.131.9.6" -> "104.131.9.2"[label="12.39"]; "104.131.9.6" -> "104.131.0.147"[label="1.86"]; "104.131.9.6" -> "104.131.21.1"[label="31.64"]; "104.131.9.6" -> "104.131.0.148"[label="216.75"]; "104.136.12.9" -> "104.136.22.22"[label="1.34"]; "104.136.12.9" -> "104.136.12.7"[label="1.00"]; "104.136.12.9" -> "104.136.12.30"[label="1.00"]; "104.130.1.14" -> "104.130.1.10"[label="1.00"]; "104.130.1.14" -> "104.131.25.16"[label="2.89"]; "104.130.1.14" -> "104.130.1.16"[label="1.04"]; "104.0.3.13" -> "104.0.3.81"[label="28.00"]; "104.0.3.13" -> "104.66.24.111"[label="1.00"]; "104.0.3.13" -> "104.0.0.5"[label="1.29"]; "104.131.9.4" -> "104.131.9.2"[label="1.00"]; "104.131.9.4" -> "104.131.9.1"[label="1.00"]; "104.131.9.4" -> "104.131.9.5"[label="5.17"]; "104.131.9.5" -> "104.131.9.2"[label="33.18"]; "104.131.9.5" -> "104.131.9.1"[label="2.21"]; "104.131.9.5" -> "104.131.9.4"[label="8.96"]; "104.136.0.7" -> "104.136.22.22"[label="1.25"]; "104.6.0.6" -> "104.12.1.6"[label="18.75"]; "104.6.0.6" -> "104.6.0.11"[label="4.31"]; "104.6.0.6" -> "104.8.0.24"[label="20.37"]; "104.69.0.69" -> "104.0.7.254"[label="57.80"]; "104.131.0.3" -> "104.131.131.1"[label="1.68"]; "104.131.0.3" -> "104.131.131.3"[label="2.46"]; "104.131.0.3" -> "104.131.0.55"[label="1.88"]; "104.130.77.79" -> "104.130.77.5"[label="1.00"]; "104.130.77.79" -> "104.130.77.1"[label="1.43"]; "104.130.77.79" -> "104.130.1.66"[label="5.45"]; "104.130.77.79" -> "104.130.77.232"[label="2.83"]; "104.130.77.79" -> "104.130.77.78"[label="1.00"]; "104.130.77.79" -> "104.130.77.77"[label="1.00"]; "104.131.1.2" -> "104.131.131.3"[label="0.00"]; "104.131.1.2" -> "104.131.83.77"[label="77.41"]; "104.130.1.131" -> "104.130.1.67"[label="4.76"]; "104.130.1.131" -> "104.131.34.1"[label="2.15"]; "104.130.1.131" -> "104.12.1.6"[label="3.72"]; "104.130.1.131" -> "104.130.1.16"[label="0.00"]; "104.129.1.1" -> "104.129.37.2"[label="3.52"]; "104.129.1.1" -> "104.0.0.30"[label="1.00"]; "104.129.1.1" -> "104.129.1.17"[label="2.69"]; "104.129.1.1" -> "104.0.0.17"[label="1.00"]; "104.130.77.78" -> "104.130.77.79"[label="1.00"]; "104.130.77.78" -> "104.130.77.77"[label="1.00"]; "104.130.77.78" -> "104.130.77.5"[label="1.00"]; "104.192.192.1" -> "104.192.0.32"[label="197.05"]; "104.192.192.1" -> "104.192.192.225"[label="1.00"]; "104.192.192.1" -> "104.192.192.99"[label="1.00"]; "104.192.192.1" -> "104.192.192.66"[label="1.00"]; "104.192.192.1" -> "104.192.192.199"[label="1.00"]; "104.192.192.1" -> "104.192.0.20"[label="4.79"]; "104.192.192.1" -> "104.198.65.81"[label="3.16"]; "104.192.192.1" -> "104.192.192.33"[label="1.00"]; "104.192.192.1" -> "104.192.192.166"[label="1.00"]; "104.192.192.1" -> "104.192.192.177"[label="1.00"]; "104.192.192.1" -> "104.192.192.133"[label="1.00"]; "104.129.29.29" -> "104.192.192.178"[label="1.00"]; "104.136.12.5" -> "104.130.1.10"[label="1.43"]; "104.136.12.5" -> "104.130.3.3"[label="2167.50"]; "104.136.12.5" -> "104.130.5.5"[label="1.17"]; "104.136.12.5" -> "104.130.17.17"[label="7.52"]; "104.130.17.17" -> "104.130.1.110"[label="3.94"]; "104.130.17.17" -> "104.130.1.97"[label="0.00"]; "104.130.17.17" -> "104.130.27.176"[label="76.68"]; "104.130.17.17" -> "104.130.1.52"[label="67.17"]; "104.130.17.17" -> "104.130.1.10"[label="57.70"]; "104.130.17.17" -> "104.136.12.5"[label="7.40"]; "104.130.17.17" -> "104.130.3.3"[label="3.41"]; "104.130.17.17" -> "104.130.1.157"[label="23.66"]; "104.130.17.17" -> "104.130.1.16"[label="903.13"]; "104.130.3.3" -> "104.130.1.110"[label="17.71"]; "104.130.3.3" -> "104.130.1.97"[label="0.00"]; "104.130.3.3" -> "104.130.27.176"[label="102.24"]; "104.130.3.3" -> "104.130.1.10"[label="12.55"]; "104.130.3.3" -> "104.136.12.5"[label="1625.63"]; "104.130.3.3" -> "104.130.17.17"[label="8.91"]; "104.130.3.3" -> "104.130.1.157"[label="0.00"]; "104.131.131.2" -> "104.131.131.3"[label="1.61"]; "104.130.77.77" -> "104.130.77.232"[label="5.06"]; "104.130.77.77" -> "104.130.1.73"[label="35.53"]; "104.130.77.77" -> "104.130.77.5"[label="1.00"]; "104.130.77.77" -> "104.130.77.1"[label="2.87"]; "104.130.77.77" -> "104.130.1.67"[label="0.00"]; "104.130.77.77" -> "104.130.1.66"[label="3.63"]; "104.130.77.77" -> "104.130.1.65"[label="12.05"]; "104.130.77.77" -> "104.130.77.79"[label="1.00"]; "104.130.77.77" -> "104.130.77.78"[label="1.00"]; "104.130.100.100" -> "104.192.192.225"[label="0.00"]; "104.130.100.100" -> "104.130.1.66"[label="13.58"]; "104.130.5.5" -> "104.136.12.5"[label="1.25"]; "104.132.22.17" -> "104.132.24.12"[label="1.13"]; "104.131.13.13" -> "104.131.21.1"[label="16.13"]; "104.136.12.7" -> "104.136.12.9"[label="1.00"]; "104.136.12.7" -> "104.136.12.30"[label="1.00"]; "104.136.12.7" -> "104.131.25.12"[label="1.59"]; "104.131.131.3" -> "104.131.0.42"[label="2.13"]; "104.131.131.3" -> "104.131.0.184"[label="1.65"]; "104.131.131.3" -> "104.131.1.2"[label="0.00"]; "104.131.131.3" -> "104.131.0.3"[label="2.35"]; "104.131.131.3" -> "104.131.131.2"[label="1.56"]; "104.131.131.3" -> "104.131.83.77"[label="6.35"]; "104.131.131.3" -> "104.131.0.146"[label="13.09"]; "104.131.21.21" -> "104.131.21.104"[label="3.27"]; "104.131.21.21" -> "104.131.21.105"[label="1.66"]; "104.131.21.21" -> "104.131.21.102"[label="1.19"]; "104.131.21.21" -> "104.131.21.101"[label="1.35"]; "104.131.21.21" -> "104.131.34.1"[label="18.21"]; "104.131.21.21" -> "104.131.21.34"[label="1.34"]; "104.131.21.21" -> "104.131.21.12"[label="1.21"]; "104.131.21.21" -> "104.131.21.1"[label="8.73"]; "104.7.2.1" -> "104.0.7.254"[label="57.95"]; "104.7.2.1" -> "104.7.2.65"[label="3.70"]; "104.130.1.6" -> "104.130.1.67"[label="8.32"]; "104.130.1.6" -> "104.130.1.66"[label="2.09"]; "104.0.0.5" -> "104.0.3.81"[label="13.23"]; "104.0.0.5" -> "104.0.3.13"[label="1.25"]; "104.0.0.5" -> "104.0.0.6"[label="1.00"]; "104.0.0.5" -> "104.0.0.17"[label="1.08"]; "104.192.192.133" -> "104.192.192.225"[label="1.00"]; "104.192.192.133" -> "104.192.192.99"[label="1.00"]; "104.192.192.133" -> "104.129.0.125"[label="285.20"]; "104.192.192.133" -> "104.66.0.49"[label="14.77"]; "104.192.192.133" -> "104.192.103.109"[label="0.00"]; "104.192.192.133" -> "104.192.192.66"[label="1.00"]; "104.192.192.133" -> "104.192.192.199"[label="1.00"]; "104.192.192.133" -> "104.66.0.30"[label="4.28"]; "104.192.192.133" -> "104.192.192.33"[label="1.00"]; "104.192.192.133" -> "104.192.103.3"[label="2.55"]; "104.192.192.133" -> "104.192.192.166"[label="1.00"]; "104.192.192.133" -> "104.192.192.177"[label="2.01"]; "104.192.192.133" -> "104.192.0.74"[label="0.00"]; "104.192.192.133" -> "104.66.77.4"[label="3.21"]; "104.192.192.133" -> "104.66.0.201"[label="1.81"]; "104.192.192.133" -> "104.192.192.1"[label="1.00"]; "104.192.192.133" -> "104.192.99.160"[label="21.28"]; "104.10.2.14" -> "104.10.2.34"[label="1.00"]; "104.10.2.14" -> "104.6.0.11"[label="1.39"]; "104.10.2.14" -> "104.10.2.24"[label="1.00"]; "104.135.0.1" -> "104.192.192.225"[label="36.86"]; "104.135.0.1" -> "104.130.1.66"[label="65.68"]; "104.129.6.1" -> "104.129.1.43"[label="2.29"]; "104.0.0.6" -> "104.65.0.42"[label="1.37"]; "104.0.0.6" -> "104.202.53.1"[label="10.01"]; "104.0.0.6" -> "104.201.0.3"[label="3.09"]; "104.0.0.6" -> "104.201.0.4"[label="1.16"]; "104.0.0.6" -> "104.202.19.1"[label="1.66"]; "104.0.0.6" -> "104.0.0.5"[label="1.00"]; "104.132.0.3" -> "104.132.24.7"[label="90.31"]; "104.132.0.3" -> "104.132.24.3"[label="22.50"]; "104.130.17.20" -> "104.131.34.1"[label="24.19"]; "104.130.17.20" -> "104.130.1.16"[label="4.98"]; "104.12.0.20" -> "104.12.0.200"[label="361.25"]; "104.12.0.20" -> "104.12.34.6"[label="2.33"]; "104.12.0.20" -> "104.13.3.33"[label="1.06"]; "104.12.0.20" -> "104.12.0.46"[label="1.32"]; "104.12.0.20" -> "104.12.0.43"[label="0.00"]; "104.12.0.20" -> "104.13.0.50"[label="137.47"]; "104.132.24.4" -> "104.132.24.7"[label="1.06"]; "104.132.24.4" -> "104.132.24.1"[label="1.14"]; "104.132.24.4" -> "104.132.24.2"[label="2.80"]; "104.132.24.4" -> "104.132.24.3"[label="1.48"]; "104.132.24.4" -> "104.132.24.8"[label="1.16"]; "104.132.24.4" -> "104.132.24.9"[label="11.35"]; "104.132.24.5" -> "104.132.24.1"[label="2.61"]; "104.132.24.5" -> "104.132.24.2"[label="3.97"]; "104.132.24.5" -> "104.132.24.3"[label="1.43"]; "104.132.24.5" -> "104.132.24.9"[label="117.80"]; "104.130.1.154" -> "104.130.1.67"[label="1.00"]; "104.130.1.154" -> "104.130.1.66"[label="1.00"]; "104.130.1.154" -> "104.130.1.65"[label="1.00"]; "104.130.1.154" -> "104.0.4.65"[label="1.00"]; "104.130.1.154" -> "104.66.0.24"[label="1.38"]; "104.136.12.30" -> "104.132.24.1"[label="1.02"]; "104.136.12.30" -> "104.136.12.7"[label="1.00"]; "104.136.12.30" -> "104.136.12.9"[label="1.00"]; "104.136.12.30" -> "104.136.22.22"[label="1.58"]; "104.131.21.12" -> "104.131.21.34"[label="1.39"]; "104.131.21.12" -> "104.131.21.21"[label="1.14"]; "104.131.21.12" -> "104.131.21.1"[label="17.31"]; "104.131.21.12" -> "104.131.21.102"[label="1.05"]; "104.131.21.12" -> "104.131.21.101"[label="1.06"]; "104.132.24.7" -> "104.132.0.3"[label="197.05"]; "104.132.24.7" -> "104.132.24.4"[label="1.10"]; "104.132.24.7" -> "104.132.24.1"[label="2.27"]; "104.132.24.7" -> "104.132.24.2"[label="14.99"]; "104.132.24.7" -> "104.132.24.9"[label="11.87"]; "104.129.1.28" -> "104.130.1.67"[label="5.85"]; "104.129.1.28" -> "104.129.0.187"[label="61.34"]; "104.132.24.1" -> "104.132.24.4"[label="1.32"]; "104.132.24.1" -> "104.132.24.5"[label="15.18"]; "104.132.24.1" -> "104.136.12.30"[label="1.02"]; "104.132.24.1" -> "104.132.24.7"[label="2.07"]; "104.132.24.1" -> "104.132.24.3"[label="1.63"]; "104.132.24.1" -> "104.132.24.8"[label="1.16"]; "104.132.24.1" -> "104.132.24.9"[label="1.07"]; "104.130.30.1" -> "104.130.1.67"[label="4.03"]; "104.130.30.1" -> "104.130.30.3"[label="1.58"]; "104.130.30.1" -> "104.130.30.9"[label="1.36"]; "104.129.31.3" -> "104.130.1.73"[label="4.98"]; "104.129.31.3" -> "104.129.31.14"[label="1.16"]; "104.0.0.29" -> "104.0.0.30"[label="1.30"]; "104.131.83.77" -> "104.130.1.67"[label="56.30"]; "104.131.83.77" -> "104.131.10.2"[label="1.00"]; "104.131.83.77" -> "104.131.1.2"[label="32.48"]; "104.131.83.77" -> "104.131.131.1"[label="22.12"]; "104.131.83.77" -> "104.131.131.3"[label="8.04"]; "104.0.0.30" -> "104.129.1.1"[label="1.00"]; "104.0.0.30" -> "104.0.0.29"[label="1.30"]; "104.0.0.30" -> "104.0.0.17"[label="1.00"]; "104.130.1.157" -> "104.130.1.110"[label="2.03"]; "104.130.1.157" -> "104.130.1.97"[label="4.67"]; "104.130.1.157" -> "104.130.27.176"[label="37.70"]; "104.130.1.157" -> "104.130.3.3"[label="0.00"]; "104.130.1.157" -> "104.130.17.17"[label="23.16"]; "104.130.30.3" -> "104.130.1.67"[label="0.00"]; "104.130.30.3" -> "104.130.30.1"[label="1.58"]; "104.130.30.3" -> "104.130.30.9"[label="1.06"]; "104.132.24.3" -> "104.132.0.3"[label="32.03"]; "104.132.24.3" -> "104.132.24.4"[label="2.01"]; "104.132.24.3" -> "104.132.24.5"[label="20.74"]; "104.132.24.3" -> "104.132.24.1"[label="13.68"]; "104.132.24.3" -> "104.132.24.9"[label="11.68"]; "104.132.24.12" -> "104.132.22.17"[label="1.14"]; "104.132.24.12" -> "104.132.24.2"[label="1.00"]; "104.8.0.24" -> "104.6.0.11"[label="3.27"]; "104.8.0.24" -> "104.6.0.6"[label="22.52"]; "104.8.0.24" -> "104.8.0.22"[label="1.00"]; "104.131.0.147" -> "104.131.9.2"[label="7.27"]; "104.131.0.147" -> "104.131.9.1"[label="5.96"]; "104.131.0.147" -> "104.131.9.6"[label="1.44"]; "104.131.0.147" -> "104.131.0.148"[label="1.63"]; "104.131.0.146" -> "104.131.0.42"[label="1.20"]; "104.131.0.146" -> "104.131.1.2"[label="0.00"]; "104.129.1.17" -> "104.129.0.239"[label="0.00"]; "104.129.1.17" -> "104.129.0.110"[label="0.00"]; "104.129.1.17" -> "104.129.0.123"[label="0.00"]; "104.129.1.17" -> "104.129.37.2"[label="3.36"]; "104.129.1.17" -> "104.129.0.8"[label="33.78"]; "104.129.1.17" -> "104.129.1.1"[label="2.59"]; "104.129.1.17" -> "104.129.1.18"[label="1.00"]; "104.0.0.17" -> "104.0.4.200"[label="1.01"]; "104.0.0.17" -> "104.0.4.65"[label="2.38"]; "104.0.0.17" -> "104.0.4.161"[label="1.10"]; "104.0.0.17" -> "104.129.1.1"[label="1.00"]; "104.0.0.17" -> "104.0.0.5"[label="1.13"]; "104.0.0.17" -> "104.0.0.30"[label="1.00"]; "104.129.18.1" -> "104.129.46.100"[label="2.72"]; "104.129.1.18" -> "104.129.1.71"[label="1.44"]; "104.129.1.18" -> "104.129.37.2"[label="27.09"]; "104.129.1.18" -> "104.129.1.17"[label="1.00"]; "104.23.0.4" -> "104.23.0.2"[label="1.09"]; "104.130.1.16" -> "104.130.1.67"[label="2.71"]; "104.130.1.16" -> "104.131.34.1"[label="22.50"]; "104.130.1.16" -> "104.130.1.10"[label="1.04"]; "104.130.1.16" -> "104.130.1.14"[label="1.04"]; "104.130.1.16" -> "104.130.1.131"[label="25.32"]; "104.130.1.16" -> "104.130.17.17"[label="677.34"]; "104.130.1.16" -> "104.130.17.20"[label="4.00"]; "104.131.25.14" -> "104.130.10.111"[label="18.71"]; "104.131.25.14" -> "104.131.0.74"[label="2.43"]; "104.131.25.14" -> "104.131.25.16"[label="1.00"]; "104.131.25.14" -> "104.131.25.12"[label="1.00"]; "104.132.24.8" -> "104.132.24.7"[label="0.00"]; "104.132.24.8" -> "104.132.24.4"[label="1.10"]; "104.132.24.8" -> "104.132.24.1"[label="1.19"]; "104.132.24.8" -> "104.132.24.9"[label="2.16"]; "104.130.30.9" -> "104.130.30.1"[label="1.25"]; "104.130.30.9" -> "104.130.1.67"[label="8.80"]; "104.130.30.9" -> "104.130.30.3"[label="1.03"]; "104.132.24.9" -> "104.132.24.4"[label="12.52"]; "104.132.24.9" -> "104.132.24.5"[label="134.35"]; "104.132.24.9" -> "104.132.24.7"[label="12.69"]; "104.132.24.9" -> "104.132.24.1"[label="1.34"]; "104.132.24.9" -> "104.132.24.3"[label="13.35"]; "104.132.24.9" -> "104.132.24.8"[label="2.35"]; "104.23.0.2" -> "104.0.7.254"[label="10.63"]; "104.23.0.2" -> "104.23.0.4"[label="1.09"]; "104.66.68.16" -> "104.66.0.23"[label="1.24"]; "104.66.68.16" -> "104.66.0.203"[label="6.19"]; "104.66.68.16" -> "104.66.77.4"[label="6.13"]; "104.131.25.12" -> "104.131.0.245"[label="1.13"]; "104.131.25.12" -> "104.131.25.16"[label="1.00"]; "104.131.25.12" -> "104.136.12.7"[label="1.51"]; "104.131.25.12" -> "104.131.25.14"[label="1.00"]; "104.131.21.1" -> "104.131.21.104"[label="8.80"]; "104.131.21.1" -> "104.131.21.105"[label="3.55"]; "104.131.21.1" -> "104.131.21.101"[label="20.53"]; "104.131.21.1" -> "104.131.34.1"[label="0.00"]; "104.131.21.1" -> "104.131.21.34"[label="20.03"]; "104.131.21.1" -> "104.131.9.2"[label="4.90"]; "104.131.21.1" -> "104.131.9.1"[label="3.82"]; "104.131.21.1" -> "104.131.21.21"[label="5.03"]; "104.131.21.1" -> "104.131.21.12"[label="24.19"]; "104.131.0.148" -> "104.129.44.7"[label="0.00"]; "104.131.0.148" -> "104.131.9.2"[label="32.14"]; "104.131.0.148" -> "104.131.9.1"[label="244.45"]; "104.131.0.148" -> "104.131.9.6"[label="50.41"]; "104.131.0.148" -> "104.131.0.147"[label="1.45"]; "104.65.0.42" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.0.7.254" -> "10.63.0.0/255.255.0.0"[label="HNA"]; "10.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "104.63.0.0/255.255.0.0"[label="HNA"]; "104.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "10.99.0.0/255.255.0.0"[label="HNA"]; "10.99.0.0/255.255.0.0"[shape=diamond]; "104.131.0.245" -> "104.131.0.145/255.255.255.255"[label="HNA"]; "104.131.0.145/255.255.255.255"[shape=diamond]; "104.129.37.2" -> "104.129.37.3/255.255.255.255"[label="HNA"]; "104.129.37.3/255.255.255.255"[shape=diamond]; "104.129.37.2" -> "104.129.37.1/255.255.255.255"[label="HNA"]; "104.129.37.1/255.255.255.255"[shape=diamond]; "104.131.0.55" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.129.1.10" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.9.1" -> "104.131.9.77/255.255.255.255"[label="HNA"]; "104.131.9.77/255.255.255.255"[shape=diamond]; "104.131.9.5" -> "104.131.9.136/255.255.255.248"[label="HNA"]; "104.131.9.136/255.255.255.248"[shape=diamond]; "104.129.29.29" -> "104.129.29.224/255.255.255.224"[label="HNA"]; "104.129.29.224/255.255.255.224"[shape=diamond]; "104.130.77.77" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.130.17.17" -> "104.136.12.12/255.255.255.255"[label="HNA"]; "104.136.12.12/255.255.255.255"[shape=diamond]; "104.136.12.7" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.21.21" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.132.24.1" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.130.30.1" -> "104.130.30.30/255.255.255.255"[label="HNA"]; "104.130.30.30/255.255.255.255"[shape=diamond]; "104.130.1.16" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.132.24.8" -> "104.136.12.13/255.255.255.255"[label="HNA"]; "104.136.12.13/255.255.255.255"[shape=diamond]; "104.132.24.9" -> "104.132.24.250/255.255.255.255"[label="HNA"]; "104.132.24.250/255.255.255.255"[shape=diamond]; "104.23.0.2" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.23.0.2" -> "104.23.0.5/255.255.255.255"[label="HNA"]; "104.23.0.5/255.255.255.255"[shape=diamond]; } digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="140.11", style=solid]; "104.131.0.42"[shape=box]; "104.131.131.1" -> "104.131.0.55"[label="9.62", style=solid]; "104.131.131.1" -> "104.131.1.2"[label="0.00", style=solid]; "104.131.1.2"[shape=box]; "104.131.131.1" -> "104.131.0.3"[label="1.78", style=solid]; "104.131.0.3"[shape=box]; "104.131.131.1" -> "104.131.83.77"[label="38.81", style=solid]; "104.131.83.77"[shape=box]; "104.131.131.1" -> "104.131.0.147"[label="0.00", style=dashed]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.129.0.107" -> "104.129.0.77"[label="1.52"]; "104.129.0.107" -> "104.129.81.1"[label="1.67"]; "104.129.0.107" -> "104.129.1.43"[label="1.42"]; "104.129.0.107" -> "104.129.1.44"[label="1.04"]; "104.65.0.42" -> "104.0.7.254"[label="4.03"]; "104.65.0.42" -> "104.0.0.6"[label="6.54"]; "104.129.0.234" -> "104.129.37.2"[label="2.01"]; "104.129.108.1" -> "104.129.105.2"[label="1.80"]; "104.129.108.1" -> "104.129.105.10"[label="1.18"]; "104.129.108.1" -> "104.129.103.1"[label="1.16"]; "104.129.108.1" -> "104.129.103.19"[label="1.30"]; "104.129.108.1" -> "104.129.0.91"[label="1.17"]; "104.129.108.1" -> "104.129.0.165"[label="4.82"]; "104.66.0.46" -> "104.66.0.8"[label="1.23"]; "104.66.0.46" -> "104.66.0.24"[label="1.46"]; "104.129.0.108" -> "104.129.0.239"[label="1.50"]; "104.129.0.108" -> "104.129.0.95"[label="1.24"]; "104.129.0.108" -> "104.129.0.8"[label="1.50"]; "104.130.1.110" -> "104.130.1.97"[label="36.78"]; "104.130.1.110" -> "104.130.27.176"[label="5.08"]; "104.130.1.110" -> "104.130.3.3"[label="17.71"]; "104.130.1.110" -> "104.130.17.17"[label="1.59"]; "104.130.1.110" -> "104.130.1.157"[label="1.94"]; "104.129.0.239" -> "104.129.0.108"[label="1.53"]; "104.129.0.239" -> "104.129.0.125"[label="0.00"]; "104.129.0.239" -> "104.129.0.95"[label="1.38"]; "104.129.0.239" -> "104.129.37.2"[label="2.55"]; "104.129.0.239" -> "104.129.0.8"[label="1.63"]; "104.129.0.239" -> "104.129.1.10"[label="53.87"]; "104.129.0.239" -> "104.129.1.17"[label="0.00"]; "104.129.0.110" -> "104.129.0.123"[label="0.00"]; "104.129.0.110" -> "104.129.0.219"[label="0.00"]; "104.129.0.110" -> "104.129.0.82"[label="7.90"]; "104.129.0.110" -> "104.129.37.2"[label="27.44"]; "104.129.0.110" -> "104.129.1.17"[label="110.59"]; "104.192.0.32" -> "104.192.192.1"[label="40.14"]; "104.192.0.32" -> "104.192.192.225"[label="2.20"]; "104.192.0.32" -> "104.192.0.39"[label="3.94"]; "104.192.0.32" -> "104.192.192.199"[label="4.01"]; "104.66.0.34" -> "104.66.0.30"[label="7.70"]; "104.66.0.34" -> "104.66.107.4"[label="3.33"]; "104.66.0.34" -> "104.66.0.249"[label="1.19"]; "104.66.0.34" -> "104.66.0.203"[label="1.82"]; "104.66.0.34" -> "104.66.77.4"[label="14.34"]; "104.192.192.225" -> "104.192.0.32"[label="3.88"]; "104.192.192.225" -> "104.192.192.99"[label="1.00"]; "104.192.192.225" -> "104.192.0.39"[label="10.43"]; "104.192.192.225" -> "104.130.1.65"[label="37.50"]; "104.192.192.225" -> "104.192.192.66"[label="1.00"]; "104.192.192.225" -> "104.192.192.199"[label="1.00"]; "104.192.192.225" -> "104.198.65.81"[label="3.28"]; "104.192.192.225" -> "104.192.192.33"[label="1.00"]; "104.192.192.225" -> "104.192.192.166"[label="1.00"]; "104.192.192.225" -> "104.192.192.177"[label="1.00"]; "104.192.192.225" -> "104.192.192.1"[label="1.00"]; "104.192.192.225" -> "104.130.100.100"[label="0.00"]; "104.192.192.225" -> "104.192.192.133"[label="1.00"]; "104.130.1.97" -> "104.130.17.17"[label="0.00"]; "104.130.1.97" -> "104.130.1.110"[label="17.82"]; "104.130.1.97" -> "104.130.27.176"[label="106.60"]; "104.130.1.97" -> "104.130.3.3"[label="0.00"]; "104.130.1.97" -> "104.130.1.157"[label="1.56"]; "104.192.192.99" -> "104.192.192.225"[label="1.00"]; "104.192.192.99" -> "104.192.0.52"[label="0.00"]; "104.192.192.99" -> "104.192.192.66"[label="1.00"]; "104.192.192.99" -> "104.192.192.199"[label="1.00"]; "104.192.192.99" -> "104.66.0.30"[label="7.28"]; "104.192.192.99" -> "104.192.192.33"[label="1.00"]; "104.192.192.99" -> "104.192.103.3"[label="4.18"]; "104.192.192.99" -> "104.192.192.166"[label="1.00"]; "104.192.192.99" -> "104.193.24.100"[label="3.64"]; "104.192.192.99" -> "104.192.192.177"[label="2.01"]; "104.192.192.99" -> "104.66.77.4"[label="4.33"]; "104.192.192.99" -> "104.66.0.201"[label="5.21"]; "104.192.192.99" -> "104.192.192.1"[label="1.00"]; "104.192.192.99" -> "104.192.192.133"[label="1.00"]; "104.0.7.100" -> "104.0.7.254"[label="1.55"]; "104.198.65.97" -> "104.130.77.5"[label="3.21"]; "104.198.65.97" -> "104.130.77.1"[label="3.98"]; "104.198.65.97" -> "104.130.1.66"[label="46.12"]; "104.198.65.97" -> "104.198.65.65"[label="1.46"]; "104.198.65.97" -> "104.130.77.78"[label="0.00"]; "104.192.0.38" -> "104.130.1.65"[label="4.36"]; "104.192.0.38" -> "104.12.1.6"[label="7.37"]; "104.130.10.111" -> "104.12.1.6"[label="2.50"]; "104.130.10.111" -> "104.131.25.14"[label="20.58"]; "104.192.0.39" -> "104.192.0.32"[label="4.61"]; "104.192.0.39" -> "104.192.192.225"[label="16.67"]; "104.66.0.58" -> "104.66.0.49"[label="21.25"]; "104.0.7.254" -> "104.131.9.1"[label="10.63"]; "104.0.7.254" -> "104.7.2.1"[label="56.06"]; "104.0.7.254" -> "104.23.0.2"[label="11.09"]; "104.0.7.254" -> "104.0.7.100"[label="2.58"]; "104.0.7.254" -> "104.69.0.69"[label="62.83"]; "104.0.7.254" -> "104.65.0.42"[label="10.92"]; "104.129.0.123" -> "104.129.0.110"[label="29.21"]; "104.129.0.123" -> "104.129.0.77"[label="22.83"]; "104.129.0.123" -> "104.129.0.161"[label="4.11"]; "104.129.0.123" -> "104.129.37.2"[label="36.86"]; "104.129.0.123" -> "104.129.0.8"[label="182.14"]; "104.129.0.123" -> "104.131.9.1"[label="37.81"]; "104.129.0.125" -> "104.129.0.239"[label="50.49"]; "104.129.0.125" -> "104.129.0.219"[label="14.83"]; "104.129.0.125" -> "104.129.0.95"[label="5.04"]; "104.129.0.125" -> "104.192.192.166"[label="270.94"]; "104.129.0.125" -> "104.129.0.8"[label="81.79"]; "104.129.0.125" -> "104.129.1.10"[label="6.36"]; "104.129.0.125" -> "104.129.1.11"[label="12.47"]; "104.129.0.125" -> "104.192.192.133"[label="0.00"]; "104.131.21.104" -> "104.131.21.101"[label="0.00"]; "104.131.21.104" -> "104.131.21.21"[label="3.36"]; "104.131.21.104" -> "104.131.21.1"[label="18.69"]; "104.202.53.1" -> "104.203.0.1"[label="2.18"]; "104.202.53.1" -> "104.192.192.66"[label="0.00"]; "104.202.53.1" -> "104.202.19.1"[label="1.34"]; "104.202.53.1" -> "104.192.192.33"[label="53.26"]; "104.202.53.1" -> "104.0.0.6"[label="9.92"]; "104.131.21.105" -> "104.131.21.21"[label="1.97"]; "104.131.21.105" -> "104.131.21.1"[label="7.72"]; "104.131.21.102" -> "104.131.21.101"[label="1.12"]; "104.131.21.102" -> "104.131.21.34"[label="1.24"]; "104.131.21.102" -> "104.131.21.21"[label="1.45"]; "104.131.21.102" -> "104.131.21.12"[label="1.12"]; "104.66.0.49" -> "104.66.0.58"[label="19.23"]; "104.66.0.49" -> "104.66.0.203"[label="3.58"]; "104.66.0.49" -> "104.192.192.133"[label="20.32"]; "104.131.21.101" -> "104.131.21.104"[label="0.00"]; "104.131.21.101" -> "104.131.21.102"[label="1.13"]; "104.131.21.101" -> "104.131.21.34"[label="1.10"]; "104.131.21.101" -> "104.131.21.21"[label="2.16"]; "104.131.21.101" -> "104.131.21.12"[label="1.23"]; "104.131.21.101" -> "104.131.21.1"[label="8.95"]; "104.192.0.52" -> "104.192.192.99"[label="0.00"]; "104.192.0.52" -> "104.192.192.66"[label="2.20"]; "104.192.0.52" -> "104.192.0.20"[label="2.83"]; "104.192.0.52" -> "104.192.192.33"[label="6.75"]; "104.192.0.52" -> "104.193.24.100"[label="57.95"]; "104.192.0.52" -> "104.192.0.75"[label="1.32"]; "104.131.0.245" -> "104.131.25.12"[label="1.10"]; "104.0.200.1" -> "104.12.0.225"[label="1.45"]; "104.0.200.1" -> "104.13.1.97"[label="2.80"]; "104.0.200.1" -> "104.12.0.105"[label="9.96"]; "104.0.200.1" -> "104.13.3.241"[label="5.86"]; "104.0.200.1" -> "104.12.9.89"[label="1.27"]; "104.0.200.1" -> "104.13.3.33"[label="1.14"]; "104.0.200.1" -> "104.12.0.183"[label="29.61"]; "104.0.200.1" -> "104.13.0.50"[label="3.03"]; "104.0.200.1" -> "104.13.3.57"[label="9.51"]; "104.0.200.1" -> "104.13.1.2"[label="14.77"]; "104.0.200.1" -> "104.12.0.8"[label="1.58"]; "104.0.200.1" -> "104.13.138.1"[label="3.66"]; "104.0.200.1" -> "104.13.0.17"[label="2.53"]; "104.0.200.1" -> "104.13.0.155"[label="33.29"]; "104.72.0.1" -> "104.202.19.1"[label="10.04"]; "104.131.0.74" -> "104.131.25.14"[label="2.56"]; "104.200.0.1" -> "104.200.0.10"[label="1.00"]; "104.192.103.109" -> "104.192.103.200"[label="35.65"]; "104.192.103.109" -> "104.192.99.103"[label="1.36"]; "104.192.103.109" -> "104.192.103.44"[label="3.73"]; "104.192.103.109" -> "104.192.192.133"[label="52.44"]; "104.203.0.1" -> "104.202.53.1"[label="2.09"]; "104.203.0.1" -> "104.202.19.1"[label="1.43"]; "104.130.77.5" -> "104.198.65.97"[label="4.47"]; "104.130.77.5" -> "104.130.77.1"[label="2.06"]; "104.130.77.5" -> "104.130.1.66"[label="23.06"]; "104.130.77.5" -> "104.130.77.79"[label="1.00"]; "104.130.77.5" -> "104.130.77.78"[label="1.00"]; "104.130.77.5" -> "104.130.77.77"[label="1.00"]; "104.201.0.3" -> "104.201.0.4"[label="1.47"]; "104.201.0.3" -> "104.0.0.6"[label="2.88"]; "104.130.1.73" -> "104.130.1.67"[label="3.85"]; "104.130.1.73" -> "104.65.5.3"[label="216.75"]; "104.130.1.73" -> "104.131.34.1"[label="3.16"]; "104.130.1.73" -> "104.129.31.3"[label="4.78"]; "104.66.0.8" -> "104.66.0.46"[label="1.27"]; "104.66.0.8" -> "104.66.0.24"[label="1.37"]; "104.129.46.100" -> "104.129.0.77"[label="2.80"]; "104.129.46.100" -> "104.129.81.1"[label="1.54"]; "104.129.46.100" -> "104.129.18.1"[label="2.72"]; "104.12.0.192" -> "104.12.0.43"[label="106.60"]; "104.12.0.192" -> "104.12.0.136"[label="1.71"]; "104.129.0.77" -> "104.129.0.107"[label="1.93"]; "104.129.0.77" -> "104.129.0.123"[label="38.89"]; "104.129.0.77" -> "104.129.46.100"[label="2.80"]; "104.129.0.77" -> "104.129.81.1"[label="1.37"]; "104.129.0.77" -> "104.129.1.43"[label="2.07"]; "104.129.0.77" -> "104.129.1.44"[label="8.08"]; "104.0.4.200" -> "104.0.4.65"[label="22.31"]; "104.0.4.200" -> "104.0.4.161"[label="18.07"]; "104.0.4.200" -> "104.0.0.17"[label="1.01"]; "104.201.0.4" -> "104.201.0.3"[label="1.45"]; "104.198.65.73" -> "104.198.65.81"[label="1.27"]; "104.130.77.1" -> "104.198.65.97"[label="5.22"]; "104.130.77.1" -> "104.130.77.5"[label="1.61"]; "104.130.77.1" -> "104.130.77.79"[label="1.40"]; "104.130.77.1" -> "104.130.77.77"[label="2.06"]; "104.65.5.4" -> "104.65.5.3"[label="2.65"]; "104.65.5.4" -> "104.192.192.199"[label="5.45"]; "104.65.5.4" -> "104.192.192.166"[label="0.00"]; "104.130.1.67" -> "104.130.1.73"[label="3.15"]; "104.130.1.67" -> "104.130.1.66"[label="1.00"]; "104.130.1.67" -> "104.130.1.65"[label="1.00"]; "104.130.1.67" -> "104.0.4.65"[label="1.00"]; "104.130.1.67" -> "104.131.34.1"[label="2.87"]; "104.130.1.67" -> "104.131.9.2"[label="6.89"]; "104.130.1.67" -> "104.131.9.1"[label="38.64"]; "104.130.1.67" -> "104.131.10.2"[label="7.16"]; "104.130.1.67" -> "104.12.1.6"[label="56.30"]; "104.130.1.67" -> "104.131.9.6"[label="0.00"]; "104.130.1.67" -> "104.130.1.131"[label="5.37"]; "104.130.1.67" -> "104.130.1.6"[label="9.11"]; "104.130.1.67" -> "104.130.1.154"[label="0.00"]; "104.130.1.67" -> "104.129.1.28"[label="10.43"]; "104.130.1.67" -> "104.131.83.77"[label="34.30"]; "104.130.1.67" -> "104.129.31.3"[label="10.21"]; "104.130.1.67" -> "104.130.30.1"[label="3.85"]; "104.130.1.67" -> "104.130.30.3"[label="29.03"]; "104.130.1.67" -> "104.130.1.16"[label="2.55"]; "104.130.1.67" -> "104.130.30.9"[label="7.36"]; "104.192.2.2" -> "104.192.103.3"[label="1.13"]; "104.193.1.1" -> "104.0.3.81"[label="1.00"]; "104.130.1.66" -> "104.192.192.225"[label="0.00"]; "104.130.1.66" -> "104.198.65.97"[label="46.92"]; "104.130.1.66" -> "104.130.77.5"[label="14.45"]; "104.130.1.66" -> "104.130.1.67"[label="1.00"]; "104.130.1.66" -> "104.130.1.65"[label="1.00"]; "104.130.1.66" -> "104.0.4.65"[label="1.00"]; "104.130.1.66" -> "104.198.23.1"[label="92.63"]; "104.130.1.66" -> "104.130.1.45"[label="3.68"]; "104.130.1.66" -> "104.130.1.162"[label="2.84"]; "104.130.1.66" -> "104.130.77.79"[label="6.45"]; "104.130.1.66" -> "104.130.77.77"[label="3.46"]; "104.130.1.66" -> "104.130.100.100"[label="8.24"]; "104.130.1.66" -> "104.130.1.6"[label="1.84"]; "104.130.1.66" -> "104.135.0.1"[label="68.30"]; "104.130.1.66" -> "104.130.1.154"[label="1.00"]; "104.130.1.66" -> "104.130.30.1"[label="0.00"]; "104.200.0.10" -> "104.200.0.1"[label="1.00"]; "104.200.0.10" -> "104.192.192.33"[label="3.27"]; "104.192.192.66" -> "104.192.192.225"[label="1.00"]; "104.192.192.66" -> "104.192.192.99"[label="1.00"]; "104.192.192.66" -> "104.202.53.1"[label="23.69"]; "104.192.192.66" -> "104.192.0.52"[label="2.18"]; "104.192.192.66" -> "104.193.0.2"[label="1.81"]; "104.192.192.66" -> "104.192.192.199"[label="1.00"]; "104.192.192.66" -> "104.192.0.20"[label="1.44"]; "104.192.192.66" -> "104.192.192.33"[label="1.00"]; "104.192.192.66" -> "104.192.192.166"[label="1.00"]; "104.192.192.66" -> "104.193.24.100"[label="1.67"]; "104.192.192.66" -> "104.192.192.177"[label="2.01"]; "104.192.192.66" -> "104.192.192.1"[label="1.00"]; "104.192.192.66" -> "104.192.192.133"[label="1.00"]; "104.130.1.65" -> "104.192.192.225"[label="0.00"]; "104.130.1.65" -> "104.192.0.38"[label="4.60"]; "104.130.1.65" -> "104.130.1.67"[label="1.00"]; "104.130.1.65" -> "104.130.1.66"[label="1.00"]; "104.130.1.65" -> "104.0.4.65"[label="1.00"]; "104.130.1.65" -> "104.65.5.3"[label="19.52"]; "104.130.1.65" -> "104.192.192.199"[label="10.83"]; "104.130.1.65" -> "104.131.34.1"[label="371.57"]; "104.130.1.65" -> "104.130.77.77"[label="28.33"]; "104.130.1.65" -> "104.130.1.154"[label="1.00"]; "104.130.1.65" -> "104.130.30.1"[label="0.00"]; "104.131.0.192" -> "104.131.25.16"[label="1.95"]; "104.193.0.2" -> "104.192.192.66"[label="1.71"]; "104.13.0.73" -> "104.13.0.97"[label="3.81"]; "104.13.0.73" -> "104.13.0.71"[label="2.04"]; "104.13.0.73" -> "104.13.0.74"[label="1.36"]; "104.13.0.73" -> "104.13.0.38"[label="2.13"]; "104.13.0.73" -> "104.13.3.33"[label="1.00"]; "104.7.2.193" -> "104.7.2.65"[label="1.33"]; "104.7.2.65" -> "104.7.2.193"[label="1.11"]; "104.7.2.65" -> "104.7.2.1"[label="2.37"]; "104.131.0.71" -> "104.131.1.2"[label="8.56"]; "104.0.4.65" -> "104.0.4.200"[label="21.96"]; "104.0.4.65" -> "104.130.1.67"[label="1.00"]; "104.0.4.65" -> "104.130.1.66"[label="1.00"]; "104.0.4.65" -> "104.130.1.65"[label="1.00"]; "104.0.4.65" -> "104.0.4.161"[label="28.26"]; "104.0.4.65" -> "104.130.1.154"[label="1.00"]; "104.0.4.65" -> "104.0.0.17"[label="2.58"]; "104.198.65.65" -> "104.198.65.97"[label="1.46"]; "104.192.192.199" -> "104.192.0.32"[label="18.96"]; "104.192.192.199" -> "104.192.192.225"[label="1.00"]; "104.192.192.199" -> "104.192.192.99"[label="1.00"]; "104.192.192.199" -> "104.65.5.4"[label="5.19"]; "104.192.192.199" -> "104.130.1.65"[label="19.79"]; "104.192.192.199" -> "104.192.192.66"[label="1.00"]; "104.192.192.199" -> "104.131.34.1"[label="13.05"]; "104.192.192.199" -> "104.192.192.33"[label="1.00"]; "104.192.192.199" -> "104.192.192.166"[label="1.00"]; "104.192.192.199" -> "104.192.192.177"[label="1.00"]; "104.192.192.199" -> "104.192.192.1"[label="1.00"]; "104.192.192.199" -> "104.192.192.133"[label="1.00"]; "104.192.192.199" -> "104.135.0.1"[label="21.38"]; "104.129.1.71" -> "104.129.37.2"[label="8.49"]; "104.129.1.71" -> "104.129.1.18"[label="1.57"]; "104.65.5.3" -> "104.130.1.73"[label="86.70"]; "104.65.5.3" -> "104.65.5.4"[label="2.45"]; "104.65.5.3" -> "104.130.1.65"[label="18.21"]; "104.65.5.3" -> "104.12.1.6"[label="17.18"]; "104.202.19.1" -> "104.202.53.1"[label="1.34"]; "104.202.19.1" -> "104.202.0.2"[label="3.58"]; "104.202.19.1" -> "104.72.0.1"[label="8.62"]; "104.202.19.1" -> "104.203.0.1"[label="1.76"]; "104.198.65.94" -> "104.198.65.81"[label="1.00"]; "104.129.0.219" -> "104.129.0.125"[label="73.72"]; "104.129.0.219" -> "104.129.0.110"[label="1.40"]; "104.129.0.219" -> "104.129.0.82"[label="4.52"]; "104.66.0.24" -> "104.66.0.46"[label="1.44"]; "104.66.0.24" -> "104.66.0.8"[label="1.36"]; "104.66.0.24" -> "104.130.1.154"[label="1.34"]; "104.66.0.30" -> "104.66.0.34"[label="8.03"]; "104.66.0.30" -> "104.192.192.99"[label="7.52"]; "104.66.0.30" -> "104.66.107.4"[label="2.34"]; "104.66.0.30" -> "104.192.103.3"[label="1.52"]; "104.66.0.30" -> "104.192.192.166"[label="0.00"]; "104.66.0.30" -> "104.66.0.203"[label="0.00"]; "104.66.0.30" -> "104.66.77.4"[label="1.66"]; "104.66.0.30" -> "104.192.192.133"[label="3.76"]; "104.129.0.95" -> "104.129.0.108"[label="1.20"]; "104.129.0.95" -> "104.129.0.239"[label="1.42"]; "104.129.0.95" -> "104.129.0.125"[label="5.86"]; "104.129.0.95" -> "104.129.0.8"[label="1.86"]; "104.129.0.95" -> "104.129.1.10"[label="43.01"]; "104.66.0.18" -> "104.66.24.111"[label="4.11"]; "104.198.23.1" -> "104.130.1.66"[label="69.47"]; "104.129.81.1" -> "104.129.0.107"[label="2.38"]; "104.129.81.1" -> "104.129.103.1"[label="8.87"]; "104.129.81.1" -> "104.129.46.100"[label="1.65"]; "104.129.81.1" -> "104.129.0.77"[label="1.40"]; "104.129.81.1" -> "104.129.1.43"[label="2.02"]; "104.129.81.1" -> "104.129.1.44"[label="2.19"]; "104.129.81.1" -> "104.129.0.138"[label="26.27"]; "104.0.3.81" -> "104.193.1.1"[label="1.00"]; "104.0.3.81" -> "104.0.3.13"[label="28.00"]; "104.0.3.81" -> "104.0.0.5"[label="14.14"]; "104.192.0.20" -> "104.192.0.52"[label="3.05"]; "104.192.0.20" -> "104.192.192.66"[label="1.44"]; "104.192.0.20" -> "104.192.192.33"[label="1.57"]; "104.192.0.20" -> "104.192.192.1"[label="5.49"]; "104.12.0.89" -> "104.12.0.73"[label="2.00"]; "104.12.0.89" -> "104.13.3.33"[label="0.00"]; "104.12.0.89" -> "104.13.0.189"[label="0.00"]; "104.198.65.81" -> "104.192.192.225"[label="3.28"]; "104.198.65.81" -> "104.198.65.73"[label="1.21"]; "104.198.65.81" -> "104.198.65.94"[label="1.00"]; "104.198.65.81" -> "104.192.192.1"[label="3.41"]; "104.130.27.176" -> "104.130.1.110"[label="5.05"]; "104.130.27.176" -> "104.130.1.97"[label="0.00"]; "104.130.27.176" -> "104.130.17.17"[label="42.03"]; "104.130.27.176" -> "104.130.3.3"[label="106.25"]; "104.130.27.176" -> "104.130.1.157"[label="30.79"]; "104.130.27.176" -> "104.130.1.10"[label="0.00"]; "104.129.44.7" -> "104.131.0.147"[label="6.88"]; "104.129.44.7" -> "104.131.0.148"[label="4.10"]; "104.129.1.43" -> "104.129.0.107"[label="1.40"]; "104.129.1.43" -> "104.129.46.100"[label="46.45"]; "104.129.1.43" -> "104.129.0.77"[label="1.92"]; "104.129.1.43" -> "104.129.81.1"[label="2.08"]; "104.129.1.43" -> "104.129.1.44"[label="1.21"]; "104.129.1.43" -> "104.129.6.1"[label="2.23"]; "104.161.0.10" -> "104.161.0.1"[label="1.70"]; "104.129.1.44" -> "104.129.0.107"[label="1.04"]; "104.129.1.44" -> "104.129.81.1"[label="2.19"]; "104.129.1.44" -> "104.129.1.43"[label="1.37"]; "104.66.107.4" -> "104.66.0.34"[label="6.90"]; "104.66.107.4" -> "104.66.0.30"[label="4.26"]; "104.66.107.4" -> "104.66.0.203"[label="1.97"]; "104.66.107.4" -> "104.66.77.4"[label="1.00"]; "104.66.107.4" -> "104.66.0.201"[label="10.74"]; "104.130.1.45" -> "104.130.1.66"[label="4.04"]; "104.129.0.161" -> "104.129.0.123"[label="2.03"]; "104.161.0.1" -> "104.161.0.10"[label="1.72"]; "104.161.0.1" -> "104.161.0.2"[label="2.30"]; "104.161.0.1" -> "104.0.4.161"[label="1.00"]; "104.131.34.1" -> "104.130.1.73"[label="3.28"]; "104.131.34.1" -> "104.130.1.67"[label="2.84"]; "104.131.34.1" -> "104.130.1.65"[label="0.00"]; "104.131.34.1" -> "104.192.192.199"[label="25.01"]; "104.131.34.1" -> "104.192.192.166"[label="591.14"]; "104.131.34.1" -> "104.131.21.34"[label="49.26"]; "104.131.34.1" -> "104.131.9.6"[label="9.11"]; "104.131.34.1" -> "104.130.1.131"[label="1.79"]; "104.131.34.1" -> "104.131.21.21"[label="11.73"]; "104.131.34.1" -> "104.130.17.20"[label="19.32"]; "104.131.34.1" -> "104.130.1.16"[label="21.85"]; "104.130.1.162" -> "104.130.1.66"[label="3.10"]; "104.192.192.33" -> "104.192.192.225"[label="1.00"]; "104.192.192.33" -> "104.192.192.99"[label="1.00"]; "104.192.192.33" -> "104.202.53.1"[label="54.73"]; "104.192.192.33" -> "104.192.0.52"[label="6.75"]; "104.192.192.33" -> "104.200.0.10"[label="2.20"]; "104.192.192.33" -> "104.192.192.66"[label="1.00"]; "104.192.192.33" -> "104.192.192.199"[label="1.00"]; "104.192.192.33" -> "104.192.0.20"[label="1.54"]; "104.192.192.33" -> "104.192.192.166"[label="1.00"]; "104.192.192.33" -> "104.193.24.100"[label="4.40"]; "104.192.192.33" -> "104.192.192.177"[label="1.00"]; "104.192.192.33" -> "104.192.192.1"[label="1.00"]; "104.192.192.33" -> "104.192.192.133"[label="1.00"]; "104.161.0.2" -> "104.161.0.1"[label="2.37"]; "104.129.0.165" -> "104.129.105.2"[label="1.63"]; "104.129.0.165" -> "104.129.108.1"[label="5.73"]; "104.129.0.165" -> "104.129.105.10"[label="1.40"]; "104.129.0.165" -> "104.129.103.1"[label="1.08"]; "104.129.0.165" -> "104.129.103.19"[label="1.44"]; "104.129.0.165" -> "104.129.0.91"[label="1.21"]; "104.192.103.3" -> "104.192.192.99"[label="4.57"]; "104.192.103.3" -> "104.192.2.2"[label="1.13"]; "104.192.103.3" -> "104.66.0.30"[label="1.50"]; "104.192.103.3" -> "104.66.0.203"[label="0.00"]; "104.192.103.3" -> "104.66.0.201"[label="1.24"]; "104.192.103.3" -> "104.66.77.4"[label="1.44"]; "104.192.103.3" -> "104.192.192.133"[label="2.93"]; "104.0.4.161" -> "104.0.4.200"[label="18.38"]; "104.0.4.161" -> "104.0.4.65"[label="44.08"]; "104.0.4.161" -> "104.161.0.1"[label="1.00"]; "104.0.4.161" -> "104.0.0.17"[label="1.13"]; "104.129.37.2" -> "104.129.0.234"[label="2.06"]; "104.129.37.2" -> "104.129.0.239"[label="2.55"]; "104.129.37.2" -> "104.129.0.110"[label="15.47"]; "104.129.37.2" -> "104.129.0.123"[label="26.65"]; "104.129.37.2" -> "104.129.1.71"[label="8.60"]; "104.129.37.2" -> "104.129.0.8"[label="16.84"]; "104.129.37.2" -> "104.129.1.10"[label="19.92"]; "104.129.37.2" -> "104.129.0.138"[label="0.00"]; "104.129.37.2" -> "104.129.1.1"[label="3.27"]; "104.129.37.2" -> "104.129.1.17"[label="3.69"]; "104.129.37.2" -> "104.129.1.18"[label="22.21"]; "104.192.192.166" -> "104.192.192.66"[label="1.00"]; "104.192.192.166" -> "104.192.192.199"[label="1.00"]; "104.192.192.166" -> "104.66.0.30"[label="0.00"]; "104.192.192.166" -> "104.192.192.33"[label="1.00"]; "104.192.192.166" -> "104.192.192.177"[label="2.01"]; "104.192.192.166" -> "104.66.77.4"[label="151.57"]; "104.192.192.166" -> "104.66.0.201"[label="2.00"]; "104.192.192.166" -> "104.192.192.1"[label="1.00"]; "104.192.192.166" -> "104.192.192.133"[label="1.00"]; "104.129.0.187" -> "104.129.1.28"[label="30.39"]; "104.131.0.184" -> "104.131.131.3"[label="1.64"]; "104.66.0.249" -> "104.66.0.34"[label="1.17"]; "104.66.0.249" -> "104.66.0.23"[label="2.51"]; "104.66.0.249" -> "104.66.0.203"[label="1.74"]; "104.66.0.249" -> "104.66.0.201"[label="3.02"]; "104.12.0.176" -> "104.5.0.222"[label="33.87"]; "104.12.0.176" -> "104.12.0.1"[label="1.47"]; "104.12.0.176" -> "104.12.1.11"[label="6.06"]; "104.12.0.176" -> "104.12.0.19"[label="7.31"]; "104.12.0.176" -> "104.12.0.30"[label="1.52"]; "104.193.24.100" -> "104.192.192.99"[label="3.35"]; "104.193.24.100" -> "104.192.0.52"[label="57.95"]; "104.193.24.100" -> "104.192.192.66"[label="1.73"]; "104.193.24.100" -> "104.192.192.33"[label="4.34"]; "104.193.24.100" -> "104.192.192.1"[label="0.00"]; "104.192.192.177" -> "104.192.192.225"[label="1.00"]; "104.192.192.177" -> "104.192.192.99"[label="2.01"]; "104.192.192.177" -> "104.192.192.66"[label="2.01"]; "104.192.192.177" -> "104.192.192.199"[label="1.00"]; "104.192.192.177" -> "104.192.192.33"[label="1.00"]; "104.192.192.177" -> "104.192.192.166"[label="2.01"]; "104.192.192.177" -> "104.192.192.178"[label="1.03"]; "104.192.192.177" -> "104.192.192.1"[label="1.00"]; "104.192.192.177" -> "104.192.192.133"[label="2.01"]; "104.192.192.178" -> "104.192.192.177"[label="1.04"]; "104.192.192.178" -> "104.129.29.29"[label="1.00"]; "104.131.0.55" -> "104.131.131.1"[label="8.77"]; "104.131.0.55" -> "104.131.0.3"[label="1.75"]; "104.131.21.34" -> "104.131.21.102"[label="1.24"]; "104.131.21.34" -> "104.131.21.101"[label="1.11"]; "104.131.21.34" -> "104.131.34.1"[label="0.00"]; "104.131.21.34" -> "104.131.21.21"[label="1.84"]; "104.131.21.34" -> "104.131.21.12"[label="2.25"]; "104.131.21.34" -> "104.131.21.1"[label="12.90"]; "104.66.24.111" -> "104.66.0.18"[label="3.51"]; "104.66.24.111" -> "104.0.3.13"[label="1.00"]; "104.130.1.52" -> "104.130.17.17"[label="42.50"]; "104.131.10.1" -> "104.131.10.2"[label="0.00"]; "104.131.9.2" -> "104.130.1.67"[label="12.68"]; "104.131.9.2" -> "104.130.1.65"[label="136.61"]; "104.131.9.2" -> "104.129.0.138"[label="0.00"]; "104.131.9.2" -> "104.131.9.1"[label="1.00"]; "104.131.9.2" -> "104.131.9.6"[label="12.39"]; "104.131.9.2" -> "104.131.9.4"[label="1.00"]; "104.131.9.2" -> "104.131.9.5"[label="30.10"]; "104.131.9.2" -> "104.131.0.147"[label="30.53"]; "104.131.9.2" -> "104.131.0.148"[label="26.22"]; "104.131.9.2" -> "104.131.21.1"[label="11.87"]; "104.129.0.8" -> "104.129.0.108"[label="1.65"]; "104.129.0.8" -> "104.129.0.239"[label="2.31"]; "104.129.0.8" -> "104.129.0.123"[label="38.16"]; "104.129.0.8" -> "104.129.0.125"[label="216.03"]; "104.129.0.8" -> "104.129.0.95"[label="2.15"]; "104.129.0.8" -> "104.129.37.2"[label="19.35"]; "104.129.0.8" -> "104.129.1.17"[label="37.81"]; "104.129.0.8" -> "104.129.1.10"[label="0.00"]; "104.66.0.203" -> "104.66.0.34"[label="1.88"]; "104.66.0.203" -> "104.66.0.49"[label="3.41"]; "104.66.0.203" -> "104.66.0.30"[label="1.81"]; "104.66.0.203" -> "104.66.107.4"[label="1.54"]; "104.66.0.203" -> "104.192.103.3"[label="24.86"]; "104.66.0.203" -> "104.66.0.249"[label="1.67"]; "104.66.0.203" -> "104.66.0.201"[label="1.00"]; "104.66.0.203" -> "104.66.77.4"[label="1.67"]; "104.66.0.203" -> "104.66.68.16"[label="5.82"]; "104.130.1.10" -> "104.130.1.14"[label="1.00"]; "104.130.1.10" -> "104.136.12.5"[label="3.05"]; "104.130.1.10" -> "104.130.3.3"[label="10.90"]; "104.130.1.10" -> "104.130.17.17"[label="3.71"]; "104.130.1.10" -> "104.130.1.16"[label="1.04"]; "104.129.1.10" -> "104.129.0.239"[label="49.26"]; "104.129.1.10" -> "104.129.0.125"[label="5.45"]; "104.129.1.10" -> "104.129.0.95"[label="33.18"]; "104.129.1.10" -> "104.129.37.2"[label="20.53"]; "104.129.1.10" -> "104.129.0.8"[label="45.89"]; "104.129.1.10" -> "104.129.1.17"[label="0.00"]; "104.131.25.16" -> "104.131.0.192"[label="2.09"]; "104.131.25.16" -> "104.130.1.14"[label="2.63"]; "104.131.25.16" -> "104.131.25.14"[label="1.00"]; "104.131.25.16" -> "104.131.25.12"[label="1.00"]; "104.192.103.44" -> "104.192.103.200"[label="1.46"]; "104.192.103.44" -> "104.192.103.109"[label="6.27"]; "104.192.103.44" -> "104.192.99.103"[label="1.68"]; "104.129.0.138" -> "104.129.0.77"[label="24.86"]; "104.129.0.138" -> "104.129.81.1"[label="18.21"]; "104.129.0.138" -> "104.130.1.10"[label="0.00"]; "104.129.0.138" -> "104.131.21.1"[label="0.00"]; "104.137.0.2" -> "104.12.1.6"[label="1.47"]; "104.12.1.6" -> "104.192.0.38"[label="21.35"]; "104.12.1.6" -> "104.130.10.111"[label="2.44"]; "104.12.1.6" -> "104.130.1.67"[label="58.06"]; "104.12.1.6" -> "104.137.0.2"[label="1.52"]; "104.12.1.6" -> "104.6.0.6"[label="14.93"]; "104.12.1.6" -> "104.130.1.131"[label="4.63"]; "104.192.0.75" -> "104.192.0.52"[label="1.27"]; "104.192.0.75" -> "104.192.192.33"[label="30.39"]; "104.131.9.1" -> "104.0.7.254"[label="10.20"]; "104.131.9.1" -> "104.129.0.123"[label="61.06"]; "104.131.9.1" -> "104.130.1.67"[label="61.34"]; "104.131.9.1" -> "104.131.9.2"[label="1.00"]; "104.131.9.1" -> "104.129.0.138"[label="10.90"]; "104.131.9.1" -> "104.131.9.4"[label="1.00"]; "104.131.9.1" -> "104.131.9.5"[label="2.05"]; "104.131.9.1" -> "104.131.0.147"[label="10.95"]; "104.131.9.1" -> "104.131.21.1"[label="2.63"]; "104.66.0.201" -> "104.192.192.99"[label="4.67"]; "104.66.0.201" -> "104.66.107.4"[label="4.12"]; "104.66.0.201" -> "104.192.103.3"[label="1.26"]; "104.66.0.201" -> "104.192.192.166"[label="2.12"]; "104.66.0.201" -> "104.66.0.249"[label="3.51"]; "104.66.0.201" -> "104.66.0.203"[label="1.00"]; "104.66.0.201" -> "104.66.77.4"[label="2.28"]; "104.66.0.201" -> "104.192.192.133"[label="1.96"]; "104.66.77.4" -> "104.66.0.34"[label="16.13"]; "104.66.77.4" -> "104.192.192.99"[label="3.63"]; "104.66.77.4" -> "104.66.0.30"[label="1.60"]; "104.66.77.4" -> "104.66.107.4"[label="1.00"]; "104.66.77.4" -> "104.192.103.3"[label="1.43"]; "104.66.77.4" -> "104.192.192.166"[label="250.10"]; "104.66.77.4" -> "104.66.0.203"[label="0.00"]; "104.66.77.4" -> "104.66.0.201"[label="2.32"]; "104.66.77.4" -> "104.192.192.133"[label="3.31"]; "104.66.77.4" -> "104.66.68.16"[label="4.61"]; "104.131.10.2" -> "104.130.1.67"[label="13.72"]; "104.131.10.2" -> "104.131.10.1"[label="1.39"]; "104.131.10.2" -> "104.131.83.77"[label="1.00"]; "104.131.9.6" -> "104.130.1.67"[label="8.46"]; "104.131.9.6" -> "104.131.34.1"[label="15.56"]; "104.131.9.6" -> "104.131.9.2"[label="12.39"]; "104.131.9.6" -> "104.131.0.147"[label="1.86"]; "104.131.9.6" -> "104.131.21.1"[label="31.64"]; "104.131.9.6" -> "104.131.0.148"[label="216.75"]; "104.136.12.9" -> "104.136.22.22"[label="1.16"]; "104.136.12.9" -> "104.136.12.7"[label="1.00"]; "104.136.12.9" -> "104.136.12.30"[label="1.00"]; "104.130.1.14" -> "104.130.1.10"[label="1.00"]; "104.130.1.14" -> "104.131.25.16"[label="3.12"]; "104.130.1.14" -> "104.130.1.16"[label="1.04"]; "104.0.3.13" -> "104.0.3.81"[label="36.95"]; "104.0.3.13" -> "104.66.24.111"[label="1.00"]; "104.0.3.13" -> "104.0.0.5"[label="1.47"]; "104.131.9.4" -> "104.131.9.2"[label="1.00"]; "104.131.9.4" -> "104.131.9.1"[label="1.00"]; "104.131.9.4" -> "104.131.9.5"[label="13.08"]; "104.131.9.5" -> "104.131.9.2"[label="33.18"]; "104.131.9.5" -> "104.131.9.1"[label="2.21"]; "104.131.9.5" -> "104.131.9.4"[label="8.96"]; "104.136.0.7" -> "104.136.22.22"[label="1.11"]; "104.6.0.6" -> "104.12.1.6"[label="18.75"]; "104.6.0.6" -> "104.6.0.11"[label="4.31"]; "104.6.0.6" -> "104.8.0.24"[label="20.37"]; "104.69.0.69" -> "104.0.7.254"[label="21.32"]; "104.131.0.3" -> "104.131.131.1"[label="1.78"]; "104.131.0.3" -> "104.131.131.3"[label="2.32"]; "104.131.0.3" -> "104.131.0.55"[label="1.82"]; "104.130.77.79" -> "104.130.77.5"[label="1.00"]; "104.130.77.79" -> "104.130.77.1"[label="1.43"]; "104.130.77.79" -> "104.130.1.66"[label="5.45"]; "104.130.77.79" -> "104.130.77.232"[label="2.83"]; "104.130.77.79" -> "104.130.77.78"[label="1.00"]; "104.130.77.79" -> "104.130.77.77"[label="1.00"]; "104.131.1.2" -> "104.131.131.1"[label="0.00"]; "104.131.1.2" -> "104.131.131.3"[label="24.10"]; "104.131.1.2" -> "104.131.83.77"[label="77.41"]; "104.130.1.131" -> "104.130.1.67"[label="4.76"]; "104.130.1.131" -> "104.131.34.1"[label="2.15"]; "104.130.1.131" -> "104.12.1.6"[label="3.72"]; "104.130.1.131" -> "104.130.1.16"[label="0.00"]; "104.129.1.1" -> "104.129.37.2"[label="3.57"]; "104.129.1.1" -> "104.0.0.30"[label="1.00"]; "104.129.1.1" -> "104.129.1.17"[label="3.61"]; "104.129.1.1" -> "104.0.0.17"[label="1.00"]; "104.130.77.78" -> "104.130.77.79"[label="1.00"]; "104.130.77.78" -> "104.130.77.77"[label="1.00"]; "104.130.77.78" -> "104.130.77.5"[label="1.00"]; "104.192.192.1" -> "104.192.0.32"[label="197.05"]; "104.192.192.1" -> "104.192.192.225"[label="1.00"]; "104.192.192.1" -> "104.192.192.99"[label="1.00"]; "104.192.192.1" -> "104.192.192.66"[label="1.00"]; "104.192.192.1" -> "104.192.192.199"[label="1.00"]; "104.192.192.1" -> "104.192.0.20"[label="4.79"]; "104.192.192.1" -> "104.198.65.81"[label="3.16"]; "104.192.192.1" -> "104.192.192.33"[label="1.00"]; "104.192.192.1" -> "104.192.192.166"[label="1.00"]; "104.192.192.1" -> "104.192.192.177"[label="1.00"]; "104.192.192.1" -> "104.192.192.133"[label="1.00"]; "104.129.29.29" -> "104.192.192.178"[label="1.00"]; "104.136.12.5" -> "104.130.1.10"[label="1.43"]; "104.136.12.5" -> "104.130.3.3"[label="2167.50"]; "104.136.12.5" -> "104.130.5.5"[label="1.17"]; "104.136.12.5" -> "104.130.17.17"[label="7.52"]; "104.130.17.17" -> "104.130.1.110"[label="6.33"]; "104.130.17.17" -> "104.130.1.97"[label="0.00"]; "104.130.17.17" -> "104.130.27.176"[label="26.75"]; "104.130.17.17" -> "104.130.1.52"[label="25.50"]; "104.130.17.17" -> "104.130.1.10"[label="4.59"]; "104.130.17.17" -> "104.136.12.5"[label="6.47"]; "104.130.17.17" -> "104.130.3.3"[label="7.71"]; "104.130.17.17" -> "104.130.1.157"[label="17.71"]; "104.130.17.17" -> "104.130.1.16"[label="580.58"]; "104.130.3.3" -> "104.130.1.110"[label="17.71"]; "104.130.3.3" -> "104.130.1.97"[label="0.00"]; "104.130.3.3" -> "104.130.27.176"[label="102.24"]; "104.130.3.3" -> "104.130.1.10"[label="12.55"]; "104.130.3.3" -> "104.136.12.5"[label="1625.63"]; "104.130.3.3" -> "104.130.17.17"[label="8.91"]; "104.130.3.3" -> "104.130.1.157"[label="0.00"]; "104.131.131.2" -> "104.131.131.3"[label="1.55"]; "104.130.77.77" -> "104.130.77.232"[label="5.06"]; "104.130.77.77" -> "104.130.1.73"[label="35.53"]; "104.130.77.77" -> "104.130.77.5"[label="1.00"]; "104.130.77.77" -> "104.130.77.1"[label="2.87"]; "104.130.77.77" -> "104.130.1.67"[label="0.00"]; "104.130.77.77" -> "104.130.1.66"[label="3.63"]; "104.130.77.77" -> "104.130.1.65"[label="12.05"]; "104.130.77.77" -> "104.130.77.79"[label="1.00"]; "104.130.77.77" -> "104.130.77.78"[label="1.00"]; "104.130.100.100" -> "104.192.192.225"[label="0.00"]; "104.130.100.100" -> "104.130.1.66"[label="13.58"]; "104.130.5.5" -> "104.136.12.5"[label="1.25"]; "104.132.22.17" -> "104.132.24.12"[label="1.13"]; "104.131.13.13" -> "104.131.21.1"[label="16.13"]; "104.136.12.7" -> "104.136.12.9"[label="1.00"]; "104.136.12.7" -> "104.136.12.30"[label="1.00"]; "104.136.12.7" -> "104.131.25.12"[label="1.51"]; "104.131.131.3" -> "104.131.0.42"[label="3.76"]; "104.131.131.3" -> "104.131.0.184"[label="1.64"]; "104.131.131.3" -> "104.131.1.2"[label="14.57"]; "104.131.131.3" -> "104.131.0.3"[label="2.27"]; "104.131.131.3" -> "104.131.131.2"[label="1.61"]; "104.131.131.3" -> "104.131.83.77"[label="5.30"]; "104.131.131.3" -> "104.131.0.146"[label="28.98"]; "104.131.21.21" -> "104.131.21.104"[label="3.27"]; "104.131.21.21" -> "104.131.21.105"[label="1.66"]; "104.131.21.21" -> "104.131.21.102"[label="1.19"]; "104.131.21.21" -> "104.131.21.101"[label="1.35"]; "104.131.21.21" -> "104.131.34.1"[label="18.21"]; "104.131.21.21" -> "104.131.21.34"[label="1.34"]; "104.131.21.21" -> "104.131.21.12"[label="1.21"]; "104.131.21.21" -> "104.131.21.1"[label="8.73"]; "104.7.2.1" -> "104.0.7.254"[label="57.95"]; "104.7.2.1" -> "104.7.2.65"[label="3.70"]; "104.130.1.6" -> "104.130.1.67"[label="8.32"]; "104.130.1.6" -> "104.130.1.66"[label="2.09"]; "104.0.0.5" -> "104.0.3.81"[label="13.23"]; "104.0.0.5" -> "104.0.3.13"[label="1.25"]; "104.0.0.5" -> "104.0.0.6"[label="1.00"]; "104.0.0.5" -> "104.0.0.17"[label="1.08"]; "104.192.192.133" -> "104.192.192.225"[label="1.00"]; "104.192.192.133" -> "104.192.192.99"[label="1.00"]; "104.192.192.133" -> "104.129.0.125"[label="285.20"]; "104.192.192.133" -> "104.66.0.49"[label="14.77"]; "104.192.192.133" -> "104.192.103.109"[label="0.00"]; "104.192.192.133" -> "104.192.192.66"[label="1.00"]; "104.192.192.133" -> "104.192.192.199"[label="1.00"]; "104.192.192.133" -> "104.66.0.30"[label="4.28"]; "104.192.192.133" -> "104.192.192.33"[label="1.00"]; "104.192.192.133" -> "104.192.103.3"[label="2.55"]; "104.192.192.133" -> "104.192.192.166"[label="1.00"]; "104.192.192.133" -> "104.192.192.177"[label="2.01"]; "104.192.192.133" -> "104.192.0.74"[label="0.00"]; "104.192.192.133" -> "104.66.77.4"[label="3.21"]; "104.192.192.133" -> "104.66.0.201"[label="1.81"]; "104.192.192.133" -> "104.192.192.1"[label="1.00"]; "104.192.192.133" -> "104.192.99.160"[label="21.28"]; "104.10.2.14" -> "104.10.2.34"[label="1.00"]; "104.10.2.14" -> "104.6.0.11"[label="1.39"]; "104.10.2.14" -> "104.10.2.24"[label="1.00"]; "104.135.0.1" -> "104.192.192.225"[label="36.86"]; "104.135.0.1" -> "104.130.1.66"[label="65.68"]; "104.129.6.1" -> "104.129.1.43"[label="2.29"]; "104.0.0.6" -> "104.65.0.42"[label="1.37"]; "104.0.0.6" -> "104.202.53.1"[label="10.01"]; "104.0.0.6" -> "104.201.0.3"[label="3.09"]; "104.0.0.6" -> "104.201.0.4"[label="1.16"]; "104.0.0.6" -> "104.202.19.1"[label="1.66"]; "104.0.0.6" -> "104.0.0.5"[label="1.00"]; "104.132.0.3" -> "104.132.24.7"[label="90.31"]; "104.132.0.3" -> "104.132.24.3"[label="22.50"]; "104.130.17.20" -> "104.131.34.1"[label="24.19"]; "104.130.17.20" -> "104.130.1.16"[label="4.98"]; "104.12.0.20" -> "104.12.0.200"[label="361.25"]; "104.12.0.20" -> "104.12.34.6"[label="2.33"]; "104.12.0.20" -> "104.13.3.33"[label="1.06"]; "104.12.0.20" -> "104.12.0.46"[label="1.32"]; "104.12.0.20" -> "104.12.0.43"[label="0.00"]; "104.12.0.20" -> "104.13.0.50"[label="137.47"]; "104.132.24.4" -> "104.132.24.7"[label="1.06"]; "104.132.24.4" -> "104.132.24.1"[label="1.14"]; "104.132.24.4" -> "104.132.24.2"[label="2.80"]; "104.132.24.4" -> "104.132.24.3"[label="1.48"]; "104.132.24.4" -> "104.132.24.8"[label="1.16"]; "104.132.24.4" -> "104.132.24.9"[label="11.35"]; "104.132.24.5" -> "104.132.24.1"[label="2.61"]; "104.132.24.5" -> "104.132.24.2"[label="3.97"]; "104.132.24.5" -> "104.132.24.3"[label="1.43"]; "104.132.24.5" -> "104.132.24.9"[label="117.80"]; "104.130.1.154" -> "104.130.1.67"[label="1.00"]; "104.130.1.154" -> "104.130.1.66"[label="1.00"]; "104.130.1.154" -> "104.130.1.65"[label="1.00"]; "104.130.1.154" -> "104.0.4.65"[label="1.00"]; "104.130.1.154" -> "104.66.0.24"[label="1.36"]; "104.136.12.30" -> "104.132.24.1"[label="1.02"]; "104.136.12.30" -> "104.136.12.7"[label="1.00"]; "104.136.12.30" -> "104.136.12.9"[label="1.00"]; "104.136.12.30" -> "104.136.22.22"[label="1.58"]; "104.131.21.12" -> "104.131.21.102"[label="1.15"]; "104.131.21.12" -> "104.131.21.101"[label="1.19"]; "104.131.21.12" -> "104.131.21.34"[label="2.30"]; "104.131.21.12" -> "104.131.21.21"[label="1.63"]; "104.131.21.12" -> "104.131.21.1"[label="16.60"]; "104.132.24.7" -> "104.132.0.3"[label="197.05"]; "104.132.24.7" -> "104.132.24.4"[label="1.10"]; "104.132.24.7" -> "104.132.24.1"[label="2.27"]; "104.132.24.7" -> "104.132.24.2"[label="14.99"]; "104.132.24.7" -> "104.132.24.9"[label="11.87"]; "104.129.1.28" -> "104.130.1.67"[label="5.85"]; "104.129.1.28" -> "104.129.0.187"[label="61.34"]; "104.132.24.1" -> "104.132.24.4"[label="1.32"]; "104.132.24.1" -> "104.132.24.5"[label="15.18"]; "104.132.24.1" -> "104.136.12.30"[label="1.02"]; "104.132.24.1" -> "104.132.24.7"[label="2.07"]; "104.132.24.1" -> "104.132.24.3"[label="1.63"]; "104.132.24.1" -> "104.132.24.8"[label="1.16"]; "104.132.24.1" -> "104.132.24.9"[label="1.07"]; "104.130.30.1" -> "104.130.1.67"[label="4.03"]; "104.130.30.1" -> "104.130.30.3"[label="1.58"]; "104.130.30.1" -> "104.130.30.9"[label="1.36"]; "104.129.31.3" -> "104.130.1.73"[label="4.98"]; "104.129.31.3" -> "104.129.31.14"[label="1.16"]; "104.0.0.29" -> "104.0.0.30"[label="1.30"]; "104.131.83.77" -> "104.130.1.67"[label="26.60"]; "104.131.83.77" -> "104.131.10.2"[label="1.00"]; "104.131.83.77" -> "104.131.1.2"[label="35.61"]; "104.131.83.77" -> "104.131.131.1"[label="22.12"]; "104.131.83.77" -> "104.131.131.3"[label="5.63"]; "104.0.0.30" -> "104.129.1.1"[label="1.00"]; "104.0.0.30" -> "104.0.0.29"[label="1.30"]; "104.0.0.30" -> "104.0.0.17"[label="1.00"]; "104.130.1.157" -> "104.130.1.110"[label="2.03"]; "104.130.1.157" -> "104.130.1.97"[label="4.67"]; "104.130.1.157" -> "104.130.27.176"[label="40.64"]; "104.130.1.157" -> "104.130.3.3"[label="0.00"]; "104.130.1.157" -> "104.130.17.17"[label="20.26"]; "104.130.30.3" -> "104.130.1.67"[label="0.00"]; "104.130.30.3" -> "104.130.30.1"[label="1.58"]; "104.130.30.3" -> "104.130.30.9"[label="1.06"]; "104.132.24.3" -> "104.132.0.3"[label="32.03"]; "104.132.24.3" -> "104.132.24.4"[label="2.01"]; "104.132.24.3" -> "104.132.24.5"[label="20.74"]; "104.132.24.3" -> "104.132.24.1"[label="13.68"]; "104.132.24.3" -> "104.132.24.9"[label="11.68"]; "104.132.24.12" -> "104.132.22.17"[label="1.14"]; "104.132.24.12" -> "104.132.24.2"[label="1.00"]; "104.8.0.24" -> "104.6.0.11"[label="3.27"]; "104.8.0.24" -> "104.6.0.6"[label="22.52"]; "104.8.0.24" -> "104.8.0.22"[label="1.00"]; "104.131.0.147" -> "104.131.9.2"[label="7.27"]; "104.131.0.147" -> "104.131.9.1"[label="5.96"]; "104.131.0.147" -> "104.131.9.6"[label="1.44"]; "104.131.0.147" -> "104.131.0.148"[label="1.63"]; "104.131.0.146" -> "104.131.0.42"[label="1.20"]; "104.131.0.146" -> "104.131.1.2"[label="0.00"]; "104.129.1.17" -> "104.129.0.239"[label="0.00"]; "104.129.1.17" -> "104.129.0.110"[label="0.00"]; "104.129.1.17" -> "104.129.0.123"[label="0.00"]; "104.129.1.17" -> "104.129.37.2"[label="3.36"]; "104.129.1.17" -> "104.129.0.8"[label="33.78"]; "104.129.1.17" -> "104.129.1.1"[label="2.59"]; "104.129.1.17" -> "104.129.1.18"[label="1.00"]; "104.0.0.17" -> "104.0.4.200"[label="1.01"]; "104.0.0.17" -> "104.0.4.65"[label="2.38"]; "104.0.0.17" -> "104.0.4.161"[label="1.10"]; "104.0.0.17" -> "104.129.1.1"[label="1.00"]; "104.0.0.17" -> "104.0.0.5"[label="1.13"]; "104.0.0.17" -> "104.0.0.30"[label="1.00"]; "104.129.18.1" -> "104.129.46.100"[label="2.72"]; "104.129.1.18" -> "104.129.1.71"[label="1.44"]; "104.129.1.18" -> "104.129.37.2"[label="27.09"]; "104.129.1.18" -> "104.129.1.17"[label="1.00"]; "104.23.0.4" -> "104.23.0.2"[label="1.10"]; "104.130.1.16" -> "104.130.1.67"[label="2.71"]; "104.130.1.16" -> "104.131.34.1"[label="22.50"]; "104.130.1.16" -> "104.130.1.10"[label="1.04"]; "104.130.1.16" -> "104.130.1.14"[label="1.04"]; "104.130.1.16" -> "104.130.1.131"[label="25.32"]; "104.130.1.16" -> "104.130.17.17"[label="677.34"]; "104.130.1.16" -> "104.130.17.20"[label="4.00"]; "104.131.25.14" -> "104.130.10.111"[label="18.71"]; "104.131.25.14" -> "104.131.0.74"[label="2.43"]; "104.131.25.14" -> "104.131.25.16"[label="1.00"]; "104.131.25.14" -> "104.131.25.12"[label="1.00"]; "104.132.24.8" -> "104.132.24.7"[label="0.00"]; "104.132.24.8" -> "104.132.24.4"[label="1.10"]; "104.132.24.8" -> "104.132.24.1"[label="1.19"]; "104.132.24.8" -> "104.132.24.9"[label="2.16"]; "104.132.24.9" -> "104.132.24.4"[label="12.52"]; "104.132.24.9" -> "104.132.24.5"[label="134.35"]; "104.132.24.9" -> "104.132.24.7"[label="12.69"]; "104.132.24.9" -> "104.132.24.1"[label="1.34"]; "104.132.24.9" -> "104.132.24.3"[label="13.35"]; "104.132.24.9" -> "104.132.24.8"[label="2.35"]; "104.23.0.2" -> "104.0.7.254"[label="10.63"]; "104.23.0.2" -> "104.23.0.4"[label="1.09"]; "104.66.68.16" -> "104.66.0.23"[label="1.24"]; "104.66.68.16" -> "104.66.0.203"[label="6.19"]; "104.66.68.16" -> "104.66.77.4"[label="6.13"]; "104.131.25.12" -> "104.131.0.245"[label="1.13"]; "104.131.25.12" -> "104.131.25.16"[label="1.00"]; "104.131.25.12" -> "104.136.12.7"[label="1.51"]; "104.131.25.12" -> "104.131.25.14"[label="1.00"]; "104.131.21.1" -> "104.131.21.104"[label="8.80"]; "104.131.21.1" -> "104.131.21.105"[label="3.55"]; "104.131.21.1" -> "104.131.21.101"[label="20.53"]; "104.131.21.1" -> "104.131.34.1"[label="0.00"]; "104.131.21.1" -> "104.131.21.34"[label="20.03"]; "104.131.21.1" -> "104.131.9.2"[label="4.90"]; "104.131.21.1" -> "104.131.9.1"[label="3.82"]; "104.131.21.1" -> "104.131.21.21"[label="5.03"]; "104.131.21.1" -> "104.131.21.12"[label="24.19"]; "104.131.0.148" -> "104.129.44.7"[label="0.00"]; "104.131.0.148" -> "104.131.9.2"[label="32.14"]; "104.131.0.148" -> "104.131.9.1"[label="244.45"]; "104.131.0.148" -> "104.131.9.6"[label="50.41"]; "104.131.0.148" -> "104.131.0.147"[label="1.45"]; "104.65.0.42" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.0.7.254" -> "10.63.0.0/255.255.0.0"[label="HNA"]; "10.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "104.63.0.0/255.255.0.0"[label="HNA"]; "104.63.0.0/255.255.0.0"[shape=diamond]; "104.0.7.254" -> "10.99.0.0/255.255.0.0"[label="HNA"]; "10.99.0.0/255.255.0.0"[shape=diamond]; "104.131.0.245" -> "104.131.0.145/255.255.255.255"[label="HNA"]; "104.131.0.145/255.255.255.255"[shape=diamond]; "104.131.0.55" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.129.1.10" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.9.1" -> "104.131.9.77/255.255.255.255"[label="HNA"]; "104.131.9.77/255.255.255.255"[shape=diamond]; "104.131.9.5" -> "104.131.9.136/255.255.255.248"[label="HNA"]; "104.131.9.136/255.255.255.248"[shape=diamond]; "104.129.29.29" -> "104.129.29.224/255.255.255.224"[label="HNA"]; "104.129.29.224/255.255.255.224"[shape=diamond]; "104.130.77.77" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.130.17.17" -> "104.136.12.12/255.255.255.255"[label="HNA"]; "104.136.12.12/255.255.255.255"[shape=diamond]; "104.136.12.7" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.131.21.21" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.7.2.1" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.7.2.1" -> "104.7.2.16/255.255.255.240"[label="HNA"]; "104.7.2.16/255.255.255.240"[shape=diamond]; "104.7.2.1" -> "104.7.2.8/255.255.255.248"[label="HNA"]; "104.7.2.8/255.255.255.248"[shape=diamond]; "104.7.2.1" -> "104.7.2.0/255.255.255.248"[label="HNA"]; "104.7.2.0/255.255.255.248"[shape=diamond]; "104.132.24.1" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.130.30.1" -> "104.130.30.30/255.255.255.255"[label="HNA"]; "104.130.30.30/255.255.255.255"[shape=diamond]; "104.130.1.16" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.132.24.8" -> "104.136.12.13/255.255.255.255"[label="HNA"]; "104.136.12.13/255.255.255.255"[shape=diamond]; "104.132.24.9" -> "104.132.24.250/255.255.255.255"[label="HNA"]; "104.132.24.250/255.255.255.255"[shape=diamond]; "104.23.0.2" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; "104.23.0.2" -> "104.23.0.5/255.255.255.255"[label="HNA"]; "104.23.0.5/255.255.255.255"[shape=diamond]; } digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="140.11", style=solid]; "104.131.0.42"[shape=box]; "104.131.131.1" -> "104.131.0.55"[label="9.87", style=solid]; "104.131.131.1" -> "104.131.1.2"[label="0.00", style=solid]; "104.131.1.2"[shape=box]; "104.131.131.1" -> "104.131.0.3"[label="1.81", style=solid]; "104.131.0.3"[shape=box]; "104.131.131.1" -> "104.131.131.3"[label="16.67", style=solid]; "104.131.131.3"[shape=box]; "104.131.131.1" -> "104.131.83.77"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.147"[label="0.00", style=dashed]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.129.0.107" -> "104.129.0.77"[label="1.52"]; "104.129.0.107" -> "104.129.81.1"[label="1.67"]; "104.129.0.107" -> "104.129.1.43"[label="1.42"]; "104.129.0.107" -> "104.129.1.44"[label="1.04"]; "104.65.0.42" -> "104.0.7.254"[label="4.03"]; "104.65.0.42" -> "104.0.0.6"[label="6.54"]; "104.129.0.234" -> "104.129.37.2"[label="2.01"]; "104.129.108.1" -> "104.129.105.2"[label="1.80"]; "104.129.108.1" -> "104.129.105.10"[label="1.18"]; "104.129.108.1" -> "104.129.103.1"[label="1.16"]; "104.129.108.1" -> "104.129.103.19"[label="1.30"]; "104.129.108.1" -> "104.129.0.91"[label="1.17"]; "104.129.108.1" -> "104.129.0.165"[label="4.82"]; "104.66.0.46" -> "104.66.0.8"[label="1.22"]; "104.66.0.46" -> "104.66.0.24"[label="1.42"]; "104.129.0.108" -> "104.129.0.239"[label="1.50"]; "104.129.0.108" -> "104.129.0.95"[label="1.24"]; "104.129.0.108" -> "104.129.0.8"[label="1.50"]; "104.130.1.110" -> "104.130.1.97"[label="36.78"]; "104.130.1.110" -> "104.130.27.176"[label="5.08"]; "104.130.1.110" -> "104.130.3.3"[label="17.71"]; "104.130.1.110" -> "104.130.17.17"[label="1.59"]; "104.130.1.110" -> "104.130.1.157"[label="1.94"]; "104.129.0.239" -> "104.129.0.108"[label="1.53"]; "104.129.0.239" -> "104.129.0.125"[label="0.00"]; "104.129.0.239" -> "104.129.0.95"[label="1.38"]; "104.129.0.239" -> "104.129.37.2"[label="2.55"]; "104.129.0.239" -> "104.129.0.8"[label="1.63"]; "104.129.0.239" -> "104.129.1.10"[label="53.87"]; "104.129.0.239" -> "104.129.1.17"[label="0.00"]; "104.129.0.110" -> "104.129.0.123"[label="0.00"]; "104.129.0.110" ->s3d-0.2.2.1/apps/meshs3d/hash.c000066400000000000000000000172671361325167000157640ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #include /* NULL */ #include "hash.h" #include "allocate.h" /* clears the hash */ void hash_init(struct hashtable_t *hash) { int i; hash->elements = 0; for (i = 0 ; i < hash->size ; i++) { hash->table[i] = NULL; } } /* remove the hash structure. if hashdata_free_cb != NULL, * this function will be called to remove the elements inside of the hash. * if you don't remove the elements, memory might be leaked. */ void hash_delete(struct hashtable_t *hash, hashdata_free_cb free_cb) { struct element_t *bucket, *last_bucket; int i; for (i = 0; i < hash->size; i++) { bucket = hash->table[i]; while (bucket != NULL) { if (free_cb != NULL) free_cb(bucket->data); last_bucket = bucket; bucket = bucket->next; debugFree(last_bucket, 1301); } } hash_destroy(hash); } /* free only the hashtable and the hash itself. */ void hash_destroy(struct hashtable_t *hash) { debugFree(hash->table, 1302); debugFree(hash, 1303); } /* iterate though the hash. first element is selected with iter_in NULL. * use the returned iterator to access the elements until hash_it_t returns NULL. */ struct hash_it_t *hash_iterate(struct hashtable_t *hash, struct hash_it_t *iter_in) { struct hash_it_t *iter; if (iter_in == NULL) { iter = (struct hash_it_t*)debugMalloc(sizeof(struct hash_it_t), 301); iter->index = -1; iter->bucket = NULL; iter->prev_bucket = NULL; } else iter = iter_in; /* sanity checks first (if our bucket got deleted in the last iteration): */ if (iter->bucket != NULL) { if (iter->first_bucket != NULL) { /* we're on the first element and it got removed after the last iteration. */ if ((*iter->first_bucket) != iter->bucket) { /* there are still other elements in the list */ if ((*iter->first_bucket) != NULL) { iter->prev_bucket = NULL; iter->bucket = (*iter->first_bucket); iter->first_bucket = &hash->table[ iter->index ]; return iter; } else { iter->bucket = NULL; } } } else if (iter->prev_bucket != NULL) { /* we're not on the first element, and the bucket got removed after the last iteration. * the last bucket's next pointer is not pointing to our actual bucket anymore. * select the next. */ if (iter->prev_bucket->next != iter->bucket) iter->bucket = iter->prev_bucket; } } /* now as we are sane, select the next one if there is some */ if (iter->bucket != NULL) { if (iter->bucket->next != NULL) { iter->prev_bucket = iter->bucket; iter->bucket = iter->bucket->next; iter->first_bucket = NULL; return iter; } } /* if not returned yet, we've reached the last one on the index and have to search forward */ iter->index++; while (iter->index < hash->size) { /* go through the entries of the hash table */ if ((hash->table[ iter->index ]) != NULL) { iter->prev_bucket = NULL; iter->bucket = hash->table[ iter->index ]; iter->first_bucket = &hash->table[ iter->index ]; return iter; /* if this table entry is not null, return it */ } else iter->index++; /* else, go to the next */ } /* nothing to iterate over anymore */ debugFree(iter, 1304); return NULL; } /* allocates and clears the hash */ struct hashtable_t *hash_new(int size, hashdata_compare_cb compare, hashdata_choose_cb choose) { struct hashtable_t *hash; hash = (struct hashtable_t*)debugMalloc(sizeof(struct hashtable_t) , 302); if (hash == NULL) /* could not allocate the hash control structure */ return NULL; hash->size = size; hash->table = (struct element_t**)debugMalloc(sizeof(struct element_t *) * size, 303); if (hash->table == NULL) { /* could not allocate the table */ debugFree(hash, 1305); return NULL; } hash_init(hash); hash->compare = compare; hash->choose = choose; return hash; } /* adds data to the hashtable. returns 0 on success, -1 on error */ int hash_add(struct hashtable_t *hash, void *data) { int index; struct element_t *bucket, *prev_bucket = NULL; index = hash->choose(data, hash->size); bucket = hash->table[index]; while (bucket != NULL) { if (0 == hash->compare(bucket->data, data)) return -1; prev_bucket = bucket; bucket = bucket->next; } /* found the tail of the list, add new element */ if (NULL == (bucket = (struct element_t*)debugMalloc(sizeof(struct element_t), 304))) return -1; /* debugMalloc failed */ bucket->data = data; /* init the new bucket */ bucket->next = NULL; /* and link it */ if (prev_bucket == NULL) { hash->table[index] = bucket; } else { prev_bucket->next = bucket; } hash->elements++; return 0; } /* finds data, based on the key in keydata. returns the found data on success, or NULL on error */ void *hash_find(struct hashtable_t *hash, void *keydata) { int index; struct element_t *bucket; index = hash->choose(keydata , hash->size); bucket = hash->table[index]; while (bucket != NULL) { if (0 == hash->compare(bucket->data, keydata)) return bucket->data; bucket = bucket->next; } return NULL; } /* remove bucket (this might be used in hash_iterate() if you already found the bucket * you want to delete and don't need the overhead to find it again with hash_remove(). * But usually, you don't want to use this function, as it fiddles with hash-internals. */ void *hash_remove_bucket(struct hashtable_t *hash, struct hash_it_t *hash_it_t) { void *data_save; data_save = hash_it_t->bucket->data; /* save the pointer to the data */ if (hash_it_t->prev_bucket != NULL) { hash_it_t->prev_bucket->next = hash_it_t->bucket->next; } else if (hash_it_t->first_bucket != NULL) { (*hash_it_t->first_bucket) = hash_it_t->bucket->next; } debugFree(hash_it_t->bucket, 1306); hash->elements--; return data_save; } /* removes data from hash, if found. returns pointer do data on success, * so you can remove the used structure yourself, or NULL on error . * data could be the structure you use with just the key filled, * we just need the key for comparing. */ void *hash_remove(struct hashtable_t *hash, void *data) { struct hash_it_t hash_it_t; hash_it_t.index = hash->choose(data, hash->size); hash_it_t.bucket = hash->table[hash_it_t.index]; hash_it_t.prev_bucket = NULL; while (hash_it_t.bucket != NULL) { if (0 == hash->compare(hash_it_t.bucket->data, data)) { hash_it_t.first_bucket = (hash_it_t.bucket == hash->table[hash_it_t.index] ? &hash->table[ hash_it_t.index ] : NULL); return hash_remove_bucket(hash, &hash_it_t); } hash_it_t.prev_bucket = hash_it_t.bucket; hash_it_t.bucket = hash_it_t.bucket->next; } return NULL; } /* resize the hash, returns the pointer to the new hash or NULL on error. removes the old hash on success. */ struct hashtable_t *hash_resize(struct hashtable_t *hash, int size) { struct hashtable_t *new_hash; struct element_t *bucket; int i; /* initialize a new hash with the new size */ if (NULL == (new_hash = hash_new(size, hash->compare, hash->choose))) return NULL; /* copy the elements */ for (i = 0; i < hash->size; i++) { bucket = hash->table[i]; while (bucket != NULL) { hash_add(new_hash, bucket->data); bucket = bucket->next; } } hash_delete(hash, NULL); /* remove hash and eventual overflow buckets but not the content itself. */ return new_hash; } /* print the hash table for debugging */ void hash_debug(struct hashtable_t *hash) { int i; struct element_t *bucket; for (i = 0; i < hash->size; i++) { printf("[%d] ", i); bucket = hash->table[i]; while (bucket != NULL) { printf("-> [%10p] ", (void *)bucket); bucket = bucket->next; } printf("\n"); } printf("\n"); } s3d-0.2.2.1/apps/meshs3d/hash.h000066400000000000000000000063061361325167000157610ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2006-2015 Marek Lindner */ #ifndef _HASH_H_ #define _HASH_H_ typedef int (*hashdata_compare_cb)(const void *, const void *); typedef int (*hashdata_choose_cb)(const void *, int); typedef void (*hashdata_free_cb)(void *); struct element_t { void *data; /* pointer to the data */ struct element_t *next; /* overflow bucket pointer */ }; struct hash_it_t { int index; struct element_t *bucket; struct element_t *prev_bucket; struct element_t **first_bucket; }; struct hashtable_t { struct element_t **table; /* the hashtable itself, with the buckets */ int elements; /* number of elements registered */ int size; /* size of hashtable */ hashdata_compare_cb compare; /* callback to a compare function. * should compare 2 element datas for their keys, * return 0 if same and not 0 if not same */ hashdata_choose_cb choose; /* the hashfunction, should return an index based * on the key in the data of the first argument * and the size the second */ }; /* clears the hash */ void hash_init(struct hashtable_t *hash); /* allocates and clears the hash */ struct hashtable_t *hash_new(int size, hashdata_compare_cb compare, hashdata_choose_cb choose); /* remove bucket (this might be used in hash_iterate() if you already found the bucket * you want to delete and don't need the overhead to find it again with hash_remove(). * But usually, you don't want to use this function, as it fiddles with hash-internals. */ void *hash_remove_bucket(struct hashtable_t *hash, struct hash_it_t *hash_it_t); /* remove the hash structure. if hashdata_free_cb != NULL, * this function will be called to remove the elements inside of the hash. * if you don't remove the elements, memory might be leaked. */ void hash_delete(struct hashtable_t *hash, hashdata_free_cb free_cb); /* free only the hashtable and the hash itself. */ void hash_destroy(struct hashtable_t *hash); /* adds data to the hashtable. returns 0 on success, -1 on error */ int hash_add(struct hashtable_t *hash, void *data); /* removes data from hash, if found. returns pointer do data on success, * so you can remove the used structure yourself, or NULL on error . * data could be the structure you use with just the key filled, * we just need the key for comparing. */ void *hash_remove(struct hashtable_t *hash, void *data); /* adds data to the hashtable. returns 0 on success, -1 on error */ void *hash_find(struct hashtable_t *hash, void *keydata); /* resize the hash, returns the pointer to the new hash or NULL on error. removes the old hash on success */ struct hashtable_t *hash_resize(struct hashtable_t *hash, int size); /* print the hash table for debugging */ void hash_debug(struct hashtable_t *hash); /* iterate though the hash. first element is selected with iter_in NULL. * use the returned iterator to access the elements until hash_it_t returns NULL. */ struct hash_it_t *hash_iterate(struct hashtable_t *hash, struct hash_it_t *iter_in); #endif /* _HASH_H_ */ s3d-0.2.2.1/apps/meshs3d/ipv6.data000066400000000000000000000007271361325167000164050ustar00rootroot00000000000000digraph { "2001:db8:beef::1" -> "3ffe:1900:4545:3:200:f8ff:fe21:67cf" [label="1.0"] "2001:db8::1" -> "3ffe:1900:4545:3:200:f8ff:fe21:67cf" [label="12.0"] "FE80::0202:B3FF:FE1E:8329" -> "3ffe:1900:4545:3:200:f8ff:fe21:67cf" [label="1.0"] "FE80::0202:B3FF:FE1E:8329" -> "2001:db8:beef::1" [label="1.15"] "FE80::0202:B3FF:FE1E:8329" -> "2001:db8::1" [label="1.7"] "FE80::0202:B3FF:FE1E:8329" -> "2001:db8::6" [label="1.7"] } s3d-0.2.2.1/apps/meshs3d/main.c000066400000000000000000000321651361325167000157570ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #include #include #include #include #include #include #include #include #include #include #include #include "meshs3d.h" #include "allocate.h" #include "hash.h" /* global vars */ struct glob Global; static struct timespec sleep_time = { 0, 100 * 1000 * 1000 }; /* 100 mili seconds */ static void init_globals(void) { Global.debug = 1; Global.obj_node_tt = 0; Global.obj_node_inet = 0; Global.obj_node_normal = 0; Global.obj_btn_close = 0; Global.obj_s3d_url = 0; Global.obj_zero_point = 0; Global.obj_node_count = 0; Global.node_count = 0; Global.color_switch = 0; Global.output_block_counter = 0; Global.output_block_completed = 0; Global.asp = 1.0; Global.left = -1.0; Global.bottom = -1.0; } static void print_usage(void) { printf("Usage is olsrs3d [options] [-- [s3d options]]\n"); printf("olsrs3d options:\n"); printf(" -h\tprint this short help\n"); printf(" -d\tenable debug mode\n"); printf(" -H\tconnect to olsr node [default: localhost]\n"); s3d_usage(); } static float dist(float p1[], float p2[]) { float p[3]; p[0] = p1[0] - p2[0]; p[1] = p1[1] - p2[1]; p[2] = p1[2] - p2[2]; return sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]); } static float dirt(float p1[], float p2[], float p3[]) { float d; d = dist(p1, p2); if (d == 0) { p3[0] = ((float) 0.2 * rand()) / RAND_MAX - 0.1; p3[1] = ((float) 0.2 * rand()) / RAND_MAX - 0.1; p3[2] = ((float) 0.2 * rand()) / RAND_MAX - 0.1; d = s3d_vector_length(p3); } else { p3[0] = p2[0] - p1[0]; p3[1] = p2[1] - p1[1]; p3[2] = p2[2] - p1[2]; } return d; } static void handle_node(void) { struct node *node, *tmp_node; struct node_con *con; struct hash_it_t *hashit, *tmp_hashit = NULL; struct node_con ids; float angle, angle_rad; float tmp_mov_vec[3], desc_norm_vec[3] = {0, 0, -1}; if (node_hash->elements == 0) return; hashit = NULL; while (NULL != (hashit = hash_iterate(node_hash, hashit))) { node = (struct node *) hashit->bucket->data; if (node->node_type_modified) { if (node->obj_id > 0) s3d_del_object(node->obj_id); if (node->desc_id > 0) s3d_del_object(node->desc_id); if (node->node_type == 1) node->obj_id = s3d_clone(Global.obj_node_inet); else if (node->node_type == 2) node->obj_id = s3d_clone(Global.obj_node_tt); else node->obj_id = s3d_clone(Global.obj_node_normal); s3d_flags_on(node->obj_id, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); node->desc_id = s3d_draw_string(node->name_string, &node->desc_length); s3d_link(node->desc_id, node->obj_id); s3d_translate(node->desc_id, - node->desc_length / 2, -2, 0); s3d_flags_on(node->desc_id, S3D_OF_VISIBLE); node->node_type_modified = 0; } if ((node->last_seen < Global.output_block_counter - 1) && (node->visible)) { s3d_del_object(node->desc_id); s3d_del_object(node->obj_id); node->desc_id = -1; node->obj_id = -1; node->visible = 0; Global.node_count--; while (NULL != (tmp_hashit = hash_iterate(node_hash, tmp_hashit))) { tmp_node = (struct node *) tmp_hashit->bucket->data; if (node != tmp_node) { ids.address[0] = max_id(node->address, tmp_node->address); ids.address[1] = min_id(node->address, tmp_node->address); if (NULL != (con = (struct node_con*)hash_find(con_hash, &ids))) { s3d_del_object(con->obj_id); con->obj_id = -1; } } } } if (node->visible) { /* rotate node description so that they are always readable */ tmp_mov_vec[0] = Global.cam_position[0][0] - node->pos_vec[0]; tmp_mov_vec[1] = 0; /* we are not interested in the y value */ tmp_mov_vec[2] = Global.cam_position[0][2] - node->pos_vec[2]; angle = s3d_vector_angle(desc_norm_vec, tmp_mov_vec); /* take care of inverse cosinus */ if (tmp_mov_vec[0] > 0) { angle_rad = 90.0 / M_PI - angle; angle = 180 - (180.0 / M_PI * angle); } else { angle_rad = 90.0 / M_PI + angle; angle = 180 + (180.0 / M_PI * angle); } s3d_rotate(node->desc_id, 0, angle , 0); s3d_translate(node->desc_id, -cos(angle_rad)*node->desc_length / 2 , -1.5, sin(angle_rad)*node->desc_length / 2); } } return; } static void mov_add(float mov[], float p[], float fac) { /* if (fac>1000) return; fac=1000; */ mov[0] += fac * p[0]; mov[1] += fac * p[1]; mov[2] += fac * p[2]; } static void move_meshnode(struct node *node) { float null_vec[3] = {0, 0, 0}; float tmp_mov_vec[3]; float distance; if (!((node->mov_vec[0] == 0) && (node->mov_vec[1] == 0) && (node->mov_vec[2] == 0)) && node->visible) { distance = dirt(node->pos_vec, null_vec, tmp_mov_vec); mov_add(node->mov_vec, tmp_mov_vec, distance / 100); /* move a little bit to point zero */ if ((distance = dist(node->mov_vec, null_vec)) > 10.0) mov_add(node->pos_vec, node->mov_vec, 1.0 / ((float) distance)); else mov_add(node->pos_vec, node->mov_vec, 0.1); s3d_translate(node->obj_id, node->pos_vec[0], node->pos_vec[1], node->pos_vec[2]); /* reset movement vector */ node->mov_vec[0] = node->mov_vec[1] = node->mov_vec[2] = 0.0; } } static void color_handler(struct node_con *con) { float rgb = 0.0, r = 0.0, g = 0.0, b = 0.0, etx; int c, c1 = 0; if (con->etx1 == -1000.00 || con->etx2 == -1000) { c = 1; b = 1.0; } else { etx = (con->etx1 + con->etx2) / 2.0; /* very good link - bright blue */ if ((etx >= 1.0) && (etx < 1.5)) { c = 2; r = 0.5; g = 1.0; b = 1.0; /* good link - bright yellow */ } else if ((etx >= 1.5) && (etx < 2.0)) { rgb = 2.0 - etx; c = 3; c1 = con->color == 3 && rintf(con->rgb * 10) != rintf(rgb * 10) ? 1 : 0; r = 1.0; g = 1.0; b = rgb; /* not so good link - orange */ } else if ((etx >= 2.0) && (etx < 3.0)) { rgb = 1.5 - (etx / 2.0); c = 4; c1 = con->color == 4 && rintf(con->rgb * 10) != rintf(rgb * 10) ? 1 : 0; r = 1.0; g = rgb; /* bad link (almost dead) - brown */ } else if ((etx >= 3.0) && (etx < 5.0)) { rgb = 1.75 - (etx / 4.0); c = 5; c1 = con->color == 5 && rintf(con->rgb * 10) != rintf(rgb * 10) ? 1 : 0; r = rgb; g = rgb - 0.5; /* zombie link - grey */ } else if ((etx >= 5.0) && (etx < 1000.0)) { rgb = 1000.0 / (1500.0 + etx); c = 6; c1 = con->color == 6 && rintf(con->rgb * 10) != rintf(rgb * 10) ? 1 : 0; r = g = b = rgb; /* wtf - dark grey */ } else { c = 7; r = g = b = 0.3; } } if (con->color != c || c1) { s3d_pep_material(con->obj_id, r, g, b, r, g, b, r, g, b); con->color = c; if (rgb != 0.0) con->rgb = rgb; } } static void calc_node_mov(void) { float distance; float tmp_mov_vec[3], vertex_buf[6]; float f, wish_distance; struct node_con ids; struct node_con *con; struct node *first_node, *sec_node; struct hash_it_t *hashit1, *hashit2; if (con_hash->elements == 0) return; hashit1 = hashit2 = NULL; while (NULL != (hashit1 = hash_iterate(node_hash, hashit1))) { first_node = (struct node *) hashit1->bucket->data; if (!first_node->visible) continue; while (NULL != (hashit2 = hash_iterate(node_hash, hashit2))) { struct node_id max_node; sec_node = (struct node *) hashit2->bucket->data; if (!sec_node->visible) continue; max_node = max_id(first_node->address, sec_node->address); if (first_node != sec_node && id_comp(&max_node, &first_node->address) == 0) { ids.address[0] = first_node->address; ids.address[1] = sec_node->address; distance = dirt(first_node->pos_vec, sec_node->pos_vec, tmp_mov_vec); if ((NULL != (con = (struct node_con*)hash_find(con_hash, &ids)))) { /* we have a connection */ wish_distance = ((con->etx1_sqrt + con->etx2_sqrt)) + 4; f = powf(wish_distance / distance, 0.25); mov_add(first_node->mov_vec, tmp_mov_vec, (1 / f - 1)); mov_add(sec_node->mov_vec, tmp_mov_vec, -(1 / f - 1)); vertex_buf[0] = first_node->pos_vec[0]; vertex_buf[1] = first_node->pos_vec[1]; vertex_buf[2] = first_node->pos_vec[2]; vertex_buf[3] = sec_node->pos_vec[0]; vertex_buf[4] = sec_node->pos_vec[1]; vertex_buf[5] = sec_node->pos_vec[2]; s3d_pep_vertices(con->obj_id, vertex_buf, 2); if (Global.color_switch) color_handler(con); else { s3d_pep_material(con->obj_id, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ); con->color = 0; } } else { /* we have no connection */ if (distance < 0.1) distance = 0.1; mov_add(first_node->mov_vec, tmp_mov_vec, -100 / (distance * distance)); mov_add(sec_node->mov_vec, tmp_mov_vec, 100 / (distance * distance)); } } } } while (NULL != (hashit1 = hash_iterate(node_hash, hashit1))) { first_node = (struct node *) hashit1->bucket->data; move_meshnode(first_node); } } static void mainloop(void) { static int last_count = 0; int net_result; /* result of function net_main */ char nc_str[20]; float str_len; calc_node_mov(); handle_node(); if (Global.node_count && Global.node_count != last_count) { if (Global.obj_node_count) s3d_del_object(Global.obj_node_count); snprintf(nc_str, 20, "node count: %d", Global.node_count); Global.obj_node_count = s3d_draw_string(nc_str, &str_len); s3d_link(Global.obj_node_count, 0); s3d_flags_on(Global.obj_node_count, S3D_OF_VISIBLE); s3d_scale(Global.obj_node_count, 0.2); s3d_translate(Global.obj_node_count, -Global.left * 3.0 - (str_len * 0.2), -Global.bottom * 3.0 - 0.7, -3.0); last_count = Global.node_count; } if (Global.output_block_completed) { Global.output_block_counter++; Global.output_block_completed = 0; } while ((net_result = net_main()) != 0) { if (net_result == -1) { printf("that's it folks\n"); s3d_quit(); break; } } nanosleep(&sleep_time, NULL); return; } static int object_info(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; s3dw_object_info(hrmz); if (inf->object == 0) { Global.cam_position[0][0] = inf->trans_x; Global.cam_position[0][1] = inf->trans_y; Global.cam_position[0][2] = inf->trans_z; Global.cam_position[1][0] = inf->rot_x; Global.cam_position[1][1] = inf->rot_y; Global.cam_position[1][2] = inf->rot_z; Global.asp = inf->scale; if (Global.asp > 1.0) { Global.bottom = -1.0; Global.left = -Global.asp; } else { Global.bottom = (-1.0 / Global.asp); Global.left = -1.0; } } return 0; } static int keypress(struct s3d_evt *event) { struct s3d_key_event *key = (struct s3d_key_event *)event->buf; switch (key->keysym) { case S3DK_c: /* color on/off */ Global.color_switch = Global.color_switch ? 0 : 1; break; } return 0; } int main(int argc, char *argv[]) { int optchar; char olsr_host[256]; init_globals(); strncpy(olsr_host, "127.0.0.1", sizeof(olsr_host)); olsr_host[sizeof(olsr_host) - 1] = '\0'; lbuf[0] = '\0'; while ((optchar = getopt(argc, argv, "dhH:")) != -1) { switch (optchar) { case 'd': Global.debug = 1; break; case 'H': strncpy(olsr_host, optarg, sizeof(olsr_host)); olsr_host[sizeof(olsr_host) - 1] = '\0'; break; case 'h': default: print_usage(); return 0; } } if (Global.debug) printf("debug mode enabled ...\n"); /* initialize obj2ip linked list */ /* lst_initialize(); */ /* delete olsrs3d options */ while ((optind < argc) && (argv[optind][0] != '-')) optind++; /* optind may point to ip addr of '-H' */ optind--; argv[optind] = argv[0]; /* save program path */ argc -= optind; /* jump over olsrs3d options */ argv += optind; /* set extern int optind = 0 for parse_args in io.c */ optind = 0; process_init(); if (!net_init(olsr_host)) { s3d_set_callback(S3D_EVENT_OBJ_INFO, object_info); s3d_set_callback(S3D_EVENT_KEY, keypress); /*s3d_set_callback(S3D_EVENT_OBJ_CLICK,object_click); s3d_set_callback(S3D_EVENT_QUIT,stop); */ if (!s3d_init(&argc, &argv, "meshs3d")) { if (s3d_select_font("vera")) printf("font not found\n"); Global.obj_node_normal = s3d_import_model_file("objs/accesspoint.3ds"); Global.obj_node_inet = s3d_import_model_file("objs/accesspoint_inet.3ds"); Global.obj_node_tt = s3d_import_model_file("objs/internet.3ds"); Global.obj_btn_close = s3d_import_model_file("objs/btn_close.3ds"); Global.obj_s3d_url = s3d_import_model_file("objs/s3d_sf_net.3ds"); s3d_translate(Global.obj_s3d_url, 0.75, -0.75, -1); s3d_scale(Global.obj_s3d_url, 0.07); s3d_link(Global.obj_s3d_url, 0); s3d_flags_on(Global.obj_s3d_url, S3D_OF_VISIBLE); /* create_search_widget( 0, 0, 300 ); */ Global.obj_zero_point = s3d_new_object(); /* Output_border[0] = Output_border[1] = Output_border[2] = Output_border[3] = -1; */ printf("go, s3d\n"); s3d_mainloop(mainloop); s3d_quit(); net_quit(); printf("that's it\n"); } else printf("s3d init failed\n"); } return 0; } s3d-0.2.2.1/apps/meshs3d/meshs3d.h000066400000000000000000000063541361325167000164070ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #ifndef _MESHS3D_H_ #define _MESHS3D_H_ #include #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define max_id(x,y) (id_comp(&(x), &(y)) > 0?(x):(y)) #define min_id(x,y) (id_comp(&(x), &(y)) <=0?(x):(y)) #define NAMEMAX 128 #define MAXLINESIZE 1000 /* lines in a digraph just shouldn't get that longer ... */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ enum node_type { node_undefined = 0, node_ip, node_ip6, node_mac, node_generic }; struct node_id { union { uint32_t ip; uint8_t ip6[16]; uint8_t mac[6]; char* generic; } id; enum node_type type; }; /* linked list for the all connections */ struct node_con { struct node_id address[2]; float etx1; /* etx of left olsr node */ float etx2; /* etx of right olsr node */ float etx1_sqrt; /* sqrt of etx of left olsr node */ float etx2_sqrt; /* sqrt etx of right olsr node */ int obj_id; /* id of connection object in s3d */ int color; int old; /* check if the node has been announced in the last block */ float rgb; }; /* linked list for the neighbours of each olsr node */ struct olsr_neigh_list { struct olsr_neigh_list *next_olsr_neigh_list; /* pointer to next neighbour */ struct olsr_con *olsr_con; /* pointer to the connection */ }; /* we contruct a binary tree to handle the nodes */ struct node { struct node_id address; char name_string[NAMEMAX]; /* host ip */ int node_type; /* normal = 0, internet gateway = 1, via tt announced network = 2 */ int node_type_modified; /* node_type modified flag */ int last_seen; /* last seen counter */ int visible; /* is this node visible or vanished */ float pos_vec[3]; /* position vector in 3d "space" */ float mov_vec[3]; /* move vector */ int obj_id; /* id of node object in s3d */ int desc_id; /* id of node description object in s3d */ float desc_length; /* length of node description object in s3d */ }; struct glob { int debug; int obj_node_normal; int obj_node_inet; int obj_node_tt; int obj_btn_close; int obj_s3d_url; int obj_zero_point; int obj_node_count; int node_count; int color_switch; int output_block_counter; int output_block_completed; float asp; float bottom; float left; float cam_position[2][3]; }; extern char lbuf[MAXLINESIZE]; extern struct glob Global; extern struct hashtable_t *node_hash; extern struct hashtable_t *con_hash; /* process.c */ /* void lst_initialize(void); void lst_add(int id,struct olsr_node **olsr_node); void lst_del(int id); struct olsr_node *lst_search(int id); void lst_out(void); struct olsr_node *move_lst_ptr(int *id); */ int id_comp(const struct node_id* id1, const struct node_id* id2); int process_main(void); void process_init(void); /* net.c */ int net_init(char *host); int net_main(void); int net_quit(void); /* main */ /* void out_of_mem( void ); void print_etx( void ); float dist(float p1[], float p2[]); void window_error(char *msg); */ #endif /* _MESHS3D_H_ */ s3d-0.2.2.1/apps/meshs3d/mixed.data000066400000000000000000000010631361325167000166210ustar00rootroot00000000000000digraph { "104.131.131.1" -> "02:00:00:00:00:04"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="58.29", style=solid]; "104.65.0.42" -> "0.0.0.0/0.0.0.0"[label="TT"]; "master" -> "02:00:00:00:00:02" [label="1.7"] "master" -> "2001:db8:beef::1" [label="1.0"] "master" -> "2001:db8::1" [label="1.0"] "master" -> "00:ff:1c:68:00:00" [label="TT"] "master" -> "104.131.131.1" [label="5.7"] "2001:db8:beef::1" -> "3ffe:1900:4545:3:200:f8ff:fe21:67cf" [label="1.0"] "2001:db8::1" -> "3ffe:1900:4545:3:200:f8ff:fe21:67cf" [label="12.0"] } s3d-0.2.2.1/apps/meshs3d/net.c000066400000000000000000000052231361325167000156140ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #include #include #include #include #include #include #include #include #include #include #include "meshs3d.h" #define PORT 2004 static char buf[MAXDATASIZE]; static int sockfd, numbytes; int net_init(char *host) { struct hostent *he; struct sockaddr_in their_addr; /* connector's address information */ if ((he = gethostbyname(host)) == NULL) { /* get the host info */ herror("gethostbyname"); return 1; } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return 1; } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '\0', 8); /* zero the rest of the struct */ if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { close(sockfd); sockfd = -1; perror("connect"); return 1; } fcntl(sockfd, F_SETFL, O_NONBLOCK); return 0; } int net_main(void) { static int net_read_count = 0; int len_lbuf; if ((numbytes = recv(sockfd, buf, MAXDATASIZE - 1, 0)) == -1) { if (errno == EAGAIN) return 0; /* well, that's okay ... */ perror("recv"); return -1; } if (numbytes == 0) { printf("connection reset\n"); return -1; } buf[numbytes] = '\0'; /* check for potential buffer overflow */ len_lbuf = strlen(lbuf); if ((len_lbuf + strlen(buf)) < MAXLINESIZE) { strncat(lbuf, buf, MAXLINESIZE - len_lbuf - 1); } else { /* hope that carriage return is now in buf */ if (len_lbuf < MAXLINESIZE) { if (Global.debug) printf("WARNING: lbuf almost filled without *any* carriage return within that data !\nAppending truncated buf to lbuf to prevent buffer overflow.\n"); strncat(lbuf, buf, MAXLINESIZE - len_lbuf - 1); } else { if (Global.debug) printf("ERROR: lbuf filled without *any* carriage return within that data !\nClearing lbuf to prevent buffer overflow.\n"); strncpy(lbuf, buf, MAXLINESIZE); if (MAXLINESIZE > 0) lbuf[MAXLINESIZE - 1] = '\0'; } } process_main(); if (++net_read_count > 5) { net_read_count = 0; return 0; /* continue mainloop */ } else { return 1; /* continue reading data from socket */ } } int net_quit(void) { close(sockfd); return 0; } s3d-0.2.2.1/apps/meshs3d/olsrd1.data000066400000000000000000000010461361325167000167200ustar00rootroot00000000000000digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="58.29", style=solid]; "104.131.0.42"[shape=box]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.65.0.42" -> "0.0.0.0/0.0.0.0"[label="HNA"]; "0.0.0.0/0.0.0.0"[shape=diamond]; } digraph topology { "104.131.131.1" -> "104.131.0.71"[label="0.00", style=dashed]; "104.131.131.1" -> "104.131.0.42"[label="58.29", style=solid]; "104.131.0.42"[shape=box]; "104.192.0.40" -> "104.192.192.166"[label="2.06"]; "104.65.0.42"; } s3d-0.2.2.1/apps/meshs3d/process.c000066400000000000000000000317411361325167000165100ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #include /* NULL */ #include /* strlen(), memmove() */ #include /* rand(), malloc(), realloc(), free() */ #include #include /* sqrt() */ #include #include #include #include #include #include "allocate.c" #include "hash.h" #include "meshs3d.h" /* extern used in net.c */ char lbuf[MAXLINESIZE]; int blockcnt = 0; struct hashtable_t *node_hash; struct hashtable_t *con_hash; int id_comp(const struct node_id* id1, const struct node_id* id2) { if (id1->type == id2->type) { switch (id1->type) { case node_ip: if (id1->id.ip == id2->id.ip) { return 0; } else if (id1->id.ip < id2->id.ip) { return -1; } else { return 1; } break; case node_ip6: return memcmp(id1->id.ip6, id2->id.ip6, sizeof(id1->id.ip6)); case node_mac: return memcmp(id1->id.mac, id2->id.mac, sizeof(id1->id.mac)); case node_generic: if (id1->id.generic == NULL) { if (id2->id.generic == NULL) return 0; else return -1; } else { if (id2->id.generic == NULL) return 1; else return strcmp(id1->id.generic, id2->id.generic); } case node_undefined: return 0; }; } else if (id1->type < id2->type) { return -1; } else { return 1; } return 0; } static int id_choose(const struct node_id *id, int32_t size) { uint32_t hash = 0; size_t i; struct node_id tmp = *id; switch (id->type) { case node_ip: for (i = 0; i < sizeof(id->id.ip); i++) { hash += tmp.id.ip & 0xff; tmp.id.ip = tmp.id.ip >> 8; hash += (hash << 10); hash ^= (hash >> 6); } break; case node_ip6: for (i = 0; i < sizeof(id->id.ip6); i++) { hash += tmp.id.ip6[i]; hash += (hash << 10); hash ^= (hash >> 6); } break; case node_mac: for (i = 0; i < sizeof(id->id.mac); i++) { hash += tmp.id.mac[i]; hash += (hash << 10); hash ^= (hash >> 6); } break; case node_generic: hash = 0x1505; if (id->id.generic == NULL) return hash; for (i = strlen(id->id.generic); i != 0; i--) hash += (hash << 5) + id->id.generic[i - 1]; return hash % size; break; case node_undefined: hash = 0; }; hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash % size; } static int long_comp(const void *data1, const void *data2) { struct node_con *con1 = (struct node_con*)data1; struct node_con *con2 = (struct node_con*)data2; int cmp1, cmp2; cmp1 = id_comp(&con1->address[0], &con2->address[0]); cmp2 = id_comp(&con1->address[1], &con2->address[1]); if (cmp1 == 0) { return cmp2; } else { return cmp1; } return 0; } static int long_choose(const void *data, int32_t size) { struct node_con *con = (struct node_con*)data; int hash = id_choose(&con->address[0], size)+id_choose(&con->address[1], size); return hash % size; } static int orig_comp(const void *data1, const void *data2) { struct node_id *id1 = (struct node_id*)data1; struct node_id *id2 = (struct node_id*)data2; return id_comp(id1, id2); } /* hashfunction to choose an entry in a hash table of given size */ /* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */ static int orig_choose(const void *data, int32_t size) { struct node_id *id = (struct node_id*)data; return id_choose(id, size); } static void exit_error(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); va_end(args); exit(EXIT_FAILURE); } void process_init(void) { /* initialize hashtable */ if (NULL == (node_hash = hash_new(1600, orig_comp, orig_choose))) exit_error("Can't create hashtable node_hash\n"); if (NULL == (con_hash = hash_new(1600, long_comp, long_choose))) exit_error("Can't create hashtable con_hash\n"); return; } static void free_mesh_node(struct node_id* id) { if (id->type == node_generic && id->id.generic != NULL) free(id->id.generic); memset(id, '\0', sizeof(struct node_id)); } static void copy_mesh_node(struct node_id* dst, struct node_id* src) { *dst = *src; if (src->type == node_generic && src->id.generic != NULL) { dst->id.generic = strdup(src->id.generic); } } static void handle_con(struct node_id id1, struct node_id id2, float etx) { struct node_con ids; struct node_con *con; struct hashtable_t *swaphash; ids.address[0] = max_id(id1, id2); ids.address[1] = min_id(id1, id2); con = (struct node_con*) hash_find(con_hash, &ids); if (con == NULL) { con = (struct node_con *) debugMalloc(sizeof(struct node_con), 102); copy_mesh_node(&con->address[0], &ids.address[0]); copy_mesh_node(&con->address[1], &ids.address[1]); con->color = 0; /* draw line */ con->obj_id = s3d_new_object(); s3d_push_material(con->obj_id, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); s3d_push_vertex(con->obj_id, 0, 0, 0); s3d_push_vertex(con->obj_id, 0, 0, 0); s3d_push_line(con->obj_id, 0, 1, 0); s3d_flags_on(con->obj_id, S3D_OF_VISIBLE); con->rgb = 0.00; con->etx1 = 1.00; con->etx2 = 1.00; con->etx1_sqrt = 1.00; con->etx2_sqrt = 1.00; hash_add(con_hash, con); } if (con->obj_id == -1) { con->obj_id = s3d_new_object(); s3d_push_material(con->obj_id, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); s3d_push_vertex(con->obj_id, 0, 0, 0); s3d_push_vertex(con->obj_id, 0, 0, 0); s3d_push_line(con->obj_id, 0, 1, 0); s3d_flags_on(con->obj_id, S3D_OF_VISIBLE); } if (id_comp(&con->address[0], &id1) == 0) { con->etx1 = etx; if (etx != -1000.00) con->etx1_sqrt = sqrt(etx); else con->etx1_sqrt = sqrt(2.0); } else { con->etx2 = etx; if (etx != -1000.00) con->etx2_sqrt = sqrt(etx); else con->etx2_sqrt = sqrt(2.0); } if (con_hash->elements * 4 > con_hash->size) { swaphash = hash_resize(con_hash, con_hash->size * 2); if (swaphash == NULL) exit_error("Couldn't resize hash table \n"); con_hash = swaphash; } con->old = 0; } static struct node *handle_mesh_node(struct node_id id, char *name_string) { struct node *orig_node; struct hashtable_t *swaphash; if (node_hash->elements * 4 > node_hash->size) { swaphash = hash_resize(node_hash, node_hash->size * 2); if (swaphash == NULL) exit_error("Couldn't resize hash table \n"); node_hash = swaphash; } orig_node = (struct node *) hash_find(node_hash, &id); if (NULL == orig_node) { orig_node = (struct node *)debugMalloc(sizeof(struct node), 101); copy_mesh_node(&orig_node->address, &id); strncpy(orig_node->name_string, name_string, sizeof(orig_node->name_string)); orig_node->name_string[sizeof(orig_node->name_string) - 1] = 0; orig_node->node_type = 0; orig_node->node_type_modified = 1; orig_node->visible = 1; orig_node->pos_vec[0] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; orig_node->pos_vec[1] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; orig_node->pos_vec[2] = ((float) 2.0 * rand()) / RAND_MAX - 1.0; orig_node->mov_vec[0] = orig_node->mov_vec[1] = orig_node->mov_vec[2] = 0.0; orig_node->obj_id = -1; orig_node->desc_id = -1; hash_add(node_hash, orig_node); Global.node_count++; } if (!orig_node->visible) { orig_node->visible = 1; orig_node->node_type_modified = 1; Global.node_count++; } orig_node->last_seen = Global.output_block_counter; return orig_node; } static int parse_mac(const char *src, uint8_t dst[6]) { unsigned int n[6]; int i; if (sscanf(src, "%x:%x:%x:%x:%x:%x", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5]) != 6) { if(sscanf(src, "%2x%2x.%2x%2x.%2x%2x", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5]) != 6) { return 1; } } for (i = 0; i < 6; i++) { if (n[i] <= 255) dst[i] = (uint8_t)n[i]; else return 1; } return 0; } static int parse_address(const char *src, struct node_id *dst) { dst->type = node_undefined; /* try to read mac */ if (parse_mac(src, dst->id.mac) == 0) { dst->type = node_mac; return 0; } /* try to read ip */ if (inet_pton(AF_INET, src, &dst->id.ip) == 1) { dst->type = node_ip; return 0; } /* try to read ipv6 */ if (inet_pton(AF_INET6, src, &dst->id.ip6) == 1) { dst->type = node_ip6; return 0; } if ((dst->id.generic = strdup(src))) { dst->type = node_generic; return 0; } /* failure */ return 1; } int process_main(void) { int dn; float f; char *lbuf_ptr, *last_cr_ptr, *con_from, *con_from_end, *con_to, *con_to_end, *etx, *etx_end, *tmp_char; struct hash_it_t *hashit; struct node_con *con; char tt_name[NAMEMAX]; char tt_node[NAMEMAX]; struct node *tmp_node; struct node_id int_con_from, int_con_to; unsigned int address; unsigned int line_blockcnt = 0; lbuf_ptr = lbuf; last_cr_ptr = NULL; con_from = con_from_end = con_to = con_to_end = etx = etx_end = NULL; dn = 0; memset(&int_con_from, '\0', sizeof(struct node_id)); memset(&int_con_to, '\0', sizeof(struct node_id)); while ((*lbuf_ptr) != '\0') { if ((*lbuf_ptr) == '\n') { line_blockcnt = blockcnt; last_cr_ptr = lbuf_ptr; con_from = con_from_end = con_to = con_to_end = etx = etx_end = NULL; dn = 0; } if ((*lbuf_ptr) == '{') { dn = 0; blockcnt++; } if ((*lbuf_ptr) == '}') { blockcnt--; line_blockcnt = blockcnt; last_cr_ptr = lbuf_ptr; } if ((*lbuf_ptr) == '"' && blockcnt == 1) { switch (dn) { case 0: con_from = lbuf_ptr + 1; break; case 1: con_from_end = lbuf_ptr; break; case 2: con_to = lbuf_ptr + 1; break; case 3: con_to_end = lbuf_ptr; break; case 4: etx = lbuf_ptr + 1; break; case 5: etx_end = lbuf_ptr; break; } if (++dn == 6) { (*con_from_end) = (*con_to_end) = (*etx_end) = '\0'; /* if( Global.debug ) printf( "con_from: %s, con_to: %s, etx: %s\n", con_from, con_to, etx ); */ /* announced network via TT */ if (strncmp(etx, "HNA", NAMEMAX) == 0 || strncmp(etx, "TT", NAMEMAX) == 0) { if (strncmp(con_to, "0.0.0.0/0.0.0.0", NAMEMAX) == 0) { if (parse_address(con_from, &int_con_from) != 0) { printf("%s is not a valid address\n", con_from); continue; } tmp_node = handle_mesh_node(int_con_from, con_from); if (tmp_node->node_type != 1) { tmp_node->node_type = 1; tmp_node->node_type_modified = 1; if (Global.debug) printf("new internet: %s\n", tmp_node->name_string); } } else { memmove(tt_node, con_to, NAMEMAX); if ((tmp_char = strchr(tt_node, (int)'/'))) { tmp_char++; address = (int) - inet_network(tmp_char); sprintf(tt_name, "%u", (unsigned int)(32 - ceil(log(address) / log(2)))); strcpy(tmp_char, tt_name); tmp_char--; } if (tmp_char != NULL) tmp_char[0] = '\0'; if (parse_address(con_from, &int_con_from) != 0) { printf("%s is not a valid address\n", con_from); continue; } if (parse_address(tt_node, &int_con_to) != 0) { printf("%s is not a valid address\n", tt_node); continue; } if (tmp_char != NULL) tmp_char[0] = '/'; handle_mesh_node(int_con_from, con_from); tmp_node = handle_mesh_node(int_con_to, tt_node); if (tmp_node->node_type != 2) { tmp_node->node_type = 2; tmp_node->node_type_modified = 1; if (Global.debug) printf("new tt network: %s\n", tmp_node->name_string); } handle_con(int_con_from, int_con_to, -1000); } } else { f = strtod(etx, NULL); if (f < 1.0) f = 999.0; if (parse_address(con_from, &int_con_from) != 0) { printf("%s is not a valid address\n", con_from); continue; } if (parse_address(con_to, &int_con_to) != 0) { printf("%s is not a valid address\n", con_to); continue; } handle_mesh_node(int_con_from, con_from); handle_mesh_node(int_con_to, con_to); handle_con(int_con_from, int_con_to, f); } /* remove zerobyte */ (*con_from_end) = (*con_to_end) = (*etx_end) = '"'; free_mesh_node(&int_con_from); free_mesh_node(&int_con_to); con_from = con_from_end = con_to = con_to_end = etx = etx_end = NULL; dn = 0; last_cr_ptr = lbuf_ptr; } } else if ((blockcnt == 0) && ((*lbuf_ptr) == '}') && ((*(lbuf_ptr + 1)) == '\n')) { Global.output_block_completed = 1; hashit = NULL; /* check for old nodes and remove them */ while (NULL != (hashit = hash_iterate(con_hash, hashit))) { con = (struct node_con *) hashit->bucket->data; if (con->old) { if (con->obj_id != -1) s3d_del_object(con->obj_id); con->obj_id = -1; hash_remove_bucket(con_hash, hashit); } con->old = 1; /* set con on old. if it's still old in the next iteration, we will remove it. */ } } lbuf_ptr++; } if (last_cr_ptr != NULL) { blockcnt = line_blockcnt; memmove(lbuf, last_cr_ptr + 1, strlen(last_cr_ptr)); } return 0; } s3d-0.2.2.1/apps/meshs3d/subgraph.data000066400000000000000000000014501361325167000173260ustar00rootroot00000000000000digraph { "02:ca:ff:ee:ba:02" -> "host1" [label="1.000"] "02:ca:ff:ee:ba:02" -> "02:ca:ff:ee:ba:04" [label="1.000"] "02:ca:ff:ee:ba:02" -> "0a:f0:07:15:a7:17" [label="HNA"] subgraph "cluster_02:ca:ff:ee:ba:02" { "02:ca:ff:ee:ba:02" [peripheries=2] } "02:ca:ff:ee:ba:03" -> "02:ca:ff:ee:ba:02" [label="1.000"] "02:ca:ff:ee:ba:03" -> "76:3f:b3:52:72:71" [label="HNA"] subgraph "cluster_02:ca:ff:ee:ba:03" { "02:ca:ff:ee:ba:03" [peripheries=2] } subgraph "cluster_02:ca:ff:ee:ba:03" { "02:ca:ff:ee:ba:03" [peripheries=2] "02:ca:ff:ee:ba:04" } "02:ca:ff:ee:ba:04" -> "host1" [label="1.000"] "host1" -> "02:ca:ff:ee:ba:02" [label="1.000"] "host1" -> "02:ca:ff:ee:ba:04" [label="1.000"] "host1" -> "f2:f7:56:31:b3:8e" [label="HNA"] subgraph "cluster_host1" { "host1" [peripheries=2] } } s3d-0.2.2.1/apps/s3d_x11gate/000077500000000000000000000000001361325167000153355ustar00rootroot00000000000000s3d-0.2.2.1/apps/s3d_x11gate/CMakeLists.txt000066400000000000000000000013641361325167000201010ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(s3d_x11gate C) if (XTST_FOUND AND XTST_FOUND) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(s3d_x11gate s3d_x11gate.c) target_link_libraries(s3d_x11gate s3d ${X11_LIBRARIES} ${XTST_LIBRARIES}) # install install(TARGETS s3d_x11gate RUNTIME DESTINATION "${BIN_INSTALL_DIR}") else (XTST_FOUND AND XTST_FOUND) if (NOT XTST_FOUND) PkgStatus_Later("xtst (pkg name: libxtst-dev)") endif (NOT XTST_FOUND) if (NOT X11_FOUND) PkgStatus_Later("x11 (pkg name: libx11-dev)") endif (NOT X11_FOUND) # print late status Collected_PkgStatus("s3d_x11gate") endif (XTST_FOUND AND XTST_FOUND) s3d-0.2.2.1/apps/s3d_x11gate/TODO000066400000000000000000000001011361325167000160150ustar00rootroot00000000000000- different depths - handle special keys properly - honor aspect s3d-0.2.2.1/apps/s3d_x11gate/s3d_x11gate.c000066400000000000000000000170771361325167000175400ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include /* s3d_*() */ #include /* getenv() */ #include /* printf() */ #include /* Ximage, Display, X*() */ #include /* XDestroyImage() */ #define XK_MISCELLANY #include /* keysyms */ #include /* keyboard/mouse input via s3d */ #include /* */ #include /* nanosleep() */ #include /* gettimeofday */ #include #include #include #ifndef S3DX11UNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DX11UNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DX11UNUSED(x) /* x */ #else #define S3DX11UNUSED(x) x #endif #endif static int oid; static XImage *image; static Display *dpy = NULL; static int window, scr; static unsigned int width, height, depth; static Visual *visual; static XShmSegmentInfo shminfo; static char *tex_image = NULL, *otex_image = NULL, *img1, *img2; static struct timeval start, end; static int iterations; static float count[3]; static int get_shift(uint32_t t) { int i = 0; while (t) { t >>= 1; i++; } return i; } static void mainloop(void) { #define MAGIC_CHANGED ((unsigned int)~0) unsigned int x, y; int rs, gs, bs; uint32_t d; int bpp; char *swap_timg; unsigned int last_change, start_change; gettimeofday(&end, NULL); count[0] += (end.tv_sec - start.tv_sec) * 10000000 + end.tv_usec - start.tv_usec; start.tv_sec = end.tv_sec; start.tv_usec = end.tv_usec; /* image = XGetImage(dpy,window,0,0,width,height,AllPlanes,ZPixmap);*/ XShmGetImage(dpy, window, image, 0, 0, 0xffffffff); gettimeofday(&end, NULL); count[1] += (end.tv_sec - start.tv_sec) * 10000000 + end.tv_usec - start.tv_usec; start.tv_sec = end.tv_sec; start.tv_usec = end.tv_usec; if (image->format == ZPixmap) { printf("Ximage: %dx%d, format %d (%d), bpp: %d, depth %d, pad %d\n", image->width, image->height, image->format, ZPixmap, image->bits_per_pixel, image->depth, image->bitmap_pad); rs = get_shift(image->red_mask) - 8; gs = get_shift(image->green_mask) - 8; bs = get_shift(image->blue_mask) - 8; bpp = (image->bits_per_pixel / 8); /* rgb is not bgr */ rs = rs; gs = gs - 8; bs = bs - 16; printf("Ximage: rgb: %d|%d|%d\n", rs, gs, bs);; /* printf("red: size %d, offset %d\n",rs,roff); printf("green: size %d, offset %d\n",gs,goff); printf("blue: size %d, offset %d\n",bs,boff); printf("bits per pixel:%d\n",bpp);*/ last_change = MAGIC_CHANGED; start_change = MAGIC_CHANGED; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { d = *((uint32_t *)(image->data + (y * width + x) * bpp)); ((uint32_t *)tex_image)[(y*width+x)] = (rs > 0 ? ((d & image->red_mask) >> rs) : ((d & image->red_mask) << -rs)) | (gs > 0 ? ((d & image->green_mask) >> gs) : ((d & image->green_mask) << -gs)) | (bs > 0 ? ((d & image->blue_mask) >> bs) : ((d & image->blue_mask) << -bs)) | 255u << 24; if (((uint32_t *)tex_image)[(y*width+x)] != ((uint32_t *)otex_image)[(y*width+x)]) last_change = y; } if (last_change != MAGIC_CHANGED) { if (start_change == MAGIC_CHANGED) { start_change = y; /* printf("setting start_change to %d\n",start_change); */ } if (last_change != y) { /* last change is already over, post it! */ s3d_load_texture(oid, 0, 0, start_change, width, last_change - start_change + 1, (unsigned char *)tex_image + start_change*width * sizeof(uint32_t)); start_change = MAGIC_CHANGED; last_change = MAGIC_CHANGED; } } } /* posting the last bit, maybe */ if (last_change != MAGIC_CHANGED) { /* printf("last one: [%d-%d]",start_change,last_change);*/ s3d_load_texture(oid, 0, 0, start_change, width, last_change - start_change, (unsigned char *)tex_image + start_change*width * sizeof(uint32_t)); } /* s3d_load_texture(oid,0,0,0,width,height,tex_image); */ /* swap images */ swap_timg = tex_image; tex_image = otex_image; otex_image = swap_timg; } gettimeofday(&end, NULL); count[2] += (end.tv_sec - start.tv_sec) * 10000000 + end.tv_usec - start.tv_usec; start.tv_sec = end.tv_sec; start.tv_usec = end.tv_usec; iterations++; /* XDestroyImage(image);*/ /* nanosleep(&t,NULL); */ } static int keypress(struct s3d_evt *event) { int key; int kc; key = *((unsigned short *)event->buf); printf("received key %d ", key); kc = XKeysymToKeycode(dpy, key); if (kc == 0) { kc = XKeysymToKeycode(dpy, 0xFF00 + key); printf(" (%04x) ", 0xFF00 + key); } if (kc == 0) { if (key == 8) { kc = 22; printf("!backspace!"); } } printf("using key: %d, keycode %d (%04x)\n", key, kc, kc); if (kc != 0) XTestFakeKeyEvent(dpy, kc, 1, 1); /* XTestFakeKeyEvent(dpy, kc, 0, 1);*/ return 0; } static int mouseclick(struct s3d_evt *S3DX11UNUSED(event)) { int i; printf("thats it, collecting:\n"); for (i = 0; i < 3; i++) printf("[%d] %f\n", i, count[i] / iterations); exit(0); } int main(int argc, char **argv) { const char *disp = NULL; int a, b, c, d; int xt; if (disp == NULL) disp = getenv("DISPLAY"); if (disp == NULL) disp = ""; /* fallback */ dpy = XOpenDisplay(disp); if (!dpy) { printf("couldn't open display\n"); return -1; } count[0] = count[1] = count[2] = 0; iterations = 0; if (!s3d_init(&argc, &argv, "X11-gate")) { scr = DefaultScreen(dpy); window = RootWindow(dpy, scr); width = DisplayWidth(dpy, scr); height = DisplayHeight(dpy, scr); visual = DefaultVisual(dpy, scr); depth = DefaultDepth(dpy, scr); XLockDisplay(dpy); xt = XTestQueryExtension(dpy, &a, &b, &c, &d); XUnlockDisplay(dpy); if (xt) { printf("having xtest extension ...\n"); } /* X11 shm - http://www.xfree86.org/current/mit-shm.html */ image = XShmCreateImage(dpy, visual, depth, ZPixmap, NULL, &shminfo, width, height); shminfo.shmid = shmget(IPC_PRIVATE, image->bytes_per_line * image->height, IPC_CREAT | 0777); shminfo.shmaddr = image->data = (char*)shmat(shminfo.shmid, NULL, 0); shmctl(shminfo.shmid, IPC_RMID, NULL); shminfo.readOnly = False; if (!XShmAttach(dpy, &shminfo)) printf("cannot use the shared memory segment .. :( \n"); else printf("can use share segment :D\n"); XSync(dpy, False); s3d_set_callback(S3D_EVENT_OBJ_CLICK, mouseclick); s3d_set_callback(S3D_EVENT_KEY, keypress); printf("screen: %dx%d\n", width, height); img1 = (char*)malloc(width * height * sizeof(uint32_t)); img2 = (char*)malloc(width * height * sizeof(uint32_t)); tex_image = img1; otex_image = img2; oid = s3d_new_object(); s3d_push_vertex(oid, -5, -5, 0); s3d_push_vertex(oid, 5, -5, 0); s3d_push_vertex(oid, 5, 5, 0); s3d_push_vertex(oid, -5, 5, 0); s3d_push_material_a(oid, 0.8, 0.0, 0.0 , 1.0, 1.0, 1.0, 1.0 , 1.0, 0.8, 0.0, 0.0 , 1.0); s3d_push_polygon(oid, 0, 2, 1, 0); s3d_pep_polygon_tex_coord(oid, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0); s3d_push_polygon(oid, 0, 3, 2, 0); s3d_pep_polygon_tex_coord(oid, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0); s3d_push_texture(oid, width, height); /* push data on texture 0 position (0,0) */ s3d_pep_material_texture(oid, 0); /* assign texture 0 to material 0 */ s3d_flags_on(oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); gettimeofday(&start, NULL); s3d_mainloop(mainloop); free(img1); free(img2); } s3d_quit(); return 0; } s3d-0.2.2.1/apps/s3dfm/000077500000000000000000000000001361325167000143265ustar00rootroot00000000000000s3d-0.2.2.1/apps/s3dfm/CMakeLists.txt000066400000000000000000000011611361325167000170650ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(s3dfm C) if (PTHREADS_FOUND) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(s3dfm animation.c box.c dialog.c event.c fly.c focus.c fs.c icon.c main.c node.c parse.c string.c) target_link_libraries(s3dfm s3d s3dw ${PTHREADS_LIBRARIES} ${MATH_LIBRARIES}) # install install(TARGETS s3dfm RUNTIME DESTINATION "${BIN_INSTALL_DIR}") else (PTHREADS_FOUND) PkgStatus_Later("pthreads") # print late status Collected_PkgStatus("s3dfm") endif (PTHREADS_FOUND) s3d-0.2.2.1/apps/s3dfm/TODO000066400000000000000000000001341361325167000150140ustar00rootroot00000000000000- let blocks fly in animation - copy - delete - create directories - load 3dsfiles on click s3d-0.2.2.1/apps/s3dfm/animation.c000066400000000000000000000044351361325167000164570ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include /* printf(),NULL */ #include /* fabs() */ #include #define SCALE 1 /* the animation stack */ static t_node *ani_s[MAXANI]; static int ani_n = 0; /* is node f already on stack? */ int ani_onstack(t_node *f) { int i; for (i = 0; i < ani_n; i++) if (ani_s[i] == f) return i; /* already in list */ return -1; } /* add an node on the animation stack */ void ani_add(t_node *f) { if (ani_n < MAXANI) { if (-1 != ani_onstack(f)) return; /* already in list */ ani_s[ani_n] = f; ani_iterate(f); /* printf("[A]ni ADD %d\n",ani_n); */ ani_n++; } else /* no place, finish now */ ani_finish(f, -1); } /* delete an node from the animation stack */ void ani_del(int i) { if ((i >= 0) && (i < ani_n)) { /* printf("[A]ni DEL %d\n",i);*/ ani_n--; ani_s[i] = ani_s[ani_n]; /* that should also work if i is the last one */ } else { printf("[F]ATAL: can't delete animation!\n"); } } /* well ... */ void ani_doit(t_node *f) { s3d_translate(f->oid, f->dpx, f->dpy, f->dpz); s3d_scale(f->oid, f->dscale); } /* finish an animation on the stack, stack index i */ void ani_finish(t_node *f, int i) { f->dpx = f->px; f->dpy = f->py; f->dpz = f->pz; f->dscale = f->scale; ani_doit(f); if (i != -1) ani_del(i); } void ani_iterate(t_node *f) { f->dpx = (f->px + f->dpx * ZOOMS) / (ZOOMS + 1); f->dpy = (f->py + f->dpy * ZOOMS) / (ZOOMS + 1); f->dpz = (f->pz + f->dpz * ZOOMS) / (ZOOMS + 1); f->dscale = (f->scale + f->dscale * ZOOMS) / (ZOOMS + 1); } /* checks if f is good enough */ int ani_check(t_node *f) { float x, y, z; x = f->dpx - f->px; y = f->dpy - f->py; z = f->dpz - f->pz; if (((fabs(f->dscale - f->scale) / f->scale) > 0.01) || (sqrt(x*x + y*y + z*z) > 0.01)) return 0; return 1; } /* doing the whole animation thing */ void ani_mate(void) { int i; t_node *f; s3dw_ani_mate(); for (i = 0; i < ani_n; i++) { f = ani_s[i]; if (f->oid == -1) { /* kick out bad animations */ ani_del(i); i--; } else { ani_iterate(f); if (ani_check(f)) { ani_finish(f, i); i--; /* a new object is here now, take care in the next iteration */ } else { ani_doit(f); } } } } s3d-0.2.2.1/apps/s3dfm/box.c000066400000000000000000000256171361325167000152750ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include /* printf() */ #include /* sin(),cos() */ #include /* strlen() */ void box_draw(t_node *dir) { box_buildblock(dir); box_sidelabel(dir); ani_doit(dir); s3d_flags_on(dir->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(dir->objs.close, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(dir->objs.title, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(dir->objs.select, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(dir->objs.titlestr, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); dir->disp = D_DIR; box_draw_icons(dir); } /* draw all the icons which are not displayed yet */ void box_draw_icons(t_node *dir) { int i; printf("box_draw_icons(%s, %d subs)\n", dir->name, dir->n_sub); for (i = 0; i < dir->n_sub; i++) { if (dir->sub[i]->disp == D_NONE) icon_draw(dir->sub[i]); } box_order_icons(dir); } /* places the string at the left side of the cube */ void box_sidelabel(t_node *dir) { float len; if (dir->objs.str == -1) { dir->objs.str = s3d_draw_string(dir->name, &len); if (len < 2) len = 2; dir->objs.strlen = len; } s3d_rotate(dir->objs.str, 0, 90, 0); s3d_translate(dir->objs.str, 1.1, 0.3, 1); s3d_scale(dir->objs.str, (float)1.8 / (dir->objs.strlen)); s3d_scale(dir->objs.str, (float)1.8 / (dir->objs.strlen)); s3d_link(dir->objs.str, dir->oid); s3d_flags_on(dir->objs.str, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* gives another color for the focused box */ void box_focus_color(t_node *dir, int on) { s3d_pep_material(dir->oid, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3, 0.5 + on*0.3); } /* creates a big block which will hold files and subdirs on top */ int box_buildblock(t_node *dir) { char fname[30]; char *fullname = fname; float len; float vertices[] = { -BHP, 0, -BHP, -BHP, 0, BHP, BHP, 0, BHP, BHP, 0, -BHP, -BHP, BHH, -BHP, -BHP, BHH, BHP, BHP, BHH, BHP, BHP, BHH, -BHP, -1, 0, 0.8, -1, BOXHEIGHT, 0.8, 1, BOXHEIGHT, 0.8, 1, 0, 0.8 }; float xvertices[] = { 0.8, BHH - 0.2, 0.8, 0.8, BHH , 0.8, BHP, BHH , 0.8, BHP, BHH - 0.2, 0.8, 0.8, BHH - 0.2, 1.0, 0.8, BHH , 1.0, BHP, BHH , 1.0, BHP, BHH - 0.2, 1.0 }; float svertices[] = { 0.6, BHH - 0.2, 0.8, 0.6, BHH , 0.8, 0.8, BHH , 0.8, 0.8, BHH - 0.2, 0.8, 0.6, BHH - 0.2, 1.0, 0.6, BHH , 1.0, 0.8, BHH , 1.0, 0.8, BHH - 0.2, 1.0 }; float tvertices[] = { -BHP, BHH - 0.2, 0.8, -BHP, BHH , 0.8, 0.6, BHH , 0.8, 0.6, BHH - 0.2, 0.8, -BHP, BHH - 0.2, 1.0, -BHP, BHH , 1.0, 0.6, BHH , 1.0, 0.6, BHH - 0.2, 1.0 }; uint32_t bar_poly[] = { 4, 5, 6, 0, 4, 6, 7, 0, 3, 7, 4, 0, 3, 4, 0, 0 }; /* printf("new block for %s\n",dir->name);*/ dir->oid = s3d_new_object(); /* draw block outside */ s3d_push_vertices(dir->oid, vertices, sizeof(vertices) / (3*sizeof(float))); s3d_push_material(dir->oid, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ); /* top */ s3d_push_polygon(dir->oid, 4, 6, 5, 0); s3d_push_polygon(dir->oid, 4, 7, 6, 0); /* bottom */ s3d_push_polygon(dir->oid, 8, 11, 3, 0); s3d_push_polygon(dir->oid, 8, 3, 0, 0); /* left */ s3d_push_polygon(dir->oid, 0, 4, 5, 0); s3d_push_polygon(dir->oid, 0, 5, 1, 0); /* back */ s3d_push_polygon(dir->oid, 3, 7, 4, 0); s3d_push_polygon(dir->oid, 3, 4, 0, 0); /* right */ s3d_push_polygon(dir->oid, 2, 6, 7, 0); s3d_push_polygon(dir->oid, 2, 7, 3, 0); /* front */ s3d_push_polygon(dir->oid, 8, 9, 10, 0); s3d_push_polygon(dir->oid, 8, 10, 11, 0); /* left inner side */ s3d_push_polygon(dir->oid, 1, 5, 9, 0); s3d_push_polygon(dir->oid, 1, 9, 8, 0); /* right inner side */ s3d_push_polygon(dir->oid, 2, 11, 10, 0); s3d_push_polygon(dir->oid, 2, 10, 6, 0); /* top inner side */ s3d_push_polygon(dir->oid, 9, 5, 6, 0); s3d_push_polygon(dir->oid, 9, 6, 10, 0); /* draw the select, close buttons ... */ dir->objs.close = s3d_new_object(); s3d_push_material(dir->objs.close, 0.5, 0.3, 0.3, 0.5, 0.3, 0.3, 0.5, 0.3, 0.3 ); s3d_push_vertices(dir->objs.close, xvertices, sizeof(xvertices) / (3*sizeof(float))); s3d_push_polygons(dir->objs.close, bar_poly, sizeof(bar_poly) / (sizeof(uint32_t)*4)); s3d_link(dir->objs.close, dir->oid); dir->objs.select = s3d_new_object(); s3d_push_material(dir->objs.select, 0.1, 0.1, 0.3, 0.1, 0.1, 0.3, 0.1, 0.1, 0.3 ); s3d_push_vertices(dir->objs.select, svertices, sizeof(svertices) / (3*sizeof(float))); s3d_push_polygons(dir->objs.select, bar_poly, sizeof(bar_poly) / (sizeof(uint32_t)*4)); s3d_link(dir->objs.select, dir->oid); /* draw the title string */ dir->objs.title = s3d_new_object(); s3d_push_material(dir->objs.title, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ); s3d_push_vertices(dir->objs.title, tvertices, sizeof(tvertices) / (3*sizeof(float))); s3d_push_polygons(dir->objs.title, bar_poly, sizeof(bar_poly) / (sizeof(uint32_t)*4)); s3d_link(dir->objs.title, dir->oid); dir->objs.titlestr = s3d_draw_string(dots_at_start(fullname, 30, dir), &len); if (len > (1.6*5.0)) s3d_scale(dir->objs.titlestr, 1.6 / len); else s3d_scale(dir->objs.titlestr, 0.2); s3d_translate(dir->objs.titlestr, -1.0, 1.05, 1.01); s3d_link(dir->objs.titlestr, dir->oid); dir->disp = D_DIR; /* printf("FULLNAME is [%s]\n",fullname);*/ return 0; } /* display a directoy on the top of another */ int box_expand(t_node *dir) { printf("box_expand( %s )\n", dir->name); switch (dir->disp) { case D_DIR: return 0; /* already done */ case D_ICON: icon_undisplay(dir); /* undisplay previously displayed types, like icons etc */ break; case D_NONE: break; /* ignore */ default: return -1; /* panic */ } dir->dpx = 0.0; dir->dpy = BOXHEIGHT; dir->dpz = 0.0; dir->dscale = 0.01; box_draw(dir); /* initialize position on the parent */ if (dir->parent != NULL) { dir->parent->dirs_opened++; s3d_link(dir->oid, dir->parent->oid); box_order_subdirs(dir->parent); } return 0; } /* remove s3d-objects of a directory node */ int box_undisplay(t_node *dir) { printf("box_undisplay( %s )\n", dir->name); if (dir->objs.close != -1) { s3d_del_object(dir->objs.close); dir->objs.close = -1; } if (dir->objs.select != -1) { s3d_del_object(dir->objs.select); dir->objs.select = -1; } if (dir->objs.title != -1) { s3d_del_object(dir->objs.title); dir->objs.title = -1; } if (dir->objs.titlestr != -1) { s3d_del_object(dir->objs.titlestr); dir->objs.titlestr = -1; } if (dir->oid != -1) { s3d_del_object(dir->oid); } /* keep this. icons also needs the *same* string */ /* if (dir->objs.str!=-1) { s3d_del_object(dir->objs.str); dir->objs.str=-1; }*/ dir->disp = D_NONE; return 0; } /* the opposite effect of box_expand, e.g. transforming the box back to an icon */ int box_unexpand(t_node *dir) { printf("box_unexpand( %s )\n", dir->name); if (dir->parent == NULL) /* we can't do this on root.... */ return -1; dir->detached = 0; box_undisplay(dir); icon_draw(dir); dir->parent->dirs_opened--; box_order_icons(dir->parent); box_order_subdirs(dir->parent); return 0; } /* undisplay a directory, thus recursively removing the kids.*/ /* if force is 1, even the directory is removed even if it still have selected kids */ int box_close(t_node *dir, int force) { int i; int ret; printf("box_close( %s )\n", dir->name); if (&root == dir) { printf("won't close down root box ... \n"); return -1; } if (dir->detached && !force) return 1; if (dir->disp != D_DIR) { /* that should not be happening ... */ printf("[A]lready undisplayed %s, nothing to do ...\n", dir->name); return -1; } /* closing kids. ret will be != 0 if any of the kids did not close correctly */ ret = 0; for (i = 0; i < dir->n_sub; i++) if (dir->sub[i]->disp == D_DIR) ret |= box_close(dir->sub[i], force); if (ret && !force) { /* if anything got wrong, return here ... */ box_order_subdirs(dir); return ret; } else { /* also remove the icons */ if (focus == dir) focus_set(dir->parent); for (i = 0; i < dir->n_sub; i++) if (dir->sub[i]->disp == D_ICON) { icon_undisplay(dir->sub[i]); dir->detached = 0; if (focus == dir->sub[i]) focus_set(dir->parent); } box_unexpand(dir); } return ret; } /* / * only display dir and its kids, but nothing below. * / int box_collapse_grandkids(t_node *dir) { int i,j; t_node *kid; for (i=0;in_sub;i++) if (dir->sub[i].disp==D_DIR) { kid=&dir->sub[i]; for (j=0;jn_item;j++) if (kid->list[j].disp==D_DIR) box_collapse(&kid->list[j],0); } return 0; }*/ /* orders the directory objects on top of its parent objects * to be called after adding or removing things ...*/ void box_order_subdirs(t_node *dir) { int i, j; printf("box_order_subdirs( %s ): %d dirs opened\n", dir->name, dir->dirs_opened); switch (dir->dirs_opened) { case 0: return; case 1: for (i = 0; i < dir->n_sub; i++) { if (dir->sub[i]->disp == D_DIR) { dir->sub[i]->px = 0.0; dir->sub[i]->py = BOXHEIGHT + dir->sub[i]->detached * DETHEIGHT; dir->sub[i]->pz = 0.0; dir->sub[i]->scale = 0.2; ani_add(dir->sub[i]); } } break; default: j = 0; for (i = 0; i < dir->n_sub; i++) { if (dir->sub[i]->disp == D_DIR) { dir->sub[i]->px = 0.8 * sin(((float)j * 2 * M_PI) / ((float)dir->dirs_opened)); dir->sub[i]->py = BOXHEIGHT + dir->sub[i]->detached * DETHEIGHT; dir->sub[i]->pz = 0.8 * cos(((float)j * 2 * M_PI) / ((float)dir->dirs_opened)); dir->sub[i]->scale = 0.2; ani_add(dir->sub[i]); j++; } } } } /* order the icons properly */ void box_order_icons(t_node *dir) { int dps, i; dps = ceil(sqrt(dir->n_sub)); /* directories per line */ for (i = 0; i < dir->n_sub; i++) { if (dir->sub[i]->disp == D_ICON) { dir->sub[i]->px = -1 + 2 * ((float)((int)i % dps) + 0.5) / ((float)dps); dir->sub[i]->py = 0.5 + ((float)((int)i / dps) + 0.5) / ((float)dps) - 0.5; dir->sub[i]->pz = dir->sub[i]->detached * 0.2 + 1.0; dir->sub[i]->scale = (float)1.0 / ((float)dps); s3d_link(dir->sub[i]->oid, dir->oid); /* if it's already displayed, make sure it linked properly ... */ ani_finish(dir->sub[i], -1); /* copy to the current animation state */ s3d_flags_on(dir->sub[i]->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(dir->sub[i]->objs.str, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } } } s3d-0.2.2.1/apps/s3dfm/dialog.c000066400000000000000000000257471361325167000157500ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include #include /* NULL, printf() */ #include /* strlen() */ #include /* realloc(),malloc() */ #include /* errno */ #include /* pthread_create() */ #include /* mkdir() */ #include /* mkdir() */ static s3dw_input *input; static filelist *fp; static char destdir[M_DIR]; static t_node *destnode = NULL; extern int typeinput; int fs_lock = 0; static pthread_t filethread; void close_win(s3dw_widget *button) { s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } /* add all selected dirs in the new filelist */ static int get_selected(filelist *fp, t_node *dir) { int i; char *s; for (i = 0; i < dir->n_sub; i++) { if (dir->sub[i]->sub != NULL) get_selected(fp, dir->sub[i]); /* scan subdir */ if (dir->sub[i]->detached) { fp->n++; fp->p = (struct _t_file*)realloc(fp->p, sizeof(t_file) * fp->n); s = (char*)malloc(M_DIR); node_path(dir->sub[i], s); fp->p[fp->n - 1].name = s; if ((fs_lock == TYPE_COPY) || (fs_lock == TYPE_MOVE)) fp->p[fp->n - 1].anode = fly_create_anode(dir->sub[i]); else fp->p[fp->n - 1].anode = NULL; fp->p[fp->n - 1].size = 0; /*TODO: later */ fp->p[fp->n - 1].state = STATE_NONE; } } return 0; } void window_help(void) { s3dw_surface *infwin; s3dw_button *button; infwin = s3dw_surface_new("Help Window", 12, 12); s3dw_label_new(infwin, "F1 - This Help Window", 1, 2); s3dw_label_new(infwin, "F5 - Copy", 1, 3); s3dw_label_new(infwin, "F6 - Move", 1, 4); s3dw_label_new(infwin, "F7 - Create Directory", 1, 5); s3dw_label_new(infwin, "F8 - Unlink", 1, 5); s3dw_label_new(infwin, "R - Refresh", 1, 6); s3dw_label_new(infwin, "I - Info", 1, 7); button = s3dw_button_new(infwin, "OK", 4, 10); button->onclick = close_win; s3dw_show(S3DWIDGET(infwin)); } void window_fs_another(void) { s3dw_surface *infwin; s3dw_button *button; infwin = s3dw_surface_new("Error", 20, 8); s3dw_label_new(infwin, "Sorry, another FS Action is in Progress", 1, 2); button = s3dw_button_new(infwin, "OK", 5, 5); button->onclick = close_win; s3dw_show(S3DWIDGET(infwin)); } void window_fs_nothing(void) { s3dw_surface *infwin; s3dw_button *button; infwin = s3dw_surface_new("Error", 12, 8); s3dw_label_new(infwin, "Nothing selected :(", 1, 2); button = s3dw_button_new(infwin, "OK", 5, 5); button->onclick = close_win; s3dw_show(S3DWIDGET(infwin)); } static void window_fs_confirm_error(s3dw_widget *button) { fs_err.state = ESTATE_NONE; s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } void window_fs_errno(const char *errmsg) { s3dw_surface *infwin; s3dw_button *button; char string[M_DIR]; float l; snprintf(string, M_DIR, "%s: %s", errmsg, strerror(errno)); l = strlen(string) * 0.7; infwin = s3dw_surface_new("Error", l, 8); s3dw_label_new(infwin, string, 1, 2); button = s3dw_button_new(infwin, "OK", l / 2 - 1, 5); button->onclick = close_win; s3dw_show(S3DWIDGET(infwin)); } void window_fs_abort(s3dw_widget *button) { /* delete a filelist, if there was any */ if (fp != NULL) { fl_del(fp); fp = NULL; } typeinput = 0; fs_lock = TYPE_NONE; s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } static void* thread_start(void *S3DFMUNUSED(ptr)) { switch (fs_lock) { case TYPE_COPY: printf("starting a copy process in the thread ... \n"); destnode = node_getbypath(destdir); fs_fl_copy(fp, destdir); printf("done\n"); break; case TYPE_UNLINK: printf("unlinking some files ... \n"); fs_fl_unlink(fp); printf("done\n"); break; } fs_lock = TYPE_FINISHED; return NULL; } /* start the thread, as filesystem stuff is locked ... */ void window_fs(s3dw_widget *button) { pthread_create(&filethread, NULL, thread_start, NULL); s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } void window_copy(const char *S3DFMUNUSED(path)) { s3dw_surface *infwin; s3dw_button *okbutton, *abortbutton; float l; int i; unsigned int m; if (fs_lock) { window_fs_another(); return; } fs_lock = TYPE_COPY; fp = (filelist*)malloc(sizeof(filelist)); fp->n = 0; fp->p = NULL; get_selected(fp, &root); printf("selected %d nodes\n", fp->n); if (fp->n == 0) { window_fs_nothing(); free(fp); fp = NULL; return; } /* get the longest item on the list */ m = 10; for (i = 0; i < fp->n; i++) { if (strlen(fp->p[i].name) > m) m = strlen(fp->p[i].name); printf("%d: %s\n", i, fp->p[i].name); } l = (m + 3) * 0.7; infwin = s3dw_surface_new("Copy Window", l, fp->n + 8); s3dw_label_new(infwin, "Copy: ", 1, 1); for (i = 0; i < fp->n; i++) s3dw_label_new(infwin, fp->p[i].name, 3, 2 + i); s3dw_label_new(infwin, "to:", 1, fp->n + 3); node_path(node_getdir(focus), destdir); s3dw_label_new(infwin, destdir, 3, fp->n + 4); okbutton = s3dw_button_new(infwin, "OK", l / 2 - 3, fp->n + 5); okbutton->onclick = window_fs; abortbutton = s3dw_button_new(infwin, "abort", l / 2, fp->n + 5); abortbutton->onclick = window_fs_abort; s3dw_show(S3DWIDGET(infwin)); } void window_unlink(void) { s3dw_surface *infwin; s3dw_button *okbutton, *abortbutton; float l; int i; unsigned int m; if (fs_lock) { window_fs_another(); return; } fs_lock = TYPE_UNLINK; fp = (filelist*)malloc(sizeof(filelist)); fp->n = 0; fp->p = NULL; get_selected(fp, &root); printf("selected %d nodes\n", fp->n); if (fp->n == 0) { window_fs_nothing(); free(fp); fp = NULL; return; } /* get the longest item on the list */ m = 10; for (i = 0; i < fp->n; i++) if (strlen(fp->p[i].name) > m) m = strlen(fp->p[i].name); l = (m + 3) * 0.7; infwin = s3dw_surface_new("Unlink Window", l, fp->n + 8); s3dw_label_new(infwin, "Unlink: ", 1, 1); for (i = 0; i < fp->n; i++) s3dw_label_new(infwin, fp->p[i].name, 3, 2 + i); okbutton = s3dw_button_new(infwin, "OK", l / 2 - 3, fp->n + 3); okbutton->onclick = window_fs; abortbutton = s3dw_button_new(infwin, "Abort", l / 2, fp->n + 3); abortbutton->onclick = window_fs_abort; s3dw_show(S3DWIDGET(infwin)); } void window_fs_mkdir(s3dw_widget *button) { char *dir; t_node *item; dir = s3dw_input_gettext(input); printf("creating Directory ...%s\n", dir); if (-1 == mkdir(dir, 0777)) /* umask ?! */ window_fs_errno("could not create directory"); else { /* success, now refresh it */ item = node_getbypath(dir); if (item == NULL) { printf("cannot refresh\n"); } else { printf("refreshing %s\n", item->name); /* parse_again(item);*/ } } free(dir); fs_lock = 0; window_fs_abort(button); /* finish */ } void window_mkdir(const char *path) { s3dw_surface *infwin; s3dw_button *okbutton, *abortbutton; char string1[M_DIR]; float l; if (fs_lock) { window_fs_another(); return; } snprintf(string1, M_DIR, "Create Directory in %s", path); l = strlen(string1) * 0.7; infwin = s3dw_surface_new("Create Directory", l, 8); s3dw_label_new(infwin, string1, 1, 2); input = s3dw_input_new(infwin, 10, 1, 3); s3dw_input_change_text(input, path); s3dw_focus(S3DWIDGET(input)); s3dw_focus(S3DWIDGET(infwin)); typeinput = 1; fs_lock = 1; okbutton = s3dw_button_new(infwin, "OK", l / 2 - 3, 5); okbutton->onclick = window_fs_mkdir; abortbutton = s3dw_button_new(infwin, "abort", l / 2, 5); abortbutton->onclick = window_fs_abort; s3dw_show(S3DWIDGET(infwin)); } void window_move(const char *S3DFMUNUSED(path)) { s3dw_surface *infwin; s3dw_button *button; if (fs_lock) { window_fs_another(); return; } infwin = s3dw_surface_new("Info Window", 20, 8); s3dw_label_new(infwin, "Sorry, moving is not implemented yet.. :(", 1, 2); button = s3dw_button_new(infwin, "Too bad", 7, 5); button->onclick = close_win; s3dw_show(S3DWIDGET(infwin)); } /* a small window which counts directories/files and displays the result */ void window_info(char *path) { s3dw_surface *infwin; s3dw_button *button; char string1[M_DIR]; char string2[567]; int b, d, f; char bd[M_DIR]; float l; snprintf(string1, M_DIR, "Info for %s", path); fs_approx(path, &f, &d, &b); dotted_int(bd, b); snprintf(string2, sizeof(string2), "%s bytes in %d files and %d Directories", bd, f, d); l = ((strlen(string1) > strlen(string2)) ? strlen(string1) : strlen(string2)) * 0.7; infwin = s3dw_surface_new("Info Window", l, 12); s3dw_label_new(infwin, string1, 1, 2); s3dw_label_new(infwin, string2, 1, 4); button = s3dw_button_new(infwin, "OK", l / 2 - 1, 6); /* clicking on the button will exit ... */ button->onclick = close_win; /* of couse, show it */ s3dw_show(S3DWIDGET(infwin)); } /* check if a file operation is finished and clean up */ void window_fsani(void) { int i; t_node *node, dummy; if (fs_lock != TYPE_NONE) { /* get current position of our destination node */ if (destnode != NULL) { node = destnode; node_init(&dummy); dummy.parent = node->parent; dummy.scale = node->scale; dummy.px = node->px; dummy.py = node->py; dummy.pz = node->pz; dummy.type = node->type; fly_set_absolute_position(&dummy); } else { dummy.px = 0; dummy.py = 0; dummy.pz = 0; dummy.scale = 0.01; } if (fp != NULL) { for (i = 0; i < fp->n; i++) { if (fp->p[i].state == STATE_FINISHED) { /* we can go and clean up now. */ if (NULL != (node = node_getbypath(fp->p[i].name))) { printf("[CLEANUP] for node %s (%s)\n", node->name, fp->p[i].name); node->detached = 0; if (node->parent != NULL) { parse_dir(node->parent); switch (node->disp) { case D_ICON: box_order_icons(node->parent); break; case D_DIR: box_order_subdirs(node->parent); break; } } } else printf("node %s already vanished ...\n", fp->p[i].name); fp->p[i].state = STATE_CLEANED; } if (fp->p[i].state > STATE_NONE) { if (destnode != NULL) { fp->p[i].anode->px = dummy.px; fp->p[i].anode->py = dummy.py; fp->p[i].anode->pz = dummy.pz; ani_add(fp->p[i].anode); } } } } if (fs_lock == TYPE_FINISHED) { printf("filesystem stuff is finisheed, cleaning up"); if (fp != NULL) { fl_del(fp); fp = NULL; } typeinput = 0; fs_lock = TYPE_NONE; if (destnode != NULL) if (destnode->disp == D_DIR) { /* it usually is opened */ printf("reordering icons on destnode ...\n"); box_order_icons(destnode); } destnode = NULL; } if (fs_err.state == ESTATE_RISE) { s3dw_surface *infwin; s3dw_button *button; char errmsg[M_DIR]; float l; fs_err.state = ESTATE_WAIT_FOR_CONFIRM; snprintf(errmsg, M_DIR, "Error \"%s\" on %s", fs_err.message, fs_err.file); l = s3d_strlen(errmsg) + 2; infwin = s3dw_surface_new("Error", l, 8); s3dw_label_new(infwin, errmsg, 1, 2); button = s3dw_button_new(infwin, "OK", l / 2 - 1, 5); button->onclick = window_fs_confirm_error; s3dw_show(S3DWIDGET(infwin)); printf("fs_err is active ... message: %s\n", errmsg); } } } s3d-0.2.2.1/apps/s3dfm/event.c000066400000000000000000000045161361325167000156210ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include #include /* printf() */ int typeinput = 0; /* info packets handler, we're just interested in the cam */ int event_oinfo(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; if ((inf->object == 0) && (!ani_onstack(&cam))) { cam.dpx = inf->trans_x; cam.dpy = inf->trans_y; cam.dpz = inf->trans_z; } s3dw_object_info(hrmz); return 0; } /* keyevent handler */ int event_key(struct s3d_evt *evt) { struct s3d_key_event *keys = (struct s3d_key_event *)evt->buf; char path[M_DIR]; if (typeinput) { /* we have some inputfield now and want the s3dw to handle our input */ printf("inputting text ...\n"); s3dw_handle_key(evt); return 0; } node_path(node_getdir(focus), path); switch (keys->keysym) { case 'i': case 'I': { window_info(path); } break; case 'r': case 'R': {/* refresh this window ... */ t_node *node; node = node_getdir(focus); printf("[R]efreshing %s\n", node->name); parse_dir(node); box_draw_icons(node); box_order_icons(node); box_order_subdirs(node); } break; case S3DK_F1: window_help(); break; case S3DK_F5: window_copy(path); break; case S3DK_F6: window_move(path); break; case S3DK_F7: window_mkdir(path); break; case S3DK_F8: window_unlink(); break; case S3DK_F10: /* some debugging stuff */ node_getbypath(path); break; case S3DK_UP: case S3DK_LEFT: case S3DK_RIGHT: case S3DK_DOWN: focus_by_key(keys->keysym); break; case S3DK_RETURN: case S3DK_SPACE: node_select(focus); break; case S3DK_BACKSPACE: if (focus->disp == D_DIR) box_close(focus, 1); else if (focus->parent != NULL) box_close(focus->parent, 1); break; } s3dw_handle_key(evt); return 0; } /* object click handler */ int event_click(struct s3d_evt *evt) { int oid; t_node *f; s3dw_handle_click(evt); oid = (int) * ((uint32_t *)evt->buf); if (NULL != (f = node_getbyoid(&root, oid))) { if (f->objs.close == oid) { box_close(f, 1); return 0; } if (f->objs.select == oid) { printf("[S]electing %s\n", f->name); node_select(f); return 0; } node_select(f); } else { /* printf("[C]ould not find :/\n");*/ } return 0; } s3d-0.2.2.1/apps/s3dfm/fly.c000066400000000000000000000036071361325167000152720ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include /* NULL */ #include /* NULL */ #include /* strncpy() */ #include /* malloc() */ #include /* strncpy() */ static void _get_pos(t_node *work, t_node *f) { if (f->parent != NULL) _get_pos(work, f->parent); work->px += f->px * work->scale; work->pz += f->pz * work->scale; work->py += f->py * work->scale; /* printf("%s: %3.3f %3.3f %3.3f - %3.3f\n",f->name, f->px, f->py, f->pz, f->scale ); printf("### %3.3f %3.3f %3.3f - %3.3f)\n", work->px, work->py, work->pz, work->scale); */ if (f->parent == NULL) work->scale = f->scale; else work->scale = work->scale * f->scale; } int fly_set_absolute_position(t_node *node) { t_node work; work.px = 0; work.py = 0; work.pz = 0; work.scale = 1.0; _get_pos(&work, node); node->px = work.px; node->py = work.py; node->pz = work.pz; node->scale = work.scale; /* printf("node coordinates: %3.3f %3.3f %3.3f %3.3f\n",node->px,node->py,node->pz,node->scale);*/ return 0; } /* create a copy of *node as an icon (block) which can be moved for animation ... */ t_node *fly_create_anode(t_node *node) { t_node *work; work = (t_node*)malloc(sizeof(t_node)); node_init(work); work->parent = node->parent; work->scale = node->scale; work->px = node->px; work->py = node->py; work->pz = node->pz; work->type = node->type; mstrncpy(work->name, node->name, M_NAME); fly_set_absolute_position(work); icon_draw(work); work->dpx = work->px; work->dpy = work->py; work->dpz = work->pz; work->dscale = work->scale; work->py = 2 * work->scale - work->py; /* invert */ s3d_flags_on(work->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(work->objs.str, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); ani_add(work); return work; } s3d-0.2.2.1/apps/s3dfm/focus.c000066400000000000000000000117401361325167000156140ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include /* printf() */ #include /* ceil(), sqrt() */ /* get the scale for the rootbox zoom */ float focus_get_scale(t_node *f) { float scale, s; if (f->disp == D_DIR) { s = 0.2; if (f->parent != NULL) scale = 1.f / s * focus_get_scale(f->parent); else return 1.0; root.px -= f->px; root.pz -= f->pz; root.py -= BOXHEIGHT + f->detached * DETHEIGHT; root.px *= 1 / s; root.py *= 1 / s; root.pz *= 1 / s; return scale; } else { if (f->parent != NULL) return focus_get_scale(f->parent); /* icons etc */ else return 1.0; /* that should never happen */ } } /* center f for the viewer, therefore moving the root box ... */ void focus_set(t_node *f) { root.px = 0.0; root.py = 0.0; root.pz = 0.0; /* printf("[Z]ooming to %s\n",f->name);*/ /* box_collapse_grandkids(f);*/ root.scale = focus_get_scale(f); root.py -= 1.5; /* printf("[R]escaling to %f\n",root.scale); printf("px: %f py:%f pz: %f\n",root.px,root.py,root.pz);*/ ani_add(&root); node_focus_color(focus, 0); node_focus_color(f, 1); focus = f; if (((cam.dpx - cam.px)* (cam.dpx - cam.px) + (cam.dpy - cam.py)* (cam.dpy - cam.py) + (cam.dpz - cam.pz)* (cam.dpz - cam.pz)) > (10 * 10)) { cam.px = 0; cam.py = 0; cam.pz = 5; ani_add(&cam); } } /* uses a keysym to set the focus new */ void focus_by_key(int keysym) { int i, rowsize; if (focus->pindex != -1) { switch (focus->disp) { case D_DIR: switch (keysym) { case S3DK_RIGHT: /* cycle to the next directory on the ring */ for (i = focus->pindex - 1; i >= 0; i--) if (focus->parent->sub[i]->disp == D_DIR) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } if (i == -1) /* nothing found, wrap to the other side */ for (i = focus->parent->n_sub - 1; i >= focus->pindex + 1; i--) if (focus->parent->sub[i]->disp == D_DIR) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } break; case S3DK_LEFT: /* cycle to the next directory on the ring */ for (i = focus->pindex + 1; i < focus->parent->n_sub; i++) if (focus->parent->sub[i]->disp == D_DIR) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } if (i == focus->parent->n_sub) /* nothing found, wrap to the other side */ for (i = 0; i < focus->pindex; i++) if (focus->parent->sub[i]->disp == D_DIR) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } break; case S3DK_UP: /* go in the first entry of this directory, if possible */ if (focus->n_sub > 0) focus_set(focus->sub[0]); break; case S3DK_DOWN: /* go to first icon entry of parent, or parent itself */ for (i = focus->parent->n_sub - 1; i >= 0; i--) if (focus->parent->sub[i]->disp == D_ICON) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } if (i == 0) /* no icons? go to parent. */ focus_set(focus->parent); break; } break; case D_ICON: switch (keysym) { case S3DK_LEFT: /* search for the next icon on the left side */ i = focus->pindex; do { i--; if (i < 0) i = focus->parent->n_sub - 1; } while (focus->parent->sub[i]->disp != D_ICON); focus_set(focus->parent->sub[i]); break; case S3DK_RIGHT: /* search for the next icon on the right side */ i = focus->pindex; do { i++; if (i >= focus->parent->n_sub) i = 0; } while (focus->parent->sub[i]->disp != D_ICON); focus_set(focus->parent->sub[i]); break; case S3DK_UP: /* search for the next icon on the left side */ i = focus->pindex; rowsize = ceil(sqrt(focus->parent->n_sub)); /* items per line */ do { i += rowsize; if (i >= focus->parent->n_sub) break; } while (focus->parent->sub[i]->disp != D_ICON); if (i >= focus->parent->n_sub) { /* go to the first activated dir above ... */ for (i = 0; i < focus->parent->n_sub; i++) if (focus->parent->sub[i]->disp == D_DIR) { /* found a directory before, cycle */ focus_set(focus->parent->sub[i]); break; } } else focus_set(focus->parent->sub[i]); break; case S3DK_DOWN: /* search for the next icon on the left side */ i = focus->pindex; rowsize = ceil(sqrt(focus->parent->n_sub)); /* items per line */ do { i -= rowsize; if (i < 0) break; } while (focus->parent->sub[i]->disp != D_ICON); if (i < 0) focus_set(focus->parent); else focus_set(focus->parent->sub[i]); break; } break; } } else { /* probably root */ switch (keysym) { case S3DK_UP: /* go in the first entry of this directory, if possible */ if (focus->n_sub > 0) focus_set(focus->sub[0]); break; } } } s3d-0.2.2.1/apps/s3dfm/fs.c000066400000000000000000000157001361325167000151050ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include /* printf() */ #include /* scandir() */ #include /* malloc() */ /* we want GNU version of basename */ #define _GNU_SOURCE #include /* strlen(), strncmp(), strrchr() */ #include /* basename() */ #include #include #include #include /* errno */ #include /* nanosleep() */ struct fs_error fs_err = { 0, 0, NULL, NULL }; /* generates the file list */ filelist *fl_new(char *path) { struct dirent **namelist; filelist *fl; int n, i, j; char *name; fl = (filelist*)malloc(sizeof(filelist)); fl->p = NULL; fl->n = 0; n = scandir(path, &namelist, NULL, alphasort); if (n <= 2) { /* . and .. is always included. */ if (n < 0) fs_error("fl_new():scandir()", path); } else { j = 0; fl->n = n - 2 ; /* ignore . and .. */ fl->p = (struct _t_file*)malloc(sizeof(t_file) * fl->n); for (i = 0; i < n; i++) { name = namelist[i]->d_name; if (!((strcmp(name, ".") == 0) || (strcmp(name, "..") == 0))) { /* ignore */ fl->p[j].name = (char*)malloc(strlen(name) + strlen(path) + 2); strcpy(fl->p[j].name, path); strcat(fl->p[j].name, "/"); strcat(fl->p[j].name, name); fl->p[j].anode = NULL; fl->p[j].size = 0; /*TODO: later */ fl->p[j].state = STATE_NONE; j++; } free(namelist[i]); } if (j != fl->n) { /* TODO: GUH! don't exit(-1) */ printf("assertion failed\n"); exit(-1); } free(namelist); } return fl; } /* delete the filelist */ void fl_del(filelist *fl) { int i; for (i = 0; i < fl->n; i++) { free(fl->p[i].name); if (fl->p[i].anode != NULL) { /* maybe let node_delete do that? */ /*node_delete(fl->p[i].anode);*/ icon_undisplay(fl->p[i].anode); free(fl->p[i].anode); } } free(fl); } /* approximate the heaviness of a single */ void fs_approx(char *source, int *files, int *dirs, int *bytes) { int sfiles, sdirs, sbytes; /* for subdirs */ filelist *fl; struct stat s; *files = sfiles = 0; *dirs = sdirs = 0; *bytes = sbytes = 0; /* printf("start: %d files, %d dirs, %d bytes in %s\n",*files,*dirs,*bytes,source);*/ if (-1 == stat(source, &s)) return; /* printf("%s: %08x (%db)\n",source,s.st_mode,(int)s.st_size);*/ if ((s.st_mode&S_IFMT) == S_IFDIR) { fl = fl_new(source); if (fl->n > 0) fs_fl_approx(fl, &sfiles, &sdirs, &sbytes); fl_del(fl); /* printf("%d files, %d dirs, %d bytes in %s\n",sfiles,sdirs,sbytes,source);*/ *files = sfiles; *bytes += sbytes; *dirs = sdirs; *dirs += 1; } else *files = 1; *bytes += s.st_size; /* printf("end: %d files, %d dirs, %d bytes in %s\n",*files,*dirs,*bytes,source);*/ } /* returns 1 if source is a directory */ int fs_isdir(const char *source) { struct stat s; if (-1 == stat(source, &s)) return 0; if (S_ISDIR(s.st_mode)) { return 1; } return 0; } /* approximate the heaviness of our source ...*/ void fs_fl_approx(filelist *fl, int *files, int *dirs, int *bytes) { int i; int sfiles, sdirs, sbytes; /* for subdirs */ *files = 0; *dirs = 0; *bytes = 0; for (i = 0; i < fl->n; i++) { fs_approx(fl->p[i].name, &sfiles, &sdirs, &sbytes); *files += sfiles; *dirs += sdirs; *bytes += sbytes; } } /* copy a certain file */ int fs_copy(char *source, char *dest) { FILE *fps, *fpd; filelist *fl; struct stat s; char buf[1024]; int n; if (-1 == stat(source, &s)) return 0; switch (s.st_mode&S_IFMT) { case S_IFDIR: fl = fl_new(source); printf("mkdir %s\n", dest); mkdir(dest, 0777); fs_fl_copy(fl, dest); fl_del(fl); break; case S_IFIFO: printf("link the fifo\n"); link(source, dest); break; default: printf("fs_copy -> atomic copy\n"); printf("open source..."); if (NULL == (fps = fopen(source, "rb"))) { fs_error("fs_copy():fopen(source)", source); return -1; } printf("ok\n"); printf("open dest..."); if (NULL == (fpd = fopen(dest, "wb"))) { fs_error("fs_copy():fopen(source)", source); fclose(fps); return -1; } printf("ok\n"); /* TODO: overwrite protection etc */ printf("copy ..."); while (!feof(fps)) { printf("."); errno = 0; n = fread(buf, 1, 1024, fps); if (errno) fs_error("fs_copy():fread(source)", source); fwrite(buf, 1, n, fpd); if (errno) fs_error("fs_copy():fwrite(source)", source); } printf("ok\n"); fclose(fps); fclose(fpd); } return 0; } /* copy the source to the destination, destination should be a directory. */ int fs_fl_copy(filelist *fl, const char *dest) { int i; int r; char *sdest; char *bname; r = 0; for (i = 0; i < fl->n; i++) { fl->p[i].state = STATE_INUSE; bname = basename(fl->p[i].name); sdest = (char*)malloc(strlen(dest) + strlen(bname) + 2); strcpy(sdest, dest); strcat(sdest, "/"); strcat(sdest, bname); r |= fs_copy(fl->p[i].name, sdest); free(sdest); fl->p[i].state = STATE_FINISHED; } return r; } /* recursively unlink a dir or file. */ int fs_unlink(char *dest) { filelist *fl; struct stat s; if (-1 == stat(dest, &s)) return -1; if ((s.st_mode&S_IFMT) == S_IFDIR) { printf("%s is a dir, removing below ...\n", dest); fl = fl_new(dest); if (fs_fl_unlink(fl)) { fl_del(fl); return -1; } else { fl_del(fl); printf("removing %s\n", dest); if (rmdir(dest) == -1) { fs_error("fs_fl_unlink(): rmdir()", dest); return -1; } } } else { if (unlink(dest) == -1) { fs_error("fs_fl_unlink(): unlink()", dest); return -1; } } return 0; } /* remove a lot of files */ int fs_fl_unlink(filelist *fl) { int i, r; r = 0; for (i = 0; i < fl->n; i++) { fl->p[i].state = STATE_INUSE; printf("-> atomic unlink %s\n", fl->p[i].name); r |= fs_unlink(fl->p[i].name); fl->p[i].state = STATE_FINISHED; } return r; } int fs_move(char *source, char *dest) { if (!rename(source, dest)) { switch (errno) { case EXDEV: fs_copy(source, dest); fs_unlink(source); break; default: fs_error("fs_move()", dest); return -1; /* can't help it */ } } return 0; } /* moves the source to the destination */ int fs_fl_move(filelist *fl, const char *dest) { int i; int r; char *sdest; char *bname; r = 0; for (i = 0; i < fl->n; i++) { fl->p[i].state = STATE_INUSE; bname = basename(fl->p[i].name); sdest = (char*)malloc(strlen(dest) + strlen(bname) + 2); strcpy(sdest, dest); strcat(sdest, "/"); strcat(sdest, bname); r |= fs_move(fl->p[i].name, sdest); free(sdest); fl->p[i].state = STATE_FINISHED; } return r; } /* write an error and wait for a reaction */ int fs_error(const char *message, char *file) { static struct timespec t = { 0, 100*1000*1000 }; fs_err.err = errno; fs_err.message = (char*)message; fs_err.file = file; fs_err.state = ESTATE_RISE; printf("[FS ERROR]: %s %s %s", message, file, strerror(errno)); while (fs_err.state != ESTATE_NONE) nanosleep(&t, NULL); /* until situation clear, wait (and don't waste cpu-time) */ return 0; } s3d-0.2.2.1/apps/s3dfm/icon.c000066400000000000000000000043161361325167000154260ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include /* printf() */ #include /* sin(),cos() */ #include /* strlen() */ #include /* memcpy() */ static float icon_colors[T_TYPENUM][12] = { /* T_DUNO */ { 0, 0, 0.5, 1.0, 0, 0, 0.5, 1.0, 0, 0, 0.5, 1.0 }, /* T_FOLDER */ { 0.4, 0.4, 0, 1.0, 0.4, 0.4, 0, 1.0, 0.4, 0.4, 0, 1.0 } }; /* gives another color for the focused item */ void icon_focus_color(t_node *dir, int on) { float color[12]; int i; memcpy(color, icon_colors[dir->type], sizeof(color)); if (on) for (i = 0; i < 3; i++) { color[i*4 + 0] += 0.3; color[i*4 + 1] += 0.3; color[i*4 + 2] += 0.3; } s3d_pep_materials_a(dir->oid, color, 1); } /* draws icon dir */ int icon_draw(t_node *dir) { float vertices[] = { -1, -0.5, 0, -1, 0.5, 0, 1, 0.5, 0, 1, -0.5, 0, -1, -0.5, -1, -1, 0.5, -1, 1, 0.5, -1, 1, -0.5, -1 }; uint32_t polys[] = { 1, 3, 0, 0, 2, 3, 1, 0, 5, 6, 2, 0, 1, 5, 2, 0, 2, 6, 7, 0, 2, 7, 3, 0, 0, 3, 7, 0, 0, 7, 4, 0, 5, 1, 0, 0, 5, 0, 4, 0 }; float len; /* find position for the new block in our directory box */ /* create the block */ dir->oid = s3d_new_object(); s3d_push_vertices(dir->oid, vertices, 8); s3d_push_materials_a(dir->oid, icon_colors[dir->type], 1); s3d_push_polygons(dir->oid, polys, 10); /* draw and position the string */ if (dir->objs.str == -1) { dir->objs.str = s3d_draw_string(dir->name, &len); if (len < 2) len = 2; dir->objs.strlen = len; } else len = dir->objs.strlen; s3d_scale(dir->objs.str, (float)1.8 / len); s3d_translate(dir->objs.str, -0.9, -0.3, 0.1); s3d_rotate(dir->objs.str, 0, 0, 0); s3d_link(dir->objs.str, dir->oid); dir->disp = D_ICON; return 0; } int icon_undisplay(t_node *dir) { if (dir->oid != -1) { s3d_del_object(dir->oid); dir->oid = -1; } if (dir->objs.str != -1) { s3d_del_object(dir->objs.str); dir->objs.str = -1; } dir->disp = 0; return 0; } s3d-0.2.2.1/apps/s3dfm/main.c000066400000000000000000000021061361325167000154150ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include #include /* strlen(), strncmp(), strrchr() */ #include /* nanosleep() */ static struct timespec t = { 0, 33*1000*1000 }; t_node root, cam, *focus; static void mainloop(void) { ani_mate(); s3dw_ani_mate(); window_fsani(); nanosleep(&t, NULL); } int main(int argc, char **argv) { s3d_set_callback(S3D_EVENT_OBJ_CLICK, event_click); s3d_set_callback(S3D_EVENT_OBJ_INFO, event_oinfo); s3d_set_callback(S3D_EVENT_KEY, event_key); if (!s3d_init(&argc, &argv, "s3dfm")) { s3d_select_font("vera"); node_init(&cam); /* a virtual object, just to push the cam throu our animation stack */ cam.oid = 0; /* set up file system representation */ node_init(&root); mstrncpy(root.name, "/", M_NAME); focus = &root; root.dscale = 0.1; root.type = T_FOLDER; parse_dir(&root); box_draw(&root); ani_doit(&root); focus_set(&root); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/apps/s3dfm/node.c000066400000000000000000000112651361325167000154240ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include /* strncpy(), index() */ #include /* printf() */ #include /* free() */ /* find the node to a path, return NULL if not parsed yet */ t_node *node_getbypath(const char *path) { char p[M_DIR]; char *s, *match; t_node *cur; int i; if (path == NULL) return NULL; if (path[0] == '/') { mstrncpy(p, path, M_DIR - 1); s = p + 1; cur = &root; } else return NULL; /* TODO: also process local paths. right now, we are to lazy */ p[strlen(p)+1] = 0; /* extra terminating 0, to be sure */ printf("processing rest of string %s\n", s); match = s; while (*s != 0) { /* while search string is not empty */ if ((s = index(s, '/')) != NULL) { s[0] = 0; /* mark the slash with space */ s++; /* move to the next */ } else { s = match + strlen(match); /* select terminating 0 */ } /* parse ... */ printf("looking for a match for %s, rest is %s\n", match, s); for (i = 0; i < cur->n_sub; i++) if (0 == strcmp(cur->sub[i]->name, match)) { /* found !! */ cur = cur->sub[i]; /* forward */ match = s; /* select next */ break; } if (i == cur->n_sub) { printf("found no match for %s :(\n", match); return NULL; /* not found */ } } return cur; } /* finds an node in the tree by oid */ t_node *node_getbyoid(t_node *t, int oid) { int i; t_node *f; if (t->oid == oid) return t; if (t->objs.str == oid) return t; if (t->objs.close == oid) return t; if (t->objs.select == oid) return t; if (t->objs.title == oid) return t; if (t->objs.titlestr == oid) return t; if (t->type == T_FOLDER) for (i = 0; i < t->n_sub; i++) if ((f = node_getbyoid(t->sub[i], oid)) != NULL) return f; return NULL; } /* writes the path of dir into *path. path should be of type path[M_DIR] */ void node_path(t_node *dir, char *path) { if (dir->parent != NULL) { node_path(dir->parent, path); if (dir->parent->parent != NULL) mstrncat(path, "/", M_DIR); mstrncat(path, dir->name, M_DIR); } else mstrncpy(path, dir->name, M_DIR); } /* clear the node */ int node_init(t_node *dir) { dir->parent = NULL; dir->sub = NULL; dir->n_sub = 0; dir->oid = -1; dir->objs.str = -1; dir->objs.close = -1; dir->objs.select = -1; dir->objs.title = -1; dir->objs.titlestr = -1; dir->objs.strlen = 0; dir->disp = D_NONE; dir->parsed = 0; dir->pindex = -1; dir->check = 0; dir->dirs_opened = 0; dir->type = T_DUNO; dir->px = dir->py = dir->pz = 0.0; dir->dpx = dir->dpy = dir->dpz = 0.0; dir->scale = dir->dscale = 1.0; dir->detached = 0; return 0; } /* general undisplay routine. does not handle anything recursively... */ int node_undisplay(t_node *dir) { switch (dir->disp) { case D_DIR: return box_undisplay(dir); break; case D_ICON: return icon_undisplay(dir); break; default: return -1; } } /* delete a node and all its kids internally, remove the graphics, reorder the parents etc ... */ int node_delete(t_node *dir) { int i; if (dir->parent == NULL) { printf("won't delete root window!\n"); return -1; } /* delete all the kids */ if (dir->n_sub > 0) { for (i = 0; i < dir->n_sub; i++) node_delete(dir->sub[i]); free(dir->sub); } /* move focus upward, this should go up with the recursion */ if (focus == dir) focus_set(dir->parent); /* do this before deleting the contents, its better ... */ switch (dir->disp) { case D_DIR: box_undisplay(dir); /* fall through */ case D_ICON: icon_undisplay(dir); /* fall through */ } if (-1 != (i = ani_onstack(dir))) ani_del(i); /* tell animation stack too */ free(dir); return 0; } /* node select handles click on the detach button. selected items can be moved, copied etc.*/ void node_select(t_node *dir) { dir->detached = dir->detached ? 0 : 1; /* swapping, not sure if !dir->detached would do the same .. */ switch (dir->disp) { case D_DIR: if (focus != dir) { dir->detached = dir->detached ? 0 : 1; /* swap again, we actually don't want to have it detachedf now. */ focus_set(dir); } if (dir->parent != NULL) box_order_subdirs(dir->parent); break; case D_ICON: if (dir->type == T_FOLDER) { dir->detached = 0; if (!parse_dir(dir)) box_expand(dir); } else { dir->pz = dir->detached * 0.2 + 1.0; ani_add(dir); } focus_set(dir); break; } } /* change color etc if a node is focused */ void node_focus_color(t_node *node, int on) { switch (node->disp) { case D_DIR: box_focus_color(node, on); break; case D_ICON: icon_focus_color(node, on); break; } } /* get the directory of a node */ t_node *node_getdir(t_node *node) { if (node->type == T_FOLDER) return node; else return node->parent; } s3d-0.2.2.1/apps/s3dfm/parse.c000066400000000000000000000047511361325167000156130ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3dfm.h" #include /* printf() */ #include /* dirent */ #include /* strlen(), strncmp(), strrchr() */ #include /* realloc () */ int parse_dir(t_node *dir) { struct dirent **namelist; int n, i; int oldn; char *nstr = NULL; char path[M_DIR]; char ndir[M_DIR]; printf("parse_dir( %s )\n", dir->name); node_path(dir, path); for (i = 0; i < dir->n_sub; i++) { dir->sub[i]->check = 1; } n = scandir(path, &namelist, NULL, alphasort); if (n < 0) { window_fs_errno(path); return -1; } else { oldn = dir->n_sub; while (n--) { nstr = namelist[n]->d_name; /* setup kids in the sub */ for (i = 0; i < oldn; i++) /* see if it's already there */ if (dir->sub[i]) if (0 == strcmp(namelist[n]->d_name, dir->sub[i]->name)) break; if ((0 != strcmp(nstr, ".")) && (0 != strcmp(nstr, ".."))) { /* we don't care about those */ if (i == oldn) { /* it's new, add it, initialize it ... */ i = dir->n_sub; /* i now holds the right index in sub, so we use dir->sub[i] * to reference the new item now... */ dir->n_sub++; dir->sub = (struct _t_node**)realloc(dir->sub , dir->n_sub * sizeof(t_node *)); dir->sub[i] = (struct _t_node*)malloc(sizeof(t_node)); node_init(dir->sub[i]); mstrncpy(dir->sub[i]->name, nstr, M_NAME); dir->sub[i]->parent = dir; } /* find out the filetype ... very simple */ dir->sub[i]->type = T_DUNO; dir->sub[i]->pindex = i; mstrncpy(ndir, path, M_DIR); mstrncat(ndir, "/", M_DIR); mstrncat(ndir, namelist[n]->d_name, M_DIR); if (fs_isdir(ndir)) dir->sub[i]->type = T_FOLDER; dir->sub[i]->check = 0; /* check=0 means we've already processed this item */ } free(namelist[n]); } free(namelist); dir->check = 0; for (i = 0; i < dir->n_sub; i++) if (dir->sub[i]->check) { /* not checked yet... that means the item is not in the reparsed directory, ie vanished. * so we're removing it from our queue */ node_delete(dir->sub[i]); dir->n_sub--; dir->sub[i] = dir->sub[dir->n_sub]; /* exchange with the last one */ dir->sub[i]->pindex = i; dir->check = 1; } /* if we removed something, then shrink the buffer accordingly .. */ if (dir->check) dir->sub = (struct _t_node**)realloc(dir->sub , dir->n_sub * sizeof(t_node *)); dir->parsed = 1; } return 0; } s3d-0.2.2.1/apps/s3dfm/s3dfm.h000066400000000000000000000135021361325167000155140ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #ifndef _S3DFM_H_ #define _S3DFM_H_ #include /* for UNUSEDPARAM_ATTRIBUTE */ #include /* for s3dw_widget */ #ifndef S3DFMUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DFMUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DFMUNUSED(x) /* x */ #else #define S3DFMUNUSED(x) x #endif #endif #define T_DUNO 0 #define T_FOLDER 1 #define T_TYPENUM 2 #define M_DIR 512 #define M_NAME 256 /* total height of the block */ #define BOXHEIGHT 1.2 #define BHP 1.001 #define BHH BOXHEIGHT+0.001 /* how much should detached dirs move away from parent block */ #define DETHEIGHT 0.3 /* maximum size of the animation stack */ #define MAXANI 1024 #define ZOOMS 10 /* zoomspeed */ struct _t_node { char name[M_NAME]; /* name (e.g. file name) */ struct _t_node *parent; /* parent node */ struct _t_node **sub; /* list of nodes (if it's a subdir)*/ int n_sub; /* number of nodes in list ( = -1 for normal or not-expanded files) */ int dirs_opened; /* how many dirs are opened/displayed */ float px , py , pz , scale; /* state after animation */ float dpx, dpy, dpz, dscale; /* current state in animation */ int type; /* type, determined by extension or file type like dir, pipe, link etc */ int disp; /* the type of how the node is displayed currently */ #define D_NONE 0 #define D_ICON 1 #define D_DIR 2 int parsed, detached; /* Flags for parsed/detached (selected) nodes ... */ int oid; /* main oid, e.g the block or icons oid */ int pindex; /* the index in parents structure */ struct { /* some objects which might be used ... if not, should be -1 */ int close, select, title, titlestr; /* box decorations. */ int str; /* the name of the nodeas s3d object */ float strlen; /* the length of this string */ } objs; int check; /* check marker, for internal things */ }; struct _t_file { char *name; int size, state; struct _t_node *anode; }; enum { STATE_NONE, /* nothing happned */ STATE_INUSE, /* currently processing */ STATE_FINISHED, /* file operation finished */ STATE_CLEANED /* cleaned (e.g. reordered the item */ }; struct _filelist { struct _t_file *p; int n; }; struct fs_error { int err, state; char *message, *file; }; enum { ESTATE_NONE, ESTATE_RISE, ESTATE_WAIT_FOR_CONFIRM /* TODO: more states should be added and handed back to the filesystem processor, like * skip, abort, retry ... */ }; typedef struct _filelist filelist; typedef struct _t_node t_node; typedef struct _t_file t_file; extern t_node root, cam; /* some global objects */ extern t_node *focus; /* the focused object */ extern int typeinput; extern struct fs_error fs_err; enum { TYPE_NONE, TYPE_COPY, TYPE_MOVE, TYPE_UNLINK, TYPE_FINISHED }; extern int fs_lock; /* animation.c */ int ani_onstack(t_node *f); void ani_add(t_node *f); void ani_del(int i); void ani_doit(t_node *f); void ani_finish(t_node *f, int i); void ani_iterate(t_node *f); int ani_check(t_node *f); void ani_mate(void); /* box.c */ void box_draw(t_node *dir); void box_draw_icons(t_node *dir); int box_undisplay(t_node *dir); void box_order_icons(t_node *dir); void box_sidelabel(t_node *dir); int box_buildblock(t_node *dir); void box_order_subdirs(t_node *dir); int box_expand(t_node *dir); int box_unexpand(t_node *dir); int box_close(t_node *dir, int force); void box_focus_color(t_node *dir, int on); /* dialog.c */ void close_win(s3dw_widget *button); void window_help(void); void window_fs(s3dw_widget *button); void window_fs_another(void); void window_fs_nothing(void); void window_fs_errno(const char *errmsg); void window_fs_abort(s3dw_widget *button); void window_copy(const char *path); void window_fs_mkdir(s3dw_widget *button); void window_mkdir(const char *path); void window_move(const char *path); void window_info(char *path); void window_fsani(void); void window_unlink(void); /* event.c */ int event_click(struct s3d_evt *evt); int event_key(struct s3d_evt *evt); int event_oinfo(struct s3d_evt *hrmz); /* focus.c */ void focus_by_key(int keysym); float focus_get_scale(t_node *f); void focus_set(t_node *f); /* fs.c */ filelist *fl_new(char *path); void fl_del(filelist *fl); void fs_fl_approx(filelist *fl, int *files, int *dirs, int *bytes); int fs_fl_copy(filelist *fl, const char *dest); int fs_fl_move(filelist *fl, const char *dest); int fs_fl_unlink(filelist *fl); void fs_approx(char *source, int *files, int *dirs, int *bytes); int fs_copy(char *source, char *dest); int fs_move(char *source, char *dest); int fs_unlink(char *dest); int fs_error(const char *message, char *file); int fs_isdir(const char *source); /* icon.c */ int icon_draw(t_node *dir); int icon_undisplay(t_node *dir); void icon_focus_color(t_node *dir, int on); /* node.c */ t_node *node_getbypath(const char *path); void node_path(t_node *dir, char *path); t_node *node_getbyoid(t_node *t, int oid); int node_init(t_node *dir); int node_delete(t_node *dir); int node_undisplay(t_node *dir); void node_select(t_node *dir); void node_focus_color(t_node *node, int on); t_node *node_getdir(t_node *node); /* parse.c */ int parse_dir(t_node *dir); /* string.c */ void dotted_int(char *s, unsigned int i); char *dots_at_start(char *str, unsigned int n, t_node *d); char *mstrncat(char *dest, const char *src, int n); char *mstrncpy(char *dest, const char *src, int n); /* fly.c */ int fly_set_absolute_position(t_node *node); t_node *fly_create_anode(t_node *node); #endif /* _S3DFM_H_ */ s3d-0.2.2.1/apps/s3dfm/string.c000066400000000000000000000034451361325167000160060ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* just a few helper functions which only operate on strings, so we put them * here ... */ #include "s3dfm.h" #include /* strlen(), strncpy() */ /* writes the path of the item d in string str with bufferlength n, * adds some dots to the beginning if its too long */ char *dots_at_start(char *str, unsigned int n, t_node *d) { char *s = str; int i, j; i = n - 2; s[n-1] = 0; do { j = strlen(d->name) - 1; if (NULL != (d->parent)) { s[i] = '/'; i--; } while ((i >= 0) && (j >= 0)) { s[i] = d->name[j]; j--; i--; } if (i < 0) break; } while ((d = d->parent) != NULL); if (i < 0) s[0] = s[1] = '.'; else s = (char *)s + i + 1; /* jump to start of the string */ return s; } /* add some dots to an integer value for better readability */ void dotted_int(char *s, unsigned int i) { char st[M_DIR]; unsigned int p; p = 0; st[0] = 0; while (i > 0) { if ((p + 1) % 4 == 0) { st[p] = '.'; p++; } st[p] = (i % 10) + '0'; i = i / 10; p++; } if (p > 0) p--; st[p+1] = 0; for (i = 0; i < p + 1; i++) s[i] = st[p-i]; s[p+1] = 0; } /* save concatting 2 strings, this version takes argument n * as the size of the buffer of dest. */ char *mstrncat(char *dest, const char *src, int n) { int i, j; dest[n-1] = 0; /* for malformed destinations */ j = 0; for (i = strlen(dest); i < (n - 1); i++) { dest[i] = src[j]; if (dest[i] == 0) break; j++; } for (; i < n; i++) dest[i] = 0; /* pad the rest with zero */ return dest; } /* same as strncpy, but have a terminating zero even if * source is too big */ char *mstrncpy(char *dest, const char *src, int n) { strncpy(dest, src, n); dest[n-1] = 0; return dest; } s3d-0.2.2.1/apps/s3dosm/000077500000000000000000000000001361325167000145225ustar00rootroot00000000000000s3d-0.2.2.1/apps/s3dosm/CMakeLists.txt000066400000000000000000000022241361325167000172620ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(s3dosm C) # depends on xml2, sqlite3 if (LIBXML2_FOUND AND SQLITE3_FOUND) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(s3dosm db.c draw.c gps.c http_error_codes.c http_fetcher.c# io.c kismet.c main.c nav.c object.c osm.c tag.c ui.c) target_link_libraries(s3dosm s3d s3dw ${MATH_LIBRARIES} ${LIBXML2_LIBRARIES} ${SQLITE3_LIBRARIES}) if (GPS_FOUND) target_link_libraries(s3dosm ${GPS_LIBRARIES}) else (GPS_FOUND) PkgStatusPartial_Later("GPS support - libgps (pkg name: libgps-dev or gpsd)") endif (GPS_FOUND) Collected_PkgStatusPartial("s3dosm") # install install(TARGETS s3dosm RUNTIME DESTINATION "${BIN_INSTALL_DIR}") else (LIBXML2_FOUND AND SQLITE3_FOUND) if (NOT LIBXML2_FOUND) PkgStatus_Later("libxml2 (pkg name: libxml2-dev)") endif (NOT LIBXML2_FOUND) if (NOT SQLITE3_FOUND) PkgStatus_Later("SQLite3 (pkg name: libsqlite3-dev)") endif (NOT SQLITE3_FOUND) # print late status Collected_PkgStatus("s3dosm") endif (LIBXML2_FOUND AND SQLITE3_FOUND) s3d-0.2.2.1/apps/s3dosm/TODO000066400000000000000000000000351361325167000152100ustar00rootroot00000000000000do something about malloc()s s3d-0.2.2.1/apps/s3dosm/bbbikepol_to_osm.pl000077500000000000000000000053431361325167000204000ustar00rootroot00000000000000#!/usr/bin/env perl # # SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich # # # # takes a bbbike[1] streetfile as input and converts it to some osm xml file format. # # bbbike files are usually not in polar coordinate format, you will have to convert them first, e.g. # like this (from within your local bbbike checkout): # # perl ./miscsrc/convert_coordsys standard polar < data/strassen > /tmp/strassen.polar # # [1]: bbbike is the free Berlin bike map system: http://bbbike.sourceforge.net/ # use the cvs download from sourceforge to retrieve the scripts and data. # use Switch; $created_by="dotslashs crufty bbbike converter"; $node_string=""; $seg_string=""; $way_string=""; $id=1; ( $sec, $min, $hour, $day, $month, $year ) = ( localtime ) [ 0, 1, 2, 3, 4, 5 ]; %translate = ("HH","primary","H","secondary","N","residential", "NN","residential"); $timestamp =sprintf("%04d-%02d-%02d %02d:%02d:%02d",1900+$year,$month,$day, $hour,$min,$sec); print "\n"; print "\n"; while (<>) { if (/^\#/) { next; } @array=split(/\t/,$_); $name=$array[0]; $name=~ s/\'//eg; # remove bad ' $name=~ s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg; #latin1 -> utf8 ($type, @coords)=split(/[\s]/,$array[1]); # $type=shift(@coords); # actually the first entry isn't some coord .. if ($type eq"Pl") { ($lo, $la)=split(/,/,$coords[0]); $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $id++; } else { @nodeid=(0,0); @segs=(); foreach (@coords) { ($lo, $la)=split(/,/,$_); $node_string.=" \n"; $nodeid[1]=$nodeid[0]; $nodeid[0]=$id; $id++; if ($nodeid[1]>0) { $seg_string.=" \n"; push(@segs,$id); $id++; } } $way_string.=" \n"; foreach (@segs) { $way_string.=" \n"; } $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; $way_string.=" \n"; } } print $node_string; print $seg_string; print $way_string; print "\n"; s3d-0.2.2.1/apps/s3dosm/db.c000066400000000000000000000213771361325167000152650ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include "s3dosm.h" #include #include /* stdup() */ #include /* unlink() */ #include /* atoi() */ static char qbuf[QBUF]; static int qlen = 0; static int tagid = 1; /* tagid, incremented with each new object */ static sqlite3 *db; static char *dbFile = NULL; /* TODO: remove '' for security reasons */ static void clean_string(char *clean, const char *dirty, int n) { strncpy(clean, dirty, n); clean[n-1] = 0; } int db_add_tag(object_t *obj, const char *key, const char *val) { char tagquery[MAXQ]; char mkey[MAXQ], mval[MAXQ]; clean_string(mkey, key, MAXQ); clean_string(mval, val, MAXQ); sqlite3_snprintf(MAXQ, tagquery, "INSERT INTO tag VALUES (%d, '%q','%q' );", (int)obj->tagid, mkey, mval); db_exec(tagquery, NULL, NULL); return 0; } int db_insert_node(node_t *node) { char addquery[MAXQ]; node->base.tagid = tagid++; if (node->base.id == 0) /* give own id */ sqlite3_snprintf(MAXQ, addquery, "INSERT INTO node (layer_id, latitude, longitude, altitude, visible, tag_id) VALUES (%d, %f, %f, %f, %d, %d);", (int)node->base.layerid, node->lat, node->lon, node->alt, node->visible, (int)node->base.tagid); else sqlite3_snprintf(MAXQ, addquery, "INSERT INTO node (layer_id, node_id,latitude, longitude, altitude, visible, tag_id) VALUES (%d, %d, %f, %f, %f, %d, %d);", (int)node->base.layerid, (int)node->base.id, node->lat, node->lon, node->alt, node->visible, (int)node->base.tagid); db_exec(addquery, NULL, NULL); return 0; } int db_insert_segment(segment_t *seg) { char addquery[MAXQ]; seg->base.tagid = tagid++; if (seg->base.id == 0) { /* give own id */ printf("ugh, segment id is 0!\n"); exit(0); } sqlite3_snprintf(MAXQ, addquery, "INSERT INTO segment (layer_id, seg_id, node_from, node_to, tag_id) VALUES (%d, %d, %d, %d, %d);", (int)seg->base.layerid, (int)seg->base.id, (int)seg->from, (int)seg->to, (int)seg->base.tagid); db_exec(addquery, NULL, NULL); return 0; } int db_insert_way_only(way_t *way) { char addquery[MAXQ]; way->base.tagid = tagid++; sqlite3_snprintf(MAXQ, addquery, "INSERT INTO way (layer_id, way_id, tag_id) VALUES (%d, %d, %d);", (int)way->base.layerid, (int)way->base.id, (int)way->base.tagid); db_exec(addquery, NULL, NULL); return 0; } int db_insert_way_seg(way_t *way, int seg_n) { char addquery[MAXQ]; sqlite3_snprintf(MAXQ, addquery, "UPDATE segment SET way_id=%d WHERE seg_id=%d AND layer_id=%d;", (int)way->base.id, seg_n, (int)way->base.layerid); db_exec(addquery, NULL, NULL); return 0; } int db_insert_layer(const char *layer_name) { char findquery[MAXQ]; char addquery[MAXQ]; char clayer[MAXQ]; int layerid = -1; clean_string(clayer, layer_name, MAXQ); sqlite3_snprintf(MAXQ, findquery, "SELECT layer_id FROM layer WHERE name='%q';", clayer); db_exec(findquery, db_getint, &layerid); if (layerid == -1) { /* need to add */ sqlite3_snprintf(MAXQ, addquery, "INSERT INTO layer(name) VALUES ('%q');", clayer); db_exec(addquery, NULL, NULL); db_flush(); db_exec(findquery, db_getint, &layerid); } return layerid; } #define MAGIC 1337 /* just to elevate the nodes a little bit */ static int found = 0; /* tries to find node coordinates of ip, returns 1 if has found something */ int db_olsr_check(const char *ip, float *pos) { char findquery[MAXQ]; char clean_ip[16]; float p[6]; char *s = NULL; clean_string(clean_ip, ip, 16); if (NULL != (s = strchr(clean_ip, '/'))) /* don't process ip's with subnet information */ *s = 0; /* TERMINATING ZERO!! */ sqlite3_snprintf(MAXQ, findquery, "SELECT latitude, longitude, altitude FROM node WHERE tag_id=(SELECT tag_id FROM tag WHERE tagkey='ip' AND tagvalue='%q');", clean_ip); found = MAGIC; db_exec(findquery, db_getpoint, p); if (found == 1) { pos[0] = p[0]; pos[1] = p[1]; pos[2] = p[2]; found = 0; return 1; } found = 0; return 0; } /* initializes the starting point of nodes by averaging its lon/lat */ int db_olsr_node_init(float *pos) { found = 0; db_exec("SELECT AVG(latitude) as latitude, AVG(longitude) as longitude, AVG(altitude) as altitude FROM node WHERE tag_id IN (SELECT tag_id FROM tag WHERE tagkey='ip');", db_getpoint, pos); printf("pos = %3.3f %3.3f %3.3f\n", pos[0], pos[1], pos[2]); return 0; /* return 1 if something is found, 0 if pos[0] its still 0 */ } /* expecting a 3x float vector, returns the points coordinates */ int db_getpoint(void *data, int argc, char **argv, char **azColName) { float lo = 0.0, la = 0.0, alt = 0.0; float *p = (float*)data; int i; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "longitude")) lo = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "latitude")) la = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "altitude")) alt = strtod(argv[i], NULL); } } if (lo == 0.0) { printf("missing lo\n"); exit(0); } if (la == 0.0) { printf("missing la\n"); exit(0); } if (found == MAGIC) alt = 2; calc_earth_to_eukl(la, lo, alt, p); p[3] = la; p[4] = lo; p[5] = alt; found = 1; return 0; } /* sqlite3-callback to get an integer of the database */ int db_getint(void *tagid, int S3DOSMUNUSED(argc), char **argv, char **S3DOSMUNUSED(azColName)) { if (argv[0] != NULL) *((int *)tagid) = atoi(argv[0]); return 0; } /* sqlite3-callback to get a string of the database */ static int db_getstr(void *string, int S3DOSMUNUSED(argc), char **argv, char **S3DOSMUNUSED(azColName)) { if (argv[0]) clean_string((char *)string, argv[0], MAXQ); return 0; } /* get the value for a a certain tagid and keyvalue (field). Write into target, which has to be allocated with MAXQ bytes of space. * Nothing is written when nothing is found. */ int db_gettag(int tagid, const char *field, char *target) { char query[MAXQ]; target[0] = 0; sqlite3_snprintf(MAXQ, query, "SELECT tagvalue FROM tag WHERE tagkey='%q' AND tag_id=%d;", field, tagid); db_exec(query, db_getstr, target); return target[0] == 0; } int callback(void *S3DOSMUNUSED(NotUsed), int argc, char **argv, char **azColName) { int i; for (i = 0; i < argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } static int db_really_exec(const char *query, sqlite3_callback callback, const void *arg) { char *zErrMsg = NULL; int rc; if (SQLITE_OK != (rc = sqlite3_exec(db, query, callback, (void*)arg, &zErrMsg))) { fprintf(stderr, "query: %s\n", query); fprintf(stderr, "SQL error: %s\n", zErrMsg); exit(-1); } return SQLITE_OK != rc; /* 0 = okay */ } /* call this if you're finished with a few stackable operations */ void db_flush(void) { if (qlen > 0) db_really_exec(qbuf, NULL, NULL); qbuf[0] = 0; qlen = 0; } int db_exec(const char *query, sqlite3_callback callback, const void *arg) { int ret; #ifdef DB_STACK if (callback == NULL) { /* we can stack it */ int len; len = strlen(query); if (len + qlen >= QBUF) db_flush(); if (len >= QBUF) { ret = db_really_exec(query, callback, arg); /* pass it to the real function */ } else { strncat(qbuf, query, QBUF - qlen - 1); qlen += strlen(query); ret = 0; } } else #endif { ret = db_really_exec(query, callback, arg); /* pass it to the real function */ } return ret; } int db_init(const char *dbFile) { int rc; tagid = 1; qbuf[0] = 0; /* clear querybuffer */ qlen = 0; unlink(dbFile); /* remove if already there */ rc = sqlite3_open(dbFile, &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } return 0; } int db_quit(void) { sqlite3_close(db); if (dbFile != NULL) if (unlink(dbFile)) perror("db_quit()"); return 0; } int db_create(void) { db_exec("CREATE TABLE node (layer_id INT, node_id INTEGER , latitude DOUBLE PRECISION, longitude DOUBLE PRECISION, altitude DOUBLE PRECISION, visible BOOLEAN, tag_id INT, s3doid INT, PRIMARY KEY(layer_id,node_id));", NULL, NULL); db_exec("CREATE TABLE segment (layer_id INT, seg_id INTEGER, node_from INT, node_to INT, tag_id INT, way_id INT,PRIMARY KEY(layer_id,seg_id));", NULL, NULL); db_exec("CREATE TABLE way (layer_id INTEGER, way_id INTEGER, tag_id INT, s3doid INT, PRIMARY KEY(layer_id,way_id));", NULL, NULL); db_exec("CREATE TABLE layer (layer_id INTEGER, name TEXT, PRIMARY KEY(layer_id));", NULL, NULL); db_exec("CREATE TABLE tag (tag_id INT, tagkey TEXT, tagvalue TEXT, PRIMARY KEY(tag_id, tagkey));", NULL, NULL); /* db_exec("CREATE UNIQUE INDEX node_id_index ON node (node_id,layer_id);", NULL, NULL); db_exec("CREATE UNIQUE INDEX segment_id_index ON segment (seg_id,layer_id);", NULL, NULL); db_exec("CREATE UNIQUE INDEX tag_id_index ON tag (tag_id,tagkey);", NULL, NULL); */ db_flush(); return 0; } s3d-0.2.2.1/apps/s3dosm/draw.c000066400000000000000000000366421361325167000156360ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include "s3dosm.h" #include #include /* sin(), cos() */ #include /* printf() */ #include /* strcmp() */ #include /* atoi(),malloc(), calloc(), free() */ static float temp; #define V_COPY(a,b) a[0]=b[0]; a[1]=b[1]; a[2]=b[2]; #define V_ADD(a,b,c) c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; c[2]=a[2]+b[2]; #define V_SUB(a,b,c) c[0]=a[0]-b[0]; c[1]=a[1]-b[1]; c[2]=a[2]-b[2]; #define V_DOT(a,b) a[0]*b[0] + a[1]*b[1] + a[2] * b[2] #define V_CROSS(a,b,c) c[0]=a[1]*b[2] - a[2]*b[1]; c[1]=a[2]*b[0] - a[0]*b[2]; c[2]=a[0]*b[1] - a[1]*b[0]; #define V_LEN(a) sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]) #define V_SCAL(a,s) a[0]=s*a[0]; a[1]=s*a[1]; a[2]=s*a[2]; #define V_NORM(a) temp=V_LEN(a); V_SCAL(a,1/temp); static int num_max; /* how many results in our query? to calculate pecent done ... */ static int num_done; /* how many already done */ static int lastid = -1; /* list element of a segment which is on our way */ struct waylist { int node_from, node_to; int node_from_int, node_to_int; int seg_id; int node_from_l, node_from_r; /* vertex id's for corners */ int node_to_l, node_to_r; }; /* list element of a node which is to be drawn */ struct nodelist { int node_id; /* (external counting) */ float la, lo, alt; /* earth coords */ float x[3]; /* euclid coords */ float normal[3]; }; /* list element for adjacent nodes */ struct adjlist { int node_id; /* node to which the segment leads to */ int seg_id; /* segment which is involved to the node (both internal counting) */ }; static struct waylist *waylist_p = NULL; static struct nodelist *nodelist_p = NULL; static struct adjlist *adjlist_p = NULL; static int nodelist_n = 0; static int adjlist_n = 0; static int waylist_n = 0; static int waylist_bufn = 0; void calc_earth_to_eukl(float lat, float lon, float alt, float *x) { float la, lo; la = lat * M_PI / 180.0; lo = lon * M_PI / 180.0; x[0] = (ESIZE + alt) * sin(lo) * cos(la); x[1] = (ESIZE + alt) * sin(la); x[2] = (ESIZE + alt) * cos(lo) * cos(la); } static int draw_icon(void *S3DOSMUNUSED(data), int argc, char **argv, char **S3DOSMUNUSED(azColName)) { int i, tagid = -1, oid; /* char query[MAXQ];*/ char s[MAXQ]; float la, lo; float x[3]; la = lo = 0.0; num_done++; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "longitude")) lo = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "latitude")) la = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "tag_id")) tagid = atoi(argv[i]); } } if (0 == db_gettag(tagid, "amenity", s)) { oid = -1; if (0 == strcmp(s, "wifi")) { /* some wifi icon */ if (0 == db_gettag(tagid, "wifi_type", s)) { if (0 == strcmp(s, "infrastructure")) { /* access point */ if (0 == db_gettag(tagid, "wifi_wep", s)) { if (0 == strcmp(s, "true")) oid = s3d_clone(icons[ICON_AP_WPA].oid); else oid = s3d_clone(icons[ICON_AP_OPEN].oid); } else oid = s3d_clone(icons[ICON_AP_OPEN].oid); /* assuming open ap */ } } } if (oid != -1) { calc_earth_to_eukl(la, lo, 0, x); s3d_translate(oid, x[0], x[1], x[2]); s3d_rotate(oid, (90 - la), lo, 0); s3d_link(oid, oidy); s3d_flags_on(oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); load_update_status((100.0*num_done) / (float)num_max); } } return 0; } /* just fetches node information and puts in the nodelist */ static int insert_node(void *data, int argc, char **argv, char **azColName) { struct nodelist *np = (struct nodelist *)data; /* get the nodepointer */ int i; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "longitude")) np[nodelist_n].lo = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "latitude")) np[nodelist_n].la = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "altitude")) np[nodelist_n].alt = strtod(argv[i], NULL); } } return 0; } static int select_waytype(void *data, int argc, char **argv, char **S3DOSMUNUSED(azColName)) { int i; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(argv[i], "motorway")) *((int *) data) = 5; else if (0 == strcmp(argv[i], "motorway_link")) *((int *) data) = 4; else if (0 == strcmp(argv[i], "primary")) *((int *) data) = 3; else if (0 == strcmp(argv[i], "secondary")) *((int *) data) = 2; else if (0 == strcmp(argv[i], "residential")) *((int *) data) = 1; } } return 0; } /* draw waylist, clear the queue */ static void waylist_draw(const char *filter) { float len; char query[MAXQ]; int i, j, k, vert = 0; int node_id; int way_obj; int waytype = 0; int adj_seg; float a[3], b[3], *left, *right, *swap; float street_width; /* dynamically adjust? */ float an[3]; /* normal on the plane, orthogonal on the right side of the left segment */ float n[3]; /* the direction vector in which the intersecion should be placed */ float s[3]; /* intersection point */ float point_zero[3]; /* we use point_zero so we don't have very big bounding spheres in s3d and speed up picking */ float n_len, scale; if (waylist_n == 0) /* no nodes, no fun */ return; /* printf("way: %d - %d segments\n",lastid,waylist_n);*/ way_obj = s3d_new_object(); if (lastid != -1) { snprintf(query, MAXQ, "SELECT tagvalue FROM tag WHERE tag_id=(SELECT tag_id FROM way WHERE way_id=%d AND %s) AND tagkey='highway';", lastid, filter); db_exec(query, select_waytype, &waytype); } switch (waytype) { case 5: s3d_push_material(way_obj, 0.2, 0.2, 0.6, 1.0, 1.0, 1.0, 0.3, 0.3, 1.0); /* motorway */ break; case 4: s3d_push_material(way_obj, 0.3, 0.3, 0.4, 1.0, 1.0, 1.0, 0.5, 0.5, 0.8); /* motorway_link*/ break; case 3: s3d_push_material(way_obj, 0.6, 0.3, 0.1, 1.0, 1.0, 1.0, 1.0, 0.6, 0.2); /* primary */ break; case 2: s3d_push_material(way_obj, 0.6, 0.6, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0); /* secondary */ break; case 1: s3d_push_material(way_obj, 0.6, 0.6, 0.6, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); /* residential */ break; default: s3d_push_material(way_obj, 0.6, 0.2, 0.6, 1.0, 1.0, 1.0, 1.0, 0.5, 1.0); /* default */ break; } street_width = (0.5 + waytype / 10) / RESCALE; /* put nodes of the graph into a list */ nodelist_n = 0; for (i = 0; i < waylist_n*2; i++) { if (i % 2) node_id = waylist_p[i/2].node_from; else node_id = waylist_p[i/2].node_to; for (j = 0; j < nodelist_n; j++) if (nodelist_p[j].node_id == node_id) break; if (j == nodelist_n) { /* we still need to add this node */ /* printf("[way %d] add node %d to nodelist as %d\n",lastid, node_id, nodelist_n);*/ nodelist_p[j].node_id = node_id; snprintf(query, MAXQ, "SELECT longitude, latitude, altitude FROM node WHERE %s AND node_id=%d;", filter, node_id); db_exec(query, insert_node, (void *)(nodelist_p)); calc_earth_to_eukl(nodelist_p[j].la, nodelist_p[j].lo, 0, nodelist_p[j].x); /* elevate higher priority streets a little bit ... */ len = sqrt(nodelist_p[j].x[0] * nodelist_p[j].x[0] + nodelist_p[j].x[1] * nodelist_p[j].x[1] + nodelist_p[j].x[2] * nodelist_p[j].x[2]); nodelist_p[j].normal[0] = nodelist_p[j].x[0] / len; nodelist_p[j].normal[1] = nodelist_p[j].x[1] / len; nodelist_p[j].normal[2] = nodelist_p[j].x[2] / len; nodelist_n++; } if (i % 2) waylist_p[i/2].node_from_int = j; else waylist_p[i/2].node_to_int = j; } V_COPY(point_zero, nodelist_p[0].x); /* iterate for all nodes */ for (i = 0; i < nodelist_n; i++) { /* find adjacent segments */ adjlist_n = 0; node_id = nodelist_p[i].node_id; for (j = 0; j <= waylist_n; j++) { if (waylist_p[j].node_from == node_id) { adjlist_p[adjlist_n].node_id = waylist_p[j].node_to_int; adjlist_p[adjlist_n].seg_id = j; adjlist_n++; } else if (waylist_p[j].node_to == node_id) { adjlist_p[adjlist_n].node_id = waylist_p[j].node_from_int; adjlist_p[adjlist_n].seg_id = j; adjlist_n++; } } if (adjlist_n > 1) { /* more than one adjacent, need to order and calculate intersections */ if (adjlist_n > 2) { /* no ordering needed for 2 incoming segments */ for (j = 0; j < adjlist_n - 2; j++) for (k = j + 2; k < adjlist_n; k++) { float test[3], normal[3], linevector[3]; /* (re)calc test direction */ V_SUB(nodelist_p[adjlist_p[j].node_id].x, nodelist_p[adjlist_p[j+1].node_id].x, linevector); V_CROSS(nodelist_p[adjlist_p[j].node_id].normal, linevector, normal); /* normal should look outside of our circle now. */ while (k < adjlist_n) { /* determine on which side the point is. if its between our testvector, we'll need to swap. */ V_SUB(nodelist_p[adjlist_p[j].node_id].x, nodelist_p[adjlist_p[k].node_id].x, test); if (s3d_vector_dot_product(normal, test) > 0) { /* same side, means adjacent line k is nearer to our point j than our point j+1 which is supposed to be the nearest point, so we swap them and call a break to get the new test-normal */ struct adjlist swap; memcpy(&swap, &(adjlist_p[j+1]), sizeof(struct adjlist)); memcpy(&(adjlist_p[j+1]), &(adjlist_p[k]), sizeof(struct adjlist)); memcpy(&(adjlist_p[k]), &swap, sizeof(struct adjlist)); break; } k++; } } } left = a; right = b; V_SUB(nodelist_p[adjlist_p[0].node_id].x, nodelist_p[i].x, right); V_NORM(right); for (j = 0; j < adjlist_n; j++) { swap = left; left = right; /* use last right segment as new left segment */ right = swap; /* get space for the next right segment */ V_SUB(nodelist_p[adjlist_p[(j+1)%adjlist_n].node_id].x, nodelist_p[i].x, right); V_NORM(right); V_CROSS(nodelist_p[i].normal, left , an); /* an is also normalized, as first and second argument are already length 1 */ V_ADD(left, right, n); /* direction which our intersection is */ V_CROSS(nodelist_p[i].normal, n, s); V_CROSS(s, nodelist_p[i].normal, n); /* get n on the plane which is spanned by the points normal */ n_len = V_LEN(n); V_COPY(s, nodelist_p[i].x); /* s = P + (street_width/ ( n * an)) * n */ V_SCAL(n, 1 / n_len); /* normalize n first! */ scale = V_DOT(n, an); /* get cos (alpha/2), alpha is opposite angel of left and right segment */ if ((n_len < 0.1) || (fabs(scale) < 0.1)) { /* too low, don't use, just have intersection 90 degree of it. */ V_SCAL(an, -street_width); /* S = P + street_width * an */ V_ADD(nodelist_p[i].x, an, s); } else { V_SCAL(n, -street_width / scale); V_ADD(s, n, s); } /* printf("calc intersection: %3.3f %3.3f %3.3f\n",s[0],s[1],s[2]);*/ V_SUB(s, point_zero, s); s3d_push_vertices(way_obj, s, 1); adj_seg = adjlist_p[j].seg_id; /* left segment */ if (i == waylist_p[adj_seg].node_from_int) waylist_p[adj_seg].node_from_r = vert; else waylist_p[adj_seg].node_to_l = vert; adj_seg = adjlist_p[(j+1)%adjlist_n].seg_id; /* right segment */ if (i == waylist_p[adj_seg].node_from_int) waylist_p[adj_seg].node_from_l = vert; else waylist_p[adj_seg].node_to_r = vert; vert++; } if (adjlist_n >= 3) { /* we know that the last adjlist_n vertices set belong to our intersection here .. */ for (j = vert - adjlist_n + 1; j < (vert - 1); j++) s3d_push_polygon(way_obj, vert - adjlist_n, j, j + 1, 0); } } else { /* endpoint */ V_SUB(nodelist_p[adjlist_p[0].node_id].x, nodelist_p[i].x, a); V_NORM(a); V_CROSS(nodelist_p[i].normal, a , an); /* an is also normalized, as first and second argument are already length 1 */ V_SCAL(an, street_width); V_COPY(s, nodelist_p[i].x); V_ADD(s, an, s); V_SUB(s, point_zero, s); s3d_push_vertices(way_obj, s, 1); j = vert; vert++; V_SCAL(an, -1); V_COPY(s, nodelist_p[i].x); V_ADD(s, an, s); V_SUB(s, point_zero, s); s3d_push_vertices(way_obj, s, 1); k = vert; vert++; adj_seg = adjlist_p[0].seg_id; if (i == waylist_p[adj_seg].node_from_int) { waylist_p[adj_seg].node_from_l = j; waylist_p[adj_seg].node_from_r = k; } else { waylist_p[adj_seg].node_to_l = k; waylist_p[adj_seg].node_to_r = j; } } } for (i = 0; i < waylist_n; i++) { uint32_t polys[8]; /* printf("drawing way from points %d %d %d %d\n",waylist_p[i].node_from_l, waylist_p[i].node_to_l, waylist_p[i].node_to_r,waylist_p[i].node_from_r);*/ polys[0] = waylist_p[i].node_from_l; polys[1] = waylist_p[i].node_to_l; polys[2] = waylist_p[i].node_to_r; polys[3] = 0; polys[4] = waylist_p[i].node_from_l; polys[5] = waylist_p[i].node_to_r; polys[6] = waylist_p[i].node_from_r; polys[7] = 0; s3d_push_polygons(way_obj, polys, 2); } s3d_translate(way_obj, point_zero[0], point_zero[1], point_zero[2]); s3d_link(way_obj, oidy); s3d_flags_on(way_obj, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); snprintf(query, MAXQ, "UPDATE way SET s3doid=%d WHERE way_id=%d AND %s;", way_obj, lastid, filter); db_exec(query, NULL, NULL); waylist_n = 0; load_update_status((100.0*num_done) / (float)num_max); } static void waylist_add(struct waylist *p) { if (waylist_n >= waylist_bufn) { waylist_bufn += 64; waylist_p = realloc(waylist_p, sizeof(*waylist_p) * waylist_bufn); nodelist_p = realloc(nodelist_p, sizeof(*nodelist_p) * waylist_bufn * 2); /* we can have twice as many nodes as there are segments in a graph. */ adjlist_p = realloc(adjlist_p, sizeof(*adjlist_p) * waylist_bufn * 2); } waylist_p[waylist_n].node_to = p->node_to; waylist_p[waylist_n].node_from = p->node_from; waylist_n++; } static int way_group(void *data, int argc, char **argv, char **azColName) { int i; int id = -1; struct waylist p; char *filter = (char *)data; num_done++; p.node_from = p.node_to = 0; p.node_to = -1; p.seg_id = -1; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "way_id")) id = atoi(argv[i]); else if (0 == strcmp(azColName[i], "node_from")) p.node_from = atoi(argv[i]); else if (0 == strcmp(azColName[i], "node_to")) p.node_to = atoi(argv[i]); else if (0 == strcmp(azColName[i], "seg_id")) p.seg_id = atoi(argv[i]); } } if (p.node_from == p.node_to) /* skip */ return 0; if ((lastid != id) && (id != 0)) { waylist_draw(filter); /* flush/draw the list, add new */ waylist_add(&p); } else { /* add id to the list */ waylist_add(&p); } lastid = id; return 0; } void draw_translate_icon(int user_icon, float la, float lo) { float x[3]; calc_earth_to_eukl(la, lo, 1 / RESCALE, x); s3d_translate(user_icon, x[0], x[1], x[2]); s3d_rotate(user_icon, (90 - la), lo, 0); } static void draw_ways(const char *filter) { char query[MAXQ]; num_done = 0; snprintf(query, MAXQ, "SELECT count(seg_id) FROM segment WHERE %s;", filter); db_exec(query, db_getint, &num_max); snprintf(query, MAXQ, "SELECT * FROM segment WHERE %s ORDER BY way_id;", filter); db_exec(query, way_group, filter); waylist_draw(filter); /* last way */ } static void draw_osm(void) { load_window("Drawing Card ..."); draw_ways("layer_id=(SELECT layer_id FROM layer WHERE name='osm')"); } static void draw_kismet(void) { char query[MAXQ]; char filter[] = "layer_id=(SELECT layer_id FROM layer WHERE name='kismet')"; load_window("Drawing Access Points ..."); num_done = 0; snprintf(query, MAXQ, "SELECT count(node_id) FROM node WHERE %s;", filter); db_exec(query, db_getint, &num_max); snprintf(query, MAXQ, "SELECT * FROM node WHERE %s;", filter); db_exec(query, draw_icon, filter); } void draw_all_layers(void) { draw_osm(); draw_kismet(); load_window_remove(); } s3d-0.2.2.1/apps/s3dosm/gps.c000066400000000000000000000134031361325167000154600ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include "s3dosm.h" #include /* printf() */ #ifdef HAVE_GPS static int user_icon = -1, user_icon_rotator = -1; #include /* gps_*() */ #include /* errno */ #include /* malloc(), free() */ #include /* strlen() */ #include /* snprintf(), printf(), NULL */ #include /* nanosleep(), struct tm, time_t... */ #include /* fabs(), finite () */ #include /* fcntl() */ #include /* fcntl() */ static struct gps_data_t *dgps; static int frame = 0; static int lastfix = 0; static int gps_active = 0; static int gps_info = -1; static float lat, lon, tlat, tlon; /* we have the same in nav.c, this one is for the user icon ... */ static float lat_old, lon_old; static float speed_old = 0.0; void show_gpsdata(struct gps_data_t *dgps); static void show_position(struct gps_data_t *dgps); void show_gpsdata(struct gps_data_t *dgps) { #if GPSD_API_MAJOR_VERSION >= 9 if (0 == dgps->online.tv_sec && 0 == dgps->online.tv_nsec) #else if (!dgps->online) #endif printf("WARNING: no connection to gps device\n"); printf("[%d] lat/long: [%f|%f], altitude %f\n", frame, dgps->fix.latitude, dgps->fix.longitude, dgps->fix.altitude); printf("speed [kph]: %f\n", dgps->fix.speed / KNOTS_TO_KPH); printf("used %d/%d satellits\n", dgps->satellites_used, dgps->satellites_visible); switch (dgps->status) { case STATUS_NO_FIX: printf("status: no fix\n"); break; case STATUS_FIX: printf("status: fix\n"); break; #ifdef STATUS_DGPS_FIX case STATUS_DGPS_FIX: printf("status: dgps fix\n"); break; #endif } switch (dgps->fix.mode) { case MODE_NOT_SEEN: printf("mode: not seen yet\n"); break; case MODE_NO_FIX: printf("mode: no fix\n"); break; case MODE_2D: printf("mode: 2d fix\n"); break; case MODE_3D: printf("mode: 3d fix\n"); break; } } #define BUFSIZE 1024 static void show_position(struct gps_data_t *dgps) { int fix = 1; float la, lo, heading, speed, slen; char buf[BUFSIZE+1]; #if GPSD_API_MAJOR_VERSION >= 9 if (0 == dgps->online.tv_sec && 0 == dgps->online.tv_nsec) #else if (!dgps->online) #endif fix = 0; switch (dgps->fix.mode) { case MODE_NOT_SEEN: fix = 0; break; case MODE_NO_FIX: fix = 0; break; } la = dgps->fix.latitude; lo = dgps->fix.longitude; heading = -dgps->fix.track; speed = dgps->fix.speed; tlat = la; tlon = lo; if (fix) { printf("have a fix\n"); nav_center(la, lo); if (!finitef(heading)) { heading = get_heading(lat_old, lon_old, la, lo); if (!lastfix) { s3d_scale(user_icon, 1.0 / RESCALE); } } if (finitef(heading)) s3d_rotate(user_icon, 0, heading, 0); /* wrong rotation? */ if (finitef(speed)) { /* print some information */ snprintf(buf, BUFSIZE, "speed: %3.2f km/h", speed*3.6); speed_old = speed; } else snprintf(buf, BUFSIZE, "speed: NA (old: %3.2f km/h)", speed_old*3.6); if (gps_info != -1) s3d_del_object(gps_info); gps_info = s3d_draw_string(buf, &slen); s3d_translate(gps_info, -slen / 2, 1, 0); s3d_link(gps_info, user_icon); s3d_flags_on(gps_info, S3D_OF_VISIBLE); } lat_old = la; lon_old = lo; lastfix = fix; } int gps_init(const char *gpshost) { int sock_opts; const char *err_str; #if GPSD_API_MAJOR_VERSION >= 5 dgps = malloc(sizeof(*dgps)); if (dgps != NULL) if (gps_open(gpshost, "2947", dgps)) { free(dgps); dgps = NULL; } #else dgps = gps_open(gpshost, "2947"); #endif if (dgps == NULL) { switch (errno) { case NL_NOSERVICE: err_str = "can't get service entry"; break; case NL_NOHOST: err_str = "can't get host entry"; break; case NL_NOPROTO: err_str = "can't get protocol entry"; break; case NL_NOSOCK: err_str = "can't create socket"; break; case NL_NOSOCKOPT: err_str = "error SETSOCKOPT SO_REUSEADDR"; break; case NL_NOCONNECT: err_str = "can't connect to host"; break; default: err_str = "Unknown"; break; } /* printf("no connection to gpsd\n");*/ fprintf(stderr, "s3dosm: no gpsd running or network error: %d, %s\n" , errno, err_str); return -1; } sock_opts = fcntl(dgps->gps_fd, F_GETFL, 0); fcntl(dgps->gps_fd, F_SETFL, sock_opts | O_NONBLOCK); user_icon = s3d_clone(icons[ICON_ARROW].oid); user_icon_rotator = s3d_new_object(); s3d_link(user_icon, user_icon_rotator); s3d_link(user_icon_rotator, oidy); s3d_flags_on(user_icon, S3D_OF_VISIBLE); s3d_scale(user_icon, 1.0 / RESCALE); tlat = lat = lat_old = 0.0; tlon = lon = lon_old = 0.0; gps_active = 1; gps_stream(dgps, WATCH_ENABLE, NULL); return 0; } int gps_main(void) { if (gps_active && ((frame % 6) == 0)) { #if GPSD_API_MAJOR_VERSION >= 7 if (gps_read(dgps, NULL, 0) < 0) { #elif GPSD_API_MAJOR_VERSION >= 5 if (gps_read(dgps) < 0) { #else if (gps_poll(dgps) < 0) { #endif if (errno != EWOULDBLOCK) { printf("read error on server socket\n"); gps_quit(); } } /*show_gpsdata(dgps);*/ show_position(dgps); } if ((fabs(tlat - lat) > 0.00001) && (fabs(tlon - lon) > 0.00001)) { if (lat == 0.0 && lon == 0.0) { lat = tlat; lon = tlon; } else { lat = (tlat + lat * 7) / 8; lon = (tlon + lon * 7) / 8; } } else { tlat = lat; tlon = lon; } draw_translate_icon(user_icon_rotator, lat, lon); frame++; return 0; } int gps_quit(void) { if (gps_active) { printf("deactivating gps-connection ...\n"); gps_active = 0; gps_close(dgps); #if GPSD_API_MAJOR_VERSION >= 5 free(dgps); dgps = NULL; #endif } return 0; } #else int gps_init(const char *S3DOSMUNUSED(gpshost)) { printf("GPS support not compiled in!\n"); return 0; } int gps_main(void) { return 0; } int gps_quit(void) { return 0; } #endif s3d-0.2.2.1/apps/s3dosm/http_error_codes.c000066400000000000000000000016431361325167000202370ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2001 Lyle Hanson */ #include "http_error_codes.h" /* Note that '%d' cannot be escaped at this time */ const char *http_errlist[] = { "Success", /* HF_SUCCESS */ "Internal Error. What the hell?!", /* HF_METAERROR */ "Got NULL url", /* HF_NULLURL */ "Timed out, no metadata for %d seconds", /* HF_HEADTIMEOUT */ "Timed out, no data for %d seconds", /* HF_DATATIMEOUT */ "Couldn't find return code in HTTP response", /* HF_FRETURNCODE */ "Couldn't convert return code in HTTP response",/* HF_CRETURNCODE */ "Request returned a status code of %d", /* HF_STATUSCODE */ "Couldn't convert Content-Length to integer" /* HF_CONTENTLEN */ }; /* Used to copy in messages from http_errlist[] and replace %d's with * the value of errorInt. Then we can pass the pointer to THIS */ char convertedError[128]; s3d-0.2.2.1/apps/s3dosm/http_error_codes.h000066400000000000000000000011041361325167000202340ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2001 Lyle Hanson */ #ifndef HTTP_ERROR_CODES_H #define HTTP_ERROR_CODES_H /* Error sources */ #define FETCHER_ERROR 0 #define ERRNO 1 #define H_ERRNO 2 /* HTTP Fetcher error codes */ #define HF_SUCCESS 0 #define HF_METAERROR 1 #define HF_NULLURL 2 #define HF_HEADTIMEOUT 3 #define HF_DATATIMEOUT 4 #define HF_FRETURNCODE 5 #define HF_CRETURNCODE 6 #define HF_STATUSCODE 7 #define HF_CONTENTLEN 8 extern const char *http_errlist[]; extern char convertedError[128]; #endif s3d-0.2.2.1/apps/s3dosm/http_fetcher.c000066400000000000000000000367771361325167000173710ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2001 Lyle Hanson * * * Changes: * Simon Wunderlich * + added http_setAuth() to support basic http-authentication and some minor fixes */ #include #include #include #include #include #include #include #include #include #include "http_fetcher.h" #include "http_error_codes.h" /* Globals */ static int timeout = DEFAULT_READ_TIMEOUT; static char *userAgent = NULL; static char *referer = NULL; static char *auth = NULL; static int hideUserAgent = 0; static int hideReferer = 1; static int errorSource = 0; static int http_errno = 0; static int errorInt = 0; /* When the error message has a %d in it, * this variable is inserted */ static int freeOldAgent = 0; /* Indicates previous malloc's */ static int freeOldReferer = 0; /* Indicated previous malloc's */ /* * Actually downloads the page, registering a hit (donation) * If the fileBuf passed in is NULL, the url is downloaded and then * freed; otherwise the necessary space is allocated for fileBuf. * Returns size of download on success, -1 on error is set, */ int http_fetch(const char *url_tmp, char **fileBuf) { fd_set rfds; struct timeval tv; char requestBuf[REQUEST_BUF_SIZE]; char headerBuf[HEADER_BUF_SIZE]; char *url, *pageBuf, *host, *charIndex; int sock, bytesRead = 0, contentLength = -1; int ret = -1, i, selectRet; if (url_tmp == NULL) { errorSource = FETCHER_ERROR; http_errno = HF_NULLURL; return -1; } /* Copy the url passed in into a buffer we can work with, change, etc. */ url = strdup(url_tmp); if (!url) { errorSource = ERRNO; return -1; } /* Seek to the file path portion of the url */ charIndex = strstr(url, "://"); if (charIndex != NULL) { /* url contains a protocol field */ charIndex += strlen("://"); host = charIndex; charIndex = strchr(charIndex, '/'); } else { host = (char *)url; charIndex = strchr(url, '/'); } /* Compose a request string */ if (charIndex == NULL) /* The url has no '/' in it, assume the user is making a root-level * request */ sprintf(requestBuf, "GET / %s\r\n", HTTP_VERSION); else sprintf(requestBuf, "GET %s %s\r\n", charIndex, HTTP_VERSION); /* Null out the end of the hostname if need be */ if (charIndex != NULL) *charIndex = 0; strncat(requestBuf, "Host: ", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, host, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); if (!hideReferer && referer != NULL) { /* NO default referer */ strncat(requestBuf, "Referer: ", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, referer, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); } if (!hideUserAgent && userAgent == NULL) { strncat(requestBuf, "User-Agent: ", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, DEFAULT_USER_AGENT, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "/", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, HTTP_FETCHER_VERSION, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); } else if (!hideUserAgent) { strncat(requestBuf, "User-Agent: ", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, userAgent, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); } if (auth != NULL) { strncat(requestBuf, "Authorization: Basic ", sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, auth, sizeof(requestBuf) - 1 - strlen(requestBuf)); strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); } strncat(requestBuf, "\r\n", sizeof(requestBuf) - 1 - strlen(requestBuf)); printf("[HTTP] creating connection ...\n"); sock = makeSocket(host); /* errorSource set within makeSocket */ if (sock == -1) { free(url); return -1; } printf("[HTTP] sending request \n"); if (write(sock, requestBuf, strlen(requestBuf)) == -1) { close(sock); free(url); errorSource = ERRNO; return -1; } printf("[HTTP] receiving header\n"); /* Grab enough of the response to get the metadata */ ret = _http_read_header(sock, headerBuf); /* errorSource set within */ if (ret < 0) { close(sock); free(url); return -1; } printf("[HTTP] receiving content\n"); /* Get the return code */ charIndex = strstr(headerBuf, "HTTP/"); if (charIndex == NULL) { close(sock); free(url); errorSource = FETCHER_ERROR; http_errno = HF_FRETURNCODE; return -1; } while (*charIndex != ' ') charIndex++; charIndex++; ret = sscanf(charIndex, "%i", &i); if (ret != 1) { close(sock); free(url); errorSource = FETCHER_ERROR; http_errno = HF_CRETURNCODE; return -1; } if (i < 200 || i > 299) { close(sock); free(url); errorInt = i; /* Status code, to be inserted in error string */ errorSource = FETCHER_ERROR; http_errno = HF_STATUSCODE; return -1; } /* * Parse out about how big the data segment is. * Note that under current HTTP standards (1.1 and prior), the * Content-Length field is not guaranteed to be accurate or even present. * I just use it here so I can allocate a ballpark amount of memory. * * Note that some servers use different capitalization */ charIndex = strstr(headerBuf, "Content-Length:"); if (charIndex == NULL) charIndex = strstr(headerBuf, "Content-length:"); if (charIndex != NULL) { ret = sscanf(charIndex + strlen("content-length: "), "%i", &contentLength); if (ret < 1) { close(sock); free(url); errorSource = FETCHER_ERROR; http_errno = HF_CONTENTLEN; return -1; } } /* Allocate enough memory to hold the page */ if (contentLength == -1) contentLength = DEFAULT_PAGE_BUF_SIZE; pageBuf = (char *)malloc(contentLength + 1); if (pageBuf == NULL) { close(sock); free(url); errorSource = ERRNO; return -1; } /* Begin reading the body of the file */ while (ret > 0) { FD_ZERO(&rfds); FD_SET(sock, &rfds); tv.tv_sec = timeout; tv.tv_usec = 0; if (timeout >= 0) selectRet = select(sock + 1, &rfds, NULL, NULL, &tv); else /* No timeout, can block indefinately */ selectRet = select(sock + 1, &rfds, NULL, NULL, NULL); if (selectRet == 0 && timeout < 0) { errorSource = FETCHER_ERROR; http_errno = HF_DATATIMEOUT; errorInt = timeout; close(sock); free(url); free(pageBuf); return -1; } else if (selectRet == -1) { close(sock); free(url); free(pageBuf); errorSource = ERRNO; return -1; } ret = read(sock, pageBuf + bytesRead, contentLength); if (ret == -1) { close(sock); free(url); free(pageBuf); errorSource = ERRNO; return -1; } bytesRead += ret; if (ret > 0) { /* To be tolerant of inaccurate Content-Length fields, we'll * allocate another read-sized chunk to make sure we have * enough room. */ pageBuf = (char *)realloc(pageBuf, bytesRead + contentLength); if (pageBuf == NULL) { close(sock); free(url); free(pageBuf); errorSource = ERRNO; return -1; } } printf("[HTTP] read %d bytes\n", ret); } /* * The download buffer is too large. Trim off the safety padding. */ pageBuf = (char *)realloc(pageBuf, bytesRead); /* pageBuf shouldn't be null, since we're _shrinking_ the buffer, * and if it DID fail, we could go on with the too-large buffer, * but something would DEFINATELY be wrong, so we'll just give * an error message */ if (pageBuf == NULL) { close(sock); free(url); free(pageBuf); errorSource = ERRNO; return -1; } if (fileBuf == NULL) /* They just wanted us to "hit" the url */ free(pageBuf); else *fileBuf = pageBuf; close(sock); free(url); return bytesRead; } /* * Changes the User Agent. Returns 0 on success, -1 on error. */ int http_setUserAgent(const char *newAgent) { char *tmp; size_t agent_len; if (newAgent == NULL) { if (freeOldAgent) free(userAgent); userAgent = NULL; hideUserAgent = 1; } else { agent_len = strlen(newAgent) + 1; tmp = (char *)malloc(agent_len); if (tmp == NULL) { errorSource = ERRNO; return -1; } if (freeOldAgent) free(userAgent); userAgent = tmp; strncpy(userAgent, newAgent, agent_len); userAgent[agent_len - 1] = '\0'; freeOldAgent = 1; hideUserAgent = 0; } return 0; } /* * Changes the Referer. Returns 0 on success, -1 on error */ int http_setReferer(const char *newReferer) { char *tmp; size_t referer_len; if (newReferer == NULL) { if (freeOldReferer) free(referer); referer = NULL; hideReferer = 1; } else { referer_len = strlen(newReferer) + 1; tmp = (char *)malloc(referer_len); if (tmp == NULL) { errorSource = ERRNO; return -1; } if (freeOldReferer) free(referer); referer = tmp; strncpy(referer, newReferer, referer_len); referer[referer_len - 1] = '\0'; freeOldReferer = 1; hideReferer = 0; } return 0; } int http_setAuth(const char *user, const char *pass) { unsigned char plain[1024]; char ec64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char *b64; int i, j, c, len; char o = 0; /* base64 encode user and pass */ if ((user == NULL) || (pass == NULL)) { /* bad input or request to clean up */ if (auth != NULL) free(auth); /* free old auth */ auth = NULL; return -1; } snprintf((char *)plain, 1024, "%s:%s", user, pass); len = strlen((char *)plain); b64 = (char*)malloc(len * 4 + 1); i = j = c = 0; while (i < len || c != 0) { switch (c) { case 0: o = ec64[ plain[i] >> 2 ]; i++; break; case 1: o = ec64[((plain[i-1] & 0x3) << 4) | (plain[i] >> 4)]; i++; break; case 2: o = (i >= len) ? '=' : ec64[((plain[i-1] & 0xf) << 2) | (plain[i] >> 6)]; break; case 3: o = (i >= len) ? '=' : ec64[ plain[i] & 0x3f]; i++; break; } b64[j] = o; c = (c + 1) % 4; j++; } b64[j] = 0; if (auth != NULL) free(auth); /* free old auth */ auth = b64; return 0; } /* * Changes the amount of time that HTTP Fetcher will wait for data * before timing out on reads */ void http_setTimeout(int seconds) { timeout = seconds; } /* * Puts the filename portion of the url into 'filename'. * Returns: * 0 on success * 1 when url contains no end filename (i.e., 'www.foo.com/'), * and **filename should not be assumed to be valid * -1 on error */ int http_parseFilename(const char *url, char **filename) { char *ptr; size_t ptr_len; if (url == NULL) { errorSource = FETCHER_ERROR; http_errno = HF_NULLURL; return -1; } ptr = (char *)rindex(url, '/'); if (ptr == NULL) /* Root level request, apparently */ return 1; ptr++; if (*ptr == '\0') return 1; ptr_len = strlen(ptr) + 1; *filename = (char *)malloc(ptr_len); if (*filename == NULL) { errorSource = ERRNO; return -1; } strncpy(*filename, ptr, ptr_len); *filename[ptr_len - 1] = '\0'; return 0; } /* Depending on the source of error, calls either perror() or prints * an HTTP Fetcher error message to stdout */ void http_perror(const char *string) { if (errorSource == ERRNO) perror(string); else if (errorSource == H_ERRNO) herror(string); else if (errorSource == FETCHER_ERROR) { char *stringIndex; if (strstr(http_errlist[http_errno], "%d") == NULL) { fputs(string, stderr); fputs(": ", stderr); fputs(http_errlist[http_errno], stderr); fputs("\n", stderr); } else { /* The error string has a %d in it, we need to insert errorInt */ stringIndex = (char *)http_errlist[http_errno]; while (*stringIndex != '%') { /* Print up to the %d */ fputc(*stringIndex, stderr); stringIndex++; } fprintf(stderr, "%d", errorInt); /* Print the number */ stringIndex += 2; /* Skip past the %d */ while (*stringIndex != 0) { /* Print up to the end NULL */ fputc(*stringIndex, stderr); stringIndex++; } fputs("\n", stderr); } } } /* * Returns a pointer to the current error description message. The * message pointed to is only good until the next call to http_strerror(), * so if you need to hold on to the message for a while you should make * a copy of it */ const char *http_strerror(void) { if (errorSource == ERRNO) return strerror(errno); else if (errorSource == H_ERRNO) return hstrerror(h_errno); else if (errorSource == FETCHER_ERROR) { if (strstr(http_errlist[http_errno], "%d") == NULL) return http_errlist[http_errno]; else { /* The error string has a %d in it, we need to insert errorInt. * convertedError[128] has been declared for that purpose */ char *stringIndex, *originalError; originalError = (char *)http_errlist[http_errno]; convertedError[0] = 0; /* Start off with NULL */ stringIndex = strstr(originalError, "%d"); strncat(convertedError, originalError, /* Copy up to %d */ abs(stringIndex - originalError)); sprintf(&convertedError[strlen(convertedError)], "%d", errorInt); stringIndex += 2; /* Skip past the %d */ strncat(convertedError, stringIndex, sizeof(convertedError) - 1 - strlen(convertedError)); return convertedError; } } return http_errlist[HF_METAERROR]; /* Should NEVER happen */ } /* * Reads the metadata of an HTTP response. * Perhaps a little inefficient, as it reads 1 byte at a time, but * I don't think it's that much of a loss (most headers aren't HUGE). * Returns: * # of bytes read on success, or * -1 on error */ int _http_read_header(int sock, char *headerPtr) { fd_set rfds; struct timeval tv; int bytesRead = 0, newlines = 0, ret, selectRet; while (newlines != 2 && bytesRead != HEADER_BUF_SIZE) { FD_ZERO(&rfds); FD_SET(sock, &rfds); tv.tv_sec = timeout; tv.tv_usec = 0; if (timeout >= 0) selectRet = select(sock + 1, &rfds, NULL, NULL, &tv); else /* No timeout, can block indefinately */ selectRet = select(sock + 1, &rfds, NULL, NULL, NULL); if (selectRet == 0 && timeout < 0) { errorSource = FETCHER_ERROR; http_errno = HF_HEADTIMEOUT; errorInt = timeout; return -1; } else if (selectRet == -1) { errorSource = ERRNO; return -1; } ret = read(sock, headerPtr, 1); if (ret == -1) { errorSource = ERRNO; return -1; } bytesRead++; if (*headerPtr == '\r') { /* Ignore CR */ /* Basically do nothing special, just don't set newlines * to 0 */ headerPtr++; continue; } else if (*headerPtr == '\n') /* LF is the separator */ newlines++; else newlines = 0; headerPtr++; } headerPtr -= 3; /* Snip the trailing LF's */ *headerPtr = '\0'; return bytesRead; } /* * Opens a TCP socket and returns the descriptor * Returns: * socket descriptor, or * -1 on error */ int makeSocket(const char *host) { int sock; /* Socket descriptor */ struct sockaddr_in sa; /* Socket address */ struct hostent *hp; /* Host entity */ int ret; hp = gethostbyname(host); if (hp == NULL) { errorSource = H_ERRNO; return -1; } /* Copy host address from hostent to (server) socket address */ memset(&sa, 0, sizeof(sa)); memcpy((char *)&sa.sin_addr, (char *)hp->h_addr, hp->h_length); sa.sin_family = hp->h_addrtype; /* Set service sin_family to PF_INET */ sa.sin_port = htons(PORT_NUMBER); /* Put portnum into sockaddr */ sock = socket(hp->h_addrtype, SOCK_STREAM, 0); if (sock == -1) { errorSource = ERRNO; return -1; } ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa)); if (ret == -1) { close(sock); errorSource = ERRNO; return -1; } return sock; } s3d-0.2.2.1/apps/s3dosm/http_fetcher.h000066400000000000000000000077551361325167000173700ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2001 Lyle Hanson * * Changes: * Simon Wunderlich * + added http_setAuth() to support basic http-authentication and some minor fixes */ #ifndef HTTP_FETCHER_H #define HTTP_FETCHER_H #define PORT_NUMBER 80 #define HTTP_VERSION "HTTP/1.1" #define DEFAULT_USER_AGENT "HTTP Fetcher" #define HTTP_FETCHER_VERSION "1.0" #define DEFAULT_READ_TIMEOUT 30 /* Seconds to wait before giving up when no data is arriving */ #define REQUEST_BUF_SIZE 1024 #define HEADER_BUF_SIZE 1024 #define DEFAULT_PAGE_BUF_SIZE 1024 * 200 /* 200K should hold most things */ /******************************************************************************/ /**************** Function declarations and descriptions **********************/ /******************************************************************************/ /* * [!!! NOTE !!!] All HTTP Fetcher functions return -1 on error. You can * then either call http_perror to print the error message or call * http_strerror to get a pointer to it */ /* * Download the page, registering a hit. If you pass it a NULL for fileBuf, * 'url' will be requested but will not remain in memory (useful for * simply registering a hit). Otherwise necessary space will be allocated * and will be pointed to by fileBuf. * Returns: * # of bytes downloaded, or * -1 on error */ int http_fetch(const char *url, char **fileBuf); /* * Changes the User Agent (shown to the web server with each request) * Send it NULL to avoid telling the server a User Agent * By default, the User Agent is sent (The default one unless changed) * Returns: * 0 on success, or * -1 on error (previous value for agent remains unchanged) */ int http_setUserAgent(const char *newAgent); /* * Changes the Referer (shown to the web server with each request) * Send it NULL to avoid thelling the server a Referer * By default, no Referer is sent * Returns: * 0 on success, or * -1 on error */ int http_setReferer(const char *newReferer); /* * Changes the maximum amount of time that HTTP Fetcher will wait on * data. If this many seconds elapses without more data from the * server, http_fetch will return with an error. * If you pass a value less than 0, reads will not time out, potentially * waiting forever (or until data shows up, whichever comes first) */ void http_setTimeout(int seconds); /* * Activate authentication for the Request. If user or pass is NULL, * http_set_Auth assumes a request to cleanup (disable Authentication). * Returns 0 on success, and -1 on error or cleanup. */ int http_setAuth(const char *user, const char *pass); /* * Takes a url and puts the filename portion of it into 'filename'. * Returns: * 0 on success, or * 1 when url contains no end filename (i.e., "www.foo.com/") * and **filename should not be assumed to point to anything), or * -1 on error */ int http_parseFilename(const char *url, char **filename); /* * Works like perror. If an HTTP Fetcher function ever returns an * error (-1), this will print a descriptive message to standard output */ void http_perror(const char *string); /* * Returns a pointer to the current error description message. The * message pointed to is only good until the next call to http_strerror(), * so if you need to hold on to the message for a while you should make * a copy of it. */ const char *http_strerror(void); /******************************************************************************/ /**** The following functions are used INTERNALLY by http_fetcher *************/ /******************************************************************************/ /* * Reads the metadata of an HTTP response. On success returns the number * Returns: * # of bytes read on success, or * -1 on error */ int _http_read_header(int sock, char *headerPtr); /* * Opens a TCP socket and returns the descriptor * Returns: * socket descriptor, or * -1 on error */ int makeSocket(const char *host); #endif s3d-0.2.2.1/apps/s3dosm/io.c000066400000000000000000000061111361325167000152740ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include "s3dosm.h" #include /* fopen(), fread(), fclose() */ #include /* malloc(), free() */ #include /* strstr() */ #include /* fstat() */ #include /* getopt() */ #include /* errno */ #include /* s3d_usage() */ char *read_file(const char *fname, int *fsize) { FILE *fp; char *buf = NULL; int filesize; struct stat bf; if ((fp = fopen(fname, "rb")) == NULL) { fprintf(stderr, "read_file( %s ):fopen(): %s", fname, strerror(errno)); return NULL; } if (fstat(fileno(fp), &bf)) { fprintf(stderr, "read_file( %s ):fopen(): %s", fname, strerror(errno)); fclose(fp); return NULL; } filesize = bf.st_size; if ((buf = (char*)malloc(filesize)) == NULL) { fprintf(stderr, "read_file( %s ):malloc(): %s", fname, strerror(errno)); fclose(fp); return NULL; } fread(buf, filesize, 1, fp); fclose(fp); if (fsize != NULL) *fsize = filesize; return buf; } int process_args(int argc, char **argv) { int lopt_idx = 0, i; int c; float minlat, minlon, maxlat, maxlon; char info[1024]; struct option long_options[] = { { "help", 0, NULL, 'h' }, {"osm", 1, NULL, 'o'}, {NULL, 0, NULL, 0} }; optind = 0; opterr = 0; while (-1 != (c = getopt_long(argc, argv, "dH:?ho:", long_options, &lopt_idx))) { switch (c) { case 0: break; case 'o': if (4 == sscanf(optarg, "%f,%f,%f,%f", &minlat, &minlon, &maxlat, &maxlon)) layerset_add(load_osm_web(minlat, minlon, maxlat, maxlon)); else { printf("%s: bad map bounding box", optarg); return -1; } break; case 'h': case '?': printf("\nUSAGE: %s [options] [files]\n\n", argv[0]); printf("options:\n"); printf("\t--osm, -o MINLAT,MINLON,MAXLAT,MAXLON:\n"); printf("\t\tload a map with the given bounding box\n\t\tfrom the openstreetmap server\n"); printf("\t--help, -?, -h: this helpful text\n\n"); printf("supported file types:\n"); printf("\t+ Kismet .xml Logs\n"); printf("\t+ Opemstreetmap .osm files\n\n"); s3d_usage(); /* add s3d usage */ return -1; default: break; } } for (i = 1; i < argc; i++) { if (strstr(argv[i], ".osm") - argv[i] == (signed)(strlen(argv[i]) - 4)) { snprintf(info, 1024, "loading OSM-File: %s", argv[i]); load_window(info); layerset_add(load_osm_file(argv[i])); } else if (strstr(argv[i], ".xml") - argv[i] == (signed)(strlen(argv[i]) - 4)) { /* might be osm or kismet xml */ char *file; int fsize; if (NULL == (file = read_file(argv[i], &fsize))) break; if (NULL != strstr(file, " */ #include "s3dosm.h" #include /* fabs() */ #include /* strcmp() */ #include /* strtof(),strtod(),strtol() */ #include #include static int layerid; static void parse_kismet_node(xmlNodePtr cur) { node_t node; xmlAttrPtr attr; xmlNodePtr kids, gpskids; node_init(&node); node.base.layerid = layerid; node.base.id = 0; /* let database decide */ node.visible = 2; /* something special */ for (kids = cur->children; kids; kids = kids->next) { if (0 == strcmp((char *)kids->name, "gps-info")) { for (gpskids = kids->children; gpskids; gpskids = gpskids->next) { /* get median value */ if (0 == strcmp((char *)gpskids->name, "min-lat")) node.lat = node.lat + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; if (0 == strcmp((char *)gpskids->name, "max-lat")) node.lat = node.lat + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; if (0 == strcmp((char *)gpskids->name, "min-lon")) node.lon = node.lon + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; if (0 == strcmp((char *)gpskids->name, "max-lon")) node.lon = node.lon + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; if (0 == strcmp((char *)gpskids->name, "min-alt")) node.alt = node.alt + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; if (0 == strcmp((char *)gpskids->name, "max-alt")) node.alt = node.alt + strtod((char *)xmlNodeGetContent(gpskids->children), NULL) / 2; } } } if ((fabs(node.lon) > 0.01) || (fabs(node.lat) > 0.01)) /* really, i don't want to discriminate anyone at 0 lat 0 lon running a wifi hotspot, even if it's in the middle of the ocean. i'm very sorry. */ { db_insert_node(&node); for (kids = cur->children; kids; kids = kids->next) { if (0 == strcmp((char *)kids->name, "SSID")) db_add_tag(OBJECT_T(&node), "wifi_SSID", (char *)xmlNodeGetContent(kids->children)); if (0 == strcmp((char *)kids->name, "BSSID")) db_add_tag(OBJECT_T(&node), "wifi_BSSID", (char *)xmlNodeGetContent(kids->children)); } for (attr = cur->properties; attr; attr = attr->next) { /* if (0==strcmp((char *)attr->name,"number")) node->base.id= strtol((char *)attr->children->content,NULL,10); else */ if (0 == strcmp((char *)attr->name, "wep")) db_add_tag(OBJECT_T(&node), "wifi_wep", (char *)attr->children->content); else if (0 == strcmp((char *)attr->name, "type")) db_add_tag(OBJECT_T(&node), "wifi_type", (char *)attr->children->content); } db_add_tag(OBJECT_T(&node), "amenity", "wifi"); } } /* parse the osm input file */ layer_t *parse_kismet(const char *buf, int length) { xmlDocPtr doc; xmlNodePtr cur, c; layer_t *layer = layer_new(); int i = 0; float n = 0; doc = xmlReadMemory(buf, length, "noname.xml", NULL, 0); if (doc == NULL) { fprintf(stderr, "Document not parsed successfully.\n"); return NULL; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr, "empty document\n"); xmlFreeDoc(doc); return NULL; } layerid = db_insert_layer("kismet"); for (c = cur->children; c != NULL; c = c->next) n++; /* count */ for (cur = cur->children; cur != NULL; cur = cur->next) { if (cur->type == XML_ELEMENT_NODE) { if (0 == strcmp((char *)cur->name, "wireless-network")) { parse_kismet_node(cur); } } if ((i++) % 10 == 0) load_update_status(100*((float)i) / n); } db_flush(); xmlFreeDoc(doc); return layer; } layer_t *load_kismet_file(const char *filename) { int length; char *file; layer_t *ret; if (NULL == (file = read_file(filename, &length))) return NULL; ret = parse_kismet(file, length); free(file); return ret; } s3d-0.2.2.1/apps/s3dosm/main.c000066400000000000000000000020261361325167000156120ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include /* snprintf(), printf(), NULL */ #include #include #include "s3dosm.h" #include /* nanosleep(), struct tm, time_t... */ static int ready = 0; void mainloop(void) { struct timespec t = { 0, 100*1000*1000 }; /* 100 mili seconds */ if (ready) { nanosleep(&t, NULL); gps_main(); nav_main(); s3dw_ani_mate(); } } static int init(int argc, char **argv) { s3d_select_font("vera"); ui_init(); if (db_init(":memory:")) return -1; if (db_create()) return -1; if (process_args(argc, argv)) return -1; nav_init(); nav_autocenter(); draw_all_layers(); gps_init("localhost"); ready = 1; return 0; } static int quit(void) { ready = 0; gps_quit(); s3d_quit(); db_quit(); return 0; } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "s3dosm")) { if (!init(argc, argv)) s3d_mainloop(mainloop); quit(); } else return -1; return 0; } s3d-0.2.2.1/apps/s3dosm/nav.c000066400000000000000000000055711361325167000154620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include "s3dosm.h" #include #include /* strcmp() */ #include /* strtod() */ #include /* printf() */ #include /* fabs() */ static int oidx; int oidy; static float lat, lon, tlat, tlon; /* load rotation centers */ void nav_init(void) { lat = lon = tlat = tlon = 0.0; oidx = s3d_new_object(); oidy = s3d_new_object(); s3d_link(oidy, oidx); s3d_translate(oidx, 0, -ESIZE*RESCALE - VIEWHEIGHT, 0); s3d_scale(oidx, RESCALE); } /* center to given latitude longitude */ void nav_center(float la, float lo) { tlat = la; tlon = lo; } void nav_campos(float campos[3], float earthpos[3]) { float tmp1[3], tmp2[3]; float alpha; tmp1[0] = campos[0]; tmp1[1] = campos[1] + ESIZE * RESCALE + VIEWHEIGHT; tmp1[2] = campos[2]; alpha = (90 - lat) * M_PI / 180.0; tmp2[0] = tmp1[0]; tmp2[1] = tmp1[1] * cos(alpha) - tmp1[2] * sin(alpha); tmp2[2] = tmp1[1] * sin(alpha) + tmp1[2] * cos(alpha); alpha = lon * M_PI / 180.0; tmp1[0] = tmp2[0] * cos(alpha) + tmp2[2] * sin(alpha); tmp1[1] = tmp2[1]; tmp1[2] = - tmp2[0] * sin(alpha) + tmp2[2] * cos(alpha); earthpos[0] = tmp1[0]; earthpos[1] = tmp1[1]; earthpos[2] = tmp1[2]; } void nav_main(void) { float x[3]; if ((fabs(tlat - lat) > 0.00001) && (fabs(tlon - lon) > 0.00001)) { if (lat == 0.0 && lon == 0.0) { lat = tlat; lon = tlon; } else { lat = (tlat + lat * 15) / 16; lon = (tlon + lon * 15) / 16; } } else { lat = tlat; lon = tlon; } s3d_rotate(oidy, 0, -lon, 0); s3d_rotate(oidx, -(90 - lat), 0, 0); calc_earth_to_eukl(lon, lat, 0, x); } static int get_center(void *data, int argc, char **argv, char **azColName) { float *med = (float *)data; int i; med[0] = 0; med[1] = 0; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "la")) med[0] = strtod(argv[i], NULL); else if (0 == strcmp(azColName[i], "lo")) med[1] = strtod(argv[i], NULL); } } return 0; } /* returns the heading in degress of position P1 -> P2 */ float get_heading(float la1, float lo1, float la2, float lo2) { float p1_north[3], p1[3], p2[3]; float dir[3], north[3]; float angle; int i; calc_earth_to_eukl(la1, lo1, 0, p1); calc_earth_to_eukl(la2, lo2, 0, p2); calc_earth_to_eukl(la1 + 1, lo1, 0, p1_north); for (i = 0; i < 3; i++) north[i] = p1_north[i] - p1[i]; for (i = 0; i < 3; i++) dir[i] = p2[i] - p1[i]; angle = s3d_vector_angle(dir, north); angle = angle * 180.0 / M_PI; if ((lo2 > lo1) || (lo1 - lo2 > 180.0)) angle = 360 - angle; return angle; } /* find some good center on our own */ void nav_autocenter(void) { float med[2]; char query[] = "SELECT avg(longitude) as lo, avg(latitude) as la FROM node; "; db_exec(query, get_center, med); nav_center(med[0], med[1]); printf("center to %f,%f\n", med[0], med[1]); } s3d-0.2.2.1/apps/s3dosm/object.c000066400000000000000000000044461361325167000161440ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include "s3dosm.h" #include /* malloc() */ /* ########### object ############### */ void object_free(object_t *obj) { int i; for (i = 0; i < obj->tag_n; i++) tag_free(&(obj->tag_p[i])); } void object_init(object_t *nobj) { nobj->bal = 0; nobj->left = NULL; nobj->right = NULL; nobj->id = 0; nobj->oid = -1; nobj->layerid = -1; nobj->tagid = -1; nobj->tag_n = 0; nobj->tag_p = NULL; nobj->type = T_OBJECT; } object_t* object_new(int key) { object_t *nobj = (object_t*)malloc(sizeof(object_t)); object_init(nobj); nobj->id = key; return nobj; } /* ########### node ############### */ void node_init(node_t *nnode) { object_init((object_t *)nnode); OBJECT_T(nnode)->type = T_NODE; nnode->lat = 0; nnode->lon = 0; nnode->alt = 0; nnode->visible = 1; nnode->vid = -1; nnode->adj_n = 0; nnode->adj_p = NULL; } node_t* node_new(void) { node_t *nnode = (node_t*)malloc(sizeof(node_t)); node_init(nnode); return nnode; } void node_free(node_t *node) { free(node); } /* ########### segment ############### */ void segment_init(segment_t *nsegment) { object_init((object_t *)nsegment); OBJECT_T(nsegment)->type = T_SEGMENT; nsegment->from = 0; nsegment->to = 0; } segment_t* segment_new(void) { segment_t *nsegment = (segment_t*)malloc(sizeof(segment_t)); segment_init(nsegment); return nsegment; } void segment_free(segment_t *segment) { free(segment); } /* ########### way ############### */ void way_init(way_t *nway) { object_init((object_t *)nway); OBJECT_T(nway)->type = T_WAY; nway->seg_n = 0; nway->seg_p = NULL; } way_t* way_new(void) { way_t *nway = (way_t*)malloc(sizeof(way_t)); way_init(nway); return nway; } void way_free(way_t *way) { if (way->seg_n > 0) free(way->seg_p); free(way); } /* ########### layer ############### */ layer_t* layer_new(void) { layer_t *nlayer = (layer_t*)malloc(sizeof(layer_t)); nlayer->tree = NULL; nlayer->visible = 0; return nlayer; } /* ########### layerset ############### */ layerset_t layerset = {0, NULL}; void layerset_add(layer_t *layer) { if (layer == NULL) return; layerset.n++; layerset.p = (layer_t**)realloc(layerset.p, sizeof(layer_t *) * layerset.n); layerset.p[layerset.n-1] = layer; } s3d-0.2.2.1/apps/s3dosm/olsrdump_convert.pl000077500000000000000000000023221361325167000204660ustar00rootroot00000000000000#!/usr/bin/env perl # # SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich # # # converts freifunk database dump to osm format, which can be loaded with s3dosm. # this is no useful script, so don't package it or something. :) # $created_by="dotslash"; $node_string=""; $seg_string=""; $way_string=""; $id=-1; ( $sec, $min, $hour, $day, $month, $year ) = ( localtime ) [ 0, 1, 2, 3, 4, 5 ]; $timestamp =sprintf("%04d-%02d-%02d %02d:%02d:%02d",1900+$year,$month,$day, $hour,$min,$sec); print "\n"; print "\n"; while (<>) { @a=split(","); $ip=$a[1]; $name=$a[4]; @co=split("[(\ )]",$a[6]); $lo=$co[2]; $la=$co[3]; if ($a[0]=~/^INSERT/) { $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; $node_string.=" \n"; } $id--; } print $node_string; print "\n"; s3d-0.2.2.1/apps/s3dosm/olsrs3d.h000066400000000000000000000031431361325167000162650ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #ifndef _OLSRS3D_H_ #define _OLSRS3D_H_ #include "structs.h" #define max(x,y)((x)>(y)?(x):(y)) #define min(x,y)((x)<(y)?(x):(y)) extern int Debug; extern struct olsr_con *Con_begin; /* begin of connection list */ extern struct olsr_node *Olsr_root; /* top of olsr node tree */ extern struct Obj_to_ip *Obj_to_ip_head, *Obj_to_ip_end, *List_ptr; /* struct list */ extern int Olsr_node_obj; extern int Olsr_node_inet_obj; extern int Olsr_node_hna_net; extern int Btn_close_obj; extern int S3d_obj; extern int Btn_close_id; extern int Olsr_node_count_obj; extern int Olsr_node_count; extern int Last_olsr_node_count; extern int Net_read_count; extern int Output_block_counter; extern int Output_block_completed; extern int ZeroPoint; extern float CamPosition[2][3]; extern float Bottom, Left; extern char lbuf[MAXLINESIZE]; extern int Move_cam_target; extern int move_cam_to; /* process */ void lst_initialize(void); void lst_add(int id, struct olsr_node **olsr_node); void lst_del(int id); struct olsr_node *lst_search(int id); void lst_out(void); struct olsr_node *move_lst_ptr(int *id); int process_main(void); /* net */ int net_init(char *host); int net_main(void); int net_quit(void); /* main */ void out_of_mem(void); void print_etx(void); float dist(float p1[], float p2[]); void window_error(char *msg); #endif /* _OLSRS3D_H_ */ s3d-0.2.2.1/apps/s3dosm/osm.c000066400000000000000000000107321361325167000154670ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2008-2015 Sven Eckelmann */ #include "s3dosm.h" #include /* strcmp() */ #include /* strtof(),strtod(),strtol() */ #include #include #include "http_fetcher.h" static int layerid; static int parse_osm_tags(object_t *obj, xmlNodePtr cur) { xmlNodePtr c; xmlAttrPtr attr; char *v, *k; v = k = NULL; for (c = cur->children; c != NULL; c = c->next) { if (0 == strcmp((char *)c->name, "tag")) { for (attr = c->properties; attr; attr = attr->next) { if (0 == strcmp((char *)attr->name, "k")) k = (char *)attr->children->content; else if (0 == strcmp((char *)attr->name, "v")) v = (char *)attr->children->content; } if (k != NULL && v != NULL) db_add_tag(obj, k, v); } } return 0; } static void parse_osm_way(xmlNodePtr cur) { way_t way; xmlNodePtr kids; xmlAttrPtr attr, kattr; int nd = 0, last_nd = 0; segment_t segment; static int seg = 0; way_init(&way); way.base.layerid = layerid; for (attr = cur->properties; attr; attr = attr->next) if (0 == strcmp((char *)attr->name, "id")) way.base.id = strtol((char *)attr->children->content, NULL, 10); db_insert_way_only(&way); parse_osm_tags(OBJECT_T(&way), cur); for (kids = cur->children; kids != NULL; kids = kids->next) { if (0 == strcmp((char *)kids->name, "nd")) { for (kattr = kids->properties; kattr; kattr = kattr->next) if (0 == strcmp((char *)kattr->name, "ref")) nd = strtol((char *)kattr->children->content, NULL, 10); if (last_nd != 0 && nd != 0) { seg++; segment_init(&segment); segment.base.layerid = layerid; segment.base.id = seg; segment.from = last_nd; segment.to = nd; db_insert_segment(&segment); parse_osm_tags(OBJECT_T(&segment), cur); db_insert_way_seg(&way, seg); } if (nd != 0) { last_nd = nd; } } } } static void parse_osm_node(xmlNodePtr cur) { node_t node; xmlAttrPtr attr; node_init(&node); node.base.layerid = layerid; for (attr = cur->properties; attr; attr = attr->next) { if (0 == strcmp((char *)attr->name, "id")) node.base.id = strtol((char *)attr->children->content, NULL, 10); else if (0 == strcmp((char *)attr->name, "lat")) node.lat = strtod((char *)attr->children->content, NULL); else if (0 == strcmp((char *)attr->name, "lon")) node.lon = strtod((char *)attr->children->content, NULL); else if (0 == strcmp((char *)attr->name, "visible")) node.visible = (0 == strcmp((char *)attr->children->content, "true")) ? 1 : 0; else if (0 == strcmp((char *)attr->name, "time")) {} /* TODO */ } if (node.base.id > 0) { db_insert_node(&node); parse_osm_tags(OBJECT_T(&node), cur); } } /* parse the osm input file */ layer_t *parse_osm(const char *buf, int length) { xmlDocPtr doc; xmlNodePtr cur, c; layer_t *layer = layer_new(); float n = 0; int i = 0; doc = xmlReadMemory(buf, length, "noname.xml", NULL, 0); if (doc == NULL) { fprintf(stderr, "Document not parsed successfully.\n"); return NULL; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr, "empty document\n"); xmlFreeDoc(doc); return NULL; } layerid = db_insert_layer("osm"); for (c = cur->children; c != NULL; c = c->next) n++; /* count */ for (cur = cur->children; cur != NULL; cur = cur->next) { if (cur->type == XML_ELEMENT_NODE) { if (0 == strcmp((char *)cur->name, "node")) parse_osm_node(cur); else if (0 == strcmp((char *)cur->name, "way")) parse_osm_way(cur); } if ((i++) % 200 == 0) load_update_status(100*((float)i) / n); /* report status */ } xmlFreeDoc(doc); db_flush(); return layer; } layer_t *load_osm_web(float minlat, float minlon, float maxlat, float maxlon) { int ret; char url[1024]; char *fileBuf; /* Pointer to downloaded data */ layer_t *layer; snprintf(url, 1024, "www.openstreetmap.org/api/0.6/map?bbox=%f,%f,%f,%f", minlat, minlon, maxlat, maxlon); printf("downloading url [ %s ]\n", url); ret = http_fetch(url, &fileBuf); /* Downloads page */ if (ret == -1) { http_perror("http_fetch"); return NULL; } layer = parse_osm(fileBuf, ret); /* TODO: cleanup http-lib */ free(fileBuf); return layer; } layer_t *load_osm_file(const char *filename) { int length; char *file; layer_t *ret; if (NULL == (file = read_file(filename, &length))) return NULL; ret = parse_osm(file, length); free(file); return ret; } s3d-0.2.2.1/apps/s3dosm/s3dosm.h000066400000000000000000000127371361325167000161150ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #ifndef _S3DOSM_H_ #define _S3DOSM_H_ #include /* for UNUSEDPARAM_ATTRIBUTE */ #include /* for sqlite3_callback */ struct _adj_t; struct _icon_t; struct _layer_t; struct _layerset_t; struct _node_t; struct _object_t; struct _segment_t; struct _tag_t; struct _way_t; struct s3d_evt; #define ESIZE 637800 /* earth size */ #define RESCALE 1 #define VIEWHEIGHT 3 #define MAXQ 4096 #define QBUF 1024*128 #ifndef S3DOSMUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DOSMUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DOSMUNUSED(x) /* x */ #else #define S3DOSMUNUSED(x) x #endif #endif /* stack it */ /* #define DB_STACK 1*/ typedef struct _layer_t layer_t; typedef struct _adj_t adj_t; typedef struct _object_t object_t; typedef struct _node_t node_t; typedef struct _segment_t segment_t; typedef struct _layerset_t layerset_t; typedef struct _way_t way_t; typedef struct _tag_t tag_t; typedef struct _icon_t icon_t; typedef unsigned long ID_T; #define OBJECT_T(x) ((object_t *)x) #define NODE_T(x) ((node_t *)x) #define SEGMENT_T(x) ((segment_t *)x) #define WAY_T(x) ((way_t *)x) struct _layerset_t { int n; layer_t **p; }; extern layerset_t layerset; struct _layer_t { object_t *tree; float center_lo, center_la; int visible; }; struct _icon_t { const char *path; int oid; }; enum { T_OBJECT, T_NODE, T_SEGMENT, T_WAY }; enum { ICON_AP_OPEN, ICON_AP_WEP, ICON_AP_WPA, ICON_ARROW, ICON_NUM }; enum { TAG_UNKNOWN, TAG_NAME, TAG_N }; extern icon_t icons[]; typedef void (*avl_func)(object_t *, void *); struct _tag_t { char *k, *v; char ttype; union { char *s; int num; int b; float f; } d; }; struct _object_t { ID_T id; /* id of this object */ ID_T layerid; ID_T tagid; int oid; /* s3d oid */ int type; /* type of this object */ /* avl stuff */ char bal; int tag_n; tag_t *tag_p; object_t *left, *right; }; struct _adj_t { ID_T to, seg; /* destination and segment to use */ }; struct _node_t { object_t base; float lon; /* longitude */ float lat; /* latitude */ float alt; /* altitude */ char visible; /* node visible? 0 = no, 1 = yes, 2 = some sepcial object */ int vid; /* vertex id */ /* time_t time;*/ int adj_n; /* adjacence list */ adj_t *adj_p; }; struct _segment_t { object_t base; ID_T from; ID_T to; }; struct _way_t { object_t base; int seg_n; ID_T *seg_p; }; /* public functions */ /* object.c */ void object_init(object_t *nobj); void object_free(object_t *obj); void node_init(node_t *nnode); void segment_init(segment_t *nsegment); void way_init(way_t *nway); object_t *object_new(int key); node_t *node_new(void); segment_t *segment_new(void); layer_t *layer_new(void); way_t *way_new(void); void node_free(node_t *node); void segment_free(segment_t *segment); void way_free(way_t *way); void layerset_add(layer_t *layer); /* main.c */ void mainloop(void); /* osm.c */ void debug_obj(object_t *obj, void *dummy); layer_t *parse_osm(const char *buf, int length); layer_t *load_osm_file(const char *filename); layer_t *load_osm_web(float minlat, float minlon, float maxlat, float maxlon); /* kismet.c */ layer_t *parse_kismet(const char *buf, int length); layer_t *load_kismet_file(const char *filename); /* draw.c */ void draw_all_layers(void); int draw_layer(layer_t *layer); void calc_earth_to_eukl(float lat, float lon, float alt, float *x); void draw_translate_icon(int user_icon, float la, float lo); /* nav.c */ void nav_main(void); void nav_init(void); void nav_center(float la, float lo); void nav_autocenter(void); void nav_campos(float campos[3], float earthpos[3]); float get_heading(float la1, float lo1, float la2, float lo2); extern int oidy; /* tag.c */ void tag_add(object_t *obj, const char *k, char *v); tag_t *tag_get(object_t *obj, const char *k); void tag_free(tag_t *tag); /* io.c */ char *read_file(const char *fname, int *fsize); int process_args(int argc, char **argv); /* db.c */ int db_olsr_node_init(float *pos); int db_olsr_check(const char *ip, float *pos); int db_exec(const char *query, sqlite3_callback callback, const void *arg); int db_add_tag(object_t *obj, const char *key, const char *val); int db_gettag(int tagid, const char *field, char *target); int db_getint(void *tagid, int argc, char **argv, char **azColName); int db_getpoint(void *data, int argc, char **argv, char **azColName); int db_insert_node(node_t *node); int db_insert_segment(segment_t *seg); int db_insert_way_only(way_t *way); int db_insert_way_seg(way_t *way, int seg_n); int db_insert_object(object_t *obj); int db_init(const char *dbFile); int db_quit(void); int db_create(void); int db_insert_layer(const char *layer_name); void db_flush(void); int callback(void *NotUsed, int argc, char **argv, char **azColName); /* gps.c */ int gps_init(const char *gpshost); int gps_main(void); int gps_quit(void); /* ui.c */ int ui_init(void); int load_window(const char *text); int load_window_remove(void); int load_update_status(float percent); /* olsrs3d.c */ #define NODEHEIGHT 10 int olsr_object_click(struct s3d_evt *evt); int olsr_object_info(struct s3d_evt *hrmz); int olsr_parse_args(int argc, char **argv); int olsr_keypress(struct s3d_evt *event); void olsr_main(void); int olsr_init(void); int olsr_quit(void); int olsr_parse_args(int argc, char **argv); #endif /* _S3DOSM_H_ */ s3d-0.2.2.1/apps/s3dosm/search.h000066400000000000000000000017601361325167000161440ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Andreas Langer */ #ifndef _SEARCH_H_ #define _SEARCH_H_ struct olsr_node; #define NOTHING 0 /* nothing ;) */ #define ABORT 1 /* widget has no focus */ #define WIDGET 2 /* focus on widget */ #define FOLLOW 3 /* follow search result */ void create_search_widget(float x, float y, float z); void move_search_widget(float x, float y, float z); void move_to_search_widget(float cam_position_t[], float cam_position_r[]); void move_to_return_point(float cam_position_t[], float cam_position_r[]); void set_return_point(float cam_position_t[], float cam_position_r[]); int get_search_status(void); void set_search_status(int stat); void search_widget_write(int key); void set_node_root(struct olsr_node *root); void follow_node(float cam_position_t[], float cam_position_r[], float rotate); void follow_node_by_click(struct olsr_node *olsr_node); void show_search_window(); #endif /* _SEARCH_H_ */ s3d-0.2.2.1/apps/s3dosm/structs.h000066400000000000000000000045471361325167000164140ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #ifndef _STRUCTS_H_ #define _STRUCTS_H_ #define NAMEMAX 128 #define MAXLINESIZE 1000 /* lines in a digraph just shouldn't get that longer ... */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ /* linked list for the all connections */ struct olsr_con { struct olsr_con *next_olsr_con; /* pointer to next connection */ struct olsr_con *prev_olsr_con; /* pointer to previous connection */ struct olsr_node *left_olsr_node; /* pointer to left end point of the connection */ struct olsr_node *right_olsr_node; /* pointer to right end point of the connection */ float left_etx; /* etx of left olsr node */ float right_etx; /* etx of right olsr node */ float left_etx_sqrt; /* sqrt of etx of left olsr node */ float right_etx_sqrt; /* sqrt etx of right olsr node */ int obj_id; /* id of connection object in s3d */ int color; float rgb; }; /* linked list for the neighbours of each olsr node */ struct olsr_neigh_list { struct olsr_neigh_list *next_olsr_neigh_list; /* pointer to next neighbour */ struct olsr_con *olsr_con; /* pointer to the connection */ }; /* we contruct a binary tree to handle the nodes */ struct olsr_node { struct olsr_node *left; struct olsr_node *right; char ip[NAMEMAX]; /* host ip */ int static_node; /* static nodes have some known geolocation and won't move */ int node_type; /* normal = 0, internet gateway = 1, via hna announced network = 2 */ int node_type_modified; /* node_type modified flag */ int last_seen; /* last seen counter */ int visible; /* is this node visible or vanished */ float pos_vec[3]; /* position vector in 3d "space" */ float mov_vec[3]; /* move vector */ int obj_id; /* id of node object in s3d */ int desc_id; /* id of node description object in s3d */ float desc_length; /* length of node description object in s3d */ struct olsr_neigh_list *olsr_neigh_list; /* pointer to first neighbour */ }; struct Obj_to_ip { int id; struct olsr_node *olsr_node; struct Obj_to_ip *next; struct Obj_to_ip *prev; }; #endif /* _STRUCTS_H_ */ s3d-0.2.2.1/apps/s3dosm/tag.c000066400000000000000000000016451361325167000154470ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include "s3dosm.h" #include /* printf() */ #include /* strcmp() */ #include /* realloc() */ void tag_add(object_t *obj, const char *k, char *v) { tag_t *t; obj->tag_n++; obj->tag_p = (tag_t*)realloc(obj->tag_p, obj->tag_n * sizeof(tag_t)); if (k != NULL && v != NULL) { t = &(obj->tag_p[obj->tag_n-1]); t->ttype = TAG_UNKNOWN; t->k = strdup(k); t->v = strdup(v); t->d.s = v; if (0 == strcmp(k, "name")) t->ttype = TAG_NAME; } } tag_t *tag_get(object_t *obj, const char *k) { int i; for (i = 0; i < obj->tag_n; i++) { if (0 == strcmp(obj->tag_p[i].k, k)) return &(obj->tag_p[i]); } return NULL; } void tag_free(tag_t *tag) { if (tag->d.s != tag->v) free(tag->d.s); free(tag->v); free(tag->k); tag->k = NULL; tag->d.s = NULL; tag->v = NULL; } s3d-0.2.2.1/apps/s3dosm/test.osm000066400000000000000000000030431361325167000162210ustar00rootroot00000000000000 s3d-0.2.2.1/apps/s3dosm/test.osm.license000066400000000000000000000001661361325167000176450ustar00rootroot00000000000000SPDX-License-Identifier: GPL-2.0-or-later SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich s3d-0.2.2.1/apps/s3dosm/ui.c000066400000000000000000000076711361325167000153160ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include "s3dosm.h" #include /* NULL */ #include /* strcmp */ #include /* atoi() */ icon_t icons[ICON_NUM] = { {"objs/accesspoint.3ds", 0}, {"objs/noinetwep.3ds", 0}, {"objs/noinetwpa.3ds", 0}, {"objs/arrow2.3ds", 0} }; /* load icons, we want to clone each of them later */ static void ui_loadicons(void) { int i; for (i = 0; i < ICON_NUM; i++) icons[i].oid = s3d_import_model_file(icons[i].path); } static s3dw_surface *loadwindow = NULL; static s3dw_label *loadlabel = NULL; static s3dw_label *loadstatus = NULL; static void key_button(s3dw_widget *button) { s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } static int ui_getinfo_node(void *S3DOSMUNUSED(data), int argc, char **argv, char **azColName) { int i, tagid = -1; char type[MAXQ]; char name[MAXQ]; char string[4102]; s3dw_surface *miniwin; s3dw_button *button; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "tag_id")) tagid = atoi(argv[i]); } } if (db_gettag(tagid, "amenity", type)) type[0] = 0; if (db_gettag(tagid, "name", name)) name[0] = 0; miniwin = s3dw_surface_new("About node", 30, 6); snprintf(string, sizeof(string), "name: %s", name); s3dw_label_new(miniwin, string, 1, 2); snprintf(string, sizeof(string), "type: %s", type); s3dw_label_new(miniwin, string, 1, 4); button = s3dw_button_new(miniwin, "OK", 2, 6); button->onclick = key_button; s3dw_show(S3DWIDGET(miniwin)); return 0; } static int ui_getinfo_way(void *S3DOSMUNUSED(data), int argc, char **argv, char **azColName) { int i, tagid = -1; char name[MAXQ]; char string[4102]; s3dw_surface *miniwin; s3dw_button *button; for (i = 0; i < argc; i++) { if (argv[i]) { if (0 == strcmp(azColName[i], "tag_id")) tagid = atoi(argv[i]); } } if (db_gettag(tagid, "name", name)) name[0] = 0; printf("reporting street %s\n", name); miniwin = s3dw_surface_new("About street", 30, 6); snprintf(string, sizeof(string), "name: %s", name); s3dw_label_new(miniwin, string, 1, 2); button = s3dw_button_new(miniwin, "OK", 2, 4); button->onclick = key_button; s3dw_show(S3DWIDGET(miniwin)); return 0; } static int ui_click(struct s3d_evt *evt) { int oid = (int) * ((uint32_t *)evt->buf); char query[MAXQ]; if (s3dw_handle_click(evt)) return 0; snprintf(query, MAXQ, "SELECT * FROM node WHERE s3doid=%d;", oid); db_exec(query, ui_getinfo_node, NULL); snprintf(query, MAXQ, "SELECT * FROM way WHERE s3doid=%d;", oid); db_exec(query, ui_getinfo_way, NULL); return 0; } static int ui_key(struct s3d_evt *evt) { /* struct s3d_key_event *key=(struct s3d_key_event *)evt->buf;*/ if (s3dw_handle_key(evt)) return 0; return 0; } static int ui_oinfo(struct s3d_evt *evt) { s3dw_object_info(evt); return 0; } int ui_init(void) { ui_loadicons(); s3d_set_callback(S3D_EVENT_OBJ_CLICK, ui_click); s3d_set_callback(S3D_EVENT_KEY, ui_key); s3d_set_callback(S3D_EVENT_OBJ_INFO, ui_oinfo); return 0; } /* initialize the loadwindow or change its caption text */ int load_window(const char *text) { if (loadwindow == NULL) { /* create it */ loadwindow = s3dw_surface_new("Now loading ...", 20, 5); loadlabel = s3dw_label_new(loadwindow, text, 1, 2); loadstatus = s3dw_label_new(loadwindow, "", 1, 3); s3dw_show(S3DWIDGET(loadwindow)); } else { s3dw_label_change_text(loadlabel, text); s3dw_label_change_text(loadstatus, ""); } return 0; } /* remove it if still here */ int load_window_remove(void) { if (loadwindow != NULL) { s3dw_delete(S3DWIDGET(loadwindow)); loadwindow = NULL; loadlabel = NULL; } return 0; } /* update the load status ... */ int load_update_status(float percent) { char text[128]; if (loadwindow != NULL) { snprintf(text, 128, "%3.1f", percent); s3dw_label_change_text(loadstatus, text); } mainloop(); return 0; } s3d-0.2.2.1/apps/s3dvt/000077500000000000000000000000001361325167000143555ustar00rootroot00000000000000s3d-0.2.2.1/apps/s3dvt/CMakeLists.txt000066400000000000000000000007641361325167000171240ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann project(s3dvt C) if (PTHREADS_FOUND) include_directories(${s3d_SOURCE_DIR}/libs3d) add_executable(s3dvt main.c terminal.c) target_link_libraries(s3dvt s3d ${PTHREADS_LIBRARIES}) # install install(TARGETS s3dvt RUNTIME DESTINATION "${BIN_INSTALL_DIR}") else (PTHREADS_FOUND) PkgStatus_Later("pthreads") # print late status Collected_PkgStatus("s3dvt") endif (PTHREADS_FOUND) s3d-0.2.2.1/apps/s3dvt/TODO000066400000000000000000000001541361325167000150450ustar00rootroot00000000000000- vim should work - ppl have to move around the terminal to view it properly - too big - multiple consoles? s3d-0.2.2.1/apps/s3dvt/main.c000066400000000000000000000311231361325167000154450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2002 Alexander Graf */ #define _GNU_SOURCE #include "s3dvt.h" #include /* FILE,NULL */ #include /* read(),write(), sleep(),close() ... */ #include /* errno() */ #include /* open() */ #include /* signal() */ #include /* exit(),getenv(),setenv(), getpt */ #include /* ioctl() */ #include /* pthread_create() */ #include /* s3d_* */ #include /* key symbols */ #include /* nanosleep() */ static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ static int pid; static int term_mode = 0; static int cursor; /* the object id of the cursor */ static pthread_t term_thread; #ifdef M_PIPE static int mpipe_in[2]; static int mpipe_out[2]; #endif #ifdef M_PTY static int curtty, curpty; #endif #ifdef M_CHAR static unsigned int charbuf[256]; static int screenbuf[MAX_LINES*MAX_CHARS]; static char last_c[MAX_LINES*MAX_CHARS]; #endif #ifdef M_LINE static int lines[MAX_LINES]; #endif static void* thread_terminal(void *S3DVTUNUSED(a)) { int iscon = 1, ret; char buffer[1024]; while (iscon) { switch (term_mode) { case M_PIPE: ret = read(mpipe_out[0], &buffer, 1000); break; case M_PTY: ret = read(curpty, &buffer, 1000); break; default: ret = -1; } if (ret > 0) { buffer[ret] = '\0'; printf("<<= 0) close(curtty); return 0; } /* fnctl(F_SETFL,O_NONBLOCK); */ signal(SIGCHLD, SIG_IGN); pid = fork(); if (!pid) { if (curtty < 0) { printf("Error opening tty\n"); return 0; } if (setgid(gid) < 0) { printf("Couldn't set gid %d\n", gid); exit(255); } if (setuid(uid) < 0) { printf("Couldn't set uid %d\n", uid); exit(255); } if (setsid() < 0) printf("ERROR (setsid)\n"); /* tcflush(curpty, TCIOFLUSH); */ #ifdef TIOCSCTTY if (ioctl(curtty, TIOCSCTTY, NULL)) printf("ERROR! (ttyflush)\n");; #endif /* TIOCSCTTY */ dup2(curtty, 0); dup2(curtty, 1); dup2(curtty, 2); sprintf(tmpstr, "%d", MAX_LINES - 1); setenv("LINES", tmpstr, 1); sprintf(tmpstr, "%d", MAX_CHARS - 1); setenv("COLUMNS", tmpstr, 1); setenv("TERM", "rxvt", 1); execl(exe, exe, NULL); sleep(1); printf("that's it, exiting"); close(curtty); exit(0); } else if (pid < 0) { close(curtty); close(curpty); printf("Cant fork()\n"); exit(0); } else { close(curtty); pthread_create(&term_thread, NULL, thread_terminal, NULL); } return 1; } /* terminal.c */ void term_addchar(char toprint) { /* printf("sending: %.3d\n", toprint);*/ switch (term_mode) { case M_PIPE: write(mpipe_in[1], &toprint, 1); write(mpipe_out[1], &toprint, 1); break; case M_PTY: write(curpty, &toprint, 1); break; } } static int pipe_init_terminal(void) { int uid = 0, gid = 0; const char *exe = "/bin/bash"; const char *args = "-i"; term_mode = M_PIPE; if ((pipe(mpipe_in) == -1) || (pipe(mpipe_out) == -1)) { printf("pipe failed\n"); return -1; } uid = getuid(); gid = getgid(); pid = fork(); if (pid == 0) { /* the child */ char tmpstr[1024]; if (setgid(gid) < 0) { printf("Couldn't set gid %d\n", gid); exit(255); } if (setuid(uid) < 0) { printf("Couldn't set uid %d\n", uid); exit(255); } if (setsid() < 0) printf("ERROR (setsid)\n"); /* tcflush(curpty, TCIOFLUSH); */ /* if(ioctl(curtty, TIOCSCTTY, NULL)) printf("ERROR! (ttyflush)\n");; */ setvbuf(stdout, (char*)NULL, _IONBF, 0); dup2(mpipe_in[0], fileno(stdin)); dup2(mpipe_out[1], fileno(stdout)); dup2(mpipe_out[1], fileno(stderr)); /* close unneded things: */ close(mpipe_out[0]); close(mpipe_in[1]); sprintf(tmpstr, "%d", MAX_LINES - 1); setenv("LINES", tmpstr, 1); sprintf(tmpstr, "%d", MAX_CHARS - 1); setenv("COLUMNS", tmpstr, 1); setenv("TERM", "rxvt", 1); execl(exe, exe, args, NULL); printf("that's it, exiting"); close(curtty); exit(0); } else if (pid < 0) { printf("Cant fork()\n"); exit(0); } else { /* close unneded things... */ close(mpipe_in[0]); pthread_create(&term_thread, NULL, thread_terminal, NULL); } return 1; } static int init_terminal(void) { int i; for (i = 0; i < 5; i++) if (pty_init_terminal()) /* find an open pty. */ return 0; return pipe_init_terminal(); /* if not, fallback to pipe mode */ } static void term_unload(void) { printf("unloading tty!!\n"); switch (term_mode) { case M_PTY: write(curpty, "\0", 1); /* send an EOF, just in case */ close(curpty); close(curtty); /* kill(pid); */ break; case M_PIPE: /* bash should fade with "broken pipe" */ close(mpipe_in[1]); close(mpipe_out[0]); break; } } #ifdef M_CHAR void paintit(void) { int cline; int c; unsigned char ch; unsigned int ci; int i, line_end; s3d_translate(cursor, cx*X_RATIO*CS - CS*X_RATIO*MAX_CHARS / 2, -cy*CS + CS*MAX_LINES / 2, 0); s3d_scale(cursor, CS); for (cline = 0; cline < MAX_LINES; cline++) { line_end = 0; for (c = 0; c < MAX_CHARS; c++) { i = cline * MAX_CHARS + c; /* calculate position */ if (((ch = line[cline].chars[c].character) != last_c[i])) { if (screenbuf[i] == -1) { screenbuf[i] = s3d_new_object(); s3d_translate(screenbuf[i], c*X_RATIO*CS - CS*X_RATIO*MAX_CHARS / 2, -cline*CS + CS*MAX_LINES / 2, 0); s3d_scale(screenbuf[i], CS); s3d_flags_on(screenbuf[i], S3D_OF_VISIBLE); } if ((ch == 0) || (line_end)) { /* the new character is zero! delete! */ line[cline].chars[c].character = 0; ci = charbuf[' ']; s3d_clone_target(screenbuf[i], ci); line_end = 1; /* printf("-%03d",ch); */ } else { ci = charbuf[ch]; /* printf("!%03d",ch); */ s3d_clone_target(screenbuf[i], ci); } } else { /* printf("=%03d",ch); */ } last_c[i] = ch; } /* printf("\n"); */ } gotnewdata = 0; } #endif #ifdef M_LINE void paintit(void) { int cline; int oid, c; int len; int changed; char cl[MAX_CHARS]; for (cline = 0; cline < MAX_LINES; cline++) { len = MAX_CHARS; changed = 0; for (c = MAX_CHARS; c >= 0; c--) { cl[c] = line[cline].chars[c].character; if (line[cline].chars[c].character != line[cline].chars[c].last_c) { changed = c + 1; /* printf("changed [%d/%d] from %d to %d\n",cline,c, line[cline].chars[c].last_c, line[cline].chars[c].character );*/ line[cline].chars[c].last_c = line[cline].chars[c].character; } if (cl[c] == 0) len = c; } if (changed) { if (len > 0) { printf("[p: line %d [len: %d/changed: %d]\n", cline, len, changed); oid = s3d_draw_string(cl, NULL); s3d_translate(oid, 0, -cline, 0); if (lines[cline] != -1) { s3d_del_object(lines[cline]); lines[cline] = -1; } s3d_flags_on(oid, S3D_OF_VISIBLE); lines[cline] = oid; } else { if (lines[cline] != -1) { s3d_del_object(lines[cline]); lines[cline] = -1; } } } } gotnewdata = 0; } #endif /* void paint_chars() { char c; int oid; int cline,cchar; for(cline=0;clinebuf; int key; /* printf("received key: %d\n",key);*/ switch (key = keys->keysym) { case S3DK_F1: case S3DK_F2: case S3DK_F3: case S3DK_F4: case S3DK_F5: term_addchar(0x1b); term_addchar('['); term_addchar('1'); term_addchar(key - S3DK_F1 + '1'); break; case S3DK_F6: case S3DK_F7: case S3DK_F8: term_addchar(0x1b); term_addchar('['); term_addchar('1'); term_addchar((key - S3DK_F6) + '7'); break; case S3DK_F9: case S3DK_F10: term_addchar(0x1b); term_addchar('['); term_addchar('2'); term_addchar((key - S3DK_F9) + '0'); break; case S3DK_F11: case S3DK_F12: term_addchar(0x1b); term_addchar('['); term_addchar('2'); term_addchar((key - S3DK_F11) + '3'); break; case S3DK_UP: term_addchar(0x1b); term_addchar('['); term_addchar('A'); break; case S3DK_DOWN: term_addchar(0x1b); term_addchar('['); term_addchar('B'); break; case S3DK_RIGHT: term_addchar(0x1b); term_addchar('['); term_addchar('C'); break; case S3DK_LEFT: term_addchar(0x1b); term_addchar('['); term_addchar('D'); break; case S3DK_PAGEUP: term_addchar(0x1b); term_addchar('['); term_addchar('5'); term_addchar('~'); break; case S3DK_PAGEDOWN: term_addchar(0x1b); term_addchar('['); term_addchar('6'); term_addchar('~'); break; case S3DK_HOME: term_addchar(0x1b); term_addchar('['); term_addchar('7'); term_addchar('~'); break; case S3DK_END: term_addchar(0x1b); term_addchar('['); term_addchar('8'); term_addchar('~'); break; case 13: term_addchar(10); break; default: if ((char)keys->unicode) /* \0 is no good idea .. */ term_addchar((char)keys->unicode); } return 0; } static int i = 0; static void mainloop(void) { usleep(10000); nanosleep(&t, NULL); if ((i += 2) > 100) { if (i % 2) { s3d_flags_on(cursor, S3D_OF_VISIBLE); i = 0; } else { s3d_flags_off(cursor, S3D_OF_VISIBLE); i = 1; } } if (gotnewdata) { /* printf("got new data,displaying\n"); */ paintit(); } } static int stop(struct s3d_evt *S3DVTUNUSED(event)) { s3d_quit(); return 0; } static unsigned int draw_background(void) { unsigned int b; b = s3d_new_object(); s3d_push_vertex(b, -MAX_CHARS / 2*X_RATIO*CS , CS + CS*MAX_LINES / 2 , -0.01); s3d_push_vertex(b, MAX_CHARS / 2*X_RATIO*CS , CS + CS*MAX_LINES / 2 , -0.01); s3d_push_vertex(b, MAX_CHARS / 2*X_RATIO*CS , -CS*MAX_LINES / 2 , -0.01); s3d_push_vertex(b, -MAX_CHARS / 2*X_RATIO*CS , -CS*MAX_LINES / 2 , -0.01); s3d_push_material_a(b, 0.5, 0.5, 0.5, 0.7, 1, 1, 1, 0.7, 0, 0, 0, 0.7); s3d_push_polygon(b, 1, 2, 0, 0); s3d_push_polygon(b, 2, 3, 0, 0); s3d_flags_on(b, S3D_OF_VISIBLE); return b; } static void chars_s3d_init(void) { #ifdef M_CHAR char c[2]; c[1] = '\0'; for (i = 0; i < 128; i++) { c[0] = i; charbuf[i] = s3d_draw_string(c, NULL); } for (i = 128; i < 256; i++) { charbuf[i] = s3d_new_object(); } cursor = s3d_new_object(); s3d_clone_target(cursor, charbuf['_']); #endif } static void chars_init(void) { #ifdef M_CHAR int x, y; for (y = 0; y < (MAX_LINES); y++) for (x = 0; x < (MAX_CHARS); x++) { line[y].chars[x].character = 0; i = y * MAX_CHARS + x; screenbuf[i] = -1; last_c[i] = 0; } #endif #ifdef M_LINE int i; for (i = 0; i < MAX_LINES; i++) lines[i] = -1; #endif } int main(int argc, char **argv) { chars_init(); init_terminal(); s3d_set_callback(S3D_EVENT_QUIT, stop); s3d_set_callback(S3D_EVENT_OBJ_CLICK, stop); s3d_set_callback(S3D_EVENT_KEY, keypress); if (!s3d_init(&argc, &argv, "s3dvt")) { if (s3d_select_font("vera")) { printf("font not found\n"); exit(-1); } draw_background(); chars_s3d_init(); s3d_mainloop(mainloop); s3d_quit(); } term_unload(); return 0; } s3d-0.2.2.1/apps/s3dvt/s3dvt.h000066400000000000000000000020331361325167000155670ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2002 Alexander Graf */ #ifndef _S3DVT_H_ #define _S3DVT_H_ #include #ifndef S3DVTUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DVTUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DVTUNUSED(x) /* x */ #else #define S3DVTUNUSED(x) x #endif #endif #define MAX_LINES 50 #define MAX_CHARS 80 #define DEFAULT_FGCOLOR 2 #define DEFAULT_BGCOLOR 0 #define X_RATIO 0.75 #define CS 0.1 #define M_PIPE 1 #define M_PTY 2 /* #define M_LINE 1 */ #define M_CHAR 1 typedef struct char_struct { char character; char fgcolor; char bgcolor; } t_char; typedef struct line_struct { t_char chars[MAX_CHARS+1]; } t_line; extern t_line line[MAX_LINES+1]; /* main.c */ void paintit(void); void term_addchar(char toprint); /* terminal.c */ void AddChar(char *_toadd); extern int gotnewdata; extern int cx, cy; #endif /* _S3DVT_H_ */ s3d-0.2.2.1/apps/s3dvt/terminal.c000066400000000000000000000237511361325167000163440ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2002 Alexander Graf */ #include "s3dvt.h" #include /* NULL,perror() */ #include /* memcpy() */ #include /* atoi() */ #include /* isdigit() */ #define MOVE_RIGHT 1 #define MOVE_LEFT 2 #define MOVE_UP 3 #define MOVE_DOWN 4 int cx = 0, cy = 0; int gotnewdata = 1; t_line line[MAX_LINES+1]; static int isansi = 0; static int isansi2 = 0; static int bottom = MAX_LINES - 1; static int top = 0; static int curfgcolor = DEFAULT_FGCOLOR; static int curbgcolor = DEFAULT_BGCOLOR; static void move_all_lines_up(void) { t_line *pfirstline = (t_line*) & line; t_line *psecondline = (t_line*) & line + 1; t_line tmpline[MAX_LINES]; memcpy(&tmpline, psecondline, (MAX_LINES - 1)*sizeof(struct line_struct)); memcpy(pfirstline, &tmpline, (MAX_LINES - 1)*sizeof(struct line_struct)); } static void clear_char(int lineid, int charid) { line[lineid].chars[charid].character = 0; line[lineid].chars[charid].fgcolor = DEFAULT_FGCOLOR; line[lineid].chars[charid].bgcolor = DEFAULT_BGCOLOR; } static void clear_line(int lineid) { int i; for (i = 0; i < MAX_CHARS; i++) clear_char(lineid, i); } static void clear_line_after_lastchar(void) { int i; for (i = cx; i < MAX_CHARS; i++) clear_char(cy, i); } static t_line* line_is_full(void) { t_line *pcurline; cy++; if (cy >= MAX_LINES) { /* damn it ... our display is filled ... let's move everything upwards */ cy = MAX_LINES - 1; pcurline = (t_line*) & line + cy; move_all_lines_up(); clear_line(cy); gotnewdata = 1; } else { pcurline = (t_line*) & line + cy; } cx = 0; return pcurline; } static void add_char_append(char toappend) { int shouldinc = 1; t_line *pcurline = (t_line*) & line + cy; if (cx == MAX_CHARS - 1) { pcurline = line_is_full(); shouldinc = 0; } /* our line is full */ pcurline->chars[cx].character = toappend; pcurline->chars[cx].fgcolor = curfgcolor; pcurline->chars[cx].bgcolor = curbgcolor; if (shouldinc) cx++; } static void backspace(void) { if (cx > 0) cx--; else cx = 0; } static void endansi(void) { printf(" [/ANSI(%d)]\n", isansi2); isansi = 0; isansi2 = 0; } /* Parameter Parameter Meaning 0 Attributes off 1 Bold or increased intensity 4 Underscore 5 Blink 7 Negative (reverse) image */ static void ansi_change_graphic(char **args) { int curcol; int i; if (args[0][0] == '\0') { args[0][0] = '0'; args[0][1] = '\0'; } for (i = 0; i < 5; i++) { if (args[i][0]) { curcol = atoi(args[i]); switch (curcol) { case 0: curbgcolor = DEFAULT_BGCOLOR; curfgcolor = DEFAULT_FGCOLOR; break; case 1: /* Bold or increased intensity */ case 4: /* Underscore */ case 5: /* Blink */ case 7: /* Negative (reverse) image */ case 10: /* primary font */ case 11: /* alternate font */ break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: curfgcolor = curcol - 30; break; case 39: curbgcolor = DEFAULT_FGCOLOR; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: curbgcolor = curcol - 40; break; case 49: curbgcolor = DEFAULT_BGCOLOR; break; default: printf("*** don't know color-code %d\n", curcol); break; } } } } static void move_up_x_lines(char *arg) { t_line *pfirstline; t_line *psecondline; t_line tmpline[MAX_LINES]; int amount; int i; if (arg[0]) amount = atoi(arg); else amount = 0; printf("moving up %d lines", amount); for (i = 0; i < amount; i++) { pfirstline = (t_line*) & line + cy; psecondline = pfirstline + 1; memcpy(&tmpline, psecondline, (bottom - top)*sizeof(struct line_struct)); memcpy(pfirstline, &tmpline, (bottom - top)*sizeof(struct line_struct)); } } static void move_down_x_lines(char *arg) { t_line *pfirstline; t_line *psecondline; t_line tmpline[MAX_LINES]; int amount; int i; if (arg[0]) amount = atoi(arg); else amount = 0; printf("moving down %d lines", amount); for (i = 0; i < amount; i++) { pfirstline = (t_line*) & line + cy; psecondline = pfirstline + 1; memcpy(&tmpline, pfirstline, (bottom - top)*sizeof(struct line_struct)); memcpy(psecondline, &tmpline, (bottom - top)*sizeof(struct line_struct)); } } static void delete_x_letters(char *arg1) { int tmpint; int i; if (arg1[0]) tmpint = atoi(arg1); else tmpint = 1; if (tmpint + cx > MAX_CHARS) tmpint = MAX_CHARS - cx; for (i = cx; i < cx + tmpint; i++) clear_char(cy, i); } static void move_x_letters(int mode, char *arg1) { int tmpint; int i; if (arg1[0]) tmpint = atoi(arg1); else tmpint = 1; switch (mode) { case MOVE_RIGHT: for (i = 0; i < tmpint; i++) { cx++; if (cx == MAX_CHARS) line_is_full(); /* our line is full */ } break; case MOVE_LEFT: for (i = 0; i < tmpint; i++) { cx--; if (cx == -1) { cy--; cx = MAX_CHARS - 1; } /* need to go up one line */ } break; case MOVE_UP: cy--; break; case MOVE_DOWN: line_is_full(); break; default: break; } } static void remove_beginning_from_curpos(void) { int i, j = cx; for (i = cy; i < MAX_LINES; i++) { for (; j < MAX_CHARS; j++) { clear_char(i, j); } j = 0; } } static int parseansi(char curchar) { static char arg1[16] = ""; static char arg2[16] = ""; static char arg3[16] = ""; static char arg4[16] = ""; static char arg5[16] = ""; static char curindex = 0; static char curarg = 0; static char *args[] = {arg1, arg2, arg3, arg4, arg5}; /* static char *args[]={&arg1,&arg2,&arg3,&arg4,&arg5}; */ printf("%c", curchar); switch (isansi2) { case 1: switch (curchar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* we got an argument */ args[(int)curarg][(int)curindex] = curchar; curindex++; args[(int)curarg][(int)curindex] = '\0'; break; case ';': /* some arg is finished */ curarg++; curindex = 0; args[(int)curarg][0] = '\0'; break; case 'J': /* remove beginning from current cursor to end of screen */ remove_beginning_from_curpos(); gotnewdata = 1; break; case 'K': /* remove everything in line beginning from lastchar */ clear_line_after_lastchar(); break; case 'H': /* move to position x=arg1 y=arg2 */ if (arg1[0]) cy = atoi(arg1) - 1; else cy = 0; if (arg2[0]) cx = atoi(arg2) - 1; else cx = 0; break; case 'G': /* move to position x=arg1 y=MAX */ if (arg1[0]) cx = atoi(arg1) - 1; else cx = -1; cy = bottom - 1; break; case 'd': /* move to position x=MAX y=arg1 */ if (arg1[0]) cy = atoi(arg1) - 1; else cy = 0; cy = top + cy; cx = MAX_CHARS - 1; break; case 'm': /* change graphic */ ansi_change_graphic(args); break; case 'M': /* Move memory in range ('r') one uo */ move_up_x_lines(arg1); break; case 'L': /* Move memory in range ('r') one down */ move_down_x_lines(arg1); break; case 'l': /* RM -- Reset Mode ESC [ Ps ; Ps ; . . . ; Ps l default value: none Resets one or more VT100 modes as specified by each selective parameter in the parameter string. Each mode to be reset is specified by a separate parameter. [See Set Mode (SM) control sequence]. (See Modes following this section).*/ /* mc only resets the '4' !?! => IRM (Insert/Replacement-Mode) */ /* perhaps Set Cursor to Block mode ? */ break; case 'r': /* define scroll-range */ if (arg1[0]) top = atoi(arg1); else top = 0; if (arg2[0]) bottom = atoi(arg2); else bottom = 0; cy = 0; cx = 0; break; case 'a': case 'A': /* move x letters up */ move_x_letters(MOVE_UP, arg1); break; case 'B': /* move x letters down */ move_x_letters(MOVE_DOWN, arg1); break; case 'C': /* move x letters right */ move_x_letters(MOVE_RIGHT, arg1); break; case 'D': /* move x letters left */ move_x_letters(MOVE_LEFT, arg1); break; case 'P': /* delete x letters */ delete_x_letters(arg1); break; case '?': isansi2 = 4; return 0; default: printf("***unknown***"); } if (!(isdigit(curchar) || curchar == ';')) { /* clean our args */ args[0][0] = '\0'; args[1][0] = '\0'; args[2][0] = '\0'; args[3][0] = '\0'; args[4][0] = '\0'; curindex = 0; curarg = 0; endansi(); } break; case 0: switch (curchar) { case '[': isansi2 = 1; break; case '(': isansi2 = 2; break; case ')': isansi2 = 3; break; case ']': isansi2 = 5; break; default: endansi(); break; } break; case 4: if (curchar > '9' || curchar < '0') endansi(); break; case 5: if (curchar == 7) endansi(); /* FIXME: Window Title*/ break; default: endansi(); break; } return 0; } void AddChar(char *_toadd) { char *toadd; char curchar; for (toadd = _toadd; toadd[0]; toadd++) { curchar = toadd[0]; /* printf("%.3d (", curchar);*/ if (isansi) parseansi(curchar); else { switch (curchar) { case 7: printf("\n"); break; case 8: printf("\n"); backspace(); break; case 27: /* ANSI */ printf("[ANSI] "); isansi = 1; break; case 10: printf("\n");/* get onto the next line */ line_is_full(); break; case 13: printf("\n");/* carriage return, get back */ if (cx == MAX_CHARS - 1) line_is_full(); cx = 0; break; default: if ((curchar >= 32) && (curchar < 127)) { /* printf("%c", curchar);*/ add_char_append(curchar); } break; } /* printf(")\n");*/ } } gotnewdata = 1; } s3d-0.2.2.1/cmake/000077500000000000000000000000001361325167000134275ustar00rootroot00000000000000s3d-0.2.2.1/cmake/CMakeLists.txt000066400000000000000000000002151361325167000161650ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann add_subdirectory(modules) s3d-0.2.2.1/cmake/modules/000077500000000000000000000000001361325167000150775ustar00rootroot00000000000000s3d-0.2.2.1/cmake/modules/CMakeLists.txt000066400000000000000000000001611361325167000176350ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann s3d-0.2.2.1/cmake/modules/EnableProfiling.cmake000066400000000000000000000010561361325167000211430ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann # add option for enabling/disabling profiling option(PROFILING "Enable/disable support for profiling with gprof" OFF) if (PROFILING) include(CheckCCompilerFlag) # check if c compiler understands -pg check_c_compiler_flag("-pg" SUPPORT_PG) if (SUPPORT_PG) add_definitions("-pg") list(APPEND CMAKE_EXE_LINKER_FLAGS "-pg") else (SUPPORT_PG) message(FATAL_ERROR "Compiler doesn't understand -pg") endif (SUPPORT_PG) endif (PROFILING) s3d-0.2.2.1/cmake/modules/FilterPIE.cmake000066400000000000000000000006021361325167000176620ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann string(REGEX REPLACE "(-fpie)|(-fPIE)|(-pie)" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") #string(REGEX REPLACE "(-fpie)|(-fPIE)|(-pie)" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REGEX REPLACE "(-fpie)|(-fPIE)|(-pie)" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") s3d-0.2.2.1/cmake/modules/FindDocbook.cmake000066400000000000000000000010561361325167000202640ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann find_program(DOCBOOK2HTML_COMPILER NAMES xmlto PATHS ${DOCBOOK_BINARY_PATH} /usr/bin ) set(DOCBOOK2HTML_ARGS "xhtml") find_program(DOCBOOK2PDF_COMPILER NAMES xmlto PATHS ${DOCBOOK_BINARY_PATH} /usr/bin ) set(DOCBOOK2PDF_ARGS "pdf") find_program(DOCBOOK2PS_COMPILER NAMES xmlto PATHS ${DOCBOOK_BINARY_PATH} /usr/bin ) set(DOCBOOK2PS_ARGS "ps") mark_as_advanced( DOCBOOK2HTML_COMPILER DOCBOOK2PDF_COMPILER DOCBOOK2PS_COMPILER ) s3d-0.2.2.1/cmake/modules/FindMath.cmake000066400000000000000000000012571361325167000176000ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann if (MATH_LIBRARIES) # path set by user or was found in the past set(MATH_FOUND TRUE) else (MATH_LIBRARIES) find_library(MATH_LIBRARIES NAMES m ) if (MATH_LIBRARIES) set(MATH_FOUND TRUE) endif (MATH_LIBRARIES) if (MATH_FOUND) if (NOT MATH_FIND_QUIETLY) message(STATUS "Found m: ${MATH_LIBRARIES}") endif (NOT MATH_FIND_QUIETLY) else (MATH_FOUND) if (MATH_FIND_REQUIRED) message(FATAL_ERROR "Could not find libm") endif (MATH_FIND_REQUIRED) endif (MATH_FOUND) # set visibility in cache mark_as_advanced(MATH_LIBRARIES) endif (MATH_LIBRARIES) s3d-0.2.2.1/cmake/modules/FindPThreads.cmake000066400000000000000000000021111361325167000204070ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann if (PTHREADS_LIBRARIES AND PTHREADS_INCLUDE_DIRS) # path set by user or was found in the past set(PTHREADS_FOUND TRUE) else (PTHREADS_LIBRARIES AND PTHREADS_INCLUDE_DIRS) find_path(PTHREADS_INCLUDE_DIRS NAMES pthread.h ) find_library(PTHREADS_LIBRARIES NAMES pthread ) if (NOT PTHREADS_LIBRARIES) find_library(PTHREADS_LIBRARIES NAMES pthreads ) endif (NOT PTHREADS_LIBRARIES) if (PTHREADS_INCLUDE_DIRS AND PTHREADS_LIBRARIES) set(PTHREADS_FOUND TRUE) endif (PTHREADS_INCLUDE_DIRS AND PTHREADS_LIBRARIES) if (PTHREADS_FOUND) if (NOT PTHREADS_FIND_QUIETLY) message(STATUS "Found PThreads: ${PTHREADS_LIBRARIES}") endif (NOT PTHREADS_FIND_QUIETLY) else (PTHREADS_FOUND) if (PTHREADS_FIND_REQUIRED) message(FATAL_ERROR "Could not find PThreads") endif (PTHREADS_FIND_REQUIRED) endif (PTHREADS_FOUND) # set visibility in cache mark_as_advanced(PTHREADS_INCLUDE_DIRS PTHREADS_LIBRARIES) endif (PTHREADS_LIBRARIES AND PTHREADS_INCLUDE_DIRS) s3d-0.2.2.1/cmake/modules/FindSDL2.cmake000066400000000000000000000151521361325167000174120ustar00rootroot00000000000000# Locate SDL2 library # This module defines # SDL2_LIBRARY, the name of the library to link against # SDL2_FOUND, if false, do not try to link to SDL2 # SDL2_INCLUDE_DIR, where to find SDL.h # # This module responds to the the flag: # SDL2_BUILDING_LIBRARY # If this is defined, then no SDL2_main will be linked in because # only applications need main(). # Otherwise, it is assumed you are building an application and this # module will attempt to locate and set the the proper link flags # as part of the returned SDL2_LIBRARY variable. # # Don't forget to include SDL2main.h and SDL2main.m your project for the # OS X framework based version. (Other versions link to -lSDL2main which # this module will try to find on your behalf.) Also for OS X, this # module will automatically add the -framework Cocoa on your behalf. # # # Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration # and no SDL2_LIBRARY, it means CMake did not find your SDL2 library # (SDL2.dll, libsdl2.so, SDL2.framework, etc). # Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. # Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value # as appropriate. These values are used to generate the final SDL2_LIBRARY # variable, but when these values are unset, SDL2_LIBRARY does not get created. # # # $SDL2DIR is an environment variable that would # correspond to the ./configure --prefix=$SDL2DIR # used in building SDL2. # l.e.galup 9-20-02 # # Modified by Eric Wing. # Added code to assist with automated building by using environmental variables # and providing a more controlled/consistent search behavior. # Added new modifications to recognize OS X frameworks and # additional Unix paths (FreeBSD, etc). # Also corrected the header search path to follow "proper" SDL2 guidelines. # Added a search for SDL2main which is needed by some platforms. # Added a search for threads which is needed by some platforms. # Added needed compile switches for MinGW. # # On OSX, this will prefer the Framework version (if found) over others. # People will have to manually change the cache values of # SDL2_LIBRARY to override this selection or set the CMake environment # CMAKE_INCLUDE_PATH to modify the search paths. # # Note that the header path has changed from SDL2/SDL.h to just SDL.h # This needed to change because "proper" SDL2 convention # is #include "SDL.h", not . This is done for portability # reasons because not all systems place things in SDL2/ (see FreeBSD). # # Ported by Johnny Patterson. This is a literal port for SDL2 of the FindSDL.cmake # module with the minor edit of changing "SDL" to "SDL2" where necessary. This # was not created for redistribution, and exists temporarily pending official # SDL2 CMake modules. #============================================================================= # SPDX-FileCopyrightText: 2003-2009 Kitware, Inc. # SPDX-License-Identifier: BSD-3-Clause # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) FIND_PATH(SDL2_INCLUDE_DIR SDL.h HINTS $ENV{SDL2DIR} PATH_SUFFIXES include/SDL2 include PATHS ~/Library/Frameworks /Library/Frameworks /usr/local/include/SDL2 /usr/include/SDL2 /sw # Fink /opt/local # DarwinPorts /opt/csw # Blastwave /opt ) #MESSAGE("SDL2_INCLUDE_DIR is ${SDL2_INCLUDE_DIR}") FIND_LIBRARY(SDL2_LIBRARY_TEMP NAMES SDL2 HINTS $ENV{SDL2DIR} PATH_SUFFIXES lib64 lib PATHS /sw /opt/local /opt/csw /opt ) #MESSAGE("SDL2_LIBRARY_TEMP is ${SDL2_LIBRARY_TEMP}") IF(NOT SDL2_BUILDING_LIBRARY) IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") # Non-OS X framework versions expect you to also dynamically link to # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms # seem to provide SDL2main for compatibility even though they don't # necessarily need it. FIND_LIBRARY(SDL2MAIN_LIBRARY NAMES SDL2main HINTS $ENV{SDL2DIR} PATH_SUFFIXES lib64 lib PATHS /sw /opt/local /opt/csw /opt ) ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") ENDIF(NOT SDL2_BUILDING_LIBRARY) # SDL2 may require threads on your system. # The Apple build may not need an explicit flag because one of the # frameworks may already provide it. # But for non-OSX systems, I will use the CMake Threads package. IF(NOT APPLE) FIND_PACKAGE(Threads) ENDIF(NOT APPLE) # MinGW needs an additional library, mwindows # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows # (Actually on second look, I think it only needs one of the m* libraries.) IF(MINGW) SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") ENDIF(MINGW) SET(SDL2_FOUND "NO") IF(SDL2_LIBRARY_TEMP) # For SDL2main IF(NOT SDL2_BUILDING_LIBRARY) IF(SDL2MAIN_LIBRARY) SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP}) ENDIF(SDL2MAIN_LIBRARY) ENDIF(NOT SDL2_BUILDING_LIBRARY) # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. # CMake doesn't display the -framework Cocoa string in the UI even # though it actually is there if I modify a pre-used variable. # I think it has something to do with the CACHE STRING. # So I use a temporary variable until the end so I can set the # "real" variable in one-shot. IF(APPLE) SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") ENDIF(APPLE) # For threads, as mentioned Apple doesn't need this. # In fact, there seems to be a problem if I used the Threads package # and try using this line, so I'm just skipping it entirely for OS X. IF(NOT APPLE) SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) ENDIF(NOT APPLE) # For MinGW library IF(MINGW) SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) ENDIF(MINGW) # Set the final string here so the GUI reflects the final state. SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") # Set the temp variable to INTERNAL so it is not seen in the CMake GUI SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") SET(SDL2_FOUND "YES") ENDIF(SDL2_LIBRARY_TEMP) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) s3d-0.2.2.1/cmake/modules/LateErrors.cmake000066400000000000000000000007221361325167000201640ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann macro(PkgError_Later _errmsg) set(pgk_error "${pgk_error}\n\t${_errmsg}") endmacro(PkgError_Later _errmsg) macro(Collected_PkgErrors) if (pgk_error) message(FATAL_ERROR "Following required packages could not be found: ${pgk_error}\n" "The exact names can differ depending on the distribution.") endif (pgk_error) endmacro(Collected_PkgErrors) s3d-0.2.2.1/cmake/modules/LateStatus.cmake000066400000000000000000000007741361325167000202020ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann macro(PkgStatus_Later _errmsg) set(pgk_status "${pgk_status}\n\t${_errmsg}") endmacro(PkgStatus_Later _errmsg) macro(Collected_PkgStatus _modulename) if (pgk_status) message(STATUS "${_modulename} will not be build because of missing packages: ${pgk_status}\n\t" "The exact names can differ depending on the distribution.") endif (pgk_status) endmacro(Collected_PkgStatus _modulename) s3d-0.2.2.1/cmake/modules/LateStatusPartial.cmake000066400000000000000000000011061361325167000215050ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann macro(PkgStatusPartial_Later _errmsg) set(pgk_statuspartial "${pgk_status}\n\t${_errmsg}") endmacro(PkgStatusPartial_Later _errmsg) macro(Collected_PkgStatusPartial _modulename) if (pgk_statuspartial) message(STATUS "${_modulename} will be built without some features because of missing packages: ${pgk_statuspartial}\n\t" "The exact names can differ depending on the distribution.") endif (pgk_statuspartial) endmacro(Collected_PkgStatusPartial _modulename) s3d-0.2.2.1/cmake/modules/S3DInternals.cmake000066400000000000000000000044161361325167000203570ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann # This module defines a bunch of variables used as locations for install # directories and for library creation # # BIN_INSTALL_DIR - the directory where executables will be installed # CFG_INSTALL_DIR - the directory where configuration will be installed # LIB_INSTALL_DIR - the directory where libraries will be installed # INCLUDE_INSTALL_DIR - the directory where header will be installed # DATA_INSTALL_DIR - the parent directory where applications can install their data # HTML_INSTALL_DIR - the HTML install dir for documentation # MAN_INSTALL_DIR - the man page install dir # PKGCFG_INSTALL_DIR - the pkg-config install dir if (WIN32) set(CFG_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/etc" CACHE PATH "The s3d cfg install dir (default prefix/etc/)") else (WIN32) set(CFG_INSTALL_DIR "/etc" CACHE PATH "The s3d cfg install dir (default /etc/)") endif (WIN32) set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "The s3d man install dir (default prefix/bin/)") set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "The s3d lib install dir (default prefix/lib/)") set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The s3d header install dir (default prefix/include/)") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/s3d/objs" CACHE PATH "The s3d objs install dir (default prefix/share/s3d/objs/)") set(HTML_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/s3d" CACHE PATH "The s3d html documentation install dir (default prefix/share/doc/s3d/)") set(MAN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "The s3d man install dir (default prefix/share/man/)") set(PKGCFG_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig" CACHE PATH "The s3d pkg-config install dir (default prefix/lib/pkgconfig/)") # add option for enabling/disabling link time optimisation option(BUILD_LTO "Enable/disable support for link time optimization" OFF) if (BUILD_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT HAVE_IPO) if(HAVE_IPO) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() # test for -fwhole-program include(TestGCCExternally) # test for -fdata-sections and -ffunction-sections include(TestGCCSections) endif (BUILD_LTO) s3d-0.2.2.1/cmake/modules/SetC9X.cmake000066400000000000000000000005361361325167000171640ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCCompilerFlag) # Enable c99/c9x check_c_compiler_flag("-std=c9x" SUPPORT_C9X) if (SUPPORT_C9X) list(APPEND CMAKE_C_FLAGS "-std=c9x ") else (SUPPORT_C9X) message(STATUS "Could not enable c9x support") endif (SUPPORT_C9X) s3d-0.2.2.1/cmake/modules/SetCCWarnFlags.cmake000066400000000000000000000015021361325167000206450ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCCompilerFlag) # Enable all warnings if possible (gnu cc) check_c_compiler_flag("-Wall" SUPPORT_WALL) if (SUPPORT_WALL) add_definitions("-Wall") endif (SUPPORT_WALL) # Enable even more warnings if possible (gnu cc) check_c_compiler_flag("-Wextra" SUPPORT_WEXTRA) if (SUPPORT_WEXTRA) add_definitions("-Wextra") else (SUPPORT_WEXTRA) # try to enable extra warnings on old gcc versions check_c_compiler_flag("-W" SUPPORT_WEXTRAOLD) if (SUPPORT_WEXTRAOLD) add_definitions("-W") endif (SUPPORT_WEXTRAOLD) endif (SUPPORT_WEXTRA) # Enable pedantic mode if possible (gnu cc) check_c_compiler_flag("-pedantic" SUPPORT_PEDANTIC) if (SUPPORT_PEDANTIC) add_definitions("-pedantic") endif (SUPPORT_PEDANTIC) s3d-0.2.2.1/cmake/modules/SetDebugLevel.cmake000066400000000000000000000015761361325167000206040ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann # if user set debug level string(TOUPPER "${DEBUG}" DEBUG_UPPER) set(DEBUG ${DEBUG} CACHE STRING "Set Debug Level" ) # test debug and convert it so numeric debug_level set(DEBUG_LEVEL CACHE INTERNAL "Numeric representation of DEBUG") if (DEBUG_UPPER STREQUAL VLOW) set(DEBUG_LEVEL "1") elseif (DEBUG_UPPER STREQUAL LOW) set(DEBUG_LEVEL "2") elseif (DEBUG_UPPER STREQUAL MED) set(DEBUG_LEVEL "3") elseif (DEBUG_UPPER STREQUAL HIGH) set(DEBUG_LEVEL "4") elseif (DEBUG_UPPER STREQUAL VHIGH) set(DEBUG_LEVEL "5") elseif (DEBUG_UPPER STREQUAL "") set(DEBUG) else (DEBUG_UPPER STREQUAL VLOW) message(FATAL_ERROR "No valid debug-level [VLOW|LOW|MED|HIGH|VHIGH] found.") endif (DEBUG_UPPER STREQUAL VLOW) if (DEBUG) message(STATUS "Set debug level to: ${DEBUG}") endif (DEBUG) s3d-0.2.2.1/cmake/modules/TestForSHM.cmake000066400000000000000000000002661361325167000200430ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckFunctionExists) check_function_exists(shmget HAVE_SHM) s3d-0.2.2.1/cmake/modules/TestForSIGS.cmake000066400000000000000000000006441361325167000201610ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckFunctionExists) check_function_exists(signal HAVE_SIGS_FUNC) include(CheckCSourceCompiles) check_c_source_compiles("#include int main() { sig_t test; return 0; }" SIG_T_DEFINED) if (HAVE_SIGS_FUNC AND SIG_T_DEFINED) set(HAVE_SIGS TRUE) endif (HAVE_SIGS_FUNC AND SIG_T_DEFINED) s3d-0.2.2.1/cmake/modules/TestForTCP.cmake000066400000000000000000000002661361325167000200420ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckFunctionExists) check_function_exists(socket HAVE_TCP) s3d-0.2.2.1/cmake/modules/TestGCCExternally.cmake000066400000000000000000000005441361325167000214100ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCCompilerFlag) # Hide non exported functions/variables check_c_compiler_flag("-fwhole-program -DHAVE_GCCEXTERNALLY" HAVE_GCCEXTERNALLY) if (HAVE_GCCEXTERNALLY) add_definitions("-DHAVE_GCCEXTERNALLY") endif (HAVE_GCCEXTERNALLY) s3d-0.2.2.1/cmake/modules/TestGCCSections.cmake000066400000000000000000000010761361325167000210510ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCCompilerFlag) # put data in new section for linker optimization check_c_compiler_flag("-fdata-sections" HAVE_GCCDATASECTIONS) if (HAVE_GCCDATASECTIONS) add_definitions("-fdata-sections") endif (HAVE_GCCDATASECTIONS) # put function in new section for linker optimization check_c_compiler_flag("-ffunction-sections" HAVE_GCCFUNCTIONSECTIONS) if (HAVE_GCCFUNCTIONSECTIONS) add_definitions("-ffunction-sections") endif (HAVE_GCCFUNCTIONSECTIONS) s3d-0.2.2.1/cmake/modules/TestGCCVisibility.cmake000066400000000000000000000005741361325167000214130ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCCompilerFlag) # Hide non exported functions/variables check_c_compiler_flag("-fvisibility=hidden -DHAVE_GCCVISIBILITY" HAVE_GCCVISIBILITY) if (HAVE_GCCVISIBILITY) add_definitions("-fvisibility=hidden -DHAVE_GCCVISIBILITY") endif (HAVE_GCCVISIBILITY) s3d-0.2.2.1/cmake/modules/TestUnusedParam.cmake000066400000000000000000000005621361325167000211700ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include(CheckCSourceCompiles) check_c_source_compiles("int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { return 0; }" UNUSEDPARAM_ATTRIBUTE) check_c_source_compiles("int main(int, char *[]) { return 0; }" UNUSEDPARAM_OMIT) s3d-0.2.2.1/cmake/modules/gpsd_fix.c000066400000000000000000000004421361325167000170460ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause /* SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann */ #include #ifdef __CLASSIC_C__ int main(){ int ac; char*av[]; #else int main(int ac, char*av[]){ #endif struct gps_data_t t; sizeof(t.fix); return 0; } s3d-0.2.2.1/config.h.cmake000066400000000000000000000017631361325167000150530ustar00rootroot00000000000000/* SPDX-License-Identifier: BSD-3-Clause */ /* SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann */ #ifndef _CONFIG_H_ #define _CONFIG_H_ /* config.h. Generated by cmake from config.h.cmake */ #cmakedefine G_SDL 1 #cmakedefine HAVE_GPS 1 #cmakedefine SHM 1 #cmakedefine SIGS 1 #cmakedefine TCP 1 /* path where to find objects */ #cmakedefine OBJECTPATH "${OBJECTPATH}" /* set debug level (can be changed by -DDEBUG=vlow|low|med|high|vhigh )*/ #cmakedefine DEBUG ${DEBUG_LEVEL} #cmakedefine UNUSEDPARAM_ATTRIBUTE 1 #cmakedefine UNUSEDPARAM_OMIT 1 #define S3D_BIN_INSTALL_DIR "${BIN_INSTALL_DIR}" #define S3D_CFG_INSTALL_DIR "${CFG_INSTALL_DIR}" #define S3D_LIB_INSTALL_DIR "${LIB_INSTALL_DIR}" #define S3D_INCLUDE_INSTALL_DIR "${INCLUDE_INSTALL_DIR}" #define S3D_DATA_INSTALL_DIR "${DATA_INSTALL_DIR}" #define S3D_HTML_INSTALL_DIR "${HTML_INSTALL_DIR}" #define S3D_MAN_INSTALL_DIR "${MAN_INSTALL_DIR}" #define S3D_PKGCFG_INSTALL_DIR "${PKGCFG_INSTALL_DIR}" #endif /* _CONFIG_H_ */ s3d-0.2.2.1/example/000077500000000000000000000000001361325167000140025ustar00rootroot00000000000000s3d-0.2.2.1/example/CMakeLists.txt000066400000000000000000000031711361325167000165440ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann # add option for enabling/disabling profiling option(EXAMPLES "Enable/disable compilation of examples" ON) if (EXAMPLES) include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) add_executable(filebrowser filebrowser.c) target_link_libraries(filebrowser s3d ${MATH_LIBRARIES}) add_executable(hudtest hudtest.c) target_link_libraries(hudtest s3d ${MATH_LIBRARIES}) add_executable(katze katze.c) target_link_libraries(katze s3d ${MATH_LIBRARIES}) add_executable(linetest linetest.c) target_link_libraries(linetest s3d ${MATH_LIBRARIES}) add_executable(modelloader modelloader.c) target_link_libraries(modelloader s3d ${MATH_LIBRARIES}) add_executable(nichtsnutz nichtsnutz.c) target_link_libraries(nichtsnutz s3d ${MATH_LIBRARIES}) add_executable(ptrtest ptrtest.c) target_link_libraries(ptrtest s3d ${MATH_LIBRARIES}) add_executable(radius_test radius_test.c) target_link_libraries(radius_test s3d ${MATH_LIBRARIES}) add_executable(s3dclock s3dclock.c) target_link_libraries(s3dclock s3d ${MATH_LIBRARIES}) add_executable(snowman snowman.c) target_link_libraries(snowman s3d ${MATH_LIBRARIES}) add_executable(strtest strtest.c) target_link_libraries(strtest s3d ${MATH_LIBRARIES}) add_executable(texturetest texturetest.c) target_link_libraries(texturetest s3d ${MATH_LIBRARIES}) add_executable(widgets widgets.c) target_link_libraries(widgets s3d s3dw ${MATH_LIBRARIES}) add_executable(wiresphere wiresphere.c) target_link_libraries(wiresphere s3d ${MATH_LIBRARIES}) endif (EXAMPLES) s3d-0.2.2.1/example/TODO000066400000000000000000000000001361325167000144600ustar00rootroot00000000000000s3d-0.2.2.1/example/example.h000066400000000000000000000007011361325167000156040ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* examples.h * * SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #ifndef _EXAMPLES_H_ #define _EXAMPLES_H_ #include #ifndef S3DUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DUNUSED(x) /* x */ #else #define S3DUNUSED(x) x #endif #endif #endif /* _EXAMPLES_H_ */ s3d-0.2.2.1/example/filebrowser.c000066400000000000000000000156171361325167000165030ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* printf() */ #include /* dirent */ #include /* malloc() */ #include /* strlen(), strncmp(), strrchr() */ #include /* chdir() */ #include /* sin(),cos() */ #include /* nanosleep() */ #include #include "example.h" /* S3DUNUSED */ static struct timespec t = { 0, 100*1000*1000 }; /* 100 mili seconds */ #define T_DUNO 0 #define T_LOCALDIR 1 #define T_BACKDIR 2 #define T_FOLDER 3 #define T_GEOMETRY 4 #define T_MUSIC 5 #define T_MOVIE 6 #define M_DIR 512 #define M_NAME 256 #define DEG2RAD(x) (x * ((float)M_PI / 180.0f)) static int folder, geometry, mp3, movie, duno, dot, dotdot; struct t_item { int icon_oid, descr_oid, pie_oid; char name[M_NAME]; int type; }; static struct t_item *item; static int n_item = 0; static int display_dir(const char *dir, int S3DUNUSED(depth), int posx, int posy, int posz) { struct dirent **namelist; int n, i; int px, py, pz; char *ext; char *nstr; float alpha, al, radius, f; char ndir[M_DIR+1]; struct stat s; if (n_item) { printf("freeing %d old items\n", n_item); for (i = 0; i < n_item; i++) { printf("deleting %d and %d\n", item[i].icon_oid, item[i].descr_oid); s3d_del_object(item[i].descr_oid); s3d_del_object(item[i].icon_oid); s3d_del_object(item[i].pie_oid); } free(item); } n = i = scandir(dir, &namelist, NULL, alphasort); if (n < 0) { perror("scandir"); return -1; } else { item = (struct t_item*)malloc(sizeof(struct t_item) * i); n_item = i; while (n--) { item[n].type = T_DUNO; nstr = namelist[n]->d_name; strncpy(item[n].name, nstr, sizeof(item[n].name)); item[n].name[sizeof(item[n].name) - 1] = '\0'; if ((0 == strncmp(nstr, ".", 1)) && (strlen(nstr) == 1)) item[n].type = T_LOCALDIR; else if (0 == strncmp(nstr, "..", strlen(nstr) < 2 ? strlen(nstr) : 2)) item[n].type = T_BACKDIR; else { ext = strrchr(nstr, '.'); strncpy(ndir, dir, sizeof(ndir)); ndir[sizeof(ndir) - 1] = 0; /* just in case */ strncat(ndir, "/", sizeof(ndir) - 1 - strlen(ndir)); strncat(ndir, namelist[n]->d_name, sizeof(ndir) - 1 - strlen(ndir)); /* printf("displaying %s\n",ndir); */ stat(ndir, &s); if (S_ISDIR(s.st_mode)) { item[n].type = T_FOLDER; } else { if (ext != NULL) { if (0 == strncmp(ext, ".3ds", strlen(ext) < 4 ? strlen(ext) : 4)) item[n].type = T_GEOMETRY; else if (0 == strncmp(ext, ".mp3", strlen(ext) < 4 ? strlen(ext) : 4)) item[n].type = T_MUSIC; else if (0 == strncmp(ext, ".mpg", strlen(ext) < 4 ? strlen(ext) : 4)) item[n].type = T_MOVIE; } } } switch (item[n].type) { case T_LOCALDIR: item[n].icon_oid = s3d_clone(dot); break; case T_BACKDIR: item[n].icon_oid = s3d_clone(dotdot); break; case T_FOLDER: item[n].icon_oid = s3d_clone(folder); break; case T_GEOMETRY: item[n].icon_oid = s3d_clone(geometry); break; case T_MUSIC: item[n].icon_oid = s3d_clone(mp3); break; case T_MOVIE: item[n].icon_oid = s3d_clone(movie); break; default: printf("don't know type, defaulting to duno %d...\n", duno); item[n].icon_oid = s3d_clone(duno); break; } alpha = ((360.0f * n) / ((float)i)); if (n_item < 5) radius = ((50) / ((float)M_PI * 4)); else radius = ((n_item * 10) / ((float)M_PI * 4)); px = posx - sinf(DEG2RAD(alpha)) * radius; py = posy; pz = posz - cosf(DEG2RAD(alpha)) * radius; item[n].pie_oid = s3d_new_object(); s3d_push_vertex(item[n].pie_oid, 0, -2, 0); al = ((360.0f * (n - 0.5f)) / ((float)i)); s3d_push_vertex(item[n].pie_oid, posx - sinf(DEG2RAD(al))*radius, -2, posz - cosf(DEG2RAD(al))*radius); al = ((360.0f * (n + 0.5f)) / ((float)i)); s3d_push_vertex(item[n].pie_oid, posx - sinf(DEG2RAD(al))*radius, -2, posz - cosf(DEG2RAD(al))*radius); f = 1.0f - 0.05f * (n % 2); switch (item[n].type) { case T_LOCALDIR: s3d_push_material(item[n].pie_oid, 0, f, 0, 0.5, 0.5, 0.5, f, f, f); break; case T_BACKDIR: s3d_push_material(item[n].pie_oid, 0, f / 2, 0, 0.5, 0.5, 0.5, f, f, f); break; case T_FOLDER: s3d_push_material(item[n].pie_oid, f, f, 0, 0.5, 0.5, 0.0, f, f, 1); break; default: s3d_push_material(item[n].pie_oid, f, f, f, 0.5, 0.5, 0.5, f, f, f); break; } s3d_push_polygon(item[n].pie_oid, 0, 2, 1, 0); s3d_push_vertex(item[n].pie_oid, (float)pz, -2.f, 0.f); s3d_translate(item[n].icon_oid, (float)px, (float)py, (float)pz); s3d_rotate(item[n].icon_oid, 0, alpha, 0); s3d_flags_on(item[n].icon_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(item[n].pie_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); item[n].descr_oid = s3d_draw_string(nstr, NULL); s3d_link(item[n].descr_oid, item[n].icon_oid); s3d_translate(item[n].descr_oid, -1, -2, 0); /* r=s3d_get_radius(p); */ /* s3d_scale(p,1.0/r,1.0/r,1.0/r); */ s3d_flags_on(item[n].descr_oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); printf("string %d linked to %d\n", item[n].descr_oid, item[n].icon_oid); free(namelist[n]); } free(namelist); } return 0; } static int object_click(struct s3d_evt *evt) { int i, oid; char execstr[276]; oid = (int) * ((unsigned long *)evt->buf); printf("!!!!!!!!! clicked object %d\n", oid); for (i = 0; i < n_item; i++) { if (((oid == item[i].icon_oid) || (oid == item[i].descr_oid)) || (oid == item[i].pie_oid)) { switch (item[i].type) { case T_BACKDIR: case T_FOLDER: case T_LOCALDIR: printf("going into %s\n", item[i].name); chdir(item[i].name); display_dir(".", 0, 0, 0, 0); return 0; break; case T_GEOMETRY: printf("loading geometry %s\n", item[i].name); snprintf(execstr, sizeof(execstr), "modelloader \"%s\"&\n", item[i].name); system(execstr); return 0; break; case T_MOVIE: printf("playing %s\n", item[i].name); snprintf(execstr, sizeof(execstr), "mplayer -vo s3d \"%s\"&\n", item[i].name); system(execstr); return 0; break; } } } return 0; } static void mainloop(void) { nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "filebrowser")) { /* load the object files */ folder = s3d_import_model_file("objs/folder.3ds"); geometry = s3d_import_model_file("objs/geometry.3ds"); mp3 = s3d_import_model_file("objs/notes.3ds"); movie = s3d_import_model_file("objs/film.3ds"); duno = s3d_import_model_file("objs/duno.3ds"); dot = s3d_import_model_file("objs/dot.3ds"); dotdot = s3d_import_model_file("objs/dotdot.3ds"); s3d_select_font("vera"); s3d_set_callback(S3D_EVENT_OBJ_CLICK, object_click); display_dir(".", 0, 0, 0, 0); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/hudtest.c000066400000000000000000000012431361325167000156260ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* sleep() */ #include /* printf() */ static void mainloop(void) { sleep(1); } int main(int argc, char **argv) { int o, m; if (!s3d_init(&argc, &argv, "hud-test")) { if (s3d_select_font("vera")) printf("font not found\n"); o = s3d_draw_string("hud-test", NULL); m = s3d_import_model_file("objs/star.3ds"); s3d_translate(o, 0, 0, -5); s3d_link(o, 0); s3d_flags_on(o, S3D_OF_VISIBLE); s3d_flags_on(m, S3D_OF_VISIBLE); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/katze.c000066400000000000000000000037071361325167000152730ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* sin() */ #include /* nanosleep() */ static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ static int a; static int rot_point, body, legfr, legbr, legfl, legbl, tail; static void mainloop(void) { float pos; a = (a + 2) % 360; pos = sinf((5.f * a * (float)M_PI) / 180.f) * 20.f; s3d_rotate(legfr, 0, 90, 180 + pos); s3d_rotate(legfl, 0, 90, 180 - pos); s3d_rotate(legbr, 0, 0, 180 + pos); s3d_rotate(legbl, 0, 0, 180 - pos); s3d_rotate(tail, 0, 30, 110 + pos); s3d_rotate(rot_point, 0, (float)-a, 0); nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "running cat")) { rot_point = s3d_new_object(); body = s3d_import_model_file("objs/katze_body.3ds"); legfr = s3d_import_model_file("objs/katze_leg.3ds"); tail = s3d_import_model_file("objs/katze_tail.3ds"); legfl = s3d_clone(legfr); legbl = s3d_clone(legfr); legbr = s3d_clone(legfr); s3d_translate(legfl, 2.3, 1.0, 0.5); s3d_translate(legfr, 0, 1.0, 0.2); s3d_translate(legbl, -1.2, 1.0, -1.8); s3d_translate(legbr, -1.2, 1.0, 0.0); s3d_translate(tail, -1.6, 1.6, -0.8); s3d_translate(body, 1.3, 0.0, -1.3); s3d_link(legfr, body); s3d_link(legfl, body); s3d_link(legbr, body); s3d_link(legbl, body); s3d_link(tail, body); s3d_link(body, rot_point); /* s3d_link(oid_foot,oid_head); * s3d_link(oid_middle,oid_head); * s3d_translate(oid_head,0,4,0); * s3d_translate(oid_middle,0,-1.5,0); * relative to head: * * s3d_translate(oid_foot,0,-3.5,0); */ s3d_flags_on(body, S3D_OF_VISIBLE); s3d_flags_on(legfr, S3D_OF_VISIBLE); s3d_flags_on(legfl, S3D_OF_VISIBLE); s3d_flags_on(legbr, S3D_OF_VISIBLE); s3d_flags_on(legbl, S3D_OF_VISIBLE); s3d_flags_on(tail, S3D_OF_VISIBLE); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/linetest.c000066400000000000000000000030611361325167000157750ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include /* NULL*/ #include /* sleep() */ #include "example.h" /* S3DUNUSED */ static int i; static int o; static int stop(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } static void mainloop(void) { i = (i + 1) % 2; if (i) { s3d_pep_vertex(o, 1, -2, 0); s3d_pep_line(o, 0, 2, 3); } else { s3d_pep_vertex(o, 1, -1, 0); s3d_pep_line(o, 0, 1, 0); } /* printf("now it's %s\n",time_str); */ sleep(1); } int main(int argc, char **argv) { i = 0; if (!s3d_init(&argc, &argv, "linetest")) { o = s3d_new_object(); s3d_push_material(o, 1, 0, 0, 1, 0, 0, 1, 0, 0); s3d_push_material(o, 0, 1, 0, 0, 1, 0, 0, 1, 0); s3d_push_material(o, 0, 1, 0, 0, 1, 0, 0, 1, 0); s3d_push_material(o, 1, 1, 0, 1, 1, 0, 1, 1, 0); s3d_push_vertex(o, -1, -1, 0); s3d_push_vertex(o, -1, 1, 0); s3d_push_vertex(o, 1, 1, 0); s3d_push_vertex(o, 1, -1, 0); s3d_push_line(o, 2, 3, 1); s3d_push_line(o, 0, 1, 0); s3d_flags_on(o, S3D_OF_VISIBLE); s3d_set_callback(S3D_EVENT_OBJ_CLICK, (s3d_cb)stop); s3d_set_callback(S3D_EVENT_QUIT, (s3d_cb)stop); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/modelloader.c000066400000000000000000000017301361325167000164360ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL */ #include /* nanosleep() */ #include "example.h" /* S3DUNUSED */ static struct timespec t = { 0, 100*1000*1000 }; /* 100 mili seconds */ static int i, oid; static void mainloop(void) { s3d_rotate(oid, 0, (float)i, 0); i = (i + 1) % 360; nanosleep(&t, NULL); } static int object_click(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } int main(int argc, char **argv) { if (argc < 2) { printf("usage: %s [somefile.3ds]\n", argv[0]); return -1; } if (!s3d_init(&argc, &argv, "modelloader")) { s3d_set_callback(S3D_EVENT_OBJ_CLICK, object_click); i = 0; if (-1 != (oid = s3d_import_model_file(argv[1]))) { s3d_flags_on(oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_mainloop(mainloop); } else { printf("file not found ... \n"); } s3d_quit(); } return 0; } s3d-0.2.2.1/example/nichtsnutz.c000066400000000000000000000051051361325167000163600ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include #include #include #include static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ static int object, foll; static float al, r, alpha = 0.0, angle; static float CamPosition[2][3], TmpMove[3], Tmp[3], RotCam[2][3], CatPos[3]; static float length; static void mainloop(void) { al = (alpha * (float)M_PI / 180.f); r = 5.0f; CatPos[0] = sinf(al) * r; CatPos[1] = 0; CatPos[2] = cosf(al) * r; s3d_translate(object, CatPos[0] , CatPos[1], CatPos[2]); s3d_rotate(object, 0, alpha, 0); alpha = alpha + 0.1f; if (alpha > 360.0f) alpha = 0.0f; length = s3d_vector_length(CatPos); RotCam[0][0] = (CatPos[0] * 12.0f) / length; RotCam[0][1] = (CatPos[1] * 12.0f) / length; RotCam[0][2] = (CatPos[2] * 12.0f) / length; if (foll) { CamPosition[0][0] = ((CamPosition[0][0] * 4 + RotCam[0][0]) / 5); CamPosition[0][1] = ((CamPosition[0][1] * 4 + RotCam[0][1]) / 5); CamPosition[0][2] = ((CamPosition[0][2] * 4 + RotCam[0][2]) / 5); s3d_translate(0, CamPosition[0][0], CamPosition[0][1], CamPosition[0][2]); TmpMove[0] = 0.0; TmpMove[1] = 0.0; TmpMove[2] = -1.0; Tmp[0] = CamPosition[0][0] - CatPos[0]; Tmp[1] = 0.0; Tmp[2] = CamPosition[0][2] - CatPos[2]; angle = s3d_vector_angle(Tmp, TmpMove); angle = (CatPos[0] > 0) ? (180.f - (180.f / (float)M_PI * angle)) : (180.f + (180.f / (float)M_PI * angle)); printf("%f %f\n", angle, al); CamPosition[1][1] = (CamPosition[1][1] * 4 + angle) / 5; s3d_rotate(0, CamPosition[1][0], CamPosition[1][1], CamPosition[1][2]); } nanosleep(&t, NULL); } static int object_info(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; if (inf->object == 0) { CamPosition[0][0] = inf->trans_x; CamPosition[0][1] = inf->trans_y; CamPosition[0][2] = inf->trans_z; CamPosition[1][0] = inf->rot_x; CamPosition[1][1] = inf->rot_y; CamPosition[1][2] = inf->rot_z; } return 0; } static int keypress(struct s3d_evt *event) { int key; key = *((unsigned short *)event->buf); switch (key) { default: ; } return 0; } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "running cat")) { s3d_set_callback(S3D_EVENT_KEY, keypress); s3d_set_callback(S3D_EVENT_OBJ_INFO, object_info); object = s3d_import_model_file("objs/katze_body.3ds"); s3d_flags_on(object, S3D_OF_VISIBLE); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/ptrtest.c000066400000000000000000000043651361325167000156630ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include /* NULL*/ #include /* nanosleep() */ #include /* sin(), cos() */ #include "example.h" /* S3DUNUSED */ static int o; static float asp = 1.0; static float len = 1.0; static int alpha = 0; static struct timespec t = { 0, 10*1000*1000 }; /* 100 mili seconds */ static int stop(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } static void mainloop(void) { float a; alpha = (alpha + 1) % 360; s3d_rotate(o, (float)alpha, 0.f, 0.f); a = (((float)alpha) * (float)M_PI / 180.f); s3d_translate(0.f, sinf(a)*30.f, 0.f, 30.f + cosf(a)*30.f); s3d_rotate(0, sinf(a)*30.f, (float)alpha, 0.f); nanosleep(&t, NULL); } static int object_info(struct s3d_evt *hrmz) { struct s3d_obj_info *inf; inf = (struct s3d_obj_info *)hrmz->buf; if (inf->object == 0) { if (asp != inf->scale) { asp = inf->scale; printf("screen aspect: %f\n", asp); } } if (inf->object == 1) { /* of course, a link s3d_link(o,1 would be much easier ... */ s3d_translate(o, (inf->trans_x)*2.0f, (inf->trans_y)*2.0f, -2); } return 0; } static int mbutton_press(struct s3d_evt *hrmz) { struct s3d_but_info *inf; char s[256]; inf = (struct s3d_but_info *)hrmz->buf; snprintf(s, 256, "please, watch your stomach! button %d, state %d", inf->button, inf->state); printf("button %d, state %d\n", inf->button, inf->state); s3d_del_object(o); o = s3d_draw_string(s, &len); s3d_translate(o, 0, 0, -2); s3d_scale(o, 0.2); s3d_link(o, 0); /* link to cam */ /* s3d_link(o,1);*/ s3d_flags_on(o, S3D_OF_VISIBLE); return 0; } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "ptr and cam test")) { s3d_set_callback(S3D_EVENT_OBJ_INFO, object_info); s3d_set_callback(S3D_EVENT_MBUTTON, mbutton_press); s3d_set_callback(S3D_EVENT_QUIT, stop); s3d_set_callback(S3D_EVENT_OBJ_CLICK, stop); s3d_select_font("vera"); o = s3d_draw_string("hello", &len); s3d_translate(o, 0, 0, -2); s3d_link(o, 0); /* link to cam */ /* s3d_link(o,1);*/ s3d_scale(o, 0.2); s3d_flags_on(o, S3D_OF_VISIBLE); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/radius_test.c000066400000000000000000000027671361325167000165100ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL */ #include /* nanosleep() */ static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ #include /* sin(), cos() */ static int item1, item2, item3; static int i = 0; static void mainloop(void) { float f, g, h; f = sinf(((float)M_PI * (i % 360)) / 180.0f); g = cosf(((float)M_PI * (i % 360)) / 180.0f); h = sinf(((float)M_PI * ((3 * i) % 360)) / 180.0f); s3d_translate(item1, f*10, h*2, g*5); s3d_rotate(item1, 0, (float)(i % 360), 0); /* s3d_scale(item1,h+3,h+3,h+3);*/ /* s3d_translate(item2,f*10,0, g*5);*/ s3d_translate(item2, 0, 0, 10); /* s3d_rotate(item2,i%360,0,-i%360); s3d_scale(item2,2*f+5,2*f+5,2*f+5);*/ s3d_translate(item3, 0, 0, 10); /* s3d_rotate(item3,((8*i)%360),0,-((8*i)%360)); s3d_scale(item3,2*f+5,2*f+5,2*f+5);*/ i++; nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "radius test")) { item1 = s3d_import_model_file("objs/cubeyholes.3ds"); item2 = s3d_import_model_file("objs/folder.3ds"); s3d_select_font("vera"); item3 = s3d_draw_string("radius test", NULL); s3d_link(item2, item1); s3d_link(item3, item2); s3d_flags_on(item1, S3D_OF_VISIBLE); s3d_flags_on(item2, S3D_OF_VISIBLE); s3d_flags_on(item3, S3D_OF_VISIBLE); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/s3dclock.c000066400000000000000000000036711361325167000156620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL, sprintf() */ #include /* nanosleep(), struct tm, time_t... */ #include /* strlen() */ #include "example.h" /* S3DUNUSED */ static struct timespec t = { 0, 100*1000*1000 }; /* 100 mili seconds */ static int big_p, lil_p, bg, sec_p; static int str_oid = -1, o_str_oid; static struct tm *mytime; static time_t now, onow; static char time_str[256]; static int stop(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } static void mainloop(void) { onow = now; now = time(NULL); if (now != onow) { o_str_oid = str_oid; mytime = localtime(&now); s3d_rotate(lil_p, 0, 0, -((mytime->tm_hour % 12) / 12.0f)*360.0f); s3d_rotate(big_p, 0, 0, -(mytime->tm_min / 60.0f)*360.0f); s3d_rotate(sec_p, 0, 0, -(mytime->tm_sec / 60.0f)*360.0f); sprintf(time_str, "%02d:%02d:%02d", mytime->tm_hour, mytime->tm_min, mytime->tm_sec); str_oid = s3d_draw_string(time_str, NULL); s3d_translate(str_oid, -1, -1.3, 0); s3d_scale(str_oid, 0.5); s3d_flags_on(str_oid, S3D_OF_VISIBLE); if (str_oid != -1) s3d_del_object(o_str_oid); } /* printf("now it's %s\n",time_str); */ nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "clock")) { lil_p = s3d_import_model_file("objs/lil_p.3ds"); big_p = s3d_import_model_file("objs/big_p.3ds"); sec_p = s3d_import_model_file("objs/sec_p.3ds"); bg = s3d_import_model_file("objs/clock_bg.3ds"); s3d_flags_on(big_p, S3D_OF_VISIBLE); s3d_flags_on(lil_p, S3D_OF_VISIBLE); s3d_flags_on(sec_p, S3D_OF_VISIBLE); s3d_flags_on(bg, S3D_OF_VISIBLE); s3d_select_font("vera"); s3d_set_callback(S3D_EVENT_OBJ_CLICK, (s3d_cb)stop); s3d_set_callback(S3D_EVENT_QUIT, (s3d_cb)stop); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/snowman.c000066400000000000000000000027441361325167000156370ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* sin() */ #include /* nanosleep() */ static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ static int a; static int oid_head; static int oid_middle; static int oid_foot; static void mainloop(void) { float pos; a = (a + 3) % 360; pos = sinf((a * (float)M_PI) / 180.f) * 5.f; if (pos < 0) pos *= -1; s3d_rotate(oid_head, 0, (float)a, 0); s3d_rotate(oid_middle, 0, (float)a, 0); s3d_rotate(oid_foot, 0, (float)a, 0); s3d_translate(oid_head, 0, 1.5f + 2.0f*pos, 0); s3d_translate(oid_middle, 0, 0 + 1.25f*pos, 0); s3d_translate(oid_foot, 0, -2 + 1.00f*pos, 0); nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "snowman")) { oid_head = s3d_import_model_file("objs/snow_head.3ds"); oid_middle = s3d_import_model_file("objs/snow_body.3ds"); oid_foot = s3d_import_model_file("objs/snow_foot.3ds"); /* s3d_link(oid_foot,oid_head); * s3d_link(oid_middle,oid_head); * s3d_translate(oid_head,0,4,0); * s3d_translate(oid_middle,0,-1.5,0); * relative to head: * * s3d_translate(oid_foot,0,-3.5,0); */ s3d_scale(oid_middle, 1.25); s3d_scale(oid_foot, 1.5); s3d_flags_on(oid_head, S3D_OF_VISIBLE); s3d_flags_on(oid_middle, S3D_OF_VISIBLE); s3d_flags_on(oid_foot, S3D_OF_VISIBLE); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/strtest.c000066400000000000000000000020101361325167000156470ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL*/ #include /* sleep() */ #include "example.h" /* S3DUNUSED */ static int o; static int stop(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } static void mainloop(void) { /* printf("now it's %s\n",time_str); */ sleep(1); } int main(int argc, char **argv) { char c[256]; int i; if (!s3d_init(&argc, &argv, "strtest")) { s3d_select_font("vera"); /* o=s3d_draw_string("The lazy fox is bored enough to jump over everything it sees. weird, isn't it?!",NULL); */ for (i = 0; i < 256; i++) c[255-i] = (char)i; o = s3d_draw_string(c, NULL); /* o=s3d_draw_string("A",NULL);*/ s3d_flags_on(o, S3D_OF_VISIBLE); s3d_set_callback(S3D_EVENT_OBJ_CLICK, (s3d_cb)stop); s3d_set_callback(S3D_EVENT_QUIT, (s3d_cb)stop); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/texturetest.c000066400000000000000000000036521361325167000165540ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL */ #include /* malloc(),free() */ #include /* nanosleep() */ static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili seconds */ static int i, oid; static void mainloop(void) { i = (i + 1) % 360; s3d_rotate(oid, 0, (float)i, 0); nanosleep(&t, NULL); } #define MAXX 24 #define MAXY 24 int main(int argc, char **argv) { unsigned int x, y; unsigned char *data; if (!s3d_init(&argc, &argv, "texturetest")) { data = (unsigned char *)malloc(MAXX * MAXY * 4); oid = s3d_new_object(); s3d_push_vertex(oid, -1, -1, 0); s3d_push_vertex(oid, 1, -1, 0); s3d_push_vertex(oid, 1, 1, 0); s3d_push_vertex(oid, -1, 1, 0); s3d_push_material_a(oid, 0.8, 0.0, 0.0 , 1.0, 1.0, 1.0, 1.0 , 1.0, 0.8, 0.0, 0.0 , 1.0); s3d_push_polygon(oid, 0, 1, 2, 0); s3d_pep_polygon_tex_coord(oid, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0); s3d_push_polygon(oid, 0, 2, 3, 0); s3d_pep_polygon_tex_coord(oid, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0); s3d_translate(oid, 0, 0, -5); for (y = 0; y < MAXY; y++) for (x = 0; x < MAXX; x++) { data[(y*MAXX+x)*4+0] = (char)((x * 255) / MAXX); data[(y*MAXX+x)*4+1] = (char)((x * y) / (MAXX * MAXY)); data[(y*MAXX+x)*4+2] = (char)((y * 255) / MAXX); data[(y*MAXX+x)*4+3] = 255; } s3d_push_texture(oid, MAXX, MAXY); s3d_load_texture(oid, 0, 0, 0, MAXX, MAXY, data); /* push data on texture 0 position (0,0) */ free(data); s3d_pep_material_texture(oid, 0); /* assign texture 0 to material 0 */ s3d_flags_on(oid, S3D_OF_VISIBLE); i = 0; s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/example/widgets.c000066400000000000000000000105711361325167000156200ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include /* NULL */ #include /* nanosleep() */ #include /* free() */ #include /* strlen() */ #include "example.h" static s3dw_surface *surface; static s3dw_input *input; static struct timespec t = { 0, 33*1000*1000 }; /* 33 mili seconds */ static void mainloop(void) { /* keep this in your mainloop. this will do smooth animations for you ... */ s3dw_ani_mate(); nanosleep(&t, NULL); } /* you should always put the s3dw-handler in your own event handler, * if you want s3dw to react on clicks or keys ... and i'm sure you * want that ... */ static int click(struct s3d_evt *evt) { return s3dw_handle_click(evt); } static void key_button(s3dw_widget *button) { s3dw_delete(button->parent); /* parent =surface. this means close containing window */ } static int key(struct s3d_evt *evt) { struct s3d_key_event *key = (struct s3d_key_event *)evt->buf; char string[8]; s3dw_surface *miniwin; s3dw_button *button; s3dw_handle_key(evt); /* okay, that's a little bit insane ... ;) * we create some little windows with the actual key pressed. */ if (key->unicode != 0) { miniwin = s3dw_surface_new("Key", 6, 6); sprintf(string, "%c", key->unicode); s3dw_label_new(miniwin, string, 1, 2); button = s3dw_button_new(miniwin, "OK", 2, 4); /* clicking on the button will exit ... */ button->onclick = key_button; /* of couse, show it */ s3dw_show(S3DWIDGET(miniwin)); } return 0; } static void done_button(s3dw_widget *S3DUNUSED(dummy)) { s3d_quit(); } static void okay_button(s3dw_widget *S3DUNUSED(dummy)) { s3dw_button *button; char string[32]; char *age; /* get the input of the text ... before its destroyed, of course*/ age = s3dw_input_gettext(input); /* delete the old surface with it subwidgets */ s3dw_delete(S3DWIDGET(surface)); /* and create a new one ... */ surface = s3dw_surface_new("Ah!", 10, 7); /* just cutting the string if it's too long */ if (strlen(age) > 8) age[8] = 0; /* assemble the string ..*/ sprintf(string, "I see, %s!!", age); s3dw_label_new(surface, string, 1, 2); button = s3dw_button_new(surface, "Great", 4, 4); /* clicking on the button will exit ... */ button->onclick = done_button; /* of couse, show it */ s3dw_show(S3DWIDGET(surface)); /* we don't need it anymore. always free strings, don't leak around */ free(age); } static void no_button(s3dw_widget *S3DUNUSED(dummy)) { s3dw_button *button; s3dw_delete(S3DWIDGET(surface)); surface = s3dw_surface_new("Well ...", 10, 7); s3dw_label_new(surface, "If you don't want to tell me ...", 1, 2); button = s3dw_button_new(surface, "Bye", 4, 4); /* clicking on the button will exit ... */ button->onclick = done_button; /* of couse, show it */ s3dw_show(S3DWIDGET(surface)); } static const char *text = "okay\nn2\n3\nfooobarfooobar ...\noh no\n its too loooong\n"; int main(int argc, char **argv) { s3dw_button *button; if (!s3d_init(&argc, &argv, "widgettest")) { s3d_set_callback(S3D_EVENT_OBJ_CLICK, click); s3d_set_callback(S3D_EVENT_KEY, key); s3d_set_callback(S3D_EVENT_OBJ_INFO, s3dw_object_info); /* this creates the "window" */ surface = s3dw_surface_new("Hello World", 20, 20); /* put a label (which is simply text) at position x=1, y=2 */ s3dw_label_new(surface, "How old are you?", 1, 2); /* put an input box right below. we grab the pointer because we want to focus it (need for reference) */ input = s3dw_input_new(surface, 8, 1, 4); /* we want the input-field be focused on our widget */ s3dw_focus(S3DWIDGET(input)); /* create the okay button */ button = s3dw_button_new(surface, "OK", 1, 7); /* define the callback when the button is clicked. in our case, okay_button() will handle the event */ button->onclick = okay_button; /* another button */ button = s3dw_button_new(surface, "Won't tell you", 10, 7); /* we will tell him how sad we are ... */ button->onclick = no_button; /* create some textbox at (1,10) widh width 18 and height 8 */ s3dw_textbox_new(surface, text, 1, 10, 18, 8); /* this widget is focused (of course, it's our only one ... */ s3dw_focus(S3DWIDGET(surface)); /* show it. without showing, things would be boring... */ s3dw_show(S3DWIDGET(surface)); s3d_mainloop(mainloop); s3d_quit(); } return 0; } s3d-0.2.2.1/example/wiresphere.c000066400000000000000000000055761361325167000163400ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include #include /* NULL, sprintf() */ #include /* nanosleep() */ #include /* M_PI, cos(), sin() */ #include /* malloc(), free() */ #include "example.h" /* S3DUNUSED */ static struct timespec t = { 0, 100*1000*1000 }; /* 100 mili seconds */ static int oid; static int r; static int wire_sphere(int slices, int stacks) { int x, y, i, o; unsigned int num_v, num_l; float *v, *n; /* vertices, normals */ float alpha, beta; unsigned int *l; /* lines */ num_v = (stacks + 1) * slices; num_l = stacks * slices + (stacks - 1) * slices; /* vertical + horizontal */ v = (float*)malloc(sizeof(float) * 3 * num_v); n = (float*)malloc(sizeof(float) * 6 * num_l); l = (unsigned int*)malloc(sizeof(unsigned int) * 3 * num_l); i = 0; for (x = 0; x < slices; x++) { alpha = (x * 360.0f / slices) * (float)M_PI / 180.0f; for (y = 0; y < (stacks + 1); y++) { beta = ((y * 180 / slices) - 90.0f) * (float)M_PI / 180.0f; v[i*3+0] = cosf(alpha) * cosf(beta); v[i*3+1] = sinf(beta); v[i*3+2] = sinf(alpha) * cosf(beta); i++; } } i = 0; for (x = 0; x < slices; x++) { for (y = 0; y < stacks; y++) { if ((y != 0) && (y != stacks)) { /* no horizontal lines at the poles */ l[i*3+0] = (x * (stacks + 1)) + y; l[i*3+1] = (((x + 1) % slices) * (stacks + 1)) + y; l[i*3+2] = 0; n[i*6+0] = v[ l[i*3+0] * 3 + 0]; n[i*6+1] = v[ l[i*3+0] * 3 + 1]; n[i*6+2] = v[ l[i*3+0] * 3 + 2]; n[i*6+3] = v[ l[i*3+1] * 3 + 0]; n[i*6+4] = v[ l[i*3+1] * 3 + 1]; n[i*6+5] = v[ l[i*3+1] * 3 + 2]; i++; } /* vertical lines */ l[i*3+0] = (x * (stacks + 1)) + y; l[i*3+1] = (x * (stacks + 1)) + y + 1; l[i*3+2] = 0; n[i*6+0] = v[ l[i*3+0] * 3 + 0]; n[i*6+1] = v[ l[i*3+0] * 3 + 1]; n[i*6+2] = v[ l[i*3+0] * 3 + 2]; n[i*6+3] = v[ l[i*3+1] * 3 + 0]; n[i*6+4] = v[ l[i*3+1] * 3 + 1]; n[i*6+5] = v[ l[i*3+1] * 3 + 2]; i++; } } o = s3d_new_object(); s3d_push_material(o, 0, 0, 1, 1, 0, 0, 0, 1, 0); s3d_push_vertices(o, v, (uint16_t)num_v); s3d_push_lines(o, l, (uint16_t)num_l); s3d_load_line_normals(o, n, 0, (uint16_t)num_l); free(v); free(n); free(l); return o; } static int stop(struct s3d_evt *S3DUNUSED(evt)) { s3d_quit(); return 0; } static void mainloop(void) { r = (r + 1) % 360; s3d_rotate(oid, 0, (float)r, 0); nanosleep(&t, NULL); } int main(int argc, char **argv) { if (!s3d_init(&argc, &argv, "wiresphere")) { oid = wire_sphere(30, 30); s3d_scale(oid, 10); s3d_flags_on(oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_set_callback(S3D_EVENT_OBJ_CLICK, (s3d_cb)stop); s3d_set_callback(S3D_EVENT_QUIT, (s3d_cb)stop); s3d_mainloop(mainloop); /* wait for some object to be clicked */ s3d_quit(); } return 0; } s3d-0.2.2.1/extras/000077500000000000000000000000001361325167000136555ustar00rootroot00000000000000s3d-0.2.2.1/extras/mplayer/000077500000000000000000000000001361325167000153265ustar00rootroot00000000000000s3d-0.2.2.1/extras/mplayer/README000066400000000000000000000006171361325167000162120ustar00rootroot00000000000000INSTALL ------- 1. install the client library (or the whole s3d package) 2. go into your mplayer-source directory 3. use $ patch -p1 < /path/to/mplayer.1.0pre7try2.s3d.patch to patch the source 4. do ./configure In the summary, you should see "s3d" in the "Enabled optional drivers", "Video Output" 5. install mplayer and watch videos like this: mplayer -vo s3d movie.mpg 6. enjoy ;) s3d-0.2.2.1/extras/mplayer/mplayer.1.0pre7try2.s3d.patch000066400000000000000000000274071361325167000224360ustar00rootroot00000000000000SPDX-License-Identifier: BSD-3-Clause SPDX-FileCopyrightText: 2007-2015 Simon Wunderlich diff -Naur MPlayer-1.0pre7try2/configure MPlayer-1.0pre7try2.s3d/configure --- MPlayer-1.0pre7try2/configure 2005-04-13 13:46:35.000000000 +0200 +++ MPlayer-1.0pre7try2.s3d/configure 2006-06-10 18:37:34.000000000 +0200 @@ -234,6 +234,7 @@ --disable-vidix disable VIDIX [enable on x86 *nix] --enable-gl build with OpenGL render support [autodetect] --enable-dga[=n] build with DGA [n in {1, 2} ] support [autodetect] + --enable-s3d build with s3d support [autodetect] --enable-vesa build with VESA support [autodetect] --enable-svga build with SVGAlib support [autodetect] --enable-sdl build with SDL render support [autodetect] @@ -1288,6 +1289,7 @@ _mencoder=yes _x11=auto _dga=auto # 1 2 no auto +_s3d=auto _xv=auto _xvmc=no #auto when complete _sdl=auto @@ -1444,6 +1446,8 @@ --disable-xvmc) _xvmc=no ;; --enable-sdl) _sdl=yes ;; --disable-sdl) _sdl=no ;; + --enable-s3d) _s3d=yes ;; + --disable-s3d) _s3d=no ;; --enable-directx) _directx=yes ;; --disable-directx) _directx=no ;; --enable-win32waveout) _win32waveout=yes ;; @@ -3798,6 +3802,27 @@ fi echores "$_aa" +echocheck "s3d" +if test "$_s3d" = auto ; then + cat > $TMPC << EOF +#include +int main(int argc, char **argv) { s3d_init( &argc, &argv, "mplayer_test"); s3d_quit(); return 0; } +EOF + _s3d=no + cc_check -ls3d && _s3d=yes +fi +if test "$_s3d" = yes ; then + _def_s3d='#define HAVE_S3D 1' + _ld_s3d='-ls3d' + _vosrc="$_vosrc vo_s3d.c" + _vomodules="s3d $_vomodules" +else + _def_aa='#undef HAVE_S3D' + _novomodules="s3d $_novomodules" +fi +echores "$_s3d" + + echocheck "CACA" if test "$_caca" = auto ; then @@ -6769,6 +6794,7 @@ SDL_LIB = $_ld_sdl SVGA_LIB = $_ld_svga AA_LIB = $_ld_aa +S3D_LIB = $_ld_s3d CACA_INC = $_inc_caca CACA_LIB = $_ld_caca @@ -7484,6 +7510,7 @@ $_def_vesa $_def_xdpms $_def_aa +$_def_s3d $_def_caca $_def_tga $_def_toolame diff -Naur MPlayer-1.0pre7try2/libvo/video_out.c MPlayer-1.0pre7try2.s3d/libvo/video_out.c --- MPlayer-1.0pre7try2/libvo/video_out.c 2004-12-21 21:33:51.000000000 +0100 +++ MPlayer-1.0pre7try2.s3d/libvo/video_out.c 2006-06-10 18:37:34.000000000 +0200 @@ -84,6 +84,7 @@ extern vo_functions_t video_out_png; extern vo_functions_t video_out_ggi; extern vo_functions_t video_out_aa; +extern vo_functions_t video_out_s3d; extern vo_functions_t video_out_caca; extern vo_functions_t video_out_mpegpes; extern vo_functions_t video_out_yuv4mpeg; @@ -192,6 +193,9 @@ #ifdef HAVE_AA &video_out_aa, #endif +#ifdef HAVE_S3D + &video_out_s3d, +#endif #ifdef HAVE_CACA &video_out_caca, #endif diff -Naur MPlayer-1.0pre7try2/libvo/vo_s3d.c MPlayer-1.0pre7try2.s3d/libvo/vo_s3d.c --- MPlayer-1.0pre7try2/libvo/vo_s3d.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre7try2.s3d/libvo/vo_s3d.c 2006-06-11 17:44:27.000000000 +0200 @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "video_out.h" +#include "video_out_internal.h" +#include "mp_msg.h" +#include "input/mouse.h" +#include "input/input.h" + +static vo_info_t info = +{ + "s3d video output", + "s3d", + "", + "" +}; + +LIBVO_EXTERN( s3d ) + +static uint32_t image_width, image_height; +static int int_pause; +static uint32_t oid; +static char *data2; + +//static uint32_t +static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) +{ +// int x2,y2; +// unsigned char *data; + // ignoring stride, as I don't know what it is O_o + mp_msg (MSGT_VO, MSGL_INFO, "[s3d] calling stride: %dx%d image at %dx%d\n",w,h,x,y); +/* data=*image; + for (y2=x;y20) + { + } else { + free(data2); + s3d_pop_texture(oid,1); + s3d_pop_vertex(oid,4); + } + aspect=((float) d_width)/((float) d_height); + s3d_push_vertex(oid,-3*aspect,-3,0); + s3d_push_vertex(oid, 3*aspect,-3,0); + s3d_push_vertex(oid, 3*aspect, 3,0); + s3d_push_vertex(oid,-3*aspect, 3,0); + +/* s3d_scale(oid,(((float) d_width)/((float) d_height)),1.0,1.0);*/ + data2=malloc(width*height*4); + memset(data2,128,width*height*4); + s3d_push_texture(oid,image_width,image_height); + mp_msg (MSGT_VO, MSGL_INFO,"[s3d] requesting a %d %d texture... \n",image_width,image_height); + mp_msg (MSGT_VO, MSGL_INFO,"[s3d] wanted size is %d %d... \n",d_width,d_height); + s3d_pep_material_texture(oid,0); // assign texture 0 to material 0 + return 0; +} + +static void +uninit(void) +{ + if (data2!=NULL) + free(data2); + s3d_quit(); +} + +#include "osdep/keycodes.h" +extern void mplayer_put_key(int code); + +static void check_events(void) +{ + s3d_net_check(); +} +#define shift_key (ki->modifier==(S3D_KMOD_LSHIFT||S3D_KMOD_RSHIFT)) +void s3dmp_key(struct s3d_evt *evt) +{ + struct s3d_key_event *ki=(struct s3d_key_event *)evt->buf; + switch (ki->keysym) + { + case S3DK_RETURN: mplayer_put_key(KEY_ENTER);break; + case S3DK_ESCAPE: mplayer_put_key(KEY_ESC);break; + case S3DK_q: mplayer_put_key('q');break; + case S3DK_F1: mplayer_put_key(KEY_F+1);break; + case S3DK_F2: mplayer_put_key(KEY_F+2);break; + case S3DK_F3: mplayer_put_key(KEY_F+3);break; + case S3DK_F4: mplayer_put_key(KEY_F+4);break; + case S3DK_F5: mplayer_put_key(KEY_F+5);break; + case S3DK_F6: mplayer_put_key(KEY_F+6);break; + case S3DK_F7: mplayer_put_key(KEY_F+7);break; + case S3DK_F8: mplayer_put_key(KEY_F+8);break; + case S3DK_F9: mplayer_put_key(KEY_F+9);break; + case S3DK_F10: mplayer_put_key(KEY_F+10);break; + case S3DK_F11: mplayer_put_key(KEY_F+11);break; + case S3DK_F12: mplayer_put_key(KEY_F+12);break; + /*case S3DK_o: mplayer_put_key('o');break; + case S3DK_SPACE: mplayer_put_key(' ');break; + case S3DK_p: mplayer_put_key('p');break;*/ + case S3DK_7: mplayer_put_key(shift_key?'/':'7'); + case S3DK_PLUS: mplayer_put_key(shift_key?'*':'+'); + case S3DK_KP_PLUS: mplayer_put_key('+');break; + case S3DK_MINUS: + case S3DK_KP_MINUS: mplayer_put_key('-');break; + case S3DK_TAB: mplayer_put_key('\t');break; + case S3DK_PAGEUP: mplayer_put_key(KEY_PAGE_UP);break; + case S3DK_PAGEDOWN: mplayer_put_key(KEY_PAGE_DOWN);break; + case S3DK_UP: mplayer_put_key(KEY_UP);break; + case S3DK_DOWN: mplayer_put_key(KEY_DOWN);break; + case S3DK_LEFT: mplayer_put_key(KEY_LEFT);break; + case S3DK_RIGHT: mplayer_put_key(KEY_RIGHT);break; + case S3DK_LESS: mplayer_put_key(shift_key?'>':'<'); break; + case S3DK_GREATER: mplayer_put_key('>'); break; + case S3DK_ASTERISK: + case S3DK_KP_MULTIPLY: mplayer_put_key('*'); break; + case S3DK_SLASH: + case S3DK_KP_DIVIDE: mplayer_put_key('/'); break; + case S3DK_KP0: mplayer_put_key(KEY_KP0); break; + case S3DK_KP1: mplayer_put_key(KEY_KP1); break; + case S3DK_KP2: mplayer_put_key(KEY_KP2); break; + case S3DK_KP3: mplayer_put_key(KEY_KP3); break; + case S3DK_KP4: mplayer_put_key(KEY_KP4); break; + case S3DK_KP5: mplayer_put_key(KEY_KP5); break; + case S3DK_KP6: mplayer_put_key(KEY_KP6); break; + case S3DK_KP7: mplayer_put_key(KEY_KP7); break; + case S3DK_KP8: mplayer_put_key(KEY_KP8); break; + case S3DK_KP9: mplayer_put_key(KEY_KP9); break; + case S3DK_KP_PERIOD: mplayer_put_key(KEY_KPDEC); break; + case S3DK_KP_ENTER: mplayer_put_key(KEY_KPENTER); break; + default: + mplayer_put_key(ki->keysym); + break; + + } + +} +int mbutton; +void s3dmp_mbutton(struct s3d_evt *evt) +{ + struct s3d_but_info *bi=(struct s3d_but_info *)evt->buf; + mbutton=-1; + if ((bi->state==0) && (!vo_nomouse_input)) + mbutton=bi->button; +} +void s3dmp_obj_click(struct s3d_evt *evt) +{ + uint32_t coid=*((uint32_t *)evt->buf); + if (coid==oid) + { + mplayer_put_key(MOUSE_BASE+mbutton-1); + } + mbutton=-1; +} + + + + +static uint32_t preinit(const char *arg) +{ + int argc=0; + char *arg1=NULL; + char **argv=&arg1; + mp_msg (MSGT_VO, MSGL_INFO, "[s3d] hello, i'm initing - darn it!\n"); + mbutton=-1; + s3d_set_callback(S3D_EVENT_MBUTTON,s3dmp_mbutton); + s3d_set_callback(S3D_EVENT_OBJ_CLICK,s3dmp_obj_click); + s3d_set_callback(S3D_EVENT_KEY,s3dmp_key); + + if (s3d_init(&argc,&argv,"mplayer")) + { + mp_msg (MSGT_VO, MSGL_WARN, "[s3d] sorry, can't reach server.\n"); + return ENOSYS; + } + oid=s3d_new_object(); + s3d_push_vertex(oid,-3,-3,0); + s3d_push_vertex(oid, 3,-3,0); + s3d_push_vertex(oid, 3, 3,0); + s3d_push_vertex(oid,-3, 3,0); + s3d_push_material_a(oid, + 0.0, 0.0, 0.8 ,1.0, + 1.0, 1.0, 1.0 ,1.0, + 0.0, 0.0, 0.8 ,1.0); + s3d_push_polygon(oid,0,2,1,0); + s3d_pep_polygon_tex_coord(oid, 0.0,1.0, + 1.0,0.0, + 1.0,1.0); + s3d_push_polygon(oid,0,3,2,0); + s3d_pep_polygon_tex_coord(oid, 0.0,1.0, + 0.0,0.0, + 1.0,0.0); + s3d_flags_on(oid,S3D_OF_VISIBLE); + if(arg) + { + mp_msg (MSGT_VO, MSGL_WARN, "[s3d] what should I do with this arg? \n"); + return ENOSYS; + } + return 0; +} + +static uint32_t +query_format(uint32_t format) +{ + if (format == IMGFMT_RGB24) + return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; + return 0; +} +static uint32_t control(uint32_t request, void *data, ...) +{ + switch (request) { + case VOCTRL_PAUSE: return (int_pause=1); + case VOCTRL_RESUME: return (int_pause=0); + case VOCTRL_QUERY_FORMAT: + return query_format(*((uint32_t*)data)); + } + return VO_NOTIMPL; +} diff -Naur MPlayer-1.0pre7try2/Makefile MPlayer-1.0pre7try2.s3d/Makefile --- MPlayer-1.0pre7try2/Makefile 2005-04-16 22:18:12.000000000 +0200 +++ MPlayer-1.0pre7try2.s3d/Makefile 2006-06-10 18:37:34.000000000 +0200 @@ -30,7 +30,7 @@ OBJS_MENCODER = $(SRCS_MENCODER:.c=.o) OBJS_MPLAYER = $(SRCS_MPLAYER:.c=.o) -VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB) +VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB) $(S3D_LIB) AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB) $(POLYP_LIB) CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) COMMON_LIBS = libmpcodecs/libmpcodecs.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB) s3d-0.2.2.1/extras/swig/000077500000000000000000000000001361325167000146265ustar00rootroot00000000000000s3d-0.2.2.1/extras/swig/Makefile000066400000000000000000000011631361325167000162670ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Simon Wunderlich PYTHON_MOD=_s3d.so PERL_MOD=s3d.so MODS=$(PYTHON_MOD) $(PERL_MOD) default: all all: $(MODS) python: $(PYTHON_MOD) perl: $(PERL_MOD) $(PYTHON_MOD): s3d.i swig -python s3d.i gcc -fPIC -c s3d_wrap.c `python-config --cflags` gcc -shared s3d_wrap.o -ls3d -o $(PYTHON_MOD) `python-config --ldflags` $(PERL_MOD): s3d.i swig -perl5 s3d.i gcc -fPIC -c s3d_wrap.c `perl -MExtUtils::Embed -e ccopts` ld -G s3d_wrap.o -lperl -ls3d -o $(PERL_MOD) clean: rm -f $(MODS) *.o s3d_wrap.c s3d.py s3d.pyc s3d.pm s3d-0.2.2.1/extras/swig/TODO000066400000000000000000000002111361325167000153100ustar00rootroot00000000000000- do something[tm] about the callbacks and structs - build some wrappers, remove s3d_ wrappers, we have proper namespaces in python/perl s3d-0.2.2.1/extras/swig/s3d.i000066400000000000000000000007111361325167000154700ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich %module s3d typedef unsigned int uint32_t; %inline %{ #include int s3dpy_init(char *name) { return s3d_init(NULL,NULL,name); } int s3dpy_draw_string(char *str) { return s3d_draw_string(str,NULL); } %} %{ #include #include %} %include "../../libs3d/s3d.h" %include "../../libs3d/s3d_keysym.h" s3d-0.2.2.1/extras/swig/s3d_test.pl000066400000000000000000000005601361325167000167140ustar00rootroot00000000000000#!/usr/bin/perl # SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2007-2015 Simon Wunderlich use s3d; if (0==s3d::s3dpy_init("hello perl")) { s3d::s3d_select_font("vera"); $o= s3d::s3dpy_draw_string("hello from perl"); print("object $o\n"); s3d::s3d_flags_on($o,$s3d::S3D_OF_VISIBLE); sleep(10); s3d::s3d_quit(); } s3d-0.2.2.1/extras/swig/s3d_test.py000066400000000000000000000005601361325167000167310ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8; -*- # SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2007-2015 Simon Wunderlich from s3d import * from time import sleep if 0 == s3dpy_init("hello world"): s3d_select_font("vera") o = s3dpy_draw_string("hello from python") s3d_flags_on(o, S3D_OF_VISIBLE) sleep(10) s3d_quit() s3d-0.2.2.1/libs3d/000077500000000000000000000000001361325167000135275ustar00rootroot00000000000000s3d-0.2.2.1/libs3d/CMakeLists.txt000066400000000000000000000026711361325167000162750ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include_directories(${s3d_SOURCE_DIR}/server) set(S3D_LIBRARY_DEPENDENCIES ${MATH_LIBRARIES} ${G3D_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${FREETYPE_LIBRARIES}) include(FilterPIE) add_library(s3d SHARED callback.c endian.c error.c event.c fontselect.c freetype.c io.c modelread.c network.c object_queue.c proto_in.c proto_out.c sei_construct.c sei_misc.c sei_monotone.c sei_tri.c shm.c shm_ringbuf.c tcp.c vector.c hash.c texture.c) target_link_libraries(s3d ${S3D_LIBRARY_DEPENDENCIES}) set_target_properties(s3d PROPERTIES VERSION ${VERSION} SOVERSION 2 LINK_INTERFACE_LIBRARIES "") include(${CMAKE_ROOT}/Modules/TestCXXAcceptsFlag.cmake) check_cxx_accepts_flag("-Wl,--version-script=${s3d_SOURCE_DIR}/libs3d/libs3d.ver" HAVE_LIBS3D_VERSIONSCRIPT) if (HAVE_LIBS3D_VERSIONSCRIPT) set_target_properties(s3d PROPERTIES LINK_FLAGS "-Wl,--version-script=${s3d_SOURCE_DIR}/libs3d/libs3d.ver") endif (HAVE_LIBS3D_VERSIONSCRIPT) # install install(TARGETS s3d RUNTIME DESTINATION "${BIN_INSTALL_DIR}" LIBRARY DESTINATION "${LIB_INSTALL_DIR}" ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" ) install(FILES s3d.h s3d_keysym.h DESTINATION "${INCLUDE_INSTALL_DIR}") #pkg config configure_file(libs3d.pc.cmake ${s3d_BINARY_DIR}/libs3d/libs3d.pc @ONLY) install(FILES ${s3d_BINARY_DIR}/libs3d/libs3d.pc DESTINATION "${PKGCFG_INSTALL_DIR}") s3d-0.2.2.1/libs3d/TODO000066400000000000000000000002271361325167000142200ustar00rootroot00000000000000TODO: - remove/correct libg3d error messages ... - key repeation - shmat() return (char *) -1 or NULL?! data_ctos/data_stoc should really not be 0x0 s3d-0.2.2.1/libs3d/callback.c000066400000000000000000000116511361325167000154330ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include /* for NULL */ #include /* for uint8_t */ #include "s3d.h" /* for s3d_cb, s3d_process_stack */ #include "s3dlib.h" /* for MAX_CB, S3DUNUSED */ static int _s3d_ignore(struct s3d_evt *evt); /* the s3d callback list */ /* i know it's ugly, but it's better to have ugly code somewhere than provoke * race conditions in the applications code */ #define S3D_CBNIL (s3d_cb)NULL s3d_cb s3d_cb_list[MAX_CB] = { S3D_CBNIL, _s3d_ignore, _s3d_ignore, _s3d_ignore, _s3d_ignore, _s3d_ignore, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, _s3d_ignore, _s3d_ignore, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, _s3d_ignore, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL, S3D_CBNIL }; /* the ignore-handler ;) */ static int _s3d_ignore(struct s3d_evt *S3DUNUSED(evt)) { /* do plain nothing */ return 0; } /** \brief sets a callback * * Sets a callback for a certain event. this is very useful for event-oriented * applications. event callbacks will not interrupt each other or the mainloop. * * \remarks Defining callbacks will only work after calling s3d_init() * * \code * #include * * void obj_click(struct s3d_evt event) * { * printf("object id %"PRIu32" got clicked", *((uint32_t *)event->buf)); * } * ... * s3d_set_callback(S3D_EVENT_NEW_OBJECT, obj_click); * // this will tell you when a object got clicked * \endcode */ void s3d_set_callback(uint8_t event, s3d_cb func) { s3d_cb_list[(int)event] = func; s3d_process_stack(); } /** \brief clears a callback * * Clears the callback which is associated with the event. */ void s3d_clear_callback(uint8_t event) { s3d_cb_list[(int)event] = S3D_CBNIL; } /** \brief ignores an event * * Sets the callback on ignore, that means it won't be queued up for later use. * An incoming event of this type will simply be skipped. */ void s3d_ignore_callback(uint8_t event) { s3d_set_callback(event, _s3d_ignore); } /** \brief get callback of event * * Returns the Callback-function of the event. * * \code * struct s3d_evt e; * ... * s3d_get_callback(S3D_EVENT_KEY)(e); * // will call the key-handling function with argument e. * \endcode */ s3d_cb s3d_get_callback(uint8_t event) { return s3d_cb_list[(int)event]; } s3d-0.2.2.1/libs3d/config.h000066400000000000000000000010311361325167000151400ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* use the global config.h */ #include /* this is definitly the better way to pick fonts. */ #define WITH_FONTCONFIG /* our level of debug messages */ /* #define DEBUG LOW */ /* standard debug level, should be set with compiler, e.g. -DDEBUG=LOW */ #define SHM_MAX_IDLE 200 /* maximum wait for server timeout */ #define SEI_SS 200 /* seidel algorithm maximum point number */ s3d-0.2.2.1/libs3d/endian.c000066400000000000000000000026131361325167000151330ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 S3D contributors */ #include /* for htonl, ntohl, htons, ntohs */ #include /* for uint32_t, uint16_t */ /* convert buffer with floats from host to network endianess */ void htonfb(float* netfloat, int num) { int i; for (i = 0; i < num; i++) { *(uint32_t*)&netfloat[i] = htonl(*(uint32_t*)&netfloat[i]); } } /* convert buffer with floats from network to host endianess */ void ntohfb(float* netfloat, int num) { int i; for (i = 0; i < num; i++) { *(uint32_t*)&netfloat[i] = ntohl(*(uint32_t*)&netfloat[i]); } } /* convert buffer with uint32_ts from host to network endianess */ void htonlb(uint32_t* netint32, int num) { int i; for (i = 0; i < num; i++) { netint32[i] = htonl(netint32[i]); } } /* convert buffer with uint32_ts from network to host endianess */ void ntohlb(uint32_t* netint32, int num) { int i; for (i = 0; i < num; i++) { netint32[i] = ntohl(netint32[i]); } } /* convert buffer with uint16_ts from host to network endianess */ void htonsb(uint16_t* netint16, int num) { int i; for (i = 0; i < num; i++) { netint16[i] = htons(netint16[i]); } } /* convert buffer with uint16_ts from network to host endianess */ void ntohsb(uint16_t* netint16, int num) { int i; for (i = 0; i < num; i++) { netint16[i] = ntohs(netint16[i]); } } s3d-0.2.2.1/libs3d/error.c000066400000000000000000000024421361325167000150260ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include /* for va_start, va_end, va_list */ #include /* for fprintf, stderr */ #include /* for strerror */ /* s3dprintf is only for internal use. */ #ifdef DEBUG void s3dprintf(int relevance, const char *fmt, ...) { char dbm[DBM_MAX]; va_list args; if (relevance >= DEBUG) { va_start(args, fmt); vsnprintf((char *)&dbm, DBM_MAX, fmt, args); va_end(args); fprintf(stderr, "s3dlib: %s\n", (char *)&dbm); } } void errdn(int relevance, const char *func, int en) { if (relevance >= DEBUG) fprintf(stderr, "s3dlib error: %s: (%d) %s\n", func, en, strerror(en)); } void errds(int relevance, const char *func, const char *fmt, ...) { char dbm[DBM_MAX]; va_list args; if (relevance >= DEBUG) { va_start(args, fmt); vsnprintf((char *)&dbm, DBM_MAX, fmt, args); va_end(args); fprintf(stderr, "s3dlib error: %s:%s\n", func, (char *)&dbm); } } #endif void errn(const char *func, int en) { fprintf(stderr, "s3dlib error: %s: (%d) %s\n", func, en, strerror(en)); } void errs(const char *func, const char *msg) { fprintf(stderr, "s3dlib error: %s: %s\n", func, msg); } s3d-0.2.2.1/libs3d/event.c000066400000000000000000000067011361325167000150200ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include /* for uint8_t */ #include /* for NULL, free */ #include "s3d.h" /* for s3d_evt, s3d_get_callback, etc */ #include "s3dlib.h" /* for s3dprintf, VLOW, etc */ static struct s3d_evt *s3d_stack; int cb_lock = 2; /* callback lock */ /** \brief push event onto stack * * Pushes an event onto the event-stack. Usually you don't need to do this * manually. */ void s3d_push_event(struct s3d_evt *newevt) { struct s3d_evt *p; s3d_cb cb; s3dprintf(VLOW, "pushed event %d, cb_lock = %d", newevt->event, cb_lock); /* this will always be called for S3D_EVENT_NEW_OBJECT!! */ if (newevt->event == S3D_EVENT_NEW_OBJECT) { _queue_new_object(*((unsigned int *)newevt->buf)); } if (cb_lock == 0) { /* no recursive event-callbacks, please! */ if (NULL != (cb = s3d_get_callback(newevt->event))) { cb_lock++; /* on our way! lock it.. */ cb(newevt); /* .. and call it! */ cb_lock--; /* okay, no new callbacks, unlock now. */ free(newevt); return; } } newevt->next = NULL; if (s3d_stack != NULL) { for (p = s3d_stack; p->next != NULL; p = p->next) { } /* go to the end */ p->next = newevt; } else s3d_stack = newevt; } /** \brief pop event from stack * * Pops the latest event from the stack. Don't forget to free() both the event * and its buffer! Returns a pointer to struct s3d_evt. */ struct s3d_evt *s3d_pop_event(void) { struct s3d_evt *ret; if ((ret = s3d_stack) != NULL) s3d_stack = s3d_stack->next; return ret; } /** \brief find eevnt on stack * * Finds the latest occurrence of an event, giving the event type as argument. * Returns a pointer to struct s3d_evt. */ struct s3d_evt *s3d_find_event(uint8_t event) { struct s3d_evt *p; p = s3d_stack; while (p != NULL) { if (p->event == event) return p; p = p->next; } return NULL; } /** \brief delete event from stack * * Deletes an event, the argument is the pointer to the event which is to be * deleted (maybe obtained from s3d_find_event). */ int s3d_delete_event(const struct s3d_evt *devt) { struct s3d_evt *previous = NULL; struct s3d_evt *next; struct s3d_evt *p = s3d_stack; while (p != NULL) { /* if ((p->event==devt->event) && (p->length==devt->length)) */ /* if (0==memcmp(p->buf,devt->buf)) */ next = p->next; if (p == devt) { if (p->length > 0) free(p->buf); if (previous == NULL) s3d_stack = p->next; /* the first element!! */ else previous->next = p->next; /* unlink */ free(p); } else { previous = p; } p = next; } return -1; } /** \brief process all events on stack * * This function goes through all function of the event-stack and will call * functions. this is useful when you define a new function but still have a lot * of events of this type on the stack. * * \deprecated This is probably obsolete */ void s3d_process_stack(void) { struct s3d_evt *p; s3d_cb cb; if (cb_lock > 0) { /* can't do that now. */ s3dprintf(VLOW, "cb_lock = %d, processing later", cb_lock); return; } s3dprintf(VLOW, "processing stack ..."); while (NULL != (p = s3d_pop_event())) { if ((cb = s3d_get_callback(p->event)) != NULL) { cb_lock++; cb(p); cb_lock--; } else { /* kick out unprocessed event */ } /* free */ if (p->length > 0) free(p->buf); free(p); } } s3d-0.2.2.1/libs3d/fontselect.c000066400000000000000000000053301361325167000160420ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* here we select our truetype font. I'd recommend the fontconfig way, */ /* as it always gives the best matching font. a xft version and a win32 */ /* version would be nice too, to be implemented :) */ #include "s3d.h" #include "s3dlib.h" #include /* dirent */ #include /* Display type, XOpenDisplay(), XCloseDIsplay etc. */ #ifdef WITH_FONTCONFIG #include "ft2build.h" #include FT_FREETYPE_H #include #endif #include /* malloc(), free() */ #include /* strlen(), strncasecmp(), strncmp() */ #ifdef WITH_FONTCONFIG char *s3d_findfont(const char *mask) { FcPattern *pattern = NULL, *match = NULL; FcChar8 *file = NULL; FcResult result; pattern = FcNameParse((FcChar8 *)mask); FcConfigSubstitute(NULL, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); s3dprintf(LOW, "Looking for font %s", mask); if (!(match = FcFontMatch(NULL, pattern, &result))) return NULL; if (FcPatternGetString(match, FC_FILE, 0, &file) != FcResultMatch) return NULL; return (char *)file; } #else /* this uses the xserver to get a font-path and scan it for ttf-fonts. */ /* if it matches, give it out ... it's not nice, right, and might not */ /* work on your place. */ char *s3d_findfont(const char *mask) { char **flist = NULL; int fnum = 0; char *disp = NULL; int n; char *fname; char *good = NULL; struct dirent **namelist; Display *dpy; dpy = XOpenDisplay(disp); /* Open display and check for success */ if (dpy == NULL) errds(VHIGH, "s3d_findfont()", "unable to open display %s", XDisplayName(disp)); else { if (!(flist = XGetFontPath(dpy, &fnum))) { errds(VHIGH, "s3d_findfont():XGetFontPath()", "unable to get font path."); } else while (fnum--) { /* now scan the directories */ n = scandir(flist[fnum], &namelist, 0, alphasort); while (n-- > 0) { fname = namelist[n]->d_name; if (strlen(fname) > (strlen(mask) + 3)) { /* there should be enough space for the .ttf ending */ /* check for the first n characters */ if (0 == strncasecmp(fname, mask, strlen(mask))) { /* name matches! now check for the end... */ if (0 == strncasecmp(fname + (strlen(fname) - 3), "ttf", 3)) { /* check if it has a ttf-ending */ if (good == NULL) good = malloc(256); strncpy(good, flist[fnum], 255); good[256] = 0; /* just in case */ strncat(good, fname, 255 - strlen(good)); if ((strlen(mask) + 4) == strlen(fname)) { return good; } } } } } } XCloseDisplay(dpy); } return good; } #endif s3d-0.2.2.1/libs3d/freetype.c000066400000000000000000000306721361325167000155260ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* this file should render truetype fonts as objects */ #include "s3d.h" #include "s3dlib.h" #include "sei_interface.h" /* sei_triangulate_polygon() */ #include /* malloc(), free() */ #include /* atan2() */ #include /* strncmp(), strncpy() */ #include "ft2build.h" #include FT_FREETYPE_H #undef __FTERRORS_H__ #define FT_ERRORDEF( e, v, s ) { e, s }, #define FT_ERROR_START_LIST { #define FT_ERROR_END_LIST { 0, 0 } }; static const struct { int err_code; const char* err_msg; } ft_errors[] = #include FT_ERRORS_H #ifndef CALLBACK #define CALLBACK #endif /* bad global vars ... */ static FT_Library library; static FT_Face face; static char *memory_font = NULL; /* the font file in memory */ static char oldfontpath[256]; static int memory_font_size = 0; /* and it's size, to reduce load times. */ static int ft_init = 0; static int face_init = 0; static struct t_buf tess_buf[256]; /* initialize truetype and tess_buf ... */ static int s3d_ft_init(void) { int error = FT_Init_FreeType(&library); int i; oldfontpath[0] = 0; if (error) return -1; ft_init = 1; for (i = 0; i < 256; i++) { tess_buf[i].vbuf = NULL; tess_buf[i].pbuf = NULL; } return 0; } static int s3d_ft_load_font(void) { FT_Error error; if ((memory_font == NULL) || (memory_font_size == 0)) { errds(HIGH, "s3d_ft_load_font()", "there is no font in memory, breaking"); return -1; } face_init = 0; error = FT_New_Memory_Face(library, (uint8_t *)memory_font, memory_font_size, 0, &face); if (error) { errds(VHIGH, "s3d_ft_load_font():FT_New_Memory_Face", "can't load font : (%d) %s", ft_errors[error].err_code, ft_errors[error].err_msg); return -1; } s3dprintf(LOW, "Load Font successful ..."); face_init = 1; return 0; } static int _s3d_clear_tessbuf(void) { int i; for (i = 0; i < 256; i++) { if (tess_buf[i].vbuf != NULL) free(tess_buf[i].vbuf); if (tess_buf[i].pbuf != NULL) free(tess_buf[i].pbuf); } for (i = 0; i < 256; i++) { tess_buf[i].vbuf = NULL; tess_buf[i].pbuf = NULL; } return 0; } /* renders a character with seidels algorithm and stores it in the tess_buf for later * usage */ static int _s3d_add_tessbuf(uint16_t a) { float norm, ar, xa, ya; int i, j, k, c, n, outl, s, e; int np, pos; int triangles[SEI_SS*2][3]; /* more than enough ... */ int ncontours, ncon; int cntr[SEI_SS]; int ncntr[SEI_SS]; int csta[SEI_SS], ncsta[SEI_SS]; int perm[SEI_SS]; float area[SEI_SS]; double vertices[SEI_SS+1][2]; double nvertices[SEI_SS+1][2]; FT_Error error; error = FT_Load_Char(face, a, FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE); if (error) { errds(VHIGH, "_s3d_add_tessbuf():FT_Load_Char()", "can't load character %d : (%d) %s", a, ft_errors[error].err_code, ft_errors[error].err_msg); return -1; } s3dprintf(VLOW, "[T]riangulating character %c", a); norm = 1.0 / face->glyph->metrics.vertAdvance; if ((face->glyph->outline.n_points > 0) && (face->glyph->outline.n_points < SEI_SS)) { tess_buf[a].vn = face->glyph->outline.n_points; tess_buf[a].vbuf = (float*)malloc(sizeof(float) * face->glyph->outline.n_points * 3); j = 0; ncontours = face->glyph->outline.n_contours; for (c = 0; c < ncontours; c++) { i = 0; ncon = face->glyph->outline.contours[c]; /* position of the end of ths contour */ cntr[c] = ncon - j + 1; /* how many points do we have here? */ csta[c] = j + 1; ar = 0.0f; while (j < (ncon + 1)) { /* vertices have reverse order in seidels algorithm, outer contours go anticlockwise, inner contours clockwise */ /* calculate the area */ k = ((j + 2 - csta[c]) % (cntr[c])) + csta[c] - 1; ar -= face->glyph->outline.points[j].x * face->glyph->outline.points[k].y; ar += face->glyph->outline.points[k].x * face->glyph->outline.points[j].y; pos = ncon - i; vertices[pos+1][0] = face->glyph->outline.points[j].x * norm; vertices[pos+1][1] = face->glyph->outline.points[j].y * norm; j++; i++; } ar = 0.5f * norm * norm * ar; s3dprintf(VLOW, "contour %d has area of %3.3f, cntr is %d, contour starts at %d, ncon %d", c, ar, cntr[c], csta[c], ncon); area[c] = ar; /* save the area */ } /* now as we have the areas and sizes of the contours, we need to order our contours so that * the outlines and their holes are grouped together */ n = ncontours; for (i = 0; i < n; i++) perm[i] = i; /* initialise permutation */ while (n != 0) { outl = -1; /* find an outline */ for (i = 0; i < n; i++) if (area[perm[i]] >= 0) { outl = i; /* found. that was easy ;) */ break; } if (outl == -1) { s3dprintf(HIGH, "hole without outline found, exiting ... %c", a); return -1; } for (i = 0; i < n; i++) { if (area[perm[i]] < 0) { /* test for a hole inside by taking one (the first) point of the hole and doing the test */ xa = vertices[csta[perm[i]]][0]; ya = vertices[csta[perm[i]]][1]; s = csta[perm[outl]]; /* start point of outline */ e = (csta[perm[outl]] + cntr[perm[outl]]) - 1; /* end point */ ar = 0; for (j = s; j < e; j++) { /* for all points of the outline, sum: */ ar += atan2((vertices[j+1][1] - ya) * (vertices[j][0] - xa) - (vertices[j+1][0] - xa) * (vertices[j][1] - ya), (vertices[j+1][0] - xa) * (vertices[j][0] - xa) + (vertices[j+1][1] - ya) * (vertices[j][1] - ya)); } /* dont forget the start/end-point connection*/ ar += atan2((vertices[s][1] - ya) * (vertices[e][0] - xa) - (vertices[s][0] - xa) * (vertices[e][1] - ya), (vertices[s][0] - xa) * (vertices[e][0] - xa) + (vertices[s][1] - ya) * (vertices[e][1] - ya)); if (fabsf(ar) > 1) /* if ar = 0.0, it's outside, elseway it's a multiple of pi. this check should be * very generous to roundoff errors */ { s3dprintf(VLOW, "hole %d (%d) in %d (%d): interior angle sum %f (n=%d)", i, perm[i], outl, perm[outl], ar, n); j = perm[n-1]; /* swap our hole to the end */ perm[n-1] = perm[i]; perm[i] = j; if (outl == n - 1) outl = i; /* outline got swapped */ n--; /* we don't care for the hole at the end anymore as it's found */ i--; /* check again for the just-swapped value in the next * loop iteration */ } } } /* all the holes should be behind n-i, if so, so we swap our outline to the end now */ j = perm[n-1]; /* swap our hole to the end */ perm[n-1] = perm[outl]; perm[outl] = j; n--; /* we don't care for the hole at the end anymore as it's found */ } /* finished the permutation, now apply the new order .... */ n = 1; for (c = 0; c < ncontours; c++) { ncsta[c] = n - 1; for (j = csta[perm[c]]; j < (csta[perm[c]] + cntr[perm[c]]); j++) { nvertices[n][0] = vertices[j][0]; nvertices[n][1] = vertices[j][1]; tess_buf[a].vbuf[(n-1)*3] = nvertices[n][0]; tess_buf[a].vbuf[(n-1)*3+1] = nvertices[n][1]; tess_buf[a].vbuf[(n-1)*3+2] = 0; n++; } ncntr[c] = cntr[perm[c]]; } n = 0; tess_buf[a].pbuf = (uint32_t*)malloc(sizeof(uint32_t) * 4 * (face->glyph->outline.n_points + 2 * face->glyph->outline.n_contours)); k = 0; for (c = ncontours - 1; c >= 0; c--) { n++; /* count out and inlines ... */ if (area[perm[c]] > 0) { /* outline? start! */ s3dprintf(VLOW, "[T]riangulation from outline %d (%d contours, area = %f)", perm[c], n, area[perm[c]]); np = sei_triangulate_polygon(n, ncntr + c, nvertices + (ncsta[c]), triangles); for (i = 0; i < np; i++) { tess_buf[a].pbuf[k*4] = triangles[i][0] + ncsta[c] - 1; tess_buf[a].pbuf[k*4+1] = triangles[i][2] + ncsta[c] - 1; tess_buf[a].pbuf[k*4+2] = triangles[i][1] + ncsta[c] - 1; tess_buf[a].pbuf[k*4+3] = 0; k++; } n = 0; } } tess_buf[a].pn = k; } tess_buf[a].xoff = 1.0 * face->glyph->metrics.horiAdvance * norm; return 0; } /* draws one charachter a */ static int _s3d_draw_tessbuf(int oid, uint16_t a, int *voff, float *xoff) { float *vbuf; uint32_t *pbuf; int i; if (!(tess_buf[a].vbuf && tess_buf[a].pbuf)) _s3d_add_tessbuf(a); /* only draw if it has some information in it */ if ((tess_buf[a].pn != 0) && (tess_buf[a].vn != 0)) { vbuf = (float*)malloc(sizeof(float) * 3 * tess_buf[a].vn); pbuf = (uint32_t*)malloc(sizeof(uint32_t) * 4 * tess_buf[a].pn); memcpy(vbuf, tess_buf[a].vbuf, sizeof(float)*3*tess_buf[a].vn); memcpy(pbuf, tess_buf[a].pbuf, sizeof(uint32_t)*4*tess_buf[a].pn); /* prepare the buffs ... */ /* s3dprintf(LOW,"drawing [%c] (%d vertices, %d polys",a,tess_buf[a].vn,tess_buf[a].pn); */ for (i = 0; i < tess_buf[a].vn; i++) { vbuf[i*3] += *xoff; /* s3dprintf(LOW,"vertex [%c:%d] %f %f %f",a,i, vbuf[i*3], vbuf[i*3+1], vbuf[i*3+2]);*/ } for (i = 0; i < tess_buf[a].pn; i++) { pbuf[i*4] += *voff; pbuf[i*4+1] += *voff; pbuf[i*4+2] += *voff; /* s3dprintf(LOW,"poly [%c:%d] %d %d %d | %d (voff %d)",a,i, pbuf[i*4], pbuf[i*4+1], pbuf[i*4+2], pbuf[i*4+3],*voff);*/ } s3dprintf(VLOW, "commiting %d vertices, %d polygons", tess_buf[a].vn, tess_buf[a].pn); s3d_push_vertices(oid, vbuf, tess_buf[a].vn); s3d_push_polygons(oid, pbuf, tess_buf[a].pn); *voff += tess_buf[a].vn; free(vbuf); free(pbuf); } *xoff += tess_buf[a].xoff; /* xoffset */ return 0; } /** \brief select font * * This selects a font for the s3d_draw_string() function. * * \remarks Of course, you won't forget to toggle it visible, won't you? * * \code * s3d_select_font("vera"); // will use the vera font face * \endcode */ int s3d_select_font(const char *path) { char *oldfont = memory_font; int oldsize = memory_font_size; char *c; char **p; if (!ft_init) if (s3d_ft_init()) { errds(VHIGH, "s3d_select_font()", "error in initializtation (ft_init())"); return -1; } if (strncmp(oldfontpath, path, 256) == 0) { s3dprintf(VLOW, "font already %s loaded.", path); return -1; } /* yse (system-specific?!) font grabber */ if (((c = s3d_findfont(path)) != NULL)) { s3dprintf(LOW, "Loading Font %s ... ", c); _s3d_clear_tessbuf(); /* free and clear the tessbuf */ p = &memory_font; if ((memory_font_size = s3d_open_file(c, p)) > 0) { if (!s3d_ft_load_font()) { /* success */ if (oldfont != NULL) free(oldfont); strncpy(oldfontpath, path, sizeof(oldfontpath)); oldfontpath[sizeof(oldfontpath) - 1] = '\0'; return 0; } else { memory_font = oldfont; memory_font_size = oldsize; } } else { errds(VHIGH, "s3d_select_font()", "Could not open fontfile %s", c); } } return -1; } /** \brief draw a simple string * * Renders the string str with in Truetype format with the height 1, returns the * length of the rendered string in *xlen (or set len=NULL to disable this). * * \code * char str="hello world!"; * float len; * s3d_select_font("vera"); * s3d_draw_string(str, len); * * // not interested in the length? do that: s3d_draw_string(str, NULL); * \endcode */ int s3d_draw_string(const char *str, float *xlen) { int i; float xoff; int voff; int len; uint32_t f_oid; if (!ft_init) if (s3d_ft_init()) { errds(VHIGH, "s3d_draw_string()", "error in initializtation (ft_init())"); return -1; } if (!face_init) { errds(VHIGH, "s3d_draw_string()", "no font to draw with"); return -1; } f_oid = s3d_new_object(); /* standard material */ s3d_push_material(f_oid, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); xoff = 0; voff = 0; len = strlen(str); for (i = 0; i < len; i++) _s3d_draw_tessbuf(f_oid, (uint8_t)str[i], &voff, &xoff); /* s3d_ft_quit(); */ if (xlen != NULL) *xlen = xoff; return f_oid; } /** \brief get rendered string size * * Returns the length of the string if it were rendered with the currently * selected font. That might be useful to estimate the size used for a text and * render the background or bounding box before inserting the text. */ float s3d_strlen(const char *str) { int i; float xoff; int len; uint16_t a; if (!ft_init) if (s3d_ft_init()) { errds(VHIGH, "s3d_draw_string()", "error in initializtation (ft_init())"); return 0.0; } if (!face_init) { errds(VHIGH, "s3d_draw_string()", "no font to draw with"); return 0.0; } /* standard material */ xoff = 0; len = strlen(str); for (i = 0; i < len; i++) { a = (uint8_t)str[i]; if (!(tess_buf[a].vbuf && tess_buf[a].pbuf)) _s3d_add_tessbuf(a); xoff += tess_buf[a].xoff; /* xoffset */ } return xoff; } s3d-0.2.2.1/libs3d/hash.c000066400000000000000000000172631361325167000146270ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner */ #include /* NULL */ #include /* malloc(), free() */ #include "hash.h" /* clears the hash */ void _s3d_hash_init(struct hashtable_t *hash) { int i; hash->elements = 0; for (i = 0 ; i < hash->size ; i++) { hash->table[i] = NULL; } } /* remove the hash structure. if hashdata_free_cb != NULL, * this function will be called to remove the elements inside of the hash. * if you don't remove the elements, memory might be leaked. */ void _s3d_hash_delete(struct hashtable_t *hash, hashdata_free_cb free_cb) { struct element_t *bucket, *last_bucket; int i; for (i = 0; i < hash->size; i++) { bucket = hash->table[i]; while (bucket != NULL) { if (free_cb != NULL) free_cb(bucket->data); last_bucket = bucket; bucket = bucket->next; free(last_bucket); } } _s3d_hash_destroy(hash); } /* free only the hashtable and the hash itself. */ void _s3d_hash_destroy(struct hashtable_t *hash) { free(hash->table); free(hash); } /* iterate though the hash. first element is selected with iter_in NULL. * use the returned iterator to access the elements until hash_it_t returns NULL. */ struct hash_it_t *_s3d_hash_iterate(struct hashtable_t *hash, struct hash_it_t *iter_in) { struct hash_it_t *iter; if (iter_in == NULL) { iter = (struct hash_it_t*)malloc(sizeof(struct hash_it_t)); iter->index = -1; iter->bucket = NULL; iter->prev_bucket = NULL; } else iter = iter_in; /* sanity checks first (if our bucket got deleted in the last iteration): */ if (iter->bucket != NULL) { if (iter->first_bucket != NULL) { /* we're on the first element and it got removed after the last iteration. */ if ((*iter->first_bucket) != iter->bucket) { /* there are still other elements in the list */ if ((*iter->first_bucket) != NULL) { iter->prev_bucket = NULL; iter->bucket = (*iter->first_bucket); iter->first_bucket = &hash->table[ iter->index ]; return iter; } else { iter->bucket = NULL; } } } else if (iter->prev_bucket != NULL) { /* we're not on the first element, and the bucket got removed after the last iteration. * the last bucket's next pointer is not pointing to our actual bucket anymore. * select the next. */ if (iter->prev_bucket->next != iter->bucket) iter->bucket = iter->prev_bucket; } } /* now as we are sane, select the next one if there is some */ if (iter->bucket != NULL) { if (iter->bucket->next != NULL) { iter->prev_bucket = iter->bucket; iter->bucket = iter->bucket->next; iter->first_bucket = NULL; return iter; } } /* if not returned yet, we've reached the last one on the index and have to search forward */ iter->index++; while (iter->index < hash->size) { /* go through the entries of the hash table */ if ((hash->table[ iter->index ]) != NULL) { iter->prev_bucket = NULL; iter->bucket = hash->table[ iter->index ]; iter->first_bucket = &hash->table[ iter->index ]; return iter; /* if this table entry is not null, return it */ } else iter->index++; /* else, go to the next */ } /* nothing to iterate over anymore */ free(iter); return NULL; } /* allocates and clears the hash */ struct hashtable_t *_s3d_hash_new(int size, hashdata_compare_cb compare, hashdata_choose_cb choose) { struct hashtable_t *hash; hash = (struct hashtable_t*)malloc(sizeof(struct hashtable_t)); if (hash == NULL) /* could not allocate the hash control structure */ return NULL; hash->size = size; hash->table = (struct element_t **)malloc(sizeof(struct element_t *) * size); if (hash->table == NULL) { /* could not allocate the table */ free(hash); return NULL; } _s3d_hash_init(hash); hash->compare = compare; hash->choose = choose; return hash; } /* adds data to the hashtable. returns 0 on success, -1 on error */ int _s3d_hash_add(struct hashtable_t *hash, void *data) { int index; struct element_t *bucket, *prev_bucket = NULL; index = hash->choose(data, hash->size); bucket = hash->table[index]; while (bucket != NULL) { if (0 == hash->compare(bucket->data, data)) return -1; prev_bucket = bucket; bucket = bucket->next; } /* found the tail of the list, add new element */ if (NULL == (bucket = (struct element_t*)malloc(sizeof(struct element_t)))) return -1; /* malloc failed */ bucket->data = data; /* init the new bucket */ bucket->next = NULL; /* and link it */ if (prev_bucket == NULL) { hash->table[index] = bucket; } else { prev_bucket->next = bucket; } hash->elements++; return 0; } /* finds data, based on the key in keydata. returns the found data on success, or NULL on error */ void *_s3d_hash_find(struct hashtable_t *hash, void *keydata) { int index; struct element_t *bucket; index = hash->choose(keydata , hash->size); bucket = hash->table[index]; while (bucket != NULL) { if (0 == hash->compare(bucket->data, keydata)) return bucket->data; bucket = bucket->next; } return NULL; } /* remove bucket (this might be used in hash_iterate() if you already found the bucket * you want to delete and don't need the overhead to find it again with hash_remove(). * But usually, you don't want to use this function, as it fiddles with hash-internals. */ void *_s3d_hash_remove_bucket(struct hashtable_t *hash, struct hash_it_t *hash_it_t) { void *data_save; data_save = hash_it_t->bucket->data; /* save the pointer to the data */ if (hash_it_t->prev_bucket != NULL) { hash_it_t->prev_bucket->next = hash_it_t->bucket->next; } else if (hash_it_t->first_bucket != NULL) { (*hash_it_t->first_bucket) = hash_it_t->bucket->next; } free(hash_it_t->bucket); hash->elements--; return data_save; } /* removes data from hash, if found. returns pointer do data on success, * so you can remove the used structure yourself, or NULL on error . * data could be the structure you use with just the key filled, * we just need the key for comparing. */ void *_s3d_hash_remove(struct hashtable_t *hash, void *data) { struct hash_it_t hash_it_t; hash_it_t.index = hash->choose(data, hash->size); hash_it_t.bucket = hash->table[hash_it_t.index]; hash_it_t.prev_bucket = NULL; while (hash_it_t.bucket != NULL) { if (0 == hash->compare(hash_it_t.bucket->data, data)) { hash_it_t.first_bucket = (hash_it_t.bucket == hash->table[hash_it_t.index] ? &hash->table[ hash_it_t.index ] : NULL); return _s3d_hash_remove_bucket(hash, &hash_it_t); } hash_it_t.prev_bucket = hash_it_t.bucket; hash_it_t.bucket = hash_it_t.bucket->next; } return NULL; } /* resize the hash, returns the pointer to the new hash or NULL on error. removes the old hash on success. */ struct hashtable_t *_s3d_hash_resize(struct hashtable_t *hash, int size) { struct hashtable_t *new_hash; struct element_t *bucket; int i; /* initialize a new hash with the new size */ if (NULL == (new_hash = _s3d_hash_new(size, hash->compare, hash->choose))) return NULL; /* copy the elements */ for (i = 0; i < hash->size; i++) { bucket = hash->table[i]; while (bucket != NULL) { _s3d_hash_add(new_hash, bucket->data); bucket = bucket->next; } } _s3d_hash_delete(hash, NULL); /* remove hash and eventual overflow buckets but not the content itself. */ return new_hash; } /* print the hash table for debugging */ void _s3d_hash_debug(struct hashtable_t *hash) { int i; struct element_t *bucket; for (i = 0; i < hash->size; i++) { printf("[%d] ", i); bucket = hash->table[i]; while (bucket != NULL) { printf("-> [%10p] ", (void *)bucket); bucket = bucket->next; } printf("\n"); } printf("\n"); } s3d-0.2.2.1/libs3d/hash.h000066400000000000000000000064271361325167000146340ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner */ #ifndef _S3D_HASH_H #define _S3D_HASH_H typedef int (*hashdata_compare_cb)(const void *, const void *); typedef int (*hashdata_choose_cb)(const void *, int); typedef void (*hashdata_free_cb)(void *); struct element_t { void *data; /* pointer to the data */ struct element_t *next; /* overflow bucket pointer */ }; struct hash_it_t { int index; struct element_t *bucket; struct element_t *prev_bucket; struct element_t **first_bucket; }; struct hashtable_t { struct element_t **table; /* the hashtable itself, with the buckets */ int elements; /* number of elements registered */ int size; /* size of hashtable */ hashdata_compare_cb compare; /* callback to a compare function. * should compare 2 element datas for their keys, * return 0 if same and not 0 if not same */ hashdata_choose_cb choose; /* the hashfunction, should return an index based * on the key in the data of the first argument * and the size the second */ }; /* clears the hash */ void _s3d_hash_init(struct hashtable_t *hash); /* allocates and clears the hash */ struct hashtable_t *_s3d_hash_new(int size, hashdata_compare_cb compare, hashdata_choose_cb choose); /* remove bucket (this might be used in hash_iterate() if you already found the bucket * you want to delete and don't need the overhead to find it again with hash_remove(). * But usually, you don't want to use this function, as it fiddles with hash-internals. */ void *_s3d_hash_remove_bucket(struct hashtable_t *hash, struct hash_it_t *hash_it_t); /* remove the hash structure. if hashdata_free_cb != NULL, * this function will be called to remove the elements inside of the hash. * if you don't remove the elements, memory might be leaked. */ void _s3d_hash_delete(struct hashtable_t *hash, hashdata_free_cb free_cb); /* free only the hashtable and the hash itself. */ void _s3d_hash_destroy(struct hashtable_t *hash); /* adds data to the hashtable. returns 0 on success, -1 on error */ int _s3d_hash_add(struct hashtable_t *hash, void *data); /* removes data from hash, if found. returns pointer do data on success, * so you can remove the used structure yourself, or NULL on error . * data could be the structure you use with just the key filled, * we just need the key for comparing. */ void *_s3d_hash_remove(struct hashtable_t *hash, void *data); /* finds data, based on the key in keydata. returns the found data on success, or NULL on error */ void *_s3d_hash_find(struct hashtable_t *hash, void *keydata); /* resize the hash, returns the pointer to the new hash or NULL on error. removes the old hash on success */ struct hashtable_t *_s3d_hash_resize(struct hashtable_t *hash, int size); /* print the hash table for debugging */ void _s3d_hash_debug(struct hashtable_t *hash); /* iterate though the hash. first element is selected with iter_in NULL. * use the returned iterator to access the elements until hash_it_t returns NULL. */ struct hash_it_t *_s3d_hash_iterate(struct hashtable_t *hash, struct hash_it_t *iter_in); #endif s3d-0.2.2.1/libs3d/io.c000066400000000000000000000164721361325167000143140ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include "proto.h" #include /* fopen(),fclose(),fileno() */ #include /* strncpy(),strncmp(),memcpy() */ #include /* atoi(),malloc(),free() */ #include /* fstat() */ #include /* getpid(), fstat() */ #include /* errno */ #include /* socket() */ #include /* getopt() */ #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 /* we want struct timespec to be defined */ #endif #ifndef __USE_POSIX199309 #define __USE_POSIX199309 1 #endif #include /* nanosleep() */ #ifdef SIGS #include /* fcntl() */ #define __USE_BSD 1 /* we want sig_t to be defined */ #include /* signal.h, SIG_PIPE */ #endif #include /* htons(),htonl() */ #ifndef WIN32 #include /* gethostbyname() */ #endif static char *url = NULL; /* this file is the client-lib-implementation which holds the function to connect and control the server. */ #ifdef SIGS int _s3d_sigio = 0; static void sigint_handler(int S3DUNUSED(sig)) /* ... ? */ { /*s3d_quit();*/ /* TODO: sometimes no clean quit ?!*/ exit(-1); } #endif int _s3d_ready = 0; /** \brief print s3d parameter * * Prints the possible parameter for the client library (which can be passed in * s3d_init()) */ void s3d_usage(void) { printf("s3d-parameters:\n"); printf(" --s3d-url : skip S3D environment and connect to this url\n"); printf(" --help, -h, --s3d-help: this helpful text\n"); } static int parse_args(int *argc, char ***argv) { int c; int lopt_idx; int old_argc, curopt; struct option long_options[] = { {"s3d-url", 1, NULL, 'u'}, {"help", 0, NULL, 'h'}, {"s3d-help", 0, NULL, 'h'}, {NULL, 0, NULL, 0} }; if ((argc == NULL) || (argv == NULL)) return 0; /* nothing to parse */ old_argc = *argc; optind = 0; opterr = 0; /* we don't want to be bothered if there is some error */ *argc = 1; curopt = 1; while (-1 != (c = getopt_long(old_argc, *argv, "-h", long_options, &lopt_idx))) { switch (c) { case 'u': if (0 == strcmp(long_options[lopt_idx].name, "s3d-url")) { if (optarg) { url = optarg; s3dprintf(HIGH, "connecting to %s", url); } } break; case 'h': printf("usage: %s [options]", (*argv)[0]); s3d_usage(); return -1; default: /* ignore args which are not for us, but maybe the app which builds on us */ (*argv)[(*argc)] = (*argv)[curopt]; (*argc)++; break; } curopt = optind; } for (c = optind; c < old_argc; c++) { (*argv)[(*argc)] = (*argv)[c]; (*argc)++; } optind = 0; return 0; } /* external functions go here ... */ /** \brief initialize s3d library * * This will initialize the s3d-library and the connection to the Server. It * will return 0 on success in server initialization. name specifies the your * programs name. * * \code * int main(char argc, char **argv) * { * if (!s3d_init(&argc, &argv, "Hello world")) * { * ... * s3d_quit(); * } * return 0; * } * \endcode */ int s3d_init(int *argc, char ***argv, const char *name) { char *s; char urlc[256]; /* this should be enough for an url */ char buf[258]; /* server buffer */ int i; struct timespec t = { 0, 100*1000*1000 }; /* 100 mili second */ cb_lock = 1; /* don't bother while initiating ... is set to 0 after INIT packet received. */ if (NULL != (s = getenv("S3D"))) { s3dprintf(VLOW, "at least we have the environment variable ... %s", s); url = s; } parse_args(argc, argv); if (url == NULL) { /* no url specified or obtained through arguments */ /* trying standard ways to connect */ strncpy(urlc, "s3d:///tmp/.s3d:shm/", sizeof(urlc)); urlc[sizeof(urlc) - 1] = '\0'; if (s3d_net_init(urlc) == CON_NULL) { strncpy(urlc, "s3d://127.0.0.1:6066/", sizeof(urlc)); urlc[sizeof(urlc) - 1] = '\0'; if (s3d_net_init(urlc) == CON_NULL) return -1; } } else { strncpy(urlc, url, sizeof(urlc)); /* this should keep buffer overflows away, maybe */ urlc[sizeof(urlc) - 1] = '\0'; /* just to make sure */ if (!strncmp(urlc, "s3d:// ", 6)) { if (s3d_net_init(urlc) == CON_NULL) return -1; } else { errs("s3d_init()", "invalid url"); return -1; } } strncpy(buf, name, sizeof(buf)); /* copy the name ... */ buf[sizeof(buf) - 1] = '\0'; net_send(S3D_P_C_INIT, buf, strlen(buf)); _queue_init(); _s3d_texture_init(); #ifdef SIGS if (signal(SIGINT, (sig_t)sigint_handler) == SIG_ERR) errdn(LOW, "s3d_init():signal()", errno); if (signal(SIGTERM, (sig_t)sigint_handler) == SIG_ERR) errdn(LOW, "s3d_init():signal()", errno); #endif for (i = 0; i < 100; i++) { s3d_net_check(); /* wait for init packet */ nanosleep(&t, NULL); if (_s3d_ready) { cb_lock--; return 0; } } return -1; } /** \brief shutdown s3d library * * Closes the connection and clears the event-stack. It can also be used to * leave the s3d_mainloop(). */ int s3d_quit(void) { struct s3d_evt *ret; _s3d_texture_quit(); if (con_type != CON_NULL && _s3d_ready) { net_send(S3D_P_C_QUIT, NULL, 0); switch (con_type) { #ifdef TCP case CON_TCP: _tcp_quit(); break; #endif #ifdef SHM case CON_SHM: _shm_quit(); break; #endif } con_type = CON_NULL; _s3d_ready = 0; _queue_quit(); while (NULL != (ret = s3d_pop_event())) s3d_delete_event(ret); /* clear the stack ... */ cb_lock = 0; /* we don't care about old callbacks, now we just quit! */ ret = (struct s3d_evt *)malloc(sizeof(struct s3d_evt)); ret->event = S3D_EVENT_QUIT; ret->length = 0; s3d_push_event(ret); } return 0; } /** \brief set mainloop of program * * Takes a function as argument. It will loop this function until a quit-event * is received. You can pass NULL if you have no function to be looped, but its * better to sleep some time if you have nothing to do anyway to save cpu-time. * * \code * void mainloop(void) * { * usleep(1000); // sleep 1 ms in every cycle * } * ... * * s3d_mainloop(mainloop()); * \endcode */ int s3d_mainloop(void (*f)(void)) { while (con_type != CON_NULL) { cb_lock++; /* no callbacks while we are in mainloop */ if (f != NULL) f(); cb_lock--; s3d_process_stack(); s3d_net_check(); /* get any other packets we might have missed */ } return 0; } /** \brief copy file into memory * * This opens the file fname, setting *pointer to it's memory position. the * function will return the size of buffer. you can free() the pointer when * you're finished. */ int s3d_open_file(const char *fname, char **pointer) { FILE *fp; char *buf = NULL; size_t filesize; size_t read_items; struct stat bf; *pointer = NULL; if ((fp = fopen(fname, "rb")) == NULL) { errdn(VLOW, "s3d_open_file():fopen()", errno); return -1; } if (fstat(fileno(fp), &bf)) { errdn(VLOW, "s3d_open_file():fstat()", errno); fclose(fp); return(-1); } filesize = bf.st_size; if ((buf = (char *)malloc(filesize)) == NULL) { errn("s3d_open_3ds_file():malloc()", errno); exit(-1); } read_items = fread(buf, 1, filesize, fp); fclose(fp); if (read_items != filesize) { errdn(VLOW, "s3d_open_file():fread()", errno); free(buf); return -1; } *pointer = buf; return filesize; } s3d-0.2.2.1/libs3d/libs3d.pc.cmake000066400000000000000000000006431361325167000163150ustar00rootroot00000000000000# SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@BIN_INSTALL_DIR@ libdir=@LIB_INSTALL_DIR@ includedir=@INCLUDE_INSTALL_DIR@ Name: libs3d Version: @VERSION@ Description: Client library for the s3d server Requires.private: libg3d freetype2 fontconfig Libs.private: -lm Libs: -L${libdir} -ls3d Cflags: -I${includedir} s3d-0.2.2.1/libs3d/libs3d.ver000066400000000000000000000026721361325167000154340ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann LIBS3D_2 { global: s3d_angle_to_cam; s3d_clear_callback; s3d_clone; s3d_clone_target; s3d_del_object; s3d_delete_event; s3d_draw_string; s3d_find_event; s3d_flags_off; s3d_flags_on; s3d_get_callback; s3d_ignore_callback; s3d_import_model_file; s3d_init; s3d_link; s3d_load_line_normals; s3d_load_materials_a; s3d_load_polygon_normals; s3d_load_polygon_tex_coords; s3d_load_texture; s3d_mainloop; s3d_mcp_focus; s3d_net_check; s3d_new_object; s3d_open_file; s3d_pep_line; s3d_pep_line_normals; s3d_pep_lines; s3d_pep_material; s3d_pep_material_a; s3d_pep_material_texture; s3d_pep_materials_a; s3d_pep_polygon_normals; s3d_pep_polygon_tex_coord; s3d_pep_polygon_tex_coords; s3d_pep_vertex; s3d_pep_vertices; s3d_pop_event; s3d_pop_line; s3d_pop_material; s3d_pop_polygon; s3d_pop_texture; s3d_pop_vertex; s3d_process_stack; s3d_push_event; s3d_push_line; s3d_push_lines; s3d_push_material; s3d_push_material_a; s3d_push_materials_a; s3d_push_polygon; s3d_push_polygons; s3d_push_texture; s3d_push_textures; s3d_push_vertex; s3d_push_vertices; s3d_quit; s3d_rotate; s3d_scale; s3d_select_font; s3d_set_callback; s3d_strlen; s3d_translate; s3d_unlink; s3d_usage; s3d_vector_angle; s3d_vector_cross_product; s3d_vector_dot_product; s3d_vector_length; s3d_vector_subtract; local: *; }; s3d-0.2.2.1/libs3d/modelread.c000066400000000000000000000202711361325167000156310ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include #include #include /* exit(), malloc() */ #include /* sqrt() */ #include /* strncpy() */ #include /* errno */ struct material2texture { struct material2texture *next_ptr; /* pointer to next */ void *material_ptr; void *texture_ptr; int material_id; int texture_id; }; static struct material2texture *mat2tex_root = NULL; #define MAXSTRN 20 static int model_load(char *file); /** \brief read model from file * * Imports an 3d object file and returns the object number. Quite a number of * formats are supported, like 3D Studio (.3ds, .prj), Lightwave (.lw, .lwb, * .lwo), Quake Models (.md3), or simply everything libg3d supports. :) * * \remarks Of course, you won't forget to toggle it visible, won't you? */ int s3d_import_model_file(const char *fname) { char *buf, *ptr, *next; char searchpath[1024]; char path[1024]; int oid; if (fname == NULL) return -1; #ifndef OBJSDIR #define OBJSDIR ":./:../:../../:/usr/local/share/s3d/:/usr/share/s3d/" #endif strncpy(searchpath, OBJSDIR, 1023); searchpath[1023] = 0; /* just in case */ next = ptr = searchpath; while (next != NULL) { next = NULL; if (NULL != (next = strchr(ptr, ':'))) { *next = 0; /* clear the delimiter */ next += 1; /* move to the beginner of the next dir */ } if ((strlen(ptr) + strlen(fname)) < 1024) { /* only try if this fits */ strcpy(path, ptr); /* can use "unsafe" functions because size was verified above */ strcat(path, fname); if (s3d_open_file(path, &buf) != -1) { /* found something */ free(buf); /* TODO: badbadbad ... */ if (-1 != (oid = model_load(path))) return oid; } } if (next != NULL) ptr = next; /* move pointer to the next position */ } errds(LOW, "s3d_import_model_file()", "Could not open %s", fname); return -1; /* nothing in search path ... */ } static struct material2texture* get_mat2tex(struct material2texture **mat2tex, void *mat_ptr) { while ((*mat2tex) != NULL) { if ((*mat2tex)->material_ptr == mat_ptr) return *mat2tex; mat2tex = &(*mat2tex)->next_ptr; } if ((*mat2tex) == NULL) { (*mat2tex) = (struct material2texture *)malloc(sizeof(struct material2texture)); if ((*mat2tex) == NULL) { errs("model_import()", "Sorry - you ran out of memory !\n"); exit(8); } (*mat2tex)->next_ptr = NULL; (*mat2tex)->material_ptr = mat_ptr; (*mat2tex)->texture_ptr = NULL; (*mat2tex)->material_id = -1; (*mat2tex)->texture_id = -1; return *mat2tex; } return NULL; } static int model_load(char *file) { G3DContext *context; G3DModel *model; G3DObject *object; G3DFace *face; GSList *oitem, *oface; G3DMatrix rmatrix[16]; struct material2texture *mat2tex; unsigned int i, k; int j, material_count, texture_count, voff, obj_id; #define PMAX 100 uint32_t polybuf[PMAX * 4], npoly, oldflags; float normalbuf[PMAX * 9], texcoordbuf[PMAX * 6]; float swaph; /* swap helper */ uint8_t *s3d_pixeldata = NULL; context = g3d_context_new(); obj_id = -1; model = g3d_model_load_full(context, file, 0); if (model) { g3d_matrix_identity(rmatrix); g3d_matrix_rotate_xyz(G_PI * 90.0 / 180, 0.0, 0.0, rmatrix); g3d_model_transform(model, rmatrix); oitem = model->objects; obj_id = s3d_new_object(); material_count = texture_count = voff = 0; while (oitem) { object = (G3DObject *)oitem->data; /* push vertices */ for (i = 0; i < object->vertex_count; i++) { /* 2. and 3. coord have to change places otherwise the object will be turned */ swaph = object->vertex_data[i * 3 + 2]; object->vertex_data[i * 3 + 2] = -object->vertex_data[i * 3 + 1]; object->vertex_data[i * 3 + 1] = swaph; } s3d_push_vertices(obj_id, object->vertex_data, object->vertex_count); if (NULL == (oface = object->faces)) { voff += object->vertex_count; /* increase vertex offset */ oitem = oitem->next; continue; } npoly = 0; oldflags = ((G3DFace *)(oface->data))->flags; while (oface) { face = (G3DFace *)oface->data; mat2tex = get_mat2tex(&mat2tex_root, face->material); if (mat2tex->material_id == -1) { /* create a new texture if nothing found */ s3d_push_material_a(obj_id, face->material->r, face->material->g, face->material->b, face->material->a, face->material->specular[0], face->material->specular[1], face->material->specular[2], face->material->specular[3], face->material->r, face->material->g, face->material->b, face->material->a); mat2tex->material_id = material_count; material_count++; if (face->tex_image != NULL) { /* reorder pixeldata - s3d wants rgba */ s3d_pixeldata = (uint8_t*)malloc(sizeof(uint8_t) * face->tex_image->width * face->tex_image->height * 32); if (s3d_pixeldata == NULL) { errs("model_load()", "Sorry - you ran out of memory !\n"); exit(8); } for (j = (face->tex_image->height - 1); j >= 0; j--) { for (k = 0; k < face->tex_image->width; k++) { s3d_pixeldata[(j * face->tex_image->width + k) * 4 + 0 ] = face->tex_image->pixeldata[(j * face->tex_image->width + k) * 4 + 2 ]; s3d_pixeldata[(j * face->tex_image->width + k) * 4 + 1 ] = face->tex_image->pixeldata[(j * face->tex_image->width + k) * 4 + 1 ]; s3d_pixeldata[(j * face->tex_image->width + k) * 4 + 2 ] = face->tex_image->pixeldata[(j * face->tex_image->width + k) * 4 + 0 ]; s3d_pixeldata[(j * face->tex_image->width + k) * 4 + 3 ] = face->tex_image->pixeldata[(j * face->tex_image->width + k) * 4 + 3 ]; } } s3d_push_texture(obj_id, face->tex_image->width, face->tex_image->height); s3d_pep_material_texture(obj_id, texture_count); s3d_load_texture(obj_id, texture_count, 0, 0, face->tex_image->width, face->tex_image->height, s3d_pixeldata); free(s3d_pixeldata); s3d_pixeldata = NULL; mat2tex->texture_id = texture_count; texture_count++; } } if (face->flags != oldflags || npoly >= PMAX) { /* push things so far */ s3d_push_polygons(obj_id, polybuf, npoly); if (oldflags & G3D_FLAG_FAC_NORMALS) s3d_pep_polygon_normals(obj_id, normalbuf, npoly); if (oldflags & G3D_FLAG_FAC_TEXMAP) s3d_pep_polygon_tex_coords(obj_id, texcoordbuf, npoly); npoly = 0; } oldflags = face->flags; /* add polygon to the polygon buffer */ polybuf[npoly*4+0] = face->vertex_indices[0] + voff; polybuf[npoly*4+1] = face->vertex_indices[2] + voff; polybuf[npoly*4+2] = face->vertex_indices[1] + voff; polybuf[npoly*4+3] = mat2tex->material_id; if (face->flags & G3D_FLAG_FAC_NORMALS) { normalbuf[ npoly*9 + 0] = -face->normals[ 0 ]; normalbuf[ npoly*9 + 1] = -face->normals[ 2 ]; normalbuf[ npoly*9 + 2] = face->normals[ 1 ]; normalbuf[ npoly*9 + 3] = -face->normals[ 6 ]; normalbuf[ npoly*9 + 4] = -face->normals[ 8 ]; normalbuf[ npoly*9 + 5] = face->normals[ 7 ]; normalbuf[ npoly*9 + 6] = -face->normals[ 3 ]; normalbuf[ npoly*9 + 7] = -face->normals[ 5 ]; normalbuf[ npoly*9 + 8] = face->normals[ 4 ]; } if (face->flags & G3D_FLAG_FAC_TEXMAP) { texcoordbuf[ npoly*6 + 0] = face->tex_vertex_data[ 0 ]; texcoordbuf[ npoly*6 + 1] = face->tex_vertex_data[ 1 ]; texcoordbuf[ npoly*6 + 2] = face->tex_vertex_data[ 4 ]; texcoordbuf[ npoly*6 + 3] = face->tex_vertex_data[ 5 ]; texcoordbuf[ npoly*6 + 4] = face->tex_vertex_data[ 2 ]; texcoordbuf[ npoly*6 + 5] = face->tex_vertex_data[ 3 ]; } npoly++; oface = oface->next; } /* push the last packets in buffer */ if (npoly > 0) { s3d_push_polygons(obj_id, polybuf, npoly); if (oldflags & G3D_FLAG_FAC_NORMALS) s3d_pep_polygon_normals(obj_id, normalbuf, npoly); if (oldflags & G3D_FLAG_FAC_TEXMAP) s3d_pep_polygon_tex_coords(obj_id, texcoordbuf, npoly); } voff += object->vertex_count; /* increase vertex offset */ oitem = oitem->next; } g3d_model_free(model); } g3d_context_free(context); return obj_id; } s3d-0.2.2.1/libs3d/network.c000066400000000000000000000056411361325167000153720ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include /* memcpy() */ #include /* malloc(), free() */ #include /* read(), write() */ #include /* errno */ #include /* htons(),htonl() */ int con_type = CON_NULL; #ifdef TCP static int _s3d_net_receive(void); #endif int net_send(uint8_t opcode, char *buf, uint16_t length) { char *ptr; /* char *buff; */ char buff[65539]; /* uint16_t really shouldn't be bigger ;) */ *(buff) = opcode; ptr = buff + 1; *((uint16_t *) ptr) = htons(length); if (length != 0) memcpy(buff + 3, buf, length); switch (con_type) { #ifdef SHM case CON_SHM: shm_writen(buff, length + 3); break; #endif #ifdef TCP case CON_TCP: tcp_writen(buff, length + 3); break; #endif } return 0; } /* handler for socket based connection types */ #ifdef TCP static int _s3d_net_receive(void) { return _s3d_tcp_net_receive(); } #endif /** \brief get events from server * * This functions is for programs which do not employ a mainloop, hence they * need to check for new events on their own. Programs like these must make sure * to call this function from time to time to convince the server that they did * not freeze or bail out. */ int s3d_net_check(void) { switch (con_type) { #ifdef TCP case CON_TCP: #ifdef SIGS if (_s3d_sigio) { #endif while (_s3d_net_receive()) {} #ifdef SIGS _s3d_sigio = 0; } #endif break; #endif #ifdef SHM case CON_SHM: while (_shm_net_receive()) {} break; #endif } s3d_process_stack(); return 0; } int s3d_net_init(char *urlc) { char *s, *sv, *port = NULL; char *first_slash = NULL; #ifdef TCP int pn = 0; #endif int tcp, shm; tcp = shm = 1; /* everything is possible, yet */ /* doing a very bad server/port extraction, but I think it'll work ... */ s = sv = urlc + 6; /* getting to the "real" thing */ /* while (((*s!='/') && (*s!=0)) && (s<(urlc-6))) */ while (*s != 0) { if (*s == '/') { if (first_slash == NULL) first_slash = s; if (port != NULL) break; } if (*s == ':') { /* there is a port in here */ port = s + 1; *s = 0; /* NULL the port */ } s++; } *s = 0; if (port == NULL) { shm = 0; if (first_slash != NULL) *first_slash = 0; } else { if (first_slash < port) tcp = 0; else if (first_slash != NULL) *first_slash = 0; if (!strncmp(port, "shm", 3)) { tcp = 0; /* null the others */ } else { shm = 0; } } #ifdef SHM if (shm) { if (!strncmp(port, "shm", 3)) if (!_shm_init(sv)) return con_type = CON_SHM; } #endif #ifdef TCP if (tcp) { pn = 6066; if (port != NULL) { if (!(pn = atoi(port))) { /* I hope atoi is safe enough. */ errn("s3d_init():atoi()", errno); pn = 6066; } } if (!_tcp_init(sv, pn)) return con_type = CON_TCP; } #endif return CON_NULL; } s3d-0.2.2.1/libs3d/object_queue.c000066400000000000000000000062111361325167000163450ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include "proto.h" #include /* malloc(),free(), realloc() */ #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 /* we want struct timespec to be defined */ #endif #ifndef __USE_POSIX199309 #define __USE_POSIX199309 1 #endif #include /* nanosleep() */ /* objects are requested before beeing used for having fast */ /* access when needed. this also makes things more asynchronous, */ /* therefore faster (I hope). */ #define Q_UNUSED ((unsigned int)~0) /* unused slot magic number */ #define MAX_REQ 100 /* don't request more than that. */ static unsigned int *queue; /* the object id's */ static int queue_size = 0; /* the size of the object queue */ static int requested; /* counter of how many addtional */ /* objects have been requested */ /* initializes the object queue */ int _queue_init(void) { int i; queue_size = 1; requested = 0; queue = (unsigned int*)malloc(sizeof(unsigned int) * queue_size); for (i = 0; i < queue_size; i++) { queue[i] = Q_UNUSED; } _queue_fill(); return 0; } /* checks the queue empty slots and requests new ones if needed */ int _queue_fill(void) { int i; for (i = 0; i < queue_size; i++) if (queue[i] == Q_UNUSED) net_send(S3D_P_C_NEW_OBJ, NULL, 0); return 0; } /* we have a new object from the server, trying to find a place for it */ int _queue_new_object(unsigned int oid) { int i; /* s3dprintf(LOW,"having a new object (%d) in the queue!!",oid); */ for (i = 0; i < queue_size; i++) if (queue[i] == Q_UNUSED) { /* s3dprintf(LOW,"placing it at position %d",i); */ queue[i] = oid; requested--; return 0; } if (queue_size == 0) return -1; /* already quit. */ /* if we reach here, all slots all taken. */ /* s3dprintf(LOW,"no place for object, resizing stack.",i); */ queue = (unsigned int*)realloc(queue, sizeof(unsigned int) * (queue_size + 1)); queue_size += 1; requested--; queue[queue_size-1] = oid; return 0; } /* an object is requested!! give one out: */ unsigned int _queue_want_object(void) { unsigned int ret; int i, j; static struct timespec t = { 0, 10*1000 }; /* 10 micro seconds */ j = 0; do { for (i = 0; i < queue_size; i++) if (queue[i] != Q_UNUSED) { ret = queue[i]; queue[i] = Q_UNUSED; net_send(S3D_P_C_NEW_OBJ, NULL, 0); /* we already can request a new one. */ return ret; } /* if we reach this point, our queue is empty. */ /* as other request should have sent S3D_P_C_NEW_OBJ-requests, */ /* we request one more object than needed to satisfy more load in future. */ if (queue_size == 0) return -1; /* already quit. */ if (requested < MAX_REQ) { net_send(S3D_P_C_NEW_OBJ, NULL, 0); requested++; } s3d_net_check(); nanosleep(&t, NULL); } while (j++ < TIMEOUT); errds(LOW, "_queue_want_object()", "timeout is reached. server is extremly slow/laggy or dead"); return -1; } /* cleans up */ int _queue_quit(void) { if (queue != NULL) { free(queue); queue = NULL; } queue_size = 0; return 0; } s3d-0.2.2.1/libs3d/proto_in.c000066400000000000000000000126761361325167000155400ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include #include /* htons(),htonl() */ #include /* errno */ #include /* malloc(), free() */ #include /* this proccesses the commands and pushes s3d-events, or does other things ;) */ int net_prot_in(uint8_t opcode, uint16_t length, char *buf) { uint32_t oid = ~0u; struct s3d_evt *s3devt = NULL; struct mcp_object *mo; struct s3d_obj_info *oi; struct s3d_texshm *tshm; switch (opcode) { case S3D_P_S_INIT: s3dprintf(MED, "S3D_P_S_INIT: init!!"); _s3d_ready = 1; break; case S3D_P_S_QUIT: s3dprintf(MED, "S3D_P_S_QUIT: server wants us to go. well ..."); s3d_quit(); break; case S3D_P_S_CLICK: if (length == 4) { oid = ntohl(*((uint32_t *)buf)); if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { *((uint32_t *)buf) = oid; /* reuse buffer ... */ s3devt->event = S3D_EVENT_OBJ_CLICK; s3devt->length = 4; s3devt->buf = buf; } s3dprintf(MED, "S3D_P_S_CLICK: %d got clicked ....", oid); } break; case S3D_P_S_NEWOBJ: if (length == 4) { oid = ntohl(*((uint32_t *)buf)); _queue_new_object(oid); /* if (NULL!=(s3devt=malloc(sizeof(struct s3d_evt)))) { *((uint32_t *)buf)=oid; / * reuse buffer ... * / s3devt->event=S3D_EVENT_NEW_OBJECT; s3devt->length=4; s3devt->buf=buf; _queue_new_object(*((unsigned int *)newevt->buf)); }*/ s3dprintf(VLOW, "S3D_P_S_NEWOBJ: new object %d", oid); } break; case S3D_P_S_KEY: if (length == 8) { if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { struct s3d_key_event *keyevent; s3devt->length = 2; keyevent = (struct s3d_key_event *)buf; keyevent->keysym = ntohs(keyevent->keysym); keyevent->unicode = ntohs(keyevent->unicode); keyevent->modifier = ntohs(keyevent->modifier); keyevent->state = ntohs(keyevent->state); s3devt->buf = buf; s3devt->event = (keyevent->state == 0) ? S3D_EVENT_KEYDOWN : S3D_EVENT_KEYUP; s3dprintf(VLOW, "S3D_P_S_KEY: key %d hit!!", *((uint16_t *)s3devt->buf)); } } break; case S3D_P_S_MBUTTON: if (length == 2) { if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { s3devt->event = S3D_EVENT_MBUTTON; s3devt->length = 2; s3devt->buf = buf; s3dprintf(VLOW, "S3D_P_S_MBUTTON: mbutton %d, state %d !!", *((uint8_t *)s3devt->buf), *(1 + (uint8_t *)s3devt->buf)); } } break; case S3D_P_MCP_OBJECT: if (length == sizeof(struct mcp_object)) { /* oid=htonl(*((uint32_t *)buf)); */ if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { /* *((uint32_t *)buf)=oid; / * reuse buffer ... * / */ s3devt->event = S3D_MCP_OBJECT; s3devt->length = length; mo = (struct mcp_object *)buf; *((uint32_t *)buf) = ntohl(*((uint32_t *)buf)); /* revert oid */ ntohfb(&mo->trans_x, 4); buf[length-1] = '\0'; /* put a null byte at the end */ /* for the not so careful users */ s3devt->buf = buf; s3dprintf(VLOW, "S3D_P_MCP_OBEJCT: something is happening to object %d, name %s", mo->object, mo->name); } } else s3dprintf(MED, "wrong length for S3D_P_MCP_OBJECT length %"PRId16" != %d", length, (int)sizeof(struct mcp_object)); break; case S3D_P_S_OINFO: if (length == sizeof(struct s3d_obj_info)) { /* oid=htonl(*((uint32_t *)buf)); */ if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { /* *((uint32_t *)buf)=oid; / * reuse buffer ... * / */ s3devt->event = S3D_EVENT_OBJ_INFO; s3devt->length = length; oi = (struct s3d_obj_info *)buf; oi->object = ntohl(oi->object); oi->flags = ntohl(oi->flags); ntohfb(&oi->trans_x, 8); buf[length-1] = '\0'; /* put a null byte at the end */ /* for the not so careful users */ s3devt->buf = buf; s3dprintf(VLOW, "S3D_P_S_OINFO: something is happening to object %d, name %s", oi->object, oi->name ); } } else s3dprintf(MED, "wrong length for S3D_P_S_OINFO length %"PRId16" != %d", length, (int)sizeof(struct s3d_obj_info)); break; case S3D_P_S_SHMTEX: if (length == sizeof(struct s3d_texshm)) { tshm = (struct s3d_texshm *)buf; /* this is only handled internally ... */ tshm->oid = ntohl(tshm->oid); tshm->tex = ntohl(tshm->tex); tshm->shmid = ntohl(tshm->shmid); tshm->tw = ntohs(tshm->tw); tshm->th = ntohs(tshm->th); tshm->w = ntohs(tshm->w); tshm->h = ntohs(tshm->h); s3dprintf(MED, "S3D_P_S_SHMTEX: texture %d of object %d is available under shmid %d", tshm->tex, tshm->oid, tshm->shmid); _s3d_handle_texshm(tshm); free(buf); } else s3dprintf(MED, "wrong length for S3D_P_S_SHMTEX length %"PRId16" != %d", length, (int)sizeof(struct s3d_texshm)); break; case S3D_P_MCP_DEL_OBJECT: if (length == 4) { if (NULL != (s3devt = (struct s3d_evt*)malloc(sizeof(struct s3d_evt)))) { s3devt->event = S3D_MCP_DEL_OBJECT; s3devt->length = length; *((uint32_t *)buf) = ntohl(*((uint32_t *)buf)); /* revert oid */ s3dprintf(MED, "S3D_P_MCP_DEL_OBEJCT: deleting object %d", *((uint32_t *)buf)); s3devt->buf = buf; } } break; default: s3dprintf(MED, "don't know command %d", opcode); if (buf != NULL) free(buf); } if (s3devt != NULL) { s3d_push_event(s3devt); } return 0; } s3d-0.2.2.1/libs3d/proto_out.c000066400000000000000000001052361361325167000157340ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include #include /* memset(),strncpy(),strncmp(),memcpy() */ #include /* errno */ #include /* htons(),htonl() */ #include /* select() */ #include /* getenv(),atoi(), malloc() */ #ifdef WIN32 #define uint32_t uint32_t /* sohn */ #else #include /* gethostbyname() */ #endif #define MF_LEN 65530 /* maximum fragmentation length */ /** \brief create new object * * Creates a new object, returning the object id. * * \remarks Of course, you won't forget to toggle it visible, won't you? */ int s3d_new_object(void) { int oid; cb_lock++; /* please, no callbacks now. */ oid = _queue_want_object(); cb_lock--; /* no new callbacks and nothing happened */ return oid; } /** \brief clone object * * Clones an already existing object. They get just look the same as the * parent-object and will change when the parent-object changes. Cloning * especially makes sense if you want to use the same object a lot of times. * Move and transform is independent from the parent. The function returns the * children object id. */ int s3d_clone(int oid) { uint32_t res; res = s3d_new_object(); s3d_clone_target(res, oid); return res; } /** \brief changes the target of a clone-object * * Changes the clone target of oid to another object (toid). This assumes you've * got oid from s3d_clone before. */ int s3d_clone_target(int oid, int toid) { uint32_t buf[2]; buf[0] = htonl(oid); buf[1] = htonl(toid); net_send(S3D_P_C_CLONE, (char *)&buf, 8); /* s3dprintf(MED,"... changed clone-target of object %d to %d", oid, toid); */ return oid; } /** \brief delete an object * * Deletes the object referenced by oid. */ int s3d_del_object(int oid) { uint32_t res = htonl(oid); net_send(S3D_P_C_DEL_OBJ, (char *)&res, 4); return oid; } /** \brief link object to another one * * A linked object will move along with it's link parent. For example if you * have a book on a table, you can link the book to the table so the book will * "keep on the table" if you move the table around in space. It will also * rotate with the table etc. */ int s3d_link(int oid_from, int oid_to) { uint32_t buf[2]; buf[0] = htonl(oid_from); buf[1] = htonl(oid_to); net_send(S3D_P_C_LINK, (char *)buf, 8); return 0; } /** \brief removes link from another object * * Remove the link of object oid to its target. */ int s3d_unlink(int oid) { uint32_t buf; buf = htonl(oid); net_send(S3D_P_C_LINK, (char *)&buf, 4); return 0; } /* pushing functions */ /** \brief push vertex * * Pushes a vertex onto the vertex stack. Make sure that you count how many * vertices you've pushed because you'll need that for referencing when you push * your polygons. */ int s3d_push_vertex(int object, float x, float y, float z) { char buf[4+3*4], *ptr; int len = 4 + 3 * 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = x; ptr += sizeof(float); *((float *)ptr) = y; ptr += sizeof(float); *((float *)ptr) = z; htonfb((float*)(buf + sizeof(uint32_t)), 3); net_send(S3D_P_C_PUSH_VERTEX, buf, len); return 0; } /** \brief push many vertices * * Push some vertices from an array. that's much better for performing than * using s3d_push_vertex() if you have a lot of vertices (and that's probably * the usual case). * \code * float vertices[] = { 0.0, 0.0, 0.0, * 1.0, 2.0, 3.0, * 3.0, 2.0, 1.0}; * s3d_push_vertices(object, vertices, 3); // pushing 3 vertices * \endcode */ int s3d_push_vertices(int object, const float *vbuf, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 4 * 3; int flen, stepl; if (n < 1) return -1; stepl = ((int)((MF_LEN - 4) / (4 * 3))) * (4 * 3); f = len / (MF_LEN - 4) + 1; /* how many fragments? */ /* buf=malloc(f>1?MF_LEN:len+4); */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)vbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_PUSH_VERTEX, buf, flen + 4); } /* free(buf); */ return 0; } /** \brief push material * * Pushes a material for an object. you will have to count them yourself too, * as polygons will ask for the material index number. The material properties * are given in rgb (red/green/blue) color codes, in float. 0.0 is the minimum, * 1.0 is the maximum a color value can be. The specular color is the color * which is directly reflected from the light source. The diffuse color is the * color which can be seen in the bright side of the object, and the ambience * color is the color of the shadow side of the object. */ int s3d_push_material(int object, float amb_r, float amb_g, float amb_b, float spec_r, float spec_g, float spec_b, float diff_r, float diff_g, float diff_b ) { char buf[4+4*12]; char *ptr; int len = 4 + 4 * 12; /* s3dprintf(LOW, "adding a new material..."); */ ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = amb_r; ptr += sizeof(float); *((float *)ptr) = amb_g; ptr += sizeof(float); *((float *)ptr) = amb_b; ptr += sizeof(float); *((float *)ptr) = 1.0; ptr += sizeof(float); *((float *)ptr) = spec_r; ptr += sizeof(float); *((float *)ptr) = spec_g; ptr += sizeof(float); *((float *)ptr) = spec_b; ptr += sizeof(float); *((float *)ptr) = 1.0; ptr += sizeof(float); *((float *)ptr) = diff_r; ptr += sizeof(float); *((float *)ptr) = diff_g; ptr += sizeof(float); *((float *)ptr) = diff_b; ptr += sizeof(float); *((float *)ptr) = 1.0; htonfb((float*)(buf + sizeof(uint32_t)), 12); net_send(S3D_P_C_PUSH_MAT, buf, len); return 0; /* nothing yet */ } /** \brief push material with alpha * * Same as s3d_push_material, but color has alpha value added. Use * s3d_push_materials_a() if you have a lot of materials to push. */ int s3d_push_material_a(int object, float amb_r, float amb_g, float amb_b, float amb_a, float spec_r, float spec_g, float spec_b, float spec_a, float diff_r, float diff_g, float diff_b, float diff_a ) { char buf[4+4*12]; char *ptr; int len = 4 + 4 * 12; /* s3dprintf(LOW, "adding a new material..."); */ ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = amb_r; ptr += sizeof(float); *((float *)ptr) = amb_g; ptr += sizeof(float); *((float *)ptr) = amb_b; ptr += sizeof(float); *((float *)ptr) = amb_a; ptr += sizeof(float); *((float *)ptr) = spec_r; ptr += sizeof(float); *((float *)ptr) = spec_g; ptr += sizeof(float); *((float *)ptr) = spec_b; ptr += sizeof(float); *((float *)ptr) = spec_a; ptr += sizeof(float); *((float *)ptr) = diff_r; ptr += sizeof(float); *((float *)ptr) = diff_g; ptr += sizeof(float); *((float *)ptr) = diff_b; ptr += sizeof(float); *((float *)ptr) = diff_a; htonfb((float*)(buf + sizeof(uint32_t)), 12); net_send(S3D_P_C_PUSH_MAT, buf, len); return 0; /* nothing yet */ } /** \brief push many materials * * Pushes a buffer of materials. Those materials are in the format float[n*12], * with * - mbuf[n*12 + 0-3] - ambience * - mbuf[n*12 + 4-7] - specular * - mbuf[n *12 + 8-11] - diffusion values * * of each entry. n is the number of materials pushed. The values are in the * order r,g,b,a. If you only want to push one material, use the more easy * s3d_push_material_a() function. * * \code * // each line has r,g,b,a value * float bla[24]= * {1, 0, 0, 1, * 1, 0, 0, 1, * 1, 0, 0, 1, * 0, 1, 1, 1, * 0, 1, 1, 1, * 0, 1, 1, 1}; * * s3d_push_materials_a(object, bla, 2); // push a red and a cyan material * \endcode */ int s3d_push_materials_a(int object, const float *mbuf, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 4 * 12; int flen, stepl; if (n < 1) return -1; stepl = ((int)((MF_LEN - 4) / (4 * 12))) * (4 * 12); f = len / (MF_LEN - 4) + 1; /* how many fragments? */ /* buf=malloc(f>1?MF_LEN:len+4); */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)mbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_PUSH_MAT, buf, flen + 4); } /* free(buf); */ return 0; } /** \brief push polygon * * Push one polygon on the polygon stack of the object. It takes 3 vertex-index * numbers and one material material-index-no. as argument. * * \code * int oid = s3d_new_object(); // create a new object * s3d_push_vertex(oid, 0.0, 0.0, 0.0); * s3d_push_vertex(oid, 0.0, 1.0, 0.0); * s3d_push_vertex(oid, 1.0, 0.0, 0.0); * s3d_push_material(oid, 0.3, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0); * s3d_push_polygon(oid, 0, 1, 2, 0); * // this will create a red polygon * \endcode */ int s3d_push_polygon(int object, uint32_t v1, uint32_t v2, uint32_t v3, uint32_t material) { char buf[4+4*4], *ptr; int len = 4 + 4 * 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(v1); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(v2); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(v3); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(material); net_send(S3D_P_C_PUSH_POLY, buf, len); return 0; } /** \brief push line * * Push one line on the line stack of the object. It takes 2 vertex-index-no, * and one material material-index-no. as argument. If you have a lot of lines * to push, use s3d_push_lines() */ int s3d_push_line(int object, uint32_t v1, uint32_t v2, uint32_t material) { char buf[4+3*4], *ptr; int len = 4 + 3 * 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(v1); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(v2); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(material); net_send(S3D_P_C_PUSH_LINE, buf, len); return 0; } /** \brief push many polygons * * As for vertices, you can push arrays of polygons to have greater performance. * The pbuf should contain n polygons which consist of 4 uint32_t values of 3 * vertices indices and 1 material index. * * \code * uint32_t pbuf[] = { 0, 1, 2, 0}; * int oid = s3d_new_object(); // create a new object * s3d_push_vertex(oid, 0.0, 0.0, 0.0); * s3d_push_vertex(oid, 0.0, 1.0, 0.0); * s3d_push_vertex(oid, 1.0, 0.0, 0.0); * s3d_push_material(oid, 0.3, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0); * s3d_push_polygons(oid, pbuf, 1); * // push one polygon with the pbuf data * \endcode */ int s3d_push_polygons(int object, const uint32_t *pbuf, uint16_t n) { uint32_t buf[(MF_LEN+4)/4]; const uint32_t *s; uint32_t *d; int f, i, j, len = n * 4 * 4; int flen, stepl; if (n < 1) return -1; stepl = ((int)((MF_LEN - 4) / (4 * 4))) * (4 * 4); f = len / (MF_LEN - 4) + 1; /* how many fragments? */ buf[0] = htonl(object); d = buf + 1; for (i = 0; i < f; i++) { if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); s = pbuf + i * stepl / 4; for (j = 0; j < flen / 4; j++) d[j] = htonl(s[j]); net_send(S3D_P_C_PUSH_POLY, (char *)buf, flen + 4); } return 0; } /** \brief push many lines * * Pushing n lines on the line stack of the object, each lbuf has a size of n*3, * each entry has the index number of the first vertex, second vertex and * material number just as in s3d_push_line(). */ int s3d_push_lines(int object, const uint32_t *lbuf, uint16_t n) { uint32_t buf[(MF_LEN+4)/4]; const uint32_t *s; uint32_t *d; int f, i, j, len = n * 4 * 3; int flen, stepl; if (n < 1) return -1; stepl = ((int)((MF_LEN - 4) / (4 * 3))) * (4 * 3); f = len / (MF_LEN - 4) + 1; /* how many fragments? */ buf[0] = htonl(object); d = buf + 1; for (i = 0; i < f; i++) { if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); s = lbuf + i * stepl / 4; for (j = 0; j < flen / 4; j++) d[j] = htonl(s[j]); net_send(S3D_P_C_PUSH_LINE, (char *)buf, flen + 4); } return 0; } /** \brief push texture * * Adds a new texture with height w and height h on the texture stack. */ int s3d_push_texture(int object, uint16_t w, uint16_t h) { char buf[4+2*2], *ptr; int len = 4 + 2 * 2; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint16_t *)ptr) = htons(w); ptr += sizeof(uint16_t); *((uint16_t *)ptr) = htons(h); net_send(S3D_P_C_PUSH_TEX, buf, len); return 0; } /** \brief push many textures * * As for vertices, you can push arrays of textures on the texture stack to have * greater performance. The tbuf should contain n texture sizes which consist of * 2 uint16_t values for width and height for each texture. */ int s3d_push_textures(int object, const uint16_t *tbuf, uint16_t n) { uint32_t buf[(MF_LEN+4)/4]; const uint16_t *s; uint16_t *d; int f, i, j, len = n * 2 * 2; int flen, stepl; if (n < 1) return -1; stepl = ((int)((MF_LEN - 4) / (2 * 2))) * (2 * 2); f = len / (MF_LEN - 4) + 1; /* how many fragments? */ *((uint32_t *)buf) = htonl(object); d = (uint16_t *)(buf + 1); for (i = 0; i < f; i++) { if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); s = tbuf + i * stepl / 2; for (j = 0; j < flen / 2; j++) d[j] = htons(s[j]); net_send(S3D_P_C_PUSH_TEX, (char *)buf, flen + 4); } return 0; } /* popping functions */ /** \brief remove vertices * * Deletes the latest n vertices from the vertex stack of the object. */ int s3d_pop_vertex(int object, uint32_t n) { uint32_t buf[2]; buf[0] = htonl(object); buf[1] = htonl(n); net_send(S3D_P_C_DEL_VERTEX, (char *)buf, 4*2); return 0; } /** \brief remove materials * * Deletes the latest n material from the material stack of the object. */ int s3d_pop_material(int object, uint32_t n) { uint32_t buf[2]; buf[0] = htonl(object); buf[1] = htonl(n); net_send(S3D_P_C_DEL_MAT, (char *)buf, 4*2); return 0; } /** \brief remove polygons * * Deletes the latest n polygon from the polygon stack of the object. */ int s3d_pop_polygon(int object, uint32_t n) { uint32_t buf[2]; buf[0] = htonl(object); buf[1] = htonl(n); net_send(S3D_P_C_DEL_POLY, (char *)buf, 4*2); return 0; } /** \brief remove lines * * Deletes the latest n lines from the line stack of the object. */ int s3d_pop_line(int object, uint32_t n) { uint32_t buf[2]; buf[0] = htonl(object); buf[1] = htonl(n); net_send(S3D_P_C_DEL_LINE, (char *)buf, 4*2); return 0; } /** \brief remove textures * * Deletes the latest n textures from the texture stack of the object. */ int s3d_pop_texture(int object, uint32_t n) { uint32_t buf[2]; buf[0] = htonl(object); buf[1] = htonl(n); net_send(S3D_P_C_DEL_TEX, (char *)buf, 4*2); return 0; } /* pepping/loading functions */ /** \brief rewrite material * * Overwriting the latest pushed material, overwriting the current value with * the specified one. See s3d_pep_materials_a if you want to pep more materials. */ int s3d_pep_material(int object, float amb_r, float amb_g, float amb_b, float spec_r, float spec_g, float spec_b, float diff_r, float diff_g, float diff_b ) { char buf[4+4*12]; char *ptr; int len = 4 + 4 * 12; /* s3dprintf(LOW, "adding a new material..."); */ ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = amb_r; ptr += sizeof(float); *((float *)ptr) = amb_g; ptr += sizeof(float); *((float *)ptr) = amb_b; ptr += sizeof(float); *((float *)ptr) = 1.0; ptr += sizeof(float); *((float *)ptr) = spec_r; ptr += sizeof(float); *((float *)ptr) = spec_g; ptr += sizeof(float); *((float *)ptr) = spec_b; ptr += sizeof(float); *((float *)ptr) = 1.0; ptr += sizeof(float); *((float *)ptr) = diff_r; ptr += sizeof(float); *((float *)ptr) = diff_g; ptr += sizeof(float); *((float *)ptr) = diff_b; ptr += sizeof(float); *((float *)ptr) = 1.0; htonfb((float*)(buf + sizeof(uint32_t)), 12); net_send(S3D_P_C_PEP_MAT, buf, len); return 0; /* nothing yet */ } /** \brief rewrite material with alpha * * Overwriting the latest pushed material, overwriting the current value with * the specified one, with alpha value in contrast to s3d_pep_material See * s3d_push_materials_a if you want to pep more materials. */ int s3d_pep_material_a(int object, float amb_r, float amb_g, float amb_b, float amb_a, float spec_r, float spec_g, float spec_b, float spec_a, float diff_r, float diff_g, float diff_b, float diff_a ) { char buf[4+4*12]; char *ptr; int len = 4 + 4 * 12; /* s3dprintf(LOW, "adding a new material..."); */ ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = amb_r; ptr += sizeof(float); *((float *)ptr) = amb_g; ptr += sizeof(float); *((float *)ptr) = amb_b; ptr += sizeof(float); *((float *)ptr) = amb_a; ptr += sizeof(float); *((float *)ptr) = spec_r; ptr += sizeof(float); *((float *)ptr) = spec_g; ptr += sizeof(float); *((float *)ptr) = spec_b; ptr += sizeof(float); *((float *)ptr) = spec_a; ptr += sizeof(float); *((float *)ptr) = diff_r; ptr += sizeof(float); *((float *)ptr) = diff_g; ptr += sizeof(float); *((float *)ptr) = diff_b; ptr += sizeof(float); *((float *)ptr) = diff_a; htonfb((float*)(buf + sizeof(uint32_t)), 12); net_send(S3D_P_C_PEP_MAT, buf, len); return 0; /* nothing yet */ } /** \brief rewrite materials with alpha * * Alters the last n pushed materials. See s3d_push_materials_a() for more * information how mbuf should look like. Use s3d_pep_material_a() if you only * want to alter the latest material. */ int s3d_pep_materials_a(int object, const float *mbuf, uint16_t n) { char buf[MF_LEN+4]; if ((n*12*sizeof(float) + 4) > MF_LEN) { errds(MED, "s3d_pep_materials_a()", "too much data"); return -1; /* impossible */ } *((uint32_t *)buf) = htonl(object); /* object id */ memcpy(buf + 4, mbuf, 12*n*sizeof(float)); htonfb((float*)(buf + sizeof(uint32_t)), n*12); net_send(S3D_P_C_PEP_MAT, buf, n*12*sizeof(float) + 4); return 0; } /** \brief add normals to polygon * * Adds normal information to polygons, giving each vertex of a polygon a normal * information. With this, you can achieve smoothed edge effects. * * nbuf should contain n * 9 float values, for each vertex a normal vector * (x,y,z), and you have 3 vertices for each Polygon so that makes 9 float * values per Polygon in total. Don't worry if you don't use this, it's kind of * hard to calculate and the server will always use some proper normal values * (same for every vertex, calculated by the plane which is defined by the 3 * points of the polygon. */ int s3d_pep_polygon_normals(int object, const float *nbuf, uint16_t n) { uint8_t buf[MF_LEN+4]; if ((n*9*sizeof(float) + 4) > MF_LEN) { errds(MED, "s3d_pep_polygon_normals()", "too much data"); return -1; /* impossible */ } *((uint32_t *)buf) = htonl(object); memcpy(buf + 4, nbuf, 9*n*sizeof(float)); htonfb((float*)(buf + sizeof(uint32_t)), 9*n); net_send(S3D_P_C_PEP_POLY_NORMAL, (char *)buf, n*9*sizeof(float) + 4); return 0; } /** \brief add normals to lines * * Adds normal information to lines, giving each vertex of a line a normal * information. This makes lines somewhat nicer, you'll need that especially * when you're going to build wireframe models. * * nbuf should contain n * 6 float values, for each vertex a normal vector * (x,y,z), and you have 2 vertices for each line so that makes 6 float values * per line in total. */ int s3d_pep_line_normals(int object, const float *nbuf, uint16_t n) { uint8_t buf[MF_LEN+4]; if ((n*9*sizeof(float) + 4) > MF_LEN) { errds(MED, "s3d_pep_line_normals()", "too much data"); return -1; /* impossible */ } *((uint32_t *)buf) = htonl(object); memcpy(buf + 4, nbuf, 6*n*sizeof(float)); htonfb((float*)(buf + sizeof(uint32_t)), 6*n); net_send(S3D_P_C_PEP_LINE_NORMAL, (char *)buf, n*6*sizeof(float) + 4); return 0; } /** \brief rewrite vertex * * Alter the latest pushed vertex, overwriting with the supplied values. */ int s3d_pep_vertex(int object, float x, float y, float z) { char buf[4+3*4], *ptr; int len = 4 + 3 * 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((float *)ptr) = x; ptr += sizeof(float); *((float *)ptr) = y; ptr += sizeof(float); *((float *)ptr) = z; htonfb((float*)(buf + sizeof(uint32_t)), 3); net_send(S3D_P_C_PEP_VERTEX, buf, len); return 0; } /** \brief rewrite line * * Alter the latest pushed line, overwriting with the supplied values. */ int s3d_pep_line(int object, int v1, int v2, int material) { char buf[4+3*4], *ptr; int len = 4 + 3 * 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(v1); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(v2); ptr += sizeof(uint32_t); *((uint32_t *)ptr) = htonl(material); net_send(S3D_P_C_PEP_LINE, buf, len); return 0; } /** \brief rewrite lines * * Alter the latest n pushed lines. lbuf holds the values which are used to * overwrite the old data, n entries with each 3 uint32_t specifying first, * second vertex and material of each line. */ int s3d_pep_lines(int object, const uint32_t *lbuf, uint16_t n) { uint32_t buf[MF_LEN+4]; int i; if ((n*3*4 + 4) > MF_LEN) { errds(MED, "s3d_pep_lines()", "too much data"); return -1; /* impossible */ } buf[0] = htonl(object); for (i = 0; i < 3*n; i++) buf[i+1] = htonl(lbuf[0]); net_send(S3D_P_C_PEP_LINE, (char *)buf, n*3*4 + 4); return 0; } /** \brief rewrite lines * * Alter the latest n pushed vertex. vbuf holds the values which are used to * overwrite the old data, n entries with each 3 floats specifying x,y,z of the * vertices. */ int s3d_pep_vertices(int object, const float *vbuf, uint16_t n) { uint8_t buf[MF_LEN+4]; if ((n*3*sizeof(float) + 4) > MF_LEN) { errds(MED, "s3d_pep_vertices()", "too much data"); return -1; /* impossible */ } *((uint32_t *)buf) = htonl(object); memcpy(buf + 4, vbuf, 3*n*sizeof(float)); htonfb((float*)(buf + sizeof(uint32_t)), 3*n); net_send(S3D_P_C_PEP_VERTEX, (char *)buf, n*3*sizeof(float) + 4); return 0; } /** \brief add texture coordinates to polygon * * Pimp the last polygon pushed with some textures coordinates, x and y values * for each vertex point respectively. Those values may be between 0 and 1 and * are vertex points on the texture defined in the material of the polygon. If * you have more polygons which should get a texture, use * s3d_pep_polygon_tex_coords() */ int s3d_pep_polygon_tex_coord(int object, float x1, float y1, float x2, float y2, float x3, float y3) { char *ptr, buf[4*6+4]; ptr = buf; *((uint32_t *)buf) = htonl(object); ptr += sizeof(uint32_t); *((float *)ptr) = x1; ptr += sizeof(float); *((float *)ptr) = y1; ptr += sizeof(float); *((float *)ptr) = x2; ptr += sizeof(float); *((float *)ptr) = y2; ptr += sizeof(float); *((float *)ptr) = x3; ptr += sizeof(float); *((float *)ptr) = y3; htonfb((float*)(buf + sizeof(uint32_t)), 6); net_send(S3D_P_C_PEP_POLY_TEXC, (char *)buf, 6*4 + 4); return 0; } /** \brief add texture coordinates to polygons * * Pimp the latest n polygons with texture coordinates. tbuf has 6*n float * values for its entries, which are supplied in the order as in * s3d_pep_polygon_tex_coord() */ int s3d_pep_polygon_tex_coords(int object, const float *tbuf, uint16_t n) { char buf[MF_LEN+4]; if ((n*6*sizeof(float)) > MF_LEN) { errds(MED, "s3d_pep_polygon_tex_coords()", "too much data"); return -1; /* impossible */ } *((uint32_t *)buf) = htonl(object); memcpy(buf + 4, tbuf, 6*n*sizeof(float)); htonfb((float*)(buf + sizeof(uint32_t)), 6*n); net_send(S3D_P_C_PEP_POLY_TEXC, (char *)buf, n*6*sizeof(float) + 4); return 0; } /** \brief add normals to polygon * * Just as s3d_pep_polygon_normals(), with the difference you won't alter the * latest n polygons but n polygons starting with index start. */ int s3d_load_polygon_normals(int object, const float *nbuf, uint32_t start, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 9 * 4; int flen, stepl; uint32_t mstart; if (n < 1) return -1; mstart = start; stepl = ((int)((MF_LEN - 8) / (9 * 4))) * (9 * 4); f = len / (MF_LEN - 8) + 1; /* how many fragments? */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(mstart); ptr += sizeof(uint32_t); /* start */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)nbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_LOAD_POLY_NORMAL, buf, flen + 8); mstart += stepl; } return 0; } /** \brief add normals to line * * Just as s3d_pep_line_normals(), with the difference you won't alter the * latest n lines but n lines starting with index start. */ int s3d_load_line_normals(int object, const float *nbuf, uint32_t start, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 6 * 4; int flen, stepl; uint32_t mstart; if (n < 1) return -1; mstart = start; stepl = ((int)((MF_LEN - 8) / (6 * 4))) * (6 * 4); f = len / (MF_LEN - 8) + 1; /* how many fragments? */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(mstart); ptr += sizeof(uint32_t); /* start */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)nbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_LOAD_LINE_NORMAL, buf, flen + 8); mstart += stepl; } return 0; } /** \brief add texture coordinates to polygons * * Just as s3d_pep_polygon_tex_coords(), with the difference you won't alter the * latest n polygons but n polygons starting with index start. */ int s3d_load_polygon_tex_coords(int object, const float *tbuf, uint32_t start, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 6 * 4; int flen, stepl; uint32_t mstart; if (n < 1) return -1; mstart = start; stepl = ((int)((MF_LEN - 8) / (6 * 4))) * (6 * 4); f = len / (MF_LEN - 8) + 1; /* how many fragments? */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(mstart); ptr += sizeof(uint32_t); /* start */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)tbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_LOAD_POLY_TEXC, buf, flen + 8); mstart += stepl; } return 0; } /** \brief add materials with alpha to polygons * * Loads n materials starting from index position start into the material stack. * See s3d_push_materials_a for more information about the values in mbuf. */ int s3d_load_materials_a(int object, const float *mbuf, uint32_t start, uint16_t n) { char buf[MF_LEN+4], *ptr; int f, i, len = n * 12 * 4; int flen, stepl; uint32_t mstart; if (n < 1) return -1; mstart = start; stepl = ((int)((MF_LEN - 8) / (12 * 4))) * (12 * 4); f = len / (MF_LEN - 8) + 1; /* how many fragments? */ for (i = 0; i < f; i++) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(mstart); ptr += sizeof(uint32_t); /* start */ if (len - i*stepl > stepl) flen = stepl; else flen = (len - i * stepl); memcpy(ptr, (char *)mbuf + i*stepl, flen); htonfb((float*)(ptr), flen / 4); net_send(S3D_P_C_LOAD_MAT, buf, flen + 8); mstart += stepl; } return 0; } /** \brief add texture to material * * Assign the latest material a texture referenced by the index tex. Of course, * you will have pushed this texture with s3d_push_texture() */ int s3d_pep_material_texture(int object, uint32_t tex) { char buf[4*2], *ptr; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(tex); net_send(S3D_P_C_PEP_MAT_TEX, buf, 8); return 0; } int _s3d_update_texture(int object, uint32_t tex, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h) { char buf[16], *ptr; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(tex); ptr += sizeof(uint32_t); /* texture number */ *((uint16_t *)ptr) = htons(xpos); ptr += sizeof(uint16_t); /* xpos */ *((uint16_t *)ptr) = htons(ypos); ptr += sizeof(uint16_t); /* ypos */ *((uint16_t *)ptr) = htons(w); ptr += sizeof(uint16_t); /* width */ *((uint16_t *)ptr) = htons(h); net_send(S3D_P_C_UPDATE_TEX, buf, 16); return 0; } /** \brief load texture from memory * * This will load an 32bit rgba image supplied in data at position xpos,ypos of * the texture tex. The image has the width w and height h. This can be used to * update only parts of the texture. It's no problem to supply big textures, * as the image will be sent to server in fragments. Of course, you will have * created the texture with s3d_push_texture, have an material assigned to the * texture with s3d_pep_material_texture() and have your polygons set sane * polygon texture coords using s3d_pep_polygon_tex_coord(). */ int s3d_load_texture(int object, uint32_t tex, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h, const uint8_t *data) { char buf[MF_LEN+4], *ptr; int linestep, lines, i; if (_s3d_load_texture_shm(object, tex, xpos, ypos, w, h, data) == 0) { /* TODO: send update event to server */ _s3d_update_texture(object, tex, xpos, ypos, w, h); return 0; /* did it over shm */ } linestep = (MF_LEN - 16) / (w * 4); if (linestep == 0) return -1; /* won't do that. .. yet */ for (i = 0; i < h; i += linestep) { ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); /* object id */ *((uint32_t *)ptr) = htonl(tex); ptr += sizeof(uint32_t); /* texture number */ *((uint16_t *)ptr) = htons(xpos); ptr += sizeof(uint16_t); /* xpos */ *((uint16_t *)ptr) = htons(ypos + i); ptr += sizeof(uint16_t); /* ypos */ *((uint16_t *)ptr) = htons(w); ptr += sizeof(uint16_t); /* width */ if ((h - i) > linestep) lines = linestep; else lines = h - i; *((uint16_t *)ptr) = htons(lines); ptr += sizeof(uint16_t); /* height */ memcpy(ptr, data + (i*w*4), lines*w*4); net_send(S3D_P_C_LOAD_TEX, buf, 16 + lines*w*4); } return 0; } /** \brief enable flags of object * * Turn some flags on for object. * * \remarks If you don't toggle OF_VISIBLE on, you won't see your object. usually * you want this. (at least after you *push()d all your content) */ int s3d_flags_on(int object, uint32_t flags) { char buf[4+1+4], *ptr; int len = 4 + 1 + 4; ptr = buf; /* s3dprintf(VLOW, "toggling flags on .. %010x", flags); */ *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); *ptr = OF_TURN_ON; ptr += sizeof(unsigned char); *((uint32_t *)ptr) = htonl(flags); net_send(S3D_P_C_TOGGLE_FLAGS, buf, len); return 0; } /** \brief disable flags of object * * Turn some flags off for object. */ int s3d_flags_off(int object, uint32_t flags) { char buf[4+1+4], *ptr; int len = 4 + 1 + 4; ptr = buf; /* s3dprintf(VLOW, "toggling flags off .. %010x", flags); */ *((uint32_t *)ptr) = htonl(object); ptr += sizeof(uint32_t); *ptr = OF_TURN_OFF; ptr += sizeof(unsigned char); *((uint32_t *)ptr) = htonl(flags); net_send(S3D_P_C_TOGGLE_FLAGS, buf, len); return 0; } /** \brief move object to absolute position * * Move the object to some position in space. when you create an object, it's * always located at 0.0 , 0.0, 0.0. * * \remarks Translation is absolute, not relative! * * \code * s3d_translate(object, 2, 0, 0); * s3d_translate(object, 4, 0, 0); * // object will end up at 4,0,0 and not 6,0,0!! * \endcode */ int s3d_translate(int object, float x, float y, float z) { char buf[4+4*3], *ptr; int len = 4 + 4 * 3; ptr = buf; /* s3dprintf(VLOW, "translating object to .. %f, %f, %f", x,y,z); */ *((uint32_t *)ptr) = htonl(object); ptr += 4; *((float *)ptr) = x; ptr += 4; *((float *)ptr) = y; ptr += 4; *((float *)ptr) = z; htonfb((float*)(buf + sizeof(uint32_t)), 3); net_send(S3D_P_C_TRANSLATE, buf, len); return 0; } /** \brief rotate object * * Rotate an object around the x, y and z-axis respectively. x,y,z may have * values between [0,360] degrees. * * You will usually only rotate around one axis, leaving the unused fields on 0, * I guess. If you want to rotate around more than one axis, please note: The * order of the rotation applies is y-axis, x-axis, and then z-axis. You can * think of it as the earth position coordinates: x is the longitude, y is the * latitude, and z is the rotation at this point of the earth around your bodies * axis. (I wonder if that makes it any clearer ;) * * \remarks Rotate is absolute, not relative! * * \code * s3d_rotate(object, 90, 0, 0); * s3d_rotate(object, 180, 0, 0); * // object will be rotated 180 degrees around the x-axis, not 270 degress! * \endcode */ int s3d_rotate(int object, float x, float y, float z) { char buf[4+4*3], *ptr; int len = 4 + 4 * 3; ptr = buf; /* s3dprintf(VLOW, "rotating object to .. %f, %f, %f", x,y,z); */ *((uint32_t *)ptr) = htonl(object); ptr += 4; *((float *)ptr) = x; ptr += 4; *((float *)ptr) = y; ptr += 4; *((float *)ptr) = z; htonfb((float*)(buf + sizeof(uint32_t)), 3); net_send(S3D_P_C_ROTATE, buf, len); return 0; } /** \brief scale object * * Scales the object. about factor s. s=1 will be the original size, -1 will * mirror it. * * \remarks s=0 is forbidden and will be ignored! s3d_scale is also absolute, * not relative! */ int s3d_scale(int object, float s) { char buf[4+4], *ptr; int len = 4 + 4; ptr = buf; *((uint32_t *)ptr) = htonl(object); ptr += 4; *((float *)ptr) = s; htonfb((float*)(buf + sizeof(uint32_t)), 1); net_send(S3D_P_C_SCALE, buf, len); return 0; } /** \brief focus mcp object * * This is an mcp-only function. It gives focus (for receiving key-strokes etc.) * to an app referenced by it's mcp-object-id. */ int s3d_mcp_focus(int object) { uint32_t buf = htonl(object); net_send(S3D_P_MCP_FOCUS, (char *)&buf, 4); return 0; } s3d-0.2.2.1/libs3d/s3d.h000066400000000000000000000226731361325167000144030ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich , * SPDX-FileCopyrightText: 2004-2015 Sven Eckelmann */ #ifndef LIBS3D_H #define LIBS3D_H #ifdef HAVE_GCCVISIBILITY #define S3DEXPORT_VISIBILITY __attribute__ ((visibility("default"))) #else #define S3DEXPORT_VISIBILITY #endif #ifdef HAVE_GCCEXTERNALLY #define S3DEXPORT_EXTERNAL __attribute__((externally_visible)) #else #define S3DEXPORT_EXTERNAL #endif #define S3DEXPORT S3DEXPORT_VISIBILITY S3DEXPORT_EXTERNAL #ifdef __GNUC_MINOR__ #define S3D_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #define S3D_PURE __attribute__ ((pure)) #else #define S3D_WARN_UNUSED_RESULT #define S3D_PURE #endif #include /* [u]intXX_t type definitions*/ /* definitions */ /** \brief event information * * This is the event information holder. */ struct s3d_evt { uint8_t event; /**< gives the event type */ int length; /**< gives the length of the buffer *buf */ char *buf; /**< is the pointer to the multiple purpose buffer, * which will have more specific information about the object */ struct s3d_evt *next; /**< can be safely ignored ;) */ }; /** * This defines the callback format. Each callback should return void and take * an argument of struct s3d_evt *. Callbacks can be defined with * s3d_set_callback(). */ typedef int (*s3d_cb)(struct s3d_evt *); #define S3D_EVENT_OBJ_CLICK 1 #define S3D_EVENT_KEY 2 #define S3D_EVENT_KEYDOWN 2 #define S3D_EVENT_MBUTTON 3 #define S3D_EVENT_KEYUP 4 #define S3D_EVENT_NEW_OBJECT 16 #define S3D_EVENT_OBJ_INFO 17 #define S3D_EVENT_QUIT 255 /* TODO: don't keep _MCP_ events .. they're ugly */ #define S3D_MCP_OBJECT 32 #define S3D_MCP_DEL_OBJECT 33 #define S3D_PORT 6066 #define S3D_OF_VISIBLE 0x00000001 #define S3D_OF_SELECTABLE 0x00000002 #define S3D_OF_POINTABLE 0x00000004 /** \brief master control program object * * \deprecated don't use, to be removed soon (use struct s3d_but_info). ;) */ struct mcp_object { uint32_t object; float trans_x, trans_y, trans_z; float r; #define MCP_NEW_OBJECT 1 char name[256]; }; /** \brief object information * * Can be used on the buffer of an event of type S3D_EVENT_OBJ_INFO. name will * usually contain nothing for usual objects, but mcp objects will contain the * applications names here. r is the radius of the convex sphere an object, * which will also be interesting for the mcp. * * Special objects like camera, pointer will have the "sys_" prefix in the name * and will be named "pointer0", "pointer1" ... or "cam0", "cam1" ... For cam * object, scale will contain the aspect ratio. */ struct s3d_obj_info { uint32_t object; uint32_t flags; float trans_x, trans_y, trans_z; float rot_x, rot_y, rot_z; float scale; float r; char name[256]; }; /** \brief status of a button * * Can be used on the buffer of an event of type S3D_EVENT_MBUTTON. */ struct s3d_but_info { uint8_t button; /* 0 = left, 1 = middle, 2 = right */ uint8_t state; /* 0 = down, 1 = up, 2 = moving */ }; /** \brief key event information * * Can be used on the buffer of an event of type S3D_EVENT_KEY*. */ struct s3d_key_event { uint16_t keysym; /* the symbol, use this with s3d_keysym.h */ uint16_t unicode; /* the unicode or "actually typed" character */ uint16_t modifier; /* any modifiers involved */ uint16_t state; /* 0 = pressed, 1 = released */ }; #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* framework functions */ S3DEXPORT void s3d_usage(void); S3DEXPORT int s3d_init(int *argc, char ***argv, const char *name); S3DEXPORT int s3d_quit(void); S3DEXPORT int s3d_mainloop(void(*f)(void)); /* object manipulations */ S3DEXPORT int s3d_push_vertex(int object, float x, float y, float z); S3DEXPORT int s3d_push_vertices(int object, const float *vbuf, uint16_t n); S3DEXPORT int s3d_push_material(int object, float amb_r, float amb_g, float amb_b, float spec_r, float spec_g, float spec_b, float diff_r, float diff_g, float diff_b); S3DEXPORT int s3d_pep_material(int object, float amb_r, float amb_g, float amb_b, float spec_r, float spec_g, float spec_b, float diff_r, float diff_g, float diff_b); S3DEXPORT int s3d_push_material_a(int object, float amb_r, float amb_g, float amb_b, float amb_a, float spec_r, float spec_g, float spec_b, float spec_a, float diff_r, float diff_g, float diff_b, float diff_a); S3DEXPORT int s3d_push_materials_a(int object, const float *mbuf, uint16_t n); S3DEXPORT int s3d_pep_material_a(int object, float amb_r, float amb_g, float amb_b, float amb_a, float spec_r, float spec_g, float spec_b, float spec_a, float diff_r, float diff_g, float diff_b, float diff_a); S3DEXPORT int s3d_pep_materials_a(int object, const float *mbuf, uint16_t n); S3DEXPORT int s3d_load_materials_a(int object, const float *mbuf, uint32_t start, uint16_t n); S3DEXPORT int s3d_push_polygon(int object, uint32_t v1, uint32_t v2, uint32_t v3, uint32_t material); S3DEXPORT int s3d_push_polygons(int object, const uint32_t *pbuf, uint16_t n); S3DEXPORT int s3d_push_line(int object, uint32_t v1, uint32_t v2, uint32_t material); S3DEXPORT int s3d_push_lines(int object, const uint32_t *lbuf, uint16_t n); S3DEXPORT int s3d_push_texture(int object, uint16_t w, uint16_t h); S3DEXPORT int s3d_push_textures(int object, const uint16_t *tbuf, uint16_t n); S3DEXPORT int s3d_pop_vertex(int object, uint32_t n); S3DEXPORT int s3d_pop_polygon(int object, uint32_t n); S3DEXPORT int s3d_pop_material(int object, uint32_t n); S3DEXPORT int s3d_pop_texture(int object, uint32_t n); S3DEXPORT int s3d_pop_polygon(int object, uint32_t n); S3DEXPORT int s3d_pop_line(int object, uint32_t n); S3DEXPORT int s3d_pep_line_normals(int object, const float *nbuf, uint16_t n); S3DEXPORT int s3d_pep_polygon_normals(int object, const float *nbuf, uint16_t n); S3DEXPORT int s3d_pep_polygon_tex_coord(int object, float x1, float y1, float x2, float y2, float x3, float y3); S3DEXPORT int s3d_pep_polygon_tex_coords(int object, const float *tbuf, uint16_t n); S3DEXPORT int s3d_pep_material_texture(int object, uint32_t tex); S3DEXPORT int s3d_pep_vertex(int object, float x, float y, float z); S3DEXPORT int s3d_pep_vertices(int object, const float *vbuf, uint16_t n); S3DEXPORT int s3d_pep_line(int object, int v1, int v2, int material); S3DEXPORT int s3d_pep_lines(int object, const uint32_t *lbuf, uint16_t n); S3DEXPORT int s3d_load_line_normals(int object, const float *nbuf, uint32_t start, uint16_t n); S3DEXPORT int s3d_load_polygon_normals(int object, const float *nbuf, uint32_t start, uint16_t n); S3DEXPORT int s3d_load_polygon_tex_coords(int object, const float *tbuf, uint32_t start, uint16_t n); S3DEXPORT int s3d_load_texture(int object, uint32_t tex, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h, const uint8_t *data); S3DEXPORT int s3d_new_object(void) S3D_WARN_UNUSED_RESULT; S3DEXPORT int s3d_del_object(int oid); S3DEXPORT int s3d_clone(int oid) S3D_WARN_UNUSED_RESULT; S3DEXPORT int s3d_clone_target(int oid, int toid); S3DEXPORT int s3d_link(int oid_from, int oid_to); S3DEXPORT int s3d_unlink(int oid); S3DEXPORT int s3d_flags_on(int object, uint32_t flags); S3DEXPORT int s3d_flags_off(int object, uint32_t flags); S3DEXPORT int s3d_translate(int object, float x, float y, float z); S3DEXPORT int s3d_rotate(int object, float x, float y, float z); S3DEXPORT int s3d_scale(int object, float s); /* high-level object creating */ S3DEXPORT int s3d_import_model_file(const char *fname) S3D_WARN_UNUSED_RESULT; S3DEXPORT int s3d_open_file(const char *fname, char **pointer); S3DEXPORT int s3d_select_font(const char *mask); S3DEXPORT int s3d_draw_string(const char *str, float *xlen); S3DEXPORT float s3d_strlen(const char *str); /* some vector calculation helpers */ S3DEXPORT float s3d_vector_length(const float vector[]) S3D_PURE; S3DEXPORT float s3d_vector_dot_product(const float vector1[], const float vector2[]) S3D_PURE; S3DEXPORT void s3d_vector_subtract(const float vector1[], const float vector2[], float result_vector[]); S3DEXPORT float s3d_vector_angle(const float vector1[], const float vector2[]) S3D_PURE; S3DEXPORT float s3d_angle_to_cam(const float obj_pos[], const float cam_pos[], float *angle_rad); S3DEXPORT void s3d_vector_cross_product(const float vector1[], const float vector2[], float result_vector[]); /* event handlers */ S3DEXPORT void s3d_push_event(struct s3d_evt *newevt); S3DEXPORT struct s3d_evt *s3d_pop_event(void) S3D_WARN_UNUSED_RESULT; S3DEXPORT struct s3d_evt *s3d_find_event(uint8_t event) S3D_PURE; S3DEXPORT int s3d_delete_event(const struct s3d_evt *devt); S3DEXPORT void s3d_set_callback(uint8_t event, s3d_cb func); S3DEXPORT void s3d_clear_callback(uint8_t event); S3DEXPORT void s3d_ignore_callback(uint8_t event); S3DEXPORT s3d_cb s3d_get_callback(uint8_t event) S3D_PURE; S3DEXPORT void s3d_process_stack(void); /* mcp special */ S3DEXPORT int s3d_mcp_focus(int object); /* for apps which don't employ s3d_mainloop() */ S3DEXPORT int s3d_net_check(void); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif s3d-0.2.2.1/libs3d/s3d_keysym.h000066400000000000000000000151651361325167000160020ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1997-2015 Sam Lantinga */ #ifndef _S3D_KEYSYM_H_ #define _S3D_KEYSYM_H_ /* this is just a copy of SDL_keysym.sh from the SDL Simple DirectMedia Layer Package, * which seems to have a pretty useful Key definition base. * For more Information about SDL, check http://sdlorg*/ /* What we really want is a mapping of every raw key on the keyboard. To support international keyboards, we use the range 0xA1 - 0xFF as international virtual keycodes. We'll follow in the footsteps of X11... The names of the keys */ typedef enum { /* The keyboard syms have been cleverly chosen to map to ASCII */ S3DK_UNKNOWN = 0, S3DK_FIRST = 0, S3DK_BACKSPACE = 8, S3DK_TAB = 9, S3DK_CLEAR = 12, S3DK_RETURN = 13, S3DK_PAUSE = 19, S3DK_ESCAPE = 27, S3DK_SPACE = 32, S3DK_EXCLAIM = 33, S3DK_QUOTEDBL = 34, S3DK_HASH = 35, S3DK_DOLLAR = 36, S3DK_AMPERSAND = 38, S3DK_QUOTE = 39, S3DK_LEFTPAREN = 40, S3DK_RIGHTPAREN = 41, S3DK_ASTERISK = 42, S3DK_PLUS = 43, S3DK_COMMA = 44, S3DK_MINUS = 45, S3DK_PERIOD = 46, S3DK_SLASH = 47, S3DK_0 = 48, S3DK_1 = 49, S3DK_2 = 50, S3DK_3 = 51, S3DK_4 = 52, S3DK_5 = 53, S3DK_6 = 54, S3DK_7 = 55, S3DK_8 = 56, S3DK_9 = 57, S3DK_COLON = 58, S3DK_SEMICOLON = 59, S3DK_LESS = 60, S3DK_EQUALS = 61, S3DK_GREATER = 62, S3DK_QUESTION = 63, S3DK_AT = 64, /* Skip uppercase letters */ S3DK_LEFTBRACKET = 91, S3DK_BACKSLASH = 92, S3DK_RIGHTBRACKET = 93, S3DK_CARET = 94, S3DK_UNDERSCORE = 95, S3DK_BACKQUOTE = 96, S3DK_a = 97, S3DK_b = 98, S3DK_c = 99, S3DK_d = 100, S3DK_e = 101, S3DK_f = 102, S3DK_g = 103, S3DK_h = 104, S3DK_i = 105, S3DK_j = 106, S3DK_k = 107, S3DK_l = 108, S3DK_m = 109, S3DK_n = 110, S3DK_o = 111, S3DK_p = 112, S3DK_q = 113, S3DK_r = 114, S3DK_s = 115, S3DK_t = 116, S3DK_u = 117, S3DK_v = 118, S3DK_w = 119, S3DK_x = 120, S3DK_y = 121, S3DK_z = 122, S3DK_DELETE = 127, /* End of ASCII mapped keysyms */ /* International keyboard syms */ S3DK_WORLD_0 = 160, /* 0xA0 */ S3DK_WORLD_1 = 161, S3DK_WORLD_2 = 162, S3DK_WORLD_3 = 163, S3DK_WORLD_4 = 164, S3DK_WORLD_5 = 165, S3DK_WORLD_6 = 166, S3DK_WORLD_7 = 167, S3DK_WORLD_8 = 168, S3DK_WORLD_9 = 169, S3DK_WORLD_10 = 170, S3DK_WORLD_11 = 171, S3DK_WORLD_12 = 172, S3DK_WORLD_13 = 173, S3DK_WORLD_14 = 174, S3DK_WORLD_15 = 175, S3DK_WORLD_16 = 176, S3DK_WORLD_17 = 177, S3DK_WORLD_18 = 178, S3DK_WORLD_19 = 179, S3DK_WORLD_20 = 180, S3DK_WORLD_21 = 181, S3DK_WORLD_22 = 182, S3DK_WORLD_23 = 183, S3DK_WORLD_24 = 184, S3DK_WORLD_25 = 185, S3DK_WORLD_26 = 186, S3DK_WORLD_27 = 187, S3DK_WORLD_28 = 188, S3DK_WORLD_29 = 189, S3DK_WORLD_30 = 190, S3DK_WORLD_31 = 191, S3DK_WORLD_32 = 192, S3DK_WORLD_33 = 193, S3DK_WORLD_34 = 194, S3DK_WORLD_35 = 195, S3DK_WORLD_36 = 196, S3DK_WORLD_37 = 197, S3DK_WORLD_38 = 198, S3DK_WORLD_39 = 199, S3DK_WORLD_40 = 200, S3DK_WORLD_41 = 201, S3DK_WORLD_42 = 202, S3DK_WORLD_43 = 203, S3DK_WORLD_44 = 204, S3DK_WORLD_45 = 205, S3DK_WORLD_46 = 206, S3DK_WORLD_47 = 207, S3DK_WORLD_48 = 208, S3DK_WORLD_49 = 209, S3DK_WORLD_50 = 210, S3DK_WORLD_51 = 211, S3DK_WORLD_52 = 212, S3DK_WORLD_53 = 213, S3DK_WORLD_54 = 214, S3DK_WORLD_55 = 215, S3DK_WORLD_56 = 216, S3DK_WORLD_57 = 217, S3DK_WORLD_58 = 218, S3DK_WORLD_59 = 219, S3DK_WORLD_60 = 220, S3DK_WORLD_61 = 221, S3DK_WORLD_62 = 222, S3DK_WORLD_63 = 223, S3DK_WORLD_64 = 224, S3DK_WORLD_65 = 225, S3DK_WORLD_66 = 226, S3DK_WORLD_67 = 227, S3DK_WORLD_68 = 228, S3DK_WORLD_69 = 229, S3DK_WORLD_70 = 230, S3DK_WORLD_71 = 231, S3DK_WORLD_72 = 232, S3DK_WORLD_73 = 233, S3DK_WORLD_74 = 234, S3DK_WORLD_75 = 235, S3DK_WORLD_76 = 236, S3DK_WORLD_77 = 237, S3DK_WORLD_78 = 238, S3DK_WORLD_79 = 239, S3DK_WORLD_80 = 240, S3DK_WORLD_81 = 241, S3DK_WORLD_82 = 242, S3DK_WORLD_83 = 243, S3DK_WORLD_84 = 244, S3DK_WORLD_85 = 245, S3DK_WORLD_86 = 246, S3DK_WORLD_87 = 247, S3DK_WORLD_88 = 248, S3DK_WORLD_89 = 249, S3DK_WORLD_90 = 250, S3DK_WORLD_91 = 251, S3DK_WORLD_92 = 252, S3DK_WORLD_93 = 253, S3DK_WORLD_94 = 254, S3DK_WORLD_95 = 255, /* 0xFF */ /* Numeric keypad */ S3DK_KP0 = 256, S3DK_KP1 = 257, S3DK_KP2 = 258, S3DK_KP3 = 259, S3DK_KP4 = 260, S3DK_KP5 = 261, S3DK_KP6 = 262, S3DK_KP7 = 263, S3DK_KP8 = 264, S3DK_KP9 = 265, S3DK_KP_PERIOD = 266, S3DK_KP_DIVIDE = 267, S3DK_KP_MULTIPLY = 268, S3DK_KP_MINUS = 269, S3DK_KP_PLUS = 270, S3DK_KP_ENTER = 271, S3DK_KP_EQUALS = 272, /* Arrows + Home/End pad */ S3DK_UP = 273, S3DK_DOWN = 274, S3DK_RIGHT = 275, S3DK_LEFT = 276, S3DK_INSERT = 277, S3DK_HOME = 278, S3DK_END = 279, S3DK_PAGEUP = 280, S3DK_PAGEDOWN = 281, /* Function keys */ S3DK_F1 = 282, S3DK_F2 = 283, S3DK_F3 = 284, S3DK_F4 = 285, S3DK_F5 = 286, S3DK_F6 = 287, S3DK_F7 = 288, S3DK_F8 = 289, S3DK_F9 = 290, S3DK_F10 = 291, S3DK_F11 = 292, S3DK_F12 = 293, S3DK_F13 = 294, S3DK_F14 = 295, S3DK_F15 = 296, /* Key state modifier keys */ S3DK_NUMLOCK = 300, S3DK_CAPSLOCK = 301, S3DK_SCROLLOCK = 302, S3DK_RSHIFT = 303, S3DK_LSHIFT = 304, S3DK_RCTRL = 305, S3DK_LCTRL = 306, S3DK_RALT = 307, S3DK_LALT = 308, S3DK_RMETA = 309, S3DK_LMETA = 310, S3DK_LSUPER = 311, /* Left "Windows" key */ S3DK_RSUPER = 312, /* Right "Windows" key */ S3DK_MODE = 313, /* "Alt Gr" key */ S3DK_COMPOSE = 314, /* Multi-key compose key */ /* Miscellaneous function keys */ S3DK_HELP = 315, S3DK_PRINT = 316, S3DK_SYSREQ = 317, S3DK_BREAK = 318, S3DK_MENU = 319, S3DK_POWER = 320, /* Power Macintosh power key */ S3DK_EURO = 321, /* Some european keyboards */ S3DK_UNDO = 322, /* Atari keyboard has Undo */ /* Add any other keys here */ S3DK_LAST } S3DKey; /* Enumeration of valid key mods (possibly OR'd together) */ typedef enum { S3D_KMOD_NONE = 0x0000, S3D_KMOD_LSHIFT = 0x0001, S3D_KMOD_RSHIFT = 0x0002, S3D_KMOD_LCTRL = 0x0040, S3D_KMOD_RCTRL = 0x0080, S3D_KMOD_LALT = 0x0100, S3D_KMOD_RALT = 0x0200, S3D_KMOD_LMETA = 0x0400, S3D_KMOD_RMETA = 0x0800, S3D_KMOD_NUM = 0x1000, S3D_KMOD_CAPS = 0x2000, S3D_KMOD_MODE = 0x4000, S3D_KMOD_RESERVED = 0x8000 } S3DMod; #define S3D_KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) #define S3D_KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) #define S3D_KMOD_ALT (KMOD_LALT|KMOD_RALT) #define S3D_KMOD_META (KMOD_LMETA|KMOD_RMETA) #endif /* _S3D_KEYSYM_H_ */ s3d-0.2.2.1/libs3d/s3dlib.h000066400000000000000000000115161361325167000150640ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #ifndef _S3DLIB_H_ #define _S3DLIB_H_ #include #include "s3d.h" #include "config.h" #ifdef __APPLE__ #ifdef SHM #undef SHM #endif #endif #ifndef S3DUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DUNUSED(x) /* x */ #else #define S3DUNUSED(x) x #endif #endif #ifdef __GNUC_MINOR__ #define S3D_FORMAT(type, fmt_pos, arg_pos) __attribute__ ((format (type, fmt_pos, arg_pos))) #else #define S3D_FORMAT(type, fmt_pos, arg_pos) #endif #define VLOW 1 #define LOW 2 #define MED 3 #define HIGH 4 #define VHIGH 5 #define DBM_MAX 1024 /* maximum size of a debug message string */ #define S3D_NAME_MAX 256 /* limit for names [e.g. process names] */ #define OF_TURN_ON 1 /* logical or */ #define OF_TURN_OFF 2 /* logical ?! */ #define OF_TURN_SWAP 3 /* logical ?! */ #define TIMEOUT 100000 #define MAX_CB 256 /* as much as there are callbacks */ #ifndef NULL #if !defined(__cplusplus) #define NULL ((void*)0) #else #define NULL 0 #endif /* !defined(__cplusplus) */ #endif /* NULL */ #define CON_NULL 0 #define CON_SHM 1 #define CON_TCP 2 #define SHM_SIZE sizeof(key_t)*2 /* space for the keys */ #define RB_STD_SIZE 1024*512 #define RB_OVERHEAD sizeof(struct buf_t) /* the callback buiffer: */ extern int cb_lock; /* holds the recursion depth */ extern int _s3d_ready; /* is 1 after s3d_init() was sucessful */ extern s3d_cb s3d_cb_list[MAX_CB]; /* some local prototypes: */ /* char *s3d_open_file(char *fname); */ int net_prot_in(uint8_t opcode, uint16_t length, char *buf); /* what we get from the wires */ struct s3d_texshm { int32_t oid, tex, shmid; uint16_t tw, th, w, h; } __attribute__((__packed__)); /* for internal use. */ struct s3d_tex { struct s3d_texshm tshm; char *buf; } __attribute__((__packed__)); #ifdef DEBUG S3DEXPORT void s3dprintf(int relevance, const char *fmt, ...) S3D_FORMAT(printf, 2, 3); S3DEXPORT void errdn(int relevance, const char *func, int en); S3DEXPORT void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4); #else static void s3dprintf(int relevance, const char *fmt, ...) S3D_FORMAT(printf, 2, 3); static void errdn(int relevance, const char *func, int en); static void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4); static __inline__ void s3dprintf(int S3DUNUSED(relevance), const char *S3DUNUSED(fmt), ...) {} static __inline__ void errdn(int S3DUNUSED(relevance), const char *S3DUNUSED(func), int S3DUNUSED(en)) {} static __inline__ void errds(int S3DUNUSED(relevance), const char *S3DUNUSED(func), const char *S3DUNUSED(fmt), ...) {} #endif void errn(const char *func, int en); void errs(const char *func, const char *msg); /* fontselect.c */ char *s3d_findfont(const char *mask); /* object_queue.c */ int _queue_init(void); int _queue_fill(void); int _queue_new_object(unsigned int oid); unsigned int _queue_want_object(void); int _queue_quit(void); /* io.c */ #ifdef SIGS extern int _s3d_sigio; #endif /* network.c */ extern int con_type; int net_send(uint8_t opcode, char *buf, uint16_t length); int s3d_net_init(char *urlc); /* proto_out.c */ int _s3d_update_texture(int object, uint32_t tex, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h); #ifdef TCP /* tcp.c */ int _tcp_init(const char *sv, int pn); int _tcp_quit(void); int _s3d_tcp_net_receive(void); int tcp_writen(char *str, int s); int tcp_readn(char *str, int s); #endif /* shm_ringbuf.c */ #ifdef SHM struct buf_t { uint32_t start, end, bufsize; /* start/end of the data */ }; unsigned int shm_write(struct buf_t *rb, char *buf, unsigned int n); unsigned int shm_read(struct buf_t *rb, char *buf, unsigned int n); /* shm.c */ int _shm_init(char *ftoken); int _shm_quit(void); int _shm_net_receive(void); int shm_writen(char *str, int s); int shm_readn(char *str, int s); #endif /* freetype.c */ struct t_buf { float *vbuf; uint32_t *pbuf; int pn, vn; float xoff; }; /* tesselate.c */ struct tessp_t { int next, prev, done; }; int _s3d_tesselate(struct tessp_t *t, struct t_buf *b); /* texture.c */ int _s3d_texture_init(void); int _s3d_texture_quit(void); void _s3d_handle_texshm(struct s3d_texshm *tshm); int _s3d_load_texture_shm(int object, uint32_t tid, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h, const uint8_t *data); /* endian.c */ void htonfb(float* netfloat, int num); void ntohfb(float* netfloat, int num); void htonlb(uint32_t* netint32, int num); void ntohlb(uint32_t* netint32, int num); void htonsb(uint16_t* netint16, int num); void ntohsb(uint16_t* netint16, int num); #endif /* _S3DLIB_H_ */ s3d-0.2.2.1/libs3d/sei_construct.c000066400000000000000000000561641361325167000165730ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #include "sei_triangulate.h" #include #include /* memset() */ #include #include #include #include "s3d.h" #include "s3dlib.h" node_t qs[QSIZE]; /* Query structure */ trap_t tr[TRSIZE]; /* Trapezoid structure */ segment_t seg[SEGSIZE]; /* Segment table */ static int q_idx; static int tr_idx; /* Return a new node to be added into the query tree */ static int newnode(void) { if (q_idx < QSIZE) return q_idx++; else { errs("sei:newnode()", "Query-table overflow"); return -1; } } /* Return a free trapezoid */ static int newtrap(void) { if (tr_idx < TRSIZE) { tr[tr_idx].lseg = -1; tr[tr_idx].rseg = -1; tr[tr_idx].state = ST_VALID; return tr_idx++; } else { errs("sei:newtrap()", "Trapezoid-table overflow"); return -1; } } /* Return the maximum of the two points into the yval structure */ static int _max(point_t *yval, point_t *v0, point_t *v1) { if (v0->y > v1->y + C_EPS) *yval = *v0; else if (FP_EQUAL(v0->y, v1->y)) { if (v0->x > v1->x + C_EPS) *yval = *v0; else *yval = *v1; } else *yval = *v1; return 0; } /* Return the minimum of the two points into the yval structure */ static int _min(point_t *yval, point_t *v0, point_t *v1) { if (v0->y < v1->y - C_EPS) *yval = *v0; else if (FP_EQUAL(v0->y, v1->y)) { if (v0->x < v1->x) *yval = *v0; else *yval = *v1; } else *yval = *v1; return 0; } int _greater_than(point_t *v0, point_t *v1) { if (v0->y > v1->y + C_EPS) return TRUE; else if (v0->y < v1->y - C_EPS) return FALSE; else return v0->x > v1->x; } int _equal_to(point_t *v0, point_t *v1) { return FP_EQUAL(v0->y, v1->y) && FP_EQUAL(v0->x, v1->x); } int _greater_than_equal_to(point_t *v0, point_t *v1) { if (v0->y > v1->y + C_EPS) return TRUE; else if (v0->y < v1->y - C_EPS) return FALSE; else return v0->x >= v1->x; } int _less_than(point_t *v0, point_t *v1) { if (v0->y < v1->y - C_EPS) return TRUE; else if (v0->y > v1->y + C_EPS) return FALSE; else return v0->x < v1->x; } /* Initilialise the query structure (Q) and the trapezoid table (T) * when the first segment is added to start the trapezoidation. The * query-tree starts out with 4 trapezoids, one S-node and 2 Y-nodes * * 4 * ----------------------------------- * \ * 1 \ 2 * \ * ----------------------------------- * 3 */ static int init_query_structure(int segnum) { int i1, i2, i3, i4, i5, i6, i7, root; int t1, t2, t3, t4; segment_t *s = &seg[segnum]; q_idx = tr_idx = 1; memset((void *)tr, 0, sizeof(tr)); memset((void *)qs, 0, sizeof(qs)); i1 = newnode(); qs[i1].nodetype = T_Y; _max(&qs[i1].yval, &s->v0, &s->v1); /* root */ root = i1; qs[i1].right = i2 = newnode(); qs[i2].nodetype = T_SINK; qs[i2].parent = i1; qs[i1].left = i3 = newnode(); qs[i3].nodetype = T_Y; _min(&qs[i3].yval, &s->v0, &s->v1); /* root */ qs[i3].parent = i1; qs[i3].left = i4 = newnode(); qs[i4].nodetype = T_SINK; qs[i4].parent = i3; qs[i3].right = i5 = newnode(); qs[i5].nodetype = T_X; qs[i5].segnum = segnum; qs[i5].parent = i3; qs[i5].left = i6 = newnode(); qs[i6].nodetype = T_SINK; qs[i6].parent = i5; qs[i5].right = i7 = newnode(); qs[i7].nodetype = T_SINK; qs[i7].parent = i5; t1 = newtrap(); /* middle left */ t2 = newtrap(); /* middle right */ t3 = newtrap(); /* bottom-most */ t4 = newtrap(); /* topmost */ tr[t1].hi = tr[t2].hi = tr[t4].lo = qs[i1].yval; tr[t1].lo = tr[t2].lo = tr[t3].hi = qs[i3].yval; tr[t4].hi.y = HUGE_VAL; tr[t4].hi.x = HUGE_VAL; tr[t3].lo.y = -HUGE_VAL; tr[t3].lo.x = -HUGE_VAL; tr[t1].rseg = tr[t2].lseg = segnum; tr[t1].u0 = tr[t2].u0 = t4; tr[t1].d0 = tr[t2].d0 = t3; tr[t4].d0 = tr[t3].u0 = t1; tr[t4].d1 = tr[t3].u1 = t2; tr[t1].sink = i6; tr[t2].sink = i7; tr[t3].sink = i4; tr[t4].sink = i2; tr[t1].state = tr[t2].state = ST_VALID; tr[t3].state = tr[t4].state = ST_VALID; qs[i2].trnum = t4; qs[i4].trnum = t3; qs[i6].trnum = t1; qs[i7].trnum = t2; s->is_inserted = TRUE; return root; } /* Retun TRUE if the vertex v is to the left of line segment no. * segnum. Takes care of the degenerate cases when both the vertices * have the same y--cood, etc. */ static int is_left_of(int segnum, point_t *v) { segment_t *s = &seg[segnum]; double area; if (_greater_than(&s->v1, &s->v0)) { /* seg. going upwards */ if (FP_EQUAL(s->v1.y, v->y)) { if (v->x < s->v1.x) area = 1.0; else area = -1.0; } else if (FP_EQUAL(s->v0.y, v->y)) { if (v->x < s->v0.x) area = 1.0; else area = -1.0; } else area = CROSS(s->v0, s->v1, (*v)); } else { /* v0 > v1 */ if (FP_EQUAL(s->v1.y, v->y)) { if (v->x < s->v1.x) area = 1.0; else area = -1.0; } else if (FP_EQUAL(s->v0.y, v->y)) { if (v->x < s->v0.x) area = 1.0; else area = -1.0; } else area = CROSS(s->v1, s->v0, (*v)); } if (area > 0.0) return TRUE; else return FALSE; } /* Returns true if the corresponding endpoint of the given segment is */ /* already inserted into the segment tree. Use the simple test of */ /* whether the segment which shares this endpoint is already inserted */ static int inserted(int segnum, int whichpt) { if (whichpt == FIRSTPT) return seg[seg[segnum].prev].is_inserted; else return seg[seg[segnum].next].is_inserted; } /* This is query routine which determines which trapezoid does the * point v lie in. The return value is the trapezoid number. */ int locate_endpoint(point_t *v, point_t *vo, int r) { node_t *rptr = &qs[r]; switch (rptr->nodetype) { case T_SINK: return rptr->trnum; case T_Y: if (_greater_than(v, &rptr->yval)) /* above */ return locate_endpoint(v, vo, rptr->right); else if (_equal_to(v, &rptr->yval)) { /* the point is already */ /* inserted. */ if (_greater_than(vo, &rptr->yval)) /* above */ return locate_endpoint(v, vo, rptr->right); else return locate_endpoint(v, vo, rptr->left); /* below */ } else return locate_endpoint(v, vo, rptr->left); /* below */ case T_X: if (_equal_to(v, &seg[rptr->segnum].v0) || _equal_to(v, &seg[rptr->segnum].v1)) { if (FP_EQUAL(v->y, vo->y)) { /* horizontal segment */ if (vo->x < v->x) return locate_endpoint(v, vo, rptr->left); /* left */ else return locate_endpoint(v, vo, rptr->right); /* right */ } else if (is_left_of(rptr->segnum, vo)) return locate_endpoint(v, vo, rptr->left); /* left */ else return locate_endpoint(v, vo, rptr->right); /* right */ } else if (is_left_of(rptr->segnum, v)) return locate_endpoint(v, vo, rptr->left); /* left */ else return locate_endpoint(v, vo, rptr->right); /* right */ default: errs("sei:locate_endpoint()", "Haggu!!!! (whatever)"); break; } return -1; } /* Thread in the segment into the existing trapezoidation. The * limiting trapezoids are given by tfirst and tlast (which are the * trapezoids containing the two endpoints of the segment. Merges all * possible trapezoids which flank this segment and have been recently * divided because of its insertion */ static int merge_trapezoids(int segnum, int tfirst, int tlast, int side) { int t, tnext, cond; int ptnext; /* First merge polys on the LHS */ t = tfirst; while ((t > 0) && _greater_than_equal_to(&tr[t].lo, &tr[tlast].lo)) { if (side == S_LEFT) cond = ((((tnext = tr[t].d0) > 0) && (tr[tnext].rseg == segnum)) || (((tnext = tr[t].d1) > 0) && (tr[tnext].rseg == segnum))); else cond = ((((tnext = tr[t].d0) > 0) && (tr[tnext].lseg == segnum)) || (((tnext = tr[t].d1) > 0) && (tr[tnext].lseg == segnum))); if (cond) { if ((tr[t].lseg == tr[tnext].lseg) && (tr[t].rseg == tr[tnext].rseg)) { /* good neighbours */ /* merge them */ /* Use the upper node as the new node i.e. t */ ptnext = qs[tr[tnext].sink].parent; if (qs[ptnext].left == tr[tnext].sink) qs[ptnext].left = tr[t].sink; else qs[ptnext].right = tr[t].sink; /* redirect parent */ /* Change the upper neighbours of the lower trapezoids */ if ((tr[t].d0 = tr[tnext].d0) > 0) { if (tr[tr[t].d0].u0 == tnext) tr[tr[t].d0].u0 = t; else if (tr[tr[t].d0].u1 == tnext) tr[tr[t].d0].u1 = t; } if ((tr[t].d1 = tr[tnext].d1) > 0) { if (tr[tr[t].d1].u0 == tnext) tr[tr[t].d1].u0 = t; else if (tr[tr[t].d1].u1 == tnext) tr[tr[t].d1].u1 = t; } tr[t].lo = tr[tnext].lo; tr[tnext].state = ST_INVALID; /* invalidate the lower */ /* trapezium */ } else /* not good neighbours */ t = tnext; } else /* do not satisfy the outer if */ t = tnext; } /* end-while */ return 0; } /* Add in the new segment into the trapezoidation and update Q and T * structures. First locate the two endpoints of the segment in the * Q-structure. Then start from the topmost trapezoid and go down to * the lower trapezoid dividing all the trapezoids in between . */ static int add_segment(int segnum) { segment_t s; int tu, tl, sk, tfirst, tlast; int tfirstr = 0, tlastr = 0, tfirstl, tlastl; int i1, i2, t, tn; point_t tpt; int tribot = 0, is_swapped = 0; int tmptriseg; int tmpseg = 1; s = seg[segnum]; if (_greater_than(&s.v1, &s.v0)) { /* Get higher vertex in v0 */ int tmp; tpt = s.v0; s.v0 = s.v1; s.v1 = tpt; tmp = s.root0; s.root0 = s.root1; s.root1 = tmp; is_swapped = TRUE; } if ((is_swapped) ? !inserted(segnum, LASTPT) : !inserted(segnum, FIRSTPT)) { /* insert v0 in the tree */ int tmp_d; tu = locate_endpoint(&s.v0, &s.v1, s.root0); tl = newtrap(); /* tl is the new lower trapezoid */ tr[tl].state = ST_VALID; tr[tl] = tr[tu]; tr[tu].lo.y = tr[tl].hi.y = s.v0.y; tr[tu].lo.x = tr[tl].hi.x = s.v0.x; tr[tu].d0 = tl; tr[tu].d1 = 0; tr[tl].u0 = tu; tr[tl].u1 = 0; if (((tmp_d = tr[tl].d0) > 0) && (tr[tmp_d].u0 == tu)) tr[tmp_d].u0 = tl; if (((tmp_d = tr[tl].d0) > 0) && (tr[tmp_d].u1 == tu)) tr[tmp_d].u1 = tl; if (((tmp_d = tr[tl].d1) > 0) && (tr[tmp_d].u0 == tu)) tr[tmp_d].u0 = tl; if (((tmp_d = tr[tl].d1) > 0) && (tr[tmp_d].u1 == tu)) tr[tmp_d].u1 = tl; /* Now update the query structure and obtain the sinks for the */ /* two trapezoids */ i1 = newnode(); /* Upper trapezoid sink */ i2 = newnode(); /* Lower trapezoid sink */ sk = tr[tu].sink; qs[sk].nodetype = T_Y; qs[sk].yval = s.v0; qs[sk].segnum = segnum; /* not really reqd ... maybe later */ qs[sk].left = i2; qs[sk].right = i1; qs[i1].nodetype = T_SINK; qs[i1].trnum = tu; qs[i1].parent = sk; qs[i2].nodetype = T_SINK; qs[i2].trnum = tl; qs[i2].parent = sk; tr[tu].sink = i1; tr[tl].sink = i2; tfirst = tl; } else { /* v0 already present */ /* Get the topmost intersecting trapezoid */ tfirst = locate_endpoint(&s.v0, &s.v1, s.root0); } if ((is_swapped) ? !inserted(segnum, FIRSTPT) : !inserted(segnum, LASTPT)) { /* insert v1 in the tree */ int tmp_d; tu = locate_endpoint(&s.v1, &s.v0, s.root1); tl = newtrap(); /* tl is the new lower trapezoid */ tr[tl].state = ST_VALID; tr[tl] = tr[tu]; tr[tu].lo.y = tr[tl].hi.y = s.v1.y; tr[tu].lo.x = tr[tl].hi.x = s.v1.x; tr[tu].d0 = tl; tr[tu].d1 = 0; tr[tl].u0 = tu; tr[tl].u1 = 0; if (((tmp_d = tr[tl].d0) > 0) && (tr[tmp_d].u0 == tu)) tr[tmp_d].u0 = tl; if (((tmp_d = tr[tl].d0) > 0) && (tr[tmp_d].u1 == tu)) tr[tmp_d].u1 = tl; if (((tmp_d = tr[tl].d1) > 0) && (tr[tmp_d].u0 == tu)) tr[tmp_d].u0 = tl; if (((tmp_d = tr[tl].d1) > 0) && (tr[tmp_d].u1 == tu)) tr[tmp_d].u1 = tl; /* Now update the query structure and obtain the sinks for the */ /* two trapezoids */ i1 = newnode(); /* Upper trapezoid sink */ i2 = newnode(); /* Lower trapezoid sink */ sk = tr[tu].sink; qs[sk].nodetype = T_Y; qs[sk].yval = s.v1; qs[sk].segnum = segnum; /* not really reqd ... maybe later */ qs[sk].left = i2; qs[sk].right = i1; qs[i1].nodetype = T_SINK; qs[i1].trnum = tu; qs[i1].parent = sk; qs[i2].nodetype = T_SINK; qs[i2].trnum = tl; qs[i2].parent = sk; tr[tu].sink = i1; tr[tl].sink = i2; tlast = tu; } else { /* v1 already present */ /* Get the lowermost intersecting trapezoid */ tlast = locate_endpoint(&s.v1, &s.v0, s.root1); tribot = 1; } /* Thread the segment into the query tree creating a new X-node */ /* First, split all the trapezoids which are intersected by s into */ /* two */ t = tfirst; /* topmost trapezoid */ while ((t > 0) && _greater_than_equal_to(&tr[t].lo, &tr[tlast].lo)) /* traverse from top to bot */ { int t_sav, tn_sav; sk = tr[t].sink; i1 = newnode(); /* left trapezoid sink */ i2 = newnode(); /* right trapezoid sink */ qs[sk].nodetype = T_X; qs[sk].segnum = segnum; qs[sk].left = i1; qs[sk].right = i2; qs[i1].nodetype = T_SINK; /* left trapezoid (use existing one) */ qs[i1].trnum = t; qs[i1].parent = sk; qs[i2].nodetype = T_SINK; /* right trapezoid (allocate new) */ qs[i2].trnum = tn = newtrap(); tr[tn].state = ST_VALID; qs[i2].parent = sk; if (t == tfirst) tfirstr = tn; if (_equal_to(&tr[t].lo, &tr[tlast].lo)) tlastr = tn; tr[tn] = tr[t]; tr[t].sink = i1; tr[tn].sink = i2; t_sav = t; tn_sav = tn; /* error */ if ((tr[t].d0 <= 0) && (tr[t].d1 <= 0)) { /* case cannot arise */ errs("sei:add_segment()", "error"); break; } /* only one trapezoid below. partition t into two and make the */ /* two resulting trapezoids t and tn as the upper neighbours of */ /* the sole lower trapezoid */ else if ((tr[t].d0 > 0) && (tr[t].d1 <= 0)) { /* Only one trapezoid below */ if ((tr[t].u0 > 0) && (tr[t].u1 > 0)) { /* continuation of a chain from abv. */ if (tr[t].usave > 0) { /* three upper neighbours */ if (tr[t].uside == S_LEFT) { tr[tn].u0 = tr[t].u1; tr[t].u1 = -1; tr[tn].u1 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[tn].u0].d0 = tn; tr[tr[tn].u1].d0 = tn; } else { /* intersects in the right */ tr[tn].u1 = -1; tr[tn].u0 = tr[t].u1; tr[t].u1 = tr[t].u0; tr[t].u0 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[t].u1].d0 = t; tr[tr[tn].u0].d0 = tn; } tr[t].usave = tr[tn].usave = 0; } else { /* No usave.... simple case */ tr[tn].u0 = tr[t].u1; tr[t].u1 = tr[tn].u1 = -1; tr[tr[tn].u0].d0 = tn; } } else { /* fresh seg. or upward cusp */ int tmp_u = tr[t].u0; int td0; if (((td0 = tr[tmp_u].d0) > 0) && (tr[tmp_u].d1 > 0)) { /* upward cusp */ if ((tr[td0].rseg > 0) && !is_left_of(tr[td0].rseg, &s.v1)) { tr[t].u0 = tr[t].u1 = tr[tn].u1 = -1; tr[tr[tn].u0].d1 = tn; } else { /* cusp going leftwards */ tr[tn].u0 = tr[tn].u1 = tr[t].u1 = -1; tr[tr[t].u0].d0 = t; } } else { /* fresh segment */ tr[tr[t].u0].d0 = t; tr[tr[t].u0].d1 = tn; } } if (FP_EQUAL(tr[t].lo.y, tr[tlast].lo.y) && FP_EQUAL(tr[t].lo.x, tr[tlast].lo.x) && tribot) { /* bottom forms a triangle */ if (is_swapped) tmptriseg = seg[segnum].prev; else tmptriseg = seg[segnum].next; if ((tmptriseg > 0) && is_left_of(tmptriseg, &s.v0)) { /* L-R downward cusp */ tr[tr[t].d0].u0 = t; tr[tn].d0 = tr[tn].d1 = -1; } else { /* R-L downward cusp */ tr[tr[tn].d0].u1 = tn; tr[t].d0 = tr[t].d1 = -1; } } else { if ((tr[tr[t].d0].u0 > 0) && (tr[tr[t].d0].u1 > 0)) { if (tr[tr[t].d0].u0 == t) { /* passes thru LHS */ tr[tr[t].d0].usave = tr[tr[t].d0].u1; tr[tr[t].d0].uside = S_LEFT; } else { tr[tr[t].d0].usave = tr[tr[t].d0].u0; tr[tr[t].d0].uside = S_RIGHT; } } tr[tr[t].d0].u0 = t; tr[tr[t].d0].u1 = tn; } t = tr[t].d0; } else if ((tr[t].d0 <= 0) && (tr[t].d1 > 0)) { /* Only one trapezoid below */ if ((tr[t].u0 > 0) && (tr[t].u1 > 0)) { /* continuation of a chain from abv. */ if (tr[t].usave > 0) { /* three upper neighbours */ if (tr[t].uside == S_LEFT) { tr[tn].u0 = tr[t].u1; tr[t].u1 = -1; tr[tn].u1 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[tn].u0].d0 = tn; tr[tr[tn].u1].d0 = tn; } else { /* intersects in the right */ tr[tn].u1 = -1; tr[tn].u0 = tr[t].u1; tr[t].u1 = tr[t].u0; tr[t].u0 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[t].u1].d0 = t; tr[tr[tn].u0].d0 = tn; } tr[t].usave = tr[tn].usave = 0; } else { /* No usave.... simple case */ tr[tn].u0 = tr[t].u1; tr[t].u1 = tr[tn].u1 = -1; tr[tr[tn].u0].d0 = tn; } } else { /* fresh seg. or upward cusp */ int tmp_u = tr[t].u0; int td0; if (((td0 = tr[tmp_u].d0) > 0) && (tr[tmp_u].d1 > 0)) { /* upward cusp */ if ((tr[td0].rseg > 0) && !is_left_of(tr[td0].rseg, &s.v1)) { tr[t].u0 = tr[t].u1 = tr[tn].u1 = -1; tr[tr[tn].u0].d1 = tn; } else { tr[tn].u0 = tr[tn].u1 = tr[t].u1 = -1; tr[tr[t].u0].d0 = t; } } else { /* fresh segment */ tr[tr[t].u0].d0 = t; tr[tr[t].u0].d1 = tn; } } if (FP_EQUAL(tr[t].lo.y, tr[tlast].lo.y) && FP_EQUAL(tr[t].lo.x, tr[tlast].lo.x) && tribot) { /* bottom forms a triangle */ if ((tmpseg > 0) && is_left_of(tmpseg, &s.v0)) { /* L-R downward cusp */ tr[tr[t].d1].u0 = t; tr[tn].d0 = tr[tn].d1 = -1; } else { /* R-L downward cusp */ tr[tr[tn].d1].u1 = tn; tr[t].d0 = tr[t].d1 = -1; } } else { if ((tr[tr[t].d1].u0 > 0) && (tr[tr[t].d1].u1 > 0)) { if (tr[tr[t].d1].u0 == t) { /* passes thru LHS */ tr[tr[t].d1].usave = tr[tr[t].d1].u1; tr[tr[t].d1].uside = S_LEFT; } else { tr[tr[t].d1].usave = tr[tr[t].d1].u0; tr[tr[t].d1].uside = S_RIGHT; } } tr[tr[t].d1].u0 = t; tr[tr[t].d1].u1 = tn; } t = tr[t].d1; } /* two trapezoids below. Find out which one is intersected by */ /* this segment and proceed down that one */ else { double y0, yt; point_t tmppt; int tnext, i_d0; tmpseg = tr[tr[t].d0].rseg; i_d0 = FALSE; if (FP_EQUAL(tr[t].lo.y, s.v0.y)) { if (tr[t].lo.x > s.v0.x) i_d0 = TRUE; } else { tmppt.y = y0 = tr[t].lo.y; yt = (y0 - s.v0.y) / (s.v1.y - s.v0.y); tmppt.x = s.v0.x + yt * (s.v1.x - s.v0.x); if (_less_than(&tmppt, &tr[t].lo)) i_d0 = TRUE; } /* check continuity from the top so that the lower-neighbour */ /* values are properly filled for the upper trapezoid */ if ((tr[t].u0 > 0) && (tr[t].u1 > 0)) { /* continuation of a chain from abv. */ if (tr[t].usave > 0) { /* three upper neighbours */ if (tr[t].uside == S_LEFT) { tr[tn].u0 = tr[t].u1; tr[t].u1 = -1; tr[tn].u1 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[tn].u0].d0 = tn; tr[tr[tn].u1].d0 = tn; } else { /* intersects in the right */ tr[tn].u1 = -1; tr[tn].u0 = tr[t].u1; tr[t].u1 = tr[t].u0; tr[t].u0 = tr[t].usave; tr[tr[t].u0].d0 = t; tr[tr[t].u1].d0 = t; tr[tr[tn].u0].d0 = tn; } tr[t].usave = tr[tn].usave = 0; } else { /* No usave.... simple case */ tr[tn].u0 = tr[t].u1; tr[tn].u1 = -1; tr[t].u1 = -1; tr[tr[tn].u0].d0 = tn; } } else { /* fresh seg. or upward cusp */ int tmp_u = tr[t].u0; int td0; if (((td0 = tr[tmp_u].d0) > 0) && (tr[tmp_u].d1 > 0)) { /* upward cusp */ if ((tr[td0].rseg > 0) && !is_left_of(tr[td0].rseg, &s.v1)) { tr[t].u0 = tr[t].u1 = tr[tn].u1 = -1; tr[tr[tn].u0].d1 = tn; } else { tr[tn].u0 = tr[tn].u1 = tr[t].u1 = -1; tr[tr[t].u0].d0 = t; } } else { /* fresh segment */ tr[tr[t].u0].d0 = t; tr[tr[t].u0].d1 = tn; } } if (FP_EQUAL(tr[t].lo.y, tr[tlast].lo.y) && FP_EQUAL(tr[t].lo.x, tr[tlast].lo.x) && tribot) { /* this case arises only at the lowest trapezoid.. i.e. tlast, if the lower endpoint of the segment is already inserted in the structure */ tr[tr[t].d0].u0 = t; tr[tr[t].d0].u1 = -1; tr[tr[t].d1].u0 = tn; tr[tr[t].d1].u1 = -1; tr[tn].d0 = tr[t].d1; tr[t].d1 = tr[tn].d1 = -1; tnext = tr[t].d1; } else if (i_d0) /* intersecting d0 */ { tr[tr[t].d0].u0 = t; tr[tr[t].d0].u1 = tn; tr[tr[t].d1].u0 = tn; tr[tr[t].d1].u1 = -1; /* new code to determine the bottom neighbours of the */ /* newly partitioned trapezoid */ tr[t].d1 = -1; tnext = tr[t].d0; } else { /* intersecting d1 */ tr[tr[t].d0].u0 = t; tr[tr[t].d0].u1 = -1; tr[tr[t].d1].u0 = t; tr[tr[t].d1].u1 = tn; /* new code to determine the bottom neighbours of the */ /* newly partitioned trapezoid */ tr[tn].d0 = tr[t].d1; tr[tn].d1 = -1; tnext = tr[t].d1; } t = tnext; } tr[t_sav].rseg = tr[tn_sav].lseg = segnum; } /* end-while */ /* Now combine those trapezoids which share common segments. We can */ /* use the pointers to the parent to connect these together. This */ /* works only because all these new trapezoids have been formed */ /* due to splitting by the segment, and hence have only one parent */ tfirstl = tfirst; tlastl = tlast; merge_trapezoids(segnum, tfirstl, tlastl, S_LEFT); merge_trapezoids(segnum, tfirstr, tlastr, S_RIGHT); seg[segnum].is_inserted = TRUE; return 0; } /* Update the roots stored for each of the endpoints of the segment. * This is done to speed up the location-query for the endpoint when * the segment is inserted into the trapezoidation subsequently */ static int find_new_roots(int segnum) { segment_t *s = &seg[segnum]; if (s->is_inserted) return 0; s->root0 = locate_endpoint(&s->v0, &s->v1, s->root0); s->root0 = tr[s->root0].sink; s->root1 = locate_endpoint(&s->v1, &s->v0, s->root1); s->root1 = tr[s->root1].sink; return 0; } /* Main routine to perform trapezoidation */ int construct_trapezoids(int nseg) { register int i; int root, h; /* Add the first segment and get the query structure and trapezoid */ /* list initialised */ root = init_query_structure(choose_segment()); for (i = 1; i <= nseg; i++) seg[i].root0 = seg[i].root1 = root; for (h = 1; h <= math_logstar_n(nseg); h++) { for (i = math_N(nseg, h - 1) + 1; i <= math_N(nseg, h); i++) add_segment(choose_segment()); /* Find a new root for each of the segment endpoints */ for (i = 1; i <= nseg; i++) find_new_roots(i); } for (i = math_N(nseg, math_logstar_n(nseg)) + 1; i <= nseg; i++) add_segment(choose_segment()); return 0; } s3d-0.2.2.1/libs3d/sei_interface.h000066400000000000000000000017131361325167000165020ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #ifndef __interface_h #define __interface_h #define TRUE 1 #define FALSE 0 extern int sei_triangulate_polygon(int, int *, double(*)[2], int (*)[3]); extern int is_point_inside_polygon(double *); #endif /* __interface_h */ s3d-0.2.2.1/libs3d/sei_misc.c000066400000000000000000000036701361325167000154740ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #include "sei_triangulate.h" #include #include #include #include #include #include "s3d.h" #include "s3dlib.h" static int choose_idx; static int permute[SEGSIZE]; static double mlog2(double x) { return log(x) / log(2); } /* Generate a random permutation of the segments 1..n */ int generate_random_ordering(int n) { struct timeval tval; register int i; int m, st[SEGSIZE], *p; choose_idx = 1; gettimeofday(&tval, NULL); srand48(tval.tv_sec); for (i = 0; i <= n; i++) st[i] = i; p = st; for (i = 1; i <= n; i++, p++) { m = lrand48() % (n + 1 - i) + 1; permute[i] = p[m]; if (m != 1) p[m] = p[1]; } return 0; } /* Return the next segment in the generated random ordering of all the */ /* segments in S */ int choose_segment(void) { errds(VLOW, "sei:choose_segment()", "%d", permute[choose_idx]); return permute[choose_idx++]; } /* Get log*n for given n */ int math_logstar_n(int n) { register int i; double v; for (i = 0, v = (double) n; v >= 1; i++) v = mlog2(v); return i - 1; } int math_N(int n, int h) { register int i; double v; for (i = 0, v = (int) n; i < h; i++) v = mlog2(v); return (int) ceil((double) 1.0*n / v); } s3d-0.2.2.1/libs3d/sei_monotone.c000066400000000000000000000422521361325167000163760ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #include "sei_triangulate.h" #include #include /* memset() */ #include #include #include #include "s3d.h" #include "s3dlib.h" #define CROSS_SINE(v0, v1) ((v0).x * (v1).y - (v1).x * (v0).y) #define LENGTH(v0) (sqrt((v0).x * (v0).x + (v0).y * (v0).y)) static monchain_t mchain[TRSIZE]; /* Table to hold all the monotone */ /* polygons . Each monotone polygon */ /* is a circularly linked list */ static vertexchain_t vert[SEGSIZE]; /* chain init. information. This */ /* is used to decide which */ /* monotone polygon to split if */ /* there are several other */ /* polygons touching at the same */ /* vertex */ static int mon[SEGSIZE]; /* contains position of any vertex in */ /* the monotone chain for the polygon */ static int visited[TRSIZE]; static int chain_idx, op_idx, mon_idx; static int triangulate_single_polygon(int, int, int, int (*)[3]); static int traverse_polygon(int, int, int, int); /* Function returns TRUE if the trapezoid lies inside the polygon */ static int inside_polygon(trap_t *t) { int rseg = t->rseg; if (t->state == ST_INVALID) return 0; if ((t->lseg <= 0) || (t->rseg <= 0)) return 0; if (((t->u0 <= 0) && (t->u1 <= 0)) || ((t->d0 <= 0) && (t->d1 <= 0))) /* triangle */ return _greater_than(&seg[rseg].v1, &seg[rseg].v0); return 0; } /* return a new mon structure from the table */ static int newmon(void) { return ++mon_idx; } /* return a new chain element from the table */ static int new_chain_element(void) { return ++chain_idx; } static double get_angle(point_t *vp0, point_t *vpnext, point_t *vp1) { point_t v0, v1; v0.x = vpnext->x - vp0->x; v0.y = vpnext->y - vp0->y; v1.x = vp1->x - vp0->x; v1.y = vp1->y - vp0->y; if (CROSS_SINE(v0, v1) >= 0) /* sine is positive */ return DOT(v0, v1) / LENGTH(v0) / LENGTH(v1); else return -1.0 * DOT(v0, v1) / LENGTH(v0) / LENGTH(v1) - 2; } /* (v0, v1) is the new diagonal to be added to the polygon. Find which */ /* chain to use and return the positions of v0 and v1 in p and q */ static int get_vertex_positions(int v0, int v1, int *ip, int *iq) { vertexchain_t *vp0, *vp1; register int i; double angle, temp; int tp, tq; tp = tq = 0; vp0 = &vert[v0]; vp1 = &vert[v1]; /* p is identified as follows. Scan from (v0, v1) rightwards till */ /* you hit the first segment starting from v0. That chain is the */ /* chain of our interest */ angle = -4.0; for (i = 0; i < 4; i++) { if (vp0->vnext[i] <= 0) continue; if ((temp = get_angle(&vp0->pt, &(vert[vp0->vnext[i]].pt), &vp1->pt)) > angle) { angle = temp; tp = i; } } *ip = tp; /* Do similar actions for q */ angle = -4.0; for (i = 0; i < 4; i++) { if (vp1->vnext[i] <= 0) continue; if ((temp = get_angle(&vp1->pt, &(vert[vp1->vnext[i]].pt), &vp0->pt)) > angle) { angle = temp; tq = i; } } *iq = tq; return 0; } /* v0 and v1 are specified in anti-clockwise order with respect to * the current monotone polygon mcur. Split the current polygon into * two polygons using the diagonal (v0, v1) */ static int make_new_monotone_poly(int mcur, int v0, int v1) { int p, q, ip, iq; int mnew = newmon(); int i, j, nf0, nf1; vertexchain_t *vp0, *vp1; vp0 = &vert[v0]; vp1 = &vert[v1]; get_vertex_positions(v0, v1, &ip, &iq); p = vp0->vpos[ip]; q = vp1->vpos[iq]; /* At this stage, we have got the positions of v0 and v1 in the */ /* desired chain. Now modify the linked lists */ i = new_chain_element(); /* for the new list */ j = new_chain_element(); mchain[i].vnum = v0; mchain[j].vnum = v1; mchain[i].next = mchain[p].next; mchain[mchain[p].next].prev = i; mchain[i].prev = j; mchain[j].next = i; mchain[j].prev = mchain[q].prev; mchain[mchain[q].prev].next = j; mchain[p].next = q; mchain[q].prev = p; nf0 = vp0->nextfree; nf1 = vp1->nextfree; vp0->vnext[ip] = v1; vp0->vpos[nf0] = i; vp0->vnext[nf0] = mchain[mchain[i].next].vnum; vp1->vpos[nf1] = j; vp1->vnext[nf1] = v0; vp0->nextfree++; vp1->nextfree++; errds(VLOW, "sei:make_poly()", ": mcur = %d, (v0, v1) = (%d, %d)", mcur, v0, v1); errds(VLOW, "sei:make_poly()", "next posns = (p, q) = (%d, %d)", p, q); mon[mcur] = p; mon[mnew] = i; return mnew; } /* Main routine to get monotone polygons from the trapezoidation of * the polygon. */ int monotonate_trapezoids(int n) { register int i; int tr_start; memset((void *)vert, 0, sizeof(vert)); memset((void *)visited, 0, sizeof(visited)); memset((void *)mchain, 0, sizeof(mchain)); memset((void *)mon, 0, sizeof(mon)); /* First locate a trapezoid which lies inside the polygon */ /* and which is triangular */ for (i = 0; i < TRSIZE; i++) if (inside_polygon(&tr[i])) break; tr_start = i; /* Initialise the mon data-structure and start spanning all the */ /* trapezoids within the polygon */ for (i = 1; i <= n; i++) { mchain[i].prev = seg[i].prev; mchain[i].next = seg[i].next; mchain[i].vnum = i; vert[i].pt = seg[i].v0; vert[i].vnext[0] = seg[i].next; /* next vertex */ vert[i].vpos[0] = i; /* locn. of next vertex */ vert[i].nextfree = 1; } chain_idx = n; mon_idx = 0; mon[0] = 1; /* position of any vertex in the first */ /* chain */ /* traverse the polygon */ if (tr[tr_start].u0 > 0) traverse_polygon(0, tr_start, tr[tr_start].u0, TR_FROM_UP); else if (tr[tr_start].d0 > 0) traverse_polygon(0, tr_start, tr[tr_start].d0, TR_FROM_DN); /* return the number of polygons created */ return newmon(); } /* recursively visit all the trapezoids */ static int traverse_polygon(int mcur, int trnum, int from, int dir) { trap_t *t = &tr[trnum]; int mnew; int v0, v1; int retval = -1; if ((trnum <= 0) || visited[trnum]) return 0; visited[trnum] = TRUE; /* We have much more information available here. */ /* rseg: goes upwards */ /* lseg: goes downwards */ /* Initially assume that dir = TR_FROM_DN (from the left) */ /* Switch v0 and v1 if necessary afterwards */ /* special cases for triangles with cusps at the opposite ends. */ /* take care of this first */ if ((t->u0 <= 0) && (t->u1 <= 0)) { if ((t->d0 > 0) && (t->d1 > 0)) { /* downward opening triangle */ v0 = tr[t->d1].lseg; v1 = t->lseg; if (from == t->d1) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); } } else { retval = SP_NOSPLIT; /* Just traverse all neighbours */ traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); } } else if ((t->d0 <= 0) && (t->d1 <= 0)) { if ((t->u0 > 0) && (t->u1 > 0)) { /* upward opening triangle */ v0 = t->rseg; v1 = tr[t->u0].rseg; if (from == t->u1) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); } } else { retval = SP_NOSPLIT; /* Just traverse all neighbours */ traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); } } else if ((t->u0 > 0) && (t->u1 > 0)) { if ((t->d0 > 0) && (t->d1 > 0)) { /* downward + upward cusps */ v0 = tr[t->d1].lseg; v1 = tr[t->u0].rseg; retval = SP_2UP_2DN; if (((dir == TR_FROM_DN) && (t->d1 == from)) || ((dir == TR_FROM_UP) && (t->u1 == from))) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); } } else { /* only downward cusp */ if (_equal_to(&t->lo, &seg[t->lseg].v1)) { v0 = tr[t->u0].rseg; v1 = seg[t->lseg].next; retval = SP_2UP_LEFT; if ((dir == TR_FROM_UP) && (t->u0 == from)) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); } } else { v0 = t->rseg; v1 = tr[t->u0].rseg; retval = SP_2UP_RIGHT; if ((dir == TR_FROM_UP) && (t->u1 == from)) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); } } } } else if ((t->u0 > 0) || (t->u1 > 0)) { /* no downward cusp */ if ((t->d0 > 0) && (t->d1 > 0)) { /* only upward cusp */ if (_equal_to(&t->hi, &seg[t->lseg].v0)) { v0 = tr[t->d1].lseg; v1 = t->lseg; retval = SP_2DN_LEFT; if (!((dir == TR_FROM_DN) && (t->d0 == from))) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); } } else { v0 = tr[t->d1].lseg; v1 = seg[t->rseg].next; retval = SP_2DN_RIGHT; if ((dir == TR_FROM_DN) && (t->d1 == from)) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); } } } else { /* no cusp */ if (_equal_to(&t->hi, &seg[t->lseg].v0) && _equal_to(&t->lo, &seg[t->rseg].v0)) { v0 = t->rseg; v1 = t->lseg; retval = SP_SIMPLE_LRDN; if (dir == TR_FROM_UP) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); } } else if (_equal_to(&t->hi, &seg[t->rseg].v1) && _equal_to(&t->lo, &seg[t->lseg].v1)) { v0 = seg[t->rseg].next; v1 = seg[t->lseg].next; retval = SP_SIMPLE_LRUP; if (dir == TR_FROM_UP) { mnew = make_new_monotone_poly(mcur, v1, v0); traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mnew, t->d1, trnum, TR_FROM_UP); traverse_polygon(mnew, t->d0, trnum, TR_FROM_UP); } else { mnew = make_new_monotone_poly(mcur, v0, v1); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mnew, t->u0, trnum, TR_FROM_DN); traverse_polygon(mnew, t->u1, trnum, TR_FROM_DN); } } else { /* no split possible */ retval = SP_NOSPLIT; traverse_polygon(mcur, t->u0, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d0, trnum, TR_FROM_UP); traverse_polygon(mcur, t->u1, trnum, TR_FROM_DN); traverse_polygon(mcur, t->d1, trnum, TR_FROM_UP); } } } return retval; } /* For each monotone polygon, find the ymax and ymin (to determine the */ /* two y-monotone chains) and pass on this monotone polygon for greedy */ /* triangulation. */ /* Take care not to triangulate duplicate monotone polygons */ int triangulate_monotone_polygons(int nvert, int nmonpoly, int op[][3]) { register int i; point_t ymax, ymin; int p, vfirst, posmax, v; int vcount, processed; op_idx = 0; for (i = 0; i < nmonpoly; i++) { vcount = 1; processed = FALSE; vfirst = mchain[mon[i]].vnum; ymax = ymin = vert[vfirst].pt; posmax = mon[i]; mchain[mon[i]].marked = TRUE; p = mchain[mon[i]].next; while ((v = mchain[p].vnum) != vfirst) { if (mchain[p].marked) { processed = TRUE; break; /* break from while */ } else mchain[p].marked = TRUE; if (_greater_than(&vert[v].pt, &ymax)) { ymax = vert[v].pt; posmax = p; } if (_less_than(&vert[v].pt, &ymin)) { ymin = vert[v].pt; } p = mchain[p].next; vcount++; } if (processed) /* Go to next polygon */ continue; if (vcount == 3) { /* already a triangle */ op[op_idx][0] = mchain[p].vnum; op[op_idx][1] = mchain[mchain[p].next].vnum; op[op_idx][2] = mchain[mchain[p].prev].vnum; op_idx++; } else { /* triangulate the polygon */ v = mchain[mchain[posmax].next].vnum; if (_equal_to(&vert[v].pt, &ymin)) { /* LHS is a single line */ triangulate_single_polygon(nvert, posmax, TRI_LHS, op); } else triangulate_single_polygon(nvert, posmax, TRI_RHS, op); } } for (i = 0; i < op_idx; i++) errds(VLOW, "sei:triangulate_monotone_polygons()", "tri #%d: (%d, %d, %d)\n", i, op[i][0], op[i][1], op[i][2]); return op_idx; } /* A greedy corner-cutting algorithm to triangulate a y-monotone * polygon in O(n) time. * Joseph O-Rourke, Computational Geometry in C. */ static int triangulate_single_polygon(int nvert, int posmax, int side, int op[][3]) { register int v; int rc[SEGSIZE], ri = 0; /* reflex chain */ int endv, tmp, vpos; if (side == TRI_RHS) { /* RHS segment is a single segment */ rc[0] = mchain[posmax].vnum; tmp = mchain[posmax].next; rc[1] = mchain[tmp].vnum; ri = 1; vpos = mchain[tmp].next; v = mchain[vpos].vnum; if ((endv = mchain[mchain[posmax].prev].vnum) == 0) endv = nvert; } else { /* LHS is a single segment */ tmp = mchain[posmax].next; rc[0] = mchain[tmp].vnum; tmp = mchain[tmp].next; rc[1] = mchain[tmp].vnum; ri = 1; vpos = mchain[tmp].next; v = mchain[vpos].vnum; endv = mchain[posmax].vnum; } while ((v != endv) || (ri > 1)) { if (ri > 0) { /* reflex chain is non-empty */ if (CROSS(vert[v].pt, vert[rc[ri - 1]].pt, vert[rc[ri]].pt) > 0) { /* convex corner: cut if off */ op[op_idx][0] = rc[ri - 1]; op[op_idx][1] = rc[ri]; op[op_idx][2] = v; op_idx++; ri--; } else { /* non-convex */ /* add v to the chain */ ri++; rc[ri] = v; vpos = mchain[vpos].next; v = mchain[vpos].vnum; } } else { /* reflex-chain empty: add v to the */ /* reflex chain and advance it */ rc[++ri] = v; vpos = mchain[vpos].next; v = mchain[vpos].vnum; } } /* end-while */ /* reached the bottom vertex. Add in the triangle formed */ op[op_idx][0] = rc[ri - 1]; op[op_idx][1] = rc[ri]; op[op_idx][2] = v; op_idx++; ri--; return 0; } s3d-0.2.2.1/libs3d/sei_tri.c000066400000000000000000000054601361325167000153360ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #include "sei_triangulate.h" #include #include /* memset() */ static int initialise(int n) { register int i; for (i = 1; i <= n; i++) seg[i].is_inserted = FALSE; generate_random_ordering(n); return 0; } /* Input specified as contours. * Outer contour must be anti-clockwise. * All inner contours must be clockwise. * * Every contour is specified by giving all its points in order. No * point shoud be repeated. i.e. if the outer contour is a square, * only the four distinct endpoints shopudl be specified in order. * * ncontours: #contours * cntr: An array describing the number of points in each * contour. Thus, cntr[i] = #points in the i'th contour. * vertices: Input array of vertices. Vertices for each contour * immediately follow those for previous one. Array location * vertices[0] must NOT be used (i.e. i/p starts from * vertices[1] instead. The output triangles are * specified w.r.t. the indices of these vertices. * triangles: Output array to hold triangles. * * Enough space must be allocated for all the arrays before calling * this routine */ int sei_triangulate_polygon(int ncontours, int cntr[], double(*vertices)[2], int (*triangles)[3]) { register int i; int nmonpoly, ccount, npoints; int n; memset((void *)seg, 0, sizeof(seg)); ccount = 0; i = 1; while (ccount < ncontours) { int j; int first, last; npoints = cntr[ccount]; first = i; last = first + npoints - 1; for (j = 0; j < npoints; j++, i++) { seg[i].v0.x = vertices[i][0]; seg[i].v0.y = vertices[i][1]; if (i == last) { seg[i].next = first; seg[i].prev = i - 1; seg[i-1].v1 = seg[i].v0; } else if (i == first) { seg[i].next = i + 1; seg[i].prev = last; seg[last].v1 = seg[i].v0; } else { seg[i].prev = i - 1; seg[i].next = i + 1; seg[i-1].v1 = seg[i].v0; } seg[i].is_inserted = FALSE; } ccount++; } n = i - 1; initialise(n); construct_trapezoids(n); nmonpoly = monotonate_trapezoids(n); return triangulate_monotone_polygons(n, nmonpoly, triangles); } s3d-0.2.2.1/libs3d/sei_triangulate.h000066400000000000000000000105021361325167000170550ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich * SPDX-FileCopyrightText: 1994 A. Narkhede and D .Manocha, who released their code * for public domain: * * * This code is in the public domain. Specifically, we give to the public * domain all rights for future licensing of the source code, all resale * rights, and all publishing rights. * * UNC-CH GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE SOFTWARE * AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION, WARRANTY * OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. * * * - Atul Narkhede (narkhede@cs.unc.edu) * */ #ifndef _triangulate_h #define _triangulate_h #include "config.h" typedef struct { double x, y; } point_t, vector_t; /* Segment attributes */ typedef struct { point_t v0, v1; /* two endpoints */ int is_inserted; /* inserted in trapezoidation yet ? */ int root0, root1; /* root nodes in Q */ int next; /* Next logical segment */ int prev; /* Previous segment */ } segment_t; /* Trapezoid attributes */ typedef struct { int lseg, rseg; /* two adjoining segments */ point_t hi, lo; /* max/min y-values */ int u0, u1; int d0, d1; int sink; /* pointer to corresponding in Q */ int usave, uside; /* I forgot what this means */ int state; } trap_t; /* Node attributes for every node in the query structure */ typedef struct { int nodetype; /* Y-node or S-node */ int segnum; point_t yval; int trnum; int parent; /* doubly linked DAG */ int left, right; /* children */ } node_t; typedef struct { int vnum; int next; /* Circularly linked list */ int prev; /* describing the monotone */ int marked; /* polygon */ } monchain_t; typedef struct { point_t pt; int vnext[4]; /* next vertices for the 4 chains */ int vpos[4]; /* position of v in the 4 chains */ int nextfree; } vertexchain_t; #ifdef DEBUG #undef DEBUG #endif /* Node types */ #define T_X 1 #define T_Y 2 #define T_SINK 3 #define SEGSIZE SEI_SS /* max# of segments. Determines how */ /* many points can be specified as */ /* input. If your datasets have large */ /* number of points, increase this */ /* value accordingly. */ #define QSIZE 8*SEGSIZE /* maximum table sizes */ #define TRSIZE 4*SEGSIZE /* max# trapezoids */ #define TRUE 1 #define FALSE 0 #define FIRSTPT 1 /* checking whether pt. is inserted */ #define LASTPT 2 #define C_EPS 1.0e-7 /* tolerance value: Used for making */ /* all decisions about collinearity or */ /* left/right of segment. Decrease */ /* this value if the input points are */ /* spaced very close together */ #define S_LEFT 1 /* for merge-direction */ #define S_RIGHT 2 #define ST_VALID 1 /* for trapezium state */ #define ST_INVALID 2 #define SP_SIMPLE_LRUP 1 /* for splitting trapezoids */ #define SP_SIMPLE_LRDN 2 #define SP_2UP_2DN 3 #define SP_2UP_LEFT 4 #define SP_2UP_RIGHT 5 #define SP_2DN_LEFT 6 #define SP_2DN_RIGHT 7 #define SP_NOSPLIT -1 #define TR_FROM_UP 1 /* for traverse-direction */ #define TR_FROM_DN 2 #define TRI_LHS 1 #define TRI_RHS 2 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define CROSS(v0, v1, v2) (((v1).x - (v0).x)*((v2).y - (v0).y) - \ ((v1).y - (v0).y)*((v2).x - (v0).x)) #define DOT(v0, v1) ((v0).x * (v1).x + (v0).y * (v1).y) #define FP_EQUAL(s, t) (fabs(s - t) <= C_EPS) /* Global variables */ extern node_t qs[QSIZE]; /* Query structure */ extern trap_t tr[TRSIZE]; /* Trapezoid structure */ extern segment_t seg[SEGSIZE]; /* Segment table */ /* Functions */ extern int monotonate_trapezoids(int); extern int triangulate_monotone_polygons(int, int, int (*)[3]); extern int sei_triangulate_polygon(int ncontours, int cntr[], double(*vertices)[2], int (*triangles)[3]); extern int _greater_than(point_t *, point_t *); extern int _equal_to(point_t *, point_t *); extern int _greater_than_equal_to(point_t *, point_t *); extern int _less_than(point_t *, point_t *); extern int locate_endpoint(point_t *, point_t *, int); extern int construct_trapezoids(int); extern int generate_random_ordering(int); extern int choose_segment(void); extern int read_segments(char *, int *); extern int math_logstar_n(int); extern int math_N(int, int); #endif /* triangulate_h */ s3d-0.2.2.1/libs3d/shm.c000066400000000000000000000106411361325167000144640ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include /* malloc() */ #include #include #include #include /* ntohs() */ #include /* errno */ #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 /* we want struct timespec to be defined */ #endif #ifndef __USE_POSIX199309 #define __USE_POSIX199309 1 #endif #include /* nanosleep() */ #ifdef SHM #define SHM_SIZE sizeof(key_t)*2 /* space for the keys */ #define SHM_MAXLOOP 100 #define RB_STD_SIZE 1024*512 static struct buf_t *data_in, *data_out; static int shmid_in, shmid_out; static int shm_idle = 0; static struct timespec t = { 0, 10*1000*1000 }; /* 10 mili second */ /* char ftoken[]="/tmp/.s3d_shm";*/ int _shm_init(char *ftoken) { int shmid; uint32_t *next_key; /* struct shmid_ds *buf; */ key_t key, key_out, key_in; s3dprintf(MED, "connecting to shm token %s", ftoken); /* make the key: */ if ((key = ftok(ftoken, 'R')) == -1) { errn("shm_init():ftok()", errno); return 1; } s3dprintf(MED, "init key is 0x%08x", key); /* connect to the segment: */ if ((shmid = shmget(key, SHM_SIZE, 0644)) == -1) { errn("shm_init():shmget()", errno); return 1; } /* attach to the segment to get a pointer to it: */ next_key = (uint32_t*)shmat(shmid, (void *)0, 0); if (next_key == (uint32_t *)(-1)) { errn("shm_init():shmat()", errno); return 1; } s3dprintf(MED, "right now, next_keys are: %08x, %08x", next_key[0], next_key[1]); while ((0 == (key_in = next_key[1])) || (0 == (key_out = next_key[0]))) {} next_key[0] = next_key[1] = 0; s3dprintf(MED, "right now, next_keys are: %08x, %08x", key_in, key_out); /* as we have the new key, we can detach here now. */ if (shmdt(next_key) == -1) { errn("shm_init():shmdt()", errno); return 1; } /* get input buffer */ if ((shmid_in = shmget(key_in, RB_STD_SIZE, 0644)) == -1) { errn("shm_init():shmget()", errno); return 1; } /* attach to the in segment to get a pointer to it: */ data_in = (struct buf_t *) shmat(shmid_in, (void *)0, 0); if (data_in == (struct buf_t *)(-1)) { errn("shm_init():shmat()", errno); return 1; } /* get output buffer */ if ((shmid_out = shmget(key_out, RB_STD_SIZE, 0644)) == -1) { errn("shm_init():shmget()", errno); return 1; } /* attach to the out segment to get a pointer to it: */ data_out = (struct buf_t *) shmat(shmid_out, (void *)0, 0); if (data_out == (struct buf_t *)(-1)) { errn("shm_init():shmat()", errno); return 1; } return 0; } int _shm_quit(void) { /* detach from the segment: */ if (shmdt(data_in) == -1) { errn("shm_init():shmdt()", errno); return 1; } if (shmdt(data_out) == -1) { errn("shm_init():shmdt()", errno); return 1; } data_in = data_out = NULL; return 0; } int shm_writen(char *str, int s) { int no_left, no_written, wait = 0; no_left = s; while (no_left > 0) { no_written = shm_write(data_out, str, no_left); if (no_written < 0) return no_written; no_left -= no_written; str += no_written; if (wait++ > SHM_MAXLOOP) { s3dprintf(HIGH, "shm_writen():waited too long ..."); return -1; } if (wait > 10) nanosleep(&t, NULL); } return s - no_left; } int shm_readn(char *str, int s) { int no_left, no_read, wait = 0; no_left = s; while (no_left > 0) { no_read = shm_read(data_in, str, no_left); if (no_read < 0) return no_read; if (no_read == 0) break; no_left -= no_read; str += no_read; if (wait++ > SHM_MAXLOOP) { s3dprintf(HIGH, "shm_readn():waited too long ..."); return -1; } if (wait > 10) nanosleep(&t, NULL); } return s - no_left; } int _shm_net_receive(void) { int found = 0; char opcode, *buf; uint16_t length; struct shmid_ds d; if (data_in == NULL) return found; if (data_in->start != data_in->end) { if (1 == shm_readn(&opcode, 1)) { shm_readn((char *)&length, 2); length = ntohs(length); buf = (char*)malloc(length); shm_readn(buf, length); net_prot_in(opcode, length, buf); found = 1; } else { s3dprintf(HIGH, "socket seems to be dead ..."); s3d_quit(); } } else { if (shm_idle++ > SHM_MAX_IDLE) { shmctl(shmid_in, IPC_STAT, &d); if (d.shm_nattch == 1) { /* we're all alone ... remove it!! */ s3dprintf(MED, "server vanished ... "); s3d_quit(); } else shm_idle = 0; } } return found; } #endif s3d-0.2.2.1/libs3d/shm_ringbuf.c000066400000000000000000000037301361325167000162010ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include /* uint32_t */ #include /* memcpy() */ #ifdef SHM unsigned int shm_write(struct buf_t *rb, char *buf, unsigned int n) { unsigned int wrap = 0; int rs; uint32_t e, s, size; char *data; e = rb->end; s = rb->start; size = rb->bufsize; data = ((char *)rb) + sizeof(struct buf_t); if (e < s) { wrap = 1; } while ((((s + size*(1 - wrap)) - e) < (n + 1))) { /* checking free space */ if /*((size*2)>RB_MAX_SIZE)*/ (1) { /* s3dprintf(MED,"buffer reached maxsize, no resizing possible");*/ return 0; } /* printf("buffer full!! resizing ... (to size %d)",(int)size*2); if (NULL==(realloc(rb, size*2+RB_OVERHEAD))) { printf("realloc failed - fatal!!"); return -1; } if (wrap) { memcpy(data+size,data,e); e+=size; wrap=0; } size=rb->bufsize=size*2; rb->end=e;*/ } if ((e + n) > size) { rs = size - e; memcpy(data + e, buf, rs); /* copy the first part ... */ memcpy(data, buf + rs, n - rs); /* .. end the rest */ } else { memcpy(data + e, buf, n); /* plain copy */ } rb->end = e + n; /* update end of the buffer */ if (rb->end >= rb->bufsize) rb->end -= rb->bufsize; return n; } unsigned int shm_read(struct buf_t *rb, char *buf, unsigned int n) { int wrap = 0; unsigned int mn; unsigned int rs; uint32_t e, s, size; char *data; e = rb->end; s = rb->start; size = rb->bufsize; data = ((char *)rb) + sizeof(struct buf_t); if (e < s) wrap = 1; rs = (e + wrap * size - s); mn = (n > rs) ? rs : n; if ((wrap) && (mn > (size - s))) { rs = size - s; /* size of the first part */ memcpy(buf, data + s, rs); memcpy(buf + rs, data, mn - rs); } else { /* no wrap (needed)*/ memcpy(buf, data + s, mn); } rb->start = s + mn; if (rb->start >= rb->bufsize) rb->start -= rb->bufsize; return mn; } #endif s3d-0.2.2.1/libs3d/tcp.c000066400000000000000000000077251361325167000144740ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include #include /* malloc(), free() */ #include /* read(), write() */ #include /* errno */ #include /* memcpy() */ #include #include /* htons(),htonl() */ #ifndef WIN32 #include #include /* gethostbyname() */ #endif #ifdef SIGS #define __USE_BSD 1 /* we want sig_t and F_SETOWN to be defined */ #include /* fcntl */ #include /* signal(), SIGPIPE, SIGIO */ #endif static int s3d_socket; /* this is the socket which holds the tcp-socket .... */ #ifdef SIGS static void sigpipe_handler(int S3DUNUSED(sig)) /* ... ? */ { errs("sigpipe_handler()", "there is a broken pipe somewhere"); } static void sigio_handler(int S3DUNUSED(sig)) /* ... ? */ { _s3d_sigio = 1; } #endif int _tcp_init(const char *sv, int pn) { int sd; int res; /* char *port=NULL;*/ struct sockaddr_in sock; struct hostent *server = NULL; #ifdef SIGS _s3d_sigio = 0; #endif #ifdef WIN32 WSADATA datainfo; if (WSAStartup(257, &datainfo) != 0) { errn("_tcp_init()():startup()", errno); return -1; } #endif if ((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { errn("_tcp_init()():socket()", errno); return -1; } memset(&sock, 0, sizeof(sock)); sock.sin_family = AF_INET; if (*sv == 0) /* no server argument */ sv = "127.0.0.1"; if ((server = gethostbyname(sv))) memcpy(&sock.sin_addr.s_addr, server->h_addr_list[0], 4); else { errn("_tcp_init()():gethostbyname()", errno); close(sd); return -1; } sock.sin_port = htons(pn); res = connect(sd, (struct sockaddr *)&sock, sizeof(struct sockaddr_in)); if (res < 0) { errn("_tcp_init()():connect()", errno); close(sd); return -1; } /* if ( fcntl(sd, F_SETFL, O_ASYNC | O_NONBLOCK) < 0 ) */ /* errn("fcntl()",errno); */ #ifdef SIGS if (fcntl(sd, F_SETFL, O_ASYNC) < 0) errn("fcntl()", errno); if (fcntl(sd, F_SETOWN, getpid()) < 0) errn("fcntl()", errno); if (signal(SIGPIPE, (sig_t)sigpipe_handler) == SIG_ERR) errn("_tcp_init():signal()", errno); if (signal(SIGIO, (sig_t)sigio_handler) == SIG_ERR) errn("_tcp_init():signal()", errno); #endif s3d_socket = sd; s3dprintf(MED, "connection to %s:%d established", sv, pn); return 0; } int _tcp_quit(void) { if (s3d_socket) { s3dprintf(MED, "closing socket %d", s3d_socket); close(s3d_socket); s3d_socket = 0; } return 0; } int tcp_readn(char *str, int s) { int no_left, no_read; no_left = s; while (no_left > 0) { no_read = read(s3d_socket, str, no_left); if (no_read < 0) return no_read; if (no_read == 0) break; no_left -= no_read; str += no_read; } return s - no_left; } int tcp_writen(char *str, int s) { int no_left, no_written; no_left = s; while (no_left > 0) { no_written = write(s3d_socket, str, no_left); if (no_written <= 0) return no_written; no_left -= no_written; str += no_written; } return s - no_left; } int _s3d_tcp_net_receive(void) { fd_set fs_proc; /* filedescriptor set for listening port(s) */ struct timeval tv; /* time structure */ int found = 0; char opcode, *buf; uint16_t length; if (s3d_socket != -1) { FD_ZERO(&fs_proc); tv.tv_sec = tv.tv_usec = 0; FD_SET(s3d_socket, &fs_proc); /* s3dprintf(LOW,"Added %d procceses into file descriptor ...", n); */ if (select(FD_SETSIZE, &fs_proc, NULL, NULL, &tv) == -1) { errn("select()", errno); } else { /* data is available */ if (FD_ISSET(s3d_socket, &fs_proc)) { if (1 == tcp_readn(&opcode, 1)) { tcp_readn((char *)&length, 2); length = ntohs(length); buf = (char*)malloc(length); tcp_readn(buf, length); net_prot_in(opcode, length, buf); found = 1; } else { s3dprintf(HIGH, "socket seems to be dead ..."); s3d_quit(); } } } } return found; } s3d-0.2.2.1/libs3d/texture.c000066400000000000000000000065541361325167000154050ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2007-2015 Simon Wunderlich */ #include "s3d.h" #include "s3dlib.h" #include "hash.h" #ifdef SHM #include #include #include #endif #include /* malloc(), free() */ #include /* errno */ #include /* memcpy() */ static int _s3d_compare_cb(const void *d1, const void *d2); static int _s3d_choose_cb(const void *d1, int size); static void _s3d_free_s3dtex(void *d1); static struct hashtable_t *tex_hash = NULL; static int _s3d_choose_cb(const void *d1, int size) { struct s3d_texshm *t1 = (struct s3d_texshm *)d1; return (t1->oid*32 + t1->tex) % size; } static int _s3d_compare_cb(const void *d1, const void *d2) { struct s3d_texshm *t1, *t2; t1 = (struct s3d_texshm *)d1; t2 = (struct s3d_texshm *)d2; if ((t1->oid == t2->oid) && (t1->tex == t2->tex)) return 0; return 1; } static void _s3d_free_s3dtex(void *d1) { struct s3d_tex *tex = (struct s3d_tex *)d1; #ifdef SHM if (tex->buf != NULL) { shmdt(tex->buf); tex->buf = NULL; } shmctl(tex->tshm.shmid, IPC_RMID, NULL); free(tex); #endif return; } void _s3d_handle_texshm(struct s3d_texshm *tshm) { struct s3d_tex *tex = NULL; s3dprintf(HIGH, "handling new texture ..."); if (tex_hash == NULL) return; #ifdef SHM tex = (struct s3d_tex *)_s3d_hash_remove(tex_hash, tshm); if (tex != NULL) _s3d_free_s3dtex(tex); if (tshm->shmid == -1) return; tex = (struct s3d_tex *)malloc(sizeof(*tex)); tex->tshm = *tshm; tex->buf = (char*)shmat(tex->tshm.shmid, (void *)0, 0); if ((key_t *)tex->buf == (key_t *)(-1)) { errn("shm_init():shmat()", errno); free(tex); return; } s3dprintf(HIGH, "adding new texture ..."); _s3d_hash_add(tex_hash, tex); #endif return; } int _s3d_load_texture_shm(int object, uint32_t tid, uint16_t xpos, uint16_t ypos, uint16_t w, uint16_t h, const uint8_t *data) { struct s3d_texshm check; struct s3d_tex *tex; int32_t i, p1, p2, m; int16_t mw, mh; if (tex_hash == NULL) return -1; check.oid = object; check.tex = tid; tex = (struct s3d_tex *)_s3d_hash_find(tex_hash, (void *) & check); if (tex == NULL) return -1; /* coudn't find */ s3dprintf(VLOW, "texture: oid %d, tex %d, shmid %d, tw %d, th %d, w %d, h %d ...", tex->tshm.oid, tex->tshm.tex, tex->tshm.shmid, tex->tshm.tw, tex->tshm.th, tex->tshm.w, tex->tshm.th); /* found it, assume that it's properly attached. */ m = tex->tshm.w * tex->tshm.th + tex->tshm.tw; /* maximum: position of the last pixel in the buffer */ if ((xpos + w) > tex->tshm.tw) mw = (tex->tshm.tw - xpos); else mw = w; if ((ypos + h) > tex->tshm.th) mh = (tex->tshm.th - ypos); else mh = h; if (mw <= 0) { /* nothing to do */ return 0; } for (i = 0; i < mh; i++) { p1 = (ypos + i) * tex->tshm.w + xpos; /* scanline start position */ p2 = mw; /* and length */ if (p1 > m) { break; /* need to break here. */ } memcpy(tex->buf + 4*p1, /* draw at p1 position ... */ data + 4*i*w, /* scanline number i ... */ 4*p2); } return 0; } int _s3d_texture_init(void) { tex_hash = _s3d_hash_new(256, _s3d_compare_cb, _s3d_choose_cb); if (tex_hash == NULL) return -1; else return 0; } int _s3d_texture_quit(void) { if (tex_hash == NULL) return -1; _s3d_hash_delete(tex_hash, _s3d_free_s3dtex); tex_hash = NULL; return 0; } s3d-0.2.2.1/libs3d/vector.c000066400000000000000000000071551361325167000152050ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Marek Lindner * SPDX-FileCopyrightText: 2004-2015 Andreas Langer */ #include /* sqrt() */ #include "s3d.h" /** \brief calculate length of vector * * Calculates and returns the length of the given vector (which should be of the * type float[3]). More info on wikipedia * http://en.wikipedia.org/wiki/Vector_(spatial) */ float s3d_vector_length(const float vector[]) { return sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]); } /** \brief subtract two vectors * * Subtracts vector1 from vector2, writing result into result_vector. All vectors * should have the format float[3]. More info on wikipedia. * http://en.wikipedia.org/wiki/Vector_(spatial) */ void s3d_vector_subtract(const float vector1[], const float vector2[], float result_vector[]) { result_vector[0] = vector2[0] - vector1[0]; result_vector[1] = vector2[1] - vector1[1]; result_vector[2] = vector2[2] - vector1[2]; } /** \brief calculate dot product of two vectors * * Calculates and returns the dot product of vector1 and vector2. All vectors * should have the format float[3]. More info on wikipedia. * http://en.wikipedia.org/wiki/Vector_(spatial) */ float s3d_vector_dot_product(const float vector1[], const float vector2[]) { return vector1[0] * vector2[0] + vector1[1] * vector2[1] + vector1[2] * vector2[2]; } /** \brief calculate cross product of two vectors * * Calculates and returns the cross product of vector1 and vector2. All vectors * should have the format float[3]. More info on wikipedia. * http://en.wikipedia.org/wiki/Vector_(spatial) */ void s3d_vector_cross_product(const float vector1[], const float vector2[], float result_vector[]) { result_vector[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1]; result_vector[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2]; result_vector[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0]; } /** \brief calculate angle between two vectors * * Calculates and returns the angle between vector1 and vector2. Please note that * the resulting angle is between 0 and PI, therefore not covering the whole * period! To convert in degrees just do result*180/M_PI. All vectors should * have the format float[3]. More info on wikipedia. * http://en.wikipedia.org/wiki/Vector_(spatial) */ float s3d_vector_angle(const float vector1[], const float vector2[]) { return acos(s3d_vector_dot_product(vector1, vector2) / (s3d_vector_length(vector1) * s3d_vector_length(vector2))); } /** \brief calculate angle between vector and cam * * Given obj_pos and cam_pos in the format float[3], angle_rad about which angle * the object should be rotated around the y-axis so that it faces the camera. * This might become handy if you have some text floating in space and want it * to face the camera. * http://en.wikipedia.org/wiki/Vector_(spatial) */ float s3d_angle_to_cam(const float obj_pos[], const float cam_pos[], float *angle_rad) { float angle, tmp_mov_vec[3], desc_norm_vec[3] = { 0.0, 0.0, -1.0 }; tmp_mov_vec[0] = cam_pos[0] - obj_pos[0]; tmp_mov_vec[1] = 0; /* we are not interested in the y value */ tmp_mov_vec[2] = cam_pos[2] - obj_pos[2]; angle = s3d_vector_angle(desc_norm_vec, tmp_mov_vec); /* take care of inverse cosinus */ if (tmp_mov_vec[0] > 0) { *angle_rad = 90.0 / M_PI - angle; angle = 180 - (180.0 / M_PI * angle); } else { *angle_rad = 90.0 / M_PI + angle; angle = 180 + (180.0 / M_PI * angle); } return angle; } s3d-0.2.2.1/libs3dw/000077500000000000000000000000001361325167000137165ustar00rootroot00000000000000s3d-0.2.2.1/libs3dw/CMakeLists.txt000066400000000000000000000024441361325167000164620ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include_directories(${s3d_SOURCE_DIR}/libs3d ${s3d_SOURCE_DIR}/libs3dw) set(S3DW_LIBRARY_DEPENDENCIES s3d ${MATH_LIBRARIES}) include(FilterPIE) add_library(s3dw SHARED animate.c arrange.c button.c event.c input.c label.c root.c scrollbar.c style.c surface.c textbox.c widget.c) target_link_libraries(s3dw ${S3DW_LIBRARY_DEPENDENCIES}) set_target_properties(s3dw PROPERTIES VERSION ${VERSION} SOVERSION 2 LINK_INTERFACE_LIBRARIES "") include(${CMAKE_ROOT}/Modules/TestCXXAcceptsFlag.cmake) check_cxx_accepts_flag("-Wl,--version-script=${s3d_SOURCE_DIR}/libs3dw/libs3dw.ver" HAVE_LIBS3DW_VERSIONSCRIPT) if (HAVE_LIBS3DW_VERSIONSCRIPT) set_target_properties(s3dw PROPERTIES LINK_FLAGS "-Wl,--version-script=${s3d_SOURCE_DIR}/libs3dw/libs3dw.ver") endif (HAVE_LIBS3DW_VERSIONSCRIPT) # install install(TARGETS s3dw RUNTIME DESTINATION "${BIN_INSTALL_DIR}" LIBRARY DESTINATION "${LIB_INSTALL_DIR}" ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" ) install(FILES s3dw.h DESTINATION "${INCLUDE_INSTALL_DIR}") #pkg config configure_file(libs3dw.pc.cmake ${s3d_BINARY_DIR}/libs3dw/libs3dw.pc @ONLY) install(FILES ${s3d_BINARY_DIR}/libs3dw/libs3dw.pc DESTINATION "${PKGCFG_INSTALL_DIR}") s3d-0.2.2.1/libs3dw/TODO000066400000000000000000000000771361325167000144120ustar00rootroot00000000000000- checkbox - hbox/vbox, aligning - focus colors, focus cycling s3d-0.2.2.1/libs3dw/animate.c000066400000000000000000000075731361325167000155140ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* the animation stack */ static s3dw_widget *ani_s[MAXANI]; static int ani_n = 0; static int animation_on = 0; int ani_need_arr = 0; /* is item f already on stack? */ int s3dw_ani_stackpos(s3dw_widget *f) { int i; for (i = 0; i < ani_n; i++) if (ani_s[i] == f) return i; /* already in list */ return -1; } /* add an item on the animation stack */ void s3dw_ani_add(s3dw_widget *f) { s3dprintf(VLOW, "[A]ni ADD (%10p), oid = %d, ani_n = %d, type is %s\n", (void*)f, f->oid, ani_n, s3dw_get_type_string(f->type)); if ((f->oid == 0) && (f->type != S3DW_TCAM)) { s3dprintf(HIGH, "s3dw_ani_add() assert failed: weird, moving cam but its not a cam object?"); return; } if ((ani_n < MAXANI) && (animation_on)) { if (s3dw_ani_stackpos(f) != -1) return; /* already in list */ ani_s[ani_n] = f; s3dw_ani_iterate(f); ani_n++; } else /* no place, finish now */ s3dw_ani_finish(f, -1); } /* delete an item from the animation stack */ void s3dw_ani_del(int i) { if ((i >= 0) && (i < ani_n)) { s3dprintf(VLOW, "[A]ni DEL %d, ani_n = %d\n", i, ani_n); ani_n--; ani_s[i] = ani_s[ani_n]; /* that should also work if i is the last one */ } else { s3dprintf(MED, "[F]ATAL: can't delete animation!\n"); } } /* apply the animation */ void s3dw_ani_doit(s3dw_widget *f) { if ((f->oid == 0) && (f->type != S3DW_TCAM)) { s3dprintf(HIGH, "s3dw_ani_doit() assert failed: weird, moving cam but its not a cam object?"); } else { if (f->oid == 0) { s3dprintf(HIGH, "moving cam"); } s3d_translate(f->oid, f->ax, f->ay, f->az); s3d_rotate(f->oid, f->arx, f->ary, f->arz); s3d_scale(f->oid, f->as); } } /* finish an animation on the stack, stack index i */ void s3dw_ani_finish(s3dw_widget *f, int i) { f->ax = f->x; f->ay = f->y; f->az = f->z; f->arx = f->rx; f->ary = f->ry; f->arz = f->rz; f->as = f->s; s3dw_ani_doit(f); if (i != -1) s3dw_ani_del(i); } /* do one step of the animation */ void s3dw_ani_iterate(s3dw_widget *f) { f->ax = (f->x + f->ax * ZOOMS) / (ZOOMS + 1); f->ay = (f->y + f->ay * ZOOMS) / (ZOOMS + 1); f->az = (f->z + f->az * ZOOMS) / (ZOOMS + 1); f->arx = (f->rx + f->arx * ZOOMS) / (ZOOMS + 1); f->ary = (f->ry + f->ary * ZOOMS) / (ZOOMS + 1); f->arz = (f->rz + f->arz * ZOOMS) / (ZOOMS + 1); f->as = (f->s + f->as * ZOOMS) / (ZOOMS + 1); } /* checks if f is good enough */ int s3dw_ani_check(s3dw_widget *f) { float x, y, z, rx, ry, rz; x = f->ax - f->x; y = f->ay - f->y; z = f->az - f->z; rx = f->arx - f->rx; ry = f->ary - f->ry; rz = f->arz - f->rz; if (((fabs(f->as - f->s) / f->s) > 0.01) || (sqrt(x*x + y*y + z*z) > 0.01) || (sqrt(rx*rx + ry*ry + rz*rz) > 0.01)) return 0; return 1; } /* need an arrangement ... */ void s3dw_ani_needarr(void) { ani_need_arr = 1; if (!animation_on) { while (ani_need_arr) s3dw_arrange(); } } /** \brief doing the whole animation thing * * Just call this in your mainloop if you want some nice window sliding * animations. it's somewhat bloating, but you don't want to miss it ;) * * \code * #include // nanosleep() * static struct timespec t={0.33*1000*1000}; // 33 mili seconds * void mainloop() * { * // keep this in your mainloop. this will do smooth animations for you ... * s3dw_ani_mate(); * nanosleep(&t,NULL); * } * * .... * s3d_mainloop(mainloop); * \endcode */ void s3dw_ani_mate(void) { int i; s3dw_widget *f; animation_on = 1; /* animation is activated */ if (ani_need_arr) s3dw_arrange(); for (i = 0; i < ani_n; i++) { f = ani_s[i]; s3dw_ani_iterate(f); if (s3dw_ani_check(f)) { s3dw_ani_finish(f, i); i--; /* a new widget is here now, take care in the next iteration */ } else { s3dw_ani_doit(f); } } } s3d-0.2.2.1/libs3dw/arrange.c000066400000000000000000000127571361325167000155150ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include /* rand(), RAND_MAX */ #include /* M_PI */ #define R2D (180/M_PI) s3dw_widget *_s3dw_cam = NULL; void s3dw_arr_widgetcenter(s3dw_widget *widget, float *center) { float x, y, z, xt, yt, zt; x = widget->s * widget->width / 2; y = widget->s * -widget->height / 2 + 0.5; z = widget->s * 0.5; /* calc back rotation */ /* around the y axis (horizontal direction) */ xt = cos(widget->ry / R2D) * x + sin(widget->ry / R2D) * z; yt = y; zt = -sin(widget->ry / R2D) * x + cos(widget->ry / R2D) * z; /* around the x axis (vertical direction) */ x = xt; y = cos(widget->rx / R2D) * yt + sin(widget->rx / R2D) * zt; z = -sin(widget->rx / R2D) * yt + cos(widget->rx / R2D) * zt; center[0] = x; center[1] = y; center[2] = z; } void s3dw_arr_normdir(float *dir) { float dirlen; while ((dirlen = s3d_vector_length(dir)) == 0) { /* make up some random direction if they're exactly the same position */ dir[0] = ((float)rand() - RAND_MAX / 2.0) / RAND_MAX; dir[1] = ((float)rand() - RAND_MAX / 2.0) / RAND_MAX; dir[2] = ((float)rand() - RAND_MAX / 2.0) / RAND_MAX; } dir[0] /= dirlen; dir[1] /= dirlen; dir[2] /= dirlen; } void s3dw_turn(void) { s3dw_widget *w, *root = s3dw_getroot(); int i; float a[3], b[3], rx, ry; float op[3], np[3]; a[0] = 0; a[1] = 0; a[2] = 1; for (i = 0; i < root->nobj; i++) { w = root->pobj[i]; if ((w->oid != 0) && (w->flags&S3DW_TURN_CAM)) { s3dw_arr_widgetcenter(w, op); /* horizontal movement */ b[0] = w->x + op[0] - _s3dw_cam->x; b[1] = 0; b[2] = w->z + op[2] - _s3dw_cam->z; ry = 180 * s3d_vector_angle(a, b) / M_PI; if ((b[0] == 0) && (b[1] == 0) && (b[2] == 0)) ry = 0; /* correct acos incompletness */ if (b[0] < 0) ry = 180 - ry; else ry = 180 + ry; b[2] = sqrt(b[0] * b[0] + b[2] * b[2]); b[1] = w->y + op[1] - _s3dw_cam->y; b[0] = 0; rx = 180 * s3d_vector_angle(a, b) / M_PI; if ((b[0] == 0) && (b[1] == 0) && (b[2] == 0)) rx = 0; if (b[1] > 0) rx = 180 - rx; else rx = 180 + rx; if ((rx > 90) && (rx <= 180)) rx = 180 - rx; else if ((rx >= 180) && (rx < 270)) rx = 540 - rx ; w->rx = rx; w->ry = ry; if ((w->arx - w->rx) > 180) w->arx -= 360; if ((w->arx - w->rx) < -180) w->arx += 360; if ((w->ary - w->ry) > 180) w->ary -= 360; if ((w->ary - w->ry) < -180) w->ary += 360; s3dw_arr_widgetcenter(w, np); w->x -= np[0] - op[0]; w->y -= np[1] - op[1]; w->z -= np[2] - op[2]; s3dw_ani_add(w); } } } #define DIST 40.0 static void s3dw_follow(void) { s3dw_widget *w, *root = s3dw_getroot(); int i; float b[3]; float op[3]; float lsqr, l; for (i = 0; i < root->nobj; i++) { w = root->pobj[i]; if ((w->oid != 0) && (w->flags&S3DW_FOLLOW_CAM)) { s3dw_arr_widgetcenter(w, op); /* horizontal movement */ b[0] = _s3dw_cam->x - (w->x + op[0]); b[1] = _s3dw_cam->y - (w->y + op[1]); b[2] = _s3dw_cam->z - (w->z + op[2]); if ((lsqr = (b[0] * b[0] + b[1] * b[1] + b[2] * b[2])) > (DIST * DIST)) { /* need to adjust ... */ l = sqrt(lsqr); w->x += b[0] - b[0] * DIST / l; w->y += b[1] - b[1] * DIST / l; w->z += b[2] - b[2] * DIST / l; w->flags &= ~S3DW_ARRANGED; ani_need_arr = 1; s3dw_ani_add(w); } } } } void s3dw_arrange(void) { s3dw_widget *w1, *w2, *root = s3dw_getroot(); int i, j, arranged, allarr; float len1, len2, dirlen; float tomove, move1, move2; float f1[3], f2[3], dir[3]; /* test if there is anything to arrange ... */ arranged = 1; for (i = 0; i < root->nobj; i++) if (!(root->pobj[i]->flags&S3DW_ARRANGED)) arranged = 0; if (arranged && !ani_need_arr) return; /* no arrangement necceasary .... */ ani_need_arr = 0; if (root->nobj == 1) { w1 = root->pobj[0]; w1->flags |= S3DW_ARRANGED; /* done */ return; } allarr = 1; for (i = 0; i < root->nobj; i++) { w1 = root->pobj[i]; arranged = 1; for (j = 0; j < root->nobj; j++) { w2 = root->pobj[j]; if ((i != j) && ((w1->oid != 0) && (w2->oid != 0))) { s3dw_arr_widgetcenter(w1, f1); s3dw_arr_widgetcenter(w2, f2); len1 = s3d_vector_length(f1); len2 = s3d_vector_length(f2); dir[0] = (w1->x + f1[0]) - (w2->x + f2[0]); dir[1] = (w1->y + f1[1]) - (w2->y + f2[1]); dir[2] = (w1->z + f1[2]) - (w2->z + f2[2]); dirlen = s3d_vector_length(dir); if (dirlen < (len1 + len2)) { allarr = 0; arranged = 0; w1->flags &= ~S3DW_ARRANGED; w2->flags &= ~S3DW_ARRANGED; /* it's not arranged, turn the flags off! */ s3dw_arr_normdir(dir); tomove = ((len1 + len2 + 1) - dirlen); move1 = len1 / (len1 + len2); move2 = len2 / (len1 + len2); if (w1->oid != 0) { w1->x += tomove * move1 * dir[0]; w1->y += tomove * move1 * dir[1]; w1->z += tomove * move1 * dir[2]; s3dw_ani_add(w1); } else { w2->x += tomove * move2 * -dir[0]; w2->y += tomove * move2 * -dir[1]; w2->z += tomove * move2 * -dir[2]; } if (w2->oid != 0) { w2->x += tomove * move2 * -dir[0]; w2->y += tomove * move2 * -dir[1]; w2->z += tomove * move2 * -dir[2]; s3dw_ani_add(w2); } else { w1->x += tomove * move1 * dir[0]; w1->y += tomove * move1 * dir[1]; w1->z += tomove * move1 * dir[2]; } } } } if (arranged) w1->flags |= S3DW_ARRANGED; } if (allarr) ani_need_arr = 0; s3dw_turn(); s3dw_follow(); } s3d-0.2.2.1/libs3dw/button.c000066400000000000000000000075171361325167000154070ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ /* draw and setup the button */ void s3dw_button_draw(s3dw_widget *widget) { s3dw_button *button = (s3dw_button *)widget; float length; float vertices[8*3]; uint32_t polygons[10*4] = { 0, 4, 5, 0, 0, 5, 1, 0, 1, 5, 6, 0, 1, 6, 2, 0, 2, 6, 7, 0, 2, 7, 3, 0, 3, 7, 4, 0, 3, 4, 0, 0, 4, 7, 6, 0, 4, 6, 5, 0 }; button->oid_text = s3d_draw_string(button->text, &length); s3d_pep_materials_a(button->oid_text, widget->style->text_mat, 1); /* width of the button depends on the length of the text */ vertices[0*3+0] = 0.0; vertices[0*3+1] = 0.0; vertices[0*3+2] = 0.0; vertices[1*3+0] = 0.0; vertices[1*3+1] = -2.0; vertices[1*3+2] = 0.0; vertices[2*3+0] = length + 1; vertices[2*3+1] = -2.0; vertices[2*3+2] = 0.0; vertices[3*3+0] = length + 1; vertices[3*3+1] = 0.0; vertices[3*3+2] = 0.0; vertices[4*3+0] = 0.25; vertices[4*3+1] = -0.25; vertices[4*3+2] = 0.25; vertices[5*3+0] = 0.25; vertices[5*3+1] = -1.75; vertices[5*3+2] = 0.25; vertices[6*3+0] = length + 0.75; vertices[6*3+1] = -1.75; vertices[6*3+2] = 0.25; vertices[7*3+0] = length + 0.75; vertices[7*3+1] = -0.25; vertices[7*3+2] = 0.25; widget->oid = s3d_new_object(); s3d_push_materials_a(widget->oid, widget->style->input_mat, 1); s3d_push_vertices(widget->oid, vertices, 8); s3d_push_polygons(widget->oid, polygons, 10); s3d_link(widget->oid, widget->parent->oid); s3d_link(button->oid_text, widget->oid); s3d_translate(button->oid_text, 0.5, -1.5, 0.30); s3d_translate(widget->oid, widget->x, -widget->y, 0); widget->width = length + 1; widget->height = 2; } /** \brief create a new button in the surface * * Creates a new button on the surface, with "text" written on it and the upper * left corner at (posx,posy) on the surface. * * See s3dw_button for information about callbacks which may be defined. */ s3dw_button *s3dw_button_new(const s3dw_surface *surface, const char *text, float posx, float posy) { s3dw_button *button; s3dw_widget *widget; button = (s3dw_button *)malloc(sizeof(s3dw_button)); button->text = strdup(text); button->onclick = s3dw_nothing; widget = s3dw_widget_new((s3dw_widget *)button); widget->type = S3DW_TBUTTON; widget->x = posx; widget->y = posy; widget->style = ((s3dw_widget *)surface)->style; s3dw_widget_append((s3dw_widget *)surface, widget); s3dw_button_draw(widget); return button; } /* show, make visible */ void s3dw_button_show(s3dw_widget *widget) { s3dw_button *button = (s3dw_button *)widget; s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(button->oid_text, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hide */ void s3dw_button_hide(s3dw_widget *widget) { s3dw_button *button = (s3dw_button *)widget; s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(button->oid_text, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* destroy s3d structures of the button */ void s3dw_button_erase(s3dw_widget *widget) { s3dw_button *button = (s3dw_button *)widget; s3d_del_object(button->oid_text); s3d_del_object(widget->oid); } /* destroy the button */ void s3dw_button_destroy(s3dw_widget *widget) { s3dw_button *button = (s3dw_button *)widget; s3dw_button_erase(widget); free(button->text); free(button); } /* handle key events */ int s3dw_button_event_key(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(keys)) { return 0; } /* handle click on a button */ int s3dw_button_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_button *button = (s3dw_button *)widget; if ((button->oid_text == oid) || (widget->oid == oid)) { button->onclick(widget); return 1; } return 0; } s3d-0.2.2.1/libs3dw/event.c000066400000000000000000000044361361325167000152120ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include /** \brief handle click on widget * * If you want your widgets on mouseclicks (believe me, you want that), you have * to call this either in your clickhandler-function or specify it itself as * the clickhandler. * * \code * // way 1: * s3d_set_callback(S3D_EVENT_OBJ_CLICK,s3dw_handle_click); * * // way 2: * ... * void click(struct s3d_evt *evt) * { * s3dw_handle_click(evt); * .... * // your own clickhandler code * ... * } * .... * s3d_set_callback(S3D_EVENT_OBJ_CLICK,click); * \endcode */ int s3dw_handle_click(const struct s3d_evt *evt) { uint32_t oid = *((uint32_t *)evt->buf); return s3dw_widget_event_click(s3dw_getroot(), oid); } /** \brief handle key input on widget * * This is somehow useful to call in your keyhandler functions if you want to * have input-boxes work. ;) * * \code * // way 1: * s3d_set_callback(S3D_EVENT_KEY,s3dw_handle_key); * * // way 2: * ... * void key(struct s3d_evt *evt) * { * s3dw_handle_key(evt); * .... * // your own keyhandler code * ... * } * .... * s3d_set_callback(S3D_EVENT_KEY,key); * \endcode */ int s3dw_handle_key(const struct s3d_evt *evt) { struct s3d_key_event *keys = (struct s3d_key_event *)evt->buf; return s3dw_widget_event_key(s3dw_getroot(), keys); } /** \brief handle object info events * * This can be used to let s3dw handle S3D_EVENT_OBJ_INFO-events. With this, * s3dw can consider the camera position and makes things like following the * camera possible. */ int s3dw_object_info(struct s3d_evt *evt) { struct s3d_obj_info *info = (struct s3d_obj_info *)evt->buf; if (info->object == 0) { /* the _s3dw_cam */ if (_s3dw_cam == NULL) s3dw_getroot(); /* init, get _s3dw_cam */ _s3dw_cam->ax = _s3dw_cam->x = info->trans_x; _s3dw_cam->ay = _s3dw_cam->y = info->trans_y; _s3dw_cam->az = _s3dw_cam->z = info->trans_z; _s3dw_cam->arx = _s3dw_cam->rx = info->rot_x; _s3dw_cam->ary = _s3dw_cam->ry = info->rot_y; _s3dw_cam->arz = _s3dw_cam->rz = info->rot_z; _s3dw_cam->flags &= ~S3DW_ARRANGED; s3dw_ani_needarr(); } return 0; } s3d-0.2.2.1/libs3dw/input.c000066400000000000000000000143771361325167000152350ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include #include /* malloc() */ #include /* strdup(),strlen() */ #include /* isprint */ uint32_t s3dw_input_draw_string(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; uint32_t oid_text; int i; float tlen; if (widget->width < 1) return -1; i = 0; while (s3d_strlen(input->text + i) > (widget->width - 1)) i++; oid_text = s3d_draw_string(input->text + i, &tlen); s3d_pep_materials_a(oid_text, widget->style->text_mat, 1); s3d_translate(oid_text, 0.5, -1.5, 0.30); s3d_link(oid_text, widget->oid); return oid_text; } void s3dw_input_draw(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; float length; float vertices[12*3]; uint32_t polygons[18*4] = { 0, 4, 5, 1, 0, 5, 1, 1, 1, 5, 6, 1, 1, 6, 2, 1, 2, 6, 7, 1, 2, 7, 3, 1, 3, 7, 4, 1, 3, 4, 0, 1, 4, 8, 9, 1, 4, 9, 5, 1, 5, 9, 10, 1, 5, 10, 6, 1, 6, 10, 11, 1, 6, 11, 7, 1, 7, 11, 8, 1, 7, 8, 4, 1, 8, 11, 10, 0, 8, 10, 9, 0 }; length = widget->width - 1; if (widget->width < 1) return; widget->height = 2; /* width of the input depends on the length of the text */ vertices[0*3+0] = 0.0; vertices[0*3+1] = 0.0; vertices[0*3+2] = 0.0; vertices[1*3+0] = 0.0; vertices[1*3+1] = -2.0; vertices[1*3+2] = 0.0; vertices[2*3+0] = length + 1; vertices[2*3+1] = -2.0; vertices[2*3+2] = 0.0; vertices[3*3+0] = length + 1; vertices[3*3+1] = 0.0; vertices[3*3+2] = 0.0; vertices[4*3+0] = 0.125; vertices[4*3+1] = -0.125; vertices[4*3+2] = 0.25; vertices[5*3+0] = 0.125; vertices[5*3+1] = -1.875; vertices[5*3+2] = 0.25; vertices[6*3+0] = length + 0.875; vertices[6*3+1] = -1.875; vertices[6*3+2] = 0.25; vertices[7*3+0] = length + 0.875; vertices[7*3+1] = -0.125; vertices[7*3+2] = 0.25; vertices[8*3+0] = 0.25; vertices[8*3+1] = -0.25; vertices[8*3+2] = 0.125; vertices[9*3+0] = 0.25; vertices[9*3+1] = -1.75; vertices[9*3+2] = 0.125; vertices[10*3+0] = length + 0.75; vertices[10*3+1] = -1.75; vertices[10*3+2] = 0.125; vertices[11*3+0] = length + 0.75; vertices[11*3+1] = -0.25; vertices[11*3+2] = 0.125; widget->oid = s3d_new_object(); s3d_push_materials_a(widget->oid, widget->style->inputback_mat, 1); s3d_push_materials_a(widget->oid, widget->style->input_mat, 1); s3d_push_vertices(widget->oid, vertices, 12); s3d_push_polygons(widget->oid, polygons, 18); s3d_link(widget->oid, widget->parent->oid); s3d_translate(widget->oid, widget->x, -widget->y, 0); input->oid_text = s3dw_input_draw_string(widget); } /* show the input */ void s3dw_input_show(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(input->oid_text, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hides the input */ void s3dw_input_hide(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(input->oid_text, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /** \brief create a new input in the surface * * Creates a new input-box on the surface with a input width of "width", the * upper left corner at (posx,posy) on the surface. The input-box is empty on * creation and can be change with s3dw_input_change_text, and received with * s3dw_input_gettext * * See s3dw_input for information about callbacks which may be defined. */ s3dw_input *s3dw_input_new(const s3dw_surface *surface, float width, float posx, float posy) { s3dw_input *input; s3dw_widget *widget; input = (s3dw_input *)malloc(sizeof(s3dw_input)); input->text = strdup(""); input->onclick = s3dw_nothing; input->onedit = s3dw_nothing; widget = s3dw_widget_new((s3dw_widget *)input); widget->type = S3DW_TINPUT; widget->x = posx; widget->y = posy; widget->width = width; widget->height = 2; s3dw_widget_append((s3dw_widget *)surface, widget); s3dw_input_draw(widget); return input; } void s3dw_input_erase(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; s3d_del_object(input->oid_text); s3d_del_object(widget->oid); } /* destroy the input */ void s3dw_input_destroy(s3dw_widget *widget) { s3dw_input *input = (s3dw_input *)widget; s3dw_input_erase(widget); free(input->text); free(input); } /** \brief changes the text of the input * * Change the text in the referenced input-box to the specified text. */ void s3dw_input_change_text(s3dw_input *input, const char *text) { s3dw_widget *widget = (s3dw_widget *)input; uint32_t oid_text; /* redraw the text ... */ free(input->text); input->text = strdup(text); oid_text = s3dw_input_draw_string(widget); if (widget->flags&S3DW_ONSCREEN) s3d_flags_on(oid_text, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_del_object(input->oid_text); input->oid_text = oid_text; } /* handle key events */ int s3dw_input_event_key(s3dw_widget *widget, struct s3d_key_event *keys) { s3dw_input *input = (s3dw_input *)widget; char *newtext; char key = keys->unicode; /* unicode support so far ... :/ */ int len; s3dprintf(MED, "edit field got key %d!!", key); switch (keys->keysym) { case S3DK_BACKSPACE: if ((len = strlen(input->text)) > 0) { newtext = (char *)malloc(len + 0); /* +1 for the terminating byte, -1 for the deleted character */ memcpy(newtext, input->text, len); newtext[len-1] = 0; s3dw_input_change_text(input, newtext); free(newtext); return 1; } break; default: if (isprint(key)) { len = strlen(input->text); newtext = (char *)malloc(len + 2); /* +1 for the terminating byte, +1 for the new character */ strcpy(newtext, input->text); newtext[len] = key; newtext[len+1] = 0; s3dw_input_change_text(input, newtext); free(newtext); return 1; } } return 0; } int s3dw_input_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_input *input = (s3dw_input *)widget; if ((input->oid_text == oid) || (widget->oid == oid)) { s3dw_focus(widget); input->onclick(widget); return 1; } return 0; } /** \brief get text of input * * Returns the text which is currently entered in the referenced input-box. */ char *s3dw_input_gettext(s3dw_input *input) { return strdup(input->text); } s3d-0.2.2.1/libs3dw/label.c000066400000000000000000000051271361325167000151460ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ void s3dw_label_draw(s3dw_widget *widget) { s3dw_label *label = (s3dw_label *)widget; float length; widget->oid = s3d_draw_string(label->text, &length); s3d_pep_materials_a(widget->oid, widget->style->text_mat, 1); s3d_link(widget->oid, widget->parent->oid); s3d_translate(widget->oid, widget->x, -widget->y, 0.1); widget->width = length + 1; widget->height = 2; } /* show the label */ void s3dw_label_show(s3dw_widget *widget) { s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hides the label */ void s3dw_label_hide(s3dw_widget *widget) { s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /** \brief change label text * * Change the text in the referenced label to the specified text. */ void s3dw_label_change_text(s3dw_label *label, const char *text) { s3dw_widget *widget = (s3dw_widget *)label; /* redraw the text ... */ free(label->text); label->text = strdup(text); s3dw_label_erase(widget); s3dw_label_draw(widget); if (widget->flags&S3DW_ONSCREEN) s3dw_label_show(widget); } /** \brief create a new label in the surface * * Creates a new label on the surface, with "text" written on it and the upper * left corner at (posx,posy) on the surface. * * See s3dw_label for information about callbacks which may be defined. */ s3dw_label *s3dw_label_new(const s3dw_surface *surface, const char *text, float posx, float posy) { s3dw_label *label; s3dw_widget *widget; label = (s3dw_label *)malloc(sizeof(s3dw_label)); widget = s3dw_widget_new((s3dw_widget *)label); widget->type = S3DW_TLABEL; widget->x = posx; widget->y = posy; label->text = strdup(text); label->onclick = s3dw_nothing; s3dw_widget_append((s3dw_widget *)surface, widget); s3dw_label_draw(widget); return label; } void s3dw_label_erase(s3dw_widget *widget) { s3d_del_object(widget->oid); } /* destroy the label */ void s3dw_label_destroy(s3dw_widget *widget) { s3dw_label *label = (s3dw_label *)widget; s3dw_label_erase(widget); free(label->text); free(label); } /* handle key events */ int s3dw_label_event_key(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(keys)) { return 0; } /* handle click events */ int s3dw_label_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_label *label = (s3dw_label *)widget; if (widget->oid == oid) { label->onclick(widget); return 1; } return 0; } s3d-0.2.2.1/libs3dw/libs3dw.pc.cmake000066400000000000000000000006221361325167000166700ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@BIN_INSTALL_DIR@ libdir=@LIB_INSTALL_DIR@ includedir=@INCLUDE_INSTALL_DIR@ Name: libs3dw Version: @VERSION@ Description: Widget library based on libs3d Requires.private: libs3d Libs.private: -lm Libs: -L${libdir} -ls3dw Cflags: -I${includedir} s3d-0.2.2.1/libs3dw/libs3dw.ver000066400000000000000000000011341361325167000160020ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann LIBS3DW_2 { global: s3dw_ani_mate; s3dw_button_new; s3dw_delete; s3dw_focus; s3dw_getroot; s3dw_handle_click; s3dw_handle_key; s3dw_input_change_text; s3dw_input_gettext; s3dw_input_new; s3dw_label_change_text; s3dw_label_new; s3dw_moveit; s3dw_object_info; s3dw_show; s3dw_surface_new; s3dw_textbox_change_text; s3dw_textbox_new; s3dw_textbox_scrolldown; s3dw_textbox_scrollleft; s3dw_textbox_scrollright; s3dw_textbox_scrollto; s3dw_textbox_scrollup; local: *; }; s3d-0.2.2.1/libs3dw/root.c000066400000000000000000000105001361325167000150410ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* printf() */ s3dw_callback s3dwcb_show[S3DW_NTYPES]; s3dw_callback s3dwcb_hide[S3DW_NTYPES]; s3dw_callback s3dwcb_destroy[S3DW_NTYPES]; s3dw_click_callback s3dwcb_click[S3DW_NTYPES]; s3dw_key_callback s3dwcb_key[S3DW_NTYPES]; static s3dw_widget *root = NULL; /* just destroy the widget */ void s3dw_root_destroy(s3dw_widget *widget) { free(widget); } /* do plain nothing. interesting, isn't it? ;) */ void s3dw_nothing(s3dw_widget *S3DUNUSED(widget)) { } int s3dw_click_nothing(s3dw_widget *S3DUNUSED(widget), uint32_t S3DUNUSED(dummy)) { return 0; } int s3dw_key_nothing(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(dummy)) { return 0; } const char *s3dw_get_type_string(int type) { switch (type) { case S3DW_TROOT: return "root"; case S3DW_TCAM: return "cam"; case S3DW_TSURFACE: return "surface"; case S3DW_TBUTTON: return "button"; case S3DW_TLABEL: return "label"; case S3DW_TINPUT: return "input"; case S3DW_TTEXTBOX: return "textbox"; case S3DW_TSCROLLBAR: return "scrollbar"; } return NULL; } /** \brief get the root * * Returns the root-widget, which holds all the surfaces. E.g. if you want to * move all widgets at once, adjust the root-widgets x,y,z and use s3dw_moveit() * * \code * s3dw_widget *root = s3dw_getroot(); * // move widget center to (0,5,0). upon creation, it's centered at (0,0,0), * // so this might move it up * root->x=0; * root->y=5; * root->z=0; * s3dw_moveit(root); * \endcode */ s3dw_widget* s3dw_getroot(void) { if (root == NULL) { root = (s3dw_widget *)malloc(sizeof(s3dw_widget)); root = s3dw_widget_new(root); root->type = S3DW_TROOT; root->oid = s3d_new_object(); root->style = &def_style; root->flags = S3DW_VISIBLE | S3DW_ACTIVE; _s3dw_cam = (s3dw_widget *)malloc(sizeof(s3dw_widget)); s3dw_widget_new(_s3dw_cam); _s3dw_cam->type = S3DW_TCAM; _s3dw_cam->oid = 0; _s3dw_cam->style = &def_style; _s3dw_cam->s = 10; _s3dw_cam->width = 1; _s3dw_cam->height = 0; _s3dw_cam->flags = S3DW_VISIBLE | S3DW_ACTIVE; s3dw_widget_append(root, _s3dw_cam); /* setup callback tables */ s3dwcb_show[S3DW_TROOT] = s3dw_nothing; s3dwcb_show[S3DW_TCAM] = s3dw_nothing; s3dwcb_show[S3DW_TSURFACE] = s3dw_surface_show; s3dwcb_show[S3DW_TBUTTON] = s3dw_button_show; s3dwcb_show[S3DW_TLABEL] = s3dw_label_show; s3dwcb_show[S3DW_TINPUT] = s3dw_input_show; s3dwcb_show[S3DW_TTEXTBOX] = s3dw_textbox_show; s3dwcb_show[S3DW_TSCROLLBAR] = s3dw_scrollbar_show; s3dwcb_hide[S3DW_TROOT] = s3dw_nothing; s3dwcb_hide[S3DW_TSURFACE] = s3dw_surface_hide; s3dwcb_hide[S3DW_TBUTTON] = s3dw_button_hide; s3dwcb_hide[S3DW_TLABEL] = s3dw_label_hide; s3dwcb_hide[S3DW_TINPUT] = s3dw_input_hide; s3dwcb_hide[S3DW_TTEXTBOX] = s3dw_textbox_hide; s3dwcb_hide[S3DW_TSCROLLBAR] = s3dw_scrollbar_hide; s3dwcb_destroy[S3DW_TROOT] = s3dw_root_destroy; s3dwcb_destroy[S3DW_TCAM] = s3dw_root_destroy; s3dwcb_destroy[S3DW_TSURFACE] = s3dw_surface_destroy; s3dwcb_destroy[S3DW_TBUTTON] = s3dw_button_destroy; s3dwcb_destroy[S3DW_TLABEL] = s3dw_label_destroy; s3dwcb_destroy[S3DW_TINPUT] = s3dw_input_destroy; s3dwcb_destroy[S3DW_TTEXTBOX] = s3dw_textbox_destroy; s3dwcb_destroy[S3DW_TSCROLLBAR] = s3dw_scrollbar_destroy; s3dwcb_click[S3DW_TROOT] = s3dw_click_nothing; s3dwcb_click[S3DW_TCAM] = s3dw_click_nothing; s3dwcb_click[S3DW_TSURFACE] = s3dw_surface_event_click; s3dwcb_click[S3DW_TBUTTON] = s3dw_button_event_click; s3dwcb_click[S3DW_TLABEL] = s3dw_label_event_click; s3dwcb_click[S3DW_TINPUT] = s3dw_input_event_click; s3dwcb_click[S3DW_TTEXTBOX] = s3dw_textbox_event_click; s3dwcb_click[S3DW_TSCROLLBAR] = s3dw_scrollbar_event_click; s3dwcb_key[S3DW_TROOT] = s3dw_key_nothing; s3dwcb_key[S3DW_TCAM] = s3dw_key_nothing; s3dwcb_key[S3DW_TSURFACE] = s3dw_surface_event_key; s3dwcb_key[S3DW_TBUTTON] = s3dw_button_event_key; s3dwcb_key[S3DW_TLABEL] = s3dw_label_event_key; s3dwcb_key[S3DW_TINPUT] = s3dw_input_event_key; s3dwcb_key[S3DW_TTEXTBOX] = s3dw_key_nothing; s3dwcb_key[S3DW_TSCROLLBAR] = s3dw_key_nothing; } return root; } s3d-0.2.2.1/libs3dw/s3dw.h000066400000000000000000000211161361325167000147500ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #ifndef LIBS3DW_H #define LIBS3DW_H #include /* for uint32_t */ struct _s3dw_button; struct _s3dw_input; struct _s3dw_label; struct _s3dw_scrollbar; struct _s3dw_style; struct _s3dw_surface; struct _s3dw_textbox; struct _s3dw_widget; struct s3d_evt; #ifdef HAVE_GCCVISIBILITY #define S3DWEXPORT_VISIBILITY __attribute__ ((visibility("default"))) #else #define S3DWEXPORT_VISIBILITY #endif #ifdef HAVE_GCCEXTERNALLY #define S3DWEXPORT_EXTERNAL __attribute__((externally_visible)) #else #define S3DWEXPORT_EXTERNAL #endif #define S3DWEXPORT S3DWEXPORT_VISIBILITY S3DWEXPORT_EXTERNAL #ifdef __GNUC_MINOR__ #define S3DW_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #else #define S3DW_WARN_UNUSED_RESULT #endif /* we want this widget visible, as long as the widgets below are also visible. * on for all widgets, except surfaces which have to be switched visible * with s3dw_show() */ #define S3DW_VISIBLE 1 /* widget should accept input. that's on by default. */ #define S3DW_ACTIVE 2 /* tells us if the widget is currently displayed */ #define S3DW_ONSCREEN 256 /* if the surface (or widget) is already properly arranged */ #define S3DW_ARRANGED 512 /* follow the camera */ #define S3DW_FOLLOW_CAM 1024 /* turn to the camera */ #define S3DW_TURN_CAM 2048 /* just a typecaster to beatify code. use it if you like */ #define S3DWIDGET(x) ((s3dw_widget *)x) enum { S3DW_TROOT, S3DW_TCAM, S3DW_TSURFACE, S3DW_TBUTTON, S3DW_TLABEL, S3DW_TINPUT, S3DW_TTEXTBOX, S3DW_TSCROLLBAR, S3DW_NTYPES }; typedef struct _s3dw_widget s3dw_widget; typedef struct _s3dw_button s3dw_button; typedef struct _s3dw_label s3dw_label; typedef struct _s3dw_textbox s3dw_textbox; typedef struct _s3dw_scrollbar s3dw_scrollbar; typedef struct _s3dw_input s3dw_input; typedef struct _s3dw_surface s3dw_surface; typedef struct _s3dw_style s3dw_style; /** \brief style of s3d widget * * With s3dw_style you can change the colors/materials of your widgets. * materials are in the same as in s3d_push_materials_a, that means * red,green,blue and alpha float values (between 0.0 and 1.0) for ambience, * specular and diffuse color. */ struct _s3dw_style { const char *name; /**< name of the style ... kind of redundant */ const char *fontface; /**< font face for all used fonts */ float surface_mat[12]; /**< material for the surface background */ float input_mat[12]; /**< material for button boxes and other widgets */ float inputback_mat[12]; /**< material for input field background */ float text_mat[12]; /**< material for the text on buttons and inputs */ float title_mat[12]; /**< material for the title bar */ float title_text_mat[12]; /**< material for the text on the title bar */ }; /** \brief s3d widget information * * This is the most basic widget type, it contains all the "general" widget * information. If you want to move a widget, you'd change x,y,z,s and rx,ry,rz * and call s3dw_moveit to turn your action reality. Every other widget has this * type as first entry, so a simple typecast to s3dw_widget will give you the * widgets "general" information. For typecast, you may use S3DWIDGET(). * * The pointer ptr allows linking to user-specific data structures. That comes * in handy if the widget is called back by an event, and the program must now * find out on which data the user reacted. */ struct _s3dw_widget { /* private .. */ int type; s3dw_widget *parent; s3dw_style *style; int nobj; /* number of children objects */ s3dw_widget **pobj; /* pointer to list of children objects */ int focus; /* index of the widget focused in pobj */ int flags; /* flags like visibility */ float ax, ay, az; /* current position for animation */ float as; /* current scale factor */ float arx, ary, arz; /* current rotation */ float width, height; /* width and height of the widget, outer size */ uint32_t oid; /* the main object which is used for transformations etc ...*/ /* public */ void *ptr; /* a pointer to a user structure, to use in callbacks etc */ float x, y, z; /* position, relative to the surface usually */ float s; /* scale factor */ float rx, ry, rz; /* rotation around the axis */ }; /** * The callback type. Receive the widget which is affected as argument. * * \code * // example * void my_handler(s3dw_widget *widget) * { * // do something with the widget * ... * } * \endcode */ typedef void (*s3dw_callback)(s3dw_widget *); /** \brief button of s3d widget * * The buttons is just a button as you would expect it in a 2D widget library. * It only reacts on clicks. */ struct _s3dw_button { /* private */ s3dw_widget widget; char *text; uint32_t oid_text; /* public */ s3dw_callback onclick; }; /** \brief label of s3d widget * * The labels is an label-field where a user may type things. onclick reacts on * click in the field. */ struct _s3dw_label { /* private */ s3dw_widget widget; char *text; /* public */ s3dw_callback onclick; }; /** \brief scrollbar of s3d widget * * The Scrollbar should be placed around scrollable content. Currently only the * left and right icons are clickable (lonclick and ronclick callbacks), in * vertical mode lonclick is the callback for the up icon, ronclick the callback * for the down icon. */ struct _s3dw_scrollbar { /* private */ s3dw_widget widget; float pos, max; int type; /* 0 = horizontal, 1 = vertical */ int loid, roid, baroid; /* public */ s3dw_callback lonclick; s3dw_callback ronclick; }; /** \brief textbox of s3d widget * * A textbox shows some text with scrollbars to scroll around. It can currently * only react to a click event. */ struct _s3dw_textbox { /* private */ s3dw_widget widget; s3dw_scrollbar *scroll_vertical, *scroll_horizontal; char *text; int n_lineoids, *p_lineoids; int window_x, window_y; /* public */ s3dw_callback onclick; }; /** \brief input field of s3d widget * * The inputs is an input-field where a user may type things. onclick reacts on * click in the field, onedit notifies you when someone writes in the field. */ struct _s3dw_input { /* private */ s3dw_widget widget; char *text; uint32_t oid_text; /* public */ s3dw_callback onclick; s3dw_callback onedit; }; /** \brief root of s3d widget * * A surface is the window of this widget library, holding all of our elements * like buttons, input fields etc ... */ struct _s3dw_surface { /* private */ s3dw_widget widget; uint32_t oid_title; uint32_t oid_tbar; char *title; }; #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* button.c */ S3DWEXPORT s3dw_button *s3dw_button_new(const s3dw_surface *surface, const char *text, float posx, float posy); S3DWEXPORT s3dw_label *s3dw_label_new(const s3dw_surface *surface, const char *text, float posx, float posy); S3DWEXPORT s3dw_input *s3dw_input_new(const s3dw_surface *surface, float width, float posx, float posy); S3DWEXPORT s3dw_textbox *s3dw_textbox_new(const s3dw_surface *surface, const char *text, float posx, float posy, float width, float height); S3DWEXPORT char *s3dw_input_gettext(s3dw_input *input); S3DWEXPORT void s3dw_input_change_text(s3dw_input *input, const char *text); S3DWEXPORT void s3dw_label_change_text(s3dw_label *label, const char *text); S3DWEXPORT s3dw_surface *s3dw_surface_new(const char *title, float width, float height) S3DW_WARN_UNUSED_RESULT; S3DWEXPORT s3dw_widget *s3dw_getroot(void); S3DWEXPORT void s3dw_moveit(s3dw_widget *widget); S3DWEXPORT void s3dw_delete(s3dw_widget *widget); S3DWEXPORT void s3dw_show(s3dw_widget *widget); S3DWEXPORT void s3dw_focus(s3dw_widget *focus); S3DWEXPORT void s3dw_textbox_scrollup(s3dw_textbox *textbox); S3DWEXPORT void s3dw_textbox_scrolldown(s3dw_textbox *textbox); S3DWEXPORT void s3dw_textbox_scrollleft(s3dw_textbox *textbox); S3DWEXPORT void s3dw_textbox_scrollright(s3dw_textbox *textbox); S3DWEXPORT void s3dw_textbox_scrollto(s3dw_textbox *textbox, int x, int y); S3DWEXPORT void s3dw_textbox_change_text(s3dw_textbox *textbox, const char *text); S3DWEXPORT int s3dw_handle_click(const struct s3d_evt *event); S3DWEXPORT int s3dw_handle_key(const struct s3d_evt *event); S3DWEXPORT int s3dw_object_info(struct s3d_evt *event); S3DWEXPORT void s3dw_ani_mate(void); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif s3d-0.2.2.1/libs3dw/s3dw_int.h000066400000000000000000000110111361325167000156130ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #ifndef LIBS3DW_INT_H #define LIBS3DW_INT_H #include /* for s3dw_widget, ::S3DW_NTYPES, etc */ #include /* for uint32_t */ #define MAXANI 128 #define ZOOMS 5 /* constructor and handler callbacks */ typedef int (*s3dw_click_callback)(s3dw_widget *, uint32_t); typedef int (*s3dw_key_callback)(s3dw_widget *, struct s3d_key_event *); extern s3dw_callback s3dwcb_show[S3DW_NTYPES]; extern s3dw_callback s3dwcb_hide[S3DW_NTYPES]; extern s3dw_callback s3dwcb_destroy[S3DW_NTYPES]; extern s3dw_click_callback s3dwcb_click[S3DW_NTYPES]; extern s3dw_key_callback s3dwcb_key[S3DW_NTYPES]; /* root.c */ s3dw_widget *s3dw_getroot(void); void s3dw_nothing(s3dw_widget *widget); int s3dw_click_nothing(s3dw_widget *widget, uint32_t dummy); int s3dw_key_nothing(s3dw_widget *widget, struct s3d_key_event *dummy); void s3dw_root_destroy(s3dw_widget *widget); const char *s3dw_get_type_string(int type); /* widget.c */ s3dw_widget* s3dw_widget_new(s3dw_widget *widget); int s3dw_widget_append(s3dw_widget *parent, s3dw_widget *widget); void s3dw_widget_visible(s3dw_widget *widget); int s3dw_widget_event_click(s3dw_widget *widget, uint32_t oid); int s3dw_widget_event_key(s3dw_widget *widget, struct s3d_key_event *keys); /* surface.c */ void s3dw_surface_destroy(s3dw_widget *widget); void s3dw_surface_draw(s3dw_widget *widget); void s3dw_surface_erase(s3dw_widget *widget); void s3dw_surface_show(s3dw_widget *widget); void s3dw_surface_hide(s3dw_widget *widget); int s3dw_surface_event_click(s3dw_widget *widget, uint32_t oid); int s3dw_surface_event_key(s3dw_widget *widget, struct s3d_key_event *keys); /* button.c */ void s3dw_button_destroy(s3dw_widget *widget); void s3dw_button_draw(s3dw_widget *widget); void s3dw_button_erase(s3dw_widget *widget); void s3dw_button_show(s3dw_widget *widget); void s3dw_button_hide(s3dw_widget *widget); int s3dw_button_event_click(s3dw_widget *widget, uint32_t oid); int s3dw_button_event_key(s3dw_widget *widget, struct s3d_key_event *keys); /* label.c */ void s3dw_label_destroy(s3dw_widget *widget); void s3dw_label_draw(s3dw_widget *widget); void s3dw_label_erase(s3dw_widget *widget); void s3dw_label_show(s3dw_widget *widget); void s3dw_label_hide(s3dw_widget *widget); int s3dw_label_event_click(s3dw_widget *widget, uint32_t oid); int s3dw_label_event_key(s3dw_widget *widget, struct s3d_key_event *keys); /* input.c */ void s3dw_input_destroy(s3dw_widget *widget); void s3dw_input_draw(s3dw_widget *widget); void s3dw_input_erase(s3dw_widget *widget); void s3dw_input_show(s3dw_widget *widget); void s3dw_input_hide(s3dw_widget *widget); uint32_t s3dw_input_draw_string(s3dw_widget *widget); int s3dw_input_event_click(s3dw_widget *widget, uint32_t oid); int s3dw_input_event_key(s3dw_widget *widget, struct s3d_key_event *keys); /* textbox.c */ void s3dw_textbox_drawtext(s3dw_widget *widget); void s3dw_textbox_erasetext(s3dw_widget *widget); void s3dw_textbox_show(s3dw_widget *widget); void s3dw_textbox_hide(s3dw_widget *widget); void s3dw_textbox_erase(s3dw_widget *widget); void s3dw_textbox_destroy(s3dw_widget *widget); void s3dw_textbox_erasetext(s3dw_widget *widget); void s3dw_textbox_drawtext(s3dw_widget *widget); int s3dw_textbox_event_key(s3dw_widget *widget, struct s3d_key_event *keys); int s3dw_textbox_event_click(s3dw_widget *widget, uint32_t oid); /* scrollbar.c */ #define S3DW_SBAR_HORI 0 #define S3DW_SBAR_VERT 1 s3dw_scrollbar *s3dw_scrollbar_new(s3dw_widget *parent, int type, float posx, float posy, float length); void s3dw_scrollbar_show(s3dw_widget *widget); void s3dw_scrollbar_hide(s3dw_widget *widget); void s3dw_scrollbar_erase(s3dw_widget *widget); void s3dw_scrollbar_destroy(s3dw_widget *widget); int s3dw_scrollbar_event_key(s3dw_widget *widget, struct s3d_key_event *keys); int s3dw_scrollbar_event_click(s3dw_widget *widget, uint32_t oid); /* style.c */ extern s3dw_style def_style; /* animate.c */ extern int ani_need_arr; int s3dw_ani_stackpos(s3dw_widget *f); void s3dw_ani_add(s3dw_widget *f); void s3dw_ani_del(int i); void s3dw_ani_doit(s3dw_widget *f); void s3dw_ani_finish(s3dw_widget *f, int i); void s3dw_ani_iterate(s3dw_widget *f); void s3dw_ani_needarr(void); int s3dw_ani_check(s3dw_widget *f); /* arrange.c */ extern s3dw_widget *_s3dw_cam; void s3dw_arrange(void); void s3dw_arr_widgetcenter(s3dw_widget *widget, float *center); void s3dw_arr_normdir(float *dir); void s3dw_turn(void); #endif /* LIBS3DW_INT_H */ s3d-0.2.2.1/libs3dw/scrollbar.c000066400000000000000000000254661361325167000160620ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ static void s3dw_scrollbar_draw(s3dw_widget *widget) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; float back_vertices[3*32]; int i, j; unsigned int back_polygons[44*4] = { /* box outside */ 0, 4, 5, 0, 0, 5, 1, 0, 1, 5, 6, 0, 1, 6, 2, 0, 3, 2, 7, 0, 7, 2, 6, 0, 3, 7, 4, 0, 3, 4, 0, 0, /* sides of big box */ 12, 13, 9, 0, 12, 9, 8, 0, 14, 15, 11, 0, 14, 11, 10, 0, /* inlay box */ 9, 16, 17, 0, 9, 17, 10, 0, 17, 18, 14, 0, 17, 14, 10, 0, 13, 14, 18, 0, 13, 18, 19, 0, 13, 19, 16, 0, 13, 16, 9, 0, /* inlay box back */ 19, 18, 17, 0, 19, 17, 16, 0, /* up arrow background surface */ 7, 6, 15, 0, 7, 15, 14, 0, 7, 14, 13, 0, 7, 13, 12, 0, /* up arrow face */ 20, 23, 24, 0, 20, 24, 21, 0, 21, 24, 25, 0, 21, 25, 22, 0, 20, 22, 25, 0, 20, 25, 23, 0, 23, 25, 24, 0, /* down arrow background surface */ 4, 8, 9, 0, 4, 9, 10, 0, 4, 10, 11, 0, 4, 11, 5, 0, /* down arrow face */ 26, 27, 31, 0, 26, 31, 30, 0, 31, 27, 28, 0, 31, 28, 29, 0, 26, 30, 29, 0, 26, 29, 28, 0, 30, 31, 29, 0 }; unsigned int bar_polygons[14*4] = { /* front */ 0, 4, 5, 0, 0, 5, 1, 0, 1, 5, 6, 0, 1, 6, 2, 0, 3, 2, 6, 0, 3, 6, 7, 0, 3, 7, 4, 0, 3, 4, 0, 0, 7, 6, 4, 0, 4, 6, 5, 0, /* back, only visible sides */ 2, 3, 11, 0, 2, 11, 10, 0, 1, 9, 8, 0, 1, 8, 0, 0 }; float bar_vertices[12*3]; float w, h; float temp; w = (scrollbar->type == S3DW_SBAR_VERT) ? widget->width : widget->height; h = (scrollbar->type == S3DW_SBAR_VERT) ? widget->height : widget->width; /* outside/big box */ back_vertices[0*3+0] = w * 0.0; back_vertices[0*3+1] = 0.0 - h; back_vertices[0*3+2] = 0.0; back_vertices[1*3+0] = w * 1.0; back_vertices[1*3+1] = 0.0 - h; back_vertices[1*3+2] = 0.0; back_vertices[2*3+0] = w * 1.0; back_vertices[2*3+1] = 0.0; back_vertices[2*3+2] = 0.0; back_vertices[3*3+0] = w * 0.0; back_vertices[3*3+1] = 0.0; back_vertices[3*3+2] = 0.0; back_vertices[4*3+0] = w * 0.125; back_vertices[4*3+1] = w * 0.125 - h; back_vertices[4*3+2] = 0.25; back_vertices[5*3+0] = w * 0.875; back_vertices[5*3+1] = w * 0.125 - h; back_vertices[5*3+2] = 0.25; back_vertices[6*3+0] = w * 0.875; back_vertices[6*3+1] = w * -0.125; back_vertices[6*3+2] = 0.25; back_vertices[7*3+0] = w * 0.125; back_vertices[7*3+1] = w * -0.125; back_vertices[7*3+2] = 0.25; /* downside inlay */ back_vertices[8*3+0] = w * 0.125; back_vertices[8*3+1] = w - h; back_vertices[8*3+2] = 0.25; back_vertices[9*3+0] = w * 0.25; back_vertices[9*3+1] = w - h; back_vertices[9*3+2] = 0.25; back_vertices[10*3+0] = w * 0.75; back_vertices[10*3+1] = w - h; back_vertices[10*3+2] = 0.25; back_vertices[11*3+0] = w * 0.875; back_vertices[11*3+1] = w - h; back_vertices[11*3+2] = 0.25; /* upside inlay */ back_vertices[12*3+0] = w * 0.125; back_vertices[12*3+1] = -w; back_vertices[12*3+2] = 0.25; back_vertices[13*3+0] = w * 0.25; back_vertices[13*3+1] = -w; back_vertices[13*3+2] = 0.25; back_vertices[14*3+0] = w * 0.75; back_vertices[14*3+1] = -w; back_vertices[14*3+2] = 0.25; back_vertices[15*3+0] = w * 0.875; back_vertices[15*3+1] = -w; back_vertices[15*3+2] = 0.25; /* inlay box */ back_vertices[16*3+0] = w * 0.25; back_vertices[16*3+1] = w * 0.125 - h + w; back_vertices[16*3+2] = 0.125; back_vertices[17*3+0] = w * 0.75; back_vertices[17*3+1] = w * 0.125 - h + w; back_vertices[17*3+2] = 0.125; back_vertices[18*3+0] = w * 0.75; back_vertices[18*3+1] = w * -0.125 - w; back_vertices[18*3+2] = 0.125; back_vertices[19*3+0] = w * 0.25; back_vertices[19*3+1] = w * -0.125 - w; back_vertices[19*3+2] = 0.125; /* arrow up */ back_vertices[20*3+0] = w * 0.25; back_vertices[20*3+1] = w * -0.875; back_vertices[20*3+2] = 0.25; back_vertices[21*3+0] = w * 0.75; back_vertices[21*3+1] = w * -0.875; back_vertices[21*3+2] = 0.25; back_vertices[22*3+0] = w * 0.5; back_vertices[22*3+1] = w * -0.25; back_vertices[22*3+2] = 0.25; back_vertices[23*3+0] = w * 0.375; back_vertices[23*3+1] = w * -0.75; back_vertices[23*3+2] = 0.375; back_vertices[24*3+0] = w * 0.625; back_vertices[24*3+1] = w * -0.75; back_vertices[24*3+2] = 0.375; back_vertices[25*3+0] = w * 0.5; back_vertices[25*3+1] = w * -0.375; back_vertices[25*3+2] = 0.375; /* arrow down */ back_vertices[26*3+0] = w * 0.25; back_vertices[26*3+1] = -h + w * 0.875; back_vertices[26*3+2] = 0.25; back_vertices[27*3+0] = w * 0.75; back_vertices[27*3+1] = -h + w * 0.875; back_vertices[27*3+2] = 0.25; back_vertices[28*3+0] = w * 0.5; back_vertices[28*3+1] = -h + w * 0.25; back_vertices[28*3+2] = 0.25; back_vertices[29*3+0] = w * 0.375; back_vertices[29*3+1] = -h + w * 0.75; back_vertices[29*3+2] = 0.375; back_vertices[30*3+0] = w * 0.625; back_vertices[30*3+1] = -h + w * 0.75; back_vertices[30*3+2] = 0.375; back_vertices[31*3+0] = w * 0.5; back_vertices[31*3+1] = -h + w * 0.375; back_vertices[31*3+2] = 0.375; /* scrollbar bar poinst */ bar_vertices[0*3+0] = w * 0.25; bar_vertices[0*3+1] = -(h - 3) + w * 0.125; bar_vertices[0*3+2] = 0.25; bar_vertices[1*3+0] = w * 0.75; bar_vertices[1*3+1] = -(h - 3) + w * 0.125; bar_vertices[1*3+2] = 0.25; bar_vertices[2*3+0] = w * 0.75; bar_vertices[2*3+1] = -w * 0.125; bar_vertices[2*3+2] = 0.25; bar_vertices[3*3+0] = w * 0.25; bar_vertices[3*3+1] = -w * 0.125; bar_vertices[3*3+2] = 0.25; bar_vertices[4*3+0] = w * 0.125; bar_vertices[4*3+1] = -(h - 3) + w * 0.25; bar_vertices[4*3+2] = 0.375; bar_vertices[5*3+0] = w * 0.875; bar_vertices[5*3+1] = -(h - 3) + w * 0.25; bar_vertices[5*3+2] = 0.375; bar_vertices[6*3+0] = w * 0.875; bar_vertices[6*3+1] = -w * 0.25; bar_vertices[6*3+2] = 0.375; bar_vertices[7*3+0] = w * 0.125; bar_vertices[7*3+1] = -w * 0.25; bar_vertices[7*3+2] = 0.375; bar_vertices[8*3+0] = w * 0.125; bar_vertices[8*3+1] = -(h - 3) + w * 0.25; bar_vertices[8*3+2] = 0.175; bar_vertices[9*3+0] = w * 0.875; bar_vertices[9*3+1] = -(h - 3) + w * 0.25; bar_vertices[9*3+2] = 0.175; bar_vertices[10*3+0] = w * 0.875; bar_vertices[10*3+1] = -w * 0.25; bar_vertices[10*3+2] = 0.175; bar_vertices[11*3+0] = w * 0.125; bar_vertices[11*3+1] = -w * 0.25; bar_vertices[11*3+2] = 0.175; if (scrollbar->type == S3DW_SBAR_HORI) { /* rotate x and y for horizontal scrollbar */ for (i = 0; i < 32; i++) { temp = back_vertices[i*3]; back_vertices[i*3] = -back_vertices[i*3+1]; back_vertices[i*3+1] = -temp; } for (i = 0; i < 44; i++) { /* change clockwiseness */ j = back_polygons[i*4]; back_polygons[i*4] = back_polygons[i*4+1]; back_polygons[i*4+1] = j; } for (i = 0; i < 12; i++) { temp = bar_vertices[i*3]; bar_vertices[i*3] = -bar_vertices[i*3+1]; bar_vertices[i*3+1] = -temp; } for (i = 0; i < 14; i++) { /* change clockwiseness */ j = bar_polygons[i*4]; bar_polygons[i*4] = bar_polygons[i*4+1]; bar_polygons[i*4+1] = j; } } widget->oid = s3d_new_object(); scrollbar->loid = s3d_new_object(); scrollbar->roid = s3d_new_object(); scrollbar->baroid = s3d_new_object(); s3d_push_materials_a(widget->oid, widget->style->input_mat, 1); s3d_push_materials_a(scrollbar->loid, widget->style->input_mat, 1); s3d_push_materials_a(scrollbar->roid, widget->style->input_mat, 1); s3d_push_materials_a(scrollbar->baroid, widget->style->input_mat, 1); s3d_push_vertices(widget->oid, back_vertices, 20); s3d_push_vertices(scrollbar->loid, back_vertices, 32); s3d_push_vertices(scrollbar->roid, back_vertices, 32); s3d_push_vertices(scrollbar->baroid, bar_vertices, 12); s3d_push_polygons(widget->oid, back_polygons , 22); s3d_push_polygons(scrollbar->loid, back_polygons + 4*22, 11); s3d_push_polygons(scrollbar->roid, back_polygons + 4*33, 11); s3d_push_polygons(scrollbar->baroid, bar_polygons , 14); s3d_link(widget->oid, widget->parent->oid); s3d_link(scrollbar->loid, widget->oid); s3d_link(scrollbar->roid, widget->oid); s3d_link(scrollbar->baroid, widget->oid); s3d_translate(widget->oid, widget->x, -widget->y, 0); if (scrollbar->type == S3DW_SBAR_VERT) s3d_translate(scrollbar->baroid, 0, -1.5, 0); else s3d_translate(scrollbar->baroid, 1.5, 0, 0); } /* show the scrollbar */ void s3dw_scrollbar_show(s3dw_widget *widget) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(scrollbar->loid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(scrollbar->roid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(scrollbar->baroid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hides the scrollbar */ void s3dw_scrollbar_hide(s3dw_widget *widget) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(scrollbar->loid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(scrollbar->roid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(scrollbar->baroid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* create a new scrollbar in the surface */ s3dw_scrollbar *s3dw_scrollbar_new(s3dw_widget *parent, int type, float posx, float posy, float length) { s3dw_scrollbar *scrollbar; s3dw_widget *widget; scrollbar = (s3dw_scrollbar *)malloc(sizeof(s3dw_scrollbar)); widget = s3dw_widget_new((s3dw_widget *)scrollbar); widget->type = S3DW_TSCROLLBAR; if ((scrollbar->type = type) == S3DW_SBAR_HORI) { widget->height = 1; widget->width = length; } else { widget->width = 1; widget->height = length; } widget->x = posx; widget->y = posy; widget->oid = -1; scrollbar->loid = -1; scrollbar->roid = -1; scrollbar->baroid = -1; scrollbar->lonclick = s3dw_nothing; scrollbar->ronclick = s3dw_nothing; s3dw_widget_append(parent, widget); s3dw_scrollbar_draw(widget); return scrollbar; } void s3dw_scrollbar_erase(s3dw_widget *widget) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; s3d_del_object(widget->oid); s3d_del_object(scrollbar->loid); s3d_del_object(scrollbar->roid); s3d_del_object(scrollbar->baroid); } /* destroy the scrollbar */ void s3dw_scrollbar_destroy(s3dw_widget *widget) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; s3dw_scrollbar_erase(widget); free(scrollbar); } /* handle key events */ int s3dw_scrollbar_event_key(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(keys)) { return 0; } /* handle click events */ int s3dw_scrollbar_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_scrollbar *scrollbar = (s3dw_scrollbar *)widget; if (scrollbar->loid == (int)oid) { scrollbar->lonclick(widget); return 1; } if (scrollbar->roid == (int)oid) { scrollbar->ronclick(widget); return 1; } return 0; } s3d-0.2.2.1/libs3dw/style.c000066400000000000000000000015011361325167000152170ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include /* default style */ s3dw_style def_style = { /* name */ "default", /* font face */ "vera", /* surface_mat */ { 0.7, 0.7, 0.7, 1.0, 0.7, 0.7, 0.7, 1.0, 0.7, 0.7, 0.7, 1.0 }, /* input_mat */ { 0.7, 0.7, 0.7, 1.0, 0.7, 0.7, 0.7, 1.0, 0.7, 0.7, 0.7, 1.0 }, /* inputback_mat */ { 0.9, 0.9, 0.9, 1.0, 0.9, 0.9, 0.9, 1.0, 0.9, 0.9, 0.9, 1.0 }, /* text_mat */ { 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0 }, /* title_mat */ { 0.0, 0.4, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.4, 0.8, 1.0 }, /* title_text_mat */ { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 } }; s3d-0.2.2.1/libs3dw/surface.c000066400000000000000000000127021361325167000155140ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ #include /* cos(), sin() */ #define POPUPDIST 20 void s3dw_surface_draw(s3dw_widget *widget) { s3dw_surface *surface = (s3dw_surface *)widget; int textlen; float length; float vertices[8*3] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1 }; float sver[8*3], tver[8*3]; uint32_t polygon[10*4] = { 0, 1, 2, 0, 0, 2, 3, 0, 1, 5, 6, 0, 1, 6, 2, 0, 2, 6, 7, 0, 2, 7, 3, 0, 4, 0, 3, 0, 4, 3, 7, 0, 5, 4, 7, 0, 5, 7, 6, 0 }; uint32_t tpol[10*4]; int i; widget->oid = s3d_new_object(); surface->oid_tbar = s3d_new_object(); s3d_select_font("vera"); surface->oid_title = s3d_draw_string(surface->title, &length); while (length > (widget->width + 1)) { s3dprintf(HIGH, "%f > %f", length, widget->width + 1); textlen = strlen(surface->title); if (length > ((widget->width + 1)*1.3)) textlen = textlen * ((widget->width + 1) * 1.1 / length); if (textlen > 4) { surface->title[textlen-2] = 0; surface->title[textlen-3] = '.'; surface->title[textlen-4] = '.'; s3d_del_object(surface->oid_title); surface->oid_title = s3d_draw_string(surface->title, &length); } else { break; } } /* prepare vertices */ for (i = 0; i < 8; i++) { sver[i*3 + 0] = vertices[i*3+0] * widget->width; sver[i*3 + 1] = vertices[i*3+1] * -widget->height; sver[i*3 + 2] = vertices[i*3+2] * -1; tver[i*3 + 0] = vertices[i*3+0] * widget->width; tver[i*3 + 1] = vertices[i*3+1]; tver[i*3 + 2] = vertices[i*3+2] * -1; } /* swap */ for (i = 0; i < 10; i++) { tpol[i*4 + 0] = polygon[i*4 + 1]; tpol[i*4 + 1] = polygon[i*4 + 0]; tpol[i*4 + 2] = polygon[i*4 + 2]; tpol[i*4 + 3] = polygon[i*4 + 3]; } s3d_push_vertices(widget->oid, sver, 8); s3d_push_vertices(surface->oid_tbar, tver, 8); s3d_push_materials_a(widget->oid , widget->style->surface_mat, 1); s3d_push_materials_a(surface->oid_tbar, widget->style->title_mat, 1); s3d_pep_materials_a(surface->oid_title, widget->style->title_text_mat, 1); s3d_push_polygons(widget->oid, polygon, 10); s3d_push_polygons(surface->oid_tbar, tpol, 10); s3d_link(surface->oid_tbar, widget->oid); s3d_link(surface->oid_title, surface->oid_tbar); s3d_link(widget->oid, widget->parent->oid); s3d_translate(surface->oid_title, 0.5, 0.2, 0.1); s3d_scale(widget->oid, widget->as); s3d_translate(widget->oid, widget->ax, widget->ay, widget->az); } /* show the surface */ void s3dw_surface_show(s3dw_widget *widget) { s3dw_surface *surface = (s3dw_surface *)widget; s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(surface->oid_title, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_on(surface->oid_tbar, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hides the surface */ void s3dw_surface_hide(s3dw_widget *widget) { s3dw_surface *surface = (s3dw_surface *)widget; s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(surface->oid_title, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); s3d_flags_off(surface->oid_tbar, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /** \brief create a new surface * * Creates a new surface (a new window) with title "title" and dimension "width" * x "height". * * See s3dw_surface for information about callbacks which may be defined. */ s3dw_surface *s3dw_surface_new(const char *title, float width, float height) { s3dw_surface *surface; s3dw_widget *widget; float f1[3]; surface = (s3dw_surface *)malloc(sizeof(s3dw_surface)); surface->title = strdup(title); widget = s3dw_widget_new((s3dw_widget *)surface); widget->type = S3DW_TSURFACE; widget->width = width; widget->height = height; widget->as = 0.01; s3dw_arr_widgetcenter(widget, f1); s3dw_widget_append(s3dw_getroot(), widget); widget->x = -f1[0] + _s3dw_cam->x - sin(_s3dw_cam->ry * M_PI / 180) * cos(_s3dw_cam->rx * M_PI / 180) * POPUPDIST; widget->y = -f1[1] + _s3dw_cam->y + sin(_s3dw_cam->rx * M_PI / 180) * POPUPDIST; widget->z = -f1[2] + _s3dw_cam->z - cos(_s3dw_cam->ry * M_PI / 180) * cos(_s3dw_cam->rx * M_PI / 180) * POPUPDIST; widget->ax = widget->x; widget->ay = widget->y; widget->az = widget->z; widget->flags |= S3DW_FOLLOW_CAM | S3DW_TURN_CAM; s3dw_surface_draw(widget); s3dw_ani_needarr(); s3dw_ani_add(widget); return surface; } /* delete objects in the s3d context */ void s3dw_surface_erase(s3dw_widget *widget) { s3dw_surface *surface = (s3dw_surface *)widget; s3d_del_object(widget->oid); s3d_del_object(surface->oid_tbar); s3d_del_object(surface->oid_title); } /* destroy the surface */ void s3dw_surface_destroy(s3dw_widget *widget) { s3dw_surface *surface = (s3dw_surface *)widget; s3dw_surface_erase(widget); free(surface->title); free(surface); } /* handle key events */ int s3dw_surface_event_key(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(keys)) { return 0; } /* test widgets of the surface for clicks */ int s3dw_surface_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_surface *surface = (s3dw_surface *)widget; if (widget->oid == oid) { s3dw_focus(widget); s3dprintf(MED, "body %s clicked", surface->title); return 1; } if ((surface->oid_tbar == oid) || (surface->oid_title == oid)) { s3dw_focus(widget); s3dprintf(MED, "title %s clicked", surface->title); return 1; } return 0; } s3d-0.2.2.1/libs3dw/textbox.c000066400000000000000000000216141361325167000155630ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ static void s3dw_textbox_draw(s3dw_widget *widget) { float h, w; float vertices[12*3]; uint32_t polygons[18*4] = { 0, 4, 5, 1, 0, 5, 1, 1, 1, 5, 6, 1, 1, 6, 2, 1, 2, 6, 7, 1, 2, 7, 3, 1, 3, 7, 4, 1, 3, 4, 0, 1, 4, 8, 9, 1, 4, 9, 5, 1, 5, 9, 10, 1, 5, 10, 6, 1, 6, 10, 11, 1, 6, 11, 7, 1, 7, 11, 8, 1, 7, 8, 4, 1, 8, 11, 10, 0, 8, 10, 9, 0 }; w = widget->width - 2; h = widget->height - 3; if (widget->width < 1) return; /* width of the input depends on the length of the text */ vertices[0*3+0] = 0.0; vertices[0*3+1] = 0.0; vertices[0*3+2] = 0.0; vertices[1*3+0] = 0.0; vertices[1*3+1] = -h - 2.0; vertices[1*3+2] = 0.0; vertices[2*3+0] = w + 1; vertices[2*3+1] = -h - 2.0; vertices[2*3+2] = 0.0; vertices[3*3+0] = w + 1; vertices[3*3+1] = 0.0; vertices[3*3+2] = 0.0; vertices[4*3+0] = 0.125; vertices[4*3+1] = -0.125; vertices[4*3+2] = 0.25; vertices[5*3+0] = 0.125; vertices[5*3+1] = -h - 1.875; vertices[5*3+2] = 0.25; vertices[6*3+0] = w + 0.875; vertices[6*3+1] = -h - 1.875; vertices[6*3+2] = 0.25; vertices[7*3+0] = w + 0.875; vertices[7*3+1] = -0.125; vertices[7*3+2] = 0.25; vertices[8*3+0] = 0.25; vertices[8*3+1] = -0.25; vertices[8*3+2] = 0.125; vertices[9*3+0] = 0.25; vertices[9*3+1] = -h - 1.75; vertices[9*3+2] = 0.125; vertices[10*3+0] = w + 0.75; vertices[10*3+1] = -h - 1.75; vertices[10*3+2] = 0.125; vertices[11*3+0] = w + 0.75; vertices[11*3+1] = -0.25; vertices[11*3+2] = 0.125; widget->oid = s3d_new_object(); s3d_push_materials_a(widget->oid, widget->style->inputback_mat, 1); s3d_push_materials_a(widget->oid, widget->style->input_mat, 1); s3d_push_vertices(widget->oid, vertices, 12); s3d_push_polygons(widget->oid, polygons, 18); s3d_link(widget->oid, widget->parent->oid); s3d_translate(widget->oid, widget->x, -widget->y, 0); s3dw_textbox_drawtext(widget); } void s3dw_textbox_drawtext(s3dw_widget *widget) { s3dw_textbox *textbox = (s3dw_textbox *)widget; char *text, *rest; char *linefeedpos; int i; int x, y; float width; textbox->n_lineoids = widget->height - 2; textbox->p_lineoids = (int*)malloc(textbox->n_lineoids * sizeof(int)); width = widget->width - 1.5; y = -textbox->window_y; x = textbox->window_x; for (i = 0; i < textbox->n_lineoids; i++) textbox->p_lineoids[i] = -1; rest = text = strdup(textbox->text); while (NULL != (linefeedpos = strchr(rest, '\n'))) { /* process every line */ linefeedpos[0] = 0; if ((x < (int)strlen(rest)) && ((y >= 0) && y < textbox->n_lineoids)) { /* don't bother, if it's not visible anyway */ rest += x; /* ignore the first x chars because we've scrolled a bit right */ while ((strlen(rest) > 0) && (s3d_strlen(rest) > width)) rest[strlen(rest)-1] = 0; /* remove last character and try again until it fits */ if (strlen(rest) > 0) { textbox->p_lineoids[y] = s3d_draw_string(rest, NULL); s3d_pep_materials_a(textbox->p_lineoids[y], widget->style->text_mat, 1); s3d_translate(textbox->p_lineoids[y], 0.5, -y - 1, 0.30); s3d_link(textbox->p_lineoids[y], widget->oid); } } rest = linefeedpos + 1; y += 1; } if (y < 0) textbox->window_y -= y; free(text); } void s3dw_textbox_erasetext(s3dw_widget *widget) { s3dw_textbox *textbox = (s3dw_textbox *)widget; int i; if (textbox->p_lineoids != NULL) { for (i = 0; i < textbox->n_lineoids; i++) if (textbox->p_lineoids[i] != -1) s3d_del_object(textbox->p_lineoids[i]); free(textbox->p_lineoids); textbox->p_lineoids = NULL; textbox->n_lineoids = 0; } } /* show the textbox */ void s3dw_textbox_show(s3dw_widget *widget) { s3dw_textbox *textbox = (s3dw_textbox *)widget; int i; s3d_flags_on(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); for (i = 0; i < textbox->n_lineoids; i++) s3d_flags_on(textbox->p_lineoids[i], S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } /* hides the textbox */ void s3dw_textbox_hide(s3dw_widget *widget) { s3dw_textbox *textbox = (s3dw_textbox *)widget; int i; s3d_flags_off(widget->oid, S3D_OF_VISIBLE | S3D_OF_SELECTABLE); for (i = 0; i < textbox->n_lineoids; i++) s3d_flags_on(textbox->p_lineoids[i], S3D_OF_VISIBLE | S3D_OF_SELECTABLE); } static void _s3dw_textbox_scrollbar_up(s3dw_widget *widget) { s3dw_textbox_scrollup((s3dw_textbox *)widget->parent); } static void _s3dw_textbox_scrollbar_down(s3dw_widget *widget) { s3dw_textbox_scrolldown((s3dw_textbox *)widget->parent); } static void _s3dw_textbox_scrollbar_left(s3dw_widget *widget) { s3dw_textbox_scrollleft((s3dw_textbox *)widget->parent); } static void _s3dw_textbox_scrollbar_right(s3dw_widget *widget) { s3dw_textbox_scrollright((s3dw_textbox *)widget->parent); } /** \brief create a new textbox in the surface * * Creates a new textbox on the surface, with "text" written on it and the upper * left corner at (posx,posy) on the surface. Width and height define the size * of the textbox including scrollbars which are rendered around the textfield. * * See s3dw_textbox for information about callbacks which may be defined. */ s3dw_textbox *s3dw_textbox_new(const s3dw_surface *surface, const char *text, float posx, float posy, float width, float height) { s3dw_textbox *textbox; s3dw_widget *widget; textbox = (s3dw_textbox *)malloc(sizeof(s3dw_textbox)); widget = s3dw_widget_new((s3dw_widget *)textbox); widget->type = S3DW_TTEXTBOX; widget->x = posx; widget->y = posy; widget->width = width; widget->height = height; textbox->window_x = 0; textbox->window_y = 0; textbox->p_lineoids = NULL; textbox->n_lineoids = 0; textbox->text = strdup(text); textbox->onclick = s3dw_nothing; s3dw_widget_append((s3dw_widget *)surface, widget); /* append first so the scrollbars inherit the style */ s3dw_textbox_draw(widget); textbox->scroll_horizontal = s3dw_scrollbar_new(widget, S3DW_SBAR_HORI, 0, widget->height - 1, widget->width - 1); textbox->scroll_vertical = s3dw_scrollbar_new(widget, S3DW_SBAR_VERT, widget->width - 1, 0, widget->height - 1); textbox->scroll_horizontal->lonclick = _s3dw_textbox_scrollbar_left; textbox->scroll_horizontal->ronclick = _s3dw_textbox_scrollbar_right; textbox->scroll_vertical->lonclick = _s3dw_textbox_scrollbar_up; textbox->scroll_vertical->ronclick = _s3dw_textbox_scrollbar_down; return textbox; } static void s3dw_textbox_redraw(s3dw_widget *widget) { s3dw_textbox_erasetext(widget); s3dw_textbox_drawtext(widget); if (widget->flags&S3DW_ONSCREEN) s3dw_textbox_show(widget); } /** \brief scroll text up * * Scrolls the text in the textbox up by one line, if possible. */ void s3dw_textbox_scrollup(s3dw_textbox *textbox) { if (textbox->window_y > 0) textbox->window_y--; s3dw_textbox_redraw(S3DWIDGET(textbox)); } /** \brief scroll text down * * Scrolls the text in the textbox down by one line, if possible. */ void s3dw_textbox_scrolldown(s3dw_textbox *textbox) { textbox->window_y++; s3dw_textbox_redraw(S3DWIDGET(textbox)); } /** \brief scroll text left * * Scrolls the text in the textbox to the left by one character, if possible. */ void s3dw_textbox_scrollleft(s3dw_textbox *textbox) { if (textbox->window_x > 0) textbox->window_x--; s3dw_textbox_redraw(S3DWIDGET(textbox)); } /** \brief scroll text right * * Scrolls the text in the textbox to the right by one character, if possible. */ void s3dw_textbox_scrollright(s3dw_textbox *textbox) { textbox->window_x++; s3dw_textbox_redraw(S3DWIDGET(textbox)); } /** \brief scroll text to position * * Scrolls the text in the textbox so that the character in row y, column x is * in the top left corner of the textbox. */ void s3dw_textbox_scrollto(s3dw_textbox *textbox, int x, int y) { s3dw_widget *widget = (s3dw_widget *)textbox; if (x < 0) x = 0; if (y < 0) y = 0; textbox->window_x = x; textbox->window_y = y; s3dw_textbox_redraw(widget); } /** \brief change text * * Change the text in the referenced textbox to the specified text. */ void s3dw_textbox_change_text(s3dw_textbox *textbox, const char *text) { s3dw_widget *widget = (s3dw_widget *)textbox; /* redraw the text ... */ free(textbox->text); textbox->text = strdup(text); s3dw_textbox_redraw(widget); } void s3dw_textbox_erase(s3dw_widget *widget) { s3dw_textbox_erasetext(widget); s3d_del_object(widget->oid); } /* destroy the textbox */ void s3dw_textbox_destroy(s3dw_widget *widget) { s3dw_textbox *textbox = (s3dw_textbox *)widget; s3dw_textbox_erase(widget); free(textbox->text); free(textbox); } /* handle key events */ int s3dw_textbox_event_key(s3dw_widget *S3DUNUSED(widget), struct s3d_key_event *S3DUNUSED(keys)) { return 0; } /* handle click events */ int s3dw_textbox_event_click(s3dw_widget *widget, uint32_t oid) { s3dw_textbox *textbox = (s3dw_textbox *)widget; if (widget->oid == oid) { textbox->onclick(widget); return 1; } return 0; } s3d-0.2.2.1/libs3dw/widget.c000066400000000000000000000101551361325167000153470ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1-or-later /* SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ #include #include #include #include #include /* malloc() */ #include /* strdup() */ #include s3dw_widget *s3dw_widget_new(s3dw_widget *widget) { widget->type = -1; widget->x = widget->ax = 0; widget->y = widget->ay = 0; widget->z = widget->az = 0; widget->rx = widget->arx = 0; widget->ry = widget->ary = 0; widget->rz = widget->arz = 0; widget->s = widget->as = 1; widget->width = 0; widget->height = 0; widget->nobj = 0; widget->pobj = NULL; widget->parent = NULL; widget->ptr = NULL; widget->focus = -1; widget->flags = S3DW_ACTIVE; widget->oid = -1; return widget; } /* widget clicked, call specific function and check kids */ int s3dw_widget_event_click(s3dw_widget *widget, uint32_t oid) { int i; s3dprintf(VLOW, "processing click event for widget %10p of type %d, oid %d (%d), subobjects: %d", (void*)widget, widget->type, widget->oid, oid, widget->nobj); if (s3dwcb_click[widget->type](widget, oid)) return 1; for (i = 0; i < widget->nobj; i++) if (s3dw_widget_event_click(widget->pobj[i], oid)) return 1; return 0; } /* widget received key,,call specific function and check (focused) kids */ int s3dw_widget_event_key(s3dw_widget *widget, struct s3d_key_event *keys) { if (s3dwcb_key[widget->type](widget, keys)) return 1; if (widget->focus != -1) if (s3dw_widget_event_key(widget->pobj[widget->focus], keys)) return 1; return 0; } /* append an widget */ int s3dw_widget_append(s3dw_widget *parent, s3dw_widget *widget) { s3dw_widget **new; parent->nobj++; new = realloc(parent->pobj, sizeof(*new) * (parent->nobj)); if (!new) return -ENOMEM; parent->pobj = new; parent->pobj[parent->nobj-1] = widget; widget->parent = parent; widget->style = parent->style; if (!(parent->flags&S3DW_VISIBLE)) widget->flags |= S3DW_VISIBLE; return 0; } /* removes an widget from it's parent, should have been appended before */ static void s3dw_widget_remove(s3dw_widget *widget) { s3dw_widget *parent = widget->parent; int i, stackpos; stackpos = s3dw_ani_stackpos(widget); if (stackpos != -1) s3dw_ani_del(stackpos); if (parent == NULL) return; for (i = 0; i < parent->nobj; i++) /* search ... */ if (parent->pobj[i] == widget) { /* ... and destroy */ if (parent->focus == i) parent->focus = -1; if (parent->focus == (parent->nobj - 1)) parent->focus = i; parent->pobj[i] = parent->pobj[parent->nobj-1]; /* swap last element to the to be deleted one */ parent->nobj--; } } /** \brief delete widget * * Deletes any widget. Should be casted with S3DWIDGET(). */ void s3dw_delete(s3dw_widget *widget) { s3dw_widget_remove(widget); /* remove kids */ while (widget->nobj > 0) /* will decrease as child-delete will call s3dw_widget_remove() */ s3dw_delete(widget->pobj[0]); free(widget->pobj); s3dwcb_destroy[widget->type](widget); /* type-specific destroy */ } /** \brief make widget visible * * Switches a widget visible. Should be casted with S3DWIDGET(). */ void s3dw_show(s3dw_widget *widget) { widget->flags |= S3DW_VISIBLE; s3dw_widget_visible(widget); } /** \brief give widget focus * * Gives focus to the widget, relative to its parent. That means you can focus a * surface, and each surface can focus one of its element, e.g. an input field. * Should be casted with S3DWIDGET(). */ void s3dw_focus(s3dw_widget *focus) { int i; for (i = 0; i < focus->parent->nobj; i++) if (focus->parent->pobj[i] == focus) { focus->parent->focus = i; return; } } /* show visible kids */ void s3dw_widget_visible(s3dw_widget *widget) { int i; s3dw_widget *kid; for (i = 0; i < widget->nobj; i++) { kid = widget->pobj[i]; if (widget->flags&S3DW_VISIBLE) s3dw_widget_visible(kid); } widget->flags |= S3DW_ONSCREEN; s3dwcb_show[widget->type](widget); } /** \brief apply widgets moving function * * Moves/translates the widget as you specified in it's private s3dw_widget * structure. Should be casted with S3DWIDGET(). */ void s3dw_moveit(s3dw_widget *widget) { s3dw_ani_add(widget); } s3d-0.2.2.1/objs/000077500000000000000000000000001361325167000133045ustar00rootroot00000000000000s3d-0.2.2.1/objs/AUTHORS000066400000000000000000000020711361325167000143540ustar00rootroot00000000000000All those objects in here may be used under the term GPL-2+, that means you may distribute and modify or alter them as you want, if you give full credits and redistribute them under GPL-2+ again. Too bad we don't have source code for them. maybe GPL-2+ is no good idea, but o well. :) I know, some of them (especially mine) are mostly junk, but maybe you find them useful ;) ### Mike Greanz (mog): btn_close.3ds btn_maximize.3ds btn_minimize.3ds btn_rotate.3ds ### Andreas Langer: accesspoint.3ds accesspoint_inet.3ds internet.3ds ### Christiane Weidauer (yd): abs2.3ds abs.3ds cube.3ds cubey.3ds cubeyholes.3ds film.3ds miu.3ds s3dstart.3ds spikeybla.3ds star.3ds ### Simon Wunderlich: arrow.3ds big_p.3ds bigsphere.3ds comp.3ds clock_bg.3ds dot.3ds dotdot.3ds duno.3ds dirstep.3ds folder.3ds geometry.3ds go_button.3ds katze_body.3ds katze_leg.3ds katze_tail.3ds lil_p.3ds materials.3ds meshnode.3ds new_sphere.3ds notes.3ds reset.3ds ringsystem.3ds rotate.3ds s3d_logo.3ds sec_p.3ds snow_body.3ds snow_foot.3ds snow_head.3ds sphere.3ds weirdball.3ds wtf.3ds xyz.3ds s3d-0.2.2.1/objs/CMakeLists.txt000066400000000000000000000014511361325167000160450ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann set(s3d-objs abs2.3ds abs.3ds accesspoint.3ds accesspoint_inet.3ds arrow2.3ds arrow.3ds big_p.3ds bigsphere.3ds btn_close.3ds btn_maximize.3ds btn_minimize.3ds btn_rotate.3ds clock_bg.3ds comp.3ds cube.3ds cubey.3ds cubeyholes.3ds dot.3ds dotdot.3ds duno.3ds film.3ds folder.3ds geometry.3ds go_button.3ds internet.3ds katze_body.3ds katze_leg.3ds katze_tail.3ds lil_p.3ds materials.3ds meshnode.3ds miu.3ds new_sphere.3ds notes.3ds reset.3ds ringsystem.3ds rotate.3ds s3d_sf_net.3ds s3dstart.3ds sec_p.3ds snow_body.3ds snow_foot.3ds snow_head.3ds sphere.3ds spikeybla.3ds star.3ds weirdball.3ds wtf.3ds xyz.3ds) # install install(FILES ${s3d-objs} DESTINATION "${DATA_INSTALL_DIR}") s3d-0.2.2.1/objs/abs.3ds000066400000000000000000000300371361325167000144670ustar00rootroot00000000000000MM0 ==0>= New Material@0\0      P0  ?@p/dodecahedrA_/`A6???A0.CHhx< =Tx< н>mD нhH н>H> нhmD>}*>=+7}*>_+7}*>=u=}*>_u=q>x|x=q>x|xLx=Lx׽CHh>x =T>x<_$=0x^>_$=0=x^>_$=0x^_$=0=x^<*̿ D?ߥT>п 6?>Pt?>(NA? 5m={?ߥT>п 6<*̿ D 5m={>(NA>Pt9k?^}oLL?u1^3?>L?u1[>9k?^}o^>?=N?BĽN(?emR?ȿ(? r9>?BĽN??=N?(? r9>?mR??(?e?>(?NA 5m=?{<*? DߥT>? 6>?PtN?=N?BĽ(?eȿmR?(? r9>^}o^9k^}oL>9ku1^3>Lҿٿu1[LҿNNB=(e>ȿmR>( r99k?^}o?L9k?^}o?^>L?u1?[>??>L?u1?^3 5m=?{?>(?NA?>?Pt?ߥT>? 6?<*? D?^}oL>9k?^}o^9k?u1[L??u1^3>L?[=4оZ%(н(>w>нw>>Ŕg>h(>A 7>ŔT@hA 7Ŕg>h>(>=A 7>>ŔT@h>A 7>>A =7w>>нT@>h>Ŕ>M㽕7T@>hŔ>A =7>w>>>T@>h>Ŕ>>M㽕7>T@>hŔ>x;>0-N ;%[=4>R"4B=#4>4B=ߣ4о:w=~C?[>+>fM߿*u? >ȗS>`>Ͽ^f?P>m"?с>I|ƿϼ?>cv4?-qտ(?&<+LV.I?:w=~C >ȗS;-qտ([۾с>I|ƿϼ&<+LV.I`>Ͽ^f>cv4+>fM߿*uP>m"$?h*SFl?$٧an?B7z<;?Ͼk(n?B7ۃ>͡?>$?h|Ʃ>;?Ͼ4 Y>?6-hL?(Y?/=svL?7Y¿Y?/svL?lO^ۿ(?=j?~Dc=O^ۿm>č?3>¿(?p=[>=jhL?(?Y?/svL??3>?Y?/=svL??~Dc=O^?(?p=[>=j??lO^?m>č??7Y?(?=j?с>I|?ϼ>c?v4-q?(&<+LV?.I:w=~?C[?۾+>fM?*u >ȗ?S;`>?^fP>m?"(hL?svLY?/=¿?7YsvLY?/O^ۿ?l=j(?O^ۿ?~Dc=čm>¿?3>=j(?p=[>6-ӿ$٧aFlh*S>$㿴$٧a>FlB7zn򿝦Ͼk(>;B7ۃn򿊨͡h|Ʃ$㿝Ͼ4 Y;(hLsvLY/=O^ۿ򀿢l>=j(>O^ۿ~Dcčm>¿3=j(p=[?6-?Fl?$?٧a>n?B7?ۃ>;?>4 Y>n?B7?z<͡?>>$?h?*S;?>k(с>I|?ϼ?&<+LV?.I?`>?^f?>c?v4?+>fM?*u?P>m?"?:w=~?C? >ȗ?S>-q?(?[?>6-?$٧a>Fl?h|Ʃ$?$٧aFl?B7ۃn?Ͼ4 Y;?B7zn?͡?h*S>$?Ͼk(>;?{>ܲ?{>ܲ@@=???{>ܲ??@=@@?={>ܲ??@@^a =\>>]?x>Ig[-?[>WD%G?4ѽmp?^a =\4ѽmp[>WD%Gx>Ig[->])?x[ ?=\^a ?=\? G>)?x[>Pf?.Oku_?gQׇHF?d$FBX?]?K=]F?d$>FBXku_?h$ׇH?F?d$>FBX??K=]??]?F?d$FBX?[>W?D%G4ѽmp?^a ?=\>]?x>Ig?[-ׇHku_?&"J$FBXF?d$]?]?K=FBXF?d$>.V~Pfx[>)=\^a; =\? G x[)ׇHku_;%FBXFd$>]>]KFBXFd$Pf?.?)l)?x[?> ?=\>? G> ?=\>^a)?x[?[>W?D%G?x>Ig?[-?>]??^a ?=\>4ѽmp??.V~$Pf?x[)?=\? G ?=\^a; ?x[>)? A Xnvnvtvtvrtrtprprnpnpxx~~|~|~z|z|xzzx"! #'&%$(,+*)-10/.265437;:98<@?>=AEDCBFJIHGKONMLqnhqhqoho hnosp^sq^q^pqurRusRrswtPwPwuPtuvwovToT owTwT{xc{c{cycyxy}zS}S}{S{Sz{|PP}P}|}~QQ~yYyyYYgg g g  TTT T!!SS  ""bb bb!!""ii ii $$mm##%%aaa$$&&__ __%%''bbbb &&''##ccc))ll((**hh h))++gg gg ** , , dd d d + + , , ( ( f f f . . kk  k - - //  ````  . . 0 0a aaa  / /11WWW0011--VV33j    j2244ZZ  Z3355[[[[4466VVVV556622U  UU88mmmm7799YYYY88::X  XX99;;U  U::;;77WWW==j    j<<>>XX  X==??QQQQ>>@@RRRR??@@<<]  ]]BBii ii AA C C _  _ _ BB !D!D!`!!!`!CC!"E"E"ee"ee"D"D#E#E#A#A#dd ##d$G$G$k$$kk$FF$%HH%%[%%[%%G%G&II&&\\&&\&H&H'JJ'f'ff'f'I'I(J(J(FF(e(e(ee)L)L)lll)l)KK)*M*M*\**\\*LL*+N+N+Z + ++Z+MM+,O,O,]],  ],,N,N-O-O-K-K-^^^-^0ANew MaterialX  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWPAf s3d-0.2.2.1/objs/abs2.3ds000066400000000000000000000300371361325167000145510ustar00rootroot00000000000000MM0 ==0>= New Material@0\0      P0  ?@p/dodecahedrA_/`A6???A0.$>Sݾhƾ-jtXl=z =t*ԩ7 ) <2Rի{i\dI>ޯ%n=&تJ׍=&i-JGw>RR-A:q 9>=jܾG=u<=>="y>hK:I<`B gz$?۠s=s?_ҽ~P?q&!LDY?Nwomf?z0ž ;0ݾ_&Y0','~ڲ$x:?URLF2?3j>W͆g1?"5>G?-gR'M>7>KO]%( >RN!*u>mv¾~cNz='䃾+ā~>R}~:iN>PY??/Oa?k>x:6Ï?"=՜?L>m?"i4?:#>S?g0 K}?ݾ?N'žAB?$0޷g?골D`^?<>-d?+˿R>a0'?e>>?Aqx<qr>@ZO퉿[ؾwrrЍ!t>Đ= L`+W>Q˿6]>~^-??$F;?6?>k?>X>9r7?+x>#>M3?jΧ> T?Tof?V3'3?xZ??A?mTt?r4&?? J}?i$?Lg6?> >b?!>K9Z}>gԤl˜ >9BMQ=-~b\>u=.ž==ɹU>þ"xi=#B8W>Sy@x>!NV=(x=E:>Koƾ=T=ž}=%?>[w|JA>pa=fɁ=_+r+c>W=ų7O>t[WL`>-*J= ݾ߲~%?\>'KXHJ?nuͦ>!Eb?)gݾݾr#=@t*C1SKQᆰ ˾Xqx?'{뽕6hJA9>ܿA`K?K{=Hd?0(=.s>ҾB? >?$bt>8I?L >ٵ>MV *>;2?BrX=R=ÿN>; ?Dt?=$й>Fz,?߾gaHr>H˾яB6ۋl> ŽjPghrsU>4=Y@G컝]<) u ?ݵwz?Zǀ?1QU?m>Pns?s*??=x?%l>Ľ?7s<>gVr>̾?e M?)>?I?rا$>잾#F?YqP`|?wÿ@?*f>uƾjݾ|#?iݾJ-a>,"?@e#-aB> Z?$+>@c*cr?\3,?/>3ǿYG?䈽&?pxٿ?Im9>×vٿG?A>9Q=o;uP=?>oQ>؇>4#􇿠TNvLP=y2X(}=¾z' ,PTDW PMӾ鍿ۃ{Cӿ3Y փ& 4UA{YğSk>mIن@WǿNӐb:> \Կ >ٿjZ!h>t 4Ɩ>ٿCYb=uR$V>ȿcy+żk_rZ@2?\'?Ѕ=߇=>D?p>~>v5>>H?v>>q??ru>_? >=tƾM=`K?H??ԁi!M??8㾀}4>I?e%g]L?I]?JmF$@@Jڍ?IJ?wtGI?~x?)ݾ5?m%?O~ӿ=TN=@?:`?C6?>4#&?}WZ;i=f?[닿]ٞ?[W ?Q>ҾuW? [h&&;+@\u _?2 U?킜=݀?"ai`(?ƿCx?ƿE!B?^h">٩ ?kP8 ?PWJ??E!B%OXK]?dF=8EMI%O&>??i=$>?Cx?8EMWZ? %0K>GED?~}z?L"?s If#?zbe`)rfGMo پcȽ(ꎿ~hytd>9T,Ž;\m޻>*: ~>* >"=d?ӽ.= ?2Y<4Kܾ3BȽQYe#VO@7> >ֽ,p?#ܻ7 >RIP? D*K?o4ʿ ʾ3.^$=g),?'?9<۽5R]?\l?jQ˄-Z?>k#tU7<9XU>Ͻ핿F>PJ&>/П ?l>w,%;}PSY=RkiZjP㷾8]ؾ oCWh,>輿j1mK> 5o>&3lG=Ꮂ">f0uB>C>>w=-SQlT>2?p*\>>io 8?>ɽR?K?K>ٔ>s$>1w>= #?o+?J=w*h8?Yh޾A?d_C?֢>D=R_M0=w@? A Xnvnvvtvtrtrtrprpnpnpxx~|~|~|z|zxzzx"! #'&%$(,+*)-10/.265437;::98<@?>=AEDCBFJIHHGKONMLqnhqhqo  hnoonspsp^s^sq^qpqpurRuRusRrswtPwPwuPtuutvwovT  owT{xc{yccyxy}zS}{SS{z{||P}P|}~~QQQQ~~yyYyYgg g g TT TT!SS "bb b!""ii ii $mmm##%%aa$&_  _%%''b bb&&'#cccc)lll(*h  h)++gg g g** , , dd d d ++ ,  ( (f f f  .k k kk - // ` ```  . . 0 0 a   a / /1WWW011--VVVV3j jjj 24ZZZ Z355[[[[4466VVVV55662UU UU88mm7799YY88:X  XX99;UUUU ::;77WWW=j jjj <<>>XX  X=??QQQQ>>@@RRRR??@<] ]]BBii ii AA C C __ __ B !D!D!```!`!C"E"E"e"""e"D"D#EE#A##d # ##dG$$k$$$k$F$F%H%[[[%[G%&II&\&\&&\H&'J'f'f'f'I'I(J(J(FF((e(ee()L)L)l)))l)KK)M**\\**\*L*L+N+N+Z + Z+Z+M+MO,],] ]],N,-OO--K-K-^---^0ANew MaterialX  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWPAf s3d-0.2.2.1/objs/accesspoint.3ds000066400000000000000000000031521361325167000162330ustar00rootroot00000000000000MMj ==Z>= antenna@00 ]]] ]]]    P0} body@00   n n  s sP0 ?@Ccube4A7`A6???A B\B M]?B\?B M]?B\B =M]?B\?B =M]??%B??Nb>B?L7ɾNb>`P?L7>Nb>`P?L7ɾNb`P?L7>Nb`P?B!B @޿B @޿B =@B!B =@B!?B @B!?B =@?B =@?B @Nb7?Nb7Nb>7?Nb>75f?89`P5f89`P5f89>`P5f?89>`P As<                     0A8antenna$%&'()*+,-./01230A]body(  !"#456789:;PAs3d-0.2.2.1/objs/accesspoint_inet.3ds000066400000000000000000002264601361325167000172630ustar00rootroot00000000000000MM0- == ->=  shpere@0A0   r r  50 50P0 ?@,sphere1Ay,`A6???A Z>$@f?->@f?_>_@f?>-@f?#@f?-@f?__@f?-@f?>"@f?->@f?__>@f?->@f?ȅ>@f?>->@f?_>_>@f?->>@f?},?ۺ%0?`?0?0>0󾜶0?>`0?K$},0?`0?00󾜶0?`0?},?J0?`>0?00>0?`?0? p},?0?>`?0?0>0>0?`?>0?ea?$E>`?`E>}>-$eaE>}``E>eayE>E>``?E>}CBea?E>}>`?`?E>E>0s?$L$ea?"}$},?},7p$">eaw %L$0sr%"eaw %},},7p$ea"}$0sLL$ea">O$},},?##"ea?w#Q0s?%#">ea?w#},?},?##ea?">C$ea?PA$EE``?E}E},?()#0`?00>0󾜶0>`0/$},0`000󾜶0`0},F00`>000>0`?0 p},?0>`?00>0>0`?>0>;󩣳@f->@f_>_@f>-@f#@f-@f__@f-@f@f->@f__>@f->@f>@f>->@f_>_>@f->>@f $h|?졢)h|>~e?>~=e?w?$O?~c>S$s?d{>N"Ye?>OO?-R>$s?N"Y>d{e?>O?# ># s?~=e?O>O?$=-Rs?~e?$wO?#~cs?N"Yd{e?OO?$-Rs?d{N"Ye?O?# # s?~e?OO?-R$s?~=e?wȱO?~c $s?d{N"Y>e?O>O?-R$=s?N"Yd{>e?>O?# # >s?~>e?O>O?$-R>s?~=>e?w?O?O~c>s?N"Y>d{>e?O>>O?$=-R>s?d{>N"Y>e?>>O?# ># >s?>O>O?-R>$=s?-)?h0?-)?h>0?J?H%Z ?Cl? 0?d;?e=Z ? >Cl0?Cl?ClZ ?h>-)0?e=>d;Z ?h-)0?$JZ ? Cl0?e=d;Z ?Cl 0?ClClZ ?-)h0?d;e=Z ?-)h>0?JoZ ?Cl >0?d;e=>Z ? Cl?0?ClCl?Z ?h-)?0?e=d;?Z ?h>-)?0?/J?Z ? >Cl?0?e=>d;?Z ?Cl? >0?Cl?Cl?Z ?d;?e=>Z ? ]?b/E> ]?b/>E>HAo?$sC>d;?kE> ]?,sC>k>d;E>-)?-)sC>b/> ]E>,> ]sC>b/ ]E>$HAosC>kd;E>, ]sC>d;kE>-)-)sC> ]b/E> ],sC> ]b/>E>HAo ٤sC>d;k>E> ],>sC>kd;?E>-)-)?sC>b/ ]?E>, ]?sC>b/> ]?E>NHAo?sC>k>d;?E>,> ]?sC>d;?k>E>-)?-)?sC> ]?,>sC>HAo?\>9?$HAo?\>>o$HAo? $sCJ?$ ]?,sC?J%-)?-)sC\>>HAo %,> ]sC\>HAo %$HAosCJ%, ]sCJ$-)-)sCHAo\>9?$ ],sCHAo\>>w$HAozqsCJ?$ ],>sCJ?j#-)-)?sC\>HAo?wa#, ]?sC\>>HAo?wa#KHAo?sC?J?j#,> ]?sCJ??$-)?-)?sC ]?,>sC ]?b/E ]?b/>EJ?J$Z d;?kEd;?e=Z k>d;ECl?ClZ b/> ]Ee=>d;Z b/ ]E8$JZ kd;Ee=d;Z d;kEClClZ ]b/Ed;e=Z ]b/>EJHZ d;k>Ed;e=>Z kd;?EClCl?Z b/ ]?Ee=d;?Z b/> ]?EJ?Z k>d;?Ee=>d;?Z d;?k>ECl?Cl?Z d;?e=>Z -)?h0-)?h>0w?@"OCl? 0>OO >Cl0>Oh>-)0O>Oh-)0 $wO Cl0OOCl 0O-)h0OO-)h>0w OCl >0O>O Cl?0>Oh-)?0O>Oh>-)?0ˤw?O >Cl?0O>>OCl? >0>>O>O>O>~e>~=e~c>&sd{>N"Ye-R>$sN"Y>d{e# ># s~=e$=-Rs~eh#~csN"Yd{e$-Rsd{N"Ye# # s~e-R$s~=e~cSˤsd{N"Y>e-R$=sN"Yd{>e# # >s~>e$-R>s~=>e8~c>sN"Y>d{>e$=-R>sd{>N"Y>e# ># >s-R>$=s>=O@q?v]>@q?>v]@q?=O=@q?=O@q?v]@q?v]@q?=O@q?=O=@q?v]>@q?v]>@q?=O>@q?=O=>@q?>v]>@q?v]>>@q?>=O=@q?>=O@qv]>@q>v]@q=O=@q=O@qv]@qv]@q=O@q=O=@qv]>@qv]>@q=O>@q=O=>@q>v]>@qv]>>@q>=O=@qaV?-Խ*O?u>%*O?%>u*O?-=aV*O?-ԽaV*O?%u*O?u%*O?aV-Խ*O?aV-=*O?u%>*O?%u>*O?-ԽaV?*O?-=aV?*O?%>u>*O?u>%>*O?aV?-=*O?F?DZ ?(?ZZ ?Z>(Z ?D>FZ ?DFZ ?Zᾢ(Z ?(ZZ ?FDZ ?FD>Z ?(Z>Z ?Zᾢ(?Z ?DF?Z ?D>F?Z ?Z>(?Z ?(?Z>Z ?F?D>Z ?j?:sC>F?sC>?FsC>:>jsC>:jsC>FsC>FsC>j:sC>j:>sC>F?sC>F?sC>:j?sC>:>j?sC>?F?sC>F??sC>j?:>sC>j?:sCF?sC?FsC:>jsC:jsCFsCFsCj:sCj:>sCF?sCF?sC:j?sC:>j?sC?F?sCF??sCj?:>sCF?DZ (?ZZ Z>(Z D>FZ DFZ Zᾢ(Z (ZZ FDZ FD>Z (Z>Z Zᾢ(?Z DF?Z D>F?Z Z>(?Z (?Z>Z F?D>Z aV?-Խ*Ou>%*O%>u*O-=aV*O-ԽaV*O%u*Ou%*OaV-Խ*OaV-=*Ou%>*O%u>*O-ԽaV?*O-=aV?*O%>u>*Ou>%>*OaV?-=*O,>`49 f?,>`4=9 f?r>ch$"\?>/$m?1>w79 f?t>1"\?0>뽢m?u>99 f?(]>(]"\?Y>Ym?w=ع9 f?1>t־"\?=0m?`4,9 f?$r農"\?#百m?w719 f?1t־"\?뽫0m?9u9 f?(](]"\?YYm?عw9 f?t־1"\?0뽢m?,`4=9 f?ry"\?百#m?1w7>9 f?t־1>"\?0=m?u9>9 f?(](]>"\?YY>m?wع>9 f?1t>"\?뽫0>m?`4=,>9 f?Ĥr>"\?>m?w7>1>9 f?1>t>"\?=0>m?9>u>9 f?(]>(]>"\?Y>Y>m?t>1>"\?0>=m?D+?"@0?D+?"@=0?HW0?W?W?LMH>=%0?MT>8.?"@D+0?`$H<?頢!0?MT8.?Wھ0?WW?=%LMH0?8.MT?D+"@=0?H<"q?!頢>0?8.MT>?ھW?0?WW??LMH=%?0?MT8.??"@=D+?0? H!?0?MT>8.??W?>0?W?W??8.?MT>?K`?E>K`?=E>,ri?,$ >F?|ԾE> W? >i?8.E>=%?=% >ڂ> WE>> W >K`E>$,ri >|ԾFE> W >8.iE>=%=% > WڂE> W >K`=E>,riϤ >F|>E> W> >i8.?E>=%=%? >ڂ W?E> W? >=K`?E>L,ri? >|>F?E>> W? >8.?i?E>=%?=%? > W?> >r?E/$r?E=TЊ$r?~$ý%W?k$K`?-йý??H<=%D+?D+ý>,ri_ %-й>K`ýEr%$rý徐%WT%-йK`ýH(1$K`-й>ý?H%W?_#-й>K`?ýHýK`?EK`?=E%W?~$F?|ԾEF?i?8.E!?!뾂ڂ> WE>F뾜K`EP$%W|ԾFEF뾋8.iE!! WڂEFK`=E%W{F|>EF>i8.?E!!?뾂ڂ W?EF?뾜=K`?E,%W?|>F?E>F?뾋8.?i?E!?!?F?>D+?"@0D+?"@=0??ۅ#+A!?頢0i?l+A>W0>ھ+ALMH>=%0l>i+A"@D+0$?+A頢!0li+AWھ0ھھ+A=%LMH0il+AD+"@=0?D+A!頢>0il>+AھW?0ھ>+ALMH=%?0li?+A"@=D+?0??+A頢>!?0l>i?+AW?>0>>+Ai?l>+A,>`49 f,>`4=9 f>X_m1>w79 f0>뽢mu>99 fY>Ymw=ع9 f=0m`4,9 f#百mw719 f뽫0m9u9 fYYmعw9 f0뽢m,`4=9 f百/ߤm1w7>9 f0=mu9>9 fYY>mwع>9 f뽫0>m`4=,>9 ft>mw7>1>9 f=0>m9>u>9 fY>Y>m0>=mع>w9 f?ع>w=9 f???>$+A? >ʼ$ew?9>u9 f?i?l+A?Z>9Wew?w7>19 f?>ھ+A?=ǽew?`4=,9 f?l>i+A?9W=Zew?wع9 f?($?+A?@# ew?u99 f?li+A?9WZew?1w79 f?ھھ+A?ǽǽew?,`49 f?il+A?Z9Wew?عw=9 f??+A? yA$ew?9u>9 f?il>+A?Z9W=ew?w71>9 f?ھ>+A?ǽ=ew?`4,>9 f?li?+A?9WZ>ew?w=ع>9 f???+A? >ew?u>9>9 f?l>i?+A?9W=Z>ew?1>w7>9 f?>>+A?==ew?i?l>+A?Z>9W=ew?=%?LMH0?=%?LMH>0?%W?{%>W?ھ0?F?>頢>!0?!?!>"@=D+0?>F>LMH=%0?$%W>ھW0?F>!頢0?!!>D+"@0?F>=%LMH>0?%Wi>W>0?F>>頢!?0?!!?>"@D+?0?F?>LMH>=%?0?8%W?>>W?0?>F?>!?頢>0?!?!?>F?>> W?ڂE> W?ڂ>E>r?$=8.?iE>K`?-й=|>FE>D+?D+==K`E>-й>K`=ڂ WE>$r=i8.E>-йK`=F|ԾE>D+D+=K`E>K`-й= Wڂ>E>r~=8.i?E>K`-й>=|ԾF?E>D+D+?=K`?E>-йK`?=ڂ> W?E>Lr?=i?8.?E>-й>K`?=F?|>E>D+?D+?=K`?-й>=,ri?$,ri?>Q$,ri?$ H%WT%=%?=% E=r %> W ,ri_%$,ri ?HQ$,ri H 徐%W?ƿJ#=%=%? Er?" W? >,ri?"@,ri? ??H W? %W?>(!$=%?=%?  W?>  W?ڂE W?ڂ>EHFEW?W=K`EMT>8.ڂ WE@$H<i8.EMT8.F|ԾEWWK`E8.MT Wڂ>EH<8.i?E8.MT>|ԾF?EWW?K`?EMT8.?ڂ> W?E H8.?F?|>EW?W?8.?MT>=%?LMH0=%?LMH>0r>C "\W?ھ0t>1"\頢>!0(]>(]"\"@=D+01>t־"\LMH=%0$r農"\ھW01t־"\!頢0(](]"\D+"@0t־1"\=%LMH>0r1"\W>0t־1>"\頢!?0(](]>"\"@D+?01t>"\LMH>=%?0r>"\>W?01>t>"\!?頢>0(]>(]>"\t>1>"\ع>w9 fع>w=9 f >y9ew9>u9 fZ>9Weww7>19 f=ǽew`4=,9 f9W=Zewwع9 f # ewu99 f9WZew1w79 fǽǽew,`49 fZ9Wewعw=9 f ʼew9u>9 fZ9W=eww71>9 fǽ=ew`4,>9 f9WZ>eww=ع>9 f >ewu>9>9 f9W=Z>ew1>w7>9 f==ewZ>9W=ew(o>x!r?O>=8x[m?=h>!r?Q>Hk!r?<>0[m?j=>!r?>j=!r?0><[m?Hk=Q!r?==h!r?=8x=O[m?x<(o!r?x(o!r?=8xO[m?=h!r?HkQ!r?0<[m?j=!r?j=!r?<0[m?QHk!r?=h!r?O=8x[m?(ox!r?(ox[m?j=>!r?j=>!r?0<>[m?HkQ>!r?=h>!r?=8xO>[m?x(o>!r?x<(o>!r?=8x=O>[m?==h>!r?Hk=Q>!r?0><>[m?>j=>!r?j=>>!r?<>0>[m?Q>Hk=!r?=h>=!r?O>=8x=[m?(o>x!rO>=8x[m(o>x!rj=>!r<>0[mQ>Hk!rHk=Q!r0><[m>j=!rx<(o!r=8x=O[m==h!r=h!r=8xO[mx(o!rj=!r0<[mHkQ!rQHk!r<0[mj=!r(ox!rO=8x[m=h!r=h=!rO=8x=[m(ox!r<0>[mQHk=!rHkQ>!r0<>[mj=>!rx(o>!r=8xO>[m=h>!r==h>!r=8x=O>[mx<(o>!r>j=>!r0><>[mHk=Q>!rQ>Hk=!r<>0>[mj=>>!r(o>x=8x=[m=h>=!r ?iO?>-\?<?JUiO?D?+A?q>eiO? >+\?>"iO??Y򫾞+A?">iO?+> ¾\?e>qҾiO?Y>+A?JU=<iO?-=侷\?> iO?=D+A? iO?-侷\?JU<iO?D+A?eqҾiO?+ ¾\?"iO?Y+A?"iO? ¾+\?qҾeiO?Y򫾞+A?<JUiO?供-\? iO?D+A? >iO?供-=\?<JU=iO?D=+A?qҾe>iO? ¾+>\?">iO?Y>+A?">iO?+ >\?eq>iO?Y?+A?JU<?iO?->\? ?iO?D?+A?> ?iO?-=>\?JU=<?iO?=D?+A?e>q>iO?+> >\?">>iO?Y>?+A?>">iO? >+>\?q>e>iO??Y>+A?<?JU=iO?>-=\? ?>iO?D?=+A?B?kZ ?*8?$?I?Z ?R?K'>?Z ??Ѿ?2?t6Z ?2? ナ>t6>2Z ?>??Z ? >2>=IZ ?$>*8?k>BZ ?K'>R>kBZ ?$*8?IZ ?K'R>Z ?Ѿ?t62Z ? 2>2t6Z ?Ѿ?Z ?2 ナ>IZ ?*8$?BkZ ?RK'>Bk>Z ?*8$>?I=Z ?RK'>>?Z ?>?2t6>Z ?2 >>t62?Z ?Ѿ???Z ? 2?>I?Z ?$*8??kB?Z ?K'R?>k>B?Z ?$>*8??=I?Z ?K'>R?>??Z ?>??t6>2?Z ? >2?>2?t6>Z ??>???Z ?2? >>I?=Z ?*8?$>?B?k>Z ?R?K'>>Dd?n抾sC>Dd?'6 >n?wsC>n?vo==*8?DsC>B? >R?sC>I?=>RsC>?B >D?*8sC>?I=w=nsC>'6>Dd >n>DdsC>vo=>n=n抾DdsC>'6Dd >wnsC>vo=n=D*8sC>B >RsC>I=RsC>B >*8DsC>I=nwsC>Dd'6 >Ddn抾sC>nvo==Ddn>sC>Dd'6> >nw=sC>nvo=>=*8D?sC>B? >R>sC>I?=R?sC>B? >D*8?sC>I?=wn?sC>'6Dd? >n抾Dd?sC>vo=n?=n>Dd?sC>'6>Dd? >w=n?sC>vo=>n?=D?*8?sC>?B? >>R?sC>?I?=R?>sC>B?? >*8?D?sC>I??=n?w=sC>Dd?'6> >Dd?n>sC>n?vo=>=Dd?n抾sCn?vo=ýn?wsCDd?'6 *8?DsCI?ýR?sCB? >RsC?IýD?*8sC?B w=nsCvo=>nýn>DdsC'6>Dd n抾DdsCvo=nýwnsC'6Dd D*8sCIýRsCB RsCIý*8DsCB nwsCnvo=ýDdn抾sCDd'6 Ddn>sCnvo=>ýnw=sCDd'6> *8D?sCI?ýR>sCB? R?sCI?ýD*8?sCB? wn?sCvo=n?ýn抾Dd?sC'6Dd? n>Dd?sCvo=>n?ýw=n?sC'6>Dd? D?*8?sC?I?ý>R?sC?B? R?>sCI??ý*8?D?sCB?? n?w=sCn?vo=>ýDd?n>sCDd?'6> B?kZ R?K'뾕I?Z *8?$?Z 2? ナ2?t6Z ?Ѿt6>2Z  >2?Z >=IZ K'>Rk>BZ $>*8kBZ K'RIZ $*8Z  2t62Z Ѿ2t6Z 2 ナ뾙Z ѾIZ RK'뾰BkZ *8$Bk>Z RK'>뾕I=Z *8$>?Z 2 >2t6>Z >t62?Z  2??Z Ѿ?I?Z K'R?kB?Z $*8?k>B?Z K'>R?=I?Z $>*8???Z  >2?t6>2?Z >?2?t6>Z 2? >뾙??Z ?>I?=Z R?K'>뾰B?k>Z *8?$> ?iOD?+A<?JUiO>-\q>eiO?Y򫾞+A>"iO >+\">iOY>+Ae>qҾiO+> ¾\JU=<iO=D+A> iO-=侷\ iOD+AJU<iO-侷\eqҾiOY+A"iO+ ¾\"iOY򫾞+AqҾeiO ¾+\<JUiOD+A iO供-\ >iOD=+A<JU=iO供-=\qҾe>iOY>+A">iO ¾+>\">iOY?+Aeq>iO+ >\JU<?iOD?+A ?iO->\> ?iO=D?+AJU=<?iO-=>\e>q>iOY>?+A">>iO+> >\>">iO?Y>+Aq>e>iO >+>\<?JU=iOD?=+A ?>iO>-=\Z>Tm?>Ƴm? a*>v?‰>efm?r>Em?p>%v?E>rm?ef>‰m?%=pv?Ƴ=m?Tm?rE>m?p%=v?Er>m?ef‰>m?%p>v?Ƴ>m?TZ>m? a*>v?Tm?Ƴ=>m?= a*>v?ef>‰>m?E>r>m?%=p>v?r>E>m?‰>ef>m?p>%=v?>Ƴ=m?Z>T=v?>ƳmZ>Tm a*>vr>Em‰>efmp>%vef>‰mE>rm%=pvTm‰ef>mp%=vef‰>mEr>m%p>vTZ>mƳ>m a*>vƳ=>mTm= a*>vE>r>mef>‰>m%=p>v‰>ef>mr>E>mp>%=vZ>TƳ=m a*>=v> \?>q7\?*?Or+A??3+A?!>M\? e>[\?({?呾+A?@>Yľ+A?[> e;\?M>!\?Y>@゙+A?>({+A?q7=羵\? >޾\?3>+A?Or=*+A? ޾\?q7羵\?Or*+A?3+A?M!\?[ e;\?呾({+A?Yľ@゙+A? e;[\?!M\?@Yľ+A?({呾+A?q7\?޾ \?3+A?*Or+A?޾ >\?q7=\?*Or=+A?3>+A?!M>\? e;[>\?({>+A?@Y>+A?[ e>\?M!>\?Yľ@>+A?呾({?+A?q7>\? >\?3?+A?Or*?+A? >>\?q7=>\?Or=*?+A?3>?+A?M>!>\?[> e>\?>({?+A?Y>@>+A? e>[>\?!>M>\?@>Y>+A?({?>+A?>q7=\?> >\??3>+A?*?Or=+A?q4?Z?;?ؓ?%V?>M?y>?@ᄅ?L&?!Ʊ?n=?ʾ>L&?({>!Ʊ>L&?@>?({?L&>>n=>ؓ=;?Z>q4?y>M>=%V>Zq4?ؓ;?%V>yM>@?!ƱL&?ʾn=>({L&>L&!Ʊ?@ᄅ?L&({>n=ʾ>;ؓ?q4Z?My>%V>q4Z>?;ؓ=?%V=>My>>@>?L&!Ʊ>?n=>>L&({?>!ƱL&??@??({L&?>ʾn=?>ؓ;??Zq4??yM?>%V?>Z>q4??ؓ=;??=%V?>y>M?>@>??!Ʊ>L&??>n=?>({?L&?>L&?!Ʊ>??@>?L&?({?>n=?>>;?ؓ=?q4?Z>?M?y>>%V?=>Ga_? >Nh? >q?HW=Nh?=q4? >M?ܾ >%V?=;?*=>M >?q4 >*?;=>%V==Nh >>Ga_ >>Nh=HW=q=Ga_ >Nh >HWq=Nh=q4 >ܾM >%V=*;=Mܾ >q4 >;*=%V=Nh >Ga_ >Nh=qHW=Ga_> >Nh= >qHW==Nh>=q4? >M> >%V>=;*?=ܾM? >q4? >*;?=%V?=Nh? >Ga_? >Nh?=HWq?=>Ga_? >=Nh? >HW=q?=>Nh?=?q4? >>M? >>%V?=*?;?=M?> >q4?? >;?*?=%V?>=Nh?= >Ga_?> >Nh?>=q?HW==Nh?ýq?HWýNh? Ga_? ;?*ý%V?ýM?ܾ q4? >%Vý*?;ý?q4 >M HW=qý>Nhý>Ga_ =Nh NhýHWqýNh Ga_ *;ý%VýܾM q4 %Vý;*ýq4 Mܾ qHWýNhýGa_ Nh Nh>ýqHW=ýNh= Ga_> ;*?ý%V>ýM> q4? %V?ý*;?ýq4? ܾM? HWq?ýNh?ýGa_? Nh? >Nh?ýHW=q?ý=Nh? >Ga_? *?;?ý>%V?ý>M? ?q4? %V?>ý;?*?ýq4?? M?> q?HW=ýNh?>ýGa_?> Nh?= M?y%V?;?ؓq4?ZL&?({n=?ʾ뾮L&?!Ʊ?@ᄅ>n=({?L&@>!Ʊ>L&=%Vy>M뾮Z>q4ؓ=;yM뾼%V뾡ؓ;Zq4({L&ʾn=!ƱL&@n=ʾ뾮L&({@ᄅL&!Ʊ%V뾪My뾱q4Z;ؓMy>%V=;ؓ=q4Z>L&({?n=>뾮L&!Ʊ>@>ʾn=?({L&?@?!ƱL&?%V?yM?뾮Zq4?ؓ;?y>M?뾼=%V?뾡ؓ=;?Z>q4?({?L&?>n=?!Ʊ>L&?@>?n=?>뾮L&?({??@>L&?!Ʊ>%V?=뾪M?y>뾱q4?Z>;?ؓ=?3+A*?Or+A>q7\> \@>Yľ+A({?呾+A e>[\!>M\>({+AY>@゙+AM>!\[> e;\Or=*+A3>+A >޾\q7=羵\3+AOr*+Aq7羵\ ޾\Yľ@゙+A呾({+A[ e;\M!\({呾+A@Yľ+A!M\ e;[\*Or+A3+A޾ \q7\3>+A*Or=+Aq7=\޾ >\@Y>+A({>+A e;[>\!M>\呾({?+AYľ@>+AM!>\[ e>\Or*?+A3?+A >\q7>\3>?+AOr=*?+Aq7=>\ >>\Y>@>+A>({?+A[> e>\M>!>\({?>+A@>Y>+A!>M>\ e>[>\*?Or=+A?3>+A> >\>q7=\ Arbbuxbbrpuubxxvccx{ccvpxxc{{ydd{~ddyp{{d~~|ee~ee|p~~effffpfggggpghhhhphiiiipijj  jjpj  kk  kkpk  ll  llpl  mm     mmpm  nn       nnpn     oo  oopo   ppppppsqqsuqquupqFaaBrrB``DrrDDqFFrHbbEssEaaFssFFqHHsJccGttGbbHttHHqJJtLddIuuIccJuuJJqLLuNeeKvvKddLvvLLqNNvPffMwwMeeNwwNNqPPwRggOxxOffPxxPPqRRxThhQyyQgg R y yR RqTT  y  Vii  Sz z  S hhT  z  zT TqVV     z  XjjU{{ UiiV{{VVqX X  {ZkkW||WjjX||XXqZZ|\llY}}YkkZ}}ZZq\\}^mm[~~[ll\~~\\q^^~`nn]]mm^^^q``aoo__nn```qaa``  C Doo!a!! C  qDD!!a!aw"wrr#"#"##rrtt$$#$#%%%$t$tw"w"%%"%z&zvv'&'&''vvww(('(')))((w(  z &z& ))&)  * } }  +yy +*+ *y+ y  z z ,+,+,    -- ,,-z, z    **} -* -- ./||/./.|/|}}0/0/011001}0} .1.1 1 232323344334555444  225255 676767788778999888  669699 :;;:;:;<;<;<==<<=<::=:==>??>?>?@?@?@! !!  AA @@A@  !!!>!!A>!AA!B""" ""CBCBC"#C####DD#CCD$$##$EE#E$$DDD$%%B%B%EBEE%%F&&& &&GFGFG&'G'' ''HH'GGH((%%(II%I((HHH())F)F)IFII))*J** **KK*JJKK+++ ++LKLKL+,''',,MMLM,LL,,---JJJ--MM-M.N.. ..OO.NNOO/// //POPOP/0)))00QQPQ0PP00111NNN11QQ1QR22  2  22SRSRS2S333 33TTST3S4+++U+4UU44TT44555RR5UURU55V66666WVWVW6W77  7    77XXWX7W88--Y-8YY88XX8X999VV9YYVY99:Z::::[[:ZZ[[;;  ; ;;\[\[\;<///<<]]\]<\\<<===ZZZ==]]=]>s>>_s_>^^_>tt^>???`_`_`?s_?s?`@@@@a@a`a@`aAaAAA^^t^AAabBbBBBcccBBbcCCCCCCddcdCcD22 2e2DeeDDddDd!""EEEbbEeebeEE"fFfFFFgggFFfgGGGGGhhghGg!H!H55HHiiHHhhHh"%I"IIfffIifiiII%jJJJJkJkjkJjkKkKKlKllKKkL77"7LLmmlmLlllL#'MM # Mjj MmjMmMM'nNNN  No NonoNnoOoOOpOppOOo# 9 P99PPqqPppqpPP $)QQ $Qn QQqnQq)qQ)rRrR R Rs ssRRrSsSSSSttSsst$ TT;$;Tuu;uTTtt tT +U%+UrUrUuruuUU+vV  vV  V Vw wwVVvWwWWWWxxWwwx%XX=%=Xyy=yXXxxxX&-Y&YYvvvYyvyyYY-zZZ""Z"Z{Z{z{Zz{[{[ [ | [||[[{\??&?\\}}|}\|||\'/]]']zz]}z]}]]/~^^$$^$^^~^~_!!_"!_""___'A`AA`````(1aa(a~aa~a1a1b&&b&bbbbc#c#c$#$$ccc(ddC(CdCddd3e)3eeeee3f((f(ffffg%g%g&%&&ggg)hhE)Ehhhhh*5i*iiiii55j*j*j*jjjk'''kk((k(kklGG*Gllll+7m+mmmmmm7n,n,n,nnno)))oo**o*oopII+Ippppp,9q,qqqqq99r...rrrrrss++ss,,s,stKK,KKttttt-;;uuuuuu;v000vvvvvww--w..-.www-x-xMMxxxxx.=y.y  y yyyy=z1z1z1zzz{///{{00{0{{. ||O.O|O| | /?}/}!!}!}}}??~~~~~~111!!##/!#33  3666!"!""2244 244$RR0$R$$1B1&&&BB88%""8%555!6!661&U1U&2E2(((EE:'##:'777"8"88(WW2(W(3G3***G<)$$<)99:##9:*YY3*Y*4I4,,I>>+%%>++;;<;<$<,[[4,[,,5K5...K@@-&&@-===%>%>>.]]5.].6M600MBB/''B//???&@&@60_6_07O7222ODD11(D1AAB''ABB72a7a228Q8444QF3))F33CCDCD(D84c8cc44S669S6SHH5**H5EE)F)FF6ee96e6U88:U88UJJ7++J7GGG*H*H:8g:gg8;W;:::WWLL9L9,9III+J+J;:i;ii:<Y<<<<YYNN-;-;;KK,L,LL<kk<<k<<=[=>>>[[P=..P=MM-N-N>mm=>m>>]>@@]]Q?//Q?OOO.P.PP@oo>@o@?_?AAA_ 434334/#Q/Q##AACC?ACSS$00S$$VVBVB1BRRR0T0T@D@rrDDAbAFFFbbXXXEXE2EUUVUV1VVFuuAFuFeHHBeHHeeZZGZG3GWW2X2XXHwwBHwHgJJCgJJgg\\\I\I4IYYZYZ3ZZCJyCy yJiLLDiL i ^^K^K5K[[4\4\\DL{L{ { LEkNENN kk```M`M6MM]]^]^5^N}}EN } NmPPFmPPmm bbObO7O__6`6``PFPPoRRGoRRodddQdQ8QQaabab7bbGRGRqTTHqTTqfffSfS9Scc8d8ddHTTTIsVIVVsshhUhU:UUeefef9ffVIV   VuXXJuXX  uu j jWjW;W W     g ghgh:h     XJX       X XwZZKwZ Z    ww lllYlY<Yii;j;jjKZKZLy\y\\ynn[n[=[kk<l<lL\L\\M{M^^^{{pp]p]>]mm=n=nn^M^^N}N```}}q_??q__oo>p>pp`N```aaOaa0T0SSTT?Cq?q  q CC acOOac!c!! s!sDsD@D!!v"vbvbAb##""##r#rr@t@t$$#PdP""%%$%$$dd$QQff"f""%%"%&xx&eBBxe'e''&&''u'uuAvAv((v('fQf%%))()((fR R hh &h&&  )) %)* zz * gCCz g  ++  * w+ w B xBx  ,,  +Rh  R --'-  ,,h, h jjS *  j * -*-'-  '.|| .iDD|i/i/ /.y  /yzyzC z0 0//0SjS11)10 0j0jllTl.. l.1.1)1)2~~kkE~3  k32323{{ 3|DD{ |4|443Tll+5+5445 4 lUnUn22n52+5566mmFm 7 7667}  7~EE}~8~887Unn-9-98898nVpVp66p96-99::oGGo;;:;;FF<<<;VpV==/=<<p<prrW:r:=:=/=/>>qHHq?q??>?G@@??@Wr  W AA1A  @@r@ rX!!tX!>t!>!A>A1A!!1B"""ssI"Cs"CBC"BC#C#HH#D#DD##CXtt$3$$E3E$DDED$$tY%%vYv%BBv%EB%3EE%F&F&uuJu&&GG&FFG'G''II'H'HH''GYvv(5((I5I(HHIH((vZ))xZx)FFx)IF)5II)J*J*K*wKw*KwKK**JK+K+J+J+LLL+KKLZx,Z,7M,MM,,LL,xxL[z-zz--JJ-MMJ7M-7-N.N.L.yLy.OOyO..NO///K//PPOP/O[z0[09Q0QQ00PP0zzP\|1||11NN1QQN9Q1912R22{{M{22SS2RRSS3S3L33TT33S\|4\4;4;4UUTU4TT4||T]5]5~~5R~RR55UU5;UV6 V6}}N}66WW6VVWW7W7M7M7XXX77W~8]~=8=8YYXY8XX88~^9^99VV V99YY9=YZ:Z!:O:O::[[::Z[;[;N;N;\\ \;;[^<^<?]<]]<<\\< \_==!=Z!Z=]]Z?]=?=@t>>s@s>__s_>>^^>t^tc?Oc!?!?``_`?__??c`@!`@__@@aa#a@@`A##aAAddPdAA^^Aaa^B&&bBBQB"Bc"cBbbccCc"CP$C$CddCCc`DBDBDeedeDd$dD$DaE&E&EbbEebeBeEBEF((fFFRF%Fg%gFffggGg%GQGQGhh&hGGgHaEHEHiihiHh&hHH&bI(I(IffIifiEiIEIjJ*jJSSJJkk'kJJjK''kKKR(KKl(lKkklbLGLGLmlmlmL(lL(LMcMj**MjMmjmGmMMGnN,N,NTTNNoo)oNNnO))oOOS*OOp*pOoopcPIPIPqpqpqP*pP*PdQ,Q,QnnQqnqIqQQIrR.R.RURs++RsrsRrsS+sSTTS,tSttSSsdTKTTuKuTttu,tT,TeU.U.UrrUuruKuUKUvV0V0VVVw--VwvwVvwW-wWUUW.xWxxWWweXMXXyMyXxxy.xX.XfY0Y0YvvYyvyMyYMYzZ2zZWWZZ{{/{ZZz[//{[[V0[[|0|[{{|f\O\O\}|}|}\0|\0\]g]z22]z]}z}O}]]O~^4^4^XX^^1^^~_11__W2__2_g`Q`Q``2`2`ha4a4a~~a~QaaQb6b6bYb33bbc3cXXc4ccchdSddSd4d4die6e6eeSeSef8f8fZf55ffg5gYYg6gggihUhhUh6h6hji8i8iiUiUij:j[j[j7jjk7k7kZ8k8kkjlWlWll8l8lkmm:m:mWmWmn<n\n\n9nno9o9o[:o:ookpYpYpp:p:plqq<q<qYqYqr>>rr]r;r;rs;s\<s<ssslt[t[tt<t<tmu>u>uu[u[uv@@vv^v=v=vw=w]w]w>wwxm]x]xx>xx>ny@y@yy]y]yzAz_z_z?zz{?{?{^@{@{{n|_|_||@|@|o}}A}A}_}_}P~~P~#~~~$_AA##AAoCCCC`$$0Ashpere  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA<s3d-0.2.2.1/objs/arrow.3ds000066400000000000000000000041141361325167000150510ustar00rootroot00000000000000MML ==<>= ~ green@00   h h   P0 ?@cone9A`A6???AT1"$o>^l=o>55>o>ý^l>o>,>o>=^l>o>5>5>o>^l>=o>>4E$o>^l>ýo>5>5o>=^lo>,o>ý^lo>55o>^lýo>,1`ΐ_#L=,4$?5==D?=?D<5=?a0L?D5=??5=D?L$?5=D<?=?D5==?hL=?D<5==?==?5==D<?L=X89$o>5==Do>=o>D<5=o>a0Lo>D5=o>o>5=Do>L$o>5=D=o>D5==o>hL=o>D<5==o>==o>5==D AZ                 $%&&#$&'#'"#'("(!"()!)0!)*0*+/*/0+,.+./,-. !!0  00///...---,,,+++***)))((('''&&&%%%$$$###"""!0AgreenZ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYPAns3d-0.2.2.1/objs/arrow2.3ds000066400000000000000000000515711361325167000151440ustar00rootroot00000000000000MMyS ==iS>= ~ arrow@00   ZZ ZZ  qq qqP0 ?@dcube3AX`A6???A+@+@>>+@>>+@9@9@>?9@>?9@+?@+?@>T@T#@>>T#@>>T@ Al                      0A>arrow PAf   @mPtorus2A`P`A6???A?%L7ew?-% $"?"R$-?w﾿q${$ο$-w﾿q$""R$w﾿-% $ο{mL7ew﾿-?m<""?Z-w?٤?R-?w?٤"?"?Zw?-?mH M=Z$M=pTH M=+ ^+ ^M=H pTM=K>&M=H pT>M=+ ^+ ^?M=pTH ?M=8?M=pT>H ?M=+ ^?+ ^?M=H ?pT>M=g{?$y{#-?UI`:<$=Q?=Q|?$UI>-@$/$g{7$UI-@$=Q=Q|?$-UI`:<$g{/"y{#-UI>y=Q=Q?<(UI-?ÿoGwg{?nWUI>-?ÿo=Q?=Q?<(-?UI>y?$MH ?pTM+ ^?+ ^MpT>H MZ$MpTH M+ ^+ ^MH pTMw2MH pT>M+ ^+ ^?MpTH ?M8?MpT>H ?M+ ^?+ ^?MH ?pT>M?$ѽ?ѽ {? {ѽ?ѽի$ѽѽ { {ѽѽfOѽ?ѽ { {?ѽ?ѽ@?ѽ??ѽ {? {?ѽ??ѽa%?V %M#?MB?BM?#M`P$a%ƿM#MBBM#Ma%ƿ maM#?MBB?M#?MHpۑ#f?>>pѣR^?%f =R^?=%f Ϋ?ŗeH?m$ϼ?jf =ϼ?jf ŗe?Ϋo$?f =?f >>fʿ$j?ϼf =j?ϼf >fʿ$$R^̿f =$R^̿f ŗeΫo$jϼf =jϼf ΫŗeH?m$f =f fʿ>pۑ#ϼjf =ϼjf fʿ>>pѣR^̿=]f =R^̿bf Ϋŗe?ϼj?f =ϼj?f ŗeΫ?oŤ?f =?f >f?礶jϼ?f =jϼ?f >>f?R^?f =R^?f ŗe?Ϋ?oŤj?ϼ?f =j?ϼ?f Ϋ?ŗe???f =??f ϼ?j?f =ϼ?j?f WM?M=WM?>M=E?%)=?j \M=O?mg)=j \?M=si?si)=>WM¿M=mg?O)=WM¿M=$E)=j \M=mgO)=j \M=sisi)=WM¿M=Omg)=WM¿>M=E~WY)=j \?M=Omg?)=j \?M=sisi?)=WM?M=mgO?)=>WM?M=E?)=j \??M=mg?O?)=?j \?M=si?si?)=O?mg?)=4!?ԋ=4!?ԋ>=y?%)=?EE=͙?)=EE?=nk?nk)=ԋ>4!=>͙)=ԋ4!=$y)=EE=͙)=EE=nknk)=4!ԋ=͙)=4!ԋ>=y~W9)=EE?=͙>)=EE?=nknk?)=ԋ4!?=͙?)=ԋ>4!?=y?)=EE??=>͙?)=?EE?=nk?nk?)=͙?>)=?tM=?t>M=ǖ?$f =Ȅ?jk.M=M?f =jk.?ȄM=hM=>Mf =tM=$ǖf =jk.ȄM=澘Mf =Ȅjk.M=hM=ǖ=-f =Ȅjk.?M=M>f =jk.Ȅ?M=h?M=ǖ?f =jk.?Ȅ?M=>M?f =Ȅ?jk.?M=hf =?g#?g>ǖ?{$f v?$u$M?f $?v&$h@$>Mf g@$$ǖf $v&$澘Mf v$u$hǖ*f v$?h룘M>f $v?MPh?@xǖ?f $?v?MP>M?f v?$?hhf ?tM?t>My?$)Ȅ?jk.M͙?)jk.?ȄMnk?nk)t>M>͙)tM$y)jk.ȄM͙)Ȅjk.Mnknk)tM͙)t>MyF)Ȅjk.?M͙>)jk.Ȅ?Mnknk?)t?M͙?)t>?My?)jk.?Ȅ?M>͙?)Ȅ?jk.?Mnk?nk?)͙?>)4!?ԋѽ4!?ԋ>ѽE?$)?EEѽO?mg)EE?ѽsi?si)ԋ>4!ѽmg?O)ԋ4!ѽ$E)EEѽmgO)EEѽsisi)4!ԋѽOmg)4!ԋ>ѽEf)EE?ѽOmg?)EE?ѽsisi?)ԋ4!?ѽmgO?)ԋ>4!?ѽE?)EE??ѽmg?O?)?EE?ѽsi?si?)O?mg?)WM?MWM?>M?j \Mj \?M>WM¿MWM¿Mj \Mj \MWM¿MWM¿>Mj \?Mj \?MWM?M>WM?Mj \??M?j \?Mbg?sf =? cf = c?䩿f =s>bgȿf =sbgȿf = c䩿f =䩿 cf =bgȿsf =bgȿs>f =䩿 c?f = c?f =sbg?f =s>bg?f = c??f =? c?f =bg?s>f =G?4)=؜?IQ)=IQ?؜)=4>G)=4G)=IQ؜)=؜IQ)=G4)=G4>)=؜IQ?)=IQ؜?)=4G?)=4>G?)=IQ?؜?)=؜?IQ?)=G?4>)=!??ま)=d?8)=8?d)=>!?)=ま!?)=8d)=d8)=!?ま)=!?>)=d8?)=8d?)=ま!??)=>!??)=8?d?)=d?8?)=!??>)=ۓ?KHkf =z?Á'f =Á'?zf =KHk>ۓf =KHkۓf =Á'zf =zÁ'f =ۓKHkf =ۓKHk>f =zÁ'?f =Á'z?f =KHkۓ?f =KHk>ۓ?f =Á'?z?f =z?Á'?f =ۓ?KHk>f =ۓ?KHkf z?Á'f Á'?zf KHk>ۓf KHkۓf Á'zf zÁ'f ۓKHkf ۓKHk>f zÁ'?f Á'z?f KHkۓ?f KHk>ۓ?f Á'?z?f z?Á'?f ۓ?KHk>f !??ま)d?8)8?d)>!?)ま!?)8d)d8)!?ま)!?>)d8?)8d?)ま!??)>!??)8?d?)d?8?)!??>)G?4)؜?IQ)IQ?؜)4>G)4G)IQ؜)؜IQ)G4)G4>)؜IQ?)IQ؜?)4G?)4>G?)IQ?؜?)؜?IQ?)G?4>)bg?sf ? cf  c?䩿f s>bgȿf sbgȿf  c䩿f 䩿 cf bgȿsf bgȿs>f 䩿 c?f  c?f sbg?f s>bg?f  c??f ? c?f bg?s>f A8          !!  ""!!##""$$##%%$$&&%%''&&((''))((**))++**,,++--,,..--//..  // !1100!"2211"#3322#$4433$%5544%&6655&'7766'(8877()9988)*::99*+;;::+,<<;;,-= =< <-.> >= =./??  >>/ 00??01AA@@12BA23CBB34DDCC45EED56FEE67GF78HGG89!II!!H9:##JII#:;%%KJJ%; <  ' 'L'KK <   =     M)M)L L =   >  ++N+  M+  >?  O-O-N-?0@OO@@AA00Q0P0ABB33R33QBC55S55RCCD77T77SDEE99U99TEFF;;V;;UFG G = =W==VG G""H"?"?X? ? WH"!"!I!$I$AAY$A"A"XI$#$#J#&J&CCZ&C$C$YJ&%&%K%(%((E(E[E&&ZEK(K'L'*'**G*G\G(([GL*L)M)M,,I,I]I**\IM,+,+N+.N.K.K^K,K,]N.-.-O-/-//M/M_M..^MOO/@1P11//_1P2P0Q0Q44P4PaP22`PQ4Q3R3R66S6SbS4S4aR65RS5S88U8UcU6U6bS87ST7:T:W:WdW8W8cT:T9U9<U<YYe<Y:Y:dU<U;V;>V>[[f>[<[<eV>=VW=W@@]@]g]>]>fW@?WX?XBB_B_h_@_@gXBXAYADYDaaiDaBaBhYDYCZCFZFccjFcDcDiZFZE[E[HHeHekeFFje[H[G\G\JJgJglgHHkg\J\I]I]LLiLimiJJli]L]K^K^NNkNknkLkLm^N^M_M_OOmOmomNNnm1__OP1P2Q`2Q2QOOoQ`R`PaPaTTpTpqpRRppaTaSbSbVVrVrrrTrTqbVUbcUcXXsXsssVsVrcXWcdWZdZtZtttXtXsdZdYeY\e\uuu\uZuZte\e[f[^f^vvv^v\v\uf^]fg]g``w`www^w^vg`_gh_hbbxxxbx`x`whbhaiadidyyydybybxidicjcfjfzzzfzdzdyjfjekekhh{h{{{ffz{khkglgljj|j|||hh{|ljlimimll}l}}}jj|}mlmknknnn~n~~~l~l}nnnmomoooonn~Qooo`Q`RqpRqRqooqpppqpqqqrrrrrsrsssststttttuuuuuuvvvvvwvwwwwxwxxx xxyyyy  yyzzzz  zz{{{{  {{||||  ||}}}} }}~~~~~~qpqp0Aarrow  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/big_p.3ds000066400000000000000000000021601361325167000147760ustar00rootroot00000000000000MMp ==`>= | red0  @0   P0 9 9 ?@cube2A`A6???A|\cG׼w+?A8c%BWc8\C?|WC?y=\z>y=WC?"C=Wc%B^z>8^~b?"C=^z>8z>"C=Wz>8W~b?%BWz> Af*                              0A`red*  !"#$%&'()PA    s3d-0.2.2.1/objs/bigsphere.3ds000066400000000000000000023664621361325167000157120ustar00rootroot00000000000000MM2  ==" >= default0  @0   P0   ?@ sphere1Az `A6???A ? <%$C?<՝C?<C?C?M<C?q(IhC?MC?q(q(C?MC?Ih>C?nzWoC?(b_C?spTNC?Mu=C?U+C?C?'J5uC?boC?KüeûC?-ż✻C?ƼkC?ȼC?ȼ՝C? ɼ7$C?ȼ՝:C?ȼ;C?Ƽk;C?-ż;C?Küe;C?bo;C?'J5uIh̨$:}?.>뻬:}?L>k:}?1>U_:}?n]>o꼬:}?ȿ>u:}??>v.:}? x >8yJ:}? >e:}?>f{:}?>:}?>m}:}?&=z󦽬:}?]=:}?J=B:}?=aɽ:}? }= }Խ:}?a=޽:}?B=J转:}?=]:}?z=&:}?m}=:}?=:}?f{=:}?e= :}?8yJ= x :}?v.=?:}?u=ȿ:}?o:}?>:}?f{>:}?e >:}?8yJ x >:}?v.?>:}?uȿ>:}?on]>:}?U_1>:}?kL>:}?.>:}?@>:}?;.>:}?k:}?U_<1>:}?o:}?u=ȿ>:}?v.=?>:}?8yJ= x >:}?e= >:}?f{=>:}?=>:}?m}=>:}?z=&=:}?=]=:}?B=J=:}?a==:}? }= }=:}?=a=:}?J=B=:}?]==:}?&=z=:}?>m}=:}?>=:}?>f{=:}? >e=:}? x >8yJ=:}??>v.=:}?ȿ>u=:}?n]>o<:}?1>U_<:}?L>k<:}?.>;:}?/>$(;|?.>p (;|?8.>cF(;|?+->ͼ(;|?+>*(;|?)>7&*(;|?؆'>TFK(;|?$>k(;|?,!>+(;|?A>)(;|?d> (;|?(>(;|?>½(;|? >zн(;|?S>޽(;|?>"(;|?J=J(;|?"=(;|?=S(;|?z= (;|?=(;|?=((;|? =d(;|?)=A(;|?+=,!(;|?k=$(;|?TFK=؆'(;|?7&*=)(;|?*=+(;|?<+-(;|?cF<8.(;|?p <.(;|?A#/(;|?p .(;|?cF8.(;|?ͼ+-(;|?*+(;|?7&*)(;|?TFK؆'(;|?k$(;|?+,!(;|?)A(;|? d(;|?((;|?½(;|?zн (;|?޽S(;|?"(;|?JJ(;|?"(;|?S޽(;|? zн(;|?½(;|?((;|?d (;|?A)(;|?,!+(;|?$k(;|?؆'TFK(;|?)7&*(;|?+*(;|?+-ͼ(;|?8.cF(;|?.p (;|?/Ī5$(;|?.p <(;|?8.cF<(;|?+-<(;|?+*=(;|?)7&*=(;|?؆'TFK=(;|?$k=(;|?,!+=(;|?A)=(;|?d =(;|?(=(;|?=(;|? z=(;|?S=(;|?"=(;|?JJ=(;|?">(;|?޽S>(;|?zн >(;|?½>(;|?(>(;|? d>(;|?)A>(;|?+,!>(;|?k$>(;|?TFK؆'>(;|?7&*)>(;|?*+>(;|?ͼ+->(;|?cF8.>(;|?p .>(;|?{/>(;|?p <.>(;|?cF<8.>(;|?<+->(;|?*=+>(;|?7&*=)>(;|?TFK=؆'>(;|?k=$>(;|?+=,!>(;|?)=A>(;|? =d>(;|?=(>(;|?=>(;|?z= >(;|?=S>(;|?"=>(;|?J=J=(;|?>"=(;|?S>=(;|? >z=(;|?>=(;|?(>=(;|?d> =(;|?A>)=(;|?,!>+=(;|?$>k=(;|?؆'>TFK=(;|?)>7&*=(;|?+>*=(;|?+-><(;|?8.>cF<(;|?.>p <(;|?G>y${?(G>{?F>'{?:E>o꼾{?C> {?A>)B{?+?>g{?8<>G{?Ӑ8>5昽{?4>Ӫ{?/0>X{?Y+>ݽ{?ru >8{?m>w{?>({?B >B {?(>{?w=m{?8=ru {?=&{?{?B B >{?(>{?wm>{?8ru >{?ݽ&>{?{?X/0>{?Ӫ4>{?5昽Ӑ8>{?G8<>{?g+?>{?)BA>{? C>{?o:E>{?'F>{?(G>{?D%G>{?<(G>{?'<F>{?o<:E>{? =C>{?)B=A>{?g=+?>{?G=8<>{?5=Ӑ8>{?Ӫ=4>{?X=/0>{?{?=&>{?8=ru >{?w=m>{?(>>{?B >B >{?>(>{?m>w={?ru >8={?&>={?Y+>X={?4>Ӫ={?Ӑ8>5={?8<>G={?+?>g={?A>)B={?C> ={?:E>o<{?F>'<{?(G><{?\`>$y?`>$0y?G_>y?k]>~y?u \>/y?ʢY>PZy?V>Ay?>S>C+y?HO>y?J>,ڿy?E>[ӽy?p@>潝y?Z:>Ky?54>y?n->Uy?S=&>y?p>py?>S=&y?U>n-y?>54y?K=Z:y?=p@y?[=Ey?,ڿ=Jy?=HOy?C+=>Sy?A=Vy?PZ=ʢYy?/=u \y?~=k]y?Sy?HOy?,ڿJy?[ӽEy?潑p@y?KZ:y?54y?Un-y?S=&y?ppy?S=&y?n-Uy?54y?Z:Ky?p@潝y?E[ӽy?J,ڿy?HOy?>SC+y?VAy?ʢYPZy?u \/y?k]~y?G_y?`$0y?\`$y?`$0SC+=y?HO=y?J,ڿ=y?E[=y?p@=y?Z:K=y?54>y?n-U>y?S=&>y?pp>y?S=&>y?Un->y?54>y?KZ:>y?潑p@>y?[ӽE>y?,ڿJ>y?HO>y?C+>S>y?AV>y?PZʢY>y?/u \>y?~k]>y?G_>y?$0`>y?,9\`>y?$0<`>y?y?~=k]>y?/=u \>y?PZ=ʢY>y?A=V>y?C+=>S>y?=HO>y?,ڿ=J>y?[=E>y?=p@>y?K=Z:>y?>54>y?U>n->y?>S=&>y?p>p>y?S=&>>y?n->U>y?54>>y?Z:>K=y?p@>=y?E>[=y?J>,ڿ=y?HO>=y?>S>C+=y?V>A=y?ʢY>PZ=y?u \>/=y?k]>~=y?G_>$0$Sx?x>yVCSx?w>=üSx?cv>uSx?t>)BSx?Zq>DqSx?n>sSx?fDj>蠟Sx?>e>nSx?Q`>ԽSx?n[>Sx?iU>^Sx?N>}; Sx?G>7Sx?U@>/Sx?y[8>{'Sx?/>/Sx?{'>y[8Sx?/>U@Sx?7>GSx?}; >NSx?^=iUSx?=n[Sx?=Q`Sx?n=>eSx?蠟=fDjSx?s=nSx?Dq=ZqSx?)B=tSx?u=cvSx?=<wSx?yVC<xSx?9#xSx?yVCxSx?=üwSx?ucvSx?)BtSx?DqZqSx?snSx?蠟fDjSx?n>eSx?ԽQ`Sx?꽭n[Sx?^iUSx?}; NSx?7GSx?/U@Sx?{'y[8Sx?//Sx?y[8{'Sx?U@/Sx?G7Sx?N}; Sx?iU^Sx?n[Sx?Q`ԽSx?>enSx?fDj蠟Sx?nsSx?ZqDqSx?t)BSx?cvuSx?w=üSx?xyVCSx?x$Sx?xyVCen=Sx?Q`=Sx?n[=Sx?iU^=Sx?N}; >Sx?G7>Sx?U@/>Sx?y[8{'>Sx?//>Sx?{'y[8>Sx?/U@>Sx?7G>Sx?}; N>Sx?^iU>Sx?꽭n[>Sx?ԽQ`>Sx?n>e>Sx?蠟fDj>Sx?sn>Sx?DqZq>Sx?)Bt>Sx?ucv>Sx?=üw>Sx?yVCx>Sx?Mx>Sx?yVC<x>Sx?=<w>Sx?u=cv>Sx?)B=t>Sx?Dq=Zq>Sx?s=n>Sx?蠟=fDj>Sx?n=>e>Sx?=Q`>Sx?=n[>Sx?^=iU>Sx?}; >N>Sx?7>G>Sx?/>U@>Sx?{'>y[8>Sx?/>/>Sx?y[8>{'>Sx?U@>/>Sx?G>7>Sx?N>}; >Sx?iU>^=Sx?n[>=Sx?Q`>=Sx?>e>n=Sx?fDj>蠟=Sx?n>s=Sx?Zq>Dq=Sx?t>)B=Sx?cv>u=Sx?w>=yVC$v?wd>jVv?=>(ּv?3>K v?> Uv?v>v?E>v? >v?S|>Eѽv?[v>ފv?lp>v?Aj>h v?c>v?][>"v?S>B-v?1]J>}i7v?A>Av?}i7>1]Jv?B->Sv?">][v?>cv?h >Ajv?>lpv?ފ=[vv?E=S|v?= v?=Ev?=vv? U=v?K =3v?(<=懾v?jVv?Ajh >v?c>v?][">v?SB->v?1]J}i7>v?AA>v?}i71]J>v?B-S>v?"][>v?c>v?h Aj>v?lp>v?ފ[v>v?EѽS|>v? >v?E>v?v>v? U>v?K 3>v?(ּ=>v?jVwd>v?ea>v?jVv?(<=>v?K =3>v? U=>v?=v>v?=E>v?= >v?E=S|>v?ފ=[v>v?>lp>v?h >Aj>v?>c>v?">][>v?B->S>v?}i7>1]J>v?A>A>v?1]J>}i7>v?S>B->v?][>">v?c>>v?Aj>h >v?lp>>v?[v>ފ=v?S|>E=v? >=v?E>=v?v>=v?> U=v?3>K =v?=>(<v?wd>jV<v?1>$ t?]r>]i t?> t?a>v. t?ő>g t?+>s t?9>; t? >3HȽ t?O> t?)[>. t?> t? ~>\ t?'w>$% t?1n>1 t?Me> < t??\>6G t?E0R>E0R t?6G>?\ t? <>Me t?1>1n t?$%>'w t?\> ~ t? > t?.=)[ t?=O t?3H= t?;=9 t?s=+ t?g=ő t?v.=a t?<蓾 t?]i<]r t?3#1 t?]i]r t?蓾 t?v.a t?gő t?s+ t?;9 t?3HȽ t?O t?.)[ t?  t?\ ~ t?$%'w t?11n t? t? ~\> t?'w$%> t?1n1> t?Me <> t??\6G> t?E0RE0R> t?6G?\> t? t?11n> t?$%'w> t?\ ~> t? > t?.)[> t?O> t?3HȽ > t?;9> t?s+> t?gő> t?v.a> t?> t?]i]r> t?Lu1> t?]i<]r> t?<> t?v.=a> t?g=ő> t?s=+> t?;=9> t?3H= > t?=O> t?.=)[> t? >> t?\> ~> t?$%>'w> t?1>1n> t? <>Me> t?6G>?\> t?E0R>E0R> t??\>6G> t?Me> <> t?1n>1> t?'w>$%> t? ~>\> t?> > t?)[>.= t?O>= t? >3H= t?9>;= t?+>s= t?ő>g= t?a>v.= t?>< t?]r>]i< t?嚠>$Gs?^i>1-|Gs?ԟ>nGs?ݞ>vzGs?ʛ>kGs?>|Gs?|7>lؽGs?5a>Gs?l/>U Gs?>jGs?l>"%Gs?ɉ>lt2Gs?>:X?Gs?|Lx>KGs?An>&WGs?=!c>=!cGs?&W>AnGs?K>|LxGs?:X?>Gs?lt2>ɉGs?"%>lGs?j>Gs?U >l/Gs?=5aGs?l=|7Gs?|=Gs?k=ʛGs?z=ℝGs?v<=ݞGs?n<ԟGs?1-|<^iGs?&#嚠Gs?1-|^iGs?nԟGs?v<ݞGs?zℝGs?kʛGs?|Gs?lؽ|7Gs?5aGs?U l/Gs?jGs?"%lGs?lt2ɉGs?:X?Gs?K|LxGs?&WAnGs?=!c=!cGs?An&WGs?|LxKGs?:X?Gs?ɉlt2Gs?l"%Gs?jGs?l/U Gs?5aGs?|7lؽGs?|Gs?ʛkGs?ℝzGs?ݞvGs?j>Gs?l"%>Gs?ɉlt2>Gs?:X?>Gs?|LxK>Gs?An&W>Gs?=!c=!c>Gs?&WAn>Gs?K|Lx>Gs?:X?>Gs?lt2ɉ>Gs?"%l>Gs?j>Gs?U l/>Gs?5a>Gs?lؽ|7>Gs?|>Gs?kʛ>Gs?zℝ>Gs?v<ݞ>Gs?nԟ>Gs?1-|^i>Gs?#݄嚠>Gs?1-|<^i>Gs?n<ԟ>Gs?v<=ݞ>Gs?z=ℝ>Gs?k=ʛ>Gs?|=>Gs?l=|7>Gs?=5a>Gs?U >l/>Gs?j>>Gs?"%>l>Gs?lt2>ɉ>Gs?:X?>>Gs?K>|Lx>Gs?&W>An>Gs?=!c>=!c>Gs?An>&W>Gs?|Lx>K>Gs?>:X?>Gs?ɉ>lt2>Gs?l>"%>Gs?>j>Gs?l/>U >Gs?5a>=Gs?|7>l=Gs?>|=Gs?ʛ>k=Gs?ℝ>z=Gs?ݞ>v<=Gs?ԟ>n1-|+$ q?G>j q?3>A q?垪>8yJ q?^,>G q?Q>蠟 q?s>3HȽ q?g>o q?[>, q?L>~ q?>Ş" q?>KZ1 q?k>p? q?>bM q?U>Z q?>ӫg q?/s>/s q?ӫg> q?Z>U q?bM> q?p?>k q?KZ1> q?Ş"> q?~>L훾 q?,>[ q?o=g q?3H=s q?蠟=Q q?G=^, q?8yJ=垪 q?A=3 q?j q?L훾~> q?Ş"> q?KZ1> q?kp?> q?bM> q?UZ> q?ӫg> q?/s/s> q?ӫg> q?ZU> q?bM> q?p?k> q?KZ1> q?Ş"> q?~L> q?,[> q?o轙g> q?3HȽs> q?蠟Q> q?G^,> q?8yJ垪> q?A3> q?jG> q?|> q?j q?A=3> q?8yJ=垪> q?G=^,> q?蠟=Q> q?3H=s> q?o=g> q?,>[> q?~>L> q?Ş">> q?KZ1>> q?p?>k> q?bM>> q?Z>U> q?ӫg>> q?/s>/s> q?>ӫg> q?U>Z> q?>bM> q?k>p?> q?>KZ1> q?>Ş"> q?L>~> q?[>,> q?g>o= q?s>3H= q?Q>蠟= q?^,>G= q?垪>8yJ= q?3>A= q?G>j< q?*D>$n?W > n?a>r}n?E>LXn?ù>Tˏn?y>n?T>lսn?~>KOn?e=> n?!>en?">-n? >v=n?86>Ln? >و[n?p>hin?D>}wn?K>Kn?}w>Dn?hi>pn?و[> n?L>86n?v=> n?->"n?e>!n? >e=n?KO=~n?l=Tn?=yn?Tˏ=ùn?LX=En?r}=an? n?!e>n?"->n? v=>n?86L>n? و[>n?phi>n?D}w>n?KK>n?}wD>n?hip>n?و[ >n?L86>n?v= >n?-">n?e!>n? e=>n?KO~>n?lսT>n?y>n?Tˏù>n?LXE>n?r}a>n? W >n?#p*D>n? n?r}=a>n?LX=E>n?Tˏ=ù>n?=y>n?l=T>n?KO=~>n? >e=>n?e>!>n?->">n?v=> >n?L>86>n?و[> >n?hi>p>n?}w>D>n?K>K>n?D>}w>n?p>hi>n? >و[>n?86>L>n? >v=>n?">->n?!>e>n?e=> >n?~>KO=n?T>l=n?y>=n?ù>Tˏ=n?E>LX=n?a>r}=n?W > p$^l?>ә^l?>^l?0>e^l?J+>5昽^l?>n^l?@>^l?z>,^l?>^l?F>'^l?]̬>8^l?>uI^l?>ɵY^l?'`>voi^l?u>,x^l?n->Ȕ^l?ԋ>ԋ^l?Ȕ>n-^l?,x>u^l?voi>'`^l?ɵY>颾^l?uI>^l?8>]̬^l?'>F^l?>^l?,>z^l?=@^l?n=^l?5=J+^l?e=0^l?=¾^l?ә<þ^l?#þ^l?әþ^l?¾^l?e0^l?5昽J+^l?n^l?@^l?,z^l?^l?'F^l?8]̬^l?uI^l?ɵY颾^l?voi'`^l?,xu^l?Ȕn-^l?ԋԋ^l?n-Ȕ^l?u,x^l?'`voi^l?颾ɵY^l?uI^l?]̬8^l?F'^l?^l?z,^l?@^l?n^l?J+5昽^l?0e^l?¾^l?þә^l?þA 3#^l?þә<^l?¾=^l?0e=^l?J+5=^l?n=^l?@=^l?z,>^l?>^l?F'>^l?]̬8>^l?uI>^l?颾ɵY>^l?'`voi>^l?u,x>^l?n-Ȕ>^l?ԋԋ>^l?Ȕn->^l?,xu>^l?voi'`>^l?ɵY>^l?uI>^l?8]̬>^l?'F>^l?>^l?,z>^l?@>^l?n>^l?5昽J+>^l?e0>^l?>^l?ә>^l?!>^l?ә<>^l?=>^l?e=0>^l?5=J+>^l?n=>^l?=@>^l?,>z>^l?>>^l?'>F>^l?8>]̬>^l?uI>>^l?ɵY>>^l?voi>'`>^l?,x>u>^l?Ȕ>n->^l?ԋ>ԋ>^l?n->Ȕ>^l?u>,x>^l?'`>voi>^l?>ɵY>^l?>uI>^l?]̬>8>^l?F>'>^l?>>^l?z>,>^l?@>=^l?>n=^l?J+>5=^l?0>e=^l?>=^l?>ә<^l?{>3$ j?;>K䢼 j?|>" j?<>s j?/>顽 j?C>Vɽ j?> j?Z>W j?> j?>k1 j?>8C j?>UU j?*>f j?>2w j?c>M j?4>bV j?> j?bV>4 j?M>c j?2w> j?f>* j?UU> j?8C> j?k1> j?> j?W >Zþ j?=ƾ j?V=Cɾ j?=/˾ j?s=<; j?"=|ξ j?K<;Ͼ j?+#{Ͼ j?K䢼;Ͼ j?"|ξ j?s<; j?顽/˾ j?VɽCɾ j?𽤌ƾ j?W Zþ j? j?k1 j?8C j?UU j?f* j?2w j?Mc j?bV4 j? j?4bV j?cM j?2w j?*f j?UU j?8C j?k1 j? j?ZþW j?ƾ j?CɾVɽ j?/˾顽 j?<;s j?|ξ" j?;ϾK䢼 j?{ϾQ" j?;ϾK< j?|ξ"= j?<;s= j?/˾= j?CɾV= j?ƾ= j?ZþW > j?> j?k1> j?8C> j?UU> j?*f> j?2w> j?cM> j?4bV> j?> j?bV4> j?Mc> j?2w> j?f*> j?UU> j?8C> j?k1> j?> j?W Z> j?𽤌> j?VɽC> j?顽/> j?s<> j?"|> j?K䢼;> j? {> j?K<;> j?"=|> j?s=<> j?=/> j?V=C> j?=> j?W >Z> j?>> j?k1>> j?8C>> j?UU>> j?f>*> j?2w>> j?M>c> j?bV>4> j?>> j?4>bV> j?c>M> j?>2w> j?*>f> j?>UU> j?>8C> j?>k1> j?>> j?Z>W > j?>= j?C>V= j?/>= j?<>s= j?|>"= j?;>K< j?>C$kg?>oܫkg?>p+kg?>f{kg?>Ӫkg? Y>Խkg?k{>.kg?>~kg?>>'kg?>0;kg?O>bNkg?û>'akg?>Jgkg?7>ߊkg?F3>kg?ʚ>ʚkg?>F3kg?ߊ>7kg?Jg>'ԯkg?kg?'a>ûkg?bN>Okg?0;>žkg?'>>ʾkg?~>ξkg?.=k{Ѿkg?= YԾkg?Ӫ=־kg?f{=ؾkg?p+=پkg?oܫ<ھkg?5v#ھkg?oܫھkg?p+پkg?f{ؾkg?Ӫ־kg?Խ YԾkg?.k{Ѿkg?~ξkg?'>ʾkg?0;žkg?bNOkg?'aûkg?ʾ'kg?ξ~kg?k{Ѿ.kg? YԾԽkg?־Ӫkg?ؾf{kg?پp+kg?ھoܫkg?ھ\"kg?ھoܫkg?>ʾ'>kg?ž0;>kg?ObN>kg?û'a>kg?kg?'ԯJg>kg?7ߊ>kg?F3>kg?ʚʚ>kg?F3>kg?ߊ7>kg?Jg'ԯ>kg?kg?'aû>kg?bNO>kg?0;>kg?'>>kg?~>kg?.k{>kg?Խ Y>kg?Ӫ>kg?f{>kg?p+>kg?oܫ>kg?>kg?oܫ<>kg?p+=>kg?f{=>kg?Ӫ=>kg?= Y>kg?.=k{>kg?~>>kg?'>>>kg?0;>>kg?bN>O>kg?'a>û>kg?>kg?Jg>'ԯ>kg?ߊ>7>kg?>F3>kg?ʚ>ʚ>kg?F3>>kg?7>ߊ>kg?'ԯ>Jg>kg?>kg?û>'a>kg?O>bN>kg?>0;>kg?>>'>kg?>~>kg?k{>.=kg? Y>=kg?>Ӫ=kg?>f{=kg?>p+=kg?>oܫf9|$Yd?x>Yd?>X4Yd?>*Yd?>ԣYd?[M>߽Yd?I>̥Yd?>Yd?>/00Yd?h>DYd?>1YYd?2s>lYd?g> Yd?1>m!Yd?> Yd?T>򗚾Yd?Ƣ>ƢYd?>TYd? >Yd?m!>1渾Yd? >gYd?l>2sžYd?1Y>˾Yd?D>hоYd?/00>ԾYd?>ؾYd?̥>IܾYd?=[M߾Yd?ԣ=Yd?*=Yd?X4=Yd?Yd?ؾ>Yd?Ծ/00>Yd?hоD>Yd?˾1Y>Yd?2sžl>Yd?g >Yd?1渾m!>Yd?򱾸 >Yd?T>Yd?ƢƢ>Yd?򗚾T>Yd? >Yd?m!1>Yd? g>Yd?l2s>Yd?1Y>Yd?Dh>Yd?/00>Yd?>Yd?̥I>Yd?߽[M>Yd?ԣ>Yd?*>Yd?X4>Yd?x>Yd?Apu3>Yd?Yd?X4=>Yd?*=>Yd?ԣ=>Yd?=[M>Yd?̥>I>Yd?>>Yd?/00>>Yd?D>h>Yd?1Y>>Yd?l>2s>Yd? >g>Yd?m!>1>Yd? >>Yd?>T>Yd?Ƣ>Ƣ>Yd?T>>Yd?> >Yd?1>m!>Yd?g> >Yd?2s>l>Yd?>1Y>Yd?h>D>Yd?>/00>Yd?>>Yd?I>̥>Yd?[M>=Yd?>ԣ=Yd?>*=Yd?>X4=Yd?x>Sy$a?}>{a?d1>jA=a?*>a?>Xa?=>꽘a?d> a??>Ş"a?>8a?.>bNa?1>Lca?g>)xa?>a?>lƏa?>4a?ղ>a?>򩪾a?>ղa?4>a?lƏ>a?>Ⱦa?)x>gϾa?Lc>1Ծa?bN>.ھa?8>޾a?Ş">?㾘a? >d澘a?==꾘a?X=쾘a?=*a?jA==d1a?{<}a?T$Za?{}a?jA=d1a?*a?X쾘a?=꾘a? d澘a?Ş"?㾘a?8޾a?bN.ھa?Lc1Ծa?)xgϾa?Ⱦa?lƏa?4a?ղa?򩪾򩪾a?ղa?4a?lƏa?Ⱦa?gϾ)xa?1ԾLca?.ھbNa?޾8a??Ş"a?d澗 a?=꽘a?Xa?*a?d1jA=a?}{a?Z񾤂a?}{a??Ş">a?޾8>a?.ھbN>a?1ԾLc>a?gϾ)x>a?Ⱦ>a?lƏ>a?4>a?ղ>a?򩪾>a?ղ>a?4>a?lƏ>a?>a?)xg>a?Lc1>a?bN.>a?8>a?Ş"?>a? d>a?=>a?X>a?*>a?jA=d1>a?{}>a?~ǤZ>a?{<}>a?jA==d1>a?=*>a?X=>a?==>a? >d>a?Ş">?>a?8>>a?bN>.>a?Lc>1>a?)x>g>a?>>a?lƏ>>a?4>>a?>ղ>a?>>a?ղ>>a?>4>a?>lƏ>a?>>a?g>)x>a?1>Lc>a?.>bN>a?>8>a??>Ş">a?d> >a?=>=a?>X=a?*>=a?d1>jA==a?}>{ٰu$^?U>e Ƽ^?&>LE^?>.^?ȃ>\Ľ^?>G^?G>Ń^?> *^?a'>&A^?^">W^?>Qm^?u>^?8>4^?X>>U^?u>^?C>+z^?r>r^?+z>C^?>uþ^?>U>Xʾ^?4>8Ѿ^?>uؾ^?Qm>޾^?W>^"^?&A>a'^? *>^?Ń>G^?G=^?\=ȃ^?.=^?LE=&^?e UXʾ^?uþ^?+zC^?rr^?C+z^?uþ^?Xʾ>U^?8Ѿ4^?uؾ^?޾Qm^?^"來W^?a'龤&A^? *^?GŃ^?G^?ȃ\Ľ^?.^?&LE^?Ue Ƽ^?']^?Ue <^?&LE=^?.=^?ȃ\=^?G=^?GŃ>^? *>^?a'龤&A>^?^"來W>^?޾Qm>^?uؾ>^?8Ѿ4>^?Xʾ>U>^?uþ>^?C+z>^?rr>^?+zC>^?u>^?>UX>^?48>^?u>^?Qm>^?W^">^?&Aa'>^? *>^?ŃG>^?G>^?\Ľȃ>^?.>^?LE&>^?e ƼU>^?Ф']>^?e ^?LE=&>^?.=>^?\=ȃ>^?G=>^?Ń>G>^? *>>^?&A>a'>^?W>^">^?Qm>>^?>u>^?4>8>^?>U>X>^?>u>^?+z>C>^?r>r>^?C>+z>^?u>>^?X>>U>^?8>4>^?u>>^?>Qm>^?^">W>^?a'>&A>^?> *>^?G>Ń>^?>G=^?ȃ>\=^?>.=^?&>LE=^?U>e <^?=?|3r$[?s?dμ[??fN[?/?m}[??^[?>\[?t>KZ1[?#/>uI[?>'a[?#>)x[?>R[?%><[?k>̜[?x>B[?>İ[? > [?İ>þ[?B>x˾[?̜>kӾ[?<>%ھ[?R>[?)x>#[?'a>[?uI>#/[?KZ1>t[?\>[?^= U[?[?tKZ1>[?#/uI>[?'a>[?#辥)x>[?ᾋR>[?%ھ<>[?kӾ̜>[?x˾B>[?þİ>[?  >[?İ>[?Bx>[?̜k>[?<%>[?R>[?)x#>[?'a>[?uI#/>[?KZ1t>[?\>[?^ U>[?[?\>>[?KZ1>t>[?uI>#/>[?'a>>[?)x>#>[?R>>[?<>%>[?̜>k>[?B>x>[?İ>>[? > >[?>İ>[?x>B>[?k>̜>[?%><>[?>R>[?#>)x>[?>'a>[?#/>uI>[?t>KZ1>[?>\>[? U>^=[??QSHX?>;jSHX?&>SHX?>ҌSHX?Q>^.SHX?}>Y,SHX?>ŭSHX?>SHX?>SHX?>ʾSHX?ŭ>ӾSHX?Y,>}ܾSHX?^.>QSHX?Ҍ>SHX?>&SHX?;j>SHX?Q>fSHX?8> SHX?c>SHX?>SHX?p=SSHX?Ġ=zSHX?6V=LSHX? <_SHX?$SHX? ׼_SHX?6VLSHX?ĠzSHX?pսSSHX?SHX?cSHX?8 SHX?QfSHX?;jSHX?&SHX?ҌSHX?^.QSHX?Y,}ܾSHX?ŭӾSHX?ʾSHX?SHX?ʾSHX?ӾŭSHX?}ܾY,SHX?Q^.SHX?꾉ҌSHX?&SHX?;jSHX?fQSHX? 8SHX?cSHX?SHX?SpսSHX?zĠSHX?L6VSHX?_ ׼SHX?*L~SHX?_ SHX?c>SHX? 8>SHX?fQ>SHX?;j>SHX?&>SHX?꾉Ҍ>SHX?Q^.>SHX?}ܾY,>SHX?Ӿŭ>SHX?ʾ>SHX?>SHX?>SHX?ŭ>SHX?Y,}>SHX?^.Q>SHX?Ҍ>SHX?&>SHX?;j>SHX?Qf>SHX?8 ?SHX?c?SHX??SHX?pսS?SHX?Ġz?SHX?6VL?SHX? ׼_?SHX?ݚ⤛?SHX? <_?SHX?6V=L?SHX?Ġ=z?SHX?p=S?SHX?>?SHX?c>?SHX?8> ?SHX?Q>f>SHX?;j>>SHX?>&>SHX?Ҍ>>SHX?^.>Q>SHX?Y,>}>SHX?ŭ>>SHX?>>SHX?>>SHX?>>SHX?>ŭ>SHX?}>Y,>SHX?Q>^.>SHX?>Ҍ>SHX?&>>SHX?>;j>SHX?f>Q>SHX? ?8>SHX??c>SHX??>SHX?S?p=SHX?z?Ġ=SHX?L?6V=SHX?_? >1T?><1T?^>u1T?Uy>r1T?d>Tt1T?>1T?N#>N#ɾ1T?>Ҿ1T?Tt>d۾1T?r>Uy1T?u>^1T?<>1T?>>1T?1T?ɵY>Qf1T?p?>{1T?$%>1T?}; > 1T?=?~ 1T?z=ů 1T? _= 1T?Q< 1T?$91T?Q߼ 1T? _ 1T?zů 1T?ݽ?~ 1T?}; 1T?$%1T?p?{1T?ɵYQf1T?1T?<1T?u^1T?rUy1T?Ttd۾1T?Ҿ1T?N#ɾN#ɾ1T?Ҿ1T?d۾Tt1T?Uy侥r1T?^u1T?<1T?>1T?1T?$%>1T?{p?>1T?QfɵY>1T?1T?>>1T?<>1T?^u>1T?Uy侥r>1T?d۾Tt>1T?Ҿ>1T?N#ɾN#>1T?>1T?Ttd>1T?rUy>1T?u^>1T?<>1T?>>1T? ?1T?$%>?1T?p?>{?1T?ɵY>Qf?1T??1T?>>>1T?<>>1T?u>^>1T?r>Uy>1T?Tt>d>1T?>>1T?N#>N#>1T?>>1T?d>Tt>1T?Uy>r>1T?^>u>1T?><>1T?>>>1T??1T?Qf?ɵY>1T?{?p?>1T??$%>1T? ?}; >1T??~ ?=1T?ů ?z=1T? ? _=1T? ?Q<1T?*h?f$=MQ?:?t=MQ?u?,g=MQ??]=MQ??=MQ?C?D=MQ?B ?(+=MQ?C ?F=MQ?/?a=MQ?A?)|=MQ?T?i=MQ?>=MQ? >.ʣ=MQ?>ў=MQ?>$=MQ?Oq>ž=MQ?v>vо=MQ?>Oqھ=MQ?$>=MQ?ў>=MQ?.ʣ> =MQ?>=MQ?i>T=MQ?)|>A=MQ?a>/=MQ?F>C =MQ?(+>B =MQ?D>C=MQ?==MQ?]==MQ?,g=u=MQ?t<:=MQ?"$*h=MQ?t缶:=MQ?,gu=MQ?]=MQ?=MQ?DC=MQ?(+B =MQ?FC =MQ?a/=MQ?)|A=MQ?iT=MQ?=MQ?.ʣ =MQ?ў=MQ?$=MQ?žOqھ=MQ?vоvо=MQ?Oqھž=MQ?$=MQ?ў=MQ? .ʣ=MQ?=MQ?Ti=MQ?A)|=MQ?/a=MQ?C F=MQ?B (+=MQ?CD=MQ?=MQ?]=MQ?u,g=MQ?:t=MQ?*h󤼣=MQ?:t<=MQ?u,g==MQ?]==MQ?==MQ?CD>=MQ?B (+>=MQ?C F>=MQ?/a>=MQ?A)|>=MQ?Ti>=MQ?>=MQ? .ʣ>=MQ?ў>=MQ?$>=MQ?Oqھ>=MQ?vоv>=MQ?žOq>=MQ?$>=MQ?ў>=MQ?.ʣ >=MQ?>=MQ?iT?=MQ?)|A?=MQ?a/?=MQ?FC ?=MQ?(+B ?=MQ?DC?=MQ??=MQ?]?=MQ?,gu?=MQ?t缶:?=MQ? *h?=MQ?t<:?=MQ?,g=u?=MQ?]=?=MQ?=?=MQ?D>C?=MQ?(+>B ?=MQ?F>C ?=MQ?a>/?=MQ?)|>A?=MQ?i>T?=MQ?>>=MQ?.ʣ> >=MQ?ў>>=MQ?$>>=MQ?>Oq>=MQ?v>v>=MQ?Oq>>=MQ?>$>=MQ?>ў>=MQ? >.ʣ>=MQ?>>=MQ?T?i>=MQ?A?)|>=MQ?/?a>=MQ?C ?F>=MQ?B ?(+>=MQ?C?D>=MQ??==MQ??]==MQ?u?,g==MQ?:?t<=MQ??Db$M?P?rM?? )oM?4?M??8M??7M??1M??bMM? ?voiM? ?JgM?}?lƏM??̜M?>rM? >篵M?E>}M?>̾M?>׾M?>M?}>EM?篵> M?r>M?̜>M?lƏ>}M?Jg> M?voi> M?bM>M?1>M?7>M?8=M?=4M? )o=M?rM?1>M?bM>M? voi>M? Jg>M?}lƏ>M?̜>M?r>M? 篵>M?E}>M?>M?׾>M?̾>M?}E>M?篵 >M?r>M?̜?M?lƏ}?M?Jg ?M?voi ?M?bM?M?1?M?7?M?8?M?4?M? )o?M?rYP?M?P?M?r?M?1>?M?bM>?M?voi> ?M?Jg> ?M?lƏ>}?M?̜>?M?r>>M?篵> >M?}>E>M?>>M?>>M?>>M?E>}>M? >篵>M?>r>M??̜>M?}?lƏ>M? ?Jg>M? ?voi>M??bM>M??1>M??7>M??8=M?4?=M?? )o=M?P?r<M??^$I?@O?LI??wI?k?+ḽI?y? I?|?I??6I?J?Z=TI??qI?`?㭆I? ?C}I?v?I??I?]>I?H>>ǾI?f>EӾI?ռ>ռ޾I?E>fI?>>HI?>]I?>I?>vI?C}> I?㭆>`I?q>I?Z=T>JI?6>I?>|I? =yI?+=kI?w=I?L<@OI?ܹ-$I?L@OI?wI?+ḽkI? yI?|I?6I?Z=TJI?qI?㭆`I?C} I?vI?I?]I?>ǾHI?EӾfI?ռ޾ռ޾I?fEӾI?H>ǾI?]I?I?vI? C}I?`㭆I?qI?JZ=TI?6I?|I?y I?k+ḽI?wI?@OLI?yI?@OL<I?w=I?k+=I?y =I?|>I?6>I?JZ=T>I?q>I?`㭆>I? C}>I?v>I?>I?]>I?H>>I?fE>I?ռ޾ռ>I?EӾf>I?>ǾH>I?]>I??I?v?I?C} ?I?㭆`?I?q?I?Z=TJ?I?6?I?|?I? y?I?+ḽk?I?w?I?L@O?I?eK?I?L<@O?I?w=?I?+=k?I? =y?I?>|?I?6>?I?Z=T>J?I?q>?I?㭆>`?I?C}> ?I?>v?I?>?I?>]>I?>>H>I?E>f>I?ռ>ռ>I?f>E>I?H>>>I?]>>I??>I?v?>I? ?C}>I?`?㭆>I??q>I?J?Z=T>I??6>I?|?>I?y? =I?k?+=I??w=I?@O?L<I?g"?aGZ$E?5"?E?g!?~E? ?BE?H?wE??/E?^i? <E?B?ZE? ?,xE??ߊE?g:?4E?L ?BE??TtE?q?}E?>ξE?> ھE?Ƭ>ƬE? >E?>E?}>qE?Tt>E?B>L E?4>g:E?ߊ>E?,x> E?Z>BE? <>^iE?/>E?w=HE?B= E?~=g!E?<5"E?#3$g"E?5"E?~g!E?B E?wHE?/E? <^iE?ZBE?,x E?ߊE?4g:E?BL E?TtE?}qE?ξE? ھE?ƬƬE? ھE?ξE?q}E?TtE?L BE?g:4E?ߊE? ,xE?BZE?^i <E?/E?HwE? BE?g!~E?5"E?g" E?5"<E?g!~=E? B=E?Hw=E?/>E?^i <>E?BZ>E? ,x>E?ߊ>E?g:4>E?L B>E?Tt>E?q}>E?>E? >E?ƬƬ>E? ھ>E?ξ>E?}q?E?Tt?E?BL ?E?4g:?E?ߊ?E?,x ?E?ZB?E? <^i?E?/?E?wH?E?B ?E?~g!?E?5"?E?DZg"?E?<5"?E?~=g!?E?B= ?E?w=H?E?/>?E? <>^i?E?Z>B?E?,x> ?E?ߊ>?E?4>g:?E?B>L ?E?Tt>?E?}>q?E?>>E? >>E?Ƭ>Ƭ>E?> >E?>>E?q?}>E??Tt>E?L ?B>E?g:?4>E??ߊ>E? ?,x>E?B?Z>E?^i? <>E??/>E?H?w=E? ?B=E?g!?~=E?5"?<E?V6'?U$pA?'?FpA?6h&? pA?g%?GĽpA?#?h|pA?|3"?]"pA? ?(BpA? p?TapA?{?pA?x(?"pA?w?pA?8l?pA?+ ?˹pA?_N?i7ǾpA?A?(ԾpA?>pA?My>MypA?>pA?(>ApA?i7>_NpA?˹>+ pA?>8lpA?>wpA?">x(pA?>{pA?Ta> ppA?(B> pA?]">|3"pA?h|>#pA?G=g%pA? =6h&pA?F='pA?p8$V6'pA?F'pA? 6h&pA?GĽg%pA?h|#pA?]"|3"pA?(B pA?Ta ppA?{pA?"x(pA?wpA?8lpA?˹+ pA?i7Ǿ_NpA?(ԾApA?pA?MyMypA?pA?A(ԾpA?_Ni7ǾpA?+ ˹pA?8lpA?wpA?x("pA?{pA? pTapA? (BpA?|3"]"pA?#h|pA?g%GĽpA?6h& pA?'FpA?V6'pA?'F=pA?6h& =pA?g%G=pA?#h|>pA?|3"]">pA? (B>pA? pTa>pA?{>pA?x(">pA?w>pA?8l>pA?+ ˹>pA?_Ni7>pA?A(>pA?>pA?MyMy>pA?>pA?(ԾA?pA?i7Ǿ_N?pA?˹+ ?pA?8l?pA?w?pA?"x(?pA?{?pA?Ta p?pA?(B ?pA?]"|3"?pA?h|#?pA?GĽg%?pA? 6h&?pA?F'?pA?kT V6'?pA?F='?pA? =6h&?pA?G=g%?pA?h|>#?pA?]">|3"?pA?(B> ?pA?Ta> p?pA?>{?pA?">x(?pA?>w?pA?>8l?pA?˹>+ ?pA?i7>_N?pA?(>A?pA?>>pA?My>My>pA?>>pA?A?(>pA?_N?i7>pA?+ ?˹>pA?8l?>pA?w?>pA?x(?">pA?{?>pA? p?Ta>pA? ?(B>pA?|3"?]">pA?#?h|>pA?g%?G=pA?6h&? =pA?'?F=pA?J+?9Q$=?F+?=?\+?Ά=?*?aɽ=?(?(=?S&?{'=?-$?6G=?!?ӫg=?!?Ȕ=?i?=?~?=?u?İ=? ?=?3 ?̾=?/? ھ=?m>Y=?\!>\!=?Y>m=? >/=?>3 =?> =?İ>u=?>~=?>i=?Ȕ>!=?ӫg>!=?6G>-$=?{'>S&=?(>(=?a=*=?Ά=\+=?=F+=?=$J+=?F+=?Ά\+=?aɽ*=?((=?{'S&=?6G-$=?ӫg!=?Ȕ!=?i=?~=?İu=? =?̾3 =? ھ/=?Ym=?\!\!=?mY=?/ ھ=?3 ̾=? =?uİ=?~=?i=?!Ȕ=?!ӫg=?-$6G=?S&{'=?((=?*aɽ=?\+Ά=?F+=?J+o *=?F+==?\+Ά==?*a==?((>=?S&{'>=?-$6G>=?!ӫg>=?!Ȕ>=?i>=?~>=?uİ>=? >=?3 >=?/ >=?mY>=?\!\!>=?Ym>=? ھ/?=?̾3 ?=? ?=?İu?=?~?=?i?=?Ȕ!?=?ӫg!?=?6G-$?=?{'S&?=?((?=?aɽ*?=?Ά\+?=?F+?=?>9J+?=?=F+?=?Ά=\+?=?a=*?=?(>(?=?{'>S&?=?6G>-$?=?ӫg>!?=?Ȕ>!?=?>i?=?>~?=?İ>u?=?> ?=?>3 ?=? >/?=?Y>m>=?\!>\!>=?m>Y>=?/? >=?3 ?>=? ?>=?u?İ>=?~?>=?i?>=?!?Ȕ>=?!?ӫg>=?-$?6G>=?S&?{'>=?(?(>=?*?a==?\+?Ά==?F+?==?0?`L$Bh9?LO0? Bh9?!/?jBh9?.?5ϽBh9?l!-?Q Bh9?s;+?֐+Bh9?(?LBh9?4&?mBh9?#?Bh9??3Bh9?ȭ?lBh9?h?TBh9??#$ľBh9? ?NҾBh9?"t?߾Bh9?a?"Bh9?>Bh9?">aBh9?>"tBh9?N> Bh9?#$>Bh9?T>hBh9?l>ȭBh9?3>Bh9?>#Bh9?m>4&Bh9?L>(Bh9?֐+>s;+Bh9?Q >l!-Bh9?5=.Bh9?j=!/Bh9? =LO0Bh9?B$0Bh9? LO0Bh9?j!/Bh9?5Ͻ.Bh9?Q l!-Bh9?֐+s;+Bh9?L(Bh9?m4&Bh9?#Bh9?3Bh9?lȭBh9?ThBh9?#$ľBh9?NҾ Bh9?߾"tBh9?"aBh9?Bh9?a"Bh9?"t߾Bh9? NҾBh9?#$ľBh9?hTBh9?ȭlBh9?3Bh9?#Bh9?4&mBh9?(LBh9?s;+֐+Bh9?l!-Q Bh9?.5ϽBh9?!/jBh9?LO0 Bh9?08Bh9?LO0 =Bh9?!/j=Bh9?.5=Bh9?l!-Q >Bh9?s;+֐+>Bh9?(L>Bh9?4&m>Bh9?#>Bh9?3>Bh9?ȭl>Bh9?hT>Bh9?#$>Bh9? N>Bh9?"t>Bh9?a">Bh9?>Bh9?"a?Bh9?߾"t?Bh9?NҾ ?Bh9?#$ľ?Bh9?Th?Bh9?lȭ?Bh9?3?Bh9?#?Bh9?m4&?Bh9?L(?Bh9?֐+s;+?Bh9?Q l!-?Bh9?5Ͻ.?Bh9?j!/?Bh9? LO0?Bh9?!0?Bh9? =LO0?Bh9?j=!/?Bh9?5=.?Bh9?Q >l!-?Bh9?֐+>s;+?Bh9?L>(?Bh9?m>4&?Bh9?>#?Bh9?3>?Bh9?l>ȭ?Bh9?T>h?Bh9?#$>?Bh9?N> ?Bh9?>"t?Bh9?">a?Bh9?>>Bh9?a?">Bh9?"t?>Bh9? ?N>Bh9??#$>Bh9?h?T>Bh9?ȭ?l>Bh9??3>Bh9?#?>Bh9?4&?m>Bh9?(?L>Bh9?s;+?֐+>Bh9?l!-?Q >Bh9?.?5=Bh9?!/?j=Bh9?LO0? =Bh9?5?VG$5?!4?{5?%4?5?a3? }Խ5?1?B 5?+/?/5?9-?E0R5? p*?/s5?u='?ԋ5?#?ʚ5??򩪾5?C? 5??N#ɾ5?fe?׾5? ?Ƭ5?a ?\!5??5?\!>a 5?Ƭ> 5?>fe5?N#>5? >C5?>5?ʚ>#5?ԋ>u='5?/s> p*5?E0R>9-5?/>+/5?B >15? }=a35?=%45?{=!45?VG$55?{!45?%45? }Խa35?B 15?/+/5?E0R9-5?/s p*5?ԋu='5?ʚ#5?򩪾5? C5?N#ɾ5?׾fe5?Ƭ 5?\!a 5?5?a \!5? Ƭ5?fe׾5?N#ɾ5?C 5?򩪾5?#ʚ5?u='ԋ5? p*/s5?9-E0R5?+//5?1B 5?a3 }Խ5?%45?!4{5?5VG5?!4{=5?%4=5?a3 }=5?1B >5?+//>5?9-E0R>5? p*/s>5?u='ԋ>5?#ʚ>5?>5?C >5?N#>5?fe>5? Ƭ>5?a \!>5??5?\!a ?5?Ƭ ?5?׾fe?5?N#ɾ?5? C?5?򩪾?5?ʚ#?5?ԋu='?5?/s p*?5?E0R9-?5?/+/?5?B 1?5? }Խa3?5?%4?5?{!4?5?5?5?{=!4?5?=%4?5? }=a3?5?B >1?5?/>+/?5?E0R>9-?5?/s> p*?5?ԋ>u='?5?ʚ>#?5?>?5? >C?5?N#>?5?>fe?5?Ƭ> ?5?\!>a ?5???5?a ?\!>5? ?Ƭ>5?fe?>5??N#>5?C? >5??>5?#?ʚ>5?u='?ԋ>5? p*?/s>5?9-?E0R>5?+/?/>5?1?B >5?a3? }=5?%4?=5?!4?{=5?Bh9?B$0?/9?_0?8?|b0?f7?ٽ0??5?E0?3?340?vl1?HW0?.?y0?AK+?獾0?.'?+0?#?̮0?s?0?)?uξ0??ܾ0?^R?>뾻0?` ?0?L?L0?>` 0?>>^R0?>0?u>)0?>s0?̮>#0?+>.'0?>AK+0?y>.0?HW>vl10?34>30?E>?50?=f70?|b=80?_=/90?`L$Bh90?_/90?|b80?ٽf70?E?50?3430?HWvl10?y.0?獾AK+0?+.'0?̮#0?s0?uξ)0?ܾ0?>^R0?` 0?LL0?` 0?^R>뾻0?ܾ0?)uξ0?s0?#̮0?.'+0?AK+獾0?.y0?vl1HW0?3340??5E0?f7ٽ0?8|b0?/9_0?Bh9=OV0?/9_=0?8|b=0?f7=0??5E>0?334>0?vl1HW>0?.y>0?AK+>0?.'+>0?#̮>0?s>0?)u>0?>0?^R>>0?` >0?LL?0?` ?0?>^R?0?ܾ?0?uξ)?0?s?0?̮#?0?+.'?0?獾AK+?0?y.?0?HWvl1?0?343?0?E?5?0?ٽf7?0?|b8?0?_/9?0?aBh9?0?_=/9?0?|b=8?0?=f7?0?E>?5?0?34>3?0?HW>vl1?0?y>.?0?>AK+?0?+>.'?0?̮>#?0?>s?0?u>)?0?>?0?>>^R?0?>` ?0?L?L?0?` ?>0?^R?>>0??>0?)?u>0?s?>0?#?̮>0?.'?+>0?AK+?>0?.?y>0?vl1?HW>0?3?34>0??5?E>0?f7?=0?8?|b=0?/9?_=0?=?=$J+?{t=?J+?&/?n-J+?x+?F3J+?1I'?ղJ+?l"?þJ+?O?ҾJ+?Z?J+??J+?Ӌ ?mJ+?a ?a J+?m>Ӌ J+?>J+?>ZJ+?>OJ+?>l"J+?ղ>1I'J+?F3>x+J+?n->>/J+?>j2J+??\> 5J+?y[8>7J+?> :J+?=e;J+?弔=&/J+?F3x+J+?ղ1I'J+?þl"J+?ҾOJ+?ZJ+?𾘠J+?mӋ J+?a a J+?Ӌ mJ+?J+?ZJ+?OҾJ+?l"þJ+?1I'ղJ+?x+F3J+?>/n-J+?j2J+? 5?\J+?7y[8J+? :J+?e;޽J+?&<弔J+?{t=J+?=dJ+?{t==J+?&<弔=J+?e;=J+? :>J+?7y[8>J+? 5?\>J+?j2>J+?>/n->J+?x+F3>J+?1I'ղ>J+?l">J+?O>J+?Z>J+?>J+?Ӌ m>J+?a a ?J+?mӋ ?J+?𾘠?J+?Z?J+?ҾO?J+?þl"?J+?ղ1I'?J+?F3x+?J+?n->/?J+?j2?J+??\ 5?J+?y[87?J+? :?J+?޽e;?J+?弔& :?J+?y[8>7?J+??\> 5?J+?>j2?J+?n->>/?J+?F3>x+?J+?ղ>1I'?J+?>l"?J+?>O?J+?>Z?J+?>?J+?m>Ӌ ?J+?a ?a ?J+?Ӌ ?m>J+??>J+?Z?>J+?O?>J+?l"?>J+?1I'?ղ>J+?x+?F3>J+?>/?n->J+?j2?>J+? 5??\>J+?7?y[8>J+? :?>J+?e;?=J+?&?DV6'?B 6V6'?}>V6'?c>7-!V6'?P>MD&V6'?>*V6'?]¥>;/V6'?\>3V6'?>6V6'?a>9V6'?g<>B >V6'?W=T?V6'?]=|@V6'?K/=AV6'?U$pAV6'?K/AV6'?]|@V6'?WT?V6'?D>V6'?gDV6'?T?WV6'?|@]V6'?AK/V6'?pA1sV6'?AK/=V6'?|@]=V6'?T?W=V6'?>D>V6'?B <g<>V6'?9a>V6'?6>V6'?3\>V6'?;/]¥>V6'?*>V6'?MD&P>V6'?7-!c>V6'?}>V6'?6>V6'?I-?V6'?  ?V6'?-I?V6'?6?V6'?}澹?V6'?c׾7-!?V6'?PǾMD&?V6'?*?V6'?]¥;/?V6'?\3?V6'?񛂾6?V6'?a9?V6'?g?V6'?WT??V6'?]|@?V6'?K/A?V6'?\ pA?V6'?K/=A?V6'?]=|@?V6'?W=T??V6'?D>>?V6'?g<>B 9?V6'?>6?V6'?\>3?V6'?]¥>;/?V6'?>*?V6'?P>MD&?V6'?c>7-!?V6'?}>?V6'?>6?V6'?-?I?V6'? ? ?V6'?I?-?V6'?6?>V6'??}>V6'?7-!?c>V6'?MD&?P>V6'?*?>V6'?;/?]¥>V6'?3?\>V6'?6?>V6'?9?a>V6'?B V6'?>?D>V6'?T??W=V6'?|@?]=V6'?A?K/=V6'?E?#3$g"?E?N\g"?D?f,g"?C?J轙g"?B?mg"???U@g"?^=?Meg"?R:?Ug"?6?ug"?2?7g"?%.?g"?)?x˾g"?C$?d۾g"??E뾙g"??g"??/g"? ? g"?/?g"?>g"?E>g"?d>C$g"?x>)g"?>%.g"?7>2g"?u>6g"?U>R:g"?Me>^=g"?U@>?g"?m>Bg"?J=Cg"?f,=Dg"?N\=Eg"?aGZ$Eg"?N\Eg"?f,Dg"?J轲Cg"?mBg"?U@?g"?Me^=g"?UR:g"?u6g"?72g"?%.g"?x˾)g"?d۾C$g"?E뾁g"?g"?/g"? g"?/g"?g"?E뾙g"?C$d۾g"?)x˾g"?%.g"?27g"?6ug"?R:Ug"?^=Meg"??U@g"?Bmg"?CJ轙g"?Df,g"?EN\g"?E޵g"?EN\=g"?Df,=g"?CJ=g"?Bm>g"??U@>g"?^=Me>g"?R:U>g"?6u>g"?27>g"?%.>g"?)x>g"?C$d>g"?E>g"?>g"?/?g"? ?g"?/?g"??g"?E뾁?g"?d۾C$?g"?x˾)?g"?%.?g"?72?g"?u6?g"?UR:?g"?Me^=?g"?U@??g"?mB?g"?J轲C?g"?f,D?g"?N\E?g"?#E?g"?N\=E?g"?f,=D?g"?J=C?g"?m>B?g"?U@>??g"?Me>^=?g"?U>R:?g"?u>6?g"?7>2?g"?>%.?g"?x>)?g"?d>C$?g"?E>?g"?>?g"?/??g"? ? ?g"??/?g"??>g"??E>g"?C$?d>g"?)?x>g"?%.?>g"?2?7>g"?6?u>g"?R:?U>g"?^=?Me>g"???U@>g"?B?m>g"?C?J=g"?D?f,=g"?E?N\=g"?I?ܹ-$?גI?\q?JH?@?G??WE?l}?C?Z&D?d A?PVj?>??Mt:?v?p6?T?1?~E?-?OϾ?'?'??"?q???K?$???$?K???q>"?'?>'?O>-?~E>1?T>p6?v>Mt:?>>?PVj>d A?Z&D>C?l}>WE?=G?@=JH?\q=גI?^$I?\qגI?@JH?G?l}WE?Z&DC?PVjd A?>?vMt:?Tp6?~E1?OϾ-?'?'?q"??$K??K$??"q?''??-OϾ?1~E?p6T?Mt:v?>?d APVj?CZ&D?WEl}?G?JH@?גI\q?I?גI\q=?JH@=?G=?WEl}>?CZ&D>?d APVj>?>>?Mt:v>?p6T>?1~E>?-O>?''?>?"q>???K$????$K????q"??'?'??OϾ-??~E1??Tp6??vMt:??>??PVjd A??Z&DC??l}WE??G??@JH??\qגI??&I??\q=גI??@=JH??=G??l}>WE??Z&D>C??PVj>d A??>>??v>Mt:??T>p6??~E>1??O>-??'?>'??q>"?????$?K?????K?$?????"?q>?'?'?>?-?O>?1?~E>?p6?T>?Mt:?v>?>?>?d A?PVj>?C?Z&D>?WE?l}>?G?=?JH?@=?גI?\q=?M?5($?_M?m!?L?3<?EeK?]?I?ru ?|uG?G?dD?1n?A??=?'`?9?'ԯ?vW5??]0?kӾ?*?Uy? (%? ??q?Z?3 ?fe?fe?3 ?Z?q?? > (%?Uy>*?k>]0?>vW5?'ԯ>9?'`>=?>A?1n>dD?G>|uG?ru >I?]=EeK?3<=L?m!=_M?Db$M?m!_M?3?9'ԯ>?vW5>?]0k>?*Uy>? (% >?q??Z3 ??fefe??3 Z??q?? (%??Uy侼*??kӾ]0??vW5??'ԯ9??'`=??A??1ndD??G|uG??ru I??]EeK??3I??G>|uG??1n>dD??>A??'`>=??'ԯ>9??>vW5??k>]0??Uy>*?? > (%??q???3 ?Z??fe?fe??Z?3 ???q?? (%? >?*?Uy>?]0?k>?vW5?>?9?'ԯ>?=?'`>?A?>?dD?1n>?|uG?G>?I?ru >?EeK?]=?L?3<=?_M?m!=?=MQ?"$*h? Q?Q$*h?;KP? *h?M O?*h?GM?T#*h?zK?lK*h? JH?@s*h?E?*h?^A?N1*h?4=?*h?o8? Tž*h?)3?4׾*h?,.?H*h?(?\*h?!?*h?? *h??*h? ?*h??!*h?\>(*h?H>,.*h?4>)3*h? T>o8*h?>4=*h?N1>^A*h?>E*h?@s> JH*h?lK>zK*h?T#>GM*h?=M O*h? =;KP*h?Q$= Q*h?f$=MQ*h?Q$ Q*h? ;KP*h?M O*h?T#GM*h?lKzK*h?@s JH*h?E*h?N1^A*h?4=*h? Tžo8*h?4׾)3*h?H,.*h?\(*h?!*h? *h?*h? *h?!*h?(\*h?,.H*h?)34׾*h?o8 Tž*h?4=*h?^AN1*h?E*h? JH@s*h?zKlK*h?GMT#*h?M O*h?;KP *h? QQ$*h?=MQ*h? QQ$=*h?;KP =*h?M O=*h?GMT#>*h?zKlK>*h? JH@s>*h?E>*h?^AN1>*h?4=>*h?o8 T>*h?)34>*h?,.H>*h?(\>*h?!?*h? ?*h??*h? ?*h?!?*h?\(?*h?H,.?*h?4׾)3?*h? Tžo8?*h?4=?*h?N1^A?*h?E?*h?@s JH?*h?lKzK?*h?T#GM?*h?M O?*h? ;KP?*h?Q$ Q?*h?.&-=MQ?*h?Q$= Q?*h? =;KP?*h?=M O?*h?T#>GM?*h?lK>zK?*h?@s> JH?*h?>E?*h?N1>^A?*h?>4=?*h? T>o8?*h?4>)3?*h?H>,.?*h?\>(?*h??!?*h? ??*h???*h?? ?*h?!??*h?(?\>*h?,.?H>*h?)3?4>*h?o8? T>*h?4=?>*h?^A?N1>*h?E?>*h? JH?@s>*h?zK?lK>*h?GM?T#>*h?M O?=*h?;KP? =*h? Q?Q$=*h?1T?$9?T?'9?S?覽9?hR?&9?)P?&9?)zN?N9?ҰK?'w9?iH?k9?LD?颾9?tk@?9?;?Ⱦ9?6?%ھ9?0?^9?*?9?C$?9?O? 9??9? ?O9??C$9?>*9?^>09?%>69?>;9?>tk@9?>LD9?k>iH9?'w>ҰK9?N>)zN9?&>)P9?&=hR9?=S9?'=T9?Fj$1T9?'T9?覽S9?&hR9?&)P9?N)zN9?'wҰK9?kiH9?颾LD9?tk@9?Ⱦ;9?%ھ69?^09?*9?C$9? O9?9?O 9?C$9?*9?0^9?6%ھ9?;Ⱦ9?tk@9?LD颾9?iHk9?ҰK'w9?)zNN9?)P&9?hR&9?S覽9?T'9?1TX9?T'=9?S=9?hR&=9?)P&>9?)zNN>9?ҰK'w>9?iHk>9?LD>9?tk@>9?;>9?6%>9?0^>9?*>9?C$?9?O ?9??9? O?9?C$?9?*?9?^0?9?%ھ6?9?Ⱦ;?9?tk@?9?颾LD?9?kiH?9?'wҰK?9?N)zN?9?&)P?9?&hR?9?覽S?9?'T?9?01T?9?'=T?9?=S?9?&=hR?9?&>)P?9?N>)zN?9?'w>ҰK?9?k>iH?9?>LD?9?>tk@?9?>;?9?%>6?9?^>0?9?>*?9??C$?9? ?O?9???9?O? ?9?C$??9?*?>9?0?^>9?6?%>9?;?>9?tk@?>9?LD?>9?iH?k>9?ҰK?'w>9?)zN?N>9?)P?&>9?hR?&=9?S?=9?T?'=9?SHX?$?X?)?=W?\? U??p T?L(?Q?5R?/N?N"{?K? ?G??_C?򸾛?>?˾?9?b޾?3?Q?A-??K0'?K5 ?9A ???Q?Q???9A ?K5 ?K0'??A-?Q>3?b>9?>>?>_C?>G? >K?N"{>/N?5R>Q?L(>p T?= U?\==W?)=X?Ɛn$SHX?)X?\=W? U?L(p T?5RQ?N"{/N? K?G?_C?˾>?b޾9?Q3?A-?K5 K0'??9A ?QQ?9A ??K0'K5 ?A-?3Q?9b޾?>˾?_C򸾛?G?K ?/NN"{?Q5R?p TL(? U?=W\?X)?SHX?X)=?=W\=? U=?p TL(>?Q5R>?/NN"{>?K >?G>?_C>?>>?9b>?3Q>?A-??K0'K5 ??9A ???QQ???9A ??K5 K0'??A-??Q3??b޾9??˾>??_C??G?? K??N"{/N??5RQ??L(p T?? U??\=W??)X??2SHX??)=X??\==W??= U??L(>p T??5R>Q??N"{>/N?? >K??>G??>_C??>>??b>9??Q>3???A-??K5 ?K0'????9A ??Q?Q??9A ????K0'?K5 ??A-???3?Q>?9?b>?>?>?_C?>?G?>?K? >?/N?N"{>?Q?5R>?p T?L(>? U?=?=W?\=?X?)=?[?v+$=?dP[?'c,=?mZ?-=?3Y?=?\W?Y+=?T?iU=?R? ~=?,N?=?6J?=?#F?û=?A?gϾ=?V6=?>V<=?g>A=?û>#F=?>6J=?>,N=? ~>R=?iU>T=?Y+>\W=?>3Y=?-=mZ=?'c,=dP[=?|3r$[=?'c,dP[=?-mZ=?3Y=?Y+\W=?iUT=? ~R=?,N=?6J=?û#F=?gϾA=?ᾺV<=?󾨒6=?]0=?L )=?ul"=?CC=?l"u=?)L =?]0=?6=?V<=?AgϾ=?#Fû=?6J=?,N=?R ~=?TiU=?\WY+=?3Y=?mZ-=?dP['c,=?[=?dP['c,==?mZ-==?3Y>=?\WY+>=?TiU>=?R ~>=?,N>=?6J>=?#Fû>=?Ag>=?V<>=?6>=?]0?=?)L ?=?l"u?=?CC?=?ul"?=?L )?=?]0?=?󾨒6?=?ᾺV3Y?=?Y+>\W?=?iU>T?=? ~>R?=?>,N?=?>6J?=?û>#F?=?g>A?=?>V6?=??]0?=?L ?)?=?u?l"?=?C?C?=?l"?u?=?)?L ?=?]0??=?6?>=?V=?A?g>=?#F?û>=?6J?>=?,N?>=?R? ~>=?T?iU>=?\W?Y+>=?3Y?>=?mZ?-==?dP[?'c,==?^?. $']>Vy^?.']>r]?']>T\?y']>\vZ?-']>$X?|X']>&U?=Q']>Q?H']>zM?z']>L[I?x']>pD?Ѿ']>k ??[']>49?z']>2?']>.,?cN ']> %?']>?']>? %']>cN ?.,']>?2']>z>49']>[>k ?']>>pD']>x>L[I']>z>zM']>H>Q']>=Q>&U']>|X>$X']>->\vZ']>y>T\']>=r]']>.=Vy^']>ٰu$^']>.Vy^']>r]']>yT\']>-\vZ']>|X$X']>=Q&U']>HQ']>zzM']>xL[I']>ѾpD']>[k ?']>z49']>2']>cN .,']> %']>']> %']>.,cN ']>2']>49z']>k ?[']>pDѾ']>L[Ix']>zMz']>QH']>&U=Q']>$X|X']>\vZ-']>T\y']>r]']>Vy^.']>^']>Vy^.=']>r]=']>T\y>']>\vZ->']>$X|X>']>&U=Q>']>QH>']>zMz>']>L[Ix>']>pD>']>k ?[>']>49z>']>2?']>.,cN ?']> %?']>?']> %?']>cN .,?']>2?']>z49?']>[k ??']>ѾpD?']>xL[I?']>zzM?']>HQ?']>=Q&U?']>|X$X?']>-\vZ?']>yT\?']>r]?']>.Vy^?']>D8^?']>.=Vy^?']>=r]?']>y>T\?']>->\vZ?']>|X>$X?']>=Q>&U?']>H>Q?']>z>zM?']>x>L[I?']>>pD?']>[>k ??']>z>49?']>?2?']>cN ?.,?']>? %?']>??']> %??']>.,?cN ?']>2??']>49?z>']>k ??[>']>pD?>']>L[I?x>']>zM?z>']>Q?H>']>&U?=Q>']>$X?|X>']>\vZ?->']>T\?y>']>r]?=']>Vy^?.=']>a?T$Z>a??1Z>H`?= Z>T_?Z>o]?/0Z>x[?n[Z> X?Z>T?Z>P?]̬Z>hL?OZ>G?1ԾZ>A?#Z>;?>Z>vW5?}Z>%.?g:Z>1I'?~Z>?Z>~?1I'Z>g:?%.Z>}?vW5Z>>>;Z>#>AZ>1>GZ>O>hLZ>]̬>PZ>>TZ>> XZ>n[>x[Z>/0>o]Z>>T_Z>= =H`Z>?1=aZ>Sy$aZ>?1aZ>= H`Z>T_Z>/0o]Z>n[x[Z> XZ>TZ>]̬PZ>OhLZ>1ԾGZ>#辦AZ>>;Z>}vW5Z>g:%.Z>~1I'Z>Z>1I'~Z>%.g:Z>vW5}Z>;>Z>A#Z>G1ԾZ>hLOZ>P]̬Z>TZ> XZ>x[n[Z>o]/0Z>T_Z>H`= Z>a?1Z>a)zZ>a?1=Z>H`= =Z>T_>Z>o]/0>Z>x[n[>Z> X>Z>T>Z>P]̬>Z>hLO>Z>G1>Z>A#>Z>;>>Z>vW5}?Z>%.g:?Z>1I'~?Z>?Z>~1I'?Z>g:%.?Z>}vW5?Z>>;?Z>#辦A?Z>1ԾG?Z>OhL?Z>]̬P?Z>T?Z> X?Z>n[x[?Z>/0o]?Z>T_?Z>= H`?Z>?1a?Z>>:a?Z>?1=a?Z>= =H`?Z>>T_?Z>/0>o]?Z>n[>x[?Z>> X?Z>>T?Z>]̬>P?Z>O>hL?Z>1>G?Z>#>A?Z>>>;?Z>}?vW5?Z>g:?%.?Z>~?1I'?Z>??Z>1I'?~?Z>%.?g:?Z>vW5?}?Z>;?>>Z>A?#>Z>G?1>Z>hL?O>Z>P?]̬>Z>T?>Z> X?>Z>x[?n[>Z>o]?/0>Z>T_?>Z>H`?= =Z>a??1=Z>Yd?#u3>cd?s3u3>xc?Nu3>0b?p5u3>E`?q2u3>]?>^u3>Z?u3>oLW?u3>bBS?Pu3> N?þu3>7I?׾u3>"D?su3> >?Tu3>q7?A7u3>0?Vu3>n)?u3>ݰ!?ݰ!u3>?n)u3>V?0u3>A7?q7u3>T> >u3>s>"Du3>>7Iu3>> Nu3>P>bBSu3>>oLWu3>>Zu3>>^>]u3>q2>E`u3>p5>0bu3>N=xcu3>s3=cdu3>f9|$Ydu3>s3cdu3>Nxcu3>p50bu3>q2E`u3>>^]u3>Zu3>oLWu3>PbBSu3>þ Nu3>׾7Iu3>s"Du3>T >u3>A7q7u3>V0u3>n)u3>ݰ!ݰ!u3>n)u3>0Vu3>q7A7u3> >Tu3>"Dsu3>7I׾u3> Nþu3>bBSPu3>oLWu3>Zu3>]>^u3>E`q2u3>0bp5u3>xcNu3>cds3u3>Ydu3>cds3=u3>xcN=u3>0bp5>u3>E`q2>u3>]>^>u3>Z>u3>oLW>u3>bBSP>u3> N>u3>7I>u3>"Ds>u3> >T>u3>q7A7?u3>0V?u3>n)?u3>ݰ!ݰ!?u3>n)?u3>V0?u3>A7q7?u3>T >?u3>s"D?u3>׾7I?u3>þ N?u3>PbBS?u3>oLW?u3>Z?u3>>^]?u3>q2E`?u3>p50b?u3>Nxc?u3>s3cd?u3> +=Yd?u3>s3=cd?u3>N=xc?u3>p5>0b?u3>q2>E`?u3>>^>]?u3>>Z?u3>>oLW?u3>P>bBS?u3>> N?u3>>7I?u3>s>"D?u3>T> >?u3>A7?q7?u3>V?0?u3>?n)?u3>ݰ!?ݰ!?u3>n)??u3>0?V?u3>q7?A7?u3> >?T>u3>"D?s>u3>7I?>u3> N?>u3>bBS?P>u3>oLW?>u3>Z?>u3>]?>^>u3>E`?q2>u3>0b?p5>u3>xc?N=u3>cd?s3=u3>kg?5v#>{$g?R5>Nf?Lw>d?>}b?4>a|`?Q`>t]?)[>Y?L훾>,U?F>3Q?ž>hL?.ھ>#F?>tk@?>9? >2?>x+?i>#?#>i?x+>?2> ?9>?tk@>>#F>.>hL>>3Q>F>,U>L>Y>)[>t]>Q`>a|`>4>}b>>d>Lw=Nf>R5={$g>C$kg>R5{$g>LwNf>d>4}b>Q`a|`>)[t]>L훾Y>F,U>ž3Q>.ھhL>#F>tk@> 9>2>ix+>##>x+i>2>9 >tk@>#F>hL.ھ>3Qž>,UF>YL훾>t])[>a|`Q`>}b4>d>NfLw>{$gR5>kg¤>{$gR5=>NfLw=>d>>}b4>>a|`Q`>>t])[>>YL>>,UF>>3Q>>hL.>>#F>>tk@?>9 ?>2?>x+i?>##?>ix+?>2?> 9?>tk@?>#F?>.ھhL?>ž3Q?>F,U?>L훾Y?>)[t]?>Q`a|`?>4}b?>d?>LwNf?>R5{$g?>r?kg?>R5={$g?>Lw=Nf?>>d?>4>}b?>Q`>a|`?>)[>t]?>L>Y?>F>,U?>>3Q?>.>hL?>>#F?>?tk@?> ?9?>?2?>i?x+?>#?#?>x+?i?>2??>9? ?>tk@??>#F?>>hL?.>>3Q?>>,U?F>>Y?L>>t]?)[>>a|`?Q`>>}b?4>>d?>>Nf?Lw=>{$g?R5=> j?+#{>{i?-7{>&h?{>-g?\ {>me?K6{>c?Qwc{>_?{>X[\?{>8X?{>LS? Ⱦ{>gN?3ܾ{>H?{>aB?>{>;?j {>4?x{>i-?+{>Y}%?Y}%{>+?i-{>x?4{>j ?;{>>?aB{>>H{>3>gN{> >LS{>>8X{>>X[\{>>_{>Qwc>c{>K6>me{>\ >-g{>=&h{>-7={i{>3$ j{>-7{i{>&h{>\ -g{>K6me{>Qwcc{>_{>X[\{>8X{> ȾLS{>3ܾgN{>𾧽H{>>aB{>j ;{>x4{>+i-{>Y}%Y}%{>i-+{>4x{>;j {>aB>{>H{>gN3ܾ{>LS Ⱦ{>8X{>X[\{>_{>cQwc{>meK6{>-g\ {>&h{>{i-7{> jZȤ{>{i-7={>&h={>-g\ >{>meK6>{>cQwc>{>_>{>X[\>{>8X>{>LS >{>gN3>{>H>{>aB>?{>;j ?{>4x?{>i-+?{>Y}%Y}%?{>+i-?{>x4?{>j ;?{>>aB?{>𾧽H?{>3ܾgN?{> ȾLS?{>8X?{>X[\?{>_?{>Qwcc?{>K6me?{>\ -g?{>&h?{>-7{i?{>̜A j?{>-7={i?{>=&h?{>\ >-g?{>K6>me?{>Qwc>c?{>>_?{>>X[\?{>>8X?{> >LS?{>3>gN?{>>H?{>>?aB?{>j ?;?{>x?4?{>+?i-?{>Y}%?Y}%?{>i-?+?{>4?x?{>;?j ?{>aB?>?{>H?>{>gN?3>{>LS? >{>8X?>{>X[\?>{>_?>{>c?Qwc>{>me?K6>{>-g?\ >{>&h?={>{i?-7={>^l?#>p:l?9>_k?qu> i? >g?Ӑ8>le?>e>8Tb?O>^?[>zZ?>,U?>ʾ>P?޾>6J?#/>LD?Qf>=? >6? >>/?!>u='?u='>!?>/> ?6> ?=>Qf?LD>#/>6J>>P>>>,U>>zZ>[>^>O>8Tb>>e>le>Ӑ8>g> > i>qu=_k>9=p:l>p$^l>9p:l>qu_k> i>Ӑ8g>>ele>O8Tb>[^>zZ>>ʾ,U>޾P>#/6J>QfLD> => 6>!>/>u='u='>>/!>6 >= >LDQf>6J#/>P޾>,U>ʾ>zZ>^[>8TbO>le>e>gӐ8> i >_kqu>p:l9>^lΤ>p:l9=>_kqu=> i >>gӐ8>>le>e>>8TbO>>^[>>zZ>>,U>>>P>>6J#/>>LDQf?>= ?>6 ?>>/!?>u='u='?>!>/?> 6?> =?>QfLD?>#/6J?>޾P?>>ʾ,U?>zZ?>[^?>O8Tb?>>ele?>Ӑ8g?> i?>qu_k?>9p:l?>C^l?>9=p:l?>qu=_k?> > i?>Ӑ8>g?>>e>le?>O>8Tb?>[>^?>>zZ?>>>,U?>>P?>#/>6J?>Qf?LD?> ?=?> ?6?>!?>/?>u='?u='?>>/?!?>6? ?>=? ?>LD?Qf?>6J?#/>>P?>>,U?>>>zZ?>>^?[>>8Tb?O>>le?>e>>g?Ӑ8>> i? >>_k?qu=>p:l?9=>n?/@#*D>n?;*D>0m?I*D>Bl?/ *D>Aj?b:*D>0g?#h*D>d?*D>Z`?*D>B\?ζ*D>W?b=̾*D>R?.*D>}L?;*D>F?!*D>??G*D>m8?*D>,0?7f *D>(?(*D>7f ?,0*D>?m8*D>G??*D>!?F*D>;>}L*D>.>R*D>b=>W*D>ζ>B\*D>>Z`*D>>d*D>#h>0g*D>b:>Aj*D>/ >Bl*D>I=0m*D>;=n*D>$n*D>;n*D>I0m*D>/ Bl*D>b:Aj*D>#h0g*D>d*D>Z`*D>ζB\*D>b=̾W*D>.᾽R*D>;}L*D>!F*D>G?*D>m8*D>7f ,0*D>((*D>,07f *D>m8*D>?G*D>F!*D>}L;*D>R.*D>Wb=̾*D>B\ζ*D>Z`*D>d*D>0g#h*D>Ajb:*D>Bl/ *D>0mI*D>n;*D>n#Ԥ*D>n;=*D>0mI=*D>Bl/ >*D>Ajb:>*D>0g#h>*D>d>*D>Z`>*D>B\ζ>*D>Wb=>*D>R.>*D>}L;>*D>F!?*D>?G?*D>m8?*D>,07f ?*D>((?*D>7f ,0?*D>m8?*D>G??*D>!F?*D>;}L?*D>.᾽R?*D>b=̾W?*D>ζB\?*D>Z`?*D>d?*D>#h0g?*D>b:Aj?*D>/ Bl?*D>I0m?*D>;n?*D>#En?*D>;=n?*D>I=0m?*D>/ >Bl?*D>b:>Aj?*D>#h>0g?*D>>d?*D>>Z`?*D>ζ>B\?*D>b=>W?*D>.>R?*D>;>}L?*D>!?F?*D>G???*D>?m8?*D>7f ?,0?*D>(?(?*D>,0?7f ?*D>m8??*D>??G?*D>F?!?*D>}L?;>*D>R?.>*D>W?b=>*D>B\?ζ>*D>Z`?>*D>d?>*D>0g?#h>*D>Aj?b:>*D>Bl?/ >*D>0m?I=*D>n?;=*D> q?0B#|>p?;=|>o?5|>+mn? x |>cgl?8<|>i?fDj|> f? |>b?g|>^?z|>Y?ξ|>T??|>,N?t|>iH?{|>A?|>R:?B|>j2?!|> p*? p*|>!?j2|>B?R:|>?A|>{?iH|>t>,N|>?>T|>>Y|>z>^|>g>b|> > f|>fDj>i|>8<>cgl|> x >+mn|>5=o|>;==p|>+$ q|>;=p|>5o|> x +mn|>8fDji|> f|>gb|>z^|>ξY|>?T|>t,N|>{iH|>A|>BR:|>!j2|> p* p*|>j2!|>R:B|>A|>iH{|>,Nt|>T?|>Yξ|>^z|>bg|> f |>ifDj|>cgl8<|>+mn x |>o5|>p;=|> qMڤ|>p;==|>o5=|>+mn x >|>cgl8<>|>ifDj>|> f >|>bg>|>^z>|>Y>|>T?>|>,Nt>|>iH{?|>A?|>R:B?|>j2!?|> p* p*?|>!j2?|>BR:?|>A?|>{iH?|>t,N?|>?T?|>ξY?|>z^?|>gb?|> f?|>fDji?|>8 x +mn?|>5o?|>;=p?|>fG q?|>;==p?|>5=o?|> x >+mn?|>8<>cgl?|>fDj>i?|> > f?|>g>b?|>z>^?|>>Y?|>?>T?|>t>,N?|>{?iH?|>?A?|>B?R:?|>!?j2?|> p*? p*?|>j2?!?|>R:?B?|>A??|>iH?{?|>,N?t>|>T??>|>Y?>|>^?z>|>b?g>|> f? >|>i?fDj>|>cgl?8<>|>+mn? x >|>o?5=|>p?;==|>Gs?&#嚠>Rr?Z>嚠>q?嚠>rp?$嚠>hn?=嚠>`k?@l嚠>h?嚠>d?'ȣ嚠>o`?v 嚠>[? Ͼ嚠>q`V?j,嚠>~P?u嚠>J?. 嚠>9>C?X嚠>;?45嚠>4?=#嚠> +? +嚠>=#?4嚠>45?;嚠>X?9>C嚠>. ?J嚠>u>~P嚠>j,>q`V嚠> >[嚠>v >o`嚠>'ȣ>d嚠>>h嚠>@l>`k嚠>=>hn嚠>$>rp嚠>=q嚠>Z>=Rr嚠>$Gs嚠>Z>Rr嚠>q嚠>$rp嚠>=hn嚠>@l`k嚠>h嚠>'ȣd嚠>v o`嚠> Ͼ[嚠>j,q`V嚠>u~P嚠>. J嚠>X9>C嚠>45;嚠>=#4嚠> + +嚠>4=#嚠>;45嚠>9>CX嚠>J. 嚠>~Pu嚠>q`Vj,嚠>[ Ͼ嚠>o`v 嚠>d'ȣ嚠>h嚠>`k@l嚠>hn=嚠>rp$嚠>q嚠>RrZ>嚠>Gsߤ嚠>RrZ>=嚠>q=嚠>rp$>嚠>hn=>嚠>`k@l>嚠>h>嚠>d'ȣ>嚠>o`v >嚠>[ >嚠>q`Vj,>嚠>~Pu>嚠>J. ?嚠>9>CX?嚠>;45?嚠>4=#?嚠> + +?嚠>=#4?嚠>45;?嚠>X9>C?嚠>. J?嚠>u~P?嚠>j,q`V?嚠> Ͼ[?嚠>v o`?嚠>'ȣd?嚠>h?嚠>@l`k?嚠>=hn?嚠>$rp?嚠>q?嚠>Z>Rr?嚠>IGs?嚠>Z>=Rr?嚠>=q?嚠>$>rp?嚠>=>hn?嚠>@l>`k?嚠>>h?嚠>'ȣ>d?嚠>v >o`?嚠> >[?嚠>j,>q`V?嚠>u>~P?嚠>. ?J?嚠>X?9>C?嚠>45?;?嚠>=#?4?嚠> +? +?嚠>4?=#?嚠>;?45?嚠>9>C?X?嚠>J?. ?嚠>~P?u>嚠>q`V?j,>嚠>[? >嚠>o`?v >嚠>d?'ȣ>嚠>h?>嚠>`k?@l>嚠>hn?=>嚠>rp?$>嚠>q?=嚠>Rr?Z>=嚠> t?3#1>t?S@1>s?i1>BSr??1>Ep?+?1>m?n1>mj?91> f?s1>8Tb?@1>t]?k{Ѿ1> X?d1>R?1>ҰK?1>dD?1>^=?^i1> 5?-$1>9-?9-1>-$? 51>^i?^=1>?dD1>?ҰK1>>R1>d> X1>k{>t]1>@>8Tb1>s> f1>9>mj1>n>m1>+?>Ep1>?>BSr1>i=s1>S@=t1>$ t1>S@t1>is1>?BSr1>+?Ep1>nm1>9mj1>s f1>@8Tb1>k{Ѿt]1>d X1>R1>ҰK1>dD1>^i^=1>-$ 51>9-9-1> 5-$1>^=^i1>dD1>ҰK1>R1> Xd1>t]k{Ѿ1>8Tb@1> fs1>mj91>mn1>Ep+?1>BSr?1>si1>tS@1> tA;1>tS@=1>si=1>BSr?>1>Ep+?>1>mn>1>mj9>1> fs>1>8Tb@>1>t]k{>1> Xd>1>R>1>ҰK?1>dD?1>^=^i?1> 5-$?1>9-9-?1>-$ 5?1>^i^=?1>dD?1>ҰK?1>R?1>d X?1>k{Ѿt]?1>@8Tb?1>s f?1>9mj?1>nm?1>+?Ep?1>?BSr?1>is?1>S@t?1>zJ t?1>S@=t?1>i=s?1>?>BSr?1>+?>Ep?1>n>m?1>9>mj?1>s> f?1>@>8Tb?1>k{>t]?1>d> X?1>>R?1>?ҰK?1>?dD?1>^i?^=?1>-$? 5?1>9-?9-?1> 5?-$?1>^=?^i?1>dD??1>ҰK??1>R?>1> X?d>1>t]?k{>1>8Tb?@>1> f?s>1>mj?9>1>m?n>1>Ep?+?>1>BSr??>1>s?i=1>t?S@=1>v?C#>mv?lA>u?w>et?->cq?4@>$Uo?|o>Kl?=>Mh?K=>c? ּ> _?~Ҿ>Y?输>S?>O%M? >7,F?>>?>6?%>Lv.?Lv.>%?6>?>>?7,F> ?O%M>>S>>Y>~> _> ּ>c>K=>Mh>=>Kl>|o>$Uo>4@>cq>->et>w=u>lA=mv>$v>lAmv>wu>-et>4@cq>|o$Uo>=Kl>K=Mh> ּc>~Ҿ _>Y>S> O%M>7,F>>>%6>Lv.Lv.>6%>>>7,F>O%M >S>Y输> _~Ҿ>c ּ>MhK=>Kl=>$Uo|o>cq4@>et->uw>mvlA>va}ꤓ>mvlA=>uw=>et->>cq4@>>$Uo|o>>Kl=>>MhK=>>c ּ>> _~>>Y>>S>>O%M ?>7,F?>>?>6%?>Lv.Lv.?>%6?>>?>7,F?> O%M?>S?>Y?>~Ҿ _?> ּc?>K=Mh?>=Kl?>|o$Uo?>4@cq?>-et?>wu?>lAmv?>Lv?>lA=mv?>w=u?>->et?>4@>cq?>|o>$Uo?>=>Kl?>K=>Mh?> ּ>c?>~> _?>>Y?>>S?> ?O%M?>?7,F?>?>?>%?6?>Lv.?Lv.?>6?%?>>??>7,F??>O%M? ?>S?>>Y?>> _?~>>c? ּ>>Mh?K=>>Kl?=>>$Uo?|o>>cq?4@>>et?->>u?w=>mv?lA=>Sx?9#x>ex?BBx>!w?$½x>u?ȿx>ss?Ax>p?Zqx>m?+x>i?Qx>le?x>a|`? YԾx>x[?=x>T? Ux>)zN? x>|uG?x>??x>7?S&x>+/?+/x>S&?7x>??x>?|uGx> ?)zNx> U>Tx>=>x[x> Y>a|`x>>lex>Q>ix>+>mx>Zq>px>A>ssx>ȿ>ux>$=!wx>BB=exx>$Sxx>BBexx>$½!wx>ȿux>Assx>Zqpx>+mx>Qix>lex> YԾa|`x>=x[x> UTx> )zNx>|uGx>?x>S&7x>+/+/x>7S&x>?x>|uGx>)zN x>T Ux>x[=x>a|` YԾx>lex>iQx>m+x>pZqx>ssAx>uȿx>!w$½x>exBBx>SxXx>exBB=x>!w$=x>uȿ>x>ssA>x>pZq>x>m+>x>iQ>x>le>x>a|` Y>x>x[=>x>T U>x>)zN ?x>|uG?x>??x>7S&?x>+/+/?x>S&7?x>??x>|uG?x> )zN?x> UT?x>=x[?x> YԾa|`?x>le?x>Qi?x>+m?x>Zqp?x>Ass?x>ȿu?x>$½!w?x>BBex?x>7oMSx?x>BB=ex?x>$=!w?x>ȿ>u?x>A>ss?x>Zq>p?x>+>m?x>Q>i?x>>le?x> Y>a|`?x>=>x[?x> U>T?x> ?)zN?x>?|uG?x>???x>S&?7?x>+/?+/?x>7?S&?x>???x>|uG??x>)zN? ?x>T? U>x>x[?=>x>a|`? Y>x>le?>x>i?Q>x>m?+>x>p?Zq>x>ss?A>x>u?ȿ>x>!w?$=x>ex?BB=x>y?yw#\`>zy?D\`>x?ý\`>w?\`>t?B\`>NKr? r\`>9o?\`>-k?K\`>2f?S,\`>Xa?֖վ\`>E>V?i\`>,O?+ \`>H?+\`>A?fu\`>9?'\`>0?0\`>'?9\`>fu?A\`>+?H\`>+ ?,O\`>i?E>V\`>}>֖>Xa\`>S,>2f\`>K>-k\`>>9o\`> r>NKr\`>B>t\`>>w\`>=x\`>D=zy\`>$y\`>Dzy\`>ýx\`>w\`>Bt\`> rNKr\`>9o\`>K-k\`>S,2f\`>֖վXa\`>}iE>V\`>+ ,O\`>+H\`>fuA\`>'9\`>00\`>9'\`>Afu\`>H+\`>,O+ \`>E>Vi\`>Xa֖վ\`>2fS,\`>-kK\`>9o\`>NKr r\`>tB\`>w\`>xý\`>zyD\`>y\\`>zyD=\`>x=\`>w>\`>tB>\`>NKr r>\`>9o>\`>-kK>\`>2fS,>\`>Xa֖>\`>\`>E>Vi?\`>,O+ ?\`>H+?\`>Afu?\`>9'?\`>00?\`>'9?\`>fuA?\`>+H?\`>+ ,O?\`>iE>V?\`>}֖վXa?\`>S,2f?\`>K-k?\`>9o?\`> rNKr?\`>Bt?\`>w?\`>ýx?\`>Dzy?\`>Ny?\`>D=zy?\`>=x?\`>>w?\`>B>t?\`> r>NKr?\`>>9o?\`>K>-k?\`>S,>2f?\`>֖>Xa?\`>}>i?E>V?\`>+ ?,O?\`>+?H?\`>fu?A?\`>'?9?\`>0?0?\`>9?'?\`>A?fu?\`>H?+?\`>,O?+ ?\`>E>V?i?\`>\`>Xa?֖>\`>2f?S,>\`>-k?K>\`>9o?>\`>NKr? r>\`>t?B>\`>w?>\`>x?=\`>zy?D=\`>{?Z\#G>Rz?EG> ]x?n]G>Av?CG>ss?tG>Ep?őG>cgl?^,G>g?J+G>}b?־G>o]?G>\W?G>)P??~ G>I?G>B?HG> :?(G>1?1G>(? :G>H?BG>?IG>?~ ?)PG>?\WG>>o]G>>}bG>J+>gG>^,>cglG>ő>EpG>t>ssG>C>AvG>n]> ]xG>=E=RzG>y${G>ERzG>Ľn] ]xG>CAvG>tssG>őEpG>^,cglG>J+gG>־}bG>o]G>\WG>?~ )PG>IG>HBG>( :G>11G> :(G>BHG>IG>)P?~ G>\WG>o]G>}b־G>gJ+G>cgl^,G>EpőG>sstG>AvCG> ]xn]G>RzEG>{gG>RzE=G> ]xn]>G>AvC>G>sst>G>Epő>G>cgl^,>G>gJ+>G>}b>G>o]>G>\W?G>)P?~ ?G>I?G>BH?G> :(?G>11?G>( :?G>HB?G>I?G>?~ )P?G>\W?G>o]?G>־}b?G>J+g?G>^,cgl?G>őEp?G>tss?G>CAv?G>n] ]x?G>ĽERz?G>AO{?G>E=Rz?G>=n]> ]x?G>C>Av?G>t>ss?G>ő>Ep?G>^,>cgl?G>J+>g?G>>}b?G>>o]?G>?\W?G>?~ ?)P?G>?I?G>H?B?G>(? :?G>1?1?G> :?(?G>B?H?G>I??G>)P??~ ?G>\W??G>o]?>G>}b?>G>g?J+>G>cgl?^,>G>Ep?ő>G>ss?t>G>Av?C>G> ]x?n]>G>Rz?E=G>(;|?A#/>`{?F/>:{?Ž/>Ey?: />pbw?D/> t? &u/>^q? p/>|m?򩾢/>i? />d?t׾/>r^?D/>XX?5/>Q?! /> J?@/>.B? />:?Vc)/>Z2?Z2/>Vc)?:/> ?.B/>@? J/>! ?Q/>5?XX/>D>r^/>t>d/> >i/>>|m/> p>^q/> &u> t/>D>pbw/>: >Ey/>=:{/>F=`{/>$(;|/>F`{/>Ž:{/>: Ey/>Dpbw/> &u t/> p^q/>򩾗|m/> i/>t׾d/>Dr^/>5XX/>! Q/>@ J/> .B/>Vc):/>Z2Z2/>:Vc)/>.B /> J@/>Q! />XX5/>r^D/>dt׾/>i />|m򩾢/>^q p/> t &u/>pbwD/>Ey: />:{Ž/>`{F/>(;|/>`{F=/>:{=/>Ey: >/>pbwD>/> t &u>/>^q p>/>|m>/>i >/>dt>/>r^D>/>XX5?/>Q! ?/> J@?/>.B ?/>:Vc)?/>Z2Z2?/>Vc):?/> .B?/>@ J?/>! Q?/>5XX?/>Dr^?/>t׾d?/> i?/>򩾗|m?/> p^q?/> &u t?/>Dpbw?/>: Ey?/>Ž:{?/>F`{?/>ЩP(;|?/>F=`{?/>=:{?/>: >Ey?/>D>pbw?/> &u> t?/> p>^q?/>>|m?/> >i?/>t>d?/>D>r^?/>5?XX?/>! ?Q?/>@? J?/> ?.B?/>Vc)?:?/>Z2?Z2?/>:?Vc)?/>.B? ?/> J?@?/>Q?! ?/>XX?5?/>r^?D>/>d?t>/>i? >/>|m?>/>^q? p>/> t? &u>/>pbw?D>/>Ey?: >/>:{?=/>`{?F=/>:}?i%#@>|?NF@>|?ƽ@>}z?1@> ]x?:E@>u?cv@>BSr?a@>+mn?垪@> i?0@>d?ؾ@>T_?*@>3Y?/@>hR?ů @>EeK?4@>C? @>e;?*@>a3?a3@>*?e;@> ?C@>4?EeK@>ů ?hR@>/?3Y@>*>T_@>>d@>0> i@>垪>+mn@>a>BSr@>cv>u@>:E> ]x@>1>}z@>=|@>NF=|@>̨$:}@>NF|@>ƽ|@>1}z@>:E ]x@>cvu@>aBSr@>垪+mn@>0 i@>ؾd@>*T_@>/3Y@>ů hR@>4EeK@> C@>*e;@>a3a3@>e;*@>C @>EeK4@>hRů @>3Y/@>T_*@>dؾ@> i0@>+mn垪@>BSra@>ucv@> ]x:E@>}z1@>|ƽ@>|NF@>:}M@>|NF=@>|=@>}z1>@> ]x:E>@>ucv>@>BSra>@>+mn垪>@> i0>@>d>@>T_*>@>3Y/?@>hRů ?@>EeK4?@>C ?@>e;*?@>a3a3?@>*e;?@> C?@>4EeK?@>ů hR?@>/3Y?@>*T_?@>ؾd?@>0 i?@>垪+mn?@>aBSr?@>cvu?@>:E ]x?@>1}z?@>ƽ|?@>NF|?@>2}Q:}?@>NF=|?@>=|?@>1>}z?@>:E> ]x?@>cv>u?@>a>BSr?@>垪>+mn?@>0> i?@>>d?@>*>T_?@>/?3Y?@>ů ?hR?@>4?EeK?@> ?C?@>*?e;?@>a3?a3?@>e;?*?@>C? ?@>EeK?4?@>hR?ů ?@>3Y?/?@>T_?*>@>d?>@> i?0>@>+mn?垪>@>BSr?a>@>u?cv>@> ]x?:E>@>}z?1>@>|?=@>|?NF=@>$~?KC #s=}?@xGs=|?:ǽs=%S{?>s=Z1y?&EFs=uv?vs=g"s?s=8o?0s=j?u¾s=Me? Cپs=`??s=\Y?۞s=eAS?( s=$L?'Zs=gD?.!s=A`s= C>Mes=u>js=0>8os=>g"ss=v>uvs=&EF>Z1ys=>>%S{s=:=|s=@xG=}s=. $$~s=@xG}s=:ǽ|s=>%S{s=&EFZ1ys=vuvs=g"ss=08os=u¾js= CپMes=?`s=۞\Ys=( eASs='Z$Ls=.!gDs=M*As=|:ǽs=}@xGs=$~{s=}@xG=s=|:=s=%S{>>s=Z1y&EF>s=uvv>s=g"s>s=8o0>s=ju>s=Me C>s=`?>s=\Y۞?s=eAS( ?s=$L'Z?s=gD.!?s=A%S{?s=:ǽ|?s=@xG}?s=E0R$~?s=@xG=}?s=:=|?s=>>%S{?s=&EF>Z1y?s=v>uv?s=>g"s?s=0>8o?s=u>j?s= C>Me?s=?>`?s=۞?\Y?s=( ?eAS?s='Z?$L?s=.!?gD?s=M*?As=Me? C>s=j?u>s=8o?0>s=g"s?>s=uv?v>s=Z1y?&EF>s=%S{?>>s=|?:=s=}?@xG=s=m~?k"6=u~?oH6=_}?ǽ6=|?L6=H`6=>Nf6=>_k6=3>o6=>s6=w>!w6=F>|6==_}6=oH=u~6=$m~6=oHu~6=ǽ_}6=L|6=F6=6=!ww>6=s>6=o3>6=_k>6=Nf>6=H`d1>6=mZ?6=S ?6=L?6=Dg!?6=&<\+?6=%4%4?6=\+&|?6=F>!w?6=>s?6=3>o?6=>_k?6=>Nf?6=d1>H`?6=?mZ?6= ?S?6=?L?6=g!?D?6=\+?&6=Nf?>6=_k?>6=o?3>6=s?>6=!w?w>6=6=|?L>6=_}?=6=u~?oH=6=mN?."=~?oH=~?1Ƚ=|?K=fz?0;G=w?6#x=Pt?9=ap?/=Pk?-gþ=Rf?Pھ=(a?=Z?@=GT?2 =bM?=ZE?!=f+=? t+=c4?c4= t+?f+==!?ZE=?bM=2 ?GT=@?Z=>(a=P>Rf=-g>Pk=/>ap=9>Pt=6#x>w=0;G>fz=K>|=1=~=oH=~=Ό$mN=oH~=1Ƚ~=K|=0;Gfz=6#xw=9Pt=/ap=-gþPk=PھRf=(a=@Z=2 GT=bM=!ZE= t+f+==c4c4=f+= t+=ZE!=bM=GT2 =Z@=(a=RfPھ=Pk-gþ=ap/=Pt9=w6#x=fz0;G=|K=~1Ƚ=~oH=mN=~oH==~1==|K>=fz0;G>=w6#x>=Pt9>=ap/>=Pk-g>=RfP>=(a>=Z@?=GT2 ?=bM?=ZE!?=f+= t+?=c4c4?= t+f+=?=!ZE?=bM?=2 GT?=@Z?=(a?=PھRf?=-gþPk?=/ap?=9Pt?=6#xw?=0;Gfz?=K|?=1Ƚ~?=oH~?=5SmN?=oH=~?=1=~?=K>|?=0;G>fz?=6#x>w?=9>Pt?=/>ap?=-g>Pk?=P>Rf?=>(a?=@?Z?=2 ?GT?=?bM?=!?ZE?= t+?f+=?=c4?c4?=f+=? t+?=ZE?!?=bM??=GT?2 ?=Z?@?=(a?>=Rf?P>=Pk?-g>=ap?/>=Pt?9>=w?6#x>=fz?0;G>=|?K>=~?1==~?oH==?]"0H=7b?6H0H=u~?OȽ0H=|?.0H=Rz?(G0H=ex?x0H=t?]r0H=p?G0H=p:l?þ0H={$g?ھ0H=a?}0H=dP[?s0H=T? 0H=_M?P0H=E?5"0H={t=?F+0H=!4?!40H=F+?{t=0H=5"?E0H=P?_M0H= ?T0H=s?dP[0H=}>a0H=>{$g0H=>p:l0H=G>p0H=]r>t0H=x>ex0H=(G>Rz0H=.>|0H=O=u~0H=6H=7b0H=w$0H=6H7b0H=OȽu~0H=.|0H=(GRz0H=xex0H=]rt0H=Gp0H=þp:l0H=ھ{$g0H=}a0H=sdP[0H= T0H=P_M0H=5"E0H=F+{t=0H=!4!40H={t=F+0H=E5"0H=_MP0H=T 0H=dP[s0H=a}0H={$gھ0H=p:lþ0H=pG0H=t]r0H=exx0H=Rz(G0H=|.0H=u~OȽ0H=7b6H0H= 0H=7b6H=0H=u~O=0H=|.>0H=Rz(G>0H=exx>0H=t]r>0H=pG>0H=p:l>0H={$g>0H=a}>0H=dP[s?0H=T ?0H=_MP?0H=E5"?0H={t=F+?0H=!4!4?0H=F+{t=?0H=5"E?0H=P_M?0H= T?0H=sdP[?0H=}a?0H=ھ{$g?0H=þp:l?0H=Gp?0H=]rt?0H=xex?0H=(GRz?0H=.|?0H=OȽu~?0H=6H7b?0H=S?0H=6H=7b?0H=O=u~?0H=.>|?0H=(G>Rz?0H=x>ex?0H=]r>t?0H=G>p?0H=>p:l?0H=>{$g?0H=}>a?0H=s?dP[?0H= ?T?0H=P?_M?0H=5"?E?0H=F+?{t=?0H=!4?!4?0H={t=?F+?0H=E?5"?0H=_M?P?0H=T? ?0H=dP[?s?0H=a?}>0H={$g?>0H=p:l?>0H=p?G>0H=t?]r>0H=ex?x>0H=Rz?(G>0H=|?.>0H=u~?O=0H=7b?6H=0H=C?*! /a <>Zg <>"ql sp <>'t @x <[G>c{ <4>&'} <=Ȱ~ <@xx> <'t> <"ql> <Zg> <,[? &'}? <[G>c{? @x? <>'t? sp? <>"ql? <>Zg? /a? <?,[? <.?T? <Zg?> <"ql?> <'t?> <@x?x> <&'}?4> <Ȱ~?= a%>kgh%>^lZ%|> q %1> t% %x>Sxh %G>{ %@>:}fl %6=m~ %0H=; %0$0 %0H; %6Ƚm~ %@:}fl %G{ %xSxh %1 t% %| q %þ^lZ%ھkgh%Za%=[$%91TRJ%M"$g"ES$J+=$55$=J+$Eg"$MJ$1T9$[=$aZ*$kgھ$^lþ7$ q|$ t1 ,$SxxG~${GX$:}@m$m~6Ƚ$0H$0 0$0H=B$m~6=~$:}@>&p${G>PIc$Sxx>sU$ t1>gH$ q|>>;$^l>P.$kg>!$aZ>C$[=?4 $1T9?#M?-T#Eg"?y#=J+?|#55?Ti#J+=?@L#g"E?>1#M?F^#91T?Z>#=[? #Za?^#ھkg?`"þ^l?"| q?M "1 t?'B"xSx?f"G{?̟!@:}?$C!6Ƚm~? 0H?%S?0H=?%6=m~? @>:}?$C!G>{?̟!x>Sx?f"1> t?'B"|> q?M ">^l?">kg?`"Z>a?^#=?[? #9?1T?Z>#?M?F^#g"?E?>1#J+?=?@L#5?5?Ti#=?J+?|#E?g"?y#M??-T#1T?9?#[?=?4 $a?Z>C$kg?>!$^l?>P.$ q?|>>;$ t?1>gH$Sx?x>sU${?G>PIc$:}?@>&p$m~?6=~$?0H=B$C?*ݡ ɼX?H ɼȰ~?Ƚ ɼ&'}?4 ɼc{?[G ɼ@x?x ɼ't? ɼsp?o ɼ"ql?þ ɼZg?ھ ɼ/a?NH ɼ,[? ɼT?. ɼ(M?s ɼE?[" ɼY=?+ ɼ4?4 ɼ+?Y= ɼ["?E ɼs?(M ɼ.?T ɼ?,[ ɼNH>/a ɼ>Zg ɼ>"ql ɼo>sp ɼ>'t ɼx>@x ɼ[G>c{ ɼ4>&'} ɼ=Ȱ~ ɼH=X ɼ%$C ɼHX ɼȽȰ~ ɼ4&'} ɼ[Gc{ ɼx@x ɼ't ɼosp ɼþ"ql ɼھZg ɼNH/a ɼ,[ ɼ.T ɼs(M ɼ["E ɼ+Y= ɼ44 ɼY=+ ɼE[" ɼ(Ms ɼT. ɼ,[ ɼ/aNH ɼZgھ ɼ"qlþ ɼspo ɼ't ɼ@xx ɼc{[G ɼ&'}4 ɼȰ~Ƚ ɼXH ɼC ɼXH= ɼȰ~= ɼ&'}4> ɼc{[G> ɼ@xx> ɼ't> ɼspo> ɼ"ql> ɼZg> ɼ/aNH> ɼ,[? ɼT.? ɼ(Ms? ɼE["? ɼY=+? ɼ44? ɼ+Y=? ɼ["E? ɼs(M? ɼ.T? ɼ,[? ɼNH/a? ɼھZg? ɼþ"ql? ɼosp? ɼ't? ɼx@x? ɼ[Gc{? ɼ4&'}? ɼȽȰ~? ɼHX? ɼSC? ɼH=X? ɼ=Ȱ~? ɼ4>&'}? ɼ[G>c{? ɼx>@x? ɼ>'t? ɼo>sp? ɼ>"ql? ɼ>Zg? ɼNH>/a? ɼ?,[? ɼ.?T? ɼs?(M? ɼ["?E? ɼ+?Y=? ɼ4?4? ɼY=?+? ɼE?["? ɼ(M?s? ɼT?.? ɼ,[?? ɼ/a?NH> ɼZg?> ɼ"ql?> ɼsp?o> ɼ't?> ɼ@x?x> ɼc{?[G> ɼ&'}?4> ɼȰ~?= ɼX?H= ɼ?]0H7b?6H0Hu~?OȽ0H|?.0HRz?(G0Hex?x0Ht?]r0Hp?G0Hp:l?þ0H{$g?ھ0Ha?}0HdP[?s0HT? 0H_M?P0HE?5"0H{t=?F+0H!4?!40HF+?{t=0H5"?E0HP?_M0H ?T0Hs?dP[0H}>a0H>{$g0H>p:l0HG>p0H]r>t0Hx>ex0H(G>Rz0H.>|0HO=u~0H6H=7b0Hw$0H6H7b0HOȽu~0H.|0H(GRz0Hxex0H]rt0HGp0Hþp:l0Hھ{$g0H}a0HsdP[0H T0HP_M0H5"E0HF+{t=0H!4!40H{t=F+0HE5"0H_MP0HT 0HdP[s0Ha}0H{$gھ0Hp:lþ0HpG0Ht]r0Hexx0HRz(G0H|.0Hu~OȽ0H7b6H0H7{0H7b6H=0Hu~O=0H|.>0HRz(G>0Hexx>0Ht]r>0HpG>0Hp:l>0H{$g>0Ha}>0HdP[s?0HT ?0H_MP?0HE5"?0H{t=F+?0H!4!4?0HF+{t=?0H5"E?0HP_M?0H T?0HsdP[?0H}a?0Hھ{$g?0Hþp:l?0HGp?0H]rt?0Hxex?0H(GRz?0H.|?0HOȽu~?0H6H7b?0HS?0H6H=7b?0HO=u~?0H.>|?0H(G>Rz?0Hx>ex?0H]r>t?0HG>p?0H>p:l?0H>{$g?0H}>a?0Hs?dP[?0H ?T?0HP?_M?0H5"?E?0HF+?{t=?0H!4?!4?0H{t=?F+?0HE?5"?0H_M?P?0HT? ?0HdP[?s?0Ha?}>0H{$g?>0Hp:l?>0Hp?G>0Ht?]r>0Hex?x>0HRz?(G>0H|?.>0Hu~?O=0H7b?6H=0HmN?.~?oH~?1Ƚ|?Kfz?0;Gw?6#xPt?9ap?/Pk?-gþRf?Pھ(a?Z?@GT?2 bM?ZE?!f+=? t+c4?c4 t+?f+=!?ZE?bM2 ?GT@?Z>(aP>Rf-g>Pk/>ap9>Pt6#x>w0;G>fzK>|1=~oH=~Ό$mNoH~1Ƚ~K|0;Gfz6#xw9Pt/ap-gþPkPھRf(a@Z2 GTbM!ZE t+f+=c4c4f+= t+ZE!bMGT2 Z@(aRfPھPk-gþap/Pt9w6#xfz0;G|K~1Ƚ~oHmN~oH=~1=|K>fz0;G>w6#x>Pt9>ap/>Pk-g>RfP>(a>Z@?GT2 ?bM?ZE!?f+= t+?c4c4? t+f+=?!ZE?bM?2 GT?@Z?(a?PھRf?-gþPk?/ap?9Pt?6#xw?0;Gfz?K|?1Ƚ~?oH~?5SmN?oH=~?1=~?K>|?0;G>fz?6#x>w?9>Pt?/>ap?-g>Pk?P>Rf?>(a?@?Z?2 ?GT??bM?!?ZE? t+?f+=?c4?c4?f+=? t+?ZE?!?bM??GT?2 ?Z?@?(a?>Rf?P>Pk?-g>ap?/>Pt?9>w?6#x>fz?0;G>|?K>~?1=~?oH=m~?kݢ6Ƚu~?oH6Ƚ_}?ǽ6Ƚ|?L6ȽH`6Ƚ>Nf6Ƚ>_k6Ƚ3>o6Ƚ>s6Ƚw>!w6ȽF>|6Ƚ=_}6ȽoH=u~6Ƚ$m~6ȽoHu~6Ƚǽ_}6ȽL|6ȽF6Ƚ!ww>6Ƚs>6Ƚo3>6Ƚ_k>6ȽNf>6ȽH`d1>6ȽmZ?6ȽS ?6ȽL?6ȽDg!?6Ƚ&<\+?6Ƚ%4%4?6Ƚ\+&|?6ȽF>!w?6Ƚ>s?6Ƚ3>o?6Ƚ>_k?6Ƚ>Nf?6Ƚd1>H`?6Ƚ?mZ?6Ƚ ?S?6Ƚ?L?6Ƚg!?D?6Ƚ\+?&6ȽNf?>6Ƚ_k?>6Ƚo?3>6Ƚs?>6Ƚ!w?w>6Ƚ6Ƚ|?L>6Ƚ_}?=6Ƚu~?oH=6Ƚ$~?KC s}?@xGs|?:ǽs%S{?>sZ1y?&EFsuv?vsg"s?s8o?0sj?u¾sMe? Cپs`??s\Y?۞seAS?( s$L?'ZsgD?.!sA`s C>Mesu>js0>8os>g"ssv>uvs&EF>Z1ys>>%S{s:=|s@xG=}s. $$~s@xG}s:ǽ|s>%S{s&EFZ1ysvuvsg"ss08osu¾js CپMes?`s۞\Ys( eASs'Z$Ls.!gDsM*As|:ǽs}@xGs$~cs}@xG=s|:=s%S{>>sZ1y&EF>suvv>sg"s>s8o0>sju>sMe C>s`?>s\Y۞?seAS( ?s$L'Z?sgD.!?sA%S{?s:ǽ|?s@xG}?sE0R$~?s@xG=}?s:=|?s>>%S{?s&EF>Z1y?sv>uv?s>g"s?s0>8o?su>j?s C>Me?s?>`?s۞?\Y?s( ?eAS?s'Z?$L?s.!?gD?sM*?AsMe? C>sj?u>s8o?0>sg"s?>suv?v>sZ1y?&EF>s%S{?>>s|?:=s}?@xG=s:}?i%@|?NF@|?ƽ@}z?1@ ]x?:E@u?cv@BSr?a@+mn?垪@ i?0@d?ؾ@T_?*@3Y?/@hR?ů @EeK?4@C? @e;?*@a3?a3@*?e;@ ?C@4?EeK@ů ?hR@/?3Y@*>T_@>d@0> i@垪>+mn@a>BSr@cv>u@:E> ]x@1>}z@=|@NF=|@̨$:}@NF|@ƽ|@1}z@:E ]x@cvu@aBSr@垪+mn@0 i@ؾd@*T_@/3Y@ů hR@4EeK@ C@*e;@a3a3@e;*@C @EeK4@hRů @3Y/@T_*@dؾ@ i0@+mn垪@BSra@ucv@ ]x:E@}z1@|ƽ@|NF@:}@|NF=@|=@}z1>@ ]x:E>@ucv>@BSra>@+mn垪>@ i0>@d>@T_*>@3Y/?@hRů ?@EeK4?@C ?@e;*?@a3a3?@*e;?@ C?@4EeK?@ů hR?@/3Y?@*T_?@ؾd?@0 i?@垪+mn?@aBSr?@cvu?@:E ]x?@1}z?@ƽ|?@NF|?@2}Q:}?@NF=|?@=|?@1>}z?@:E> ]x?@cv>u?@a>BSr?@垪>+mn?@0> i?@>d?@*>T_?@/?3Y?@ů ?hR?@4?EeK?@ ?C?@*?e;?@a3?a3?@e;?*?@C? ?@EeK?4?@hR?ů ?@3Y?/?@T_?*>@d?>@ i?0>@+mn?垪>@BSr?a>@u?cv>@ ]x?:E>@}z?1>@|?=@|?NF=@(;|?A/`{?F/:{?Ž/Ey?: /pbw?D/ t? &u/^q? p/|m?򩾢/i? /d?t׾/r^?D/XX?5/Q?! / J?@/.B? /:?Vc)/Z2?Z2/Vc)?:/ ?.B/@? J/! ?Q/5?XX/D>r^/t>d/ >i/>|m/ p>^q/ &u> t/D>pbw/: >Ey/=:{/F=`{/$(;|/F`{/Ž:{/: Ey/Dpbw/ &u t/ p^q/򩾗|m/ i/t׾d/Dr^/5XX/! Q/@ J/ .B/Vc):/Z2Z2/:Vc)/.B / J@/Q! /XX5/r^D/dt׾/i /|m򩾢/^q p/ t &u/pbwD/Ey: /:{Ž/`{F/(;|-/`{F=/:{=/Ey: >/pbwD>/ t &u>/^q p>/|m>/i >/dt>/r^D>/XX5?/Q! ?/ J@?/.B ?/:Vc)?/Z2Z2?/Vc):?/ .B?/@ J?/! Q?/5XX?/Dr^?/t׾d?/ i?/򩾗|m?/ p^q?/ &u t?/Dpbw?/: Ey?/Ž:{?/F`{?/ЩP(;|?/F=`{?/=:{?/: >Ey?/D>pbw?/ &u> t?/ p>^q?/>|m?/ >i?/t>d?/D>r^?/5?XX?/! ?Q?/@? J?/ ?.B?/Vc)?:?/Z2?Z2?/:?Vc)?/.B? ?/ J?@?/Q?! ?/XX?5?/r^?D>/d?t>/i? >/|m?>/^q? p>/ t? &u>/pbw?D>/Ey?: >/:{?=/`{?F=/{?Z\GRz?EGo]G>}bGJ+>gG^,>cglGő>EpGt>ssGC>AvGn]> ]xG=GAvC>Gsst>GEpő>Gcgl^,>GgJ+>G}b>Go]>G\W?G)P?~ ?GI?GBH?G :(?G11?G( :?GHB?GI?G?~ )P?G\W?Go]?G־}b?GJ+g?G^,cgl?GőEp?Gtss?GCAv?Gn] ]x?GĽ ]x?GC>Av?Gt>ss?Gő>Ep?G^,>cgl?GJ+>g?G>}b?G>o]?G?\W?G?~ ?)P?G?I?GH?B?G(? :?G1?1?G :?(?GB?H?GI??G)P??~ ?G\W??Go]?>G}b?>Gg?J+>Gcgl?^,>GEp?ő>Gss?t>GAv?C>G ]x?n]>GV?i\`,O?+ \`H?+\`A?fu\`9?'\`0?0\`'?9\`fu?A\`+?H\`+ ?,O\`i?E>V\`}>Xa\`S,>2f\`K>-k\`>9o\` r>NKr\`B>t\`>w\`=x\`D=zy\`$y\`Dzy\`ýx\`w\`Bt\` rNKr\`9o\`K-k\`S,2f\`֖վXa\`}V\`+ ,O\`+H\`fuA\`'9\`00\`9'\`Afu\`H+\`,O+ \`E>Vi\`\`tB>\`NKr r>\`9o>\`-kK>\`2fS,>\`Xa֖>\`\`E>Vi?\`,O+ ?\`H+?\`Afu?\`9'?\`00?\`'9?\`fuA?\`+H?\`+ ,O?\`iE>V?\`}w?\`B>t?\` r>NKr?\`>9o?\`K>-k?\`S,>2f?\`֖>Xa?\`}>V?\`+ ?,O?\`+?H?\`fu?A?\`'?9?\`0?0?\`9?'?\`A?fu?\`H?+?\`,O?+ ?\`E>V?i?\`\`Xa?֖>\`2f?S,>\`-k?K>\`9o?>\`NKr? r>\`t?B>\`w?>\`x?=\`zy?D=\`Sx?9xex?BBx!w?$½xu?ȿxss?Axp?Zqxm?+xi?Qxle?xa|`? YԾxx[?=xT? Ux)zN? x|uG?x??x7?S&x+/?+/xS&?7x??x?|uGx ?)zNx U>Tx=>x[x Y>a|`x>lexQ>ix+>mxZq>pxA>ssxȿ>ux$=!wxBB=exx$SxxBBexx$½!wxȿuxAssxZqpx+mxQixlex YԾa|`x=x[x UTx )zNx|uGx?xS&7x+/+/x7S&x?x|uGx)zN xT Uxx[=xa|` YԾxlexiQxm+xpZqxssAxuȿx!w$½xexBBxSxxexBB=x!w$=xuȿ>xssA>xpZq>xm+>xiQ>xle>xa|` Y>xx[=>xT U>x)zN ?x|uG?x??x7S&?x+/+/?xS&7?x??x|uG?x )zN?x UT?x=x[?x YԾa|`?xle?xQi?x+m?xZqp?xAss?xȿu?x$½!w?xBBex?x7oMSx?xBB=ex?x$=!w?xȿ>u?xA>ss?xZq>p?x+>m?xQ>i?x>le?x Y>a|`?x=>x[?x U>T?x ?)zN?x?|uG?x???xS&?7?x+/?+/?x7?S&?x???x|uG??x)zN? ?xT? U>xx[?=>xa|`? Y>xle?>xi?Q>xm?+>xp?Zq>xss?A>xu?ȿ>x!w?$=xex?BB=xv?Cmv?lAu?wet?-cq?4@$Uo?|oKl?=Mh?K=c? ּ _?~ҾY?输S?O%M? 7,F?>?6?%Lv.?Lv.%?6?>?7,F ?O%M>S>Y~> _ ּ>cK=>Mh=>Kl|o>$Uo4@>cq->etw=ulA=mv$vlAmvwu-et4@cq|o$Uo=KlK=Mh ּc~Ҿ _YS O%M7,F>%6Lv.Lv.6%>7,FO%M SY输 _~Ҿc ּMhK=Kl=$Uo|ocq4@et-uwmvlAvmvlA=uw=et->cq4@>$Uo|o>Kl=>MhK=>c ּ> _~>Y>S>O%M ?7,F?>?6%?Lv.Lv.?%6?>?7,F? O%M?S?Y?~Ҿ _? ּc?K=Mh?=Kl?|o$Uo?4@cq?-et?wu?lAmv?Lv?lA=mv?w=u?->et?4@>cq?|o>$Uo?=>Kl?K=>Mh? ּ>c?~> _?>Y?>S? ?O%M??7,F??>?%?6?Lv.?Lv.?6?%?>??7,F??O%M? ?S?>Y?> _?~>c? ּ>Mh?K=>Kl?=>$Uo?|o>cq?4@>et?->u?w=mv?lA= t?31t?S@1s?i1BSr??1Ep?+?1m?n1mj?91 f?s18Tb?@1t]?k{Ѿ1 X?d1R?1ҰK?1dD?1^=?^i1 5?-$19-?9-1-$? 51^i?^=1?dD1?ҰK1>R1d> X1k{>t]1@>8Tb1s> f19>mj1n>m1+?>Ep1?>BSr1i=s1S@=t1$ t1S@t1is1?BSr1+?Ep1nm19mj1s f1@8Tb1k{Ѿt]1d X1R1ҰK1dD1^i^=1-$ 519-9-1 5-$1^=^i1dD1ҰK1R1 Xd1t]k{Ѿ18Tb@1 fs1mj91mn1Ep+?1BSr?1si1tS@1 t1tS@=1si=1BSr?>1Ep+?>1mn>1mj9>1 fs>18Tb@>1t]k{>1 Xd>1R>1ҰK?1dD?1^=^i?1 5-$?19-9-?1-$ 5?1^i^=?1dD?1ҰK?1R?1d X?1k{Ѿt]?1@8Tb?1s f?19mj?1nm?1+?Ep?1?BSr?1is?1S@t?1zJ t?1S@=t?1i=s?1?>BSr?1+?>Ep?1n>m?19>mj?1s> f?1@>8Tb?1k{>t]?1d> X?1>R?1?ҰK?1?dD?1^i?^=?1-$? 5?19-?9-?1 5?-$?1^=?^i?1dD??1ҰK??1R?>1 X?d>1t]?k{>18Tb?@>1 f?s>1mj?9>1m?n>1Ep?+?>1BSr??>1s?i=1t?S@=1Gs?&嚠Rr?Z>嚠q?嚠rp?$嚠hn?=嚠`k?@l嚠h?嚠d?'ȣ嚠o`?v 嚠[? Ͼ嚠q`V?j,嚠~P?u嚠J?. 嚠9>C?X嚠;?45嚠4?=#嚠 +? +嚠=#?4嚠45?;嚠X?9>C嚠. ?J嚠u>~P嚠j,>q`V嚠 >[嚠v >o`嚠'ȣ>d嚠>h嚠@l>`k嚠=>hn嚠$>rp嚠=q嚠Z>=Rr嚠$Gs嚠Z>Rr嚠q嚠$rp嚠=hn嚠@l`k嚠h嚠'ȣd嚠v o`嚠 Ͼ[嚠j,q`V嚠u~P嚠. J嚠X9>C嚠45;嚠=#4嚠 + +嚠4=#嚠;45嚠9>CX嚠J. 嚠~Pu嚠q`Vj,嚠[ Ͼ嚠o`v 嚠d'ȣ嚠h嚠`k@l嚠hn=嚠rp$嚠q嚠RrZ>嚠Gs4嚠RrZ>=嚠q=嚠rp$>嚠hn=>嚠`k@l>嚠h>嚠d'ȣ>嚠o`v >嚠[ >嚠q`Vj,>嚠~Pu>嚠J. ?嚠9>CX?嚠;45?嚠4=#?嚠 + +?嚠=#4?嚠45;?嚠X9>C?嚠. J?嚠u~P?嚠j,q`V?嚠 Ͼ[?嚠v o`?嚠'ȣd?嚠h?嚠@l`k?嚠=hn?嚠$rp?嚠q?嚠Z>Rr?嚠IGs?嚠Z>=Rr?嚠=q?嚠$>rp?嚠=>hn?嚠@l>`k?嚠>h?嚠'ȣ>d?嚠v >o`?嚠 >[?嚠j,>q`V?嚠u>~P?嚠. ?J?嚠X?9>C?嚠45?;?嚠=#?4?嚠 +? +?嚠4?=#?嚠;?45?嚠9>C?X?嚠J?. ?嚠~P?u>嚠q`V?j,>嚠[? >嚠o`?v >嚠d?'ȣ>嚠h?>嚠`k?@l>嚠hn?=>嚠rp?$>嚠q?=嚠Rr?Z>=嚠 q?0B|p?;=|o?5|+mn? x |cgl?8<|i?fDj| f? |b?g|^?z|Y?ξ|T??|,N?t|iH?{|A?|R:?B|j2?!| p*? p*|!?j2|B?R:|?A|{?iH|t>,N|?>T|>Y|z>^|g>b| > f|fDj>i|8<>cgl| x >+mn|5=o|;==p|+$ q|;=p|5o| x +mn|8|cgl8<>|ifDj>| f >|bg>|^z>|Y>|T?>|,Nt>|iH{?|A?|R:B?|j2!?| p* p*?|!j2?|BR:?|A?|{iH?|t,N?|?T?|ξY?|z^?|gb?| f?|fDji?|8+mn?|8<>cgl?|fDj>i?| > f?|g>b?|z>^?|>Y?|?>T?|t>,N?|{?iH?|?A?|B?R:?|!?j2?| p*? p*?|j2?!?|R:?B?|A??|iH?{?|,N?t>|T??>|Y?>|^?z>|b?g>| f? >|i?fDj>|cgl?8<>|+mn? x >|o?5=|p?;==|n?/@ˣ*Dn?;*D0m?I*DBl?/ *DAj?b:*D0g?#h*Dd?*DZ`?*DB\?ζ*DW?b=̾*DR?.*D}L?;*DF?!*D??G*Dm8?*D,0?7f *D(?(*D7f ?,0*D?m8*DG??*D!?F*D;>}L*D.>R*Db=>W*Dζ>B\*D>Z`*D>d*D#h>0g*Db:>Aj*D/ >Bl*DI=0m*D;=n*D$n*D;n*DI0m*D/ Bl*Db:Aj*D#h0g*Dd*DZ`*DζB\*Db=̾W*D.᾽R*D;}L*D!F*DG?*Dm8*D7f ,0*D((*D,07f *Dm8*D?G*DF!*D}L;*DR.*DWb=̾*DB\ζ*DZ`*Dd*D0g#h*DAjb:*DBl/ *D0mI*Dn;*Dn"*Dn;=*D0mI=*DBl/ >*DAjb:>*D0g#h>*Dd>*DZ`>*DB\ζ>*DWb=>*DR.>*D}L;>*DF!?*D?G?*Dm8?*D,07f ?*D((?*D7f ,0?*Dm8?*DG??*D!F?*D;}L?*D.᾽R?*Db=̾W?*DζB\?*DZ`?*Dd?*D#h0g?*Db:Aj?*D/ Bl?*DI0m?*D;n?*D#En?*D;=n?*DI=0m?*D/ >Bl?*Db:>Aj?*D#h>0g?*D>d?*D>Z`?*Dζ>B\?*Db=>W?*D.>R?*D;>}L?*D!?F?*DG???*D?m8?*D7f ?,0?*D(?(?*D,0?7f ?*Dm8??*D??G?*DF?!?*D}L?;>*DR?.>*DW?b=>*DB\?ζ>*DZ`?>*Dd?>*D0g?#h>*DAj?b:>*DBl?/ >*D0m?I=*Dn?;=*D^l?أþp:l?9þ_k?quþ i? þg?Ӑ8þle?>eþ8Tb?Oþ^?[þzZ?þ,U?>ʾþP?޾þ6J?#/þLD?Qfþ=? þ6? þ>/?!þu='?u='þ!?>/þ ?6þ ?=þQf?LDþ#/>6Jþ>Pþ>>,Uþ>zZþ[>^þO>8Tbþ>e>leþӐ8>gþ > iþqu=_kþ9=p:lþp$^lþ9p:lþqu_kþ iþӐ8gþ>eleþO8Tbþ[^þzZþ>ʾ,Uþ޾Pþ#/6JþQfLDþ =þ 6þ!>/þu='u='þ>/!þ6 þ= þLDQfþ6J#/þP޾þ,U>ʾþzZþ^[þ8TbOþle>eþgӐ8þ i þ_kquþp:l9þ^ltþp:l9=þ_kqu=þ i >þgӐ8>þle>e>þ8TbO>þ^[>þzZ>þ,U>>þP>þ6J#/>þLDQf?þ= ?þ6 ?þ>/!?þu='u='?þ!>/?þ 6?þ =?þQfLD?þ#/6J?þ޾P?þ>ʾ,U?þzZ?þ[^?þO8Tb?þ>ele?þӐ8g?þ i?þqu_k?þ9p:l?þC^l?þ9=p:l?þqu=_k?þ > i?þӐ8>g?þ>e>le?þO>8Tb?þ[>^?þ>zZ?þ>>,U?þ>P?þ#/>6J?þQf?LD?þ ?=?þ ?6?þ!?>/?þu='?u='?þ>/?!?þ6? ?þ=? ?þLD?Qf?þ6J?#/>þP?>þ,U?>>þzZ?>þ^?[>þ8Tb?O>þle?>e>þg?Ӑ8>þ i? >þ_k?qu=þp:l?9=þ j?+{Ͼ{i?-7{Ͼ&h?{Ͼ-g?\ {Ͼme?K6{Ͼc?Qwc{Ͼ_?{ϾX[\?{Ͼ8X?{ϾLS? Ⱦ{ϾgN?3ܾ{ϾH?{ϾaB?>{Ͼ;?j {Ͼ4?x{Ͼi-?+{ϾY}%?Y}%{Ͼ+?i-{Ͼx?4{Ͼj ?;{Ͼ>?aB{Ͼ>H{Ͼ3>gN{Ͼ >LS{Ͼ>8X{Ͼ>X[\{Ͼ>_{ϾQwc>c{ϾK6>me{Ͼ\ >-g{Ͼ=&h{Ͼ-7={i{Ͼ3$ j{Ͼ-7{i{Ͼ&h{Ͼ\ -g{ϾK6me{ϾQwcc{Ͼ_{ϾX[\{Ͼ8X{Ͼ ȾLS{Ͼ3ܾgN{Ͼ𾧽H{Ͼ>aB{Ͼj ;{Ͼx4{Ͼ+i-{ϾY}%Y}%{Ͼi-+{Ͼ4x{Ͼ;j {ϾaB>{ϾH{ϾgN3ܾ{ϾLS Ⱦ{Ͼ8X{ϾX[\{Ͼ_{ϾcQwc{ϾmeK6{Ͼ-g\ {Ͼ&h{Ͼ{i-7{Ͼ j{Ͼ{i-7={Ͼ&h={Ͼ-g\ >{ϾmeK6>{ϾcQwc>{Ͼ_>{ϾX[\>{Ͼ8X>{ϾLS >{ϾgN3>{ϾH>{ϾaB>?{Ͼ;j ?{Ͼ4x?{Ͼi-+?{ϾY}%Y}%?{Ͼ+i-?{Ͼx4?{Ͼj ;?{Ͼ>aB?{Ͼ𾧽H?{Ͼ3ܾgN?{Ͼ ȾLS?{Ͼ8X?{ϾX[\?{Ͼ_?{ϾQwcc?{ϾK6me?{Ͼ\ -g?{Ͼ&h?{Ͼ-7{i?{Ͼ̜A j?{Ͼ-7={i?{Ͼ=&h?{Ͼ\ >-g?{ϾK6>me?{ϾQwc>c?{Ͼ>_?{Ͼ>X[\?{Ͼ>8X?{Ͼ >LS?{Ͼ3>gN?{Ͼ>H?{Ͼ>?aB?{Ͼj ?;?{Ͼx?4?{Ͼ+?i-?{ϾY}%?Y}%?{Ͼi-?+?{Ͼ4?x?{Ͼ;?j ?{ϾaB?>?{ϾH?>{ϾgN?3>{ϾLS? >{Ͼ8X?>{ϾX[\?>{Ͼ_?>{Ͼc?Qwc>{Ͼme?K6>{Ͼ-g?\ >{Ͼ&h?={Ͼ{i?-7={Ͼkg?5vھ{$g?R5ھNf?Lwھd?ھ}b?4ھa|`?Q`ھt]?)[ھY?L훾ھ,U?Fھ3Q?žھhL?.ھھ#F?ھtk@?ھ9? ھ2?ھx+?iھ#?#ھi?x+ھ?2ھ ?9ھ?tk@ھ>#Fھ.>hLھ>3QھF>,UھL>Yھ)[>t]ھQ`>a|`ھ4>}bھ>dھLw=NfھR5={$gھC$kgھR5{$gھLwNfھdھ4}bھQ`a|`ھ)[t]ھL훾YھF,Uھž3Qھ.ھhLھ#Fھtk@ھ 9ھ2ھix+ھ##ھx+iھ2ھ9 ھtk@ھ#FھhL.ھھ3Qžھ,UFھYL훾ھt])[ھa|`Q`ھ}b4ھdھNfLwھ{$gR5ھkgھ{$gR5=ھNfLw=ھd>ھ}b4>ھa|`Q`>ھt])[>ھYL>ھ,UF>ھ3Q>ھhL.>ھ#F>ھtk@?ھ9 ?ھ2?ھx+i?ھ##?ھix+?ھ2?ھ 9?ھtk@?ھ#F?ھ.ھhL?ھž3Q?ھF,U?ھL훾Y?ھ)[t]?ھQ`a|`?ھ4}b?ھd?ھLwNf?ھR5{$g?ھr?kg?ھR5={$g?ھLw=Nf?ھ>d?ھ4>}b?ھQ`>a|`?ھ)[>t]?ھL>Y?ھF>,U?ھ>3Q?ھ.>hL?ھ>#F?ھ?tk@?ھ ?9?ھ?2?ھi?x+?ھ#?#?ھx+?i?ھ2??ھ9? ?ھtk@??ھ#F?>ھhL?.>ھ3Q?>ھ,U?F>ھY?L>ھt]?)[>ھa|`?Q`>ھ}b?4>ھd?>ھNf?Lw=ھ{$g?R5=ھYd?u3cd?s3u3xc?Nu30b?p5u3澍E`?q2u3]?>^u3澵Z?u3oLW?u3bBS?Pu3 N?þu37I?׾u3"D?su3 >?Tu3q7?A7u30?Vu3n)?u3ݰ!?ݰ!u3?n)u3V?0u3A7?q7u3T> >u3s>"Du3澓>7Iu3澽> Nu3P>bBSu3>oLWu3澒>Zu3澢>^>]u3q2>E`u3p5>0bu3N=xcu3s3=cdu3f9|$Ydu3s3cdu3Nxcu3p50bu3q2E`u3澢>^]u3澒Zu3oLWu3PbBSu3澽þ Nu3澓׾7Iu3s"Du3T >u3A7q7u3V0u3n)u3ݰ!ݰ!u3n)u30Vu3q7A7u3 >Tu3"Dsu37I׾u3 Nþu3bBSPu3oLWu3澵Zu3]>^u3澍E`q2u30bp5u3xcNu3cds3u3Ydu3cds3=u3xcN=u30bp5>u3澍E`q2>u3]>^>u3澵Z>u3oLW>u3bBSP>u3 N>u37I>u3"Ds>u3 >T>u3q7A7?u30V?u3n)?u3ݰ!ݰ!?u3n)?u3V0?u3A7q7?u3T >?u3s"D?u3澓׾7I?u3澽þ N?u3PbBS?u3oLW?u3澒Z?u3澢>^]?u3q2E`?u3p50b?u3Nxc?u3s3cd?u3 +=Yd?u3s3=cd?u3N=xc?u3p5>0b?u3q2>E`?u3澢>^>]?u3澒>Z?u3>oLW?u3P>bBS?u3澽> N?u3澓>7I?u3s>"D?u3T> >?u3A7?q7?u3V?0?u3?n)?u3ݰ!?ݰ!?u3n)??u30?V?u3q7?A7?u3 >?T>u3"D?s>u37I?>u3 N?>u3bBS?P>u3oLW?>u3澵Z?>u3]?>^>u3澍E`?q2>u30b?p5>u3xc?N=u3cd?s3=u3澘a?TZa??1ZH`?= ZT_?Zo]?/0Zx[?n[Z X?ZT?ZP?]̬ZhL?OZG?1ԾZ񾦦A?#Z;?>ZvW5?}Z%.?g:Z1I'?~Z?Z~?1I'Zg:?%.Z}?vW5Z>>;Z#>AZ1>GZO>hLZ]̬>PZ>TZ> XZn[>x[Z/0>o]Z񾬂>T_Z= =H`Z?1=aZSy$aZ?1aZ= H`Z񾬂T_Z/0o]Zn[x[Z XZTZ]̬PZOhLZ1ԾGZ#辦AZ>;Z}vW5Zg:%.Z~1I'ZZ1I'~Z%.g:ZvW5}Z;>Z񾦦A#ZG1ԾZhLOZP]̬ZTZ XZx[n[Zo]/0ZT_ZH`= Za?1Za>Za?1=ZH`= =ZT_>Zo]/0>Zx[n[>Z X>ZT>ZP]̬>ZhLO>ZG1>Z񾦦A#>Z;>>ZvW5}?Z%.g:?Z1I'~?Z?Z~1I'?Zg:%.?Z}vW5?Z>;?Z#辦A?Z1ԾG?ZOhL?Z]̬P?ZT?Z X?Zn[x[?Z/0o]?Z񾬂T_?Z= H`?Z?1a?Z>:a?Z?1=a?Z= =H`?Z񾬂>T_?Z/0>o]?Zn[>x[?Z> X?Z>T?Z]̬>P?ZO>hL?Z1>G?Z#>A?Z>>;?Z}?vW5?Zg:?%.?Z~?1I'?Z??Z1I'?~?Z%.?g:?ZvW5?}?Z;?>>Z񾦦A?#>ZG?1>ZhL?O>ZP?]̬>ZT?>Z X?>Zx[?n[>Zo]?/0>ZT_?>ZH`?= =Za??1=Z^?. ']Vy^?.']r]?']T\?y']\vZ?-']$X?|X']&U?=Q']Q?H']zM?z']L[I?x']pD?Ѿ']k ??[']49?z']2?'].,?cN '] %?']?']? %']cN ?.,']?2']z>49'][>k ?']>pD']x>L[I']z>zM']H>Q']=Q>&U']|X>$X']->\vZ']y>T\']=r]'].=Vy^']ٰu$^'].Vy^']r]']yT\']-\vZ']|X$X']=Q&U']HQ']zzM']xL[I']ѾpD'][k ?']z49']2']cN .,'] %']'] %'].,cN ']2']49z']k ?[']pDѾ']L[Ix']zMz']QH']&U=Q']$X|X']\vZ-']T\y']r]']Vy^.']^']Vy^.=']r]=']T\y>']\vZ->']$X|X>']&U=Q>']QH>']zMz>']L[Ix>']pD>']k ?[>']49z>']2?'].,cN ?'] %?']?'] %?']cN .,?']2?']z49?'][k ??']ѾpD?']xL[I?']zzM?']HQ?']=Q&U?']|X$X?']-\vZ?']yT\?']r]?'].Vy^?']D8^?'].=Vy^?']=r]?']y>T\?']->\vZ?']|X>$X?']=Q>&U?']H>Q?']z>zM?']x>L[I?']>pD?'][>k ??']z>49?']?2?']cN ?.,?']? %?']??'] %??'].,?cN ?']2??']49?z>']k ??[>']pD?>']L[I?x>']zM?z>']Q?H>']&U?=Q>']$X?|X>']\vZ?->']T\?y>']r]?=']Vy^?.='][?v+=dP[?'c,=mZ?-=3Y?=\W?Y+=T?iU=R? ~=,N?=6J?=#F?û=A?gϾ=V6=>V<=g>A=û>#F=>6J=>,N= ~>R=iU>T=Y+>\W=>3Y=-=mZ='c,=dP[=|3r$[='c,dP[=-mZ=3Y=Y+\W=iUT= ~R=,N=6J=û#F=gϾA=ᾺV<=󾨒6=]0=L )=ul"=CC=l"u=)L =]0=6=V<=AgϾ=#Fû=6J=,N=R ~=TiU=\WY+=3Y=mZ-=dP['c,=[d=dP['c,==mZ-==3Y>=\WY+>=TiU>=R ~>=,N>=6J>=#Fû>=Ag>=V<>=6>=]0?=)L ?=l"u?=CC?=ul"?=L )?=]0?=󾨒6?=ᾺV3Y?=Y+>\W?=iU>T?= ~>R?=>,N?=>6J?=û>#F?=g>A?=>V6?=?]0?=L ?)?=u?l"?=C?C?=l"?u?=)?L ?=]0??=6?>=V=A?g>=#F?û>=6J?>=,N?>=R? ~>=T?iU>=\W?Y+>=3Y?>=mZ?-==dP[?'c,==SHX?X?)=W?\ U?p T?L(Q?5R/N?N"{K? G?_C?򸾛>?˾9?b޾3?QA-?K0'?K5 9A ??Q?Q??9A K5 ?K0'?A-Q>3b>9>>>_C>G >KN"{>/N5R>QL(>p T= U\==W)=XƐn$SHX)X\=W UL(p T5RQN"{/N KG_C˾>b޾9Q3A-K5 K0'?9A QQ9A ?K0'K5 A-3Q9b޾>˾_C򸾛GK /NN"{Q5Rp TL( U=W\X)SHX X)==W\= U=p TL(>Q5R>/NN"{>K >G>_C>>>9b>3Q>A-?K0'K5 ?9A ??QQ??9A ?K5 K0'?A-?Q3?b޾9?˾>?_C?G? K?N"{/N?5RQ?L(p T? U?\=W?)X?2SHX?)=X?\==W?= U?L(>p T?5R>Q?N"{>/N? >K?>G?>_C?>>?b>9?Q>3??A-?K5 ?K0'???9A ?Q?Q?9A ???K0'?K5 ?A-??3?Q>9?b>>?>_C?>G?>K? >/N?N"{>Q?5R>p T?L(> U?==W?\=X?)=1T?9T?'9S?覽9hR?&9)P?&9)zN?N9ҰK?'w9iH?k9LD?颾9tk@?9;?Ⱦ96?%ھ90?^9*?9C$?9O? 9?9 ?O9?C$9>*9^>09%>69>;9>tk@9>LD9k>iH9'w>ҰK9N>)zN9&>)P9&=hR9=S9'=T9Fj$1T9'T9覽S9&hR9&)P9N)zN9'wҰK9kiH9颾LD9tk@9Ⱦ;9%ھ69^09*9C$9 O99O 9C$9*90^96%ھ9;Ⱦ9tk@9LD颾9iHk9ҰK'w9)zNN9)P&9hR&9S覽9T'91T9T'=9S=9hR&=9)P&>9)zNN>9ҰK'w>9iHk>9LD>9tk@>9;>96%>90^>9*>9C$?9O ?9?9 O?9C$?9*?9^0?9%ھ6?9Ⱦ;?9tk@?9颾LD?9kiH?9'wҰK?9N)zN?9&)P?9&hR?9覽S?9'T?901T?9'=T?9=S?9&=hR?9&>)P?9N>)zN?9'w>ҰK?9k>iH?9>LD?9>tk@?9>;?9%>6?9^>0?9>*?9?C$?9 ?O?9??9O? ?9C$??9*?>90?^>96?%>9;?>9tk@?>9LD?>9iH?k>9ҰK?'w>9)zN?N>9)P?&>9hR?&=9S?=9T?'=9=MQ?"*h Q?Q$*h;KP? *hM O?*hGM?T#*hzK?lK*h JH?@s*hE?*h^A?N1*h4=?*ho8? Tž*h)3?4׾*h,.?H*h(?\*h!?*h? *h?*h ?*h?!*h\>(*hH>,.*h4>)3*h T>o8*h>4=*hN1>^A*h>E*h@s> JH*hlK>zK*hT#>GM*h=M O*h =;KP*hQ$= Q*hf$=MQ*hQ$ Q*h ;KP*hM O*hT#GM*hlKzK*h@s JH*hE*hN1^A*h4=*h Tžo8*h4׾)3*hH,.*h\(*h!*h *h*h *h!*h(\*h,.H*h)34׾*ho8 Tž*h4=*h^AN1*hE*h JH@s*hzKlK*hGMT#*hM O*h;KP *h QQ$*h=MQ*h QQ$=*h;KP =*hM O=*hGMT#>*hzKlK>*h JH@s>*hE>*h^AN1>*h4=>*ho8 T>*h)34>*h,.H>*h(\>*h!?*h ?*h?*h ?*h!?*h\(?*hH,.?*h4׾)3?*h Tžo8?*h4=?*hN1^A?*hE?*h@s JH?*hlKzK?*hT#GM?*hM O?*h ;KP?*hQ$ Q?*h.&-=MQ?*hQ$= Q?*h =;KP?*h=M O?*hT#>GM?*hlK>zK?*h@s> JH?*h>E?*hN1>^A?*h>4=?*h T>o8?*h4>)3?*hH>,.?*h\>(?*h?!?*h ??*h??*h? ?*h!??*h(?\>*h,.?H>*h)3?4>*ho8? T>*h4=?>*h^A?N1>*hE?>*h JH?@s>*hzK?lK>*hGM?T#>*hM O?=*h;KP? =*h Q?Q$=*hM?5(_M?m!L?3<EeK?]I?ru |uG?GdD?1nA?=?'`9?'ԯvW5?]0?kӾ*?Uy (%? ?qZ?3 fe?fe3 ?Zq? > (%Uy>*k>]0>vW5'ԯ>9'`>=>A1n>dDG>|uGru >I]=EeK3<=Lm!=_MDb$Mm!_M39'ԯ>vW5>]0k>*Uy> (% >q?Z3 ?fefe?3 Z?q? (%?Uy侼*?kӾ]0?vW5?'ԯ9?'`=?A?1ndD?G|uG?ru I?]EeK?3I?G>|uG?1n>dD?>A?'`>=?'ԯ>9?>vW5?k>]0?Uy>*? > (%?q??3 ?Z?fe?fe?Z?3 ??q? (%? >*?Uy>]0?k>vW5?>9?'ԯ>=?'`>A?>dD?1n>|uG?G>I?ru >EeK?]=L?3<=_M?m!=I?ܹ-גI?\qJH?@G?WE?l}C?Z&Dd A?PVj>?Mt:?vp6?T1?~E-?OϾ'?'?"?q?K?$?$?K?q>"'?>'O>-~E>1T>p6v>Mt:>>PVj>d AZ&D>Cl}>WE=G@=JH\q=גI^$I\qגI@JHGl}WEZ&DCPVjd A>vMt:Tp6~E1OϾ-'?'q"$KK$"q''?-OϾ1~Ep6TMt:v>d APVjCZ&DWEl}GJH@גI\qIuגI\q=JH@=G=WEl}>CZ&D>d APVj>>>Mt:v>p6T>1~E>-O>''?>"q>?K$??$K??q"?'?'?OϾ-?~E1?Tp6?vMt:?>?PVjd A?Z&DC?l}WE?G?@JH?\qגI?&I?\q=גI?@=JH?=G?l}>WE?Z&D>C?PVj>d A?>>?v>Mt:?T>p6?~E>1?O>-?'?>'?q>"???$?K???K?$???"?q>'?'?>-?O>1?~E>p6?T>Mt:?v>>?>d A?PVj>C?Z&D>WE?l}>G?=JH?@=גI?\q=E?#3g"E?N\g"D?f,g"C?J轙g"B?mg"??U@g"^=?Meg"R:?Ug"6?ug"2?7g"%.?g")?x˾g"C$?d۾g"?E뾙g"?g"?/g" ? g"/?g">g"E>g"d>C$g"x>)g">%.g"7>2g"u>6g"U>R:g"Me>^=g"U@>?g"m>Bg"J=Cg"f,=Dg"N\=Eg"aGZ$Eg"N\Eg"f,Dg"J轲Cg"mBg"U@?g"Me^=g"UR:g"u6g"72g"%.g"x˾)g"d۾C$g"E뾁g"g"/g" g"/g"g"E뾙g"C$d۾g")x˾g"%.g"27g"6ug"R:Ug"^=Meg"?U@g"Bmg"CJ轙g"Df,g"EN\g"Erg"EN\=g"Df,=g"CJ=g"Bm>g"?U@>g"^=Me>g"R:U>g"6u>g"27>g"%.>g")x>g"C$d>g"E>g">g"/?g" ?g"/?g"?g"E뾁?g"d۾C$?g"x˾)?g"%.?g"72?g"u6?g"UR:?g"Me^=?g"U@??g"mB?g"J轲C?g"f,D?g"N\E?g"#E?g"N\=E?g"f,=D?g"J=C?g"m>B?g"U@>??g"Me>^=?g"U>R:?g"u>6?g"7>2?g">%.?g"x>)?g"d>C$?g"E>?g">?g"/??g" ? ?g"?/?g"?>g"?E>g"C$?d>g")?x>g"%.?>g"2?7>g"6?u>g"R:?U>g"^=?Me>g"??U@>g"B?m>g"C?J=g"D?f,=g"E?N\=g"pA?p8V6'A?K/V6'|@?]V6'T??WV6'>?DV6'B 6V6'}>V6'c>7-!V6'P>MD&V6'>*V6']¥>;/V6'\>3V6'>6V6'a>9V6'g<>B >V6'W=T?V6']=|@V6'K/=AV6'U$pAV6'K/AV6']|@V6'WT?V6'D>V6'gDV6'T?WV6'|@]V6'AK/V6'pAV6'AK/=V6'|@]=V6'T?W=V6'>D>V6'B <g<>V6'9a>V6'6>V6'3\>V6';/]¥>V6'*>V6'MD&P>V6'7-!c>V6'}>V6'6>V6'I-?V6'  ?V6'-I?V6'6?V6'}澹?V6'c׾7-!?V6'PǾMD&?V6'*?V6']¥;/?V6'\3?V6'񛂾6?V6'a9?V6'g?V6'WT??V6']|@?V6'K/A?V6'\ pA?V6'K/=A?V6']=|@?V6'W=T??V6'D>>?V6'g<>B 9?V6'>6?V6'\>3?V6']¥>;/?V6'>*?V6'P>MD&?V6'c>7-!?V6'}>?V6'>6?V6'-?I?V6' ? ?V6'I?-?V6'6?>V6'?}>V6'7-!?c>V6'MD&?P>V6'*?>V6';/?]¥>V6'3?\>V6'6?>V6'9?a>V6'B V6'>?D>V6'T??W=V6'|@?]=V6'A?K/=V6'=?=J+{t=?J+&/?n-J+x+?F3J+1I'?ղJ+l"?þJ+O?ҾJ+Z?J+?J+Ӌ ?mJ+a ?a J+m>Ӌ J+>J+>ZJ+>OJ+>l"J+ղ>1I'J+F3>x+J+n->>/J+>j2J+?\> 5J+y[8>7J+> :J+=e;J+弔=&/J+F3x+J+ղ1I'J+þl"J+ҾOJ+ZJ+𾘠J+mӋ J+a a J+Ӌ mJ+J+ZJ+OҾJ+l"þJ+1I'ղJ+x+F3J+>/n-J+j2J+ 5?\J+7y[8J+ :J+e;޽J+&<弔J+{t=J+=ZJ+{t==J+&<弔=J+e;=J+ :>J+7y[8>J+ 5?\>J+j2>J+>/n->J+x+F3>J+1I'ղ>J+l">J+O>J+Z>J+>J+Ӌ m>J+a a ?J+mӋ ?J+𾘠?J+Z?J+ҾO?J+þl"?J+ղ1I'?J+F3x+?J+n->/?J+j2?J+?\ 5?J+y[87?J+ :?J+޽e;?J+弔& :?J+y[8>7?J+?\> 5?J+>j2?J+n->>/?J+F3>x+?J+ղ>1I'?J+>l"?J+>O?J+>Z?J+>?J+m>Ӌ ?J+a ?a ?J+Ӌ ?m>J+?>J+Z?>J+O?>J+l"?>J+1I'?ղ>J+x+?F3>J+>/?n->J+j2?>J+ 5??\>J+7?y[8>J+ :?>J+e;?=J+&뾻0` ?0L?L0>` 0>>^R0>0u>)0>s0̮>#0+>.'0>AK+0y>.0HW>vl1034>30E>?50=f70|b=80_=/90`L$Bh90_/90|b80ٽf70E?503430HWvl10y.0獾AK+0+.'0̮#0s0uξ)0ܾ0>^R0` 0LL0` 0^R>뾻0ܾ0)uξ0s0#̮0.'+0AK+獾0.y0vl1HW03340?5E0f7ٽ08|b0/9_0Bh90/9_=08|b=0f7=0?5E>0334>0vl1HW>0.y>0AK+>0.'+>0#̮>0s>0)u>0>0^R>>0` >0LL?0` ?0>^R?0ܾ?0uξ)?0s?0̮#?0+.'?0獾AK+?0y.?0HWvl1?0343?0E?5?0ٽf7?0|b8?0_/9?0aBh9?0_=/9?0|b=8?0=f7?0E>?5?034>3?0HW>vl1?0y>.?0>AK+?0+>.'?0̮>#?0>s?0u>)?0>?0>>^R?0>` ?0L?L?0` ?>0^R?>>0?>0)?u>0s?>0#?̮>0.'?+>0AK+?>0.?y>0vl1?HW>03?34>0?5?E>0f7?=08?|b=0/9?_=05?VG5!4?{5%4?5a3? }Խ51?B 5+/?/59-?E0R5 p*?/s5u='?ԋ5#?ʚ5?򩪾5C? 5?N#ɾ5fe?׾5 ?Ƭ5a ?\!5?5\!>a 5Ƭ> 5>fe5N#>5 >C5>5ʚ>#5ԋ>u='5/s> p*5E0R>9-5/>+/5B >15 }=a35=%45{=!45VG$55{!45%45 }Խa35B 15/+/5E0R9-5/s p*5ԋu='5ʚ#5򩪾5 C5N#ɾ5׾fe5Ƭ 5\!a 55a \!5 Ƭ5fe׾5N#ɾ5C 5򩪾5#ʚ5u='ԋ5 p*/s59-E0R5+//51B 5a3 }Խ5%45!4{555!4{=5%4=5a3 }=51B >5+//>59-E0R>5 p*/s>5u='ԋ>5#ʚ>5>5C >5N#>5fe>5 Ƭ>5a \!>5?5\!a ?5Ƭ ?5׾fe?5N#ɾ?5 C?5򩪾?5ʚ#?5ԋu='?5/s p*?5E0R9-?5/+/?5B 1?5 }Խa3?5%4?5{!4?55?5{=!4?5=%4?5 }=a3?5B >1?5/>+/?5E0R>9-?5/s> p*?5ԋ>u='?5ʚ>#?5>?5 >C?5N#>?5>fe?5Ƭ> ?5\!>a ?5??5a ?\!>5 ?Ƭ>5fe?>5?N#>5C? >5?>5#?ʚ>5u='?ԋ>5 p*?/s>59-?E0R>5+/?/>51?B >5a3? }=5%4?=5!4?{=50?`LBh9LO0? Bh9!/?jBh9.?5ϽBh9l!-?Q Bh9s;+?֐+Bh9(?LBh94&?mBh9#?Bh9?3Bh9ȭ?lBh9h?TBh9?#$ľBh9 ?NҾBh9"t?߾Bh9a?"Bh9>Bh9">aBh9>"tBh9N> Bh9#$>Bh9T>hBh9l>ȭBh93>Bh9>#Bh9m>4&Bh9L>(Bh9֐+>s;+Bh9Q >l!-Bh95=.Bh9j=!/Bh9 =LO0Bh9B$0Bh9 LO0Bh9j!/Bh95Ͻ.Bh9Q l!-Bh9֐+s;+Bh9L(Bh9m4&Bh9#Bh93Bh9lȭBh9ThBh9#$ľBh9NҾ Bh9߾"tBh9"aBh9Bh9a"Bh9"t߾Bh9 NҾBh9#$ľBh9hTBh9ȭlBh93Bh9#Bh94&mBh9(LBh9s;+֐+Bh9l!-Q Bh9.5ϽBh9!/jBh9LO0 Bh90Y{Bh9LO0 =Bh9!/j=Bh9.5=Bh9l!-Q >Bh9s;+֐+>Bh9(L>Bh94&m>Bh9#>Bh93>Bh9ȭl>Bh9hT>Bh9#$>Bh9 N>Bh9"t>Bh9a">Bh9>Bh9"a?Bh9߾"t?Bh9NҾ ?Bh9#$ľ?Bh9Th?Bh9lȭ?Bh93?Bh9#?Bh9m4&?Bh9L(?Bh9֐+s;+?Bh9Q l!-?Bh95Ͻ.?Bh9j!/?Bh9 LO0?Bh9!0?Bh9 =LO0?Bh9j=!/?Bh95=.?Bh9Q >l!-?Bh9֐+>s;+?Bh9L>(?Bh9m>4&?Bh9>#?Bh93>?Bh9l>ȭ?Bh9T>h?Bh9#$>?Bh9N> ?Bh9>"t?Bh9">a?Bh9>>Bh9a?">Bh9"t?>Bh9 ?N>Bh9?#$>Bh9h?T>Bh9ȭ?l>Bh9?3>Bh9#?>Bh94&?m>Bh9(?L>Bh9s;+?֐+>Bh9l!-?Q >Bh9.?5=Bh9!/?j=Bh9LO0? =Bh9J+?9Q=F+?=\+?Ά=*?aɽ=(?(=S&?{'=-$?6G=!?ӫg=!?Ȕ=i?=~?=u?İ= ?=3 ?̾=/? ھ=m>Y=\!>\!=Y>m= >/=>3 => =İ>u=>~=>i=Ȕ>!=ӫg>!=6G>-$={'>S&=(>(=a=*=Ά=\+==F+==$J+=F+=Ά\+=aɽ*=((={'S&=6G-$=ӫg!=Ȕ!=i=~=İu= =̾3 = ھ/=Ym=\!\!=mY=/ ھ=3 ̾= =uİ=~=i=!Ȕ=!ӫg=-$6G=S&{'=((=*aɽ=\+Ά=F+=J+L=F+==\+Ά==*a==((>=S&{'>=-$6G>=!ӫg>=!Ȕ>=i>=~>=uİ>= >=3 >=/ >=mY>=\!\!>=Ym>= ھ/?=̾3 ?= ?=İu?=~?=i?=Ȕ!?=ӫg!?=6G-$?={'S&?=((?=aɽ*?=Ά\+?=F+?=>9J+?==F+?=Ά=\+?=a=*?=(>(?={'>S&?=6G>-$?=ӫg>!?=Ȕ>!?=>i?=>~?=İ>u?=> ?=>3 ?= >/?=Y>m>=\!>\!>=m>Y>=/? >=3 ?>= ?>=u?İ>=~?>=i?>=!?Ȕ>=!?ӫg>=-$?6G>=S&?{'>=(?(>=*?a==\+?Ά==F+?==V6'?UpA'?FpA6h&? pAg%?GĽpA#?h|pA|3"?]"pA ?(BpA p?TapA{?pAx(?"pAw?pA8l?pA+ ?˹pA_N?i7ǾpAA?(ԾpA>pAMy>MypA>pA(>ApAi7>_NpA˹>+ pA>8lpA>wpA">x(pA>{pATa> ppA(B> pA]">|3"pAh|>#pAG=g%pA =6h&pAF='pAp8$V6'pAF'pA 6h&pAGĽg%pAh|#pA]"|3"pA(B pATa ppA{pA"x(pAwpA8lpA˹+ pAi7Ǿ_NpA(ԾApApAMyMypApAA(ԾpA_Ni7ǾpA+ ˹pA8lpAwpAx("pA{pA pTapA (BpA|3"]"pA#h|pAg%GĽpA6h& pA'FpAV6'pA'F=pA6h& =pAg%G=pA#h|>pA|3"]">pA (B>pA pTa>pA{>pAx(">pAw>pA8l>pA+ ˹>pA_Ni7>pAA(>pA>pAMyMy>pA>pA(ԾA?pAi7Ǿ_N?pA˹+ ?pA8l?pAw?pA"x(?pA{?pATa p?pA(B ?pA]"|3"?pAh|#?pAGĽg%?pA 6h&?pAF'?pAkT V6'?pAF='?pA =6h&?pAG=g%?pAh|>#?pA]">|3"?pA(B> ?pATa> p?pA>{?pA">x(?pA>w?pA>8l?pA˹>+ ?pAi7>_N?pA(>A?pA>>pAMy>My>pA>>pAA?(>pA_N?i7>pA+ ?˹>pA8l?>pAw?>pAx(?">pA{?>pA p?Ta>pA ?(B>pA|3"?]">pA#?h|>pAg%?G=pA6h&? =pA'?F=pAg"?aGZE5"?Eg!?~E ?BEH?wE?/E^i? <EB?ZE ?,xE?ߊEg:?4EL ?BE?TtEq?}E>ξE> ھEƬ>ƬE >E>E}>qETt>EB>L E4>g:Eߊ>E,x> EZ>BE <>^iE/>Ew=HEB= E~=g!E<5"E#3$g"E5"E~g!EB EwHE/E <^iEZBE,x EߊE4g:EBL ETtE}qEξE ھEƬƬE ھEξEq}ETtEL BEg:4EߊE ,xEBZE^i <E/EHwE BEg!~E5"Eg"[#E5"<Eg!~=E B=EHw=E/>E^i <>EBZ>E ,x>Eߊ>Eg:4>EL B>ETt>Eq}>E>E >EƬƬ>E ھ>Eξ>E}q?ETt?EBL ?E4g:?Eߊ?E,x ?EZB?E <^i?E/?EwH?EB ?E~g!?E5"?EDZg"?E<5"?E~=g!?EB= ?Ew=H?E/>?E <>^i?EZ>B?E,x> ?Eߊ>?E4>g:?EB>L ?ETt>?E}>q?E>>E >>EƬ>Ƭ>E> >E>>Eq?}>E?Tt>EL ?B>Eg:?4>E?ߊ>E ?,x>EB?Z>E^i? <>E?/>EH?w=E ?B=Eg!?~=E5"?<E?^I@O?LI?wIk?+ḽIy? I|?I?6IJ?Z=TI?qI`?㭆I ?C}Iv?I?I]>IH>>ǾIf>EӾIռ>ռ޾IE>fI>>HI>]I>I>vIC}> I㭆>`Iq>IZ=T>JI6>I>|I =yI+=kIw=IL<@OIܹ-$IL@OIwI+ḽkI yI|I6IZ=TJIqI㭆`IC} IvII]I>ǾHIEӾfIռ޾ռ޾IfEӾIH>ǾI]IIvI C}I`㭆IqIJZ=TI6I|Iy Ik+ḽIwI@OLII@OL<Iw=Ik+=Iy =I|>I6>IJZ=T>Iq>I`㭆>I C}>Iv>I>I]>IH>>IfE>Iռ޾ռ>IEӾf>I>ǾH>I]>I?Iv?IC} ?I㭆`?Iq?IZ=TJ?I6?I|?I y?I+ḽk?Iw?IL@O?IeK?IL<@O?Iw=?I+=k?I =y?I>|?I6>?IZ=T>J?Iq>?I㭆>`?IC}> ?I>v?I>?I>]>I>>H>IE>f>Iռ>ռ>If>E>IH>>>I]>>I?>Iv?>I ?C}>I`?㭆>I?q>IJ?Z=T>I?6>I|?>Iy? =Ik?+=I?w=I@O?L<I?DbMP?rM? )oM4?M?8M?7M?1M?bMM ?voiM ?JgM}?lƏM?̜M>rM >篵ME>}M>̾M>׾M>M}>EM篵> Mr>M̜>MlƏ>}MJg> Mvoi> MbM>M1>M7>M8=M=4M )o=MrM1>MbM>M voi>M Jg>M}lƏ>M̜>Mr>M 篵>ME}>M>M׾>M̾>M}E>M篵 >Mr>M̜?MlƏ}?MJg ?Mvoi ?MbM?M1?M7?M8?M4?M )o?MrYP?MP?Mr?M1>?MbM>?Mvoi> ?MJg> ?MlƏ>}?M̜>?Mr>>M篵> >M}>E>M>>M>>M>>ME>}>M >篵>M>r>M?̜>M}?lƏ>M ?Jg>M ?voi>M?bM>M?1>M?7>M?8=M4?=M? )o=MP?r<M*h?f=MQ:?t=MQu?,g=MQ?]=MQ?=MQC?D=MQB ?(+=MQC ?F=MQ/?a=MQA?)|=MQT?i=MQ>=MQ >.ʣ=MQ>ў=MQ>$=MQOq>ž=MQv>vо=MQ>Oqھ=MQ$>=MQў>=MQ.ʣ> =MQ>=MQi>T=MQ)|>A=MQa>/=MQF>C =MQ(+>B =MQD>C=MQ==MQ]==MQ,g=u=MQt<:=MQ"$*h=MQt缶:=MQ,gu=MQ]=MQ=MQDC=MQ(+B =MQFC =MQa/=MQ)|A=MQiT=MQ=MQ.ʣ =MQў=MQ$=MQžOqھ=MQvоvо=MQOqھž=MQ$=MQў=MQ .ʣ=MQ=MQTi=MQA)|=MQ/a=MQC F=MQB (+=MQCD=MQ=MQ]=MQu,g=MQ:t=MQ*hg =MQ:t<=MQu,g==MQ]==MQ==MQCD>=MQB (+>=MQC F>=MQ/a>=MQA)|>=MQTi>=MQ>=MQ .ʣ>=MQў>=MQ$>=MQOqھ>=MQvоv>=MQžOq>=MQ$>=MQў>=MQ.ʣ >=MQ>=MQiT?=MQ)|A?=MQa/?=MQFC ?=MQ(+B ?=MQDC?=MQ?=MQ]?=MQ,gu?=MQt缶:?=MQ *h?=MQt<:?=MQ,g=u?=MQ]=?=MQ=?=MQD>C?=MQ(+>B ?=MQF>C ?=MQa>/?=MQ)|>A?=MQi>T?=MQ>>=MQ.ʣ> >=MQў>>=MQ$>>=MQ>Oq>=MQv>v>=MQOq>>=MQ>$>=MQ>ў>=MQ >.ʣ>=MQ>>=MQT?i>=MQA?)|>=MQ/?a>=MQC ?F>=MQB ?(+>=MQC?D>=MQ?==MQ?]==MQu?,g==MQ:?t<=MQ9?Fj1T ?Q߼1T ? _1Tů ?z1T?~ ?ݽ1T ?}; 1T?$%1T{?p?1TQf?ɵY1T?>1T><1T^>u1TUy>r1Td>Tt1T>1TN#>N#ɾ1T>Ҿ1TTt>d۾1Tr>Uy1Tu>^1T<>1T>>1T1TɵY>Qf1Tp?>{1T$%>1T}; > 1T=?~ 1Tz=ů 1T _= 1TQ< 1T$91TQ߼ 1T _ 1Tzů 1Tݽ?~ 1T}; 1T$%1Tp?{1TɵYQf1T1T<1Tu^1TrUy1TTtd۾1TҾ1TN#ɾN#ɾ1TҾ1Td۾Tt1TUy侥r1T^u1T<1T>1T1T$%>1T{p?>1TQfɵY>1T1T>>1T<>1T^u>1TUy侥r>1Td۾Tt>1TҾ>1TN#ɾN#>1T>1TTtd>1TrUy>1Tu^>1T<>1T>>1T ?1T$%>?1Tp?>{?1TɵY>Qf?1T?1T>>>1T<>>1Tu>^>1Tr>Uy>1TTt>d>1T>>1TN#>N#>1T>>1Td>Tt>1TUy>r>1T^>u>1T><>1T>>>1T?1TQf?ɵY>1T{?p?>1T?$%>1T ?}; >1T?~ ?=1Tů ?z=1T ? _=1T ?Q<1T?ƐnSHX_? ׼SHXL?6VSHXz?ĠSHXS?pսSHX?SHX?cSHX ?8SHXf>QSHX>;jSHX&>SHX>ҌSHXQ>^.SHX}>Y,SHX>ŭSHX>SHX>SHX>ʾSHXŭ>ӾSHXY,>}ܾSHX^.>QSHXҌ>SHX>&SHX;j>SHXQ>fSHX8> SHXc>SHX>SHXp=SSHXĠ=zSHX6V=LSHX <_SHX$SHX ׼_SHX6VLSHXĠzSHXpսSSHXSHXcSHX8 SHXQfSHX;jSHX&SHXҌSHX^.QSHXY,}ܾSHXŭӾSHXʾSHXSHXʾSHXӾŭSHX}ܾY,SHXQ^.SHX꾉ҌSHX&SHX;jSHXfQSHX 8SHXcSHXSHXSpսSHXzĠSHXL6VSHX_ ׼SHX&-SHX_ SHXc>SHX 8>SHXfQ>SHX;j>SHX&>SHX꾉Ҍ>SHXQ^.>SHX}ܾY,>SHXӾŭ>SHXʾ>SHX>SHX>SHXŭ>SHXY,}>SHX^.Q>SHXҌ>SHX&>SHX;j>SHXQf>SHX8 ?SHXc?SHX?SHXpսS?SHXĠz?SHX6VL?SHX ׼_?SHXݚ⤛?SHX <_?SHX6V=L?SHXĠ=z?SHXp=S?SHX>?SHXc>?SHX8> ?SHXQ>f>SHX;j>>SHX>&>SHXҌ>>SHX^.>Q>SHXY,>}>SHXŭ>>SHX>>SHX>>SHX>>SHX>ŭ>SHX}>Y,>SHXQ>^.>SHX>Ҍ>SHX&>>SHX>;j>SHXf>Q>SHX ?8>SHX?c>SHX?>SHXS?p=SHXz?Ġ=SHXL?6V=SHX_? ^[>\[t>KZ1[#/>uI[>'a[#>)x[>R[%><[k>̜[x>B[>İ[ > [İ>þ[B>x˾[̜>kӾ[<>%ھ[R>[)x>#['a>[uI>#/[KZ1>t[\>[^= U[[tKZ1>[#/uI>['a>[#辥)x>[ᾋR>[%ھ<>[kӾ̜>[x˾B>[þİ>[  >[İ>[Bx>[̜k>[<%>[R>[)x#>['a>[uI#/>[KZ1t>[\>[^ U>[[\>>[KZ1>t>[uI>#/>['a>>[)x>#>[R>>[<>%>[̜>k>[B>x>[İ>>[ > >[>İ>[x>B>[k>̜>[%><>[>R>[#>)x>[>'a>[#/>uI>[t>KZ1>[>\>[ U>^=[?ٰu^U>e Ƽ^&>LE^>.^ȃ>\Ľ^>G^G>Ń^> *^a'>&A^^">W^>Qm^u>^8>4^X>>U^u>^C>+z^r>r^+z>C^>uþ^>U>Xʾ^4>8Ѿ^>uؾ^Qm>޾^W>^"^&A>a'^ *>^Ń>G^G=^\=ȃ^.=^LE=&^e UXʾ^uþ^+zC^rr^C+z^uþ^Xʾ>U^8Ѿ4^uؾ^޾Qm^^"來W^a'龤&A^ *^GŃ^G^ȃ\Ľ^.^&LE^Ue Ƽ^']^Ue <^&LE=^.=^ȃ\=^G=^GŃ>^ *>^a'龤&A>^^"來W>^޾Qm>^uؾ>^8Ѿ4>^Xʾ>U>^uþ>^C+z>^rr>^+zC>^u>^>UX>^48>^u>^Qm>^W^">^&Aa'>^ *>^ŃG>^G>^\Ľȃ>^.>^LE&>^e ƼU>^Ф']>^e ^LE=&>^.=>^\=ȃ>^G=>^Ń>G>^ *>>^&A>a'>^W>^">^Qm>>^>u>^4>8>^>U>X>^>u>^+z>C>^r>r>^C>+z>^u>>^X>>U>^8>4>^u>>^>Qm>^^">W>^a'>&A>^> *>^G>Ń>^>G=^ȃ>\=^>.=^&>LE=^U>e <^Z>Sya}>{ad1>jA=a*>a>Xa=>꽘ad> a?>Ş"a>8a.>bNa1>Lcag>)xa>a>lƏa>4aղ>a>򩪾a>ղa4>alƏ>a>Ⱦa)x>gϾaLc>1ԾabN>.ھa8>޾aŞ">?㾘a >d澘a==꾘aX=쾘a=*ajA==d1a{<}aT$Za{}ajA=d1a*aX쾘a=꾘a d澘aŞ"?㾘a8޾abN.ھaLc1Ծa)xgϾaȾalƏa4aղa򩪾򩪾aղa4alƏaȾagϾ)xa1ԾLca.ھbNa޾8a?Ş"ad澗 a=꽘aXa*ad1jA=a}{aZ?a}{a?Ş">a޾8>a.ھbN>a1ԾLc>agϾ)x>aȾ>alƏ>a4>aղ>a򩪾>aղ>a4>alƏ>a>a)xg>aLc1>abN.>a8>aŞ"?>a d>a=>aX>a*>ajA=d1>a{}>a~ǤZ>a{<}>ajA==d1>a=*>aX=>a==>a >d>aŞ">?>a8>>abN>.>aLc>1>a)x>g>a>>alƏ>>a4>>a>ղ>a>>aղ>>a>4>a>lƏ>a>>ag>)x>a1>Lc>a.>bN>a>8>a?>Ş">ad> >a=>=a>X=a*>=ad1>jA==a}>{f9|Ydx>Yd>X4Yd>*Yd>ԣYd[M>߽YdI>̥Yd>Yd>/00Ydh>DYd>1YYd2s>lYdg> Yd1>m!Yd> YdT>򗚾YdƢ>ƢYd>TYd >Ydm!>1渾Yd >gYdl>2sžYd1Y>˾YdD>hоYd/00>ԾYd>ؾYd̥>IܾYd=[M߾Ydԣ=Yd*=YdX4=YdYdؾ>YdԾ/00>YdhоD>Yd˾1Y>Yd2sžl>Ydg >Yd1渾m!>Yd򱾸 >YdT>YdƢƢ>Yd򗚾T>Yd >Ydm!1>Yd g>Ydl2s>Yd1Y>YdDh>Yd/00>Yd>Yd̥I>Yd߽[M>Ydԣ>Yd*>YdX4>Ydx>YdApu3>YdYdX4=>Yd*=>Ydԣ=>Yd=[M>Yd̥>I>Yd>>Yd/00>>YdD>h>Yd1Y>>Ydl>2s>Yd >g>Ydm!>1>Yd >>Yd>T>YdƢ>Ƣ>YdT>>Yd> >Yd1>m!>Ydg> >Yd2s>l>Yd>1Y>Ydh>D>Yd>/00>Yd>>YdI>̥>Yd[M>=Yd>ԣ=Yd>*=Yd>X4=Ydx>Ckg>oܫkg>p+kg>f{kg>Ӫkg Y>Խkgk{>.kg>~kg>>'kg>0;kgO>bNkgû>'akg>Jgkg7>ߊkgF3>kgʚ>ʚkg>F3kgߊ>7kgJg>'ԯkgkg'a>ûkgbN>Okg0;>žkg'>>ʾkg~>ξkg.=k{Ѿkg= YԾkgӪ=־kgf{=ؾkgp+=پkgoܫ<ھkg5v#ھkgoܫھkgp+پkgf{ؾkgӪ־kgԽ YԾkg.k{Ѿkg~ξkg'>ʾkg0;žkgbNOkg'aûkgʾ'kgξ~kgk{Ѿ.kg YԾԽkg־Ӫkgؾf{kgپp+kgھoܫkgھ\kgھoܫkg>ʾ'>kgž0;>kgObN>kgû'a>kgkg'ԯJg>kg7ߊ>kgF3>kgʚʚ>kgF3>kgߊ7>kgJg'ԯ>kgkg'aû>kgbNO>kg0;>kg'>>kg~>kg.k{>kgԽ Y>kgӪ>kgf{>kgp+>kgoܫ>kg>kgoܫ<>kgp+=>kgf{=>kgӪ=>kg= Y>kg.=k{>kg~>>kg'>>>kg0;>>kgbN>O>kg'a>û>kg>kgJg>'ԯ>kgߊ>7>kg>F3>kgʚ>ʚ>kgF3>>kg7>ߊ>kg'ԯ>Jg>kg>kgû>'a>kgO>bN>kg>0;>kg>>'>kg>~>kgk{>.=kg Y>=kg>Ӫ=kg>f{=kg>p+=kg>oܫ3 j;>K䢼 j|>" j<>s j/>顽 jC>Vɽ j> jZ>W j> j>k1 j>8C j>UU j*>f j>2w jc>M j4>bV j> jbV>4 jM>c j2w> jf>* jUU> j8C> jk1> j> jW >Zþ j=ƾ jV=Cɾ j=/˾ js=<; j"=|ξ jK<;Ͼ j+#{Ͼ jK䢼;Ͼ j"|ξ js<; j顽/˾ jVɽCɾ j𽤌ƾ jW Zþ j jk1 j8C jUU jf* j2w jMc jbV4 j j4bV jcM j2w j*f jUU j8C jk1 j jZþW jƾ jCɾVɽ j/˾顽 j<;s j|ξ" j;ϾK䢼 j{ϾH j;ϾK< j|ξ"= j<;s= j/˾= jCɾV= jƾ= jZþW > j> jk1> j8C> jUU> j*f> j2w> jcM> j4bV> j> jbV4> jMc> j2w> jf*> jUU> j8C> jk1> j> jW Z> j𽤌> jVɽC> j顽/> js<> j"|> jK䢼;> j {> jK<;> j"=|> js=<> j=/> jV=C> j=> jW >Z> j>> jk1>> j8C>> jUU>> jf>*> j2w>> jM>c> jbV>4> j>> j4>bV> jc>M> j>2w> j*>f> j>UU> j>8C> j>k1> j>> jZ>W > j>= jC>V= j/>= j<>s= j|>"= j;>K< j>p^l>ә^l>^l0>e^lJ+>5昽^l>n^l@>^lz>,^l>^lF>'^l]̬>8^l>uI^l>ɵY^l'`>voi^lu>,x^ln->Ȕ^lԋ>ԋ^lȔ>n-^l,x>u^lvoi>'`^lɵY>颾^luI>^l8>]̬^l'>F^l>^l,>z^l=@^ln=^l5=J+^le=0^l=¾^lә<þ^l#þ^lәþ^l¾^le0^l5昽J+^ln^l@^l,z^l^l'F^l8]̬^luI^lɵY颾^lvoi'`^l,xu^lȔn-^lԋԋ^ln-Ȕ^lu,x^l'`voi^l颾ɵY^luI^l]̬8^lF'^l^lz,^l@^ln^lJ+5昽^l0e^l¾^lþә^lþ^lþә<^l¾=^l0e=^lJ+5=^ln=^l@=^lz,>^l>^lF'>^l]̬8>^luI>^l颾ɵY>^l'`voi>^lu,x>^ln-Ȕ>^lԋԋ>^lȔn->^l,xu>^lvoi'`>^lɵY>^luI>^l8]̬>^l'F>^l>^l,z>^l@>^ln>^l5昽J+>^le0>^l>^lә>^l!>^lә<>^l=>^le=0>^l5=J+>^ln=>^l=@>^l,>z>^l>>^l'>F>^l8>]̬>^luI>>^lɵY>>^lvoi>'`>^l,x>u>^lȔ>n->^lԋ>ԋ>^ln->Ȕ>^lu>,x>^l'`>voi>^l>ɵY>^l>uI>^l]̬>8>^lF>'>^l>>^lz>,>^l@>=^l>n=^lJ+>5=^l0>e=^l>=^l>ә<^l*D>nW > na>r}nE>LXnù>Tˏny>nT>lսn~>KOne=> n!>en">-n >v=n86>Ln >و[np>hinD>}wnK>Kn}w>Dnhi>pnو[> nL>86nv=> n->"ne>!n >e=nKO=~nl=Tn=ynTˏ=ùnLX=Enr}=an n!e>n"->n v=>n86L>n و[>nphi>nD}w>nKK>n}wD>nhip>nو[ >nL86>nv= >n-">ne!>n e=>nKO~>nlսT>ny>nTˏù>nLXE>nr}a>n W >n#p*D>n nr}=a>nLX=E>nTˏ=ù>n=y>nl=T>nKO=~>n >e=>ne>!>n->">nv=> >nL>86>nو[> >nhi>p>n}w>D>nK>K>nD>}w>np>hi>n >و[>n86>L>n >v=>n">->n!>e>ne=> >n~>KO=nT>l=ny>=nù>Tˏ=nE>LX=na>r}=nW > + qG>j q3>A q垪>8yJ q^,>G qQ>蠟 qs>3HȽ qg>o q[>, qL>~ q>Ş" q>KZ1 qk>p? q>bM qU>Z q>ӫg q/s>/s qӫg> qZ>U qbM> qp?>k qKZ1> qŞ"> q~>L훾 q,>[ qo=g q3H=s q蠟=Q qG=^, q8yJ=垪 qA=3 qj qL훾~> qŞ"> qKZ1> qkp?> qbM> qUZ> qӫg> q/s/s> qӫg> qZU> qbM> qp?k> qKZ1> qŞ"> q~L> q,[> qo轙g> q3HȽs> q蠟Q> qG^,> q8yJ垪> qA3> qjG> q|> qj qA=3> q8yJ=垪> qG=^,> q蠟=Q> q3H=s> qo=g> q,>[> q~>L> qŞ">> qKZ1>> qp?>k> qbM>> qZ>U> qӫg>> q/s>/s> q>ӫg> qU>Z> q>bM> qk>p?> q>KZ1> q>Ş"> qL>~> q[>,> qg>o= qs>3H= qQ>蠟= q^,>G= q垪>8yJ= q3>A= qG>j< q嚠>Gs^i>1-|Gsԟ>nGsݞ>vzGsʛ>kGs>|Gs|7>lؽGs5a>Gsl/>U Gs>jGsl>"%Gsɉ>lt2Gs>:X?Gs|Lx>KGsAn>&WGs=!c>=!cGs&W>AnGsK>|LxGs:X?>Gslt2>ɉGs"%>lGsj>GsU >l/Gs=5aGsl=|7Gs|=Gsk=ʛGsz=ℝGsv<=ݞGsn<ԟGs1-|<^iGs&#嚠Gs1-|^iGsnԟGsv<ݞGszℝGskʛGs|Gslؽ|7Gs5aGsU l/GsjGs"%lGslt2ɉGs:X?GsK|LxGs&WAnGs=!c=!cGsAn&WGs|LxKGs:X?Gsɉlt2Gsl"%GsjGsl/U Gs5aGs|7lؽGs|GsʛkGsℝzGsݞvGsj>Gsl"%>Gsɉlt2>Gs:X?>Gs|LxK>GsAn&W>Gs=!c=!c>Gs&WAn>GsK|Lx>Gs:X?>Gslt2ɉ>Gs"%l>Gsj>GsU l/>Gs5a>Gslؽ|7>Gs|>Gskʛ>Gszℝ>Gsv<ݞ>Gsnԟ>Gs1-|^i>Gs#݄嚠>Gs1-|<^i>Gsn<ԟ>Gsv<=ݞ>Gsz=ℝ>Gsk=ʛ>Gs|=>Gsl=|7>Gs=5a>GsU >l/>Gsj>>Gs"%>l>Gslt2>ɉ>Gs:X?>>GsK>|Lx>Gs&W>An>Gs=!c>=!c>GsAn>&W>Gs|Lx>K>Gs>:X?>Gsɉ>lt2>Gsl>"%>Gs>j>Gsl/>U >Gs5a>=Gs|7>l=Gs>|=Gsʛ>k=Gsℝ>z=Gsݞ>v<=Gsԟ>n1-| t]r>]i t> ta>v. tő>g t+>s t9>; t >3HȽ tO> t)[>. t> t ~>\ t'w>$% t1n>1 tMe> < t?\>6G tE0R>E0R t6G>?\ t <>Me t1>1n t$%>'w t\> ~ t > t.=)[ t=O t3H= t;=9 ts=+ tg=ő tv.=a t<蓾 t]i<]r t3#1 t]i]r t蓾 tv.a tgő ts+ t;9 t3HȽ tO t.)[ t  t\ ~ t$%'w t11n t t ~\> t'w$%> t1n1> tMe <> t?\6G> tE0RE0R> t6G?\> t t11n> t$%'w> t\ ~> t > t.)[> tO> t3HȽ > t;9> ts+> tgő> tv.a> t> t]i]r> tLu1> t]i<]r> t<> tv.=a> tg=ő> ts=+> t;=9> t3H= > t=O> t.=)[> t >> t\> ~> t$%>'w> t1>1n> t <>Me> t6G>?\> tE0R>E0R> t?\>6G> tMe> <> t1n>1> t'w>$%> t ~>\> t> > t)[>.= tO>= t >3H= t9>;= t+>s= tő>g= ta>v.= t>< t]r>]i< t>vwd>jVv=>(ּv3>K v> Uvv>vE>v >vS|>Eѽv[v>ފvlp>vAj>h vc>v][>"vS>B-v1]J>}i7vA>Av}i7>1]JvB->Sv">][v>cvh >Ajv>lpvފ=[vvE=S|v= v=Ev=vv U=vK =3v(<=懾vjVvAjh >vc>v][">vSB->v1]J}i7>vAA>v}i71]J>vB-S>v"][>vc>vh Aj>vlp>vފ[v>vEѽS|>v >vE>vv>v U>vK 3>v(ּ=>vjVwd>vea>vjVv(<=>vK =3>v U=>v=v>v=E>v= >vE=S|>vފ=[v>v>lp>vh >Aj>v>c>v">][>vB->S>v}i7>1]J>vA>A>v1]J>}i7>vS>B->v][>">vc>>vAj>h >vlp>>v[v>ފ=vS|>E=v >=vE>=vv>=v> U=v3>K =v=>(<vwd>jV<vx>Sxx>yVCSxw>=üSxcv>uSxt>)BSxZq>DqSxn>sSxfDj>蠟Sx>e>nSxQ`>ԽSxn[>SxiU>^SxN>}; SxG>7SxU@>/Sxy[8>{'Sx/>/Sx{'>y[8Sx/>U@Sx7>GSx}; >NSx^=iUSx=n[Sx=Q`Sxn=>eSx蠟=fDjSxs=nSxDq=ZqSx)B=tSxu=cvSx=<wSxyVC<xSx9#xSxyVCxSx=üwSxucvSx)BtSxDqZqSxsnSx蠟fDjSxn>eSxԽQ`Sx꽭n[Sx^iUSx}; NSx7GSx/U@Sx{'y[8Sx//Sxy[8{'SxU@/SxG7SxN}; SxiU^Sxn[SxQ`ԽSx>enSxfDj蠟SxnsSxZqDqSxt)BSxcvuSxw=üSxxyVCSxx\ͤSxxyVCen=SxQ`=Sxn[=SxiU^=SxN}; >SxG7>SxU@/>Sxy[8{'>Sx//>Sx{'y[8>Sx/U@>Sx7G>Sx}; N>Sx^iU>Sx꽭n[>SxԽQ`>Sxn>e>Sx蠟fDj>Sxsn>SxDqZq>Sx)Bt>Sxucv>Sx=üw>SxyVCx>SxMx>SxyVC<x>Sx=<w>Sxu=cv>Sx)B=t>SxDq=Zq>Sxs=n>Sx蠟=fDj>Sxn=>e>Sx=Q`>Sx=n[>Sx^=iU>Sx}; >N>Sx7>G>Sx/>U@>Sx{'>y[8>Sx/>/>Sxy[8>{'>SxU@>/>SxG>7>SxN>}; >SxiU>^=Sxn[>=SxQ`>=Sx>e>n=SxfDj>蠟=Sxn>s=SxZq>Dq=Sxt>)B=Sxcv>u=Sxw>=yVCy`>$0yG_>yk]>~yu \>/yʢY>PZyV>Ay>S>C+yHO>yJ>,ڿyE>[ӽyp@>潝yZ:>Ky54>yn->UyS=&>yp>py>S=&yU>n-y>54yK=Z:y=p@y[=Ey,ڿ=Jy=HOyC+=>SyA=VyPZ=ʢYy/=u \y~=k]ySyHOy,ڿJy[ӽEy潑p@yKZ:y54yUn-yS=&yppyS=&yn-Uy54yZ:Kyp@潝yE[ӽyJ,ڿyHOy>SC+yVAyʢYPZyu \/yk]~yG_y`$0y\`+Ǥy`$0SC+=yHO=yJ,ڿ=yE[=yp@=yZ:K=y54>yn-U>yS=&>ypp>yS=&>yUn->y54>yKZ:>y潑p@>y[ӽE>y,ڿJ>yHO>yC+>S>yAV>yPZʢY>y/u \>y~k]>yG_>y$0`>y,9\`>y$0<`>yy~=k]>y/=u \>yPZ=ʢY>yA=V>yC+=>S>y=HO>y,ڿ=J>y[=E>y=p@>yK=Z:>y>54>yU>n->y>S=&>yp>p>yS=&>>yn->U>y54>>yZ:>K=yp@>=yE>[=yJ>,ڿ=yHO>=y>S>C+=yV>A=yʢY>PZ=yu \>/=yk]>~=yG_>$0y{(G>{F>'{:E>o꼾{C> {A>)B{+?>g{8<>G{Ӑ8>5昽{4>Ӫ{/0>X{Y+>ݽ{ru >8{m>w{>({B >B {(>{w=m{8=ru {=&{{B B >{(>{wm>{8ru >{ݽ&>{{X/0>{Ӫ4>{5昽Ӑ8>{G8<>{g+?>{)BA>{ C>{o:E>{'F>{(G>{D%G>{<(G>{'<F>{o<:E>{ =C>{)B=A>{g=+?>{G=8<>{5=Ӑ8>{Ӫ=4>{X=/0>{{=&>{8=ru >{w=m>{(>>{B >B >{>(>{m>w={ru >8={&>={Y+>X={4>Ӫ={Ӑ8>5={8<>G={+?>g={A>)B={C> ={:E>o<{F>'<{(G><{/>(;|.>p (;|8.>cF(;|+->ͼ(;|+>*(;|)>7&*(;|؆'>TFK(;|$>k(;|,!>+(;|A>)(;|d> (;|(>(;|>½(;| >zн(;|S>޽(;|>"(;|J=J(;|"=(;|=S(;|z= (;|=(;|=((;| =d(;|)=A(;|+=,!(;|k=$(;|TFK=؆'(;|7&*=)(;|*=+(;|<+-(;|cF<8.(;|p <.(;|A#/(;|p .(;|cF8.(;|ͼ+-(;|*+(;|7&*)(;|TFK؆'(;|k$(;|+,!(;|)A(;| d(;|((;|½(;|zн (;|޽S(;|"(;|JJ(;|"(;|S޽(;| zн(;|½(;|((;|d (;|A)(;|,!+(;|$k(;|؆'TFK(;|)7&*(;|+*(;|+-ͼ(;|8.cF(;|.p (;|/^b(;|.p <(;|8.cF<(;|+-<(;|+*=(;|)7&*=(;|؆'TFK=(;|$k=(;|,!+=(;|A)=(;|d =(;|(=(;|=(;| z=(;|S=(;|"=(;|JJ=(;|">(;|޽S>(;|zн >(;|½>(;|(>(;| d>(;|)A>(;|+,!>(;|k$>(;|TFK؆'>(;|7&*)>(;|*+>(;|ͼ+->(;|cF8.>(;|p .>(;|{/>(;|p <.>(;|cF<8.>(;|<+->(;|*=+>(;|7&*=)>(;|TFK=؆'>(;|k=$>(;|+=,!>(;|)=A>(;| =d>(;|=(>(;|=>(;|z= >(;|=S>(;|"=>(;|J=J=(;|>"=(;|S>=(;| >z=(;|>=(;|(>=(;|d> =(;|A>)=(;|,!>+=(;|$>k=(;|؆'>TFK=(;|)>7&*=(;|+>*=(;|+-><(;|8.>cF<(;|.>p <(;|@>̨:}.>뻬:}L>k:}1>U_:}n]>o꼬:}ȿ>u:}?>v.:} x >8yJ:} >e:}>f{:}>:}>m}:}&=z󦽬:}]=:}J=B:}=aɽ:} }= }Խ:}a=޽:}B=J转:}=]:}z=&:}m}=:}=:}f{=:}e= :}8yJ= x :}v.=?:}u=ȿ:}o:}>:}f{>:}e >:}8yJ x >:}v.?>:}uȿ>:}on]>:}U_1>:}kL>:}.>:}@>:};.>:}k:}U_<1>:}o:}u=ȿ>:}v.=?>:}8yJ= x >:}e= >:}f{=>:}=>:}m}=>:}z=&=:}=]=:}B=J=:}a==:} }= }=:}=a=:}J=B=:}]==:}&=z=:}>m}=:}>=:}>f{=:} >e=:} x >8yJ=:}?>v.=:}ȿ>u=:}n]>o<:}1>U_<:}L>k<:}.>;:}s=. $~$e=eĻ$~i}=D$~=#$~G=`ü$~/=]$~= $~ =#($~(=?$~=_V$~W=[l$~=Q‽$~nr=G$~\=W$~=` $~=[$~E=E$~[=$~` =$~W=\ɽ$~G=nrн$~Q=׽$~[l=Wݽ$~_V=$~?=($~#(= $~ =$~]</$~`CM<Cq(IhCMCq(q(CMCIh>CnzWoC(b_CspTNCMu=CU+CC'J5uCboCKüeûC-ż✻CƼkCȼCȼ՝C ɼ'Cȼ՝:Cȼ;CƼk;C-ż;CKüe;Cbo;C'J5uIh=??>?@??A@?BA?CB?DC?ED?FE?GF?HG?IH?JI?KJ?LK?ML?NM?ON?PO?QP?RQ?SR?TS?UT?VU?WV?XW?YX?ZY?[Z?\[?]\?^]?_^?`_?a`?ba?cb?dc?ed?fe?gf?hg?ih?ji?kj?lk?ml?nm?on?po?qp?rq?sr?ts?ut?vu?wv?xw?yx?zy?{z?|{?}|?~}?~???????????????????????????? ?? ? ?? ? ?? ? ?? ? ?? ??????????????????????????????????????????????????????? ?? ?!??!?"??"?#??#?$??$?%??%?&??&?'??'?(??(?)??)?*??*?+??+?,??,?-??-?.??.?/??/?0??0?1??1?2??2?3??3?4??4?5??5?6??6?7??7?8??8?9??9?:??:?;??;???>??????@??@?A??A?B??B?C??C?D??D?E??E?F??F?G??G?H??H?I??I?J??J?K??K?L??L?M??M?N??N?O??O?P??P?Q??Q?R??R?S??S?T??T?U??U?V??V?W??W?X??X?Y??Y?Z??Z?[??[?\??\?]??]?^??^?_??_?`??`?a??a?b??b?c??c?d??d?e??e?f??f?g??g?h??h?i??i?j??j?k??k?l??l?m??m?n??n?o??o?p??p?q??q?r??r?s??s?t??t?u??u?v??v?w??w?x??x?y??y?z??z?{??{?|??|?}??}?~???~????             !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                                                                                                 ! ! " ! " # " # $ # $ % $ % & % & ' & ' ( ' ( ) ( ) * ) * + * + , + , - , - . - . / . / 0 / 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 : : : ; ; ; < < < = = = > > > ? ? ? @ @ @ A @ A B A B C B C D C D E D E F E F G F G H G H I H I J I J K J K L K L M L M N M N O N O P O Q Q P R R Q S S R T T S U U T V V U W W V X X W Y Y X Z Z Y [ [ Z \ \ [ ] ] \ ^ ^ ] _ _ ^ ` ` _ a a ` a a b b b c c c d d d e e e f f f g g g h h h i i i j j j k k k l l l m m m n n n o o o p q q p r r q s s r t t s u u t v v u w w v x x w y y x z z y { { z | | { } } | ~ ~ }   ~                                                                                                                                    ! !  ! " "  " # #  # $ $  $ % %  % & &  & ' '  ' ( (  ( ) )  ) * *  * + +  + , ,  , - -  - . .  . / /  / 0 0  0 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ A A  A B B  B C C  C D D  D E E  E F F  F G G  G H H  H I I  I J J  J K K  K L L  L M M  M N N  N O O  O P P P Q  P Q R  Q R S  R S T  S T U  T U V  U V W  V W X  W X Y  X Y Z  Y Z [  Z [ \  [ \ ]  \ ] ^  ] ^ _  ^ _ `  _ ` a  `  a b  b  b c  c  c d  d  d e  e  e f  f  f g  g  g h  h  h i  i  i j  j  j k  k  k l  l  l m  m  m n  n  n o  o  o p  p p q  p q r  q r s  r s t  s t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~                                                                                                               ! !  " ! "  # " #  $ # $  % $ %  & % &  ' & '  ( ' (  ) ( )  * ) *  + * +  , + ,  - , -  . - .  / . /  0 / 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ @  A @ A  B A B  C B C  D C D  E D E  F E F  G F G  H G H  I H I  J I J  K J K  L K L  M L M  N M N  O N O  P O  Q Q P  R R Q  S S R  T T S  U U T  V V U  W W V  X X W  Y Y X  Z Z Y  [ [ Z  \ \ [  ] ] \  ^ ^ ]  _ _ ^  ` ` _  a a ` a a b b b c c c d d d e e e f f f g g g h h h i i i j j j k k k l l l m m m n n n o o o p  q q p  r r q  s s r  t t s  u u t  v v u  w w v  x x w  y y x  z z y  { { z  | | {  } } |  ~ ~ }    ~                                                                                                                                    ! !  ! " "  " # #  # $ $  $ % %  % & &  & ' '  ' ( (  ( ) )  ) * *  * + +  + , ,  , - -  - . .  . / /  / 0 0  0 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ A A  A B B  B C C  C D D  D E E  E F F  F G G  G H H  H I I  I J J  J K K  K L L  L M M  M N N  N O O  O P P P Q  P Q R  Q R S  R S T  S T U  T U V  U V W  V W X  W X Y  X Y Z  Y Z [  Z [ \  [ \ ]  \ ] ^  ] ^ _  ^ _ `  _ ` a  `  a b  b  b c  c  c d  d  d e  e  e f  f  f g  g  g h  h  h i  i  i j  j  j k  k  k l  l  l m  m  m n  n  n o  o  o p  p p q  p q r  q r s  r s t  s t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~                                                                                                                ! !  " ! "  # " #  $ # $  % $ %  & % &  ' & '  ( ' (  ) ( )  * ) *  + * +  , + ,  - , -  . - .  / . /  0 / 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ @  A @ A  B A B  C B C  D C D  E D E  F E F  G F G  H G H  I H I  J I J  K J K  L K L  M L M  N M N  O N O  P O  Q Q P  R R Q  S S R  T T S  U U T  V V U  W W V  X X W  Y Y X  Z Z Y  [ [ Z  \ \ [  ] ] \  ^ ^ ]  _ _ ^  ` ` _  a a ` a a b b b c c c d d d e e e f f f g g g h h h i i i j j j k k k l l l m m m n n n o o o p  q q p  r r q  s s r  t t s  u u t  v v u  w w v  x x w  y y x  z z y  { { z  | | {  } } |  ~ ~ }    ~                                                                                                                                    ! !  ! " "  " # #  # $ $  $ % %  % & &  & ' '  ' ( (  ( ) )  ) * *  * + +  + , ,  , - -  - . .  . / /  / 0 0  0 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ A A  A B B  B C C  C D D  D E E  E F F  F G G  G H H  H I I  I J J  J K K  K L L  L M M  M N N  N O O  O P P P Q  P Q R  Q R S  R S T  S T U  T U V  U V W  V W X  W X Y  X Y Z  Y Z [  Z [ \  [ \ ]  \ ] ^  ] ^ _  ^ _ `  _ ` a  `  a b  b  b c  c  c d  d  d e  e  e f  f  f g  g  g h  h  h i  i  i j  j  j k  k  k l  l  l m  m  m n  n  n o  o  o p  p p q  p q r  q r s  r s t  s t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~                                                                                                                ! !  " ! "  # " #  $ # $  % $ %  & % &  ' & '  ( ' (  ) ( )  * ) *  + * +  , + ,  - , -  . - .  / . /  0 / 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ?  @ ? @  A @ A  B A B  C B C  D C D  E D E  F E F  G F G  H G H  I H I  J I J  K J K  L K L  M L M  N M N  O N O  P O  Q Q P  R R Q  S S R  T T S  U U T  V V U  W W V  X X W  Y Y X  Z Z Y  [ [ Z  \ \ [  ] ] \  ^ ^ ]  _ _ ^  ` ` _  a a ` a a b b b c c c d d d e e e f f f g g g h h h i i i j j j k k k l l l m m m n n n o o o p  q q p  r r q  s s r  t t s  u u t  v v u  w w v  x x w  y y x  z z y  { { z  | | {  } } |  ~ ~ }    ~                                                                                                                                    ! !  ! " "  " # #  # $ $  $ % %  % & &  & ' '  ' ( (  ( ) )  ) * *  * + +  + , ,  , - -  - . .  . / /  / 0 0  0 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ A A  A B B  B C C  C D D  D E E  E F F  F G G  G H H  H I I  I J J  J K K  K L L  L M M  M N N  N O O  O P P P Q  P Q R  Q R S  R S T  S T U  T U V  U V W  V W X  W X Y  X Y Z  Y Z [  Z [ \  [ \ ]  \ ] ^  ] ^ _  ^ _ `  _ ` a  `  a b  b  b c  c  c d  d  d e  e  e f  f  f g  g  g h  h  h i  i  i j  j  j k  k  k l  l  l m  m  m n  n  n o  o  o p  p p q  p q r  q r s  r s t  s t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~                                                                                                               ! !  " ! "  # " #  $ # $  % $ %  & % &  ' & '  ( ' (  ) ( )  * ) *  + * +  , + ,  - , -  . - .  / . /  0 / 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ @  A @ A  B A B  C B C  D C D  E D E  F E F  G F G  H G H  I H I  J I J  K J K  L K L  M L M  N M N  O N O  P O  Q Q P  R R Q  S S R  T T S  U U T  V V U  W W V  X X W  Y Y X  Z Z Y  [ [ Z  \ \ [  ] ] \  ^ ^ ]  _ _ ^  ` ` _ ` ` a a a b b b c c c d d d e e e f f f g g g h h h i i i j j j k k k l l l m m m n n n o o o p  q q p  r r q  s s r  t t s  u u t  v v u  w w v  x x w  y y x  z z y  { { z  | | {  } } |  ~ ~ }    ~                                                                                                                                    ! !  ! " "  " # #  # $ $  $ % %  % & &  & ' '  ' ( (  ( ) )  ) * *  * + +  + , ,  , - -  - . .  . / /  / 0 0  0 0 1  1 1 2  2 2 3  3 3 4  4 4 5  5 5 6  6 6 7  7 7 8  8 8 9  9 9 :  : : ;  ; ; <  < < =  = = >  > > ?  ? ? @  @ A A  A B B  B C C  C D D  D E E  E F F  F G G  G H H  H I I  I J J  J K K  K L L  L M M  M N N  N O O  O P P P Q  P Q R  Q R S  R S T  S T U  T U V  U V W  V W X  W X Y  X Y Z  Y Z [  Z [ \  [ \ ]  \ ] ^  ] ^ _  ^ _ `  _ ` a  `  a b  b  b c  c  c d  d  d e  e  e f  f  f g  g  g h  h  h i  i  i j  j  j k  k  k l  l  l m  m  m n  n  n o  o  o p  p p q  p q r  q r s  r s t  s t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~                                                                                 ! !  "!"  #"#  $#$  %$%  &%&  '&'  ('(  )()  *)*  +*+  ,+,  -,-  .-.  /./  0/0 1 11 2 22 3 33 4 44 5 55 6 66 7 77 8 88 9 99 : :: ; ;; < << = == > >> ? ?? @ @@  A@A  BAB  CBC  DCD  EDE  FEF  GFG  HGH  IHI  JIJ  KJK  LKL  MLM  NMN  ONO  PO QQP  RRQ  SSR  TTS  UUT  VVU  WWV  XXW  YYX  ZZY  [[Z  \\[  ]]\  ^^]  __^  ``_  aa` a a bb b cc c dd d ee e ff f gg g hh h ii i jj j kk k ll l mm m nn n oo o p qqp  rrq  ssr  tts  uut  vvu  wwv  xxw  yyx  zzy  {{z  ||{  }}|  ~~}  ~                     !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>??@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0000111222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMNONOPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///0/01011222333444555666777888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopopqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,-.-//.00/1101212333444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLMNMOONPPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmmmnoonppoqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,---..././0001012122333444555666777888999:::;;;<<<===>>>??@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNONOPOPQQQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+,-,..-//./0/1102213323444555666777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJKLKLMLNNMOONOPOPQPQRQRSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcccdddeeefffggghhhiiijjjkkklllmnnmoonppoqqprrqrsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+++,,,-,-.-././0/01012123234344555666777888999:::;;;<<<===>>>??@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMLMNNNONOPOPQPQRRRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcccdddeeefffggghhhiiijjjkkklllmlmnnnonopppqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                ! !"!"#"#$#$%$%&%&'&'('()()*)*+*,,+--,..-//.00/1102212324435545666777888999:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJLLKMMLMNMNONPPOQQPRRQSSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghhhiiijjjkllkmmlnnmoonppoqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                   !!!"""###$$$%%%&&&'''((()))***+*+,+,-,-.-././0/01012223234345556566777888999:::;;;<<<===>>>??@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNMNONOPOPQPQRQRSSSTSTUTUVVVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkjklklmmmnnnooopopqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                ! !"!"#"#$#$%$%&%&'&'('()()*)*+*+,+--,..-././0/1102212324434545656777888999:::;;;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFGHGHIHIJIJKJLLKMMLNNMOONPPOQQPQRQSSRSTSTUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghhhiiijkkjllkmmlnnmoonopoqqprrqrsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()))***+*+,,,---.-././0/01012123334345456667677888999:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIIIJIJKKKLKLMMMNMNONOPPPQQQRRRSRSTSTUTUVUVWWWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhiiijjjkjklllmmmnmnonopopqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                ! !"!"#"#$#$%$%&%&'&'('()(**)++*,,+--,..-//.00/1102213324435545657768878999:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFGHGIIHJJIKKJLLKMMLNNMOONPPOQQPQRQSSRTTSUUTVVUWWVWXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffggghiihijikkjllkmmlnnmoonppoqqpqrqssrttsuutvvuvwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''((()()***+*+,+,-,-.-.///0/01012123234345556667678788999:::;;;<<<===>>>??@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLKLMLMNMNONOPOPQPQRQRSRSTSTUUUVUVWVWXXXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghhhihijijkjklklmlmnmnonopopqpqrqrsrststutuvuvwvwxxxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#$%$%&%&'&'('))(**)++*,,+--,..-//.00/1102213324435545657768879989:::;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEFGFHHGIIHJJIJKJLLKMMLNNMOONPPOQQPRRQSSRTTSTUTUVUVWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefffghhgiihjjikkjklkmmlnnmoonppoqqprrqssrttsuutvvuvwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&&&'''('()()*)*+*+,+,-,-..././0/01012123234445456667678889899:::;;;<<<===>>>???@@AAABBBCCCDDDEEEFFFGGGHHHIHIJIJKKKLLLMLMNMNONOPOPQQQRQRSRSTTTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`a`abbbcccdddeeefffggghghihijijkjklklmlmnmnonopopqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$%&%''&(('))(**)++*,,+--,..-./.00/110221332443454665676887998::9:;;;<<<===>>>???@?@A@ABABCBCDCDEDEFEGGFHHGIIHIJIKKJLLKMMLMNMNONPPOQQPQRQRSRTTSUUTVVUWWVXXWXYXZZY[[Z\\[]]\^^]__^``_``aaabbbcccdddeeefggfhhgiihjjikkjllkmmlnnmoonopoqqpqrqssrstsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$$$%%%&%&'&'((()()*)*+*+,,,-,-..././0/0111212323434545656777878989:9:;;;;<<<===>>>???@@AAABBBCCCDDDEEEFEFGFGHGHIIIJIJKJKLKLMLMNNNONOPPPQPQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcccdddeeefffggghghihijijkjklklmlmnmnonopopqqqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                 ! !"!"#"#$#$%$&&%''&(('))(**)++*,,+--,..-//./0/010221332443554665776787998::9;;:;<<<===>>>???@@@A@ABABCBCDCDEDEFEFGFHHGIIHJJIKKJLLKMMLNNMOONOPOQQPRRQSSRSTSUUTVVUWWVXXWYYXYZYZ[Z\\[]]\^^]__^``_aa`aabbbcccdddeefeggfghgiihjjikkjklkmmlnnmoonopoqqpqrqrsrttsuutvvuwwvxxwxyxzzy{{z||{}}|~~}~                  !!!"""###$$$%$%&%&'&'('()()*)*+*+,+,-,-..././0/0111212323434545656767878999:9:;:;<<<<===>>>??@@@AAABBBCCCDDDEEEFEFGFGHGHIIIJJJKJKLKLMLMNNNONOPPPQQQRQRSRSTSTUTUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcccdddedefffgfghhhiiijjjkjklklmlmnmnonopopqpqrrrsrststuuuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"#$#%%$&&%&'&'('))(**)++*,,+,-,..-//./0/0102212324435546657767879989:9;;:;<;<===>>>???@@@A@ABABCBCDCDEDFFEGGFHHGIIHIJIKKJLLKMMLNNMNONOPOQQPRRQSSRSTSUUTVVUWWVXXWYYXYZY[[Z\\[]]\^^]__^``_``aaabbbcccdeedffeggfghghihjjikkjllkmmlnnmnonppoqqprrqssrttsuutuvuwwvxxwyyxzzy{{z||{}}|~~}~                  !!!"""###$#$%$%&&&'&'('()()*)*+*+,+,-,-..././0/0111212323444545656777878989:9:;;;<<<=<==>>>??@@@AAABBBCCCDDDEDEFEFGFGHGHIHIJIJKKKLKLMLMNMNONOPOPQPQRQRSRSTSTUUUVUVWVWXWXYXYZYZ[Z[\\\]\]^]^_^_`_`aaabbbcccdddedefefgfghghiiijijkjklklmlmnmnonopopqpqrqrsrststutuvuvwwwxwxyxyzyz{z{|{|}|}~}~~                  ! !"!"#"$$#$%$&&%&'&(('()(**)++*,,+--,-.-//.00/110221332343554665776787898::9;;:<<;==<=>>>???@?@A@ABABCBDDCEEDFFEGGFGHGIIHJJIKKJLLKLMLNNMOONPPOQQPRRQRSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_aa`aabbbcddceedffeggfhhghihjjikkjllklmlnnmoonopoqqprrqssrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~                 !!!"""#"#$#$%$%&%&'&'('()))*)*+++,+,-,-..././0/0101222323444545656767878999:9:;;;<;<=<=>>>>??@@@AAABBBCCCDCDEDEFEFGFGHHHIHIJJJKJKLKLMMMNMNONOPOPQPQRQRSSSTSTUUUVUVWVWXWXYXYZYZ[Z[\[\]\]^]^_^_`_`aaabbbcbcdcdedefefggghghihijjjkkklllmlmnmnonopopqqqrqrsrststutuvuvwvwxwxyxyzyz{{{|{|}|}~}~~                 ! !"!"#"$$#%%$&&%''&(('()(**)++*,,+--,-.-//./0/110221332343554665776887898::9:;:<<;<=<=>=>???@?@A@ABABCBDDCEEDFFEGGFGHGIIHIJIKKJLLKLMLNNMOONPPOQQPRRQRSRTTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_``aaabbcbddceedefeggfhhgiihijikkjllkmmlnnmoonppoqqprrqssrttsuutvvuwwvxxwyyxyzy{{z||{}}|~~}~                 !!!"!"#"#$#$%$%&&&'&'('()()*)*+*+,+,-,-.-.///000101222333434545666767888989:::;:;<;<=<=>>>????@@AAABBBCBCDDDEDEFFFGFGHGHIIIJIJKKKLKLMLMNMNOOOPOPQPQRQRSRSTSTUUUVUVWVWXXXYXYZZZ[[[\[\]\]^^^_^_`_`aaababcbcdcdeeefefggghhhihijijkjklllmlmnmnooopopqpqrqrsrststutuvuvwvwxwxyxyzzz{z{|{|}|}~~~~                 ! ""!"#"$$#%%$&&%&'&'('))(**)*+*,,+,-,..-././0/1101213323434545657767878989:9:;:<<;==<=>=>?>?@@@A@BBABCBDDCDEDEFEFGFHHGHIHJJIJKJLLKLMLNNMNONPPOPQPQRQSSRSTSUUTUVUWWVXXWXYXZZY[[Z\\[]]\]^]__^``_``abbaccbddcdedefeggfghgiihjjikkjllkmmlnnmoonppoqqprrqssrttsuutuvuwwvxxwyyxzzyz{z||{|}|~~}~                 ! !"""###$#$%$%&&&'&'((()()***+++,,,---...///000111222333434555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHGHIIIJJJKKKLKLMMMNMNOOOPPPQQQRRRSSSTTTUTUVUVWWWXWXYXYZZZ[[[\[\]]]^^^_^_`_`a`abbbcbcdcdedefefgfghghihijijkjklklmlmnmnonopopqpqrqrsrststutuvuvwvwxwxyxyzyz{z{|{|}|}~}~~                                                                                           ! " " ! " # " # $ # % % $ & & % ' ' & ' ( ' ) ) ( * * ) * + * , , + , - , - . - . / . / 0 / 1 1 0 1 2 1 3 3 2 3 4 3 4 5 4 5 6 5 7 7 6 7 8 7 8 9 8 9 : 9 : ; : ; < ; < = < = > = > ? > ? @ ? @ A @ A B A B C B D D C D E D E F E F G F G H G H I H J J I J K J K L K L M L N N M N O N P P O P Q P Q R Q S S R S T S T U T U V U V W V W X W X Y X Z Z Y [ [ Z \ \ [ \ ] \ ] ^ ] _ _ ^ ` ` _ ` a ` b b a c c b c d c e e d f f e g g f h h g i i h j j i k k j l l k m m l n n m o o n p p o q q p r r q s s r t t s u u t v v u w w v x x w y y x z z y { { z | | { } } | ~ ~ }   ~                                                                                                                           ! ! "  ! " #  "  # $ $ $ %  $ % &  %  & ' ' ' (  ' ( )  ( ) *  ) * +  *  + , , , -  , - .  -  . / /  / 0 0 0 1  0  1 2 2  2 3 3 3 4  3 4 5  4 5 6  5 6 7  6  7 8 8 8 9  8 9 :  9  : ; ; ; <  ;  < = = = >  =  > ? ?  ? @ @  @ @ A A B  A B C  B  C D D D E  D E F  E  F G G G H  G  H I I I J  I  J K K K L  K  L M M  M N N N O  N O P  O  P Q Q Q R  Q R S  R S T  S  T U U U V  U V W  V W X  W X Y  X Y Z  Y  Z [ [ [ \  [  \ ] ] ] ^  ] ^ _  ^  _ `  `  ` a  a a b  a  b c c c d  c d e  d e f  e  f g g g h  g h i  h i j  i  j k k k l  k l m  l m n  m n o  n o p  o p q  p  q r r r s  r  s t t t u  t u v  u v w  v w x  w x y  x y z  y z {  z { |  { | }  | } ~  } ~   ~    ! ! ! !!!  !!!  !!!  !!!  !!!  !!!  !!!  ! !!  ! ! !  ! ! !  !  ! ! ! ! !  !  ! !!  !! !!!  !!!  !!!  !!! !  !! !!! !  !! !!!  !!!  !!!  !!!  !!! !  !! !!!  !!!  !!! !  !! ! !! !! "!"!!!  #!#!"! #!  $!#! %!%!$!  &!&!%!  '!'!&!  (!(!'!  )!)!(!  *!*!)!  +!+!*!  ,!,!+!  -!-!,! -!  .!-! /!/!.! /!  0!/! 1!1!0!  2!2!1!  3!3!2! 3!  4!3! 5!5!4!  6!6!5!  7!7!6!  8!8!7! 8!  9!8! :!:!9!  ;!;!:!  !=!>!  ?!>!?!  @!?!@! A! A! B!B!A! B!  C!B!C!  D!C! E!E!D!  F!F!E!  G!G!F! G!  H!G! I!I!H! I!  J!I! K!K!J! K!  L!K!L!  M!L! N!N!M!  O!O!N!  P!P!O!  Q!Q!P!  R!R!Q! R!  S!R!S!  T!S! U!U!T! U!  V!U! W!W!V!  X!X!W!  Y!Y!X! Y!  Z!Y! [![!Z!  \!\![!  ]!]!\! ]!  ^!]! _!_!^! _! _! `! a!a!`! a!  b!a! c!c!b!  d!d!c!  e!e!d!  f!f!e!  g!g!f!  h!h!g!  i!i!h!  j!j!i! j!  k!j! l!l!k!  m!m!l!  n!n!m! n!  o!n! p!p!o!  q!q!p!  r!r!q!  s!s!r!  t!t!s!  u!u!t! u!  v!u! w!w!v!  x!x!w!  y!y!x! y!  z!y! {!{!z!  |!|!{!  }!}!|!  ~!~!}!  !!~! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ! !!!! ! ! !!!! ! ! !!!! ! ! !!!! ! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!! !! !!!!!!!!!!"!!"!#!!!!"!#!$!!!!#!$!%!!!!$!%!&!!!!%!!&!'!'!!!!'!(!(!!!(!)!!!!(!!)!*!*!!!*!+!!!!*!!+!,!,!!!,!-!!!!,!!-!.!.!!!.!/!!!!.!/!0!!!!/!0!1!!!!0!1!2!!!!1!2!3!!!!2!!3!4!4!!!4!5!!!!4!!5!6!6!!!6!7!!!!6!7!8!!!!7!!8!9!9!!!9!:!!!!9!:!;!!!!:!;!!!!!=!!>!?!?!!!!?!!?!@!!!@!!@!A!!!A!!A!B!!!B!C!C!!!C!D!!!!C!D!E!!!!D!E!F!!!!E!F!G!!!!F!!G!H!H!!!H!I!!!!H!I!J!!!!I!J!K!!!!J!K!L!!!!K!!L!M!M!!!M!N!!!!M!!N!O!O!!!O!P!!!!O!P!Q!!!!P!Q!R!!!!Q!!R!S!S!!!S!T!!!!S!T!U!!!!T!U!V!!!!U!V!W!!!!V!W!X!!!!W!!X!Y!Y!!!Y!Z!!!!Y!Z![!!!!Z![!\!!!![!!\!]!]!!!!]!^!^!!!!^!_!!_!!!_!`!!`!!!`!a!!a!!a!b!!!!a!b!c!!!!b!c!d!!!!c!d!e!!!!d!e!f!!!!e!f!g!!!!f!g!h!!!!g!!h!i!i!!!i!j!!!!i!j!k!!!!j!k!l!!!!k!l!m!!!!l!m!n!!!!m!n!o!!!!n!o!p!!!!o!p!q!!!!p!q!r!!!!q!!r!s!s!!!s!t!!!!s!t!u!!!!t!u!v!!!!u!v!w!!!!v!!w!x!x!!!x!y!!!!x!y!z!!!!y!z!{!!!!z!!{!|!|!!!|!}!!!!|!}!~!!!!}!!~!!!!!!!!!!!"!!"!"!!"""!!!"""!!!"""!"!!!""!!"""!!!"""!!!"""!"!!! ""!! " " "!!! " " "!!! " " "!!! " " "!!!"" "!!!"""!!!"""!"!!!""!!"""!!!"""!"!!!""!!"""!!!"""!!!"""!!!"""!!!"""!!!"""!!!"""!!!"""!"!!!""!!"""!"!!!"""!!! "" "!!"!!!"!"!""!!""!!#"#"""!#"!!!$"#"!!%"%"$"!%"!!!&"%"!!'"'"&"!!!("("'"!!!)")"("!!!*"*")"!!!+"+"*"!+"!!!,"+"!!-"-","!-"!!!."-"!!/"/"."!!!0"0"/"!0"!!!1"0"!!2"2"1"!!!3"3"2"!3"!!!4"3"!!5"5"4"!!!6"6"5"!!!7"7"6"!!!8"8"7"!!!9"9"8"!!!:":"9"!:"!!!;":"!!<"<";"!!!="="<"!="!!!>"=">"!!!?">"?"!!!@"?"@"!A"!!A"A"!B"!!B"B"!!!C"B"!!D"D"C"!D"!!!E"D"!!F"F"E"!!!G"G"F"!!!H"H"G"!H"!!!I"H"!!J"J"I"!!!K"K"J"!K"!!!L"K"L"!!!M"L"!!N"N"M"!!!O"O"N"!!!P"P"O"!P"!!!Q"P"!!R"R"Q"!R"!!!S"R"!!T"T"S"!!!U"U"T"!!!V"V"U"!!!W"W"V"!!!X"X"W"!!!Y"Y"X"!!!Z"Z"Y"!!!["["Z"!!!\"\"["!!!]"]"\"!!!^"^"]"!^"!!^"!_"_"!!_"!`"`"!!`"!a"!!b"b"a"!b"!!!c"b"c"!!!d"c"!!e"e"d"!e"!!!f"e"!!g"g"f"!!!h"h"g"!!!i"i"h"!!!j"j"i"!j"!!!k"j"k"!!!l"k"!!m"m"l"!!!n"n"m"!!!o"o"n"!!!p"p"o"!p"!!!q"p"!!r"r"q"!r"!!!s"r"!!t"t"s"!!!u"u"t"!!!v"v"u"!v"!!!w"v"w"!!!x"w"!!y"y"x"!!!z"z"y"!!!{"{"z"!!!|"|"{"!!!}"}"|"!!!~"~"}"!~"!!~"!""!!"!"""""""""""""""""""""""""""""""""""""""""""""""""" """"" " """" " " """" " " """" " " """" " """"" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " """" "" "!"""!""!""""""""""#""#"$""""#"$"%""""$""%"&"&"""&"'""""&"'"(""""'"(")""""("")"*"*""""*"+"+"""+",""""+"","-"-"""-".""""-"."/"""".""/"0"0"""0"1""""0""1"2"2"""2"3""""2"3"4""""3"4"5""""4"5"6""""5""6"7"7"""7"8""""7"8"9""""8"9":""""9":";"""":";"<"""";"<"=""""<""=">">"""">"?"?""""?"@"@""""@""@"A"""A""A"B"""B""B"C""C"D""""C""D"E"E"""E"F""""E""F"G"G"""G"H""""G""H"I"I"""I"J""""I"J"K""""J"K"L""""K""L"M"M"""M"N""""M"N"O""""N""O"P"P"""P"Q""""P""Q"R"R"""R"S""""R"S"T""""S""T"U"U"""U"V""""U"V"W""""V"W"X""""W"X"Y""""X"Y"Z""""Y"Z"[""""Z""["\"\"""\"]""""\""]"^""^"""^"_""_"""_"`""`"""`"a""a""a"b""""a"b"c""""b"c"d""""c"d"e""""d"e"f""""e"f"g""""f"g"h""""g"h"i""""h"i"j""""i""j"k"k"""k"l""""k"l"m""""l""m"n"n"""n"o""""n"o"p""""o"p"q""""p"q"r""""q"r"s""""r"s"t""""s""t"u"u"""u"v""""u"v"w""""v"w"x""""w"x"y""""x"y"z""""y"z"{""""z"{"|""""{"|"}""""|""}"~""~"""~"""""""""""#""#"#""###"""###"""###"""###"""###"""###"""###""" # ##""" # # #""" # # #""" # # #""" # # #"""## #"""###"""###"""###"""###"""###"""###"""###"""###"""###"#"""##""###"""###"#"""###"""##""###"#"""###"""###""" ## #"!#""!#!#""#"""#"#"##""##""$#$###"""%#%#$#"""&#&#%#"""'#'#&#"""(#(#'#""")#)#(#"""*#*#)#"""+#+#*#""",#,#+#",#"""-#,#"".#.#-#"""/#/#.#"""0#0#/#"0#"""1#0#""2#2#1#"""3#3#2#"""4#4#3#"""5#5#4#"""6#6#5#"""7#7#6#"""8#8#7#"8#"""9#8#"":#:#9#""";#;#:#";#"""<#;#""=#=#<#"=#""">#=#>#"""?#>#?#"@#""@#@#"A#""A#A#"B#""B#B#"C#""C#""D#D#C#"""E#E#D#"""F#F#E#"F#"""G#F#""H#H#G#"""I#I#H#"""J#J#I#"""K#K#J#"""L#L#K#"""M#M#L#"""N#N#M#"""O#O#N#"""P#P#O#"P#"""Q#P#""R#R#Q#"""S#S#R#"S#"""T#S#""U#U#T#"""V#V#U#"""W#W#V#"""X#X#W#"""Y#Y#X#"""Z#Z#Y#"Z#"""[#Z#""\#\#[#"""]#]#\#"]#""]#"^#^#""^#"_#_#""_#"`#`#""`#"a#""b#b#a#"""c#c#b#"""d#d#c#"""e#e#d#"""f#f#e#"""g#g#f#"g#"""h#g#""i#i#h#"""j#j#i#"""k#k#j#"""l#l#k#"""m#m#l#"""n#n#m#"n#"""o#n#""p#p#o#"""q#q#p#"""r#r#q#"""s#s#r#"""t#t#s#"""u#u#t#"""v#v#u#"""w#w#v#"w#"""x#w#""y#y#x#"""z#z#y#"""{#{#z#"""|#|#{#"""}#}#|#"}#""}#"~#~#""~#"##""#"################################################## ##### # #### # # #### # # #### # # #### # ##### ######################################################################################################### # #### ## #!###!##!#"###"##"##########$##$#%####$#%#&####%#&#'####&#'#(####'#(#)####(##)#*#*###*#+####*#+#,####+##,#-#-###-#.####-#.#/####.##/#0#0####0#1#1###1#2####1##2#3#3###3#4####3#4#5####4#5#6####5#6#7####6##7#8#8###8#9####8#9#:####9#:#;####:#;#<####;##<#=#=####=#>#>####>#?#?####?#@#@####@##@#A###A##A#B###B##B#C###C##C#D###D#E#E###E#F####E#F#G####F#G#H####G#H#I####H##I#J#J###J#K####J#K#L####K#L#M####L#M#N####M#N#O####N##O#P#P###P#Q####P#Q#R####Q##R#S#S###S#T####S#T#U####T#U#V####U#V#W####V##W#X#X###X#Y####X#Y#Z####Y#Z#[####Z#[#\####[##\#]##]###]#^##^###^#_##_###_#`##`###`#a##a##a#b####a#b#c####b#c#d####c##d#e#e###e#f####e#f#g####f#g#h####g#h#i####h##i#j#j####j#k#k###k#l####k##l#m#m###m#n####m#n#o####n#o#p####o#p#q####p#q#r####q##r#s#s###s#t####s#t#u####t##u#v#v###v#w####v#w#x####w#x#y####x#y#z####y#z#{####z#{#|####{##|#}##}###}#~##~###~###########$##$#$##$$$###$$$###$$$###$$$###$$$###$$$###$$$#$### $$## $ $ $### $ $ $### $ $ $### $ $ $###$$ $###$$$###$$$#$###$$##$$$###$$$#$###$$##$$$###$$$#$###$$##$$$#$###$$##$$$###$$$###$$$#$###$$$###$$$###$$$### $$ $#!$##!$!$#"$##"$"$##$###$#$#$$##$$##%$%$$$###&$&$%$###'$'$&$#'$###($'$($###)$($##*$*$)$###+$+$*$###,$,$+$###-$-$,$###.$.$-$###/$/$.$###0$0$/$#0$###1$0$##2$2$1$###3$3$2$###4$4$3$###5$5$4$#5$###6$5$##7$7$6$###8$8$7$###9$9$8$###:$:$9$###;$;$:$#;$###<$;$<$###=$<$=$###>$=$>$###?$>$?$#@$##@$@$#A$##A$A$#B$##B$B$#C$##C$C$#D$##D$D$###E$D$##F$F$E$###G$G$F$###H$H$G$#H$###I$H$I$###J$I$##K$K$J$#K$###L$K$##M$M$L$###N$N$M$###O$O$N$#O$###P$O$##Q$Q$P$###R$R$Q$###S$S$R$###T$T$S$###U$U$T$###V$V$U$###W$W$V$###X$X$W$###Y$Y$X$###Z$Z$Y$###[$[$Z$###\$\$[$#\$##\$#]$]$##]$#^$^$##^$#_$_$##_$#`$##a$a$`$###b$b$a$###c$c$b$###d$d$c$#d$###e$d$e$###f$e$##g$g$f$###h$h$g$#h$###i$h$##j$j$i$###k$k$j$###l$l$k$###m$m$l$###n$n$m$###o$o$n$###p$p$o$###q$q$p$###r$r$q$###s$s$r$#s$###t$s$##u$u$t$###v$v$u$###w$w$v$###x$x$w$#x$###y$x$##z$z$y$###{${$z$###|$|${$#|$##|$#}$}$##}$#~$~$##~$#$$##$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $$$ $ $$$$ $ $ $$$$ $$ $ $ $$$ $ $$$$ $ $$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $$$$ $$ $!$$$!$$!$"$$$"$$"$#$$$#$$#$$$$$$$$$$%$$%$&$$$$%$&$'$$$$&$'$($$$$'$($)$$$$($)$*$$$$)$*$+$$$$*$+$,$$$$+$$,$-$-$$$-$.$$$$-$.$/$$$$.$$/$0$0$$$0$1$$$$0$1$2$$$$1$2$3$$$$2$$3$4$4$$$4$5$$$$4$5$6$$$$5$6$7$$$$6$7$8$$$$7$8$9$$$$8$9$:$$$$9$:$;$$$$:$$;$<$<$$$$<$=$=$$$$=$>$>$$$$>$?$?$$$$?$$?$@$$$@$$@$A$$$A$$A$B$$$B$$B$C$$$C$$C$D$$$D$$D$E$$E$F$$$$E$F$G$$$$F$G$H$$$$G$$H$I$I$$$I$J$$$$I$J$K$$$$J$K$L$$$$K$L$M$$$$L$M$N$$$$M$N$O$$$$N$$O$P$P$$$$P$Q$Q$$$Q$R$$$$Q$R$S$$$$R$$S$T$T$$$T$U$$$$T$U$V$$$$U$V$W$$$$V$W$X$$$$W$$X$Y$Y$$$Y$Z$$$$Y$Z$[$$$$Z$$[$\$$\$$$\$]$$]$$$]$^$$^$$$^$_$$_$$$_$`$$`$$$`$a$$a$$a$b$$$$a$b$c$$$$b$c$d$$$$c$d$e$$$$d$e$f$$$$e$f$g$$$$f$g$h$$$$g$h$i$$$$h$$i$j$j$$$j$k$$$$j$k$l$$$$k$$l$m$m$$$m$n$$$$m$n$o$$$$n$o$p$$$$o$p$q$$$$p$$q$r$r$$$r$s$$$$r$s$t$$$$s$t$u$$$$t$u$v$$$$u$$v$w$w$$$w$x$$$$w$$x$y$y$$$y$z$$$$y$z${$$$$z$${$|$$|$$$|$}$$}$$$}$~$$~$$$~$$$$$$$$$$$%$$%$%$$%%%$$$%%%$$$%%%$$$%%%$$$%%%$$$%%%$$$%%%$$$ % %%$$$ % % %$$$ % % %$$$ % % %$$$ % % %$$$%% %$$$%%%$$$%%%$$$%%%$%$$$%%$$%%%$$$%%%$%$$$%%$$%%%$$$%%%$$$%%%$$$%%%$$$%%%$$$%%%$%$$$%%%$$$%%%$$$%%%$$$%%%$$$ %% %$!%$$!%!%$"%$$"%"%$#%$$#%#%$$%$$$%$%$%%$$%%$$&%&%%%$$$'%'%&%$$$(%(%'%$(%$$$)%(%$$*%*%)%$$$+%+%*%$$$,%,%+%$,%$$$-%,%$$.%.%-%$$$/%/%.%$$$0%0%/%$$$1%1%0%$1%$$$2%1%$$3%3%2%$$$4%4%3%$$$5%5%4%$$$6%6%5%$$$7%7%6%$$$8%8%7%$8%$$$9%8%$$:%:%9%$:%$$$;%:%;%$$$<%;%<%$$$=%<%=%$$$>%=%>%$$$?%>%?%$@%$$@%@%$A%$$A%A%$B%$$B%B%$C%$$C%C%$D%$$D%D%$E%$$E%$$F%F%E%$$$G%G%F%$$$H%H%G%$$$I%I%H%$I%$$$J%I%$$K%K%J%$$$L%L%K%$$$M%M%L%$$$N%N%M%$$$O%O%N%$$$P%P%O%$$$Q%Q%P%$$$R%R%Q%$$$S%S%R%$S%$$$T%S%T%$$$U%T%$$V%V%U%$V%$$$W%V%$$X%X%W%$X%$$$Y%X%$$Z%Z%Y%$$$[%[%Z%$[%$$[%$\%\%$$\%$]%]%$$]%$^%^%$$^%$_%_%$$_%$`%`%$$`%$a%$$b%b%a%$$$c%c%b%$$$d%d%c%$$$e%e%d%$$$f%f%e%$$$g%g%f%$$$h%h%g%$$$i%i%h%$i%$$$j%i%$$k%k%j%$$$l%l%k%$$$m%m%l%$$$n%n%m%$$$o%o%n%$$$p%p%o%$p%$$$q%p%q%$$$r%q%$$s%s%r%$s%$$$t%s%t%$$$u%t%$$v%v%u%$$$w%w%v%$$$x%x%w%$$$y%y%x%$$$z%z%y%$$${%{%z%${%$${%$|%|%$$|%$}%}%$$}%$~%~%$$~%$%%$$%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%% % %%%% % % %%%% % % %%%% % % %%%% % %%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%% %% %!%%%!%%!%"%%%"%%"%#%%%#%%#%$%%%$%%$%%%%%%%%%%&%%&%'%%%%&%'%(%%%%'%%(%)%)%%%)%*%%%%)%*%+%%%%*%+%,%%%%+%,%-%%%%,%-%.%%%%-%.%/%%%%.%/%0%%%%/%0%1%%%%0%%1%2%2%%%2%3%%%%2%%3%4%4%%%4%5%%%%4%%5%6%6%%%6%7%%%%6%7%8%%%%7%8%9%%%%8%9%:%%%%9%%:%;%;%%%%;%<%<%%%%<%=%=%%%%=%>%>%%%%>%?%?%%%%?%@%@%%%%@%%@%A%%%A%%A%B%%%B%%B%C%%%C%%C%D%%%D%%D%E%%%E%%E%F%%F%G%%%%F%G%H%%%%G%H%I%%%%H%I%J%%%%I%%J%K%K%%%K%L%%%%K%L%M%%%%L%M%N%%%%M%N%O%%%%N%O%P%%%%O%P%Q%%%%P%Q%R%%%%Q%R%S%%%%R%S%T%%%%S%T%U%%%%T%U%V%%%%U%V%W%%%%V%W%X%%%%W%X%Y%%%%X%Y%Z%%%%Y%%Z%[%%[%%%[%\%%\%%%\%]%%]%%%]%^%%^%%%^%_%%_%%%_%`%%`%%%`%a%%a%%a%b%%%%a%b%c%%%%b%c%d%%%%c%d%e%%%%d%e%f%%%%e%f%g%%%%f%g%h%%%%g%h%i%%%%h%i%j%%%%i%%j%k%k%%%%k%l%l%%%l%m%%%%l%m%n%%%%m%n%o%%%%n%o%p%%%%o%p%q%%%%p%q%r%%%%q%r%s%%%%r%%s%t%t%%%t%u%%%%t%u%v%%%%u%v%w%%%%v%w%x%%%%w%x%y%%%%x%y%z%%%%y%%z%{%%{%%%{%|%%|%%%|%}%%}%%%}%~%%~%%%~%%%%%%%%%%%&%%&%&%%&&&%%%&&&%%%&&&%%%&&&%%%&&&%%%&&&%%%&&&%%% & &&%%% & & &%%% & & &%%% & & &%%% & & &%%%&& &%%%&&&%%%&&&%%%&&&%&%%%&&%%&&&%%%&&&%%%&&&%&%%%&&%%&&&%%%&&&%%%&&&%&%%%&&&%%%&&&%%%&&&%%%&&&%%%&&&%%%&&&% &%% & &%!&%%!&!&%"&%%"&"&%#&%%#&#&%$&%%$&$&%%&%%%&%&%&&%%&&&&%'&%%'&'&%%%(&'&%%)&)&(&%)&%%%*&)&%%+&+&*&%+&%%%,&+&%%-&-&,&%%%.&.&-&%%%/&/&.&%%%0&0&/&%%%1&1&0&%%%2&2&1&%2&%%%3&2&%%4&4&3&%%%5&5&4&%%%6&6&5&%%%7&7&6&%%%8&8&7&%%%9&9&8&%9&%%%:&9&:&%%%;&:&;&%%%<&;&<&%%%=&<&=&%%%>&=&>&%%%?&>&?&%%%@&?&@&%A&%%A&A&%B&%%B&B&%C&%%C&C&%D&%%D&D&%E&%%E&E&%F&%%F&F&%G&%%G&%%H&H&G&%%%I&I&H&%I&%%%J&I&J&%%%K&J&%%L&L&K&%%%M&M&L&%%%N&N&M&%%%O&O&N&%%%P&P&O&%%%Q&Q&P&%%%R&R&Q&%%%S&S&R&%%%T&T&S&%%%U&U&T&%%%V&V&U&%%%W&W&V&%%%X&X&W&%X&%%%Y&X&Y&%%Y&%Z&Z&%%Z&%[&[&%%[&%\&\&%%\&%]&]&%%]&%^&^&%%^&%_&_&%%_&%`&`&%%`&%a&%%b&b&a&%%%c&c&b&%%%d&d&c&%%%e&e&d&%%%f&f&e&%%%g&g&f&%%%h&h&g&%%%i&i&h&%%%j&j&i&%%%k&k&j&%%%l&l&k&%%%m&m&l&%%%n&n&m&%%%o&o&n&%%%p&p&o&%%%q&q&p&%%%r&r&q&%%%s&s&r&%%%t&t&s&%%%u&u&t&%%%v&v&u&%%%w&w&v&%%%x&x&w&%%%y&y&x&%y&%%y&%z&z&%%z&%{&{&%%{&%|&|&%%|&%}&}&%%}&%~&~&%%~&%&&%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&& & &&&& & & &&&& & & &&&& && & & &&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & &&&& && &!&&&!&&!&"&&&"&&"&#&&&#&&#&$&&&$&&$&%&&&%&&%&&&&&&&&&&'&&&'&(&(&&&&(&)&)&&&)&*&&&&)&*&+&&&&*&+&,&&&&+&&,&-&-&&&&-&.&.&&&.&/&&&&.&/&0&&&&/&0&1&&&&0&1&2&&&&1&&2&3&3&&&3&4&&&&3&4&5&&&&4&&5&6&6&&&6&7&&&&6&7&8&&&&7&8&9&&&&8&&9&:&:&&&&:&;&;&&&&;&<&<&&&&<&=&=&&&&=&>&>&&&&>&?&?&&&&?&@&@&&&&@&&@&A&&&A&&A&B&&&B&&B&C&&&C&&C&D&&&D&&D&E&&&E&&E&F&&&F&&F&G&&&G&H&H&&&H&I&&&&H&I&J&&&&I&&J&K&K&&&K&L&&&&K&L&M&&&&L&M&N&&&&M&&N&O&O&&&O&P&&&&O&P&Q&&&&P&Q&R&&&&Q&&R&S&S&&&S&T&&&&S&T&U&&&&T&U&V&&&&U&&V&W&W&&&W&X&&&&W&X&Y&&&&X&&Y&Z&&Z&&&Z&[&&[&&&[&\&&\&&&\&]&&]&&&]&^&&^&&&^&_&&_&&&_&`&&`&&&`&a&&a&&a&b&&&&a&b&c&&&&b&c&d&&&&c&d&e&&&&d&e&f&&&&e&f&g&&&&f&&g&h&h&&&h&i&&&&h&i&j&&&&i&j&k&&&&j&k&l&&&&k&l&m&&&&l&m&n&&&&m&&n&o&o&&&o&p&&&&o&p&q&&&&p&q&r&&&&q&r&s&&&&r&s&t&&&&s&t&u&&&&t&u&v&&&&u&&v&w&w&&&w&x&&&&w&x&y&&&&x&&y&z&&z&&&z&{&&{&&&{&|&&|&&&|&}&&}&&&}&~&&~&&&~&&&&&&&&&&&'&&'&'&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&'&&& '' '&&& ' '&& ' ' '&&& ' ' '&&& ' ' '& '&&&' '&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&'&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&&'''&&& '' '&!'&&!'!'&"'&&"'"'&#'&&#'#'&$'&&$'$'&%'&&%'%'&&'&&&'&'&''&&''''&('&&('('&&&)'('&&*'*')'&&&+'+'*'&&&,','+'&&&-'-','&&&.'.'-'&&&/'/'.'&&&0'0'/'&&&1'1'0'&&&2'2'1'&&&3'3'2'&&&4'4'3'&&&5'5'4'&5'&&&6'5'&&7'7'6'&&&8'8'7'&8'&&&9'8'9'&&&:'9':'&&&;':';'&&&<';'<'&&&='<'='&&&>'='>'&&&?'>'?'&@'&&@'@'&A'&&A'A'&B'&&B'B'&C'&&C'C'&D'&&D'D'&E'&&E'E'&F'&&F'F'&G'&&G'G'&H'&&H'&&I'I'H'&I'&&&J'I'J'&&&K'J'&&L'L'K'&&&M'M'L'&&&N'N'M'&&&O'O'N'&&&P'P'O'&P'&&&Q'P'&&R'R'Q'&&&S'S'R'&&&T'T'S'&&&U'U'T'&&&V'V'U'&&&W'W'V'&&&X'X'W'&X'&&X'&Y'Y'&&Y'&Z'Z'&&Z'&['['&&['&\'\'&&\'&]']'&&]'&^'^'&&^'&_'_'&&_'&`'`'&&`'&a'&&b'b'a'&&&c'c'b'&&&d'd'c'&&&e'e'd'&&&f'f'e'&&&g'g'f'&&&h'h'g'&&&i'i'h'&&&j'j'i'&&&k'k'j'&&&l'l'k'&&&m'm'l'&&&n'n'm'&&&o'o'n'&&&p'p'o'&&&q'q'p'&q'&&&r'q'&&s's'r'&&&t't's'&&&u'u't'&&&v'v'u'&v'&&&w'v'&&x'x'w'&x'&&x'&y'y'&&y'&z'z'&&z'&{'{'&&{'&|'|'&&|'&}'}'&&}'&~'~'&&~'&''&&'&'''''''''''''''''''''''''''''''''''''''''''''''''' ''''' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' '' '!'''!''!'"'''"''"'#'''#''#'$'''$''$'%'''%''%'&'''&''&''''''''''(''(')''''(')'*'''')'*'+''''*'+',''''+'','-'-'''-'.''''-'.'/''''.'/'0''''/'0'1''''0'1'2''''1'2'3''''2'3'4''''3'4'5''''4''5'6'6''''6'7'7'''7'8''''7''8'9'9''''9':':'''':';';'''';'<'<''''<'='=''''='>'>''''>'?'?''''?''?'@'''@''@'A'''A''A'B'''B''B'C'''C''C'D'''D''D'E'''E''E'F'''F''F'G'''G''G'H''H'I''''H'I'J''''I''J'K'K'''K'L''''K'L'M''''L'M'N''''M'N'O''''N'O'P''''O'P'Q''''P'Q'R''''Q'R'S''''R'S'T''''S'T'U''''T'U'V''''U'V'W''''V'W'X''''W''X'Y''Y'''Y'Z''Z'''Z'[''['''['\''\'''\']'']''']'^''^'''^'_''_'''_'`''`'''`'a''a''a'b''''a'b'c''''b'c'd''''c'd'e''''d'e'f''''e'f'g''''f'g'h''''g'h'i''''h'i'j''''i'j'k''''j'k'l''''k''l'm'm'''m'n''''m'n'o''''n'o'p''''o'p'q''''p'q'r''''q'r's''''r's't''''s't'u''''t'u'v''''u'v'w''''v'w'x''''w''x'y''y'''y'z''z'''z'{''{'''{'|''|'''|'}''}'''}'~''~'''~'''''''''''(''('(''((('''((('''((('''((('''((('''((('''(((''' ( ((''' ( ( (''' ( ( (''' ( ( (''' ( ( ('''(( ('''((('('''((('''((('''((('''((''((('''((('('''((''((('('''((('''((('''((('''((('''((('''((('''((('''(((''' (( ('!(''!(!('"(''"("('#(''#(#('$(''$($('%(''%(%('&(''&(&(''('''('('((''((((')('')(''*(*()('''+(+(*('+(''',(+(''-(-(,('''.(.(-('''/(/(.('''0(0(/('''1(1(0('''2(2(1('2('''3(2(''4(4(3('''5(5(4('5('''6(5(''7(7(6('7('''8(7(8('''9(8(9(''':(9(:(''';(:(;('''<(;(<('''=(<(=('''>(=(>('''?(>(?('''@(?(@('A(''A(A('B(''B(B('C(''C(C('D(''D(D('E(''E(E('F(''F(F('G(''G(G('H(''H(H('I(''I(''J(J(I('J('''K(J(''L(L(K('L('''M(L(''N(N(M('''O(O(N('''P(P(O('''Q(Q(P('''R(R(Q('''S(S(R('''T(T(S('''U(U(T('U('''V(U(''W(W(V('W(''W('X(X(''X('Y(Y(''Y('Z(Z(''Z('[([(''[('\(\(''\('](]('']('^(^(''^('_(_(''_('`(`(''`('a(''b(b(a('''c(c(b('''d(d(c('''e(e(d('''f(f(e('''g(g(f('''h(h(g('''i(i(h('''j(j(i('''k(k(j('k('''l(k(''m(m(l('m('''n(m(''o(o(n('''p(p(o('''q(q(p('''r(r(q('''s(s(r('''t(t(s('''u(u(t('''v(v(u('''w(w(v('w(''w('x(x(''x('y(y(''y('z(z(''z('{({(''{('|(|(''|('}(}(''}('~(~(''~('((''('(((((((((((((((((((((((((((((((((((((((((((((((((( ((((( ( (((( ( ( (((( ( ( (((( ( ( (((( ( ((((( ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ( (((( (( (!(((!((!("((("(("(#(((#((#($((($(($(%(((%((%(&(((&((&('((('(('(((((((((()((()(()(*((*(+((((*(+(,((((+(,(-((((,(-(.((((-(.(/((((.(/(0((((/((0(1(1(((1(2((((1(2(3((((2(3(4((((3(4(5((((4(5(6((((5((6(7(7((((7(8(8((((8(9(9((((9(:(:((((:(;(;((((;(<(<((((<(=(=((((=(>(>((((>(?(?((((?(@(@((((@((@(A(((A((A(B(((B((B(C(((C((C(D(((D((D(E(((E((E(F(((F((F(G(((G((G(H(((H((H(I(((I((I(J(((J(K(K(((K(L((((K(L(M((((L((M(N(N(((N(O((((N(O(P((((O(P(Q((((P(Q(R((((Q(R(S((((R(S(T((((S((T(U(U(((U(V((((U((V(W((W(((W(X((X(((X(Y((Y(((Y(Z((Z(((Z([(([((([(\((\(((\(]((](((](^((^(((^(_((_(((_(`((`(((`(a((a((a(b((((a(b(c((((b(c(d((((c(d(e((((d(e(f((((e(f(g((((f(g(h((((g(h(i((((h(i(j((((i(j(k((((j((k(l(l(((l(m((((l(m(n((((m(n(o((((n(o(p((((o((p(q(q((((q(r(r(((r(s((((r((s(t(t((((t(u(u(((u(v((((u((v(w((w(((w(x((x(((x(y((y(((y(z((z(((z({(({((({(|((|(((|(}((}(((}(~((~(((~((((((((((()(()()(()))((()))((()))((()))((()))((()))((()))((( ) ))((( ) ) )((( ) ) )( )((( ) )(( ) ) )((()) )((()))((()))()((())(()))((()))()((())(()))()((()))((()))((()))((()))((()))((()))((()))((()))((()))((()))((( )) )(!)((!)!)(")((")")(#)((#)#)($)(($)$)(%)((%)%)(&)((&)&)(')((')')(()((()()())(())))(*)((*)*)(((+)*)((,),)+)(((-)-),)(((.).)-)(.)(((/).)((0)0)/)(((1)1)0)(((2)2)1)(((3)3)2)(3)(((4)3)((5)5)4)(5)(((6)5)6)(((7)6)7)(((8)7)8)(((9)8)9)(((:)9):)(((;):);)(((<);)<)(((=)<)=)(((>)=)>)(((?)>)?)(((@)?)@)(A)((A)A)(B)((B)B)(C)((C)C)(D)((D)D)(E)((E)E)(F)((F)F)(G)((G)G)(H)((H)H)(I)((I)I)(J)((J)J)(((K)J)((L)L)K)(L)(((M)L)((N)N)M)(((O)O)N)(((P)P)O)(((Q)Q)P)(((R)R)Q)(R)(((S)R)((T)T)S)(T)(((U)T)((V)V)U)(V)((V)(W)W)((W)(X)X)((X)(Y)Y)((Y)(Z)Z)((Z)([)[)(([)(\)\)((\)(])])((])(^)^)((^)(_)_)((_)(`)`)((`)(a)((b)b)a)(((c)c)b)(((d)d)c)(((e)e)d)(((f)f)e)(((g)g)f)(((h)h)g)(((i)i)h)(((j)j)i)(((k)k)j)(k)(((l)k)l)(((m)l)((n)n)m)(((o)o)n)(o)(((p)o)((q)q)p)(((r)r)q)(((s)s)r)(s)(((t)s)((u)u)t)(((v)v)u)(v)((v)(w)w)((w)(x)x)((x)(y)y)((y)(z)z)((z)({){)(({)(|)|)((|)(})})((})(~)~)((~)())(()()))))))))))))))))))))))))))))))))))))))))))))))))) ))))) ) )))) ) ) )))) ) ) )))) ) ) )))) )) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ) )))) )) )!)))!))!)")))"))")#)))#))#)$)))$))$)%)))%))%)&)))&))&)')))'))')()))())())))))))))*)))*))*)+))+),))))+),)-)))),)-).))))-)).)/)/)))/)0))))/)0)1))))0)1)2))))1))2)3)3)))3)4))))3))4)5)5))))5)6)6))))6)7)7))))7)8)8))))8)9)9))))9):):)))):););))));)<)<))))<)=)=))))=)>)>))))>)?)?))))?)@)@))))@))@)A)))A))A)B)))B))B)C)))C))C)D)))D))D)E)))E))E)F)))F))F)G)))G))G)H)))H))H)I)))I))I)J)))J))J)K))K)L))))K))L)M)M)))M)N))))M)N)O))))N))O)P)P)))P)Q))))P)Q)R))))Q))R)S)S)))S)T))))S)T)U))))T))U)V))V)))V)W))W)))W)X))X)))X)Y))Y)))Y)Z))Z)))Z)[))[)))[)\))\)))\)]))])))])^))^)))^)_))_)))_)`))`))`)a))))`)a)b))))a)b)c))))b)c)d))))c)d)e))))d)e)f))))e)f)g))))f)g)h))))g)h)i))))h)i)j))))i)j)k))))j)k)l))))k)l)m))))l)m)n))))m))n)o)o)))o)p))))o)p)q))))p)q)r))))q)r)s))))r)s)t))))s)t)u))))t))u)v))v)))v)w))w)))w)x))x)))x)y))y)))y)z))z)))z){)){))){)|))|)))|)}))})))})~))~)))~)))))))))))*))*)*))***)))***)))***)))***)))***)))***)))***))) * **))) * * *))) * * *))) * * *))) * * *)))** *)))***)))***)*)))***)))***)))**))***)*)))***)))***)))***)))***)))***)))***)))***)))***)))***)))***)))***))) ** *)!*))!*!*)"*))"*"*)#*))#*#*)$*))$*$*)%*))%*%*)&*))&*&*)'*))'*'*)(*))(*(*))*)))*)*)**))****)+*))+*+*),*)),*))-*-*,*)-*))).*-*))/*/*.*)))0*0*/*)))1*1*0*)))2*2*1*)))3*3*2*)))4*4*3*)4*)))5*4*5*)))6*5*6*)))7*6*7*)))8*7*8*)))9*8*9*))):*9*:*)));*:*;*)))<*;*<*)))=*<*=*)))>*=*>*)))?*>*?*)@*))@*@*)A*))A*A*)B*))B*B*)C*))C*C*)D*))D*D*)E*))E*E*)F*))F*F*)G*))G*G*)H*))H*H*)I*))I*I*)J*))J*J*)K*))K*K*)L*))L*))M*M*L*)))N*N*M*)))O*O*N*)))P*P*O*)))Q*Q*P*)))R*R*Q*)))S*S*R*)S*)))T*S*T*))T*)U*U*))U*)V*V*))V*)W*W*))W*)X*X*))X*)Y*Y*))Y*)Z*Z*))Z*)[*[*))[*)\*\*))\*)]*]*))]*)^*^*))^*)_*_*))_*)`*`*))`*)a*))b*b*a*)))c*c*b*)))d*d*c*)))e*e*d*)))f*f*e*)))g*g*f*)))h*h*g*)))i*i*h*)))j*j*i*)))k*k*j*)))l*l*k*)))m*m*l*)))n*n*m*)))o*o*n*)))p*p*o*)))q*q*p*)q*)))r*q*))s*s*r*)s*)))t*s*t*))t*)u*u*))u*)v*v*))v*)w*w*))w*)x*x*))x*)y*y*))y*)z*z*))z*){*{*)){*)|*|*))|*)}*}*))}*)~*~*))~*)**))*)************************************************** ***** * **** * * **** * * **** * * **** * ***** ********************************************************************************************************* * **** ** *!***!**!*"***"**"*#***#**#*$***$**$*%***%**%*&***&**&*'***'**'*(***(**(*)***)**)**********+***+**+*,***,**,*-**-*.****-**.*/*/***/*0****/*0*1****0*1*2****1*2*3****2**3*4*4****4*5*5****5*6*6****6*7*7****7*8*8****8*9*9****9*:*:****:*;*;****;*<*<****<*=*=****=*>*>****>*?*?****?**?*@***@**@*A***A**A*B***B**B*C***C**C*D***D**D*E***E**E*F***F**F*G***G**G*H***H**H*I***I**I*J***J**J*K***K**K*L***L**L*M***M*N*N***N*O****N*O*P****O*P*Q****P*Q*R****Q*R*S****R**S*T**T***T*U**U***U*V**V***V*W**W***W*X**X***X*Y**Y***Y*Z**Z***Z*[**[***[*\**\***\*]**]***]*^**^***^*_**_***_*`**`***`*a**a**a*b****a*b*c****b*c*d****c*d*e****d*e*f****e*f*g****f*g*h****g*h*i****h*i*j****i*j*k****j*k*l****k*l*m****l*m*n****m**n*o*o***o*p****o*p*q****p*q*r****q*r*s****r**s*t**t***t*u**u***u*v**v***v*w**w***w*x**x***x*y**y***y*z**z***z*{**{***{*|**|***|*}**}***}*~**~***~***********+**+*+**+++***+++***+++***+++***+++***+++***+++*** + ++*** + + +*** + + +*** + + +*** + + +***++ +***+++*+***++**+++***+++*+***+++***+++***+++***+++***+++***+++***+++***+++***+++***+++***+++***+++***+++*** ++ +*!+**!+!+*"+**"+"+*#+**#+#+*$+**$+$+*%+**%+%+*&+**&+&+*'+**'+'+*(+**(+(+*)+**)+)+**+***+*+*++**++++*,+**,+,+*-+**-+-+*.+**.+**/+/+.+*/+***0+/+**1+1+0+***2+2+1+*2+***3+2+3+***4+3+4+***5+4+5+***6+5+6+***7+6+7+***8+7+8+***9+8+9+***:+9+:+***;+:+;+***<+;+<+***=+<+=+***>+=+>+***?+>+?+***@+?+@+*A+**A+A+*B+**B+B+*C+**C+C+*D+**D+D+*E+**E+E+*F+**F+F+*G+**G+G+*H+**H+H+*I+**I+I+*J+**J+J+*K+**K+K+*L+**L+L+*M+**M+M+*N+**N+N+***O+N+O+***P+O+P+***Q+P+**R+R+Q+*R+**R+*S+S+**S+*T+T+**T+*U+U+**U+*V+V+**V+*W+W+**W+*X+X+**X+*Y+Y+**Y+*Z+Z+**Z+*[+[+**[+*\+\+**\+*]+]+**]+*^+^+**^+*_+_+**_+*`+`+**`+*a+**b+b+a+***c+c+b+***d+d+c+***e+e+d+***f+f+e+***g+g+f+***h+h+g+***i+i+h+***j+j+i+***k+k+j+***l+l+k+***m+m+l+***n+n+m+***o+o+n+***p+p+o+***q+q+p+***r+r+q+*r+**r+*s+s+**s+*t+t+**t+*u+u+**u+*v+v+**v+*w+w+**w+*x+x+**x+*y+y+**y+*z+z+**z+*{+{+**{+*|+|+**|+*}+}+**}+*~+~+**~+*++**+*++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ + ++++ + + ++++ + + ++++ + + ++++ + +++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ++++ ++ +!+++!++!+"+++"++"+#+++#++#+$+++$++$+%+++%++%+&+++&++&+'+++'++'+(+++(++(+)+++)++)+*+++*++*++++++++++,+++,++,+-+++-++-+.++.+/++++.+/+0++++/+0+1++++0+1+2++++1++2+3+3++++3+4+4++++4+5+5++++5+6+6++++6+7+7++++7+8+8++++8+9+9++++9+:+:++++:+;+;++++;+<+<++++<+=+=++++=+>+>++++>+?+?++++?+@+@++++@++@+A+++A++A+B+++B++B+C+++C++C+D+++D++D+E+++E++E+F+++F++F+G+++G++G+H+++H++H+I+++I++I+J+++J++J+K+++K++K+L+++L++L+M+++M++M+N+++N+O+O+++O+P++++O+P+Q++++P++Q+R+R++++R+S++S+++S+T++T+++T+U++U+++U+V++V+++V+W++W+++W+X++X+++X+Y++Y+++Y+Z++Z+++Z+[++[+++[+\++\+++\+]++]+++]+^++^+++^+_++_+++_+`++`+++`+a++a++a+b++++a+b+c++++b+c+d++++c+d+e++++d+e+f++++e+f+g++++f+g+h++++g+h+i++++h+i+j++++i+j+k++++j+k+l++++k+l+m++++l+m+n++++m++n+o+o++++o+p+p++++p+q+q++++q+r+r++++r+s++s+++s+t++t+++t+u++u+++u+v++v+++v+w++w+++w+x++x+++x+y++y+++y+z++z+++z+{++{+++{+|++|+++|+}++}+++}+~++~+++~+++++++++++,++,+,++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++ , ,,+++ , , ,+++ , , ,+++ , , ,+++ , , ,+++,, ,+++,,,+++,,,+++,,,+,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+++,,,+ ,++ , ,+!,++!,!,+",++",",+#,++#,#,+$,++$,$,+%,++%,%,+&,++&,&,+',++',',+(,++(,(,+),++),),+*,++*,*,++,+++,+,+,,++,,,,+-,++-,-,+.,++.,.,+/,++/,++0,0,/,+0,+++1,0,1,+++2,1,2,+++3,2,3,+++4,3,4,+++5,4,5,+++6,5,6,+++7,6,7,+++8,7,8,+++9,8,9,+++:,9,:,+++;,:,;,+++<,;,<,+++=,<,=,+++>,=,>,+++?,>,?,+++@,?,@,+A,++A,A,+B,++B,B,+C,++C,C,+D,++D,D,+E,++E,E,+F,++F,F,+G,++G,G,+H,++H,H,+I,++I,I,+J,++J,J,+K,++K,K,+L,++L,L,+M,++M,M,+N,++N,N,+O,++O,++P,P,O,+P,+++Q,P,Q,++Q,+R,R,++R,+S,S,++S,+T,T,++T,+U,U,++U,+V,V,++V,+W,W,++W,+X,X,++X,+Y,Y,++Y,+Z,Z,++Z,+[,[,++[,+\,\,++\,+],],++],+^,^,++^,+_,_,++_,+`,`,++`,+a,++b,b,a,+++c,c,b,+++d,d,c,+++e,e,d,+++f,f,e,+++g,g,f,+++h,h,g,+++i,i,h,+++j,j,i,+++k,k,j,+++l,l,k,+++m,m,l,+++n,n,m,+++o,o,n,+++p,p,o,+++q,q,p,+q,++q,+r,r,++r,+s,s,++s,+t,t,++t,+u,u,++u,+v,v,++v,+w,w,++w,+x,x,++x,+y,y,++y,+z,z,++z,+{,{,++{,+|,|,++|,+},},++},+~,~,++~,+,,++,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,, , ,,,, , , ,,,, , , ,,,, , , ,,,, , ,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,,,, ,, ,!,,,!,,!,",,,",,",#,,,#,,#,$,,,$,,$,%,,,%,,%,&,,,&,,&,',,,',,',(,,,(,,(,),,,),,),*,,,*,,*,+,,,+,,+,,,,,,,,,,-,,,-,,-,.,,,.,,.,/,,,/,,/,0,,,0,1,1,,,,1,2,2,,,,2,3,3,,,,3,4,4,,,,4,5,5,,,,5,6,6,,,,6,7,7,,,,7,8,8,,,,8,9,9,,,,9,:,:,,,,:,;,;,,,,;,<,<,,,,<,=,=,,,,=,>,>,,,,>,?,?,,,,?,@,@,,,,@,,@,A,,,A,,A,B,,,B,,B,C,,,C,,C,D,,,D,,D,E,,,E,,E,F,,,F,,F,G,,,G,,G,H,,,H,,H,I,,,I,,I,J,,,J,,J,K,,,K,,K,L,,,L,,L,M,,,M,,M,N,,,N,,N,O,,,O,,O,P,,,P,Q,,Q,,,Q,R,,R,,,R,S,,S,,,S,T,,T,,,T,U,,U,,,U,V,,V,,,V,W,,W,,,W,X,,X,,,X,Y,,Y,,,Y,Z,,Z,,,Z,[,,[,,,[,\,,\,,,\,],,],,,],^,,^,,,^,_,,_,,,_,`,,`,,,`,a,,a,,a,b,,,,a,b,c,,,,b,c,d,,,,c,d,e,,,,d,e,f,,,,e,f,g,,,,f,g,h,,,,g,h,i,,,,h,i,j,,,,i,j,k,,,,j,k,l,,,,k,l,m,,,,l,m,n,,,,m,n,o,,,,n,o,p,,,,o,,p,q,,q,,,q,r,,r,,,r,s,,s,,,s,t,,t,,,t,u,,u,,,u,v,,v,,,v,w,,w,,,w,x,,x,,,x,y,,y,,,y,z,,z,,,z,{,,{,,,{,|,,|,,,|,},,},,,},~,,~,,,~,,,,,,,,,,,-,,-,-,,---,,,---,,,---,,,---,,,---,,,---,,,---,,, - --,,, - - -,,, - - -,,, - - -,,, - - -,,,-- -,,,---,,,---,-,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,,---,,, -- -,!-,,!-!-,"-,,"-"-,#-,,#-#-,$-,,$-$-,%-,,%-%-,&-,,&-&-,'-,,'-'-,(-,,(-(-,)-,,)-)-,*-,,*-*-,+-,,+-+-,,-,,,-,-,--,,----,.-,,.-.-,/-,,/-/-,0-,,0-0-,,,1-0-1-,,,2-1-2-,,,3-2-3-,,,4-3-4-,,,5-4-5-,,,6-5-6-,,,7-6-7-,,,8-7-8-,,,9-8-9-,,,:-9-:-,,,;-:-;-,,,<-;-<-,,,=-<-=-,,,>-=->-,,,?->-?-,,,@-?-@-,A-,,A-A-,B-,,B-B-,C-,,C-C-,D-,,D-D-,E-,,E-E-,F-,,F-F-,G-,,G-G-,H-,,H-H-,I-,,I-I-,J-,,J-J-,K-,,K-K-,L-,,L-L-,M-,,M-M-,N-,,N-N-,O-,,O-O-,P-,,P-P-,,P-,Q-Q-,,Q-,R-R-,,R-,S-S-,,S-,T-T-,,T-,U-U-,,U-,V-V-,,V-,W-W-,,W-,X-X-,,X-,Y-Y-,,Y-,Z-Z-,,Z-,[-[-,,[-,\-\-,,\-,]-]-,,]-,^-^-,,^-,_-_-,,_-,`-`-,,`-,a-,,b-b-a-,,,c-c-b-,,,d-d-c-,,,e-e-d-,,,f-f-e-,,,g-g-f-,,,h-h-g-,,,i-i-h-,,,j-j-i-,,,k-k-j-,,,l-l-k-,,,m-m-l-,,,n-n-m-,,,o-o-n-,,,p-p-o-,p-,,p-,q-q-,,q-,r-r-,,r-,s-s-,,s-,t-t-,,t-,u-u-,,u-,v-v-,,v-,w-w-,,w-,x-x-,,x-,y-y-,,y-,z-z-,,z-,{-{-,,{-,|-|-,,|-,}-}-,,}-,~-~-,,~-,--,,-,-------------------------------------------------- ----- - ---- - - ---- - - ---- - - ---- - ----- --------------------------------------------------------------------------------------------------------- - ---- -- -!---!--!-"---"--"-#---#--#-$---$--$-%---%--%-&---&--&-'---'--'-(---(--(-)---)--)-*---*--*-+---+--+-,---,--,----------.---.--.-/---/--/-0---0-1-1----1-2-2----2-3-3----3-4-4----4-5-5----5-6-6----6-7-7----7-8-8----8-9-9----9-:-:----:-;-;----;-<-<----<-=-=----=->->---->-?-?----?-@-@----@--@-A---A--A-B---B--B-C---C--C-D---D--D-E---E--E-F---F--F-G---G--G-H---H--H-I---I--I-J---J--J-K---K--K-L---L--L-M---M--M-N---N--N-O---O--O-P---P-Q--Q---Q-R--R---R-S--S---S-T--T---T-U--U---U-V--V---V-W--W---W-X--X---X-Y--Y---Y-Z--Z---Z-[--[---[-\--\---\-]--]---]-^--^---^-_--_---_-`--`---`-a--a--a-b----a-b-c----b-c-d----c-d-e----d-e-f----e-f-g----f-g-h----g-h-i----h-i-j----i-j-k----j-k-l----k-l-m----l-m-n----m-n-o----n-o-p----o--p-q--q---q-r--r---r-s--s---s-t--t---t-u--u---u-v--v---v-w--w---w-x--x---x-y--y---y-z--z---z-{--{---{-|--|---|-}--}---}-~--~---~-----------.--.-.--...---...---...---...---...---...---...--- . ..--- . . .--- . . .--- . . .--- . . .---.. .---...---...-.---...---...---...---...---...---...---...---...---...---...---...---...---...---...---...--- .. .-!.--!.!.-".--".".-#.--#.#.-$.--$.$.-%.--%.%.-&.--&.&.-'.--'.'.-(.--(.(.-).--).).-*.--*.*.-+.--+.+.-,.--,.,.--.---.-.-..--....-/.--/./.-0.--0.0.---1.0.1.---2.1.2.---3.2.3.---4.3.4.---5.4.5.---6.5.6.---7.6.7.---8.7.8.---9.8.9.---:.9.:.---;.:.;.---<.;.<.---=.<.=.--->.=.>.---?.>.?.---@.?.@.-A.--A.A.-B.--B.B.-C.--C.C.-D.--D.D.-E.--E.E.-F.--F.F.-G.--G.G.-H.--H.H.-I.--I.I.-J.--J.J.-K.--K.K.-L.--L.L.-M.--M.M.-N.--N.N.-O.--O.O.-P.--P.P.--P.-Q.Q.--Q.-R.R.--R.-S.S.--S.-T.T.--T.-U.U.--U.-V.V.--V.-W.W.--W.-X.X.--X.-Y.Y.--Y.-Z.Z.--Z.-[.[.--[.-\.\.--\.-].].--].-^.^.--^.-_._.--_.-`.`.--`.-a.--b.b.a.---c.c.b.---d.d.c.---e.e.d.---f.f.e.---g.g.f.---h.h.g.---i.i.h.---j.j.i.---k.k.j.---l.l.k.---m.m.l.---n.n.m.---o.o.n.---p.p.o.-p.--p.-q.q.--q.-r.r.--r.-s.s.--s.-t.t.--t.-u.u.--u.-v.v.--v.-w.w.--w.-x.x.--x.-y.y.--y.-z.z.--z.-{.{.--{.-|.|.--|.-}.}.--}.-~.~.--~.-..--.-.................................................. ..... . .... . . .... . . .... . . .... . ..... ......................................................................................................... . .... .. .!...!..!."..."..".#...#..#.$...$..$.%...%..%.&...&..&.'...'..'.(...(..(.)...)..).*...*..*.+...+..+.,...,..,.-...-..-........../.../../.0...0.1.1....1.2.2....2.3.3....3.4.4....4.5.5....5.6.6....6.7.7....7.8.8....8.9.9....9.:.:....:.;.;....;.<.<....<.=.=....=.>.>....>.?.?....?.@.@....@..@.A...A..A.B...B..B.C...C..C.D...D..D.E...E..E.F...F..F.G...G..G.H...H..H.I...I..I.J...J..J.K...K..K.L...L..L.M...M..M.N...N..N.O...O..O.P...P.Q..Q...Q.R..R...R.S..S...S.T..T...T.U..U...U.V..V...V.W..W...W.X..X...X.Y..Y...Y.Z..Z...Z.[..[...[.\..\...\.]..]...].^..^...^._.._..._.`..`...`.a..a..a.b....a.b.c....b.c.d....c.d.e....d.e.f....e.f.g....f.g.h....g.h.i....h.i.j....i.j.k....j.k.l....k.l.m....l.m.n....m.n.o....n.o.p....o..p.q..q...q.r..r...r.s..s...s.t..t...t.u..u...u.v..v...v.w..w...w.x..x...x.y..y...y.z..z...z.{..{...{.|..|...|.}..}...}.~..~...~.........../.././..///...///...///...///...///...///...///... / //... / / /... / / /... / / /... / / /...// /...///...///./...///...///...///...///...///...///...///...///...///...///...///...///...///...///...///... // /.!/..!/!/."/.."/"/.#/..#/#/.$/..$/$/.%/..%/%/.&/..&/&/.'/..'/'/.(/..(/(/.)/..)/)/.*/..*/*/.+/..+/+/.,/..,/,/.-/..-/-/../.../././/..////.0/..0/0/...1/0/1/...2/1/2/...3/2/3/...4/3/4/...5/4/5/...6/5/6/...7/6/7/...8/7/8/...9/8/9/...:/9/:/...;/:/;/.../=/>/...?/>/?/...@/?/@/.A/..A/A/.B/..B/B/.C/..C/C/.D/..D/D/.E/..E/E/.F/..F/F/.G/..G/G/.H/..H/H/.I/..I/I/.J/..J/J/.K/..K/K/.L/..L/L/.M/..M/M/.N/..N/N/.O/..O/O/.P/..P/P/..P/.Q/Q/..Q/.R/R/..R/.S/S/..S/.T/T/..T/.U/U/..U/.V/V/..V/.W/W/..W/.X/X/..X/.Y/Y/..Y/.Z/Z/..Z/.[/[/..[/.\/\/..\/.]/]/..]/.^/^/..^/._/_/.._/.`/`/..`/.a/..b/b/a/...c/c/b/...d/d/c/...e/e/d/...f/f/e/...g/g/f/...h/h/g/...i/i/h/...j/j/i/...k/k/j/...l/l/k/...m/m/l/...n/n/m/...o/o/n/...p/p/o/.p/..p/.q/q/..q/.r/r/..r/.s/s/..s/.t/t/..t/.u/u/..u/.v/v/..v/.w/w/..w/.x/x/..x/.y/y/..y/.z/z/..z/.{/{/..{/.|/|/..|/.}/}/..}/.~/~/..~/.//.././///////////////////////////////////////////////// ///// / //// / / //// / / //// / / //// / ///// ///////////////////////////////////////////////////////////////////////////////////////////////////////// / //// // /!///!//!/"///"//"/#///#//#/$///$//$/%///%//%/&///&//&/'///'//'/(///(//(/)///)//)/*///*//*/+///+//+/,///,//,/-///-//-/.///.//.//////////0///0/1/1////1/2/2////2/3/3////3/4/4////4/5/5////5/6/6////6/7/7////7/8/8////8/9/9////9/:/:////:/;/;////;//>////>/?/?////?/@/@////@//@/A///A//A/B///B//B/C///C//C/D///D//D/E///E//E/F///F//F/G///G//G/H///H//H/I///I//I/J///J//J/K///K//K/L///L//L/M///M//M/N///N//N/O///O//O/P///P/Q//Q///Q/R//R///R/S//S///S/T//T///T/U//U///U/V//V///V/W//W///W/X//X///X/Y//Y///Y/Z//Z///Z/[//[///[/\//\///\/]//]///]/^//^///^/_//_///_/`//`///`/a//a//a/b////a/b/c////b/c/d////c/d/e////d/e/f////e/f/g////f/g/h////g/h/i////h/i/j////i/j/k////j/k/l////k/l/m////l/m/n////m/n/o////n/o/p////o//p/q//q///q/r//r///r/s//s///s/t//t///t/u//u///u/v//v///v/w//w///w/x//x///x/y//y///y/z//z///z/{//{///{/|//|///|/}//}///}/~//~///~///////////0//0/0//000///000///000///000///000///000///000/// 0 00/// 0 0 0/// 0 0 0/// 0 0 0/// 0 0 0///00 0///000///000/0///000///000///000///000///000///000///000///000///000///000///000///000///000///000///000/// 00 0/!0//!0!0/"0//"0"0/#0//#0#0/$0//$0$0/%0//%0%0/&0//&0&0/'0//'0'0/(0//(0(0/)0//)0)0/*0//*0*0/+0//+0+0/,0//,0,0/-0//-0-0/.0//.0.0//0///0/0/00//0000///100010///201020///302030///403040///504050///605060///706070///807080///908090///:090:0///;0:0;0///<0;0<0///=0<0=0///>0=0>0///?0>0?0///@0?0@0/A0//A0A0/B0//B0B0/C0//C0C0/D0//D0D0/E0//E0E0/F0//F0F0/G0//G0G0/H0//H0H0/I0//I0I0/J0//J0J0/K0//K0K0/L0//L0L0/M0//M0M0/N0//N0N0/O0//O0O0/P0//P0P0//P0/Q0Q0//Q0/R0R0//R0/S0S0//S0/T0T0//T0/U0U0//U0/V0V0//V0/W0W0//W0/X0X0//X0/Y0Y0//Y0/Z0Z0//Z0/[0[0//[0/\0\0//\0/]0]0//]0/^0^0//^0/_0_0//_0/`0`0//`0/a0//b0b0a0///c0c0b0///d0d0c0///e0e0d0///f0f0e0///g0g0f0///h0h0g0///i0i0h0///j0j0i0///k0k0j0///l0l0k0///m0m0l0///n0n0m0///o0o0n0///p0p0o0/p0//p0/q0q0//q0/r0r0//r0/s0s0//s0/t0t0//t0/u0u0//u0/v0v0//v0/w0w0//w0/x0x0//x0/y0y0//y0/z0z0//z0/{0{0//{0/|0|0//|0/}0}0//}0/~0~0//~0/00//0/00000000000000000000000000000000000000000000000000 00000 0 0000 0 0 0000 0 0 0000 0 0 0000 0 00000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0000 00 0!000!00!0"000"00"0#000#00#0$000$00$0%000%00%0&000&00&0'000'00'0(000(00(0)000)00)0*000*00*0+000+00+0,000,00,0-000-00-0.000.00.0/000/00/0000000101000010202000020303000030404000040505000050606000060707000070808000080909000090:0:0000:0;0;0000;0<0<0000<0=0=0000=0>0>0000>0?0?0000?0@0@0000@00@0A000A00A0B000B00B0C000C00C0D000D00D0E000E00E0F000F00F0G000G00G0H000H00H0I000I00I0J000J00J0K000K00K0L000L00L0M000M00M0N000N00N0O000O00O0P000P0Q00Q000Q0R00R000R0S00S000S0T00T000T0U00U000U0V00V000V0W00W000W0X00X000X0Y00Y000Y0Z00Z000Z0[00[000[0\00\000\0]00]000]0^00^000^0_00_000_0`00`000`0a00a00a0b0000a0b0c0000b0c0d0000c0d0e0000d0e0f0000e0f0g0000f0g0h0000g0h0i0000h0i0j0000i0j0k0000j0k0l0000k0l0m0000l0m0n0000m0n0o0000n0o0p0000o00p0q00q000q0r00r000r0s00s000s0t00t000t0u00u000u0v00v000v0w00w000w0x00x000x0y00y000y0z00z000z0{00{000{0|00|000|0}00}000}0~00~000~0000000000010010100111000111000111000111000111000111000111000 1 11000 1 1 1000 1 1 1000 1 1 1000 1 1 100011 100011100011101000111000111000111000111000111000111000111000111000111000111000111000111000111000111000111000 11 10!100!1!10"100"1"10#100#1#10$100$1$10%100%1%10&100&1&10'100'1'10(100(1(10)100)1)10*100*1*10+100+1+10,100,1,10-100-1-10.100.1.10/100/1/1001000101000110111000211121000312131000413141000514151000615161000716171000817181000918191000:191:1000;1:1;1000<1;1<1000=1<1=1000>1=1>1000?1>1?1000@1?1@10A100A1A10B100B1B10C100C1C10D100D1D10E100E1E10F100F1F10G100G1G10H100H1H10I100I1I10J100J1J10K100K1K10L100L1L10M100M1M10N100N1N10O100O1O10P100P1P100P10Q1Q100Q10R1R100R10S1S100S10T1T100T10U1U100U10V1V100V10W1W100W10X1X100X10Y1Y100Y10Z1Z100Z10[1[100[10\1\100\10]1]100]10^1^100^10_1_100_10`1`100`10a100b1b1a1000c1c1b1000d1d1c1000e1e1d1000f1f1e1000g1g1f1000h1h1g1000i1i1h1000j1j1i1000k1k1j1000l1l1k1000m1m1l1000n1n1m1000o1o1n1000p1p1o10p100p10q1q100q10r1r100r10s1s100s10t1t100t10u1u100u10v1v100v10w1w100w10x1x100x10y1y100y10z1z100z10{1{100{10|1|100|10}1}100}10~1~100~1011001011111111111111111111111111111111111111111111111111 11111 1 1111 1 1 1111 1 1 1111 1 1 1111 1 11111 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1 1111 11 1!111!11!1"111"11"1#111#11#1$111$11$1%111%11%1&111&11&1'111'11'1(111(11(1)111)11)1*111*11*1+111+11+1,111,11,1-111-11-1.111.11.1/111/11/1011101111111111212111121313111131414111141515111151616111161717111171818111181919111191:1:1111:1;1;1111;1<1<1111<1=1=1111=1>1>1111>1?1?1111?1@1@1111@11@1A111A11A1B111B11B1C111C11C1D111D11D1E111E11E1F111F11F1G111G11G1H111H11H1I111I11I1J111J11J1K111K11K1L111L11L1M111M11M1N111N11N1O111O11O1P111P1Q11Q111Q1R11R111R1S11S111S1T11T111T1U11U111U1V11V111V1W11W111W1X11X111X1Y11Y111Y1Z11Z111Z1[11[111[1\11\111\1]11]111]1^11^111^1_11_111_1`11`111`1a11a11a1b1111a1b1c1111b1c1d1111c1d1e1111d1e1f1111e1f1g1111f1g1h1111g1h1i1111h1i1j1111i1j1k1111j1k1l1111k1l1m1111l1m1n1111m1n1o1111n1o1p1111o11p1q11q111q1r11r111r1s11s111s1t11t111t1u11u111u1v11v111v1w11w111w1x11x111x1y11y111y1z11z111z1{11{111{1|11|111|1}11}111}1~11~111~1111111111121121211222111222111222111222111222111222111222111 2 22111 2 2 2111 2 2 2111 2 2 2111 2 2 211122 211122211122212111222111222111222111222111222111222111222111222111222111222111222111222111222111222111222111 22 21!211!2!21"211"2"21#211#2#21$211$2$21%211%2%21&211&2&21'211'2'21(211(2(21)211)2)21*211*2*21+211+2+21,211,2,21-211-2-21.211.2.21/211/2/2102110202111120212111221222111322232111423242111524252111625262111726272111827282111928292111:292:2111;2:2;2111<2;2<2111=2<2=2111>2=2>2111?2>2?2111@2?2@21A211A2A21B211B2B21C211C2C21D211D2D21E211E2E21F211F2F21G211G2G21H211H2H21I211I2I21J211J2J21K211K2K21L211L2L21M211M2M21N211N2N21O211O2O21P211P2P211P21Q2Q211Q21R2R211R21S2S211S21T2T211T21U2U211U21V2V211V21W2W211W21X2X211X21Y2Y211Y21Z2Z211Z21[2[211[21\2\211\21]2]211]21^2^211^21_2_211_21`2`211`21a211b2b2a2111c2c2b2111d2d2c2111e2e2d2111f2f2e2111g2g2f2111h2h2g2111i2i2h2111j2j2i2111k2k2j2111l2l2k2111m2m2l2111n2n2m2111o2o2n2111p2p2o21p211p21q2q211q21r2r211r21s2s211s21t2t211t21u2u211u21v2v211v21w2w211w21x2x211x21y2y211y21z2z211z21{2{211{21|2|211|21}2}211}21~2~211~2122112122222222222222222222222222222222222222222222222222 22222 2 2222 2 2 2222 2 2 2222 2 2 2222 2 22222 222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 2 2222 22 2!222!22!2"222"22"2#222#22#2$222$22$2%222%22%2&222&22&2'222'22'2(222(22(2)222)22)2*222*22*2+222+22+2,222,22,2-222-22-2.222.22.2/222/22/2022202121222212222222222323222232424222242525222252626222262727222272828222282929222292:2:2222:2;2;2222;2<2<2222<2=2=2222=2>2>2222>2?2?2222?2@2@2222@22@2A222A22A2B222B22B2C222C22C2D222D22D2E222E22E2F222F22F2G222G22G2H222H22H2I222I22I2J222J22J2K222K22K2L222L22L2M222M22M2N222N22N2O222O22O2P222P2Q22Q222Q2R22R222R2S22S222S2T22T222T2U22U222U2V22V222V2W22W222W2X22X222X2Y22Y222Y2Z22Z222Z2[22[222[2\22\222\2]22]222]2^22^222^2_22_222_2`22`222`2a22a22a2b2222a2b2c2222b2c2d2222c2d2e2222d2e2f2222e2f2g2222f2g2h2222g2h2i2222h2i2j2222i2j2k2222j2k2l2222k2l2m2222l2m2n2222m2n2o2222n2o2p2222o22p2q22q222q2r22r222r2s22s222s2t22t222t2u22u222u2v22v222v2w22w222w2x22x222x2y22y222y2z22z222z2{22{222{2|22|222|2}22}222}2~22~222~2222222222232232322333222333222333222333222333222333222333222 3 33222 3 3 3222 3 3 3222 3 3 3222 3 3 322233 322233322233323222333222333222333222333222333222333222333222333222333222333222333222333222333222333222333222 33 32!322!3!32"322"3"32#322#3#32$322$3$32%322%3%32&322&3&32'322'3'32(322(3(32)322)3)32*322*3*32+322+3+32,322,3,32-322-3-32.322.3.32/322/3/3203220303222130313222231323222332333222433343222534353222635363222736373222837383222938393222:393:3222;3:3;3222<3;3<3222=3<3=3222>3=3>3222?3>3?3222@3?3@32A322A3A32B322B3B32C322C3C32D322D3D32E322E3E32F322F3F32G322G3G32H322H3H32I322I3I32J322J3J32K322K3K32L322L3L32M322M3M32N322N3N32O322O3O32P322P3P322P32Q3Q322Q32R3R322R32S3S322S32T3T322T32U3U322U32V3V322V32W3W322W32X3X322X32Y3Y322Y32Z3Z322Z32[3[322[32\3\322\32]3]322]32^3^322^32_3_322_32`3`322`32a322b3b3a3222c3c3b3222d3d3c3222e3e3d3222f3f3e3222g3g3f3222h3h3g3222i3i3h3222j3j3i3222k3k3j3222l3l3k3222m3m3l3222n3n3m3222o3o3n3222p3p3o32p322p32q3q322q32r3r322r32s3s322s32t3t322t32u3u322u32v3v322v32w3w322w32x3x322x32y3y322y32z3z322z32{3{322{32|3|322|32}3}322}32~3~322~3233223233333333333333333333333333333333333333333333333333 33333 3 3333 3 3 3333 3 3 3333 3 3 3333 3 33333 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 3 3333 33 3!333!33!3"333"33"3#333#33#3$333$33$3%333%33%3&333&33&3'333'33'3(333(33(3)333)33)3*333*33*3+333+33+3,333,33,3-333-33-3.333.33.3/333/33/3033303131333313232333323333333333434333343535333353636333363737333373838333383939333393:3:3333:3;3;3333;3<3<3333<3=3=3333=3>3>3333>3?3?3333?3@3@3333@33@3A333A33A3B333B33B3C333C33C3D333D33D3E333E33E3F333F33F3G333G33G3H333H33H3I333I33I3J333J33J3K333K33K3L333L33L3M333M33M3N333N33N3O333O33O3P333P3Q33Q333Q3R33R333R3S33S333S3T33T333T3U33U333U3V33V333V3W33W333W3X33X333X3Y33Y333Y3Z33Z333Z3[33[333[3\33\333\3]33]333]3^33^333^3_33_333_3`33`333`3a33a33a3b3333a3b3c3333b3c3d3333c3d3e3333d3e3f3333e3f3g3333f3g3h3333g3h3i3333h3i3j3333i3j3k3333j3k3l3333k3l3m3333l3m3n3333m3n3o3333n3o3p3333o33p3q33q333q3r33r333r3s33s333s3t33t333t3u33u333u3v33v333v3w33w333w3x33x333x3y33y333y3z33z333z3{33{333{3|33|333|3}33}333}3~33~333~3333333333343343433444333444333444333444333444333444333444333 4 44333 4 4 4333 4 4 4333 4 4 4333 4 4 433344 433344433344434333444333444333444333444333444333444333444333444333444333444333444333444333444333444333444333 44 43!433!4!43"433"4"43#433#4#43$433$4$43%433%4%43&433&4&43'433'4'43(433(4(43)433)4)43*433*4*43+433+4+43,433,4,43-433-4-43.433.4.43/433/4/4304330404333140414333241424333342434333443444333544454333645464333746474333847484333948494333:494:4333;4:4;4333<4;4<4333=4<4=4333>4=4>4333?4>4?4333@4?4@43A433A4A43B433B4B43C433C4C43D433D4D43E433E4E43F433F4F43G433G4G43H433H4H43I433I4I43J433J4J43K433K4K43L433L4L43M433M4M43N433N4N43O433O4O43P433P4P433P43Q4Q433Q43R4R433R43S4S433S43T4T433T43U4U433U43V4V433V43W4W433W43X4X433X43Y4Y433Y43Z4Z433Z43[4[433[43\4\433\43]4]433]43^4^433^43_4_433_43`4`433`43a433b4b4a4333c4c4b4333d4d4c4333e4e4d4333f4f4e4333g4g4f4333h4h4g4333i4i4h4333j4j4i4333k4k4j4333l4l4k4333m4m4l4333n4n4m4333o4o4n4333p4p4o43p433p43q4q433q43r4r433r43s4s433s43t4t433t43u4u433u43v4v433v43w4w433w43x4x433x43y4y433y43z4z433z43{4{433{43|4|433|43}4}433}43~4~433~4344334344444444444444444444444444444444444444444444444444 44444 4 4444 4 4 4444 4 4 4444 4 4 4444 4 44444 444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 4 4444 44 4!444!44!4"444"44"4#444#44#4$444$44$4%444%44%4&444&44&4'444'44'4(444(44(4)444)44)4*444*44*4+444+44+4,444,44,4-444-44-4.444.44.4/444/44/4044404141444414242444424343444434444444444545444454646444464747444474848444484949444494:4:4444:4;4;4444;4<4<4444<4=4=4444=4>4>4444>4?4?4444?4@4@4444@44@4A444A44A4B444B44B4C444C44C4D444D44D4E444E44E4F444F44F4G444G44G4H444H44H4I444I44I4J444J44J4K444K44K4L444L44L4M444M44M4N444N44N4O444O44O4P444P4Q44Q444Q4R44R444R4S44S444S4T44T444T4U44U444U4V44V444V4W44W444W4X44X444X4Y44Y444Y4Z44Z444Z4[44[444[4\44\444\4]44]444]4^44^444^4_44_444_4`44`444`4a44a44a4b4444a4b4c4444b4c4d4444c4d4e4444d4e4f4444e4f4g4444f4g4h4444g4h4i4444h4i4j4444i4j4k4444j4k4l4444k4l4m4444l4m4n4444m4n4o4444n4o4p4444o44p4q44q444q4r44r444r4s44s444s4t44t444t4u44u444u4v44v444v4w44w444w4x44x444x4y44y444y4z44z444z4{44{444{4|44|444|4}44}444}4~44~444~4444444444454454544555444555444555444555444555444555444555444 5 55444 5 5 5444 5 5 5444 5 5 5444 5 5 544455 544455544455545444555444555444555444555444555444555444555444555444555444555444555444555444555444555444555444 55 54!544!5!54"544"5"54#544#5#54$544$5$54%544%5%54&544&5&54'544'5'54(544(5(54)544)5)54*544*5*54+544+5+54,544,5,54-544-5-54.544.5.54/544/5/5405440505444150515444251525444352535444453545444554555444655565444756575444857585444958595444:595:5444;5:5;5444<5;5<5444=5<5=5444>5=5>5444?5>5?5444@5?5@54A544A5A54B544B5B54C544C5C54D544D5D54E544E5E54F544F5F54G544G5G54H544H5H54I544I5I54J544J5J54K544K5K54L544L5L54M544M5M54N544N5N54O544O5O54P544P5P544P54Q5Q544Q54R5R544R54S5S544S54T5T544T54U5U544U54V5V544V54W5W544W54X5X544X54Y5Y544Y54Z5Z544Z54[5[544[54\5\544\54]5]544]54^5^544^54_5_544_54`5`544`54a544b5b5a5444c5c5b5444d5d5c5444e5e5d5444f5f5e5444g5g5f5444h5h5g5444i5i5h5444j5j5i5444k5k5j5444l5l5k5444m5m5l5444n5n5m5444o5o5n5444p5p5o54p544p54q5q544q54r5r544r54s5s544s54t5t544t54u5u544u54v5v544v54w5w544w54x5x544x54y5y544y54z5z544z54{5{544{54|5|544|54}5}544}54~5~544~5455445455555555555555555555555555555555555555555555555555 55555 5 5555 5 5 5555 5 5 5555 5 5 5555 5 55555 555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 5 5555 55 5!555!55!5"555"55"5#555#55#5$555$55$5%555%55%5&555&55&5'555'55'5(555(55(5)555)55)5*555*55*5+555+55+5,555,55,5-555-55-5.555.55.5/555/55/5055505151555515252555525353555535454555545555555555656555565757555575858555585959555595:5:5555:5;5;5555;5<5<5555<5=5=5555=5>5>5555>5?5?5555?5@5@5555@55@5A555A55A5B555B55B5C555C55C5D555D55D5E555E55E5F555F55F5G555G55G5H555H55H5I555I55I5J555J55J5K555K55K5L555L55L5M555M55M5N555N55N5O555O55O5P555P5Q55Q555Q5R55R555R5S55S555S5T55T555T5U55U555U5V55V555V5W55W555W5X55X555X5Y55Y555Y5Z55Z555Z5[55[555[5\55\555\5]55]555]5^55^555^5_55_555_5`55`555`5a55a55a5b5555a5b5c5555b5c5d5555c5d5e5555d5e5f5555e5f5g5555f5g5h5555g5h5i5555h5i5j5555i5j5k5555j5k5l5555k5l5m5555l5m5n5555m5n5o5555n5o5p5555o55p5q55q555q5r55r555r5s55s555s5t55t555t5u55u555u5v55v555v5w55w555w5x55x555x5y55y555y5z55z555z5{55{555{5|55|555|5}55}555}5~55~555~5555555555565565655666555666555666555666555666555666555666555 6 66555 6 6 6555 6 6 6555 6 6 6555 6 6 655566 655566655566656555666555666555666555666555666555666555666555666555666555666555666555666555666555666555666555 66 65!655!6!65"655"6"65#655#6#65$655$6$65%655%6%65&655&6&65'655'6'65(655(6(65)655)6)65*655*6*65+655+6+65,655,6,65-655-6-65.655.6.65/655/6/6506550606555160616555261626555362636555463646555564656555665666555766676555867686555968696555:696:6555;6:6;6555<6;6<6555=6<6=6555>6=6>6555?6>6?6555@6?6@65A655A6A65B655B6B65C655C6C65D655D6D65E655E6E65F655F6F65G655G6G65H655H6H65I655I6I65J655J6J65K655K6K65L655L6L65M655M6M65N655N6N65O655O6O65P655P6P655P65Q6Q655Q65R6R655R65S6S655S65T6T655T65U6U655U65V6V655V65W6W655W65X6X655X65Y6Y655Y65Z6Z655Z65[6[655[65\6\655\65]6]655]65^6^655^65_6_655_65`6`655`65a655b6b6a6555c6c6b6555d6d6c6555e6e6d6555f6f6e6555g6g6f6555h6h6g6555i6i6h6555j6j6i6555k6k6j6555l6l6k6555m6m6l6555n6n6m6555o6o6n6555p6p6o65p655p65q6q655q65r6r655r65s6s655s65t6t655t65u6u655u65v6v655v65w6w655w65x6x655x65y6y655y65z6z655z65{6{655{65|6|655|65}6}655}65~6~655~6566556566666666666666666666666666666666666666666666666666 66666 6 6666 6 6 6666 6 6 6666 6 6 6666 6 66666 666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 6 6666 66 6!666!66!6"666"66"6#666#66#6$666$66$6%666%66%6&666&66&6'666'66'6(666(66(6)666)66)6*666*66*6+666+66+6,666,66,6-666-66-6.666.66.6/666/66/6066606161666616262666626363666636464666646565666656666666666767666676868666686969666696:6:6666:6;6;6666;6<6<6666<6=6=6666=6>6>6666>6?6?6666?6@6@6666@66@6A666A66A6B666B66B6C666C66C6D666D66D6E666E66E6F666F66F6G666G66G6H666H66H6I666I66I6J666J66J6K666K66K6L666L66L6M666M66M6N666N66N6O666O66O6P666P6Q66Q666Q6R66R666R6S66S666S6T66T666T6U66U666U6V66V666V6W66W666W6X66X666X6Y66Y666Y6Z66Z666Z6[66[666[6\66\666\6]66]666]6^66^666^6_66_666_6`66`666`6a66a66a6b6666a6b6c6666b6c6d6666c6d6e6666d6e6f6666e6f6g6666f6g6h6666g6h6i6666h6i6j6666i6j6k6666j6k6l6666k6l6m6666l6m6n6666m6n6o6666n6o6p6666o66p6q66q666q6r66r666r6s66s666s6t66t666t6u66u666u6v66v666v6w66w666w6x66x666x6y66y666y6z66z666z6{66{666{6|66|666|6}66}666}6~66~666~6666666666676676766777666777666777666777666777666777666777666 7 77666 7 7 7666 7 7 7666 7 7 7666 7 7 766677 766677766677767666777666777666777666777666777666777666777666777666777666777666777666777666777666777666777666 77 76!766!7!76"766"7"76#766#7#76$766$7$76%766%7%76&766&7&76'766'7'76(766(7(76)766)7)76*766*7*76+766+7+76,766,7,76-766-7-76.766.7.76/766/7/7607660707666170717666271727666372737666473747666574757666675767666776777666877787666978797666:797:7666;7:7;7666<7;7<7666=7<7=7666>7=7>7666?7>7?7666@7?7@76A766A7A76B766B7B76C766C7C76D766D7D76E766E7E76F766F7F76G766G7G76H766H7H76I766I7I76J766J7J76K766K7K76L766L7L76M766M7M76N766N7N76O766O7O76P766P7P766P76Q7Q766Q76R7R766R76S7S766S76T7T766T76U7U766U76V7V766V76W7W766W76X7X766X76Y7Y766Y76Z7Z766Z76[7[766[76\7\766\76]7]766]76^7^766^76_7_766_76`7`766`76a766b7b7a7666c7c7b7666d7d7c7666e7e7d7666f7f7e7666g7g7f7666h7h7g7666i7i7h7666j7j7i7666k7k7j7666l7l7k7666m7m7l7666n7n7m7666o7o7n7666p7p7o76p766p76q7q766q76r7r766r76s7s766s76t7t766t76u7u766u76v7v766v76w7w766w76x7x766x76y7y766y76z7z766z76{7{766{76|7|766|76}7}766}76~7~766~7677667677777777777777777777777777777777777777777777777777 77777 7 7777 7 7 7777 7 7 7777 7 7 7777 7 77777 777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 7 7777 77 7!777!77!7"777"77"7#777#77#7$777$77$7%777%77%7&777&77&7'777'77'7(777(77(7)777)77)7*777*77*7+777+77+7,777,77,7-777-77-7.777.77.7/777/77/7077707171777717272777727373777737474777747575777757676777767777777777878777787979777797:7:7777:7;7;7777;7<7<7777<7=7=7777=7>7>7777>7?7?7777?7@7@7777@77@7A777A77A7B777B77B7C777C77C7D777D77D7E777E77E7F777F77F7G777G77G7H777H77H7I777I77I7J777J77J7K777K77K7L777L77L7M777M77M7N777N77N7O777O77O7P777P7Q77Q777Q7R77R777R7S77S777S7T77T777T7U77U777U7V77V777V7W77W777W7X77X777X7Y77Y777Y7Z77Z777Z7[77[777[7\77\777\7]77]777]7^77^777^7_77_777_7`77`777`7a77a77a7b7777a7b7c7777b7c7d7777c7d7e7777d7e7f7777e7f7g7777f7g7h7777g7h7i7777h7i7j7777i7j7k7777j7k7l7777k7l7m7777l7m7n7777m7n7o7777n7o7p7777o77p7q77q777q7r77r777r7s77s777s7t77t777t7u77u777u7v77v777v7w77w777w7x77x777x7y77y777y7z77z777z7{77{777{7|77|777|7}77}777}7~77~777~7777777777787787877888777888777888777888777888777888777888777 8 88777 8 8 8777 8 8 8777 8 8 8777 8 8 877788 877788877788878777888777888777888777888777888777888777888777888777888777888777888777888777888777888777888777 88 87!877!8!87"877"8"87#877#8#87$877$8$87%877%8%87&877&8&87'877'8'87(877(8(87)877)8)87*877*8*87+877+8+87,877,8,87-877-8-87.877.8.87/877/8/8708770808777180818777281828777382838777483848777584858777685868777786878777887888777988898777:898:8777;8:8;8777<8;8<8777=8<8=8777>8=8>8777?8>8?8777@8?8@87A877A8A87B877B8B87C877C8C87D877D8D87E877E8E87F877F8F87G877G8G87H877H8H87I877I8I87J877J8J87K877K8K87L877L8L87M877M8M87N877N8N87O877O8O87P877P8P877P87Q8Q877Q87R8R877R87S8S877S87T8T877T87U8U877U87V8V877V87W8W877W87X8X877X87Y8Y877Y87Z8Z877Z87[8[877[87\8\877\87]8]877]87^8^877^87_8_877_87`8`877`87a877b8b8a8777c8c8b8777d8d8c8777e8e8d8777f8f8e8777g8g8f8777h8h8g8777i8i8h8777j8j8i8777k8k8j8777l8l8k8777m8m8l8777n8n8m8777o8o8n8777p8p8o87p877p87q8q877q87r8r877r87s8s877s87t8t877t87u8u877u87v8v877v87w8w877w87x8x877x87y8y877y87z8z877z87{8{877{87|8|877|87}8}877}87~8~877~8788778788888888888888888888888888888888888888888888888888 88888 8 8888 8 8 8888 8 8 8888 8 8 8888 8 88888 888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 8 8888 88 8!888!88!8"888"88"8#888#88#8$888$88$8%888%88%8&888&88&8'888'88'8(888(88(8)888)88)8*888*88*8+888+88+8,888,88,8-888-88-8.888.88.8/888/88/8088808181888818282888828383888838484888848585888858686888868787888878888888888989888898:8:8888:8;8;8888;8<8<8888<8=8=8888=8>8>8888>8?8?8888?8@8@8888@88@8A888A88A8B888B88B8C888C88C8D888D88D8E888E88E8F888F88F8G888G88G8H888H88H8I888I88I8J888J88J8K888K88K8L888L88L8M888M88M8N888N88N8O888O88O8P888P8Q88Q888Q8R88R888R8S88S888S8T88T888T8U88U888U8V88V888V8W88W888W8X88X888X8Y88Y888Y8Z88Z888Z8[88[888[8\88\888\8]88]888]8^88^888^8_88_888_8`88`888`8a88a88a8b8888a8b8c8888b8c8d8888c8d8e8888d8e8f8888e8f8g8888f8g8h8888g8h8i8888h8i8j8888i8j8k8888j8k8l8888k8l8m8888l8m8n8888m8n8o8888n8o8p8888o88p8q88q888q8r88r888r8s88s888s8t88t888t8u88u888u8v88v888v8w88w888w8x88x888x8y88y888y8z88z888z8{88{888{8|88|888|8}88}888}8~88~888~8888888888898898988999888999888999888999888999888999888999888 9 99888 9 9 9888 9 9 9888 9 9 9888 9 9 988899 988899988899989888999888999888999888999888999888999888999888999888999888999888999888999888999888999888999888 99 98!988!9!98"988"9"98#988#9#98$988$9$98%988%9%98&988&9&98'988'9'98(988(9(98)988)9)98*988*9*98+988+9+98,988,9,98-988-9-98.988.9.98/988/9/9809880909888190919888291929888392939888493949888594959888695969888796979888897989888998999888:999:9888;9:9;9888<9;9<9888=9<9=9888>9=9>9888?9>9?9888@9?9@98A988A9A98B988B9B98C988C9C98D988D9D98E988E9E98F988F9F98G988G9G98H988H9H98I988I9I98J988J9J98K988K9K98L988L9L98M988M9M98N988N9N98O988O9O98P988P9P988P98Q9Q988Q98R9R988R98S9S988S98T9T988T98U9U988U98V9V988V98W9W988W98X9X988X98Y9Y988Y98Z9Z988Z98[9[988[98\9\988\98]9]988]98^9^988^98_9_988_98`9`988`98a988b9b9a9888c9c9b9888d9d9c9888e9e9d9888f9f9e9888g9g9f9888h9h9g9888i9i9h9888j9j9i9888k9k9j9888l9l9k9888m9m9l9888n9n9m9888o9o9n9888p9p9o98p988p98q9q988q98r9r988r98s9s988s98t9t988t98u9u988u98v9v988v98w9w988w98x9x988x98y9y988y98z9z988z98{9{988{98|9|988|98}9}988}98~9~988~9899889899999999999999999999999999999999999999999999999999 99999 9 9999 9 9 9999 9 9 9999 9 9 9999 9 99999 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9 9999 99 9!999!99!9"999"99"9#999#99#9$999$99$9%999%99%9&999&99&9'999'99'9(999(99(9)999)99)9*999*99*9+999+99+9,999,99,9-999-99-9.999.99.9/999/99/9099909191999919292999929393999939494999949595999959696999969797999979898999989999999999:9:9999:9;9;9999;9<9<9999<9=9=9999=9>9>9999>9?9?9999?9@9@9999@99@9A999A99A9B999B99B9C999C99C9D999D99D9E999E99E9F999F99F9G999G99G9H999H99H9I999I99I9J999J99J9K999K99K9L999L99L9M999M99M9N999N99N9O999O99O9P999P9Q99Q999Q9R99R999R9S99S999S9T99T999T9U99U999U9V99V999V9W99W999W9X99X999X9Y99Y999Y9Z99Z999Z9[99[999[9\99\999\9]99]999]9^99^999^9_99_999_9`99`999`9a99a99a9b9999a9b9c9999b9c9d9999c9d9e9999d9e9f9999e9f9g9999f9g9h9999g9h9i9999h9i9j9999i9j9k9999j9k9l9999k9l9m9999l9m9n9999m9n9o9999n9o9p9999o99p9q99q999q9r99r999r9s99s999s9t99t999t9u99u999u9v99v999v9w99w999w9x99x999x9y99y999y9z99z999z9{99{999{9|99|999|9}99}999}9~99~999~99999999999:99:9:99:::999:::999:::999:::999:::999:::999:::999 : ::999 : : :999 : : :999 : : :999 : : :999:: :999:::999:::9:999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999:::999 :: :9!:99!:!:9":99":":9#:99#:#:9$:99$:$:9%:99%:%:9&:99&:&:9':99':':9(:99(:(:9):99):):9*:99*:*:9+:99+:+:9,:99,:,:9-:99-:-:9.:99.:.:9/:99/:/:90:990:0:9991:0:1:9992:1:2:9993:2:3:9994:3:4:9995:4:5:9996:5:6:9997:6:7:9998:7:8:9999:8:9:999::9:::999;:::;:999<:;:<:999=:<:=:999>:=:>:999?:>:?:999@:?:@:9A:99A:A:9B:99B:B:9C:99C:C:9D:99D:D:9E:99E:E:9F:99F:F:9G:99G:G:9H:99H:H:9I:99I:I:9J:99J:J:9K:99K:K:9L:99L:L:9M:99M:M:9N:99N:N:9O:99O:O:9P:99P:P:99P:9Q:Q:99Q:9R:R:99R:9S:S:99S:9T:T:99T:9U:U:99U:9V:V:99V:9W:W:99W:9X:X:99X:9Y:Y:99Y:9Z:Z:99Z:9[:[:99[:9\:\:99\:9]:]:99]:9^:^:99^:9_:_:99_:9`:`:99`:9a:99b:b:a:999c:c:b:999d:d:c:999e:e:d:999f:f:e:999g:g:f:999h:h:g:999i:i:h:999j:j:i:999k:k:j:999l:l:k:999m:m:l:999n:n:m:999o:o:n:999p:p:o:9p:99p:9q:q:99q:9r:r:99r:9s:s:99s:9t:t:99t:9u:u:99u:9v:v:99v:9w:w:99w:9x:x:99x:9y:y:99y:9z:z:99z:9{:{:99{:9|:|:99|:9}:}:99}:9~:~:99~:9::99:9:::::::::::::::::::::::::::::::::::::::::::::::::: ::::: : :::: : : :::: : : :::: : : :::: : ::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : :::: :: :!:::!::!:":::"::":#:::#::#:$:::$::$:%:::%::%:&:::&::&:':::'::':(:::(::(:):::)::):*:::*::*:+:::+::+:,:::,::,:-:::-::-:.:::.::.:/:::/::/:0:::0:1:1::::1:2:2::::2:3:3::::3:4:4::::4:5:5::::5:6:6::::6:7:7::::7:8:8::::8:9:9::::9::::::::::;:;::::;:<:<::::<:=:=::::=:>:>::::>:?:?::::?:@:@::::@::@:A:::A::A:B:::B::B:C:::C::C:D:::D::D:E:::E::E:F:::F::F:G:::G::G:H:::H::H:I:::I::I:J:::J::J:K:::K::K:L:::L::L:M:::M::M:N:::N::N:O:::O::O:P:::P:Q::Q:::Q:R::R:::R:S::S:::S:T::T:::T:U::U:::U:V::V:::V:W::W:::W:X::X:::X:Y::Y:::Y:Z::Z:::Z:[::[:::[:\::\:::\:]::]:::]:^::^:::^:_::_:::_:`::`:::`:a::a::a:b::::a:b:c::::b:c:d::::c:d:e::::d:e:f::::e:f:g::::f:g:h::::g:h:i::::h:i:j::::i:j:k::::j:k:l::::k:l:m::::l:m:n::::m:n:o::::n:o:p::::o::p:q::q:::q:r::r:::r:s::s:::s:t::t:::t:u::u:::u:v::v:::v:w::w:::w:x::x:::x:y::y:::y:z::z:::z:{::{:::{:|::|:::|:}::}:::}:~::~:::~:::::::::::;::;:;::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;::: ; ;;::: ; ; ;::: ; ; ;::: ; ; ;::: ; ; ;:::;; ;:::;;;:::;;;:;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;:::;;;::: ;; ;:!;::!;!;:";::";";:#;::#;#;:$;::$;$;:%;::%;%;:&;::&;&;:';::';';:(;::(;(;:);::););:*;::*;*;:+;::+;+;:,;::,;,;:-;::-;-;:.;::.;.;:/;::/;/;:0;::0;0;:::1;0;1;:::2;1;2;:::3;2;3;:::4;3;4;:::5;4;5;:::6;5;6;:::7;6;7;:::8;7;8;:::9;8;9;::::;9;:;:::;;:;;;:::<;;;<;:::=;<;=;:::>;=;>;:::?;>;?;:::@;?;@;:A;::A;A;:B;::B;B;:C;::C;C;:D;::D;D;:E;::E;E;:F;::F;F;:G;::G;G;:H;::H;H;:I;::I;I;:J;::J;J;:K;::K;K;:L;::L;L;:M;::M;M;:N;::N;N;:O;::O;O;:P;::P;P;::P;:Q;Q;::Q;:R;R;::R;:S;S;::S;:T;T;::T;:U;U;::U;:V;V;::V;:W;W;::W;:X;X;::X;:Y;Y;::Y;:Z;Z;::Z;:[;[;::[;:\;\;::\;:];];::];:^;^;::^;:_;_;::_;:`;`;::`;:a;::b;b;a;:::c;c;b;:::d;d;c;:::e;e;d;:::f;f;e;:::g;g;f;:::h;h;g;:::i;i;h;:::j;j;i;:::k;k;j;:::l;l;k;:::m;m;l;:::n;n;m;:::o;o;n;:::p;p;o;:p;::p;:q;q;::q;:r;r;::r;:s;s;::s;:t;t;::t;:u;u;::u;:v;v;::v;:w;w;::w;:x;x;::x;:y;y;::y;:z;z;::z;:{;{;::{;:|;|;::|;:};};::};:~;~;::~;:;;::;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; ; ;;;; ; ; ;;;; ; ; ;;;; ; ; ;;;; ; ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;; ;; ;!;;;!;;!;";;;";;";#;;;#;;#;$;;;$;;$;%;;;%;;%;&;;;&;;&;';;;';;';(;;;(;;(;);;;);;);*;;;*;;*;+;;;+;;+;,;;;,;;,;-;;;-;;-;.;;;.;;.;/;;;/;;/;0;;;0;1;1;;;;1;2;2;;;;2;3;3;;;;3;4;4;;;;4;5;5;;;;5;6;6;;;;6;7;7;;;;7;8;8;;;;8;9;9;;;;9;:;:;;;;:;;;;;;;;;;<;<;;;;<;=;=;;;;=;>;>;;;;>;?;?;;;;?;@;@;;;;@;;@;A;;;A;;A;B;;;B;;B;C;;;C;;C;D;;;D;;D;E;;;E;;E;F;;;F;;F;G;;;G;;G;H;;;H;;H;I;;;I;;I;J;;;J;;J;K;;;K;;K;L;;;L;;L;M;;;M;;M;N;;;N;;N;O;;;O;;O;P;;;P;Q;;Q;;;Q;R;;R;;;R;S;;S;;;S;T;;T;;;T;U;;U;;;U;V;;V;;;V;W;;W;;;W;X;;X;;;X;Y;;Y;;;Y;Z;;Z;;;Z;[;;[;;;[;\;;\;;;\;];;];;;];^;;^;;;^;_;;_;;;_;`;;`;;;`;a;;a;;a;b;;;;a;b;c;;;;b;c;d;;;;c;d;e;;;;d;e;f;;;;e;f;g;;;;f;g;h;;;;g;h;i;;;;h;i;j;;;;i;j;k;;;;j;k;l;;;;k;l;m;;;;l;m;n;;;;m;n;o;;;;n;o;p;;;;o;;p;q;;q;;;q;r;;r;;;r;s;;s;;;s;t;;t;;;t;u;;u;;;u;v;;v;;;v;w;;w;;;w;x;;x;;;x;y;;y;;;y;z;;z;;;z;{;;{;;;{;|;;|;;;|;};;};;;};~;;~;;;~;;;;;;;;;;;<;;<;<;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;; < <<;;; < < <;;; < < <;;; < < <;;; < < <;;;<< <;;;<<<;;;<<<;<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;;<<<;;; << <;!<;;!<!<;"<;;"<"<;#<;;#<#<;$<;;$<$<;%<;;%<%<;&<;;&<&<;'<;;'<'<;(<;;(<(<;)<;;)<)<;*<;;*<*<;+<;;+<+<;,<;;,<,<;-<;;-<-<;.<;;.<.<;/<;;/</<;0<;;0<0<;;;1<0<1<;;;2<1<2<;;;3<2<3<;;;4<3<4<;;;5<4<5<;;;6<5<6<;;;7<6<7<;;;8<7<8<;;;9<8<9<;;;:<9<:<;;;;<:<;<;;;<<;<<<;;;=<<<=<;;;><=<><;;;?<><?<;;;@<><<<<>===>=<<=?=<<<@=?=@==>====>=?=?====?=@=@====@==@=A===A==A=B===B==B=C===C==C=D===D==D=E===E==E=F===F==F=G===G==G=H===H==H=I===I==I=J===J==J=K===K==K=L===L==L=M===M==M=N===N==N=O===O==O=P===P=Q==Q===Q=R==R===R=S==S===S=T==T===T=U==U===U=V==V===V=W==W===W=X==X===X=Y==Y===Y=Z==Z===Z=[==[===[=\==\===\=]==]===]=^==^===^=_==_===_=`==`===`=a==a==a=b====a=b=c====b=c=d====c=d=e====d=e=f====e=f=g====f=g=h====g=h=i====h=i=j====i=j=k====j=k=l====k=l=m====l=m=n====m=n=o====n=o=p====o==p=q==q===q=r==r===r=s==s===s=t==t===t=u==u===u=v==v===v=w==w===w=x==x===x=y==y===y=z==z===z={=={==={=|==|===|=}==}===}=~==~===~===========>==>=>==>>>===>>>===>>>===>>>===>>>===>>>===>>>=== > >>=== > > >=== > > >=== > > >=== > > >===>> >===>>>===>>>=>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>===>>>=== >> >=!>==!>!>=">==">">=#>==#>#>=$>==$>$>=%>==%>%>=&>==&>&>='>=='>'>=(>==(>(>=)>==)>)>=*>==*>*>=+>==+>+>=,>==,>,>=->==->->=.>==.>.>=/>==/>/>=0>==0>0>===1>0>1>===2>1>2>===3>2>3>===4>3>4>===5>4>5>===6>5>6>===7>6>7>===8>7>8>===9>8>9>===:>9>:>===;>:>;>===<>;><>====><>=>===>>=>>>===?>>>?>===@>?>@>=A>==A>A>=B>==B>B>=C>==C>C>=D>==D>D>=E>==E>E>=F>==F>F>=G>==G>G>=H>==H>H>=I>==I>I>=J>==J>J>=K>==K>K>=L>==L>L>=M>==M>M>=N>==N>N>=O>==O>O>=P>==P>P>==P>=Q>Q>==Q>=R>R>==R>=S>S>==S>=T>T>==T>=U>U>==U>=V>V>==V>=W>W>==W>=X>X>==X>=Y>Y>==Y>=Z>Z>==Z>=[>[>==[>=\>\>==\>=]>]>==]>=^>^>==^>=_>_>==_>=`>`>==`>=a>==b>b>a>===c>c>b>===d>d>c>===e>e>d>===f>f>e>===g>g>f>===h>h>g>===i>i>h>===j>j>i>===k>k>j>===l>l>k>===m>m>l>===n>n>m>===o>o>n>===p>p>o>=p>==p>=q>q>==q>=r>r>==r>=s>s>==s>=t>t>==t>=u>u>==u>=v>v>==v>=w>w>==w>=x>x>==x>=y>y>==y>=z>z>==z>={>{>=={>=|>|>==|>=}>}>==}>=~>~>==~>=>>==>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>> > >>>> > > >>>> > > >>>> > > >>>> > >>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>> >> >!>>>!>>!>">>>">>">#>>>#>>#>$>>>$>>$>%>>>%>>%>&>>>&>>&>'>>>'>>'>(>>>(>>(>)>>>)>>)>*>>>*>>*>+>>>+>>+>,>>>,>>,>->>>->>->.>>>.>>.>/>>>/>>/>0>>>0>1>1>>>>1>2>2>>>>2>3>3>>>>3>4>4>>>>4>5>5>>>>5>6>6>>>>6>7>7>>>>7>8>8>>>>8>9>9>>>>9>:>:>>>>:>;>;>>>>;><><>>>><>=>=>>>>=>>>>>>>>>>?>?>>>>?>@>@>>>>@>>@>A>>>A>>A>B>>>B>>B>C>>>C>>C>D>>>D>>D>E>>>E>>E>F>>>F>>F>G>>>G>>G>H>>>H>>H>I>>>I>>I>J>>>J>>J>K>>>K>>K>L>>>L>>L>M>>>M>>M>N>>>N>>N>O>>>O>>O>P>>>P>Q>>Q>>>Q>R>>R>>>R>S>>S>>>S>T>>T>>>T>U>>U>>>U>V>>V>>>V>W>>W>>>W>X>>X>>>X>Y>>Y>>>Y>Z>>Z>>>Z>[>>[>>>[>\>>\>>>\>]>>]>>>]>^>>^>>>^>_>>_>>>_>`>>`>>>`>a>>a>>a>b>>>>a>b>c>>>>b>c>d>>>>c>d>e>>>>d>e>f>>>>e>f>g>>>>f>g>h>>>>g>h>i>>>>h>i>j>>>>i>j>k>>>>j>k>l>>>>k>l>m>>>>l>m>n>>>>m>n>o>>>>n>o>p>>>>o>>p>q>>q>>>q>r>>r>>>r>s>>s>>>s>t>>t>>>t>u>>u>>>u>v>>v>>>v>w>>w>>>w>x>>x>>>x>y>>y>>>y>z>>z>>>z>{>>{>>>{>|>>|>>>|>}>>}>>>}>~>>~>>>~>>>>>>>>>>>?>>?>?>>???>>>???>>>???>>>???>>>???>>>???>>>???>>> ? ??>>> ? ? ?>>> ? ? ?>>> ? ? ?>>> ? ? ?>>>?? ?>>>???>>>???>?>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>>???>>> ?? ?>!?>>!?!?>"?>>"?"?>#?>>#?#?>$?>>$?$?>%?>>%?%?>&?>>&?&?>'?>>'?'?>(?>>(?(?>)?>>)?)?>*?>>*?*?>+?>>+?+?>,?>>,?,?>-?>>-?-?>.?>>.?.?>/?>>/?/?>0?>>0?0?>>>1?0?1?>>>2?1?2?>>>3?2?3?>>>4?3?4?>>>5?4?5?>>>6?5?6?>>>7?6?7?>>>8?7?8?>>>9?8?9?>>>:?9?:?>>>;?:?;?>>>>>=?>>>?=?>?>>>??>???>>>@???@?>A?>>A?A?>B?>>B?B?>C?>>C?C?>D?>>D?D?>E?>>E?E?>F?>>F?F?>G?>>G?G?>H?>>H?H?>I?>>I?I?>J?>>J?J?>K?>>K?K?>L?>>L?L?>M?>>M?M?>N?>>N?N?>O?>>O?O?>P?>>P?P?>>P?>Q?Q?>>Q?>R?R?>>R?>S?S?>>S?>T?T?>>T?>U?U?>>U?>V?V?>>V?>W?W?>>W?>X?X?>>X?>Y?Y?>>Y?>Z?Z?>>Z?>[?[?>>[?>\?\?>>\?>]?]?>>]?>^?^?>>^?>_?_?>>_?>`?`?>>`?>a?>>b?b?a?>>>c?c?b?>>>d?d?c?>>>e?e?d?>>>f?f?e?>>>g?g?f?>>>h?h?g?>>>i?i?h?>>>j?j?i?>>>k?k?j?>>>l?l?k?>>>m?m?l?>>>n?n?m?>>>o?o?n?>>>p?p?o?>p?>>p?>q?q?>>q?>r?r?>>r?>s?s?>>s?>t?t?>>t?>u?u?>>u?>v?v?>>v?>w?w?>>w?>x?x?>>x?>y?y?>>y?>z?z?>>z?>{?{?>>{?>|?|?>>|?>}?}?>>}?>~?~?>>~?>??>>?>?0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##################################################################################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&%&&&'&(&)&*&+&,&-&.&/&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?&@&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&^&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''''''''' ' ' ' ' ''''''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}'~''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''((((((((( ( ( ( ( ((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@)A)B)C)D)E)F)G)H)I)J)K)L)M)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])^)_)`)a)b)c)d)e)f)g)h)i)j)k)l)m)n)o)p)q)r)s)t)u)v)w)x)y)z){)|)})~))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))********* * * * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**********************************************************************************************************************************+++++++++ + + + + +++++++++++++++++++ +!+"+#+$+%+&+'+(+)+*+++,+-+.+/+0+1+2+3+4+5+6+7+8+9+:+;+<+=+>+?+@+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+\+]+^+_+`+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|+}+~++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - ------------------- -!-"-#-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-{-|-}-~----------------------------------------------------------------------------------------------------------------------------------......... . . . . ................... .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].^._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~..................................................................................................................................///////// / / / / /////////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/7/8/9/:/;//?/@/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/[/\/]/^/_/`/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/{/|/}/~//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////000000000 0 0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111 1 1 1 1 1111111111111111111 1!1"1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1[1\1]1^1_1`1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|1}1~1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222 2 2 2 2 2222222222222222222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728292:2;2<2=2>2?2@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2`2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333 3 3 3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555 5 5 5 5 5555555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666 6 6 6 6 6666666666666666666 6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777888888888 8 8 8 8 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::::::::: : : : : ::::::::::::::::::: :!:":#:$:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:5:6:7:8:9:::;:<:=:>:?:@:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:{:|:}:~::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;; ;!;";#;$;%;&;';(;);*;+;,;-;.;/;0;1;2;3;4;5;6;7;8;9;:;;;<;=;>;?;@;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];^;_;`;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;{;|;};~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<< < < < < <<<<<<<<<<<<<<<<<<< =?=@=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=^=_=`=a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}=~==================================================================================================================================>>>>>>>>> > > > > >>>>>>>>>>>>>>>>>>> >!>">#>$>%>&>'>(>)>*>+>,>->.>/>0>1>2>3>4>5>6>7>8>9>:>;><>=>>>?>@>A>B>C>D>E>F>G>H>I>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>^>_>`>a>b>c>d>e>f>g>h>i>j>k>l>m>n>o>p>q>r>s>t>u>v>w>x>y>z>{>|>}>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????? ? ? ? ? ??????????????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;????@?A?B?C?D?E?F?G?H?I?J?K?L?M?N?O?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?^?_?`?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?{?|?}?~??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@@ @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@`@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@{@|@}@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAA A A A A AAAAAAAAAAAAAAAAAAA A!A"A#A$A%A&A'A(A)A*A+A,A-A.A/A0A1A2A3A4A5A6A7A8A9A:A;AA?A@AAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA[A\A]A^A_A`AaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzA{A|A}A~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBB B B B B BBBBBBBBBBBBBBBBBBB B!B"B#B$B%B&B'B(B)B*B+B,B-B.B/B0B1B2B3B4B5B6B7B8B9B:B;BB?B@BABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB[B\B]B^B_B`BaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzB{B|B}B~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCC C C C C CCCCCCCCCCCCCCCCCCC C!C"C#C$C%C&C'C(C)C*C+C,C-C.C/C0C1C2C3C4C5C6C7C8C9C:C;CC?C@CACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC[C\C]C^C_C`CaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzC{C|C}C~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDD D D D D DDDDDDDDDDDDDDDDDDD D!D"D#D$D%D&D'D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD?D@DADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD[D\D]D^D_D`DaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzD{D|D}D~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEE E E E E EEEEEEEEEEEEEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E,E-E.E/E0E1E2E3E4E5E6E7E8E9E:E;EE?E@EAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE[E\E]E^E_E`EaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzE{E|E}E~EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFF F F F F FFFFFFFFFFFFFFFFFFF F!F"F#F$F%F&F'F(F)F*F+F,F-F.F/F0F1F2F3F4F5F6F7F8F9F:F;FF?F@FAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF[F\F]F^F_F`FaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzF{F|F}F~FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGG G G G G GGGGGGGGGGGGGGGGGGG G!G"G#G$G%G&G'G(G)G*G+G,G-G.G/G0G1G2G3G4G5G6G7G8G9G:G;GG?G@GAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG[G\G]G^G_G`GaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzG{G|G}G~GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHH H H H H HHHHHHHHHHHHHHHHHHH H!H"H#H$H%H&H'H(H)H*H+H,H-H.H/H0H1H2H3H4H5H6H7H8H9H:H;HH?H@HAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH[H\H]H^H_H`HaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzH{H|H}H~HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIII I I I I IIIIIIIIIIIIIIIIIII I!I"I#I$I%I&I'I(I)I*I+I,I-I.I/I0I1I2I3I4I5I6I7I8I9I:I;II?I@IAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI[I\I]I^I_I`IaIbIcIdIeIfIgIhIiIjIkIlImInIoIpIqIrIsItIuIvIwIxIyIzI{I|I}I~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJ J J J J JJJJJJJJJJJJJJJJJJJ J!J"J#J$J%J&J'J(J)J*J+J,J-J.J/J0J1J2J3J4J5J6J7J8J9J:J;JJ?J@JAJBJCJDJEJFJGJHJIJJJKJLJMJNJOJPJQJRJSJTJUJVJWJXJYJZJ[J\J]J^J_J`JaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJwJxJyJzJ{J|J}J~JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKK K K K K KKKKKKKKKKKKKKKKKKK K!K"K#K$K%K&K'K(K)K*K+K,K-K.K/K0K1K2K3K4K5K6K7K8K9K:K;KK?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLL L L L L LLLLLLLLLLLLLLLLLLL L!L"L#L$L%L&L'L(L)L*L+L,L-L.L/L0L1L2L3L4L5L6L7L8L9L:L;LL?L@LALBLCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZL[L\L]L^L_L`LaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLzL{L|L}L~LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMM M M M M MMMMMMMMMMMMMMMMMMM M!M"M#M$M%M&M'M(M)M*M+M,M-M.M/M0M1M2M3M4M5M6M7M8M9M:M;MM?M@MAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZM[M\M]M^M_M`MaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMrMsMtMuMvMwMxMyMzM{M|M}M~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNN N N N N NNNNNNNNNNNNNNNNNNN N!N"N#N$N%N&N'N(N)N*N+N,N-N.N/N0N1N2N3N4N5N6N7N8N9N:N;NN?N@NANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN[N\N]N^N_N`NaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzN{N|N}N~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOO O O O O OOOOOOOOOOOOOOOOOOO O!O"O#O$O%O&O'O(O)O*O+O,O-O.O/O0O1O2O3O4O5O6O7O8O9O:O;OO?O@OAOBOCODOEOFOGOHOIOJOKOLOMONOOOPOQOROSOTOUOVOWOXOYOZO[O\O]O^O_O`OaObOcOdOeOfOgOhOiOjOkOlOmOnOoOpOqOrOsOtOuOvOwOxOyOzO{O|O}O~OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPP P P P P PPPPPPPPPPPPPPPPPPP P!P"P#P$P%P&P'P(P)P*P+P,P-P.P/P0P1P2P3P4P5P6P7P8P9P:P;PP?P@PAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZP[P\P]P^P_P`PaPbPcPdPePfPgPhPiPjPkPlPmPnPoPpPqPrPsPtPuPvPwPxPyPzP{P|P}P~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQ Q Q Q Q QQQQQQQQQQQQQQQQQQQ Q!Q"Q#Q$Q%Q&Q'Q(Q)Q*Q+Q,Q-Q.Q/Q0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q:Q;QQ?Q@QAQBQCQDQEQFQGQHQIQJQKQLQMQNQOQPQQQRQSQTQUQVQWQXQYQZQ[Q\Q]Q^Q_Q`QaQbQcQdQeQfQgQhQiQjQkQlQmQnQoQpQqQrQsQtQuQvQwQxQyQzQ{Q|Q}Q~QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRR R R R R RRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R5R6R7R8R9R:R;RR?R@RARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR[R\R]R^R_R`RaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRyRzR{R|R}R~RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSS S S S S SSSSSSSSSSSSSSSSSSS S!S"S#S$S%S&S'S(S)S*S+S,S-S.S/S0S1S2S3S4S5S6S7S8S9S:S;SS?S@SASBSCSDSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZS[S\S]S^S_S`SaSbScSdSeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSxSySzS{S|S}S~SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTT T T T T TTTTTTTTTTTTTTTTTTT T!T"T#T$T%T&T'T(T)T*T+T,T-T.T/T0T1T2T3T4T5T6T7T8T9T:T;TT?T@TATBTCTDTETFTGTHTITJTKTLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT[T\T]T^T_T`TaTbTcTdTeTfTgThTiTjTkTlTmTnToTpTqTrTsTtTuTvTwTxTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUU U U U U UUUUUUUUUUUUUUUUUUU U!U"U#U$U%U&U'U(U)U*U+U,U-U.U/U0U1U2U3U4U5U6U7U8U9U:U;UU?U@UAUBUCUDUEUFUGUHUIUJUKULUMUNUOUPUQURUSUTUUUVUWUXUYUZU[U\U]U^U_U`UaUbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvUwUxUyUzU{U|U}U~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVV V V V V VVVVVVVVVVVVVVVVVVV V!V"V#V$V%V&V'V(V)V*V+V,V-V.V/V0V1V2V3V4V5V6V7V8V9V:V;VV?V@VAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZV[V\V]V^V_V`VaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzV{V|V}V~VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWW W W W W WWWWWWWWWWWWWWWWWWW W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W0W1W2W3W4W5W6W7W8W9W:W;WW?W@WAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWSWTWUWVWWWXWYWZW[W\W]W^W_W`WaWbWcWdWeWfWgWhWiWjWkWlWmWnWoWpWqWrWsWtWuWvWwWxWyWzW{W|W}W~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXXXXXXX X X X X XXXXXXXXXXXXXXXXXXX X!X"X#X$X%X&X'X(X)X*X+X,X-X.X/X0X1X2X3X4X5X6X7X8X9X:X;XX?X@XAXBXCXDXEXFXGXHXIXJXKXLXMXNXOXPXQXRXSXTXUXVXWXXXYXZX[X\X]X^X_X`XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX{X|X}X~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYY Y Y Y Y YYYYYYYYYYYYYYYYYYY Y!Y"Y#Y$Y%Y&Y'Y(Y)Y*Y+Y,Y-Y.Y/Y0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y:Y;YY?Y@YAYBYCYDYEYFYGYHYIYJYKYLYMYNYOYPYQYRYSYTYUYVYWYXYYYZY[Y\Y]Y^Y_Y`YaYbYcYdYeYfYgYhYiYjYkYlYmYnYoYpYqYrYsYtYuYvYwYxYyYzY{Y|Y}Y~YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZ Z Z Z Z ZZZZZZZZZZZZZZZZZZZ Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*Z+Z,Z-Z.Z/Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9Z:Z;ZZ?Z@ZAZBZCZDZEZFZGZHZIZJZKZLZMZNZOZPZQZRZSZTZUZVZWZXZYZZZ[Z\Z]Z^Z_Z`ZaZbZcZdZeZfZgZhZiZjZkZlZmZnZoZpZqZrZsZtZuZvZwZxZyZzZ{Z|Z}Z~ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[ [ [ [ [ [[[[[[[[[[[[[[[[[[[ [!["[#[$[%[&['[([)[*[+[,[-[.[/[0[1[2[3[4[5[6[7[8[9[:[;[<[=[>[?[@[A[B[C[D[E[F[G[H[I[J[K[L[M[N[O[P[Q[R[S[T[U[V[W[X[Y[Z[[[\[][^[_[`[a[b[c[d[e[f[g[h[i[j[k[l[m[n[o[p[q[r[s[t[u[v[w[x[y[z[{[|[}[~[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]]] ] ] ] ] ]]]]]]]]]]]]]]]]]]] ]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^^^^^^^ ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^ ^!^"^#^$^%^&^'^(^)^*^+^,^-^.^/^0^1^2^3^4^5^6^7^8^9^:^;^<^=^>^?^@^A^B^C^D^E^F^G^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_^`^a^b^c^d^e^f^g^h^i^j^k^l^m^n^o^p^q^r^s^t^u^v^w^x^y^z^{^|^}^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_________ _ _ _ _ ___________________ _!_"_#_$_%_&_'_(_)_*_+_,_-_._/_0_1_2_3_4_5_6_7_8_9_:_;_<_=_>_?_@_A_B_C_D_E_F_G_H_I_J_K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_[_\_]_^___`_a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z_{_|_}_~__________________________________________________________________________________________________________________________________````````` ` ` ` ` ``````````````````` `!`"`#`$`%`&`'`(`)`*`+`,`-`.`/`0`1`2`3`4`5`6`7`8`9`:`;`<`=`>`?`@`A`B`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_```a`b`c`d`e`f`g`h`i`j`k`l`m`n`o`p`q`r`s`t`u`v`w`x`y`z`{`|`}`~``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````aaaaaaaaa a a a a aaaaaaaaaaaaaaaaaaa a!a"a#a$a%a&a'a(a)a*a+a,a-a.a/a0a1a2a3a4a5a6a7a8a9a:a;aa?a@aAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa[a\a]a^a_a`aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayaza{a|a}a~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbb b b b b bbbbbbbbbbbbbbbbbbb b!b"b#b$b%b&b'b(b)b*b+b,b-b.b/b0b1b2b3b4b5b6b7b8b9b:b;bb?b@bAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb[b\b]b^b_b`babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzb{b|b}b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccc c c c c ccccccccccccccccccc c!c"c#c$c%c&c'c(c)c*c+c,c-c.c/c0c1c2c3c4c5c6c7c8c9c:c;cc?c@cAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc[c\c]c^c_c`cacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczc{c|c}c~ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeee e e e e eeeeeeeeeeeeeeeeeee e!e"e#e$e%e&e'e(e)e*e+e,e-e.e/e0e1e2e3e4e5e6e7e8e9e:e;ee?e@eAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe[e\e]e^e_e`eaebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze{e|e}e~eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffff f f f f fffffffffffffffffff f!f"f#f$f%f&f'f(f)f*f+f,f-f.f/f0f1f2f3f4f5f6f7f8f9f:f;ff?f@fAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf[f\f]f^f_f`fafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf{f|f}f~ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggg g g g g ggggggggggggggggggg g!g"g#g$g%g&g'g(g)g*g+g,g-g.g/g0g1g2g3g4g5g6g7g8g9g:g;gg?g@gAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg[g\g]g^g_g`gagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzg{g|g}g~gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhh h h h h hhhhhhhhhhhhhhhhhhh h!h"h#h$h%h&h'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;hh?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\h]h^h_h`hahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjj j j j j jjjjjjjjjjjjjjjjjjj j!j"j#j$j%j&j'j(j)j*j+j,j-j.j/j0j1j2j3j4j5j6j7j8j9j:j;jj?j@jAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj[j\j]j^j_j`jajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkk k k k k kkkkkkkkkkkkkkkkkkk k!k"k#k$k%k&k'k(k)k*k+k,k-k.k/k0k1k2k3k4k5k6k7k8k9k:k;kk?k@kAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk[k\k]k^k_k`kakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzk{k|k}k~kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllll l l l l lllllllllllllllllll l!l"l#l$l%l&l'l(l)l*l+l,l-l.l/l0l1l2l3l4l5l6l7l8l9l:l;ll?l@lAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl[l\l]l^l_l`lalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzl{l|l}l~llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllmmmmmmmmm m m m m mmmmmmmmmmmmmmmmmmm m!m"m#m$m%m&m'm(m)m*m+m,m-m.m/m0m1m2m3m4m5m6m7m8m9m:m;mm?m@mAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm[m\m]m^m_m`mambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzm{m|m}m~mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnn n n n n nnnnnnnnnnnnnnnnnnn n!n"n#n$n%n&n'n(n)n*n+n,n-n.n/n0n1n2n3n4n5n6n7n8n9n:n;nn?n@nAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn[n\n]n^n_n`nanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynzn{n|n}n~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooooooooo o o o o ooooooooooooooooooo o!o"o#o$o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o5o6o7o8o9o:o;oo?o@oAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`oaobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozo{o|o}o~ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooppppppppp p p p p ppppppppppppppppppp p!p"p#p$p%p&p'p(p)p*p+p,p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;pp?p@pApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp[p\p]p^p_p`papbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzp{p|p}p~ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppqqqqqqqqq q q q q qqqqqqqqqqqqqqqqqqq q!q"q#q$q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q5q6q7q8q9q:q;qq?q@qAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;rr?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsssssssss s s s s sssssssssssssssssss s!s"s#s$s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s5s6s7s8s9s:s;ss?s@sAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszs{s|s}s~ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssttttttttt t t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t0t1t2t3t4t5t6t7t8t9t:t;tt?t@tAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtZt[t\t]t^t_t`tatbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytzt{t|t}t~ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttuuuuuuuuu u u u u uuuuuuuuuuuuuuuuuuu u!u"u#u$u%u&u'u(u)u*u+u,u-u.u/u0u1u2u3u4u5u6u7u8u9u:u;uu?u@uAuBuCuDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu[u\u]u^u_u`uaubucudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzu{u|u}u~uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvv v v v v vvvvvvvvvvvvvvvvvvv v!v"v#v$v%v&v'v(v)v*v+v,v-v.v/v0v1v2v3v4v5v6v7v8v9v:v;vv?v@vAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv[v\v]v^v_v`vavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzv{v|v}v~vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwww w w w w wwwwwwwwwwwwwwwwwww w!w"w#w$w%w&w'w(w)w*w+w,w-w.w/w0w1w2w3w4w5w6w7w8w9w:w;ww?w@wAwBwCwDwEwFwGwHwIwJwKwLwMwNwOwPwQwRwSwTwUwVwWwXwYwZw[w\w]w^w_w`wawbwcwdwewfwgwhwiwjwkwlwmwnwowpwqwrwswtwuwvwwwxwywzw{w|w}w~wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxx x x x x xxxxxxxxxxxxxxxxxxx x!x"x#x$x%x&x'x(x)x*x+x,x-x.x/x0x1x2x3x4x5x6x7x8x9x:x;xx?x@xAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx[x\x]x^x_x`xaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyy y y y y yyyyyyyyyyyyyyyyyyy y!y"y#y$y%y&y'y(y)y*y+y,y-y.y/y0y1y2y3y4y5y6y7y8y9y:y;yy?y@yAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy[y\y]y^y_y`yaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzy{y|y}y~yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzz z z z z zzzzzzzzzzzzzzzzzzz z!z"z#z$z%z&z'z(z)z*z+z,z-z.z/z0z1z2z3z4z5z6z7z8z9z:z;zz?z@zAzBzCzDzEzFzGzHzIzJzKzLzMzNzOzPzQzRzSzTzUzVzWzXzYzZz[z\z]z^z_z`zazbzczdzezfzgzhzizjzkzlzmznzozpzqzrzsztzuzvzwzxzyzzz{z|z}z~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{ { { { { {{{{{{{{{{{{{{{{{{{ {!{"{#{${%{&{'{({){*{+{,{-{.{/{0{1{2{3{4{5{6{7{8{9{:{;{<{={>{?{@{A{B{C{D{E{F{G{H{I{J{K{L{M{N{O{P{Q{R{S{T{U{V{W{X{Y{Z{[{\{]{^{_{`{a{b{c{d{e{f{g{h{i{j{k{l{m{n{o{p{q{r{s{t{u{v{w{x{y{z{{{|{}{~{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||| | | | | ||||||||||||||||||| |!|"|#|$|%|&|'|(|)|*|+|,|-|.|/|0|1|2|3|4|5|6|7|8|9|:|;|<|=|>|?|@|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|[|\|]|^|_|`|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|{|||}|~||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}} } } } } }}}}}}}}}}}}}}}}}}} }!}"}#}$}%}&}'}(})}*}+},}-}.}/}0}1}2}3}4}5}6}7}8}9}:};}<}=}>}?}@}A}B}C}D}E}F}G}H}I}J}K}L}M}N}O}P}Q}R}S}T}U}V}W}X}Y}Z}[}\}]}^}_}`}a}b}c}d}e}f}g}h}i}j}k}l}m}n}o}p}q}r}s}t}u}v}w}x}y}z}{}|}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~~~~ ~!~"~#~$~%~&~'~(~)~*~+~,~-~.~/~0~1~2~3~4~5~6~7~8~9~:~;~<~=~>~?~@~A~B~C~D~E~F~G~H~I~J~K~L~M~N~O~P~Q~R~S~T~U~V~W~X~Y~Z~[~\~]~^~_~`~a~b~c~d~e~f~g~h~i~j~k~l~m~n~o~p~q~r~s~t~u~v~w~x~y~z~{~|~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PAs3d-0.2.2.1/objs/btn_close.3ds000066400000000000000000000105141361325167000156700ustar00rootroot00000000000000MML ==>= 02 - Default 88  880 @0 A0P0R0S00 ? ?@+Box01AA@kI1>>kI1$??$>>??kI1>>kI1>>>kI1>?$>?$$?????$$?>>$?@A??????????????????????????`A65?55?.;5?cc13 A   0A-02 - Default  PA6 @@@+Box02AA@>:K?9:K?7:>7:9>L?9K?>9>:K?9:99>L?>:K?7:997:9K?7:>K?>K?>97:9K?7:>>L?>L?K?7:>@A??????????????????????????`A6555?.;5cc3o:o:o: A   0A-02 - Default  PA6 @@@Box04AAtIL:3?L:3q-=??q-=?????@E3@@?E3@@?@@@@?@?@?@?@@?@@??L:3??L:3?q-=????q-=?q-=?L:3?q-=????????q-=?q-=??q-=??q-=??q-=??L:3?L:3?L:3L:3L:3q-=?q-=?@E3@@@@?@@?@@?E3@@E3@@?E3@@?@@?@?@?@?@?@?@?E3@@?@?@?@?@@?@@?@@?@?@?@@?@@?@@@@@E3@@@?@API??????????`?>>>`?>>>>`?`?`?`?`?>`?????????????????????????????????????????????????????`A6?.;?.;׀ A      ! "  # $ % &' ( )* +,-./0123456789:;<=>?@ABCDEFGH0AU02 - Default  PA @@ @@+ MAXSCENEdd 0Box01@ &13!*?%\>"&???0Box02@ &!*%@Tꏾ--?"&???0Box04@ &׀!*?"&???s3d-0.2.2.1/objs/btn_maximize.3ds000066400000000000000000000064051361325167000164120ustar00rootroot00000000000000MM  ==r >= 02 - Default 88  880 @0 A0P0R0S00 ? ?@Box04AAtIL:3?L:3q-=??q-=?????@E3@@?E3@@?@@@@?@?@?@?@@?@@??L:3??L:3?q-=????q-=?q-=?L:3?q-=????????q-=?q-=??q-=??q-=??q-=??L:3?L:3?L:3L:3L:3q-=?q-=?@E3@@@@?@@?@@?E3@@E3@@?E3@@?@@?@?@?@?@?@?@?E3@@?@?@?@?@@?@@?@@?@?@?@@?@@?@@@@@E3@@@?@API??????????`?>>>`?>>>>`?`?`?`?`?>`?????????????????????????????????????????????????????`A6?.;?.;׀ A      ! "  # $ % &' ( )* +,-./0123456789:;<=>?@ABCDEFGH0AU02 - Default  PA @@ @@@Box02AA 8?șmd?8?dKnd?%hșqd? 8?șb 8?Qc$hKpd? 8?șmd?8?dKnd?$hKpd?$hKpd?%hșqd? 8?șmd?8?dKnd? 8?șb 8?șb 8?Qc8?dKnd?%hșqd?$hKpd? 8?Qc 8?Qc 8?șb%hșqd?@A?=?b?b?b??b??b??b???===???3-f?:?3-f?>C=>C=>H=:?3-f?:?`A655?5.;5d3a3?t2 = N A  0A%02 - DefaultPA&@@ MAXSCENEdd 0Box04@ &׀!*?"&???0Box02@ &?t2 = N!*"l@V>--?"&???s3d-0.2.2.1/objs/btn_minimize.3ds000066400000000000000000000064051361325167000164100ustar00rootroot00000000000000MM  ==r >= 02 - Default 88  880 @0 A0P0R0S00 ? ?@Box04AAtIL:3?L:3q-=??q-=?????@E3@@?E3@@?@@@@?@?@?@?@@?@@??L:3??L:3?q-=????q-=?q-=?L:3?q-=????????q-=?q-=??q-=??q-=??q-=??L:3?L:3?L:3L:3L:3q-=?q-=?@E3@@@@?@@?@@?E3@@E3@@?E3@@?@@?@?@?@?@?@?@?E3@@?@?@?@?@@?@@?@@?@?@?@@?@@?@@@@@E3@@@?@API??????????`?>>>`?>>>>`?`?`?`?`?>`?????????????????????????????????????????????????????`A6?.;?.;׀ A      ! "  # $ % &' ( )* +,-./0123456789:;<=>?@ABCDEFGH0AU02 - Default  PA @@ @@@Box02AAoAșc?$qAdMd?$`U>șd?$pAșz>qASz>_U>Mc?$oAșc?$qAdMd?$_U>Mc?$_U>Mc?$`U>șd?$oAșc?$qAdMd?$pAșz>pAșz>qASz>qAdMd?$`U>șd?$_U>Mc?$qASz>qASz>pAșz>`U>șd?$@A?=?b?b?b??b??b??b???===???3-f?:?3-f?>C=>C=>H=:?3-f?:?`A65?55?.;5?ccN*>} =Tr'> A  0A%02 - DefaultPA&@@ MAXSCENEdd 0Box04@ &׀!*?"&???0Box02@ &N*>} =Tr'>!*?%\>"&???s3d-0.2.2.1/objs/btn_rotate.3ds000066400000000000000000000200131361325167000160540ustar00rootroot00000000000000MM  ==z>= 02 - Default S  S0 @0 A0P0R0S00 ?03 - Default &c  &c0 @0 A0P0R0S00 ? ?@Box06AA U(af>}T(X}9xaf>>>uaf> >>uW >>9xX>>9xaf>>>9xX>>uW >>uW >>uaf> >>9xaf>>>@Ah ;M(';M(EeWo>Wo>WCeW|>}=|>*-?C?*-?C?*-?C?}=|>}=`A6c?P3c-5c-4c?O3c4}*&>y`> A 0A%02 - DefaultPA&@@@# Box05A Ad3S?G`f>+F=6?O`f>l> >Q`f>pL?ōM`f>h?F־D`f>pL?98`f>l>'U,`f>E=?B`f>F=+>F`f>>+>G`f>?zE`f>l?N2?`f>?H7`f>>2 /`f>E=3S?ץ >¥pL?%ͥh?D־ݥpL?9l>&UE= ?楙+F=->ڥ>+>ڥ?苓ߥl?K2꥙?H>1  E=3S?G`f>+F=6?O`f>l>6?ɥl>6?ɥl>3S?ץ+F=6?O`f>l> >Q`f>pL? >¥pL? >¥pL?6?ɥl>6?O`f>l> >Q`f>pL?%ͥh?%ͥh? >¥pL? >Q`f>pL?F־D`f>pL?D־ݥpL?D־ݥpL?%ͥh?F־D`f>pL?98`f>l>9l>9l>D־ݥpL?F־D`f>pL?98`f>l>'U,`f>E=&UE=&UE=9l>98`f>l>2 /`f>E=&UE=2 /`f>E=H7`f>>H>H>1  E=2 /`f>E=H7`f>>N2?`f>?K2꥙?K2꥙?H>H7`f>>N2?`f>?zE`f>l?K2꥙?N2?`f>?zE`f>l?+>G`f>?+>ڥ?+>ڥ?zE`f>l?+>G`f>?+>F`f>>->ڥ>->ڥ>+>ڥ?+>G`f>?+>F`f>>?B`f>F= ?楙+F= ?楙+F=->ڥ>+>F`f>>?B`f>F=3S?ץF=@A(d?VUU?*??>*>??VUU??*????>?*>??*>>?*?VUU???*>?>???*??VUU????*>*>?*>??*>>>?>?*>?*>>????>?>*?*??*????*?VUU?VUU??VUU??*??*?VUU??????VUU??VUU???*>*>?*>??*>>>?>?*>?*>>?>?>?*?*??*???*?VUU?VUU??VUU??*??*?VUU??????VUU??VUU?????`A6Ѵ4w״4w4I`f>V?? A4           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc0A}02 - Default4  !"#$%&'()*+,-./0123PA @@@Box07AA %?af>Kd=%?WKd=qt?af>lb>af>b.`>Wd.qt?Wnqt?af>lqt?Wn`>Wd.`>Wd.b>af>b.qt?af>l@Ah ;M(';M(EeWo>Wo>WCeW|>}=|>*-?C?*-?C?*-?C?}=|>}=`A6cP3;4cLcI}&?(>; A 0A%03 - DefaultPA&@@@# Box08A AdVJ`f>:R`f>0)ھT`f>#]#zٌ>G`f>]a#5?;`f>zHQ?/`f>ŞxE`f>G;^I`f>>;erJ`f>(13H`f>'tx>B`f>be>:`f>;;H>2`f>l Vѥ:å2!)ھ%]<ǥ#z֌>ץ]_#5?񥙽|HQ? ͞xख़O;!^ԥB;grԥ({3٥'ox>䥙bb>?;F>t VJ`f>:R`f>0:å2:å2VѥVJ`f>:R`f>0)ھT`f>#]!)ھ%]!)ھ%]:å2:R`f>0)ھT`f>#]<ǥ#z<ǥ#z!)ھ%])ھT`f>#]ٌ>G`f>]֌>ץ]֌>ץ]<ǥ#zٌ>G`f>]a#5?;`f>zH_#5?񥙽|H_#5?񥙽|H֌>ץ]ٌ>G`f>]a#5?;`f>zHQ?/`f>ŞQ? ͞Q? ͞_#5?񥙽|Ha#5?;`f>zHH>2`f>l Q? ͞H>2`f>l e>:`f>;;b>?;b>?;F>t H>2`f>l e>:`f>;;tx>B`f>box>䥙box>䥙bb>?;e>:`f>;;tx>B`f>b13H`f>'ox>䥙btx>B`f>b13H`f>'erJ`f>(grԥ(grԥ(13H`f>'erJ`f>(^I`f>>;!^ԥB;!^ԥB;grԥ(erJ`f>(^I`f>>;xE`f>G;xख़O;xख़O;!^ԥB;^I`f>>;xE`f>G;VѥVѥxE`f>G;@A(d?VUU?*??>*>??VUU??*????>?*>??*>>?*?VUU???*>?>???*??VUU????*>*>?*>??*>>>?>?*>?*>>????>?>*?*??*????*?VUU?VUU??VUU??*??*?VUU??????VUU??VUU???*>*>?*>??*>>>?>?*>?*>>?>?>?*?*??*???*?VUU?VUU??VUU??*??*?VUU??????VUU??VUU?????`A6?ֵֵ:w״?3`_>״*W8L`f>\P A4           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc0A}03 - Default4  !"#$%&'()*+,-./0123PA @@ MAXSCENEdd 0$$$DUMMY@Group01 &P=>!*"&???eMYe?K>Y?0Box06@ &sQ>1=!*?Q4w"&c?c?c?0Box05@ &ފ=><>!*I@Ie55?"&???0$$$DUMMY@Group02 &2j==!*BH@?"&???eMYe?L>Y?0Box07@ &sQ>1=!*?Q4w"&c?c?c?0Box08@ &ފ=><>!*I@Ie55?"&???s3d-0.2.2.1/objs/clock_bg.3ds000066400000000000000000000220521361325167000154630ustar00rootroot00000000000000MM*$ ==$>= } cyan0  @0   P0   ?@#cube1Aw#`A6???A  `>  `> ? ?`> ? ?`> ==??=??=#,ux>o,ux>#o,ux>#?#?,ux>Piߐ>m<WH?=.LǢ7X"=WH=WH?WH=.LǢe}u>  }u>e,)>,) }u>e?,)>,)?e?}u> >,)?>,)?,)?>,)*0H=AA0H=*A0H=*?*?0H=A>e}u> > >}u>e >}u>e?e?}u> oΎ>ددΎ>JoΎ>د>د>Ύ>Ɓy*?0H=A.T? >rA>0H=*o >.TA>0H=*?o" >.T?*0H=A>.T >XݢJ?> >J >>J?)!=!J> >^槾 ͌>^槾^槾 ͌>^>^> ͌>^>^> ͌>^槾J?> > >>J >J?J> Spl>\E\Epl>S' FE>' \Epl>S?' FE>' ?S?pl>\E>' ?FE>' ?' ?FE>' "=}}="}="?"?=}>!,ux>sK+>sK+>,ux>!sK+>,ux>!?!?,ux>sK+z>R'R'z>z>R'?R'?z>y=?=W> A?+O>dW> >=y=+O>AW> >=y=?+O>A?y==W> >A+O>d!,ux>sK+sK+,ux>!l!(?m=l!(sK+,ux>!?l!(?m=l!(?!?,ux>sK+>l!(??m=l!(?l!(??m=l!(y==W> W> =y=W> =y=?y=?=W> >Spl>\E>\E>pl>S\E>pl>S?S?pl>\Eiߐ>22iߐ>m̟iߐ>2>2>iߐ>m̟"?=}4V??m=P}>="?m=4V}>="??m=4V?"=}>4V?m=P9?|M>d.Q?:>aDG?=\>?>d|M>9aD:>.Q\=G>>d>|M>9?aD>:>.Q?\>=G??>>?2>oE=CJ2>oE=CJ>CJ>oE=2>CJoE=2>2ݾoE=CJ>2ݾoE=CJCJoE=2ݾCJ>oE=2ݾ9|M>d>.Q:>aD>G=\>>>?;Ύ>**Ύ>;󣾷dž>mmdž>󣾟*Ύ>;>;Ύ>*>mdž>>󣾷dž>m>;>Ύ>*>*>Ύ>;>>dž>m>m>dž>>*>Ύ>;;>Ύ>*m>dž>󣾖>dž>mG?=\>.Q?:>aD>9?|M>d>>?>?\>=GaD>:>.Qd>|M>9?>>\=G?aD:>.Q?d|M>9?>>?G=\.Q:>aD9|M>d>>??+O>8gQ?=@;?=S/?\H>"8+O>?@=gQ=;"\H>S/8>+O>??@>=gQ??=;?">\H>S/?R?$b=)z>$b=>$b=R?޾$b=>R$b=)z޾$b=޾$b=R>$b=޾?+O>8>gQ=@>;=?S/\H>">/iߐ>/'z>LnF>L뾶z>'/iߐ>/>z>'>LnF>L>'z>>/>iߐ>/>'>z>>L>nF>L>>z>'>/>iߐ>/>z>'L>nF>L뾞'>z>gQ?=@>??+O>8>S/?\H>">;?=?@>=gQ8>+O>?">\H>S/?=;@=gQ?8+O>??"\H>S/?=;?gQ=@?+O>8S/\H>";= Arss-rI r  OIOI&s&Ostst-&k&sNkNk %t%N-t-ujtjt%j]]u]u-u-rAuuAeA rerevww.vWvQWQW (w(Qwxwx.(m(w_m_mx_.x.yCxCxXCXyXy.y.v<yy<;<v;v;z{z{/zHSHH S*{*S{|{|/*o*{RooR)|R)/|/}n||)n\n\}\}/}z/@}@}d@zddz~~0N~~%N aN aa0EnEnE))n0RR)`R``0DDpDp++p0TT+^T^^0BBCBCC0__P_'PP0~~l''jljl%~j%1FUFFU,,U1,q,TqqT+T+11p+pZpZZ11>>b>bb22gg"g  f!ff2J!!J WJWW22;;:;::2VKVKV""K33hh#h  ggg"3""KFKKFF33bb=b==3YLYLY ##L44i$ih i hh#4##LHLL HH44dd?d??4[M[[ M$M$55f!f if $ii5M$$IMIM   I55ee eccc5GJGG J!J!6akaa k&&k6&O&[OO [[66??@?@@66\\\EEE7''PmPPm((m7(Q(GQQ GG77ccAcAA77]]l]ll'8`o`o`**o8S** YSYSY88==>=>>88ZZDZDD9^q^q^,,q9U,,VUVUV99::<:<<99XXBXBB0Acyan  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/comp.3ds000066400000000000000000000145421361325167000146630ustar00rootroot00000000000000MMb ==R>= default20  @0   P0  default30  @0   P0   screen0  @0  ___ ___P0 999 999 ?@cube4A`A6???A{U<{U^0i1?U^0i1?U<{о<{о^0i1?о^0i1?оU^0*?U^0{#P^0{^0{0G^0{^0i1?#P^0i1?^0i1?0G^0i1?^0Mо^0ږ=о^02>о^0*?о^0Q&>U^0֩>U^0Q&>о^0֩>о^0*,*?^0%>^0E>^0Q))>^0Mk=^0:^0*,*?0G^0%>0G^0E>0G^0Q))>0G^0Mk=0G^0:0G^0*,*?^0%>^0E>^0Q))>^0Mk=^0:^0*,*?#P^0%>#P^0E>#P^0Q))>#P^0Mk=#P^0:#P^0/w =^0^0)^0^0^0^0' ^0/w =0G^00G^0)0G^00G^00G^00G^0? 0G^0Mk=#P*Mk=*:*:#P*E>0G*E>*Q))>*Q))>0G*E>#P*E>*Q))>*Q))>#P**,*?#P**,*?*%>*%>#P**0G*/w =0G*Mk=0G*Mk=*/w =*0G***0G**0G*)0G*)*:0G*? 0G*' *:*Ng<4Ng<6?o"wM??o"wM?4w> >Z??w> >Z?4(^ >Z?4(^ >Z??#?gwM?]?(^wM?]?k8gwM?A#?gk8iy.i4#?iy.iQ~|P'>6?E!?}ڗ>vvC?ͺ:}ڗ>vvC?7?'>6?1#5>?k>R>S'?. R>S'?x ?5>?N#ʍ>4o"<>4}] ?<>4V9?#ʍ>4#?#ʍ>Aw><>A(^<>Ak8#ʍ>A AS&          =<556='!!CDECEB 233 ! -''  3-- 3    &% &&,+&+%,21,1+122 GHIGIF+*$$%+KLMKMJ011$#$*)##$**0/*/) //0#"")(""#)OPQOQN . ./ """(((.. . TUVWSTWTVWRS?>778?YZ[Y[X]^__\]!::9988777665544 <=,=>,?@-@A-A'-->?-,>,&;,;<ab`bc`A@99:ACB22,CDC,,-DED--3EBE332BGF$$GHGHIH%IFI%%$F*KJ*J0LK**+L1MLL+1JM110JON..(OPO(()P/QPP)/NQ//.NSR55<STS<<;TUT;;&UVU&& VWV  4WRW445RYX??8YZY889Z[Z99@[X[@@?X]\77>]^]>>=^_^==6_\_667\a`''AabaAA:bcb::!c`c!!'`ssrijkikhfnkevolupdzwddzj{gknmkmhfkgkjgovuoultywzzydwd|d|e|veix{{jirxihsrrihmshpu}qp}q}qtplltyq}|wt}~~|u}uuuv~vv|~~~ssmooefnfloonnmqqpxxryyqeddzzygg{fgfx{x0Adefault2  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0Adefault3^      !"#$%0AscreenPAs3d-0.2.2.1/objs/cube.3ds000066400000000000000000000010401361325167000146300ustar00rootroot00000000000000MM  ==>= default0  @0   P0   ?@vcube1Aj`A6???Ah???????????? A 0A(default  PA6s3d-0.2.2.1/objs/cubey.3ds000066400000000000000000000022521361325167000150270ustar00rootroot00000000000000MM ==>= New Material0  @0  ll llP0   ?@cube1A`A6???A( ?j  ?j ? j ? j j ? ?j ? j  j  ? ? ?j?  ?j?  j? ? j? ?j? ? ?j?  j?  j? ?j? ? j? ? ?j?  ?j?    ?j ? ?j ? j  j A,                      0AmNew Material,  !"#$%&'()*+PAs3d-0.2.2.1/objs/cubeyholes.3ds000066400000000000000000000034521361325167000160650ustar00rootroot00000000000000MM* ==>= New Material0  @0  ll llP0   ?@{cube1Ao`A6???A(:?j::?j:?:j:?:j:j:?:?j:?:j::j::?:?:?j?::?j?::j?:?:j?:?j?:?:?j?::j?::j?:?j?:?:j?:?:?j?::?j?::::?j:?:?j:?:j::j:?1%?::?1%?:?:1%?:?:1%?:1%:?:1%:?:?1%::?1%:::?1%:?:?1%::1%::1%:?1%?:?:?1%?:?:1%?::1%?::? AKL    !#!"#$%'%&'                 !  !! "!#""# # $%$&%%'&&'$'0ANew MaterialL  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKPA6s3d-0.2.2.1/objs/dot.3ds000066400000000000000000000015301361325167000145040ustar00rootroot00000000000000MMX ==H>= | dot@00      P0 ?@text1A`A6???A3c>S4}?==3c>B`3c>.>B`3c>.H>}?==3c>.>O5>3c>3c>O5>}>S4}?==}>B`}>.>B`}>.H>}?==}>.>O5>}>}>O5> A                 0ADdot PAvs3d-0.2.2.1/objs/dotdot.3ds000066400000000000000000000030171361325167000152150ustar00rootroot00000000000000MM ==>= | dot@00      P0 ?@text1_copyA`A6???A3c>h>*a=3c>h>+3c>4 ?3c>4,?+3c>4:?*a=3c>4,? j>>3c>4 ? jv>3c>h> j>>}>h>*a=}>h>+}>4 ?}>4,?+}>4:?*a=}>4,? j>>}>4 ? jv>}>h> j>> A                 0ADdot PAv@text1A`A6???A3c>S4}?==3c>B`3c>.>B`3c>.H>}?==3c>.>O5>3c>3c>O5>}>S4}?==}>B`}>.>B`}>.H>}?==}>.>O5>}>}>O5> A                 0ADdot PAvs3d-0.2.2.1/objs/duno.3ds000066400000000000000000000176261361325167000147000ustar00rootroot00000000000000MM ==>=  velvet@00 " " i i   P0 ?@text1A`A6???AP &Va 6= eto etj<>V_:I>Pz=j<>VU=I> 꾎Pz=j<>_:I>$Xetj<>_iž<B? оa 6=?B<(>J=|y<=_a 6=[ Ia 6= G=<I><( >><]:?Ԅ<<W?hgG<]V?_iž333>B? оI>?Bp ?_333>0?吭j<>DC?=333>-?B 7>333>(>J=333>PTs>|y333>=_I>[ II> G=333>I333>PL3>>333>( >>333>]:?Ԅ<333>W?hgG333>]V?hN=s;<9\ȣjr==ϫ"½<;=&+=ϫhN333>AhN333>о"½333>"9L>zhL>*s;333>"ڇ=333>Al=L>*ڇ=333>оs;333>9L>j"½333>_?վ<l%?_ L$9?_/<P?_3о=E?_<?_c׾=` ?_<?_=?.?<D=?s=-?J<< <?Bi\>Z~F$3?r==h+?Ba$><(>>y$(>BY >=(H>#j<

B[>i#PPS>2==P~>| Ž<(>>=P(>><?>=(>B/><M?L>=l%?_ L>9?_/333>P?_333>?_333>?.?333>D=?J<333> ZN?h L>M?B%>333>?Bi\>L>3?Ba$>333>(>>L>(>#j<333>P >B[>L>PPS>| Ž333>H!L>@-=9333>_"G(;333>`B6>333>P=>333>(>>333>?B/>333>M?bȽ333>:Z?9C(/꾢E:d+bڇ=꾢E:N׭hG9L>/hGL>꾢E:L>bڇ=L>꾢E:L>P=|=ʤ<=2==2==oȾʤ<=|=P=oȾ\>4#(>L>'$?_#۹0$8 ?r=hn #=yw[$F?9`=}1Y$D?"Ii$S?\>L>(>L>L>?_#L>8 ?r=L>=yL>F?9L>`=L>D?"L>S?_޾=('?_=?_S=H?+=:?PF;=9?2==?2==(>kV=P,>|=~19=Aʸ<=`BR>==>=(p>>=x?BH>=P?|ʽ=h\?_=S? AU6<6<7676A7A7A<A<5956566969;>;<;<<><>@C@A@AACAC7272323737IJI JIMIM MPMP PJPJFGFJFJ JGJGIHIH K  HKIKI MLML N  LNMNM POPO QOQPQP2482F  84F58:5H  :8  H9:=9K  =:  K;=?;L  ?=  L>?B>N  B?  N@BD@ODB  OCDECQEDQ3E43G4EGgcgcdcdrdrgr`d`a`atadtdtRVSRRSXSVXfjfjgfpggpjpSZTSTS^  TZ^^Ziljiijnjln\a]\]\v]avvax]x]^]x^x ^''(--.&''.//{!||{~""{##~|$$((),,-|}|!}$$|%}11)**++,,%&&/00%%01RUWR{""WU!!{VWYV~##YW""~XY[X$$[Y##[Z[Z_Z%%_[[$\_\b\bb&b_%%`be`e`e'eb&&ecechc((hee'hfhfkf))khh(ikmi**mk))lmol++om**noqn,,qo++pqqpsp--sqq,rssrur..uss-tuwttwww/u..vwyvvyyy0w//xyz  x11zy00T zzTUT}!!Uz1}}z0Avelvet  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/film.3ds000066400000000000000000000432211361325167000146500ustar00rootroot00000000000000MMF ==F>= default0  @0   P0   ?@: cylinder4A* `A6???A@ >yh=NyѾ=bDK柾<LݾZh+ͻRth;:ƺ۾2>-<ƫ>r=G>u/=d:>h>T>>ݐJ> >>Vj>>2>x>>th; t>X>Zh+p\>Ns>K柾5>>yѾu/ٽd<:hTվݐJ Vj2xʾth tXZh+>p\NsK>5y> y=h>N>y>bD>K>L>Zh+>;R>th::>2-ƫ>rG>վw%>>Q+vs>T> 0aؓ:9>2T=I?:>6?K~>` .?0o =??svy=C]H?%ӎ(>J ?u?5њ>"?ع>IY=j4?6>* =?4?-1=<5=erH?'>.L>??7O>)=?^}|=|F?TI:?aؓ92?vsT 0?w%Q+?yνC]H%ӎ= Ž?sv>~` .0o>מּ6K=* 4IYj465њ"ع(J u^=}|ս|F7=O)='.L?-1<5erH A|          !"#!#  %&'%'$   )*(*+(   -.,./,1202305646749:;9;8=>?=?<!  "!"##" ## %$ $ &%  &''& $'' )(  )*)  *+** (++ -, -.-  ./..,//100211323003544655767447998:99;::88;==<>==?>><<?0Adefault|  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{PA@scylinder1_Ab`A6???A?آ=>?>?0?0@@@@AAAAB BB B C C C C D D D D E E E E F F F F GG GGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOpqPPQpqr__Pqrs^^_rst]]^stu\\]tuv[[\uvwZZ[vwxYYZwxyXXYxyzWWXyz{VVWz{|UUV{|}TTU|}~SST}~RRS~pQQRaa`bbaccbddceedffeggfhhgiihjjikkjllkmmlnnmoon``o_PP``oo_^__oonn^]^^nnmm]\]]mmll\[\\llkk[Z[[kkjjZYZZjjiiYXYYiihhXWXXhhggWVWWggffVUVVffeeUTUUeeddTSTTddccSRSSccbbRQRRbbaaQPQQaa``Pqp  !qp// p~../~}--.~}|,,-}|{++,|{z**+{zy))*zyx(()yxw''(xwv&&'wvu%%&vut$$%uts##$tsr""#srq!!"r001??0>>?==><<=;;<::;99:8897786675564453342231120Adefault@  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?PA@:"cylinder1A*"`A6???A >[3?nhm>Z? *>9>i=H=^CD Mܷ:qqi=! mhQ3:nhzkH:, 99!>ǽ_ ?2mE>?&J=p?M?M>>>`>E>?S>' ??>4?!>> =?!^ɻ=uX?<>E>#brYp50!ܓ>ܺDs ?0 †i=?F=D M?@[>i=?d=7%? ? j=g>?nh>>>"?e܍c>0?:74w>"#?>cyF>8=>J?<>#>W,?mP=Pλ,:?%RW,?J?xpY(>qx6:a ۽;)e܍s-s6{mNy;4+=z : >߁>+}]>>{m4=:?ܺz=,?=)z?J ,<ڕ>W,1h7<,:m/szW,xL SJh3} >]cz,ܺ[e܍>c{m?&q+?8䶽= :?Z&>+?0[=M?{m? =Ұ-?e܍>nM>@?E>w&>g$?>@=VU>ؑ'?Dk<^%>uE? { uE?R eDѾؑ'?@я>nZ<E>mS<E,߾a?ؽ)kվؑ'dܼFuEM c=e>uE!>.>ؑ'q:>#?߾oT>w@?E>/F.?}> ?چ=?>bK(= >o"yMFmr<6㾾>4jC!?ɼo@<)M/?T<>C!?z=>>I:= !?4݅>b>‡(?}:i.Z><?4݅s6>dl>=_^|>C!W=ݻ)M/C|ƄC!xWUZ4݅)}: چ>ӽb>@o"?S<Y:/?ſ=3>o"?V >>b>6N>?چ>>*?7>8?}>1+?+:>ޫ=?]?@<ߕ>,?bs-==>u,=Z?/=n>y3?}:`e>x$?+:l?>48>](>b>,[=E+w::ﶼ,@] '+:G!X4}:89&7>u/?9Vu,?<;I:?=c>u,?'>{|>/?sX>%?7>/>+%?\> > ?O>0=*>(?Ώ<>(?l7XR(?s "(?l%#O> ;LL \>5ж \BRO(HȿP(:@=6>(=7 >(<> ?O 5>b$?\0#?ƗMeKE?銽Gৎ>B?\][>B??:O>B?<]>_>L?B >@I?ܺ>JL?\]<@> I? p>E?z p>rE? )I?z<垞>I?-qp/>WS?3 '>XL?v|{ >GL?Ӽ'k^>AP?2^>EP?ܼ T>rO?IeO>*U?y8>Q?r轏u> Q?轹>RS?VͽtS>LbS?̽g>XV?iWk>>[?.R>W?I>YY?6;f>7(?q׾Ĥ>4 -?h¾>)?оdm>lo+?oɾ?AU=%>D8=T xt> n=tG>)[= 3?A#?wb 4'?_%b`?rQ~0̡;?;ʾZ9&?ȕ5.%/?QǾ5~#? þ2HA?,G?Ul>>>>>? ?? ? @ @ @ @ A A A A B B B B C C C C DD DDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMMMOnoOoNop]]Nopq\\]pqr[[\qrsZZ[rZsttYZYtuuXYXuvvWXWvVvwVVwUwxUUxTxyTTySyzSSzRz{RR{|R|QQ|}Q}PP}nPnO^~_~__```aaabbbbcccdddeeefffghhgiihjjijkjklklmlm^~^]NN^^mm]\]]mmll\[\\llkk[Z[[kkjjZYZZjjiiYXYYiihhXWXXhhggWVWWggffVUVVffeeUTUUeeddTSTTddccSRSSccbbRQRRbbaaQPQQaa``POPP``__ONOO__^^Noonn-n}--},}|,,|+|{++{*{z**z)zy))y(yx((xw(w''wv'v&&vu&u%%ut%t$$ts$s##sr#r""rq"q!!qp!p  ppo~../~==.~=<=<;<;:;:9:989878767656445334223112001//00Axdefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/folder.3ds000066400000000000000000000015361361325167000151770ustar00rootroot00000000000000MM^ ==N>=  yellow@00     ( (P0 ?@cube1A`A6???A9?9???9???9?.?.???.???.?w; ?ڍy>?ڍy>?w; ?{K*?ys >?s >?{K*?y A                0AGyellow PAv      s3d-0.2.2.1/objs/geometry.3ds000066400000000000000000000462471361325167000155670ustar00rootroot00000000000000MML ==L>= default0  @0   P0   ?@sphere5A`A6???A`rke >?q>M% ->4v<2>S/>g">duq>?o{>vwyý>٬k1>˲Xh~>A)h>Y* iv>Mj˙>y獹>I>`[>Ƽٽ=A[>%Y[[>/:e[>s1e2%_[>K4[H[>?׊%[>E|[>F[>ZD,[>1\ny[>Dݻ[>%3X[>%4[>3A;[>L[>-X (e>hJ̩Xe>u'Qze>&89e>Xp3Ge>ae>@(4e>X/e>F Re>|*ZEio u㟹=-e>]lbe>3e6߽e>ҧ+",X9>|`X9>X9>n!83X9>tGX9>ʔjX9>9K9X9>WX9> X9>G>X9>RE)F=X9>>W *;k1X9>"Afbm(޽X9>-X ( >hJ̩X >u'Qz >&89 >Xp3G >a >@(4 >X/ >F < >R >|*Z< >Ei< >o u< >㟹=- >]lb >3e6߽ >`x>Ƽٽ=Ax>%Y[x>/:ex>s1e2%_x>K4[Hx>?׊%x>E|x>Fx>ZD,x>1\nyx>Dݻx>%3Xx>%4x>3A;x>L⽪x>ke V>?qV>M% -V>4v<2V>S/V>g"V>duqV>?o{V>vwyýV>٬k1V>˲Xh~V>A)hV>Y* ivV>Mj˙V>y獹V>I罂V>%?d7?%?d콃J> A^ pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q              !!"""###$#$%$%&&&'''('()(**)++*,,+,,-..-//.  /0 !!10!"221!"#332"3#$$43$%554$%&665%&'776&7'((87()998(9)**:9*+;;:*+,<<;+,-==<,-.>>=-./??>./ 00?/01AA@012BBA123CCB2C3D34DD455ED56FFE567GGF6G7H78H89IIH89:JJI9:;KKJ:K;<K<L<=MML<=>NNM=>?OON>O?0O0@@AQQP@QABBRQRBCCSRSCTCDTTDUDEUUEFFVUVFGGWVWGXGHXXHYHIYYIJYJZZJKZK[[KL[L\LM]]\L]MN]N^^NO^O__O@_@PPQaa`PaQRRbabRSScbcSdSTddTeTUeeUVVfefVWWgfgWhWXhhXiXYiiYZiZjjZ[j[kk[\k\l\]mml\m]^m^nn^_n_oo_PoP`0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@sphere4A`A6???A`r'v>s>,>>b>,>>S>,f0>8I>,bW>E>,n>8I>,[_>>S>,LU>>b>,8qR>s>,LU>Gт>,[_>wQ>,n>T>,bW> >,f0>T>,>wQ>,>Gт>,>s>}E[ϧ>>S>}E>7>}E>%>}EbW>>}E[_>%>}EDDD>7>}Eо1>>S>}E=+>s>}Eо1>wQ>}EDDD>->}E[_>=p>}EbW>>}E>=p>}E>->}E[ϧ>wQ>}E(>s>.߽>8I>.߽[ϧ>%>.߽> >.߽bW>+N>.߽LU> >.߽о1>%>.߽͋>8I>.߽h >s>.߽͋>T>.߽о1>=p>.߽LU>>.߽bW>qɱ>.߽>>.߽[ϧ>=p>.߽>T>.߽>s>Ծ(>E>Ծ>>Ծ'v>+N>ԾbW>7=Ծ8qR>+N>Ծ=+>>Ծh >E>Ծ>s>Ծh > >Ծ=+>>Ծ8qR>qɱ>ԾbW>b>Ծ'v>qɱ>Ծ>>Ծ(> >Ծ(>s>>8I>[ϧ>%>쾝> >bW>+N>LU> >о1>%>͋>8I>h >s>͋>T>о1>=p>LU>>bW>qɱ>쾝>>[ϧ>=p>>T>>s>k[ϧ>>S>k>7>k>%>kbW>>k[_>%>kDDD>7>kо1>>S>k=+>s>kо1>wQ>kDDD>->k[_>=p>kbW>>k>=p>k>->k[ϧ>wQ>k'v>s>g>>b>g>>S>gf0>8I>gbW>E>gn>8I>g[_>>S>gLU>>b>g8qR>s>gLU>Gт>g[_>wQ>gn>T>gbW> >gf0>T>g>wQ>g>Gт>gbW>s>ubW>s>9 A^ pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q           !! !!""###$#$%$%&%&'''('()()*)++*,,+,,---.//.  / !110 !"221!"#332"#$443#4$%%54%&665%&'776&'(887'8())98)*::9)*+;;:*+,<<;+<,-<-=-.>>=-./??>./ 00?/01AA@012BBA123CCB234DDC345EED456FFE567GGF678HHG7H8I89I9:JJI9:;KKJ:K;<K<L<=MML<=>NNM=>?OON>O?0O0@P@APAQABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@P`PQ`QaQRbbaQbRSScbcSdSTddTeTUeeUfUVffVWWgfgWXXhghXiXYiiYjYZjjZ[j[kk[\k\ll\]l]m]^nnm]n^_n_oo_PoP`0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@otorus3Ab`A6???A#\?Yš[#K?B!= ?>E>tFKA>J#ofV8Q>E訾tFKA> >KB!=#\c爛&*$KB>! ?E訾tF?KAfofV?8QE>tF?KA ??K?B>!aR?:ʱ/?` h>y>7E>~#.iG>y7E>/` h>BOÑf'>aR:ʱh</F}?VIyB?gbd^҅R?ٽy>B?gb/?F}?VIB?>h<9;?nB-?uwD>?ҋ~>>w >`"U.PO>w >ҋ~>B-uwD>9;nB-(>u+s=ޯ?$?G;p.0? WK >?IC>p.0? ?ޯ?$?G;B-?(>u+s=$?:ʱb>W־(I>,/{>H j><v>,/{H j>bW־(I>f]>$:ʱ>,/{?%R=7}$?,/{>?%Rb>X>>f?( >yԾG=#Rl>~ C8><_\>#Rl~ C8>TھyԾG=ۡie `=Pb۟N$ۡie> `Tھy>Gν#Rl~ ?C8/<?_\#Rl>~ ?C8T>y>Gνۡ?ie> `$?:ʱV1f?( b>X쾕><,/{>%R=<}$=,/{%R=bX쾕>bW>(I,/{H ?j=7?v,/{>H ?jb>W>(If?]>9;?ngB-?(u+s?ޯ$?G>p.0 =`" >IC=p.0 =ޯ$?GB-(u+s9;ngB-uw>D>ҋ~w ?WKU.?PO>w ??>ҋ~B-?uw>DaR?:ʱV1B?h/?F}VI=y>Bgb=~#҅R=yBgb=/F}VI=BhaR:ʱV1BOÑ>f'/` ?hy7?Ed^.iG?y>7?E/?` ?hB?OÑ>f' A           ! !"!"#"###$%%$%%&&&'''())(*))+**,++-,,.-././ //1!0! 0"!112"#"223#$#334$5%$5$46&%6%57'&7&68('8'79)(9(8:*):)9;+*;*:<,;,+;=-<-,<>.=.-=?/>/.>0 ? /?A1@10@B211ABC322BCD433CD54DDE565EEF676FFG7H87H7GI98I8HJ:9J9IK;J;:JL<K<;KM=<<LMN>==MNO?N?>N@0O0?OQAPA@PRBQBAQSCBSBRTDCTCSEDTTUEFEUUVFWGFWFVXHGXGWYIHYHXJIYYZJKJZZ[KLK[[\L]MLL\]^NMM]^_ONN^_P@_@O_aQ`QP`bRaRQacSbSRbdTSdScUTddeUfVUfUegWVgVfhXWhWgYXhhiYjZYYijk[ZZjkl\[[klm]\\lmn^m^]mo_n_^n`P__o`qa``pqrbaraqscbsbrtdctcsedttuefeuuvfgfvvwghgwwxhihxxyijiyyzjkjzz{k|lkk{|}mll|}~nmm}~onn~p`oopppqrrqssrttstutuvuvwvwxxxy yy z zz z {{ { | }}|  ~~} ~~p0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@vcube2Aj`A6???Ah[ lSQj"9姾>S%>w9姾y͝>܄ES%>;s{a`}?Q[ A 0A(default  PA6@sphere1A`A6???A`r|Cǘ>1c?2ȗ>1c?@U>1c?->1c?Yھ>1c?>1c?U>1c?@>1c?ǘ>1c?@y+?1c? ?1c?w?1c?Yھы?1c?-w?1c?@ ?1c?2ȗy+?1c?)ǘ>:N?>U>:N? xu>:N?@U>:N?YھHA>:N?U>:N?Uu>:N?'B+U>:N?S[0ǘ>:N?'B+ ?:N?U"?:N?^-1?:N?YھF6?:N?@^-1?:N? x"?:N?> ?:N?,ǘ>/??你>/?>U>/?2ȗ >/?YھN=/?@ >/?'B+U>/?i:>>/?Dǘ>/?i:>w?/?'B+^-1?/?@%D?/?YھJ?/?2ȗ%D?/?>^-1?/??w?/?jǘ> ?,> ?)HA> ?|CN= ?Yھ= ?N= ?S[0HA> ?D> ?~Lǘ> ?Dы? ?S[0F6? ?J? ?YھR? ?|CJ? ?)F6? ?,ы? ?,ǘ>I>?你>I>>U>I>2ȗ >I>YھN=I>@ >I>'B+U>I>i:>>I>Dǘ>I>i:>w?I>'B+^-1?I>@%D?I>YھJ?I>2ȗ%D?I>>^-1?I>?w?I>)ǘ>i>>U>i> xu>i>@U>i>YھHA>i>U>i>Uu>i>'B+U>i>S[0ǘ>i>'B+ ?i>U"?i>^-1?i>YھF6?i>@^-1?i> x"?i>> ?i>|Cǘ>0P>2ȗ>0P>@U>0P>->0P>Yھ>0P>>0P>U>0P>@>0P>ǘ>0P>@y+?0P> ?0P>w?0P>Yھы?0P>-w?0P>@ ?0P>2ȗy+?0P>Yھǘ>egj?Yھǘ>3> A^ pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q             !!!""###$#$%$%&%&'''((()()*)++*,,+,,---.//.  / !110 !"221!"#332"3#$$43$%554$%&665%&'776&7'((87()998()*::9)*+;;:*+,<<;+,-==<,-.>>=-./??>./ 00?/01AA@012BBA123CCB2C344DCD4E45E56FFE567GGF678HHG789IIH89:JJI9:;KKJ:K;<K<L<=MML<=>NNM=>?OON>?0@@O?@AQQP@ABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@P`PQ`QaQRbbaQbRSScbcSTTdcdTeTUeeUfUVffVWWgfgWXXhghXiXYiiYjYZjjZ[j[kk[\k\ll\]l]m]^nnm]n^_n_oo_PoP`0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/go_button.3ds000066400000000000000000000137241361325167000157260ustar00rootroot00000000000000MM ==>= } blue0  @0   P0  default0  @0   P0  ~ green0  @0   P0  | red0  @0   P0   yellow0  @0   P0   ?@4text2A(`A6???AgG2obӾO]2ھ$8lzr`$>OA}>80U&N>*|>*>mU?KՃiu ?մδ>ƿ`մi̾KՃ Qr4#{پ#<<<<gGgGQ2obQӾOQ]2ھ$Q8lzrQ`$Q>OQA}>80UQ&N>*Q|>*Q>mUQ?KՃQiu ?մQδ>ƿQ`մQi̾KՃQ QQr4#Q{پ#Q<ᾫ`iqʾܶ.= '>Dʾm?`'>>ܶ.=4>/>G~>>`/>c3ܶ.=ھ=Nc3`=NG~>ܶ.=Qiu ?iQ>Q`iQqʾܶ.=Q '>QDʾm?Q`'>Q>ܶ.=Q4>/>QG~>>Q`/>Qc3ܶ.=Qھ=NQc3Q`=NQG~>]SR?O]SR?v?v?O]SR?QO]SR?Qv?Qv?QO]SR?*?]SR? =V?>(s?>v? =v?*?]SR?Q*?]SR?Q =V?Q>(s?Q>v?Q =v?Q*?o?Oo???Oo?QOo?Q?Q?QOo?*?o? =?>U?>? =?*?o?Q*?o?Q =?Q>U?Q>?Q =?Q*??ὑ9ὑ9쿳@<9?@<9쿣A=#쿣A=:??A=:??A=#H:?H#?H#?H:?4??4??@<4?쿳@<4?#὇:?@<:?@<#,?὇:?,?#,?@<#,?@<:? AT          $####"%%$!  &%%"!!'+'+( '&&(+)+*)      !  ! !"  " "#  #$ $$%%%&&&'''((()))***+++.:;.;-9:../9267712235256017078,45,5308909/,-;,;4>=K>KJ>JII?>GFBBAGBFEBEC<CE<ED@HG@GA@?I@IH<DK<K=,<-<=--=.=>..>?.?//?@/@00@A0A11A2AB22B3BC33C,C<,4DE4E55EF5F66F7FG77G8GH88H9HI99I:IJ::J;JK;;KD;D4NOLLMNPSRRQPLPQQMLMQRMRNNRSNSOOSLSPLXYTTUXVWXVXUZ_^^[Z\[^\^]TZ[[UTU[V[\VV\]V]WW]X]^XX^_X_YY_T_ZTbc``abdgffed`deea`aefafbbfgbgccg`gd`lmhhiljkljlinsrronporprqhnooihiojopjjpqjqkkqlqrllrslsmmshsnh}~}|uvwuwtyz{{xyxvy~t}uuvv||}||~~t~}}utxxyvx{v{wyyzzz{z{wwwt0Ablue@ ()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS0Adefault\ !"#$%&'defghijklmnopqrs0Angreen0TUVWXYZ[\]^_`abctuvwxyz{|}~0A@red0ACyellowPAs3d-0.2.2.1/objs/internet.3ds000066400000000000000000000031621361325167000155510ustar00rootroot00000000000000MMr ==b>= antenna0 ]]] ]]]@0   P0  internet@00     k kP0 ?@Gcube4A;`A6???A B\B M]?B\?B M]?B\B =M]?B\?B =M]??%B??Nb>B?L7ɾNb>`P?L7>Nb>`P?L7ɾNb`P?L7>Nb`P?B!B @޿B @޿B =@B!B =@B!?B @B!?B =@?B =@?B @Nb7?Nb7Nb>7?Nb>75f?89`P5f89`P5f89>`P5f?89>`P Aw<                       0A8antenna$%&'()*+,-./01230Aainternet(  !"#456789:;PAs3d-0.2.2.1/objs/katze_body.3ds000066400000000000000000000176001361325167000160560ustar00rootroot00000000000000MM ==p>= auge_innen0  @0  D]D D]DP0  default40  @0   P0  } fell0 III III@0  Ȃ ȂP0  ohr_innen0 ))) )))@0  Z@ Z@P0   ?@Ssphere2AE`A6???A(?[ 2j@\?l2j@p?"X2j@??Ͽ2j@?O1ʿ2j@ٹ>Ͽ2j@R="X2j@l2j@|[ 2j@b2j@R=%2j@ٹ>)-2j@?02j@??)-2j@p?%2j@\?b2j@?[ BT@?"XBT@?BT@p?BT@?BT@R=BT@)BT@"XBT@ Ԍ@%BT@)Q[4@lDZ[4@[4@KϿ[4@mg[ [4@K)-[4@ZwK[4@:UdT'@?4f[4@\?A_[4@?ZwK[4@A?)-[4@@@[ @Rv?O1ʿ@?@(?Jx>@?a @|Jx>@@mgO1ʿ@ ‚[ @mg0@P@O o@?Am@(?4f@?P@Rv?0@Rv?[ -?A?Ͽ-??-??Jx>-?lDZ-?-?KϿ-?mg[ -?K)--?ZwK-?A_-??4f-?\?A_-??ZwK-?A?)--??[ ??"X???p????R=?)?"X?[ ?%?)Q<?R=ZwK??P?p?ZwK??Q<??%?(?[ xqN?\?lxqN?p?"XxqN???ϿxqN??O1ʿxqN?ٹ>ϿxqN?R="XxqN?lxqN?|[ xqN?bxqN?R=%xqN?ٹ>)-xqN??0xqN???)-xqN?p?%xqN?\?bxqN??[ q@?[ [0?O@[$?@*(??+?v_??]m?1@?/ļO @?py1@?;쿄?? @ƋY?A?O ?K?{?ݞ?K?hN?$?K?/ļO?K?{Z$?K?,ѿW?D?`?F@0-?}'|>@wy? ~4?@Jk?z|?@/ļC?@]z|?@q?m@$?,Q@?> ?3K?C>,->K?h>Q>K?/ļW>K?̌Q>K?=%h=q?>,.n?>\(?Zz^>I-\?Q=a?e!?ڱ>> ?33>C>,->3>h>Q>3>/ļW>3>̌Q>3>=%h=)>- ?;ľ(/>0-?}'|>7 >wy? ~4?7 >Jk?z|?7 >/ļC?7 >]z|?7 >q?2J1>X@,¾CW>A?O ?3>{?ݞ?3>hN?$?3>/ļO?3>{Z$?3>,ѿW?>ZCοD@?~[οD@ $A<[4@ 'T3@( N!@ >d4@K? b[4@?ri!@ʿ/>W53?뿗z>Y?#Q ?(4?뿗z>i?ʿ/>?\Uh?5Du(4?\U\? AUnoooooooo o o  o  o  o o oo_p``paapbbpccpddpeepffpggphhpiipjjpkkpllpmmpnnp_               !!!""###$$$$%%%&&'''((()*+,-...///  0!01!!1"12""23"3##34#4$$4%45%%5&56&&67&7''7(78((89(9)9:9)+<++;<--=.=>..>?.?//?0/0 0@1@A11A2AB24C5CD55D6DE66EF6F77F8FG8GH998G9H:HI::IJ:J;JK<<;J<KL<L==L>LM>>MN>N??N0N@0@OPPA@APQQBACSTTDCDTUUEDUVFFEUVWGGFVWXHHGWHXYHYIYZJJIYZ[KKJZK[\K\LL\]L]MM]N]^NN^OO@NO_``POP`aaQPQaRabRRbccSRScddTSTdeeUTefVVUefgWWVfWghWhXXhiXiYijZZYijk[[Zjkl\\[k\lm\m]]m^mn^^n__O^ryxrxqzyrrszt{zzstu|{u{t}|uuv}w~}w}vyyxyyz{{z{{|||}~~}qrqrssssttuuuvuwvwRRSCSSC4C3432x23BqxBx2BQBqQQR.()*+,-**,,));+;:+++-=<=-ww~~w~0A#auge_innenRTHKNOPQ0A!default4QSnqTWZ]0AfellX  !"#$%&'()*+,-./23456789<=>?@ABCDEFGHIJKLMNOUVWXYZ[\]^_`abcdefghijklmoprstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEGIJLMRSUVXY[\^_`abcdefghijklm0Aohr_innen01:;PFPAs3d-0.2.2.1/objs/katze_leg.3ds000066400000000000000000000112541361325167000156670ustar00rootroot00000000000000MM ==>= } fell0 III III@0  Ȃ ȂP0   ?@sphere2A`A6???A`r[=HS %?w=9)?=?9)=w?+[Ž?9)w??w9)?[Žbk$?w9)=?=?9)w=?Ce[=?9)=w=?==?w=9)=?w6>x%?(>?%>%?=(?N£w6?(?%%?(?w6$?(=?%%>?(>?aw6>?=(>?%>%>?(>=?gn>%R?A\>wR?(>(R?w=A\R?%gnR?wA\R?((R?A\wR?gnF$R?A\w=R?((>R?wA\>R?>gn>R?w=A\>R?(>(>R?A\>w=R?%>$?gn>[Ž?w6>w6?[=gn?HP%?[Žgn?w6w6?gn[Ž?%$?gn[=?w6w6>?[Žgn>?9%>?[=gn>?w6>w6>?gn>[=?gn>#՜A\>w՜(>(՜w=A\՜%gn՜wA\՜((՜A\w՜gn՜A\w=՜((>՜wA\>՜>gn>՜w=A\>՜(>(>՜A\>w=՜w6>Sn"K""(>K""%>%K""=(K""N£w6K""(K""%%K""(K""w6lK""(=K""%%>K""(>K""aw6>K""=(>K""%>%>K""(>=K""[=J6]Zw=9)]Z=]Z9)=w]Z+[Ž]Z9)w]Z]Zw9)]Z[ŽN[]Zw9)=]Z=]Z9)w=]ZCe[=]Z9)=w=]Z==]Zw=9)=]Z %J>=-./??>./ 00?/01AA@012BBA123CCB234DDC345EED456FFE5F677GF78HHG789IIH8I9::JI:;KKJ:;<LLK;<=MML<=>NNM=>?OON>?0@@O?P@APAQABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@P`PQ`QaQRbbaQbRSScbcSTTdcdTeTUeeUfUVffVWWgfgWXXhghXiXYiiYjYZjjZ[j[kk[\k\ll\]l]m]^nnm]n^_n_oo_PoP`0Afell  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/katze_tail.3ds000066400000000000000000000112541361325167000160510ustar00rootroot00000000000000MM ==>= } fell0 III III@0  Ȃ ȂP0   ?@sphere2A`A6???A`r[=N%T-@w=9)T-@=T-@9)=wT-@+[ŽT-@9)wT-@T-@w9)T-@[Ž}$A%T-@w9)=T-@=T-@9)w=T-@Ce[=T-@9)=w=T-@==T-@w=9)=T-@w6>BH%ү(@(>ү(@%>%ү(@=(ү(@N£w6ү(@(ү(@%%ү(@(ү(@w6/%ү(@(=ү(@%%>ү(@(>ү(@aw6>ү(@=(>ү(@%>%>ү(@(>=ү(@gn> Q@% @A\>w @(>( @w=A\ @%gn @wA\ @(( @A\w @gnr% @A\w= @((> @wA\> @>gn> @w=A\> @(>(> @A\>w= @%>6%@gn>[Ž@w6>w6@[=gn@HP%@[Žgn@w6w6@gn[Ž@%%@gn[=@w6w6>@[Žgn>@9%>@[=gn>@w6>w6>@gn>[=@gn>[X#A\>w(>(w=A\%gnwA\((A\wgnɚA\w=((>wA\>>gn>w=A\>(>(>A\>w=w6>"ת(>ת%>%ת=(תN£w6ת(ת%%ת(תw6Xת(=ת%%>ת(>תaw6>ת=(>ת%>%>ת(>=ת[=Lkew=9)e=e9)=we+[Že9)weew9)e[ŽBhew9)=e=e9)w=eCe[=e9)=w=e==ew=9)=eP%/@<ᄁ A[ ppppppppp  p  p  p  p  pppaq`bqacqbdqceqdfqegqfhqgiqhjqikqjlqkmqlnqmoqn`qo              !  "!!#""$##%$$&&%''&('')((**)++*,,+--,..-//.  /!10!0 "2!21!#3"32"$4#43#%5$54$&6%65%'7&76&(8'87')9(98(*:):9)+;*;:*,<+<;+-=,=<,.>->=-/?.?>. 0? ?/1A0A@02B1BA13C2CB24D3DC35E4ED46FE6E57GF7F68HG8G79IH9H8:JI:I9;KJ;J:<L;LK;=M<ML<>N=NM=?O>ON>0@?@O?AQPP@ABRARQACSBSRBDTSDSCUTDDEUFVEVUEGWFWVFHXWHWGYXHHIYJZIZYIK[J[ZJL\[[KLM]\\LMN^M^]MO_N_^N@P__O@Qa``PQRbQbaQScbSbRTdcTcSedTTUefeUUVfWgfWfVXhgXgWihXXYijiYYZj[kjjZ[\lkk[\]mll\]^n]nm]_onn^_P`oo_P0Afell  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/lil_p.3ds000066400000000000000000000021621361325167000150170ustar00rootroot00000000000000MMr ==b>= } blue0  @0   P0 # # ?@cube2A`A6???A pi7μ>Q<>=pi=^}>CV< N%O?=N%O?G=^}>CV< pq>͠:ti=Bi͠:pO? BO?=pq>=BO?G=Bi=N%q>͠:N%?G=N%q>͠:tq>G=Bq>͠:B?=Bq> Ag*                            0Aablue*  !"#$%&'()PA    s3d-0.2.2.1/objs/materials.3ds000066400000000000000000012117071361325167000157110ustar00rootroot00000000000000MM ==>= New Material@00      P0default0  @0   P0   ?@spring2Az`A6???A zo?!Ie>L$lxL>"e>//>e"33>lxfΤ>e">ff>//??"e? ?Olx??">e?ff&?/?/?333?e?">@?lx?%L?e?"Y?/?/fff?">e33s?%lx?"eff?//̌?e"33?lx?e">?//?ff?"e?̬?Elx?33?">e??/?/??,T?4}>c?@k?3?=9a?(>)a,?)a,\ F>>9a@}$s7>9a{ѯ>)a,)a,k>9a>sіG>9a> ?)a,)a,??9a?$?Ls?W1?>9a?$O>?)a,?)a,?K?9a?>W?s?(%d?9a?Wq?)a,?)a,$O~?>9a?ȥ%s_?9aZ?)a,)a,+?9a'?sȗ?9a>_?)a,)a,?Z?9a?+?s?'?>9a??)a,?)a,?_?/P?n>R?`?d~ >U?vc>#?#>v>U(>lu$if>vUN[>##>UvA?if ?Uv>`?##?-,?vU?t8?Hif?AE?v>U? R?#?#?`_?U?v>-l?if?%tx?U?v?#?#J?v>Um?c%if?vU:}?##?UvJ?ifm?Uv>?##?:}?vU???ߥif?J?v>U?m?#?#??F?]>9R?O?-M>B?Q% > ? >Q>BX>>S$R>QBq>  ?BQ_R?Rc, ?BQ>,?  ?Ƹ9?QB?F?9.R?_RS?Q>B?,`? ? ?l?B?Q>Ƹy?R?%B?B?Q0? ? ?Q>Bu?O%Rcܜ?QBB?  0?BQ?R@nu?BQ>cܼ?  ?B?QB?0?<ȥR??Q>B?u? ? ?c?d8?->r?iQ*-?pt >?'>pt>Q*-T>L$n;Z>ptQ*->G ?Q*-pt?n;p$?Q*-pt>w1??Cz>?ptQ*-?GK?n;?X?pt>Q*-?d???wq?Q*-?pt>Cz~?n;?S%?Q*-?pt ??Up?pt>Q*-֘?.{%n;"=?ptQ*-? ?Q*-ptUp?n;zRָ?Q*-pt>"=???ptQ*-? ?Sn;?Up?pt>Q*-????"=?','?> ?U(?|M>?.{% >>辿>.{>X>> 1J$$>.{q>输?.{_R?$A, ?.{>,?>Ƹ9?.{?F?$$?_RS?.{>?,`?>>l??.{>Ƹy?$?oz%B??.{0?>辖?.{>u?L]%$cܜ?.{B?0?.{?$\(+u?.{>cܼ?>B?.{?0?誠$??.{>?u?>>c??6e>r?aA? ^~ >R?\c>>̾>\>R(>Kw*$+N>\RN[>̾̾>R\A?+N@ ?R\>`?̾>-,?\R?t8?+N?AE?\>R? R?>>`_?R?\>-l?+N?d%tx?R?\?>̾J?\>Rm?B%+N?\R:}?̾̾?R\J?+NMm?R\>?̾>:}?\R??ah+N?J?\>R?m?>>?TZ?/>9R?+ ?.I3?=76>H(>a>a\ F>H>76$7>H76{ѯ>aak>76򾡧H>HG>76򾡧H> ?aa>?H76>$?פ?W1?H>76>$O>?a>a>K?76>H>W??YM%d?76>HWq?a>a$O~?H>76?/%_?H76Z?aa+?76򾡧H'?DO?76򾡧H>_?aa>Z?H76>+?ٞ}?'?H>76>?a>a>_?=2>Y>R?.G ?7BI<>OAL=в>в=OA>龚>L$L>OA>вв>OA33>ͤ>OA>ff>вв>?OA> ?Ԥ>?OA>>ff&?в>в>333?>OA>@?><%L?>OAY?в>вfff?OA>33s?,%?OAff?вв̌?OA33?3w?OA>?вв>ff?OA>̬?r>33?OA>>?в>в>?nX>\>c?+ ?.I76>H1a>a#n;H>76g=$S=H76 ] >aa>S>76򾡧Ha>>R>76򾡧H>씶>aa>.>H76>>֤?ܰ?H>76>}?a>a>vJ?76>H>C(??B%4?76>HܰA?a>a}N?H>76vJ[?L3%Ch?H76t?aan؀?76򾡧H>?NW ;?76򾡧H> ?aa>r?H76>nؠ?~?>?H>76>;?a>a> ?=2>Y>sҺ?aA? ^^R?\>̾j\>R踼Kw$+N<\Rɒ=̾̾|>R\˯5>+N[h>R\> >̾>>\R?L>>+N?>\>R?q>>>?R?\>Y?+N?-K%& ?R?\k-?>̾8:?\>RG?J%+NYS?\R&`?̾̾km?R\8z?+N@&Ƃ?R\>-?̾>O?\R??a+N?`?\>R?Ƃ?>>-?TZ?/>V?U(?|Y4?.{3>辱|.{> 1V$$Qм.{H<8=.{=$2>.{>e>>u>.{?(>I$?>.{>?A[>>>>?.{>:G?$?׿^%??.{?>辡,?.{>mz9?Lg%$:GF?.{S?_?.{l?$}@mzy?.{>#?>?.{?j?j$?V?.{>?7?>>#??6e>T?iQ*-4$n;q4ptQ*-O;(e=Q*-pt=n;t>Q*-pt>R>?y >ptQ*-?>n;?>>pt>Q*-?F>??q>Q*-?pt>?n;?1p%R?Q*-?ptV??#'?pt>Q*-4?@%n;A?ptQ*-RN?V[?Q*-pt#g?n;!ot?Q*-pt>€??E)?ptQ*-??Ӵn;??pt>Q*-?x\??? ?','?>?O?-Y4B?Q3 ? |Q>BS$RQмQBH<  8=BQ=RѤ2>BQ>e>  ?u>QB?(>9+R?>Q>B?A[> ? ?>B?Q>:G?R? %?B?Q? ? ,?Q>Bmz9?O%R:GF?QBS?  _?BQl?Rlmzy?BQ>#?  ??QB?j?ȥR?V?Q>B?7? ? ?#?d8?->T?`?d^U?v#?#jv>U踼l}$ifUv˯5>ifPˤh>Uv> >##?>vU?L>>Dif?>v>U?q>#?#??U?v>Y?if?[%& ?U?vk-?#?#8:?v>UG?%ifYS?vU&`?##km?Uv8z?if͘Ƃ?Uv>-?##?O?vU???ߥif?`?v>U?Ƃ?#?#?-?F?]>V?@k?9a?1)a,?)a,#n;>9ag= $sS=9a ] >)a,)a,>S>9aa>s)դR>9a>씶>)a,)a,?.>9a?>Ws?ܰ?>9a?}?)a,?)a,?vJ?9a?>C(?s?%4?9a?ܰA?)a,?)a,}N?>9avJ[?H%sCh?9at?)a,)a,n؀?9a>?s`;?9a> ?)a,)a,?r?9a?nؠ?s?>?>9a?;?)a,?)a,? ?/P?n>sҺ?Vr?{K<~i?7Ȉ3=~i?7nԼN? =md?;=md?;; ?N>g.?g.&>g.?g.'V=A>s333>;>mdYJ>;>md=Asfff>|$?w}>$?w > Ň>;md`>;md?O>N ff>g.g.>g.g.9>sA>md;B>md;%Ӛ>sA>>?wͺ,>?w#?֤l>N ?33>md;>u>md;>X> N?ff?g.g.?0 ?g.g.?>As?33?;md??;md?Ɯ?A>s? ?L?w?%?P?w?i ? ?N?,?;>md?n2?;>md?_6?N? ?9?g.?g.?:c??g.?g.?,'?s?A>ffF?md?;>0L?md?;>3?s?A33S??w?%X??w?%Ɯ@?N? `?md?;e?md?;iM? ?Nl?g.?g.nr?g.?g._6Z?A>sy?;>md:c?;>md,g?As33?%?w?%?ws? N?;mdj~?;mdcN?N ?g.g.?g.g.ɴ?sAff?md;7K?md;0?sA>̜??w??wҠ?N ?33?md;>?md;>? N??g.g.?j~?g.g.?cN?As??;md??;md?ɴ?A>s?ff??w?7K??w?0? ?N?̼?;>md??;>md??̢L?> ? ?g.?g.??g.?g.??5Q?!>$?5Q?!> ?Cn?'G``=b?"=sJ?lo,>X\?C>>l?sJ_>d(?d(:q>/8>>ok>C>X\6>/8>o>$#nЫ>lsJG>CX\-j>sJl7>d(d(>o/8>{>X\C`>o/8>>?#n'b} ?sJl?W?X\C>J?lsJ?$O?d(d(?"?/8>o?+?CX\?/?/8>>o?7?P#n?NX\?}I?sJ?l?WQ?d(?d(?JU?o?/8>>$O^?X\?C>b?o?/8>k?#n?݅%o?sJ?lw?X\?CN|?l?sJZ?d(?d(?/8>>o+?C>X\%?/8>o'?%#nZ?lsJ?CX\?sJl_?d(d(X'?o/8>Z?X\C?o/8>>+?#nے%?sJl?'?X\C>Z?lsJ??d(d(??/8>o?_?CX\?X'?/8>>o?Z?#n??l?sJ?+?C>X\?%?H?< ??d(?d(?Z?f&K?IR>?ca?<9H>`V?w!>}??h}>wL?c|>?}?N[>6~?6~&>03>b>c>wL>03b>\$P]YI>}?(>cwL>}?>6~6~F?b03- ?wLc ?b03>t?P]तW?}??A%?wLc>$'?}?? 2?6~6~?y3?03b?`??cwL?F@?03>b?-L?8P]?M??}??tX?c>wL?WZ?}???Ae?6~?6~?$g?b?03> r?wL?c>ys?b?03`?P]?<%#_?}???wL?cņ??}?:}?6~?6~+?03>b?c>wLV?03bJ?%P]?}?m?cwL#_?}??6~6~Ŧ?b03:}?wLc+?b03>?P]^{V?}??J?wLc>?}??m?6~6~?#_?03b??cwL??03>b?:}?ѥP]?+??}???c>wL?V?)>??-?6~?6~??#@?>M?N[N?>,:_}>[*F?`^<>G(8?{$>-> ? >v$>N% >>G(8W>v$N>@$TGH>- ?Nv$Ƹ?G(8 ?Nv$>&?TG׫#?_R3?G(8>x0?-J?v$>N?ƸY?&TG? V?->G(8?׫c?_Rs? ? ?xp?N?v$>?G(8?>qE}?N?v$u?TG?|/% ?N0?>G(8R0?TG?G(8>?-N?B?TG??->G(8?RZ? ? ??n1?k>s?7?b>̞4?ipD<>l?>оZ>[,"?FY{$>>>l>|>>|>>V@>R7 >FY>[,"W>V@R7'>T$/H>>оl?FY[,">l>оw?|>|>> ?R7V@Cz?[,"FY ?R7V@>G+?/UwW׫#?l>>8?[,"FY>x0?>оl?D?|>|>>qE=?V@R7?wQ?FY[,"?>J?V@>R7?Cz^?/? V?>>l?Gk?FY>[,"?׫c?l?>>x?|>>|>>xp?R7?V@>Up?[,"?FY>qE}?R7?V@ֈ?/?|% ?l?>о"=?[,"?FYo?>>l?|>>|>Ց?V@>R7 ?FY>[,"Rоl֨?FY[," ?l>о"=?|>|>o?R7V@?[,"FYձ?R7V@> ?/>Up?[,"FY>?>оl??|>|>> ?V@R7?"=?FY[,"?o?V@>R7??/??>>l? ?FY>[,"?R?|>>|>>?L,"?3>s?v!?.g:_}>$i$?+!>l?Oי> ? k|>O>lq>g'>g'پ&> > % > k> > >D$YI>Ol,? k >lO ?g'پg'پF?  Ƹ? k ?  >&?RW?lO>_R3? k>$'?Ol?,@?g'پg'>y3? ?L? k ?F@? > ?ƸY??M?O>l?f? k> ?WZ?l?O>_Rs?g'>g'>$g? ? >? ? k>ys? ? u??xo%#_?l?Oc܌? ? kņ?O>lB?g'>g'پ+? > 0? k> V? ?O%?Olu? k #_?lOcܬ?g'پg'پŦ?  B? k+?  >0?V?lO>? k>?Ol?u?g'پg'>#_? ?c? k ?? > ?B??+?O>l?0? k> ?V?O?é>Z?g'>g'>??5>M?Mn?c9H>"?%=>Th}>>-JQ>>T>N[>[>[:q>2= >-JQ>6>2 > $Ы>T(>-JQ-j>T>[[> 2ὧ- ?-JQ`> 2=t?N } ?T>A%?-JQ>J?T> 2?[[>"?2 ?`??-JQ>/?2= ?-L?ߤ?N>tX?-JQ>>}I?>T>Ae?[>[>JU? ?2= r?>-JQ>b? ?2`?? X%o?>T?>-JQN|?T>:}?[>[?2= ?-JQ>%?2 J?8%Z?Tm?-JQ?T?[[X'? 2:}?-JQ? 2=?z %?T>J?-JQ>Z?T>m?[[>?2 ??-JQ>X'?2= ?:}???T>>?-JQ>>%?>Q>-?[>[>Z?T?>??ֽ``=JJ?Ȉ3=>o,>(>YC=>پ_>{>{&>=k>YC>(뾶YJ>̽>$<}>پG>YC(`>پ7>{{>̽{>(YCB>=?پ>W?(YC>u>>$O?{{>0 ?̽?+?YC(>?=?7?Ԥ<>%?>>D?YC>(>n2?>>WQ?{>{>:c???=$O^?(>YC>0L??̽k?<>G%X?>w?(>YCe?>پZ?{>{nr?=+?YC>(:c?̽'?,%<?پ?YC(j~?پ_?{{?̽Z?(YC7K?=+?'?(YC>?>?{{>j~?̽?_?YC(>?=?Z?t<>7K?>>+?YC>(>?#>'>?{>{>??Wm>$? >^Ͻ>{=(>YC;{>>Ҿ>{>{'V=2R=333>YC>(=2RŽfff>$< >{>Ҿ̌>YC(?O>>Ҿ{ff>{{9>2RŽ>(YC%Ӛ>2R=>>Ҿ{>33>(YC>X>{>>ff?{{>>2RŽ>33?YC(>Ɯ?2R=> ?Τ<>i ?{>>>,?YC>(>_6?>>{>9?{>{>,'?>2R=ffF?(>YC>3?>2RŽ33S?<>;>%Ɯ@?>>{`?(>YCiM?{>>Ҿl?{>{_6Z?2R=y?YC>(,g?2RŽ33?-%Ҿ?YC(cN?>Ҿ{?{{ɴ?2RŽff?(YC0?2R=̜?Ҿ{>33?(YC>?{>>?{{>cN?2RŽ>?YC(>ɴ?2R=>ff?v<>0?{>>>̼?YC>(>?͝>> ?{>{>??Wm> ??ֽ腽"?%xY>D>-JQNB>پ+t=[>[з=| =-JQ>Sl<̽q> $=پ9>-JQKW=پ)m>[[^(>̽.>-JQ [>=ȩ>LUab>پ>a>-JQ>9>>R>[[>ӕ>̽?>-JQ>l/>=?C?ढ?>>>?-JQ>>P?>>ܰ!?[>[>~??=}.?>-JQ>J??̽vJ;??zH%*?>CH?>-JQ6?>پT?[>[PC?=ܰa?-JQ>~P?̽}n?<%J]?پvJ{?-JQj?پ ?[[v?̽r?-JQ؁?=nؐ?[??پ>>?-JQ>u?>;?[[> ?̽? ?-JQ>Ar?=?r??ء?>>nذ?-JQ>>??#>'>`P?[>[>u?T?>F?Mn?c4~$i$?+;>Tǽ ? kT>nBg'>g'پҽ2= %; k> 1X2 +V=<$;F>T= k i@=T1>g'پg'پ= 2dIO> k> 2=L>>$,I>T>ך> k>}>T>q>g'پg'> >2 ? > k ?>2= ?>?@P>T>>&? k> ?>>T>k ?g'>g'>t> ?2=8? ? k> ? ?2Ὄ'??&R%S?>TY3? ? k %?T>&@?g'>g'پt2?2= kM? k> A??2 8Z?T%L?Tフg? k SX?TYs?g'پg'پ e? 2ὓO? ktr? 2=?x9A?T>`? k>C?T>Ƃ?g'پg'>m?2 ?-? k ?Ԓ?2= ?O??v:?T>>? k> ?ݠ?>Q>(_?g'>g'>C??5>g6?v!?.g~G̞4?ipDd*l?OJ[,"?FYAO>l.ͽ|>>|>] > NFY>[,"S a@$/#!Ol J=FY[,"ϣ.|>ux=  >[,"FYG=  >PL>/#Q׃$>lO>O>[,"FY> W>Ol?A[>|>|>>u> ?>FY[,"?> > ?u>/?R>O>l?(>FY>[,"?A>l?O>>|>>|>>> ? > ?[,"?FY>? ? mz?/?l3?|>>|> )? > ??FY>[,"5? L?|%/B?OlmzY?FY[,"\O?lO:Gf?|>|>)T\?  s?[,"FY i?  >?/.Zu?lO>V?[,"FY>H]?Ol?7?|>|>>Ç? ?#?FY[,"?*? > ??/?{?O>l?j?FY>[,"??O?é>?|>>|>>H]?L,"?3>ʮ?7?MZ[*F?`^d*l?>оA-G(8?A>>l ? ]V@>R7k>G(8SV@R79<$TG#!>оlaоǥ= ux=R7V@>G(8G=R7V@>&J9>TG#QϤ׃$>l>>Y}l>G(8> W>>оl?F؏> ?u>V@R7?q>G(8?>V@>R7?y >&TG?R>>>l?>>G(8?A>l?>>>> ? ?>R7?V@>#?G(8?>?R7?V@?TG?ʀ%\?l?>о!?G(8?)T?>>lR.? ? )?V@>R7V;?>G(85?V@R7#G?%TGB?>оlT?G(8\O?l>оa? )T\?R7V@Rn?G(8 i?R7V@>V{?TG|u?l>>?G(8>H]?>оl?x\? ?Ç?V@R7??G(8?*?V@>R7?E)?TG?{?>>l??>G(8??8?>Ne? ? ?H]?n1?k>ʮ?N[N?>,~G`V?w;NNc>wL1Xv$Na$P];F>-wLc>Nv$>PL>P]$,ФI>O>wLc>}>-6~6~? >v$N?>cwL?>v$>N?u>>P]?@P>->c>wL?>>6~?6~?t>N?v$> ?wL?c> ?N?v$mz?P]?^%S?N??c>wLA??v$NL?%P]L?-?P]<ΕA?V?wLc>C?-N??ӥP]?v:?->wL?ݠ?!.?E>?6~?6~?C?#@?>g6?ca?<4~b?"xY}??ǽX\?CNB?}?nBd(?d(з03>b%;C>X\Sl<03b+V=$#n=}?=CX\KW=}?1>d(d(^(>b03dIO>X\C [>b03>L>>#nȤb>}??ך>X\C>9>}??q>d(d(?ӕ>03b? >CX\?l/>03>b?>P#n?>?}??&?C>X\?P?}???k ?d(?d(?~?b?03>8?X\?C>J?b?03'?#n?%*?}??Y3?X\?C6??}?&@?d(?d(PC?03>bkM?C>X\~P?03b8Z?%#nJ]?}?g?CX\j?}?Ys?d(d(v?b03O?X\C؁?b03>?#nm??}??`?X\C>u?}??Ƃ?d(d(? ?03b?-?CX\?Ar?03>b?O?#n?ء??}???C>X\???)>??(_?d(?d(?u?f&K?IR>F?Cn?'G腽sJ?lDl?sJ+t=/8>>o| =/8>oq>lsJ9>sJl)m>o/8>.>o/8>>ȩ>sJl?a>lsJ?R>/8>o?>/8>>o?C?l?sJ??sJ?l?ܰ!?o?/8>>}.?o?/8>vJ;?sJ?lCH?l?sJT?/8>>oܰa?/8>o}n?lsJvJ{?sJl ?o/8>r?o/8>>nؐ?sJl?>?lsJ?;?/8>o? ?/8>>o?r?l?sJ?nذ?H?< ?`P?0?ה>M?*??UގrG: q?'H=M?Y =Y ?M0>W@>xrPc>W@xrB>Y M,>MY uƾ>xrW@`>xrW@>>MY ??Y M?n?W@xr?:c?W@>xr?0,?Y ?M?8?M?Y ?E?xr?W@>nR?xr?W@:c_?M?Y 0l?Y ?Mx?W@>xr?W@xr7K?Y M?MY ?xrW@j~?xrW@>?MY ?7K?Y M??W@xr??W@>xr?j~?Y ?M??K?hy ?%?\h?@!>E?J'W>J?E-j>]9>֊i>]9֊i`>JE6>EJ>֊i]9?֊i]9>?EJ?N?JE?})?]9֊i?J5?]9>֊i?B?J?E?O?E?J?N\?֊i?]9>}i?֊i?]9Ju?E?JZ?J?E?]9>֊iX'?]9֊i?JE%?EJZ?֊i]9?֊i]9>X'?EJ??JE?%?]9֊i?Z?]9>֊i??J?E?X'?:D?r?*?5PX?)3\d>7?XYI>X>7>V,> Y|>V, Y&>X7>7X$? YV,y? YV,>F ?7X>-?X7?W:?V, Y?$G?V,> Y?yS?X>7?F`?7?X>m? Y?V,>Wz? Y?V,V?7?X?X>7#_?V,> YŖ?V, Y+?X7V?7X? YV,#_? YV,>Ŷ?7X>+?X7?V?V, Y??V,> Y?#_?X>7??6?VR>DX?oXC?^!{>%?vݾH>v>%⊺>>R{C{$>R{C>vݾ%׫?%vݾx?R{CqE?R{C>>*?%v> 6?vݾ%?׫C?R{C?xP?>R{C?qE]?v>%?>j?%?v> v?R{C?>Ձ?R{C?R% ?>R{Co?R{Cա?vݾ%Ro?%v>?vݾ%?RR{C? ?v>%?o? %? >?e,?{>+?þH>>+⊺>>R%,{$>R%,>þ+׫?+þx?R%,qE?R%,>>*?+> 6?þ+?׫C?R%,?xP?>R%,?qE]?>+?>j?+?> v?R%,?>Ձ?R%,?R+ ?>R%,o?R%,ա?þ+Ro?+>?þ+?RR%,? ?>+?o??>??\d>UR>YI>>UR>=|>&>UR>UR$?y?=F ?UR>-?UR>W:??$G?=?yS?>UR>F`?UR>>m??=Wz??V?UR>?>UR#_?=Ŗ?+?URV?UR?#_?=Ŷ?UR>+?UR>V???=?#_?>UR>?B>?>DX?N?aݽ!>X>藾'W>>X-j>^=>^ս`>藾X6>X藾>^ս?^=?X>N?藾X>})?^ս?J5?^=?B?>X>O?X>>N\??^=}i??^սJu?X>藾Z?>X?^=X'?^ս?藾X%?X藾Z?^ս?^=X'?X>?藾X>%?^ս?Z?^=??>X>X'?p>>*?>ν=3>ʍ=ʍ>3Ծ0>(=POPc>(ǽPOB>ʍ3Ծ,>3Ծʍuƾ>PO(ǽ`>PO(=>3Ծʍ>?ʍ3>n?(ǽPO>:c?(=PO>0,?ʍ>3>8?3>ʍ>E?PO>(=nR?PO>(ǽ:c_?3>ʍ0l?ʍ>3Ծx?(=PO?(ǽPO7K?ʍ3Ծ?3Ծʍ?PO(ǽj~?PO(=?3Ծʍ>7K?ʍ3>?(ǽPO>?(=PO>j~?ʍ>3>?A>>%?>ν寮3>ʍe<ʍ>3Ծ=(=POs>(ǽPOJ5>ʍ3Ծ}h>3ԾʍX>PO(ǽ>PO(=9>3Ծʍ>%>ʍ3>l>(ǽPO>,?(=PO>?ʍ>3>Ɯ ?3>ʍ>i-?PO>(=_6:?PO>(ǽ,G?3>ʍS?ʍ>3ԾƜ`?(=POim?(ǽPO_6z?ʍ3Ծ?3Ծʍ?PO(ǽcN?PO(=ɴ?3Ծʍ>0?ʍ3>?(ǽPO>?(=PO>cN?ʍ>3>ɴ?A>>'?N?aݽ3ؽX>藾6x>X㾧E-^=c{!=^ս$=藾X?>X藾rA>^ս+u>^=l/>X>ɭ>藾X>b>^ս?9>^=?ӕ>>X> ?X>>??^=P#??^ս~0?X>藾J=?>X㾶J?^=V?^սPc?藾X~p?X藾J}?^ս ?^=Ar?X>ؑ?藾X>??^ս?u?^=? ?>X>Ar?p>>3??/UR>>URˋ=伭=Mmc>UR>@P>UR>>?t>=? >>UR>>UR>> ??=t??コA?UR>,?>URS8?= E?tR?URA_?URl?Sx?=Ԃ?UR>v:?UR>ݠ??C?=?m?>UR>Ԣ?B>?>Щ?e,?S+?þH(>++꽻>R%, ŃR%,jþ+Z=+þn=R%,= >R%,>p>>+>Pq>þ+?A>R%,?۫>>R%,?u>>+?>+?>R>R%,?> ?R%,??+?þ"?>+\/?>R%,)T)T|?+>{?þ+??R%,?H]?>R%,?×?>+?*??>G?oXC?^!S%?vݾH(v>%+>R{C ŃR{Cjvݾ%Z=%vݾn=R{C= >R{C>p>>%v>Pq>vݾ%?A>R{C?۫>>R{C?u>v>%?>%?v>R>R{C?> ?R{C??%?vݾ"?v>%\/?>R{C)T)T|?%v>{?vݾ%??R{C?H]?>R{C?×?v>%?*? %? >G?5PX?)3/7?XX>7ˋV,> YV, Y YV,>Mmc>7X>@P>X7?>V, Y?t>V,> Y? >X>7?>7?X> ? Y?V,>t? Y?V,A?7?X,?X>7S8?V,> Y E?V, YtR?X7A_?7Xl? YV,Sx? YV,>Ԃ?7X>v:?X7?ݠ?V, Y?C?V,> Y?m?X>7?Ԣ?6?VR>Щ?\h?@3ؽE?J6xJ?EE-]9>֊ic{!=]9֊i$=JE?>EJrA>֊i]9+u>֊i]9>l/>EJ?ɭ>JE?b>]9֊i?9>]9>֊i?ӕ>J?E? ?E?J??֊i?]9>P#?֊i?]9~0?E?JJ=?J?EJ?]9>֊iV?]9֊iPc?JE~p?EJJ}?֊i]9 ?֊i]9>Ar?EJ?ؑ?JE???]9֊i?u?]9>֊i? ?J?E?Ar?:D?r?3? q?'H寮M?Y exrs>W@xrJ5>Y M}h>MY X>xrW@>xrW@>9>MY ?%>Y M?l>W@xr?,?W@>xr??Y ?M?Ɯ ?M?Y ?i-?xr?W@>_6:?xr?W@,G?M?Y S?Y ?MƜ`?W@>xrim?W@xr_6z?Y M?MY ?xrW@cN?xrW@>ɴ?MY ?0?Y M??W@xr??W@>xr?cN?Y ?M?ɴ?K?hy ?'?lr?[mff&>{>I=e|2>{>I=e>½6wY>$~ xJe>$~ xN4>1![ff>{轾I=e>>{轾I=eg>@O>s/s/إ>s/s/Z>[m*9>I=e{轾%r>I=e{轾B>6w=33>~ x%Ĥ >~ xҤۍ>![1>>I=e{>X>I=e{>u'>O@?33?s/s/?y?s/s/?>*9[m??{轾I=e?E?{轾I=e?T?=6w??T~ x??P~ x?!z?1>![?)?{>I=e?߅,?{>I=e?F ?@?O?ff6?s/?s/?R9?s/?s/?-?[m?*9>33C?I=e?{>yF?I=e?{>9?6w?½P?~ x?%ER?~ x?d%TF?![?1\?I=e?{轾_?I=e?{轾!zS?O?@i?s/?s/߅l?s/?s/F`?*9>[mffv?{>I=eRy?{>I=em?½6w?%~ x?%~ xy?1![?{轾I=e#v?{轾I=eV?@Off?s/s/܏?s/s/?[m*9̔?I=e{轾B?I=e{轾w#?6w=33?~ x̞V?~ x|݉?![1>?I=e{>?I=e{>D?O@??s/s/?#v?s/s/?V?*9[m?ff?{轾I=e?ܯ?{轾I=e??=6w?̴?~ x?B?~ x?w#?1>![?33?{>I=e?V?{>I=e?݉?@?O??s/?s/??s/?s/?D?RS?jM>6?RS?jM>L?n?\h|=g?I+|=V?e>^?v(>Y?n<(R>c*?c*2\>)>Ei>>^> rG>p$.8qL>eV7>^!>nc*c*>Ei)k>^U>r =W?.8qHw?Ve>$O?^>D?YnV?WA?>^?wC?n[?^?>s]?r? g?.8q?FL%?j?V?e徊t?^? w?Y?n<+?c*?c*?)>Ei'?>^"S? r?%.8q?eV_?^?n?^>?YnV?'?>^?"S?n ?b?VT*5>N\?WH>+SK?Zپp>,P?A^t>AB?62>?ɓ>2څ>_\>A>,Pb>Xôoe(>p$b5>Zپ+SK>A,Pϕ>62ABN[>i/>_\2څt?,PA ?oeXô=A?b䤤N?+SKZ> "?,PA>~#?AB62?`/??J0?2څ_\?-+SK?AU?A>,P?NV?62?AB? b???~c?_\?2څ>`o?,P?A>Jp?oe?Xô-|?b?a%}?+SK?Zپ:}?,P?AA?AB?62??X?2څ>_\J?A>,P ?Xôoem?%bt%?Zپ+SK?A,Pڋ?62AB:}?A?_\2څ?,PAX?oeXô=J?b9 ?+SKZ>m?,PA>t%?AB62???ڋ?2څ_\?:}?A,P?A?Xô=oe??إb?X?Z>+SK?J?A>,P? ?62?AB?m???t%?D?>q?[P?:g> L?C>9?Hƾq>=?R*>?@"% > ? hĪ>ֺt>OI>R>=^>?QX>>@$#M>Hƾ9>R=5>@"Ƹ ?  g?OIֺt?=R4b?Q?=_R#?#M/"?9H>,0?=R>.?@"?9?_Rc?R>=?/b?@"??,p? ? ?n?OI?ֺt>|?=?R>{?Q??c܄?#M?z%J?9?HƾB?=?R??@"0? ? ?ֺt>OI?R>=}??Qu?%#MM?Hƾ9cܤ?R=J?@"B?  ?OIֺt0?=R?Q?=?#M@b}?9H>u?=R>M?@"?c?  ?J?ֺtOI?B?R=???=Q?0?ĥ#M??H>9??R>=?}?@"??u? ? ?M?+J6?5>N?b:?JͽNx>9?uf M>J%?d>'?Iኾ;>> >N?NՋ>Y>Y3'>I>'o%>P:T>@$t5>dJ%w?Iኾ'X>Cz?NN ?Y3YG?'Iኾ?:P=(?t5xZ$?J%d>4?'I>_1??wA?NN?Q,>?YY3?CzN?Iኾ'?J?P=:?G[?t5?W?d>J%?h?I>'?d??>t?N?N?_q?Y3?Y>ր?'?I>Q,~?:?P"=?t5?Qτ%|?J%?d?'?Iኾ?> ?N?N\I?Y>Y3Up?I>'¯?P:֠?p%t5(?dJ%"=?Iኾ'|??NN?Y3Y ?'Iኾ\I?:P=Up?t5$J¯?J%d>?'I>(??"=?NN?|?YY3??Iኾ'??P=:? ?t5?\I?d>J%?Up?I>'?¯??>?N?N?(?%?> w?p%?:g>'?IQ8>l?q>њ?rmˇ>-0>Z% >i>ie>M>>P>r>њ>J#X>>@$:>l>rњ1>Z-0оƸ ?iྯiྷ?PM>?њr?J#=_R#?F2P?l>,0?њr>L*?-0оZ>7?M>P?ƸI?rњ?C?=J#?V??P?>l?_Rc?r>њ?P]?Z>-0>,p?i>i>Lj?P?M>>|?њ?r>w?J#?c܄?? s%?l?B?њ?rBY?-0>Z0?i>iྨ?M>>P?r>њ&?J#u?X%u?lcܤ?rњ?Z-0оB?iྯiBY?PM>0?њr?J#=?&?l>u?њr>u?-0оZ>c?iྯi>?M>P?B?rњ?BY?=J#?0???>l??r>њ?&?Z>-0>u?i>i>u?_?8{>???坽T*5>?1 >>* p>.?VܻQ>y>߾>f>fƾw>'>@ >V>.!>Fb"(>($I >* >V.UD>߾yN[>fƾfƾ>@ 't?.V;?"Fb=A?I MU#?* > "?.V>^?y>`/?fƾf>*'?'@ ?->AU?V>.?N?>y> b?f>f>^Z?@ ?'>`o?.?V>*g?"?Fb-|?I ?yg[%nt?>* :}?.?V❀?y>߾?f>fƾH?'>@ J?V>.j?Fb"m?<%I ѓ?* ?V.|7?߾y:}?fƾfƾ❠?@ '?.VH?"Fb=J?I [j?* >m?.V>ѳ?y>?fƾf>|7?'@ ?:}?V.??Fb="??I ?H?* >>J?V>.?j?>y>m?f>f>??o|>X ??k|=]?#,=2>&w>~>Er|=IO>(ʾ(R>ˈ>ˈl.>3>>E>~$b>RMqG>$?髊>&w27>E~E>(ʾIO{>ˈˈ߽>3k>~Ex>qRM=W?? P>2&w>$O?~E>U?IO(>?ˈˈ>"?3>'?E~>?RM=q?4?Ԥ??[+?&w>2>WA?E>~>(8?(>IO>$ON?ˈ>ˈ>UE?>3>[?~>E>"R?q?RMg???yK%^?2>&wt?~>E[k?IO>(ʾ+?ˈ>ˈ(x?3>'?E>~?RMq?.%?a?&w2_?E~w?(ʾIOZ?ˈˈ.ޕ?3+?~ED?qRM='???2&w>?~E>a?IO(>_?ˈˈ>w?3>Z?E~>.޵?RM=q?+?x??D?&w>2>'?E>~>?(>IO>?ˈ>ˈ>a??>H?X?Ven=.>B<^k>wþff=H<>H<ћ=>ff&>B>.꾷>CF}Y>$,zN4>en߾ff>B.g>wþ^k>H>.BB>}CF=33>,zۍ>߾en>>.B>u'>^kw>33?H>>?B.>T?CF=}>?Ԥ,z>!z?en>>)?B>.>F ?w>^k>ff6?H<>H<>-?>>33C?.>B>9?}>CFP?,z>\:%TF?>en\?.>B!zS?^k>wþi?H<>Hffv?B>.꾻m?CF}?,%,zy?en߾?B.꾪V?wþ^kff?H?.B>D?^kw>?HV?>ff?B.>?CF=}>̴?t,z>w#?en>>33?B>.>݉?w>^k>?H<>H<>D?ς>}>L??kR? 'k2>&w>L2IO>(ʾ<>]v3>↍=L>\5=RMqI=$f=&w2)->L3 >(ʾIO ]`>f=>3ȉ>L$p>qRM=a>fW>2&w>R>L>E>IO(>>>>3>.>L>x>RM=q??ؤf?M>&w>2>ܰ?L>>V?(>IO>}?>>#?>3>vJ+?>L>"?q?RMC8?f?ZF%Y/?2>&wD?>L&(ʾܰQ?>VH?3>}^?L>#U?RMqvJk?8%fb?&w2Cx?LYo?(ʾIOr?&|?3n؈?Ly?qRM=>?fh?2&w>;?L>xF?IO(> ?>ެ?3>r?L>D?RM=q?nب?f?y?&w>2>>?L>>?(>IO>;?>>xF?$0?J>???坽n?h9R >* 7mwk ??ck y>߾ vdZ>dZҾp'>@ T%?c>wk HFb"#=($:<* b,=?cwk Q{=߾ydI>dZҾdZҾ*=@ '|B>wk ?c:%>"Fb=˯u>(mX>* >q>wk ?c>Ѕ>y> >dZҾdZ>1j>'@ ?>?cwk ?>Fb="?L>>?d>* >>>?c>wk ?6>>y>8 ?dZ>dZ>L?@ ?'>?wk ??c>?"?FbY#??r(M%?>* &0?wk ??cN)?y>߾k=?dZ>dZҾ6?'>@ 8J??c>wk LB?Fb"W?P%O?* Yc??cwk \?߾y&p?dZҾdZҾNi?@ 'k}?wk ?cv?"Fb=`?.&t?* >Ƃ?wk ?c>ڇ?y>-?dZҾdZ>@?'@ ?O??cwk ?Y?Fb="??? ?* >>`??c>wk ?&t?>y>Ƃ?dZ>dZ>ڧ?b ?6>K?p%?L~C.?YS B/l?&?灾7;-0>Z_@>@M>>Pa>J#֗TP$y)vV lצ=灾P >灾=J#=O?>y)/w*>l>r>>c]>-0оZ>>@@>n>M>P?u>灾?d>=J#?(>y)?>>l?>>?;>Z>-0>A[>@>@>1>P?M>>mz ??>e7?J#?:G?y)?@c%2?l?#??灾?-0>Z/?@>@̝*?M>>Pj7?J#mzI?x%y)e7D?l:GV?灾2Q?Z-0оc?@@]?PM>o?灾̝j?J#=|?y)Gjw?l>7?>?-0оZ>#?@@>?M>P??灾??=J#?j?y)?N?>l?V?>?L?Z>-0>7?@>@>??>?b:?JͽU@?Lq38J%?d92?~E>ڵ?JY>Y3N>2T/P:=@$hAۑ/dJ%<2;-=j=Y3YK=2Fj=:P=Y},>hAwV >J%d>_>2>T>?q>?^>YY3?y >2?@>P=:?>hA?ڶ>d>J%?>>>2?+t>?>F>?? >Y3?Y>?2?>?:?P󒽽?hA?Ts%|?J%?dR?2?Im?>V+??:(?Y>Y3#7?>25?P:D?%hAA?dJ%Q?2|N?R^?Im[?Y3YVk?2:h?:P=#w?hAn|u?J%d>x\?2>??ˆ??>P?YY3?E)?2??P=:??hA? ?d>J%??>2?q??>x\????6,?E>Ĭ?[P?L~CR?톽 $9?Hƾ&ҹG?Tut0)?@"_?ֺt>OIaTu>ҹG?Q֗Tp$.XmyHƾ9צ=TuҹGdq=@"9==OIֺtP >ҹGTu >Q?=O?>.Xtݤ5=>9H>r>ҹGTu>&ip>@"?>?,Α>ֺtOI?u>TuҹG?g>?=Q?(>4.X?`>H>9?>Tu>ҹG?>@"??A[>??4>OI?ֺt>mz ?ҹG?Tu>?Q??:G?.X? %?9?Hƾ#?ҹG?Tu"??@"/??}M/?ֺt>OIҹGI7?ҹGTu>s?@"?#??ي?ֺtOI??TuҹG?X@??=Q?j?Υ.X??H>9?V?Tu>ҹG?% ?@"??7???s?&_\T%>tX᝻Xôoe#=$j9=Zپ+SKb,=tX=62ABdI>%%>_\2څ|B>tXG>oeXô=˯u>j&bͤ{>+SKZ>q>tX>">AB62? >%%?>2څ_\?>tX?EU>Xô=oe?L>>Hj?>Z>+SK?>>tX?x>62?AB?8 ?%?%? ?_\?2څ>?tX?>]?oe?XôY#?j?Ř%*%?+SK?Zپ&0?tX?o1?AB?62k=?%?%<>?2څ>_\8J?>tX K?XôoeW?%j]X?Zپ+SKYc?tX*e?62AB&p?%%oq?_\2څk}?tX<~?oeXô=`?jȅ?+SKZ>Ƃ?tX>.?AB62?-?%%?Q?2څ_\?O?tX??Xô=oe??⥜j?b?Z>+SK?`?>tX?ȥ?62?AB?Ƃ?%?%?.?b.I?A`>c/?n?\hV?e循Y?n<<)>Ei↍= rI=eV)->nEi)ȉ>r =a>Ve>R>Yn)Ei?.> =r??e>V?ܰ?nvJ+?r? C8?V?eD?Y?n<ܰQ?)>Ei}^? rvJk?eVCx?n?Ve>;?YnV?>?n![ >-?-l.>-?-<=6w@>o>c$b>o>c(=*9[m33s>$Uu髊>$UuA>O@33>ocE>oct7>![1̬>--߽>---j>6w½ff>cox>co>[m*9>>UuۅP>Uu٤J>@O?>co>U?co> >1![? ?--?"?--?}>½6w?ff?oc??oc?T>*9>[m?33#?HUu?[+?PUu?v?O?@?0?o>c?(8?o>c?C?![?1>"R?c?o>?-?[m?*9ffV?Uu?%^?Uu?% :?@?O33c?c?o[k?c?ovG?1>![p?-?-(x?-?-CT?=6w|?o>c?o>cra?*9[m̄?%Uua?%Uu?m?O@33?ocw?oc z?![1꾚?--.ޕ?--l?6w½?coD?co!?[m*9>ff?Uu$?Uu$9?@O?̤?co>a?co>?1![?33?--?w?--?U?½6w??oc?.޵?oc?l?*9>[m??Uu?D?Uu?!?O?@?ff?o>c??o>c?9?xS?>*?-?-?a?-?-??jQQ? >H?jQQ? >tz?Ei?)\ >[a? >ntX?ܻQ>e>Vol>%?%w> =r{я>>tX!>)Eik>$j>Yn<>tXUD>VeG>%%>r 7>tX;?Ei)>?j?n^?eV?W!?%%?*'? r?$O.?tX?n4?)>Ei?;?Lj?;A?Y?ntX?N?V?e>T?%?%?^Z?r? =Wa?tX?>*g?Ei?)$On?j?%nt?nV_?%?%H? =rZ?>tXj?)Ei+?%jѓ?Yn<'?tX|7?Ve?%%❠?r _?tXH?Ei)>Z?j-j?nѳ?eV?'?%%?|7? r??tX??)>Ei?_?襜j?H?Y?ntX?j?O?R>6?%?%??b.I?A`>X ?_\?2څW>R?톽Q8>62?AB(>ҹG?Tumˇ>Z>+SK>?e>Xô=oeN[>Tu>ҹG>2څ_\>p$.X:>AB62>TuҹG1>+SKZپ ??oeXô`?ҹGTu?_\2څ>-?.XY#P?62AB?t(?ҹGTu>L*?Zپ+SK?A5??7?Xôoe? B?TuҹG?C?2څ>_\?`O?4.X?P?AB?62?-\?Tu>ҹG?P]?+SK?Z>th???Lj?oe?Xô=Au?ҹG?Tu>w?_\?2څJ?.X?՛%?62?ABm?ҹG?TuBY?Z>+SK???Xô=oe:}?Tu>ҹG&?2څ_\?%.Xu?AB62J?TuҹG?+SKZپm?BY?oeXô?ҹGTu?_\2څ>:}?.X|&?62AB??ҹGTu>u?Zپ+SK?J???Xôoe?m?TuҹG?BY?2څ>_\??ʥ.X??AB?62?:}?Tu>ҹG?&?9???u?&?OI?ֺt>@?Lq M>@"?X>>2?;>H>9׹>?Ջ>?=Qq>>2o%>ֺtOI% >@$hA>@"_R?2X>9Hƾ,? ?Q??2?OIֺt>Ƹ)?hAxz$?@"?6?2>_1?Hƾ9?_RC??Q,>??Q?,P?2?J?ֺt>OI?\?hA?W??@"?Ƹi?>2?d?9?H>v???_q?Q??=0?2?>Q,~?OI?ֺt?hA?Qό%|?@"?u?2??H>9cܔ??\I??=QB?>2¯?ֺtOI0?%hA(?@"?2|?9Hƾu??Q?cܴ?2\I?OIֺt>B?hA$V¯?@"?0?2>(?Hƾ9???|??Q?u?2??ֺt>OI?c?hA?\I??@"?B?>2?¯?v5?>0???(?6,?E> w?Y3?Y'>.?YSC>?T>?灾*>d>J%Z>@>@hĪ>P=:>>^>YY3 >P$y)>?灾5>J%d?@@g?:Pw!?灾4b?Y3Y>Cz.?y)gM/"?>G;?>.?dJ%?H?@@>;?P:?T?灾?gH?Y>Y3?wa?y)?4bU?>?Czn?>?/b?J%?d>G{?@>@>n?:?P= ??>{?Y3?YUp?y)?|%J??֐??灾?d>J%"=?@>@?P=:?>}?YY3 ?`%y)M?Up?灾J?J%dְ?@@?:P"=?灾?Y3Y>?y)@2}?> ?>M?dJ%?Up?@@>J?P:??灾??Y>Y3?"=?y)??>??>?}?q"?Ul>?@>@>M??>N?P?M>>?h9H>Z>-0оX>>wk ??c^t>>l׹>dZ>dZҾɓ>=J#q>?c>wk b>M>P% >8$5>-0оZ_R??cwk ϕ>l,?dZҾdZҾi/>J#?wk ?c ?PM>>Ƹ)?.N?Z-0>6?wk ?c>~#?l?_RC?dZҾdZ>J0?J#?,P??cwk ?=?M>>P?\??I?-0>Z>Ƹi??c>wk ?NV?l?>v?dZ>dZ>~c?J#?=0?wk ??c>Jp?P?M>??i%}?Z>-0оu?wk ??cA?>lcܔ?dZ>dZҾX?=J#B??c>wk ?M>P0?H%t%?-0оZ??cwk ڋ?lu?dZҾdZҾA?J#cܴ?wk ?cX?PM>>B?r ?Z-0>0?wk ?c>t%?l??dZҾdZ>ڋ?J#?u??cwk ?A?M>>P?c??X?-0>Z>B??c>wk ? ?B?>0?dZ>dZ>t%?b ?6>q?@ ?'W>R? '|=>y(>>Lv(>* >>>2\>Fb="N[>L>>'@ >$fL>y߾>L!>* ?>"Fb`?LU>@ '>-?f&w?߾y>t(?L>D?* >A5?>s?Fb"? B?L>?*?'>@ ?`O?ܤf? 7?y>>-\?L>>wC?>* >th?>>DP?"?Fb=Au?>L>s]?@ ?'J?f?T%?j?>ym?>L w?* >?>?Fb=":}?L>"S?'@ ?6%f?y߾J?L?* m?U?"Fb?L?@ '>:}?f*"S?߾y>?L>?* >J?>?Fb"?m?L>U?'>@ ??f??y>>:}?L>>"S?|?Z+>9?>>?$0?J> ?>3\ >R ?Jx<(>IO<9>.>B,b=&w>2ol>H<>H<=RM=q{я>B>.|2>3k>$,zJe>IO(ʾ>B.>>2&wG>HqRM7>.B%r>3>?,zK >(ʾIO>?.B>X>&w2>W!?Hy?RMq?$O.?B.>E?3>>;?Ф,z>?IO>(>G?B>.>߅,?2>&w>T?H<>H<>R9?q?RM=Wa?.>B>yF?>3$On?,z>)@%ER?(>IO{?.>B_?&w>2_?H<>H<߅l?RM=qZ?B>.꾬Ry?3+?*%,z?IO(ʾ'?B.#v?2&w?HZ?,z2V?(ʾIO>+?.B>?&w2>'?H#v?RMq??B.>ܯ?3>>_?t,z>B?IO>(>Z?B>.>V?]>>6?H<>H<>?ς>}>6?>=]?#7\Kw>^k33=~>Een>߾ >ˈ>ˈE>~(=33s>$?A>^kwþ33>E~t7>߾en̬>ˈˈ-j>}CFff>~E>>>? 3J>wþ^k>>~E> >en> ?ˈˈ>}>CF}>ff?E~>T>>>33#?Ф??v?^k>w>0?E>~>C?>en>ˈ>r!?}>CF=I?~>E>?-?>ffV???Ty=% :?w>^k33c?~>EvG?en>߾p?ˈ>ˈCT?CF=}|?E>~ra?̄?0%??m?^kwþ33?E~ z?߾en?ˈˈl?}CF?~E!?>ff??I9?wþ^k>̤?~E>?en>33?ˈˈ>U?CF}>?E~>l?>>?z??!?^k>w>ff?E>~>9?>>*?ˈ>ˈ>??>tz?>3IOv+.?Vֽ&w>2^4=f>fƾ `RM=q=V>.᝻3>>$I 9=IO(ʾqF>V.=2&wy>fƾfƾ>qRM씖>.VG>3>.>I Lj{>(ʾIO>>.V>">&w2>a>fƾf>>RMq?R>V.?EU>3>>vJ ?I ?>IO>(>C?V>.?x>2>&w>$?f>f> ?q?RM=ܰ1?.?V>]?>3}>?I ?G%*%?(>IOvJK?.?Vo1?&w>2CX?f>fƾ<>?RM=qd?V>. K?3ܰq?D%I ]X?IO(ʾ}~?V.*e?2&w;?fƾfƾoq?qRM ?.V<~?3>r?I y7 ȅ?(ʾIO>nؘ?.V>.?&w2>>?fƾf>Q?RMq?;?V.??3>> ?I ?b?IO>(>r?V>.?ȥ?]>>?f>f>.??o|>c/?@ ?'5P '?I $>y:њ?rt0)* >;i>iཱྀ뽏Fb="Ft<r>њ'@ /=H$myy߾_=rњdq=* (>iྯi="Fb1\>њr >@ '>>t鑤5=>߾y>L>>њr>&ip>* >׺>iྯi>,Α>Fb"?q>rњ?g>'>@ ? >?`>y>>Y?r>њ?>>* >&?i>i>4>"?Fb=k?њ?r>?@ ?'8*??HW%?>y7?њ?r"?* >YC?i>i}M/?Fb="&P?r>њIO? {@I|?߾y>?њr>s?* >`?iྯi>ي?Fb"?Ƃ?rњ?X@?'>@ ?-???y>>O?r>њ?% ?|?Z+>?i>i>s?_?8{>|@9?uf38Z>-0о}I '?Iኾ~E>l,N?NJ=J#\I>'T/M>PE<@$t5ۑ/-0оZ> ~=Iኾ';lm=NNj=J#%>'IኾFj=PM>>Y>t5wЩV >Z-0>(>'I>T>l?>NN?^>J#?A[>Iኾ'?@>M>>P?>t5?ڶ>-0>Z>u>I>'?+t>l?>?N?N? >J#?=?'?I>?P?M>?t5?Tk%|?Z>-0оmz)?'?IኾIm?>l:G6?N?N:(?=J#C?I>'5?M>PO?%t5A?-0оZ\?Iኾ'|N?lmzi?NNIm[?J#:Gv?'Iኾ:h?PM>>?t5n`u?Z-0>j?'I>?l?V?NN?>P?J#?7?Iኾ'??M>>P?#?t5? ?-0>Z>?I>'?q?B?>%?N?N??%?>Ĭ?Y3?YS L? B/?tO =?R7;d>J%8ڽ ? P=:6gR>=YY3Jֻ@$#MvV d1=R==R=Y3Y>F>#MФ/w*>>&Jy>=R>c]>dJ%?>>  ?n>P:?Fد>R=?d>Y>Y3?q>(#M?>>?y >R>=?;>J%?d>> ? ?1>:?P=V ?=?R>e7?Y3?Y#?#M?%2??$?=?R?d>J%1? ? ̝*?P=:R>?R>=j7?YY3VK?%#Me7D?#W?R=2Q?J%dd?  ]?:P󒽽q?=R̝j?Y3Y>R~?#M≥jw?>?=R>?dJ%??  ??P:?x\?R=??Y>Y3?˜?ĥ#M?N?>?E)?R>=?L?q"?Ul>L? ? ??+J6?5>?OI?ֺt|@N\?WR @"?}I ,P?Ak H>9,?p?=Q\A>,PHֺtOIE<$b:<@"> ~=A,PQ{=9Hƾm=*=Q?%>,PA:%>OIֺt>Y>b(ʤmX>@"?(>,PA>Ѕ>Hƾ9?>?1j>?Q?A[>A,P?>ֺt>OI?>Db?d>?@"?u>A>,P?6>9?H>???L?Q??=?,P?A>?OI?ֺt?b?9%?@"?mz)?,P?AN)?H>9:G6??6??=QC?A>,PLB?ֺtOIO?%bO?@"\?A,P\?9Hƾmzi?Ni?Q?:Gv?,PAv?OIֺt>?baM&t?@"?j?,PA>ڇ?Hƾ9?V??@??Q?7?A,P?Y?ֺt>OI?#?ܥb? ??@"??A>,P?&t?v5?>%???ڧ?D?>K?_\?2څ5P g?I+k62?AB:^?2Z>+SK;c*?c*]vXô=oeFt<>^\5=2څ_\/=$.8q=AB62_=^3 >+SKZپ(>c*c*f=>oeXô1\>^$p>_\2څ>>.8qLϤ>62AB?L>>^>E>Zپ+SK?׺>c*c*?>Xôoe?q>^?x>2څ>_\? >T.8q?M>AB?62?Y?>^?V?+SK?Z>&?c*?c*?#?oe?Xô=k?^?>"?_\?2څ8*?.8q?S-%Y/?62?AB7?^?&+SKYC?c*?c*VH?Xô=oe&P?>^#U?2څ_\k]?%.8qb?AB628j?^Yo?+SKZپw?c*c*&|?oeXô-?^y?_\2څ>O?.8qF?62AB??^>xF?Zپ+SK?`?c*c*?ެ?Xôoe?Ƃ?^?D?2څ>_\?-?.8q?y?AB?62?O?>^???c*?c*?xF?N?>?Ei?)V^4= =r=)Ei>>YnVe徤y>r 씖>Ei)>.>neV?a> r?R>)>Ei?vJ ?Y?n$?r? =ܰ1?Ei?)}>?nVCX? =rd?)Eiܰq?Yn<}~?Ve;?r ?Ei)>r?n? r?;?)>Ei? ?Y?n?rC?3>_?G?v'>L?G?v'>?rC?3>?Ig?2?<\>-?z(?>-??_~>g?ү?1>?'?w=>?'?w=>L?ү?1>_??_~>=?z(?>w?2?<\>w?I=?׎[? cy׎[? np=r?)JI=l?$M=o?1#H=D Z?:=RJN? _=??Y >YL?W>??P#> ?RJN}>>D Z=>?YLH>$>l&W>4A>VsK>n= vp>??>c q9{>n v,>4AVsI~>$l>??c qx>D Zuƞ> RJN >?B>YLP>?`>RJN X>D Z,>YL>l$>Vs4A>> vnu>c q??E> vn=B>Vs4A>>l$>`>c q??>>D Z>n?RJN ?%r>???YL?[ ???:c? RJN?߅ ?D Z??YL?(?$l?0?4AVs?R?n v?n"???c q?U%?n= v?(?4A>Vs?y&?$>l?:c/???>c q?"2?>D Z?5? ?RJN?E2????0????nB?RJN? ???D Z?>H?YL??[K?l?$>:cO?Vs?4A>߅L? v?n=U?c q???>(X? v?n0\?Vs?4ARY?l?$nb?c q???Ue?D Z?h?RJN? yf???:co?YL?"r???u? ?RJNEr?>D Z0|??YL~?$>l7K?4A>Vs?n= vj~???>c q.ޅ?n v?4AVsB?$l???c qD?D Z? RJNV??7K?YL??j~?RJN ?D Z龝?YLa?l$?Vs4A#v? vn?c q??w? vn=7K?Vs4A>ܟ?l$>j~?c q??>.ޥ?D Z>?RJN ?B????YL?D???? RJN?V?D Z?7K?YL??$l?j~?4AVs??n v????c q?a?n= v??4A>Vs?#v?$>l????>c q?w?>D Z?7K? ?RJN?ܿ????j~??YL?.?????cTL?P ??R?>?nJ? ??Ah?NnS >}k?tD: >ye?>5>zR?ZJ>)H?fB>8?Bmd>SC?OvUk>B?8~>f?)HCu>>zRЋ>O?SCUD>@>i8<>ُl>´=l-j>z 7> fݨ>´l6>i8<ُlU>@z 7 fw>zR>f)H>B8`>OSC!>8B-j>)HfL>zR6>SCO>ُli8l´J? fz 7*?l´=N ?ُli8<>? ?? fz 7>n?zR>}?)Hf? ?8B??SCO?;!?B8?J%?f)H?w#?zR?N,?OSC?.?@ُl?s=?@> f?*G?>zR?NL?f?)H??J?B?8?R?O?SC?nT?8?B?}Y?)H?f? W?zR?>_?SC?O?;a?Je?ُl?i8<>wc?l?´=Nl? f?z 7>n?l?´r?ُl?i8zRZ?O?SC|7?@>ُlU?´=l?z 7> f❐?´l%?i8<ُl?@U?? fz 7>❰?zR>%?)Hf??8B?X'?SCO?H?B8?Z?f)H?"S?zR??OSC?j?@ُl??@> f?|7?>zR??f?)H?U?B?8??O?SC??8?B?%?F?d~?kl?J?e>?]A?c?up?RY?!O$I> ]?.8jJW>S?|L,v>FrS?X/)r>+C?Mо>0;?;5>'+?d >;3?q/:>d ?'+|>;>0;ϕ>M>+CYI>q/>;31>|>S&>p0>]i/>=i<\> (>Tm>i<\>p0]>|S|> (Te>Mо+CYI>;0;b>d '+&>q/;3>'+d y?0;;~?+CMоW ?;3q/L ?S|F?]p0J?i<\$?T (?i<\=?]p0>?S|>y#?T (>#?+CM>W*?0;;>)?'+d ?F0?;3q/>0?d '+?$7?;0;?N6?Mо+C?=?q/;3?P=?|S?yC?p0]?~C?i<\?WJ? (T?LJ?=i<\?FP?p0>]?JP?|>S?$W? (>T?W?M>+C?]?;>0;?]?d ?'+?yc?q/>;3?c?'+?d ?Wj?0;?;>i?+C?M>Fp?;3?q/>p?S?|>$w?]?p0>Nv?i<\?=}?T? (>P}?i<\??]?p0 ?S?|+?T? (&?+C?Mо#_?0;?;t%?'+?d V?;3?q/u?d ?'+Ŏ?;>0;ڋ?M>+C?q/>;3?|>S+?p0>]A?=i<\#_? (>TBY?i<\V?p0]X?|SŞ? (T?Mо+C?;0; ?d '++?q/;3&?'+d #_?0;;t%?+CMоV?;3q/u?S|Ů?]p0ڋ?i<\?T (?i<\=+?]p0>A?S|>#_?T (>BY?+CM>V?0;;>X?'+d ?ž?;3q/>?d '+??;0;? ?Mо+C?+?q/;3?&?|S?#_?p0]?t%?i<\?V? (T?u?=i<\??p0>]?ڋ?|>S?? (>T??M>+C?+?;>0;?A?d ?'+?#_?q/>;3?BY?'+?d ?V?:?B>1?>?D_>v?2?s!>)?\E?;ʽTk>H?'{!>J>?qg>=?pֆ>/?黾⊚>*?㾜>?JW> ?־>J>{$>>*5>>/H>> X>qg>J>> > -I*>GG=[F>R>=;>GG[FW> -Ih>qgJ>{$>R=Ջ>黾/x?㾌*/?J ?־ ?JqE ?*?/黾׫? ־_?J>qg>? -I ?[FGGx ?=RQ,?[FGG= &? -I >g(?J>qg>qE-?=R>*?/>׫3?*>4b5?J>>:? >7?J?x@?㾌*?/B?黾/? F?־ ?D?qgJ>?qEM? -I?N?GG[F?׫S?R=?_Q?GG=[F?>Z? > -I?[?qg>J>?x`?R>=?Q,^?>/? f?>*?gh?J>?qEm?> ?j??J>׫s?*?>4bu?/?>>z? ?>w?J>?qg>R?[F?GG=o?=?R>\I?[F?GG? -I? }?J>?qgՉ?=?R¯?/?黾 ?*?M??JRo?>*J?>/?> |?qg>J>ՙ? > -I?GG=[F ?R>=?GG[FRo?R=\I?黾/?㾌*}?Jթ?־ ¯?J ?*M?/黾Rqgo? -I J?[FGG?=R|?[FGG=չ? -I >?J>qg> ?=R>?/>R?J>o? >\I?J??㾌*?}?黾/??־ ?¯?qgJ>? ? -I?M?GG[F?R -I?J?qg>J>??R>=?|?>/??>*??J>? ?> ???J>RBA?o -?E>?H" ?w>n?H0?{Tk>F2?ֆ>V'?K>&?\( {!>? {⊚>>?qɾ>n?޾W>M ?>>n{$>q>>X> {>H>>M 5>K>V'>[ >1;>Y=.>o>s&*>Y.W>[ 1Ջ>KV'{$>os&h> {x?qɾ>?޾n ?M /?n޾qE ?>qɾ_? {׫?M ?V'K>?1[ Q,?.Yx ?s&o?.Y= &?1[ >*?V'K>qE-?s&o>g(? {>׫3?>q>7?n>>:?M >4b5?޾n?x@?qɾ>?D? {? F?M ?/B?KV'?qEM?[ 1?_Q?Y.?׫S?os&?N?Y=.?>Z?[ >1?Q,^?K>V'?x`?o>s&?[? {>? f?q>>?j?>n?qEm?>M ?gh?n?>׫s?>?q>w?? {>>z?M ?>4bu?V'?K>R\I?.?Y=o?s&?o>?.?Y?1?[ ¯?V'?KՉ?s&?o}?? { ?>?qɾ(?n?޾Rno?q>>|? {>?>M J?K>V'ՙ?[ >1?Y=. ?o>s&?Y.R¯?޾nթ?M }?n޾ ?>qɾ(? {R?V'K> ?s&o>? {>Rq>\I?n>o?M >?޾n??qɾ>?¯? {??M ?}?KV'? ?[ 1?(?Y.?R1?|?K>V'??o>s&?J? {>??q>>??>n? ?>M ??n?>Rn?d?>? ?>BA?/?Z$I>u?D)r>?I2L,v>6?J(jJW>i?{>?M:>`>h¾>QS>A5>h>`|>M>1>{>iYI>A>QSϕ>I2>&>G=m>p=|>}=i/>p|>Ge>I2|>}>{iYI>M>h¾`&>AQSb>`h¾y?ML ?i{W ?QSA~?I2F?G?|p$?}J?|p=?G=#?I2>y#?}=?i{>W*?M>0?`h>F0?QSA>)?h¾`>$7?M?P=?{i?=?AQS>N6?I2?yC?G?LJ?p|?WJ?}?~C?p=|?FP?G=?W?I2>?$W?}=?JP?{>i?]?M>?c?h>`>yc?A>QS>]?`>h>Wj??M>p?i?{>Fp?QS>A>i??I2>$w??G=P}?|?p=}??}=Nv?|?p??G&??I2+??} ?i?{#_??Mu?`>h¾V?QS>At%?h>`Ŏ?M>?{>i?A>QSڋ?I2>+?G=BY?p=|#_?}=A?p|V?G?I2Ş?}X?{i?M&?h¾`+?AQS ?`h¾#_?Mu?i{V?QSAt%?I2Ů?G?|p?}ڋ?|p=+?G=BY?I2>#_?}=A?i{>V?M>?`h>ž?QSA>X?h¾`>?M?&?{i?+?AQS> ?I2?#_?G?u?p|?V?}?t%?p=|??G=??I2>??}=?ڋ?{>i?+?M>?BY?h>`>#_?A>QS>A?`>h>V?.?v>)? ?k>v?1>?U>1? A?h;S > ?(佌5>d?:1>j?'ٽ: >&>䀾ZJ> E>ݛvUk>]>wwmd>_9>C|B>ww>]Ӿ~>ݛ> EUD>>&Ћ>C|>_9޾Cu>>d`>d= ݨ>cV= -j>=>cV 6>dڽ w>d>нU>䀾&>ݛ E!>ww]Ӿ`>C|_9޾>]Ӿww-j> E龨ݛ>&䀾6>_9޾C|L>d> dڽ*? cVJ?н!> cV=N ? d=n?d>?=? ?&>}? E龨ݛ>;!?]Ӿww>?_9޾C|> ?ww]>J%?ݛ E>.?䀾&>N,?C|_9>w#?d?2?dڽ ?^:?cV ?}9?н?D0?cV= ???d= ?*G?>d?JE?=?s=?>&>NL?ݛ> E>nT?ww>]>R?C|>_9>?J?]>ww>}Y? E>ݛ>;a?&>>_?_9>C|> W?d?>Je? ?d=n? ?cV=Nl??=wc? ?cVr? ?dڽ^z?d?}y??нDp?&>䀾? E>ݛу?]>ww%?_9>C|s}?ww>]ӾX'?ݛ> E|7?>&Z?C|>_9޾?>d?d= ❐?cV= ?=U?cV %?dڽ H?dX'?н?䀾&Z?ݛ E龯j?ww]Ӿ?C|_9޾"S?]Ӿww? E龨ݛѣ?&䀾%?_9޾C|?dX'? dڽ|7? cVZ?н? cV=? d=❰?d>?=U?&>%? E龨ݛ>H?]Ӿww>X'?_9޾C|>?ww]>Z?ݛ E>j?䀾&>?C|_9>"S?d??dڽ ??cV ?%?н??cV= ?X'?d= ?|7?>d?Z?=??>&>?ݛ> E>?ww>]>?C|>_9>U?]>ww>%?>x >up?>>?>v>kl?<,?@>p=?>ҽ=~;>-M=Ţ>)fνI=m>Ip:=>gW>I>顾Y >>ό_=>IžP#>g>־H>Ip>m=>ό>Ҿ}>->~;&W>l=(9{>dH=p>=@K>dH,>lɽ(x>-~;>Ž@I~>Ipmuƞ>g־P>顾IžB>όҾ >Iž顾`>־g>mIp,>ҾόX>~;->(lɽE>dHu>@Ž>>dH=B>(l=>~;->`>@=>mIp>n?־g>[ ?Iž>?Ҿό>%r>顾I>:c?g>(?Ipm>?ό>߅ ?-~;>0?lɽ(>U%?dH>n"?Ž@>R?dH=>(?l=(>"2?->~;>:c/?=@>y&?Ip>m>5?g>>>?>I>0>E2?I>>nB?>g>[K?m>Ip>H?>ό>??~;>->:cO?(>l=(X?>dH=U?@>=߅L?>dH0\?(>lɽUe?~;>-nb?@>ŽRY?m>Iph?>g"r?I>顾:co?>όyf?>Ižu?g>־~?Ip>m0|?ό>ҾEr?->~;7K?l=(.ޅ?dH=j~?=@?dH?lɽ(D?-~;?Ž@B?Ipm?g־?顾Iž7K?όҾV?Iž顾j~?־ga?mIp?Ҿό?~;-?(lɽw?dH?@Ž#v?dH=7K?(l=.ޥ?~;->j~?@=ܟ?mIp>?־g>D?Iž>?Ҿό>B?顾I>?g>?Ipm>7K?ό>V?-~;>j~?lɽ(>a?dH>?Ž@>?dH=>?l=(>w?->~;>?=@>#v?Ip>m>7K?g>>.?>I>j~?ό>>ܿ?I>>?v>>?+|>>?>>?<,?@ּŢ>)fν?;~;>-f%?>ҽc1m>Ip4s<>ό;Q=I>顾e#=>g8;>Iž-=ό>Ҿ;=Ip>m`=g>־]=->~;L==@Q>dH=?>l=([P=dH}(>Ž@M>-~;sB>lɽ(a>Ipmᾰ \>όҾۍ>顾IžJu>g־Q>Iž顾>Ҿόu'>mIpl>־g >~;-9>@Ž>dHX>(lɽ}>dH=%Ӻ>@=Z>~;->>(l=T>mIp>l>Ҿό>B>Iž>9>־g>>顾I>X>ό>F?Ipm>%>g>J>-~;>?Ž@> ?dH>_6 ?lɽ(>r?dH=>Ɯ?=@>?->~;>,?l=(>? ?Ip>m>i?ό>>T&?>I>#?g>> ?I>>_6*?>ό>!z3?m>Ip>Ɯ0?>g>v'?~;>->,7?@>=F@?>dH=i=?(>l=C4?>dHC?@>ŽM?~;>-_6J?(>lɽrA?m>IpƜP?>όY?I>顾,W?>g?M?>Iži]?ό>ҾTf?Ip>mc?g>־ Z?->~;_6j?=@!zs?dH=Ɯp?l=(vg?dH,w?Ž@w#?-~;i}?lɽ(Ct?Ipm?όҾ݉?顾Iž0?g־9?Iž顾cN?ҾόD?mIp?־g?~;-ɴ?@ŽV?dH?(lɽU?dH=0?@=?~;->cN?(l=l?mIp>?Ҿό>w#?Iž>ɴ?־g>!?顾I>?ό>݉?Ipm>0?g>9?-~;>cN?Ž@>D?dH>?lɽ(>?dH=>ɴ?=@>V?->~;>?l=(>U?Ip>m>0?ό>>?>I>cN?g>>l?I>>?>>g?+|>>p?v>>-? A?h;)ֽj?'ٽF`d?Ƚ ?(vP&>䀾_9>C|#]>wwD E>ݛwww>]Ӿ: C|>_9޾;#<>&19:ݛ> EJE>d`<=›u=cV= T=d= PTC|_9޾W#>ww]Ӿ >ݛ E!=]Ӿww+5>_9޾C|W>&䀾?N> E龨ݛ$D.>d^h>н> cV9> dڽWwa> cV=ɍ>=x>d>ӕ> d=EU>&>b>_9޾C|>M>]Ӿww>l/> E龨ݛ>>ww]>9>C|_9>>䀾&>>ݛ E>x>d?ӕ>н?E>cV ?b>dڽ ?">cV= ?l/>=??>d?~?d= ?>>&>?C|>_9>Y?ww>]>J ?ݛ> E>*?]>ww>P?_9>C|>&?&>>? E>ݛ>o?d?>~ ??=V(? ?cV=&? ?d=<? ?cVJ-??н#5?d?P3? ?dڽ +?&>䀾:?_9>C|B?]>ww~@? E>ݛ]8?ww>]ӾF?C|>_9޾YO?>&JM?ݛ> E龢*E?>dPS?=&\?cV= Z?d= oQ?cV ~`?нVh?df?dڽ <^?䀾&Jm?C|_9޾#u?ww]ӾPs?ݛ E k?]Ӿwwz?_9޾C|xF?&䀾?? E龨ݛ]x?dAr?нެ? cVu? dڽQ? cV=؉?=D?d> ? d=?&>??_9޾C|>y?]Ӿww>Ar? E龨ݛ>b?ww]>u?C|_9>?䀾&>ؙ?ݛ E>ȕ?d? ?н?xF?cV ???dڽ ?.?cV= ?Ar?=?ެ?>d?u?d= ?Q?>&>ة?C|>_9>D?ww>]> ?ݛ> E>?]>ww>??>v>߲?>>۴?>x >ծ?/?Z(6?J(S!?I2_)u?DA轍`>h¾X콞?Mږh>`e%A>QSi2򅽞M>NǸI2>}%}=_p=|\^|G=$p|>;<}!=I26 =G+ <{it=AQS۰=h¾`A=Mt=`h¾5t=QSA/ >i{ >ML=I2Mm#>}b>>|p=>GY#>|p=V>}=r>I2>:p>G=V>i{>>QSA>d>`h>>M>`>h¾`>t>AQS>6>{i?@P>M?>I2? >}?>p|?>G?4>p=|?>}=?1j>I2>?t>G=?,>{>i?@P>A>QS>>h>`> >M>?g>`>h>t?QS>A>N ?i?{>S??M>??I2>A??}=?|?p= ??G=}M?|?p??}L"??I2t"??GI?i?{S(?QS>A/?`>h¾A/??M(?h>` 5?A>QSi5?I2>tB?}=NI?p=|SH?G=B?p|AO?}V?I2 U?G}MO?{i\?AQSLb?h¾`tb?MI\?`h¾Sh?QSAo?i{Ao?Mh?I2 u?}|?|p|?Gu?|p=v:?}=Y?I2>m?G=X@?i{>ݠ?QSA> ?`h>Ԋ?M>?h¾`>C?AQS>&t?{i?v:?M?% ?I2?m?}?ڗ?p|?ݠ?G?s?p=|?Ԛ?}=?@?I2>?C?G=?ٚ?{>i?v:?A>QS>Y?h>`>m?M>?X@?`>h>ݠ?1>?U>}? ?k>".?.?v>!#?H0?{I&?\( NV'?K]NF2?AX? {5M ?U"n?޾)|>?qɾw+>n>M D޽ {>нq>>bK>V'^o>s&ܼoY=. WT[ >1 Y.Lۼos&> KV'G[ 1V {NY=n޾zԕ=M T= {=>qɾ7=V'K:=s&o>.Y >1[ N>.Y=P1>s&o>D>V'K>=J>1[ >:> {>׃d>M >Cw>n>p~>>q>#m>޾n?ۋ>M ?;> {?R>qɾ>?+t>KV'?u>os&?1ծ>Y.?A>[ 1? >Y=.?>o>s&?n>K>V'?>[ >1?^> {>?R>>M ?d>>n?u>q>>?@>n?>A>M ?>>? {>>>?q>>V'?K>?s&?o>̝ ?.?Y=)T ?1?[ >:?.?Y?s&?oj?V'?K ?1?[ ?? {\?M ?e7$?n?޾%?>?qɾ!?>n)T,?>M 21? {>2?q>>|.?K>V' 9?o>s&=?Y=.\??[ >1Im;?Y.E?os&̝J?KV')TL?[ 1:H? {R?M jW?޾n Y?qɾ>U?n޾\_?M e7d? {e?>qɾa?V'K)Tl?s&o2q?.Yr?1[ |n?.Y= y?s&o>}?V'K>\?1[ >Im{? {>?M >N?n>*?>q> ?޾n?H]?M ?L? {?{?qɾ>?q?KV'?Ï?os&??Y.??[ 1??Y=.?*?o>s&??K>V'?H]?[ >1?>P? {>?{?>M ??>n?ß?q>>??n?>? ?>ޥ?d?><?(?Ǻ>?\E?;ʽI=?pAXJ>?qg]NH?'N/?黾5 ?־w+?J)|*?㾝U"J>> b>/н>*D޽qg>J>^R>= GG=[F WT > -IܼoGG[FLۼR=VqgJ>G -I> 黾/N<־ Y=JBE=㾌*)=Jzԕ= ־7=/黾=*T=J>qg:==RN>[FGG > -I >[FGG=P1>=R>:>J>qg>=J> -I >D>/>׃d> >#m>J>p~>*>Cw>J?ۋ>־ ?+t>黾/?R>㾌*?;>qgJ>?u>R=? >GG[F?A> -I?1ծ>GG=[F?>R>=?^>qg>J>?> > -I?n>>/?R>> ?@>J>?u>>*?d>?J>A> ?>>/?>>*?>>J>?qg>?=?R>:?[F?GG=)T ? -I? >̝ ?[F?GG?=?R?J>?qg ? -I? j?/?黾\? ?־!??J%?*?e7$?J>)T,?> |.?>/2?>*21?qg>J> 9?R>=Im;?GG=[F\?? > -I=?GG[FE?R=:H?qgJ>)TL? -I̝J?黾/R?־ U?J Y?㾌*jW?J\_? ־a?/黾e?*e7d?J>qg)Tl?=R|n?[FGGr? -I 2q?[FGG= y?=R>Im{?J>qg>\? -I >}?/>? > ?J>*?*>N?J?H]?־ ?q?黾/?{?㾌*?L?qgJ>?Ï?R=??GG[F?? -I??GG=[F?*?R>=?>P?qg>J>?H]? > -I??>/?{?> ??J>?ß?>*???J>?H" ?w>?o -?E><?)?>ޥ?RY?!Oὐ(FrS?X/;3NǸM>+C2;>0;S}% (>T$=i<\\^|p0>]_i<\>;< (T+ <|S6 =p0]!=Mо+Ct=q/;3t=d '+A=;0;۰='+d 5t=;3q/L=+CMо >0;;/ >S|Mm#>T (Y#>i<\=>]p0b>>i<\=V>T (>V>S|>:p>]p0>r>+CM>>;3q/>`>'+d ?>0;;>d>d '+?t>q/;3?>Mо+C?@P>;0;?6>|S? > (T?4>i<\?>p0]?>=i<\?> (>T?,>|>S?t>p0>]?1j>M>+C?@P>q/>;3?g>d ?'+? >;>0;?>'+?d ?t?;3?q/>?+C?M>S?0;?;>N ?S?|>A?T? (>}M?i<\?= ?]?p0>?i<\??T? (I?S?|t"?]?p0L"?+C?MоS(?;3?q/(?'+?d A/?0;?;/?d ?'+ 5?q/>;35?M>+C0;StB? (>TB?=i<\SH?p0>]NI?i<\AO? (T}MO?|S U?p0]V?Mо+C\?q/;3I\?d '+tb?;0;Lb?'+d Sh?;3q/h?+CMоAo?0;;o?S| u?T (u?i<\|?]p0|?i<\=v:?T (>X@?S|>m?]p0>Y?+CM>ݠ?;3q/>?'+d ?Ԋ?0;;> ?d '+?C?q/;3?% ?Mо+C?v:?;0;?&t?|S?m? (T?s?i<\?ݠ?p0]?ڗ?=i<\?Ԛ? (>T?ٚ?|>S?C?p0>]?@?M>+C?v:?q/>;3?X@?d ?'+?m?;>0;?Y?'+?d ?ݠ?2?s!>!#?>?D_>".?:?B>}?Ah?Nn)ֽye?>vPzR19:f?)H;#<@> fPT<´=lT=i8<>ُl›u=´l~=z 7 fz=@OSC!=B8 >f)HW#>8B+5>SCO$D.>zR?N>)HfW> fz 7Wwa>l´9>ُli8<>l´=ɍ> fz 7>EU>ӕ>ُli8<>x>zR>b>SCO?>8B?l/>)Hf?M>B8?9>OSC?x>zR?>f)H?>@z 7 f?">´l?b>i8<ُl?E>´=l?l/>z 7> f?>@>ُl??>zR??O?SC?*?B?8?J ?f?)H?Y?8?B?P?SC?O?o?zR?>?)H?f?&?~ ? f?z 7><?l?´=&?ُl?i8<>V(?l?´J-? f?z 7 +?zRJM?f?)HYO?@> foQ?´=lZ?i8<>ُl&\?´l~`?z 7 f<^?@? ?ُli8<>D?zR>??SCO?b?8B?Ar?)Hf?y?B8?u?OSC?ȕ?zR?ؙ?f)H??@ f?Q?@>ُl?ެ?>zR?ة?O?SC??B?8? ?f?)H?D?8?B???]A?c?ծ?J?e>۴?F?d~?߲?l?$f%r?)J?;hVp?wּo?1#Hc1??e#=RJN? ;Q=D Z?4sD Z`= ?RJN;=??-=?YL]=n= v?>4A>VsQ>$>lL=??>c q[P=$lsB>4AVsM>n v}(>??c qa>?Ju> RJNۍ>D Z \>YLQ>D Z龾l>RJN u'>?>YL > vnX>Vs4A>l$9>c q??}>l$>>Vs4A>Z> vn=%Ӻ>c q??>T>??9>RJN ?B>D Z>l>YL?>D Z?%> RJN?F???X>YL?J>n v?_6 ?4AVs? ?$l????c q?r?$>l?,?4A>Vs??n= v?Ɯ???>c q?? ????#? ?RJN?T&?>D Z?i??YL? ?D Z?>Ɯ0?RJN? ?!z3????_6*?YL??v'? v?n=i=?Vs?4A>F@?l?$>,7?c q???>C4?l?$_6J?Vs?4AM? v?nC?c q???rA???,W?RJN? Y?D Z?ƜP?YL??M?>D Zc? ?RJNTf???i]??YL Z?n= vƜp?4A>Vs!zs?$>l_6j???>c qvg?$li}?4AVsw#?n v,w???c qCt??0? RJN݉?D Z?YL9?D Z龖?RJN D??cN?YL? vn?Vs4AV?l$ɴ?c q??U?l$>cN?Vs4A>? vn=0?c q??>l???ɴ?RJN ?w#?D Z>?YL?!?D Z?0? RJN?݉????YL?9?n v??4AVs?D?$l?cN???c q??$>l??4A>Vs?V?n= v?ɴ???>c q?U????cN? ?RJN??>D Z?0??YL?l?R?>p?cTL?P ?g?????nJ? ?-?1J?5&>?L?Z>?1J?5&>Z?qtC?>똸?8?I>?x,?Z>k1?d ?>?|?R>똸?%q?*>Z? ?[>?%q?*>?|?R> ?d ?>?x,?Z>?8?I>?qtC?> ?wb?Ƴ7l;;_?H4!z=WW?*=.L?_k>LF>?Z ٧>]0?02_k>B$?y ּ=^?b¼!z=!?ڽl;^?b¼IB$?y ּ5Ľ]0?02TLF>?Z  .L?TWW?*5Ľ;_?H4Iq?f=mm? ${=!2k?N=lo?CᲧ=Z?=?? g.=#=?8$">hX?(> g?? >>ZJ%>(>hXWU>8?#=9;> >mmI>>"=v}X>=tE>N>!2kln>"½v|r> mm؅>N!2kߝ>tP>ZX> g?%r>8#=x>(hX髪>? g>>Z龾 >hX(P>#=8E>mm >v"½X>t>!2kN>v"=%r>mm >>>!2kN>"?t=x>Z> >? g?E?#=8??hX(>(? g??R ?Z??(hX?[?8#=?U? mm?y?"½v?߅?t?((?N!2k?""?"=v?E"? >mm?R)?N>!2k?U5?=t?.?>Z?/? g???y6?8?#=?"B?(>hX?[;??? g?߅EB?hX?(>N?#=?8?(H?mm? >RI?v?"=O?t?=[[?!2k?N>UU?v?"½yV?mm? ߅\?!2k?N(h?t?"b?Z?Eb??? gRi?#=?8Uu?hX?(美n? g??o?>Zyv?(>hXa?8?#=[{? >mm߅|?"=v#v?=tw?N>!2kD?"½vV? mm܇?N!2k.ލ?t?Z? g?B?8#=D?(hXa?? g#v?ZV?hX(?#=8w?mm ܗ?v"½?ta?!2kN.ޝ?v"=B?mm >#v?!2kN>w?t=D?Z>V?? g?ܧ?#=8?.ޭ?hX(>? g???Z?B?(hX?D?8#=?a? mm?#v?"½v?V?t??N!2k?w?"=v?ܷ? >mm??N>!2k?a?=t?.޽?>Z?B? g???#v?8?#=?w?(>hX?D??? g?V?JR?0>Y?Q?m>?#=?8??;k? =zf?d 2>ee?z!>T?gC5>s:?IeO>jQ5?C"x>N?#ݾ^>I?s:vh>g>TL>#>N>?jQ5݈>d >zfU>=< p!>x=niUD>/>< p>d zf>/x鷽ni!>g㾙TL>Is:U>jQ5w>#ݾN>s:I!>Tg>N#ݾ!>jQ5UD>zfd >< pD?nix鷽^ ?s ?*?nix=;?Tg>w?s:I???jQ5?n$?N#>?Is:?D ?g㾙T? '?#ݾN?;1?jQ5?^*?d zf?s-?< p?w3?x鷽ni?>?/zf?D@?/>T? G?I?s:?sM??jQ5?*W?#>N?;Q?s:?I?wS?T?g>?Z?N?#>nd?jQ5??^?zf?d >D`?< p?= g?ni?x=;q?^j?< p?sm?zf?d ws?T?#>Nы??jQ5❈?d >zf?=< p?x=ni|7?/>?|7?nix=H?Tg>"S?s:I?U?jQ5?❸?N#>j?Is:??g㾙T??#ݾN?H?jQ5?ѻ?d zf??< p?"S?x鷽ni?j?/zf??/>T??I?s:???jQ5?|7?#>N?H?s:?I?"S?NM?W>?N?jQ5??j?{-^?(23 @>_X?Fg>2N?}{e>T?Y>iG?+վϕ>.?qb>{'?<# >>?˾1>q?.i/>+>iG5>>>:><# ?{'m˧>F>_Xɳ>H=}aϕ>v}= W1>}{>2Ne>H}ab>F_Xi/>}{2Nm>v} W>+վiG5>q.><# {'?˾>:>.qJ?iG+վN?>˾P ?{'<# ?_XF ?}aH~? Wv}L?2N}{?}aH=?_XF>J ?2N}{>'? Wv}= ?iG+>N&?.q?-?{'<# ?3?>>P-?q.?~3?+վiG?9?˾>?@?<# {'?L:?F_X?J@?H}a?NF?v} W?PM?}{2N?G?H=}a?M?F>_X?~S?}{>2N?LZ?v}= W?S?+>iG?Y?q?.?J`?<# ?{'?g?>>?`?.?q?Nf?iG?+>m?>?>s?{'?<# ?Pm?_X?F>~s?}a?H=y? W?v}=BY?2N?}{>Lz?}a?Ht%?_X?FX?2N?}{? W?v}u?iG?+վڋ?.?q ?{'?<# &?>?˾?q?.A?+>iGt%?>>u?<# ?{'BY?F>_XX?H=}aڋ?v}= W?}{>2N?H}a ?F_XA?}{2NBY?v} W&?+վiGt%?q.X?<# {'?˾>u?.qڋ?iG+վ ?>˾&?{'<# ?_XFA?}aHt%? Wv}u?2N}{BY?}aH=X?_XF>ڋ?2N}{>? Wv}=?iG+> ?.q?A?{'<# ?BY?>>&?q.?t%?+վiG?X?˾>??<# {'?u?F_X?ڋ?H}a? ?v} W?&?}{2N??H=}a?A?F>_X?t%?}{>2N?u?v}= W?BY?+>iG?X?q?.?ڋ?<# ?{'??>>??.?q? ?A?bK>h?i9?>DK?{'?<# ?&?@K?ٽ j>JD?/nhĊ>9?Ƒ`Ջ>J@?0˽]s>4?c5>?!^>|?`bo%>+*?TX>!?*>c>4>T>+*>`b>|;>/n>JDh>Ԡ=-#L5>=w@X>Ƒ`>9Ջ>Ԡ-#L^>/nJD*>Ƒ`9;>w@o%>c4>!4b?`b|?T+*_?! ?4c/?+*T?|`bQ,?JD/ng?-#LԠ?w@_!?9Ƒ`?-#LԠ=4b%?JD/n>+?9Ƒ`>Q,.?w@='?4c>/2?!?g8?|`b>:?+*T>4?!?>?c4?4bE?T+*?G?`b|?_A?/nJD?K?Ԡ-#L?/R?w@?T?Ƒ`9?Q,N?Ԡ=-#L?gX?/n>JD?^?Ƒ`>9?_a?=w@?Z?c>4?4be?!??k?`b>|?Q,n?T>+*?g??!?/r?4?c>gx?+*?T>z?|?`b>t?JD?/n>~?-#L?Ԡ=?w@?=?9?Ƒ`>¯?-#L?ԠM?JD?/n?9?Ƒ`\I?w@?(?4?cJ??!}?|?`b¯?+*?T|?!??c>4M?T>+*(?`b>|?/n>JD?Ԡ=-#LJ?=w@|?Ƒ`>9\I?Ԡ-#L}?/nJD?Ƒ`9?w@¯?c4M?!?`b|\I?T+*(?!J?4c}?+*T¯?|`b|?JD/n?-#LԠM?w@(?9Ƒ`?-#LԠ=?JD/n>J?9Ƒ`>|?w@=\I?4c>}?!??|`b>?+*T>¯?!?M?c4??T+*?\I?`b|?(?/nJD?J?Ԡ-#L?}?w@?¯?Ƒ`9?|?Ԡ=-#L??/n>JD?M?Ƒ`>9?(?=w@??c>4??!??J?`b>|?|?T>+*?\I??!?}?@e1?>!X?'?O@>w?|?`b>¯?5?]s>-?]RՋ>h"?EhĊ>*?$ֲ j>O ?X>A ?7o%>l1?V׾^>Э?5>7>A ;>>O >>Э>V>l1*>]R>-Ջ>C=84X>=(5>E>h"h>C84o%>]R-;>Eh"*>(^>O _?7A ?V׾l14b?Э>A 7Q,?O ?Э/?l1V׾ ?-]R?84C_!?(?h"Eg?84C='?-]R>Q,.?h"E>+?(=4b%?O >4?A 7>:?l1V>g8?Э>/2?7A ?_A?O ?G?Э?4bE?V׾l1?>?]R-?Q,N?C84?T?(?/R?Eh"?K?C=84?Z?]R>-?_a?E>h"?^?=(?gX?>O ?g?7>A ?Q,n?V>l1?k?>Э?4be?A ?7>t?O ?>z?Э?>gx?l1?V>/r?-?]R>¯?84?C=?(?=?h"?E>~?84?C(?-?]R\I?h"?E?(?M?O ?|?A ?7¯?l1?V׾}?Э?J?7>A ?>O (?>ЭM?V>l1?]R>-\I?C=84|?=(J?E>h"?C84¯?]R-?Eh"?(}?O (?7A \I?V׾l1?ЭM?A 7澏|?O ¯?Э}?l1V׾J?-]R?84C(?(M?h"E?84C=\I?-]R>|?h"E>J?(=?O >¯?A 7>?l1V>?Э>}?7A ?(?O ?\I?Э??V׾l1?M?]R-?|?C84?¯?(?}?Eh"?J?C=84??]R>-?(?E>h"?M?=(??>O ?\I?7>A ?|?V>l1?J?>Э??A ?7>¯??2>w?V?>!X?l1?V>}?E!?8Y>n??8e>T?,g>9?3 @>d ?81>O>Sɾ>h>b>+?8ϕ>S>Om˧>8>d :>8>+5>>hi/>?8>ne>Sx=1>;i=hϕ>,>Tɳ>Sx>?8nm>,Ti/>;ihb>8d :>SɾO?h>8+5>OSɾ?d 8P ?+8N?h征J?n?8?SxL?h;i~?T, ?Sx= ?n?8>'?T,>J ?h;i=?d 8>P-?OS>3?h征>-?+8>N&?SɾO>L:?8d ?@?8+?9?h>~3??8n?G?Sx?PM?;ih?NF?,T?J@?Sx=?S??8>n?LZ?,>T?~S?;i=h?M?8>d ?`?S>O>g?>h>J`?8>+?Y?O>S>Pm?d ?8>s?+?8>m?h>>Nf?n??8>Lz??Sx=BY?h?;i=y?T?,>~s??Sxu?n??8?T?,X?h?;it%?d ?8?O>Sɾ&?h> ?+?8ڋ?S>OBY?8>d u?8>+t%?>hA??8>n?Sx=?;i=hڋ?,>TX?Sx&??8nBY?,TA?;ih ?8d u?SɾO?h徧X?8+t%?OSɾ?d 8&?+8 ?h征ڋ?n?8BY?Sxu?h;it%?T,A?Sx=?n?8>?T,>ڋ?h;i=X?d 8>&?OS>BY?h征>A?+8> ?SɾO>u?8d ??8+?X?h>t%??8n??Sx?&?;ih? ?,T?ڋ?Sx=?BY??8>n?u?,>T?t%?;i=h?A?8>d ??S>O>?>h>ڋ?8>+?X?O>S>&?r ?<>DK??>h?h>> ?O?7x!>d=?"D>K>[-2>xe ?` =$o>@^>>C"x>>jeO>ķ>d{C5>>ؾ݈>@>$o>d{>ķ뾈L>j>ξvh>">d=w>O[= UD>Q=!>[->KU>O[ !>"d=>[-K>Q>@$o>ؾw>jξU>d{ķ뾈L>ؾUD>$o@!>ķd{>ξj!>d="n? O[^ ?QD?K[-> O[=;?d=">*?K[->s ?Q= ?$o@>?ؾ>n$?ξj>??ķd{>w?>^*?@$o>;1?d{ķ> '?j>D ?"d=?*7?O[ ?>?Q?w3?[-K>s-?O[= ?nD?">d=?^J?[->K>D@?Q=??:?@>$o>;Q?>>*W?j>>sM?d{>ķ> G?>>^?$o>@>nd?ķ>d{>?Z?>j>wS?d=?">^j? ?O[=;q??Q= g?K>[->D`? ?O[*w?d=?"~?K>[-ws??Qsm?$o>@|7?>j?>j"S?ķ>d{?z?>ؾ❈?@>$oы?d{>ķ뾈?j>ξU?">d=H?O[= |7?Q=?[->K?O[ j?"d=❘?[-KU?Q"S?@$oћ?ؾH?jξ?d{ķ뾈?ؾ|7?$o@j?ķd{"S?ξj?d="❨? O[ѫ?Q?K[-U? O[=H?d=">|7?K[->?Q=?$o@>j?ؾ>❸?ξj>U?ķd{>"S?>ѻ?@$o>H?d{ķ>?j>?"d=?|7?O[ ?j?Q?"S?[-K>?O[= ??">d=??[->K>?Q=?U?@>$o>H?>>|7?j>>?d{>ķ>?>>j?{>>N?=>|z>?>j>"S?Gh?vᲧ=>=)>)(${=:?Z҅=&>@[s>>$">l>ˠ.=>Vn=>Ǿ9;>@[s>&WU>Vn>߾J%>ˠ>lþ >>ln>ZcJ=7qE>F==}X>)(>)I>>ZcJ7qP>ߝ>)()؅>F=|r>@[s&髪>Ǿx>ˠlþ%r>Vn߾X>ǾE>&@[sP>߾Vn >lþˠ>>>7qZcJ>=FX>))(>7qZcJ=x>>"?))(>>>=F=%r>&@[s>(?Ǿ>?lþˠ>E?߾Vn> >>U?@[s&>[?Vn>?ˠl>R ?>""?ZcJ7q?((?F=>߅?)()>y?ZcJ=7q?.?>>U5?)(>)>R)?F==>E"?@[s>&>[;?>>"B?ˠ>l>y6?Vn>>/?>>(H?&>@[s>N?>Vn>EB?l>ˠ>߅>UU?7q?ZcJ=[[?=>F=O?)>)(>RI?7q?ZcJ"b?>(h?)>)(߅\?=>FyV?&>@[sn?>Uu?l>ˠRi?>VnEb?>Ǿ[{?@[s>&a?Vn>߾yv?ˠ>lþo?>D?ZcJ=7qw?F==#v?)(>)߅|?ZcJ7q?.ލ?)()܇?F=V?@[s&a?ǾD?ˠlþB?Vn߾?Ǿw?&@[s?߾VnV?lþˠ#v?.ޝ?7qZcJa?=F?))(ܗ?7qZcJ=D?>w?))(>#v?=F=B?&@[s>?Ǿ>.ޭ?lþˠ>ܧ?߾Vn>V?>a?@[s&>D?Vn>B?ˠl>?>w?ZcJ7q??F=>V?)()>#v?ZcJ=7q?.޽?>>a?)(>)>?F==>ܷ?@[s>&>D?>>w?ˠ>l>#v?Vn>>B?>>?K>c>? >R>Y?l>ˠ>V?:?Z҅M)>)(<^<>~Gh?v"qE>Vnu=l>ˠn7=>t<&>@[s]ˠ>lþj=Vn>߾ԝ=@[s>&㾎=>Ǿ*=)(>) >F=='>ZcJ=7q=>=F=A>)()QZ>-*>ZcJ7q>Vn߾Nt>ˠlþB>Ǿa]>@[s&AD>lþˠ>߾Vnۍ>&@[sJ>Ǿtw>))(Z>=Fu'>7qZcJ >T>=F=B>))(>>>}>7qZcJ=>߾Vn>ۍ>lþˠ>Z>Ǿ>T>&@[s>J>ˠl>u'>Vn>!z?@[s&>>> >)()> ?F=>F?ZcJ7q?C?>}>F==>T?)(>)>?>>r?ZcJ=7q? ?Vn>>!z#?ˠ>l>)?>>??@[s>&>v?l>ˠ>F0?>Vn>T6?&>@[s> *?>>C$?)>)(>=?=>F=!zC?7q?ZcJ=v7?>>r1?=>FI?)>)(FP?>CD?7q?ZcJ?=?>VnTV?l>ˠ]?>rQ?&>@[s J?ˠ>lþ!zc?Vn>߾i?@[s>&?]?>ǾvW?)(>)Fp?F==Tv?ZcJ=7q j?>Cd?F=}?)()?vw?ZcJ7qrq?Vn߾D?ˠlþw#?Ǿ!?@[s&?}?lþˠV?߾Vn݉?&@[s9?ǾU?))(?=FD?7qZcJ?l?=F=w#?))(>V?>U?7qZcJ=!?߾Vn>݉?lþˠ>?Ǿ>l?&@[s>9?ˠl>D?Vn>w#?@[s&>!?>?)()>V?F=>݉?ZcJ7q?9?>U?F==>?)(>)>D?>>?ZcJ=7q?l?Vn>>w#?ˠ>l>V?>>U?@[s>&>!?l>ˠ>݉? >R>ϐ?K>c>8?>>9?xe ?`򌽻걽K>[-˞d=?"DO?7xķ>d{ 1W>jH>މ$o>@Rj>ξC&d{>ķQ<@>$oލ>ؾU-[->KhB=Q={g=O[= [=">d=;Q=[-K="d=U=O[ Cl=d{ķ뾊>jξ$0>ؾ>@$oG=ξj3J>ķd{Wc>$o@;>ؾWw!>K[-f}>QE> O[$Dn>d="T>Q=M>K[->>d=">> O[=>ķd{>>ξj>x>ؾ>EU>$o@>x>j>E>d{ķ>M>@$o>>>">[-K>>Q?>O[ ?x>"d=?>Q=?x>[->K>#?">d=?">O[= ?EU>d{>ķ>& ?j>>?>>]?@>$o>o?>j>V?ķ>d{>Y?$o>@>*?>><?K>[->#%??Q=&,? ?O[=o!?d=?"> ??Q2?K>[-V8?d=?"<.? ?O[](?ķ>d{Y??>j#E?> ;?$o>@*5?j>ξ&L?d{>ķR?@>$o]H?>ؾoA?[->KVX?Q=Y_?O[= *U?">d=ެ?d=">Q? O[=b?ķd{>?ξj>D?ؾ>?$o@>ȍ?j>xF?d{ķ>y?@$o>b?>.?[-K>ެ?Q??O[ ?ȝ?"d=?Q?Q=?D?[->K>xF?">d=?.?O[= ??d{>ķ>y?j>>ެ?>>Q?@>$o>b?>j>?=>|z>?{>>.?>>ȭ?9? T?,8n??8A5E!?8&7+?8+h> $ϽO>Sɾ d ?8c>h8>+F{Q8>d -S>O`ҽ,>T)ּ;i=hϕSx=8㼦?8>nW;iho<,TTH=?8na|d 8k=OSɾ8=T,2>h;i/K>Sx&i0>n?8>h;i=:e>T,>b~>n?8>Yc>Sx=J>+8>6>h征>>OS>g>d 8>5}>h>Х>8+?d>8d ?`>SɾO>4>,T?1j>;ih?6>Sx?>?8n?,α>;i=h?>,>T?>?8>n?4>Sx=?g>8>+?d>>h>1j>S>O>,>8>d ?`>h>>?+?8> ?d ?8>?O>S>>T?,>L?h?;i=N??Sx=?n??8>I ?h?;i?T?,&?n??8}M??Sx?+?8,?h>L2?O>SɾI,?d ?8%?>h徲N9?8>+??8>d 8?S>O2?,>TF?;i=hL?Sx=E??8>n}M??;ihLR?,TNY??8nR?SxIL?8+_?hf?SɾO}M_?8d X?h征l?+8Lr?d 8Il?OSɾe?T,Ny?h;i?Sxx?n?8r?h;i= ?T,>@?n?8>ق?Sx=}M?+8>&t?h征>Y?OS>X@?d 8>% ?h>ڏ?8+? ?8d ??SɾO>s?,T?@?;ih?&t?Sx?% ??8n?ْ?;i=h?Y?,>T?ڟ??8>n?s?Sx=?X@?8>+? ?>h>@?S>O>٢?8>d ??h>>&t??>d?r ?<>1?O>S>% ?*?$ֲ؍Gh"?EH-?]RJR5?5PЭ?j"/l1?V׾шA ?7澪O ?C8V>l1n>Э;Ľ>O ׽7>A ~E>h"x=(-(FEh";]R-¯C84OЭS(c>84C>-]R=(=C7>h"E>P>-]R>NG>84C=#->Э>/wj>l1V>d>A 7>z>O >V`>V׾l1?1Վ>Э?>O ?ږ>7A ? >Eh"?n>(?;>C84?+t>]R-?^>=(?d>E>h"?1>]R>-? >C=84?@>>Э?>V>l1?n>7>A ?^>>O ?>l1?V>;>Э?>2?O ?>@>A ?7>+t>h"?E>j?(?= ?84?C=Im ?-?]R>?(?e7?h"?E̝?-?]R:?84?C?Э?2!?l1?V׾j'?A ?7%?O ?|?V>l1-?>Эe74?>O 1?7>A Im+?E>h"̝:?=(2A?C=84|>?]R>-:8?(jG?Eh"M?]R-ImK?C84E?Эe7T?V׾l1̝Z?7A :X?O Q?l1V׾2a?Эjg?O e?A 7|^?h"Em?(e7t?84Cq?-]RImk?(=̝z?h"E>?-]R>|~?84C=:x?Э>L?l1V>?A 7>?O >q?V׾l1??Э?N?O ? ?7A ??Eh"??(?L?C84?q?]R-?>P?=(??E>h"??]R>-??C=84??>Э?N?V>l1??7>A ?>P?>O ? ?l1?V>L?V?>%??2>{?A ?7>q?J@?0˽5P9?Ƒ`JRJD?/nH@K?ٽ؍G+*?TC8|?`b?!ш4?cj"/`b>|~T>+*׽c>4;Ľ!?nƑ`>9=w@bԠ=-#LJDxw@OƑ`9¯/nJD;Ԡ-#LFT+*Kܠ<`b|6=!]=c4S<|`by=+*T=4c_=!,=9Ƒ`=w@>-#LԠc>JD/n>w@=#->9Ƒ`>NG>JD/n>P>-#LԠ=C7>+*T>V`>|`b>z>!?d>4c>/wj>`b|? >T+*?ږ>c4?>!?1Վ>Ƒ`9?^>w@?+t>Ԡ-#L?;>/nJD?n>=w@?@>Ƒ`>9? >/n>JD?1>Ԡ=-#L?d>T>+*?>`b>|?^>!??n>c>4?>|?`b>+t>+*?T>@>4?c>2??!?;>9?Ƒ`>?w@?=Im ?-#L?Ԡ= ?JD?/n>j?w@??9?Ƒ`:?JD?/n̝?-#L?Ԡe7?+*?T|?|?`b%??!j'?4?c2!?`b>|Im+?T>+*1?c>4e74?!?-?Ƒ`>9:8?=w@|>?Ԡ=-#L2A?/n>JD̝:?w@E?Ƒ`9ImK?/nJDM?Ԡ-#LjG?T+*Q?`b|:X?!̝Z?c4e7T?|`b|^?+*Te?4cjg?!2a?9Ƒ`Imk?w@q?-#LԠe7t?JD/nm?w@=:x?9Ƒ`>|~?JD/n>?-#LԠ=̝z?+*T>q?|`b>?!??4c>L?`b|??T+*? ?c4?N?!??Ƒ`9?>P?w@?q?Ԡ-#L?L?/nJD??=w@??Ƒ`>9??/n>JD??Ԡ=-#L??T>+*? ?`b>|?>P?!???c>4?N?|?`b>q?'?O@>{?@e1?>%??!?L?T?&72N?}{A5_X?F8{-^?(2 >?˾c{'?<# .?q $ϽiG?+վ+<# ?{'`ҽ>>-+>iGF{Qq?.}{>2NWv}= W8H=}aϕF>_X)ּv} W]2}{2Na|A=<# {'=q.u=+վiG]B={'<# 8=>˾k=iG+վm>.qĨ=2N}{> Wv}&i0>}aH/K>_XF2> Wv}=J>2N}{>Yc>_XF>b~>}aH=:e>>>5}>{'<# ?g>.q?>iG+>6><# {'?4>˾>?`>+վiG?d>q.?Х>}{2N?,α>v} W?>H}a?6>F_X?1j>v}= W?g>}{>2N?4>F>_X?>H=}a?>>>?`><# ?{'?,>q?.?1j>+>iG?d>{'?<# ?>>?>?iG?+> ?.?q??2N?}{>I ? W?v}=?}a?H=N?_X?F>L? W?v}?2N?}{}M?_X?F&?}a?H?>?˾%?{'?<# I,?.?qL2?iG?+վ,?<# ?{'2?>>8?+>iG??q?.N9?}{>2N}M??v}= WE?H=}aL?F>_XF?v} WIL?}{2NR?F_XNY?H}aLR?˾>X?<# {'}M_?q.f?+վiG_?{'<# e?>˾Il?iG+վLr?.ql?2N}{r? Wv}x?}aH?_XFNy? Wv}=}M?2N}{>ق?_XF>@?}aH= ?>>% ?{'<# ?X@?.q?Y?iG+>&t?<# {'?s?˾>??+վiG? ?q.?ڏ?}{2N?ْ?v} W?% ?H}a?&t?F_X?@?v}= W?X@?}{>2N?s?F>_X?ڟ?H=}a?Y?>>??<# ?{'?٢?q?.?@?+>iG? ?{'?<# ?% ?i9?>1?A?bK>d?.?q?&t?ee?zNލg>TQzfhB=x鷽niCl=/Is:$0>g㾙T>jQ5Ww!>N#ݾ;>TgWc>s:I3J>nix鷽$Dn>< pE>zfd f}>nix=>>zfd >>< p=M>N#>x>jQ5?EU>s:I?x>Tg>>jQ5?">#ݾN?>g㾙T?M>Is:?E>/x鷽ni?x>< p?>d zf?>x=ni?EU>/>d >zf?#?=< p?x>#>N?o??jQ5?]?I?s:??g>T?& ?jQ5??<?N?#>*?T?g>Y?s:?I?V? ?ni?x=o!?< p?=&,?zf?d >#%?ni?x鷽](?N]H?g>TR?I?s:&L?/>zfVX?x鷽ni [?/Q?zfd >ެ?< p=y?N#>ȍ?jQ5??s:I?D?Tg>?jQ5?.?#ݾN?b?g㾙T?y?Is:?xF?/zf?xF?=< p?D?#>N?b??jQ5?Q?I?s:?ެ?g>T?y?jQ5??ȭ?.?NM?W>?s:?I??mm? <^Zԝ= g??j=8?#=*=(>hX="=v'> >mm >N>!2k==t= mmQZ>"½vA>t>N!2k-*> g?B>ZNt>(hXAD>8#=a]>Zۍ>? g>#=8tw>hX(J>v"½u'>mm Z>!2kNT>t >mm >>v"=B>t=>!2kN>}>? g?Z>Z>ۍ>hX(>J>#=8?T>Z?!z? g??u'>8#=? >(hX?>"½v?F? mm? ?N!2k?}>t?C? >mm??"=v?T?=t? ?N>!2k?r? g???)?>Z?!z#?(>hX?v?8?#=???Z?>T6??? g?F0?#=?8?C$?hX?(> *?v?"=!zC?mm? >=?!2k?N>r1?t?=v7?mm? FP?v?"½I?t??=?!2k?NCD??? g]?Z?TV?hX?( J?#=?8rQ?>Zi? g??!zc?8?#=vW?(>hX?]?"=vTv? >mmFp?N>!2kCd?=t j? mm?"½v}?trq?N!2kvw? g?w#?ZD?(hX?}?8#=!?Z݉?? gV?#=8U?hX(9?v"½D?mm ?!2kNl?t?mm >V?v"=w#?t=!?!2kN>U?? g??Z>݉?hX(>9?#=8?l?Z?w#? g??D?8#=??(hX?!?"½v?݉? mm?V?N!2k?U?t?9? >mm?D?"=v??=t?l?N>!2k?? g???V?>Z?w#?(>hX?!?8?#=?U?JR?0>ϐ??? g?݉?#=?8?9?Q?m>8? Ar?/ / ?]]/ ?]]?@?@^^@0 ^^0 0  c c cs $s $s RR$4 RR4 4     g g_ gw (w (?w VV(8 VV8  8       k k k { { , { , ZZ, < ZZ<  <     o _o o  B  B``B2 ``@2 2 q q q `     >  > \\> . \\} . } . } m  m m          :  : XX: *XXy *y @*y ii i `    6 6 TT6 &TT&u &u u ee e       1  1 !__1 A_A  A      3 "  3 aa3 CaC !!C        5 #  5 cc5 EcE ""E            7 7 $ ee7 GGe ##G            9  9 %gg9 IIg $$I       ; &  ; ii; KiK %%K      = '  = kk= MkM &&M      ? ? ( mm? OOm ''O        A  A )ooA QQo ((Q          C *  C  qqC  Sq  S ))S                 "      "" E +  E  ssE   Us  U **U    "" !!  !  % %%G ,  G uuG WuW ++W " %% $$  $   (   (( I  I -wwI YYw ,,Y %  ((    ''   '  +   ++K .  K yyK [y[ --[ (  ++    **   * . ..M /  M {{M ]{] ..] + ..--   -  1  ! ! 11 O 0  O !}}O !_}!!_ //_ . #"#"11"#00#$ # 0# $4$%$%$ 44$ Q  Q 1%Q %"%a%a 00a" "1 &''&44&'33'( ' 3' (7(()() 77(S 2  S )S  )& c)) c  1 1c & &4 *++ * 7 7*  +66  + ,  + 6+  ,: , ,-,-  ::, U 3  U  - U  -* e-- e  2 2e * *7 .//.::./99/0 / 9/ 00=0110 ==0W  W 4 1W 1.g1g1 33g. .: 3232==23<<34 3 <3" 4@""45454 @@4 Y  Y 55Y 525i5i 44i 2 2=6776"@@6!"!"7??!78 7 ?7% 8C%%88989 CC8[ 6  [ 9[ 96k99k 55k6 6@ :;;:%CC:$%$%;BB$;< ; B;( <F((<<=<= FF<] 7  ] =] =:m==m 66m: :C > ??>(FF>'('(?EE'?  @ ? E?+ @+@I+@ AA @  I I@ _  _ 8  A_ !A  >!!oAoA! 7!7o!> >F C"BCB "+I"IB+"*+*"CHH*"#C # D# C HC#. #DL..#DE$DED $ LLD$ $a  a 9$E$a %E % BE%qEq% 8%8q %B BIF GG&F&.L&LF&-.-.&GKK-&'G ' H' G KG'1 'HO11'H(HIH I(! OOH(c :! ! (c (I(c )I  F)sII)s) 9)9s)F FL J KK*J*1O*OJ*0101*KNN0*+K + L+ K NK+4 +LR44+L,LML M,$ RRL,e ;$ $ ,e ,M,e -M  J-uMM-u-! :-:u-J! JO! N OO.N.4R.RN.3434.OQQ3./O / P/# O# QO/7# /PU77/P0PQP Q0' UUP0g <' ' 0g 0Q0g 1Q  N1wQQ1w1$ ;1;w1N$ NR$ S2RSR27U2UR267672STT623S3T3& S& TS3:& 3TX::3TU4TUT4* XXT4* 4i * i =4U4i 5U5RU5yUy5' <5<y5R' RU' VWW6V6:X6XV69:9:6WWW967W7X7) W) WW7=) 7X[==7X8XYXY8- [[X8k >- - 8k 8Y8k 9YV9{YY9{9* =9={9V* VX* Z[[:Z:=[:[Z:<=<=:[ZZ<:;[;\;, [, Z[;?, ;\]??;\<\]\]/ ]\\</ <m ?<?/ <]<m =]Z=}]]=}=- >=>}=Z- Z[- >^>_>B^B`^>A  B>__AA>_?_?`_?1 _1 _?D!?!1 D?`D`ba@`a`@4 b@b`4 @p 4 p A@a@p Aa^AaaAA2 @A@A^2 ^`2 cBbcbBDbBbbDBCDC!BcaBaCCcCdC3 c3 acCF""3 CddFFCdeDdedD6 dDdd6 Dr 6 r BDeDr EeEbeEeE4 AEA4 Eb4 bbfggFfFFdFdfFEFE"FFgccEFGghGG5 g5 cgGH##5 GGhHhfHhiiHhH8 fHfhHt 8 t C8 Hit HIiIfIiiI6 BIB6 If6 fdJjkjkJHffjJG#HHJGJkeJeGKklK7 ekkK7 KJ$K$7 KlJlhJlmmLlL: hLhlLv : v D: Lmv LMmMjMmmM8 CCMjf8 8 MjoNnonNJhNhnJNIJI$NogNgIOoOpoO9 o9 gOL%O%9 LOpLpjqPpqpP< jPjp< Px < x EPqPx QqQnqQqQ: DQD: Qn: nhsRrsrRLjRjrLRKLK%RsiRiKSsStS; s; isSN&&; StlNNStuTtutT> lTlt> Tz > z FTuTz UuUruUuU< EUE< Ur< rjvwwVvVNlVlvVMNM&NVwkkMVWwxWW= w= kwWP''= WWxPxnPxyyXxX@ nXnxX| @ | G@ Xy| XYyYvYyyY> FYF> Yv> vlZz{z{ZPnnzZO'PPZOZ{mZmO[{|[? m{{[? [R([(? [|R|pR|}}\|\B p\p|\~ B ~ HB \}~ \]}]z]}}]@ GG]zn@ @ ]z^~~^Rp^p~R^QRQ(^o^oQ___A A o_T)_)A T_Tr``D r`rD ` D I`` aa~aaB HaHB a~B ~pbbTrbrTbSTS)bqbqScccC C qcV**C ctVVcddF tdtF d F Jdd eeeeD IeID eD rffVtftfUVU*VfssUfgggE E sgX++E gvXXghhH vvh KH H h hh iiiiF JiJF iF tjjXvjvjWXW+XjuuWjkkkG G ukZ,,G kxZZkllJ xxl LJ J l ll mmmmH KmKmH vH nnZxnxZnYZY,nwnwYoooI I wo\-o-I \o\zppL zpzL p L Mpp qqqqJ LqLJ qJ xrr\zrz\r[\[-ryry[sssK K ys^..K s|^^sttN |t|N t N Ntt uuuuL MuML uL zvv^|v|v]^].^v{{]vwwwM M {w`//M w~``wxxP ~~x OP P x xx yyyyN NyNN yN | zz`~z~z_`_/`z}}_z{ { {O O }{b00O {bb{| |R | PR R | || }  }}}P O}O}P ~P ~!~b~b~aba0~~a!!Q Q d11Q dd!T T  T Q !!R PPR R "ddcdc1c""S S f22S ff"V V  V R ""T QQT T #fefe2fe##U U h33U hh#X  X  SX  ##V RRV V $hg3hhgg$$W W j44W jj$Z  Z  TZ  $$X SSX X %jjiji4i%%Y Y l55Y ll%\ \  \ U %%Z TTZ Z &llklk5k&&[ [ n66[ nn&^ ^  ^ V &&\ UU\ \ 'nmnm6nm''] ] p77] pp'`  `  W`  ''^ VV^ ^ (po7ppoo((_ _ r88_ rr(b  b  Xb  ((` WW` ` )rrqrq8q))a a t99a tt)d d  d Y ))b XXb b *ttsts9s**c c v::c vv*f f  f Z **d YYd d +vuvu:vu++e e x;;e xx+h  [h h   ++f ZZf f ,xwxw;xw,,g g z<<g zz,j  \j j   ,,h [[h h -zzyzy<y--i i |==i ||-l l  l ] --j \\j j .||{|{={..k k ~>>k ~~.n n  n ^ ..l ]]l l /~}~}>~}//m m ??m //o o  __o   //n ^^n n 00@@00p p AAp 0s s  s a 00q ``q q 1A11r r BBr 1u u  u b 11s aas s 2B22t t CCt 2w  w  cw  22u bbu u 3C33v v DDv 3y  y  dy  33w ccw w 4D44x x EEx 4{ {  { e 44y ddy y 5E55z z FFz 5} }  } f 55{ ee{ { 6F66| | GG| 6    g  66} ff} } 7G77~ ~ HH~ 7   h  77 gg  8H88  II 8    i 88 hh  9I99  JJ 9    j 99 ii  :J::  KK :  k    :: jj  ;K;;  LL  ;   l      ;;   kk      < L  <<     MM       <     m   <<    ll   =M==  NN =    n == mm  >N>>  OO >  o    >> nn  ?O??  PP ?  p    ?? oo  @P@@  QQ @    q @@ pp  AQAA   RR   ! ! A     r! !AA!! qq  #"#"B"R##BB$ ## SS $$$B%%$ $  s % %BB"%% rr " "&'&C'&S''CC( '' TT (((C))( (  t )  )C C& ))  ss &  &+ *+*D  * T +  +D D,+  +  U U  ,,- ,-,D   ,   u -   -D D*- -  t t * */./.E.U//EE0/ / VV 001010E 0   v1 1EE.11 uu . .3232F2V33FF4 33 WW 444F554 4  w 5   5FF255  vv 2 2676G76W77GG8 77 XX 888G998 8  x 9   9GG69 9 ww6  6;:;:H:X;;HH<; ; YY <<=<=<H <   y=   =HH:==  xx : :?>?>I>Y??II@? ? ZZ @@A @A@I   @   z A  !AI!I>A!A! y!y !> >C"BCBJ""B"Z"C"#CJ#JD# C C#[[ #D#D$DEDJE$ D$ {  $ $E$ %EJ%JBE%E% z%z %B BFKGG&F&&F&[&G&'GK'KH' G G'\\ 'H'H(HIHKI( H( |  ( (I( )IKKF)II)) {){)F F K*JKJL**J*\*K*+KL+LLK+ K +]+] +LLM,LMLL, ,L ,  },M, -ML-LJM-M- |-| -J JO.NONM..N.].O./OM/MPO/ O /^/^ /PPQ0PQPM0 0P 0  ~0Q0 1QM1MNQ1Q1 }1} 1N NRNSS2R22R2^2S23SN3NT3 S S3__ 3T3T4TN4NUT4 T 4 4  4U U5UNNR5U5U5 ~5~ 5R R6VO6OWV6V6`6`6WW7WO7OXW7 W 7a7a 7XXY8XYXO8 8X8  8Y 89YO9OV9YY9 9V  9V[:Z[ZP::Z:a:[:;[P;P\[; [ ;b;b ;\\]<\]\P< <\< < <] ] =]P=PZ= =]=  = =Z Z_>^_^Q>>^>b>_>?_Q?Q`_? _ ?c?c ?``a@`a`Q@ @`@ @ @a a  AaQAQ^A A aA     A^ ^cBbcbRBBbcBBcBCcRRdC ccC CdCd CddeDdedRD DdD D De e" EeRERbE "E"eE     Eb bgFfgfSFFfFdFgFGgSGShgG g GeGe GhhiHhihSH HhH  Hi$$ HIiSISfI i $iI  I If fkJjkjTJJjJeJkJKkTKTlkK k KfKf KllmLlmlTL LlL  Lm&  LmMmTMTjM &&mMM  M Mj joNnonUNNnNfNoNOoUOUpoO o OgOg OppqPpqpUP PpP  Pq(  PqQqUQUnQ ((qQ  Q  Qn nsRrsrVRRrgRRsRSsVVtS ssS ShSh SttuTtutVT TtT  Tu*  TuUuVUVrU **uU  U  Ur rwVvwvWVVvVhVwVWwWWWxwW w WiWi WxxyXxyxWX Xx  X Xy,X, YyWYWv ,yyY Y Y  Yv v{Zz{zXZZzZiZ{Z[{X[X|{[ { [j[j [||}\|}|X\ \|\  \}.  \}]}X]Xz] ..}]] ]  ]z z^~~Y^^~^j^^_Y_Y_  _k_k _`Y` ``  `0  `aYaY~a 00a   a  a~ ~bZbbbkbbcZcZc  cll ccdZd dd  d2  deZeZe 22e   e  e f[ffflffg[g[g  gmgm gh[h h  h h4h4 i[i[ 4i i i  i j\jjjmjjk\k\k  knkn kl\l ll l l 6 m\m\m 6m6m m  m n]nnnnnno]o]o  oooo op]p pp p p 8 q]q]q 8q8q     q r^rrrorrs^s^s  spp sst^t tt t t : u^u^u :u:u     u v_vvvpvvw_w_w  wqwq wx_x xx  x<< xy_y_y  <y  y y z`zzzqzz{`{`{  {r{r {|`| || | | > }`}`} >}>}  } } ~a~~~r~~aa  ss a    @ aa" @@ "  "   bsbb  tt b    B bb$ BB $  $   ctcc  uu c   DD cc& & D &   dudd  vv  d    F  dd( FF (   e  v  ee  ww  e    H  ee* HH * *     f  w  ff  xx f   J  ff, JJ , ,     gx  gg  yy g    LL gg. L.  .   hyhh  zz h   N  hh0 NN 0   izii  {{ i "  P" " ii2 PP 2 2    j{jj  || j $  R$ $ jj4 RR 4 4    k|kk  }} k &  & TT& kk6 T6  6   l}ll  ~~ l (  ( V( ll8 VV 8   m~mm   mm  *  * * Xm: XX :  :   nnn     n  -  [[- nn= = [ =   oo       o    !! oo  !/  / / ]o? ]]?  ?  pp  !       p     ## pp  #1  1 1 _pA __A  A !! qq  #  "  q ""   %% qq  %3  3 3 aqC aaC  C ## rr  %    $$ r $   '' rr  '5  c5 5 rE cc E E  %% ss  '   && s &   )) ss  )7  7 7 esG eeG  G '' tt  )   (( t (   ++ tt  +9  9 9 gtI ggI  I )) uu  +   * u **  -- uu  -;  ; ; iuK iiK  K ++ vv  -    ,, v  ,  // vv  /=  k= = vM kk M M  -- ww  /    .. w  .  11 ww  1?  ? ? mwO mmO  O  // xx  1    00 x  0    33 xx  3A  A A oxQ ooQ  Q  11 yy  3   2 y 22    55 yy  5C  C C qyS qqS  S  33 zz  5    44 z  4  77 zz  7E  E sE zU ss U  U 55 {{  7    66 {  6  99 {{   9G  G  G u  {W uu W  W 77  ||     9     88     |  8     ;;  ||     ;I  I  I w    |Y ww Y  Y  99 }}  ;  :  } ::   == }}  =K  K K y}[ yy[  [ ;; ~~  =    << ~ < !  ??! ~~  ?M  M {M ~] {{ ]  ] == ! ! ? ! !  >>  > #  AA#   AO  O O }_ }}_  _  ?? # # A" # # " @@"  @ %   % CC%   CQ  Q Q a a  a  AA % % C$ % B$ $    BB'   '  EE'  !    ES  S !S !!!c !c  c  CC "#"' "' E& ' ' & #DD& $#$# D## )  $GG) $%$ $ GU  %U U %%"%"e % e e  "EE &'&) &) G( ) ) ( 'FF( ('(' F'' +  (II+ ()( ( IW  W )W )& )&) g  )g  g   &G G  * +* + *+ I* + + *  +H H* , +,+ H++   -  -   ,K K-  , -,  , K Y   Y -Y -* -*- i  -i  i   *I I ./.- .- K, - /, /J, 0/0/ JJ//  /  0MM/ 010 0 M[  [ 1[ 1.1.1k 1k  k  .KK 232/ 2/ M. / . / 3LL. 4343 3 L31  4OO1 454! 4! O] ! 5] ] 55252m 5 m m  2MM 6761 61 O0 1 0 1 7NN0 8787 7 N73  8QQ3 898# 8# Q_ # _ 9_ 96969o 9o ! o ! 6OO! :;:3 :3 Q2 3 2 3 ;PP2 <;<;" ;" P;5 " 5 " <SS5 <=<% <% Sa % a =a =:=:=q =q # q # :QQ# >?>5 >5 S4 5 ?4 ?R4 @?@?$ RR?7 $ 7 $ @UU7  @ A@ ' @' U c  ' c Ac A>!A>A!s !As !% s % !>S!S% "B"CB"7 B7 U"6 7 6 7 "CTT6 "D#CDC#& C& TC#9 & ##DW#W9 $D$ED$) D) W$e $) $Ee Ee EBB%E%u %E%' u ' u %BUU' %&F&GF&9 F9 W&8 9 8 9 &GVV8 &H'GHG'( G( VG'; ( ''HY'Y; (H(IH(+ H+ Y(g (+ g (Ig IF)IFI)w )Iw )) w ) )FW)W) *J*KJ*; J; Y*: ; : ; *KXX: *+K+LK+* K* X+< +* < +L< LZ,LM,, ZLL,, ,i ,, ,Mi Mi J-MJM-y -My -+ y + -JY-Y+ .N.ON.> N> \.= .> = .O= O[/OPOP/- [/[O@ - - /@ /P^/^@ 0PQ00 ^PP00 0l 00 0Ql Ql 1Q1N1| Q| Q1. | 1N\. . 1N2R2S2@ R@ ^R2? 2@ ? 2S? S]T3STS3/ ]3]S/ 3B / B 3T`3`B 4T4UT42 T2 `4n 42 n 4Un UR5URU5~ 5U50 ~ 0 ~ 5R^^0 56V6WV6B VB `6A 6B A 6WA W_X7WXW71 _7_W1 7D 1 D 7Xb7bD 8X8YX84 X4 b8p 84 p 8Yp YV9YVY9 9Y 92  2 9V`9`2 :Z:[Z:D ZD b:C :D C :[C [a\;[\[;3 a;a[3 ;F 3 F ;\d;dF <\<]\<6 \6 d<r <6 r <]r ]Z=]Z]= =] =4  4 =Zb=b4 >^_>F d^^>F >E >F >_E _cE _``?_?5 c?c_?H 5 H 5 ?`ffH ?@`@a@8 `8 f`@t 8 @at t @aAa^a^A aA6  A6 A^dAd6 BbBcH fbbBH BG BH G BcG cedCcdcC7 eCec7 CJ 7 J CdhChJ DdDedD: d: hDv D: v Dev ebEebeE eE8  E8 EbfEf8 FfFgfFJ fJ hFI FJ I FgI gghGghgG9 gGgg9 GL 9 L GhjGjL HhHihH< h< jHx H< x Hix ifIifiI Ii I:  : IfhIh: JjJkjJL jL jJK JL K JkK kilKklkK; iKik; KN ; N KllKlN LlLmlL> l> lLz L> z Lmz mjMmjmM Mm M<  < MjjMj< NnoNN lnnNN NM NN NoM okM oppOoO= kOkoOP = P = OpnnP OPpPqP@ p@ npP| @ Pq| | PqQqnqnQ qQ>  Q> QnlQl> RrRsP nrrRP RO RP O RsO smtSstsS? mSms? SR ? R StpSpR TtTutTB tB pT~ TB ~ Tu~ urUuruU uU@  U@ UrnUn@ VvVwvVR vR pVQ VR Q VwQ woxWwxwWA oWowA WT A T WxrWrT XxXyxXD xD rX XD  Xy yvYyvyY Yy YB  B YvpYpB ZzZ{zZT zT rZS ZT S Z{S {q|[{|{[C q[q{C [V C V [|t[tV \|\}|\F |F t\ \F  \} }z]}z}] ]} ]D  D ]zr]rD ^~^^V ~V t~^U V ^sU U ^__E ss_X E E _X _v_vX ``H v`H ` `H `  ~~aa aaF F a~ttF abbbX X vbW bX W bW uccG ucuG cZ G Z cxcxZ dddJ J xd dJ  d ee eeH H evvH efffZ Z xfY fZ Y fY wggI wgwI g\ I \ gzgz\ hhhL L zh hL  h ii i iJ  J ixixJ jjj\ \ zj[ j\ [ j[ ykkK ykyK k^ K ^ k|k|^ lllN N |l lN  l mm m mL  L mzmzL nnn^ ^ |n] ^ n{] ] nooM {{o` M M o` o~o~` ppP ~pP p pP p  qq qqN N q||N qrrr` ` ~r_ r` _ r_ }ssO }s}O sb O b ssb tttR R t tR  t uu uuP P u~~P uvvvb b va vb a va wwQ wQ wd Q d wwd xxxT T x xT  x yy y yR  R yyR zzzd d zc zd c zc {{S {S {f S f {{f |||V V | |V  | }} } }T  T }}T ~~f ~f ~e ~f ~e e U h U h U h X X  X    V  V V h h g h g g W W j W j j Z Z  Z    X  X X j j i j i i Y Y l Y l l \ \  \     Z  Z Z l l k l k k [ [ n [ n n ^ ^  ^     \  \ \ n n m n m m ] p ] p ] p ` `  `    ^  ^ ^ p p o p o o _ _ r _ r r b b  b    `  ` ` r r q r q q a a t a t t d d  d     b  b b t t s t s s c c v c v v f f  f     d  d d v v u v u u e x e e x x h h  h    f f f x x w x w w g g z g z z j j  j    h h h z z y z y y i { i { { k k  k     j  j j } } | } | | l  l l   o o  o    m  m m   ~  ~ ~ n n  n  q q  q    o o o       p p  p  s s  s    q q q       r r  r  u u  u     s  s s       t  t  t  w w  w    u  u u       v v  v  y y  y    w w w       x x  x  { {  {    y y y       z z  z  } }  }     {  { {       |  |  |         }  } }       ~ ~  ~                                                                                                                                                                                                                                                                                                 !      ! ! !! !   "#" "    # #$#$# #   $ $%$ $    % %"%"% %  " &'& &    ' '('(' '   ( ()( (    ) )& )&)   )    &   *+  **       + + +,, +   +    ,  , -  , ,   -   - -*-*   -     *  ./ ..   / / 0/0/ /   0 01 00   1 1  1..1  1  . 232 2    3 34343 3   4 454 4    5 5 2525  5  2 676 6    7 78787 7   8 898 8    9 96969 9   6 :; : :  ;  ;;<;< ;   < <= <<   = = =::= =  : >? > >  ?  ?@?@? ?   @  @A  @@       A A A>>!A! !A!  !> !"B"CB" B " "  "C C#CDCD# C## #  #D D$DE$ DD$ $ $ $E E EBB%E% %E%  %B% &F&G& F F&  &G  &G'GHGH' G'  ' 'H' (HI( HH( ( ( (I I IFF)I) )I) )  )F F*J*K* J J*  *K  *K+KLKL+ K+  + +L+ ,LM, LL, , , ,M M MJJ-M- -M-   -J -.N.O. N N.  .O  .O/OPOP/ O/  / /P/ 0PQ0 PP0 0 0 0Q Q QNN1Q1 1Q1   1N 12R2S2 R R2 2  2S ST3STS3 3S 3  3T3 4T4U4 T T4  44U U URR5U5 5U5   5R 56VW6 VV6 6 6 6W W 7WXWX7 7W  7 7X7 8XY8 XX8 8 8 8Y Y  YVV9Y9 9 Y9    9V9 :Z:[: Z Z:  :[  :[;[\[\; [;  ; ;\; <\]< \\< < < <] ]" ]ZZ=]= "="]=    =Z =>^>_> ^ ^>  >_  >_?_`_`? _?  ? ?`? @`a@ ``@ @ @ @a a$ a^^AaA $A$aA    A^ ABbBcB b bB B  Bc cdCcdcC Cc C  CdC DdDeD d dD  DDe e& ebbEeE &E&eE    Eb EFfgF ffF F F Fg g GghghG Gg  G GhG HhiH hhH H H  Hi i( iffIiI (I(iI   IfI JjJkJ j jJ  Jk  JkKklklK kK  K KlK LlmL llL L L  Lm m* mjjMmM *M*mM   Mj MNnNoN n nN  No  NoOopopO oO  O OpO PpqP ppP P P  Pq q, qnnQqQ ,Q,qQ    Qn QRrRsR r rR R  Rs stSstsS Ss S  StS TtTutT t T T  Tuu.urrUuU .U.uU    Ur UVvVwV v vV  Vw  VwWwxwxW wW  W WxW XxyX xxX X X  Xyy0yvvYyY 0Y0yY    Yv YZzZ{Z z zZ  Z{  Z{[{|{|[ {[  [ [|[ \|}\ ||\ \\ \}}2}zz]}] 2]2}]    ]z ]^~^^ ~ ~^  ^  ^__ _  _ __ `` ` `` `4~~aa 4a4a    a~ abbb  b b  b cc c c  cc ddd  dd d6ee 6e6e    e efff  f  f  fgg g  g gg hh h h h h 8 ii 8i8i    i ijjj  j  j  jkk k  k kk ll l l l l : mm :m:m    m mnnn  n  n  noo o  o oo pp p pp p<qq <q<q    q qrrr  r r  r ss s s  ss ttt  t tt>uu >u>u   u uvv v v v v  ww w  w ww xx x xx x@yy" @y@y "  " yy zzz  z  z  z{{ {  { {{ || | || |B}}$ B}B} $  $ } }~~~  ~  ~  ~        D& DD &  &                  F( FF (  (                    H* HH *  *                    J, JJ ,  ,                    L. LL .  .                  N 0 NN 0  0               " "P"2 PP 2  2               $ $R$4 RR 4  4               & &T&6 TT 6  6                )!! ))W9 WW  9                 +"" +Y+; YY ;  !;                -## -[-= [[ =  "=             !!   !/$$ ]//? ]] ?  #?    !           ##  # 1%% 11_A __A  A $!!   #  "   ""    %%  % 3&& 3a3C aa C  %C ##   %  $   $$    ''  ' 5'' 5c5E cc E  &E %%   '  &   &&    ))   )7(( e77G ee G  'G ''   )  (   ((    ++  + 9)) 99gI ggI  I ())   +   *   **    --  - ;** ;i;K ii K  )K ++   -   ,   ,,    // /=++=k=M kk M  *M --   /   .  ..  11 1?,,?m?O mmO +O //  1   0  00  33 3A--AAoQ ooQ Q ,11  3   2  22  55 5C..CqCS qqS -S 33  5  4  44  77  7 E// EsEU ssU .U 55  7  6  66  99  9 G00 GuGW uu W  /W 77   9  8   88    ;;  ; I11 IIwY wwY  Y 099   ;  :   ::    ==  =K22 K yK  [ yy  [  1[ ;;     =    <       << ! !  ??!   ?  M33 M {M    ] {{ ] 2]  ==! ! ? ! >  >># # AA# AO44}OO_ }}_ 3_ ??# # A" # @" " @@% % CC% CQ55QQa a a 4AA% % C$ % B$ $ BB' ' EE' ES66SSc c 5c CC' ' E& ' D& & DD) ) GG) GU77UUe e 6e EE) ) G( ) F( (   FF+ +  II+  ! I W88!WW!!!g !g 7g GG"#"+ "+ I* + #H* * ##$#$HH#- - $KK- $%K$$Y99Y%Y%"%"%i %i i 8"II&'- &- K&, - 'J, , ''('(JJ'/ / (MM/ ()M(([::)[)[)&& ) k  ) k 9k  &KK  * + / */ M* . / +L. . + +,+, LL+ 1  1  ,O O1  ,- !O,, ! ]; ;! -]-]-** - m  - m :m  *MM ./1 .1 O.0 1 /N0 0 //0/0 NN/3   3 0QQ3 01#Q00#_<<#1_1_1..1o 1!o !;o .OO!233 23 Q22 3 3P2 2 33434"PP35 ""5 4SS5 45%S44%a==%a5a52525q 5q #q #<2QQ#675 65 S64 5 7R4 4 77878$RR77 $$7 8UU7 89'U88'c>>'9c9c9669s 9%s %=s 6SS%:;7 :7 U:6 7 ;T6 6 ;;<;<&TT;8 &<V8 8 <<=(V<<(e??(=e=e=::=u ='u '>u :UU'>  ?>: >: X9  : ?W9 9 ?@?@? )WW?)< )< !@ZZ<  @   A@ ,@,Z hA A,h AhA>!A>A !x !A!*@@x !>X**!>"B " CB"< B< Z"; !"!< ; "C; CYD#CDC #+YYC#> "++#> #D\#\> $D $ ED$.D.\$jB$B.j$EjEB%EBE %z %Ez %,z ,A%BZ%Z,&F & G&> F> \F&= ""> &G[= = &G'GHG H'-[[G'@ #--'@ 'H^^@ '(H ( I(0H0^H(lCC0(Ill(IF)IFI )| )I| ).| .B)F\)\.*J  K*@ ^JJ*@ *? #*#@ *K? K]? K LL+K+/]+]K+B /B $/+L``B +,L , M,2L2`L,nDD2,Mnn,M-MJM J-~ M-0C~ ~ -0-J^-^0.N . ON.B NB `.A $.$B A .OA O_P/OPO /1_/_O1/D 1D %/Pb/bD 0P 0 QP04P4b0pE0E4p0QpQN1QNQ 1 1Q 12 2D1N`1`22R2SR2D RD b2C %2%D C 2SC SaT3STS33aaS3F &333F 3Td3dF 4T4UT46T6d4rF4F6r4UrUR5URU5 5U 54 4E5Rb5b46V6W6F VF dV6E &&F 6WcE E 6W7WXWX75ccW7H '557H 7XffH 78X8Y88X8fX8tGG88Ytt8YV9YVY9 9Y 96 6F9Vd9d6:Z[:H fZZ:H :G ':'H :[G [eG [\\;[;7e;e[;J 7J (7;\hhJ ;<\<]<:\:h\<vHH:<]vv<]=]Z]Z= ]=8G  =8=Zf=f8>^>_^>J ^J h>I (>(J I >_I _g`?_`_?9g?g_9?L 9L )?`j?jL @`@a`@<`<j@xI@I<x@axa^Aa^aA Aa A: :HA^hAh:BbBcbBL bL jBK )B)L K BcK cidCcdcC;iicCN *;;CN CdlClN DdDedD>d>lDzJDJ>zDezebEebeE Ee E< <IEbjEj<FfFgFN fN lfFM **N FgkM M FgGghghG=kkgGP +==GP GhnGnP HhiH@nhhH@H|KHK@Hi|i|fIifiI Ii I> >JIflIl>JjJkJP jP njJO ++P JkmO O JkKklklK?mmkKR ,??KR KlpKpR LlmLBpllLBL~LLLBLm~m~mjjMmM MmM@ @K Mjnn@MNnNonNR nR pNQ ,N,R Q NoQ oopOopoOAoOooAOT AT -OprOrT PpPqpPDpDrPMPMDPqqnQqnqQ Qq QB BLQnpQpBRrRsrRT rT rRS -R-T S RsS sqtSstsSCqqsSV .CCSV SttStV TtTutTFtFtTNTNFTuurUuruU Uu UD DMUrrUrDVvVwVV vV tvVU ..V VwsU U VwWwxwxWEsswWX /EEWX WxvWvX XxyXHvxxXHXOXOHXyyvYyvyY Yy YF FNYvtYtFZzZ{ZX zX vzZW //X Z{uW W Z{[{|{|[Guu{[Z 0GG[Z [|x[xZ \|}\Jx||\J\P\PJ\}}}zz]}] ]}]H HO ]zvvH]^~^~^Z ~Z x^Y 0^0Z Y ^Y w__Iw_wI_\ I\ 1_z_z\ ```LLz`Q`QL`~a~a a aJ JPa~xaxJbbb\ \ zb[ 1b1\ [ b[ yccKyyc^ 2KKc^ c|c|^ dddNN|dRdRNdee e eL LQezezLfff^ ^ |f] 22^ f{] ] fggM{{g` 3MMg` g~~` ghhhPP~hSSPhhii i iN NRi|i|Njj` ~j` j_ 3j3` j_ }_ kkO}k}kb Ob 4Okb klllRRlTTRllmm mPS  mPm~m~Pnnnb b na 4n4b a na ooQoQod Qd 5ood pppTTpUpUTpqq q qR RTqqRrrrd d rc 5r5d c rc ssSsf 6SSsf ssf tttVVtVtVVtuu u uT TUuuTvvvf f ve 66f ve e vwwUwh 7UUwh wh wxxxXXxWWXxxyy y yV VVyyVz  zh zh zg 7z7h zg g  {{W{{j Wj 8W{j {| | |ZZ|XXZ||} } }XW  }X}}X~!~!~j j ~i 8~8j i ~i !YYl Yl 9l !!\\YY\!  Z ZXZ""l l k 99l k k "[n :[[n n ""^^ZZ^"  \ \Y\##n n m ::n m m #]p ;]]p p ##``[[`#  ^ ^Z^$$p p o ;;p o o $_r <__r r $$bb\\b$ ` `[ `%%r r q <<r q q %aat at =t %%dd]]d%  b b\b&&t t s ==t s s &cv >ccv v &&ff^^f&  d d]d''v v u >>v u u ''eew ??ew w ''gg__g'  f f^f((y y x @@y x x (hh{ h{ A{ ((kkaak((  i`` ii)){ { z AA{ z z )jj} j} B} ))mmbbm)  k kak**} } | BB} | | *l l Cl **oocco*  m mbm++  ~ CC ~ ~ +n n Dn ++qqddq+ oc  oo,,   DD   ,pp p E ,,ssees,  q qdq--   EE   -rr r F --uuffu-  s ses..   FF   .t t Gt ..wwggw.  u ufu//   GG   /v v Hv //yyhhy/ wg  ww00   HH   0xx x I 00{{ii{0  y yhy11   II   1zz z J 11}}jj}1  { {i{22   JJ   2| K||  22kk2  } }j}33   KK   3~ L~~  33ll3  k 44   LL   4  M 44mm4   l55   MM   5  N 55nn5   m66   NN   6 O  66oo6   n77   OO   7 P  77pp7  o 88   PP   8  Q 88qq8   p99   QQ   9  R 99rr9   q::   RR   :  S ::ss:   r;;   SS   ;  T ;; tt    ;  s   <<      TT        <   U   <<   uu      <    t ==   UU   =  V ==vv=   u>>   VV   >  W >>ww>   v??   WW   ?  X ??xx? w  @@   XX   @  Y @@yy@   xAA   YY     A  Z   AA!  zz!!!!A !  y"BB#" "  ZZ  # #$#$#B# [ $ $BB%$${{%% "%"%B  %  z"&CC' & & [[ '  ''('C(' \ ( (CC)((||)) )C&& )    )  {  &  *D D+*  *   \ \  + +, +,+D  +   ] ,   ,D D-, , } } -- * -*-D    -  | * .EE/. .  ]]  / /0/0/E/  ^0 0EE100~~11.1.1E 1  }.2FF32 2  ^^  3 33FF433 __4  44FF544552525F 5  ~26GG7 66  `` 7  78787G7  a8 8GG98899GG69 9  66:HH;: :  aa  ; ;<;<;H;  b< <HH=<<=:=:=H ==   :>II?> >  bb  ? ?@?@?I?  c@  @I IA@ @  A >!A>AI AA! !! !>!"BJ"JCB" B " c"c "C C CJDD#C##C#  d#D #$DJ$JED$D$$E$B%EBEJ EE% %% %B%&FK&KGF& F & d&d  &G GH'GHGK''G'  e'H' (HK(KIH(H((I(IF)IFIK) I)  ))F)*JL*LKJ* J * e*e  *K KL+KLKL++K+  f+L+ ,LL,LML,L,,M,J-MJML- M M  --J-.NM.MON. N . f.f  .O OP/OPOM//O/  g/P/ 0PM0MQP0P00Q  0N1QNQM1 Q Q1 11N12RN2NSR2 R 2 g2g 2S S SNTT3S33S3  h3T 34TN4NUT4T44U""4R5URUN5 U "U5 55R56VO6OWV6 V 6 h6h  6W WX7WXWO77W7  i7X7 8XO8OYX8X888YY$V9YVYO9 $9$Y9  9V9:ZP:P[Z: Z : i:i  :[ [\;[\[P;;[;  j;\; <\P<P]\<\<<]&&<Z=]Z]P= ] &]=  =Z=>^Q>Q_^> ^ > j>j  >_ _`?_`_Q??_?  k?`? @`Q@Qa`@`@@a((@^Aa^aQA a (aA AA^ABbRBRcbB b B kBk c  BcCcdcRdCcC lC CdC DdRDRedDdDDe**DbEebeRE e *eE EEbEFfSFSgfF f F lFl  Fg ghGghgSGGgG  mGhG HhSHSihHhHHHii,fIifiSI ,I,iI  IfIJjTJTkjJ j J mJm  Jk klKklkTKKkK  nKlK LlTLTmlLlLLm.L.jMmjmT .mmM M  MjMNnUNUonN n N nNn  No opOopoUOOoO  oOpO PpUPUqpPpPPq0P0nQqnqU 0qqQ QQ QnQRrVRVsrR r R oRo s  RsSstsVtSsS pS StS TtVTVutTtTTu2T2rUuruV 2uuU UU UrUVvWVWwvV v V pVp  Vw wxWwxwWWWwW  qWxW XxWXWyxXxXXy4XyvYyvyWY 44yY  YYvYZzXZX{zZ z Z qZq  Z{ {|[{|{X[[{[  r[|[ \|X\X}|\|\\}6\6z]}z}X 6}}]   ]]z]^~Y^Y~^ ~ ^ r^r  ^ _Y___  s__ `Y`Y` ` `8`8 ~a~Y 8a aa a~abZbZb  b sbs b  Zcccc  tc cdZdZd d d:d: eZ :e ee eef[f[f  f tft  f g[ggg  ugg h[h[hhh<hi[i <<i  iiij\j\j  j uju  j k\kkk  vkk l\l\lll>>lm\m  >  mmmn]n]n  n vnv  n o]ooo  woo p]p]ppp@@pq]q" " @q" qqqr^r^r  r wrw r  ^ssss  xs st^t^tttBBtu^u$ $ Bu$ uuuv_v_v  v xvx  v w_www  yww x_x_xxxxDy_y& DyDy& & yyz`z`z  z yzy  z {`{{{  z{ {  |`|`| ||FF|}`}( ( F}( ( }}~a~a~  ~ z~z  ~  a    {   aa HHa* * H*   bb   {{    b   |  bbJJb, , J,   cc   ||    c    } ccLc. LL. . dd   }}   d  ~ dd  NN d0 N0 0 0 e   ~~  ee   ee"""Pe2 P2 2 ff      ff    f%%SS%ff5 S5 5 g     gg    g''UU'gg7 7 U7 h     hh   h))WW)hh9 9 W9 i     ii   i++YY+ii; ; Y; j     jj    j--[[-jj= = [= k     kk    !k!!//]]/kk? ? ]? l !!     ll     #l##11__1llA A _A !m ##    "" mm"   %m%%33aa3mmC C aC #n %%  $  nn$$    'n''55cc5nnE E cE %o ''  &  oo&&    )o))77ee7ooG G eG 'p ))  (  pp((   +p++99gg9ppI I gI )q ++    ** qq*   -q--;;ii;qqK K iK +r --  ,  rr,,    /r//==kk=rrM kM M -s //  .  ss..    1s11??mm?ssO O mO /t 11  0  tt00   3t33AAooAttQ Q oQ 1u 33    22 uu2   5u55CCqqCuuS S qS 3v 55   4 vv44    7v 77E  EssEvvU sU U 5w 77   6 ww66    9w 99 G GuuGwwW W u W   7x 99   8 xx 88    ;x ;; I IwwIxxY Y w Y   9y ;;    :: yy  :    =y==KKyyKyy[ [ y [   ;z ==   < zz<<! ! ! ! ?z??MM{{Mzz] ] {] ={! ?? !  > {{>># # # # A  {AAOO }}O {{ _  _ }_ ?    |# AA " #  "  @"  || @@ % %  % C    |CC QQ Q ||  a  a a   A}% CC$ % % $ BB$ }}B' ' ' E}EESSS}}c c c C~' EE& ' D& & ~~DD) ) ) ) G~GGUUU~~e e e E) GG( ) F( ( FF+ + + + IIIWWWg g g G+ II* + H* * HH- - - KKKYYYi i i I- KK, - - , JJ,  J/ /  / M! ! MM [[![!!k !k k K#"#"/ MM". / #L. . ##$LL#1 1 1 $1 $O%$%$!OO$]!!]%]%"m %%m m ""M'&'&1 OO&0 1 'N0 0 ''( NN'3   3 3 (3 (Q)()(#QQ(#_#_)_ ) &) o )o  ! o ! &!&O+ *+* 3 Q Q* 2 3  +P P2  + ,+ "+"P 4 " 4 ,4 ,R ,- , $,$R a $ -a-a - *- q -q  # q # *#*Q./6 .6 T.5 6 /S5 5 //0%/%S/8 %0V8 8 00101(VV0d((d1d1.t 11t &t .&.T&23328 VV27 8 7 8 3UU7 343'3'U: ': 4: 4X5454*XX4*f*f5f52v 55v (v 2(2V(7676: XX6: 9 : 9 7WW9 787)7)W< )< 8< 8Z9898,ZZ8,h,h9h969x 9x *x *6*6X;:;:< ZZ:< ; < ; ;YY; ;<;+;+Y> +> <> <\=<=<.\\<.j.j=j=:=z =z ,z ,:,:Z>?>?> \\>= > > = ?[[= ?@-[??-@ -@@ @^@ @AA @ 0^ ^@ l0l0 Al !A!>!| A| A!.| !>\..!>"BCBC"@ ^^B"? @ @ "? "C]"]? #C#DC#/C/]#B #/B #DB D`E$DED$2`$`D2$n2n$E$n%E%B%~ E~ E%0~ %B^00%BG&FGF&B `&`FB &A B A &G_&_A 'G'HG'1G1_'D '1D 'HD HbI(HIH(4b(bH4(p4p(I(p)I)FI) I )2) 2)F2F`K*JKJ*D b*bJD *C D C *Ka*aC +K+LK+3K3a+F +3F +LF LdM,LML,6d,dL6,r6r,M,r-M-JM- M -4- 4-J4Jb.NONO.F ddN.E F F .E .Oc.cE /OP/5cOO/5/H /5/PH PfH PQQ0P08f0fP0t8t80Qt01Q1N1 Q Q16 1Nd661N2RSRS2H ffR2G H H 2G 2Se2eG 3S3TS37S7e3J 37J 3TJ ThU4TUT4:h4hT:4v:v4U4v5U5R5 U U58 5Rf885RW6VWV6J h6hVJ 6I J I 6Wg6gI 7W7XW79W9g7L 79L 7XL XjY8XYX8<j8jX<8x<x8Y8x9Y9VY9 Y 9:9 :9V:Vh[:Z[Z:L j:jZL :K L K :[i:iK ;[;\[;;[;i;N ;;N ;\N \l]<\]\<>l<l\><z>z<]<z=]=Z]= ] =<= <=Z<Zj^__>^>N l>l^>M N M N >_kkM >?_?`?=_=k_?P =?`nP P ?`@`a`a@@nn`@|@@@|@a@|Aa^A aaA A>A A^>^l>bccBbBP nBnbBO P O P BcmBmO CcCdcC?c?mCR C?R CdR dpeDdedDBpDpdBD~B~DeD~EebE eeE E@E Eb@bn@gFfgfFR pFpfR FQ R Q FgoFoQ GgGhgGAgAoGT GAT GhT hriHhihHDrHrhDHDHiHIiIfiI i IBI BIfBfpkJjkjJT rJrjT JS T S JkqJqS KkKlkKCkCqKV KCV KlV ltmLlmlLFtLtlFLFLmLMmMjmM m MDM DMjDjrnooNnNV tNtnNU V U V NossU NOoOpOEoEsoOX EOpvX X OpPpqpqPHvvpPHHPPqPQqnQ qqQ QFQ QnFntFrssRrRX vRvrRW X W X RsuRuW SsStsSGsGuSZ SGZ StZ txuTtutTJxTxtJTJTuTUurU uuU UHU UrHrvHwVvwvVZ xVxvZ VY Z Y VwwVwY WwWxwWIwIwW\ WI\ Wx\ xzyXxyxXLzXzxLXLXyXYyYvyY y YJY JYvJvx{Zz{zZ\ zZzz\ Z[ \ [ Z{yZy[ [{[|{[K{Ky[^ [K^ [|^ ||}\|}|\N|\||N\N\}\]}]z}] } ]L] L]zLzz^~~^^ ||~^] ^ ^ ^] ^{^{] __M{_M_` _M_` ~` ``P~`~`PP``aa~a  aN a~|NNa~bb` ~~b_ ` ` b_ b}b}_ cccOO}cb cOb cb ddRdRdRddeee  eP e~PPeffb fb fa b a ffa gggQQgd gQd gd hhThThThhiii  iRi RiRjjd jd jc d c jjc kkkSSkf kSf kf llVlVlVllmmm  mTm TmTnnf ne f f ne nne ooUoUoh oUoh h ppXppXXppqqq  qV qVVqrrh rg h h rg rrg sssWWsj sWj sj ttZtZtZttuuu  uX uXXuvvj vj vi j i vvi wwwYYwl wYl wl xx\x\x\xxyyy  yZy ZyZzzl zl zk l k zzk {{{[[{n {[n {n ||^|^|^||}}}  }\} \}\~~n ~~m n m n ~m ~]]p ]p p ```  ^ ^^p o p o p o __r _r r bbb  ` ``r r q r q q aas as s ccc  b bbu u t u t t ddw dw w ggg  e eew v w v w v ffy fy y iii  g ggy y x y x x hh{ h{ { kkk  i ii{ { z { z z jj} j} } mmm  k kk} | } } | | ll l  ooo  m mm ~   ~ ~ nn n  qqq  o oo     pp p  sss  q qq     rr r  uuu  s ss      tt t  www  u uu      vv v  yyy  w ww     xx x  {{{  y yy     zz z  }}}  { {{     || |    } }}     ~~ ~                                                                                                                                                                                                                      ! ! !! !!  #"#" "   # #$##  $ $$%$$%%%" %%  ""&'&'&  ' '(''((()( (   )  ) ) & ))   &  & *+*+ *     +   +, ++    ,,,-- ,   ,     -  - * --   *  *././  .  / /0//000110 0   1 1.11 .   .32322  3   34 3344 5454  4   5 5255 2 2 67676  7   78 77888989 8    9 9699 6  6:;:;:  ; ;<;;<<<==< <   = =:== :  :>?>?>  ? ?@??@@@AA @   @     A !A!>!AA! !>  !>C"BCB""B"  "C" #CD#CC####DDE$DED$ $D $  $E$ %E%BE%E% %%B B &FGFG&F& & &G& 'GH'GG'''H'H(HIHI( H(   ( (I( )I)FII)) )F  )F*JKJK*  J* * *K* +KL+KK++ + +LLLMM,L, ,L,   ,M ,-M-J-MM- -J   -J.NONO.##N. . .O. /OP/OO// / /PP PQQ0P0 0 P0   0Q 01Q1N1QQ1 1N#  1NS2RSR2&2&R2  2S!2! 3ST3!SS33 3 3TT#U4TUT4 #4#T 4  4U4 5U5RU5U5 5 5R R&6VWVW6 ))V6  6 6W$6$ 7WX7$WW77 7 7XX&XYY8X8 &8&X8   8Y 89Y9V9YY9 9V)  9V:Z[Z[:,,Z: : :[':' ;[\; '[[; ;  ; ;\ \) \]]<\< )<)\<   <] <=]=Z=]]= =Z,  =Z>^_^_>//^> > >_*>* ?_`? *__? ?? ?``,`aa@`@ ,@,`@   @a @AaA^AaaA A^/  A^cBbcbB2B2bB  Bc-B- CcdC-ccCCCCdd/eDdedD /D/d D  DeD EeEbeEeE E Eb b2FfgfgF55fF F Fg0F0 GghG0ggGGGGhh2hiiHhH 2H2hH    Hi HIiIfIiiI If5  IfJjkjkJ88jJ J Jk3J3 KklK3kkKKKKll5lmmLlL 5L5lL    Lm LMmMjMmmM Mj8  MjNnonoN;;nN N No6N6 OopO6ooOOOOpp8pqqPpP 8P8pP   Pq PQqQnQqqQ Qn;  QnsRrsrR >R>rR   Rs9R9 SstS9ssSSSStt;uTtutT ;T;t T  TuT UuUruUuU UUr r> VvwvwV#AAvV ##V Vw<V< WwxW<wwWW Wx>  WxXxyxyX >>xX   X XyX YyYvyyYY YvA  YvZz{z{Z&DDzZ &&Z Z{?Z? [{|[!?{{[![#[![|#|A#|}}\|\ A\A|\    \} \]}]z]}}] ]zD  ]z^~~^)GG~^ ))^ ^B^B __$B_$_&_$_&D&`` D`D`    ` `aa~aa a~G  a~bb,JbJb , ,bEbE cc'Ec'c)c'c)G)dd GdG d  dd eeee ee J ff/MMf //f fHfH gg*Hg*g,g*J,,ghh JJh   h hh iiii iM  ijj2PPj 22j jKjK kk-Kk-k/k-k/M/ll MlMl    l lmmmm" mP" " mnn5SSn 55n nNnN oo0No0o2o0o2P2pp" PpPp "  " p pqqqq% qS% % qrr8VrV8r# 8# rQrQ# ss3Qs3s5s3s5S5tt% StS% t % tt uuuu( u( u( Vvv;YYv& ;;v& vTvT& ww6Tw6w8w6w8V8xx( VxVx (  ( x xyyyy+ yY+ + yzz>\\z) >>z) zWzW) {{9W{9{;{9{;Y;||+ Y|Y| +  + | |}}}}. }\. . }~@^~@~, ~@~Z~Z, <Z<><>\>. \\ .  .  0 ^0 0 0A~default?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##################################################################################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&%&&&'&(&)&*&+&,&-&.&/&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?&@&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&^&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''''''''' ' ' ' ' ''''''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}'~''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''((((((((( ( ( ( ( ((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@)A)B)C)D)E)F)G)H)I)J)K)L)M)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])^)_)`)a)b)c)d)e)f)g)h)i)j)k)l)m)n)o)p)q)r)s)t)u)v)w)x)y)z){)|)})~))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))********* * * * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**********************************************************************************************************************************+++++++++ + + + + +++++++++++++++++++ +!+"+#+$+%+&+'+(+)+*+++,+-+.+/+0+1+2+3+4+5+6+7+8+9+:+;+<+=+>+?+@+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+\+]+^+_+`+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|+}+~++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - ------------------- -!-"-#-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-{-|-}-~----------------------------------------------------------------------------------------------------------------------------------......... . . . . ................... .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].^._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~..................................................................................................................................///////// / / / / /////////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/7/8/9/:/;//?/@/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/[/\/]/^/_/`/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/{/|/}/~//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////000000000 0 0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111 1 1 1 1 1111111111111111111 1!1"1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1[1\1]1^1_1`1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|1}1~1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222 2 2 2 2 2222222222222222222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728292:2;2<2=2>2?2@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2`2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333 3 3 3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555 5 5 5 5 5555555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666 6 6 6 6 6666666666666666666 6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777888888888 8 8 8 8 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::::::::: : : : : ::::::::::::::::::: :!:":#:$:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:5:6:7:8:9:::;:<:=:>:?:@:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:{:|:}:~::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;; ;!;";#;$;%;&;';(;);*;+;,;-;.;/;0;1;2;3;4;5;6;7;8;9;:;;;<;=;>;?;@;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];^;_;`;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;{;|;};~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<< < < < < <<<<<<<<<<<<<<<<<<< =?=@=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=^=_=`=a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}=~==================================================================================================================================>>>>>>>>> > > > > >>>>>>>>>>>>>>>>>>> >!>">#>$>%>&>'>(>)>*>+>,>->.>/>0>1>2>3>4>5>6>7>8>9>:>;><>=>>>?>@>A>B>C>D>E>F>G>H>I>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>^>_>`>a>b>c>d>e>f>g>h>i>j>k>l>m>n>o>p>q>r>s>t>u>v>w>x>y>z>{>|>}>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>PA@&icosahedroA%`A6???A` M$M?lL$M?hM??oM?o!M??oMoM??!$M?R$M???gM_M#e$ֺ眿A?ֺ眿A眿Aֺ>眿Aֺֺ>眿A?ֺ>眿A?Aֺ>?Aֺ?eդֺ?A?ֺ?A眿A?ֺ>眿A?ֺֺ>?A?ֺ>?A?A?ֺ>?A?ֺe$?A?ֺ?Aֺ?A?ֺ>?Aֺ>?eA?ֺ眿Aֺ眿A?ֺ>眿Aֺ>眿?S ?t_t_t_?S j$?S ?j$?t_?t_t_??S +$?S ?+t_?t_?t_??S ??S t_?t_?t_S ?jǤS jǤt_t_t_S t_?t_t_S +$S ?+t_t_?t_?t_t_?t_/ľ3tL$>$CϦ0>>$CϦ0ؾChϜ>ChϜ>$?CϦ0>>$?CϦ0ؾC?hϜ>C?hϜ/ľ3t?LΤ>$CϦ?0>>$CϦ?0ؾCh?Ϝ>Ch?Ϝ>$?CϦ?0>>$?CϦ?0ؾC?h?Ϝ>C?h?Ϝ/ľ3t?0>>$CϦ?0ؾ>$CϦ?0>>$?CϦ?0ؾ>$?CϦ?/ľ3t0>>$CϦ0ؾ>$CϦ0>>$?CϦ0ؾ>$?CϦ3t?f#/>3tf#/>/>3tL$ϜCh?ϜChCϦ0ؾ>$?CϦ0ؾ>$Ϝ>Ch?Ϝ>ChCϦ?0ؾ>$?CϦ?0ؾ>$/>3t?LΤϜC?h?ϜC?hCϦ0>>$?CϦ0>>$Ϝ>C?h?Ϝ>C?hCϦ?0>>$?CϦ?0>>$/>3t?h?ϜC?hϜC?h?Ϝ>C?hϜ>C?/>3th?ϜChϜCh?Ϝ>ChϜ>C3t?fأ/ľ3tfأ/ľjT>$%?ƍ۟>jT$%?@Wn6-?n6-@W?-@Wn6?%jT>$?۟/$ƍ?%jT$?%?jT$?۟>/$ƍ?%?jT>$?-?@Wn6?n6?-@W?@W?n6-?$?%jT$?%jT>ƍ?۟.T#ƍ?۟>.T$?%?jT>$?%?jT@W?n6?-?n6?-?@W?-?@W?n6?jT$?%?ƍ?۟>jT>$?%?jT>$?%ƍ?۟jT$?%-?@W?n6n6?-?@W@W?n6?-%?jT>$۟>/Ҥƍ%?jT$%jT$۟/Ҥƍ%jT>$-@Wn6n6-@W@Wn6-jT$%ƍ۟jT>$%@W?n6-n6?-@W-?@Wn6ƍ۟.T#$%jT>$%jT$%?jT$%?jT>ƍ۟>.T-@W?n6?n6-?@W?@Wn6?-?@Wn6?-n6-?@W-@W?n6̬>"V>̬"V>oc?4 ʚcB?ʚcB4 ?B4 ʚc?V̬>"?V̬"?cd$o?V>̬"?V>̬>"?c?d$o?ʚc?B4 ?4 ?ʚcB?B?4 ʚc?o?cuz$"?V̬>"?V̬"?V>̬>o?c?uz"?V>̬4 ?ʚc?B?ʚc?B?4 ?B?4 ?ʚc?̬"?V>̬>"?V>o?c?̬>"?V̬"?Vo?cʚc?B?4 4 ?ʚc?BB?4 ?ʚcV>̬>"V>̬"c?doV̬"V̬>"cdoʚcB4 4 ʚcBB4 ʚc̬"V̬>"Voc4 ?ʚcBʚc?B4 B?4 ʚc"V̬>ocuz$"V̬oc?uz"V>̬>"V>̬ʚcB?4 ?4 ʚc?B?B4 ?ʚc?4 ʚc?BʚcB?4 B4 ?ʚc Acz**{Cz\C\C{  \{**|>  {?>?>|  ?|**z]  |]a]aza}++~R  }]RR]~  ]~++?  ~A?A?A++}_p_p _}  p,,T""TnTnn,,PPRPR  R,,p  prpr ""r--QPQPQP--nSnSn!!S--q!!qoqoo..ECECEC..aQaQaQ..ocococ//FFEFEE//cZcZc((Z//x((dxd xd00Z((ZlZll00NNONOO00mmxmx ((x11S!!jSjSj11LNLNLN11lqllq!!q22HGHGHG22eLeLeL22jjfjff33MMeMee33GGIGII33ggkgkk44OMOOMM44kXkXk&&X44v&&m vvmm55X&&sXsX##s55U##VUVU$$V55t$$tvtv &&v66W%%WUWU##U66s##sYsY''Y66w''wuwu %%u77B@BB@@77^W^^W%%W77u%%`u` u`88@@>@>  >88\  \D\DD88bb^b^^99V$$bVbVb99DFDDFF99dtdt d$$t::[))_[_ [_::AABABB::`y`y `))y;;KKJKJJ;;hh[h[ ))[;;y))yiyi i<<JHJHJH<<fTffT""T<<r""h rrhh==Y''gYYgg==IKIIKK==iw iiw''w0ANew Material  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/meshnode.3ds000066400000000000000000000475221361325167000155330ustar00rootroot00000000000000MMRO ==BO>= } cool@00     u uP0 ?@Ntext8AN`A6???AjaV$\B?};t$㥻?Lq}$G?;]$㥻?LV$\B?;]s"/]=L=u};ts"/]='a]$9H?Ѡa]$9H?3i$F>a]$9H?k7\$'1H?${u#o>qu#o>т #E>Bc $sh?uq#"[>#C >-0u#o>Ɏu#o>5ܑ<9#'>Ph#R>H_^Z#L7>Nc $sh?Bޔ #E>~u#o>~u#o>jaL>\B?};tL>㥻?LL>G?;]L>㥻?LL>\B?;]L>/]=LL>u};tL>/]='L>9H?ѠL>9H?3L>F>L>9H?kL>'1H?${L>o>qL>o>тL>E>BL>sh?uL>"[>L>C >-0L>o>ɎL>o>5ܑL>'>L>R>H_L>L7>NL>sh?BޔL>E>~L>o>~L>o>kSM$5^:?aO#j<> ab<# +>JaK(#u>u_^Z#L7 >]u#o>Au#o>=1#>L1#>$K#5^>@1=#5^>L38ӽ$I ?'Fӽ$I ?};D/$R?T4/$R?70a]$9H?-La]$9H?CPu+W$oC?kSL>5^:?aL>j<> aL> +>JaL>u>u_L>L7 >]L>o>AL>o>=L>>LL>>$KL>5^>@1=L>5^>L38L>I ?'FL>I ?};DL>R?T4L>R?70L>9H?-LL>9H?CPL>oC?\1#y> 5FR#v>>A5=#1,>K4+#>!1#O >,'Q#%>%'Q#%>m7S#|?> %F# >V $>J$?V $~ ?!$V?X &$+?'/$R?oT1$ ?F.$v?l +$"? K($u?'$b?٦R$>?ly%Y$/D?7\$'1H? :^$xI?C^$^I?!BP$&#sh>"#>L3 5.#K>^#>!l#>gb%X #+>(9ܨ#>f+#R>G.H#Z>\1L>y> 5L>v>>A5L>1,>K4L>>!1L>O >,L>%>%L>%>L>|?> L> >V L>>JL>?V L>~ ?L>V?L>+?'L>R?oL> ?L>v?l L>"? L>u?L>b?L>>?lL>/D?L>'1H? L>xI?CL>^I?!L>?/+L>? )L>/>&L>sh>"L>>L3 L>K>L>>!L>>gb%L>+>(L>>f+L>R>G.L>Z>a]$9H?tu#o>NZu#o>/ #E>Aʿ #E>տu#o>yu#o>Fa]$9H?a]$9H?%) $?׿) $?̿a]$9H?L>9H?tL>o>NZL>o>/L>E>AʿL>E>տL>o>yL>o>FL>9H?L>9H?%L>?׿L>?̿L>9H?Hua]$9H?nu#o>ھsu#o>\ #E>Bu#o>u#o>%ia]$9H?a]$9H?) $?Y)0a]$9H?HuL>9H?nL>o>ھsL>o>\L>E>BL>o>L>o>%iL>9H?L>9H?L>?Y)0L>9H?jQ]S$~>t#㥛>6.fa#L>1$#><#C >o=u#o>{>X &#+>>fa#L>x*?S$~>_1?.$?5??\OK$Q8?>FZ$TE?U.>^]$L7I?ZR>FZ$TE?~=\OK$Q8?9.$?+->#V>>s#->s>=#p>Da=I#;>={$>%>$?KW>X &$+?|_>$?q>$h>c>#p>jQ]L>~>tL>㥛>6.L>L>L>>C >o=L>o>{>L>+>>L>L>x*?L>~>_1?L>?5??L>Q8?>L>TE?U.>L>L7I?ZR>L>TE?~=L>Q8?L>?+->L>V>>L>->s>=L>p>Da=L>;>=L>>%>L>?KW>L>+?|_>L>?q>L>h>c>L>p>*?2$r>?=?,$j?&?XUI$+6??/X$D?˩?a]$9H?/h?a]$9H?W%?u#o>l_?#>%?c #sh>R?;;#)>?fa#L>fn?!$n??w6#$?jĖ?fN$ ?jĖ?2$r>?#p>[{?#1>*?L>r>?=?L>j?&?L>+6??L>D?˩?L>9H?/h?L>9H?W%?L>o>l_?L>>%?L>sh>R?L>)>?L>L>fn?L>n??L>?jĖ?L> ?jĖ?L>r>?L>p>[{?L>1>P?M$5^:?*?O#j<> ?b<# +>?K(#u>;?^Z#L7 >n?u#o>Zl?u#o>@1#>&?1#>9?#5^>Q@#5^>O@ӽ$I ?!?ӽ$I ?+?/$R? @/$R?@a]$9H?˩?a]$9H?~?u+W$oC?P?L>5^:?*?L>j<> ?L> +>?L>u>;?L>L7 >n?L>o>Zl?L>o>@L>>&?L>>9?L>5^>Q@L>5^>O@L>I ?!?L>I ?+?L>R? @L>R?@L>9H?˩?L>9H?~?L>oC?sl"@#5^>@#5^>  @u#o>Zh@u#o>sl"@L>5^>@L>5^>  @L>o>Zh@L>o>@V$\B?@$㥻?% r@q}$G?FD@$㥻?% 2@V$\B?FD@s"/]=% r@=u@s"/]=\j@T$x>wp@-$p?|z@ɾJ$7?@ Y$B`E?yk@a]$9H?@ Y$B`E?P@ɾJ$7?D@h-$-?w@T$x>D@#>V@_#J>@ ##z>t~@u#o>|z@^Z#L7 >/u@"#t>Mm@_#J>;h@#>@L>\B?@L>㥻?% r@L>G?FD@L>㥻?% 2@L>\B?FD@L>/]=% r@L>u@L>/]=\j@L>x>wp@L>p?|z@L>7?@L>B`E?yk@L>9H?@L>B`E?P@L>7?D@L>-?w@L>x>D@L>>V@L>J>@L>z>t~@L>o>|z@L>L7 >/u@L>t>Mm@L>J>;h@L>>%@#V>N@#p>@$h>@$?.@X &$+?F@$?n}@{$>}@I#;>}C~@#p>0@s#->%@L>V>N@L>p>@L>h>@L>?.@L>+?F@L>?n}@L>>}@L>;>}C~@L>p>0@L>->b@u#o>96@u#o>o@T#Ġ>ä@o#ҍ>.@q#"[>`g@F#X94>@u#o>T@u#o>{@u#o>V@#p>A@5$>li@w6#$?@y5$/$?Ţ@H$6?)@sW$SC?0@a]$9H?y@a]$9H?)@Z$$F?}@S$@?b@K$u8?@E$!2?R:@'$b?=@`)$?@`)$?Ϫ@r'$?!2@$?Te@$T?@ $#>B@,$1>@3##ff>b@L>o>96@L>o>o@L>Ġ>ä@L>ҍ>.@L>"[>`g@L>X94>@L>o>T@L>o>{@L>o>V@L>p>A@L>>li@L>?@L>/$?Ţ@L>6?)@L>SC?0@L>9H?y@L>9H?)@L>$F?}@L>@?b@L>u8?@L>!2?R:@L>b?=@L>?@L>?Ϫ@L>?!2@L>?Te@L>T?@L>#>B@L>1>@L>ff>Hc@#V>@;#>)޿@\O#Q>)޿@T$x>#]@{$q= ?h@P"$?T@9($?Ţ@7\$'1H?`g@\$G?X@/X$D?/_@FR$v>?u@{|H$5?@T$x>L@9ܨ#>@^#^I>'@c #sh>o@'Q#%>P@'Q#%>y@2$r>@2$r>Hc@L>V>@L>>)޿@L>Q>)޿@L>x>#]@L>q= ?h@L>?T@L>?Ţ@L>'1H?`g@L>G?X@L>D?/_@L>v>?u@L>5?@L>x>L@L>>@L>^I>'@L>sh>o@L>%>P@L>%>y@L>r>@L>r> A[6         '%%#)(#("61"10".*"*#76""!7 $ $7%$$326365 7!"/."0/%'&(('#*)*-++-,*.-354162  !!!!"""###$ $%  %& &  & &'  ' '(  () )  ))***+++,,----...///000111222333445556666777$DEII8D9@A9A8BCDDAB9<=9=@FGEGHE;<99:;>?@@=>AD8HIEVJ[V[WKJSKSRVUTTSVKROKONWZYWYXKNMKMLRQPPORJVSW[Z8JK8K99K:KL::L;LM;;M<MN<<N=NO==O>OP>>P?PQ??Q@QR@@RARSAASBSTBBTCTUCCUDUVDDVEVWEEWFWXFFXGXYGGYHYZHHZIZ[II[8[J8iz{i{ha`aiuvivylsttklnrmrsm]`]\g{|g|fdf|d|cb~aboprrnoktjtujbc}b}~_`]]^_xyvvwxa|}cefdh{gqrpmsljuiyzi\\]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuuvvwwwxxxyyyzzz{{{|||}}}~~~\\             &&%)(""!)'&&%$$$))&&#"(#(')!  )#'                   !!!""####$$%%%&&''''((()))$67;;*6+23+3*456634+./+/28979:7-.++,-0122/036*:;7H<MHMI=<E=EDHGFFEH=DA=A@ILKIKJ=@?=?>DCBBAD<HEIML*<=*=++=,=>,,>->?--?.?@..@/@A//A0AB00B1BC11C2CD22D3DE33E4EF44F5FG55G6GH66H7HI77I8IJ88J9JK99K:KL::L;LM;;M*M<*OPQOQNRUSUTSNRORSOOSTOTPPTQTUQQUNURNabWWXa[n^^Z[Z^_Z_Y\lmm[\Y_`Y`XWcdWdV]hii\]Vf]fg]deVmn[ij\jk\kl\gh]`aXbcWefVp{zzqpwttswsrxsxwuutrqyryxo}p}|pvvuvvoo~p|{qzytuuvo~}uVoWopWWpXpqXXqrXrYYrsYsZZstZt[[tu[u\\u]uv]]vVvoV^wx^x__x`xy``yayzaaz{a{bb{c{|cc|d|}dd}~d~ee~f~ffgggghhiiijjjkkklllmmmnnn^w^0Acool  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/miu.3ds000066400000000000000000005762131361325167000145270ustar00rootroot00000000000000MM =={>= default0  @0   P0   ?@ cube1_extrA `A6???AQ7?hy\Hsc?&+aTH?CbH?#LZH?O/w?:z0?z?on?ݳbWH?JUH?0`H?jO2_H{j?0M?ܿQ?BO?|ٿ#? IB"7?(ܿl?F6@Wi?v߿!?_Mۿ(;j?rڿ<?c޿3?Qa߿(20~?񶴿mUHi?TH?aH?~saHb~?ě? ȿEg#U?A=_?-Kſn#P?ӶPx7?Rǿri#?&{sc?x˿Ya#H?ƲYH?ئWH>{?^HF?g\H6? {?ɕ Cп?f򆨿?sw鿋Pп?|}4?վFп̲?_w{?8п_E?ܿի}?`ɿ?a3ڿ?Sƿ+l#?vٿU?3ɿdx?o>ۿ?ſm#?Vkݿ;?￸ɿ9?K߿n?)ʿ[d#n?߿?t ɿ?xD޿?4ʿb#A?ť̿?x4̿?hſn#F?ǿi#(?꿖̿o?"U̿>{?ƿk#?fſn#?$̿S?~̿0~?˿eb#H?uɿf#?ᅰ̿&?Ȝ4̿?ɿd#i?]˿a#?_o A%  $$%$$%$&''& & '   @0@1@)0) 0@()@@1 @ (A12AA A 1A+AA2+2+233B2BB2BB3  B0C303C'3' 3C'CC0 C D4D5D+4+4D*+DD5D*E56EEE5E-EE6-6-7F676F!F6F&F!F7&7 &744G7G G 7GG4GH8H9H-8-8H,-HH9H,I9:II I9I/I I:/:/;J:;:J#J:JJ#J;;;88K;K$K;K!$!$K8!KL<L=L/</<L./LL=L.M=>MM"M=M)M"M>)> )>??N>N N >N%%N?  %N<O?<?O? ?O#OO<O#P"("(P."."P . .P, , P,,P**P**P(( 0ALdefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA~@cube1A`A6???AD]7*?e?T~d>z ? Џ:(?zl?L ?ȋ??(" ? ?7YN?=a?=^>S ???9>PP(?>m@+?->`?w;T?¾3 $'c?+n]?ꤾPk?k-'?'O4nB>=~ZG m?IMa"GF?&=Dn'>lN=4Y亽/?ٍɿJ34YHPj?M>W?6ҿH?׿>[ҿV?V ]A)-EK=jB5T?'DE5n8@?=EK~= =R5¼R5>1&I(Q?N=?0RAm?L`a=C&;'{X\Vʾ+5S?V$>`>LBъMA$x?Z4 zп Ʃ?`Ar1T?!z珿>SXyʽ$`tοHr?/>8Ͽ㙳?`ǟPz"̾ e> >>&an*t?%zML? J`>}p幉?jM,\?zFU?UQ=͑syO?^8kC+LX?5HP/h??uؿN̳?{˿O@&Y?2K$?z;Q2=3z?L022%?,s?b9ݿH)#>QY|Ԡ?ٵЅ}? k}'$?:T>+JĿR ѐ!)ÿ4x?L5?2uuN?guJ>ɿ(RHr?0?x>eM%>Pt==p OY<#Ѻ=p3<,,5=ᇿ5U?h<=,I=?Ɗi>*b>i+i>* =X]B]?=NeKQ>O-n?ωOпF?`1\SD?Yq\p>1~K9?E&b.5$o)K>:>7w?\f?'ƿK@?I"r>п-꿝|?= !k? (=h K?iH\F>;NRn?xMB?Z횿H{?!HbE>tEPJ?[AE?6ND^j?y=þJPxSK$e?F,m@?x׾1"?j=z==<%p?EP5V?tʿ]пY?JEy6W?׊ί ?ÿQѽfx?2>_9?e!.ж+38)?_$>p=V%?西Ow?dJf<+51 Α?}O@?};<뿸?hH Fn7g?&KJS?cI[Z?lΉAO?rF?0P@?4!GMN> WsQn{>! Z=->;р㿏[*Q >]=ꁢ=%eפ¿a'?oR?BȾj`cP?>ĬCeR#?r+z>A@?K~;>nΧ?+Q>ԿҥF?oV>V̿] &z4˿оMӿ*⽡C vOv? Կ{MeI?޿MƖ?mR3Ksp?noYxMR?EYO|?1N6?I?,53 K ?nh0KB|>/¿U 8?2޿i$>uϿMB}=#X5(%4Ma?4۾.R=?Cս~aO\A>t荾s*ߺ>9!%пN;򿪗׼tl{ >2\?˅?ov?pP\%}?=ؒI?Е\ѿ?<>ދ~?=!?VI]? H5?Y?ݿHI1=nKȾ 0>>n=Yxgrt?)fƉ?^w8?0#N?v!N ?B_$C>%cff>r^2>IB?/Y>->f7?6>Zsx0нjN@^ؽ5$x\.,?ſ N?.WLq?brUKa?w!NI5?daO&x?Cܠ`L?)oI$?y%MLS?_Iyl?-ٿe&?.⿌}>RNmc*?Ok Y?S޿] ?`Կ _xW?U#@? 'Me?Ur?;?WY>c(9.R2;O?_Q3Qm&?-J&==g(">g&q=#~` )=rC7G^?ir=mbxe<3iP#~*=EOR=V?rz=7GM0?ɾ@d>6w6<ߑ?K)QF?rܾPN.?]+IJ>1P沣?l}=B%?9^2B?_ONM?n쯿̐NX? tJ?s P/w?5K6?&l0Hg-?f࿲ON?Jg<@8J?^ξ0L. ?1tQE?񿦒Ih?ѿ>CI ?LHv?1,ȿRMH.?ڿndN-̧?&Jv?omL;?b)P?y?;M?= I?dK6?SiK?ԿSOY?"H??ԾK >OL9^?QjCh?MMPiz?ֺLtQ?I1!>bYbRz?>L@?ԢH>oȿSO}?Leٿ@&_?j)KxYE? P1?XfPZ?DKp?UQcOt@?$FkJ?ǿ|I[x?a6pD*?Ŗ@,?^5%N>:~gQZ?:H?ڿH{?ֿHw?޿oL%d?K8Mu0?]-BL?rNn?t`Oc0?p%WNn?X~LJ)?QJ ?gJ>=;@M}>ľ~RV?ȶZsL?i@UI?lIި?%u;J?j鿑 J? ĿH,d?XɿH8?>7H?%髿H>?v4H[?<տGHCh?_ѿH?BI;t7?!ӿ]NQ4P?QͿM&?75OPR ?O#?3 Kc?Ml?0L㉓?pKޏ?ĵܿt%L;?FMK?促Jh?@FտoKMq?+0rO5ē?UG+N\m?sKN?]cOV?+O_@?aO<?9lP)?㓿O/?~L?)a8M?cKs?~Km?"XOXcJ?%]I?PIK?UJ??:K?#dKGI=>SP]>$Qh?oe#PM}?O6Nv"?N3`?}NMY.>qR>;=/R|>cyRf>FRÿ&Po>I [Q.v?(/O.?WNذ?à;Lڵ>R8G>YR >)oR=>{RR? R4?Q^\Q?_l$P5p?m˽TP X?W4mc>7#+?Z0z??#+Aj?xҿKQ?W濳]?>Cq#8?X+=B%8?`$.YO?I=#r> -/.u=mbC+[?ֺɿjJ?ѿyI >Ko zQR?;N? <@KI>1ϜPh?B6~?jrASܒ?IO[e?GN!?F]GJti?`3J)P-L?z뀿KE?LH!?ܿ֝NA?ÿ?@`? Lv?Þ ]Q"?0WIg?.ϿcIӭ?PHy? *fM)"?aٿNxX?5tJxV?Jl|Lp/?P{x?ⰿԴMo?ͨLH? 8KȤ? 8jKO ?ֿ(O2?J-.5uIW?S0K8=͗bL?\9 Q}}?T\OWC?ÿlLG?vIQW/>zR ?/)BM?NGHg >LOɿ?<|߿J A?!=+JnW?YվPrx?ᠿO? K?K'OH?ᬿJ?Ŀ BI\d?EL?TQ@k?=?M>˧jzQN?aI ?ؿLHQ?OwҿH2v?ٿM8W?~M䬎?Ђ쿁K(?;XqEM,*b?S+nOٖ}?`K:NF?ۆ I1?-CJv?gJU> n@M`>XϾ&YRn'?)"9^L?Fܿ+I?loHI2?J!?U8J;?ȿcH ?-yпH<5?=I?Z=H?I?}ѿ-H?DɿHL?މ俓I}??kٿqNc?xѿMb%?}_O>O>?KU?vMKia?#Mn?%*3K?;ؿLU?~#nK? 'JRS?οKbcb?59Oh?[{M%?kPM-s?߾O_h?RJNJ?RO?3a(QI'?17O犯?$7(M҇?HWM?፽K? J?SeK&?k[+ZK?ƾ3M:?R JM?xKIA?z|Jq?؍GJc?7BU9IG>ƿH}s>0P$O>wC!R?s@M?x̽EN_?WO?M@k>0UR?u>*GS `>[{OgRO0>NQ`B?C;Qx?һQ%-b?Pi-?r o&P=?Eǿ6K|?߿IJz>㷊. R?ÿeM~?N? I> CӉPW?PA6?nGKkB}?'`OR9?74 O0l?¥J[Տ?ŽO-?]Y0Kv?d2H;?%O3M`?R@@?LG>DҀQ'?XIM?WaԿ}$I? ǿHHPv?ο5MAҿN>?(H&? Ǿ6dK->}f:M? ?Q@S?+~P9?X7Mx?EII=URK?yTL!?4٫OH ?3пpMOm?ҿl@g?jK5]4?iQ!>ZbOP?L{Kߊ?z*OA?l9J ?ȿI?8BC?v aAţ?usNE`>DLQv?࿧HE? ۿH?ڿcHw?~ῶL=o?P L?H,ZLȅ?t&RN2y?nxlNc?y oN?L*qFJ?Ё^J>?/g!Jt>$ҾQ6M>Ro`?3$L ?M[I;?H_?O࿇ I 1?̿N=?Mɿ iN(?){oO}D?-¿/9O ?LXs?쿡Lox?.Ll?'KP?կݿKޞ?Pe)bK7?AsJ?ۿ^K/ŀ?J(3O汎?i4nNQ?N @?_Ot!A?O\8?6rOA!?wK\P-?ÊO5?L ?|NLdj?ɪ)Lt0?꡿K?O:^J?{DIz?:I*X?eXb%IZ?,LB?-K?qLu?ɠL?5CI#?^-J?7Ǟ8J7?4!IԹ>_!IԜ>Y Qlc>Q?EMr?^4 N~?}nNʽ?QXML>|$lR{>3KRgf>pMORP>0?UR|zJ?`B[Q;?ą+QT?Q1c?2;P:P?$>I֧? 5I?6߿ H?俈H ? J?Y Ih?| Iڗ?x&J?$QJZ?QkJ?wJ:?aJv?!wI?-I.?ܿIP?lؿkI?ͿȻH?oʿrH?vyӿH9?տH?g H\?8ƿH?%ʿ!ID?S㿿=%IDZ?㦿H4 ?@He?QIc0?t Iֶ?z!H}?otHt?#nHAS?9HE ?ڿΤH4?⿞H|?H)?UڿHF?tͿ0H"?ϿH?ſZH?T<¿?HY?ݿpBIDG? Կ=I"?Ͽ8_I?*ؿҏI|?0L鿁"Iu?bJI?ؕVI;?GzsIR?=ӿMJ G?տNe\?RtݿtMf?GۿIM;9?2N]N?ƿ!#Na?ĿMM? mNf?*jO?W>hO%?!R=P>G橿pnPC(?HпN?/ƿVOg ?ʿ5]Obr#?gԿNp?fL'?AL5?UE=hLon?EtL^[?G鿰>MkW? 翏_MfO?M*0? K?mL?CgBLK?o)K?}uKK?3YKΦ? J(?АJ[?lK-?߿8Ld?/͊LB?O6L޲?鿶Jr¦?zFJ\?𿐮Jf? ^?Hѿ{J?vտ:LQ?NҿK?ȿwL3?˿L?KPuN6|?@"Oz?WNB?ae_NZ?Q -M\?ZD.?oq8mPO?k<Q?3i8PB ?(gP>0 QZ?^(PjR?ܕNb??e똿BOfOQ?7.Nd?򰣿:UNF?j,gM48?PK?հ(LLP?O=L\?[S`KW?bKJ6?MIK?k-Js?xnJ|?tJ]?pJh?q?K^?b2K~?Ѹ]I>?ŪJv?-JY?"0ZI_?D_ISM?vCIF? TH$?6 IvT>~}P>N_P>!̿OB>#ƿOŅ>FQV>UQ[>ꢿQxP>/oQM?<ҽ O?pNê?#R{OOϘ?#Oڴ?7f"(Nz?v-NSԠ?aPNT?`N *?Z M=?AlPMkk?ԀɻLg?( /{Lۛ>tRT>c R&4>ڦR~>RtRr_>1^R f> TDR1>yUR(,>6no0RX>vfZR=>+iARy>aGQ>lIvQ ~>#>Ro>g2zRJ>(1Qb?n gQ."?.Q1?VZQ?GMv1RZ ?M=LR]G?mQ=-?:Q]"?m۾QjͿdIR?ǿ@IGO?IQ?(KHC?2- I?o)I?7HP)? Hޣ?5IHv?ҳH΢?T¿H߭?X޿fH?MHª?޿ H?ֿH?nӿ*H?˿Ha?ȽH)R?@ƿH)?ڿT I?̿$IH?пI?#޿Is`?r;.I@?|OI?WPI??f:IA?1Ͽ 8NVN?aۿZM0j?;a߿%M7d?ֿ kM-;?q¿NX!b?ʿ&Mpa?MYM8?JN#?`qOuK?@Oq>ɠ P>4P ? jɿNu?ÿO/?lҿaO[U1?nֿKkN7?I{L#G?xLV[y?Lb? H忁0Mp{g?jLI?n+%M/?A޿MNO?=ZM?/0Ls?*L7?)UCKf?yjK'?hιKִ?$J㹫?h˛J/?*SKG?hK}?S0޿ԆL׃?bzL)?lk%Ky?tS迥J=?Q K ? TJƻ?܈,J"?ݿpJ?߿*J?ѿxKJ?ϿFKS?tٿKK›?M˿GKׄ?xeſLb?gҿؽLK?9Nn?nHGOn?LeN8?0u^dNo?O0~=N?nY*MI?ULzG?u*`M)?  Nyԟ?ډRNGߖ?'VyN?;^ӾhO!yv?{БOa?DPA>?<yPJV?*fPI?+~Ok?WN+Ps?w=NW?_EO )?f;aP0:ktQ>O P?~dP??-n0gO‘:?B/O`?ά?N@f?]tNh?2M?Bq~MUp?,jNq? M9?㨿LҚ?CM?ᴿn6Mm?<@LXg?!3Kj?rE\K?.JZ?(,J"|?p;Lq?̻)K|?d$Lp? _L?Dl)I^%?-O͏J?&hQJ‰?ցhI?yLpI?PJÏ?zH?~7IK?sάI?]5j8Ii?xI$? [I?c}Q?J ?u 7-J ?@T9Kj?;73JT?x/VK?T)K8?HY}J?;s%KĀ?9 ?LB?QK-5?ipBK?N׾L?(DLR?M¾M#?V޹BN?9M[0?{)NL1|?~(L?]SA8L f?ESKCV?࢐JQ>?㊿IO?"#vURJ#?zJ,?XaJ>?~Jt0?H\dK#?ïJ}?XIC MI>`ڷP>۫ɿP5>vοO >ƽS?Pm>YQD>:P>NKQg}>)PQl?ΕN?TLN;?2O?قĽ|O??;MNu?m&-O5?+Nڶ?+݊MP?Sr rM?ֿ&M ?eʾONL?3LP>$Rܜ>aŀR>޾Rj>HR~>HKRO>@S*>/i8RC>ӗuRH>|S,PR%>uY+RW>$VQC>aQH>6+`ORJ>:Qb ?{Qy>D#RZ(6?o$Q-?@K@dQj ?smRv? i'R>@?╾OQ*?hʾQ_+?ttVQN?lP1i?'^Pv??Plb?KzO{?"1Od_?^Q?aڽMPz?|]PW?F_ԽMQxNj?.j> F!?v$NI?CD?B̿qo?&㿊L,?[1Y?-ac='fZ>M\8/L=?ͧ,=$-=>,ly.n=pVҰ*E?C迃8>2%4?FY3-?#򼾠*/u=O0h,֡?tMo?o_OtN?u;F?a% ?ƾZD?ёօM޵?xE(M?93?Y]3o?gžKQ?ꞾBK?[RSM?-ǽN?'=/?{-?L?ӝ8L@#꫿ %ʽ8P> |%ʼ늿WTb=nXSq=ΓKv9\&mc:? )0Dj)Q9,tDS|nS')= zQi;q9s,5zI޽:K*V>=gۥSM X_-<=r8={*Sx >RVO>SQ>: 7%b?C.Ԝ[Vڃ?m!iHみ~CWOT<8SVc:=XDEOJ/h@/Rĩ8񽵂tF.}hPTĮ=V7+Si<˲C 7IA"`@CMg W|oP|{N0a310200=2է#½c3#IKC8eۻoOH]73yQzam{R˃Iܽj`; )o7۽{Ҝoq(3Cm='b@RQ `9r$-=FyR>F=NR'J>A/>Q1>Y!By'v<褿MtAk&}=5tC]=~TSH&>jmRU>%Q}=Q+o\?y=LJHK?z>.*m?=J_cK?c=K;?Ҥ>%+է\?˃2>ݩ);?\=MpHv.?T=./ʣn?C0>+|?=F R?H@>:b?W#>Q:nB?7=Q;cC?$5>+GC?j=J 4?=;b3?=`,AT?<'>V!*S?qN= Jd?;>N)mt? >`9dt?7= Id?=J:?D=8;ƩZ?.>ߚ:xJ?Xq>4;j?"*>, :F?͖^=1$oH?z0P 2?UL;5? |Bf?>>BF?=xoCٖG?>*V9??`\= I00?=e57?=+wX?U,>n)O?-=l KKi?{=>*lw?i>B@&2q?=aeJW`? =VJrN?/>2s^?3>A2(p>?_` >)36??j >UX+RG?N=%K7?Ѐ=ZBN0?=-.P?`!>]*W?̲=J`?7>p|)p?"/>v2w?^=uHRh?0=Jå>?=C;6?)=L4?7?]=;s>?s=[CV?U>:^?G >B^?=>Ev:V? *>(p2{F?= ];TN?(u=4CA~N? > ;+bF?>43f?-'>-:|n?}>K BKn?z.>9f?N<>K 2:?5>33?sZ=.5;? Ӵ=B\B?=CZ?>&Bb?r>BZ?/> A2LR?l$>20J?="RCɔR?l=CgJ?.>G3HdB?y >g37j?׼>XoBq? >E,Awj?|>>2b?כ8>11nB?E=b$Z|L?6[p%P6?X]!D0?8m<%ȆT?Ɣ=?F#`?i*O?$‰w?d(?菾jq?]e#?<?NH? %?F>n[9>Z >f>o@ ?$-><?t!?˾,?H>?I]'?а>>i?fz>W??&?R!?P?JϮT䍾>HL{&<6Qɠ>>pFG JV?/f輵^R?@=%>X?AC>E5+hm¨b=ř>b>+?(~=Ͼg1?ι=p}I?1>#>?̶<]?^>._?<< ^?n>"l]?SbJ.DSbh@?4?#=pI?5f?>m>l?):e>7>V ??C?' ?UK? $?^>z*?z>K?)w?k>B$?N?w_X[?>?[{?G0*P?_,ق?֫/;#s3Bi?ͽ0>Rk>o=T&gT?C=siK?"r{?bhmѿV?#V67a6?rC670>O!w}^D>P? >P\?k̽/^gs ӣ1j>W>[??KY=X?|aֿ~޿zw?N=ɍ?=u?`A'/? (};y3[N=HG쾍Z?g/L&?6>!0=E=G鉿;@G鉿f>{=}(.qv>F6QRQ4?^N$.?Z|[Iu ?&)o4>Q?￾B ?x|)A$ڗ?z_O--RasQR]Jㇿ6J?KݴK1U ?>zk-==dn?<=TX3>EI,jۦ?MelпTK?EW?8R>-ꎭSFԽe.㿧w?&4>t?,¾쭿|=w?Ѯ$>=TQ8>%Fl?+uM*q?N3J5s=gK?{z9PO?3װ0k?_ĉ=r'F3a?H0F?RۿNa?ǿ}D@_?BKz?+NQP>.$I> !{eovͿ2gο?}Ų?|u&?&]=~?I_?Ϳ;tI-"yR鿱>&7N+k>QH=^>꿞c ==YctUq?G!6o?tuA?hu'Mb>[^6*:?"WH>W)MD?=$>9? @>Twݿ[?VI> Ͽ/IЬͿ1 d?ܿsjvBHMw?s!;M?"ٿN ? |IJ*?ҚSQt?hK*m>ߐ?;>?Nq?׿NOn;T|N5?.?/ǿ$܉?6Y8ȼ?ƄIcؿh?EiIg?zK;?+F3?s- &*=XldLí?W aQڻ?,/O>@!>lB=f >=wՓq :gwX/}*<>/ @(`;N?ܾ@Zh=:|<^e?N=*6aA0>8?4п$?e;?z.N?֍8A>@s1nL$WDBhi?&>eV?VjnPZϿ>0>sп>>=ƿW>?=+?6*,E?NÅ,e7>X:iR?JĝRHiXq?%C<>^+ PP?H0A_?{)G`?̾pP8b cATim4 ž5?DA85?\l=] t{=B="o?3M1>V4>Hz?9ӿCѿt?`A:S?2̿7%?wCοqƿͪc Q,zu?)>%O~?cǿ3cz 9E?>` },Ů?wbO?:JeYą ?\xO/?y ‰߿kB?Ηw)=tfduFxS?lݿ4Z?<;`EV?G e@?BM>`wQȭ4>|l緿)>tˢxѿ 5=< fĿ j=@_f? ?Rg?Jg<*?a<ſt?ӿ?tԽq?I;?G-I?R׿HH=a+t¬K>(t>%Z={C #ڿzB?y/Ӿika?^ؾB?w r>y󍿣Wk?XК{>9` 儿'?eL> ?OV>E˿)3?X>3<ȿW ǿ [Y ʿ4 Cgv?*X׿ MP?߿M⪒?:K >Ŀ< Z>ԿH>(Ϳ+>`8 c?l*Y?%.?;D̿7↓?ޛz?8U?pFH6?[|g=?GTY:Uj>-=Mx??վDR2?en3Lz>ϝL<>> \ڿ>*!>¿ſ>ȿC޿+^$߿Y=뿙s< ehgiRk% <,z 3}ptd\ ?HjZC>Re5y=C{=Sw:pq>>|o?ePg?d֮p_8X?M+¿ſ5x?y =?@jy,{?4y.ce?ipsno?uRGn?jp?+Ps?ffǴp?]5ſm?iy/?&=4J?>>U?ac=V ?m=8?BEuۿ 5?۳8߿)?1ƾ3ƿƃ?w/dӡ?GݞiZ?uٿZIy?e7Iܩ?3zJ|h?r|MJ ?'ӿ\Hۨ?Ip?FHV?p꿨I >LZ <磾Jh]T1j= .>]-(=1O> .`?Xc<g?r=>] =9¿i>=׿6Iz>R=JU=j=ިف;48/n׿?=p ¿?HY:8,e0ѽ쑟?Ή&ǻ?鸞[ ?P nIHu?ٟX(UsG?󮓿?3o?dj|s?(Q蓆?S޾!N?w; jmc?lRga?r^-s?}bm?-zN?lN^-:*?fskRt ?ϮCߗ$?)蘓K:?,(Z?}w'>kZ>Eaq>O(7sW>8m\Iu?DD>ĿkA>](9>J櫿/>>>}44>X%>HG?J]>޿*?\ Z>2x 9?H>So\?N>O߷#?A(;>y@?4I>J K?G,>i+? >Y莿La+>55LܿC1JXf'(bݽoپ9'$ݾ6ÿ$ekHy#.'.'yNLꤿ$jý83nD?ۿ9Mtl?&ҿdSM%?>VsO/P> }P?L𿵜K%O?nVcM[?JP7MG?K?yֿSL`Ř?XzKn? Ѿ}$P~O?BKOz>[VQt&?{O?iIL8? =BRJd?;>MLE?Vܿ>g>Ͽ?տ?}0?ds ?ٿ0?Dj?8?s3`b=Ni(>OɿPH>jPIH>3g&7R:=iм=񨿅&ʽJ낿um͞b=?P?nzVb?*L{۵D?yã%?:ۿn?eɿ8?M[&/R?<m?WǿM߿?ֿ)E?O"ݿ?51пIٿ ?1o鿻X?e/0߿,v?׺ٿe?t:'?AxDLj>?+ XN ?>mO?~ovM?Sa L?/@p?Q!2.?ǿV?Gׄ\?>G?xj?3߾`0?".F̺?ﶧb?E쾄CR7j>F(SP> \R>eRQd@?59Q ?S˾R.$f?~E-oPM?Og[> ~bŎ*=7?,砽F{m?=l3!O!? ڼi ?">f;r>"u*=S"bx=q+>=K}ھf: hz;ft=x9{r< P<-Q?=ܾ@]U? w= U1nB?b}*P?4 M7>%Ϫ +>ܣw sE<_@?;L=lK*L"?[=^?м<*L\-?4۾Е N1?Wоw E>29v4FqW>e?>M7;hXQko?ÅI>\Ū-P?EB?TqB?ڭO XC?%v]N?##Js? #O4?CR%N?{=@?žLē?:|Q?u¬tI_? ӿ3Ihv?˿DM5?ۿ>N?sJ]A?s0_P?ӿfO@b?6CۼXxH?ξ0 LI0>DLn~?|Q~c? bP?:.3I9>T¢R?̿]{OV?ֿ@? 5KKOPP?_Kx?hGHO?tq!Ds?l쑿[@p?!WNؤ>3H][Q?HH>?6pۿMHqOw?{߿LK6j?UMă?_lL>5eҏRf ?x/L"?fkI?U~IǺ?JcU?EzI?¿H?2sƿHX?LH?:H 4?Ͽ|NF?s˿2Nz'?ΣaO9)?IJjOsn?^Kwk?QLr?F` L?K贓??ݿuK=?8迭WK`?"yOĄӺI>FPTe>fQ?iUvM䱺?t'Nү?ެN?gMN>V {RV>T1XRuP>B7RUQH?5tnQnT1?&QϻW? PByn?,P+?TIs`?DIUȿH? Xο1I\?14I?Zc?HG?gHr?G#I?_I.?cH@?vH/?!gHo0?𿭂IrQ?ZпyM}6??Կ/NT_?߿WM n?ݩܿM/?w񸿩N-O?< ʿNl?!ƿM;M?0 ^N? "Of?`tmO=?ŚRPOL>P/?3ѿNFJ?d¿yO?ɿ-Oo(?׿ҐNY j?(鿉L\?/ᅳL:?/SLi?O&jM"d?h뿓 M?]?&=Mk5?)ݿ6NW8?⿭ N\ܐ?HKu?%>̡Ly?[j`L?-sKL?CYÐ;Q?SjyP)-3?ӡO"N?uNb?s&PBIE?ip^I?^I!B?4"@Im?hpIL?aVH|JU?nL>J|? J ?߉g=K[@?۾HtL?MJjN,>F$P[ϸ>zP>(пO>EǿOYgv>geQ_0>$$P{>LPi>„Q9?kNoF?8ýNgȠ?2Y"@_OMs?ӊtO?pM*?TN?RO\1Oس?DN`s?eMM?MW?%4¾Ls'?hEL6>$$R@>SR >վR!>#tR>om>BaRשw>99/RrD'>R+ SP >Kz|R>~1PBR晆>uf^R+>YQ0>IzQ:>OYR>-< R?,.Q ?`Q%?C8;QG;?!?!Q?PkARj?w˳fRQ?ǝ!P*?Qfm?Q!Q@?߾P {{?E1%pPie?m.yP?̸Ou?UOP?VQv?P?^=P)k?@xzQS K?i0hge?zc,T<? ۿN]>!>. y33;>A)In>4;-j=90&?[=ZiH9>$ڍܟQ?$;IR'>PMϞ?g{B?huAxڍ?ϔwOW?JUQN±?q]Jm=@H?ؾWLr4? )jQq?XI~j?'пLSIv?ΟĿPbM!p(?~ٿNG?AJZ5?#Pµ?~K?տ>OՑ?oIB?ڡ۾KC>bX*L?]mrQx?RPl'>6sRl[?Y}zH>`ĿO].?ܿ,@y;?~KDN?dbP ?jA1P=$?$9)KnK?;}O#n?0D?@Pִ?l M>Kt&rQg?Ht/?ٿcHv?eܿ!L]?Fd[MK֊?,L>MAMfj>ɾXlRn?m >؄Lv?P߿?I?YIv?z`J۽?1"J?ƿH?u7ͿH?#H?ŧ&H0O;?..ֿ;NY?-ϿM%? JO3?nļO?qK\?IF濸IMi,g?쿓LW ?IbKԉ?ٿnL ¿Hy>鳿PU>DٔP R;M?v;)M!ȸ?1~DN? Og?Mg>&eR>g-Ron>LoqR >I,QbPD?Q|?oQv^?hPف?ZWP9^>r-Rо? HD7>hP?1dAi?ABt?<~#P/?op#JO{?zJuʐ?ɜ>O5 C?_JE?1E@X?ŵ6)M\E>oMQ3J?s?I1?տI:Hv?ѿ'MDB?ݿpM?ZKN?>P!>&ѿgrL3?[2_GN?WB¾HI?>/!Mj?u\?R|N?эcPպ?J6=f| S]?_ԿTO?!-Ͽf@y?mK[,?w >&Qެ>&6P탔?gK'?UR O:?{|ņCL? 'Aǡ?QdNQ >:;Q?zx޿H?PܿxHw?$LӲt?lL{?7L>􍿾 .M?>ΰR-Q>EM^c?i|I.l?:I?It?-I?pŽH?2TH ]?4Hwz?FշHl.?>SɿN4?LǿNH*?.6¿[N#?ÿOЄ?8L${?yKL,~?X↓vL-@?r%LT;?n2Ov5?zOM*?Ϊ}T%P/?u>O?fjI\?usIJ?w9IY?ihIL>uXJs>`$,Qўb>YQ8'?C7MD?,^Nް?,N9?v.)R>q6RЕ>dzCwR>⫿>P ?ο Na{??ɿU2O?Q(̿5O]\?ѿNu? 꿒Lbc?l*{oL~?`꿺L!t?BSLCS?DrM}oQ?GL:M.C?SME?uM?Q=K+?9L1?|$L?DhK=ҙ?,rSKȊ?VF>KC{?8JW?C KO?zsK5?1R)LI;?Jح?i\qJ?3="iJ8?)ҿPL!?ͿdLF`?BOb?1 PKT? )ZP)R?0IPt?2QP*?nNP)?a@LP?BLPJ?dvpPD4 ?@FVP(>wP;?ՍPfF?W{ObO?N}?*p"I'?U 9~I[?崁rI?t"Iԣ?~:J<}?C <^J?O-J,?,NJ?KG?x?Ld>lÿRP>¿TCPW>|ȿO_d>ſP}>DŞ }Ql>ͤ;Q>n9QF\>DEvyQ'a? Oտ?RզN ?'r?O,&?l/fO?^^N6?AuN?RN4?ڣn{N?8LX?5[Mx R*>"O R!>3RȰ>RPR>7\RU>OOR<>iW`R9>~d%R>ܹd- RW>q l"R">y[Q-t>ZrQs>"Ri>(= R>!#QX>1dQJ ?Q'?~pQ?q!R?zr/R==?Qek? W.?Pvxy?-x QPg|?PM?bOu f?潆Pr?"P{?´Pn?PCu?H II6?NI`?ЍYxI?rI4?߿I~? ῾!I?fݿfI}?~ۿH9?ylxH1?H?"*޿hH\r?,A&H?K-IH?`w I:?PvIة?:S2Io?W𿗶IM?YcI`?ulI՘?z I?A!I?61@Ib?F`I9 ?#M￉iIM?CJs?Ir?I%7?h J?Q$P0J??=J?n|J?#nJܥ?/FJ ?h:J?Jռ?￝ JI?xJV?򿕑J߫? =J?UOJ??f[J4¢?3tK7?yLK?C?}b%:K?RgJx?.LJAC?꿐JB?鿊ZJi? KI?GLIր?`I?^II?]߿2IS?B㿌I)?dJ>?Tc J|&?JU׿|I?Ikٿ I]?ZԿI9?qҿwI"?ݿ `Inv?8ٿZI3?Ø׿6I?{ۿ:I?ȿHSu?ɿwH ?}ĿH?H`ÿ+Ht?ѿӖHH?t̿H-?{˿ʉH?ֿH?[տZHc?c ڿ.HW? &пHb?jcԿFHO?ֿH?ѿH`?¿8H?!IH?RH? rH"?V8̿I5?1-ʿHK?ϿH?ѿI4?ÿ1I0?@ɿ0Id?˿#QIp?l:ƿ_PI?ㆹI0?>лI?ŵ!I?Uf I|}?yHZ? cH?H?ibHV?ܩ/ I?1tAHX?4I?OI?VI1?bm]I"?#~9I+?8IA?ɕDHZu?w HJG?8ʙ H&?࠿H?贿HV?HA?K]H=9?N HY?H? H;?D9H5?פH*?@I?MIc?I?ڼVIT ?II!+?6"I2D?WҿNIJ?ѿNդ??̿ QNQ9?XοiNLU?qܿYMVJ?ؿMF?kFڿMbR?ݿߣMTh?fݿa8M[c?yk޿LM3l?>OMp?^`࿒L[?ԿMje?$ؿqZMm?&ؿ6MRc?5ӿ{MD?dĿ<]N=:?,N1?NbbPH>뢿@pP >P>+P>^P@>TUmRP)>찿f`Px>1ﶿPi1?Kǿd)O|d$?a̿N(?˿qN?ſO?ǿOl ?ĿO >(&OK>~ O?_ӿ2N?Rο3O?ѿ +O?' ֿ N,?ӿőNS*?1տN6?ٿCNq8?׿ BNe?2]Lhw?˪LAy?(L爃?EᅳKL ?뿲H?gVۀJہ?>FcJlƸ?˵)JfӔ?׿I L M?ۿHK'?Qȿ.L܀?ÿ2M?BԿ(Lڛ?(ZϿ$LB?пL'?vտzL1?O-?>˾O?`¾QOC}?ؾOp?uOtm?O81?nOX? fPI8f?P1>j?T@!PJ!\?㾰mPTD?UԐPF?*Pa}9?QP7?P]?}%O DP?#W5PBO?0P};-?)m] `Po!?_nPC%?n_P0?Il+Pr5?>I}P6? MUP C?L+PB?d1>?Pd ?<4aQe(?n$2=P(?0$P]D?v/&4QX?i0TlP? E$Qm?$IUQݙ?rW)Q?EQP?DP$?<뇿VP ?uwVP>'~XQ ?yP+>j$QA>ioMQH}>< -P>yۈPL>qQ>`%P&@?+PA ?#+TP/?U P?ZO>?䔿[OA?wqO 6?HOD?Cۤ-N;?Iҝ>O>0?0lOB9?&OX?ꩿsNb?tA#N"R?sII"?ev J?aъQIR?Yd~IW?/I!?㕓I_?TQjH?Ir? }fI?"mڽI{?kI2}?7zwIP?LGI?RIV? )I?7Ɛm!I?wI?0hI?bo`I ?y{IT?MaI,?>dIb}?TJn?QyJ.?JSJt?2tIgJ?X,J?YJCf?>.SJ3?.=s{J"??fJ3?h0Jr?.T%K?7Kg?RUMKX?^eKί?3^:jJ֌?%,J2?+'LL?xKǺ??K?Z@ L$;?ྸL ?ʾLLY?G7Mԭ?ƾPMٺ?M®?fúNRW?ofN[]?ӹ2rNո>cPJ>kHP 1>=Pؤ>TZP@>ʿ OT>ſ2PS >`ȿ{"P>hͿ:O>Kʿ Oem>BOͿO7S?'ҿ_O0?{ϿnOt>^N_Pq >TfPJ8>]P\>gPy>;9Qa>D=|Q?Ƅ>zQ>Ә6Q>Z0ժ]PT>ŲPn>P>Jȗ.qQ>N%1QԔ>Z$Q{>g(dQ.ہ>Q۞>oHQ(z>Qe>{"QE=?ν۩N<Ѫ?ݽN?cNK"?HXNn?jOǬ?ONs?vbNRf?Ic\WN?eO? ?Ox?snOܑ?m/3Oh?pɽEO]?>O+?½Oj? kO??k3ˇNK#?̙P;NӸ?aEAN?n']N?e:Ok?z)Nb?‡COB?%bOw?b1N$?ΒgfN?>N ?aNĵ?%}Na!?轆-N~?ĩM}?mM$?2bMG?Cg?M?ζ]-Mv8?+a&M!? NsLk?EgL?վg7Le?*ԾLM?͖ML?#jL?vLt?:L6>Rm>x RY>`)͵R˕>$"ÚR?C>WR7>fRO>w kR@2>݋>nRi>RZJR`>4㾄R>MU̾FR0>v ھ(R>rRl7>3 Rj> ,@Sȉ> S r>FRɷn>S|R">^KR>lP>R$?>J_SbZ>1BRoa>5S5D>>S'#>T\lWRW7%>5H_RR|>H gRW>itR7Q>jRT7>TrЮRV5>OR{\P>ۡxIRS>[^"JR7>V!2R>zfISR:>P3lR'> ր Rp>/?t7Rs>~}uJR>EVuRd>!>bQ>heQ`>hQPJ>9vQ,>^Q6P>lQn>/fQ>WWQݛ>.u2RS>!HRy>l'TjR>5SR0&>71bQQ>b6TQ L>p?DQ2.>*?Qf?Q?LQpY?dpQmx?w-KQc>2R> R?2N1R>O=Rd3?bQ-H,?V8Q8?o}YQD;@?xAXQP#?MnZRR/?+^K+Q8?'Q+?}57Q' ?S]R[?鉾PRu?t}Rw>VR9?B R ?Wp>ÿ_1B>ڜb%R?hA __?:5(?@ 6g?0%/?ο0 zS?ο%Ș?*;Ԯ c?r1'?l&IM&? ͞Ku?r(U?g:,hא?go=i!?33$G*sY>yy<>?<˚#0fO?O;cN">vu)V>d` ;e=*I%n=}],9U;?݄|tXSqe>v!5oj:>njPR?ݔ\ I?ڕ&?&7 ?(ľ$5?ٿV ~?ۿ%6?I翙 ;?h,쿔)??jM@?DDHkl?HG ?McS2*V7?P=t?3?&ԯ)4C?ya;*^?^=!5_u?CcE=AMo~>A̾!*1>hþ*<Ԣ=0('eG=jK3q:=? 'xAN?񣾨M֠? CJ?#ZN?6V~*}?H0?Mžw9=B%?j_?){*M?йF9?ȉMU?viN̛Nf ?]\>ֶ?i䫾*bE?lʾOH8?˭~qnH?jIJc?L5 pG?dɳ9?Ր;,: ?a!NS`?6~R=AS95>64MN=m6M/**Nʞ4(k.^K)5]4>RFۥ*SB==)Ry<ձ>|Hz=vɼ׵l/R>=SSmk>@kQ >,R4>~;=h@7t>n%dѽi:>fVSX;rS0=DP^Vջ844T |A%H*V[8֪";ཞ}kt)n]NcŎG_TH'=nªrS&-=t+H/fZ읿)EzåDuԼ西~K|%0MbgmޘK-Jн]5x.7>.r%9'[kнW&q#fr3ْ4eO3Գ6䬿ZKVʬDE(h{Ej÷;z ZL*ؼ-Pke[O?( R% 䱤mReN nxPOPo͓zrSE|WrS.WxEr vBL |M䯽o5F:뽽‹7\νᑿ6f5ͽex?K? !&@DV֊O-.sG-zzoL%ν% 꽃:y!lr7˽;h0NvU-%iܦ.$,pТl*,L{= <'(*ս _#|!$Z4oZx*AXx&-61=vp~RBugZR>JR= Sf>ϩǯQ>X)RjR>eE=GMC׍$<զ`"Ǽ pGV 2%@Bk,=ip=% zE"c=OzS<=Ss->T `R=IݞS@p>0BPV>KEPP]>쪿1U=x:+̬X?o=9G}N?8=0& h? >tFWH?n=dGE5;?=|X'a?d>%!I?>>*+ېZ?x/>)qM?=Ks?P >'y.k?<>+v?f=Irx?r>2C(o?= |J7^?v=Jr~P?>E6`?:+>26|@?>=7iLA?O >y8+ME?u= K5?C=H?1? = +-.%R?b$>?*~U?"=Jb?.:>ӈ) r?k<(>t5tv?>=0;z5?= <@?J=(GT?C>:`?S>F`? >d:T? 2>Z.D?-=1q;P?d>=4GP?& >g:VD?~C>4/d?/%>?:]hp?f> Fp?-0>9}d?D>* .ºF?'=U#D?=&VF? P/F?+6$?H6=- <}?=8M?O~?4^=BCMmp? (Pk?"=VMT?Ւ>>d?t>q>D?s\=ez?|E?> *PAA?b=QJS2?Z ==8o5?{=r(,m]V?*>S*וQ?Q=8Kg?=>-*Sv?׳>&=6 s?@=3Jwb?b=JEgL?H'>.T\?n<>j-c/ #=?,>c|*Y?L=J}^?L5> )kn?{ 7>1/x?tA=UGj?=J\:ζ\?5;>:>װ\?>:X?m"">6 yH?>H; L?=4?zL?8> ;umH? >47Mh?)>:l?L="> >tl?L,>9h?ڥ3> 6X8?n>4H398?Dt >/5?j=ܒ8^5?M=S4W2?=1}2?L"=5BX? >>NX?5^>BI\?=7F`?b>>`?h >Bd?G>Fd?d>BѕX?ƞ,>X2\?&>[6\?21>)2X?H7>m&.T?>6T? '>2uP?Q,>ԏ.yP?QF">2L?$=qCCvH?q9=W?XH?=`CL?p=LGP?|T>i? P?=9&C T?0=*GET?ɯ= CdH?In>}3rL?>7lL?h>G2v\H?!>.pD?9g>~b7"bD?>^N3X@?>fm/h@?08 >3kl?>UIBEh?u>N>ah?>Bl? >1Ft p?aJ&>="p?>A3s?>Ds?e >@h?=>aJ2ml?6>1E6ml?B?>3qh?/DF>s/d?;/> 6td?:>1`?QA>w-`?T^6>1B?n=]#??=<'aJ?'PJ?OxnNO3?'?z7?*lD3?~Ng<$L.?0k=x=)DrR?Eh=f"R?=%(_?2DsP]?3f<^%N/b?r=q!ne?= >$?C=3x?>u/Q?Ʃ=Of%N#?%fO*z?`Q=:Mwl?,:P9 g?=Mv&;lK?0F>6̴>K?0F>Bc>+2 {3D? {^JF?NqЪ>^JF?>qЪ>jqN?L?> dX> S>Xl_A> li>U(?_z?rj>8?>KY0?A?8Λ`P?">DzQ?C&>>3O?M&>>3O?">C=">">=Q?8?>s>J?9!? >o=?nxz>1kG?Rd? ٰξ%C?/nY=tS;B"9aY]&qa ?B=iJRI'- ?=KpEd:.f!#2=R=]?=TNL:?.˭F!Ds>r7/H<@FpRb>ܫɿ=a>۶M_ ?Ϳӿ>f= -ٿ=؋XFmOy 58O=sƻw,>vx"g}>&?$M듢?X ƿby?uɿuÿ%v?h|*?'ߋmel?f醿\?qaI]Oy?)Y톿^? ϏS=?c፥?glÿ?Nƿ ?J<ڿ?Z>Xb W?*=dv?޼0BE?ScʿJ?Wo\.?˱ӿD? AG5$l?x]Lg?q2I◿?I`&h)?!<$x#?==5w?=fB`?ݷ=퇿 }?Y(>҄C='|Җ>7_S>=)?Ty=}g>\=O<>fP=pԿl/>=妿U=K݆=r=%gٿ;3p񩿄z-˽(u~,Կ?2kt` y?˅[??`&T?JyL??ܾN?pa!N ?)Vv?ji8?Rs!tumY? -fi?ǗǾ30NV ?&i>V0E?mF\-4?鍿V|t%?(w.Nt䆳>MΙmnc>ZKsp T>${f R?Q??>J>L >/7">e>G> >J4>ʿ1? p^>{ֿHC?G>#U?@>)^?bO>E-?L>淿vU?=<>ӫ$>?>?i#>$XտBLEVr;C$!tc; eV`Խ.ɿWa`3Re Ԙ.hE趿9',ݜf, 2彡B>ҿ>˿5P)?{:ܿ6鿒6?}⿴L>׿AI?n6' 6?*?w ڿNC>iǿ1B >7ۚa@y=ZR o?vŭzQ~?fz?3ހ(H?n-%g?0'Ͽ`?=ʿ$/[?/K&z?WRv ,-?ɿoN?߿>쿓?/Uٿۿ f?dÿPؿ?Z?'%rؿc?8um?ܿa ?;:z9N}?X%M?``c 2?K?1$-?6 ѩ?ye'?Z$i?? T? =zg#[?xp e?=zxڇ?"=:7?>7Ռ5<*P? )=N `n>@ 5~":>;KR>|Ѿ1"l<5;|i=-iʩ8>=M:Kpwկ'F!+=JTN4?{=9a;>=w=$q]?;RI'?ZnBY>ID/>ν <^=vWRK[?./- ?ۿNU}>NQB4 c:>sLR?u&'?f;%?ؿ{%}N?=꿤(?He3ͰMPK?\??\+Y*ɞ?3<=4R ?wa;m>־$?ڿ Ij}?zzܿ0H?XDH?FݿH:?3ȿHԹ?XZHF?jſ;HD?<ϿH2?~ɿڎH?aԿH͉? ٿH?1ѿPH8?!׿[H?ԿH=5? οEH|?'HNt?UH$@?URH?Ŀ;H?[ȿI&+?˿}H.L?aҿI?ϿO"I']?vſz"I??̿+AIv?ʿSaI^?WC¿qAI>? I?Z)ID?mIm?_H@?0&H?UDHJ?LHK?/LHZ^?&H?լH?ۂI?RmI0?I0?长,I{?!TII?#)Iړ?XH? I g?腜/H?*H]?eHe?H?FHX?/n\HŐ?H&?gRHa? H?aHھ?iyUI?񿪢I?dI0;?t쿇0InL?o~ԿMzH?οNd6?˿ȄNY?|޿3}M`?;ܿ*cM=lf?࿑3MUr?;Lo?޿J MD%]?az׿ߋM?&n?ڿ(MAm?0տDMZ?Yҿ±MC? %qN0?μN<3?0ĿDNlE?('ȿHHNW?llſOMX?̿RM`\l?ϿNbMl?ɿM\W?[-N4l?¿MKl?MW?f@N C?̞NV C?N8/?Ķ7Op/?bO ?DOd?vakO0!?P>\"On?|UO ?QȫO?SO2J?8ɧOm ?󢿒P{">qmXP>RZP'9>P~ >iP>>#Pgu>J~Pw>RA?P?\O?Ia˿OF#,?pοN&?ǿN?ĿJO`?nȿ\O?}ɥO8 >՞OR?ЫſO?Ͽ O ?Ϳ XO?݉տNZ"?Pֿ:Ndc%?BҿջN?/?ؿQjNw=?9ڿ8N3?ԿfNV2}?KHLzq?;뿛L$?ujLY?{X.L ?T,TL?s￸KF?߮K͈?ɘ뿩'LYz?g迯L?&As|Lx?俖Ln?ՕoL`$o?JL6b?2㿐6M*V? -⿂}M&b?y/'MTY?fPMPi?Ơ쿽Lyu?o Loe?s 꿅 MI?_MqV?忳lMhI?n࿗M;?޿NW=?5M.?{ܿwZNF"? ۿ՞N0?8?N1M?濞M A?.忨M R?mKnMSE^?뿧+M%?\L V?pKRn?9DL5{?OL4t?7 CXLDp?L~d?&eM x?￀LT?Ką?I8+,Lq?K?##K0-?qK#?%`|WK?` Kh?*3~KO0?)nK?QZ+Km?aLʑ?0ĥK?JnK:?Y*FK? J?wGJ?$J뎭?JK?H\Jiѩ? {=Jb?C;9;K7>?g@Kk?ILmKO?~.KU?&濊K3r?uzܿgL?ٿIL:r?ݿ#L~?ZҴLq}?ӮL;?=aLc?OXK?L꿳Li?K?i꿯K s?J ? 쿾2K0?¦JK/?lJ4?rtJ>?#vJE?8J?5"J'D?:mڿL?ƿ#MOՊ? ѿ~LKe?.~ͿM"?#ӿ'L0?2׿wL?TO$zx?Hɾ3O?群OK]h?OPy?f O`]?(;PGo?Oge?پ JPS?aKP|L?vPA?9P*1?pg9Pc+P/?ݲFP3=?S"PgH?&DFPÀ;?Xx7 pPg"?6:P.?sl*P<"?5y%QS?."AQ?}EK/P ?@QQ?{RWQі?Q]P]?z{Pǎ"? P ?'?PYP?3{P\?P'?pP[>SeeSQq>@yEQcj>NPu>g.QS >YQa> ꔿ\P ?n1cPH ?HΙ}CP?k枿mO2?•6O8?J #OQ4?ԖO^iE?cuO1?%{OU0?[OC?2NZX?1'bNM;?BmI7?a_I3W?z ~%I|?iHR2?Ka'Ig5?vI?;dI1&?hqAI?Ԓ|Ix?aI2?ABI?I?썿0IG?}I?A7PIB?GqIэ?q_I@?%jÿI!?d^I?wK+J?X{J|?B{J7?G#P:TJ?GL`Jo1?KS|+J?T5;JI??BFRJ>?49B{JC?'J?%_J- ?#KT?OJ uKF?sQK"?t3J ?ǷLگ? K[?57@L&? ӾLzG?>oMU?) ME?Akl5N? XSN >ӵoPҮ>P>(೿WP>|P0>qƿbPW>ĿVNP">˿O8>#οqOϵ>i/ɿOi>jѿ^O ?ӿ>OT>f˿O">=4P>%ÿiO1>κ&EP >MLP=Ĕ>Ir\Q->iQ]>^Q>鬿Qr>*Qش>kP>*Po >v$Pߣ>AVQ*>ȟ Q>!ڒQ > Q_t>$lQ-_>ZARm>䗿^Q˩?sqaNʫ?8LbN-? @N?7ݽnN?UOTϱ?g6XN9V?ˁNҜ?q!< +OR?pvO?O?Pפ?raO ?>VO(J?/&%On?l͠OǠ?5b轧3O@ ?FHtN?ZN?0N |?_ N?AT=NC?' Or#?HxOu?f:JO ?jݯN?w g8OY?22UN}? vNH?uFNn?ɬ NV?敜=M ~?~KM^?-M?!q PM(o?KcMe?ygvMC?i+M?BqMr?4BM*?,=LZ?D_L̠?&˾nL?TG K%J?ʾ.L?Le?\L?eL%?#L.ܭ>;R>W1'RU>B6,R޽>`CRP>^{Rn>1-{R">bS澝YR>۾R.>RhT>(ѾkR]>0ǾRõ>rR89>fVRU> 1SDm>-xSvNJ>"Ra>fNQRj|>+VR>@R>;(R"J>LR4Yl>&7PRV>A3S4>HS/>auR0>@\SM>rRP>vlR;D>MgRl8*> }.R@>swR[^>l}R>ma+R>L 6R{>0VFoRW>z{[fRœ>vR>q|URf>t؄=RF>0yQ>u|QP>VĈeQ>90Q>>Ih~Q>>6pQ><\Q'>S*Q>| %+R]>3)cR’>v1nR>8Z6R*>,pQ>(@QQk>\5Q?Q ?#QP? 0itQK?{ Q_>YsRE?Q!">)+Re>W LR)?@|QH.?ZQB? fPoQW>?IKQ.%?d餾R+?򫮾wR?R?:)TR ?ľ9-R"?~QQb:?jPXQM?QG?VCQ"4?49QJ'?NľQFj!? ZXQ@?EҾRX?Qn/? ׾[Qz?2Qn'?KQg7?YcQA?gQFI?.ԾP4}\?aPT?T@5Pnv?c]lP4p?=P\?j]Psa?'Pʷ|?3Poh? ݈Po? xGP?c@IO?ިy O ?Ot#?û;OF?!;lyOv?YMP?W?ȯO?54O?]&$AP2=>ːd:R ?:'3?dY%?OѿFB%b?TD'?j)M ?{8ߗKx ?D+?<5]?Z\;_Ts>/;=R9?G?迡<.S ?ݿ7B9I>B9+6٣:>:SRs?랿x1&[?ÿd$? ߿V&,%?yeU{)ט?ŲKP)?crmM)?6N2.,?u&;e%>0C<>\(d;=?쐾M?QO ?2)>?ʆ$??0RK?`0L!?`Kl?9ľAS??社1?Pu#CN?lGڗN?PM?`rpD% C?^͊<]?yr/[Mh}<DάFzy(%K<}2Qó%=S>0RQ'>ﰿHD9Ey^?;<'S=}*Su > Z҃Q=Vt1<a@NO8YPc.C u'47[@H\o T NAb{7'@SZ14;3 Jf%0_uxy3`ٍ̬?oRga=1j'=Am監?_{肿 gT'{JωO̱=:&=?B=[3'M?9lNj:?cYY5H̡,?Z=*zP?Q=V &_?(<6Nujc?>$6mv? >+?ĥy=Kr?R==TMkF?c/=&C?zjMt0?ʱN %h?= Z=m]|?sW=Moi?R=kM:?=U7>?Lu= 7 m:?P>b/}6?u>'0-7? "=L803?[>A1O1?%=23?A=8:?Ge=p??7?–=5?#;?i(= EE??ob=F1>?wS=T?B?`?=XGۼF?=[pGGB?lI=?Z?>>rV?< >L>*Z?[H=F^?2>FZ^?1v>>`b?$[>}Frf?>ǻFQb?K>Q>TZ??$>p60^?G)>F6Z?9>d .NV?L4>@.QV? >6#|R?3a/>7u.nN?X*>.R?J>|6~J?=,F?9F?W=i?vJ?a=XGgN?=@GυN?>#?ER?L=(GV?g=GR?>w?YoJ?(>,7xN?GD>W6VaJ?$>7.XF?i >/mF?= >K7VB?i{>Q/\>?>/tB?c>`y7԰j?'T >2>f?b>7b>j?h >F n?.>9`FSn?;$>=q?i>E/Et?>Cq?c(> >=j?05>^!6Wn?7>q6mj?5E>/ wf?E>s.ٟf?/1>=6b?G]C>b-^?>>u-Sb?->V6DB?=#&{H?r3aNw5?i;?G(0?z=({9U?[=%&[? =$cc{?^= 4\K?e=XL7n?-+=NMFK?A=tU&NC??񝼮L,?8$=.d8?=}'^^?!>3%|Q?W;XN0q?G>o%@?Ҭ=iFw?hK=Md?=N?eϿH@{?ԿH?ؿwH1?3f|H1?֯/H?־wH?㿿H?߿H&?hQܿ8Ht?{I?꿔>I]?SL I?;߿KG?.JR?)L[J:?]J ly?-;,2SOy?%Oi?4EOeL?1vsO}]?&kY8yO]S?tfFOxlT?cN?;ͻI?sې+?f?[in?;>)W?t1T?|Ha? VHv?\ŒH ?Do@_?ph?S=_&?>:0?88_Ν?A[\?F*(_?sU%@3:^6@2b"@^ @홿5@'^ O@,%Yo@:^ U@t?oZ? :Y?&樿?XI?;{? ]񿎷п?Wt?> п?*{4?,Xп=I?l娿{?LпpY?cz?`?\ozb?Is_F?%b}?ɿ?sj?zlU?zɿ>{? fH?'\;? :ɿ0~?>Si?q濩Q?*<ɿ?*XcW?PL?qXuK?nIV?jh1?.Ww?@Tu?$x?8qT-2?:YCK|?7Ru3?R-9?!￷r0?k?&;uR)?9uq&?!nr@OK?h`t\x@cOE?[@00w?-=t V@>I/s?b}@WT@?uJ@rkA?` U@4'̜w?ʜy?_5k?9?9*]D?D ٜA?XҜ?:HHF?Q/H>{?OH?᳿H0~?G~HH?⍷H?/n$Hi?׹H Ar %^ *\  ]` a X !F!SS ! N N!N!99B9BT  ""T 9 9"9"; ; ;  D Dsr##?rr%?(%(?( (# $$[$W %W ]%%%]]**@@ss@ttss @s@@  9 !! 99 N!22!!2!AtAA"#u""##t#$$#Att##A#A$VV#$%$V$%%%&%%"%"w&&%B}wwB"uuB'&'&'''rr((&'uu&(&'B'Bu'}}B(J( ((&   )'  &&(  J  >)>)i~ ?   B* B ON**B*BBl N N+nQEE,nM}M,,EM+NMEE+SFRSRFFRFFSFGSGTSGMSMGw}G}MGTwT&wUHTUTH&H&TH%HU%H%IUIRIv%I%UINvN|vIRNI* V + J+ JWWKWXKNWWKNK|K|NKXXI, LXX  , XLILIX- fNZN[ZNZ..N.N-N-N[-[\O[\[/[/[O/OOOO/O/O\bOb/P\P]\P\bP^P^P]]aZQ]Z]Q.aQa].QP.PQZQP_R^_^RR^RR_RS_S`_SP_PSSPS``=aT`a`T =T=` T MTaLTLUaU^aUaLUQUQU^Q^VbVcqbVVqVVVVccdWcdcWQWcQWyQyWd(W(yXdXedXd(+2%XXerrX2 Y3 -7 Z-Z.8 .C ]OOC C C O/A f/f0jk^^0jj0o p k^k_klkl_Sk_0SS_0_lc_c0`lm`cll``^`^`mmb2am2m2j1/b1bm1maq/q/12 a Tad jvv  d ve e 3k x l l  F==l ly?l? myvm?yymmSm3SSmvv3Snz{z{nznnn{no{|o{oW{Wo.oW.o|.|a|}}p|papa|p^p}ccpq}qzq0}0c}qX0qzXXqzr~r~~rrrrssXssXXs??sttt  ?tFF tItu~~uIIuY|uYu~uYvvvvvvwwwYYwv||Yw%vvwxx%%xx%x%xUxUyyy""UyZy"yZZzzzzzz{{Z{Z{Z{1{1|||1| M|M | =}}=}=}WW}}W~~44m n ~n [2[2[ee2e__d1dd\11\4\45o 56q 655\\6\6\@77 @@N  MM77r s   A[ __3_f33ff_ee2e2`2``8 8`88``AA    v< a99::99 : a:a; ;< <;;yy<<y(bybbbbbLLLMMBBB___cc1c1d1dd__f3ff3d3dddddBBBM111eeeee"e"UU"UU%VV#V#f#fffff222 NN @ @@ccc$""+"""""#,",##""j##### # $$$ $$$ $ %#%,% %%""*%%"%i%i&""&&* &&&!!-&!!&hh&''' ''' ( ((((!))--))))))  .  ))g}*}*0***+***}e*e{{+.+++++/++{dd+ ,,/,/,,,,0,0,f,--- --- ....../// ///0000000111111 22 22223333333444444555 555666666677777 7888 88 8999999::: : ::;;; ;;;<<<<<<<==== ==>>  >>>>???? ? ??@@@ @@@nAAA/A/A##ABlBB++BBBCoCoCCC00C$CDpDpD DD.D. D"EmEm!E!E-E-!E!E!qFF""F**"FFFkGG#G#G#,G  GHH/H{H{H|{|d|H/|/8II-I}I~e}}I~-6~~I-0J0J J JffJJ009KK1K!K!KgKgK11:LL.L"L"Lh.7L.22MM#M#iMM2;;M,N,N$$NNjjNN,5N5OOOOTTOOPPPIP6?IIP6PP6QQ)QQ~Q~RRR~RJHRHJRJSSSTSSSTTJTJT?HTHJT??UUUU&UUVVV7V7VK7K@KKVWWWWTWTWXXKXX@X@KXvYYY vYvYY YZZ,ZL5,,ZLZZL[[[[T[[\\\LL\55L\k\]]k]k]   ]u]u ^^u^^I?^?^II____UU__```MM`3<`<M3`3aaaa)abb5bbN5N>5bNbcccUcccddNdNd>d>Ndt  ee tete    e ss ef ff s fO==fOOfg  g  ggUgUg     h hOh h4O4=Oh 4h i    i i(i rirj j  j rjM<j<Mj M kkkVkkkllPlPPl8P8All8mmmm'mmnnnnQJJnQQnoooVoVopppQQpAJpJQApAqqq(qqrr9rRB99rRrrRssssVsstttRRtBBRtxtuuxuxu!uuvv1v1vS:v:1vSSwwwwVVwwxxSx:SSxxpxpyypyy "y"ywyw zzwzPAzAzPz'{&'&{{&{X{'{|'|('|V'V:CVV|::|(:()}()(}(}&}})}~)~&)~<)<~WE~E<W~&W&+*+**X++,+W+WEEW,,{-,-,{{,'--*-;-;XD;;XX*X*./..XX//0/0/X/DDX0z00100z##11.1.1010Y0Y9.Y2322XX334343Y3YY94oo4544o$$55y2525y55VCC2V6766YY778787Z7ZZ78mm8988m!!99x6969xx9[[B6[;:;::Y;;<;[;[9BB[9<9<=<=<<(==:=4=4\==4:\:\>?>YY???@?@\?=\\@ss@A s@@  AA>A.A.Z77.Z>Z>BCBBZZCCDC]C];;]DDqDEqqD Et  EEBEBttE^>^B^GFGFFZGGH^G^G5>>^5H5HIHIHH)IIFI6I6_??6_F_FJKJJZZKKLKLK_K__?LuuLML L u  MMJMJM2M2]2];J]NONN[[OOOPOP`O88`PPnPQnnP#QQzQNNQzzQaaDNaSRSRR[SSTaSSa;DDaT;T;UTUTT'UUR8U8UbAA8RbbRVWVV[[WWWXXWbWbAbXwwXYX X w  "YYVVYY/Y/`/`8/V`[Z[ZZ\[[\c[[c7@@c\7\7]\]\\&]]Z:]:]dCC:ZddZ^_^^\\___``_d_dCd`yy`a`y`$aa^a^-a-ae66-^ebcbb\\cccddcece6eddldelld   e evebbevvecc@bcwxxww`xyxyxkxkxHHky~~yzyzyy~)zzzwDzlOODwlwl{|{{``||  | | l|llO}}o }o }o o p S }p }'}'S 4''S q mEq q EmPPEr s `r r s s g =  = K= =  r r `r r     / / D/  / ?  ? L? &1 1  E1 1   ?kH??kk    aw w w w      ooBoBKoBBu u u u T v T v v T 33w x   w ; ; x ; x      ay y y y z M z M z pM QQp{ |  { { 4 | 4 | |4     qqOqq{ { { {  a  qqDOOqDD )  33r3r<rrarrr<rrr(oKKoo} z z } { } { } z {  bb ~ N N ~ t~ t~ N RRt   5 5 5  5 }    BBBuBuKu    buuKKu(AvJJAvv b  vJvv    '     tt  ssI s  ^  ^ ^ c  s  '{   p      | |  m| |   q          {{zEzzz          4    zz<Ezz<<<        &    A  A CA CMwCwLC w w 3 3  F3 3  d||nn|8|~~ell~~6ffo9ggp::hm77iqq;jjkk5..""00$$//  #-!!!!**",,#  ++$$ $$ W    33CC      ii$  KK$ $  %% X   4   OO   +   & & k & %  j% %   F  F   F    ,,    D 66    i   gg     FF                ) ) k k)        `   ` _ ` _    _        *j j*  *                    *  *  j j*   7     77  ))     ) +\\  ++  !       ! !  ! " " ! +! +\+" " # X " X " W WWX # W W # #  # # ,[[ ,, $ % $  $    % %  % & & % ,%  , [,& (( & ' & (& ' 8' ' $ ' $  88' )k  )$ )( ) (  (    )  ) * ) * ) -) --l* * + * a * a ` a ` + ` + ( + ( + + ..k( ., - , -  ,     -  - . .- - . kk.. . 8 . / / . 88. > > / > / , / / /77, //,  0 1  0 0       1 1  1 2 2 !1 !/!1 !/7/!2 !"2 "3 "T2 T2 ">GGT"3 >>"3 #3 0 3 0 #3 #0/#0#0 #05 $4 5 4 $ $4 $   $5  $%5 %6 %05 05 %//0%%6 %7 &6 7 6 &8 &6 8 & 8 &7 9&9 '7 '4 7 ' 7 9'-l'l -'4 -4 9 (8 9 8 ( (8  (  (9 ( )9 ): 9 )19 1)m)m1): : ; *: ; : *b *: b *a b a *; *a +; +8 ; +; +2l+l2+8 28 ,< ,= < , < , ,  ,=  = > -= > = -2-= 2- 2 l-> 9-9 .> .? > . > 9.. .? ? < /? < ? / / ? /33S/< /3A 0@ A @ 0 0@  0  0A 0 1A 1B A 13A 31S1S31B B C 2B C B 2Q 2B 2)Q )4Q 2C 2)3C 3@ C 3C 34+3+43@ 4@ 4D 4E D 4 D 4 4  4E  E F 5E F E 545E 454+5F |5|6F 6G F 64 F 4 |6!64 !6G !G :D 7G D G 7 :7:G  71 1m7D 718H 8I H 8 H 8 8  8I  I J 9I J I 959I 595j9J 9:J :K J :_ J _ :b :_ b :K b K H ;K H K ;;K ;66m;H ;6M <L M L < <L  <  <M < =M =N M =6M 6= m=m6 =N  N :O >N O N >!:>:N !>!>O >?O ?L O ?O ?7O?O7?L 7L @P Q P Q @  P @@ @  @Q  Q AQ R AA7AQ 7A7OAR AR S S BR BM R BUQM M BUBS UBCS CP CS S C888CP 88CP DT U DD DT  D  DU U  U V V EU E8 E U E888EV EFV FW F? V ? V F? FW 7FW GW T W T G 77W G5j  G5GT G5HX Y X Y H  X H   H HY H  IY Z I9 Y Y I9IoIo9IZ Z Z [ [ JZ Jd JZ Jc d c d J[ c JK[ KX K[ [ K:nnKX ::KX L\ ] L \ \ L L L L] ]  ] ^ ^ M] M: M ] M : n:M^ ;; M_ ` ` N_ N N _ N   N`   NOa _ Oa a OO;\O\O_ ;_ ;Pb Pc P b  b P  Pc   Pc Qc d c d Q;  c Q \;;Q Qd )Q) Rd e R)d d RR"RRe "e <"e b b Se S <S<e S9 9o Sb  9STf g T f f T T T Tg g  g h h Ug U<Ug U<p<Uh UVh Vi Ve h e h Vd e Vi d d Vi Wi f i f Wi W=oW=Wf W=j k k Xj X Xj X   Xk  XYk Yl Y=k =k Y oo=Yl <  Yl Zl m l m Z"<<l Z? ""Z? Zm Z? [m j [m m [[>8[8[j >j >\n \o \ n  n \  \o   \o ]o p o p ]>o ]8>>]]p ]^p q ^Up p ^U^FQQU^q FF^q q n n _q _q _?4_?_n ?_`r s r s ` r `   ` `s ` as t a?s s a?a44?at at t u u bt b; t b#; ; b#bu ==#bcu cr c u  =u c<pp cr <<cr v w w dv d dv d   dw  dew ex e@w @w eqq@ex ex fx y x y ff x fe f f fe fy fe gy v gy y ggApgpgv Av Ahz h{ h z  z h  h{   h{ i{ | { | iA{ i pAAi i| =i= j| } j#=| | j#j#jj} } %} z z k} k%k%} kBBXkz Bkl~  ~  l ~ l   l l l m  mB  mBmXmXBm     n nT n n&T &3T n &no o~ o  oC))o~ CCo~ p   p   p p p p      q qCq qC)Cq zzqr r  r2 2 z r$2 r >$$r s   s >> s@q  s@s s@t t  t   t  t   t u   uD unDDuu uv   vc   vc vf vc v f  f    w ww wEEqw Ewx   x  x RRC xRx  RRxy   yE  yEy qyqEy   >    z z$>z> z$$z z{ {  {  {FMM{ FF{ |   |J | TGJ J |T| |T}  }  }}G7}7} G )G~   ~G)) ~7GG~~ ~  >   > %>  % ?%    ++      **   H*  H wwH       h  g h g h  g       Ivv  +II    ,       +     I++  I vI CC   f fC f ,     ,, J_  J ,,J     --     ,,    J J, __J     Z  Y ]Z Z Y  Y      K^^ K -K !!   *    -     ! K--  ^KK  ++  !! +  g g Dg !    DD H Hw  **H ""  /       .  "   L..  L xL   "" i i  h i  h h    "   Mw  M //M #    00     //  ## M M/  wwM D     # gDD @ gg@  @  ##   N:: N 0N $$   1    0     $ N00 :NN  $$ f  f=FFf = = $    OO. 11O  %  ..      11  %% O1  O..O   %   7  h7 h7  EEh %%   E Lxx  .LL  &    33     22  && P P2  yyP      & j  i j j i  i  &&     Qxx  Q 3Q ''   4    3     ' Q33  xQQ  EE  '' hE  hh   '    RRR 44R  (  55      44  (( R4  RRRR   (   P  (P (1P  ( ((   S** 5SS  ))  2       5  )   S55 S*S {{ )) 3 3 { i3  Fii   )  FF Py  P 22P **   7    6     * T66  vTT    ** g   g j g  j  j  *     U Uy  77U  +  88      77  ++ U7  U yyU   F  +   iFF ii  ++   VNN 8VV  ,,  9       8  ,   V88 VNV  ,, L L  gPPL  gg   ,  W;W 99W -    66     99  -- W W9 ;;W    - A  fA A f CCf --  C   Tvv  T 6T ..  ;       :  .   X:: X{X  .. l l  k l  k k    .   Yz  Y ;;Y   / <<     ;;  //  Y Y; zzY   G   /jGG jj -- //     -Z`` Z Z < 00   =      <   0Z<< ZZ`  00  [  [ Z ]][  Z  Z  0    [[_ ==[  1  ::      ==  11 [=  [ __[   ,  1   ,, kk HHk 11   H X{{  :XX  2    ??     >>  22 \ \> ||\    2 m  l m m l  l  22   ]{{ ] ?] 33   @    ?     3 ]??  {]]  HH  33 kH  kA k A  A  3    ^^; @@^  4  AA      @@  44 ^@  ^;;^   4   g EgEPg E 44   _33 A__  55  >       A  5   _AA _3_  55  :  : l:  Ill   5  II \|  \ >>\ 66   C    B     6 `BB }``  66 n   n m n  m  m  6    aa| CCa  7  DD      CC  77 aC  a ||a   I  7   lII ll $$ 77   $bWW Dbb  88  E       D  8   bDD bbW  88 S S  Q 44S Q  Q   8  ccS EEc 9    BB     EE  99 c cE SSc     9    mm JJm 99  J   `}}  ` B`   :  GG     FF  ::  d dF zzd    :   k  n k n k  n  ::   e}} Gee  ;;    H    G  ;   eGG  e }e JJ  ;; m mJ 8 m 8    ;   ff/ f Hf   < II     HH  <<  f fH//f      <> h>hG>  h <<    g<<g g I ==    F      I    =gII gg<  ==  B  B jB j j G    = GG  d dz FFd >>  h hJhh  ?? iKK i i ~   K  ?   nKK nn ++ ??    + j^^  Ljj  @   jLL j^j  @@ Y  Y  [ ]]Y  [ [   @@   k`` MMk AA  JJ       M    AkMM k k ` --   A A!   - o o ! o! L !  ! A  L L!  h h  J Jh# " # " C  P P"     # O O  # C C$ # l# lO   l $  $ L% $ % $ C oL L$ o B oB  %  B % CC" % % m<<m" m" P& DD' &  & Q   '  ' P( ' ( ' DmPP' mm<(  ( DD) ( h( h J GGh) J ) J & ) & ) D) nnJ& QQn* JJ+ o* oV* ~~o+ - LL, - - p::, Ypp, . MM/  V. .    / / Y / M0 0 / pYY/ p:p0 0 MM1 @ 0 @ 0 n@ 1 Knn1 1 . 1 M.  KK1 o~  oo. o. V3 YY4 ree3 --r4 4 ~5 4 5 4 Y6 ~~4 6 p6 p5 RRp5 YY2 5  5  Rq 2 bbq7 6 7 6 Z gg6    7 ff 8 ZZ6 8 ss6 s6 g9 [[: 9  9 h   :  : g; : ; : [sgg: s s ; RR  ; [ [< ; p; pR  p < < 9 !< 9 < [!!< !ttQ!9 h!ht> "= > = \" i"i=  "  "> h"h #> \#\? > #t> th#Q#Qt#? ? $? \$\@ $O ? O ? $iSSO $@ ii$@ %@ = @ \= %  @ %u>%u%= i%iu&A ]&]B A & A f& &  &B  B i'B ]']C 'uB uiB '>>u'C 'C D bE E (D ( o(oD (   (E nn ()E b)bF )vE vnE )v)F )F *F G F bG *q F *p q q *p *G *p +G bbD +G G ++w++D wD ow,H c,cI , H  pH ,  ,I o  ,I -I J I cJ -wooI - ww- -J T-T .J ccK .qTJ J .q.C .q.K C K C K cH H /K K /K /xx>/H ppx/0L M L dM 0 qqL 0   0 0M p0p 1M ddN 1xpM M 1x1>1>x1N N N dO O 2N 2i 2 N 2HiHSi2O H23O d3dL 3O O 3y663L qyy3L 4P eeQ 4 nP P 4 4 4 4Q Q q Q eR R 5Q 5yq5qQ 5y6y5R 56R e6eS 6= R = R 6r= 6S Urr6S 7S P S eP 7 UUS 7v  7v7P n7nv8T f8fU 8 T  sT 8  8U r  8U 9U V U fV 9zrrU 9zz99V 9:V ffW :r V V :r :q :r :W q W q W fT T ;W ;;W ;{{;T ss{;<X Y X gY < ttX <   < <Y s<s =Y ggZ ={sY Y ={= ={=Z  Z U Z g[ [ >Z >rU>UZ >rr>[ ''>?[ g?gX ? [  '[ ?|ZZ ?X t||?X @\ hh] @ u\ \ @ @ @ @] ] t ] h^ ^ A] A|tAt] A|Z|A^ AB^ hBh_ BV ^ V ^ BP 11V B_ P P B_ C_ \ _ h\ C_ C}RC}C\ uCu}` ia a D` D rDr` D   Da uu DEa iEib E}a }ua ERR}Eb Eb Fb c b ic Fb FsFsFc VFVsGc ii` G Vc c G GzG G` z` rze jf f He Ho He Hr o r o Hf r HIf jIjd If f I~Id w~~Id Jg kkh J xg g J J J Jh h w h ki i Kh K~wKwh K ~ ~Ki VV KLi kLkj Lsi sVi L7 sLj 7 7 Lj Mj g j kg Mj M.MMg xMxNk lNll Nk xk N..Nl Nl Om ~~n Ot m m Ot Os Ot On s n s Po p Po o PPPPp p p q q Qp Qu Qp Qt u t u Qq t QRs t Rs s RRtRRt tt ]tt r r St S ]S]t S  Sr STu v T u u T T T Tv v  v w w Uv UUv UUw UVw Vx Vv w v w Vu v Vx u u Vx Wx u x u Wx WWWu Wy z z Xy X Xy X   Xz  XYz Y{ Yz z Y Y{ ]  Y{ Z{ | { | Zt]]{ Z2 ttZ2 Z| zZz2 [| y [z| | [[)[)[y y \} \~ \ }  } \  \~   \~ ]~  ~  ]~ ])]] ]^  ^&  ^&^*3^3&^ * * } } _ __ _,_} _`   `  `   ` ` ` a  a  aa,a,a  }   b b5 }b} 5 bu5 ub ^^ubc c c! ! ^ c! c c    d d d d   d  de e e  ee e f   fs  fv s s fv f fv g  g  gggg  h h h   h  h   h i   i i! i! i ^i^! j  ju^  jujjuj     k kk kPk kl   l  l   l l l m  m  mmPmPm     n nN n njN jRN n jno o o  oAAo o p  p   p p p p   q q q   q  q   q r  rj  rjrGRrRjr G G   s ss s5s st  t  tt5t5t  u  uva  uvuuvu  &   v v &v& v Y v vw  w  wwYwYw     x xU x U x%U %2x x%y   y  y   y y y z  z  zzzz     { {x { {w  x {{ {w | |  | || | }  }   } } } }      ~ ~~ ~" " ~ g~g"     gD D  D D      C                CC     m L PmmL  L     NN                 N       h    # hh # #                   G G P G x G x  x x    y y  y 9 y 9 I 9  9                     #  h# #     hh 3 3  {{3   {  **                 *   (  ($11( $ $     '                ''  x    1 xx 1 1  ii  $ $ i $                       |  { | | {  {                      & &  kk&  k     E E E  E        D                DD      s @IIs @    00                  0    9  9 9  l    ' ll ' '                       }   } | }  |  |                      '  '  l'     ll  !!    !TT                  T    R  R U 22R  U U      Y                 YY &      &&  mm  ( m  ( (                        z  } z } z  }                          ( (  mm(    m <  < <      5                55     G tRGGt t    EE                 E     j   F   F F F     % jj % %                 " ""      ~   ~  ~   !  !!                 ) )  nn)   n    5     55  h                 hh      ]  \ c] ] \  \     gg                   g  44   4   o    * oo * *                  ## #                " ""                 *  *  o*     oo G G  G     FF                  F C C  K NC C K  K K    w w 5 LLw 5  G5      K                KK        pp  + p  + +                   $ $ $             # # #                   + +  pp+    p 1  xx1     xx '                 ''      $ V 1$$V  V     ZZ                    Z  ''   '    q    , qq , ,               ! !   !!! !! " ~ ! ~ !  ~ "   " "  "  $" $$ # $ $ #  #     $  $ % $ $ , % q, , % % & % & qq% = = & = & # & & 66# # ' (  '  '   (   ( ( ) ( ) ( 6) ) * H) ) HxSSH* x* x* ' ' * * G' + , + ,  +     ,  , - , , GG- - - . . - H - H H . nn. + ) . ) n. ) + +  /  0   /  /    0   0  0 1 0 1  0 & & 1  & 1 2    1     2   2 / / 2 2 %2 % %% /   3 4 3 4   3      4   4 5 4 4 - 5 - 5 r- 5 6 6 5 rr5 6 666 3  66 6  ii 3 3 7 8  7 7    8 8  8 9 9 8 8 i9 9 : ^ 9 9 ^ ] cc^ : ] ] : : 7 : 7 : h7 ; < < ;  ;     <  < = < <  hh= 5  = = > = > 55= > ss> ; . s> > . . ; ; ? @  ?    @  @ A @ A @ @ ''A 'A B A  A    B  B ? B ? B &B &B &? ? C D  C C    D D  D E E D D . . E ss. E F E sE H F H H F  F C F C  F G  C  G H H !G G ! G  !    !H  !"H "I "H H "GG"I "I #I J I J #xI #O Sxx#O #J #O $J G $J J $$Q$G $L %K L K % %K  %   %L % &L &M L &L &Q&Q&M M N 'M N M ''M ''N t't(N (K N (/ N / t((/ (K K P )O P O ) )O  )   )P ) *P *Q P *P *(*(*Q (Q R +Q R Q + +Q  +  +R + ,R ,O R ,'R ',,',O O -S -T S - S  - -  -T  T U .T U T ..T ./ / .U t.t/ /U /V U /U t/6 /6 /V 6 V ~S 0V S V 0~0~V 0-0S 0X 1W X W 1 1W  1   1X 1 2X 2Y X 2X 2-2-2Y Y Z 3Y Z Y 3+3Y +3R +R 23Z 3R 4Z 4W Z 4Z 4T4T4W W 5[ 5\ [ 5 [  5 5  5\  \ ] 6\ ] \ 66\ 6T6] !6!7] 7^ ] 7] !777^ ^ u[ 8^ [ ^ 80 u8u^ 0 80 8[ 89_ 9` _ 9 _  9 9  9`  ` a :` a ` ::` :%%:a :%;a ;b a ; a ; ;  ;b  b _ <b _ b <(<b (<(<_ <d =c d c = =c  =   =d = >d >e d >d >0 >0 >e 0 e uf ?e f e ?u?ue ?9 9 ?f ?9 @f @c f @f @0@0@c c Ag Ah g A g  A A  Ah  h i Bh i h BBh B0Bi BC  u C  Cj j Ci Cj i C@i @yI@@CyC y y D   vD    D H Dg Dg Dj g j j j DD  l Ek l k E Ek  E   El E F  rF  Fm m Fl Fm l Fl HFF G~  ~ n~ G~ Gn rGn n Gm n m I m m GI  I I G Hn Hk H- rrn HHH- Hk k Io IIp Io p Ip IWIWJq JJJq JCCJ3JKs KK" gKgs K" " KKLE  Lt OE E Lt t t LLLLKL7 7 7 L 7 HMu MMv Mu MMv MXNx NNNx N44NNNOy OOz Oy OOz OOP| PP|P|| P+PPQ} QQ} QQQR~ RR~ RPRRES SS}S} S,SST TT T T  TDDTU UU U U  UiiUV VV 4V4  V gVVW WW W WW WFX ~XX X  X $X~~Y :  : YD D  Y{D Y~{{Y~Y: Y~ZI !Z! ZI QI ZZ ZZw Z Z; w ; w Z ;  J; [  i  [[[ \ \ \ \ % \\] ] ]F F]pQ]QFpp]^  ^^ ^  ^ ^^_ _ _) )_'4_4)_'_ `  ` `EE``PP`a aa*a 3**aa b b b bE E  bE bc oo c  c c c c c 6 cc  d dd\ d \ d\ cdde ee e eG e eG G f f f   f jj f f  g g g kk g   g g g h  h  hh hh  hi  i i  bi i i   j j  j  j     j    k k k k k k  k   l  l  l l l  lm m m   m m    m n   n  n   n n n o  o   o o o o   p  k p  p   p p p q qq  q   q qq  b  r r r r   r  r s s s s s s st  j t   t t  t t u0 +u+ uDD0 uu u u  v1 2 1 E2 1 v 1 v v  v2 2 , w3 4 3 F4 w 3 ww w  w4 4 - x5 GxG6 xnLL5 x nnx x6 .x. y7 HyH8 y 7  7 y  y8 /  y8 z: : 0 zy IzI: z y  y z  z; J< < {; { ;  ; {  {< 1  {< |> > # | KK> || |  |  }? LL@ }? } ? } } }@ @ $ ~A MMB ~~ ~A    ~ ~B %~% C NND  C    D  D &E OOF  E    F ''  H  H ( PPH      I QQJ  !!I    J ))  ;    33      22  ;;   2    *      ;  **      ))  ;;  )       3  <<    4    3      <  33      11  <<  1       (  <    ((     44    =     5     44     = 4      00  ==    0      '  =    ''     55    >  66      55  >>  5       /  >    /         &  >>  &&    6    ??  2        6  ?    66     ..  ??    .     "      ?  ""      22   @  88      77  @@!  7     ! ! " ! @" " !  ""!    " %% " @@  "  %"    8   # AA$  9# #    $  $ 8 $ A% % $  88$    % -- % AA&  %  -%    & $  & & # & A#  $$&     # 99 ' B( ( '  ::'    ( 99 ( BB)  (  9(   ) ,  ) ) * ) B*  ,,)     *  * #* BB'  #* *    ' ' : + CC,  +  7+   , :  , , - , C-  ::,     - ++ - CC.  +- -     . . * . C+ + .  **.    + 77 /  0 DD/ 0  0 +  2 EE  ,,2      4 FF  --4     6 GG  .6 6      8 HH  //8       9   : II9  00:   < JJ  11<    !! =   > K= = >  ##>    @ LL $$@     B MCCB  %B B  n   CLLnD NNK  &&D    K  K F OOt F  F '   t  t G   H PPG  ((H     J J QJ  J )        O   O  VO   I   I    U    R R  XXR  T  T  YT  L  L  SL   H RR P  P  WP      Y Y  ZZY   y [ IIy [[ [          TT zz } mm }  _}   {~  nn~  `` ||   oo    a}}  pp  b ~~  qq  c    rr  dd    ss ee    tt  f       uu    g! !  ! vv  hh         i     l l  a ^^l  a a       V V  V  }}V    }   m bb  m  m       ii        m  e bm m e  e       U Y  U  ||U      |   n aa  n       ii        n  d aan  d  d     S X  S  S  {S      {{ o o `  o         i       o   o c ``o  c c      N U  N  yN N      yy l ^  l  l       j       p   p  \\p   w     K ww ^ RRK  ^ ^      q h  q  q q         jj        q  k hhq  k k      M T  M  xM M      xx r ]  r  r         j     r r  ` ]]r  ` `       W W  W  ~~W    ~   s cc  s  s       jj        s  f cs s f  f        SS        _  p _ p \_  p       k       t   t  ^^t   y     N yy X UUN  X X      u d  u  u u         kk        u  g ddu  g g      K R  K  wK K      ww v \  v  v         k     v v  _ \\v  _ _       Q S  Q  zzQ    z   w __  w  w       kk        w  b _w w b  b        VV        a  t a t ^a  t       l       x   x  ]]x   x     M xx ] TTM  ] ]       y gg  y y         ll        y  y j y j g j       \  \ [ \       z ff  z         l       z z  i ffz  i i      Z Z  Z  Z Z        {  { e {       ll     { {  h ee{  h h         WW        `  x ` x ]`  x    |  b b   } __b  | m m}      c     c  `c   nn      d     d  ad   oo     e e   bbe   p p     f f   ccf   q q g  g  dg rr  h h h  h e ss  i   i  fi tt   j   j  ggj  uu   k   k  hk  vv Q Q zL SSQ L S {{S R S R XR U U |T YYU T T  V }}O VV V O  O  W W ~P WWW  P X X  UUX   Z Z Y Z Y ZY \ \ [ [[\ [ I[ ]  ]  T]  ! ^ !^ R^  HH^ ;^ *\ *\ ]` ] ` X Wa Wa a  SD D  !FMF TAA  Dn %#[#[ $$%W%WW ) &&)J( J J'&' (r?(?  KK> K )) >>Ki>i K L L  M   L L @ *N* BOlllB+EQ+Q ,J,Jn WWJ* * W)+ + ) Y, fFL- - fq%X+%X+Xr-3 eb2 2 3 7 -7 f8 .8 ZC C A /OA O]^00p ^^o o p ^aT1Tq12j 2 wd vj3je 3 yylk k y=l ~m m 4n 5o o 6q q r r 7Ms s  [[ [ 8  A        <  v<  aav   9  :;  <( ( wNDDwuF  uzOOCxHH }PPA{JJQBB~L~B   C  CR S S DST"TATVUUXWWZYY\[[^]]`__baadccuNNvujujFi==jvEiivvNNweEEvl>>ewlwHlxOOylxlHxk>>lyGGkyOOzfGyyfn??fnznzJ{PP|n{nJ{m??n|IIm|PP}gI||gp@@gp}p}L~QQ~p~pLo@@pKooQQhKKj==hjFjUVVqMqGqqVVWrrEMrrWXXee>EEeXXUkGG>kkYZZrMrrErZZ[ssKMss[\\hh=KKh\\YiEEi=i]]^^ssMsKs^^__ttIttM_``gg@IIg``]oKKo@oaabbttMtItbbccqqGqqMcddff?GGfddamIImm? HHwDNNuJzzCOxxCL}}AP{{AF FQ~BQ0AKdefault%  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##################################################################################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~%%%%%%%%PAs3d-0.2.2.1/objs/new_sphere.3ds000066400000000000000000000151061361325167000160610ustar00rootroot00000000000000MMF ==6>= ~ green@00      P0 ?@sphere1A`A6???A>p$^l?>^l?ԋ>ԋ^l?>^l?#þ^l?^l?ԋԋ^l?^l?þA 3#^l?>^l?ԋԋ>^l?>^l?!>^l?>>^l?ԋ>ԋ>^l?>>^l??һ 0$^l?þ7$5?5$>^lZ%0$0 %þ^lZ%55$^lþ7$0 0$^l>P.$55?Ti#þ^l?"S?>^l?"5?5?Ti#^l?>P.$^l?أþzZ?þu='?u='þ>zZþp$^lþzZþu='u='þzZþ^ltþzZ>þu='u='?þzZ?þC^l?þ>zZ?þu='?u='?þzZ?>þ5?VG5u='?ԋ5?5ԋ>u='5VG$55ԋu='55u='ԋ555u='ԋ>5?5ԋu='?55?5ԋ>u='?5??5u='?ԋ>5>p^l>^lԋ>ԋ^l>^l#þ^l^lԋԋ^l^lþ^l>^lԋԋ>^l>^l!>^l>>^lԋ>ԋ>^l>>^l0$?0}>l#b?t>:b?~ч>~чb?:>tb?#}b?:tb?~ч~чb?t:b?}b?~ч~ч>b?:t>b?s}>b?:>t>b?~ч>~ч>b?t>:>b? v?+,N];^dc?`N]; .? .N];`>^dcN];0$ vN];`^dcN]; . .N];^dc`N]; v^ N];^dc`>N]; . .?N];`^dc?N];L v?N];`>^dc?N]; .? .?N];^dc?`>N];0c?}vXQ?轭vX: ?: vX轭>QvX$0cvX轭QvX: : vXQ轭vX0csvXQ轭>vX: : ?vX轭Q?vX~40c?vX轭>Q?vX: ?: ?vXQ?轭>vX/-?iO-yx ?.-D>D-.>yx -ѱ[$/--.yx -DD-yx .-/--yx .>-DD>-.yx ?- /-?-.>yx ?-D>D>-yx ?.>->'89c6>k9c@>@愾9ck>69c|#9ck69c@愾@愾9c6k9c&ܤ9c6k>9c@愾@>9ck6>9c>9ck>6>9c@>@>9c6>k>9cF_j]$Ju?}#yJu A@PPPPPPPP P P P P P PPPQ@AQABQBCQCDQDEQEFQFGQGHQHIQIJQJKQKLQLMQMNOQNO@Q  !""!"#"#$#$%%&&%&'&(('()))*)++*,,+--,-.-//.  /0 !0!1!"221!2"##323#$$434$5$%55%6%&66&''767'((878(9()99):)*::*+:+;;+,;,<<,-<-=-.>>=->./>/??/ ? 0@01@1A12BBA1B233CBC344DCD4E45EE5F56FF677GFG788HGH8I89II9J9:JJ:;J;KK;<K<LL<=L=M=>NNM=N>?N?OO?0O0@RSSTTUUVVWWXXYYZZ[[\\]]^^__``aaRcbrrsctdccstedttuefeuuvfgfvvwghgwwxhihxxyijiyyzj{kj{jzlk{{|l}mll|}~nmm}~onn~popqppbqrbsrrtssutuvuuwvvxwwyxyzyz{zz|{{}}|~~}~rrqbqbcbdcddedefefggghhhihijjjkkklllmlmnmnonpoppqpSRRRaRa`a`_ ` _^ ^ ^] ^ ]\ ] \[ \ [Z [YZYYXYXWXWVWUVUUTUSTS0Agreen@  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?PAs3d-0.2.2.1/objs/noinetwep.3ds000066400000000000000000000423321361325167000157330ustar00rootroot00000000000000MMD ==D>= New Material@00      P0antenna0 ]]] ]]]@0   P0  internet0  @0  k kP0  rednono@00      P0 ?@Gcube4A;`A6???A B\B M]?B\?B M]?B\B =M]?B\?B =M]??%B??Nb>B?L7ɾNb>`P?L7>Nb>`P?L7ɾNb`P?L7>Nb`P?B!B @޿B @޿B =@B!B =@B!?B @B!?B =@?B =@?B @Nb7?Nb7Nb>7?Nb>75f?89`P5f89`P5f89>`P5f?89>`P Aw<                       0A8antenna$%&'()*+,-./01230Aainternet(  !"#456789:;PA@xsphere1_exAg`A6???A8 ?侽&v?58G?$/$ ?j?9I>n?.^R?X2, }?z=;{> @=f̼Ż>3L%?:.mTPlW?+F6ݟl?%j:)a?dz>h3>8?+5?+3˾G>?.̽b>&?i>+W?|>H^k?i?]UO?E8?d<-.>Fb?h{/=)) =s+O)(6>8 >wm*=x$?Q`%89?9Md.?>4YH{?z+?m>Ox?A$#?{7= Ͱ?*?jO?=I>m?8\? 3z|>p?=8+8d?dD8?;WHn><P>V>HGB=˜?JzO/RA?F*(e?ľ<#k?=U0KqP???F`?-^>͎?^M=DZ&×?>9cD?w*?]E>i#>?'b{\71? HoP?YLU>a0AA)< ӏ%>"?GR 2?˾pfB7?;/=Z'?G>/ہ>@V?ھZ=<ֈ?I4Cx?M>,?8 ?侽&v?58G?$/$ ?j?9I>n?.^R?X2, }?z=;{> @=f̼Ż>3L%?:.mTPlW?+F6ݟl?%j:)a?dz>h3>8?+5?+3˾G>?.̽b>&?i>+W?|>H^k?i?]UO?E8?d<-.>Fb?h{/=)) =s+O)(6>8 >wm*=x$?Q`%89?9Md.?>4YH{?z+?m>Ox?A$#?{7= Ͱ?*?jO?=I>m?8\? 3z|>p?=8+8d?dD8?;WHn><P>V>HGB=˜?JzO/RA?F*(e?ľ<#k?=U0KqP???F`?-^>͎?^M=DZ&×?>9cD?w*?]E>i#>?'b{\71? HoP?YLU>a0AA)< ӏ%>"?GR 2?˾pfB7?;/=Z'?G>/ہ>@V?ھZ=<ֈ?I4Cx?M>,? A#  0  0"1"""1#2###2$3$$$3%4%%%4&5&&&5'6''6'((7(7())8)8 )* *9 **9+ +: ++:, ,; ,,;<--  --<=.. ..=>////>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrcScCdsSdSCTsdTdDetTeTDUteUeEfuUfUEVufVfFgvVgVFWvggGWhwWhWGXwhhHXixXiXHYxiiIYjyYjYIZyjZjJkzZkZJ[zk[kKl{[l[K\{l\lLm|\\Lm]|m]mMn}]]Mn^}n^nNo~^^No_~o_oO_Oa_a@PaPaP?Pp00PpQ0pQq11QqR1qR2Rr22rrSS3Ss33ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZz::Zz[:z[{;;[{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,,l lK  K+Kk++k kJ Jj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$DdC$dCc##CcB#cB"Bb""bbAA A` 0ANew Material  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@ssphere1_exAb`A6???A*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=?*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=? A  0  0""1""1##2#2#$$3$3$%%4%4%&5&&&5'6'''6(7(((7))8 ))8* *9 **9:++  ++:;,,  ,,;<--  --< .=...=/>///>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrccCSdsSdSCTsddDTetTeTDUteeEUfuUfUEVufVfFgvVgVFWvgWgGhwWhWGXwhXhHixXiXHYxiYiIjyYjYIZyjZjJkzZZJk[zk[kKl{[[Kl\{l\lLm|\\Lm]|m]mMn}]n]M^}n^nNo~^o^N_~o_oOOa_a_@PaPaP?Pp00PpQ0pQq11QqR1qRr22RrS2rSs33S3ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZ:Zz::zz[[;[{;{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,lK  ,lKk++ KkJ  +kJj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$D$ddCC#Cc##ccBB"Bb""bbAA A` 0Arednono  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@xsphere1_exAg`A6???A*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=?*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=? A#  0  0""1""1##2#2#$$3$3$%%4%4%&5&&&5'6'''6(7(((7))8 ))8* *9 **9:++  ++:;,,  ,,;<--  --< .=...=/>///>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrccCSdsSdSCTsddDTetTeTDUteeEUfuUfUEVufVfFgvVgVFWvgWgGhwWhWGXwhXhHixXiXHYxiYiIjyYjYIZyjZjJkzZZJk[zk[kKl{[[Kl\{l\lLm|\\Lm]|m]mMn}]n]M^}n^nNo~^o^N_~o_oOOa_a_@PaPaP?Pp00PpQ0pQq11QqR1qRr22RrS2rSs33S3ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZ:Zz::zz[[;[{;{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,lK  ,lKk++ KkJ  +kJj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$D$ddCC#Cc##ccBB"Bb""bbAA A` 0ANew Material  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/noinetwpa.3ds000066400000000000000000000421131361325167000157240ustar00rootroot00000000000000MMKD ==;D>= antenna0 ]]] ]]]@0   P0  internet0  @0  k kP0  rednono@00      P0 ?@Gcube4A;`A6???A B\B M]?B\?B M]?B\B =M]?B\?B =M]??%B??Nb>B?L7ɾNb>`P?L7>Nb>`P?L7ɾNb`P?L7>Nb`P?B!B @޿B @޿B =@B!B =@B!?B @B!?B =@?B =@?B @Nb7?Nb7Nb>7?Nb>75f?89`P5f89`P5f89>`P5f?89>`P Aw<                       0A8antenna$%&'()*+,-./01230Aainternet(  !"#456789:;PA@ssphere1_exAb`A6???A8 ?侽&v?58G?$/$ ?j?9I>n?.^R?X2, }?z=;{> @=f̼Ż>3L%?:.mTPlW?+F6ݟl?%j:)a?dz>h3>8?+5?+3˾G>?.̽b>&?i>+W?|>H^k?i?]UO?E8?d<-.>Fb?h{/=)) =s+O)(6>8 >wm*=x$?Q`%89?9Md.?>4YH{?z+?m>Ox?A$#?{7= Ͱ?*?jO?=I>m?8\? 3z|>p?=8+8d?dD8?;WHn><P>V>HGB=˜?JzO/RA?F*(e?ľ<#k?=U0KqP???F`?-^>͎?^M=DZ&×?>9cD?w*?]E>i#>?'b{\71? HoP?YLU>a0AA)< ӏ%>"?GR 2?˾pfB7?;/=Z'?G>/ہ>@V?ھZ=<ֈ?I4Cx?M>,?8 ?侽&v?58G?$/$ ?j?9I>n?.^R?X2, }?z=;{> @=f̼Ż>3L%?:.mTPlW?+F6ݟl?%j:)a?dz>h3>8?+5?+3˾G>?.̽b>&?i>+W?|>H^k?i?]UO?E8?d<-.>Fb?h{/=)) =s+O)(6>8 >wm*=x$?Q`%89?9Md.?>4YH{?z+?m>Ox?A$#?{7= Ͱ?*?jO?=I>m?8\? 3z|>p?=8+8d?dD8?;WHn><P>V>HGB=˜?JzO/RA?F*(e?ľ<#k?=U0KqP???F`?-^>͎?^M=DZ&×?>9cD?w*?]E>i#>?'b{\71? HoP?YLU>a0AA)< ӏ%>"?GR 2?˾pfB7?;/=Z'?G>/ہ>@V?ھZ=<ֈ?I4Cx?M>,? A  0  0"1"""1#2###2$3$$$3%4%%%4&5&&&5'6''6'((7(7())8)8 )* *9 **9+ +: ++:, ,; ,,;<--  --<=.. ..=>////>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrcScCdsSdSCTsdTdDetTeTDUteUeEfuUfUEVufVfFgvVgVFWvggGWhwWhWGXwhhHXixXiXHYxiiIYjyYjYIZyjZjJkzZkZJ[zk[kKl{[l[K\{l\lLm|\\Lm]|m]mMn}]]Mn^}n^nNo~^^No_~o_oO_Oa_a@PaPaP?Pp00PpQ0pQq11QqR1qR2Rr22rrSS3Ss33ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZz::Zz[:z[{;;[{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,,l lK  K+Kk++k kJ Jj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$DdC$dCc##CcB#cB"Bb""bbAA A` 0Arednono  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@ssphere1_exAb`A6???A*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=?*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=? A  0  0""1""1##2#2#$$3$3$%%4%4%&5&&&5'6'''6(7(((7))8 ))8* *9 **9:++  ++:;,,  ,,;<--  --< .=...=/>///>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrccCSdsSdSCTsddDTetTeTDUteeEUfuUfUEVufVfFgvVgVFWvgWgGhwWhWGXwhXhHixXiXHYxiYiIjyYjYIZyjZjJkzZZJk[zk[kKl{[[Kl\{l\lLm|\\Lm]|m]mMn}]n]M^}n^nNo~^o^N_~o_oOOa_a_@PaPaP?Pp00PpQ0pQq11QqR1qRr22RrS2rSs33S3ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZ:Zz::zz[[;[{;{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,lK  ,lKk++ KkJ  +kJj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$D$ddCC#Cc##ccBB"Bb""bbAA A` 0Arednono  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@ssphere1_exAb`A6???A*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=?*8 ?|?p<-?GBX2>2IrW3IZ.-9X DrPv,)k}L>~=啿?#Ű>%},K?Q ?3~s?%"*?DHrz?(?%/>E^?X ??A%?>[o?~'>B=P^?1 4[w?[f^ .z?AL,?CCi"iL> p!e95.U(ћn(ofz<8>1N>?z(B?5U/?u9?Y|?uM>"?Sm?ή&>Xu>Î?d_8qʾ %?%(>ѽY?/g$dY?2Nf>2J[=n6@KO־@ 5O򩿾')<'l>Z>hj!6,?> _1c?u?(mJ{?M-?kAmp?6?ְ>?hE? I>!H? C>D>ȸ?UF⦉?#O޾0WW? PYa<>kp3%`1=f 7̾)<־'Gヨp1-O=LⒿzH>4>+?>$?W3?UvM?)XK?'[?Ή8A?CK?R>?Z ?XG?+>3,>R?w=? A  0  0""1""1##2#2#$$3$3$%%4%4%&5&&&5'6'''6(7(((7))8 ))8* *9 **9:++  ++:;,,  ,,;<--  --< .=...=/>///>?!!!?!`pP`P@Qp`Q`AbqQbQARqbRbBcrRcRBSrccCSdsSdSCTsddDTetTeTDUteeEUfuUfUEVufVfFgvVgVFWvgWgGhwWhWGXwhXhHixXiXHYxiYiIjyYjYIZyjZjJkzZZJk[zk[kKl{[[Kl\{l\lLm|\\Lm]|m]mMn}]n]M^}n^nNo~^o^N_~o_oOOa_a_@PaPaP?Pp00PpQ0pQq11QqR1qRr22RrS2rSs33S3ssTT4Tt44ttUU5Uu55uuVV6Vv66vvWW7Ww77wwXX8Xx88xxYY9Yy99yyZZ:Zz::zz[[;[{;{\;{\|<<\|]<|]}==]}^=}^~>>^~_>~_??_ ``@@!@a!!aaOO/Oo//ooNN.Nn..n nM  M-Mm--m mL  L,Ll,lK  ,lKk++ KkJ  +kJj** JjI  *jIi)) IiH)iHh((HhG(hGg''GgF'gFf&&FfE&fEe%%EeD%eDd$$D$ddCC#Cc##ccBB"Bb""bbAA A` 0Arednono  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/notes.3ds000066400000000000000000000272641361325167000150620ustar00rootroot00000000000000MM. ==.>= } blac@00     UUU UUUP0 ?@sphere1_coA`A6???ATY>=y#=}B\)=f&c=J\)=C=ƞ=V\>ƞ$;>C|Y>J=n>fHu>}B=n>y#|Y>$;>b>| =| )ֽVL<| y#| f|| C| 5̰VL<| þ=| Hʾ>| þ|Y>| 5̰0>| C>| f>| y#>2m )ֽ0>| |Y>| |I>h\)=kfƞkþYNܾ\)=>YNܾ=n>þ>ƞT>f=>T>>h=n>b]y<>V7|I&c=V7b|V7TYV7f V7V\V7Hʾ|V7&c=V7S>V7侢Hu>V7Hʾ>V7V\=>V7f>V7TY=>V7b>V7|IHu>V7|I>Nh\)=NNkNfNƞkNþNYNܾ\)=N>NYNܾ=n>Nþ>NƞT>Nf=>NT>N>Nh=n>Nb>b=b)ֽVLbþ|Y>b5̰0>bC>bf>by#>b)ֽ0>b|Y>bTY>N/p=N/py#=N/p}B\)=N/pf&c=N/pJ\)=N/pC=N/pƞ=N/pV\>N/pƞ$;>N/pC|Y>N/pJ=n>N/pfHu>N/p}B=n>N/py#|Y>N/p$;>N/pf>՝f>Utf>/&?C>/&?J=n>C3?fHu>C3?y#>%?f>/&?fHu>C3?}B=n>C3?f=>9?ƞT>9?C>/&?f>/&?T>9?f=>9?f>/&?y#>%?f?%-?CQ?%-?J??f??y#Q?o ?f?%-?f??}B??ft#?m>ƞ?m>CQ?%-?f?%-??m>ft#?m>f?%-?y#Q?o ? A pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q          !!!""###$#$%$%&%&'''('()()*)++*.-.//.  /0 !0!1!"221!"#332"#$443#$%554$%&665%&'776&7'((878())98)*::9)*+;;:*+,<<;+,-==<,-.>>=-./??>./ 00?/@01@1A12BBA123CCB234DDC345EED456FFE567GGF6G788HGH8I89I9:JJI9:;KKJ:K;<K<LL<=L=M=>NNM=>?OON>O?0O0@P@APAQABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@PPQaa`PQRbbaQbRSScbcSTTdcdTeTUeeUfUVffVWWgfgWhWXhhXiXYiiYjYZjjZ[j[kk[\k\ll\]l]m]^nnm]n^_n_oo_PoP`srsts s ut  uu r rwvvxw w yx  yy v v{z,,+{|{{+}|}}z,z~--,,~-~rrssstutuurrvwwwwxxxyyvvzz{{{|}}|}zz~~~0AMblac   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     PA@sphere1A`A6???Aq,>#]>,]_a>84]Z4p>9]7)L>|;](>9] >84]I=,]=#]I=] >uJ](>/]7)L>d ]Z4p>/]_a>uJ]>]>#ks5y>84ksQ>Bks_a>##Lks7)L>rOks >##Lks3=Bks-=84ks;<#ks-=uJks3=,ks >}ks7)L>eks_a>}פQ>,ks5y>uJks>#_u>9_5y>##L_>uX_7)L>\_I=uX_-=##L_yO9_̹#_yO/_-=}_I=޾_7)L>P0־_>޾_5y>}_u>/_$>#w>|;w>rOwq,>\w7)L>xaw=\w;B̾wq,>P0־w>ew>d w>#u>95y>##L>uX7)L>\I=uX-=##LyO9̹#yO/-=}I=޾7)L>P0־>޾5y>}u>/>#5y>84Q>B_a>##L7)L>rO >##L3=B-=84;<#-=uJ3=, >}7)L>e_a>}Q>,5y>uJq,>#)>,)_a>84)Z4p>9)7)L>|;)(>9) >84)I=,)=#)I=) >uJ)(>/)7)L>d )Z4p>/)_a>uJ)>)7)L>#J7)L>#-7)L>e~Jm? >}~Jm?(>/ z?7)L>d z?_a>}ɱl?7)L>e~Jm?7)L>d z?Z4p>/ z?7)L>P0־FTY?I=޾FTY? >}~Jm?7)L>e~Jm?>޾FTY?7)L>P0־FTY?7)L>e~Jm?_a>}ɱl?7)L>XLGU? >YGU?(>yvb?7)L>vb?_a>Y5T?7)L>XLGU?7)L>vb?Z4p>yvb?7)L>QA?I=M(QA? >YGU?7)L>XLGU?>M(QA?7)L>QA?7)L>XLGU?_a>Y5T? A pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q          !!!""###$#$%$%&%&'''((()()*)++*.-.//.  / !110 !"221!"#332"3#4#$44$%%54%&665%&'776&7'((878())98)*::9)*+;;:*+,<<;+,-==<,-.>>=-./??>./ 00?/01AA@0A122BAB233CB34DDC345EED456FFE567GGF678HHG7H8I89I9:JJI9:;KKJ:;<LLK;<=MML<=>NNM=>?OON>?0@@O?P@APAQABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@P`PQ`QaQRbbaQbRSScbcSTTdcdTeTUeeUfUVffVWWgfgWhWXhhXiXYiiYjYZjjZ[j[kk[\k\l\]mml\]^nnm]n^_n_oo_PoP`srsts s ut  uru r wvvxw w yx  yy v v{z,,+{|{{+}|}z}z,~--,,~-~rrssstutuurrvwwwwxxxyyvvzz{{{|}|}}zz~~~0AMblac   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     PAs3d-0.2.2.1/objs/reset.3ds000066400000000000000000000027401361325167000150440ustar00rootroot00000000000000MM ==>= default0  @0   P0   ?@6cube4A*`A6???A 1x1=1x11=x11=x1=x11x11=x1=1=x1=111x?1=1x?1=1=x?11=x?1x?11x?1=1=x?1=1=x?1x?11=x?11x?1=1x?1=1=1=1x11x11=x1=1=x;8;=;;8;=;8=8;=;=;=;=8=8;=;8=;=;;=;8 Af<                    0Adefault<  !"#$%&'()*+,-./0123456789:;PA dd**"" 22"" 44,, $$s3d-0.2.2.1/objs/ringsystem.3ds000066400000000000000000000174241361325167000161330ustar00rootroot00000000000000MM ==>= } blue@00     s sP0 ?@msphere5A_`A6???A o~?($2k?>2E?4?E?4?2>k?2ѕ$o~?2þk?2E?4E?4?2k>2o~e d%2kþ2E?4E?42þk2Ro~2>k2E?4?E?42k?þ2o~?$2=k?>2=E?4?E?4?2=>k?2=ѕ$o~?2=þk?2=E?4E?4?2=k>2=o~%2=kþ2=E?4E?42=þk2=Ro~2=>k2=E?4?E?42=k?þ2=$2i?>2f2?f2?2>i?2ѕ$2i2f2?f22i?22=f2?f2?2=>i?2=ѕ$2=i2=f2?f22=i?2=o~?2 $k?2þE?4?2E?4>2kѕ$2o~þ2kE?42E?4k2þo~2y;Lk2>E?42E?4?þ2k?R2o~?>2k?E?4?2E?4?k?2>o~?2=6}$k?2=þE?4?2=E?4>2=kѕ$2=o~þ2=kE?42=E?4k2=þo~2=9k2=>E?42=E?4?þ2=k?R2=o~?>2=k?E?4?2=E?4?k?2=>2iѕ$2f22f2?2i?6Q22i?f2?2f2?i?2>2=iѕ$2=f22=f2?2=i?6Q2=2=i?f2?2=f2?i?2=>2ѕ$o~?2þk?2E?4E?4?2k>2o~%2kþ2E?4E?42þk2Ro~2>k2E?4?E?42k?þ2o~?)2k?>2E?4?E?4?2>k?2=ѕ$o~?2=þk?2=E?4E?4?2=k>2=o~,i%2=kþ2=E?4E?42=þk2=Ro~2=>k2=E?4?E?42=k?þ2=o~?2=k?>2=E?4?E?4?2=>k?2ч$2i2f2?f22i?22f2?f2?2>i?2=ч$2=i2=f2?f22=i?2=2=f2?f2?2=>i? A            1! 1 02"!2!13#"3"24$3$#35%4%$46&5&%57'6'&68(7('79)8)(8:*9*)9;+:+*:<,;,+;=-<-,<>.->-=?/.?.>0 /0/? /  !!!"!"###$$$%%%&&&'&'((()  ()*  )+  *+,  +,,-  ,.  -../.1010?0>?>>=><=<<;<;:;:99988878766656545434323212@AQQP@ABRRQABCSSRBCDTTSCDEUUTDUEFFVUVFGGWVWGHHXWXHIIYXYIJJZYZJKK[ZKL\\[KLM]]\LMN^^]MNO__^NO@PP_Oqa``pqrbaaqrscbbrsdcsstdedttuefeuuvfgfvvwghgwwxhihxxyijiyyzjkjzz{klk{{|lml||}m~nmm}~onn~p`oop`@OOo``aA`A@abBaBAbcCbCBcdCdDCdeDeEDefEfFEfgGGFfghHHGghiIIHhijJJIikKJJjklLKKkllmMMLlnNMMmnnoOnONpPQQqpp_p_P~^__~~}]~]^}|]|\]|{[|[\{z[zZ[zyZyYZyxYxXYxwXwWXwvWvVWvuUUVvutTTUusSTTtsrRSSsrqQRRrq0A blue  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/rotate.3ds000066400000000000000000000100631361325167000152150ustar00rootroot00000000000000MM3 ==#>= default80  @0   P0   ?@torus3A{`A6???Ab4g(>L>g(>_˾Ug(>Ei6>g(>fT#?g(>/L`?g(>ھ~?g(>d̽3{?g(>+~>U?g(>)t??g(>GL?;_>g(>9zk?Ȋǽg(>g?.Ӿg(>*B?:&g(>,~?Ag&_s>F>!=JC?!=&UW?!=Bоu?!=Pmq?!=t>JM?!=Є ? ?!=!=a?ފ!=]?}Ǿ!= :?Q!=5>W%N+ >ϕ>I<:3;?Iz9?I ?I</?Vk>IFȾ&_b>yW>!=04U?!=6d9.?!=E?!=R:B?!=&F>K&?!=>>!=A?\>!=)1?1!=N.?a!=8?`O辢!=0>Wg(> 3>~>g(>>g(>%O%?g(>C;?g(>gpTt8?g(>0M=>e,?g(>>v>g(>)?7V>g(>'? g(>$?g(> ? ׾g(> >FȾ1 >b>yW>>04U?>6d9.?>E?>R:B?>&F>K&?>>>>A?\>>)1?1>N.?a>8?`O>0>W%?+ >ϕ>s >:3;?s >MB?s >]?s >%r%Y?s >m]>z9?s >a> ?s >/?Vk>s >cI?Qs >[F?o.s >o&?s >3A>Ag1 >s>F>>JC?>&UW?>Bоu?>Pmq?>t>JM?>Є ? ?>>a?ފ>]?}Ǿ> :?Q>5> A             '  !  "!!#"#$#$%$$%&((')((*))+** ,,+!-,!, ".-"-!/.""#/0/##$0%10%0$&%&1%2&'3(43(3')5(54(*655)*+766*+,8+87+-98-8,.:9.9-;:../;0</<;/1=<1<0&212=1>23?4@?4?35A4A@46B5BA57C6CB68D7DC79ED9D8FE99:F;GF;F:<H;HG;=IH=H<2>I2I=J>?K@LKK?@AM@ML@BNANMACOBONBDPOOCDQPDDEQRQEEFRGSRGRFHTSHSGUTHHIU>JU>UIVJKWLXWWKLMYLYXLNZMZYMO[N[ZNP\[[OP]\PPQ]^]QQR^S_^S^RT`_T_Sa`TTUaJVaJaUVWWXXXXYYZYZ[Z[\\\ \]  ] ]^  ^__  _` `  ` `a  aVV 0Adefault8  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/s3d_logo.3ds000066400000000000000000000553251361325167000154420ustar00rootroot00000000000000MMZ ==Z>= } Gold@00      Q QP0 ?@scube4Ag`A6???Ahj<j<>?j<>?j<?j<?j<>??j<>??j< A 0A%Gold  PA6@Xtext3AX`A6???A8!F['I#?@['I=!?};['I?+6['I?0['IV?j+['Iu??'['I?(#['I~?&['IA?A['IA ?k['I?&R['IW?7['Iü>['I@f>'['IƂ>Q['IV>"['I>'['I>K]-['I/>4['Iu>;['I,>ZC['IM>K['Im>>S['I>R>M[['I0>c['Id> l['I>t['IS>+}['IG>+}['I>+}['I>+}['I!>+}['Iƿ>cxu['I>m['I4[>ۧe['I6>]['I>6]U['IM>2M['I6߀>- E['I~><['I}>R*['I >D['I>d ['IyV>ҩ['I:>.['Im>['I*>޾['Iq>#ܾ['I!]?IJݾ['I ?k`['I?,['I44!?['Iι)?y['IT1? ['Id%8?['I?,>?up!['I&iC?i&['I,E?^*['IF?Rk/['IʱH?F4['ItJ?<['IBM?!D['IUQ?I['IT?AM['I}W?r5P['IZ?R['I*S^?AS['IyHb?S['I¢f?S['I*l?!Q['Iq?N['I1u?DK['IHx?F['I"s{?A['Il}?:['I~?23['I~?",['I~? %['I,}?['I6|?['Iy?['I0w?s['I7s?e['Io?['Icj?['Iuu?['Iz?['IL?['I”?['Io*?K ['IE?['IE?V['Io?['Io?t'['I?/['ITL?6['Ig?WF['Iߐ?UT['IG?`['I?j['I?Qs['I?Vk['I E7?a['It0?-U['I+*?!F/q>#?@/q>=!?};/q>?+6/q>?0/q>V?j+/q>u??'/q>?(#/q>~?&/q>A?A/q>A ?k/q>?&R/q>W?7/q>ü>/q>@f>'/q>Ƃ>Q/q>V>"/q>>'/q>>K]-/q>/>4/q>u>;/q>,>ZC/q>M>K/q>m>>S/q>>R>M[/q>0>c/q>d> l/q>>t/q>S>+}/q>G>+}/q>>+}/q>>+}/q>!>+}/q>ƿ>cxu/q>>m/q>4[>ۧe/q>6>]/q>>6]U/q>M>2M/q>6߀>- E/q>~>}>R*/q> >D/q>>d /q>yV>ҩ/q>:>./q>m>/q>*>޾/q>q>#ܾ/q>!]?IJݾ/q> ?k`/q>?,/q>44!?/q>ι)?y/q>T1? /q>d%8?/q>?,>?up!/q>&iC?i&/q>,E?^*/q>F?Rk//q>ʱH?F4/q>tJ?BM?!D/q>UQ?I/q>T?AM/q>}W?r5P/q>Z?R/q>*S^?AS/q>yHb?S/q>¢f?S/q>*l?!Q/q>q?N/q>1u?DK/q>Hx?F/q>"s{?A/q>l}?:/q>~?23/q>~?",/q>~? %/q>,}?/q>6|?/q>y?/q>0w?s/q>7s?e/q>o?/q>cj?/q>uu?/q>z?/q>L?/q>”?/q>o*?K /q>E?/q>E?V/q>o?/q>o?t'/q>?//q>TL?6/q>g?WF/q>ߐ?UT/q>G?`/q>?j/q>?Qs/q>}?|/q>q?B ~/q>lb?S}/q>W?/'{/q>$N?w/q>E?tr/q> >?Vk/q> E7?a/q>t0?-U/q>+*?t7['IS%?K$['I0%?<['I>x#?R=['IN>=['I" >=['I0>>i@=['IU>Jh<['I>Rr['I>>$['IY>×['IjY>۽['I>h['I>/['Iq>N['I>Km['I=>D['I)>(W['Io>(W['I>(W['ITݼ>(W['I>(W['I9>3}['Im>j['IQT>'{K['I䚇>ү+['I'>`j ['I>Yս['IPR>r4['I4~>>$['I}>@k=['I> =['I K>>['I&>D>['Id>g>['I7>>['Ii>P>['I>܊>['I?hR>['I ?ٲ>['IB?}y>['I:H?4id>['IF('?H>['I-?'>['I3#3?-W>['I(7?-S=['I9?mU=['IP['IL??;>['IlD?GT>['IJ?h>['IP?v>['ICEX?c~>['I6`?˖>['Ij?U|>['I*v?m>['Iۀ?KU>['I˵?خ3>['I؉? >['Ix'?ح=['I*?w<['I?t['Ig?C~['IT?['Im? ['I?['I1?`2['I텏?;P['Iܷ?+#n['IǍ?!['I?!['Iʇ?!['I(?!['I{?!['I{r?Hn['ITt?P['IAw?3['IQRy?n['Iu {?b['Ib|?̪['I=Y}?ҵ['I/}?t7['I~?t['IM}?8<['Ii|?R =['IGz?\Y=['IVKw?‹=['I s?~=['IQ!o?GG=['I* j?߷=['IId?GG=['I^?~=['IY?‹=['IoU?\Y=['INR?R =['IǃO?8<['IM?t['IRL?t7['IgK?䉽['IgK?F['IgK?J['IgK?= ['IgK?= ['I"bB?= ['I8?= ['IM/?= ['IS%?J['IS%?F['IS%?䉽['IS%?t7/q>S%?K$/q>0%?>x#?c ?=/q>?=/q>?R=/q>}?=/q>~ ?)=/q>?=/q>[>R=/q>N>=/q>" >=/q>0>>i@=/q>U>Jh>Rr/q>>>$/q>Y>×/q>jY>۽/q>>h/q>>//q>q>N/q>>Km/q>=>D/q>)>(W/q>o>(W/q>>(W/q>Tݼ>(W/q>>(W/q>9>3}/q>m>j/q>QT>'{K/q>䚇>ү+/q>'>`j /q>>Yս/q>PR>r4/q>4~>>$/q>}>@k=/q>> =/q> K>>/q>&>D>/q>d>g>/q>7>>/q>i>P>/q>>܊>/q>?hR>/q> ?ٲ>/q>B?}y>/q>:H?4id>/q>F('?H>/q>-?'>/q>3#3?-W>/q>(7?-S=/q>9?mU=/q>P/q>L??;>/q>lD?GT>/q>J?h>/q>P?v>/q>CEX?c~>/q>6`?˖>/q>j?U|>/q>*v?m>/q>ۀ?KU>/q>˵?خ3>/q>؉? >/q>x'?ح=/q>*?w?t/q>g?C~/q>T?/q>m? /q>?/q>1?`2/q>텏?;P/q>ܷ?+#n/q>Ǎ?!/q>?!/q>ʇ?!/q>(?!/q>{?!/q>{r?Hn/q>Tt?P/q>Aw?3/q>QRy?n/q>u {?b/q>b|?̪/q>=Y}?ҵ/q>/}?t7/q>~?t/q>M}?8i|?R =/q>Gz?\Y=/q>VKw?‹=/q> s?~=/q>Q!o?GG=/q>* j?߷=/q>Id?GG=/q>^?~=/q>Y?‹=/q>oU?\Y=/q>NR?R =/q>ǃO?8M?t/q>RL?t7/q>gK?䉽/q>gK?F/q>gK?J/q>gK?= /q>gK?= /q>"bB?= /q>8?= /q>M/?= /q>S%?J/q>S%?F/q>S%?䉽/q>S%?>['Il?>['Ih?>['IH1?>['I%>>['Ip>%O>['Ip>??['Ip>*?['Ip>vp?['Ip>j4?['I㨊>I?['IQ>[?['Ik>h?['I>5 s?['IQ>z?['Ib>~?['I g?y5?['I21?~?['IL?z?['Ic?5 s?['I_fv?h?['Ig?[?['I8?I?['I9?j4?['Iʟ?vp?['Il?*?['Il???['Il?%O>['Il?l[?['Iw?J?['Iw?[:?['Iw?)!?['Iw?K$?['Iw?X/?['Iv?9?['Is?q&B?['I n?}H?['IXg??M?['Ij^?ФP?['Iq&B?['I:>9?['I̎>X/?['I>K$?['I>)!?['I>[:?['I>J?['I>l[?['I>l[?['I?l[?['IH1?l[?['I׋T?>/q>l?>/q>h?>/q>H1?>/q>%>>/q>p>%O>/q>p>??/q>p>*?/q>p>vp?/q>p>j4?/q>㨊>I?/q>Q>[?/q>k>h?/q>>5 s?/q>Q>z?/q>b>~?/q> g?y5?/q>21?~?/q>L?z?/q>c?5 s?/q>_fv?h?/q>g?[?/q>8?I?/q>9?j4?/q>ʟ?vp?/q>l?*?/q>l???/q>l?%O>/q>l?l[?/q>w?J?/q>w?[:?/q>w?)!?/q>w?K$?/q>w?X/?/q>v?9?/q>s?q&B?/q> n?}H?/q>Xg??M?/q>j^?ФP?/q>CC?[S?/q>21?$R?/q>Ĝ?ФP?/q>G??M?/q>F?}H?/q>:>q&B?/q>:>9?/q>̎>X/?/q>>K$?/q>>)!?/q>>[:?/q>>J?/q>>l[?/q>>l[?/q>?l[?/q>H1?l[?/q>׋T? A=hWZPPQW''(IbccHI@mn@n?!""]^MMN]##$23  2$%%PZ[P[OM^_M_LCiBijB&&' 34 4?n>no>BjkBkA""#Al@lm@HcddGHJabbIJ899(()9:::;;;<<\]NNO\12  178801  0 . ./ / /0455DhChiCL_``KL677566EgDghD--.EFfEfg<==o*+++,,GdeeFGK`aaJK)**UVRRSUVWQQRVWXYWYZ !%&),->o=klAefFTUS[\Oyzyyxyttsssrrrqqpqz{zutu{|{}}~||}xxwvuvwvw~~ppppqqqrrrssstttuuvvvvwwwxx xy  y yz  z z{  { {|  | |}  }}~~~   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTTUUUVVVWWWXXYYYZZZ[[[\\\]]]^^^___````aabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnnoopFGGDDENRSNSIHISSH)45)5('(5'56*34*4)+-*-3*GHG@@A   =>>>>?   AAB?@@  BBC&'6&67%78%8$   ";!;<!  <= =#:":;"$89$9#CCDJMNJNI.23.3-/12/2.OQRORNKLMMJK  ?!< 9:#&7%,-+01/ABEFPQOXXWUhsrhriTgtsgsh[Z[TTUoirorq]^~^ZYZ^~}^}_dxwdwe[\[gfugutewvevf\]]XXYcyxcxd_}|_|``{a{zabzybycioninjjnmjmkYZ\kmloqpfvuazb`|{UVVWTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|| |}  } }~  ~ ~           !!!"""###$$$%%%&&&&''((()))***+++,,,-,-.-././0/0111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMLMNMNONOPOPQQQRRRSSST43444  100  .- - ##" /. . ""!))((''$##-,   -655776*)*'&&%$$,+   ,+* +&%%32217!  0/454                   !!!"""###$$$%%%&&&'''(())))***+++,,,---...///001112223334445556667770AGoldh  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgPA              s3d-0.2.2.1/objs/s3d_sf_net.3ds000066400000000000000000002064351361325167000157600ustar00rootroot00000000000000MM  == @ TextA Aء| ny@܈h@l<u>th@t<6_>6i@|<*M>i@<7=>fhj@n%k@Pk@<>l@m@<=>n@<ŵ >Xgo@< >x8p@2q@< >0-r@< >*s@(t@<3>)u@<6>-v@<>3w@<>;x@<%>Gy@<+->~Vz@h{@<>>|@|<?I>|@g@^@<=4>]@x]@h<>]@<%3?$T@<%3?$T@< 8?qh@`,!@x<ȚZ> @d<4>@P<6>@@<<>@(|@<|G>@<? @&"P@8<>ڹ)@8<>>*@D<>N*@Pr+@\<>,@h<+>x-.@p/@x<_(U> ?1@<@> 3@r 5@<,z#>J57@<9>9@<>0<@<>`=@<[>U?@<>@@<>B@ D@ E@<ׁ.>IG@<.8>H@oJ@|@L@tNM@p<5k>8)O@l<{>8)O@p@<>!8?@]|<|?<9"?<{>?|?<])>D?<4>?>8?|?|<M>?xԘ?x?x?xPo?x<>R>p;?|<M>h?|w?>ީ?<4>?<])>'??<{>?<>8?<.=x'??|}?8< ? w?<< ?q?@<+?(><.?Xj><3?0><4?ط><"6?><).7?p<7?_><~8?>><;S8?,.>< 7?p><4?=<?p4>< ?GN><ܵ?+k><*#?><[>P><̜>p'>$h]>,<>x>4<Ǩ>><< >>@<ټ>01>H;>Lp>T<&>(>\>`<e>0>h<>P>p<2n>H>|<+H>d>0s><F>^><=J><=`Z><'P=@>< <Ƌ^<Z-6Ñ><"@3}><&0T><|:><+.&>Lzt<Re>@Q x<iT>j|<,E> <<7>.=׈==K=<>><+ >>@"1>OC><.>T> e>< >t>< >ف><>(><<>ގ>< >HS><[)>><3>><(?>؁>|`<>xԡ>p<\h>Н>h<>>`<>>T<>Y>L` *>D<>@=8<+>ɉ=0=<$<>LY<?_<9A?q<_#?ͤ<),?@<;K^?t><]X?a><2~V?pM><]T?Z>]|<><9<{>xr><])>M龄<4>㾀>|ݾ|־|<M>ϾxpǾxx6xx<>R>r|<M> |>斾<4>(<])>X]<{>ڇ<>K<.=…Lx<U>h<:>"T`<<,>̻(<>U0<[>V<FHT<>`# l<}>jt<b>t|@#<6>b$<ҋ&>L<>lJ4`<>\<>\p?)ܿ ٿ(<>Vٿ4<>'ؿ@<>iٿT<$>ڿd<> ܿt<]>s߿<<.>R㿔<>~翠<'=쿬1l<@0w>Vp<8Zh>x<Z>|<1O>r|<|D>\<d;>&a  S <(> <%>H< #><[Z"><$><,$)>=,\|<K> t<5\>ph`<>.X<'>LD( 8<>|,n$<><>R<?ձ L<ԕ?[H<ڐ?wD<6?\$@<焏?P<<*?X><$?S><"?>'1<̜>t/$-,<>q+4<Ǩ>)<< >(@<ټ><'H&Lt&T<&>%\C*%`<e><$h<>_$p<2n>y %|<+H>~%<&<F>?'<= (<=*<'P=:+< <-<Ƌ^</<Z-61<".X4<&_6<|8Ht<Re>\Fx<iT>̭D|<,E>Q C<7>pA?g><<>ڛ;<+ >P:>9h7<.>6Z5< >4< >(3<>}3<<>O2< >1<[)>Q 1<3>.0<(?>(;0|0x/p<\h>dq0h<>1`<>3T<>ێ6L9D<><8<+>?0B$<>yEG<?bH<9A?vI<_#?QI<),?NH<XZ?f<<\? :L Z?ny@>%3?qh@>%3?qh@>>܈h@>u>th@>@_>6i@>*M>i@>7=>fhj@>y/>n%k@>w$>Pk@>'>l@>s>m@>=>n@>ϵ >Xgo@> >x8p@> >2q@> >0-r@> >*s@>M >(t@>3>)u@>6>-v@>>3w@>>;x@> %>Gy@>+->~Vz@>I5>h{@>!>>|@>&?I>|@>uZ={@>uM4<3x@>Q <w@>5u;u@>Uݺvt@>i;ӻs@>+`r@>ʐ`Mq@>σKp@>B⏼^o@>*Bl@>뀼2i@>g@>1 ;e@> <c@>!=zb@>n=`@>==_@>j3=H^@>f>^@>G4>]@>n6Y>]@>>]@>%3?$T@>%3?$T@>"8?qh@>?qh@>L Z?ևM@>=zK@>}R=JJ@>=H@>l%<$IE@>; C@>1G@?@>C=@>A{;@>}g9@>* O5@>e_1@>Q.@><*@>-A=T3(@> !=%@>J=#@>(>,!@>ҚZ> @>:>@><>@><>@>\#>|@>G>@>? @>h?B-"@>)?D#@>pc5?&@>}??k(@>H?+@>^P?.@>dV?O1@>Z?4@>X]?n8@>oj^?;@>!]?5?@> [?oW?hE@>7Q?G@>I?I@>K@?ʜK@>`5?3M@>NU)?vN@>[$?aO@>? ?zO@>K>&"P@>>ڹ)@>>>*@>>N*@>m>r+@>$>,@>+>x-.@>l>/@>i(U> ?1@>@> 3@>e0>r 5@>6z#>J57@>)9>9@>>0<@>>`=@>e>U?@>>@@>>B@>S> D@>m5&> E@>.>IG@>.8>H@>R2C>oJ@>O>@L@>U]>NM@>?k>8)O@>{>8)O@>!=AE@> ?D@>~?]D@>e?"C@>)?B@>|`%?A@>Ee*?R@@>.?vN?@>V2?L=@>25?"A<@>rG7?B:@>ی8?8@>8?6@>8?`4@>aa7?3@>g5?1@>2?F0@>-+/?.@>I*?D-@>M%?,@>Y ?T+@>?*@>?0h*@>/T ?)@>? pE@>?A?>1[=?g?>eB?(?>YG??>XWK??>7O?8U?>R??>U?X?>TX??>}Z??>0\??>-k]?`?>*^??>oj^?s@>]?L@> \?-@>TY?T @>T?N @>{O?h @>H?@>w@?h@>n7?@>ke-?@>h!?W@>^?@>Fk?@>@>@>?@><?[@>?"@>ٸ?.a@>"?4@>|(?@>%o-?4@>1?6@>J5?>p@>@!8?@>[3:?,?>w;?(?>;? ?>Y;?e?>$;?-?>_,:?`?>Z8?6?P?>{4?y?>1?B?>$.??>*??>O&?DE?>!?p?>K?p?>"?>"?>L Z?p?>L Z?p?>1[=?8?>ͤ=?>~=?>~S='?>=?><ީ?>]|;h?> p;?>Po?> e?>Kt?>*Ԙ?>Yt?> e?>18?>B ?>ˁ;D?>]|<|?>="?>~S=?>|=(?>ͤ=?>[=(?>B=?>>"?>{>?>>|?>])>D?>4>?>pw>>8?>F>?>M>?>IR>Ԙ?> U>?>V>?>U>Po?>HR>p;?>M>h?>F>w?>pw>>ީ?>4>?>])>'?>>?>{>?>>8?>B=x'?>[=(_?>ڐ?܉?>7)??>n?D?>?\:?>ܑ?{?>?@?>*?t?>pF?-?>A[?LY?>i?Tx?>q??>t?xf?>>?|}?> ? w?>?q?>/?l?>f?h?>@?he?>?pc?>>?+a?>Â?_?>;~?_?> w?`^?> n?`^?>L Z? ?>L Z? ?>%3?`^?>%3?`^?>3?>3?>%3??>%3??>L Z?3?>L Z?3?>vj?|3?>0St?q4?>}?y5?>$?6?>?8?>&?`:?>H?\s=?>?[@?>˓?C?>g?p0G?>ژ?K?>+?QO?>d?T?>d?PY?>?`w^?>U?'d?>Ԥ?@2j?>?(p?>?sw?>?0~?>?46?>0??˦?8A?>?8A?>?p>>v%?>>g(? %>>+?(>>.?Xj>>W1?0~>>3?0>>4?ط>>"6?>>+.7?p>7?_>>Y8?N>>~8?>>>=S8?,.>> 7?p>>U7?P>>m5? >>4?=>P2?C=>1?`=>I.?=>;,?¿=>*?S=>g'?|=>$?=>"?`=>O?=>?=>?=>? >>l? ">>?p4>> ?GN>>޵?+k>>,#?>>[>P>>Ҝ>p'>>' >h]>>>x>>ͨ>>>>>>ټ>01>>B>;>>g>p>>&>(>>i>>> e>0>>>P>>2n>H>>5H>d>>Y%>0s>>)F>^>>=J>>=`Z>>QP=@>>N >j^>76Ñ>>w"@3}>>0T>>*:>>a@ !>>-&>>c@a=>,=>(ǻC}=>!'=>;Lg<>j<)>aF<e>FD ={>6==>Rt=>Bw>Lz>Re>@Q >iT>j>,E> <>7>.=>q+>׈=>ya!>=>_>K=>>>>+ >>>G>@"1>>w>OC>>.>T>>S> e>> >t>> >ف>>>(>><>ގ>> >HS>>e)>>>3>>>(?>؁>>rK>`<>>miY>ԡ>>\h>Н>>>>> >>>>Y>>G>` *>>>@=>1>ɉ=>y>=<>>L>{;>Y>?_>;A?q>a#?ͤ>+,?@>xS4?`>^;?C>B?>L!I?^λ>N?<>TS?@J=>?W?=>XZ?=>\? >>P]?K>>oj^?_>>=K^?t>>d]?f>>sP]?Ў>>s\?hO>>W[?p>>Y?`>>]X?a>>4~V?pM>>]T?Z>>Q?P>>UO?>>omL?>>!?K>ͤ=ڇ>~=X]>~S=>=(><斾>]|<>; > r>> e6>Kt>*pǾ>YtϾ> e־>1|ݾ>B 㾤>ˁ;M龤>]|<>>=>~S=@Y>|= >ͤ= q>[= >B=@Y>>>{>xr>>>>])>M龠>4>㾠>pw>>|ݾ>F>־>M>Ͼ>IR>pǾ> U>>V>6>U>>HR>r>M> >F>>pw>>斾>4>(>])>>>X]>{>ڇ>>K>B=…>[=Ά>&>7); >{V< Ԝ>26<>]=]>=>o=ñ>$>L>U>>$:>">t>`>2>̻>>U>h?'>?ķ>p?;´>2*?>5?僬>??`>H?8>TZP?VJ>]V?Fp>$Z?>T}]?"Y>oj^?>B]^?.>4^?(>]?\A|>-]?x>P ]?t> i\?43q>[?am>Z?@xi>ʲY?$re>X?0Ka>!*W?\>*U?\>?01>?01>h`>=0?t d>,1?Pgg>3?j>13?m>4?(,q>֓5?et>/6?Lw>6?z> 7?N~>P7?t‿>x7?>7?*>6?>5?>.2?h >.?>(?> "?ܞ>??>W?&>M ?>l*?c>W>>\>V>c>F󤿜>mi>>>>v># >}>j> b>t>J>@#> 6>b$>܋&>L>>lJ>+[>4`>>\>>\>A/?> ?ʱ>?t>!?`5>ɤ?>O?">$%? ] > ? >s?^ >m?< >?>ͧ?n@>ا?>%?4>v?[>Ǥ?ç>xv?>?迊>?忊>/?lΉ>v?t߿>i?3ݿ>? ܿ>?ۿ>'y?ۿ>>p?)ܿ>g? ܿ>D`?ݿ>5Y?߿> {R?Ր࿓>QNL?m⿓>iF?D俔> 1A? !翔>+dt7?5>`3?>h.?쿖>+?I鿖>d'?濖>"?D㿗>`?࿗>`$?޿>"S?ܿ> ?xۿ>I?]ڿ>z> ٿ>>Vٿ>>'ؿ>>iٿ>$>ڿ>> ܿ>]>s߿><.>R㿡>>~翢>;=쿣>KZs=>]=%>D0<>>/qƝ>* >y} >D >Wf >I >ϗDV> :%>J<K>o<>] =N>{6=m=>\e=m=>>1>J0w>V>BZh>>&Z>>;O>r>|D>\>d;>&a >Y3> >q->S >(> >%>H> #>>eZ">>$>>6$)>=>l1>,\>L<>>K> >5\>>o>>y)>>>.>->>Z>>\)>( >>|>T>n>>>!>R>?ձ>Fk?>, ?L>;?e>L?>9?P> ?$ >?$ >h@?0>|!A? >?;B?a> D?|>F?ޡ>ϴI?q>xM?)>Q?>W?A>E\?`>b?>ui?1w>p?>Lx?_>2?{|>ǂ?J>?>#I?>>֕?[>ܐ?w>6?\$>鄏?P>uw?L>\ ?&>b=?0 >2?H >t?$_ >,ې?u >苐?3 >#?">?>h?>gI?v1>r?Ju>'|?=>f?y,>0?y,>̠?(>v%?Ko*>g(?+>+?V->.?.>W1?0>3?n1>4?f2>"6?L3>+.7?5>7?$26>Y8?;7>~8?$K8>=S8?H9> 7?3:>U7? ;>m5?;>4?u<>P2?E =>1?x=>I.?,=>;,?L->>*?X>>g'?~g>>$?S>>"?>>O?<=>?s=>?V<>?a;>l?A9:>?8> ?F7>޵?x5>,#?o3>[>'1>Ҝ>t/>' >->>q+>ͨ>)>>(>ټ><'>B>&>g>t&>&>%>i>C*%> e><$>>_$>2n>y %>5H>~%>Y%><&>)F>?'>= (>=*>QP=:+>N <->j^</>761>w".X4>_6>*8>a:>-;>cX0=>,ҳ>>(ǻT6@>!ǺA>;DC>j<.D>aFFD =]H>6==JI>Rt=JI>Bw>H>Re>\F>iT>̭D>,E>Q C>7>pA>q+>?>ya!>g>>_><>>ڛ;>+ >P:>G>>9>w>h7>.>6>S>Z5> >4> >(3>>}3><>O2> >1>e)>Q 1>3>.0>(?>(;0>rK>0>miY>/>\h>dq0>>1> >3>>ێ6>G>9>><>1>?>y>B>>yE>{;>G>?bH>;A?vI>a#?QI>+,?NH>xS4?61H>^;?[;G>B?F>L!I?D>N?DB>TS?nA>?W?>>XZ?f<>\? :>P]?y7>oj^?26>=K^?4>d]?3>sP]?KQ2>s\?u1>W[?/>Y?X.>]X?(,>4~V?+>]T? @*>Q?(>UO?n'>omL?n'>!?(>v%?(g(?Ko*+?+<+?V->.?V-<.?.>W1?.3?0<3?n1>4?n1<4?f2>"6?f2<"6?L3>+.7?L3<).7?5>7?5<7?$26>Y8?$26~8?;7<~8?$K8>=S8?$K8<;S8?H9> 7?H9< 7?3:>U7?3:m5? ;4?;<4?u<>P2?u<1?E =<1?x=>I.?x=;,?,=<9,?L->>*?L-><*?X>>g'?X>>$?~g><$?S>>"?S><"?>>O?>?<=<?s=>?s=<?V<>?V<<?a;>l?a;?A9:<?8> ?8< ?F7>޵?F7<ܵ?x5>,#?x5<*#?o3>[>o3<[>'1>Ҝ>'1<̜>t/>' >t/$->>-,<>q+>ͨ>q+4<Ǩ>)>>)<< >(>ټ>(@<ټ><'>B><'H&>g>&Lt&>&>t&T<&>%>i>%\C*%> e>C*%`<e><$>><$h<>_$>2n>_$p<2n>y %>5H>y %|<+H>~%>Y%>~%<&>)F><&<F>?'>=?'<= (>= (<=*>QP=*<'P=:+>N <:+< <->j^<-<Ƌ^</>76/<Z-61>w"1<".X4>.X4<&_6>*_6<|8>a8-:<+.;>c;,X0=<\,ҳ>>(ǻҳ>!T6@;ǺAj<DC<j<.D>aF<.D<FFD =pF<D =]H>6==]H< ==JI>Rt=JI<(t=JI>Bw>JIl<8w>H>Re>Ht<Re>\F>iT>\Fx<iT>̭D>,E>̭D|<,E>Q C>7>Q C<7>pA>q+>pA?>ya!>?g>>_>g><>><<>ڛ;>+ >ڛ;<+ >P:>G>P:>9>w>>9h7>.>h7<.>6>S>6Z5> >Z5< >4> >4< >(3>>(3<>}3><>}3<<>O2> >O2< >1>e)>1<[)>Q 1>3>Q 1<3>.0>(?>.0<(?>(;0>rK>(;0|0>miY>0x/>\h>/p<\h>dq0>>dq0h<>1> >1`<>3>>3T<>ێ6>G>ێ6L9>>9D<><>1><8<+>?>y>?0B>>B$<>yE>{;>yEG>?G<?bH>;A?bH<9A?vI>a#?vI<_#?QI>+,?QI<),?NH>xS4?NH^;?61H<\;?[;G>B?[;GL!I?FN?D<~N?DB>TS?DB?W?nA>XZ?><XZ?f<>\?f<<\? :>P]? :oj^?y7=K^?26<;K^?4>d]?4sP]?3s\?KQ2W[?u1Y?/]X?X.<]X?(,>4~V?(,<2~V?+>]T?+<]T? @*>Q? @*UO?(omL?n'!?n' ? < ?ʱ>?ʱ <?t>!?t<?`5>ɤ?`5<ɤ?>O?$%?"<"%? ] > ? ] < ? >s? m?^ ?< <~?>ͧ?<ͧ?n@>ا?n@<ا?>%?<#?4>v?4Ǥ?[<Ǥ?ç>xv?ç ??<?忊>/?(<-?lΉ>v?l4i?t߿@?3ݿP? ܿ`'y?ۿp<'y?ۿ>>p?ۿ|<>p?)ܿ>g?)ܿD`? ܿ5Y?ݿ<3Y?߿> {R?߿<{R?Ր࿓>QNL?Ր࿬iF?m⿴ 1A?D俼<1A? !翔>+dt7?`3?5<^3?>h.?+?<+?I鿖>d'?I"?<"?D㿗>`?D<`?࿗>`$?<^$?޿>"S?޿< S?ܿ> ?ܿ< ?xۿ>I?xۿz>]ڿ<}z> ٿ>> ٿ(<>Vٿ>>Vٿ4<>'ؿ>>'ؿ@<>iٿ>$>iٿT<$>ڿ>>ڿd<> ܿ>]> ܿt<]>s߿><.>s߿<<.>R㿡>>R㿔<>~翢>;=~翠<'=쿣>KZs=쿬]=<3=%>D0<%<0<><>/q*Ɲ<| >y <ˁ} >} WD <.Wf >If <$J >ϗ <їDV> :DV<:%>J<%<<K>o<K<<><<@] =fC<] =N>{6=N\e=m=>m=h<>1>J0w>1l<@0w>V>BZh>Vp<8Zh>>&Z>x<Z>>;O>|<1O>r>|D>r|<|D>\>d;>\<d;>&a >Y3>&a  >q-> S >(>S <(> >%> <%>H> #>H< #>>eZ"><[Z">>$><$>>6$)><,$)>=>l1>=,\>L<>,\>K>|<K> >5\> t<5\>>o>p>y)>h>>`<>.>->.X<'>>Z>L>\)>D( >>( 8<>|>T>|,n>>n$<>>!><>R>?R<?ձ>Fk?ձ , ?<* ?L>;?L<9?e>L?e9?<7?P> ?P< ?$ >?$ < ?$ >h@?$ |!A?0?;B? <=;B?a> D?a< D?|>F?|<F?ޡ>ϴI?ޡ<ʹI?q>xM?qQ?)W?<W?A>E\?Ab?`ui?p?1w|Lx?t2?_h<2?{|>ǂ?{|`<ǂ?J>?JX#I?P>֕?>L<ԕ?[>ܐ?[H<ڐ?w>6?wD<6?\$>鄏?\$@<焏?P>uw?P<\ ?L<b=?&8<`=?0 >2?0 <<2?H >t?H <,ې?$_ <<*ې?u >苐?u <<拐?3 >#?3 <<#?">?"@<?>h?@gI?@r?v1D<r?Ju>'|?JuH<%|?=>f?=H0?y,L<0?y,>̠?y,<̠?Ά>Ά<&>7);&<5); >{V< 26< Ԝ<5<>]=<]=]>=]<ޥ=>o=<[=ñ>$>ñ<$>L>U>Lx<U>>$:>h<:>">t>"T`>2>`<<,>̻>>̻(<>U>h?U?'<?ķ>p?ķ2*?;´<2*?>5?<5?僬>??僬H?`<H?8>TZP?8]V?VJ<]V?Fp>$Z?Fp<"Z?>T}]?oj^?"YB]^?<@]^?.>4^?.<4^?(>]?(<]?\A|>-]?\A|<+]?x>P ]?x i\?t<i\?43q>[?43q< [?am>Z?am<Z?@xi>ʲY?@xi<ȲY?$re>X?$re!*W?0Ka<*W?\>*U?\<(U?\>?\?0101<h`>=0?h`<;0?t d>,1?t d<*1?Pgg>3?Pgg<3?j>13?j4?m<4?(,q>֓5?(,q<ԓ5?et>/6?et6?Lw<6?z> 7?z< 7?N~>P7?N~x7?t‿7?<7?*>6?*<6?>5?<5?>.2?<,2?h >.?h <.?>(?<(?> "?<"?ܞ>?ܞ<??>W??M ?&l*?W>c >\>0<[>V>c>V<F󤿜>mi>FH>>T<>>v>`# >}># l<}>j> b>jt<b>t>J>t|@#> 6>@#<6>b$>܋&>b$<ҋ&>L>>L<>lJ>+[>lJ4`>>4`<>\>>\<>\>A/?\ͤ=K<ͤ=ڇ>~=ڇ~S=X]<~S=>=<ǟ=(><(]|<斾;<; > < r>r<> e<8 e6>Kt6*<|pǾ>YtpǾ

1־<չ|ݾ>B |ݾ< 㾤>ˁ;㾼<;M龤>]|]|<>><><9=xr<ß=>~S=<~S=@Y>|=@Yͤ= <ͤ= q>[= qB= <.=@Y>>@Y<>>{><{>xr>>xr>>])>><])>M龠>4>M龄<4>㾠>pw>>㾀>|ݾ>F>|ݾ|־>M>־|<M>Ͼ>IR>ϾxpǾ> U>pǾx>V>x6>U>6x>HR>x<>R>r>M>r|<M> >F> |>pw>>>斾>4>斾<4>(>])>(<])>>>X]>{>X]<{>ڇ>>ڇ<>K>B=K<.=…>[=…>v%?p>>g(?>>+? %><+?(>>.?(><.?Xj>>W1?Xj>>3?0~><3?0>>4?0><4?ط>>"6?ط><"6?>>+.7?><).7?p>7?p<7?_>>Y8?_>>~8?N><~8?>>>=S8?>><;S8?,.>> 7?,.>< 7?p>>U7?p>>m5?P>>4? ><4?=>P2?=1?C=<1?`=>I.?`=;,?=<9,?¿=>*?¿=<*?S=>g'?S=$?|=<$?=>"?=<"?`=>O?`=?=<?=>?=<?=>?=<? >>l? >>? "><?p4>> ?p4>< ?GN>>޵?GN><ܵ?+k>>,#?+k><*#?>>[>><[>P>>Ҝ>P><̜>p'>>' >p'>$h]>>>h]>,<>x>>ͨ>x>4<Ǩ>>>>><< >>>ټ>>@<ټ>01>>B>01>H;>>g>;>Lp>>&>p>T<&>(>>i>(>\>> e>>`<e>0>>>0>h<>P>>2n>P>p<2n>H>>5H>H>|<+H>d>>Y%>d>0s>>)F>0s><F>^>>=^><=J>>=J><=`Z>>QP=`Z><'P=@>>N <@>< >j^<Ƌ^>76h£><Z-6Ñ>>w"Ñ><"@3}>>@3}><&0T>>*0T><|:>>a:>>-@ !><+.&>>c&>,@a=<\,=>(ǻ=!C}=;'=j<Lg<<j<)>aF<)<F<e>FD =e<D ={>6=={< ==>Rt=<(t=>Bw>l<8w>Lz>Re>Lzt<Re>@Q >iT>@Q x<iT>j>,E>j|<,E> <>7> <<7>.=>q+>.=׈=>ya!>׈==>_>=K=>>K=<>>>+ >><+ >>>G>>@"1>>w>@"1>OC>>.>OC><.>T>>S>T> e>> > e>< >t>> >t>< >ف>>>ف><>(>><>(><<>ގ>> >ގ>< >HS>>e)>HS><[)>>>3>><3>>>(?>><(?>؁>>rK>؁>|`<>>miY>`<>xԡ>>\h>ԡ>p<\h>Н>>>Н>h<>>> >>`<>>>>>T<>Y>>G>Y>L` *>>>` *>D<>@=>1>@=8<+>ɉ=>y>ɉ=0=<>>=<$<>L>{;>LY>?Y<?_>;A?_<9A?q>a#?q<_#?ͤ>+,?ͤ<),?@>xS4?@^;?`<\;?C>B?CL!I?N?^λ<~N?<>TS?<?W?@J=XZ?=<XZ?=>\?=<\? >>P]? >>oj^?K>>=K^?_><;K^?t>>d]?t>>sP]?f>>s\?Ў>>W[?hO>>Y?p>>]X?`><]X?a>>4~V?a><2~V?pM>>]T?pM><]T?Z>>Q?Z>>UO?P>>omL?>>!?>ڐ?(_?<<ڐ?܉?>7)?܉?<<5)??>n??8?D?8ܑ?\:?8<ܑ?{?>?{?8<?@?>*?@?8<*?t?>pF?t?8A[?-?8i?LY?8q?Tx?8t??8>?xf?8<>?|}?> ?|}?8< ? w?>? w?<< ?q?>/?q?@f?l?D@?h?H<@?he?>?he?P>?pc?X<Â?+a?`<Â?_?>;~?_?l<9~?_?> w?_?t< w?`^?> n?`^?< n?`^?>L Z?`^?L Z? ?%3? ?<%3?`^?>%3?`^?<%3?`^?>`^?<3?>3?<3?>%3?3?<%3??>%3??<%3??>L Z??L Z?3?vj?3?0St?|3?x<.St?q4?>}?q4?l<}?y5?>$?y5?`<$?6?>?6?T<?8?>&?8?L<$?`:?>H?`:?D?\s=?<˓?[@?4<˓?C?>g?C?,ژ?p0G?$<ژ?K?>+?K? <+?QO?>d?QO?d?T??PY?U?`w^?Ԥ?'d?<Ԥ?@2j?>?@2j?<?(p?>?(p??sw??0~?<?46?>0?46?<.??˦??8A??8A?<ͤ=8?<ͤ=?>~=?~S=?<~S='?>='?<ǟ=?><?]|<ީ?;w?<;h?> h?< p;?>p;?<Po?> ePo?<8 e?>Kt?*?<|Ԙ?>YtԘ? e?

1?<չ8?>B 8?< ?>ˁ;?<;D?>]|]|<|?><|?<9=?<ß="?>~S="?<~S=?>|=?ͤ=(?<ͤ=?>[=?B=(?<.=?>>?<>"?>{>"?<{>?>>?|?>])>|?<])>D?>4>D?<4>?>pw>>?>8?>F>8?|?>M>?|<M>?>IR>?xԘ?> U>Ԙ?x?>V>?x?>U>?xPo?>HR>Po?x<>R>p;?>M>p;?|<M>h?>F>h?|w?>pw>>w?>ީ?>4>ީ?<4>?>])>?<])>'?>>'??>{>?<{>?>>?<>8?>B=8?<.=x'?>[=x'?1[=?A?eB?g?YG?(?XWK??7O??<7O?8U?>R?8U?< R??>U??TX?X?}Z??<}Z??>0\??<0\??>-k]??<+k]?`?>*^?`?<*^??>oj^??]?s@<]?L@> \?L@< \?-@>TY?-@T?T @{O?N @<{O?h @>H?h @w@?@n7?h@ke-?@h!?@^?W@<\?@>Fk?@ @<@>@<@>?@ <?@><?@<:?[@>?[@<?"@>ٸ?"@<׸?.a@>"?.a@<"?4@>|(?4@<|(?@>%o-?@<#o-?4@>1?4@<1?6@>J5?6@<J5?>p@>@!8?>p@<>!8?@>[3:?@w;?,?;?(?<;? ?>Y;? ?$;?e?<$;?-?>_,:?-?<],:?`?>Z8?`?6?{4?P?1?y?<1?B?>$.?B?<".??>*??<*??>O&??!?DE?K?p?p?<"?>"?<"?>L Z?"?L Z?p?1[=?p?=ևM@<=zK@>}R=zK@<}R=JJ@>=JJ@<۴=H@><H@<=l%;$IE@<; C@>1G C@C@?@A{=@<{;@>};@*g9@<| O5@>e_ O5@Q1@<.@<;<*@>-A=*@<A=T3(@> !=T3(@< !=%@>J=%@<6=#@>(>#@<(>,!@>ҚZ>,!@x<ȚZ> @>:> @d<4>@><>@P<6>@><>@@<<>@>\#>@(|@>G>|@<|G>@>?@<? @>h? @)?B-"@<})?D#@>pc5?D#@}??&@<{??k(@>H?k(@^P?+@<^P?.@>dV?.@Z?O1@X]?4@oj^?n8@!]?;@<]?5?@> [?5?@< [?oW?7Q?hE@<7Q?G@>I?G@K@?I@`5?ʜK@<^5?3M@>NU)?3M@[$?vN@? ?aO@K>zO@&"P@>>&"P@8<>ڹ)@>>ڹ)@8<>>*@>>>*@D<>N*@>m>N*@Pr+@>$>r+@\<>,@>+>,@h<+>x-.@>l>x-.@p/@>i(U>/@x<_(U> ?1@>@> ?1@<@> 3@>e0> 3@r 5@>6z#>r 5@<,z#>J57@>)9>J57@<9>9@>>9@<>0<@>>0<@<>`=@>e>`=@<[>U?@>>U?@<>@@>>@@<>B@>S>B@ D@>m5&> D@ E@>.> E@<ׁ.>IG@>.8>IG@<.8>H@>R2C>H@oJ@>O>oJ@|@L@>U]>@L@tNM@>?k>NM@p<5k>8)O@>{>8)O@l<{>8)O@>!=8)O@ ?AE@< ?D@>~?D@<~?]D@>e?]D@<e?"C@>)?"C@<'?B@>|`%?B@Ee*?A@.?R@@<.?vN?@>V2?vN?@<V2?L=@>25?L=@<25?"A<@>rG7?"A<@ی8?B:@<ٌ8?8@>8?8@< 8?6@>8?6@<8?`4@>aa7?`4@<_a7?3@>g5?3@<g5?1@>2?1@<2?F0@>-+/?F0@<++/?.@>I*?.@M%?D-@Y ?,@<Y ?T+@>?T+@<?*@>?*@<?0h*@>/T ?0h*@<-T ?)@>?)@< ? pE@>? pE@< ?ny@>L Z?ny@%3?ny@<%3?qh@>%3?qh@<%3?qh@>>qh@d<>܈h@>u>܈h@l<u>th@>@_>th@t<6_>6i@>*M>6i@|<*M>i@>7=>i@<7=>fhj@>y/>fhj@n%k@>w$>n%k@Pk@>'>Pk@<>l@>s>l@m@>=>m@<=>n@>ϵ >n@<ŵ >Xgo@> >Xgo@< >x8p@> >x8p@2q@> >2q@< >0-r@> >0-r@< >*s@>M >*s@(t@>3>(t@<3>)u@>6>)u@<6>-v@>>-v@<>3w@>>3w@<>;x@> %>;x@<%>Gy@>+->Gy@<+->~Vz@>I5>~Vz@h{@>!>>h{@<>>|@>&?I>|@|<?I>|@>uZ=|@<{@<uM4Q <3x@

5u;w@<2u;u@>Uݺu@i;ӻvt@<<ӻs@>+s@ʐ``r@σMq@<σKp@>B⏼Kp@<⏼^o@>*^o@<|Bl@>뀼Bl@< 쀼2i@>2i@<>g@>1 ;g@ !=c@n=zb@<n=`@>==`@<)=_@>j3=_@f>H^@^@>G4>^@<=4>]@>n6Y>]@x]@>>]@h<>]@>%3?]@<%3?$T@>%3?$T@<%3?$T@>"8?$T@< 8?qh@>?qh@`L Z?qh@=G>HG?>G@?F@GFA@FBAFCBECFEDC;=<;>=:>;:?>9?:9@?8@98A@7A86A75A64 5  5  5 555A53 42 3  312 2  201111/0///./..-.--,-,+,+*+**)*)()('(%'&%'%% $ %#!$! $#"!MMLLKKJJIIHHGGFFEEDDCCBBMMNNMONPOQPRQSRSTSUTVUWVWXWYXZYZ[Z\[]\^]_^_`_a`babcbdcedefefgfhghihijikjklklmlnmnonopopqprqrrrsrssststtttttutuvuwvwxwxxyxyyzyz{z{{|{||}|~}        ++**))((''&&%%$$##""!!  EE +  +  +  ,+ -,- .-/.DE0/010212324345456576787989:9:;:<;<=<>=>?>@?A@ABACBDCDPRQORPNRONSRMSNLSMKSLKTSJTKITJHTIHUTGUHFUGFVUVFVWVWWXWXXXYXYZYZZZ[Z[[[\[\\]\]]^]^^_^_`_`a`ababcbccdcdedeeefeffgfhgihjikjlkmlnmnonooopoppqpqrqrrsrststutuvuvvwvwwxwxxyxyyyyzyzzz{z|{}|}}}~}~~~PRQPSROSPOTSOUTNUONVUNWVMWNMXWMYXLYMLZYL[ZK[LK\[K]\J]KJ]]]]]]]]]]]]^]IJHIGHHGGGGGFGFFFFEFEEEDEDDDDDCDCCCBCBBBABA@A@@?@?>?>>=>=<=<<;<;:;:9:9 "!9 8 9 #"7 8 $#6 76   %$5 6 &%4 5 '&3 43   ('2 31 2 )(0 1 *)/ 0 +*. / ,+- . -,-    -      _`_``a`abacbcdcedefe{yz{xygf{wxghg{vw{uvih{tuji{stkj{rsk{qrlk{pqml{opnm{no{n{{{|{|}|~}~~         312413        ##14/1./-.,-+,*+)*()'(&'%&$%#$"#!" ! 01/YWXYVWZVYZUV[UZ[TU\T[\ST]S\]RS^R]^QR_Q^_PQ`P_`OPaO`aNObNabMNcMbcLMdLcdKL5Kd6K56JK7J67IJ8I78HI9H89GH:G9:FG;F:;EF<E;<DE=D<=CD>C=>BC?B>?AB@A?jijhighfgefejkjkmlmklpopnomnpqprqsrstsutuvuwvwxwxyxyzy{z{|{|}|}}~}~ ! !"!#"#$#%$%%%%%%%%%%%%%&%                         KIJKHILHKLGHMGLMFGNFMNEFOENODEPDOPCDQCPQBCRBQRABSARS@AT@ST?@U?TU>?V>UV=>'=V(='(<=)<();<*;)*:;+:*+9:,9+,89-8,-78.7-.67/6./5605/045140134231}{|~{}pnoqnprnqsnrtnstmnumtvmuwmvwlmxlwylxzly{lz{klk{{{{{{{{{{{{{~{jkijhihhghgg~gfgffefeededcdccbcbbaba`a``_`__^_^^^]^]]]~]~\]~[\~Z[~YZ~XY~WX7567457347237127017/07/7/./-.-,-+,*+*)*)()'(&'&%&$%#$#"#!"! !              CBCAB@A?@>?=><=;<:;9:898CCDCDEDFEGFHGIHIJIKJLKMLMNMONPOPQPRQSRTSUTUVUWVXWXYXZY[Z[\[\]\^]^_^_`_a`ababcbdcdedefefgfhghhhihiiijijjjjjjkjklkmlm~n~mn}~n|}o|no{|oz{pzopyzqypqxyqwxrwqrvwruvsurstu               !  !#"!" #%$#$"%'&%&$')('(&)+*)*(+-,+,*-/.-.,/10/0.1321203543425765647987869;:9:8;=<;<:=?>=><?A@?@>ACBAB@CEDCDBEGFEFDGIHGHFIKJIJHKMLKLJMONMNLOQPOPNQSRQRPSUTSTRUWVUVTWYXWXVY[ZYZX[]\[\Z]_^]^\_a`_`^acbab`cedcdbegfefdgihghfikjijhkmlkljmonmnloqpopnqsrqrpsutstruwvuvtwyxwxvy{zyzx{}|{|z}~}~|~               !  !#"!" #%$#$"%'&%&$')('(&)+*)*(+-,+,*-/.-.,/10/0.1321203543425765647987869;:9:8;=<;<:=?>=><?A@?@>ACBAB@CEDCDBEGFEFDGIHGHFIKJIJHKMLKLJMONMNLOQPOPNQSRQRPSUTSTRUWVUVTWYXWXVY[ZYZX[]\[\Z]_^]^\_a`_`^acbab`cedcdbegfefdgihghfikjijhkmlkljmonmnloqpopnqsrqrpsutstruwvuvtwyxwxvy{zyzx{}|{|z}~}~|~                                                                             !   ! # " ! " # % $ # $ " % ' & % & $ ' ) ( ' ( & ) + * ) * ( + - , + , * - / . - . , / 1 0 / 0 . 1 3 2 1 2 0 3 5 4 3 4 2 5 7 6 5 6 4 7 9 8 7 8 6 9 ; : 9 : 8 ; = < ; < : = ? > = > < ? ? > A C B A B @ C E D C D B E G F E F D G I H G H F I K J I J H K M L K L J M O N M N L O Q P O P N Q S R Q R P S U T S T R U W V U V T W Y X W X V Y [ Z Y Z X [ ] \ [ \ Z ] _ ^ ] ^ \ _ a ` _ ` ^ a c b a b ` c e d c d b e g f e f d g i h g h f i k j i j h k m l k l j m o n m n l o q p o p n q s r q r p s u t s t r u w v u v t w y x w x v y { z y z x { } | { | z }  ~ } ~ |   ~ A @ @                                                                             !   ! # " ! " # % $ # $ " % ' & % & $ ' ) ( ' ( & ) + * ) * ( + - , + , * - / . - . , / 1 0 / 0 . 1 3 2 1 2 0 3 5 4 3 4 2 5 7 6 5 6 4 7 9 8 7 8 6 9 ; : 9 : 8 ; = < ; < : = ? > = > < ? A @ ? @ > A C B A B @ C E D C D B E G F E F D G I H G H F I K J I J H K M L K L J M O N M N L O Q P O P N Q S R Q R P S U T S T R U W V U V T W Y X W X V Y [ Z Y Z X [ ] \ [ \ Z ] _ ^ ] ^ \ _ a ` _ ` ^ a c b a b ` c e d c d b e g f e f d g i h g h f i k j i j h k m l k l j m o n m n l o q p o p n q s r q r p s u t s t r u w v u v t w y x w x v y { z y z x { } | { | z }  ~ } ~ |   ~                                                                             !   ! # " ! " # % $ # $ " % ' & % & $ ' ) ( ' ( & ) + * ) * ( + - , + , * - / . - . , / 1 0 / 0 . 1 3 2 1 2 0 3 5 4 3 4 2 5 7 6 5 6 4 7 9 8 7 8 6 9 ; : 9 : 8 ; = < ; < : = ? > = > < ? A @ ? @ > A C B A B @ C E D C D B E G F E F D G I H G H F I K J I J H K M L K L J M O N M N L O Q P O P N Q S R Q R P S U T S T R U W V U V T W Y X W X V Y [ Z Y Z X [ ] \ [ \ Z ] _ ^ ] ^ \ _ a ` _ ` ^ a c b a b ` c e d c d b e g f e f d g i h g h f i k j i j h k m l k l j m o n m n l o o n q s r q r p s u t s t r u w v u v t w y x w x v y { z y z x { } | { | z }  ~ } ~ |   ~ q p p                                                                             !   ! # " ! " # % $ # $ " % ' & % & $ ' ) ( ' ( & ) + * ) * ( + - , + , * - / . - . , / 1 0 / 0 . 1 3 2 1 2 0 3 5 4 3 4 2 5 7 6 5 6 4 7 9 8 7 8 6 9 ; : 9 : 8 ; = < ; < : = ? > = > < ? A @ ? @ > A A @ C E D C D B E G F E F D G I H G H F I K J I J H K M L K L J M O N M N L O Q P O P N Q S R Q R P S U T S T R U W V U V T W Y X W X V Y [ Z Y Z X [ ] \ [ \ Z ] _ ^ ] ^ \ _ a ` _ ` ^ a c b a b ` c e d c d b e g f e f d g i h g h f i k j i j h k m l k l j m o n m n l o q p o p n q s r q r p s u t s t r u w v u v t w y x w x v y { z y z x { } | { | z }  ~ } ~ |   ~ C B B                                                                           !   ! # " ! " # % $ # $ " % ' & % & $ ' ) ( ' ( & ) + * ) * ( + - , + , * - / . - . , / 1 0 / 0 . 1 3 2 1 2 0 3 5 4 3 4 2 5 7 6 5 6 4 7 9 8 7 8 6 9 ; : 9 : 8 ; = < ; < : = ? > = > < ? A @ ? @ > A C B A B @ C E D C D B E G F E F D G I H G H F I K J I J H K M L K L J M O N M N L O Q P O P N Q S R Q R P S U T S T R U W V U V T W Y X W X V Y [ Z Y Z X [ ] \ [ \ Z ] _ ^ ] ^ \ _ a ` _ ` ^ a c b a b ` c e d c d b e g f e f d g i h g h f i k j i j h k m l k l j m o n m n l o q p o p n q s r q r p s u t s t r u w v u v t w y x w x v y { z y z x {  {  z `A6?ӻ+?ӻ+N>s3d-0.2.2.1/objs/s3dstart.3ds000066400000000000000000000221541361325167000154720ustar00rootroot00000000000000MMl$ ==\$>= New Material 2@00       # #P0default0  @0   P0   ?@text5A`A6???AP 3,þܕ=3,þ>,þVl>V,þ>,,þ۠>B,þ6>"g,þ#B> ~,þq>eX,þH>Q~,þvH<>\,þpԽ7,þ/D3,þ7R6,þN;v?,þnAH,þ頾zcJ,þizcJ,þ-4y,þ-4y,þV]~y|,þ d,þ;,þ!I,þA9[,þwg,þɨcd,þ%,þXf<+vA,þ=I,þ=J,þX->5-H,þNW>\@,þe>7,þlV>"*6,þ >"*6,þܕ=3*ܕ=3*>*Vl>V*>,*۠>B*6>"g*#B> ~*q>eX*H>Q~*vH<>\*pԽ7*/D3*7R6*N;v?*nAH*頾zcJ*izcJ*-4y*-4y*V]~y|* d*;*!I*A9[*wg*ɨcd*%*Xf<+vA*=I*=J*X->5-H*NW>\@*e>7*lV>"*6* >"*6*ܕ=nD=,þ H=-K>,þ->{*>,þ>)=,þmN>),þ?,þS!?Ӿ,þ1>Ӿ,þ5,g>s&,þ5,g>s&,þF>,þ#>DY,þ>u,þ{{>7W,þ!>7W,þ}>L,þ?><,þ!>Fd,þ`>Fd,þ8;@,þ;ag{ⰽ,þK7W,þ7W,þ/DL,þ p/,þLШ ,þΟs&,þJ>ks&,þ Ӿ,þ Ӿ,þ^*Ⱦ,þƩ,þn㾃,þL$a=,þF澃Y>,þj\(4>,þ!(>,þ=nD=* H=-K>*->{*>*>)=*mN>)*?*S!?Ӿ*1>Ӿ*5,g>s&*5,g>s&*F>*#>DY*>u*{{>7W*!>7W*}>L*?><罫*!>Fd*`>Fd*8;@*;ag{ⰽ*K7W*7W*/DL* p/*LШ *Οs&*J>ks&* Ӿ* Ӿ*^*Ⱦ*Ʃ*n㾃*L$a=*F澃Y>*j\(4>*!(>*=&U?,þ?Q?,þ?Q?,þ>b?,þ>R>,þ6>>,þk>D>,þV>Y>,þ^ >Y>,þw|D>,þ/v<>,þǤ*>,þ!I ?,þ?Q?,þ]ϾQ?,þ&U?,þQ?,þ5,>Q?,þkC?,þ ?,þ ?,þ?,þLP?,þ5,>D?,þNW> ?,þe>+X?,þV>&U?*?Q?*?Q?*>b?*>R>*6>>*k>D>*V>Y>*^ >Y>*w|D>*/v<>*Ǥ*>*!I ?*?Q?*]ϾQ?*&U?*Q?*5,>Q?*kC?* ?* ?*?*LP?*5,>D?*NW> ?*e>+X?*V> A]   !""""#            !!!  .-A.A@&%F&FE$GF$F%.@??/./>==0/)DC)C*438487,BAA-,7655471;::210=<0<1*C+CB+(ED(D)2:9293'&E'E(+B,/?>3981<;$%%%%&&&'''((()))***+++,, ,-  - -.  . ./  / /0  0 01  1122233344555566777788899::::;;;<<<===>>>???@@@AAABBBCC CD  D!DE!!E"EF""F#FG##G$#$HIVHVWhi__`hX[H[\Haghah`YZ[Y[X^_j^jkOPQOQNLMRLRSJUVVIJKTUKUJNQRNRM]kl]l\befbfaLSTLTKcdeebcWXH\lH^k]ij_fgam|{m{nmm}~}~tsvtvuqxwwrq{zoon{ozpzypsrwswvqpyqyxm}|mHmImnIInJnoJJoKopKKpLpqLLqMqrMMrsMsNNsttONOtPtuPPuvPvQQvRvwRRwSwxSSxTxyTTyUyzUUz{{VUV{W{|WW|X|}XX}Y}~YY~Z~ZZ[[[\\\]]]^]^___```aaabbbbccdcdedefffgggghhiiijjjkkklllHmH0ANew Material 2  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PA@Fcube4A:`A6???A@Y>hrY>hr ?W?>hr ?W?>hrYg>Yg> ?W?g> ?W?g>ERCꩻRCM=?ꩻM=?\?E\?ꩻM=?\?ꩻRCb>Eb>RCb>M=?\?b>E!lE?ꩻEꩻvꩻ}?>EJÿꩻE A0                          0Apdefault0  !"#$%&'()*+,-./PAs3d-0.2.2.1/objs/sec_p.3ds000066400000000000000000000021621361325167000150110ustar00rootroot00000000000000MMr ==b>= } grey0 uu uu@0   P0   ?@cube2A`A6???ADl c.,+?s2<,+?7p< c֝j?=DlC?7p8Ku c֝>c8 C?Dl>C?7p< z>7p<>C?П<>c֝ὒz>8~b?П<ὒz>8Ku z>П<>z>8>~b?֝>z> Ag*                            0Aagrey*  !"#$%&'()PA    s3d-0.2.2.1/objs/snow_body.3ds000066400000000000000000000543461361325167000157360ustar00rootroot00000000000000MMX ==X>= New Material@00   iii iii  SSS SSSP0default0  @0   P0  } holz@00 L5 L5    C( C(P0 ?@:Wsphere1A,W`A6???A,!!cG>{?*x]|>{?V<Yq>{?9X=^>{?= F>{?='>{?=c;>{?& >={?z>!!c={?& >*x<{?=V{?=9X{?={?9X=ڽ{?V<{?*x& {?!!cz{?& {?c;{?'ڽ{? F{?^9X{?YqV{?]|*x<{?G!!c={?]|={?Yqc;>{?^'>{? F F>{?'^>{?c;Yq>{?]|>{?!!c9S>^l?V^l?[=i>^l? >M>^l?_O\>>^l?> ?>^l?Ϡ>bN>^l?&ǣ>c;>^l?>!!c=^l?&ǣ>V^l?Ϡ>[^l?> ^l?_O\>_O\^l? >^l?[=Ϡ^l?V<&ǣ^l?!!c񊧾^l?c;&ǣ^l?bNϠ^l? ?^l?料_O\^l?M ^l?iѾ[^l?nܾV^l?9S!!c=^l?nܾc;>^l?iѾbN>^l?M ?>^l?料>^l? ?M>^l?bNi>^l?c;n>^l?!!ck?1T?9X=Q?1T? >c?1T?Q>s?1T?*>r>1T?:>l>1T?~h> ?>1T?Z>'>1T??!!c=1T?Z>9X1T?~h> 1T?:>Q1T?*>*1T?Q>:о1T? >~h1T?9X=Z1T?!!c1T?'Z1T? ?~h1T?l:о1T?r*1T?sQ1T?c 1T?Q9X1T?k!!c=1T?Q'>1T?c ?>1T?sl>1T?rr>1T?ls?1T? ?c?1T?'Q?1T?!!c7C?5?=??5?_O\>o5?5?*>*$?5?ܛ>2?5?Q?r>5?b ?>5?sX#? F>5?&?!!c=5?sX#?5?b ?_O\5?Q?*5?ܛ>ܛ5?*>Q5?_O\>b 5?=sX#5?!!c:@.N? FsX#5?料b 5?rQ5?2ܛ5?*$*5?o5_O\5??5?7C!!c=5?? F>5?o5>5?*$r>5?22?5?r*$?5?料o5?5? F??5?!!cC c?9?=;^?9?>^R?9?:>-??9?Q?*$?9?"?s?9?:u6?M>9?B?^>9?DI?=?rE?޻?:u6?9?"?:о9?Q?Q9?:>"9?>:u69?=B9?!!cF9?^B9?M:u69?s"9?*$Q9?-?:о9?^R9?_b޻?he=?;^^>9?^RM>9?-?s?9?*$*$?9?s-??9?M^R?9?^;^?9?!!cqz?>= *v?>Ϡ>h?>~h>^R?>b ?o5?>:u6?c?>hPL?i>>Y?Yq>>Z?=>pW?`̽>hPL?Ϡ>:u6?~h>b ?b >~h>:u6>Ϡ>hPL>=Y>!!cLQ^>YqY>iѾhPL>c:u6>o5b >^R~h>hϠ>s`̽>.w=> *vYq>>hi>>^Rc?>o5o5?>c^R?>iѾh?>Yq *v?>!!ch?G>& >9?G>&ǣ> *v?G>Z>;^?G>sX#???G>B?Q?G>Y?n>G>h?]|>G>l?!!c=G>h?& G>Y?&ǣG>B?ZG>sX#?sX#G>Z>BG>&ǣ>YG>& >hG>!!c {c>]|hG>nܾYG>QBG>?sX#G>;^ZG> *v&ǣG>9& G>h!!c=G>9]|>G> *vn>G>;^Q?G>???G>Q;^?G>nܾ *v?G>]|9?G>!!c ?zz>h?ŷ#>qz?ú!?C c?q"&?7C?_#F?k?#LQ^?9S>$l?G>ՠS$q?!!c=[$l?z$LQ^?񊧾xc$F?J$&?&n1$?Ff$>LQ^;%z>l%!!cqE %Gl%9SLQ^;%kFf$7C&n1$C cJ$qz񊧾xc$hz$ !!c=[$hG>ՠS$qz9S>$C ck?#7C7C?_#kC c?q"9Sqz?ú!Gh?ŷ#!!ch?G& >9?G&ǣ> *v?GZ>;^?GsX#???GB?Q?GY?n>Gh?]|>Gl?!!c=Gh?& GY?&ǣGB?ZGsX#?sX#GZ>BG&ǣ>YG& >hG!!clG]|hGnܾYGQBG?sX#G;^ZG *v&ǣG9& Gh!!c=G9]|>G *vn>G;^Q?G???GQ;^?Gnܾ *v?G]|9?G!!cqz?þ= *v?þϠ>h?þ~h>^R?þb ?o5?þ:u6?c?þhPL?i>þY?Yq>þLQ^?!!c=þY?þhPL?Ϡþ:u6?~hþb ?b þ~h>:u6þϠ>hPLþ=Yþ!!c9t߾YqYþiѾhPLþc:u6þo5b þ^R~hþhϠþ *vþqz!!c=þ *vYq>þhi>þ^Rc?þo5o5?þc^R?þiѾh?þYq *v?þ!!cC c?9=;^?9>^R?9:>-??9Q?*$?9"?s?9:u6?M>9B?^>9F?!!c=9B?ڽ9:u6?9"?:о9Q?Q9:>"9>:u69=B9!!cF9^B9M:u69s"9*$Q9-?:о9^R9;^ڽ9C c!!c=9;^^>9^RM>9-?s?9*$*$?9s-??9M^R?9^;^?9!!c7C?5=??5_O\>o5?5*>*$?5ܛ>2?5Q?r>5b ?>5sX#? F>5&?!!c=5sX#?5b ?_O\5Q?*5ܛ>ܛ5*>Q5_O\>b 5=sX#5!!c&5 FsX#5料b 5rQ52ܛ5*$*5o5_O\5?57C!!c=5? F>5o5>5*$r>522?5r*$?5料o5?5 F??5!!ck?1T9X=Q?1T >c?1TQ>s?1T*>r>1T:>l>1T~h> ?>1TZ>'>1T?!!c=1TZ>9X1T~h> 1T:>Q1T*>*1TQ>:о1T >~h1T9X=Z1T!!c1T'Z1T ?~h1Tl:о1Tr*1TsQ1Tc 1TQ9X1Tk!!c=1TQ'>1Tc ?>1Tsl>1Trr>1Tls?1T ?c?1T'Q?1T!!c9S>^lV^l[=i>^l >M>^l_O\>>^l> ?>^lϠ>bN>^l&ǣ>c;>^l>!!c=^l&ǣ>V^lϠ>[^l> ^l_O\>_O\^l >^l[=Ϡ^lV<&ǣ^l!!c񊧾^lc;&ǣ^lbNϠ^l ?^l料_O\^lM ^liѾ[^lnܾV^l9S!!c=^lnܾc;>^liѾbN>^lM ?>^l料>^l ?M>^lbNi>^lc;n>^l!!cG>{*x]|>{V<Yq>{9X=^>{= F>{='>{=c;>{& >={z>!!c={& >*x<{=V{=9X{={9X=ڽ{V<{*x& {!!cz{& {c;{'ڽ{ F{^9X{YqV{]|*x<{G!!c={]|={Yqc;>{^'>{ F F>{'^>{c;Yq>{]|>{!!c!!c=?!!c!!c=!!c,Yp?Ǽ=<.N?O<.N?!!cO.b$?34=]]$?=|=`>p?i]]$?0`>p?!!c8{>>p {c>7p {c>!!c_< ~{s>4]<| >{s>x>]Sz߾F~Sz߾!!cf(;pV8=ay>;p,kaHx?P;x?i*3?5k!?>?;x??Hx?#d?k!?7?*3?a)Ҽ9?"jd1>Zn!!c=d1>ox>zBm?Saпb#B?,U[?Rοc6)#B?y,:VK?ſUc?fV[?ǿ'NUc?$\?ѿ̽+N?d1> \?>x@zBm?@?c6)#B?Z?V[?A/?b#B?&?:VK?vW?'NUc?E?U[?Ƿ?Uc?@$\??̽d1>bA?6d1>]6d1>"jh>d1>%yj? $G>n $G> A<T        !!!"""###$%%$&&%''&(('( ( )) ) ** * ++ + ,, - -- . ..///000101212323434555666777888989:9:;:;<;==<>>=??>  ?@ !@!AA!"A"BB"#B#CC#$C$D$%EED$%&FFE%&'GGF&'(HHG'H()H)II)*I*JJ*+J+KK+,K,LL,M,-MM-N-.NN.O./OO/00POP011QPQ122RQR233SRS344TST4U45UU5V56VV6W67WW7X78XX899YXY9::ZYZ:;;[Z[;<<\[<=]]\<=>^^]=>?__^>? @@_?`@A`AaaABaBbbBCbCccCDcDdDEeedDEFffeEFGggfFGHhhgG$hH$HI$IiiIJiJjjJKjKkkKLkLllLmLMmmMnMNnnNoNOoppppqQRRrqrRSSsrsSTTtstTuTUuuUvUVvvVwVWw%wWWX%Xx%xXYYyxyYZZzyzZ[[{z{[\\|{\]}}|\]^~~}]^_~^_@``_`aaabbbcccdddedefefgfghhhh$iijjkkkllllmmmnnnoppppqrrrsssttttuuuvvwwww%xxyyzzz{{{|||}|}~}~~`&&&&''''(((())))*+***+++                !""!##"$$#%%$&&%&&'''(( ( )  **)   ++*   ,,+ ,   -, ..- ./.001223324435545656767878999:::;:<<;==<>>=>>??? @ !@!A!"BBA!"#CCB"#$DDC#D$%%EDE%&E&FF&'F'GG'(G(HH()H)I)*JJI)*+KKJ*+,LLK+,-MML,M-..NMN.//ON0000Q1R12RR2S23S34TTS3T455UTU566VUV677WVW788XWX8Y89YY9Z9:ZZ:[:;[;<\\[;\<==]\]=>]>^^>?^?__? _ @`@A`AaABbbaABCccbBCDddcCdDEdEeeEFeFffFGfGggGHgHhhHIhIiIJjjiIJKkkjJKLllkKlLMMmlmMNNnmnNOOonoOPPpopPqPQqqQrQRrrRsRSssStSTttTUUutuUVVvuvVWWwvwWXXxwxXyXYyyYzYZzzZ{Z[{{[|[\||\]|]}}]^}^~~^_~__@@``a`ababcbcdcdeeefffggghhhiiijijkjklklmmmnnnoooppppqqqrrrsssttuuuvvvwwwxxxxyyyzzz{{{||}}}~~~``ooooOOPPqqPPQQqq11PPOO////11QQPP                                 !!!!!!!""""""""#######i$ixx%&'()*+0ANew MaterialH !"#bcde0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`afghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~DEFGHIJKLMNOPQRS0AholzP      !"#$%&'()*+,-./0123456789:;<=>?@ABCPAVs3d-0.2.2.1/objs/snow_foot.3ds000066400000000000000000000502141361325167000157360ustar00rootroot00000000000000MMP ==|P>= New Material0  @0  SSS SSSP0 iii iiidefault0  @0   P0   ?@]Osphere1AOO`A6???AE>lw>{? s>{?Ib<7h>{?X}=U>{?7=<>{?=>{?>3={?DH>)@={?>E>={?DH> <{?>Ib漾{?=X}{?7=7{?X}=콾{?Ib<{? DH{?E>{?)@DH{?3{?콾{?<7{?UX}{?7hIb漾{?s <{?lwE>={?s)@={?7h3={?U>{?<<>{?U>{?37h>{?)@s>{?E>~>^l?Ib<>^l?=\>^l?*>)>^l?pe>=_>^l?X>M>^l?1>E>^l?W>3=^l?>E>=^l?W>Ib^l?1>̽^l?X>*^l?pe>pe^l?*>X^l?=1^l?Ib^l?3W^l?E1^l?MX^l?=_pe^l?)*^l?\̾̽^l?׾Ib^l?~۾E>=^l?׾3=^l?\̾E>^l?)M>^l?=_=_>^l?M)>^l?E\>^l?3>^l?E>#?1T?X}=g?1T?*>P?1T? 5>d+?1T?O>>1T?>۵>1T?9>M>1T?)>>1T?%P?E>=1T?)>X}1T?9>*1T?> 51T?O>O1T? 5>Ծ1T?*>91T?X}=)1T?E>%P1T?)1T?M91T?۵Ծ1T?O1T?d+ 51T?P*1T?gX}1T?#E>=1T?g>1T?PM>1T?d+۵>1T?ྷ>1T?۵d+?1T?MP?1T?g?1T?E>@?5?7=:t=?5?pe>)'3?5?O>l"?5?,> ?5?c ?>5?S?=_>5?Ѡ%?<>5??)?E>=5?Ѡ%?75?S?pe5?c ?O5?,>,5?O>c 5?pe>S5?7=Ѡ%5?E>݂B.N?<Ѡ%5?=_S5?c 5? ,5?l"O5?)'3pe5?:t=75?@E>=5?:t=<>5?)'3=_>5?l">5? ?5?l"?5?=_)'3?5?<:t=?5?E>`?9?=ݭ\?9?X>P?9?>z9?uD?U>9?}H?E>=9?uD?9?8?X9?%?Ծ9?c ?c 9?>%9?X>89?=uD9?E>}H9?UuD9?)89?d+%9?l"c 9?z<Ծ9?PX9?ݭ\9?`E>=9?ݭ\U>9?P)>9?zmx?>>s?>1>.lf?>9>P?>S?)'3?>8?P?>ŘN?\>>D\?7h>>`?E>=>D\?>ŘN?1>8?9>S?S>9>8>1>ŘN>>D\>E>`>7hD\>\̾ŘN>P8>)'3S>P9>.lf1>s>mxE>=>s7h>>.lf\>>PP?>)'3)'3?>PP?>\̾.lf?>7hs?>E>9?G>DH>?G>W>s?G>)>ݭ\?G>Ѡ%?:t=?G>uD?g?G>D\?>G>Wj?s>G> +o?E>=G>Wj?DHG>D\?WG>uD?)G>Ѡ%?Ѡ%G>)>uDG>W>D\G>DH>WjG>E>) {c>sWjG>׾D\G>guDG>:t=Ѡ%G>ݭ\)G>sWG>DHG>9E>=G>s>G>s>G>ݭ\g?G>:t=:t=?G>gݭ\?G>׾s?G>s?G>E>?>R>9?=>mx?"%P?`?E #?)?@?!#}H?#?#`?~>,!$ +o?lw>g%V$Lt?E>= $ +o?d)$`?¥$}H?%P$?)??)s$%P?}H$>``%> +oƋ%E>Lt %lw +oƋ%~۾``%#}H$@?)s$`%P$mx¥$9d)$E>= $9lw>g%V$mx~>,!$`#?#@@?!##`?E #~۾mx?"lw9?=E>9?GDH>?GW>s?G)>ݭ\?GѠ%?:t=?GuD?g?GD\?>GWj?s>G +o?E>=GWj?DHGD\?WGuD?)GѠ%?Ѡ%G)>uDGW>D\GDH>WjGE> +oGsWjG׾D\GguDG:t=Ѡ%Gݭ\)GsWGDHG9E>=Gs>Gs>Gݭ\g?G:t=:t=?Ggݭ\?G׾s?Gs?GE>mx?þ>s?þ1>.lf?þ9>P?þS?)'3?þ8?P?þŘN?\>þD\?7h>þ`?E>=þD\?þŘN?1þ8?9þS?Sþ9>8þ1>ŘNþ>D\þE>Kހ߾7hD\þ\̾ŘNþP8þ)'3SþP9þ.lf1þsþmxE>=þs7h>þ.lf\>þPP?þ)'3)'3?þPP?þ\̾.lf?þ7hs?þE>`?9=ݭ\?9X>P?9>z9uD?U>9}H?E>=9uD?98?X9%?Ծ9c ?c 9>%9X>89=uD9E>}H9UuD9)89d+%9l"c 9z<Ծ9PX9ݭ\9`E>=9ݭ\U>9P)>9z@?57=:t=?5pe>)'3?5O>l"?5,> ?5c ?>5S?=_>5Ѡ%?<>5?)?E>=5Ѡ%?75S?pe5c ?O5,>,5O>c 5pe>S57=Ѡ%5E>?)5<Ѡ%5=_S5c 5 ,5l"O5)'3pe5:t=75@E>=5:t=<>5)'3=_>5l">5 ?5l"?5=_)'3?5<:t=?5E>#?1TX}=g?1T*>P?1T 5>d+?1TO>>1T>۵>1T9>M>1T)>>1T%P?E>=1T)>X}1T9>*1T> 51TO>O1T 5>Ծ1T*>91TX}=)1TE>%P1T)1TM91T۵Ծ1TO1Td+ 51TP*1TgX}1T#E>=1Tg>1TPM>1Td+۵>1Tྷ>1T۵d+?1TMP?1Tg?1TE>~>^lIb<>^l=\>^l*>)>^lpe>=_>^lX>M>^l1>E>^lW>3=^l>E>=^lW>Ib^l1>̽^lX>*^lpe>pe^l*>X^l=1^lIb^l3W^lE1^lMX^l=_pe^l)*^l\̾̽^l׾Ib^l~۾E>=^l׾3=^l\̾E>^l)M>^l=_=_>^lM)>^lE\>^l3>^lE>lw>{ s>{Ib<7h>{X}=U>{7=<>{=>{>3={DH>)@={>E>={DH> <{>Ib漾{=X}{7=7{X}=콾{Ib<{ DH{E>{)@DH{3{콾{<7{UX}{7hIb漾{s <{lwE>={s)@={7h3={U>{<<>{U>{37h>{)@s>{E>E>=?E>E>=E>Yp? =>.N?F>.N?E>vd$?;> 7`]$?a=x`>p?3` 7`]$?~'x`>p?E>G\{>-"> {c>覀 {c>E>ʋ_}s>I)]<<>>}s>%>)],q>|߾%u|߾E>D^hlt;p> d6!>;pD b d AS7        !!!"""###$%%$&&%''&(('( ( )) ) ** * ++ + ,, - -- . ..///0/0101212323434555666777888989:9:;:;<;==<>>=??>  ?@ !@!AA!"A"BB"#B#CC#$C$D$%EED$%&FFE%&'GGF&'(HHG'H()H)II)*I*JJ*+J+KK+,K,LL,M,-MM-N-.NN.O./OO/P/0PP011QPQ122RQR233SRS344TST4U45UU5V56VV6W67WW7X78XX899YXY9::ZYZ:;;[Z[;<<\[<=]]\<=>^^]=>?__^>? @@_?`@A`AaaABaBbbBCbCccCDcDdDEeedDEFffeEFGggfFGHhhgGhHIhIiiIJiJjjJKjKkkKLkLllLmLMmmMnMNnnNoNOoppppqQRRrqrRSSsrsSTTtstTuTUuuUvUVvvVwVWwwWxWXxxXYYyxyYZZzyzZ[[{z{[\\|{\]}}|\]^~~}]^_~^_@``_`aaabbbcccdddedefefgfghghiiijjjkkkllllmmmnnnoppppqrrrsssttttuuuvvvwwwxxyyyzzz{{{|||}|}~}~~`                 !""!##"$$#%%$&&%&&'''(( ( )  **)   ++*   ,,+   --, - .-./.0001222323434545656767878999:::;:;<;==<=>=>>??? @ !@!A!"BBA!"#CCB"#$DDC#$%EED$E%&E&FF&'F'GG'(G(HH()H)I)*JJI)*+KKJ*+,LLK+,-MML,M-..NMN.//ON0000Q1R12RR2S23S34TTS345UUT4U566VUV677WVW788XWX8Y89YY9Z9:ZZ:[:;[;<\\[;\<==]\]=>]>^^>?^?__? _ @@Aaa`@ABbbaABCccbBCDddcCdDEdEeeEFeFffFGfGggGHgHhhHIhIiIJjjiIJKkkjJKLllkKlLMMmlmMNNnmnNOOonoOPPpopPqPQqqQrQRrrRsRSssStSTttTUUutuUVVvuvVWWwvwWXXxwxXyXYyyYzYZzzZ{Z[{{[|[\||\]|]}}]^}^~~^_~__@@``a`ababcbcdcdeeefffggghhhiiijijkjklklmmmnnnoooppppqqqrrrsssttuuuvvvwwwxxxxyyyzzz{{{||}}}~~~``ooooOOPPqqPPQQqq11PPOO////11QQPP0ANew MaterialH !^_`a0A`default  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/snow_head.3ds000066400000000000000000000522441361325167000156750ustar00rootroot00000000000000MMT ==T>= default0  @0   P0  ~ kohle@00   ;;; ;;;  ??? ???P0 moehre@00   [ [  > >P0 ?@Rsphere2AR`A6???AG>y${?C> {?Ӑ8>5昽{?&>ݽ{?B >B {?=&{?5=Ӑ8{? =C{?Z\#G{? C{?5昽Ӑ8{?ݽ&{?B B {?&ݽ{?Ӑ85昽{?C {?G&${?C ={?Ӑ85={?&={?B B >{?ݽ&>{?5昽Ӑ8>{? C>{? #[>:%? =C>{?5=Ӑ8>{?=&>{?B >B >{?&>={?Ӑ8>5={?C> ={?>p$^l?J+>5昽^l?>^l?>ɵY^l?ԋ>ԋ^l?ɵY>颾^l?>^l?5=J+^l?#þ^l?5昽J+^l?^l?ɵY颾^l?ԋԋ^l?颾ɵY^l?^l?J+5昽^l?þA 3#^l?J+5=^l?>^l?颾ɵY>^l?ԋԋ>^l?ɵY>^l?>^l?5昽J+>^l?!>^l?5=J+>^l?>>^l?ɵY>>^l?ԋ>ԋ>^l?>ɵY>^l?>>^l?J+>5=^l?9?Fj$1T??~ ?ݽ1T?Qf?ɵY1T?^>u1T?N#>N#ɾ1T?u>^1T?ɵY>Qf1T?=?~ 1T?$91T?ݽ?~ 1T?ɵYQf1T?u^1T?N#ɾN#ɾ1T?^u1T?QfɵY1T??~ ݽ1T?91T??~ =1T?QfɵY>1T?^u>1T?N#ɾN#>1T?u^>1T?ɵYQf?1T?ݽ?~ ?1T?硪Cx?ȹ?=?~ ?1T?ɵY>Qf?1T?u>^>1T?N#>N#>1T?^>u>1T?Qf?ɵY>1T??~ ?=1T?5?VG$5?1?B 5?u='?ԋ5??N#ɾ5??5?N#>5?VG$55?B 15?ԋu='5?N#ɾ5?5?N#ɾ5?u='ԋ5?1B 5?5VG5?1B >5?u='ԋ>5?N#>5??5?N#ɾ?5?ԋu='?5?B 1?5?5?5?B >1?5?ԋ>u='?5?N#>?5???5??N#>5?u='?ԋ>5?1?B >5?1T?$9?)P?&9?LD?颾9?0?^9??9?^>09?Fj$1T9?&)P9?^09?9?0^9?LD颾9?)P&9?1TX9?)P&>9?LD>9?0^>9??9?^0?9?颾LD?9?&)P?9?eǹ?:Gx?&>)P?9?>LD?9?^>0?9???9?0?^>9?LD?>9?)P?&>9? *? #K+>}?Av >zZ?>LD?Qf>u='?u='>Qf?LD>>zZ>Ӑ8>g>p$^l>Ӑ8g>zZ>QfLD>u='u='>LDQf>zZ>}Av > *ɤK+>}A>v >zZ>>LDQf?>u='u='?>QfLD?>zZ?>Ӑ8g?>C^l?>Ӑ8>g?>>zZ?>Qf?LD?>u='?u='?>LD?Qf?>zZ?>>}?A>v >Lj?%o#|Y>B?sL|Y>g?J+G>)P??~ G>1?1G>?~ ?)PG>J+>gG>C>AvG>y${G>CAvG>J+gG>?~ )PG>11G>)P?~ G>gJ+G>BsL|Y>LjA|Y>BsL>|Y>gJ+>G>)P?~ ?G>11?G>?~ )P?G>J+g?G>CAv?G>Eݥ%?^>C>Av?G>J+>g?G>?~ ?)P?G>1?1?G>)P??~ ?G>g?J+>G>B?sL>|Y>X?K"<Lj?P <^l?þ7$1T?9$5?5$9?1TRJ%>^lZ%G>{ %0$^u%G{ %þ^lZ%91TRJ%55$1T9$^lþ7$LjP <^l>P.$1T9?#55?Ti#91T?Z>#þ^l?"G{?̟!S?G>{?̟!>^l?"9?1T?Z>#5?5?Ti#1T?9?#^l?>P.$Lj?P> <{?Z\GAv?CGg?J+G)P??~ G1?1G?~ ?)PGJ+>gGC>AvGy${GCAvGJ+gG?~ )PG11G)P?~ GgJ+GAvCG{-?GAvC>GgJ+>G)P?~ ?G11?G?~ )P?GJ+g?GCAv?GAO{?GC>Av?GJ+>g?G?~ ?)P?G1?1?G)P??~ ?Gg?J+>GAv?C>G^l?أþg?Ӑ8þzZ?þLD?Qfþu='?u='þQf?LDþ>zZþӐ8>gþp$^lþӐ8gþzZþQfLDþu='u='þLDQfþzZþgӐ8þ^ltþgӐ8>þzZ>þLDQf?þu='u='?þQfLD?þzZ?þӐ8g?þC^l?þӐ8>g?þ>zZ?þQf?LD?þu='?u='?þLD?Qf?þzZ?>þg?Ӑ8>þ1T?9)P?&9LD?颾90?^9?9^>09>LD9&>)P9Fj$1T9&)P9颾LD9^0990^9LD颾9)P&91T9)P&>9LD>90^>9?9^0?9颾LD?9&)P?901T?9&>)P?9>LD?9^>0?9??90?^>9LD?>9)P?&>95?VG51?B 5u='?ԋ5?N#ɾ5?5N#>5ԋ>u='5B >15VG$55B 15ԋu='5N#ɾ55N#ɾ5u='ԋ51B 5551B >5u='ԋ>5N#>5?5N#ɾ?5ԋu='?5B 1?55?5B >1?5ԋ>u='?5N#>?5??5?N#>5u='?ԋ>51?B >59?Fj1T?~ ?ݽ1TQf?ɵY1T^>u1TN#>N#ɾ1Tu>^1TɵY>Qf1T=?~ 1T$91Tݽ?~ 1TɵYQf1Tu^1TN#ɾN#ɾ1T^u1TQfɵY1T?~ ݽ1T9" 1T?~ =1TQfɵY>1T^u>1TN#ɾN#>1Tu^>1TɵYQf?1Tݽ?~ ?1TQ9?1T=?~ ?1TɵY>Qf?1Tu>^>1TN#>N#>1T^>u>1TQf?ɵY>1T?~ ?=1T>p^lJ+>5昽^l>^l>ɵY^lԋ>ԋ^lɵY>颾^l>^l5=J+^l#þ^l5昽J+^l^lɵY颾^lԋԋ^l颾ɵY^l^lJ+5昽^lþ^lJ+5=^l>^l颾ɵY>^lԋԋ>^lɵY>^l>^l5昽J+>^l!>^l5=J+>^l>>^lɵY>>^lԋ>ԋ>^l>ɵY>^l>>^lJ+>5=^lG>y{C> {Ӑ8>5昽{&>ݽ{B >B {=&{5=Ӑ8{ =C{Z\#G{ C{5昽Ӑ8{ݽ&{B B {&ݽ{Ӑ85昽{C {G1{C ={Ӑ85={&={B B >{ݽ&>{5昽Ӑ8>{ C>{D%G>{ =C>{5=Ӑ8>{=&>{B >B >{&>={Ӑ8>5={C> ={0$?0g]`arv2&?ED'SL?dHL?N 8L?.Rv2&?RDfN>о|N>hBpʄN>h>j#09J?>j?x>j? >%j?<,'j?W>%̀X>>"tX>^, ?G^X>y>Jn#? >OwbNc?`bN?d^>L|໳@>itTξ1 ?StTξ?_\ g>f'w\)2ь4tTξRQtTξj^\v<>\8>+_4!>OS4<>|iԾK>)wԾ{>4AⱾZR4tþhԾ ZRԾŮ;Be@۸>~g?e@+>!^jŮ;)bj۸~g?e@ŮBe@Ů)bj+!^j8 4e@xo>e@G6^j%Qj A9        !!!"""###$$%%%&&&'''(((  )()  *)*  +*+  ,+, - -- . ..///0001012123234355466577688789899:::;;;<==<>>=??>  ?@ !@!AA!"A"BB"#B#CC#$C$DD$E$%EE%F%&FF&G&'GG'H'(HH())IHI)**JIJ*++KJK+,,LKL,M,-MM-N-.NN.O./OO/P/0PP011QPQ122RQR233SRS344TS45UUT456VVU567WWV6W788XW89YYX8Y9:Y:ZZ:;Z;[[;<[<\<=]]\<=>^^]=>?__^>? @@_?`@A`AaaABaBbbBCbCccCDcDddDeDEefHIIgfgIJJhghJKKihiKLLjijLkLMkkMlMNllNmNOmmOnOPnnPQQonoQRRpopRSSqpqSTTrqTUssrTUVttsUVWuutVvuWvWXvXYvYwwYZwZxxZ[x[yy[\y\z\]{{z\]^||{]^_}}|^_@``}_~`a~aabbbcccddddefggijjjjkkklllmmmnnooopppqqqrrrsrststutuvvvwvwxxxyyyzzz{z{|{|}|}`~~}~~~~                 !"!"#"#$$$%%&&%(('(  )()   *)*   +*+ ,  ,, -  - ..- //.00/01011222333455466577688799899:::;;<==<>>=>?> @@?@ !!A@B"##CBC#D#$DD$E$%EF&''GF'(HHG'H())IHI)**JIJ*++KJK+L+,LL,M,-MM-N-.N./OON./0PPO/P01P1QQ12Q2RR23R3SS34S4T45UUT456VVU567WWV6W788XWX89X9YY9:Y:ZZ:Z;[;<[<\<=]]\<=>^^]=>?__^>_?@@`_`@AAa`aABBba        eEfEFffFgFGggGHHhghHIIihiIJJjijJKKkjkKlKLllLmLMmmMnMNnnNoNOooOPoPppPQpQqqQRqRrrRSrSssSTsTtTUuutTUVvvuUVWwwvVwWXwXxxXYxYyyYZyZzzZ;z;[{[\{\|\]}}|\]^~~}]^_~^_```aaabbbccccdddeeefffgghhhiiijjjkkkklllmmmnnnoopppqqqrrrssstttutuvuvwvwxxxyyyzzz[[{{|||}|}~}~~{{gghhhhiieeEFFEFFGGGHfHfffee !   !!''&&&''ABAAA!!!""BBFFEEE%%&&&FFbcbbbBBBCCcc  d dc  c cC CDD   Ddd   eedddDDEEEee 0Adefaultp  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmrstuvwxyz{|}~     "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./23456789:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqtuvwxy|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0Akohle01<=rsz{     0A[moehre&nopq !TUVWPA~s3d-0.2.2.1/objs/sphere.3ds000066400000000000000000000112621361325167000152070ustar00rootroot00000000000000MM ==>= default0  @0   P0   ?@sphere1A`A6???A`r>p$^l?>^l?ԋ>ԋ^l?>^l?#þ^l?^l?ԋԋ^l?^l?þA 3#^l?>^l?ԋԋ>^l?>^l?!>^l?>>^l?ԋ>ԋ>^l?>>^l?5?VG$5?u='?ԋ5??5?ԋ>u='5?VG$55?ԋu='5?5?u='ԋ5?5VG5?u='ԋ>5??5?ԋu='?5?5?5?ԋ>u='?5???5?u='?ԋ>5?^l?#>zZ?>u='?u='>>zZ>p$^l>zZ>u='u='>zZ>^lΤ>zZ>>u='u='?>zZ?>C^l?>>zZ?>u='?u='?>zZ?>>?һ 0$^l?þ7$5?5$>^lZ%0$0 %þ^lZ%55$^lþ7$0 0$^l>P.$55?Ti#þ^l?"S?>^l?"5?5?Ti#^l?>P.$^l?أþzZ?þu='?u='þ>zZþp$^lþzZþu='u='þzZþ^ltþzZ>þu='u='?þzZ?þC^l?þ>zZ?þu='?u='?þzZ?>þ5?VG5u='?ԋ5?5ԋ>u='5VG$55ԋu='55u='ԋ555u='ԋ>5?5ԋu='?55?5ԋ>u='?5??5u='?ԋ>5>p^l>^lԋ>ԋ^l>^l#þ^l^lԋԋ^l^lþ^l>^lԋԋ>^l>^l!>^l>>^lԋ>ԋ>^l>>^l0$?0 A^ pppppppp p p p p p pppq`aqabqbcqcdqdeqefqfgqghqhiqijqjkqklqlmqmnoqno`q             !!!""###$#$%$%&%&'''((()()*)++*,,+--,--.//.  / !110 !"221!"#332"3#$$434$%%545%&&65&'776&7'((878())98)*::9)*+;;:*+,<<;+,-==<,-.>>=-./??>./ 00?/@01@1A12BBA1B233CBC344DCD4E45E56FFE5F677GF78HHG7H8I89II9::JI:;KKJ:;<LLK;<=MML<M=>>NM>?OON>?0@@O?P@APAQABRRQARBCCSRSCDDTSTDUDEUUEVEFVVFGGWVWGHHXWXHYHIYYIZIJZZJKZK[[KL[L\\LM\M]MN^^]M^NO^O__O@_@P`PQ`QaQRbbaQbRSScbcSTTdcdTeTUeeUfUVffVWWgfgWXXhghXiXYiiYjYZjjZ[j[kk[\k\ll\]l]m]^nnm]n^_n_oo_PoP`0Adefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAs3d-0.2.2.1/objs/spikeybla.3ds000066400000000000000000000131571361325167000157110ustar00rootroot00000000000000MMo ==_>= New Material0  @0>  b bP0  default0  @0   P0   ?@@dodecahedrA/`A6???APpZSe2;=gu:)> 3P )>$ >3 >>Eg> >( >Eg>| >>c >k^> =k^> ك(e@O=(e@~pZZ>=t\>l"7\Fa>"7{=ea>"7\F[a"7{=aWz;lI>lI˛=Z=?L 虽Z=?L0=#Jzlj=b+?>$XA =E#JϞXT:E#Jzlj==b+?>[Q=XA =CE>#JϞ1=XTE>B>=AZ=&@>z=KO=qHB>RAz=GB>==Z=&@>=z=KO=G>B>R=z={H>\r>p=7ex@p=7W

|-񱻐t>-\SdPJ>$p=70=ϻc.P0=ϻ7P>\H>eóQO=DP@KóQy\:PJ>֐=p=7\H>1w=DP@K>yrDhd4#+ɺXè )E M!|'>2>}4O>Y==]=y W= >8'e=b= ?fO>1_=?VY>!3>?d=>?^ ;:!}=]=?*w7>;L>>>FK >L;?T>y ?S=y?2j=yrDʆ>#>+?sX> ?)=E ?Ȏ=ϒ}m =,^p/ثb+;yz;V䀾tPV?>>6om>- >0q!E>p >Dz E>c>v2E>>z?d,>OV>{q?z>>1n?$F>f>u?iy&^>p;n>sni3>u?_||l>Ul?>>n?>Mx?T>s?"U>anϒj?>=,m?ܫ>b+8!w?DV>䀾Or?V>䣂7.Iw ^LeؖM rU;,LpaP,i>#k>ĂJnJ>0=L>=dU a>jG>TQ5>=oU?x>=L?[j>n>;;J?޽>I>Q?IuU{4=FLt"q=qJs~r>#Q< 5&O>jG?v>uHJ?,w>tVS?s )>C[O?*>RQ䣂4F?x> \mI?ݖ>M R?8E,>LpaN?,> A22222"22,"22 2 ,WXYYVW333'333'3344&444+ 4 4- 4 +4& 4 -5# 5 &5%5#[\]]Z[5'155&5'6(6*6+  (66, 6 +606,^_a_`a77/777%77$7%7/7$8 8 .8888888. 8 999  999919991:::::.  :cdeebc::!;#;$ghiifg;(  -;;);(;$;)<< klmmjk<)/<<*<)< <*= = != ==0 =="0==!="?>?3@??3A@AAA>CB%C%51DC1C5ED1E1E%E%BGF0G06*HG*G6IH*I*I0I0FKJ.K.:!LK!K:ML!M! M .M.JON#O#;-PO-O;QP-Q- Q #Q#NSRS</TS/S<UT/U/UURon>o>?o?@o@pqp@q@AqA>q>nsrBsBCsCDsDtutDuDEuEBuBrwvFwFGwGHwHxyxHyHIyIFyFv{zJ{JK{KL{L|}|L}LM}MJ}Jz~NNOOPPPPQQNN~RRSSTTTTUURR|d{dc{pXoXWou]\u\tw_^^vwlkl\[sst\gff~}ed}d|VYqqnVihhs[ZsZrfi~fya``xyrZuZ]ujjmbe}}zbmlloWVVnokjj{cbbz{hhg`_wwx`qYXqXpv^y^ay0A-New Material "#01VW\]fg0Adefault  !$%&'()*+,-./23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUXYZ[^_`abcdehijklmnopqrstuvwxyz{|}~PA&s3d-0.2.2.1/objs/star.3ds000066400000000000000000000055551361325167000147020ustar00rootroot00000000000000MMm  ==] >= default0  @0   P0   ?@ dodecahedrA `A6???APgb'4$g>b'4$I I ?I I I I I I ?I ?I I I ?I ?I ?I I ?I I I ?I ?I ?I ?I I ?b?J#g>b?xgbJ#g>bxggb?柤g>b?柤HPgb?HPg>b?HPgbHPg>bHP;?HP;?HP;?HP;?HP;?<;<;<;<;<;;@;@;@;@;@?iz ;?iz ;?iz ;?iz ;?iz ;? %;@? %;@? %;@? %;@? %;@2;@2;@2;@2;@2;@;?;?;?;?;?iz ;iz ;iz ;iz ;iz ;;=_$;=_$;=_$;=_$;=_$;@?;@?;@?;@?;@?*;@?*;@?*;@?*;@?*;@? %;@ %;@ %;@ %;@ %;@ Ax          !  "! "" " $#$%$$%  &%& '&'##)((*) ) +*  +,++ ,((.--././0/010--132 2 3 43454565 2268778989  :9: ;:77;=<  =>== >?>?@?@< <BA  BB CBDCDEDD AAEGFGHGGHIHIJIJFFLKLLMLNM NONN KKO0Adefaultx  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwPAs3d-0.2.2.1/objs/weirdball.3ds000066400000000000000000001561251361325167000156760ustar00rootroot00000000000000MMU ==E>= New Material@00     !3 !3P0 ?@sphere12A`A6???A=$>ɺ-lj?l>-lj?E>kc-lj?Ə>y-lj?ɺ-lj?l-lj?kcE-lj?yƏ-lj?:-lj?l>-lj?Ekc>-lj?Əy>-lj?:>-lj?>l>-lj?kc>E>-lj?y>Ə>-lj?1?a:}3?H$?䈾}3?5>d+}3?>$}3?a:1}3?䈾H$}3?d+5}3?$}3?1a}3?H$>}3?5d+>}3?$?}3?a1?}3?>H$?}3?d+>5>}3?$?>}3? h? LF>CV?F>H$?$F> W>8VF> L hF>CVF>$H$F>8V WF> h L:F>CV>F>H$$?F> W8V?F> L: h?F>>CV?F>$?H$?F>8V? W>F>{?r'$i$ h?h"$1?1-$> h % ${% h %11-$ hh"${Uu i$ h>iC$11? # h?5(6#hS{?Hs"> h?5(6#1?1? # h?>iC$ h? L:F¾8V? WF¾$?H$F¾>CVF¾ L: hF¾ W8VF¾H$$F¾CVF¾ h LF¾8V W>F¾$H$?F¾CV?F¾ L h?F¾ W>8V?F¾H$?$?F¾CV?>F¾1?a}3$?}3d+>5}3>H$}3a1}3$}35d+}3H$䈾}31a:}3$>}3d+5>}3䈾H$?}3a:1?}3>$?}35>d+>}3H$?>}3>:-ljy>Ə-ljkc>E-lj>l-lj:-ljƏy-ljEkc-ljl-ljɺ-ljyƏ>-ljkcE>-ljl>-ljɺ>-ljƏ>y>-ljE>kc>-ljl>>-ljqNJ$?rk>ɺ-lj?l>-lj?E>kc-lj?Ə>y-lj?ɺ-lj?l-lj?kcE-lj?yƏ-lj?:-lj?l>-lj?Ekc>-lj?Əy>-lj?:>-lj?>l>-lj?kc>E>-lj?y>Ə>-lj?1?a:}3?H$?䈾}3?5>d+}3?>$}3?a:1}3?䈾H$}3?d+5}3?$}3?1a}3?H$>}3?5d+>}3?$?}3?a1?}3?>H$?}3?d+>5>}3?$?>}3? h? LF>CV?F>H$?$F> W>8VF> L hF>CVF>$H$F>8V WF> h L:F>CV>F>H$$?F> W8V?F> L: h?F>>CV?F>$?H$?F>8V? W>F>{?$$ h?h"$1?1*$> h %X${% h %11*$ hh"${$ h>iC$11?p# h?5(6#V{?@"> h?5(6#1?1?p# h?>iC$ h? L:F¾8V? WF¾$?H$F¾>CVF¾ L: hF¾ W8VF¾H$$F¾CVF¾ h LF¾8V W>F¾$H$?F¾CV?F¾ L h?F¾ W>8V?F¾H$?$?F¾CV?>F¾1?a}3$?}3d+>5}3>H$}3a1}3$}35d+}3H$䈾}31a:}3$>}3d+5>}3䈾H$?}3a:1?}3>$?}35>d+>}3H$?>}3>:-ljy>Ə-ljkc>E-lj>l-lj:-ljƏy-ljEkc-ljl-ljɺ-ljyƏ>-ljkcE>-ljl>-ljɺ>-ljƏ>y>-ljE>kc>-ljl>>-ljqNJ$?Us>Kڥe?/Ŭ>v=#n?v* ?ռ)P?Q>GC#n?3?:)P?=>qu?'l>e?>*̾)P?+>Z qu?v=/Ŭ#n?'l>0)P?v= Fqu?Kڥsоe?ռv* )P?G#n?3:>)P?==qu?'l>e?*>)P?+Z >qu?v/Ŭ>#n?'l0>)P?v F>qu?Kڥ=s>e?qu?C>w>#n?:>3?)P?==>qu?>'l>e?*>>)P?Z >+>qu?0>'l>)P? F>v=qu?$$?;?k4?>F*?N?d=?~ ?F?*̾F*?7;??~ ?>i' ;?F?i' ?~ ?>k4F*?Wϋ>}B?~ ?$$;?d=N?~ ?*̾FF*?7;?~ ?i' ;?i' F?~ ?k4F*?}BWϋ?~ ?$$>;?Nd?~ ?F*>F*?7;>?~ ?i' ?;?Fi' ??~ ?k4?F*?Wϋ}B??~ ?>$$?;?dN??~ ?*>F?F*?>7;??~ ?i' ?>;?i' ?F??~ ?}B?Wϋ>?~ ?e?763q>\?ϵ/>o>s?z<C>7;?0o>e?ꤾC>3?}B3q>$$?k4C>ϵ/>\o>s>\C>76e3q>z07;o>ꤾeC>}B33q>k4$$C>\ϵ/o>\sоC>e76>3q>sz<=C>7;0>o>e>C>3}B?3q>$$k4?C>ϵ/\?o>sо\?C>76>e?3q>z<=s?C>0>7;?o>>e?C>}B?3?3q>k4?$$?C>\?s>C>s?BC=s?B>Cs?z<=CN?v* C\?sоCv* ?NC=k4?$$CB>sC>eCBsC=z<=sCv* NCsо\CNv* C=$$k4CsBCeꤾCsB>C=sz<CNv* ?C\s>Cv* N?C=k4$$?CBs?Cꤾe?CB>s?C=z\?CN?v* ?C=$$?k4?Ce?>C\?ϵ/oؾe?76>3qN?d?~ }B?33q}B?Wϋ?~ 0>7;oؾi' ?F?~ 76>e3q>7;?~ ϵ/\oؾdN?~ 3}B3qWϋ}B?~ 7;0oؾFi' ?~ e763q7;?~ \ϵ/>oؾNd=?~ }B3?3q}BWϋ>?~ 07;?oؾi' F??~ 76e?3q7;??~ ϵ/>\?oؾd=N??~ 3?}B?3qWϋ>}B??~ 7;?0>oؾF?i' ??~ 7;?>?~ k4?F*$$?>;v* ?<)Pi' ?;0>'l)P*>FF**>)P>$$;:>3)Pk4F*F*v* ռ)Pi' >;0'l>)P*̾F?F**̾>)P$$?;:3?)P>k4?F*ռv* ?)P>i' ?;'l>0>)PF?*>F*>*>)P3?:>)P/Ŭ>v#ns>Kڥ=eQ>Gqu>'le F>vquC>w#nZ >+quKڥ=sоe==quv/Ŭ#nGQqu'lev FquwC#n+Z qusоKڥe=qu/Ŭv=#nQGe Fv=quCw>#nZ +>quKڥs>e=>quv=/Ŭ>#nGqu'l>>ev= F>quw>C>#n+>Z >qu=>=qus>Kڥe?/Ŭ>v=#n?v* ?ռ)P?Q>GC#n?3?:)P?=>qu?'l>e?>*̾)P?+>Z qu?v=/Ŭ#n?'l>0)P?v= Fqu?Kڥsоe?ռv* )P?G#n?3:>)P?==qu?'l>e?*>)P?+Z >qu?v/Ŭ>#n?'l0>)P?v F>qu?Kڥ=s>e?qu?C>w>#n?:>3?)P?==>qu?>'l>e?*>>)P?Z >+>qu?0>'l>)P? F>v=qu?$$?;?k4?>F*?N?d=?~ ?F?*̾F*?7;??~ ?>i' ;?F?i' ?~ ?>k4F*?Wϋ>}B?~ ?$$;?d=N?~ ?*̾FF*?7;?~ ?i' ;?i' F?~ ?k4F*?}BWϋ?~ ?$$>;?Nd?~ ?F*>F*?7;>?~ ?i' ?;?Fi' ??~ ?k4?F*?Wϋ}B??~ ?>$$?;?dN??~ ?*>F?F*?>7;??~ ?i' ?>;?i' ?F??~ ?}B?Wϋ>?~ ?e?763q>\?ϵ/>o>s?z<C>7;?0o>e?ꤾC>3?}B3q>$$?k4C>ϵ/>\o>s>\C>76e3q>z07;o>ꤾeC>}B33q>k4$$C>\ϵ/o>\sоC>e76>3q>sz<=C>7;0>o>e>C>3}B?3q>$$k4?C>ϵ/\?o>sо\?C>76>e?3q>z<=s?C>0>7;?o>>e?C>}B?3?3q>k4?$$?C>\?s>C>s?BC=s?B>Cs?z<=CN?v* C\?sоCv* ?NC=k4?$$CB>sC>eCBsC=z<=sCv* NCsо\CNv* C=$$k4CsBCeꤾCsB>C=sz<CNv* ?C\s>Cv* N?C=k4$$?CBs?Cꤾe?CB>s?C=z\?CN?v* ?C=$$?k4?Ce?>C\?ϵ/oؾe?76>3qN?d?~ }B?33q}B?Wϋ?~ 0>7;oؾi' ?F?~ 76>e3q>7;?~ ϵ/\oؾdN?~ 3}B3qWϋ}B?~ 7;0oؾFi' ?~ e763q7;?~ \ϵ/>oؾNd=?~ }B3?3q}BWϋ>?~ 07;?oؾi' F??~ 76e?3q7;??~ ϵ/>\?oؾd=N??~ 3?}B?3qWϋ>}B??~ 7;?0>oؾF?i' ??~ 7;?>?~ k4?F*$$?>;v* ?<)Pi' ?;0>'l)P*>FF**>)P>$$;:>3)Pk4F*F*v* ռ)Pi' >;0'l>)P*̾F?F**̾>)P$$?;:3?)P>k4?F*ռv* ?)P>i' ?;'l>0>)PF?*>F*>*>)P3?:>)P/Ŭ>v#ns>Kڥ=eQ>Gqu>'le F>vquC>w#nZ >+quKڥ=sоe==quv/Ŭ#nGQqu'lev FquwC#n+Z qusоKڥe=qu/Ŭv=#nQGe Fv=quCw>#nZ +>quKڥs>e=>quv=/Ŭ>#nGqu'l>>ev= F>quw>C>#n+>Z >qu=>=quz= {?>n?A>&n?U=dȟ {?b>}n?>1n?z {?n?&ཙAn?dȟU {?}bn?1n?z< {?n?1>n?<z= {?<>n?&=A>n?dȟ=U= {?}>b>n?1>>n?}>bn1>ndȟ=U {<n&=An<z {b}n1nUdȟ {nA&nz {}b>n1>ndȟU= {>n&ཙA>nz= {b>}>n>1>nU=dȟ= {z=< {>&=n}>AHe?>}5e?g?AH;? >;?<+־e?>ʾe?b>_;?ԋ =V(;?AH}e?}5¾e?AHg;? ;?+־e?ʾe?_b;?V(ԋ ;?}AH>e?¾}5>e?gAH>;? >;?+>e?>e?b_?;?ԋ V(?;?AH>}>e?}5>>e?AH>g?;?> >;?V(?ԋ =;?+>>e?_?b>;?_/?}F*?;:?ԋ F*?tSc?5o>YV?1o>}>g(F*? >] F*?g?g(o>>8Mo>}_/F*?ԋ ;:F*?5tSco>1YVo>g(}F*?] F*?g(go>8M¾o>_/}>F*?;:ԋ =F*?tSc5=o>YV1>o>}g(?F*? ] ?F*?gg(?o>¾8M?o>}>_/?F*?ԋ =;:?F*?5=tSc?o>1>YV?o>g(?}>F*?] ? >F*?g(?g?o>8M?>o>_/?_3q>YV?ʾ3q>tSc?+־C=;:?V(C=5=ֲl3q>A>_3q>>ֲlC=C= {C=__/3q>ʾYV3q>+־tScC=V(;:C=ֲl53q>_A3q>ֲlC= {CC=_/_?3q>YV>3q>tSc+>C=;:V(?C=5ֲl?3q>A_?3q>ֲl?C=C {?C=_?_/?3q>>YV?3q>+>tSc?C=V(?;:?C= {?C=C=ֲl?5=3q>_?A>3q>ֲl?>C=ֲl?C {?CCֲl?53q_?A3q+>tScCV(?;:C_?_/3q>YV3qֲlCC {C5ֲl3qA_3qtSc+־C;:V(C_/_3qYVʾ3qֲl>C {C=Cֲl5=3q_A>3q+־tSc?CV(;:?C__/?3qʾYV?3q>ֲl?CC= {?C5=ֲl?3qA>_?3qtSc?+>C;:?V(?C_/?_?3qYV?>3qg(?goؾ8M?¾oؾg(?}F*] ? F*5=tScoؾ1>YVoؾ}>_/F*ԋ =;:F*gg(oؾ¾8Moؾ}g(F* ] F*g(g?oؾ8M>oؾg(}>F*] >F*5tSc?oؾ1YV?oؾ}_/?F*ԋ ;:?F*g?g(?oؾ>8M?oؾ}>g(?F* >] ?F*;:?ԋ =F*tSc?5=oؾYV?1>oؾ_/?}>F*_?b;V(?ԋ ;+>e>eAH>g;> ;AH>}e}5>¾eb_;ԋ V(;+־eʾegAH; ;}AHe¾}5e_b>;V(ԋ =;+־eAHg?; >;AH}>e}5>eb>_?;ԋ =V(?;<+>e>>eg?AH>; >>;}>AH>e>}5>etSc5oؾYV1oؾ_/}F*;:ԋ F*/ U>Y?s?G=[M{?s?Y/ U?s?[M{G?s?/ UY>?s?G[M{>?s?Y>/ U>?s?[M{>G=?s?[M{>G?sY>/ U?sG[M{?s/ UY?s[M{G=?sY/ U>?sG=[M{>?s/ U>Y>?s/?ս)P?>)P?ս/)P?㾭)P?/=)P?>)P?=/?)P?>>)P?Y?*??~ ?d>H?~ ?Y?*?~ ?Hd?~ ?Y?*>?~ ?dH??~ ?>Y?*??~ ?H?d>?~ ?Nl?z<C>/?HC>zH/C>Nlz<>C>/H?C>z<>Nl?C>H?/?C>H?/Cz<>NlC/HCNlz<CH/?CzCH?d?~ >Y?*?~ dH?~ Y?*?~ Hd>?~ Y?*??~ d>H??~ Y?*?>?~ >)P=/)P)P/ս)P㾭>)Pս/?)P>>)P/?=)P/ U>Y?s?G=[M{?s?Y/ U?s?[M{G?s?/ UY>?s?G[M{>?s?Y>/ U>?s?[M{>G=?s?[M{>G?sY>/ U?sG[M{?s/ UY?s[M{G=?sY/ U>?sG=[M{>?s/ U>Y>?s/?ս)P?>)P?ս/)P?㾭)P?/=)P?>)P?=/?)P?>>)P?Y?*??~ ?d>H?~ ?Y?*?~ ?Hd?~ ?Y?*>?~ ?dH??~ ?>Y?*??~ ?H?d>?~ ?Nl?z<C>/?HC>zH/C>Nlz<>C>/H?C>z<>Nl?C>H?/?C>H?/Cz<>NlC/HCNlz<CH/?CzCH?d?~ >Y?*?~ dH?~ Y?*?~ Hd>?~ Y?*??~ d>H??~ Y?*?>?~ >)P=/)P)P/ս)P㾭>)Pս/?)P>>)P/?=)PC>ZЇ$Av?z>^l?5>Av?ԋ >ԋ Av?U>dȟ^l?=5Av?X#CAv?z^l?5Av?ԋ ԋ Av?dȟU^l?5Av?CH#$Av?z=^l?5=Av?ԋ ԋ >Av?Udȟ>^l?5>Av?!"C>Av?=z>^l?=5>Av?ԋ >ԋ >Av?dȟ>U>^l?5>=Av?dȟ>U^l5>Avԋ >ԋ Av=z^l=5AvX#CAvUdȟ^l5Avԋ ԋ Avz^l5AvCؽAvdȟU>^l5=Avԋ ԋ >Avz>^l5>Av!"C>AvU>dȟ>^l=5>Avԋ >ԋ >AvC>ZЇAvz>=^l5>=Avdȟ>U^l??U)P??Ež5?E>Ež)P?=z^l?U>)P?ԋ >4!.5?a$?~ )P?Udȟ^l?U)P?Ež5?EžEž)P?z^l?U)P?4!.ԋ 5??~ 蚣)P?dȟU>^l?U>)P?E>5?EžE>)P?z>^l?U?)P?ԋ 4!.?5??~ ?)P?U>dȟ>^l?U>?)P?E>?5?E>E>)P??~ ?_Ff$)P?z>=^l??U>)P?4!.?ԋ >5?4!.?ԋ 5?)P?a$?~ ?c?5>@?dȟ?~ ?E>5???~ ??@>dȟ>@?~ ?ԋ 4!.5?_Ff$)P?~ ?5c>dȟ@?~ ?Ež5??~ ?@>@dȟ?~ ?4!.ԋ >5?)PW?~ ?c5>>@dȟ>?~ ?Ež?5???~ ?@?>dȟ@??~ ?ԋ >4!.?5?Ǵ,)P??~ ?5>c?>dȟ>@??~ ??E>5????~ ?@??>@?dȟ>?~ ?@?>c?zC>)P??~ $4!.?4!.C>5>c>z>cC>C>Av- %ZЇ$AvC>@>zcC>?~ )P)%4!.4!.C>c5>czC>AvC3$AvٜC>@?>cz>C>)P?~ ?$4!.4!.?C>5c?>zc?C>CAv?+"KAv?C>?@?>z>c?C>?~ ?)P?fP#4!.?4!.?C>Av?X#C>c?5>>c?z>C>Av?C>JXd$Av?C3$Av?XCc?5þc?zC?~ ?)P)%4!.?4!.C?@þz>cCCAv- %ZЇ$AvC5cþzcC)P?~ $4!.4!.C@þczCAvC>JXd$AvGRCc5>þcz>C?~ )P?fP#4!.4!.?C@?þzc?CC>Av?+"KAv?C5>c?þz>c?C)P??~ ?$4!.?4!.?C@??þc?z>C@?þ@?dȟ?~ ?Ež5??~ 5>cþdȟ>@?~ ԋ >4!.5_Ff$)P?~ @þdȟ@?~ Ež5?~ @?þ@dȟ>?~ E>5??~ 5c?þdȟ@??~ ԋ 4!.?5Ǵ,)P??~ ?@?þdȟ>@??~ E>?5???~ )P?a?~ c?5>þ@?dȟ>?~ 4!.?ԋ >54!.?ԋ 5?~ ?_Ff)Pz>^l?U)PE>5E>Ež)PU>dȟ^lU>)Pԋ 4!.5a$?~ )Pz^lU)PEž5EžEž)PdȟU^lU)P4!.ԋ >5?~ H)Pz=^lU>)PEž?5EžE>)PUdȟ>^lU?)Pԋ >4!.?5?~ ?)P=z>^lU>?)P?E>5E>E>)Pdȟ>U>^l?U>)Pc5þ@dȟ?~ 4!.ԋ 5)P?~ A@ pppp  p       p   p   pqaa``qccbbqeeddqggffqiihhqkkjjqmmlloonnq!!!!%%%% ))))  - -  --          111177!"77;#;;$; ? ?%"?"&?""  C'$$C&C&(C#&#&#$#$(G(G)*G**G*'*'(''(K,K+,K.K.,+..++,+,0O0O-2.OO22/2/0/0/535/355 33T6T068T81T8484!646 4Y:Y2:<Y<3Y<9<9#9:9:">]>]4@]@5]=@=%@>$==>aBa6BDaD7aDADA'ABAB&eFe8FHeH9eEHE)HF(EEFiJi:JLiL;iLILI+IJIJ*mNm<NPmP=mPMPM-NMN,MqRq>RSqS?qSQSQ/QRQR.wXwAXZwZBwW2ZZWX1WWX{\{C\^{^D{[^[4^\3[[\`E`bbF_6bb_`5__`dGdffHc8ffcd7ccdhIhjjJg:jjgh9gghlKlnLnk<nnkl;kklpMprrNo>rrop=oopusuOsV@uuVU0VVUs?UUsvPvxxQtAxxtvtv@tzzR||S|y|yCzByyzT~~U}}E}~}~DVWGFXYIHZ[KJ\]ML^_ONabRQcdTSefVUghXWijZYkl\[mn^]o`P_ttssvvuuxxwwzzyy||{{~~}}rrrs    tu    vwxyz{   |}    ~  !! !!  '   '' '     ++ ++          ////33337777;;;;?""?? ?   ""%%#%#%##D(D(&D&D$&$&$($(I,I,*I*I*)*)),),M0M0.M.M-..--0-0Q4Q42Q2Q21211414U8U8U6U656658585Y<Y<:Y:Y:9:99<9<]@]@>]>]=>=>=@=@aCaCBaBaBABAACACgJgJHgHgGHHGJGGJkNkNLkLkKLLKNKKNoRoRPoPoOPPOROORsVsVTsTsSTTSVSVS wZwZ XwXwWXX WZWW Z{^^!{!\{\{[\\![^[[!^"bb"``_``"_b__"beFF#e#ceceEcc#EE#FEFh$h$ff$dfdfhdd$h%ll%jjijj%ii%lilp&pn&nn&mnm&pmpm'tt'rrqrr'qq'tqtx(xv(vv(uvu(xuxu||))zz)yzyzy)|y|**~~*}~}~}}*++++,,,,----....////000011112222333344p44r5r5r55555s5ss666p677p7t78t8t88888uu89u99p9::p::v;vv;;;;;;w;ww<<<p<==p==x>xx>>>>>>yy>?y??p?@@p@@zAzzAAAA A A{A{B{B BpBCCpC C|D||DD D D  DD}D}E}E pEEFF  p F  F~G~G~G  G G G GGHH HpHIIpIIJJJJJJJJKKpKKLLLbbLLaLaLLMMaMqMNNqbNNOOOdOdOcOcOOPcPPqPQQqQdQRRRffRReeRRRSSeqSSTTqfTTUUUhUhUgUgUUVVgVqVWWqWhWXXXjXjXiiXXXYYiqYYZZqZjZ[[[l[l[k[k[[\\k\q\]]q]l]^^^n^n^m^m^^__m_q_``q`n`aaqa`abbb`b`bobobbcoccqcdtdtdddddsdseseeeffffffffggggthvhvhhhhhuhuiuiiijj jjjjj jkkkkvlxlxlllllwlwwmmmmnnnnnnnnooooxpzpzpppppypyqyqqqrrr#rrr#rrsssszt|t|t t t t t{t{{u uuuvvv'vvv'vvww w|wx~x~x x x  x x}x} y  } y  y  y  z zz+z z +zzz {   {    {  {~| || | |  | || }  }     } }~~~/~~~/~~    rrr $$44 44!$$!    "  ))99"99#))  #    $--==$==%--  %   ! !!!!!"!!""""&"""1"1""A"A&A#A#'#1#1###$#$' $ $  $%$%%%%%%&%&&&&&(&&5&5&&E&E(E'E')'5'5''('()'($($$$()()))))*))********9*9**I*I*I+I+++9+9+++,+,+(,,(((,-,------.-.....,...=.=M.M,.M/M/-/=/= / //0/0-0,0,, , 0!1011!11"1"2121222.2"2"2A2A22Q2Q.Q3Q3/3A3A#3#33333/0330#00#'4'44747"575!7'5'5(5(55858!68618(6(6G6G66W6W1W7W727G7G7*7*:7:274"::4*44*8+8+;8;$8;9;9#9+9+9,,9<#99<:<:3<,:,:K:K::[:[3;[;4[K;K;;.;.>;>4;>8>8$8.8./</<<?<?&=%??=/==/0=0==@=@%>@>5@0>0>O>O>>_>_5_?_?6?O?O?2?2B?B6?<&BB<2<<2@3@3C@C(@CACA'A3A3A44AD'AADBDB7D4B4BSBSBBcBc7CcC8cSCSCC6C6FCF8CF@F@(@6@67D7DDGDG*E)GGE7EE78E8EEHEH)FHF9H8F8FWFWFFgFg9gGgG:GWGWG:G:JGJ:GD*JJD:DD:H;;HK,HHKIKI+K;I;II<<IL+IILJLJ;L<J<J[J[JJkJk;K<kkK[KK[K>K>NKN<KNHNH,H>H>?L?LLOLO.MOM-O?M?M@M@MMPMP-NPN=P@N@N_N_NNoNo=oOoO>O_O_OBOBROR>OL.RRLBLLBP&P&6P60P6Q6Q Q&Q&Q%%Q5 QQ5R5R/5%R%RRCCRS/RRSSSS?SCSCSESESSUSU?P0UUPEPPEDTDTTTTT1UTU0TDUDUFUFUUVUV0VVVV@VFVFVdVdtVt@VtWtWAWdWdWHWHXWXAWXTXT1THTHIXIXXYXY3YYYY2YIYIJYJYYZYZ2ZZZBZJZJZiZiZZyZyB[y[Cyi[i[L[L[[\[\C\X\X3XLXLM\M\\]\]5]4]]]M]]MN]N]]^]^4^^^^D^N^N^mm^}D^^}_}_E}m_m__P_P`_`E_`\`\5\P\PQ`Q``a`a7aaaa6aQaQRaRaabab6bbbFbRbRbqbqbbbFccGqcqcTcTccdcdGd`d`7`T`TUdUddede9e8eeeUeeUVeVeefef8ffffHfVfVfuufHffggIuguggXgXhghIghdhd9dXdXYhYhhihi;iiii:iYiYZiZiijij:jjjJjZjZjyjyjjjJkKkykky\k\kklklKlhlh;h\h\]l]llmlm=mmm<m]m]m^m^mmnmn<nnnnLn^n^n}n}nLnooMo}o}o`o`popMoplpl=l`l`apappqpq?qqqq>qaqabqbqqrqr>rrrNrbrbrrrrrNsOssscscsssssOspsp?pcpcgtgttwtwBwuwuAugughuhuuxuxAvxvQxhvhvvQQvwRRwwjwjzwzRwztztBtjtjxkxk{x{Dx{y{yCykyklylyy|y|C|z|zSzlzlzSSz{TT{n{n{{~{~T~x~xDxnxno|o|||F}}E}o}op}p}}}E~U~p~~p~UU~VVrrV||F|r|rwwJIwwxxIYxxYYZZzzZJzz{{LK{{||K[||[[\\~~\L~~NMM]]]^^^NffvvPvv@ffeeuu@uuOeeO___PPQQPPP```aaaQSSRRRbbbcccSUUTT  T d    d d e e    e U    W W V V    Vf  ffgggWYYXXXhhhiiiY[[ZZZjjjkkk[]]\\\lllmmm]__^^^nnnooo_ ss H G sst!t!G!W!tt"""W"W"X"X""v#v#X#H#vv0ANew Material@   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? PA-s3d-0.2.2.1/objs/wtf.3ds000066400000000000000000033752621361325167000145410ustar00rootroot00000000000000MM  == >= default0  @0   P0   ?@ sphere1A `A6???A`1rY2tR tR/LtR8DgtR~ݽ2tRDgtRF1LtRE tRkL2tREFtRF1ᾆtR@׾tR~ݽ4ԾtR8@׾tR/ᾆtRFtRA~=2X烾I=LX烾H< j X烾/~)X烾~ݽV(-X烾F1~)X烾*i j X烾yLX烾'F2X烾yX烾*ižX烾F1精X烾~ݽHX烾/精H<žX烾I=X烾=2ӫ=DgӫI=~)ӫ+6ӫ~ݽ~:ӫE+6ӫy~)ӫKDgӫ<2ӫK@׾ӫy精ӫEBӫ~ݽӫBӫI=精ӫ=@׾ӫ>2ھ=2ھA~=V(-ھ~:ھ~ݽ-?ھkL~:ھ'FV(-ھ<2ھJQ2ھ<󨾎4Ծھ'FHھkLھ~ݽ<ھھA~=Hھ=4Ծھ=2=DgI=~)+6~ݽ~:E+6y~)KDg<2K@׾y精EB~ݽBI=精=@׾A~=2I=LH< j /~)~ݽV(-F1~)*i j yL'F2y*ižF1精~ݽH/精H<žI=2~N& ~N&/L~N&8Dg~N&~ݽ2~N&Dg~N&F1L~N&E ~N&kL2~N&EF~N&F1~N&@׾~N&~ݽ4Ծ~N&8@׾~N&/~N&F~N&~ݽ2j?~ݽ2*~ݽHp?F1精p?@׾g}?~ݽ4Ծg}?/精wo?~ݽHp?~ݽ4Ծg}?8@׾g}?~ݽO\?EBO\?F1精p?~ݽHp?BO\?~ݽO\?~ݽHp?/精wo?~ݽ/\ X?F1ڠ X?_2de?~ݽde?/ڠ?uW?~ݽ/\ X?~ݽde?8_2de?~ݽ>]D?ED?F1ڠ X?~ݽ/\ X?D?~ݽ>]D?~ݽ/\ X?/ڠ?uW?L+sZL)Ǝ(BLѽ{5 N'%U^M8_Q (b>v\z 67[z #iP㾢&Xؾ^*˽վN'yC\ؾ5>#N(BCbL'=v\*?n-=*?<9!n5澼*"3e. .X+4yF("Rh9;艽s?Qk(f 澇QkBɾ;艽cRMkH4۶Uy["d=:Ǿ"|4=nn5Ĥ>?E U >QnE Y= ,#<8ʽ_.6=% 99| tK08-x$wKXܾR>Ge~]l5@>2~]lf > 1p3L==4>6«C*<սx[?ģV=33u\2Xs=9c:e\=DsAv>(&aJk߾v>.U6e\=ȽEXs=&K)ģV==*<>ĔC>:۾p3Ke>A(? =DPT>(? =V%>[/4(@=~=%<=<@k=D< >z0*>/+[C>m>\P>fF- q\P>:K[C>f**>N2=٦k=*>Lݾ=V>C4(@=R>x>E>x>>!>'4 >E=t1>==56>[_1vP>c:(h>ǽ{>zݽaJ ނ>ýG ނ>~Dw־{><%þh>R=vP> =a¾6>И%>}Ծ>G>4 >q>aJ bP>F>)MbP>Z>U>=2 t_>=M"6m>g/=x {>;a> (p>䄼 N.>N.>(<ǘp>= 0a>=qW{>=龸6m>>t_>]>xUU>,&= @Ђ> ÀeQs:߇Euc-jlԡE􆾤 Àejlԡש!/hRi;VZd=Qs:߇E ÀeMھXb/hRi; ÀeE􆾤~; >f-E ]=/E TȾ2a =<ڮKuʽ{I> p3M4>Y#~]lE=7~]lFG=[Ep38(J cIG*S߽e\=oॾXs=B=KģV=j >!ž*뾭V>)4(@=%C>^'(? =p>9(? ==F4(@=9 K=jHk=&A< >JO4+*>=W}#[C>޳C\P>_i'ܾ\P>!=þ[C>[<5*>N= >'>־k=I>=o>>4 >)/>B)'x>?o >F5x>\=.>4 >a,T5@6>{7vP>p*h>N {> ނ>=5 ނ>. N㾅{><۾h>;ּ=ᾟvP>j>Z~6>4>f>>xiU>(=D#bP>=W*bP>쉓=*0U>x=d>2t_>%س;06m>,},{>*"G$a>8!p>N9FN.>G N.>R?;9=La>4>= {>ֆ=zk 6m>K=t_>(bƽE1I彨7 .鞿aM%- Ͼܽ(bƽEaM%-S%+ԡ#d=\ d/1I彨(bƽEHМi;#d=(bƽE Ͼܽ ھ]>P >SPg=ZG%=kZ >` ھ]>PG%=9=Ӿ=GE $̾5"9>[u-%>c?o > ھ]>P.SQl+>mW} $̾5"9>[u ھ]>PkZ >`+ iN(Bg  Li۽>mL(B-5o@z N'GYF^ >0)Bz r ݾz + νپ<ܾ^6御N'5B=)"n=n5? ʽL=4 =|2E ͹M>E V۫бC0*e@ʽ\pk5%Ꮎo$| =x$K<dҾ2a =12a =lK%6>U(!>6)p3c==~]l fv> AҶe\=+=Xs==վģV= (>}*<8>:"=$>/4(@=G=A(? =j{!=N(? =4!R4(@='k&O=G+Dk=ht3 >&YH*>DnC [C>9;Y\P>*Tؾ\P>tMξ[C>^=Bվ*>=8{ >E+>͹k=&7>=">3>14 >=?x>"=cIx>hϼ}L4 >մHJ>A6>24vP>\=OC%h>.f{>$ ނ>r\P ނ>S{>M="h>5=wvP>˸ >w6>="'t_>@=_/U>RZ= 7bP><;<bP>yj7A>U>w99ݖW86m>xN1{>tǽ(a>5[E p> $N.> 3N.> ђ9p><a>m={>d^=Ү6m>k~E)@Ђ>cƘ~ @>{S:>㉿me>0gq¾@>|d¾4Ck>{K7z>~[ ͂>pmme>0gK7z>~ʀYo>'Ps85g o (B.TLcWL;05(BdD 5`J|N'MC0^{.œ辢ѵ޾z ]U׽/]۾z ag޾ɼ&^dSgN'= * Y=O"|:*.R$=;@p3߫TM~]lR~]l&= Np3B/*<1ģV=NCXs=W;e\=E6/ɾv>,!v> ;Ⱦe\==*Xs=[Q>FģV=t >YL!k==v5=q=F4(@=3[R(? =,V(? =.S4(@=awG=|k 7k=򬛾a# >c*>Vr?[C>p:(\P>PlC۾\P>;G[C>*=;*>9=OC >۽= )6>!n=ݏ8>:(=1E4 >iNx>PlQx>#i-O4 >!KVF>o96>*|jq*vP>=m.h>hG {>J ނ> 旽r ނ>hd{>7= h>0u=vP>l<.6m>:<6t_>>U>BbP> 旽DbP>Q߽hCU> >t_>F!e76m>m(F |&a> ſp>-JڽN.>3N.>>p>>a>dL<:&{>30@Ђ>pCXǤ=E0H=E lWwzO_>w@a9nq>>셿5=x>>셿S"_>`y7>w5=x>>셿b:r>s1c>s`] 1>s`zO_>w7>wM( >{cs1c>s`7>wS"_>`yH|N'ż 5 !25(B7`LT1TL&Fo (BqM85=GgN'LX3^t0ag޾/]۾z Z޾z )/:œ辢ͼ0^f=x1 40C5= L./ɾv>u&=;e\==NCXs=ɤ=a# >”=k 7k=|<G=9S4(@=7V(? =[3[R(? =3 F4(@=;Av5=yYL!k=OC >;*>ObG[C>W C۾\P>;4S\P>=*>_}-<96>/VF><-O4 >W Qx>jNNx>1E4 >Hߖݏ8> )6> ᗾvP> h>uGShd{>zr ނ>J ނ> {>ņ<.h>egRle76m>1>t_>ڽhCU>zDbP>5BbP>S>U>̶h6t_>,hp.6m>i:&{>U>a>/7p>N.>߽N.> 9ſp>,q|&a>0@Ђ>-̼XǤ=EBO=`ZW<鞿ywϏνa>wzJ:r>Ex>>셿i<>qbwS>wEx>>셿O+;9nq>>셿./c>s`Xs >{cϏνa>wzS>w<,=1>s`./c>s`S>wi<>qbwq^}⼥z N'T<5Yu(BC޽>mL&F L|uNN(BH55御N'ܾ^پ)ݾz PBz 0.=: R%=ձ4uȺ˱% &]u."i0n5{99O,*?_qr#*?Fn5)"ⴎ쾉 z1Ҿ42DRBx;艽 ľ:b( ׾QkE 2|2E Ö4 Ǟ ʽï%̾| ikx$#lK ܾv>vZ=Aee\=:=H*>O<3 >t+Dk=8&O=/!R4(@=-N(? =A(? =/4(@=˾:"=&ľ͹k=s8{ >^Bվ*>x@Mξ[C>bսTؾ\P>Y\P>/֌UOC%h>(4vP>WϙA6>HJ>~C}L4 >HcIx>򂞾?x>񱾻14 >R=">%`w6>wvP>[&"h>O{>EYP ނ>ƫ ނ>N:(a>9N1{>W86m>.אQA>U>t;<bP>*Ɖ 7bP>J_/U>Dr"'t_>XҮ6m>v4{>X{a>pX9p>53N.>zuN.>l[E p>YE)@Ђ>y>cƘ<=l鞿jE>SW;_y>cƘ< >l鞿"]6>9i <}=j.=d/y>cƘSW;_z =7z>~4I=p>z>=S:>㉿+ =@>&>T}j>&k{z =7z>~+ =@>s>7>=e>0g ͂>pm4I=p>zz =7z>~'>@>|d=e>0gz =7z>~&>T}j>&k{{Vܼ? ^LN'h+75J⽡(Bi{ƎLML)H'(B5n58ھN' a׾^^U۾5` z Tz I(,n5muq"*?S*?N2@n5f&羈"#~̾ KJs47 4R'$z(PѾQkK{Ⱦ2a == 2a =)=6e\=H<(Xs= 皼;ģV=[͹cIG*<1B5(J}[Ep3P57~]leȾY#~]l}uӾ p3uR̾뾭t!ž*<ʏKģV=9GॾXs=ڽe\=DE7̾v>G<#v>V2}#[C>˗O4+*>{A< >+Hk=sTK=F4(@=wq9(? =о^'(? =پ)4(@=CӾ=O־k=rW >/ e5*>(!=þ[C>@<'ܾ\P>ʼ\P>`.{>^p*h>T7vP>1T5@6>CpB>ڗ.>4 >_;F5x>CƾB)'x>w;4 >Ⱦf>:Z~6>NᾟvP>3|۾h>9=N㾅{>`5 ނ>0½ ނ>.!p>4R4G$a>F},{>@b06m>.;d>2t_>:f*0U>)7W*bP>lD#bP>xxiU>Rt_>uzk 6m>L {>>La>din`p>^K N.>69FN.>I@Ђ>i&>bƽEiA>۽e'r>%+ԡ?>M%-v|>VCi&>bƽE?>M%-j> .鞿|d>d=>Мi;iA>۽ei&>bƽE> d/|d>d=i&>bƽEv|>VCW>]>P5>& >^rI>=GECk>=\ފ>W~>W>]>PCk>=̆>g=Z@;>5"9>[u==Ql+>mW}5>& >^W>]>P>-%>c?o@;>5"9>[uW>]>P\ފ>W~>*v\z _Q ҃\U^N'{5jƎ(BF42sZLFbL74N(BJC\ؾ51վN'^ؾ^diP㾢B[z 2X;:e\=0}$u\2Xs= 0x[?ģV=H«C*<4>] 1p3ξ2~]l׾Ge~]l о:۾p3Ĕ"*\P>~4+[C>0*>5D< >^m@k=A㞾%<=jW[/4(@=ؾ(? =eSᾐA(? =پC4(@=þLݾ=S٦k=}sRើ >YR#**> ԼK[C>a? q\P>ܽaJ ނ>.{>}:(h>O1vP>656>5t1>s'4 >NѾx>׾x>PҾ4 >'P}Ծ>a¾6>P؈vP>S%þh>_6־{><G ނ>jL N.>LRp>da>ix {>M"6m>~2 t_>U>̦)MbP>~M2xUU>t_>G龸6m>>oqW{>u 0a> fǘp>MSN.>JM @Ђ>k>Àe9ل>w݆ש!bP>lԡ.>q󙗿k>ÀebP>lԡ+>c-ۓ>hRi;W>Xb9ل>w݆Àe0>d=ۓ>hRi;k>Àe.>q󙗿R>~;ۋAE>ތJޙ>S#|>@+艿R>~;S#> |~>7_k=M^.>+=e܇B`>ۋR>~;E!=~>7_k=MR>~;@+艿*z B z d/^^1N'JB574%(BF LF42Lj:{׾(B轋Ӿ5־N'҃\^ ᄁ2Qk!VI>E %ӾE 'Zuuʽ!%l,%]$| ;f(x$<оK8Ճ;v>99'e\=_J5Xs=GPOQ:ģV="6*<) оNp3׾:~]lξd̾~]l]op3_NH~*< 0ᇾģV=0}$ߡXs=X;TFɾe\=󼘥\P>a?\P> Լ"[C>YR#7/*>}s3 >S/k=þ#=پg4(@=eSᾨ(? =ؾ̾(? =jWn4(@=A㞾M=^mk=5? >*>~4rfɾ[C>ܽ ނ><e ނ>_6{>SQ}!h>P؈ %vP>3!6>'P>PҾ 4 >׾x>NѾXӾx>s궾4 >5>66>O8vP>}Th>.о{>jL~N.>MSNN.> f p>uS4a>>o {>Gz6m> t_>M2U>~<bP>̦u߾bP>оU>~2ƾt_>-Z¾6m>i]ž{>dϾa>LR޾p>JM~@Ђ>%>oRؾm߾K">jF뼯>!z\>T޾%>oRؾ<뼯>!U>1ԡK>]>QþeG>m߾K%>oRؾ<^>¾i;K>%>oRؾT޾v>'ѕ n>#Gߘǎ>z&pڜd|>uhS3> D'ѕd|>uhS3m>yo*ie >!l=>6ؽ n>#Gߘv>'ѕy>ҽψe >!v>'ѕ> D<{VܼOz 5`Ez ^ 𽔛^0N'5|5)Hv8 (BM~Li{:{׾LJ⽅SӾ(Bhr*־5LT߾N'^I<"R;艽K{Gn543"!F[P84ཆ<*ؾR\=K<= 2a =YC-2a =EF+K<(H0x$yu-| 2͞p"%(~ʽYZ=̾E [E Sjn|ʽәnʊ%*}| /(=ľx$)=+e\=G<: v>D0v>ڽ*e\=9GX\0Xs=ʏ,ģV=t] *ʼ\P>@<\P>(ӭ![C>/ eձ&*>rW\D# >Ok=CӾ `=پu4(@=о۷(? =wq(? =7)s4(@=sT._=+lk={E >˗*0*>`.Ҿ{>0½a ނ>`I ނ>9={>3|z\h>NvP>:7 6>Ⱦ?>w;پ4 >CƾDFx>_;R x>ڗk4 >Cp>1.6>TwvP>^gh>.Uξp>6T N.>^KSN.>dip>>a>L({>u6m>Rf9t_>xѾU>lLbP>)7ȰbP>:fCU>.;t_>@b򤾸6m>FY{>4R4:⼾a>ξ@Ђ>>K M>S`K y>-a>?+jFZ>>K>?+jF>Q-!u>;4e0">=8 M>S`>K[>u>;4e>KZ>x>3_޽8> { d>:@ʾ)k1>ƾ2ܚ>E\lix>3_޽k1>ƾ2y>qȾ`>hm-_4 >M 8> {x>3_޽ݘ>{H`>hm-x>3_޽ܚ>E\liq^ LPCz )s^z nd^5zN'Hq 5|uN(B&FLC޽JӾLYuwy־(BTda"v>,'e\=iQ$Xs=oģV=B¾v *<ɾ+߾2[p3X~]l[`wWc~]l1Np3Xd~w\_E<*< u=êģV=:=Ⱦ*>/֌ \P>bս:\P>x@[C>^È*>sǎ >&ľ.%k=˾TTо=ᦾ4(@=(? =-T(? =/ eA4(@=8N=t|zk=O<6 >U*h>N<'۾{>ƫ+ ނ>EY< ނ>OV{>[&b;h>nvP>%`6>RNl¾>Q4 >򂞾Rx>Hhx>~CY4 >id>Wϙ Ղ6>(ԜvP>:㴾a>lƾp>zuԾN.>5`߾N.>pXV p>X{)ea>v4LM׾{>X#;ɾ6m>DrSt_>J (U>*ƉWbP>t!bP>אQU>.Ќt_>蕾6m>9{>Y<@Ђ>->'5p=A9夿 =MO9)>RMa'Q>#8->'5)>RMaF<>]NjF>"E1=C'@p=A9夿->'5eV>&e>"->'5'Q>#8,>ؾΣU=lྋr=if[&>nC}F>ݾ1,>ؾΣ[&>nCy 2>Ks\=˲gƜX=mU=lྋ,>ؾΣqK>cG\=˲gƜ,>ؾΣ}F>ݾ1HN'ͼL^)/:Zz ̝z t0LX3~^=GN'qM+75&F(BT1 tL7`>׾L !2\r(Bżh5f=545-=' RQ;|;艽P Qk?"Qk8' ;艽YpRȦM 4{i ׾"lIn5W3(*?z*? a=Hہ3L<"0C5=վ PG=H| W"=-qx$l<=BK<-}U#2a =&?'2a =_S#K7"v>ޏbe\=fOXs=mģV=M"־*=*><[C>;4SV\P>W \P>Ob@[C>*>) >yľk=;A=3 mr4(@=[C(? =7u2(? =92#A4(@=|<m=”=}k=_}<󵱾vP>ņ꾅{>4 ނ>z ނ>uGS{>]쾟h> ᗾӾvP>W6>Hߖy>4v4 >jN~Rx>W ,?Ex><{P4 >/8|r>-< 6>egR{>,qӸa> 9=Ǿp>߽оN.>XԾN.>/7NѾp>UȾa>i${>,hp6m>̶h֘t_>SWU>5w瀾bP>zzbP>ڽ[U>1t_>l6m>@@Ђ>)~G夿ڭJ夿QV`9Ӌ_9/6=J`[)~G夿Ӌ_9ɒ<ˍ`a-̼|3@5>7@ڭJ夿)~G夿s=57-̼|3@)~G夿/6=J`[*u|XނbjjW*=*u|js׾L. tLg (B=i Fa=M 4<R=' ;艽̽"Qk) Qka|;艽b*' RE54%,վ e"-en5]U׽z*?#tJ=|"־*<[Q>ģV==OXs= ;e\=,"v>E6Nv>We\=,Xs=ejҾģV=! *<&=xUp3m#E~]l߫W~]lR$=Q0p3Jx>1{t >ľk=9=) >*=*>;@[C>Pl\P>p:(V\P>Vr[C>c*>򬛾 >|}k=awm=.2#A4(@=,u2(? =C(? =q=mr4(@===۽=W6>0u=ӾvP>7=]쾟h>{> 旽 ނ>4 ނ>hG꾅{>=mkоh>*|󵱾vP>o 6>!K8|r>#i{P4 >Pl,?Ex>i~Rx>:(=4v4 >!n=y>l<6m>dL<${>Ⱦa>>NѾp>3XԾN.>-JڽоN.> =Ǿp>F Ӹa>m({>F!6m> t_>Q߽[U> 旽zbP>w瀾bP>WU>:<֘t_>3@@Ђ>H)~G夿|sMJ`oˍ`a K_9JXH)~G夿 K_9'`9pC|3@57|sMJH)~G夿"ؽ>7@pC|3@H)~G夿JX٘E|僾; ҥElMqHjSЦ٘E|qHjf$jU@2Ծ rj۾ʞ僾; ҥ٘E|ܢҽ<ݾ rU@2Ծ r٘E|SЦ+ i(Bq 56zN'<^+ νndr s^z )Cz >LGYF^o@}N'-T߾5wy־(Bi۽JӾLg LB=v"Ā= <4evk"Rzj$;艽P4!QkzRQkpXy ;艽YRrR5~5վ4Xv[25 u%g" ʽ[n54' 9s=?< *?n=y۾n56>ʽ+> %f5=| n<'x$ +K<3&2a =d2a =qK< Mx$Ꮎr| \p%0*ͅʽV۫Lj~͹-E =mE L=_dž6>+߾ (>v *<=oģV=+=iQ$Xs= A'e\= a"v>\Bv>҉"e\=+u־Xs=BêģV=Dbi*[p38>TTо=E+>.%k==ǎ >^=È*>t伽[C>*:\P>9; \P>DnAz[C>&YȾ*>ht6 >G|zk='kN=4 eA4(@=j{!=T(? =G=(? =$>ᦾ4(@=&7>Nl¾>˸ >6>5=nvP>M=b;h>SV{>r\< ނ>$+ ނ>.'۾{>\=*h>2ԜvP> Ղ6>մid>hϼY4 >"=hx>=Rx>3>Q4 >=St_>d^=#;ɾ6m>m=LM׾{><)ea> ђV p> `߾N.> $ԾN.>5ƾp>tǽ㴾a>x{>9ݖ蕾6m>w9Ќt_>yj7U>RZ=WbP>@= (U>k~<@Ђ>'5Y׾U8Kb̾]NjFkRMaZ9X'5kRMaGMO9o"rپ&eY׾U8K'5qC'@o"'5Z9XűؾΣҾoݾw|ǾKsnCȐ 9̤űؾΣnCa`if˲gƜ<ԾcGҾoݾwűؾΣ~m˲gƜűؾΣȐ 9̤xv~L.寮v8 (B6|5c0N'ʽ^&X$Ez d9z |AOV<^)T߾N'J r*־5[׽SӾ(B+:{׾L<=Fn5=u"= %492(RA^[$;艽oGQk7lq Qk{"R;艽Ϙq*ؾR%O84Na٫ 3"Y`꼒ہ3sw<*?٢y=ݾ*?>Zz >~ʽ%=p"%=̾E {I>n'p3l;>` j >] *}Pr: v>V+e\=0ynXs=IģV=  p*<84aFG=#vp3E=~]lM4>޾~]lV>u4(@=I> `='>k=N=\D# >[<ձ&*>ӭ![C>_i\P>޳C\P>=WQھ[C>J*0*>&E >jlk=9 ._==7)s4(@=p>(? =%C>۷(? =o>>پ4 >4>?>j>7 6>;ּ=vP>. {>=I ނ>a ނ>N Ҿ{>gh>{wvP>,.6>a<>\=k4 >?o >R x>)/>DFx>>ѾU>K=f9t_>ֆ=6m>4>=({>;9=a>R?

GSN.>NT N.>8Uξp>*":⼾a>,Y{>%س;򤾸6m>x=t_>쉓=CU>=ȰbP>(=LbP>LK -)<Q-!q3?+jF`ԾE?`[LKq3?+jFe-a;4e -)#%(ByB5*˽N'&X^#/67 z (b>z M8 ᄁ%^ ־N'LѽӾ5):{׾(BL+L'=*?|4=|n5"d=j"U( M.+4ཕs(RB|;艽(fEQksI>Qkh$޾;艽yFH¾R.{篾4ཕ3ͩ Ұ <$ľn5n-=*?Ĥ>I>E O>>=r'ʽ%ӾE R>:~]lC>Np3>)=6*<&KOQ:ģV=ȽJ5Xs=.9'e\=(&av>Dsv>9cTFɾe\=33ߡXs=սᇾģV=6~*op35@>d̾~]lKe>(? =V>g4(@=*>#=N2=/k=<3 >f7/*>:"[C>fF-\P>m>\P>/rfɾ[C>z*>? ><k=~=M=V%>n4(@=DPT>̾(? =R>x>G> 4 >И%>> =3!6>R= %vP><Q}!h>~Dw{>ýe ނ>zݽ ނ>ǽо{>cTh>[_8vP>==6>E=>>!>궾4 >E>XӾx>q>bP>]>U>> t_>=z6m>= {>=S4a>(< p>NN.>䄼~N.> (޾p>;Ͼa>g/=]ž{>=-Z¾6m>=2ƾt_>Z>оU>F>u߾bP>,&=~@Ђ>T oRؾaJ F>)MZ>g1=2 ^u=M"g/=x 挿; (ҏ䄼 dd(<ǘҏ= 0=qW挿=龧>^u]>xUg1R>{E>{>!>'}E=t1'==56[_1c:(Ēǽa錿zݽaJ X-ýGX-~Dw־a錿<%þĒR=9,=*¾И%>}Ծ'G>𾭢}Ke>AcDPT>cV%>[/#f~=%{fF- q{:K3ᅿf*ӂLݾc mV>C#fR>Ge%L5@>2%Lf > 1OL==4>;WV6«Ci^սx[?Uh33u\2 p9c:,wDsA}+{(&aJk߾}+{.U6,wȽE p&K)Uh=i^>Ĕ;WVC>:۾OĤ>?O@8U >QnO@8Y= ,ߎ;#<8A_.6=I 99KRtK08-FZw"c`GGec@ujH߾cF""c`FZ!DKR<%I=AO>Xܾߎ;'=v\*n-=*<9!~-澼*+23e.G8.X+>yF("_Eh9Is?6L(f 澇6LBɾIc_EMkH>bG8"d=:Ǿ+2|4=n㾄~-L+sZ'')Ǝ5*Lѽ{- 1%Uf4M8_Q w6(b>v\ M867[ M8#iPw6&Xؾf4*˽վ1yC\ؾ->#N5*Cb'',&= )?U7 R>" >dZ +? n 3? sm?U7 +? n 0?  VW>e;)D>7־R>" ?U7 ?n^վVW>e;)?U7 3? sm>a5:i>NlH >#Ȋ ·>s ?Z:F7>a5:·>sl?<>PB>%5i>NlH >a5:r?m>PB>a5: ?Z:F7>xig1(=D#=W*쉓=*0g1x=d>2^u%س;0,},挿*"G$8!ҏN9FdG dR?= 挿ֆ=zk K=^uo>>})/>B)'{?o >F5{\=.>}aj>Z~64>f'V>)#f%C>^'cp>9c=F#f9 Kc mjH-u&A<\}JO4+ӂ=W}#3ᅿ޳C{_i'ܾ{!=þ3ᅿ[<5ӂN=\}'>־-uI>c m{I> OM4>Y#%LE=7%LFG=[EO8(J;WV cIGi^I;Uh0y( pV6,w}Pr#}+{S!ži^l;>;WV>ߎ; >f-O@8]=/O@8TȾc<ڮ"c`DS8ҤFZ<*KR%=_¾Iz >uA<=@~-٢y=S*sw<q"*U(,~-J/+2N_-G8%O$>ϘqB_E{R#I7l6LoGPѾ6LA ⽾I94_Es>=̾G8=羾+2xv''+Ǝ''[׽5*J +7-)1Vg,0 >#4C >>H^i>F >2 :>g,0 i>F Q>G 2E> Ҡ> #,f >#4C :>g,0 >D")2E> :>g,0 >2 m>ԤξX q>MR־# >ۅ >&^ >ӾNm>ԤξX >&^ >5^" ƿ>VT>!q>MR־# m>ԤξX Ɨ>ղƿ>m>ԤξX >ӾN="'^u@=_/g1RZ= 7<;<yj7A>g1w9<^u9ݖW8xN1挿tǽ(5[E ҏ $d 3d ђ9ҏ<m=挿d^=Ү&7>="'3>1}=?{"=cI{hϼ}L}մHJ'A624\=OC%Ē.fa錿$X-r\PX-Sa錿K=qL5=w˸ >w68>:"c m$>/#fG=Acj{!=Nc4!R#f'k&Oc mG+D-uht3\}&YHӂDnC 3ᅿ9;Y{*Tؾ{tMξ3ᅿ^=Bվӂ=8{\}E+>͹-u6>U;WV(!>6)Oc==%L}i^6> AL=4 ߎ;=|2O@8͹M>O@8V۫бCߎ;0*e@A\pk5IᎾo$KR =FZ"c`dҾc1cl"c`n<FZf5=̾KR+>IB=)+2n=~-?Y: _EpXyxm򾙮IzR ׾6L(0ľ6LzIe_E<1Ҿ>Ā=G8+ iN5*g  ''i۽>m''5*--o@z 1GYFf4 >0w6)B M8r ݾ M8+ νپw6<ܾf461󾧃-k~E)):{>;]C C:>Uia> R`>`vD->ft^zٝ>`˛ :{>;]C ->ft^D>:v acl>ԘJ,f >W{O9 C:>Uia> :{>;]C SS>Macl>ԘJ,f :{>;]C zٝ>`˛ mq>WV />q DV>|-y>+ u>Ӫ< mq>WV y>+ u]L>, a>B| 2 >s%AP />q mq>WV m>a>B| mq>WV >Ӫ< l<.:<6^u>g1B 旽DQ߽hCg1 >^uF!e7m(ҏ>dL<:&挿۽= )6!n=ݏ8':(=1E}iN{PlQ{#i-O}!KVF'o96*|jq*=m.ĒhG a錿JX- 旽rX-h*7= Ē0u=t >YL!-u=v5c mq=F#f3[Rc,Vc.S#fawGc m|k 7-u򬛾a#\}cӂVr?3ᅿp:({PlC۾{;G3ᅿ*=;ӂ9=OC \}>:i^Jx>.;WVR$=;@O߫TM%LR%L&= NOB;WV/i^1UhNC pW;,wE6/ɾ}+{,!}+{ ;Ⱦ,w=* p[Q>FUhax=MIgS=Ax#Ak=U4ߎ;04v\@O@8̽SDO@8<Aߎ;ق{5Aݚ%IբKRUmFZMkDB׾"c`6cIFc"c`=ԾFZ=[KR=G8* Y=O+2|b*x_Ea%پI)JǾ6L̽6L=HƾIs8-g o 5*.T''cW'';055*dD -`J|1MC0f4{.œw6ѵ޾ M8]U׽/]۾ M8ag޾w6ɼ&羈f4dSg130)N<ރv> Fy> Cހ쇿Dz<4D5=yy N<ރv> z<4D _=ɇ^c2=<2b9 Cbf9 Fy> N<ރv> =;f,f c2=<2b9 N<ރv> 5=yy i_^uڽhCg1zD5BS>g1̶h6^u,hp.i:&挿U>/7ҏd߽d 9ſҏ,q|&_}0C5=G8LYpI׾_E8HƾI?6LPJǾ6LQ;%پI5-=x_EH|1ż - !255*7`''T1T''&Fo 5*qM8-=Gg1LX3羈f4t0ag޾w6/]۾ M8Z޾ M8)/:œw6ͼ0f40)nރv> b(RyC ?eɇ^p4DU+[yi nރv> p4DL쇿Dh2b9 y;f,f b(RyC nރv> ]f9 h2b9 nރv> U+[yi kC-ܤК0׈SF8wmD:(xY0kC-ܤmDI]FeNPnR ~ К0kC-ܤ:nR eNPnR kC-ܤ:(xY0:(9N1挿W8.<^uאQA>g1t;<*Ɖ 7J_/g1Dr"'^uXҮv4挿X{pX9ҏ53dzudl[E ҏUOC%Ē(4WϙA6HJ'~C}L}HcI{򂞾?{񱾻1}R="'%`w6w[&"ĒOa錿 `-獿ƫX-NO@82|2O@8Ö4 ߎ;Ǟ AïI̾KRikFZ#l"c`X1c;Ҿc?i="c`.=: _E%=ձ>uȺ˱%G8&]u.+2i0~-{99O,*_qr#*F~-)+2ⴎG8z1Ҿ>2D_EBxI(0ľ6L( ׾6Lm''&F ''|uNN5*H󾧃-51ܾf4پw6)ݾ M8PB M8 0w6YE))\`;]C O/2` :v tft^c˾7ai \`;]C tft^޾`vDpԘJ,f kMO/2` \`;]C W{O9 pԘJ,f \`;]C c˾7ai v WV 7Ke , \뾂+ uƾ v WV \뾂+ uپ|-`߾B| 7Ke v WV +s%AP `߾B| v WV ƾ .!ҏ4R4G$F},挿@b0.;d>2^u:f*0g1)7W*lD#xxig1R^uuzk L 挿>Ldin`ҏ^K d69Fd`.a錿^p*ĒT71T5@6CpB'ڗ.>}_;F5{CƾB)'{w;}Ⱦf':Z~6Nᾤ3|۾ĒY<2K`5X-0½ X-V2}#3ᅿ˗O4+ӂ{A<\}+H-usTKc mF#fwq9cо^'cپ)#fCӾc mO־-urW\}/ e5ӂ(!=þ3ᅿ@<'ܾ{ʼ{)=6,wH<( p 皼;Uh[͹cIGi^1B5(J;WV}[EOP57%LeȾY#%L}uӾ OuR̾;WVt!ži^ʏKUh9Gॾ pڽ,wDE7̾}+{G<#}+{\= "c`/(=!FZ΍2KRә,=InTAASjP<ߎ;/O@8f-O@8Yߎ;(uA2͞_¾Iy*KR(8ҤFZE<ڮ"c`YB>Ⱦc= cIb_-G84J/+2>(,~-muq"*S*N2@~-f&羾+2#~̾G8KJs>7 4_EЋ ⽾Iz(PѾ6LK{<6L{Vܼw6? f4L1h+7-J⽡5*i{Ǝ''M'')H'5*5n㾧-8ھ1 a׾f4^U۾w65` M8T M8I):_"g,0 127 j.G %F CQ3 :_"g,0 %F FaH^yd 0D")127 :_"g,0 . #,f yd :_"g,0 CQ3  ԤξX ,ӾHq+)5^" &^  2־~  ԤξX &^ #"ۅ U%+ղ,ӾHq ԤξX l!U% ԤξX  2־~ jL dLRҏdix 挿M"~2 ^ug1̦)M~oqW挿u 0 fǘҏMSdܽaJ X-.a錿}:(ĒO16565t1's'}NѾ{׾{PҾ𾭢}'P}Ծ'a¾6P؈I SþqL_6־a錿<GX-{~4+3ᅿ0ӂ5D<\}^m@-uA㞾%;WV] 1Oξ2%L׾Ge%L о:۾OĔ;WV"i^GP)Uh_E p9U6,w8Ճ;Jk߾}+{!&=Gec<"c`;08-FZ]99KR!%.6=Iu8A'Z ,ߎ;QnO@8!V?O@8gXܾߎ;sȟA&|%I,KRFZ{""c`tme.G8*E*+2y9!~-ώ*nv\*Џn㾄~-}:Ǿ+2;JbG8ذ kH>睽c_EѼɾI< 澇6L*v\ M8_Q w6҃\Uf41{-jƎ5*F42sZ''Fb''74N5*JC\ؾ-1վ1^ؾf4diPw6B[ M8JM )Z9U7 ,H!񾜐rF  &> n ) ˛ Z9U7 &> n 5dZ 1e;)En^վ,H!񾜐Z9U7 7־1e;)Z9U7 ) ˛ P:1a5:@hFZKR><6s!=HeP:1a5:6sc-#Ȋ G)PBQ=m@hFZP:1a5:%5G)PBP:1a5:!=HejL~dMSNd f ҏuS4>o 挿Gz ^uM2g1~<̦u߾оg1~2ƾ^u-Z¾i]ž挿dϾLR޾ҏܽX-<e X-_6a錿SQ}!ĒP؈ %3!6'P'PҾ }׾{NѾXӾ{s궾}5'66-NoĢQ>}TĒ.оa錿󼘥{a?{ Լ"3ᅿYR#7/ӂ}s3\}S/-uþ#c mپg#feSᾨcؾ̾cjWn#fA㞾Mc m^m-u5?\}ӂ~4rfɾ3ᅿ/ֶ<}+{8Ճ;}+{99',w_J5 pGPOQ:Uh"6i^);WV оNO׾:%Lξd̾%L]oO_N;WVH~i^ 0ᇾUh0}$ߡ pX;TFɾ,w!&=:ctߎ;!VI>O@8%ӾO@8'Zߎ;uuA!%l,I]$KR;f(FZ<о"c`26L;JU(G8}j+2Џ|~-n*ώྕ*y$ľ~-*E?鰾+2mͩG8.{篾>(𳼗H¾_E 38<$޾I* M8B M8d/w6^f411JB-74%5*F ''F42''j:{׾5*轋Ӿ-־1҃\ྈf4 w6JM~) 8\yGTj *E6B0 o=Փ y(h 8\o=Փ B#5" 50F, `DÐ?+yGTj  8\y,1<)50F, 8\y(h -D=?=ڬ =0;1rW63gYӼX+@@=-<-D=63gYӼX+5*0lw%3= '::^=;?=ڬ =0-D=l^=7w%3= -D=@@=-<.Uξҏ6T d^KSddiҏ>L(挿uRf9^uxѾg1lL)7Ȱ:fCg1.;^u@b򤾧FY挿4R4:⼾`.Ҿa錿0½aX-`IX-9=a錿3|z\ĒN:7 6Ⱦ?'w;پ}CƾDF{_;R {ڗk}Cp'1:pTw^gĒV2Qھ3ᅿʼ{@<{(ӭ!3ᅿ/ eձ&ӂrW\D#\}O-uCӾ `c mپu#fо۷cwqc7)s#fsT._c m+l-u{E\}˗*0ӂ)=+,wG<: }+{D0}+{ڽ*,w9GX\0 pʏ,Uht] i^uR̾` ;WV}uӾn'OeȾ޾%LP5%L}#vO1B54a;WV[͹ pi^ 皼UhH#~G8f&u+2N2F~-ݾ*mu*>G~-43+2ba٫G8P8><*ؾ_E{VܼOw6 M85`E M8^w6 𽔛f4015|-)Hv8 5*M~''i{:{׾''J⽅SӾ5*hr*־-LT߾1f4ξ)(2 ; /-n>J,*F >$-mB0 bf{sm(2 ; >$-mB0 災 %>c'=+o,E<1/-n>(2 ; <%>c'=+(2 ; bf{smat>f$Ѝq>,="=?6>mF>>h 1u>3Kat>f>>h{8>  ֑>b"·>$Ѝq>,at>fV > ֑>at>f 1u>3K:㴾lƾҏzuԾd5`߾dpXV ҏX{)ev4LM׾挿X#;ɾDrS^uJ (g1*ƉWt!אQg1.Ќ^u蕾9挿U*ĒN<'۾a錿ƫ+X-EY<X-OVa錿[&b;Ēn%`6RNl¾'Q}򂞾R{Hh{~CY}WHdဿWϙ Ղ6(Ԝ:=Ⱦӂ/֌ⴎ G8v+2Fy۾~-_q *{99)֬*[~-&]g+2uȺ25G8%=5վ>qf4 Lw6PC M8)s^ M8ndw6f45z1Hq -|uN5*&F''C޽JӾ''Yuwy־5*T>|`#>B<=6 eAV=F %žl'>c82>>eAV=F ۾=B0 hܾK>17>|`#>B<82>>%G=>+hܾK>182>>%žl'>c־>r?L[>.7>l#ݾ>kg>־>rݾ>Y̾>\ ̾<>kl5Z>"q?L[>.־>rkҢG>&̾<>k־>rkg>egR挿,qӸ 9=Ǿҏ߽оdXԾd/7NѾҏUȾi$挿,hp̶h֘^uSWg15w瀾zzڽ[g11^ul_}<󵱾ņ5-=' _EQ;|IP 6L?"6L8' IYp_EȦM >{iG8׾+2lI~-W3(*z*T׾'' !2\r5*żh-@)hA=>B<>B<vQ>6 n$Y>6 hA=>B<n$Y>6 $JJS>F a>gu>>B<hA=>B<9| >K>1a>hA=>B<^\]h >^*j>^*RU>b9X>>(^\]h >^*򿂟b9X>>N>f?|V o>lC>lj>^*^\]h >^*e>?|V o>l^\]h >^*>(l<dL<$挿Ⱦ>NѾҏ3XԾd-Jڽоd =ǾҏF Ӹm(挿F! ^uQ߽[g1 旽zw瀾Wg1:<֘^u۽=W60u=Ӿ7=]Ēa錿 旽X-4X-hGa錿=mkоĒ*|󵱾o 6!K8|r'#i{P}Pl,?E{lgSz:(=4v}!n=y't >ľ-u9=)\}*=ӂ;@3ᅿPl{p:(V{Vr3ᅿcӂ򬛾\}|}-uawmc m.2#A#f,u2cCcq=mr#f=c m>"־i^[Q>Uh=O p ;,w,"}+{E6N}+{W,w, pejҾUh! i^;WV&=xUOm#E%L߫W%LR$=Q0OJx>1{;WVax=XI=KR=hFZ#"c`?'c6}U#cMkB"c`U-qFZբHKRݚ4{IقŚA<܎ߎ;̽DpzO@804v߅O@8k=4ߎ;gS=FA=iG8Fa=M ><_E=' I̽"6L) 6La|Ib*' _EE5>%,վG8e+2-e~-]U׽z*D$(*|׾''. t''g 5*3@)c2=B<UYV>>ꕼS>F N<$Y>6 |=(>c2=B<N<$Y>6 T=Q>6 `;>>K>1UYV>>c2=B<=u>`;>c2=B<|=(>29h >^*7}l>UnN>fe;9X>=> 29h >^*e;9X>&=>gѻ o>le>7}l>Un29h >^*=>lgѻ o>l29h >^*=> =S^ud^=#;ɾm=LM׾挿<)e ђV ҏ `߾d $Ծd5ƾҏtǽ㴾x挿9ݖ蕾w9Ќ^uyj7g1Nl¾'˸ >65=nM=b;ĒSVa錿r\<X-$+X-.'۾a錿\=*Ē2Ԝ Ղ6մid'hϼY}(=iz=R{3>Q}8>TTоc mE+>.%-u=ǎ \}^=Èӂt伽3ᅿ*:{9; {DnAz3ᅿ&YȾӂht6\}G|z-u'kNc m4 eA#fj{!=TcG=c$>ᦾ#f6>+߾;WV (>v i^=oUh+=iQ$ p A',w a"}+{\B}+{҉",w+u־ pBêUhDbii^hnw\;WVs1NO[O6>A+> If5=KRn<'FZ +"c`3&cdcq"c` MFZᎾrKR\pI0*ͅAV۫Lj~ߎ;͹-O@8=mO@8L=_džߎ;B=v+2Ā= G8<>evk"_Ezj$IP4!6LzR6LpXy IYRr_E5~5վ>Xv[25G8u%g+2 ʽ[~-8)֬*?< *n=y۾~-+ i5*q -6z1<f4+ νndw6r s^ M8)C M8 >Lw6GYFf4o@}1-T߾-wy־5*i۽JӾ''g ''k~<)o>2>>.>Ku(> .Z>=B0 K{}>V=F >">o>2>>K{}>V=F 2t>=6 [>K>1ˆ>=>+.>Ku(> o>2>>g>7>[>K>1o>2>>>">P>>r> >L;>>\ ב^>>d>>fP>>rב^>>x>>l#<><>k꿯:=G>&> >LP>>r3>5Z>"q连<><>kP>>rd>>f>Ѿg1K=f9^uֆ=4>=(挿;9=R?<ҏGSdNT d8Uξҏ*":⼾,Y挿%س;򤾧x=^u쉓=Cg1=Ȱ(=Lo>>پ}4>?'j>7 6;ּ=R {)/>DF{V>u#fI> `c m'>-uN=\D#\}[<ձ&ӂӭ!3ᅿ_i{޳C{=WQھ3ᅿJ*0ӂ&E\}jl-u9 ._c m=7)s#fp>c%C>۷c{I>n'Ol;>` ;WVj >] i^B=,UhoX\0 p߽*,wS<0}+{}Pr: }+{V+,w0yn pIUh  pi^84a;WVFG=#vOE=%LM4>޾%L>Zߎ;z >~A%=p"I=̾O@8<=F~-=u+2=G8%>92(_EA^[$IoG6L7lq 6L{"RIϘq*ؾ_E%O8>Na٫G83+2UG~-sw<*٢y=ݾ*xv~''.寮v8 5*6|-c01ʽf4&Xw6$E M8d9 M8|AOw6V<f4)T߾1J r*־-[׽SӾ5*+:{׾'' ; \>Z>災 >-mB0 6> > ; >-mB0 $>*F >c'=+'><\>Z> ; k>E<1>c'=+> ; 6> vB>at>fB>hjv>s>8> [>>>h> q>wvB>at>f[>>>h>=?6>mFqZ>֑>𿖉>>B>hjv>vB>at>f>·>qZ>֑>vB>at>f> q>wq>]>g1> ^u=z= 挿=S4(< ҏNd䄼~d (޾ҏ;Ͼg/=]ž挿=-Z¾=2ƾ^uZ>оg1F>u߾R>{G> }И%>' =3!6R= %<Q}!Ē~Dwa錿ýe X-zݽX-ǽоa錿cTĒ[_8==6s=2ƣဿ>!>궾}E>XӾ{Ke>cV>g#f*>#c mN2=/-u<3\}f7/ӂ:"3ᅿfF-{m>{/rfɾ3ᅿzӂ?\}<-u~=Mc mV%>n#fDPT>̾cR>:%LC>NO>);WV=6i^&KOQ:UhȽJ5 p.9',w(&a}+{Ds}+{9cTFɾ,w33ߡ pսᇾUh6~i^L==_N;WVf >oO5@>d̾%LĤ>I>O@8O>>ߎ;=r'A%ӾO@8'=*|4=|~-"d=j+2U(G8M.+>s(_EB|I(fE6LsI>6Lh$޾IyFH¾_E.{篾>3ͩG8澼?鰾+2<$ľ~-n-=ྕ*C ''>#%5*yB-*˽1&Xf4#/w667 M8(b> M8M8 w6%ྈf4 ־1LѽӾ-):{׾5*L+'',&=~)?\>"Qh7 >" -?Փ ?jc?\-?Փ K?6B0 G>F,2>1<)>"Qh7 ?\, ?Ð?+G>F,?\?jc>D=r>=W_P>0l>gYӼX+?$ = >D=>gYӼX+>O?1rW.u>3= c>^=7r>=W_>D= ?:^=;.u>3= >D=?$ =  ^E`EFKD/-{ aֽFE ɶ'oN\@Lѳ"oNPb0ྂ2& ۾ֽ=]ܾ yD/-X ly%^E<7!oo;J",B˼b1ˎuGn,0Ժi(vo3^8 W<ɋ4 W=lQW=GEپW<-pþvo2<︾ԺS'-=9>j=EXʾB ܄= o]6>ǣV >hǣ s=,ޮ{W=*;LA۫#=B0 <;q@S n[v6M'=&&j=hr!>|9b!>K<弾LA!>ݾޮ{|z>\g>􄾶@I>4g3#>qC(S9=(J嫽G=P(IZ;=>,=TY=e,w->hi=cJ`7>l^=|`7>^=JӾw->N>j,=nS8>؏Z;UZ>嫽zs>-(~>^g>4 UV/>!UVGԍ>s563x>׶C:T>tJ)M@5>H =4>?4?=>.?')>>SH>)>A>H>6E>?')>g> ľ=>@ =#>k)M@U><;:y>x6>rjP>"j2>1vt>;O>/AM>?X=x`z>z8==r>+A>Gku>G5>RU>Z G5>>A>.k> ==6>ؾX=f>KھMf >O>ܙv`>cJ0>+M0>`'u]+¶>|H-ś׻J> 0<`>)x/;l=>X$=>=7>= >- =@>JO=>,+;l=P><] > ś׻u*> u]XdX:>SCC=RW1(~_>cMܐWy >?kRWܐWy l6ZBf'JE%ܽd;& {˾1(~RWSwA 'JE%ܽd;RW>?kt9=پ{5=)<7%۾c=y)nQ=st9=پc=꾌 ] = h`E.>zƾuiw=V{5=t9=پY>bh`E.>zƾt9=پy)nQ=s79^ExK^EβD/-׽w v8 ֽifqoNGȽAqDPboNJKֽモ ȱxTD/-Ao=o?J",o^3Bҽ5ˎNe=o2ԺZ ޮ{>ǣ,=/ǣT<>ޮ{PʼHLAdNK0 3NkGS w̽;M'=#+j=Mq!>7q!>W=lBj=q=qھM'=a>cԾS H2>ݾ0 (8>x>LA^|>z'g}CV>v)S >-m=􄾥=(Ng/(=X(Jث[嫽` 7VZ;4$J,=K19w->T_=(`7>=-Yw->m5:>^,=i>徯Z;l>=嫽P>P(]>3"6‹>v5UV:f>GUV[.>8W64=a:5=$c)M@*lF=s_ =.=:T=Y%m=CC?')>z=;1H>>WH>ȧG>Wz?')>ݙ}>Y=B>R =64>>)M@>>]x:E>O0v̟>I?j>^gMj#o>Yv\E>۩`OK$>@bM>l_X=O >RV== >XiJA>1> <G5>W>I-G5>]<> 7"A>A>̬==뤦>hvX=>MM>U$O }>T=u]k2>qE0 >M0j>elSu]>> Wś׻Wt>X<(i>RV;l=f>/RJO=+m>vK={>[C=> <=> 5=1Ԟ>f1JO=>m0;l=S~>L2<>V6ś׻:\dXH>FCC=&.eh B>~羘oj#>e'Ѿz* >2Xu$}>M(V\)I> &.eh B>~Xu$}>MpBG">y QpC>{˾{P_zY>歾oj#>e'Ѿ&.eh B>~LFQO>d;QpC>{˾&.eh B>~(V\)I> J>~ɷ>6XH>eo TN>uNw>ir5^>J>~ɷ>6uNw>iNIܧ>j*>c;m8><)XH>eoJ>~ɷ>6 b>3󗾵*>cJ>~ɷ>6r5^>1^D/-Zs ^EAӽ ^EspD/-w 8  wwAֽX&h "oNX A>IoNI)0ֽU$; d >+=f Bm=Ho#ʽ 0ow #3Bli9=o2ˎ/8GD-Ժ^>$vo5 nWLAt_>m$ޮ{>=Ge2ǣǣ|h!Gޮ{ uKLA^9I0 K0CS ?=8M'=*j=W!>(v!>e=j==#M'=$M'>[=S W9>U 0 '(B>c6g/>vE0B=R{^\gͽɢ`( \^嫽*'WZ;^}K,=o罂;=w->E!.`7>g< `7>U=?w->5>,=Uf>Z;=z>q嫽>a;:g> H6*>VUV~=p(cUV&;Q9AH>=4H>>w,?')>[>((=X>) =^>m0)M@sņ>NOao>*Yv@>cj >a-mjj1=svzF<vO uMBpX=^&7h==@;A=4SG5>-=IG5>ۈ4> CA>8f>u@==J>[/AX=<2>YFMh>q^ś׻X>|du]06?>Ej0̧ >W`o0Ȑ>su]Y=tś׻'=Kt<5=:q;l= ʢ=:lJO=Eo=%g=-=Ra=>T7\=8>X=ߟS>(VJO=8f>`W;l=m>!]ZkiCC=r*>e'ѾFo,[>žu2G>C*a>2WOF>-羯r*>e'Ѿ*a>2$>MA>歾E"y>)Fo,[>žr*>e'Ѿz;#>{˾A>歾r*>e'ѾWOF>-4t? (0 p>PW`>Jl L?yY=?UT4t? ( L?y^'2?F>޾>Ľ/'f>Tׄ0 p>PW4t? (Pɽ1>Mf>޾>Ľ4t? (Y=?UT/' ZD/-(@|^E^E(),dD/-`<) ?ֽ'3" oNiSoUmoN"мy~p ֽܠ=ˎm=B'|<1t$ou--ok` +BQc~5'ˎG+v!Ժ:nnvoBW<W=5 W=7 <{w6=r vof*=Ժ(>߁'0 i=0LAy=59ޮ{w@@ǣ̽DǣN9#Eޮ{1Q{'BLA"zI=9!>h =dFj==`M'=e >S `6>Ln<嫽>n/F(Ե=OOgb;Z7W􄾂Sa[M1\gx%Z(7S嫽k[KZ;#ۚA,=.N28w->PE0`7>ߗ߼+`7>5v=p*w->#>-,=/>3Z;J15>}R)M@׾>[:c=E1d6Kϕ<h)M@rMjH` =q(k]EW=~2ƔN?')>GȽRGH>Q5CH>c=&BB?')>t>"D=.>XJ =ҟ>TfM<=9mO=|svC9 e]G5>ZG5>&i=YA>=?[== ><`X=ǖ=t< =7xś׻c!=A|u]t<,0ߗ߼{0Ey.u]0%ś׻,ӽc}<ؽz;l="½~vJO=ߒ Ns=$cp=,n=)BI;>)Ᏺ.?žC ?ž:J ?歾dž+>)C ?žbH ?о:po=?(ӽ ?(ӽ`m?4Fg?4F/l?S:po=?(ӽg?4Fǁ`d?JS:xZ9?s߼A>s߼ ?(ӽ:po=?(ӽ,?{m:xZ9?s߼:po=?(ӽ/l?S7ֽ) \yCdD/-k^E2@|^E%|JD/-U/' :S ֽ&Cy~'moN]5½ oN]%"B=+v!ԺIo=5'ˎwY; +B$<-ol1t$o:BˎYNԺRr voX[{ W< 5 W=%3[=%ӼW<a!> #j=UPA=I,M'==[KZ;3=7S嫽<%Z(.\g]a[jcZ7WOOgٺn/F(̳ɾLn<嫽Fƾ3Z;-,=F\p*w->A+`7>Ž0`7>h28w-><=ۚA,=M&=jH` = =>h)M@\zm:׋p6 {oUVhoBO5CH>RGH>+ƔN?')>/b<]EW=ǼvpX=svM3oUW{OԤܽN}v -|jNpDyj|svҫ9mOSTfM 糾<`X=_뤾?[==YA>WZG5>T]G5>PVcA>7i==N/z;l=nc}<o%ś׻.u]A{0e,0A|u]t7xś׻5t<咾Qq;l=ɊCoJO=V>?4ľz= ?ž?=|?C=?CB=+>)) J ?歾؀;R ?e'Ѿz= ?ž>;>)B=+>)z= ?ž]>>?4ľE<=?(ӽ3?;^;d?JSy =?4F&=ob ?ѽE<=?(ӽy =?4F=?4F#9?s߼,?{m3?E<=?(ӽ=>s߼#9?s߼E<=?(ӽ&=ob ?ѽL&zwAֽ8  'pD/-潕 ^E%|Js ^EZ^D/-֘_ d X0ֽE)*oN A>/ٽX p="oNG$vozD-ԺJx=o2ˎ#3BU 0o:HoNf BXˎӘԺ|%avo]WiW=8M'=콋0CS I0 ϠuKLA@S!Gޮ{b\>ǣxGe2ǣym$ޮ{tgžLA/˾U 0 Q*¾[=S n#M'=Aj=tK(v!>ӯ!>߈*j=.z}K,=+H'WZ;V^嫽rɢ`(<^\geㆾRϮvEϾc6g]I'(^q嫽Z;{ɾ,=3Y?w->|t{ `7>+!.`7>Zҽ;=w->\=Cg ==an)M@k1uo:÷rk6D㞾p(cUVþVUVe H6a;:m0)M@) =iܾ((=w,?')>l4H>VcQ9AH>S%1O?')>)R7h==IpX=YW uMNyvOЕsvFa-mj8ξcj4*Yv2INOYFM[/AX=u@==-Ⱦ CA>IG5>ԏ4SG5>&pP]A>G6:lJO=8є:q;l=Kt<(ڡtś׻#Lsu]׾W`o0ξEj0Gھ|du]q^ś׻\!]Z<`W;l=Sؾ(VJO=ʾX=2VT7\=Ra=_%g=]2 dXkiCC=>r*>e'Ѿɴ>2>~羮>>M>a>2>>4ľ>r*>e'Ѿ>a>2+>G>Ch->A>歾>#>{˾ɴ>2>~羠>r*>e'Ѿʴ>y>)h->A>歾>r*>e'Ѿ>>4ľu/>t? (f>x?B5U9>'2?F>L?yJ>>wu/>t? (>L?y7>>Jlzv_>>Ľ">1>Mff>x?B5Uu/>t? (B>'f>Tׄzv_>>Ľu/>t? (J>>wmԽoNǽfV̽8 ֽYw pD/-K^EKT9^EZxTD/-Xモ LKֽ:?s$oNN DAK{ͽlWJ",oo'ᄒBӘݾˎ~,־Ժuv{^۾voVT]ޮ{ /ǣJeǣ¾Z ޮ{Sʾx>LAǾݾ0 VcԾS oqھM'=vlBj=[7q!>)q!>D19w->23J,=Xo:7VZ;W[嫽X((Ngi-m=~پv)=z'g;P(|=嫽S徯Z;v˾^,=l-Yw->/(`7>Tka$`7>j(CC?')>F:T=DQs_ =8є$c)M@a:ž8W6GUV\Fv5UVh3"63 ]x:[>)M@R =PY=WҾWz?')>hWH>;1H>XiJA>gRV==1Tl_X=C@bMlѾ۩`O澜YvZs^gMj(I?j O0vU$O޾MU hvX=2̬== 7"A>^ھI-G5>Ǿ <G5>vK=/RJO==RV;l=辒X<_ Wś׻elSu]e@M0[ qE0f T=u]AV6ś׻ L2~r%?J>W9?BG">y >?$}>M7?">оG-?h B>~>?$}>MC?* >2?pC>{˾l?QO>d;r%?J>WG-?h B>~羜(?zY>歾?pC>{˾G-?h B>~羏7?">о ?~ɷ>6cN>G6>gn?ܧ>j3?w>iN?>n ?~ɷ>63?w>i?N>]>>cWv>b>3cN>G6>g ?~ɷ>6[+?><)]>>c ?~ɷ>6N?>n5\'oN Vֽ{ &v+KD/-9^EFNy%^EJyD/-ג@]ܾ a3 ۾ֽ?s$0ྂn oN_a ѳ4 W=e8 W<ʶ(vo*+n,0ԺDCb1ˎ:!_J",By7!oº oˋEXʾB\ˎm︾Ժ7ZTWþ_a-7EپW<"QW=1Hr!>E&&j=xLOv6M'=Pf;q@S ;B0 U*;LA`,ޮ{jwhǣǣݾޮ{Ṿ弾LA^{!R0 ̎@'S y೾M'=Ovfоj=9!Zb!>LcJ`7>[e,w->>>,=P(IZ;Ҭ(J嫽YTqC($Ӿ4g0d⾜>뾱\/^g@-(۾嫽vʾ؏Z;1+j,=p[JӾw->Z|`7>`SH>y.?')>?4?=,ɾH =ؾtJ)M@׶C:Xs56w7!UV9 4 UV~ x6<;:q9k)M@P@ =5 ľ=Ѿ?')> þA>H>c9G5>羐+A>z8==m?X=N/AM4;O: 1vཇ?"j_rjIܙvRO>KھM4 ؾX=w ==A>チZ G5>=.X$=> 9!Z!>Ovj='\)M'=̎80S ^{S.0 Ṿ$LAXޮ{DIǣjw Ӿǣ`#ˬޮ{UDLA;p0 PfQS xLOIM'=EKj=Lھ`7>Z`7>p[w->1+ ),=vʾx0Z;۾.嫽@f5$(/Xg>d0d⾎Ⱦ$ӾKgYTNj(Ҭa嫽PhZ;>x,=[1w->`"ҾH> þFH>Ѿ"?')>5^ =P' =q9&)M@L:~ ( 69 /UVw7¾UVX61V~:ؾb)M@,ɾ9i =J0=y1?')>c9ξG5>G5>A>w==4 X=>MRSOIv_j?f¾j: vཚ4ON:Mm:X=䢕==羨宾A>ξ=] =H m=<6JO=؝8!;l=!Gy OįJO=.p="DIdX"ҾCC=mf?x P$__?̼ $rl?7"nL-p?s_Bfk?3  mf?x P$-p?s_Bf zs?c y U?_A L?bS __?̼ mf?x P$Z]?@d;U?_A mf?x P$k?3  X? ႾR?a/$^?]#b?3'y^?5vX? Ⴞ#b?3me?ܦsRH?\2CFfO??Ϥ^;!$R?a/$X? ႾHP?I*sRH?\2CFX? Ⴞ'y^?5vmԽ3ToO?BG59LԺZ貾voLj=)Ծ!>[Z!>v.+ j=o+M'=V2S Ǿf0 Sʾ(- LA¾ޮ{JeA]̾ǣ zǣ yڈޮ{CMjLAL^0 pS ֎M'=D5w->TkԼ`7>/w侙`7>l6w->v˾ ,=SZ;|E 嫽;'l(=Iܾg~پުil􄾨0Ug̉*(W嫽Xo:1Z;23y%b,=j(4}?')>!H>hɾH>WҾ?')>PX= =[)M@3 :hb26\FUVmUVžQ06:8є)M@DQac =F(I<=-cA>ǾCG5>^ھ5G5>ᄚ*¾A>2/?Ѿ==U վX=޾ξMO *v(jZsWj (vlѾ# OCM1TSX=gH1==Y_=$d#p~=C=.=WJO=I5 ;l= qCC=PhG?om̼ =?au+KF?o"X!K?enLSO?RkkPhG?om̼ K?enLkP?@́Bf';?XS a.?bT.=?au+PhG?om̼ F?UA ';?XS PhG?om̼ SO?Rkkg#I?);>?611_FH?5Dh<ߜM?@8]6Q?!'5,g#I?);ߜM?@8]60&R?h? w.>=?d;0?tI>?611_Fg#I?);H?|R(>=?d;g#I?);Q?!'5,Lz(ݾp=ToN/ٽ F*toNEOUXֽ֘_W Z D/-%|J^E潞о^E';;D/-X~ξ zԾֽG ӼvoGswѾW輨M'=߈j=ӯ8;!>tKw!>AFj=n(M'=Q*¾S /˾0 tgžɶؾLAyޮ{x9Ρǣb\(ǣ@S oޮ{ϠY_LAne0 콋T7S .z],=Zҽ!w->+^`7>|t{ ž`7>3YYؾw->{ɾ*,=ᾗVݾZ;^ξ嫽]I徑(ϾҙgϮ+weㆾA< grh (V;嫽+Ht.Z;+{=S%@mP?')>Vc&&H>le˜H>e?')>iܾoG=< = )M@Տ:eYi6þN1UVD㞾ΏUV÷rϵ6k1w/:7Y)M@Yݽ =)R ؽ==&pMA>ԏa_@G5>)fG5>-ȾA>ݍ==:X=sM2IBRO4(v8ξkjFjЕr'vvNyEOYW9XMIeX=G6MٴJO=_=}=2V>T=ʾ*=Sؾp1JO= .;l=\ #<ɗś׻Gھ~u]ξ5Ƚ0׾c`0#L5u](ڡNjś׻at<8єƎ;l=]2dX1ϽCC=L?+>I1'>W$Y?ڄ"X!i ?~ L?+Y?ڄ"X!?쳩nL>HT.&>>06>I1L?+ ?.PS >HT.L?+i ?~ 2?pX >$[$^y?|Q> ?6N O??cM2?pX> ?6N?+I+H? o0[>w\c >$[$^2?pX?k2M? o0[2?pX O??cM2??&5?!?EwܾF9? ?|о?!?T=HI?G?$?]?B?b?tMlT?d|?C+wK??bD??ξ@??_|6???> 2g]xQ^?~ݽ/\ X?~ݽde?ksh?g]xQ^?N>K6?C?Ur>}!3??ʀ>h0?x?g>!0??N7E>0??Y!>2??>5?|f?s=k9?Nt?,==?d?כ=D@?8?;=nB?/0?0>xDC? ?H)>KB?C?M>s@??Sn>B=?*?L<>W9?X?ɐ>n?? ?>9??ե>ƿ5?e?UH>44?A?4 \>Z5?4?>\9?Fw?U=>?0?D=_E?7?a<-L??=<R?X?! i=V?t?@=W??)>jV?Et?ϔl>KS?L? >d M??Y>ofF?3q?>O??k>CH?!?K>L C?? 7>TA?u?et>B??oC>PG?3?=ʩN?m?zm?ѹ?ׄ>h?y? >a?'$?1>X?@?d>d?N?.>x\?-?>V?X?b>~T?R?υ>qBV?N?->q[?V?&=ec?_?H|E~?(?=:?̞?8N=Q?f?tD>ׁ??i>?b?>w? Z?,>H]n? ?o>rz??>Js?H?[> n??G> l?Ԝ?6}>_m??vdF>iWr?5??=y??ev=2=?=x?)=7?(?+=??=?O?ƥ >?RC?{:[>_??9>??>*N?*K?GB>>?g?ӣ>?V? >?̷?>1?+?`[>ځ??%#>m?D?1d>B??@'>?{?=o?G?=֍??<=EÐ??h>,Ò??65>??s>??b>a ?A?>P??l>?~?>?1?>?j?,;>k??>?/?L >jP?u?>VN??a>ӎ??II>䥐?"?w=>F}?5?5/?>Q?7?~N>['??i>8?r?In>B? ?]>D??1>?R?>'?D?3>k5?5?&<>D?a?z뵽7Yz?4f Ê?%QS?㩾J?$t閈aR?z뵽7Yz?㩾J?h[[ۭ%?Sy'qׄ?>#[x!"?4f Ê?z뵽7Yz?;:M?Sy'qׄ?z뵽7Yz?$t閈aR?05ݽ) W? -`{|^?7H(;i?ܽe?wʽFϽ|?`LGp5C3ay$㽡$9 >p澿P۾Z \ bcӾڽ^Nξ'c;|N/ԽXоFoJ쾖C1=?y=|r=}yE=U@$ʗ:4!=Pn$^=yV='$rξmKվ^>:8>fC%>@꼘.=Z":=( X=p&=_߾X> Ǿ5>ϬZ=F8G =Q}C+iC?eRd1` I% qpYEى]=xTl>h{hBk>+ 'w>PɾsXVc>L־5;N1>Mؾ²=U=A"о>De~13>>=' V=3P)CﻝQ-ý&W۽c ՚3G0qp1=ݝAvv={9uGS@>hL>芾M>]]2=>L=iU>حW=U>)(>6=UmE>jxK?C>a1Cb >ҽ{J=<]"Ͻ#<9ý$sEJPE5 `<-ﵽA5w=@^%>bN-@\b>,b9%D>F&>eXB7w>اxP=]> ||=?+>o>=TE;0>Ÿ^=0%.>y<ט$>f|= ,d{&=σ9rt <,ꟽh=;6^C=)L 8>$%,h>dyV$__>P`d>Ù&V=XI>!>*=E.>M=y>t =s=PiU=7%=#Žr=GI=՚׌=v=qP@=}Y=8IX6CV15>lQg>O>޽ׯ!*S>54g =Ei1?B&>|-`9>*2>"J[,Ei1?B&*2>E*D㯿~n+JE*;q>|-Ei1?B&%`f\1n+JE*Ei1?B&"J[,9i?U}F *KqA![D<:4;JQ*tJ[9i?U<:4;Jz2n{MB3FxBYBcD/t`K}F *K9i?U x`B3FxBY9i?UQ*tJ[7*i^Eȱ("D/-` J ֽt Pbt_oNqGȽFqޮ{(8>(- LAH2>f0 a>2S q=+M'=W=.+ j=Z!>MԾ!>񬽂Lj=w̽֎M'=3NpS dN^0 PʼMjLAT<ڈޮ{,=zǣ>A]̾ǣ^|>IܾgP>'l(l>E 嫽i>Z;m5:> ,==6w->=w侙`7>T_<Լ`7>K5w->4$y%b,=` 1Z;Jث嫽/(=̉*(=0UgS >l}CV>ު]>b26>>:64>)M@B> =ݙ}>X=ȧG>?')>>ɾH>z=!H>Y%m=4}?')>.=(I<=*lF=ac =5=)M@4=:[.>Q06:f>mUV‹>UVE>*vM>O>ξM뤦>վX=A>/?Ѿ==]<>*¾A>W>5G5>1>CG5> >-cA>O >H1==>SX=K$>M\E># O#o> (vཛ>Wj̟>j }> Bu]>ś׻S~><> ;l=1Ԟ>WJO=>.=>C={>#p~=+m>Y_=f>)uDJO=(i>H1;l=Wt>Hc*<>>f-/ś׻j>?u] >X0k2>>qCC=0~om̼  kP$|փ@́BfԑenLsu+0~om̼ ԑenL}o"X! sXS ~UA  kP$0~om̼ ebT. sXS 0~om̼ su+2);cp'5-h? w._o@8]6uB0zF2);_o@8]6H5Dh<td;|R(cp'5-2);^gtItd;2);uB0zFX l9 ^ED/-=x 2&iֽPb"g oN@L{dɶzoNFE پaоֽϾ `EF0PվD/- ^E ܄=~o>j=A B1q$=%ˎ2DIǣ!>Xޮ{>$LA}=S.0 2,=80S 'p='\)M'=K<<j=|9!>h!>Kj=n[IM'= Ӿǣ|z>d~>Xgzs>f5$(UZ>.嫽nS8>x0Z;N> ),=^=w->l^=`7>hi=ھ`7>TY=1w->=x,=G=PhZ;S9=a嫽3#>Nj(@I>Kgg>Ⱦ􄾲>/UVy>( 6U>L:#>&)M@>' =g>^ =6E>"?')>)>FH>>"ҾH>>1?')>4>J0=5>9i =T>b)M@3x>1V~:Gԍ>6/>¾UV>j>vf >SOf>M6>X=.k>==>A>RU>G5>Gku>ξG5>r>宾A>x`z>䢕==>:X=>:Mt>O2>vP>f¾j`>ھ0u*>*u]] >ś׻P>Gy<>8!;l=@>6JO= >m=7>=>ξ=oء>p=>OįJO=`>v;l=J>X<+¶>ś׻>طu]>pǾ0XDIdX:>"ҾCC=~׎x P$㑿 W]c y зs_BfW ~׎x P$зs_Bfڑ7"nLx_A @d;㑿 W~׎x P$bS x_A ~׎x P$W / Ⴞ4#MZ%ܦ3^~*KR$/ Ⴞ3]S\2CFNŃI*4#MZ%/ ႾEvϤ^;!$S\2CF/ Ⴞ^~*KR$,=wY* =@ Y*y =7H=*J= 4!vͽ΁=C!DRi=!8\= DPAc8=6!=&4!1=5PAc0=yt#=2426~!>5'"<7>\D=&E>eK\D=7G>"xe׾42SM*>5ȾW>žb /=*ϾC7ܫ=o;=), Cs\=+կFi3_)>iHTĽ`P>>A*gt>3=> =H>T =>'%=%> ɾ*1>TĽ]>ti3$6>n'>{lܾ CQC>w Ǿ5[0>b' Ǿn->22[:>\DSV>FUO\O{>3Q>,IƍMҦ>.:*-<ī>?%pF2= >TpF2=>>*- ˾ƍM~ >঵A>鱾\N>{b>#߾2"> "4GJ>0E>[OLb>|P -ڽ>J Ž#>x;r$>(&so>r&>3r$P>ھ Ž>ƾ ->}þL,>оƝ>EC>6']ɾ>Q!']ɾn>1]sCR>u>p> FB*[>$`GW{+>9B_@>b7u>(o>"o?mf>>fW羐W]>B5>pRx>V]s>,z>!>֍*1 x>yn1g$>p5.>A6;z>x3[ؒ>Z-.CQ??%6?v6d?0.C? [>;z>s=.R> g^ >1Uk= "> @hvv5E0>DcS>2RwjB>4yw>cn+0售>hvv5E0>4yw>}+t>S<>FL8>DcS>hvv5E0>[S Z>S<>hvv5E0>cn+0售>}v@w=>=;e=>+*O%>-Qd8QV>\FR=9>}v@w=>-Qd8QV>eUG:D}>*e=M>?$r=O?>=;e=>}v@w=>36=>*e=M>}v@w=>\FR=9>;I=Y H9s<Y*t;Y*@k"HfWg)Χ 55.vͽB ;>0DR+PAc=$!8|=cS!x=}PAc={~=H DRZ4=vͽ# =Nn=oZ<.oiü;C[jDn K;.HW=BF42=L>"<=V3\D=U#>09%\D=S=>"<:H>{ 42C>(~?+>nn [>vCW^>>? CR<+< C|:HMn$MQ==JF>HB=w> !0=%>a5=> *AƏ>TĽ >@Wi3 T>B^nkd>62L'>! Ǿ^=ܔ5 Ǿ=J29v=[_=ih\=8m[j>kƍMT>`*-<>,XPpF2=>a2'*-<>ƍM?c>fw t>$\>E>< &,s>d/AnT->%Fe>pL:[7>/u -ke>Gs Ž>ir$8>Z&x>QH&?>25r$>$ ŽZ> ->(Lpӱ>d>3]skН>'>']ɾ>L']ɾ{>8[]s)p>TgpOw>qpBj>tW4>rVۭ>Ckx><_o\u>ÌQoڒ>C>m6>-Wx|>J)B>δ+pX>F1Ѻ>L$>lT>y\1>TQcgU>h.n>)j;zi>i[*>w(e.CC>N^6^y>=W6n>egO.Cz>ΏH[p>C;zg>A.>Bga=u.>ZSX@p*73I=>9E<0{?pO<4,>azN8=_>p*73I=>aoOZ=>Sus=>"_?9E<0{?p*73I=>^i!y_=>Sus=>p*73I=>zN8=_>3>7?t>>#9?ԐXB> T?!>(_ ?]V>#?3>7?!>(_ ?4>ʖ?+hs)>I ?lǾ>=l?t>>#9?3>7?ľW>>+hs)>I ?3>7?]V>#?A=t <[H# Y* #$Y*Hƃ)Hv/˫m4vͽ~1z7DRcj@W8A16PAczD9V3!P<;.!,p_=Z(PAcmh=."м=DRp=vͽ=+C=Mo4o4/ ^?CW.Hn vཻMW2m0iO42A$ѼL"1"<"%>O'М+>~fW>In @>nK=G! C?^D CIRnn]i3xB*eTĽ?g*7c=^ϖ=Q,[=,>N=Q>@=% x>2* >6'TĽnn>i3oz>u,!3>}02m=9 Ǿ1apF2=~>`rR*-aCƍM.>6p>.\>A3]>(.E:>M]&!u>r&>%dr$>V Ž>K -1>CLd,>Ypw>&2\]s=>b']ɾd>W/l']ɾ = w]sf=|ڀpH=BB{&=Wg/=)>G㽄Q>@o4Ƅ>]o|>4t圪>iu>W`W>!d>pgl|>r1)q]>3u>>z%%>H1>*g>k.>;z"->4[ H>,Ȇ.COg>6Y4>t6>7.C>VCy[Ù>/~t;z˰>qq.h?%0l>O@r*]>0{??2>p?2Bl>> >4,>3_B>5y>r*]>0{? >4,> l>jB>ξ">?.p=w ??2>p?r*]>0{?EZ>>ξ">?r*]>0{?3_B>5y>Ye>+?ЌC8=1?)LT,>5%?ٽC>!?5f`F>q ?Ye>+?ٽC>!?ѡ~Z> ? 9=-?#+vɝ&=5?ЌC8=1?Ye>+?J+">-? 9=-?Ye>+?5f`F>q ??{iC5An dvGWQFL42|!O"<ݧِN\D=XAK\D=Jf*=0Fc<==>42'B=47W͢%>L>i3K=8n'n=I~5 CCzLQ*P,>GTĽ8H>R\D>8Kê=ܢH2ߏ]I ǾT]Ž N Ǿg6gU2_&tq_hj\c焾s ^zƍM ~*-<\t L}pF2=a=xpF2=b=p*-<)2>fƍMɲO>A\TG>IiL?>Ebx=_*#<`{ Ži=N>q -x#>~B`>Cyp̣=ؔw]sŒ< x']ɾ-Ah{']ɾ ׽]s>pJ+򺇿Bm& W,}_s᪎_ho$3=o=󉿱>pnd(>[Wr=.:=gBkT=P1­<BX'f'F1eguM~.``;zV[_U.C٫<16a=gL6ř=Gȍ.C=[=q߉;zL+3<U@Jl>p?*rA>p?->>୵>>[0>=>?Jl>p?୵>>k`>4,>OQE>w ?_J24>w ?*rA>p?Jl>p? ub>?OQE>w ?Jl>p?[0>=>?U=`7;?BtSk=`7;?>S+->.?/ 5>.?{שJr=5?U=`7;?/ 5>.?.A>e]+?2s??(NKKj>??BtSk=`7;?U=`7;?;(1= v7?2s??U=`7;?{שJr=5?=iƃ6DR^2vͽ[.Hl+H,(Y*cRF&Y*@%HK\LE'xlN)vͽo-DRqd/1"LR5PAc,Z8!%:!̽Ym:PAcӧ&9&;vGW+O42晃E"<KAK\D=х -O+A=!O"i3gľGTĽSzLQ*`{Z=Bha=>F%f=xf=Ӟ;c*3=sQ=hj\p?0S>0{?_<`>4,>8=୵>>"ߢ=V/>"3?4t<>p?8=୵>>s=->>TQE>w ?ub>?0S>0{?4t<>p?wm=J24>w ?TQE>w ?4t<>p?"ߢ=V/>"3?YU=`7;?}={B5?뚽.A>e]+?5 5>.?  =m:?YU=`7;?5 5>.?d+->.?<{ѽ2s??p}61= v7?}={B5?YU=`7;?ʍKj>??<{ѽ2s??YU=`7;?  =m:?"@W8H1z7DR!m4vͽ0L /[$)H@4$Y*_R Y*(r[HÆt_vͽrDR]."qZ(PAc{;.!8]V3!B=16PAcP0iO42ߘٽMW{.Hn ʽ ^?C4oMo+C8˼In Rľ~fW~y6'42ֱ1"0=+A=|*F\D=BL"<?g*ؽB*eTĽ2]i3NŽIRn^D C}G! C?ξn.徍i3T6'TĽR2*j׾@= N=7Q,[={\c=?@g:|ƍM y*r\l_$e,|yV2enXG Ǿ49 ǾȾ}02u,'z.\6paCƍM=u`rR*-<ԥԾapF2=b(opF2=Ã*nx*-4tI]o׾@oGž4[x;zek.z*gfH1";zT<ݾ3u쾫r1$pgEqq.#/~t;z?VCy[iF7.Ct6p6EҾ,Ȇ.CxN?%0O@/>*]>0{?n>7+>>ig>l>jB>S>>4,>ᆜ>7n0>"3?/>*]>0{?S>>4,>>Bl>>Y@>">?u>EZ>>n>7+>>/>*]>0{?oV}>p=w ?Y@>">?/>*]>0{?ᆜ>7n0>"3?N=e>+?L&<2H>e ?8=~Z> ?f=C>!?=={1?N=e>+?f=C>!?Ԑ>T,>5%? =-?y+">-?L&<2H>e ?N=e>+?"<ɝ&=5? =-?N=e>+?=={1?$>+PAcCr/4//_>0DRR55.vͽȈOg)YUk"H%cY*wY*ǾY HFNМvͽ颾H DR{ݻ}PAc͢cS!mm$!dL>"? CؾB^nT@Wi3JTĽ: *pa5=N !0=ިѾHB=;ؾ`*-<kƍMʡ8mۑih\fX[𔾝J2}ܔ5 Ǿ,*¾! Ǿu62  $\fw %5ƍMh2'*-<" a']ɾ3]sδ+p$J)BQ"*-Wƺ+m6M )C㽍|"ÌQo<_ow(e.C>i[x)j;zil h.Z TQcgi y\1lTLF1lP Bg%A."(C;z&(ΏH['egO.C#=W6N^6~u[YZSX@">3I=>?R=E0>?Z=>?eS=jB>#?ښ<=>?">3I=>?eS=jB>n?<4,>#>us=>N>y_=>?R=E0>">3I=>(>_?#>us=>">3I=>#?ښ<=>?ꑁ>3>7?„>+UW>?o>4>ʖ?˵>!>(_ ?>z>0?ꑁ>3>7?˵>!>(_ ?靲>XB> T?#>s)>I ?,>W>>„>+UW>?ꑁ>3>7?1>>=l?#>s)>I ?ꑁ>3>7?>z>0?M6!͚ DPAc!vC!DRƇ 4!vͽ*7H!@ Y*wY*S(HGǑla˙Fvͽ}6n T<.C靆0"ozo*ϾC`$žn iþ5ȾW{ξ׾МҾ"<.ѾeK\D= =s3=o־>A*3þiHTĽֱկFi3+*-Xо}þLk!ƾ -(ھ Žn&+3r$y*r&b|3(o-b7㽝&9Bto$`GWA FBu>p1]sQ!']ɾc6']ɾV]sz"pp)B0fW羐W4P796"o8?%6L5Z-.Cһ1x3[-A6;z *p5.}'yn1g_7&֍*1~&!I(R+1!/ g#3s=.i6;zk_9 [:0.Ce^:v6  4 @\1?vv5E0>8?,0>LF?+t>UB?w>+?BT5y>\1?vv5E0>UB?w>S@?jB>?<>$?S Z>8?,0>\1?vv5E0>fy?8>?<>\1?vv5E0>+?BT5y>4 ?w=>?ڃ=n>#?G:D}>N?d8QV> ?=>4 ?w=>N?d8QV>L?%>]>e=M>j>6=>?ڃ=n>4 ?w=>>r=O?>]>e=M>4 ?w=> ?=>M*!@{0!.ШPAc C' DR˙@evͽGǑ S(HaY*!G\Y*)ھHth̾Ƈ0ľvͽvB¾DRgUȾ͚ԾPAcwʾ9Ծ\D=.Ѿ\D=Ҿk "žn NpXÖ~?-G42B]"X<% gWsyM?$ K>Q?G>NO?>yA?_>9H?>NO?>K?y>F:?γ Z>j@?"i>yM?$ K>9H?>1??㾩>F:?γ Z>9H?>yA?_>AE?+hvG>J?cL>N?_N>GL?ťߔ>r>?Xpڼ>AE?+hvG>GL?ťߔ>&H?W)>?7?5 \>s=?K]>J?cL>AE?+hvG>.?`.% >?7?5 \>AE?+hvG>r>?Xpڼ>~PAcmmϪ!͢˾!ݻ۾PAcM龟颾7DRМDvͽF+ǾHwmY*%c&ѾY*YUyHȈOʳR].vͽ/_PDRCri0d/"oѽ[~QӾ[Y&+@%8?EcK>tv5?Ip_x>>3?|^>Mj5?uG> 6?]vZ售>%8?EcK>Mj5?uG>>4?p>1?$Qi> .?jbc0>tv5?Ip_x>%8?EcK>3w/?,LF Z>1?$Qi>%8?EcK> 6?]vZ售>R?0=O?<߉=yN?mH>O?&B9.>P?/&;)>R?0=O?&B9.>O?X=N>L?DW=IH?.fO?<߉=R?0=I?>L?DW=R?0=P?/&;)>"HꕾB=fҘPAc8]v럾!{ !q䵾PAc]llrʾDR_ѾvͽÆҾ(rϾH_RȾY*@4PY*[$}ϲH0L G!mvͽHdDRPΌO42BJZ"<|t\D=͢\D=ֱܢ"<~y+42RľɾW8˼5վn  AؾC-Ҿo*oNͽ_D{ywln ߘٽUWc*{\zu=7L = Q=j׾L=R"*T+TĽ.徭ƾi3?ξ˾n} ľ C{ CNŽ\ Dn2i3ؽ TĽ?@?ƍMÃ-*-pyqR ?ͽ|4< W/ B&'pgh]sp;-']ɾ5e踽']ɾC]s_x˻pE_x>6>2`̽`>Ƥ>K>3>Z^>8?+cґ>i>_x>3>Z^>,>.xG>KQ>c0>@>6>6>2`̽`>i>_x>8?'i>KQ>c0>i>_x>8?+cґ>?fxߝ1?zȼh? =?.ޡ=j"?['=?fxߝ?.ޡ="?.S=1??Ӊv, ?^퐿jѽ1?zȼ?fxߝN#?ނw1??Ӊv?fxߝj"?['=6(?V?nd?SN^?0?8Cd?bξ&?||g? hྐྵ?||g?Wz?8Cd?=ܒ?SN^?dđ?V?A1lŀ?nN?*~?QF?NiE}?+\@?6پ}?"=?11Ǿ?"=?]?+\@?[E?QF?ȥF?nN?.0?@T?_ .?&c?4ʮ[?N(n? ξ?3t?q?3t?V?N(n?d?&c?Ok?@T?$z?4E?^ ?6?!-`{?u+?i⾄?%?Fpe?%?kCw?+?m؍ҷ?6?gk?4E?%hQ?r0O?Kꇾ?ta?iS:?[p?Ҿ?=$x?>&?=$x??[p?_ w?ta?g'Ƞ?r0O?%kI?#:?L?!(?& j???X?F?X?f??L(|:S?!(?l=a)?#:?EBg5?F?&*?aZ? Ԫ?j?پJw?r?`?r?O)?j?M( /?aZ?00@?F?gR.R??˝0?}#a͑?|G?"? ?I5>Ҿ=?>5>???2펾?iD?wV?j(?Q޶?Y 2?5qN?k@?;&|?gmK?:?KbQ??KbQ?`ĵ?gmK?6!??k@?E]&?Y 2? %9?y"?sgɨ?1?޽? ?rݧ?!? h?!?C¾R? ?#د?1?ᬢ7?y"?nϾ2?n%)?[ؾ?0?&?6?.?:?`?:?{ ?6?!uϱ?0?>?n%)?_? ?kޒ?? ??a?`??`?߾|??NԾd??(uξe? ?Ҿ(с??.T?>&^&?#?'of?q1j?#xWG?m3?ٽ5ے?'of?m3?8??'7?2~?q1j?'of?1Q3]D?~ݽ/\ X?(M}*]?m>?Q?>-Á?Z? >й?"a?'>>?g?\t>i,?Bk?lP>"?Xk?8->[?/h?=>Ї?@b?Nv>ߕ?4uZ?W_=ۄ? Q?>?J? >}?7D??>~?ο@?c>q|?ҩ@?,>-|?C? >b}?I?>3G?H?>x?GX?/>@?Vf?m٧>?5q?4U>x? x?BR>=?/Ix?>a?pr?=Y?x{g?=a?Y?6i=0?kI?>=?i:?\= ?/?3> 1?0)?v>*?/)?B>?B/?V>?H8:?>n?Mc>?>?R?P>X?e?i޿>u?!ot?M>檛?5t|?[>?H|?>?Gu?-q="7?Ҵf?[? ?sl>o??>K'???w|>w?n+?w>h?2g4?O>?{J?>?H_?>+?n?Ф>i?9w?Nk>/?w?Ѯ>(?o?s=K? `?< ?LK?<3?5?dC=?6 ?e=?,?@>gߒ?E~?K>]?D?P>Ǐ??=>2?^ ?>X?0,?H>3ܣ?\@?>?۟S?ȭ>0?_t?sAj?[w>a=?vj?hH,>ȳ?b?=x?T?$=?0A?c=+U?`;-?@=?@?n >Z?] ?ȴW>D?I?;>?5j?J>h?7 ?K>?^?y>㍪?v&?E>0?6?c>_?.E? >?\P?=>ž?NV? >?V?iT>?P?-!> ?6E?,>?s7?==Pw?'?>֯?'E?g:>S?I?إu>w??>?N?ۻ>oG? ?y>wH??l>Y?I%?J>B?r.?W> ?5?#'>S?F~}?S??5>s?i??e>??!?Q6?tW>?.?>.T>,? &?&^>6?[0?v>O?"?>fò??>ͱ??,>,?`?9 >F??V>+2?W?*ٙ>?B(?݇Nm})?TݽY"?6鎽)?@تx?׏s<:X?݇Nm})?@تx?qdX2zu?%McA ?k< ?TݽY"?݇Nm})?B =[ۼ ?%McA ?݇Nm})?׏s<:X?HݽkW?)83^?wgrrr?Ž o?&/ɏW?HݽkW?Ž o?Qz½ o?ܽ{SF2D?c;^ɾ`+h=Ծy(>ɾjf>)>4<=ߍ|J==Ҿioy?>ʾ |rl>cž0~>8=r>K>c%N= >R?=Y=L"y= =lٹ^@Jƽ= Db4_KwFSwK}œ=XþA&z>𬫾`H>eXi=>FШҘ>7a}[d98>BLzN^B==0=?=V=>5eQ<<;}v߱H&M* WFԽ6\q2?gH 40$a鴾[>^ >l ]'>9/ > 6.l>d;\=GS:оrW]>Cu?>y8#}*>^m>K_P&>3ǽ>>f&ֽM>^qpç#H>1<7>==#ڽP]=g=Ff=%M=gS+v/=u>Ҵ/Ǿ;>\Ǿ&u>9j>a⚾Y>,)y>n^mtʟ>1?U[>c=> <0@=`><61@>*=~>%>A=V>3='vi >=8Ǔ>x]k zd:>nͭY>ͧOvx>OX3ۋ]f>S;;9'u1dg>I9vr>/HAè>+>NP%ɢ'=O>'u1dg>+>%>}/ʕ~>9񎿨X>I9vr>'u1dg>Da >}/ʕ~>'u1dg>NP%ɢ'=O>J_Q3mŝlY#0(C+>n d&B>W:H>e42S=>پ"h&\D==v럾\D==/"<=)t42K;ywlW[{n iüFC=2pW^>K C T>Cn > i3AƏ>5TĽ>r7*%>.̾=w>V==JF>7t={ >YHF== *=TĽ$<))i3|: XnR*2>t>O\?c>󾰼>ھƍMN>cʶ*-<>ԍpF2=>KpF2=T> 2 *-<[j>ƍM=Yѫ_=gֽ\9v=n=d2^=o ǾL'>[þ ǾE>ƾpӱ>?پ>G޾LZ>pԾ ->< Ž?>3r$x>Ll&8>a"&>̽r$ke>% Ž:[7>EX ->8bL->1>+:A>C킾ϧ]s>+/px|>3B>倫W>ڒ>u\u>Fox>oVۭ>"D4>}j>lWOw>oB)p>~x۽p{>PN ]s>;Z']ɾkН>zX']ɾX>Nr1>gg>(.p>&+~;zz>Xj[n>O.C^y>:06C>U6*>i.Ci>oѽ[n>ɽ;zU>fٽ.>g>J1$>ߣ:Ѻ>B2Ya=QӾ.>&+@goEcK>Wm'Z>kp>,luG>Clow>goEcK>,luG>8k|^>h$Qi>f,LF Z>Wm'Z>goEcK>Lejbc0>h$Qi>goEcK>Clow>0=})"'|*>`)X=N>藃&B9.>cZ<=0=藃&B9.>݂mH>2DW=[>})"'|*>0=(.f2DW=0=cZ<=,=aY*$]=H= =@evͽ#=DR0=' 1=PAc={0!8=*!8\=ԾPAci=gUȾ΁=B¾DRJ=0ľvͽ=th̾y =)ھH =G\Y*7ܫ=o/=O]C>у n SM*>n1WS=>427G>k "<&E>\D=7>9Ծ\D=6~!>]"G42g=W==žn >o=_DO@=8¾o'>& C$6>r?#n]>*)i31> @(TĽ%>_T*>й =H>=>lƾ=gt>㌟=`P>L:*_)>kTĽ>;rri3s\=qn;=E CQC>a Ǿb>ܺ2N>#A>W*\~ >x(?պ> ƍM>E *-< > pF2=ī>J~pF2=Ҧ>lj*-<>߄eƍMO{>?bHSV>xO\[:>zn->Y25[0>Jξ Ǿ">Ws ,>>!L> -P> Ž>JMr$so>&>&#>׳r$ڽ>~d Žb>I ->"PLGJ>nxy!>l${>3ƾ*']ɾRx>]s5> p]>B>Wmf>?\㽳>־ou>o_@>җ{+>%*[>oW>tBCR>Ԭpn>M]s>&¾']ɾ>9Ծ^ >q1R>g>.>;z?w[d?h޾.C?܃;6Q?J~6ؒ>d.C>Ȩ[>;z$>烛. x>ջg>}1,z>¾Uk=Ws">lƾ@>DyV:E0>{y>VH> / ґ>>VH>יG>qγ Z>h?㾩>DyV:E0>>Jw"i>qγ Z>> / ґ>!|+hvG>=vq6>W)>āťߔ>-K>!|+hvG>āťߔ>[_N>n5 \>e`.% >=vq6>!|+hvG>RtK]>n5 \>!|+hvG>-K>fn5>{ K+C.>~K+wk4>rt %F>@% c>)M=>+^} >)tb>$ս>*HY˽_>bHY˽$>y սQ>StZC>"^}>]M*e>18H>G %w>>y5n=y>7O&:p]%>@4-^PY>u=F>f@-+>c3$r>s.%Y[p>Y[>z$r>g~Ь>پ-e>Ӿ&H]>$ھ-^(>:p=@ -HrK5> A?󧙾 c>HKO@ۙ>$KO}'swk>VJ5XTe >F ><y>+0M?0>,:۾5XT ^>þ}'s >ֻO@7h>ž󧙾\#>+޾Hrw>b0Ծfn5>oTD@Ǿ~>YQ򓶾>ٰU>Pۓy>C ?/0?x0 ? 3>ؾۓ.>꠾>򓶾>:󿾂@ǾP:>۾ԾP:>>)>P7>L}0۹d>BZC>Nᾼ>1RQоK$>c Ns?RAY?/G?BG<5?Y`?S⾮s>+ʾQо}ſ>¾5>˾*i>۹>{ e"x>""e"l>,G Iג><:6.Ь>>C IY>F>_C@?99 ?+a޾?a޾ ?Z Cy?>hw>E I;>)X6.P>G > ">"B >%XjO>V-:_ ^>#R2y. O>V3l Q>g2J6>,3>s.%=??+=k>5%> >Yl c>&y. >:_>>! X~> .>*?ӽĬNp?V.3v?: پd~?Ͼ64{?u&_i??ӽĬNp?Ͼ64{? !#ȽpSU?=.] e?(=P$_?:lUIE?tI=OM?(=P$_?`漌ަ5X?v->k! %'>a&K+y=M.K+k=,7 %m=? >16GML'>K^}|I>ccMtdl>TKսr >mFHY˽@>q>HY˽GD>5սby>,tL>%^}/Ir> MOP>k\$>o:pa-W>cg~Zɋ>_$r9>/VY[c>GHY[ހ>7$rW>w'g~ī>t,I/;>+OFc>-^B+> Hr#< A?Hr%1=^T󧙾V= eO@y>Xeq}'sX o>bt5XT>o<0>@c0p>P0M>!g;<>I&5XTzj>}'sm<>B O@s~>󧙾AzB>{ Ծ],*=oTDԾ7d=M/[@ǾK)=2>n򓶾3>Zz> b~ۓ>yB>Kk0Wm>dUW03>K)@>mN)ۓl>?p>` 򓶾C>@Ǿ"f>۹o>oᾣW>:{Qо>~sI>yYg>vmG >;ZG^?10s>Qо>bᾓ>Xef>ƛ$G Y>M.e"24>rkLG />C\6.8Q>*qj I>.sCW>uK-> rp>[ha޾Tz>>Za޾>~Iܻ>N9쾔>g8,>{# Im<> 6.>(9XM$>Mh>"> F"y>NX]> W:_>^y. ( >cl >O!eB>c>Y]=UQ>/V=T>QM>D}]>G=l 5>8y. 8>W7:_RDG>e5>6Oʻ+>Ͼ3v?Er;z?; X k?6پd~?&Fo?ʻ+>Ͼ3v?6پd~?j߽vD˾64{?#=̾}f?^=bl?Er;z?ʻ+>Ͼ3v?D6<|^?#=̾}f?ʻ+>Ͼ3v?&Fo?>xFon?t>`Vr?<>(gy?G7>骫Iv?Ym>sZg?>xFon?G7>骫Iv?!$>os?>ϔҸ^?x>Ⱦd?t>`Vr?>xFon?>vW?>ϔҸ^?>xFon?Ym>sZg? >;'=4: %6=W6dHY˽.9#>_HY˽68>#`Xսq@>Ot齹:>uDG^}?'>C0@M*6>.-^=l+:pO=!/yI8y%s-[HF:pCj`3V-^h?eFXNsr-O#=s{g~)D=~$r,+>SRzY[{c>pY[5>+c$r|>pSs,w>7C-k>z6F]\>4_(󧙾>@%Hr"XHHr!\󧙾w"XeqO@* />}'s(=dž5XT= w<,"N> 0>:0I>|m<8>8 Y5XTm<>D}'se>q3O@w>+@Ǿ65>'Ծ[MԾ[hd@Ǿ Zz򓶾A쌆t@=ۓ >^ 9h>羋0>0u>qv5>=`ۓp> J!>K7򓶾ف>7=/> 3۹^7=I8;l}ҏYgxu>fG>=G>F|Y>gs>@SQо>)Bᾇ~> 3I6.>>FG "=SJe"6=BSe"Ŝs>&Ša޾(> a޾R>]~c'>rnΫ>/^T>Q Ii>P"_:_F>޼]X#>_">Hd"~=FlX=bt:_B,=a}y. >:l -> *@>8{c>7=o>=&>d{Z>Ksό>jl Y>cy. =6ORDG>u*,d~?W=2bl?L< lo?L߼V@"(}?*,"W#z?n>/u|?O.>[ʀ?C>2C4!?>Su?݊>"W#z?C>2C4!?%K>ХI}?>,k?>I>n?n>/u|?݊>"W#z?>Ge?>,k?݊>"W#z?>Su?KK=e VM#<OA5:aJ % HK+[JK+˽|O %rVa-_Mxhg^}Ͻ pntD=4sսQtHY˽hݺxrHY˽A0GSF̷=F-^U=# >:p44;yg>y{G:p>? T-^\NAdFA{s-Vg~=0=rg~ > c-8>e VO@>tE󧙾!|=9Hr895FHrDjW󧙾|p}wkO@bfm(}'sH= w5XT<W돿07d=0d>懿<Ҕ5>|~5XT H>5j}'ssJP>]򓶾65>J@Ǿ=>Ծ9>JKԾ6u^@Ǿ~t򓶾w2/uC^ۓmbṼ p0=0R>ԥM>cۓݦa>xr"E>hgӷ>pVT=?K۹ZGgJK*W۹%]hJo)}0_IQоw/A%so1ͽ/Y@왘G= pG4>ߔYeC>쇿s{Qоp@>{s I=Ʋf6.zv=W!^G I[e"[^e"ɏgG 4l&?t6.S4* IJ(ቿv2`)aꨔ⾐ca޾7d=ma޾=񏿝a>vQ&>X=(y. 6{=x:_9=KtXş亥r"Q~t",sfyXg8I:_½x|y. DƴIl r錽,!{~ֻC=$<^=|y=#񋿍+R=%[='l Q]hݺ2/Uh"(}?}E"(}?42?*2?*7)z?Uh"(}?*2?GrjP k?0}^*lo?'G /lo?}E"(}?Uh"(}?܇&=bl?0}^*lo?Uh"(}?*7)z?L=[fS,z}?L=[fcUo?R[=Gnr?L=[fS,z}?v½hg^}L-_MSĽV+0|O %JK+9HK+]aJ %{O1퇾e VM?f^^}kft齇 zmսK[xrHY˽@7QtHY˽h4sսHs pnt{ټ{s-*oAdF T-^{G:p>yx>4;y꓀# >:pvF-^ாGSFI c-񭾷rg~鼚-$rä|cY[8:'rϞ$rVg~<(}'s=wkO@T^ԾZJ@Ǿ־]򓶾.W߾xrVվcۓ<-0RE p0zDнmKʼ^ۓP#;IQо\Ɣ<)}ᾯ8hJHW۹JK9XSG?K۹_pVnѾhgsپ{QоA6о쇿s!ߔY pGL왘G/Yv>6A%scRቿ!* I)mZ?t6. ɏgG ^e"sXI[e"VW!^G 9Ʋf6.{s IMvQ񏿝fma޾ESa޾Vꨔ⾾!2`\Il x|y. K8I:_7qsfyX37~t"?>[r"KtXx:_(y. (웾'l J%[T#񋿍ä|^=XC=4{~Œ,37]K[2/)""(}?8[z?J jP k?*2?}|?)""(}?*2?2?2h<^*lo?Tbl?8[z?)""(}?ʽ /lo?2h<^*lo?)""(}?}|?[f}'sC XeqO@7!\󧙾nHHrw@%Hrܾ4_(󧙾q3O@` D}'s 8 Y5XT |md~?0y k?Ap|?AgDz?0y k?(P)2?2bl?~흾Z}f?d w:3v?AgDz?Qu lo?2bl?AgDz?Ap|?sa"W#z?}#Fu?RdԾХI}?Gо2C4!?<澪/|?sa"W#z?Gо2C4!?gž[ʀ?Ժ ,k?(Ge?}#Fu?sa"W#z?I>n?Ժ ,k?sa"W#z?<澪/|?TKսzӾccMte~¾K^}V16GM)?^,7 %*bM.K+a&K+pžk! %־k\W羾 M%^}!,t5սq>HY˽2mFHY˽M_$rwھcg~a-꠾REXFlJ-^Ί<::p*9?*y""y3o:p;\-^c+OF1 -mw'g~ 270MGHY[ /VY[:o< bt5XT|Xeq}'soٚ eO@䳄^T󧙾{ A?Hr5%ľ Hr󧙾` B O@w}'s'I&5XT*!g;<&P0@c0/y{p b~ۓ ȾZz2>n򓶾fM/[@ǾKɃoTDԾϾ{ Ծ@Ǿ` 򓶾'?3mN)ۓ6K)@x1dUW0"$Kk0yY~swھ:{QоIoy#4^eI۹ 3NZa޾&[ha޾"cE O!escl f^y. : W:_8oNXr F" Mh>"@(9X W7:_l\8y. pG=l #DDl$QMj"/V=OY]=%Ҿe56O*)W+>Ͼ3v?B5^JNp?&ڽvD˾64{?/پd~?9bSツ)z?*)W+>Ͼ3v?/پd~?X k?̏̾}f?GNs|^?B5^JNp?*)W+>Ͼ3v?bl?̏̾}f?*)W+>Ͼ3v?9bSツ)z?@xFon?徬h?Pos?'ʾ骫Iv?dr?@xFon?'ʾ骫Iv?̾(gy?- ϔҸ^?g vW?徬h?@xFon?!~Ⱦd?- ϔҸ^?@xFon?dr?6 *HY˽A$սE)t齇+^}E)MѾ@%{Ⱦrt %@ž~K+:ɾ{ K+ҾG %Fᾙ1]Mc"^}jSt y սbHY˽"s.%Y[c3$ru y¾:pmݾ$ھ-^xӾF9 پ-:T&s]8#z$r&Y[j~5+0)F >1RQоcN9BsʾL}0۹þP˾>۹˾$¾PM++ʾQо@EC I<:6.+8𾹰,G ""e"d'{ e"G )X6.PE In-h":쾑LCZ $Fa޾6s.%=1,*g2J"V3l #R2y. V-:_F%Xc "< "1a! X-:_"&y. PM+Yl T2 65ҁ8+= !Y$*U潟ĬNp?VHGi?ϙn|̾*w?Ͼ64{?;(Equ?U潟ĬNp?Ͼ64{?{Լ پd~?^$^?0fsV?VHGi?U潟ĬNp?bh}f?^$^?U潟ĬNp?;(Equ?}P$_?;Z?6X?O*f?K%% j?`|d?}P$_?K%% j?h9:m?OM?s]lUIE?;Z?6X?}P$_?#ȽpSU?OM?}P$_?`|d?6 r̾HY˽޾HY˽ սjqt齌cS^}򾆝MFᾗҾ8 %:ɾFK+@žݾK+{Ⱦ˾ %ѾGEMN^}E"tAս";Y[&ݾY[]8#ӥ$rlD g~9 ny-xFmݾ-^¾ig :pKdyM_۾yY:p2T-^ ,۾QFGxsI/u g~Zџ$rj~5x0,9ھ06|<*GW5XT^!}'s5aa%O@㾓 󧙾_6HrHHre󧙾E`O@/P}'sw6b5XT)6ۓ!Y$#< S(򓶾d'R#@Ǿ˾Ծ`Ծ:ɾ{@ǾG򓶾6 +n6"4oJۓj~5aFĐG.KԾGwGVY@E<:sPM+Qо$T!Nv۹˾Kdþ'оsʾ/۹9ྚ.c>R>4BQо)Ts|$;#pYBxa޾$Fоa޾LC":n-P) IO6.G d'Fe"꾃Tξe"+8U7G OT6.9 } I q, 9V6;=ҁ8sAξ=6D-ྍT2DᆱPM+^ zH?m8=EJ9Y?=6j\?mW<'kT?ц=ҽN?=6j\?a=J0_?=8F;? >9ýi3?<>^ zH?ц=ҽN?F=* tC?=8F;?ц=ҽN?mW<'kT?l_ս2tHY˽HY˽Zqս!iמּt齺^}WLľM־Ǿpžþ %DK+*bK+^@ %)†VXpMe~¾Nm]^}zӾWtM $r r4Y[MqlY[Oz9$rmڋg~1 Ҿ-cqF;\R-^3:pTξy*9yΊOT:pb-^^J+&H& -wھxYA6fZs.+lɾQоhᾩd羆ʔouݾ۹N"ľ<e+h۹y#.aIE曽wھQоUnsX􉽝⾘&`׽a޾ /9$a޾G43eΟ0,4*&('â I` Lľ6.$:aG z۾e"Ⱦe"2BYG [ƾT6.N׾ƽ IwmW"O)=j"r4=Dl$W#"zp l l\sy. d:_@FX .ȉ"ru"8oチQX:b.:_fay. sjH?= _?==d?=qsfsV?L=wݾN?==d?o=վ_i?3>ĒM??'>$ξ:?V>nվFcM?;>^SľcO?wj>0_D?3>ĒM??;>^SľcO?n>9%S?>l*?پ>že$?'>$ξ:?3>ĒM??fې>kpa1?>l*?3>ĒM??wj>0_D?ڞDtս%ٰ&HY˽V # HY˽ ʾ+սAξ&Nt齜˾p^}a¾B8M˳dM/ %o,K+=JK+ m:j %\e G%k%Mi~{ ^}i)g~TX$r ľ Y[TDY[cT$rtSd.@g~~-!YFTɾ-^9:ptUysX5xy1!t:p""(3c`'-;F9P- ,$=5XTêHZ=<Քվ` =0Kw{Jb0 @< )5XT` {}'sԴO@ܾ_ڵ󧙾wGHrnlHr7 󧙾C [8O@t:)P}'sUQN=ۓH~=DL=0[F[<0+H\; ۓke81򓶾Tx@ǾZĶԾǚUԾY@Ǿxx 򓶾@C=3Z=sn=Y? =G4 2=G[׼Y Sܽs5d.@QоY ?Eᾬ]j"ƾ(۹Q5xBly1:1۹WT&Ã~L4*KᾯaX|^=QоZaŚ=xǾ/i=⾹q@=a޾VV` =a޾ ӝ⾑ͦM) ,k~F I`eh6.;GrG a̬Oce"o(>e"Zz>HG %k[86.u] IKf-=<ξG<T m<=/ӂ 9=켍8 tSqýl y. GN:_Ѿ>XG 07"ưݘ"_G3X**f:_Vy. .;l P%Ҿm[= _?=_*]?]=!p?3 N?.=jH?= _?N=Ռ zc?b>7,,3?>I9'1?:_>#1D?t>Զ)E2F?J>y7?b>7,,3?t>Զ)E2F?}>q!cH?ɧ>\*d?Ws>tI<?>I9'1?b>7,,3?L>r"?ɧ>\*d?b>7,,3?J>y7?v½߽^}Hs⦽thɁս@7(jHY˽K[\σHY˽ zսk㽴t齗?x^}1퇾4M{BQ]c %9iK+bK++0>O %SĽގ2LM{ټy- (g~h'<$r< :` =Y[ä|3FvGr-^꓀~:px>.yHyZW bnprcA:-^*oUFREN&>0>0<-F=Vվ3<ۓ.W߾\σ־A/򓶾Zb@Ǿ@.HԾ*"f]Ծt<@Ǿw0=Uk򓶾P#;b`=Qоv>6=s(>YLѝ7>GN&>G!=YA6о8H=ssپz\QоnѾ߽ᾩ_n3𔾄5`۹9XSnof]JH.۹8TRӽ\ƔESv#>a޾fM7>a޾=⾾}hu=MV<y I96.V0G sX e"e" ݽG )mZDg6.!; I\b`=l Œk=4=X==ä|~==T=JjV=(웾l[U"37Uk"7q _XK}.:_}:` ?=kL?@r=gC-?(=Ի^,'/?KK=4Me=x^}?G=㽴tA0<սhݺ\σHY˽(jHY˽D=ɁսϽ⦽t齇x߽^}aMrގ2˽>O %[bK+ iK+A5:c %#s>F >) -=e텽g~=M_$r$<3?cA:-^:Co:pgHyi_4|U=~:p̷=Gr-^8>4O@ H>mȽ}'sҔ5>5XTd>H=<7d=F=0TX=0轂=<H=HZ=5XTbfmU}'s|p}hO@Dj/󧙾8\tHr!|=ӒHr>x󧙾sJP>A/򓶾ݦa>\σԥM>3<ۓR>F==>0bṼN&>0M7>uC~=ۓw?f]Ծ=HԾ65>b@Ǿ"E>߽z\QоeC>8H=s4>=Y=N&>G@ѝ7>Go1ͽ(>Yw/=s0_b`=QоJohPļ%]TRӽ*.۹gf]ZnoT=5`۹ӷ>n3p@>y I&>V<a>}hu=쾺==7d=M7>a޾cv#>a޾)a>⾠v=쾦J(`=S4; I4l&Dg6.ݽG [e" e"zv=0G =6.X=Uy. =ld?'>B8M:>p^}q@>&Nt齜68>+ս.9#># HY˽˪>&HY˽d=սx=Dt齬'={ ^} a<%M`R< Gt|<:j %3=K+6=,K+'=/ %*6>-^k>YF,w>~-ό>d.@g~5>T$r{c>DY[,+> Y[)D=X$rO#=)g~XN-h?;FCjd4-^%s-!t:pƍ4|O=Uy=:p]\>_ڵ󧙾e>ԴO@m<> {}'s8>)5XTI>@<>{Jb0,"N>` =0=HZ=<(= ,$=5XT* )P}'sw"[8O@ 󧙾"XlHr>GHrw>x@Ǿ!>1򓶾p>ke5>; ۓu>+H>[<0 9h>L=0 >~=t@=QN=ۓAC=  򓶾[@Ǿ[ǚUԾ65>ĶԾف>j>?Eᾋ>d.@Qо> Sܽs>׼Y> 2=Ggxu> =G9>=Yx=Z=sF;X|^=Qо"*KᾞZÃWW 1۹;l}(۹~>`eh6.T>~F IΫ>,c'>ͦR>ӝ(>` =a޾s>@=a޾qQ2>/i=aY=aŚ=\o=-=|<] I a<[86.<>HG 6=(>e""=Oce">>GrG i>N:_Y>y. ό>qýl Z> &>켍o>ӂ 9={c> m<=*@>G<-><>.;l B,=Vy. =f:_~=3X>ݘ"#>07"F>>X=PRDG>m['} _?8 d?_Hw͔ht? o/2Jr?؁/*k\?'} _? o/2Jr?Z!p?䤾jH?tӮ N?8 d?'} _?~,E?䤾jH?'} _?؁/*k\?r7,,3??3A8? q!cH?Զ)E2F?A󾐴9f0?r7,,3?Զ)E2F?p޾#1D?& \*d?r"??3A8?r7,,3?tI<?& \*d?r7,,3?A󾐴9f0?v->þ %OP>Ǿ/Ir>LľML>^}by>iמּtGD>Zqս@>HY˽r >tHY˽dl>l_ս|I>WtL'>Nm]^} >XpMm=†k=@ %y=K+'>DK+$>:pc>R-^;>qFd>Ҿ-W>ڋg~ހ>z9$rc>qlY[9>r4Y[Zɋ> $rW>& -=D,Fυ=b-^Se=prՎ=y Hrs~>5󧙾m<>"O@zj><ݾ}'s>5XTM>ʏ

I00>-0>f5XTy>[8}'sV=O@%1=i;󧙾#<HrAzB>FヌԾC>na@Ǿp>򓶾l>ھ>ۓ3>1FWm>/0B>40>$>Jۓ3> K)=q򓶾7d=Zt @Ǿ],*={Ծ"f>ouݾ۹>d羆>h>lɾQо>fZs^?>xY >"Gg>lGI>rY>UnsW>Qо>E曽~=.aI=+h۹"ľef>:aG m<>Lľ6.>â I>'ܻ>,4>eTz>9$a޾p>`׽a޾K->􉽝CW>W>8Q>ƽ I/>T6.]%>BYG 24>e"Y>e">FX8>d:_5>sy. }]> l >"zT>WUQ>r4=>)=B>>X񽫉( >ay. ]>b.:_y>QX>u"M$>.ȉ"RDG>͛>P3ӝd?ߌվGi?r'*w?:Hht?q^?3ӝd?:Hht?l Jr?wݾN?eqsfsV?ߌվGi?3ӝd?ԯjH?wݾN?3ӝd?q^?y ĒM??MB2E?9%S?^SľcO?9]ξ<:?y ĒM??^SľcO?nվFcM?X l*?%_kpa1?MB2E?y ĒM??L!že$?X l*?y ĒM??9]ξ<:?fn5>FK+8H>8 %*e>>MZC>S^}Q>qt$>ս_>޾HY˽>r̾HY˽b>ս >"t=>N^} c>MF>Gwk4>˾ %C.>ݾK+w>Kdy(>ig :p]>-^>FЬ>ny->lD g~>ӥ$rp>ݾY[>;Y[>Zџ$r+>g~>-PY>QF>&>c`>Y:p5n=۾y\#>6Hr7h> 󧙾 >aa%O@ ^>^!}'sM>GW5XT>|x0e >6b5XTۙ>P}'s c>`O@K5>󧙾=HHrP:>Ծ>R#@Ǿ> S(򓶾.>#3>ۓ ?>?׾0 ?Đ0y>a>4oJۓ>+n6~>G򓶾fn5>{@Ǿw>`ԾP:>Kd*i>v۹5>N}ſ>T!>Qо`?:s<5?VY?ԾG?ĐG?#pYK$>Ts>4BQоZC>>Rd>.7>/۹)>'о>Fe"P>G ;>O6.w>) I>Cy?쾲 ??оa޾ ?xa޾@?V⾔> Y>qЬ>} IIג>OT6.l>U7G x>Tξe">޾">>UX>:_c>|y. >Dᆱk>D-ྍ??sAξ=3>;=J6>ڬQ>uO>l ^>y. jO>뫾:_B >SX>$̾"~>޾.>r̾iGi?[9,GkNp?>/ܾ64{?.,``߾*w?$;ʾzc?iGi?.,``߾*w?tI|yht?.,`蜾fsV?i㔾^?[9,GkNp?iGi?N?.,`蜾fsV?iGi?$;ʾzc?teҽN?oV'T?πJ0_?86j\?E $H?teҽN?86j\?ۑEJ9Y?88F;?cR tC?oV'T?teҽN?s9ýi3?88F;?teҽN?E $H?> 񑍾>񑍾B >%6jO>V- ^>#R2OzO>V3hbQ>g2èJ6>,&3>s.%J??+Jk>5&%> è>Yhbc>&Oz>>>! 6>{ vx>""vl>,tIג><:zЬ>>C(EY>F->_Cɾ@?99Ҿ ?+ߺ׾?ߺ׾ ?Z ҾCy?ɾ>h-߬>4/.`;>)XzP>tP:>>㻲)>P㻲7>L}0ed>BľZC>N^OԾ>1RK$>c Nc?RA?/G?BG<5?`?S⾒c>+ʾ}ſ>¾^OԾ5>˾ľ*i>ew>b0fn5>oTD~>YQNC>ٰUɧ>Py>C_ ?/?x ? _3>ؾ.>꠾ɧ>NC>:󿾾P:>۾Ᾱ=@ -|2K5> A? c>HKxۙ>$KO!wk>VJ%e >F >+y>+~.M?~.>,+M>:۾% ^>þ! >ֻx7h>ž\#>+޾|2w>>l5n=l>7O&]%>@4/`#PY>u=YE)>f@ܦ/+><5>c3:>s.%5

5<>z:>5Ь>پܦ/>ӾYE)]>$ھ/`#(>fn5>{ $0C.>~ $0wk4>rt]v1F>@%{3 c>)<7=>+H: >) =b>$'.@>*wA_>bwA$>y '.@Q>S =ZC>"H:>]<7*e>1{38H>G]v1.>*&@~> ])=Lg? w(96M$>Mh>񑍾> F񑍾y>N6]> W>^Oz( >chb>O!eèB>c&>Y]JUQ>/VJT>QM&>Dè}]>G=hb5>8Oz8>W7ef>ƛ$tY>M.v24>rkLt/>C\z8Q>*qj(E>.s-CW>uɾK-> rҾp>[hߺ׾Tz>>Zߺ׾>~IҾܻ>N9ɾ i>,3#>{#(Em<> z"f>eo>o^OԾW>:{>~cI>yg>vmG >;ZG^?10c>>b^OԾ>XľAzB>{ ],*=oTD7d=M/[K)=2>nNC3>Zzɧ> b~>y_B>KkWm>dUW3>K)@_>mN)l>?ɧp>` NCC>B+> |2#< A?|2%1=^TV= exy>Xeq!X o>bt%>o+0>@c~.p>P~.M>!g;+>I&%zj>!m<>B xs~>$>oaܦ/W>c5Zɋ>_:9>/V5GH5<ހ>7:W>w'5d> ܦ/;>+OYE)c>/`#v->k!]v1'>a& $0y=M. $0k=,7]v1m=?{3 >16G<7L'>KH:|I>ccM =dl>TK'.@r >mFwA@>q>wAGD>5'.@by>, =L>%H:/Ir> <7OP>k\{3>6O&@RDG>e5])=yY?yM6?[?pᄿ<'2?L?{D?}hK?<1G?XP?k?d*>i?h7l ?,?zXH??L=Z?m?NM>,?zXH?}G?JF?i>P"_F>޼]6#>_񑍾>Hd񑍾~=Fl6=btB,=a}Oz>:hb-> è*@>8&{c>7Jo>J&>d{&Z>Ksèό>jhbY>cOz~> 3Iz>>Ft"=SJv6=BSvŜҾs>&Šߺ׾(> ߺ׾R>]~Ҿ> CnʾΫ>/^-T>Q(Eف>7ľ=/> 3e^7=I8㻲;l}ҏgxu>fG>=G>F|>gc>@S>)B^OԾw>+65>'[Mᾧ[hd ZzNCA쌆ɧt@= >^_ 9h>羋>u>qv_5>=`p> Jɧ!>K7NC]\>4_(>@%|2"XH|2!\w"Xeqx* />!(=dž%= w+,"N> ~.>:~.I>|m+8>8 Y%m<>D!e>q3x*6>./`#=l+O=!/lI8l%s-[HFCj`3V/`#h?eYE)XNsrܦ/O#=s{5)D=~:,+>SRz5<{c>p5<5>+c:ό>@S5,w>7Cܦ/k>z6YE) >;{3'=4:]v16=W6< $03=QA $0t|dwA.9#>_wA68>#`X'.@q@>O =:>uDGH:?'>C0@<7RDG>u&@=6O])= ?<'2? ?ܵ/?s?S|+nC??ŭ{D?/[?J6? ?<'2??ŭ{D??Fw1G?a?|??HK? ?ܵ/? ?<'2?1Y!?Ʋa!?a?|? ?<'2?/[?J6?VbM?¶7;?#C??'9?>&?@g>?Iu?{Q?0 ?VbM?¶7;?@g>?Iu?u@?9E?(U?;۵)!>kH?Ѿ>#C??VbM?¶7;?} Z?u~>(U?;۵)!>VbM?¶7;?{Q?0 ?X=(Oz6{=x9=Kt6ş亥r񑍾Q~t񑍾,sfy6g8I½x|OzDƴIhbr錽,è!{~&ֻCJ$<^J|y=#&+R=%[è='hbp@>{s(E=Ʋfzzv=W!^tI[v[^vɏgt4l&?tzS4*(EJ(ቿ-v2`ɾ)aꨔҾcߺ׾7d=mߺ׾$=ՏӾa>vQɾ&>-"E>hg^OԾӷ>pVľT=?KeZG㻲gJK㻲*We%]hľJo)}^OԾ0_Iw/A%co1ͽ/@왘G= pG4>ߔeC>쇿c{sJP>]NC65>J=>9>JK6u^~tNCw2/ɧuC^m_bṼ p=R>_ԥM>cݦa>xrɧ8>e Vx>tE!|=9|2895F|2DjW|p}wkxbfm(!H= w%+W돿~.7d=~.d>懿+Ҕ5>|~% H>5j!f>GSYE)̷=F/`#U=# >44;lg>l{G>? T/`#\NAdYE)A{sܦ/V5 cܦ/KK=e V<7#<O{3A5:aJ]v1 H $0[J $0˽|O]v1rV{3a-_<7xhgH:Ͻ pn =D=4s'.@QtwAhݺxrwAA0C̿/?˜=.}ο/?v=ǿ+nC?=Eƿ+nC?,K>=ȿ1?>C̿/?=Eƿ+nC?!>KYĿ{D? >2οK?c=ѿK?˜=.}ο/?>C̿/?]j>ȿ|? >2οK?>C̿/?,K>=ȿ1?r>忂>/>翂>4>3Ν?X>߿Ν?b>3g\?r>忂>X>߿Ν?Xw>̂ݿ?A>>(>+>/>翂>r>忂>B>&zX>A>>r>忂>b>3g\?\Ihbx|OzK8I7qsfy637~t񑍾?>[r񑍾Kt6x(Oz(웾'hbJ%[èT#&ä|^JXCJ4{~&Œ,ècRቿ-!*(E)mZ?tz ɏgt^vsXI[vVW!^t9Ʋfz{s(EM-vQɾ񏿣Ҿfmߺ׾{dSؾVꨔҾ!2`ɾP#;I\Ɣ<)}^OԾ8hľJHWeJK㻲9XSG㻲?Ke_pVľnѾhg^OԾsپ{A6о쇿c!ߔ pGL왘G/v>6A%c<2/ɧw0=~tNCt<^*"JK@.>ZJ־]NC.W߾xrɧVվc<-_RE pzDнm_Kʼ^<(!=wkxT^lx>4;l꓀# >vF/`#ாGSYE)I cܦ/񭾷r5鼚-:ä|c5<< : 5<Ϟ:V5v½hgH:L-_<7SĽV{3+0|O]v1J $09H $0]aJ]v1{O{31퇾e V<7?f^H:kf = zm'.@K[xrwA@7QtwAh4s'.@Hs pn =K[2/&@37]])=C̿/?;aԾYȿ<'2?KYĿ{D?3Eƿ+nC?aο(/?C̿/?3Eƿ+nC?.ǿ+nC?޾2οK?nȿ|?;aԾYȿ<'2?C̿/?\ѿK?޾2οK?C̿/?aο(/?G忂>gYV?50̂ݿ?Bھ߿Ν?/ƾ|>G忂>Bھ߿Ν?Ⱦ3Ν?`z> &zX>gYV?G忂><¾+>`z>G忂>/ƾ|> è:hba}Oz**bt_GFl6ưHd񑍾G _񑍾Ѿ޼]6GP"_񾄸cOztSjhb8Ksèd{&/ホJT7Jξ8&ZRɾKf-uv(E%kXeqzZzTzatoBSva̬SJv;Ft 3IzkQ(EM) /^-rnɾ ]~Ҿr6ؾq&Šߺ׾xǾŜҾ3w#ca~L4^OԾWT&kľ1:VeBlD㻲QI8㻲"ƾ 3e]7ľY )B^OԾ5@S侯gc[F|4=G?fGnҏU@쌆ɧxxZzNCYhdMZ'T+8K7NC Jɧ\=`qv_[FD羋H^_dž%t:/>!C Xeqx7!\nH|2w@%|2ܾ4_(q3x` D! 8 Y% |m+Kw:~.Քվ ~.ê w+is{59Psrܦ/'-eYE)v"`3V/`#1[HFsXI8lt!/l9l+Tɾ./`#!侷z6YE)7Cܦ/tS@S5c+c:Tp5< ľSRz5&?,;۵)!>u~>8yͮH ?R¶7;?Ѿ>,;۵)!>R¶7;?z'<?"c&E O!eèschbf^Oz: W8oN6r F񑍾 Mh>񑍾@(96 W7l\8OzpG=hb#DèDl$QM&j"/VJOY]JX rҾmuɾw.s-N׾*qj(E[ƾC\z2LtȾrkZߺ׾&[hߺ׾y~cwھ:{Io^OԾy#4^ľeIe 3㻲NnNCfM/[KɃoTDϾ{ ` NC'?ɧ3mN)6K)@_x1dUW"$Kk:o+ bt%|Xeq!oٚ ex䳄^T{ A?|25%ľ |2` B xw!'I&%*!g;+&P~.@c~.M_:wھc5aܦ/꠾REXYE)lJ/`#Ί<:*9?*l""l3o;\/`#c+OYE)1 ܦ/mw'5O7:MGH5< /V5wA2mFwA6O&@%Ҿe5])=!yM6?䃿lwL=Z?JKr?=zXH?d*> NM>=zXH?|oh ?6s.%J1,&*g2èJ"V3hb#R2OzV-F%6c 񑍾< 񑍾1a! 6-"&OzPM+YhbT2 è65&ҁ8+JB+ߺ׾999Ҿ,_Cɾ F-9 >C(E<:z+8𾹰,t""vd'{ vt)XzPE(En-h-ւ:ʾLCZ Ҿ$Fߺ׾F/G|$;RA)c Nc>1R侌cN^OԾ9BľsʾL}0eþP㻲˾>㻲e˾ľ$¾^OԾPM++ʾ@E+wVJ%/$KO!EྞHKxe A?@ -|2_+޾|2㾡ž5ֻxþ!*:۾%6,+,9~."s.%5<c3:u <5f@ܦ/ ,۾u=YE)2@4/`#7O&M_l>l¾mݾ$ھ/`#xӾYE)9 پܦ/5]8#z:&5<6 *wAA$'.@E) =+H:E)<7Ѿ@%{3{Ⱦrt]v1@ž~ $0:ɾ{ $0ҾG]v1Fᾙ1{3]<7c"H:jS = y '.@bwA!Y$*&@ ])=^G wR^OԾ>4B)Tc|$;#p+BĐF׾B>_6!Y$#ɧ< S(NCd'R#˾`:ɾ{GNC6 +n6ɧ"4oJj~5a_j~5x~.,9ھ~.6|+*GW%^!!5aa%x㾓 _6|2H|2eE`x/P!w6b%)A ?t>ʢ='?\ODhD=7?\.ܫ=1?c>?dOʃ>A ?\.ܫ=1?Ek=*?"&O)Jj"r4JDl$W&#"zèp hbl\sOz d@F6 .ȉ񑍾ru񑍾8oチQ6:b.faOzsxA6fZc.+lɾh^OԾd羺ľʔouݾeN"ľ㻲<㻲e+hey#.aľIE曽^OԾwھUnc/$_"$4x1/61F_3'ھɧNCnaϾFᄍKɃ{fZt qNC Ⱦ ɧ{pJ:+-~.&I~.*ʏ+'%w<ݾ!` "x55%ľ |2{|2䳄i;oٚx|[8! f%M : r45<Mql5K>wcB?TB=$H?XE ='Q?V]x=fM?G0x=9?SV-2<??<@ =5YM?TB=$H? ;b1>k1?G0x=9?TB=$H?>K>wcB?0iB>vA? >E?Q"is >K?Ço->yBI?isx>Ȟ:?0iB>vA?Ço->yBI?қJ>F?־G>[1?:о~K=-@7? >E?0iB>vA?o>0)?־G>[1?0iB>vA?isx>Ȟ:?<èξG<&T m6G 07񑍾ưݘ񑍾_G36**fVOz.;hbZaŚ=ɾxǾ/i=Ҿq@=ߺ׾VV` =ߺ׾ ӝҾͦɾM) ,-k~F(E`ehz;Grta̬Ocvo(>vZz>Ht`j*ٕu] (EKf-=-3Z=cn=? =G4 2=G[׼ Sܽc5d.@Y ?E^OԾ]jľ"ƾ(eQ5x㻲Bly㻲1:1eWT&Ãľ~L4*K^OԾaX|^=UQN=H~=_DL=[F[<+H_\; keɧ81NCTxZĶǚUᾫYxx NC@C=ɧ ,$=%êHZ=+Քվ` =~.Kw{Jb~. @+ )%` {!Դxܾ_ڵwG|2nl|27 C [8xt:)P!i)5TX: ľ 55YM?0e@>SO?lJ`>T? N:>ExS?!>HH?Ew>5YM? N:>ExS?vu>'Q?ܾ9L>??=A>5B?0e@>SO?Ew>5YM?Ҿ%>9?ܾ9L>??Ew>5YM?!>HH? o W=L?^銾x=6O?T >6T?N5Z(>R??V_<>G? o W=L?N5Z(>R?J>zsP?.=-q>?!a,8?.=-q>? o W=L??V_<>G?\b`=hbŒk=è4=&X=Jä|~=JT=&JjV=è(웾l[U񑍾37Uk񑍾7q _6K}.ҾESv#>ߺ׾fM7>ߺ׾=Ҿ}hu=ɾMV<-y(E9zV0tsX vvA1߽)mZDgz!;(EP#;b`=v>6=c(>Lѝ7>GN&>G!=A6о8H=csپz\nѾ߽^OԾ_n3ľ𔾄5`e9XSno㻲f]㻲JH.e8TRӽľ\Ɣ_REN&>><-F=_Vվ3<.W߾\σɧ־A/NCZb@.H*"f]ᾧt<w0=UkNCYE)vGr/`#꓀~x>.lHl:CocA:/`#*oUYE)v½߽H:Hs⦽ =hɁ'.@@7(jwAK[\σwA z'.@k =?xH:1퇾4<7{BQ{3]c]v19i $0b $0+0>O]v1SĽގ2{3L<7K[?<&@37A/])=o9>SO?>SO?l >T?z >T?6Ѷ>L?o9>SO?z >T?3r>ExS?V|e>5B?i-T>5B?>SO?o9>SO?H +>??V|e>5B?o9>SO?6Ѷ>L?OV_=S?&DØ<S?G5=?X?#K=?X?=\P?OV_=S?#K=?X?э >V?,ѽI{*FE??eoFE?&DØ<S?OV_=S?BQ;UB?,ѽI{*FE?OV_=S?=\P?X=UOz=ly(E&>V<-a>}hu=ɾ==Ҿ7d=M7>ߺ׾cv#>ߺ׾)a>Ҿv=ɾJ(`=-S4;(E4l&Dgzݽt[vK |zv=0t=z"E>߽^OԾz\eC>8H=c4>==N&>G@ѝ7>Go1ͽ(>w/=c0_b`=JohPļ^OԾ%]TRӽľ*.egf]㻲Zno㻲T=5`eӷ>n3ľsJP>A/NCݦa>\σɧԥM>3<R>F=_=>bṼN&>M7>_uC~=w?<ɧUkNC6u9>f]=H65>b8>4x H>mȽ!Ҕ5>𙼓%d>H=+7d=F=~.TX=~.轂=+H=HZ=%bfmU!|p}hxDj/8\t|2!|=Ӓ|2>xf>s>YE) >) ܦ/=e텽5=M_:$<3<5< ` =5<?cA:/`#:CogHl4.lU=~̷=Gr/`#KK=4<7e=xH:?G= =A0<'.@hݺ\σwA(jwAD=Ɂ'.@Ͻ⦽ =x߽H:a<7rގ2{3˽>O]v1[b $0 i $0A5:c]v1#SO?i'>5YM?b<>ExS?ܸO= >T?=w)>SO?ܸO= >T?= >T?q޻|e>5B?md+>??i'>5YM?<9>SO?&=-T>5B?q޻|e>5B?<9>SO?=w)>V?zeK=?X?Y¼FQ;UB?Wf=ߩP?oV_=S?eoFE?{I{*FE?oV_=S?Y¼FNY>Ozό>qýhbZ> è&>&o>ӂ 9J{c> mG<&-><è>.;hbB,=VOz=f~=36>ݘ񑍾#>07񑍾F>>6~>`ehzT>~F(EΫ>,-c'>ͦɾR>ӝҾ(>` =ߺ׾s>@=ߺ׾qQ2>/i=ҾaY=aŚ=ɾ\o=-=-|<] (E a<[8z<>Ht7=o>|"=Ocv>>Grtف>jľ>?E^OԾ>d.@侟> Sܽc>׼> 2=Ggxu> =G9>=x=Z=cF;X|^="*K^OԾZÃľWW 1e;l}(ew>x!>1NCp>keɧ5>; u>+H_>[< 9h>L= >~=_t@=QN=AC=ɧ  NC[[ǚU65>Ķᾟ]\>_ڵe>Դxm<> {!8>)%I>@+>{Jb~.,"N>` =~.=HZ=+(= ,$=%* )P!w"[8x "Xl|2>G|2*6>/`#k>YYE),w>~ܦ/ό>d.@55>T:{c>D5<,+> 5<)D=X:O#=)5XNܦ/h?;YE)Cjd4/`#%s-!t5xlO=Ul= >d{3?'>B8<7:>pH:q@>&N =68>+'.@.9#># wA˪>&wAd='.@x=D ='={ H: a<%<7`R< G{3t|<:j]v13= $06=, $0'=/]v1RDG>m[&@=P])= x>Ew>5YM?݆>x>$H?.u>u>'Q?b>N:>ExS?>?>Ew>5YM?b>N:>ExS?>`>T?\>9L>??]H>%>9?݆>x>$H? x>Ew>5YM?$>A>5B?\>9L>?? x>Ew>5YM?>?>vBH?k=J>zsP?R?.a=="N?< W=L?R?i=T >6T?ۗ8=-q>?%>8?3;<>vBH?< W=L?UԐ;,?< W=L?.a=="N?>F68>d5>sOz}]> hb>"zèT>W&UQ>r4J>)JB>&>Xè( >aOz]>b.y>Q6>u񑍾M$>.ȉ񑍾ef>:atm<>Lľz>â(E>'-ܻ>,4ɾ>eҾTz>9$ߺ׾p>`׽ߺ׾K->􉽣ҾCW>Wɾ>-8Q>ƽ(E/>Tzڞ$>xZ24>vY>v"f>ouݾe>d羺ľ>h^OԾ>lɾ供>fZc^?>x >"Gg>lGI>r>UncW>例>E曽^OԾ~=.aľI=+he"ľ㻲AzB>FᄍC>nap>NCl>ھɧ>3>1F_Wm>/B>4>$_>J3> ɧK)=qNC7d=Zt ],*={B+> |2s~>5m<>"xzj><ݾ!>%M>ʏ+p>I~.0>-~.>+X o>f%y>[8!V=x%1=i;#<|2$>c>R/`#;>qYE)d>Ҿܦ/W>ڋ5ހ>z9:c>ql5<9>r45 :W><5T >& ܦ/=D,YE)υ=b/`#{Wb=OTՎ=lþ]v1OP>Ǿ{3/Ir>Lľ<7L>H:by>iמּ =GD>Zq'.@@>wAr >twAdl>l_'.@|I>W =L'>Nm]H: >Xp<7m=†{3k=@]v1y= $0'>D $0>P&@RDG>͛])=u ?=$H? ?0>B?&?x=fM?~!?E ='Q?A?ϒ=L?u ?=$H?~!?E ='Q?G ?P8=ExS?>x=9?-?b1>k1? ?0>B?u ?=$H?(>2<??>x=9?u ?=$H?A?ϒ=L?>>iB>vA?>x>K,;?/>қJ>F?ȋ>o->yBI?$>>E?>>iB>vA?ȋ>o->yBI?>is >K?IP>G>[1?`5}>>0)?>x>K,;?>>iB>vA?ynC>~K=-@7?IP>G>[1?>>iB>vA?$>>E?>޾񑍾>>U6>c>|Oz>Dèk>D-&??sAξJ3>;JJ6>ڬ&Q>uèO>hb ^>OzjO>뫾B >S6>$̾񑍾>FvP>t;>Ozw>)(E>-Cy?ɾ ?Ҿ?оߺ׾ ?xߺ׾@?VҾ> ɾY>q-Ь>}(Ef>jٕl>U7tx>TξvP:>Kd㻲*i>ve5>Nľ}ſ>T!^OԾ>`?:c<5?V?ԾG?ĐG?#pK$>Tc>4BZC>>R^OԾd>.ľ7>/e)>'о㻲P:>ᾥ>R#> S(NC.>#ɧ3> ?>_?׾ ?Đy>a_>4oJ>+n6ɧ~>GNCfn5>{w>`\#>6|27h>  >aa%x ^>^!!M>GW%>|+M?ھ~.y>x~.e >6b%ۙ>P! c>`xK5>=H|2w>Kdl(>ig ]>/`#>YE)Ь>nyܦ/>lD 5>ӥ:p>ݾ5<>;5<>Zџ:+>5>ܦ/PY>QYE)]%>T/`#>Y5n=۾lfn5>F $08H>8]v1*e>{3><7ZC>SH:Q>q =$>'.@_>޾wA>r̾wAb>'.@ >" ==>NH: c><7F>G{3wk4>˾]v1C.>ݾ $0.>r̾&@~>޾])=8G?$B?{V?RwA ?6,?>?<4?i=ge+?1$?.ܫ=1??ʢ='??ʃ>A ?1$?.ܫ=1?0?C=7?>,z>!>֍* x>yn1 $>p5K>A6@>x30 $ؒ>Z-)Q??%Y7-?vY7-d?0)? 0 $>@>s=KR> ^ >C>6z>Q!zn>1cCR>u>3> F*[>$`G%%{+>9B'3_@>b7ʈ>u>(}D>"}D?ʈ>mf>'3>fW羼%%J>{5>3Rx>Vc"> l${>ly!>"4GJ>0E_>[O)b>|P/ڽ>JJB#>x;P>(sXso>rsX>3PP>ھJB>ƾ/>}þ),>о_Ɲ>EQC>w75[0>b'7n->2C[:>\DbSV>FUO.#O{>3Qt9>,INҦ>.:]ī>?%f >Tf>>チ]?պ> ˾N~ >঵t9A>鱾.#N>{bb>#߾C;=), s\=+<+>կF-_)>iHKB`P>>AUgt>3Bwc> ?kH>T ?k>'%Bwc%> ɾU1>KB]>t-$6>+'>{lܾ O@=0"f=<.{)==}6O8g=g7GoT>2BV6~!>5'Ca7>8g&E>eK8g7G>CaS=>xe׾BVSM*>5ȾG>$žO8/=*Ͼ{)7ܫ=,=wJ>0 =@ J>0y =7w3=*sl9J= 4!4A΁=C!WIi=!iQ8\= D^W8=6ߗZ=&4ߗZ1=5^W0=ytiQ#= ,Uk= IG? i*t ,r?2 e?CB'1V??vk?W(vݽ? i*t ,1V??vډ?>]ͽ2Ҿ?96sU?!$Mr?2 e? i*t ,z?|2Ҿ?96sU? i*t ,k?W(vݽl?Ⱦ ?Fؾ6$?lK?~i`(?PƾTFl?Ⱦ?~i`^?:򾷷>N?}?i^G ?Fؾl?ȾY? \N?l?Ⱦ(?PƾTFX>FѺ>L$>lT>y\>TQc U>hKn>)j@i>i0 $*>w(e)C>N^Y7-^y>=WY7-n>egO)z>ΏH0 $p>C@g>AK>B >3ckН>'>z쾇>Lz{>8[c)p>Tg3Ow>qpj>t%%4>r'3Vۭ>Ckʈ>x><_}D\u>ÌQ}Dڒ>Cʈ>>m6'3 >'>-b%x|>J)>δ+3E>< &,s>d/l侧A>Al>nT->%Fe_>p):[7>/u/ke>GsJB>iP8>ZsXx>QHsX?>25P>$JBZ>/>()pӱ>d_kd>6CL'>!7^=ܔ57=JC9v=[b_=ih.#=8mt9[j>kNT>`]>,XPf>a<fN>2']>N?c>fw t9t>$.#>bW^>>? R<+< |:HM+$MQBwc=JF>HB?kw> !0?k%>a5Bwc> UAƏ>KB >@W- T>B^+n=Z<.iü;{)[jDO8K;.HG=BFBV=L>Ca=V38gU#>09%8gS=>Ca:H>{ BVd&B>^8G+>nO8[>v{);I=Y w39s<J>0t;J>0@k"w3fWg)sl9Χ 55.4AB ;>0WI+^W=$ߗZ8|=cSߗZx=}^W={iQ~=H WIZ4=4A# =Nsl9.>ZSX,a=uIG?' e?zUˈʬ?k?ㄭ?89B'Bܭ?d@,?' eㄭ?89B'[?үv-?HHMթ??zUˈ?' eV?L{sU-?HHM?' eBܭ?d@,$?AWט̺̾?⾬ ?lԛƺ?h蜭?ͿO$?AWט̾ƺ?h蜭-X?+ ׸?w? p̺?⾄$?AWט̾'ͷ?Šľ׸?w꾄$?AWט̾?ͿOd>p l|>r)q]>3u>>z%%>H>* >kK>@"->40 $ H>,Ȇ)Og>Y7-Y4>tY7->7)>VCy0 $Ù>/~t@˰>qqKd,>Y3w>&2\c=>bzd>W/lz = wcf=|ڀ3H=B{&=%%g/='3)>Gʈ>Q>@}D4Ƅ>]}D|>4tʈ>P>Pi3u>W`%%>![>A_3]>(.E:>Ml,=+ZlX=]sX!u>rsX>%dP>VJB>K/1>C)oz>u,b!3>}0Cm=971af~>`rR]!>aCN.>6t9p>..#@>+K=G! ?^D IR+n]-xB*eKB?gU7cBwc^ϖ=Q,[?k,>N?kQ>@Bwc% x>2U >6'KBnn>-=+{)=M44/ ^?{)W.HO8vཻMG2m0iOBVA$ѼLCaA<*F8g8|=<8g>1Ca}#>6'BV+>~fG>IO8A=tsl9 <[w3# J>0 #$J>0Hƃ)w3v/sl9˫m44A~1z7WIcj@W8iQA16^WzD9V3ߗZP<;.ߗZ,p_=Z(^Wmh=."iQм=WIp=4A0l>O,h?%IG`i?UˈE^?/|]?PLc?)k?Jp?2f`i?Uˈc?)k?g?GB'Sh? +Y?E^?/`i?Uˈ.q?G߿MSh?`i?UˈJp?2f:?"wH~?jZ~?LA-?Wyܾ뼈?c޿(:?"wA-?WyܾG(?g濰оt?Nܿy?H~?j:?"w~`>Cy3̣=ؔwcŒ< xz-Ah{z ׽c>3J+򺇿m& %%,}'3_s᪎ʈ>_h}D$3=}D=>>pn'3d(>[%%TG>Ii)?>Eb_x=_*#<`lLudlx~*l6S]u_!n )9g܃/\? JB?@ؕPZ(m?sX$3=sXZ=lPR3>{JBi=N>q/8H>R.#D>8Kbê=ܢHCߏ]I7T]Ž N7g6gUC_&tq_bhj.#c焾st9 ^zN ~]\t L}fa=xfb=p])2>fNɲO>A\t9͢%>L>-K=8+'n=I~5 CzLQUP,>GKB =0O8=+{)<7T)y*22`U9{)>iC5AO8dvGGQFLBV|!OCaݧِN8gXAK8g9(=ECa==>BV'B=47G?{0T]Ž,(J>0l+w3Y.sl9%24Ao"ƃ6WI3&9iQ bYm:^Wݗ%:ߗZ-AZ8ߗZbR5^W1G;/1iQ$<-WI3<U,L+IGu>, dIE> X>` PL |>r PL{> ;Eu>,  |>r PL"!> k?u><0>-dIE> u>, ^Ѫ>u><u>, {> ;E{> KL]~> KLo>~ > >= Y {> KL> 8>I aヒ{>`pB&i>P B&]~> KL{> KLt[>ݛ%z{>`pB&{> KL>= Y N `@~Ke }+K'7oB'PoҖ \ Kxq߉@{嚾0 $0*Gȍ)~gLY7-Z1Y7-7U)(-V0 $gZ %%@E򺇿ԋ3⽥c,h{z:`o xzvؔwco᰾Cy3~õ¾[%%hpn'3`ʈ>}D=F$D᪎ʈ>,}'3J#<܃/:Ј< ) ]u_섽~*l5udl :g`l!_VEb_2.ҾIi)tվq/-Ⱦ{JBmګlPsX2m?sXοؕP뼥 JB3=st9Q=hj.#-gľGKBSzLQU`{ZBwcBha?k>F%f?kxfBwcӞ;cU&;vGG+OBV晃ECaKAK8g ِN8g!OCaFLBV=iƃ6WI^24A[.sl9Hl+w3,(J>0cRF&J>0@%w3K\LE'sl9xlN)4Ao-WIqd/1iQ"LR5^W,Z8ߗZ%:ߗZ̽Ym:^Wӧ&9iQBhU,5+IG5u,  J Uˈ k?쾪r PLо /5u, 쾪r PLھ` PL5u<  J Uˈ5u, ƾ-5u<5u, о / KL`n_ fW { I a` {w > KL` .~ `pB&ݛ%z`n_ fW  KL&}P B&`pB& KL{w >ž40 $x@ekKz* fH";zT<ݾ3u쾫r$p EqqK#/~t@?VCy0 $iF7)tY7-pY7-EҾ,Ȇ)Ϡ'3^ %%B_|ڀ3 wc5W/lz쾻p;bzg&2\cY3/ ![|W`%%R i'3>4tʈ>_~D׾@}DGʈ>z~JB:L/8|ڀ)B0v_hEh󾊾+ZlMlYxݾ(.EƁA_ C)K/lB VJBO%dP龾rsX2ľ]sXZa҃P?@g:|N yt9*r.#l_$eb,|yVCenXG7497Ⱦ}0Cu,b'z..#6t9paCN=u`rR]ԥԾafb(ofÃ*nx]?gUؽB*eKB2]-NŽIR+^D }G! ?ξ+.徍-T6'KBR2Uj׾@Bwc N?k7Q,[?k{\cBwcP0iOBVߘٽMG{.HO8ʽ ^?{)4M+{)8˼IO8Rľ~fG~y6'BVֱ1Ca͢<8g|*F8gBLCa"@W8iQH1z7WI!m44A0L /sl9[$)w3@4$J>0_R J>0(r[w3Ætsl9_4ArWI]."iQqZ(^W{;.ߗZ8]V3ߗZB=16^W0O,xN?%IGUˈz9m e}GB'낍)k?霊/Uˈ낍)k?W_PLxʏG߿Mz9m eUˈv6xʏUˈ霊/۠"w#߿6ɟg濰о1ΝWyܾ.蚿4 ۠"w1ΝWyܾL㾾NܿݤíտF#߿۠"wNܿ۠"w.蚿4 w(e)>i0 $x)j@il hKZ TQc i y\lTLFlP B %AK"(C@&(ΏH0 $'egO)#=WY7-N^Y7-/Ckʈ>zr'3)pt%%+qpTg3Y8[cFwLz*'>z쾦3cδ+3$J)Q"*-%%ƺ+m6'3(B>|"ÌQ}D<_}DiP9ᾮGsJB\1ʾ/u/xp)VM%Fe_QnTtϾAl辇d/l侂@< +d_() #/!%$JB!25PQHsX| ZsX;ؾ`]kNʡ8mt9ۑih.#fX[b𔾝JC}ܔ57,*¾!7u6C b $.#fw t9%5Nh2']" a<f,XPfAMQBwckkJ[UCc]KB-UgX-x^HM+dm+< 벼>? ؾB^+T@W-JKB: Upa5BwcN !0?kިѾHB?kdL>CaCcBFBVa.HGJjDO8FD;{)-XO<.cv{)RľnO8Ͼ^8GҾ{ BVh;CajK09%8gnV38g$>+^WCr/4/iQ/_>0WIR55.4AȈOg)sl9YUk"w3%cJ>0wJ>0ǾY w3FNsl9М4A颾H WI{iQݻ}^W͢cSߗZmm$ߗZ[YZSX,~uIGʿ' ehɿIt ,Kȿүv%ɿ89B'ȿ5S;Eʿ' e%ɿ89B'kȿk?7ǿHHMF,ƿL{sUhɿIt ,ʿ' euſ7ǿHHMʿ' eȿ5S;Et׿AWט̾9ֿ抿֯տ+ gֿh蜭3ֿt׿AWט̾gֿh蜭տlԛxԿwnӿŠľ9ֿ抿֯t׿AWט̾зҿ pxԿwt׿AWט̾3ֿ㾌8?%Y7-L5Z-)һ1x30 $-A6@ *p5K}'yn1 _7&֍*~&!I(R+!/ #3s=Ki6@k_9 0 $:0)e^:vY7-b|3(}D-b7ʈ>&9B'3to$`G%%A Fu>31cQ!z쾶c6zVcz"3p)0fW羼%%k4PP3P7ʈ>96"}D%&(sXx;P͠JJBY |P/D[O)0E_8"4lg l<%E>Xо_}þ)k!ƾ/(ھJBn&+3Py*rsX?%fQ .:]F,INgy3Qt9پFUO.#˾\Db4;ž2CZƾb'7hоw7I߾#߾C^{bb鱾.# ঵t9 ˾N>チ]FTf ?ks3Bwco־>AU3þiHKBֱկF-+<+򞾜), N{lܾ Qɾ+8Xݾt-KBp ɾU'%Bwc T ?kwʾ8gB5'Ca-2BV]g7G>}6O8T<.{)靆0"z*Ͼ{)`$žO8iþ5ȾGh;xe׾BVҾCa.ѾeK8gM6ߗZ͚ D^W!iQvC!WIƇ 4!4A*sl97w3!@ J>0wJ>0S(w3GǑlasl9˙F4AQ޿)۽*>]ͽ!?v㿁1fף i*t ,!?vHCB'"sڿ96sUֿ|>Q޿)۽ף i*t ,ݿ!$M"sڿ96sUף i*t ,㿁1f[ ࿺ȾܿGƾEM:򾷷>s~i`QK⿤׾z;[ ࿺Ⱦs~i`&lKؿIԿ \ܿGƾE[ ࿺Ⱦtܿi^Gؿ[ ࿺ȾQK⿤׾z;8J~Y7-e^:܃;Y7-:h޾)k_9w0 $i6@#3K!/ R+qI(9Ծ~&¾_7&}}'ջ *烛K-@һ1Ȩ0 $L5d)b|3}D96־}DP7\ʈ>4'30%%p)z" 3cc*z&¾z쾖McԬ3At Dpb%&%'3-җʈ>%&sXy*sXn&+JMP(JBk!/!)>X_<% gWsl3ƾl8lnx_D"P)Y I/͠~dJB׳PJ~fF fE ] N x(t9bW*.#^#bI߾ܺChоa7ZƾJξ74;žYC˾zbپxO.#gy?bHt9F߄eNQ lj]lƾ?k ?kй Bwcp_TU @(KB8Xݾ*)-Qɾr?#+N& 򞾏E q+ֱ;rr-3þkKBo־L:Us㌟Bwcwʾ9Ծ8g.Ѿ8gҾk Cah;BViþn1G`у O8O]{)z靆8¾TNΨ{)>žO8]G-GBVB]CaM*ߗZ@{0ߗZ.Ш^W C' iQWI˙@e4AGǑ sl9S(w3aJ>0!G\J>0)ھw3th̾sl9Ƈ0ľ4AvB¾WIgUȾiQ͚Ծ^W4lƾ, WsIG տn)м۽mӿaMQWݿٽiFe޿$]ͽ ٿG@, տn)м۽e޿$]ͽukv<;˿T#<n ȿ:cmӿaMQ տn)м۽ϿqĽiz =>2#Cɿ>gqaʿg\>ĿE`>! i[>qĽaʿg\>a̿8>[8'>jmW>6iz =>2# i[>qĽ~KF>*J8'> i[>qĽĿE`>!i)UY7-#:0Y7-'O)&(Xj0 $"(&+~@%(KlP  NrB2Yߣ:i JZ  il fٽKxɽ@>oѽ0 $/"Dʈ>}D|"F}DM )uʈ>ƺ+'3Q"*倫%%$3+/3c*zXzFw;ZzYPN c~x۽3Bݖ)pl%%z}'3̽P| a"sXLlsX!3P!%<JB #pԾ/G޾)+?پ_@ƾ边ϧl侓tϾC킾lQ+:VM1_x8b)\1ʾEX/9ᾬ%JB;ؾ 2 ]Kf" ԍfhcʶ]%5ھNt9 O.# bu*C,*¾[þ7}o7dCfXnbۑgֽ.#ʡYѫt9NAYHFBwcިѾ7t?kN꾭V?kp.̾Bwc:r7UJ5KBT -ؾC+벼K dmq x^ X+-Ug))-CcKBk Ud/Canv럾8gjKh&8gh;پCaҾeBVϾGRľO8({)c2-XONΨFDF{)J{O8aywlGCc)tBV~^WmmϪߗZ͢˾ߗZݻ۾^WM龶iQ颾7WIМD4AF+sl9Ǿ쾎w3wmJ>0%c&ѾJ>0YUyw3ȈOʳsl9R].4A/_PWICri0iQ[Y&+,~QӾIGds?MQ>>>?$>iF ?vݽds?MQ$>iFt\ŵ?]ͽyƸ>c:Y>5:>ds?MQk[v ?yƸ>cds?MQ ?vݽ'Վ?J=,?y=&;?\=^?<+g1$?o'Վ?J=^?<̚?xL9邿j?k8=䪄?=,?y='Վ?J=b$?P邿j?k8='Վ?J=+g1$?ožF;=0 $EҾT?$=)p⾦׾{<}DI }D>pyqʈ>R ?ͽ'3|4< %%/ &'3ghcp;-z5e踽z쾂CcÊpE<^ M=%%z S<JBZ 0@4PJ>0[$}ϲw30L Gsl9!m4AHdWI0Α9,xNJ~IGh]?}tr/R?y?dDa@g?Th]? |f?>?xUl?iFVEN?5:AeF@?<}tr/R?yp;&B?<>I P?8 >XCV?u=7(7W?y=0/M?$>XCV?u=M?L\?O=/ <>?V->45,U 0?L>p;&B?<>0/M?$>}(L?Ta=/ <>?V->0/M?$>7(7W?y=N <=@(-J=0 $7=)Z=Y7-~Rc=Y7-0*Q!=){嚾=0 $x=@\ M=KoҖl#= '=7oA}=K*0=}+Ԯ`=8ӎ= =KgZu=%%񩽤o='3J=ʈ>[G(=}D=}D`jׄ=ʈ>h='3õ¾ <%%o᰾3vx;c:`o443z쾳,mzl_4ԋ+<3@EB=J#<0</],=JBο]=P2v'S=sXY =sXmګiV;P-ȾJBtվC/2.Ҿн)Vz_! :g l5rl섽, <^_:Ј< .)3=3wt9:' NȨ]F$ f~*f#ޔ]ǾۆN$]־)t9Ҿ*A.#4&P]b4jCXӹg7T7^K5C0pvJ>0Hew3[ƨsl9^ 4ABhw=,59IG þ6?y<*K?y?t?<(jp?<*K?y< þ6?y<|?5:t?< þ6?y<楾/?O&]?ub>r kZ?ub>C!n?20>p?20>]pb?I>&]?ub>p?20>{:s?M#>݇^*G?r>_B?r>r kZ?ub>&]?ub>WAg|N?%S>݇^*G?r>&]?ub>]pb?I>r=M=K==@==0 $ř=Q!=)a=Rc=Y7-٫<=Y7-_=)J=0 $`<=@uM=K8ӎ= f'FԮ`=X*0=­d(> <%%>='3=jׄ=ʈ>$3==}D_(=}D_sJ=ʈ>o='3m&u=%%J+B=>+<3 ׽NFc-Amz쾼[3TG>н)i=N>C/R3>JBZ=iV;P$3=Y =sXZ(v'S=sX?@]=P\?],=JB9g0</!n .)6S<^_x,Lrl*#< lx= ?>z_8H>*A.#ɲO>)t9)2>ۆNb=ޔ]a=*f\t$ f Ȩ] ^' Nc焾3wt9"ǽ.#_&tw bg6K5CT]ŽT7ߏӹg7ê=jCD>P]b͢%>/-P,>vnKBp>GU=3#Bwc3<~?k8齠?k9CBwcuiA.O82`U{)y*v0z" J>0tPw3.;.sl936?yc?>?I>C?D l>?Gj<*>6?yC?D m>4?D #>t?<ǀ=|?5:e=`t?*>6?y<(e>(jp?<#>t?<*>6?y?Gj< =]?ub>\<3Uc?J>=:s?M#>_=p?20>p>Y?a> =]?ub>_=p?20>;>!n?20>J=^*G?r>\<3Uc?J> =]?ub> >B?r>J=^*G?r> =]?ub>p>Y?a>d>; ˰>ՎKÙ>Hl@>ِ 0 $>)Y4>{^;Y7-Og>T?$=)"->F;=0 $>`-=@>0RB< %%>.>> )q]>s[l|>d,>&'3> u>4< %%圪>?ͽ'3|>pyqʈ>4Ƅ> }DQ>{<}D)>B<=ʈ>g/=N:g='3{&=M=%%H=E<f=x˻3 =Cc,>ŋ=>-z쾸w>hc>@_1>&+~)>ι`/>Q2JB>P!u>1]sX\+> sX\= a3Vl3]>xxoz>5bp>.#.>cØt9!>N~>hC]*DL>~f="f*=-]!輛?N}*:t9WɽY.#&Pb-AK3C1cC@>˾+nn>ƾ- >+KB% x>"UQ>LBwc,>Q?k^ϖ=L ?k7zuBwccUx KBn-\ D+?{ K= ľ = Aؾ{)>5վO8+>ɾG}#>+BV>ܢCa8|=8gA0#ȾJ>0 <Ͼw30l>Α9,hJ~IG1?]?NP*?g?MQ ^A?Ul?iF+TE?f?>??SK?`?D ?EN?5:G?0\?cNP*?g?MQ1?]?.?F@?<?EN?5:1?]?M?$>8>"W?=nQ?L\?O=xG ?V?u=*?A?;>*>M?$>xG ?V?u=? P?8 >><>?V->dv>(L?Ta=8>"W?=*>M?$>>U 0?L>><>?V->*>M?$>*?A?;>X>Nr> g>(Kp>&+~@z>Xj0 $n>O)^y>:0Y7-C>UY7-*>i)i>oѽ0 $n>ɽ@U>fٽK> >J$>ߣ:Ѻ>B2Y>c>+/3x|>3>倫%%>'3ڒ>uʈ>\u>F}Dx>}DVۭ>"Dʈ>4>}'3j>l%%Ow>o)p>~x۽3`y>z!>;ZzkН>zXzE>ƾpӱ>?پ_>G޾)Z>pԾ/><JB?>3Px>LlsX8>a"sX>̽Pke>%JB:[7>EX/>8b)->1_>+:A>C킾l&,s>ϧlkd>*C>bt>O.#?c>t9>ھNN>cʶ]>ԍf>KfT> 2 ][j>N=Yѫt9_=gֽ.#9v=nb=dC^=o7L'>[þ7W^>K T>C+ > -AƏ>5KB>r7U%>.̾Bwcw>V?k=JF>7t?k{ >YHFBwc= U=KB$<))-|: X+R({)+>O8d&B>G:H>eBVS=>پCaU#>h&8g=v럾8g=/Ca=)tBVK;ywlG[{O8iüF{)ZNΨ;I=쾎w3# =+sl9Z4=D4A~=7WI=M龶iQx=۾^W8|=˾ߗZ=ϪߗZ.1=~^W09s0.>&+,a=QӾIGĒ?s?MQ??T ?۽?ŵ?]ͽL?$>iF?>OĒ?s?MQL?$>iF?>>?؆?Ƹ>c|?[v ???T ?۽Ē?s?MQ™?Y>5:؆?Ƹ>cĒ?s?MQ?>Omhf??J=h?$?ZٻlW~??xL9^z}??<{h?J?p=mhf??J=^z}??9Ծ^ >qR> >K>@?w0 $d?h޾)?܃;Y7-Q?J~Y7-ؒ>d)>Ȩ0 $>@$>烛K x>ջ >},z>¾C>*zRx>c5> 3]>>%%mf>'3?\ʈ>>־}Du>}D_@>җʈ>{+>%'3*[>o%%>t?>v㉾pn>Mc>&¾z쾧">Wsl侹Ɲ> ,>_>!)>/P>JB>JMPso>sX>sX#>׳Pڽ>~dJBb>I/>"P)GJ>nx_y!>l${>3ƾlQC>a7b>ܺCN>#bA>W*.#~ >x(t9?պ> N>E ] > fī>J~fҦ>lj]>߄eNO{>?bHt9SV>xO.#[:>zbn->YC5[0>Jξ7'>& $6>r?#+]>*)-1> @(KB%>_TU>й BwcH>?k>lƾ?kgt>㌟Bwc`P>L:U_)>kKB>;rr-s\=q+;=E 7ܫ=/=O]{)>у O8SM*>n1GS=>BV7G>k Ca&E>8g7>9Ծ8g6~!>]CaoT>GBVg=G==žO8f=NΨ{)O@=8¾,=aJ>0$]=w3= sl9=@e4A#=WI0=' iQ1=^W={0ߗZ8=*ߗZ8\=Ծ^Wi=gUȾiQ΁=B¾WIJ=0ľ4A=th̾sl9y =)ھw3 =G\J>0">lƾ,Uk=WsIG]?n)м۽?ܥt ,?kvu?$]ͽӨ?+FcT]?n)м۽u?$]ͽ?ٽiFL?T#<?qĽ?5`>- ?8>[r?g\>ϔ?I<>c'I?i[>qĽr?g\>?>gqI?>ݟ?KF>*J?5`>- I?i[>qĽzW?mW>6I?>I?i[>qĽϔ?I<>c'`>cJO>+MO>`'0S+¶>|H-h 0"a`>)x/]i>X$=w>z7>z >- =w@>q>,+]iP>"a] > h 0S>r8P>"82>1>t>;J>/AX>?kmhx`z>z8wr>+Gku>RU>Z >.k> w6>ؾkmhO>ؽھ.iXf >龖J>ܙ>>4 0V%/>!0V%Gԍ>s5\<-3x>׶C;T>tJN5>Hc4>?4?v>.>S΍)>A>΍6E>Ᾰg> ľv>@c#>kNU><;;y>x\<-|z>\qg>q@I>4Z 3#>qC0S9=(JnEG=P(Iu[=>jpTY=e,hi=cJal^=|a^=JӾN>jjpnS8>؏u[UZ>nEzs>-0~>^Z ]6>V >h s=,W=*;e*۫#=BZ=<;q@NRn[v6`e&&shr({|9b({K<弾e*!>ݾ<7!o;J",p/*˼b18uGn,0EHi(,W3^8 Xbɋ4 ?dhlQ?dhGEپXb-pþ,W2<︾EH1q$=\8>j=EXʾp/* ܄= 㾨 )`EFKϟ/{7a@FE Gɶ'N\@JQ@Lѳ@JQ"쾤NPb0G2& ۾@=]ܾ7yϟ/X ly%):>SgX:u?M#7?)Bx?<˰U?#9׬;?$4u?M#7U?#9׬?b:{(?`/ũ? N?)Bu?M#7#?s{(?`/ũu?M#7;?$42?jTB?R¾i?Oı?d㾮{?˹2?j?d㾮;?Jx,h?N?y5TB?R¾i2?jQc?pygZ,h?N2?j{?˹ }>T=0Sk2>qEO >MOj>elS0S>> WhX"a(i>RV]if>/Rq+m>vK=w{>[Cz> 5=w1Ԟ>f1q>m0]iS~>L2"a>V6hO0>̟>I?8>^gM8#o>Y>\E>۩`JK$>@bX>l_kmhO >RVw >XiJ1> <W>I-]<> 7"A>̬w>s'5h>XM>U$J]>3"\<-‹>v50V%:f>G0V%[.>8W\<-4=a;5=$cN*lF=s_c.=:TvY%m=CCz=;1΍>W΍ȧG>Wzݙ}>YvB>Rc64>>N>>]x;^|>z'Z }CV>v)qS >-m=q=(NZ /(=X0Jث[nE` 7Vu[4$JjpK19T_^뾥jpi>u[l>=nEP>P0(>Z >,=/T<>PʼHe*dNKZ=3NkGNRw̽;`e#+sMq({7q({W=lBsq=qھ`ea>cԾNRH2>ݾZ=(8>x>e*Ao=?J",^3p/*ҽ58Ne=o2EHFg:\:Bݛ?0rB ?P7'N?Oг?맿˰ӟ?/Bݛ?0rB?맿˰^?R׬.?둿NY?ؖ ?P7'Bݛ?0rB?yũ.?둿NBݛ?0rBӟ?/κ?t ?(>|ƿ,?އRY?ӅxS?.rwκ?t ?ӅxS2|ƿκ?t o?n\3N?v_-κ?t ?.rwh>q^h|d0S06?>EjO̧ >W`oOȐ>s0SY=thT7\z8>X=wߟS>(Vq8f>`W]im>!]Z"asņ>NJao>*Y>@>c8 >a-m8j1=s>zF<vJ uXBpkmh^&7hw@ Cd>K?vJ>[/Akmh<2>YFX>a;;g> H\<-*>V0V%~=p(c0V%&w,[>((vX>)c^>m0N'0B>c6Z />vEq0B=Rq{^\Z ͽɢ`0 \^nE*'Wu[^}Kjpo罂;=E!.ag< aU=?5>jpUf>u[=z>qnEj->e*t_>m$>=Ge2|h!G uKe*^9IZ=K0CNR?=8`e*sW({(v({e=s=#`e$M'>[=NRW9>U Z=>+=f p/*m=H#ʽ 0w #3p/*li9=o28/8GD-EH^>$,W5 nXbQ⽩?dh{c7q?dh_:WiXb I=%a,W@=EHc=81^ϟ/Zs )Aӽ )spϟ/w 8 7wwA@X&Gh "NX @JQA>@JQINI)G0@U$; d7 &>kigS2 :YK?׿'5nҿL?ۼǿ)˿KT?3ſ[@ʿ\_?hɿ ?S?%ϿKT?3ſ[@ʿ[?Eſ:ǿL?t ѿG:?ԿwD?>nҿ ?S?%Ͽ]?5ɿL?t ѿ ?S?%Ͽ\_?hɿǖ=t"a =7xhTfX<=9mJ=|s>C9:!UW{J1?vX. Dvpkmh^ /iw9_Vc e]ZHkg=D\Y=?[w ><`kmhJ15>}RN׾>[;c=E1d\<-Kϕ<hNrMjH`cq(k]EWv~2ƔNGȽRG΍Q5C΍c=&BBt>"Dv.>XJc`6>Lnn/F0Ե=OOZ b;Z7WqSa[qM1\Z x%Z07SnEk[Ku[#ۚAjp.N28PE0aߗ߼+a5v=p*#>-jp/>3u[(>߁'Z=i=0e*y=59w@@̽DN9#E1Q{'Be*"NRܠ=8m=p/*'|<1t$u--k` +p/*Qc~5'8G+v!EH:nn,WBXb?dh5 ?dh[{ Xb{w6=r ,Wf*=EH/' 7Zϟ/(@|))(),dϟ/`<)7?@'3"G Ni@JQS@JQoUmN"мy~Gp @Q?|g̽ :"Y>Y>5>s"Y>ysX >U4"Y>"Y>ysp{>`гQ>B0=lY>"Y>>Q>B"Y>X >U4gYi>|_׿&>$_׿DNE>Y]뿐пgYi>w꿐п&>߿ >ԿgYi>|_׿gYi>w꿐пӅ>EϿ(Sa>ԿٿN >ֿٿ&>$_׿gYi>|_׿0>LԿտ(Sa>ԿٿgYi>|_׿&>߿ >ԿN/z]inc}"ao%h -|8NpDy8|s>ҫ9mJSTfX 糾<`kmh_뤾?[wYWZhf]PVc7iwM&=jH`c =>hN\zm;׋p\<- {o0V%hoFa-m88ξc84*Y>2INJYFX[/Akmhu@w-Ⱦ CqOIԏ4S&pP]\vCgc=anNk1uo;÷rk\<-D㞾p(c0V%þV0V%e H\<-a;;m0N)ciܾ((vw,l4΍VcQ9A΍S%1O.z}Kjp+H'Wu[V^nErɢ`0<^\Z eㆾRqϮvEqϾc6Z ]I'0^qnEu[{ɾjp3Y?|t{ a+!.aZҽ;=>=8`e콋0CNRIZ=ϠuKe*@S!Gb\>xGe2ym$tgže*/˾U Z=Q*¾[=NRn#`eAstK(v({ӯ({߈*sG$,WzD-EHJx=o28#3p/*U 0:HNf p/*X8ӘEH|%a,W]WiXb($7q?dhe׽?dhGsnXbL&GzwA@8 7'pϟ/潕 )%|Js )Z^ϟ/֘_ d7X0@E)G*N A>@JQ/ٽX @JQp="Nkig]2 :M׿'҃gֿB0˰7ԁг s ۿM׿'7ԁг{俻s1|q̿66HyʿN҃gֿBM׿'miKп1|q̿M׿' s ۿv@%Ͽsv죹ɿW#Eſ:ǿƅ3ſ[@ʿb{)I|rҿv@%Ͽƅ3ſ[@ʿみۼǿ)˿l t ѿ(5ɿsv죹ɿv@%Ͽ'SqԿl t ѿv@%Ͽb{)I|rҿvK=w/Rq=RV]i辒X"a_ WhZs^gM8(I?8 O0>U$J޾XU hvkmh2̬w!^ھI-Ǿ <j(CCF:TvDQs_c8є$cNa;ž8W\<-G0V%\Fv50V%h3"\<-3 ]x;[>NRcPYvWҾWzhW΍;1΍D1923JjpXo:7Vu[W[nEX0(NZ i-m=q~پv)q=z'Z ;P0|=nESu[v˾^뾥jpl-Y/(aTka$a#+s ;`ekGNRLKZ=CHe* y> /Je¾Z Sʾx>e*ǾݾZ=VcԾNRoqھ`evlBs[7q({)q({K{ͽlXbZ),W=o2EH58O3p/*>J",'p/*Әݾ8~,־EHuv{^۾,W,Rts꾋Xbi'?dhӯp?dhmԽNǽfGV̽8 @Yw7pϟ/K)KT9)ZxTϟ/X7LK@:G?s$NN D@JQA@JQ\fFg\:2~0rBV7R׬맿˰42~0rB맿˰ﶿOг둿N2yũV72~0rBؖ둿N2~0rB4[t }ri"ݼ}:b`yӅxSp4{ƿ[t yӅxSoͷއRYv_-~n\3N}ri[t fثsik#ȿv_-[t p4{ƿz.X$=w> ?"8_r8Iܙ>R龖J>KھX4 ؾkmhl!vチZ `S΍y.?4?v,ɾHcؾtJN׶C;Xs5\<-w7!0V%9 4 0V%~ x\<-<;;q9kNP@c5 ľvѾᾸ þA>΍LcJa[e,>>jpP(Iu[Ҭ(JnEYTqC0$Ӿ4Z 0d⾜q>뾱\q/^Z @-0۾nEvʾ؏u[1+jjpp[JӾZ|a1Hr({E&&sxLOv6`ePf;q@NR;BZ=U*;e*`,jwhݾṾ弾e*^{!RZ=̎@'NRy೾`eOvfоs9!Zb({4 ?dhe8 Xbʶ(,W*+n,0EHDCb18:!_J",p/*y7!º 㾨ˋEXʾp/*\8m︾EH,Rpþ,W-7EپXb"Q?dh5\@JQ'N GV@{7&v+Kϟ/9)FNy%)Jyϟ/ג@]ܾ7a3 ۾@?s$0Gn 쾤N_a ѳ@JQSg":qѿM#7v"Կ %P׿b:տ#9׬]Ϳ(PgqѿM#7տ#9׬Կ<˰kȿ`/ũ̿sv"Կ %PqѿM#7GĿ Nkȿ`/ũqѿM#7]Ϳ(Pg"Vʿj'bͿ 7пJxt6Ͽd㾮ƿN"Vʿjt6Ͽd㾮XͿOı ¿NAƿpygZ'bͿ 7"Vʿjy5 ¿N"VʿjƿNξz] zH m=w<6q؝8!]i!Gy"aFh Oįq.p=wc9ξᄇww4 kmh>XRSJI>_8?f¾8: >4JN:XVކ5h䢕w羨宾`"Ҿ΍ þF΍Ѿ"5^ vP'cq9&NL;~ ( \<-9 /0V%w7¾0V%X\<-1V~;ؾbN,ɾ9icJ0vy1LھaZap[1+ )jpvʾx0u[۾.nE@f5$0/XZ >dq0d⾎Ⱦq$ӾKZ YTNj0ҬanEPhu[>xjp[11H({9!Z({Ovs'\)`e̎80NR^{S.Z=Ṿ$e*XDIjw Ӿ`#ˬUDe*;pZ=PfQNRxLOI`eEKs/?dh";?dh-7hXb,R!,Wmf&EH%8ˋA p/*º~yF)ľ:!_3Tp/*DCKӣ8*+?EHʶ;,WeX~ξXb5d@JQ_a {@JQn g N?s$Ga3i@ג@x7Jϟ/FN9 )9 )&v+0Pվϟ/Ͼ7Vо@ پGz澤N"Ҿg"DI:E˿c(P$BϿ|QԿ󽃞ӿܽ}ȿ>E˿c(Pӿܽ_uѿ*׬seƿPiꕿ$BϿ|E˿c(P轿:/ũsE˿c(P}ȿ>eS>D>>ATrſ'm>*ÿ>@᝿SjM>jeS>ÿ>@᝿K¿+ >''x>\Ô;&]>b:D>>ATeS>DCr>u'x>\ÔeS>SjM>jY_=w$d#p~zCz.=wWqI5 ]i "aAh(8ZsW8 (>lѾ# J𼿾a.iX1TSkmhgH1wj(4}!΍hɾ΍WҾ羸PXvc[N3 ;hb2\<-\F0V%m0V%žQ0\<-;8єNDQaccF(I3TO?p/*Қ8LEHZ貾,WmԽ<徤NF@JQN @JQ?s$t_N:t GL @X` 7Z("ϟ/KT*i)0Pվ)p&;ϟ/Yʾ7V̽X~ξ@ǽ׾G\f>qgd:-*>f鯿>n->ղv>.T>4-*>ղv>ᐰ=>>ꕿXѧF>|f鯿>n-*>@>s>ꕿ-*>.T>4N&?wqg?.;?Fc?vLⒿ!(?⍿N&?c?vLAg??uY'?]1_?pwqg?N&?'=*?!uY'?]1N&?Ⓙ!(?⍿G6Mٴq_=w}z2V>Tzʾ*=wSؾp1q .]i\ #"aɗh8ξk8F8Еr'v>|xHMIYW9XXIekmh+{vS%@mPVc&&΍le˜΍eiܾoGv輨`e߈sӯ8;({tKw({AFsn(`eQ*¾NR/˾Z=tgžɶؾe*yx9Ρb\(@S oϠY_e*neZ=콋T7NRG Ӽ,WGswѾXbe׽v?dh($Z?dh]Xb|ћ,WӘqEHXcG8Np/*:8&۾Uエnfp/*JxL8z_EHLz(ݾGp=T辤N/ٽ@JQ F@JQ*tNEOUGX@֘_W7Z ϟ/%|J)潞о)';;ϟ/X~ξ7zԾ@1Ͻg]2:img]?n8|wV?hg}X?u)\?d\\_?蜿img]?nu)\?$o%^?Z*sU?|7mL?f8|wV?himg]?nJcY?ꕿZ*sU?|img]?nd\\_?蜿fHq?@kp"V9 k?_jR\/=m?ż$Up?_;Tt?$_{fHq?@kp$Up?_kN[r?nep,:i?^!LHa?V"V9 k?_jfHq?@kp)Mm?Lcmp,:i?^fHq?@kp;Tt?$_{N/ὖ ]i5aNFq=w^3JzWzVNpy 8 -`ּ8۽Ѽ>3oJs?EXM&= c/b<0v+wRF o΍BO-΍\{]yvž/ccdɾ ;CN+c.;ܞ\<-hoU}0V% Gߝ0V%׋C\<-\zӪ; =mؽN=_u[<=cjph2ŽraAЮaF\߰OjpFƾu[̳ɾ/nEٺst0RNZ jc&T0q] q.(zZ <$03=H=nE=wNRUPA=`e fsa};({ -*%־({,C ؾshDҾ`e״ǾNR Z=Ie* Í-FMzwM-X >=A kmh=w&i=%" edj9_\^ /Y}ʽw. DlOkmh1??EX:!J)jݽ>zI=`ּ8–<=@JJ15> ;CN.>/cct>yvc={Q-΍GȽF o΍~2wRq(k0vrM c"mؽNYӪ;C\<-Gߝ0V%Kϕ.;`6>/nE/>u[#>Ojp5v=߰ߗ߼ЮaPEra.N2#cjpk_u[H=nEx$0M1(zZ S qb;&T0qԵ=RNZ >st0(> Z=e >ǾNR=Ҿ`eh = ؾszI=*%־({V};({NTfsʭ`egwNR"<Z=1Q{ye*N9w̽zwy=-i=e*ܠ=!ؾ8f*=4EH{w6=޲,WXbv-?dhȍ?dhB-޾Xb:nwѾ,WGqþEHQc~^|8k`®p/*u-Ӫ'|K?h =?n >ӯ?HB>i}?q>Y^?L.>K?hHB>i}?Tf>?>Ɂ?f@=C?| =?n.>K?hp>@?f>Ɂ?f.>K?hq>Y^?L=݊?`q=:?qf=A?X{2>;?w=>*?ل`=݊?`2>;?w>3>)?w=[?AM'R1?AM=[?AM=݊?`=>*?ل`h>ɗh #"a8f> .]iߟS>p1q8>*=w>>Tz-=}zEo==w ʢ=Mٴq5=Ǝ]i'=at"aY=Njh50Ş >c`O06?>5ȽOX>~0Ssņ>BRJ<2>sXJ>:kmh8f>ݍwۈ4>-=)f;A=a_@@=>b58@>k8ao>(>>Տ;^> NX>oGv>e=e˜΍;&&΍\@mPB6+{v|VԽYݽcA7YNO,w/;&<ϵ\<-~=Ώ0V%*>N10V%g>Yi\<-0=z>ξnEUf>Vݾu[5>*ྥjpU=Yؾg< žaE^ao!^]jp*t.u[ \;nEͽh 0{ Z 0B=Aq/>+wqB>ҙZ j->ɶؾe*W9>Z=$M'>NR=(`ee=Fsw({W8;({s?`eKT7NR^9neZ= Y_e*|h o=9Ρt_>>+=p/*c=cG8@=qEH I=ћ,W_:Xb{cZ?dhQv?dh5 wѾXb^> Ӽ,W/8G_EHli9L8w fp/*#ʽnm=8&۾1 ϟ/U$;W7@IOUGItNF@JQ@JQh T辤NXz(ݾGwԾ@w X~ξ7s;;ϟ/Aӽо)Z) &>1ϽgS2:1?mg]?nq%?k`?7?%^?ƛ>?)\?d??4V?L1?mg]?nƛ>?)\?aF?X?#?*sU?|h?cY?ꕿq%?k`?1?mg]?nWg6?L?f#?*sU?|1?mg]?nd??4V?L$?q?@kp?t? {)?[r?ne?p?_N2?j?'j$?q?@kp?p?_r%?/=m?ż?i?^u_>Mm?Lcm?t? {$?q?@kpB?Ha?V?i?^$?q?@kpN2?j?'j }> B0S>h"a> ]i1Ԟ>Wq>.=w>Cz{>#p~z+m>Y_=wf>)uDq(i>H1]iWt>Hc*"a>>f-/h?0S >XOk2>*>M>J>ξX뤦>վkmhA>/?Ѿw]<>*¾W>51>C >-cO >H1w>SkmhK$>X\E># J{Cm>)>>W8̟>8]>b2\<->>;64>NB>cݙ}>XvȧG>羸>ɾ΍z=!΍Y%m=4}.=(IQ0\<-:f>m0V%‹>0V%^|>IܾZ P>'l0l>E nEi>u[m5:> jp=6=waT_<ԼaK54$y%bjp` 1u[JثnE/(=̉*0=0UZ S >lq}CV>ުq(>(8>(- e*H2>fZ=a>2NRq=+`eW=.+ sZ({MԾ({񬽂Lsw̽֎`e3NpNRdN^Z=PʼMje*T<ڈ,=z>A]̾Ao=͸=` p/*@=_8*=NEHw<,W-XbwVlZ?dhWy?dh콺˾Xb>qg:d:>?*>S?>P?=>4?v>b ?w>R>?*>4?v>?->%r?>ꕿ?>sS?>P>?*>h0?F>|%r?>ꕿ>?*>b ?w>R;[w?&?fn?()?Q~?g??ƒ??vL?}?;[w?&?ƒ??vL?;?F d?Y'?]1` Y?=*?!fn?()?;[w?&?}q??p d?Y'?]1;[w?&??}?`>ھOu*>*뾴0S] >hGy"a>8!]i@>6q >m=w7>z>ξzoء>p=w>Oįq`>v]iJ>X"a+¶>hط0S>pǾO>8>>f >SJf>X6>kmh.k>w>RU>ᄇGku>ξr>宾x`z>䢕w>:kmh>:XΞ>򎾲I2>>P>f¾8>/0V%y>( \<-U>L;#>&N>'cg>^ v6E>")>F΍>"Ҿ΍>14>J0v5>9icT>bN3x>1V~;Gԍ>\<-/>¾0V%|z>dq~>XZ zs>f5$0UZ>.nEnS8>x0u[N> )jp^=l^=ahi=ھaTY=1=xjpG=Phu[S9=anE3#>Nj0@I>KZ g>Ⱦq]6>DI!>X>$e*}=S.Z=2,=80NR'p='\)`eK<<s|9({h({Ksn[I`e Ӿ ܄=~>j=A p/*1q$=%82"ҾgXDI:U.?c(PP"?\J<7oԵ?*׬z?ܽ[?=~蜿U.?c(Pz?ܽbX?󽃞C?sG?:/ũP"?\J<7U.?c(PĪ?PiꕿC?sU.?c(P[?=~蜿u?S>p?P.N>?+ >'P?>@᝿1?ؖ=>N8u?S>P?>@᝿.?'m>*7?x>\Ô?DCr>up?P.N>u?S>?&]>b:7?x>\Ôu?S>1?ؖ=>N81tR~ݽZ꽆tR# {tRF1.tRi(U{tRͶsZ꽆tRtRy7tR([tRͶs`ztRi(UetRF1YtR# etR~ݽ`ztR1([tR4ۥ7tRZX烾m7XirX烾~ݽX烾F1[X烾ͶsX烾XirX烾k<"D?퍽&D?퍽 X?%A5 X?=A5D?>k<"D?%A5 X?+bP= ?uW?F1LtRDgtR~ݽ2tR8DgtR/LtR tR2tRFtR/ᾆtR8@׾tR~ݽ4ԾtRF1ᾆtREFtRkL2tRE tR*i j X烾F1~)X烾~ݽV(-X烾/~)X烾H< j X烾I=LX烾A~=2X烾I=X烾H<žX烾/精X烾~ݽHX烾*ižX烾y'F2X烾yLX烾y~)ӫE+6ӫ~ݽ~:ӫ+6ӫI=~)ӫ=Dgӫ=2ӫ=@׾ӫI=精ӫBӫ~ݽӫEBӫy精ӫK@׾ӫ<2ӫKDgӫ'FV(-ھkL~:ھ~ݽ-?ھ~:ھA~=V(-ھ=2ھ>2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4ԾھJQ2ھ<2ھy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾<2KDg*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižy'F2yLF1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&kL2~N&E ~N&~ݽ2j?~ݽ2**ižp?F1g}?ywo?*ižp?F1g}?EFg}?y精O\?EBO\?F1精p?*ižp?K@׾O\?y精O\?*ižp?ywo?t־eG X?׫! X?PYpkde?de?X龃?uW?t־eG X?de?ľ4de?X׫!D?ľོD?׫! X?t־eG X?.pkD?X׫!D?t־eG X?X龃?uW?k*nجtRꟽetR~ݽ`ztR(5stR6`ztRi(UetR*iجtRpjtR*itRi(U-ɾtR64ԾtRꟽ-ɾtRk*ntR|QjtRc2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*/精p?8@׾g}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?~ݽO\?~ݽHp?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?=h,=([tRI=7tR=h,=tRsz7X烾=ZX烾eJ=irX烾sz<X烾/[X烾~ݽX烾&irX烾kLZX烾Y7X烾kL`zX烾&8kX烾sz<HX烾eJ=8kX烾z)&>eӫx7>7ӫz)&>{ӫ=ӫ=h,=le<ӫ/n.=ӫle<ӫkLӫ}{ӫy7ӫ}eӫkLHӫ\ľӫ/ߔ;ӫ=h,=\ľӫ=Hӫx7>Yھ4J>7ھx7>.ھW>[ھI=n.=ھ/C_y=ھ n.=ھY[ھy.ھ7ھyYھY精ھ ߔ;ھ/־ھI=ߔ;ھW>精ھz)&>ex7>7z)&>{==h,=le</n.=le<kL}{y7}ekLH\ľ/ߔ;=h,=\ľ=H=`zW>7=ZeJ=irsz</[~ݽ&irkLZY7kL`z&8k~ݽH/精sz<HeJ=8k=h,=([~N&I=7~N&=h,=~N&sz2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?~ݽO\?~ݽHp?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?H4Ծӫ>jӫ>`zӫ-=0ӫH@׾ھ:+>jھ>(5sھ=D\#ھ<4ܽھ8ھH(4ܽھ+xD\#ھ햾(5sھKjھ햾@׾ھ+xھH(1 ھ8ھ<1 ھ=ھ>4Ծ>j>`z-=0H2ھ=4ԾھA~=Hھھ~ݽ<ھkLھy精K@׾<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEB*ižy'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精F1~N&EF~N&kL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&~ݽ2j?~ݽ2*H<žp?I=ᾈp?Fg}?/g}?H<žp?/g}?I=精O\?=@׾O\?I=ᾈp?H<žp?BO\?I=精O\?H<žp?/精wo?iP>eG X?1iv> X?F,>4de?9>de?9>׫!?uW?iP>eG X?9>de?DV=pkde?1iv>׫!D?ٓ>pkD?1iv> X?iP>eG X?F,>ོD?1iv>׫!D?iP>eG X?9>׫!?uW?~ݽ\4tRDhtR|!=;tREPӫE_@>ӫ'FW>ӫ(M=ӫ˾=;ӫ`uԾDӫ˾&(ӫ(qӫ'FӫQqӫH<&(ӫھE{$>ھۑ_@>ھKȹi̹=ھ`uԾP<ھnݾDھ`uԾR/ھKȹ*ھۑBھEھνBھ*ھ<R/ھ;[B=DھH<=;QM=~ݽW>E_@>'FW>(M=˾=;`uԾD˾&((q'FEB~ݽQqH<&(2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4ԾھJQ2ھ<2ھy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾<2KDg*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižy'F2yLF1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&kL2~N&E ~N&~ݽ2j?~ݽ2**ižp?F1精p?@׾g}?F1g}?ywo?*ižp?F1g}?EFg}?y精O\?*ižp?K@׾O\?y精O\?*ižp?ywo?t־eG X?׫! X?PYpkde?de?X龃?uW?t־eG X?de?ľ4de?X׫!D?ľོD?׫! X?t־eG X?.pkD?X׫!D?t־eG X?X龃?uW?1tR~ݽZ꽆tR# {tRF1.tRi(U{tRͶsZ꽆tRtRy7tR([tRͶs`ztRi(UetRF1YtR# etR~ݽ`ztR1([tR4ۥ7tRZX烾m7XirX烾~ݽX烾F1[X烾ͶsX烾XirX烾k<"D?퍽&D?퍽 X?%A5 X?=A5D?>k<"D?%A5 X?+bP= ?uW?kL2tRE tRF1LtRDgtR~ݽ2tR8DgtR/LtR tR2tRFtR/ᾆtR8@׾tR~ݽ4ԾtR@׾tRF1ᾆtREFtR'F2X烾yLX烾*i j X烾F1~)X烾~ݽV(-X烾/~)X烾H< j X烾I=LX烾A~=2X烾I=X烾H<žX烾/精X烾F1精*ižX烾yX烾<2ӫKDgӫy~)ӫE+6ӫ~ݽ~:ӫ+6ӫI=~)ӫ=Dgӫ=2ӫ=@׾ӫI=精ӫBӫEBӫy精ӫK@׾ӫJQ2ھ<2ھ'FV(-ھkL~:ھ~ݽ-?ھ~:ھA~=V(-ھ=2ھ>2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?BO\?/精p?EBO\?~ݽO\?~ݽHp?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?A~=Z꽆tRi`=DtRA~=\4tR=h,=DhtRH<=;tRPX烾>DX烾I >DhX烾=?'=X烾=h,=M=X烾i̹=X烾1M=X烾?'=X烾H8DhX烾EDX烾H8X烾1LX烾1qX烾*=h,=qX烾=1LX烾;:>&(ӫBK>Dӫ;:>=;ӫI >M=ӫA~=W>ӫ_@>ӫ~ݽW>ӫH8M=ӫ*i=;ӫ1zDӫ*i&(ӫH8qӫA~=ӫI >qӫBK>R/ھ^^>DھBK>P<ھ>i̹=ھi`=_@>ھ{$>ھG^_@>ھEi̹=ھ1zP<ھ'φDھ1zR/ھE*ھG^뽊Bھھi`=Bھ>*ھ;:>&(BK>D;:>=;I >M=A~=W>_@>~ݽW>H8M=*i=;1zD*i&(H8q~ݽBA~=I >qI >>DI >Dh=?'==h,=M=i̹=1M=?'=H8DhEDH81L1q*=h,=q=1LA~=Z~N&i`=D~N&A~=\4~N&=h,=Dh~N&H<=;~N&P<~N&k*n=;~N&1Dh~N&~ݽ\4~N&G^뽶D~N&~ݽZ~N&1~N&k*n&(~N&R/~N&H<&(~N&=h,=~N&Dj?D*1qp?1Lp?1g}?k*n&(g}?*wo?1qp?k*n&(g}?R/g}?~ݽO\?H8qO\?1Lp?1qp?1qp?*wo?d?D. X?H|J; X?d?DXʾde?%5Ծde?ޥܷ?uW?d?D. X?%5Ծde?ޥj׾de?%XD?7.D?H|J; X?d?D. X?ޥx2 D?%XD?d?D. X?ޥܷ?uW?kL2tRE tRF1LtRDgtR~ݽ2tR8DgtR/LtR tR2tRFtR/ᾆtR8@׾tR~ݽ4ԾtR@׾tRF1ᾆtREFtR'F2X烾yLX烾*i j X烾F1~)X烾~ݽV(-X烾/~)X烾H< j X烾I=LX烾A~=2X烾I=X烾H<žX烾/精X烾F1精*ižX烾yX烾<2ӫKDgӫy~)ӫE+6ӫ~ݽ~:ӫ+6ӫI=~)ӫ=Dgӫ=2ӫ=@׾ӫI=精ӫBӫEBӫy精ӫK@׾ӫJQ2ھ<2ھ'FV(-ھkL~:ھ~ݽ-?ھ~:ھA~=V(-ھ=2ھ>2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?=h,=([tRI=7tR=h,=tRsz7X烾=ZX烾eJ=irX烾sz<X烾/[X烾~ݽX烾&irX烾kLZX烾Y7X烾kL`zX烾&8kX烾sz<HX烾eJ=8kX烾z)&>eӫx7>7ӫz)&>{ӫ=ӫ=h,=le<ӫ/n.=ӫle<ӫkLӫ}{ӫy7ӫ}eӫkLHӫ\ľӫ/ߔ;ӫ=h,=\ľӫ=Hӫx7>Yھ4J>7ھx7>.ھW>[ھI=n.=ھ/C_y=ھ n.=ھY[ھy.ھ7ھyYھY精ھ ߔ;ھ/־ھI=ߔ;ھW>精ھz)&>ex7>7z)&>{==h,=le</n.=le<kL}{y7}ekLH\ľ/ߔ;=h,=\ľ=H=`zW>7=ZeJ=irsz</[~ݽ&irkLZY7kL`z&8k~ݽH/精sz<HeJ=8k=h,=([~N&I=7~N&=h,=~N&sz2ھ=4ԾھA~=Hھھ~ݽ<ھkLھy精K@׾<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEB*ižy'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精F1~N&EF~N&kL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&~ݽ2j?~ݽ2*H<žp?I=ᾈp?Fg}?/g}?/精wo?H<žp?/g}?8@׾g}?I=精O\?=@׾O\?I=ᾈp?H<žp?I=精O\?H<žp?iP>eG X?1iv> X?F,>4de?9>de?9>׫!?uW?iP>eG X?9>de?DV=pkde?1iv>׫!D?ٓ>pkD?1iv> X?iP>eG X?F,>ོD?1iv>׫!D?iP>eG X?9>׫!?uW?'?0iV>p?OF =>z?];ek,>@?@x@%>@?ZH])>z?^"8>p?׋OO>?&VC]k>L?>6:?\?w>*0?U%>?ä>? ]>*0?Kk@J>6:?Yx-3>L?*uˋ>m0?k޽`b>a@_4>@P>@?G>@V>@;ž|**>a@׾bT>m0?0ܾ%j>@?5Ծj>?IOj>L+?L>?!?7>?!?q@C]>f?6 \ >?ӽ鶥>@?P+>.@>@TI> @8H$> @sw> @dd> @ݾV <>@t>.@ ݛ>g@5w>Ea?s׾+>t?||>?G$>?kg6k->t?ͱ޽Y>Ea?\3_>g@X4>@Ps> @2Cy>*@aMtL>O3@ȕ9>O3@*ľwD>*@͉꾤k> @Cϓ>@:K5w>E@aM>]@~(㾭u>e?p# ??X*A??:a ?e?^ڽ~?]@_n >E@e>+ @>D@/#֞>@J_>@':>@ž0>@u龤>D@Z*>+ @#> @ u>Z@RC ?t@;?i@`?i@yM?t@2k?Z@W$? @~ )>@Ax>3@Au>@:{l>@鞾T̮>@>@ھ=>3@Yf>@ڒ> @?f @վ?w @;ո?q@xW?q@ m?w @47$?f @=1o? @Ȗ_?@9hZ> @]}>@6w}8>Wj@|ˢ>Wj@43>@> @^eʾ>@/;?@Ⱦ ?Ѽ@%=?˷@܃0?*@J~ _?*@ƊW?˷@Yx?Ѽ@g+ea ?@L~c>̂?>?³@hE߾Mq?~ֽܾMq?R5X~t?~ݽHp?~ֽܾMq?܏,޾\.t?9콞k}cw?d MS]cw?F1精p?~ݽHp?|?9콞k}cw?~ݽHp?R5X~t?hi*Y?~ֽ"Y?R5\?~ݽ/\ X?~ֽ"Y?܏&+\?9<(a_?d MY;(a_?F1ڠ X?~ݽ/\ X?`ۮ?'Kf'~? [¼?jG_;Ă?P<-?A<]/?M/\<*? Y%g?yAa<X?V QB?rܽ۞?R!?XdfB;?ݻLVb?硱f=+?fv?Ľbm?2k3j?TT<[n?7+=1x?0Q =[I?⢿Hg=H?!=k?xdt=֚?Qmn=!ץ?DDX?,ͽ4?M)Ǟ?߼V6Ub?iͽ.bht?_0NeL? :m?mta?({]?~/Y=Xb?ЬC>=o?1|ɗ9>i.?_F>?+33>%?g;)u>?=UW?V<1*l?Dk>c?;y>}~?5c0d>0?R8/>?Xmſg=Bw?Eɿ.3=zO?,Ϳ\ԥ?%п%ͽg?ҿB?pӿ:?f0ӿL TF? ѿ> {n?Ϳ\Pb?.ʿu=@_?/ƿ&!>c? ¿7Q>p?8||>΁?L„>?+3(v>F?n;¿ciE> ?Ͽ >?ҿE=i?տ)V<?Bؿ? ڿ.?ڿ 7?Hڿf E?ؿ)$x?Bֿhp?ؿͿH>bz?˿$j>=q?B˿t>#ό?B˿@e>M?NͿ5?>j?y׿> Z?ٿA=?ڿ9~=?ܿ \=dm? ݿN$O?Udֿ"%>F?mտO7>*?+ տt<>?7Lտo4>+?&ֿ> >?|柇NJ?lۿ@K=i?" Sq~?~ ξ?i?" Sq~?~ ξ?L!̾?5\a{y;z?ng'rg?F1精p?" Sq~?YT˂ld ?5\a{y;z?" Sq~?i?"= of?~ ?,m?i.w?"= of?~ ?,m?x;v?5\5<(9b?nvoO?F1ڠ X?"= of?YTS}#=4x?5\5<(9b?"= of?i.w? +#>y}?3sf>ȓ@O7IM>Θ@]ah?<>&@@65>&@헾R19>Θ@^G>ȓ@##_>y}?&鲾M1{>/?>?\ңa> ?U=>?7>? a > ?KC4>?Y08>/?+Ľy>s@jtr>@)inD>"@SZ$>(@,I>(@髾>"@;Ǿ9>@ؾld>s@ݾ*T>"?վoϦ>ͦ?Ioҽ>/?Q>"?ʃ{>"?rfFbk>?6a >ͦ?kٽ>"?]0l>@AҊ> @!^Y>%l @^K-/>0 @s1&K>0 @8(>%l @~߾`K> @^ >@ ǣ>nC@9a> @sؾ0r>+?f>?򌇾&??k9p>+?佯C> @\I>nC@@>Tx @]>@20҄>@‡PH\>@[I>@*ž#KT>@쾮z>@ooH>Tx @:a>@1p>8@~/?o@%?J@댾,6?J@>=c?o@ཁ?8@`E{y>@j>@fƽ>@/4(>!@pbˑ>,@ $>,@ՀǾ>!@뾩>@>@R(>km @ 7/?6 @6U8?@;?j@b?j@P?@2 ?6 @󣷽&?km @~ .>yb@Ab>@D_>@`~V>@|Y>@9>@jܾ'>@k>yb@|>c@?8B@2׾}?_ @;h?Z @xZ?Z @ p?_ @Z:?8B@=Wd ?c@ȼb?s^@_kD>~@/u>@6 ">E@Ќ>E@dz8>@~¾>~@^˾ >s^@ξ?N@qʾ ?C@㫿'2?=@3?@J T?@YL?=@YD{?C@gQhc ?N@Ls>9?>6?3@S^N~{?FC4N~{?An?S^N~{?~ݽ4Ծg}?(B־"?9\򽕗mh?d2P~h?FC4N~{?S^N~{?Lw?9\򽕗mh?S^N~{?An?S8hM{c?FC42{c?A"eh?S8hM{c?~ݽde?(#g?9\.*=j?d2P$ܳ2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*/精p?8@׾g}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?~ݽO\?~ݽHp?F1精wo?/ڠ X?8_2de?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?SQ>&e>"?M>5I>?-;>p2>b?X>O$>ŧ?=1 > ?P=(>R?ňa=:>w? =^T>?<:q>Q?@<ݕ>?`?=D>E?W=>?=%>?-0>;>U?v2>/>0?pH>>V?>Y>5?>M>T?>}#>R@J>>8@u >¹>T#@5=+o>f@Ch<2>@мa>@n-Z>? R>?l\>5b?N=i>i0?I=w>1?U6>>U?p>Yx>د?Y>>"?0>>\?հ>%j>L6@)>.3>@p>ʣ>X@/>g > @`s=&>2\ @è ^H>S @ZiԂ>@ȡ>@-Ke>i@ϼG>X ?Q'-=x>]?R=*>8?U>K[>%?:>X>?A>]>]?p>YS>6@zE>Rю>@ >A#b>{ @;>b7=>0s @eN/>}4>A@^}=KI>G@47sx>@إeUe> @ᤣ>@R>C@VRI?0@ZR=A ?0s?e>??Om>T??>64>US?;>>3?>>@pF>>B @x>쌓>@>~>e@?>|>}@D6=>h@<۝>T`@HՀ>@[ 8W>R @v ?{v @<G?@V='?1T@c">?Ψ@x>?P@)> ?X@C>2>@4>>. @vذ>5>@(>>{@F>[>@J>>@>pI>4@k=>T@i=#j>s@a<4>-6@?t@v>N?E@D>?H@a>? @>>@֢>U>"@ᚇ>u>߉@r>ee>q@O>>x]@+>>@Ǘ >>@9=l>%@=`?@h=?Uc@ >ݚ?v@B >!#? @חC>?' @eg>X?S @U>Rx ?p @DS>?_@=շ_>q?M>$I?@~ݽHp?P.],u?(ƾݾt?nܾc r?nܾc r?X9wq?LƽҠ}R=w?^7؂}?P.],u?~ݽHp?R^KHlpu?LƽҠ}R=w?~ݽHp?/精wo?~ݽ/\ X?P.d*]?(k&\?潼"Z?潼"Z?𞽐*tY?Lƽu <:_?^7{2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?~ݽO\?~ݽHp?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?>M1{>/?/6>##_>y}?z=G>ȓ@=R19>Θ@==5>&@5&@{M>Θ@Gj%sf>ȓ@G#>y}?18>/?˼4>?#~; > ? =>?V=>?r:=a> ?'>>?^>*T>"?Y0T>ld>s@,1>9>@=>"@Be=I>(@Z$>(@ʼinD>"@LWսjtr>@By>s@T>"?a >ͦ?^S>/? 8*={>"?=`>?&>oҽ>/?UN>oϦ>ͦ?N>ǣ>nC@ڇ> >@da>`K> @>8(>%l @ζ=&K>0 @G-/>0 @5˹^Y>%l @Ҋ> @%0l>@GI>nC@0սC> @O p>+?IH=&?? >f>?gST>0r>+?'*>9a> @>:a>@[>H>Tx @2{>z>@H.>#KT>@_=I>@GH\>@޻҄>@-9]>@Q,>Tx @&6y>@ dٽ?8@Ec?o@@s=,6?J@>%?J@}ol>/?o@\>>8@t >(>km @c>>@y>>@+1>>!@e۸= $>,@U-;ˑ>,@(>!@k>@j>@5&?km @즽?6 @|F?@aI=b?j@( >?j@ek>U8?@L>/?6 @>|>c@~>k>yb@`[>'>@k%>>@=Y>@$b=V>@_>@zb>@.>yb@`d ?c@ ?8B@Z<?_ @^=Z?Z @>?Z @}^Q>}?_ @+y>?8B@}@>?N@=:> >s^@K'>>~@ >8>@ 0=Ќ>E@=">E@|=>@ʇe~@7;?s^@43?@GP">'2?=@7> ?C@gl$=s>9?=?3@~ֽ^N~{?,*f?8B־"?~ݽ4Ծg}?!A+{?~ֽ^N~{?IJǽmh?e9Lw?,*f?~ֽ^N~{?QM~h?IJǽmh?~ֽ^N~{?!A+{?~ֽ8hM{c?,kӏg?8#g?~ݽde?!2|c?~ֽ8hM{c?IJǽ.*=j?e9<#p?,kӏg?~ֽ8hM{c?QM$ܳ ??%>kP??>j? ?p&=RW?E?]%=YKJ??_R D??ý`B?ê?/|N??fdwa??yx?T?oklZ?s?<ҭ?Ɨ?ے彿???ռR?L?{=2?w1?n, >J?d?iyA>̓?r?_V>??H>8h?d?,>lhS?H]?>=D??TUl??4?MrE?El?P??<5Mb?d?+H;#x?[?"; ??ߓ?C?\0В?$?P>u?Væ?d>u~?̦?W>Յh???wK+>yqU??q= H?pR?=ac?Ej?,=>?[?B(L>|?b?&B>yl?~?ͭ >%h]??=7S?$?:=WN?J?)0c??y>{?? >=q?9?=j?O?Ž=d? ?t=Hb??ӃŽ6??lR=y?(\L.~?]qq?˞^̾C2?ξ?(\L.~?ξ?4;{)x?!;mn([?]qq?(\L.~?f<.̱e?4;{)x?(\L.~?/精wo?(\>f?]v?˞av?Km?(\>f?Km?4; <`?!;=v?]v?(\>f?f<ю9M?4; <`?(\>f?/ڠ?uW?\_ ͏M>!?)0>?>>?]m>?ှ=?Θْ>?/PW>?ɪ)>!?ԒE>??^B?-}%{>t?&莾@>p?)yL։>p?UVLJ>t?8e>?%i>??pwzq>?bϽ<> x?~> x?FӾ2/>?nؾ c>7?sо2>4K?2>?XŸ >|?)|ì>|?;%>?$;>4K?Ľђ>7?Gq2>!?@킽`>-H@ #>X@@@i=c@D܋[Y=c@4=X@)ھA>-H@_ 5N>!?s>D+?X>?DXӾ>:?繭>#&?7?>#&? .4H>:?Ͻrt>?BUhz>D+?@G>@яp>E@wT>@dE&>` @>` @R>@5DE>E@ >@"j> ?3S>q?Of߾u>D?{????c2?D?9V˽>q?Pԩ> ?:]m>:@>*r @҉ >U @Wm>`= @je\>`= @+¾Wf>U @m>*r @I>:@>@v>?j޾?3$? CK ?z?Ğ?z?YEV#?3$?v9??8Oy>@ ]> @R>* @% :>' @sˆ>-@'>-@仾ɳ>' @׾X>* @q.> @Q> @o(>k@Ѿ?@ ?@IƓj?@ff?@A/ ?k@ f> @kXu> @`u> @@v\> @ES>@>@Ur> @)Z.> @/ƾ> @mɾ>? @ž >v@V?p@! ?,X@m ?,X@_9 ?p@p 4?v@ ]h?? @;x{+>>?᛾ʏ>g @ͽT-T?)žT?|V?IJǽV?4A=¾RY?ͽT-T?IJǽV?Ӏ2X?)žT?ͽT-T?2Ǽ㑖|na?~ݽO\?ͽT-T?4A=¾RY?ͽѽ?IJǽtHM>?4A3޽~OA?ͽѽ?ӀDL]@?)o콉]D?ͽѽz=^Ԋ:ljL{ɱ;xQzY,=i+=䇿4~0=/\=ks%=k7;`=d/JWP2Xc]dOྲྀsAYzтRA+%/Sbd =u shRZ=7Y\%iOQ. ~Ǧ91cmnUoukmFc8l234rqhI/~XZsـ 5>nW'>4z#e&OV!=#k-ƵP$gΧ׾l'@4 94X2i+*}\I;e݄7Kⁿؾb?P|σKtlu~E duW dm}I*2Ԑ$0S0}c\gξ˕%d߾|q񌾓G0E硾쾜u*>߾eϾKmȲǫ ү*g؉[%Efg˛MAl-'h վϖ=ZE ľޡbŇy?F1精p?9ӟվC?S}ξӂ?jy?bŇy?S}ξӂ?Wq]ξZ? Q mxh?bŇy?DZ.gu? Q mxh?bŇy?jy?b$HX2a?F1ڠ X?9%h?Sؙm?@Uj?b$HX2a?Sؙm?WqY"s? Q>>S;uP?b$HX2a?DZ y; e]? Q>>S;uP?b$HX2a?@Uj?'?0iV>p?OF =>z?];ek,>@?@x@%>@?ZH])>z?^"8>p?׋OO>?&VC]k>L?>6:?\?w>*0?U%>?ä>? ]>*0?Kk@J>6:?Yx-3>L?*uˋ>m0?k޽`b>a@_4>@P>@?G>@V>@;ž|**>a@׾bT>m0?0ܾ%j>@?5Ծj>?IOj>L+?L>?!?7>?!?q@C]>f?6 \ >?ӽ鶥>@?P+>.@>@TI> @8H$> @sw> @dd> @ݾV <>@t>.@ ݛ>g@5w>Ea?s׾+>t?||>?G$>?kg6k->t?ͱ޽Y>Ea?\3_>g@X4>@Ps> @2Cy>*@aMtL>O3@ȕ9>O3@*ľwD>*@͉꾤k> @Cϓ>@:K5w>E@aM>]@~(㾭u>e?p# ??X*A??:a ?e?^ڽ~?]@_n >E@e>+ @>D@/#֞>@J_>@':>@ž0>@u龤>D@Z*>+ @#> @ u>Z@RC ?t@;?i@`?i@yM?t@2k?Z@W$? @~ )>@Ax>3@Au>@:{l>@鞾T̮>@>@ھ=>3@Yf>@ڒ> @?f @վ?w @;ո?q@xW?q@ m?w @47$?f @=1o? @Ȗ_?@9hZ> @]}>@6w}8>Wj@|ˢ>Wj@43>@> @^eʾ>@/;?@Ⱦ ?Ѽ@%=?˷@܃0?*@J~ _?*@ƊW?˷@Yx?Ѽ@g+ea ?@L~c>̂?>?³@~ݽHp?F1精p?hE߾Mq?~ֽܾMq?R5X~t?~ݽHp?~ֽܾMq?܏,޾\.t?9콞k}cw?d MS]cw?|?9콞k}cw?~ݽHp?R5X~t?~ݽ/\ X?F1ڠ X?hi*Y?~ֽ"Y?R5\?~ݽ/\ X?~ֽ"Y?܏&+\?9<(a_?d MY;(a_?`2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?BO\?/精p?EBO\?~ݽO\?~ݽHp?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?D?/ڠ X?ED?~ݽ>]D?~ݽ/\ X?F1ڠ?uW?@=ԒE>??=)>!?1=W>?:T=ْ>?==?/:m>?g>?P0>?r͏M>!? N\i>??De>?9ֻLJ>t?Sp?=@>p?=%{>t?{=?S> c>7?I>2/>?&> `> x?^@=Q,= x?Kzq>?ђ>7?L$;>4K?X>?T<ì>|?=#ɳ>?>2>?C>2>4K?B>s>D+?>5N>!?LW>A>-H@=>4=X@&j=[Y=c@i=c@Ͻ#>X@ސ`>-H@-k0>!?."z>D+?ert>?ő84H>:? =?>#&?=>#&? I>>:?}>>?P>> ?> >@p>5DE>E@y#>>@$ =>` @P&>` @3ѽT>@ >E@u7>@(ԩ> ?ĸ>q?o)?D?,H=??wU>?? a>u>D?t>S>q?E˔>>@>I>:@R^n>m>*r @O'>Wf>U @=\>`= @Ym>`= @Y>U @~>*r @Xm>:@ y>@TAv9??.V#?3$?My=Ğ?z?~>K ?z?U`>?3$?^>v>?#w~>> @d't>.> @$Q>X>* @>ɳ>' @d=>-@[q<ˆ>-@h >' @5i>* @T> @=f> @\5 ?k@ݲ?@F>?@`n>(>k@5>>? @>0>> @K>Z.> @W=> @e۸=>@=a=ES>@ <\> @̇k;u> @xu> @3:h?? @드< 4?v@D=9 ?p@q=m ?,X@=! ?,X@>?p@L0-> >v@<+>>?Au=ʏ>g @9T-T?7¾4X?2X?9\V?Lž=U?9T-T?9\V?E|V?~ݽO\?8D㑖|na?7¾4X?9T-T?9T-T?Lž=U?9ѽ?Lf;=?9ѽ?EOM>?~ݽ>]D?8D' kI?7#ὡ@?9ѽ2ھ=4ԾھA~=Hھھ~ݽ<ھkLھ'FHھ<󨾎4Ծھ<2KDgy~)E+6~ݽ~:+6I=~)=Dg=2=@׾I=精B~ݽEBy精K@׾'F2yL*i j F1~)~ݽV(-/~)H< j I=LA~=2I=H<ž/精~ݽHF1精*ižykL2~N&E ~N&F1L~N&Dg~N&~ݽ2~N&8Dg~N&/L~N& ~N&2~N&F~N&/~N&8@׾~N&~ݽ4Ծ~N&@׾~N&F1~N&EF~N&~ݽ2j?~ݽ2*~ݽHp?/精p?8@׾g}?~ݽ4Ծg}?F1精wo?~ݽHp?~ݽ4Ծg}?@׾g}?~ݽO\?BO\?/精p?~ݽHp?EBO\?F1精wo?~ݽ/\ X?/ڠ X?8_2de?~ݽde?F1ڠ?uW?~ݽ/\ X?~ݽde?_2de?~ݽ>]D?D?/ڠ X?~ݽ/\ X?ED?F1ڠ?uW?SQ>&e>"?M>5I>?-;>p2>b?X>O$>ŧ?=1 > ?P=(>R?ňa=:>w? =^T>?<:q>Q?@<ݕ>?`?=D>E?W=>?=%>?-0>;>U?v2>/>0?pH>>V?>Y>5?>M>T?>}#>R@J>>8@u >¹>T#@5=+o>f@Ch<2>@мa>@n-Z>? R>?l\>5b?N=i>i0?I=w>1?U6>>U?p>Yx>د?Y>>"?0>>\?հ>%j>L6@)>.3>@p>ʣ>X@/>g > @`s=&>2\ @è ^H>S @ZiԂ>@ȡ>@-Ke>i@ϼG>X ?Q'-=x>]?R=*>8?U>K[>%?:>X>?A>]>]?p>YS>6@zE>Rю>@ >A#b>{ @;>b7=>0s @eN/>}4>A@^}=KI>G@47sx>@إeUe> @ᤣ>@R>C@VRI?0@ZR=A ?0s?e>??Om>T??>64>US?;>>3?>>@pF>>B @x>쌓>@>~>e@?>|>}@D6=>h@<۝>T`@HՀ>@[ 8W>R @v ?{v @<G?@V='?1T@c">?Ψ@x>?P@)> ?X@C>2>@4>>. @vذ>5>@(>>{@F>[>@J>>@>pI>4@k=>T@i=#j>s@a<4>-6@?t@v>N?E@D>?H@a>? @>>@֢>U>"@ᚇ>u>߉@r>ee>q@O>>x]@+>>@Ǘ >>@9=l>%@=`?@h=?Uc@ >ݚ?v@B >!#? @חC>?' @eg>X?S @U>Rx ?p @DS>?_@=շ_>q?M>$I?@~ݽHp?P.],u?(ƾݾt?nܾc r?/精wo?~ݽHp?nܾc r?X9wq?LƽҠ}R=w?^7؂}?P.],u?~ݽHp?R^KHlpu?LƽҠ}R=w?~ݽ/\ X?P.d*]?(k&\?潼"Z?/ڠ?uW?~ݽ/\ X?潼"Z?𞽐*tY?Lƽu <:_?^7{?4fb1=|D?R)he=I?뾊)=oK?)ھ,>kK?6Ǿ>AH?+ֶO<=B?Z x=;?+B=bl4??=K-?!sG=(?޷0=X&?JȾcib?uC >\?6gL=.R?ņ&=E?ttX~=F8?Yus?B@m?/ڠ?uW?5Y;cWka?B@m?'Nqh? =s;#P?=&i;+^?f=-Sk?5Y;cWka? =s;#P?5Y;cWka? A^ ppppppppppppppp                                    !pp"p"#p#$p$%p%&p&'p'(p()p)*p*+p+,p,-p-..!p0/!/1002"213#"3"24$#4#35%$5$46&%6%57'&7&6('778()(889):*))9:=-,=,<>.=.-=/!>!.>@0?0/?A1@10@B21B1AC32C2BD43D3CE5D54DF65F5EG76G6FH8G87GI98I8HJ:9J9IM=<M<LN>M>=M?/>>N?P@O@?OQAPA@PRBARAQSCBSBRTDCTCSUETEDTVFUFEUWGVGFVXHWHGWYIHYHXZJIZIY[KJ[JZ\LK\K[]ML]L\^NM^M]O?^?N^`PO`O_aQ`QP`bRaRQacSbSRbdTcTSceUdUTdfVeVUegWVgVfhXWhWgiYXiXhjZiZYik[j[Zjl\k\[km]\m\ln^]n]m_O^_^np`_p_oqapa`prbqbaqscrcbrtdctcsuedudtvfeveuwgfwfvxhgxgwyihyhxzjyjiy{kzkjz|l{lk{}ml}l|~n}nm}o_~_n~ppoqpprqrsrrtssuttvuuwvvxwwyxxzzy{{z||{}}|~~}oo~:;:*:*+**;++;<;+;+,+,<,,JKJ:J:;::K;;KLL;K;<;;L<<ppppppppppppppp21/10/6546439877:9>=<><;                                 !"!""##$$$%&%&#&#''((()*)*''*++,,,-.-.+.+/00  011! "!1"12"22/$#3$34%$5$456&%6%5#&663#'788('(899)(*)9*9:'*::7',+;,;<-,=,<=>.->-=+.>>;+p?@p@AAppBpBCpCDpDEpEFpFGpGHpHIpIJpJKpKLL?pN@M@?MOANA@NPOAOQQPBQQRBSCBSBRTDCTCSUEDUDTFEUUVFWGFFVWXHGGWX[KJ[JZ\L[LK[M?LL\M^N]NM]_O^ON^`PO`O_aQPaP`RQaabRcSRcRbdTSdSceUTeTdfVUfUegWfWVfhXgXWgk[ZkZjl\[l[k]MlM\ln^m^]mo_n_^np`_p_oqa`q`pbaqqrbscrcbrtdsdcsuedudtvfufeuwgvgfvxhwhgwyixihxzjiziy{kj{jz|lk|k{m]lml|~nm~m}onn~pooqpprrqssrttsuutvuuwvvxxwyyxzzy{zz|{{}mm|~~}~~}}XYXHXHIHHYIIYZYIYIJIIZJJhihXhXYXXiYYijiYiYZYYjZZppppppppppppppp-,<.-</.<0/<10<21<32<43<54<65<76<87<98<:9<:<;<,;POMONMTSRTRQXWUWVU\[Z\ZY                            !  "!!#""$$#%%$&&%''&('')()*)*+** + +-,,--.../ //0 1! 1 02"!2!13#"3"24$#4#35%$5$46&%6%57'&7&68(7('79)((89:*9*)9;+:+*:,;+;=>>>>???@==@AABBBCCCDADAEFFFFGGGHEEHIJJJJKLLKILIN>=N=M?>O>NO@?O@OP=@PPM=BAQQRBCBSBRSDCTCSTADTTQAVFEVEUGFWFVWHGWHWXEHXXUEJIYYZJKJ[JZ[LK\K[\YI\IL\p]^p^_p_`p`aappbpbcpcdpdepefpfgpghphipijj]pl^k^]km_l_^ln`m`_moana`naoopppqrbrqscbsbrtdccstueddtuvfeeuvyihyhxzjiiyzk]jjzk|l{lk{}m|ml|~n}nm}on~~opopqpqrqqsrrtssuutvuuyxxzyy{kz{z|{{}||~}}~{wvwfvfgfgwggwxwgwghghxhhvvwvwwwwwxwwxxpppppppppppppppKJZLKZMLZNMZONZPOZQPZRQZSRZTSZUTZVUZWVZXWZXZYZJYnmkmlkrqprpo              vusutszyxzxw                 !! ""!##"$##%$$&%%'&&('')(( )+**,,+--,..-//.0 0/1! 1 02"1"!13#2#"24$3$#35%4%$46&%%567'&&678(''789)8)(8*9)9;+:+*:,+;;<,-,<<=-.-==>.?/.?.>@0/@/?A10A0@B2A21AC32C2BD43D3CE5D54DF655EFG766FGH877GHI9H98H:*I*9I;:JJK;<;KKL<=<LLM=>=MMN>O?>O>NP@?P?OA@PPQARBARAQSCBSBRTDCTCSUEDUDTVFEVEUWGFFVWXHGGWXYIXIHXJ:Y:IY[[\\\]^]^[[^__```aaab_b_ccdddefefccfghhhhijjigjgl\[l[k]\m\lm^]m^mn[^nnk[`_oop`a`q`pqbaraqr_brro_tdctcsedudtufeufuvcfvvschgwwxhihyhxyjiziyzwgzgjzp{|p|}p}~p~pppppppppp{p||{}}|~~}~{      p  p  p  p ppppp ppppp pihxjixkjxlkxmlxnmxonxpoxqpxrqxsrxtsxutxvuxvxwxhw              ! "  !"#"#&%&'&' ')((**)++*++,,,---.../ //0 ! 001!"!112"3#""236&%6%57'6'&6(''7(9)((89:*):)9;+*;*:<,+<+;-,<<=->.->-=?/.?.>0/??@010@@A121AAB2C322BCD433CDE5D54DF6E65EG7F76F8(G(7GI988HIJ:99IJ;:JJK;<;KKL<M=<M<LN>=N=MO?>O>NP@?P?OA@PPQARBQBAQSCRCBRTDSDCSUEDDTUVFUFEUWGVGFVH8W8GWYIHHXYZJIIYZKJZZ[KLK[[\LML\\]M^NM^M]_ON_N^PO__`PaQPaP`bRaRQacSbSRbdTSScdeUTTdefVUUefgWVVfgXHgHWgiYXXhiZYiijZ[Zjjk[\[kkl\m]\m\l^]mmn^_^nno_`_oop`qa`q`prbaraqscbsbrtdsdcsueddtuvfeeuvwgffvwhXwXgw#$yyz##zz{|{|y$y|$%}}~$$~~}%}343#3#$##4$$454$4$%$$5%%zyy{zz|{|y|y~}~~~}}pppppppp pp ppppp      #" "! '&%'%$                               ! !"!"""### $$%&%&'&'$''p()p)*p*+p+,p,-p-.p./p/0p011 pp 2p23p34p455(p7)((678*7*)79+*9*8,+99:,-,::;-.-;;<./.<<=/0/==>010>>?1 1??@ A  @AD433CDE544DE6(55E6G7F76FH8G87GI9H98HJ:9J9I;:JJK;<;KKL<M=<M<L>=MMN>?>NNO?@?OOP@QA@@PQTDCCSTUEDDTUF6EEUFWGVGFVXHWHGWYIXIHXZJIZIY[KJ[JZ\LK\K[]ML]L\NM]]^NON^^_OPO__`PaQPP`abRQQabcSRRbcdTcTSceUdUTdVFeFUegWVVfghXWWghYXhhiYZYiijZ[Zjjk[l\[l[km]\m\ln^]n]mo_^o^np`_p_oqapa`prbqbaqscrcbrtdsdcsuetedtfVeeufwgffvwxhggwxihxxyijiyyzj{kj{jzlk{{|lml||}mnm}}~nonn~pooqqprrqsrrtssuutvfuuvwvvxwwyxyzyz{z{|{|}|}~}~~~vBAB A 2 2B22BCB2B2323C33RQRAQABABRBBSRSBRBCBBSCCpppppppppp pp ppp%%%%%%%%%% %! %"!%#"%#%$%$  986876=<;=;:A@>@?>EDCECB                                !  "!"#"#$#$$$&'' ''(  ( ()& & )**+ + +, ,,-*-*.////0001..12333345542527'&7&6('8'78)(8)89&)996&+*::;+,+<+;<-,=,<=*-==:*?/.?.>0/@/?@10@1@A.1AA>.32BBC343D3CD54E4DE25EEB2pFGpGHpHIpIJpJKpKLpLMpMNpNOpOPpPQQ pp RpRSSFpUGFFTUVHGVGUWIHWHVXJIXIWKJXXYKLKYYZLMLZZ[MNM[[\NON\\]OPO]]^PQP^^_QbR  abcSRRbcTFSScTeUTTdefVeVUegWfWVfhXWhWgiYXiXhjZYjYik[ZkZj\[kkl\]\llm]^]mmn^_^nno_rbaraqscbbrsdTccsduetedtvfufeuwgvgfvxhwhgwyihyhxzjiziy{kj{jz|lk|k{ml||}m~nm~m}onn~pooqqprrqsrrtdsstuttvvuwwvxwwyxxzyy{z{|{|}||~}}~~tt_`_Q_Q QQ`  `a` `   a  opo_o_`__p``pqp`p`a``qaapppppppppppp ppp43C54C65C76C87C98C:9C;:C<;C=<C>=C?>C@?CA@CACBC3BWVUUTW[ZY[YX  _^\^]\cbaca`                               !  "!!""$#$%$%&%&''&(('))())***+++,--,.--/..0 0/1!0! 02"1"!1#2"24$##345%$$456&%%567'&&678('8'79)(9(8*)99:*+*::;+<,;,+;=-<-,<>.=.-=?/>/.>@0?0/?A100@AB2A21A3#B#2BDDEEEFGFGDDGHHIIIJ KJKH  KHLLMMMNONOLLOPPQQQRSRSPSPEDUDTUFEVEUVGFVVWGDGWWTDIHXXYIJIZIYZKJ[JZ[HK[[XHML]L\]NM^M]^ON^^_OLO__\LQP``aQRQbQabSRcRbcPScc`Ppdepefpfgpghphipijpjkpklplmpmnpnopopppqqpdpsedsdrtfetesugfuftvhgvguihvvwijiwwxjykjyjxlkyyzlmlzz{mnm{{|non||}oqqrdrsrrtssuttvuuwwvxxwyyxzyy{z{|{|}||r}~~o}opop~pp~~p~pqppqq}}~}~~~~~~~pppppppppppppp  pR Q a S R a T S a U T a V U a W V a X W a Y X a Z Y a [ Z a \ [ a ] \ a ^ ] a _ ^ a _ a ` a Q `                              u t r t s r y x w y w v                                                                    } | { } { z     ~                 "    ! " #  "   " $  #   # %   %  $ &  %   % '  &   & (  '   '   ( ( )  *   *  ) +   +  * ,   ,  + -   -  , .  -   - /  .   . 0   / 0 !   0 ! 2 " 1 " ! 1 3 # 2 # " 2 4 $ 3 $ # 3 5 % 4 % $ 4 6 & % 6 % 5 7 ' & 7 & 6 ( ' 7 7 8 ( ) ( 8 8 9 ) : * ) : ) 9 ; + * ; * : < , + < + ; = - < - , < > . - > - = ? / . ? . > @ 0 / @ / ? 1 ! 0 0 @ 1 B 2 1 1 A B C 3 B 3 2 B D 4 C 4 3 C E 5 4 E 4 D F 6 5 F 5 E G 7 6 G 6 F 8 7 G G H 8 9 8 H H I 9 J : 9 J 9 I K ; J ; : J L < K < ; K M = L = < L N > M > = M O ? > O > N P @ ? P ? O A 1 @ A @ P R B A A Q R S C B B R S T D C C S T U E D U D T V F E V E U W G F W F V X H G X G W I H X X Y I Z J I Z I Y [ K Z K J Z \ L [ L K [ ] M \ M L \ ^ N ] N M ] _ O ^ O N ^ ` P _ P O _ Q A ` A P `  c  b c  c c d d d e b b e   f  f g  g g h h h i f  i f   k  j k   k  k l  l l m j  j m   o  n o   o  o p q  q p n    q n c b s b r s d c t c s t e d t t u e b e u u r b g f v v w g h g x g w x i h y h x y f i y y v f k j { j z { k { | | l k m l | | } m j m } } z j o n ~ ~  o p o o  q p p n q  ~ n                  aq q q q q q q q q q q q q q q`                                                                                                                                                                             a `a aa                            `                                                                                                                                              qaq r bqs r qt s qu t qv u qw v qx w qy x qz y q{ z q| { q} | q} q~ qq ~ "    ! " #  "   " $   $  #   $ $ %    % % &    & & '    ' ' (    ( ( )    ) ) *    * * +  ,    + ,     /    . / 0   / 0 !   0 ! 2 " 1 " ! 1 3 # " 3 " 2 4 $ # 4 # 3 5 % $ 5 $ 4 & % 5 5 6 & ' & 6 6 7 ' ( ' 7 7 8 ( ) ( 8 8 9 ) * ) 9 9 : * + * : : ; + < , + + ; <     ? / . ? . > @ 0 / / ? @ 1 ! 0 0 @ 1 B 2 A 2 1 A C 3 2 C 2 B D 4 3 D 3 C E 5 4 E 4 D F 6 5 F 5 E G 7 6 G 6 F H 8 7 H 7 G 9 8 H H I 9 : 9 I I J : ; : J J K ; L < ; ; K L M = < < L M N > = = M N O ? N ? > N P @ O @ ? O A 1 P 1 @ P R B A A Q R S C B B R S D C S S T D E D T T U E F E U U V F W G F W F V X H G X G W Y I H Y H X Z J I Z I Y [ K Z K J Z \ L [ L K [ ] M \ M L \ ^ N ] N M ] _ O ^ O N ^ ` P _ P O _ Q A P P ` Q b R Q Q a b c S R R b c T S c c d T U T d d e U V U e e f V g W V g V f X W g g h X Y X h h i Y j Z Y j Y i k [ j [ Z j l \ k \ [ k m ] l ] \ l n ^ ] ] m n o _ ^ ^ n o p ` _ _ o p a Q p Q ` p ab a a q ac b bb abd c bbr d e d r r s e f e s s t f g f t t u g h g u u v h i h v v w i x j i x i w y k j y j x z l y l k y { m z m l z | n m m { | } o n n | } ~ p o o } ~ q a p p ~ q -  , -  ,       -    - .  -  -      .    =  < = , <  , - , -  = -  - = >  = - = - . - -  > .  .                                                   q qb cq  q  q  q  q  q  q  q q q q q q                       " !  !  & % $ & $ #                             * ) ' ) ( ' . - , . , +                                                                                                          b   b bbc  cc                                                                                                              !  !   ! ! "    " "     # # $    %  $ %   &  % &   & & #    (  ' (   )  ( )   ) ) *    * * '    + + ,    -  , -   .  - .   . . +   / 0  0 1  1 2  2 3  3 4  4 5  5 6  6 7  7 8  8 9  9 :  : ;  ; <  < =  = > > /  q q qc dq q q q q q q q q q q q @ 0 / / ? @ A 1 0 A 0 @ B 2 1 B 1 A 3 2 B B C 3 4 3 C C D 4 5 4 D D E 5 6 5 E E F 6 7 6 F F G 7 8 7 G G H 8 9 8 H H I 9 : 9 I I J :     M = < < L M N > = = M N ? / > > N ? P @ ? ? O P Q A P A @ P R B Q B A Q S C R C B R D C S S T D U E D U D T V F E V E U G F V V W G H G W W X H I H X X Y I Z J I I Y Z     ] M L L \ ] ^ N M M ] ^ O ? N N ^ O ` P _ P O _ a Q ` Q P ` b R a R Q a S R b b c S d T S d S c e U T e T d f V U f U e g W V g V f X W g g h X Y X h h i Y j Z Y Y i j k [ Z Z j k l \ [ [ k l m ] l ] \ l n ^ m ^ ] m _ O ^ ^ n _ p ` _ _ o p q a ` ` p q b a q q r b c b r r s c t d c t c s u e d u d t v f e v e u g f v v w g x h g x g w y i h y h x z j i z i y { k j j z { | l { l k { } m | m l | ~ n } n m } o _ ~ _ n ~  p o o   q p p r q  r s r  s  t s  s u t  u v u  v w v  w x w  x  y x  x  z y  y  { z  z  | { {  } } |  ~ ~ }  o ~ ~       c  c ccd   d                       K  J K : J  : ; : ;  K ;  ; K L K ; K ; < ; <  L < < [  Z [ J Z  J K J K  [ K  K \  [ \ K [ K  L K  K  \ L L                                 , , , , , , , , , , , , , , ,  ,   q  q! q! qd" eq# " q$ # q% $ q& % q' & q( ' q) ( q* ) q* q+ q +                       @ ? = ? > = D C B D B A                             H G E G F E L K J L J I                                                                                                                                                                            !    ! d  d !  dee    ee"    " " #    # # $  %   %  $ &  %   % '  &   & (  '   ' )  (   ( *    ) * +    * +   +   +  - - .  . . /  0  / 0 - - 0  1 1 2  2  2 3  4  3 4 1  4 1  5 5 6  6 6 7  8  7 8 5 5 8  9 9 :  :  : ;  <  ; < 9  < 9 . - > - = > / . ? . > ? 0 / ? ? @ 0 - 0 @ @ = - 2 1 A 2 A B 3 2 C 2 B C D 4 3 D 3 C 1 4 D D A 1 6 5 F 5 E F 7 6 G 6 F G 8 7 G G H 8 5 8 H H E 5 : 9 I : I J ; : K : J K L < ; L ; K 9 < L L I 9  M N  N O  O P  P Q  Q R  R S  S T  T U  U V  V W  W X  X Y  Y Z  Z [  [ \ \ M  q q q q qe fq q q q q q q q q q ^ N M ^ M ] _ O N _ N ^ ` P O ` O _ a Q P a P ` R Q a a b R S R b b c S d T S d S c U T d d e U V U e e f V W V f f g W X W g g h X     k [ Z k Z j l \ [ [ k l ] M \ \ l ] n ^ ] ] m n o _ n _ ^ n p ` _ p _ o q a ` q ` p r b q b a q s c b s b r t d c t c s u e d u d t f e u u v f g f v v w g h g w w x h     { k j { j z | l k k { | m ] l l | m ~ n m m } ~  o ~ o n ~  p  p o   q q p  r r q  s r  r  t s  s  u t  t  v u  u  w v  v  x w  w  y y x  z z y  { { z  | { { } m | | }  ~ ~ }    ~                             } }                                         e e  eff  ff                   h i  h X h  X Y X X  i Y  Y i j  i Y i Y Z Y Y  j Z Z x y  x h x  h i h h  y i  i y z  y i y i j i i  z j j                                 J J J J J J J J J J J J J J J  J = < q> = q? > q@ ? qA @ qA qfB gqC B qD C qE D qF E qG F qH G qH qI q< I                       ^ ] \ \ [ ^ b a ` b ` _                                       f e d f d c j i h j h g                                                                                                       !   !  "   "  !   " " #    # # $    $ $ %  &   &  % '   '  & (   (  ' )   )  ( *   *  ) +  *   *  +   + -    , - .    - . /  .   . 0  0  / 1 ! 1 0 2 " ! 2 ! 1 # " 2 2 3 # $ # 3 3 4 $ 5 % $ 5 $ 4 6 & 5 & % 5 7 ' 6 ' & 6 8 ( 7 ( ' 7 9 ) ( 9 ( 8 : * ) : ) 9 ; + : + * : ,  ;  + ; = - , , < = > . - - = > ? / . . > ? @ 0 / / ? @ A 1 0 A 0 @ f2 1 f1 A 3 2 ffg3 4 3 ggB 4 C 5 B 5 4 B D 6 C 6 5 C E 7 D 7 6 D F 8 E 8 7 E G 9 F 9 8 F H : 9 9 G H I ; H ; : H < , I , ; I  L  K L  L  L M  M M N K K N  O O P  P  P Q  R  Q R O  R O   T  S T   T  T U  U U V S  S V  W W X    X  X Y  Z  Y Z W  Z W L K \ K [ \ M L ] L \ ] N M ] ] ^ N K N ^ ^ [ K P O _ _ ` P Q P a P ` a R Q b Q a b O R b b _ O T S d S c d T d e e U T V U e e f V S V f f c S X W g g h X Y X i X h i Z Y j Y i j W Z j j g W  k l  l m  m n  n o  o p  p q  q r  r s  s t  t u  u v  v w  w x  x y  y z z k  q q q q q q qg hq q q q q q q q | l k k { | } m l } l | ~ n m ~ m }  o n  n ~ p o   p  q p  p  r q  q s r  s t s  t u t  u v u  v      y x  x  z z y { k z z {  | { {  } |  |  ~ }  }   ~  ~                          {                                                                                                              g g  ggh   h                v v w v  w  w  w   w w x w  x  x x                                                 h h h h h h hhhhhhhhh   h[Zq\[q]\q^]q_^q`_qa`qaqhbiqcbqdcqedqfeqfqgqZg                 |{y{zy~~}                  !  ""!#""$$#%%$((')(( )+**,++--,..-/..0 / /1!0! 02"1"!13#"3"24$#4#35%$5$46&%6%57'6'&68('8'79)(9(8*))9*;+:+*:<,;,+;=-<-,<>.=.-=?/.?.>@0?0/?A1@10@B21B1AC32C2BD43D3CE5D54DF6E65EG76G6FH87H7GI98I8H:*9:9IK;:K:JL<K<;KM=L=<LN>=N=MO?>O>NP@?P?OQA@Q@PRBARAQSCBSBRTDCTCSUETEDTVFUFEUWGVGFVXHGXGWYIHYHXJ:Y:IY[KZKJZ\LKK[\]MLL\]^NM^M]_ON_N^`PO`O_aQPaP`hRQhQaRhiiSRbTiTSicUbUTbdVcVUceWdWVdfXeXWegYfYXfZJgJYgjijjjkkkliilmmnnnooopmmp%&r&qr%rrssstq&qt&'v'uv&vvwxxwu'uxjiziyzkj{jz{lk{{|lil||yinm}n}~onn~poomp}mrqqrsrtstqtqvuvwvvxwwuxuqqqqqqqqqijqqqqqq       iiijjjj                 !!""##$$%%&&''yxqzyq{zq|{q}|q~}q~qqqqjkqqqqqx)((*))++*,,+--,..-//.0 0/! 001!"!112"3#""236&%6%57'6'&6(7'79)8)(8:*9*)9;+*;*:<,+<+;-,<<=->.->-=?/.?.>@0/@/?A1@10@B2A21AC3B32BF65F5EG76G6F8(G(7GI9H98HJ:I:9IK;:K:JL<;L;KM=<M<LN>M>=MO?N?>NP@O@?OQAPA@PRBQBAQSCRCBRTDCTCSUEDUDTVFEVEUWGFWFVH8W8GWYIHYHXZJIZIY[KZKJZ\L[LK[]M\ML\^N]NM]_O^ON^`PO`O_aQPaP`bRQbQacSbSRbdTcTSceUdUTdfVUfUegWVgVfXHWXWgiYXiXhjZYjYik[ZkZjl\k\[km]\m\ln^]n]mo_n_^np`_p_oqa`q`prbaraqscrcbrtdsdcsuetedtvfufeuwgvgfvhXwXgwyixihxzjiiyzkjzz{k|lk|k{}ml}l|~nm~m}onn~pooqppjrqjqsrjsjktktskuutvvuwwvxhhw343#3#$##4$$454$4$%$$5%%CDC3C3433D44DED4D4544E55q q  q  q  q  q qqqqqklqqqq)(&('&-,+-+*10/1/.543532              kkkklll ! !!""###$%$%"%"&''('((()))&**+,+,--,--*.///00 ! 0!01!11.#"2#23$#4#345%$5$4"%552"6778899::;;<<==>>??@@AABBCCDDEE6qqqqqqqqqqqqlmqqqG7F76FH8G87GI9H98H:9IIJ:;:JJK;L<;L;KM=<M<LN>=N=M?>NNO?P@??OPQA@@PQTDCTCSUETEDTF6EEUFWGVGFVXHWHGWYIXIHXJIYYZJKJZZ[KLK[[\L]ML]L\^NM^M]_ON_N^`P_PO_aQ`QP`dTSdSceUTeTdVFeFUegWfWVfhXWhWgiYXiXhZYiijZ[Zjjk[\[kkl\m]\m\ln^]n]mo_n_^np`o`_oqapa`prbqbaqscbbrstdctcsuedudtfVefeuwgfwfvxhgxgwyihyhxzjiziykjzz{k|l{lk{}m|ml|~n}nm}onn~ppoqqprrqsrrtssuutvffuwwvxwwyxxzyz{{z||{}}|~}}~~vvlmlmmmRQRAQABABRBBRSRBRBCBCSCCbabQaQRQRbRRcbcRbRSRRcSS3333333333333333&%q'&q('q)(q*)q+*q,+q-,q.-q/.q0/q10q1qmnq2q%2GFDFEDKJIKIHONLNMLSRQSQP                                  !  "!"#"#$##$$%%&&&'''((()**)++*++,--,..-//.0 0/1! 1 0m"!!1m#"n"mn2$n$#n%2$245555666744788999:::;8;8<====>>>?<<?@AAAABCCB@C@E54E4D65F5EF76F7FG47GGD498HHI9:9J9IJ;:K:JKH8K8;KM=<M<L>=N=MN?>N?NO<?OOL<A@PPQABARAQRCBSBRSP@S@CSTUUVVWWXXYYZZ[[\\]]^^__``aabbccTqqqqqqqqqqqqqqnoqeUdUTdfVeVUegWfWVfhXgXWgYXhhiYZYiijZk[ZkZjl\[l[km]\\lmn^]]mno_^^norbaraqscbbrsdTccsduetedtvfufeuwgfwfvhgwwxhihxxyijiyyzj{kj{jz|lk|k{ml||}m~nmm}~onn~rqqsrrtdstsuttvuuwvvxwxyxyzyz{zz|{{}||~~}~tnnnonooopo_o_`__p``pqp`p`a`aqaaoopooppppqppqqQQQQQQQQQQQQQQQQC`qDCqEDqFEqGFqHGqIHqJIqKJqLKqMLqNMqONqPOqPqoedbdcbihgigf              mljlkjqpoqon                !  "!!""$##%%$&&%&&'(('))(**)++*,++-,,.--/..0 /01!  012"1"!1#2"24$3$#3%$445%&%556&'&667'('778(9)(9(8:*):)9;+:+*:<,+<+;=-<-,<>.=.-=?/..>?@0//?@A100@AB2A21A3#B#2BC4`43`54CCD565DDE676EEF7G87G7F98GGH9:9HHI:J;:J:IK<;K;JL=<L<KM>=M=LN?M?>MO@??NOPA@@OPoBAAPoo`33BoRRSSSTUTURRUVVWWWXYXYVYVZZ[[[\]\]ZZ]^^___`a`a^a^cSRcRbTSdScdUTdUdeRUeebRWVffgWXWhWghYXiXhiVYiifVk[ZkZj\[l[kl]\l]lmZ]mmjZ_^nno_`_p_opa`q`pqn^q^aqrrssttuuvvwwxxyyzz{{||}}~~rrssrttsuutvvuwwvxwwyxyzyy{zz~}}~~{{|{{||||}|}}}lllllllllll l  l  l  l   l]\m^]m_^m`_ma`mbamcbmdcmedmfemgfmhgmihmjimjmkm\k ~~         !  "!!#""$$#%%$&&%'&&**)+**+-,,.--//.0 0/1!0! 02"1"!13#2#"24$#4#35%$5$46&%6%57'6'&68(7('79)8)(8:*):)9;+*;*:,+,+;=-<-,<>.=.-=?/.?.>@0/@/?A10A0@B2A21AC3B32BD4C43CE54E4DF65F5EG7F76FH8G87GI98I8HJ:9J9IK;:K:J<,K,;KM=L=<LN>M>=MO?>O>NP@?P?OQA@Q@PRBARAQSCBSBRTDSDCSUETEDTVFEVEUWGFWFVXHGXGWYIHYHXZJIZIY[KJ[JZL<[<K[]ML]L\^NM^M]_O^ON^`P_PO_aQ`QP`bRaRQacSRcRbdTcTSceUdUTdfVUfUegWVgVfhXWhWgiYXiXhjZiZYik[j[Zj\L[\[knno oop   q pqn n qrrs s st  ttu r r u'(vvw''wwxyxyv(vy(){)z{({{|}}|z)z}onn~opoqpqnq~nsrstsstutrruwvvxwwyxyvyv{z{|{{|}|zz}                           !!""##$$%%&&''(())yxzy{z|{}|~}~x++*,,+,- --. /!  ./0"/"!/1#0#"02$1$#13%2%$26('6'57)(7(6*)*)79+*9*8:,9,+9;,;,:<<;=-<-<>.->-=?/.?.>@0?0/?A1@10@B2A21AC322BCF65F5EG76G6F8*787GI9H98HJ:I:9IK;J;:JL<;L;KM=L=<LN>=N=MO?>O>NP@?P?OQA@Q@PRBARAQSCBSBRTDSDCSUETEDTVFUFEUWGFWFVH8GHGWYIXIHXZJYJIY[KZKJZ\LK\K[]ML]L\^NM^M]_O^ON^`P_PO_aQPaP`bRQbQacSRcRbdTcTSceUTeTdfVeVUegWfWVfXHgHWgiYXiXhjZYjYik[ZkZjl\[l[km]\m\ln^m^]mo_n_^np`o`_oqapa`prbaraqscrcbrtdsdcsuedudtvfufeuwgvgfvhXghgwyihyhxzjiziy{kj{jz|lk|k{}ml}l|~n}nm}o~on~ppoqqprrqssrttsuttvuuwvvxhwxw343%3%&%%4&&454&4&'&&5''CDC3C3433D44DED4D4544E55          +*(*)(/.-/-,320210765754                 !!!!"""# # $%%%%&''&$'$()))****++(+,,-..-//.,// 011! !122"!#"2#2330 3 #%$4%456&%6%57'&7&64$7$'7899::;;<<==>>??@@AABBCCDDEE8G98G8FH:9H9GI;H;:HJ<;J;I<<J=K=>=KKL>?>LLM?N@??MNOA@@NORDCRCQSEDSDRF8EFESUGTGFTVHUHGUWIVIHVXJIXIWYJYJXYYZKZZ[KLK[[\LML\\]M^N]NM]_O^ON^bRQQabcSbSRbTFcFSceUdUTdfVUfUegWVgVfhXWhWgYXhhiYZYiijZk[ZkZjl\[l[km]l]\ln^m^]mo_n_^np`__opqa``pqrbaaqrscrcbrdTsTcsuedudtvfeveuwgfwfvhgwwxhihxxyijiyyzj{kj{jz|lk|k{}ml}l|~n}nm}o~on~ppoqpprqqssrtddsuttvuuwvvxwxyxyzyz{zz|{{}||~}}~~tPOPAOABABPBBPQPBPBCBCQCC`_`O_OPOP`PPa`aP`PQPPaQQ2222222222222222#"3$#3%$3&%3'&3('3)(3*)3+*3,+3-,3.-3/.30/30313"1GFEGEDKJIKIHONLNMLSRQSQP                               !  !#"###$%%$&&%''&((')((*))+**,,+--,.--/..0 / /1!0! 0"!!1"44555676744788999:::;8;8<<===>?>?<<?@AAAABCCB@C@4DEE5465F5EF76F7FG47GGD498H9HI:9J9IJK;:K:J8;KKH8<LMM=<>=N=MN?>N?NO<?OOL<A@PAPQBARAQRSCBSBRSP@S@CTUUVVWWXXYYZZ[[\\]]^^__``aaTcUbUTbdVUdUceWVeVdfXWfWegYXgXfhZYhYgZZh[i[\[iij\k]\\jkn`_n_moana`nbTaaobqcpcbprdcrcqsedsdrtfetesugfufthguuvhwhwhvxxwixxyizjiiyz{kjjz{~nm~m}onn~pbboqqprqrsrrtssutuvuvwvwxwwyxyzyy{zz|{{}||~}}~~ppklk]k]^]]l^^lml^l^_^_m__{|{k{klkk|ll}|}l|lmll}mmNNNNNNNNN N NNNNNN?>O@?OA@OBAOCBODCOEDOFEOGFOHGOIHOJIOKJOLKOLOMO>M cbaa`cgfeged  kjikihonmoml                         !!!"##"$$#$$%%%&&&'('()()*)*+*+,+,-,---/./0 /0! 001!2"!2!13#"3"24$#4#35%$5$4&%556&'&667'8('8'79)8)(8:*9*)9;+:+*:<,++;<=-,,<=-==.?/..>?@0//?@A100@AB211ABC32C2BD43D3CE54E4D65EEF6G76G6FH8G87GI9H98HJ:I:9IK;J;:JL<K<;KM=L=<L>.M.=MPQQQQRRRSPPSTTUUUVWVWTTW XYY   YYZZZ[X X[  \\]  ]]^_^_\ \_QPaP`aRQbQabSRbbcSPScc`PUTddeUVUfUefWVgVfgTWggdTYXiXhiZYjYij[Zjjk[X[kkhX]\llm]^]n]mn_^o^no\_ool\pqqrrssttuuvvwwxx   yyzz{{||}}pq~qp~rqqsrrtssuttvuuwvwxww xxy y|{{}||~pp}~~~yyzyzzzzz{zz{{jjjjjjjjj jj j j j  j   j[Zk\[k]\k^]k_^k`_ka`kbakcbkdckedkfekgfkhgkhkikZi      ~}}|               !! "!"#"#$#$%$%('()() )+*+,+,,,---.../0 0/1! 1 02"!2!1#"223#$#334$5%$$456&%%56'&667'8(7('79)8)(8*))9*;+**:;<,++;<-,<<=-.-==>.?/..>?@0/@/?A10A0@21AAB232BBC343CCD4E544DEF655EFG766FGH8G87GI9H98H:*I*9I;:JJK;<;KKL<=<LLM=N>==MNO?>>NO@?OOP@A@PPQABAQQRBCBRRSCDCSSTDUEDDTUVFEEUVWGFFVWXHWHGWYIXIHX:IYYJ:KJZZ[KLK[[\LML\\]M^NMM]^_ONN^_PO__`PaQPaP`bRQbQacSRcRbdTSdSceUTeTdfVeVUegWfWVfhXWWghiYXXhiJYiiZJlmm m mn nnolloppqqqr r rsp p s&tuu%&%uuvvvwt&tw'xyy&'&yyz{{zx'x{l|}}ml~nm~m}on~o~lo|lqpqrqqsrrpsptutvuuwvwtwtyxyzyy{zzx{x                               !!""##$$%%&&''(()){z|{}|~}~z+**,++-,,..-../0 0/1! 1 02"!2!13#"3"2$#334$%$445%8('8'79)8)(8*9)9;+:+*:<,;,+;=-<-,<>.->-=?/.?.>0/??@0A10A0@B21B1AC32C2B43CCD454DDE5H87H7GI988HI:*99I:K;J;:JL<K<;KM=L=<LN>=N=MO?>O>N@?OOP@A@PPQABAQQRBSCBSBRDCSSTDEDTTUEVFEEUVWGVGFVXHGGWXYIHHXYJ:IIYJ[KZKJZ\LKK[\]MLL\]NM]]^N_ON_N^PO__`PQP``aQRQaabRcSRcRbdTSdSceUTeTdfVeVUegWfWVfhXWWghiYXXhiZJYYiZk[j[Zjl\[[klm]\\lm^]mmn^o_^o^np`_p_oa`ppqarbaraqscbsbrtdctcsuedudtvfufeuwgvgfvxhwhgwyixihxjZyZiy{kzkjz|l{lk{}mll|}nm}}~nonn~pooqpprqqsrrtssuttvvuwwvxxwyyxzjjy565%5%&%%6&&676&6&'&&7''EFE5E5655F66FGF6F6766G77            )(&('&-,+-+*10.0/.543532                   ! !!""###$%$%""%'&'('((()))&**+,+,-,--*-/./ 0/0! 001!!11.#"223#$#4#34%$5$45"%552"6778899::;;<<==>>??@@AABBCC6E7D76DF87F7EG9F98FH:G:9GI;H;:HJ<I<;IK=<K<JL>=L=KM?>M>L@?MMN@A@NNOACCQD66SEREDRTFETESUGFUFTVHGVGUWIHWHVXJIXIWKJXXYKLKYYZLMLZZ[M\NM\M[]ON]N\`QQ_`a`aRDaDacSbSRbdTcTSceUdUTdfVUfUegWVgVfhXWhWgYXhhiYZYiijZ[Zjjk[l\[l[km]\m\ln^]n]mo_n_^np`o`_oqa``pqbRaaqbscbbrstdsdcsuetedtvfufeuwgfwfvxhgxgwihxxyijiyyzj{kj{jz|lk|k{}ml}l|~n}nm}o~on~ppoqpprbqqrsrrttsuutvuvwvwxwxyxyzyy{zz||{}}|~~}~rOPPAOABABPBBPQPBPBCBBQCC]^^O]OPOP^PP^_^P^PQPP_QQ0000000000000000! 1"!1#"1$#1%$1&%1'&1('1)(1*)1+*1,+1-,1.-1.1/1 /DCBBEDIHGIGFLKJJMLQPOQON                               ! !"!!#""$##$$%%%&&&'(('))(**)++*,,+--,..-//. //323334445225667778989696;:;;;<<<=::=>>???@A@A>A>32C2BC43D3CD54DDE525EEB276FFG787H7GH98I8HI69IIF6;:K:JK<;L;KL=<LLM=:=MMJ:?>NNO?@?P?OPA@Q@PQN>Q>AQRSSTTUUVVWWXXYYZZ[[\\]]^^__``aaRSRSbTTScUTTbcdVUUcdeWVVdefXWfWegYXgXfhZYhYgi[ZiZh\[iij\]\jjk]n`_n_ma`nnoaRaooRpb!b!qcbbpqrdccqrseddrstfeestugtgftvhuhguwihwhvxjwjiwykjyjx|nm|m{on||}o oo} !~! ~pp!qpprqqsrrttsuutvvuwvvxxwyxxzyy{zz|{{}||~ }~}~~kll]k]^]^l^^lml^l^^_^m__yzzkyklklzllz{zlzllml{mmLLLLLLLLLLLLLLLL=<M>=M?>M@?MA@MBAMCBMDCMEDMFEMGFMHGMIHMJIMJMKM<Ka`_a_^edcecb!""ihgigfmlkmkj        !  " "! "                  ! !"!"#""$##%$$&&%''&(('(()))***+ +-,,.--//.0 0/1!0! 02"1"!13#""234$3$#35%$$456&%6%57'&7&68('8'7)(889)*)99:*;+:+*:,;+;=-<-,<>.=.-=?/.?.>@0/@/?A1@10@B2A21AC322BCD433CDE544DE65EEF676FFG787GGH8I98I8HJ:9J9IK;J;:J<,K,;KONOOOPPPQNQNRRSSSTTUURURWVWWWXXXYVYV ZZ[[[\\]]Z ]ZN^__ON`PO`O_QP`Q`a^NaNQaSRbSbcScddTSTdeeUTebReRUVfggWVWghhXWYXhYhifViVYi[Zj[jk[kll\[\lmm]\jZmZ]mnooppqqrrssttuuvvwwxxyyzz{{||}}non~~opopqpqrqqsrrtssuutvvuwvvxwwyyx|{{}||~n}~}~~""#~~"#""#yyzyzzzzz{z{{{hhhhhhhhhhhhh h  h   hYXiZYi[Zi\[i]\i^]i_^i`_ia`ibaicbidciedifeifigiXg     }|{}{z~            ##$$  !  "!!##"&&%&&' '' (()))*+#+*,$#,#+-,$,.--/..0 / /1!0! 02"1"!13#"3"24$3$#35%$5$46&%6%57'&7&6'77(9)(9(8:*):)9;+:+*:<,+<+;=-<-,<>.=.-=?/>/.>@0//?@A100@AB211ABC3B32BD4C43CE54E4DF65F5EG76G6F8(787GI98I8HJ:9J9IK;J;:JL<;L;KM=L=<LN>M>=MO?>>NOP@??OPQA@@PQRBAAQRSCRCBRTDSDCSUEDDTUFEUUVFGFVVWG8GWWH8YIHYHXJIYYZJ[KJ[JZ\LK\K[]ML]L\^NM^M]_ON_N^`POO_`aQPP`abRQQabcSbSRbTSccdTUTddeUVUeefVWVffgWHWggXHjjkkklmlmjjmnnooop ppq n  qn#$rrs##sstutur$ru$%w%vw$wwxyyxv%yvjz{{kjk{||lkml|m|}zj}jm}on~o~opoqpp~nnqrsrstsuturruwvwwxwyxxvvy       $$%%$%$%%                 !!""##$$%%&&''utvuwvxwyxzy{z|{}|~}~t))(**)**+++,,,--. -.! ../!"!//0"1#""014&%%345'4'&4(5'57)(7(68*)8)7+*889+:,+:+9,::%-&&;-.-;;<.=/..<=>0//=>?100>?B433ABC5B54B6(C(5C76DDE787EEF8G98G8FH:9H9GI%:I:H&%IIJ&;&JJK;<;KKL<M=<<LMN>==MNO?>>NOP@O@?OQAPA@PRBAAQRSCBBRSD6S6CSEDTTUEFEUUVFGFVVWGXHGXGWYIHYHXJIYYZJKJZZ[K\LK\K[]MLL\]^NMM]^_O^ON^`P_PO_aQ`QP`bRQQabcSRRbcTDSScTUTddeUVUeefVWVffgWXWgghXYXhhiYZYiijZk[ZkZjl\[l[km]l]\ln^m^]mo_^^nop`o`_oqa``pqrbaaqrscbbrsdTccsdueddtuvfeeuvgfvvwghgwwxhihxxyijiyyzj{kj{jz|lk|k{}m|ml|~n}nm}onn~pooqpprqrsrsdstd121#1#$##2$$232$2$%$$3%%?@?1?1211@22@A@2@2322A33          '&%%$'+*)+)(&&'/.--,/321310&'&&'                  !!!"#"#  #$%%&&%&&'''$(()*)*+*++(+,--.-...///,! 001!"!2!12#"3"23 #330 45566778899::;;<<==>>??@@AABBCC4E5D54DF6E65EG7F76F87GGH898HHI9:9IIJ:;::J<;<K=<<KL>==KLM?>>LMPBAPAOQCBBPQD4Q4CQSEDDRSTFEESTGFTTUGHGUUVHIHVVWIJIWWXJ'J'JXK((YKZLKKYZ[MLLZ[^PO^O]_QPP^_RD_DQ_aSRR`abTSSabcUTTbcVUccdVWVddeWXWeefXg'XgXfh('h'gY(hhiYZYiijZ[Zjjk[\[kkl\]\llm]^]mmn^o_^^no`RoR_oqa``pqrbaaqrscbbrstdccstueddtuvfeeuvgfvvwgxhgxgwihxxyijiyyzjkjzz{k|lkk{|}mll|}~nmm}~o~on~p``oqqprqrsrststuttvuuwvwxwwyxyzyz{zz|{{}||~}}~ppNMN?M?@?@N@@NON@N@@A@OAA\[\M[MNMN\NN\]\N\NNON]OO. . . . . . . . . . . . . . . .   /   / ! / " ! / # " / $ # / % $ / & % / ' & / ( ' / ) ( / * ) / + * / , + / , / - /  - C B @ B A @ G F E G E D ())K J H J I H O N M O M L ()())                                                                                                                                  !    ! ! "    " " #    # # $    $ $ %    % % &    & & '  (   (  ' )   )  ( *  )   ) +    * + ,    + , -    , -     -  0 0 1 1 1 2 2 3 3 0 0 3 4 4 5 5 5 6 6 6 7 4 4 7 8 8 9 9 9 : : ; ; 8 8 ; < = = = = > ? ? > < < ? 1 0 A 0 @ A 2 1 B 1 A B 3 2 B B C 3 0 3 C C @ 0 5 4 D 5 D E 6 5 F 5 E F G 7 6 G 6 F 4 7 G G D 4 9 8 I 8 H I : 9 J 9 I J ; : J J K ; 8 ; K K H 8 = < L = L M > = N = M N O ? > O > N < ? O O L <  P Q  Q R  R S  S T  T U  U V  V W  W X  X Y  Y Z  Z [  [ \  \ ]  ] ^  ^ _ _ P                 a Q P P ` a b R Q Q a b S R b b c S T S c c d T e U T T d e f V U U e f W V f f g W X W g g h X Y X h h Y Z Y Z i [ Z Z i     l ^ ] l ] k m _ ^ ^ l m ` P _ _ m ` o a ` ` n o p b a a o p c b p p q c d c q q r d s e d d r s t f e e s t g f t t u g v h g g u v h v v )i **w i     z l k k y z { m l l z { n ` m m { n o n | | } o ~ p o o } ~  q p p ~  r q   r s r  s t s  t  u t t  v u u  )v v *)  *w *  w x w  x  y x x  z y y  { z z n {  | n } |  }  ~ } }   ~ ~                          |  |                                                                 i j i [ i [ [  \ [  j \  \ j k j \ j \ ] \ ]  k ]  ] w x w i w i i  j i  x j  j y  x y j x j  k j  j  y k  k                                 J! J! J! J! J! J! J! J! J! J! J! J! J! J! J!  J!;!:!K!!=!K!?!>!K!@!?!K!A!@!K!B!A!K!C!B!K!D!C!K!E!D!K!F!E!K!G!F!K!H!G!K!H!K!I!K!:!I!                       _!^!\!^!]!\!c!b!a!c!a!`!              !  !!!  !!!  !!!  !!! !  !!*  !*g!f!d!f!e!d!k!j!i!i!h!k!!  !! !! !  ! !  !  ! ! ! ! !  ! ! ! !!  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!!!!+**!!!+!!!!!!!!!!!!!!!!! !!!!! ! ! !! ! ! !!!! ! ! !!!! ! ! !!!! !!! ! !!!!!!!!! !!!!! !!! ! !!!!!!!!!!"!!!!"!"!#!!$!!!!#!$!%!!!!$!%!!!%!%!&!!!!&!&!'!!(!!!!'!(!)!!!!(!)!! !!!)!!!!*!*!+!!!!+!+!,!!!!,!,!-!!!!-!-!.!!/!!!!.!/! !!/!/!0! !1!!! ! !0!1!2!"!!!!!1!2!#!"!2!2!3!#!$!#!3!3!4!$!5!%!$!$!4!5!6!&!%!%!5!6!7!'!&!&!6!7!8!(!'!'!7!8!9!)!(!(!8!9!*!!)!)!9!*!;!+!*!*!:!;!!.!/!.!>!>!?!/!0!/!?!?!@!0!A!1!0!0!@!A!B!2!1!1!A!B!3!2!B!B!C!3!4!3!C!C!D!4!E!5!4!4!D!E!F!6!5!5!E!F!G!7!6!6!F!G!H!8!7!7!G!H!9!8!H!H!I!9!*!9!I!I!:!*! L!L!M! M! M!N! N!O!O! L! L! O! P! P!Q! Q! Q!R! R!S!S! P! P! S!+!T!+T!U!+U!U!V!V!W!W! T!! T! W!!!X!!X!Y! !Y! Y!Z! Z![![! X!! X! [!]!M!L!]!L!\!M!]!^!^!N!M!O!N!^!O!^!_!L!O!_!_!\!L!Q!P!`!`!a!Q!R!Q!b!Q!a!b!S!R!c!R!b!c!P!S!c!c!`!P!e!U!T!e!T!d!f!V!U!f!U!e!W!V!f!W!f!g!T!W!g!g!d!T!Y!X!h!h!i!Y!Z!Y!j!Y!i!j![!Z!k!Z!j!k!X![!k!k!h!X!!l!m!!m!n!!n!o!!o!p!!p!q!!q!r!!r!s!!s!t!!t!u!!u!v!!v!w!!w!x!!x!y!!y!z!!z!{!{!l!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}!m!l!l!|!}!~!n!m!~!m!}!o!n!~!~!!o!p!o!!!!p!q!p!!!!q!r!q!!!!r!s!r!!!!s!t!s!!!!t!u!t!!!!u!v!u!!!!v!!w!v!v!!!!!!!!!!!!!!!!z!y!y!!!!{!z!z!!!|!l!{!{!!|!}!|!!!!}!~!}!!!!~!!!~!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!|!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!w!!!w!!!x!w!!x!!!!!x!!x!!!!!!!!x!!!x!!!x!!!!y!x!!!y!!y!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!j"!!j"!!j"!!j"!!j"!!j"!"j"""j"""j"""j"""j"""j"""j"""j"""j"" " "!j"["Z"k"\"["k"]"\"k"^"]"k"_"^"k"`"_"k"a"`"k"b"a"k"c"b"k"d"c"k"e"d"k"f"e"k"g"f"k"h"g"k"h"k"i"k"Z"i" "!!! " " "!! "! " "!! "! ""!!"! ""!!"!""!"""""""""""""""""""""""""""""""""""~"}"}"|""""""""""""""" """"" "! " "" "" " " """" " " """ " """" "" """"""""""""""" ""!"""" "!""""""!"""""""""#""""#"#"$""""$"$"%""""""""("""(""'")""""(")"" """)""+""""*"+"""+"+","""",","-""""-"-".""/"""/""." ""/"/"0" "1"!" " "0"1"2"""!"!"1"2"3"#"""""2"3"4"$"#"#"3"4"5"%"$"$"4"5"6"&"%"%"5"6"7"'"6"'"&"6"8"("7"("'"7"9")"("("8"9"*"")")"9"*"+"*":":";"+","+";";"<","-","<"<"="-"."-"="=">"."?"/"."?".">"@"0"/"@"/"?"1"0"@"@"A"1"2"1"A"A"B"2"3"2"B"B"C"3"D"4"3"3"C"D"E"5"4"4"D"E"F"6"5"5"E"F"G"7"F"7"6"F"H"8"7"7"G"H"9"8"H"H"I"9"*"9"I"I":"*"K";":":"J"K"L"<";";"K"L"M"="<"<"L"M"N">"="N"="M"O"?">"O">"N"P"@"?"P"?"O"A"@"P"P"Q"A"B"A"Q"Q"R"B"C"B"R"R"S"C"D"C"S"S"T"D"U"E"D"D"T"U"V"F"E"E"U"V"W"G"V"G"F"V"X"H"G"G"W"X"I"H"X"X"Y"I":"I"Y"Y"J":"["K"J"J"Z"["\"L"K"K"["\"]"M"L"L"\"]"^"N"M"M"]"^"_"O"N"N"^"_"`"P"O"`"O"_"Q"P"`"`"a"Q"R"Q"a"a"b"R"S"R"b"b"c"S"d"T"c"T"S"c"e"U"d"U"T"d"f"V"e"V"U"e"g"W"f"W"V"f"h"X"g"X"W"g"i"Y"X"X"h"i"Z"J"i"J"Y"i""l"m"m"""""m""m"n"""n""n"o"l"""l""o"""p"p"q""""q""q"r"""s""r"s"p"""p""s"&"t"u"u"%"&""%"u""u"v"""v""v"w"t"&""t""w"&"'"x"x"y"&""&"y""y"z"""{""z"{"x"'""x""{"m"l"}"l"|"}"n"m"~"m"}"~"o"n"~"~""o"l"o"""|"l"q"p""q"""r"q""q""""s"r""r""p"s""""p"u"t""t""""v"u""u""w"v""""w"t"w""""t"y"y"x"z"y"y"z"z"{"x"x"{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ##### # # # # # # #"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""############""".""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""-"-"".-"-""""".""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#""#"##"""""#"-#"##""#"###"#"##-##""#"##""#"##""## #""" # ##""" #" # #"" #" # # #"" #" #"" # # #"""#"###"#"########"####"##################################################### ## #!##!#"##"######$##$#%#%###s#r##t#s##u#t##v#u##w#v##x#w##y#x##z#y##{#z##|#{##}#|##~#}###~#########r##'####&#'#(####'#(#)##(###(#*##)###)#+###+##*#,###,##+###,#,#-####-#-#.####.#.#/## ##/#/#0# #1#!# # #0#1#############$#####3#%#$#%#&##%#%#&#5#'#4#'##6#(#'#'#5#6#7#)#6#)#(#6#8#*#7#*#)#7#9#+#*#9#*#8#:#,#+#:#+#9#-#,#:#:#;#-#.#-#;#;#<#.#/#.#<#<#=#/#0#/#=#=#>#0#1#0#>#>#?#1#############.3#3#A#.4#&#/4#C#5#B#5#4#B#D#6#C#6#5#C#E#7#6#6#D#E#F#8#7#7#E#F#G#9#8#G#8#F#:#9#G#G#H#:#;#:#H#H#I#;#J#<#;#J#;#I#K#=#<#K#<#J#>#=#K#K#L#>#?#>#L#L#M#?#@#?#M#M#N#@#O#A#@#@#N#O#P#.A#A#O#P#Q#/..P#Q#B#4#Q#4#/Q#S#C#R#C#B#R#T#D#C#C#S#T#U#E#D#D#T#U#V#F#E#E#U#V#G#F#V#V#W#G#H#G#W#W#X#H#I#H#X#X#Y#I#Z#J#I#Z#I#Y#[#K#J#[#J#Z#\#L#K#\#K#[#M#L#\#\#]#M#N#M#]#]#^#N#_#O#^#O#N#^#`#P#O#O#_#`#a#Q#P#P#`#a#R#B#a#B#Q#a#c#S#R#R#b#c#d#T#S#S#c#d#e#U#T#T#d#e#f#V#U#U#e#f#W#V#f#f#g#W#X#W#g#g#h#X#Y#X#h#h#i#Y#Z#Y#i#i#j#Z#k#[#Z#k#Z#j#\#[#k#k#l#\#m#]#\#m#\#l#n#^#]#n#]#m#o#_#n#_#^#n#p#`#o#`#_#o#q#a#`#`#p#q#b#R#a#a#q#b#s#c#b#b#r#s#t#d#c#c#s#t#e#d#t#t#u#e#f#e#u#u#v#f#w#g#f#f#v#w#x#h#g#g#w#x#i#h#x#x#y#i#j#i#y#y#z#j#k#j#z#z#{#k#l#k#{#{#|#l#}#m#l#}#l#|#~#n#m#~#m#}##o#~#o#n#~##p##p#o###q#p#p###r#b#q#q##r#1#2##1###!#1##!###!####"#!##2#"##"##2#3##2###"#2##"#####"#######3#######?#@##?###1#?####1#1####2#1##@#2#2###A####@#A#2#@####2##3#2##2###A#3#3###################################################################################################$##$##$##$##$##$##$##$##$##$##$##$##$##$##$####$$$$$$$$$$$$$$$$$$$$$$$$$ $$$ $ $$ $ $$ $ $$ $ $$$ $$$$$$$$#################################################################%$$$#$#$"$%$)$($'$'$&$)$############### #############################################################-$,$+$+$*$-$1$0$/$/$.$1$######/###/#### ################################################################################/##### //##################################################################################################################################################################################################$###$$$###$$$###$$$###$$$###$$$###$$##$$$###$$$###$$ $### $ $ $### $ $ $### $ $ $# $## $# $$# $## $$#$##$$###$$##$#$$##$#$$#$$$##$##$#$##$#$$##$#$$##$$$#$###$$##$#$$##$#$$#$$$##$##$#$##$#$$##$#$ $!$##!$# $$###!$$#$$$#$$"$$$$$$#$$$$$$$$$$%$$$%$%$"$$$$&$&$'$$$$($$'$($$$)$$($)$$$)$)$&$$+$$$+$$*$$+$,$,$$$$$,$$,$-$$$-$-$*$$$$.$.$/$$ $$0$$/$0$!$ $1$ $0$1$$!$1$1$.$$$2$3$$3$4$$4$5$$5$6$$6$7$$7$8$$8$9$$9$:$$:$;$$;$<$$<$=$$=$>$$>$?$$?$@$$@$A$A$2$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$C$3$2$2$B$C$D$4$C$4$3$C$E$5$D$5$4$D$F$6$E$6$5$E$G$7$6$6$F$G$H$8$G$8$7$G$I$9$H$9$8$H$J$:$I$:$9$I$K$;$:$K$:$J$<$;$K$K$L$<$M$=$<$M$<$L$$$$$$$$$$$$$P$@$?$P$?$O$Q$A$@$@$P$Q$B$2$A$A$Q$B$C$B$!B$ !R$D$!D$C$!S$E$D$D$R$S$T$F$E$E$S$T$U$G$T$G$F$T$V$H$U$H$G$U$W$I$V$I$H$V$X$J$I$X$I$W$Y$K$J$Y$J$X$L$K$Y$Y$Z$L$[$M$L$[$L$Z$$$$$$$$$$$$$^$P$O$^$O$]$Q$P$^$^$_$Q$_$ B$_$B$Q$`$R$!!1`$a$S$R$R$`$a$b$T$S$S$a$b$c$U$T$T$b$c$d$V$c$V$U$c$e$W$d$W$V$d$f$X$W$f$W$e$g$Y$X$g$X$f$Z$Y$g$g$h$Z$[$Z$h$h$i$[$\$[$i$i$j$\$k$]$\$k$\$j$^$]$k$k$l$^$_$^$l$l$m$_$m$0 m$ _$o$1n$10n$p$`$o$`$1o$q$a$`$`$p$q$r$b$a$a$q$r$s$c$r$c$b$r$t$d$c$c$s$t$u$e$d$d$t$u$v$f$e$e$u$v$g$f$v$v$w$g$h$g$w$w$x$h$i$h$x$x$y$i$j$i$y$y$z$j$k$j$z$z${$k$|$l$k$|$k${$}$m$l$}$l$|$0m$}$}$n$0$o$~$o$n$~$$p$$p$o$$$q$$q$p$$$r$$r$q$$$s$$s$r$$$t$$t$s$$$u$t$t$$$$v$u$u$$$$w$v$$v$$$x$w$$w$$y$x$$$$y$z$y$$$$z$${$z$$z$$$|${$${$$$}$|$$|$$~$n$$n$}$$$$$$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$~$$$$$M$N$$M$$$=$M$$=$$$=$$$$>$=$$N$>$$>$$N$O$$N$$$>$N$$>$$$>$$$$?$>$$O$?$$?$$[$\$$[$$$M$[$$M$$$M$$$$N$M$$\$N$$N$$\$]$$\$$$N$\$$N$$$N$$$$O$N$$]$O$$O$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$,%$$$$,%%%-%%%-%%%-% %%-%!% %-%"%!%-%#%"%-%$%#%-%%%$%-%&%%%-%'%&%-%(%'%-%)%(%-%*%)%-%*%-%+%-%%+%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@%?%>%>%A%@%E%D%C%E%C%B%$$$$$$$$$$$$$$$$$$$$$$!$$$!!"$$$$$"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$I%H%G%G%F%I%M%L%K%M%K%J%$$$$$$$$$$$$$$$$$$!$$$1!$$""2$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1$$$$$2$21$$$$$2$%$$$$$%$$$%%%$$$%%%$$$%%%$$$%%%$$$%%$$%%%$$$%%%$$$%%%$$$%% %$$$ % % %$ %$$ %$ %$$$$$ % %$$ %$ %%$ %$$ %%$%$$%%%%%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% % %%%% %% % %% %% %$ % % %%% % %% %%%%%% %%%%%%%% %%%%%%!%% %%% %"%%!%%%!%#%%"%%%"%$%%#%%%#%%%%%%$%%%%%%%%%&%%'%%%'%%&%(%%%(%%'%)%%%)%%(%*%%%*%%)%+%%%+%%*%% %%%%+%$$/%$.%/%$$/%/%0%$$$0%0%1%$.%$$.%$1%$$2%$2%3%$$3%$3%4%$4%5%5%$$2%$$2%$5%$$7%$6%7%$$7%7%8%$$$8%8%9%$6%$$6%$9%$$:%$:%;%$$;%$;%<%$<%=%=%$$:%$$:%$=%?%/%.%?%.%>%/%?%@%@%0%/%1%0%@%1%@%A%.%1%A%A%>%.%3%2%B%3%B%C%4%3%D%3%C%D%4%D%E%E%5%4%B%2%E%2%5%E%G%7%6%G%6%F%7%G%H%H%8%7%9%8%H%9%H%I%6%9%I%I%F%6%;%:%J%;%J%K%<%;%L%;%K%L%<%L%M%M%=%<%:%=%M%M%J%:%%N%O%%O%P%%P%Q%%Q%R%%R%S%%S%T%%T%U%%U%V%%V%W%%W%X%%X%Y%%Y%Z%%Z%[%%[%\%%\%]%]%N%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%_%O%N%_%N%^%P%O%_%_%`%P%Q%P%`%`%a%Q%b%R%Q%Q%a%b%c%S%R%R%b%c%d%T%c%T%S%c%e%U%d%U%T%d%f%V%e%V%U%e%g%W%f%W%V%f%h%X%g%X%W%g%i%Y%h%Y%X%h%%%%%%%%%%%%%l%\%[%l%[%k%m%]%\%m%\%l%^%N%]%^%]%m%o%_%^%o%^%n%`%_%o%o%"`%a%`%""#a%p%b%a%a%#p%q%c%b%b%p%q%r%d%q%d%c%q%s%e%r%e%d%r%t%f%s%f%e%s%u%g%f%f%t%u%v%h%u%h%g%u%w%i%v%i%h%v%%%%%%%%%%%%%z%l%k%z%k%y%m%l%z%z%{%m%n%^%m%n%m%{%o%n%|%|%}%o%"o%}%}%2"~%p%##3~%%q%p%p%~%%%r%q%q%%%%s%r%r%%%%t%s%s%%%%u%%u%t%%%v%%v%u%%%w%%w%v%%%x%w%%w%%%y%x%%x%%%z%y%%y%%{%z%%%%{%n%{%%%|%n%%}%|%%|%%%2}%%}%%%32%2%%~%%~%3%%%%%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%i%j%%i%%%Y%i%%Y%%%Y%%%%Z%Y%%j%Z%%Z%%j%k%%j%%%Z%j%%Z%%%[%Z%%%%[%%k%[%[%%%w%x%%w%%%i%w%%i%%%i%%%%j%i%%x%j%%j%%x%y%%y%%%j%x%%j%%%%k%j%%j%%%y%k%k%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%H&%%%%H&9&8&I&:&9&I&;&:&I&<&;&I&=&<&I&>&=&I&?&>&I&@&?&I&A&@&I&B&A&I&C&B&I&D&C&I&E&D&I&F&E&I&F&I&G&I&8&G&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]&\&[&]&[&Z&a&`&_&a&_&^&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%#%%%%##$%%%%%$%&%%%%&&%&%%&&%&%%&&%&%%&&%&%%&&%%%&&e&d&c&e&c&b&i&h&g&i&g&f&&%%&%& &%% &%&%%%%% &%% & & &%%% & & &%#% & &3# &%$$4 &&&%% &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&% &&& &% & &&&& & & &&&& &&3 && &&&43&3&& &44&&&&&& &&&&&&&& &&&&& &!&&&& &!&"&&&&!&"&#&&&&"&#&&&#&#&$&&&&$&$&%&&&&%&%&&&&&&&&&&'&&& &&&&'&)&&&)&&(&*&&&*&&)&+&&&+&&*&,&&&,&&+&-&&&-&&,&.&&-&&&-&/&&.&&&.&0& &/& &&/&1&!& & &0&1&2&"&!&!&1&2&3&#&2&#&"&2&4&$&3&$&#&3&%&$&4&4&5&%&&&%&5&5&6&&&7&'&&&7&&&6&(&&'&(&'&7&9&)&(&9&(&8&:&*&)&:&)&9&;&+&*&;&*&:&<&,&+&<&+&;&=&-&<&-&,&<&>&.&=&.&-&=&?&/&>&/&.&>&@&0&?&0&/&?&A&1&@&1&0&@&B&2&A&2&1&A&C&3&B&3&2&B&D&4&C&4&3&C&E&5&4&4&D&E&F&6&5&5&E&F&G&7&6&G&6&F&8&(&7&8&7&G&%%J&J&K&%%%K&K&L&%%%M&%L&M&J&%%J&%M&%%N&%N&O&%%O&%O&P&%P&Q&Q&%%N&%%N&%Q&&&R&R&S&&%&S&S&T&%%%U&%T&U&R&&%R&%U&&&V&&V&W&%&W&%W&X&%X&Y&Y&%%V&&%V&%Y&J&Z&[&[&K&J&K&[&\&\&L&K&M&L&\&M&\&]&]&Z&J&]&J&M&O&N&^&O&^&_&`&P&O&`&O&_&P&`&a&a&Q&P&^&N&a&N&Q&a&R&b&c&c&S&R&S&c&d&d&T&S&U&T&d&U&d&e&e&b&R&e&R&U&W&V&f&W&f&g&h&X&W&h&W&g&X&h&i&i&Y&X&i&f&V&i&V&Y&&j&k&&k&l&&l&m&&m&n&&n&o&&o&p&&p&q&&q&r&&r&s&&s&t&&t&u&&u&v&&v&w&&w&x&&x&y&y&j&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&k&j&{&j&z&l&k&{&{&|&l&}&m&l&}&l&|&~&n&m&~&m&}&o&n&~&~&&o&p&o&&&&p&q&p&&&&q&r&q&&&&r&&s&r&r&&&&t&&t&s&&&u&&u&t&&&&&&&&&&&&&&&x&w&w&&&&y&x&&x&&z&j&y&z&y&&&{&z&&z&&&|&{&&{&&}&|&&&&}&~&}&&&$~&&~&$$%&&&%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&z&&&&&&&&&&&&&&&&&&&&&&&$&&&4$&&%%5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4&&&&454&&&5&&5&5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&u&&&u&&&v&u&&v&&&&&v&&v&&&&&&&&v&&&v&&&w&v&&w&&&&&w&w&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&d'&&d'&&d'&&d'&&d'&&d'&&d'&&d'&'d'''d'''d'''d'''d'''d'''d''''&d'U'T'e'V'U'e'W'V'e'X'W'e'Y'X'e'Z'Y'e'['Z'e'\'['e']'\'e'^']'e'_'^'e'`'_'e'a'`'e'b'a'e'b'e'c'e'T'c' '&& '&' '&& '& ' '&& '& '&& ' ' '&&& ' ' '&'&&'& '&&'''&'&''''''''''''''''''''''y'x'w'y'w'v'}'|'{'}'{'z''''''''''''''&''''' '''''' ' '' ''' ' '' '' ' '''' ' ' '''% '' '& '%&''''&''''''''''''' ''''' '!'' ''' ''''''~'''''''$''''#'$'%''''$'%'''''%''''&'&''''''''''(''''('(')'''')')'*''%'*'*'5%+''&&6+',''''+','-'''','-'.' '''-'.'/'!'.'!' '.'0'"'/'"'!'/'1'#'0'#'"'0'2'$'#'#'1'2'3'%'$'$'2'3'&''%'%'3'&'''&'4'4'5'''('''5'5'6'('7')'('7'('6'8'*')'8')'7'9'5*'9'*'8'659'9':'6+'6:':';'+','+';';'<','='-',','<'='>'.'-'-'='>'?'/'.'.'>'?'@'0'/'/'?'@'A'1'0'0'@'A'2'1'A'A'B'2'3'2'B'B'C'3'&'3'C'C'4'&'E'5'4'4'D'E'6'5'E'E'F'6'G'7'6'G'6'F'H'8'7'H'7'G'I'9'8'I'8'H':'9'I'I'J':';':'J'J'K';'L'<';'L';'K'M'='L'='<'L'N'>'M'>'='M'O'?'N'?'>'N'P'@'?'?'O'P'Q'A'@'@'P'Q'B'A'Q'Q'R'B'C'B'R'R'S'C'D'4'C'C'S'D'U'E'D'D'T'U'V'F'E'E'U'V'W'G'F'F'V'W'X'H'G'X'G'W'Y'I'H'Y'H'X'J'I'Y'Y'Z'J'K'J'Z'Z'['K'\'L'['L'K'[']'M'\'M'L'\'^'N']'N'M']'_'O'^'O'N'^'`'P'_'P'O'_'a'Q'P'P'`'a'b'R'a'R'Q'a'c'S'b'S'R'b'T'D'S'S'c'T'''f'f'g''''g''g'h'''i''h'i'f'''f''i'''j''j'k'''k''k'l'''l''l'm'j'''j''m'!'"'n'n'o'!''!'o''o'p'''q''p'q'n'"''n''q'#'r's's'"'#''"'s''s't'u'''u''t'r'#''r''u'w'g'f'w'f'v'h'g'x'g'w'x'i'h'x'i'x'y'f'i'y'y'v'f'k'j'z'z'{'k'l'k'|'k'{'|'m'l'}'l'|'}'j'm'}'}'z'j''o'n''n'~'p'o''o'''q'p''q'''n'q'''~'n's'r''''s't's''s'''u't''t'''r'u''''r'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''(((((( ( ( ( ( ((''''''''''''''''''''''''''''''''''''''''''''''''''''&'''&&''''''''''''''''''''''''''(( ( ( ((((((((''''''''''''''''''''''''''''''''''''''''''''''''&'''6&''''7''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''6'''''76'6''7''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''((('''('((''('(((''('(''('((''('((''((('''((('''('( ('' (' ( ( ('' (' ('' ( ((''' (' ( (''(' ((''((('''(( ('((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( (( (!((!("(("(#(#(((q(p((r(q((s(r((t(s((u(t((v(u((w(v((x(w((y(x((z(y(({(z((|({((}(|((~(}((~((((p((%(((($(%(&((((%(&('((((&('(((((('((()((()((((*(((*(()(+(((+((*(((+(+(,((((,(,(-((((-(-(.((((.(.(/((((((((((((((2("(!(2(!(1(3(#("("(2(3($((3((#(3(5(%(4(%($(4(6(&(%(%(5(6(7('(&(&(6(7(8((('('(7(8()(((8(8(9()(*()(9(9(:(*('+(*('*(:(,(+(''(,(;(-(,(,((;(<(.(-(-(;(<(/(.(<(<(=(/(((((((((((((@(2(1(@(1(?(A(3(2(2(@(A(4($(A($(3(A(C(5(B(5(4(B(D(6(5(5(C(D(E(7(6(6(D(E(8(7(E(E(F(8(9(8(F(F(G(9(:(9(G(G(H(:(':(H(H(7'I(;(((8I(J(<(;(;(I(J(K(=(<(<(J(K(>(=(K(K(L(>(M(?(>(>(L(M(N(@(?(?(M(N(O(A(@(@(N(O(B(4(O(4(A(O(C(B(P(P(Q(C(D(C(Q(Q(R(D(E(D(R(R(S(E(T(F(E(E(S(T(G(F(T(T(U(G(H(G(U(U(V(H(W(7H(W(H(V(X(87X(7W(Y(I(8Y(8X(J(I(Y(Y(Z(J(K(J(Z(Z([(K(\(L(K(K([(\(](M(L(L(\(](^(N(M(M(](^(_(O(N(N(^(_(B(O(_(_(P(B(Q(P(`(`(a(Q(R(Q(a(a(b(R(c(S(R(R(b(c(d(T(S(S(c(d(e(U(T(T(d(e(f(V(U(U(e(f(g(W(V(g(V(f(h(X(W(h(W(g(i(Y(X(i(X(h(Z(Y(i(i(j(Z([(Z(j(j(k([(\([(k(k(l(\(m(](\(\(l(m(n(^(](](m(n(o(_(n(_(^(n(`(P(o(P(_(o(q(a(`(`(p(q(r(b(a(a(q(r(s(c(r(c(b(r(t(d(c(c(s(t(u(e(d(d(t(u(v(f(e(e(u(v(w(g(f(w(f(v(x(h(g(x(g(w(i(h(x(x(y(i(j(i(y(y(z(j(k(j(z(z({(k(|(l(k(|(k({(}(m(|(m(l(|(~(n(}(n(m(}((o(~(o(n(~(p(`((`(o((0((((/(0((/((((( ((( ((((0( (( ((0(1((0((( (0(( (((!( ((!((((1(!((!((>((((=(>(/(=((/(((0(/((0((((>(0((0((?((((>(?(0(>((0((((1(0((0(((?(1((1(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(((()(())())))))))))))))))))))))))) ))) ) )) ) )) ) )) )) ))( )((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#)")!)!) )#)')&)%)%)$)')(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()((())((((((((+)*)()*)))()/).)-)-),)/)((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((8((())9(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((8((((898(((9((9(9((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()(((())((()))((()))()(())((()))((()))((())(()))()(()()(()) )((( ) ) )((( ) ) )( )(( )( ) )( )(( )(( )(( )()))(((()())(()()))(()()(()())(()())(()()))(()()()))(((()())(()()))(()()()))(((()()))(()())(()()))!)) )!)))"))!)")))")")#))))#)#) ))))$))$)%)))&))%)&)')))'))&)')$))'))))))))()))))*))))*)))*)*)+))))+)+)()))),)),)-))).))-).)/)))/)).)))/)/),)))0)1))1)2))2)3))3)4))4)5))5)6))6)7))7)8))8)9))9):)):);));)<))<)=))=)>))>)?)?)0))))))))))))))))))))))))))))))))))))))))))))))))))1)0)@)@)A)1)B)2)1)1)A)B)C)3)2)2)B)C)D)4)3)3)C)D)E)5)4)4)D)E)F)6)5)5)E)F)G)7)6)6)F)G)H)8)7)7)G)H)I)9)H)9)8)H)J):)9)J)9)I);):)J)J)K);)))))))))))))N)>)=)N)=)M)?)>)N)N)O)?)0)?)O)O)@)0)A)@)P)P)Q)A)R)B)A)A)Q)R)S)C)B)B)R)S)T)D)C)C)S)T)U)E)D)D)T)U)V)F)E)E)U)V)W)G)F)F)V)W)H)G)W)W)X)H)I)H)X)X))I)J)I)))*J)Y)K)J)J)*Y)))))))))))))\)N)M)M)[)\)O)N)\)\)])O)@)O)])])P)@)Q)P)^)^)_)Q)`)R)Q)Q)_)`)a)S)R)R)`)a)b)T)S)S)a)b)U)T)b)b)c)U)V)U)c)c)d)V)W)V)d)d)e)W)X)W)e)e)f)X))X)f)f)9)g)Y)**:g)h)Z)Y)Y)g)h)i)[)Z)Z)h)i)j)\)[)[)i)j)])\)j)j)k)])P)])k)k)^)P)m)_)^)^)l)m)`)_)m)m)n)`)a)`)n)n)o)a)b)a)o)o)p)b)c)b)p)p)q)c)d)c)q)q)r)d)s)e)d)d)r)s)t)f)e)e)s)t)u)9f)f)t)u):9u)u)v):g):v)v)w)g)h)g)w)w)x)h)y)i)h)h)x)y)z)j)i)i)y)z){)k)j)j)z){)l)^)k)k){)l)})m)l)l)|)})n)m)})})~)n)o)n)~)~))o))p)o)o))))q)p)p)))r)q))))r))s)r)r))))t)s)s))))u)t)t)))v)u))))v)w)v))))w))x)w))w))y)x))))y)z)y))))z){)z)))){)|)l){){))|))})|))|)))~))~)}))))))~)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))|)))))K)L))K)));)K));)));))))<);))L)<))<))L)M))L)))<)L))<)))=)<))=))))M)=))=))Y)Z))Y)))K)Y))K)))K))))L)K))Z)L))L))[))))Z)[)L)Z))L))))M)L))L)))[)M))M))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))**))**))**))**))**))**))**))**))**))**))**))**))**))**))**))))****+***+***+***+***+* **+*!* *+*"*!*+*#*"*+*$*#*+*%*$*+*&*%*+*'*&*+*(*'*+*(*+*)*+**)*))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>*=*<*<*?*>*C*B*A*A*@*C*))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))*)))+)*+G*F*D*F*E*D*K*J*I*I*H*K*))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))*))):*))++;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))*)))***)))***)*)))***:))***;::**);***)))***)))***) *)))* *)))) *))) * * *) *))) * *)) * * *))) * **)))***)**))*************************************************** *****) *** *) * **** ** * ** *** * ** ****** ******** ***** *!**** *!*"****!*"*#****"*#*$****#*$*%****$*%***%*%*&****&*&*'****'*'*(****(*(*)** **)*)** *),*-*-*))))-*)-*.*)).*).*/*,*)),*)/*))0*)0*1*))1*)1*2*)2*3*3*))0*))0*)3*)4*5*5*+))+5*)5*6*))6*)6*7*4*))4*)7*))8*)8*9*))9*)9*:*):*;*;*))8*))8*);*=*-*,*=*,*<*-*=*>*>*.*-*/*.*>*/*>*?*,*/*?*?*<*,*1*0*@*1*@*A*2*1*B*1*A*B*2*B*C*C*3*2*C*@*0*C*0*3*E*5*4*E*4*D*6*5*F*5*E*F*7*6*F*7*F*G*4*7*G*G*D*4*9*8*H*9*H*I*:*9*J*9*I*J*:*J*K*K*;*:*8*;*K*K*H*8**L*M**M*N**N*O**O*P**P*Q**Q*R**R*S**S*T**T*U**U*V**V*W**W*X**X*Y**Y*Z**Z*[*[*L**************************************************M*L*\*\*]*M*N*M*]*]*^*N*O*N*^*^*_*O*P*O*_*_*`*P*a*Q*P*P*`*a*b*R*Q*Q*a*b*c*S*R*R*b*c*d*T*S*S*c*d*e*U*T*T*d*e*f*V*U*U*e*f*g*W*V*V*f*g*************j*Z*Y*j*Y*i*[*Z*j*j*k*[*L*[*k*k*\*L*]*\*l*l*m*]*^*]*m*m*n*^*_*^*n*n*o*_*`*_*o*o*p*`*a*`*p*p*q*a*r*b*a*a*q*r*s*c*b*b*r*s*t*d*c*c*s*t*e*d*t*t*u*e*f*e*u*u*v*f*+g*f*f*v*+************x*j*i*i*w*x*k*j*x*x*y*k*\*k*y*y*l*\*{*m*l*l*z*{*|*n*m*m*{*|*o*n*|*|*}*o*p*o*}*}*~*p*q*p*~*~**q**r*q*q****s*r*r***t*s****t*u*t****u*v*u****v*+v***;+*w*,,<**x*w*w****y*x*x***l*y***z*l**{*z*z****|*{*{****}*|*|***~*}****~**~************************************;*;***<;;****<<***************z*****************************************************************************************************************************************************************************************************h****g*h*W*g**W***X*W**X****h*X**X**h*i**h***X*h**X***Y*X**Y****i*Y**Y**,***+,g*+*g***h*g**h****,h**h**w****,w*h*,*h****i*h**h***w*i**i**************************************************************************************************F+**F+**F+**F+**F+**F+**F+**F+**F+**F+**F+**F+**F+**F+**F+****F+7+6+G+8+7+G+9+8+G+:+9+G+;+:+G+<+;+G+=+<+G+>+=+G+?+>+G+@+?+G+A+@+G+B+A+G+C+B+G+D+C+G+D+G+E+G+6+E+******************************************************************[+Z+X+Z+Y+X+_+^+]+_+]+\+****************************************************+*+***+++***+++***+++***++**+++*c+b+a+a+`+c+g+f+e+g+e+d++**+*-+***++****+* +***+ +** + + +*** + + +* +** +* + +** +* ++* + +++++++++++++++++++++++++++++++++,+++<,++--=++++++++*++++ +++++ ++ + + ++++ + + ++++ + + +++ + ++++ ++ +++++++++++++++++++++++ +++++ +!++++ +!+<+!+!+"+<#+="+=<"+$++#++=#+%++++$+%+++++%++++&+&+'++++'+'+(++)++++(+)+*++++)+*++++++++*+,+++,++++++,+,+-++++-+-+.++/++++.+/+0+ +++/+0+1+!+ + +0+1+2+"+1+"+!+1+3+#+2+#+"+2+4+$+3+$+#+3+%+$+4+4+5+%++%+5+5+&++'+&+6+6+7+'+8+(+'+8+'+7+)+(+8+8+9+)+*+)+9+9+:+*+;+++*+;+*+:+<+,+++<+++;+=+-+,+=+,+<+>+.+-+>+-+=+?+/+>+/+.+>+@+0+/+/+?+@+A+1+0+0+@+A+B+2+1+1+A+B+C+3+B+3+2+B+D+4+C+4+3+C+5+4+D+D+E+5+&+5+E+E+6+&+**H+*H+I+**I+*I+J+*J+K+K+**H+**H+*K+**L+L+M+***M+*M+N+**O+*N+O+L+**L+*O++,P++P+Q+*+Q+*Q+R+*R+S+S+**P+,*P+*S+,-T+T+U+,*,U+*U+V+**W+*V+W+T+-*T+*W+Y+I+H+Y+H+X+I+Y+Z+Z+J+I+K+J+Z+K+Z+[+H+K+[+[+X+H+M+L+\+\+]+M+N+M+^+M+]+^+O+N+_+N+^+_+_+\+L+_+L+O+a+Q+P+a+P+`+Q+a+b+b+R+Q+S+R+b+S+b+c+P+S+c+c+`+P+U+T+d+d+e+U+V+U+f+U+e+f+W+V+g+V+f+g+T+W+g+g+d+T++h+i++i+j++j+k++k+l++l+m++m+n++n+o++o+p++p+q++q+r++r+s++s+t++t+u++u+v++v+w+w+h++++++++++++++++++++++++++++++++++++++++++++++++++y+i+x+i+h+x+z+j+y+j+i+y+{+k+z+k+j+z+l+k+{+{+|+l+m+l+|+|+}+m+~+n+m+~+m+}++o+n++n+~++p+o+o++++q+p+p++++r+q+q++++s+r+r++++++++++++++++v+u+u++++w+v+v+++x+h++h+w+++y++y+x+++z+y+y+++{+z++++{+|+{++++|+}+|++++}++~+}++}++++~++~++++++++++++++++++++++++++++++++++++++++.+-.++++.++x++x+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-+++=-++..>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=+++++>+>=+++++>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++s+++s+++t+s++t+++++t++t++++++++t+++t+++t++++u+t+++u++u+++++++++++++++++++++++++++-+++++++++++++++++-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++b,++b,++b,++b,++b,++b,++b,++b,++b,++b,+,b,,,b,,,b,,,b,,,b,,,,+b,S,R,c,T,S,c,U,T,c,V,U,c,W,V,c,X,W,c,Y,X,c,Z,Y,c,[,Z,c,\,[,c,],\,c,^,],c,_,^,c,`,_,c,`,c,a,c,R,a,,+++,,,+,++, ,+,++, ,+ ,++ , ,+ ,++ ,++ , , ,+++ , , ,+,++,+ ,,++,+,,,++,,,,,,,,w,v,t,v,u,t,{,z,y,{,y,x,,,,,,,,,,,,,,+,,,,,,,,,,,,,,,,, ,, ,,,, ,, , ,, , ,,,, , , ,,,, , , ,,,, ,,, ,, ,,,,,,,, ,,, ,,,,, , ,!,,,~,|,~,},|,,,,,,,.,,.,#,,.,./,,,,,/,%,,,,$,%,&,,,,%,&,',,,,&,',(,,,,',(,,,(,(,),,,,),),*,,,,*,*,+,,,,,,,,,+,-,,,-,,,,., ,,.,,-,!, ,.,.,/,!,",!,/,/,0,",#,",0,0,1,#,.#,1,1,>.$,,//?$,3,%,2,%,$,2,4,&,3,&,%,3,5,',&,&,4,5,6,(,',',5,6,7,),(,(,6,7,8,*,),),7,8,+,*,8,8,9,+,,,+,9,9,:,,,-,,,:,:,;,-,.,-,;,;,<,.,/,.,<,<,=,/,0,/,=,=,>,0,?,1,0,0,>,?,@,>1,1,?,@,A,?>>@,A,2,$,A,$,?A,C,3,B,3,2,B,D,4,C,4,3,C,E,5,4,4,D,E,6,5,E,E,F,6,7,6,F,F,G,7,H,8,7,7,G,H,I,9,8,8,H,I,:,9,I,I,J,:,;,:,J,J,K,;,L,<,;,L,;,K,M,=,<,M,<,L,N,>,=,N,=,M,O,?,N,?,>,N,P,@,?,?,O,P,Q,A,@,@,P,Q,B,2,Q,2,A,Q,S,C,R,C,B,R,D,C,S,S,T,D,E,D,T,T,U,E,F,E,U,U,V,F,G,F,V,V,W,G,X,H,G,X,G,W,Y,I,H,Y,H,X,J,I,Y,Y,Z,J,[,K,J,[,J,Z,\,L,K,\,K,[,],M,L,],L,\,^,N,M,^,M,],_,O,N,_,N,^,`,P,O,O,_,`,a,Q,P,P,`,a,R,B,a,B,Q,a,,,d,,d,e,,,e,,e,f,,f,g,g,,,d,,,d,,g,,,h,,h,i,,,i,,i,j,,,j,,j,k,h,,,h,,k,!,",l,!,l,m,,!,m,,m,n,,n,o,o,,,l,",,l,,o,#,p,q,q,",#,,",q,,q,r,s,,,s,,r,p,#,,p,,s,u,e,d,u,d,t,f,e,v,e,u,v,g,f,v,g,v,w,d,g,w,w,t,d,i,h,x,x,y,i,j,i,z,i,y,z,k,j,{,j,z,{,h,k,{,{,x,h,},m,l,},l,|,n,m,~,m,},~,o,n,~,o,~,,l,o,,,|,l,q,p,,,,q,r,q,,q,,,s,r,,r,,,p,s,,,,p,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------ --- ---,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - - - - - -------,,,,,,/,,,,/ ,,,/ ,,  0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,?/,,00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?,?,,,0??,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,---,,,,,,,--,,-,--,,-,-,,-,--,,---,,,---,,,-,--,, -,- -,, - --, -,, -, -,, -, - -,, -, - -,, - - -,,,---,-,-,--------,----,~---~---~---~---~---~---~---~---~---~---~---~---~---~-- -~- -!-!--~-o-n--p-o--q-p--r-q--s-r--t-s--u-t--v-u--w-v--x-w--y-x--z-y--{-z--|-{--|--}--n-}-#----"-#-$----#-$-%----$-%-&----%-&-'----&-'-(----'-(-)---)--(-*---*--)---*-*-+----+-+-,----,-,----------------0- --0--/-!- -0-0-1-!--!-1-1-"--3-#-"-"-2-3-4-$-#-#-3-4-5-%-$-$-4-5-6-&-%-%-5-6-7-'-&-&-6-7-8-(-'-'-7-8-)-(-8-8-9-)-*-)-9-9-:-*-+-*-:-:-;-+-,-+-;-;-<-,-=---,-,-<-=-------------@-0-/-@-/-?-1-0-@-@-A-1-2-"-1-1-A-2-3-2-12-01B-4-3-3-1B-5-4-B-B-C-5-6-5-C-C-D-6-E-7-6-6-D-E-8-7-E-E-F-8-9-8-F-F-G-9-:-9-G-G-H-:-;-:-H-H-I-;-J-<-;-;-I-J-K-=-<-<-J-K-L->-=-=-K-L-M-?->->-L-M-@-?-M-M-N-@-A-@-N-N-O-A-02-A-A-O-0B-1AAP-B-C-B-P-P-Q-C-D-C-Q-Q-R-D-E-D-R-R-S-E-T-F-E-E-S-T-U-G-F-F-T-U-H-G-U-U-V-H-I-H-V-V-W-I-X-J-I-X-I-W-Y-K-J-J-X-Y-Z-L-K-K-Y-Z-M-L-Z-Z-[-M-\-N-M-M-[-\-]-O-N-N-\-]-@0O-O-]-@_-A^-A@^-`-P-AA_-`-Q-P-`-`-a-Q-R-Q-a-a-b-R-c-S-R-R-b-c-d-T-S-S-c-d-e-U-T-T-d-e-V-U-e-e-f-V-W-V-f-f-g-W-h-X-W-h-W-g-Y-X-h-h-i-Y-Z-Y-i-i-j-Z-[-Z-j-j-k-[-\-[-k-k-l-\-m-]-\-\-l-m-^-@]-]-m-^-o-_-n-_-^-n-p-`-_-_-o-p-q-a-`-`-p-q-r-b-a-a-q-r-s-c-r-c-b-r-t-d-c-c-s-t-u-e-d-d-t-u-v-f-e-e-u-v-g-f-v-v-w-g-x-h-g-x-g-w-i-h-x-x-y-i-j-i-y-y-z-j-k-j-z-z-{-k-|-l-k-|-k-{-}-m-|-m-l-|-n-^-}-^-m-}-.------.---------------.-----.-/--.----.------------/----->----=->---=------.----.---->-.--.--?---->-?-.->--.----/-.--.---?-/--/-------------------------------------------------------------------------------------------------- .-- .-- .-- .-- .-- .-- .-- .-- .-- .-- .-- .-- .-- .-- .---- .-- .-- .-- ..- ... ... ... ... ... ... ... ... . .. . . . . . . . .- .------------------------------------------------------------------!. ....!.%.$.#.#.".%.------------------------------------------------------------------------------------).(.'.'.&.).-.,.+.+.*.-.----------------------1---2-12----2-------------------------------------------------------------------------------A1---A-2BB---------------------------------------------------------------------------------A----BA---B-B----------------------------------------------------------------------------------------------------.----..---...---...---...---...---..--...---...---...---.. .--- . . .--- . . .------ .--.-..--.-..-...--.--.-.--.-..--.-..--.-...--.-.--.-..--.-..-...--.--.-.-...----.-...--.-..--.-......... ... ... . .!....!.!....."..".#...$..#.$.%...%..$."..%...%...'..&.'...(..'.(...(.(.)....).).&....*..*.+...,..+.,.-...-..,.*..-...-..../../.0..0.1..1.2..2.3..3.4..4.5..5.6..6.7..7.8..8.9..9.:..:.;..;.<..<.=.=..................................................../...>.>.?./.0./.?.?.@.0.1.0.@.@.A.1.B.2.1.1.A.B.C.3.2.2.B.C.D.4.3.3.C.D.E.5.4.4.D.E.F.6.5.5.E.F.G.7.6.6.F.G.H.8.7.7.G.H.I.9.H.9.8.H.............L.<.;.L.;.K.=.<.L.L.M.=...=.M.M.>...?.>.N.N.O.?.@.?.O.O.P.@.A.@.P.P.Q.A.R.B.A.A.Q.R.S.C.B.B.R.S.T.D.C.C.S.T.E.D.T.T.U.E.V.F.E.E.U.V.W.G.F.F.V.W.H.G.W.W.X.H.I.H.X.X.Y.I.............\.L.K.\.K.[.M.L.\.\.].M.>.M.].].N.>.O.N.^.^._.O.P.O._._.2P.Q.P.223Q.`.R.Q.Q.3`.a.S.R.R.`.a.b.T.S.S.a.b.U.T.b.b.c.U.V.U.c.c.d.V.W.V.d.d.e.W.X.W.e.e.f.X.Y.X.f.f.g.Y.h.Z.Y.Y.g.h.i.[.Z.Z.h.i.j.\.[.[.i.j.k.].\.\.j.k.^.N.].].k.^.m._.^.^.l.m.B2_._.m.B`.3CCn.`.a.`.n.n.o.a.b.a.o.o.p.b.c.b.p.p.q.c.d.c.q.q.r.d.s.e.d.d.r.s.t.f.e.e.s.t.u.g.f.f.t.u.h.g.u.u.v.h.i.h.v.v.w.i.j.i.w.w.x.j.y.k.j.j.x.y.l.^.k.k.y.l.m.l.z.z.{.m.|.Bm.m.{.|.CB|.|.}.Cn.C}.}.~.n.o.n.~.~..o..p.o.o....q.p.p....r.q.q....s..s.r...t.s.s....u.t.t...v.u....v.w.v....w.x.w....x..y.x.x...l.y...z.l.{.z....{..|.{..{...}.|..|...~..~.}......~..............................................................z.....z.J....I.J.9.I..9...:.9..:....J.:..:..J.K..J...:.J..:...:....;.:..K.;..;..Z....Y.Z.I.Y..I...J.I..J....Z.J..J..Z.[..Z...J.Z..J...J....K.J..[.K..K..................................................................................................(/..(/..(/..(/..(/..(/..(/..(/..(/..(/..(/..(/..(/..(/..(/....(///)///)///)///)///)///)///)/ //)/!/ /)/"/!/)/#/"/)/$/#/)/%/$/)/&/%/)/&/)/'/)//'/..................................................................=//....................................................................................E/D/B/D/C/B/I/H/G/I/G/F/..................................3...334...44................................................................................C3...C.4DD............../..../..///...///././..//...///...//..///...///...../. /.../ / /... / /C. / / /C /DC /C /.D / / /... / //./...////..////////////////////////////////////////////.////. ///// / / //// / / //// // / // /// / // //// // //////// ///// /!//// /!/"////!/"/#//"///"/$////#/$///$/$/%////%/%/&////&/&/'///////'/.*/+/+/....+/.+/,/..,/.,/-/*/..*/.-/.../..///..//.//0/..0/.0/1/./.../.1/.2/3/3/....3/.3/4/..4/.4/5/2/..2/.5/.6/7/7/....7/.7/8/9/..9/.8/6/..6/.9/*/:/;/;/+/*////>/?/0///@///?/@/A/1/0/A/0/@/>/./A/./1/A/2/B/C/C/3/2/4/3/D/3/C/D/5/4/D/5/D/E/2/5/E/E/B/2/7/6/F/7/F/G/8/7/H/7/G/H/I/9/8/I/8/H/F/6/I/6/9/I//J/K//K/L//L/M//M/N//N/O//O/P//P/Q//Q/R//R/S//S/T//T/U//U/V//V/W//W/X//X/Y/Y/J//////////////////////////////////////////////////K/J/Z/Z/[/K/L/K/[/[/\/L/M/L/\/\/]/M/N/M/]/]/^/N/_/O/N/_/N/^/P/O/_/_/`/P/a/Q/P/P/`/a/b/R/Q/Q/a/b/c/S/R/R/b/c/d/T/S/S/c/d/e/U/T/T/d/e/////////////h/X/W/h/W/g/i/Y/h/Y/X/h/Z/J/i/J/Y/i/[/Z/j/j/k/[/\/[/k/k/l/\/]/\/l/l/m/]/n/^/]/n/]/m/o/_/^/o/^/n/`/_/o/o/p/`/q/a/`/`/p/q/r/b/a/a/q/r/s/c/b/b/r/s/t/d/c/c/s/t/e/d/t/t/u/e/////////////x/h/g/x/g/w/y/i/h/h/x/y/j/Z/i/i/y/j/{/k/j/j/z/{/l/k/{/{/|/l/m/l/|/|/}/m/4n/m/m/}/4n/455o/n/p/o/55~/p/q/p/~/~//q/r/q////r//s/r/r///t/s////t/u/t////u/v/u////v/w/v////w//x/w/w////y/x/x///z/j/y/y//z/{/z////{//|/{/{////}/|/|///D4}/}//D~/5EE/~//~//////////////////////////////////////////////////////z////////////////////////D/////ED/D///E/E/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////e/f//e///U/e//U///U////V/U//f/V//V//f/g////f/V/f//V///W/V//V////g/W//W//u/v//u///e/u//e///e////f/e//v/f//f//v/w////v/f/v//f///g/f//f////w/g//g//////////////////////////////////////////////////////////////////////////////////////////////////D0//D0//D0//D0//D0//D0//D0//D0//D0//D0//D0//D0//D0//D0//D0////D05040E06050E07060E08070E09080E0:090E0;0:0E0<0;0E0=0<0E0>0=0E0?0>0E0@0?0E0A0@0E0B0A0E0B0E0C0E040C0//////////////////////////////////////////////////////////////////Y0X0V0X0W0V0]0\0[0]0[0Z0////////////////////////////////////////////////////////////////0/0///000///000///00a0`0_0_0^0a0e0d0c0c0b0e00///000///00//0//0 0///0 0 0/// 0 0// 0 0 0/// 0 0 0/// 0 05//566// 0// 0/600/0/ 00000000000000000000000000000000000000000000/00000 000000 0 0 0000 0 0 0000 0 0 000E5 0 00E 06FF0 00 00000000000000000000000 00000 0!0000 0!0"00!000!0#00"000"000#000#000$0$0%0000%0%0&0000&0&0'00(0000'0(0)0E00(0)0FE)0)0*0F0F*0*0+00,000,00+0-000-00,000-0-0.00/0000.0/000 000/00010!0 0 0001020"010"0!01030#020#0"020$00300#030%0$0404050%0&0%0505060&0'0&0606070'080(0'080'07090)0(090(080*0)09090:0*0;0+0*0;0*0:0<0,0+0<0+0;0=0-0,0=0,0<0>0.0-0>0-0=0?0/0.0?0.0>0@000/0/0?0@0A0100000@0A0B020A02010A0C030B03020B0$030C0C040$0/F0G0G0////G0/G0H0//H0/H0I0F0//F0/I0//J0/J0K0//K0/K0L0/L0M0M0//J0//J0/M00N0O0O000/0O0/O0P0//P0/P0Q0N00/N0/Q000R00R0S0/0S0/S0T0/T0U0U0//R00/R0/U0F0V0W0W0G0F0X0H0G0X0G0W0I0H0X0I0X0Y0F0I0Y0Y0V0F0K0J0Z0Z0[0K0L0K0\0K0[0\0]0M0L0]0L0\0J0M0]0]0Z0J0N0^0_0_0O0N0P0O0`0O0_0`0Q0P0`0Q0`0a0N0Q0a0a0^0N0S0R0b0S0b0c0T0S0d0S0c0d0U0T0e0T0d0e0R0U0e0e0b0R00f0g00g0h00h0i00i0j00j0k00k0l00l0m00m0n00n0o00o0p00p0q00q0r00r0s00s0t00t0u0u0f00000000000000000000000000000000000000000000000000w0g0f0f0v0w0x0h0w0h0g0w0y0i0x0i0h0x0z0j0y0j0i0y0{0k0z0k0j0z0l0k0{0{0|0l0m0l0|0|0}0m0~0n0m0~0m0}00o0n00n0~00p0o0o0000q0p0p0000000000000000t0s0s0000u00u0t00v0f0u0u00v00w0v0v0000x00x0w000y00y0x000z00z0y00{0z0000{0|0{0000|0}0|0000}00~0}00}0000~00~000000000000000000000000000000000000000v00000000000000000000000000000000000000060006670000007000000000000000000000000000000000000000000000000000000000000000000000000000000F6000F07GG000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000GF000G0G0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000q000q000q0000r0q000r00r00000000r000r000s0r00s00000s00s00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`100`100`100`100`100`100`100`100`100`100`100`101`111`111`11110`1Q1P1a1R1Q1a1S1R1a1T1S1a1U1T1a1V1U1a1W1V1a1X1W1a1Y1X1a1Z1Y1a1[1Z1a1\1[1a1]1\1a1^1]1a1^1a1_1a1P1_1101001101001100011101001 101001 10 100 100 1 1 1000 1 1 10 100 10 110010 1100101u1t1s1s1r1u1y1x1w1y1w1v11111111111111011111111111111111111111111111 11 1111 11 1 11 1 1111 1 1 1111 1 1 1111 111 11 11111111|1{1z1z1}1|11111~11"111"11!1#1111"1#11111#11%1111$1%1&1111%1&1'1111&1'1(11'111'1)1111(1)1*1111)1*111*1*1711177811188+11,111,11+1-111-11,1 11-1-1.1 1!1 1.1.1/1!1"1!1/1/101"1#1"1010111#1$11#1#111$131%1$1$1213141&131&1%13151'141'1&14161(1'1'1516171)1(1(1617181*1)1)17181G7*1*181G+18HH91+1,1+19191:1,1-1,1:1:1;1-1<1.1-1<1-1;1/1.1<1<1=1/101/1=1=1>101?111>11101>121$11111?121A1312121@1A1B141A14131A1C151B15141B1D161C16151C1E1716161D1E1F1817171E1F1G81F1F1G1GH1HGH1GG191HH1H1I191:191I1I1J1:1K1;1:1K1:1J1L1<1;1L1;1K1M1=1<1M1<1L1N1>1=1N1=1M1O1?1N1?1>1N1@121?1?1O1@1Q1A1P1A1@1P1R1B1Q1B1A1Q1S1C1R1C1B1R1T1D1S1D1C1S1E1D1T1T1U1E1F1E1U1U1V1F1G1F1V1V1W1G1X1H1G1X1G1W1Y1I1H1Y1H1X1Z1J1I1Z1I1Y1[1K1J1[1J1Z1\1L1K1\1K1[1]1M1L1]1L1\1^1N1M1^1M1]1_1O1^1O1N1^1P1@1O1O1_1P111b11b1c101c10c1d10d1e1e110b111b11e111f11f1g111g11g1h11h1i1i111f111f11i11 1j11j1k111k11k1l11l1m1m111j1 11j11m1 1!1n1 1n1o11 1o11o1p11p1q1q111n1!11n11q1s1c1b1s1b1r1t1d1c1t1c1s1e1d1t1e1t1u1b1e1u1u1r1b1g1f1v1v1w1g1h1g1x1g1w1x1i1h1y1h1x1y1f1i1y1y1v1f1{1k1j1{1j1z1l1k1|1k1{1|1m1l1|1m1|1}1j1m1}1}1z1j1o1n1~1~11o1p1o11o111q1p11p111n1q111~1n1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222111111111111111111111111111111111111111111111111111111111111111111111111111111111111 2 222 2 222 22 2 2111111111111111111111111111111111111111111111111111111111111811811189911119911111111111111111111111111111111111111111111111111111111111111111111111111111111H8111H19II111111111111111111111111111111111111111111111111111111111111111111111111111111111H11111IH1H111I1I1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111211212112122112122112221112122112122122211112221 211 21211 21 2 211 21 2 211 2 22111 21 2 21121 221222111122 21|222|222|222|222|222|222|222|222|222|222|222|222|222|222|22222|2m2l2}2n2m2}2o2n2}2p2o2}2q2p2}2r2q2}2s2r2}2t2s2}2u2t2}2v2u2}2w2v2}2x2w2}2y2x2}2z2y2}2z2}2{2}2l2{222 2 2!22"2222!2"2#2222"2#2$22#222#2%22$222$2&22%222%2'22&222&2(22'222'2)22(222(2*222*22)2+222+22*2222222222222.222.22-2/222/22.222/2/2 22!2 2020212!2"2!2121222"232#2"2"2223242$232$2#23252%242%2$24262&2%2%2526272'262'2&26282(272(2'27292)282)2(282:2*2)2:2)292;2+2*2;2*2:2222222222222>2.2-2>2-2=2?2/2.2?2.2>2 2/2?2?202 21202@2@2A2122212A2A2B222C2322222B2C2D2423232C2D2E2524242D2E2F2625252E2F2G272F27262F2H282G28272G2992H29282H2929:::292I2;2:2I2:2:J2<2;2J2;2I2=2<2J2J2K2=2>2=2K2K2L2>2?2>2L2L2M2?202?2M2M2@202O2A2@2O2@2N2P2B2O2B2A2O2Q2C2P2C2B2P2R2D2Q2D2C2Q2S2E2D2D2R2S2T2F2E2E2S2T2U2G2F2F2T2U2V2H2G2G2U2V2I9H2H2V2II2:JJW2I2J2I2W2W2X2J2K2J2X2X2Y2K2L2K2Y2Y2Z2L2[2M2L2[2L2Z2N2@2M2N2M2[2]2O2N2]2N2\2^2P2]2P2O2]2_2Q2^2Q2P2^2`2R2_2R2Q2_2a2S2`2S2R2`2b2T2a2T2S2a2c2U2b2U2T2b2d2V2U2U2c2d2e2IV2V2d2e2JIe2e2f2JW2Jf2f2g2W2h2X2W2h2W2g2i2Y2X2i2X2h2Z2Y2i2i2j2Z2k2[2Z2k2Z2j2\2N2[2\2[2k2m2]2\2m2\2l2n2^2m2^2]2m2o2_2n2_2^2n2p2`2o2`2_2o2q2a2p2a2`2p2r2b2q2b2a2q2s2c2r2c2b2r2t2d2s2d2c2s2u2e2d2d2t2u2f2e2u2u2v2f2w2g2f2w2f2v2x2h2g2x2g2w2y2i2h2y2h2x2z2j2i2z2i2y2{2k2j2{2j2z2l2\2k2l2k2{2+2,22,2~222+22222222222~2,22~222,2-22,2222,222222222222-22222;2<22<222+2;2222+2,2+2222,22<2,22,22<2=22<222,2<22,222,2222-2,22=2-22-2222~22~22222222222222~22222~2222222222222222222222222222222222222222222222222222222222222222222222222 322 322 322 322 322 322 322 322 322 322 322 322 322 322 32222 322 322 322 322 322 332 333 333 333 333 333 333 333 333 33 3 3 32 3222222222222222222222222222222222222222222222222222222222222222222333333#3"3!3#3!3 3222222222222222222222222222222222222222222222222222222222222222222222222222222222222&3%3$3$3'3&3+3*3)3+3)3(3222222222222222222222222222222222222222222222222222222222222222222222222:2222222:2:;22222;222222222222222222222222222222222222222222222222222222222222222222222222222222J:222J2;KK222222222222222222222222222222222222222222222222222222222222222222222222222222222J2222KJ222K2K2222222222222222222222222222222222222222222222222222222222322222323223323223323223323223322233223332322323322323 322 32322222 322 32 3 322 32 33233322 322 323223233223233223332322233223233223233233322322323223233223233322323322233 3333 3 3 33333 3333333 33333 333 33 3!333"33!3"3#333#33"3 33#333#33$3%3%3333%3&3&33333&33&3'333'3'3$3333(33(3)333*33)3*3+333+33*333+3+3(333,3-33-3.33.3/33/303303133132332333333433435335363363733738338393393:33:3;3;3,33333333333333333333333333333333333333333333333333=3-3,3=3,3<3>3.3-3>3-3=3?3/3.3?3.3>303/3?3?3@3031303@3@3A3132313A3A3B323C3332323B3C3D343C34333C3E353D35343D3F363E36353E3G3736363F3G3333333333333J3:393J393I3K3;3:3K3:3J3,3;3K3K3<3,3=3<3L3L3M3=3>3=3M3M3N3>3O3?3>3O3>3N3@3?3O3O3P3@3Q3A3@3@3P3Q3R3B3A3A3Q3R3S3C3R3C3B3R3T3D3S3D3C3S3U3E3T3E3D3T3V3F3U3F3E3U3W3G3F3F3V3W3333333333333Z3J3I3Z3I3Y3[3K3J3[3J3Z3L3<3K3L3K3[3M3L3\3\3]3M3N3M3]3]3^3N3O3N3^3^3_3O3`3P3O3`3O3_3a3Q3P3P3`3a3b3R3Q3Q3a3b3c3S3R3R3b3c3d3T3c3T3S3c3e3U3T3T3d3e3f3V3U3U3e3f3;W3V3V3f3;X3W3;X3;<Y3X3<<g3Y3h3Z3Y3h3Y3g3i3[3Z3i3Z3h3L3[3i3i3\3L3]3\3j3j3k3]3^3]3k3k3l3^3m3_3^3m3^3l3n3`3_3n3_3m3o3a3`3`3n3o3p3b3o3b3a3o3q3c3p3c3b3p3r3d3c3c3q3r3s3e3d3d3r3s3t3f3e3e3s3t3K;f3f3t3Kg3<LLu3g3h3g3u3u3v3h3i3h3v3v3w3i3j3\3i3j3i3w3y3k3j3y3j3x3z3l3k3z3k3y3{3m3l3{3l3z3|3n3m3|3m3{3}3o3n3}3n3|3~3p3}3p3o3}33q3~3q3p3~33r33r3q333s3r3r3333t3s3s3333K3Kt333L3LK3u3L333u3v3u3333v33w3v33v33x3j3w3x3w333y3x33x333z3y33y333{3z33z333|3{33{333}33}3|333~33~3}333333~333333333333333333333333333333333333333333333333333x33333G3H3333G373G3333738373373333H3833833H3I33H33383H3383338333393833I3933933W3X3333W3G3W3333G3H3G33G3333X3H33H33X3Y33X333H3X33H333H3333I3H33Y3I33I33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333&433&433&433&433&433&433&433&433&433&433&433&433&433&433&43333&444'444'444'444'444'444'444'444'444'4 44'4!4 4'4"4!4'4#4"4'4$4#4'4$4'4%4'44%4333333333333333333333333333333333333333333333333333333333333333333;4:494;49484?4>4=4?4=4<4333333333333333333333333333333333333333333333333333333333333333333333333333333333333C4B4@4B4A4@4G4F4E4G4E4D4333333333333333333333333333333333333333333333333333333333333333333333333333333333333<3333<33=3<=3333=3333333333333333333333333333333333333333333333333333333433334434334433344433344L<334L3=MM43334443334433433434433434 433 43433 4 4 4333 4 4 43 433 43 4 43 433 444 443 44444444444444444444L44444M4ML444MM444444443444434444444444444 444444 4 44 44 4 4444 44 4 44 444 44 4 444444 44444444 444444!44 444 4"44!444!4#44"444"4$4444#4$4%4444$4%44444%443(4)4)43333)43)4*433*43*4+4(433(43+433,43,4-433-43-4.433.43.4/4,4333/4,4304141433331431424332432434043304334344545433335435464743374364443337444(4849494)4(4)494:4:4*4)4+4*4:4+4:4;4;484(4;4(4+4-4,4<4-4<4=4>4.4-4>4-4=4/4.4?4.4>4?4<4,4?4,4/4?404@4A4A41404B42414B414A43424B434B4C4C4@404C404345444D4D4E454F46454F454E4G47464G464F4D444G44474G44H4I44I4J44J4K44K4L44L4M44M4N44N4O44O4P44P4Q44Q4R44R4S44S4T44T4U44U4V44V4W4W4H44444444444444444444444444444444444444444444444444Y4I4H4Y4H4X4Z4J4I4Z4I4Y4[4K4J4[4J4Z4L4K4[4[4\4L4M4L4\4\4]4M4^4N4M4^4M4]4O4N4^4^4_4O4P4O4_4_4`4P4Q4P4`4`4a4Q4R4Q4a4a4b4R4S4R4b4b4c4S4444444444444f4V4U4U4e4f4g4W4V4V4f4g4X4H4W4X4W4g4i4Y4X4i4X4h4j4Z4Y4j4Y4i4k4[4Z4k4Z4j4\4[4k4k4l4\4]4\4l4l4m4]4^4]4m4m4n4^4o4_4^4^4n4o4`4_4o4o4p4`4a4`4p4p4q4a4r4b4a4a4q4r4s4c4r4c4b4r4444444444444v4f4e4e4u4v4w4g4f4f4v4w4h4X4g4g4w4h4i4h4x4x4y4i4j4i4y4y4z4j4k4j4z4z4{4k4l4k4{4{4|4l4m4l4|4|4}4m4n4m4}4}4~4n44o4n4n4~444p4o4o4444q4p4p4444r4q4q4444s44s4r444t44t4s44=u44u4t44v4u4>u4=>4w4v4v4>4x4h4w4w44x4y4x4444y4z4y4444z44{4z44z444|4{44{444}4|44|44~4}4444~44~44444444444444444444444444444444444M=444M4>NN44x44444x44444444444444444444444444444444444444444444444444444444444444444444444444M4444NM444N4N4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444c4d4444c4S4c44S444T4S44S4444d4T44T44d4e44d444T4d44T444U4T44U4444e4U44U44s4t4444s4c4s44c444d4c44c4444t4d44d44u4444t4u4d4t44d4444e4d44d444u4e44e44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444B544B544B544B544B544B544B544B544B544B544B544B544B544B544B54444B53525C54535C55545C56555C57565C58575C59585C5:595C5;5:5C5<5;5C5=5<5C5>5=5C5?5>5C5@5?5C5@5C5A5C525A5444444444444444444444444444444444444444444444444444444444444444444W5V5U5U5T5W5[5Z5Y5[5Y5X5444444444444444444444444444444444444444444444444444444444444444444444444444454445554_5^5]5]5\5_5c5b5a5c5a5`55445455454454444545444555444554455 5444 5 5 5444 5 5 5444 5 5 5444 5 5 545444 55544455554455555555555555555555>55555>?555>5455?5555555555555 55555 5 5 5555 55 5 55 555 5 55 555 5 55 555 55555555555555555555555 55555 5!5555 5!5N>55!5N5?OO5555"5"5#55$5555#5$5%5555$5%5&5555%5&5'555'55&5(555(55'5)555)55(555)5)5*5555*5*5+5555+5+5,55-5555,5-5.5 5-5 55-5/5!5.5!5 5.505N!5!5/505ON050515O5O1515"5535#525#5"52545$5#5#5354555%5$5$5455565&5%5%5556575'5&5&5657585(5'585'57595)5(595(585*5)59595:5*5+5*5:5:5;5+5<5,5;5,5+5;5=5-5<5-5,5<5>5.5=5.5-5=5?5/5>5/5.5>5@505?505/5?5A5150505@5A525"5A5"515A54D5E5E54444E54E5F544F54F5G5D544D54G544H5H5I5444I54I5J544K54J5K5H544H54K55L5M5M55545M54M5N544N54N5O5L554L54O555P5P5Q5545Q54Q5R544S54R5S5P554P54S5E5D5U5D5T5U5F5E5V5E5U5V5G5F5V5V5W5G5D5G5W5W5T5D5I5H5X5I5X5Y5J5I5Z5I5Y5Z5[5K5J5[5J5Z5H5K5[5[5X5H5M5L5]5L5\5]5N5M5^5M5]5^5O5N5^5^5_5O5L5O5_5_5\5L5Q5P5`5Q5`5a5R5Q5b5Q5a5b5c5S5R5c5R5b5P5S5c5c5`5P55d5e55e5f55f5g55g5h55h5i55i5j55j5k55k5l55l5m55m5n55n5o55o5p55p5q55q5r55r5s5s5d55555555555555555555555555555555555555555555555555u5e5d5d5t5u5v5f5e5e5u5v5w5g5f5f5v5w5x5h5g5g5w5x5y5i5h5y5h5x5z5j5i5z5i5y5{5k5j5{5j5z5l5k5{5{5|5l5m5l5|5|5}5m5n5m5}5}5~5n5o5n5~5~55o55555555555555r5q55q555s5r5r555t5d55d5s555u55u5t555v5u5u5555w5v5v5555x5w5w555y5x5555y5z5y5555z55{5z55z55|5{5555|55}5|5|5555~5}5}5555~555555555555555555555555555555t55t555550055555555555555555555555555555555555555555555555555555555555555555555555555555555?5555??0555?50@@55555555555555555555555555555555555555555555555555555555555555555555555555555555O?555O5@55555555555555555555555555555555555555555555555555555555555555555555555555555555555O5O555@5@O5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555o555o555p5o55p55555p55p55555555p555p555q5p55q55555q55q55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555^655^655^655^655^655^655^655^655^655^655^655^655^655^656^66665^6O6N6_6P6O6_6Q6P6_6R6Q6_6S6R6_6T6S6_6U6T6_6V6U6_6W6V6_6X6W6_6Y6X6_6Z6Y6_6[6Z6_6\6[6_6\6_6]6_6N6]66555666555666565565566655566655566655566 6555 6 6 65 6555 6 655 6 6 65 6555 6 6s6r6p6r6q6p6w6v6u6w6u6t6665566666666656666666666666666666666666666666666666666 66666 66 6 66 66 6 6666 6 6 6666 66 6 6 666{6z6x6z6y6x66~6}66}6|6 66666 666 6 6!6666!6!666#6666"6#666#6#6$66%6666$6%6&6666%6&6'6666&6'6(6666'6(6)6666(6)6*6666)6*666*6*6+6666+6+6,66-6666,6-6.6666-6.6/6666.6/6 66/6/606 6!6 6060616!66!61616"66#6"6A"6@A26$6#6#6A26%6$6262636%6&6%6363646&6'6&6464656'666(6'6'6566676)6(6(6667686*6)6)67686+6*6868696+6:6,6+6+696:6-6,6:6:6;6-6.6-6;6;6<6.6/6.6<6<6=6/606/6=6=6>6061606>6>6?616?6@"6?6"616@626AAQ@63626@6@6A6364636A6A6B6465646B6B6C6566656C6C6D666E6766666D6E6F6867676E6F69686F6F6G696H6:69696G6H6;6:6H6H6I6;6<6;6I6I6J6<6K6=6<6<6J6K6L6>6=6=6K6L6M6?6>6>6L6M6M6P@@?6M6QPN6N6O6QP6@6QQO6P6A6@6P6P6Q6A6B6A6Q6Q6R6B6C6B6R6R6S6C6D6C6S6S6T6D6E6D6T6T6U6E6F6E6U6U6V6F6G6F6V6V6W6G6X6H6G6X6G6W6Y6I6H6Y6H6X6Z6J6Y6J6I6Y6[6K6J6J6Z6[6\6L6K6K6[6\6]6M6L6L6\6]6N6PM6M6]6N6 66`6 6`6a65 6a65a6b65b6c6c655`665`65c666d66d6e656e65e6f655f65f6g6d665d65g666h66h6i6 66i6 6i6j6 6j6k6k66 6h666h66k66l6m6m66666m66m6n6o666o66n6l666l66o6a6`6q6`6p6q6b6a6r6a6q6r6c6b6r6r6s6c6`6c6s6s6p6`6e6d6t6e6t6u6f6e6v6e6u6v6w6g6f6w6f6v6d6g6w6w6t6d6i6h6y6h6x6y6j6i6z6i6y6z6k6j6z6z6{6k6h6k6{6{6x6h6m6l6|6m6|6}6n6m6~6m6}6~66o6n66n6~6l6o666|6l6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666776766777777666666666666666666666666666666666666666666666666666666666666666666666666666666666666 77777 7 7 7 7 7 7 76666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666A666B6AB6666B6666666666666666666666666666666666666666666666666666666666666666666666666666666QA666Q66BBR66666666666666666666666666666666666666666666666666666666666666666666666666666666Q6666RQ666R6R666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666766766767766766766767767776676676766777676676776676766767 7 776 76666 76 7 7 766 76 7 766 76 7 7 76 766z777z777z777z777z777z777z777z777z777z777z777z777z777z777z77777z7k7j7{7l7k7{7m7l7{7n7m7{7o7n7{7p7o7{7q7p7{7r7q7{7s7r7{7t7s7{7u7t7{7v7u7{7w7v7{7x7w7{7x7{7y7{7j7y7777777 77777 777 7 7!7777!7!7"7777"7"7#7777#7#7$77%7777$7%7&7777%7&777&7&7'7777'7'7(7777(7(7)77777777777777,7777+7,777,7,7-7777-7-777/7777.7/707 777/707!7 7070717!7"7!7171727"7#7"7272737#7$7#7373747$7%7$7474757%7&7%7575767&777'7&7&7677787(7'7'7778797)7(7(78797777777777777<7,7+7+7;7<7-7,7<7<7=7-77-7=7=7.77?7/7.7.7>7?707/7?7?7@7071707@7@7A717B7271717A7B7C7372727B7C74737C7C7D7475747D7D7E7576757E7E7F767G7776767F7G7H7877777G7H7I7978787H7I7:797I7I7J7:7;7:7J7J7K7;7<7;7K7K7L7<7M7=7<7<7L7M7>7.7=7=7M7>7?7>7N7N7O7?7@7?7O7O7B@7A7@7BBCA7P7B7A7A7CP7Q7C7B7B7P7Q7R7D7C7C7Q7R7E7D7R7R7S7E7F7E7S7S7T7F7G7F7T7T7U7G7V7H7G7G7U7V7W7I7H7H7V7W7J7I7W7W7X7J7K7J7X7X7Y7K7Z7L7K7K7Y7Z7[7M7L7L7Z7[7N7>7M7M7[7N7O7N7\7\7]7O7BO7]7]7RBP7CSS^7P7_7Q7P7P7^7_7R7Q7_7_7`7R7a7S7R7R7`7a7b7T7S7S7a7b7U7T7b7b7c7U7V7U7c7c7d7V7e7W7V7V7d7e7f7X7W7W7e7f7g7Y7X7X7f7g7h7Z7Y7Y7g7h7i7[7Z7Z7h7i7\7N7[7[7i7\7k7]7\7\7j7k7l7R]7]7k7l7SRl7l7m7S^7Sm7m7n7^7_7^7n7n7o7_7`7_7o7o7p7`7q7a7`7`7p7q7r7b7a7a7q7r7c7b7r7r7s7c7d7c7s7s7t7d7u7e7d7d7t7u7v7f7e7e7u7v7w7g7f7f7v7w7x7h7g7g7w7x7i7h7x7x7y7i7\7i7y7y7j7\7)7*7|7)7|7}77)7}77}7~77~77777|7*77|777*7+77*7777*777777777777+7777797:779777)7977)777)7777*7)77:7*77*77:7;77:777*7:77*777*7777+7*77;7+77+777}7|77|77}7777~7}77~77777|77777|777777777777777777777777777777777777777777777777777777777777777777777777787787787787787787787787787787787787787787787777877 877 877 877 877 877 877 887 888 888 888 888 888 888 88 88 878777777777777777777777777777777777777777777777777777777777777777777888888!8 88!888777777777777777777777777777777777777777777777777777777777777777777777777777777777777%8$8"8$8#8"8)8(8'8)8'8&87777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777C777CCD77777D7777777777777777777777777777777777777777777777777777777777777777777777777777777C777SC77D7DT777777777777777777777777777777777777777777777777777777777777777777777777777777S7777STS777T7T77777777777777777777878778788787788787788777888777888777888777887777877 8 8 87777 87 8 877 87 8 8 877 87 87787887787887888778778787888777787887787888778787787887787887888778778788 8 88 88 8 88 888 8 8888 8 8 8888 888888888 888 888!88 8!888!8!888#888#88"888$88#8$888$8$8%8888%8%8"8888&8&8'8888(88'8(888)88(8)8)8&88)8888*8+88+8,88,8-88-8.88.8/88/80880818818288283883848848588586886878878888889898*88888888888888888888888888888888888888888888888888;8+8*8*8:8;8<8,8+8<8+8;8=8-8,8=8,8<8>8.8-8>8-8=8?8/8.8?8.8>808/8?8?8@8081808@8@8A8182818A8A8B8283828B8B8C8384838C8C8D8485848D8D8E858888888888888H88878H878G8I8988888H8I8:8*89898I8:8K8;8:8:8J8K8L8<8;8;8K8L8=8<8L8L8M8=8>8=8M8M8N8>8O8?8>8O8>8N8@8?8O8O8P8@8Q8A8@8@8P8Q8R8B8A8A8Q8R8C8B8R8R8S8C8D8C8S8S8T8D8E8D8T8T8U8E8888888888888X8H8G8X8G8W8Y8I8H8H8X8Y8J8:8I8I8Y8J8[8K8J8J8Z8[8L8K8[8[8\8L8M8L8\8\8]8M8N8M8]8]8^8N8_8O8N8_8N8^8P8O8_8_8`8P8a8Q8P8P8`8a8b8R8Q8Q8a8b8c8S8R8R8b8c8d8T8S8S8c8d8e8U8T8T8d8e8f8V8U8U8e8f8g8W8f8W8V8f8h8X8g8X8W8g8i8Y8X8X8h8i8Z8J8Y8Y8i8Z8[8Z8j8j8k8[8\8[8k8k8l8\8]8\8l8l8m8]8^8]8m8m8D^8^8DEE_8^8n8`8_8n8_8Ea8`8n8n8o8a8b8a8o8o8p8b8c8b8p8p8q8c8r8d8c8c8q8r8s8e8d8d8r8s8t8f8e8e8s8t8u8g8t8g8f8t8v8h8g8g8u8v8i8h8v8v8w8i8Z8i8w8w8j8Z8y8k8j8j8x8y8z8l8k8k8y8z8{8m8l8l8z8{8TDm8Tm8{8|8n8E|8EUo8n8|8|8}8o8p8o8}8}8~8p8q8p8~8~88q8r8q8888r88s8r8r8888t8s8s8888u88u8t888v8u8u888w8v8888w8j8w888x8j88y8x8x8888z8y8y8888{8z8z8888T{8{888UT888U8|8U8U8}8|8888}8~8}8888~88~888888888888888888888888888888888888888888x88x888F8888E8F858E8858886858868888F8688688F8G8888F868F8868887868868888G8788788V8888U8V8E8U88E888F8E88F8888V8F88F88V8W8888V8F8V88F888G8F88F8888W8G88G88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888$988$988$988$988$988$988$988$988$988$988$988$988$988$988$98888$999%999%999%999%999%999%999%999%999%999%999%9 99%9!9 9%9"9!9%9"9%9#9%99#9888888888888888888888888888888888888888888888888888888888888888888998979796999=9<9;9;9:9=9888888888888888888888888888888888888888888888888888888888888888888888888888888888888A9@9>9@9?9>9E9D9C9C9B9E98888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888E88EFF8888888F888888888888888898889998988899988899989889989889888898889998889998 98889 988 9 9 98UE88 9U 98F 9FV 988 98 988 9 9 9898 9 9999999999999999999999999999999999899999999999999999 999999 9 9 9999U 9 999VU999V 9V999 9 9 9999 99 9 99 9999 99 99999999 999999!99 999 9"99!999!9#9999"9#99999#998&9'9'98888'98'9(988(98(9)9&988&98)988*98*9+988+98+9,988,98,9-9*988*98-98.9/9/98888/98/909880980919.988.9819829393988883983949598859849298829859'9&979&96979(9'989'97989)9(9898999)9&9)9999969&9+9*9:9+9:9;9,9+9<9+9;9<9=9-9,9=9,9<9*9-9=9=9:9*9/9.9?9.9>9?909/9@9/9?9@91909@9@9A919.919A9A9>9.93929B939B9C94939D939C9D9E95949E949D9E9B929E929599F9G99G9H99H9I99I9J99J9K99K9L99L9M99M9N99N9O99O9P99P9Q99Q9R99R9S99S9T99T9U9U9F99999999999999999999999999999999999999999999999999W9G9F9F9V9W9X9H9G9G9W9X9Y9I9X9I9H9X9Z9J9Y9J9I9Y9[9K9J9[9J9Z9\9L9K9\9K9[9M9L9\9\9]9M9N9M9]9]9^9N9O9N9^9^9_9O9P9O9_9_9`9P9a9Q9P9P9`9a9999999999999d9T9S9d9S9c9U9T9d9d9e9U9V9F9U9U9e9V9g9W9f9W9V9f9h9X9W9W9g9h9i9Y9h9Y9X9h9j9Z9i9Z9Y9i9k9[9Z9k9Z9j9l9\9[9l9[9k9]9\9l9l9m9]9^9]9m9m9n9^9_9^9n9n9o9_9`9_9o9o9p9`9a9`9p9p9q9a9999999999999t9d9c9c9s9t9u9e9d9d9t9u9f9V9e9e9u9f9w9g9v9g9f9v9x9h9w9h9g9w9y9i9h9h9x9y9z9j9i9i9y9z9{9k9j9{9j9z9l9k9{9{9|9l9m9l9|9|9}9m9~9n9m9~9m9}99o9n99n9~9p9o9999p9q9p9999q9r9q9999r99s9r9r9999t9s9s9999u9t9t999v9f99f9u999w99w9v999x9w9w9999y9x9x9999z9y9y999{9z9999{9|9{999F|9}9|9FFG}99~9}99}9G99~99~999999999999999999999999999999999999999v99v999999999999999999999999999999999F999VF9GWW999999999999999999999999999999999999999999999999999999999999999999999999999999999V9999WV999W9W9999999999999999999999999999999999999999999999999999a9b99a999Q9a99Q999Q9999R9Q99b9R99R99b9c99b999R9b99R999S9R99S9999c9S99S99q9r99q999a9q9999a9a9999b9a99r9b9b999s9999r9s9b9r9999b99c9b99b999s9c9c999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999@:99@:99@:99@:99@:99@:99@:99@:99@:99@:99@:99@:99@:99@:99@:9999@:1:0:A:2:1:A:3:2:A:4:3:A:5:4:A:6:5:A:7:6:A:8:7:A:9:8:A:::9:A:;:::A:<:;:A:=:<:A:>:=:A:>:A:?:A:0:?:999999999999999999999999999999999999999999999999999999999999999999U:T:S:S:R:U:Y:X:W:W:V:Y:999999999999999999999999999999999999999999999999999999999999999999999999999999999999]:\:[:[:Z:]:a:`:_:_:^:a::99:9::999::9999:9:9:99::9:99::9:99::9:99: :9:99: :9 :99 : :99 :9 :99 : : :9 :99 :9 ::99:9 ::99:9::9:::::::::::::::::::::::9::::::::::::::::::::::::::::: :::::: : : ::: : :::G : : :GGH :: : :: :H:: :: :::::::::::::::::::: ::: :::!:: ::: :::::!::#::":::":$::#:::#:%::::$:%:&::::%:&:'::::&:':(::::':(:G:(:(:WG)::H):HX::):):*::::*:*:+::::+:+:,::-:::-::,:.: ::.::-:/:!:.:!: :.:"::!:!:/:":1:#:":":0:1:2:$:#:#:1:2:3:%:$:$:2:3:4:&:%:%:3:4:5:':&:&:4:5:6:(:':':5:6:W(:6:6:7:WXW7:7:8:X):X8:8:9:):*:):9:9:::*:+:*:::::;:+:,:+:;:;:<:,:=:-:,:=:,:<:>:.:=:.:-:=:?:/:>:/:.:>:0:":/:/:?:0:99B:9B:C:99C:9C:D:9D:E:E:99B:99B:9E:99F:9F:G:99G:9G:H:99H:H:I:9F:999I:F:9:J:9J:K:99K:9K:L:9L:M:M:99J::9J:9M:::O::N:O:9:O:9O:P:Q:99Q:9P:N::99Q:N:S:C:B:S:B:R:D:C:T:C:S:T:E:D:T:E:T:U:B:E:U:U:R:B:G:F:V:V:W:G:H:G:X:G:W:X:I:H:Y:H:X:Y:F:I:Y:Y:V:F:[:K:J:[:J:Z:K:[:\:\:L:K:M:L:\:M:\:]:J:M:]:]:Z:J:O:N:^:^:_:O:P:O:`:O:_:`:Q:P:a:P:`:a:N:Q:a:a:^:N::b:c::c:d::d:e::e:f::f:g::g:h::h:i::i:j::j:k::k:l::l:m::m:n::n:o::o:p::p:q:q:b::::::::::::::::::::::::::::::::::::::::::::::::::c:b:r:r:s:c:t:d:s:d:c:s:u:e:d:d:t:u:v:f:e:e:u:v:w:g:f:f:v:w:x:h:g:x:g:w:y:i:h:y:h:x:z:j:i:z:i:y:{:k:j:{:j:z:l:k:{:{:|:l:m:l:|:|:}:m::::::::::::::p:o::o::q:p::::q:b:q:::r:b::s::s:r:::t::t:s:::u:t:t::::v:u:u::::w:v:v::::x:w:w::::y::y:x:::z::z:y:::{:z::z:::|::|:{:::}:|::|:::::::::::::::::::::::::::r:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::H::::::HII:::::::I::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::XH:X::::I:IY:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::X::::YX:::Y::Y:Y:::::::::::::::::::::::::::::::::::::}:~::~:::m:}::::m:n:m::::n::~:n::n::~:::~:::n:~::n:::n::::o:n:::o::o::::::::}:::::}:~:}::::~:::~::~::::::::~:::~:::~:::::~:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::\;::::\;M;L;];N;M;];O;N;];P;O;];Q;P;];R;Q;];S;R;];T;S;];U;T;];V;U;];W;V;];X;W;];Y;X;];Z;Y;];Z;];[;];L;[;::;;;:::;;;:;:::;;;:::;;;:;::;;:;::;;::;:;;::;:; ;:: ;:; ;:: ;: ; ;: ;:: ;q;p;o;q;o;n;u;t;s;u;s;r;;::;: ;::;;;:::;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; ; ;; ;;; ;; ; ;;y;x;w;y;w;v;};|;{;};{;z;;; ;; ;;;;;;;;;;;;;;!;;;!;; ;";;!;;;!;#;;";;;";$;;#;;;#;%;;;;$;%;&;;;;%;&;';;;;&;';(;;';;;';);;(;;;(;*;;;*;;);+;;;+;;*;,;;+;;;+;;;,;,;-;;;;-;-;.;;/;;;/;;.; ;;; ;;/;1;!; ;1; ;0;2;";1;";!;1;3;#;2;#;";2;4;$;#;4;#;3;5;%;$;$;4;5;6;&;%;%;5;6;7;';6;';&;6;8;(;7;(;';7;I);8;);(;8;);IJJ*;);9;+;*;9;*;J:;,;+;:;+;9;-;,;:;:;;;-;.;-;;;;;<;.;/;.;<;<;=;/;0; ;/;0;/;=;?;1;>;1;0;>;@;2;?;2;1;?;A;3;2;A;2;@;B;4;3;B;3;A;C;5;B;5;4;B;D;6;C;6;5;C;E;7;6;6;D;E;F;8;E;8;7;E;YI8;8;F;YG;9;JG;JZH;:;9;H;9;G;;;:;H;H;I;;;<;;;I;I;J;<;K;=;J;=;<;J;>;0;K;0;=;K;M;?;L;?;>;L;N;@;M;@;?;M;O;A;@;O;@;N;P;B;A;P;A;O;Q;C;P;C;B;P;R;D;Q;D;C;Q;S;E;D;D;R;S;T;F;E;E;S;T;U;YF;F;T;U;V;ZYYU;V;G;ZV;V;W;G;H;G;W;W;X;H;Y;I;H;Y;H;X;Z;J;I;Z;I;Y;[;K;Z;K;J;Z;L;>;[;>;K;[; ; ;_; ;^;_;: ;_;_;`;:::`;`;a;:^; ;::a;^; ; ;b; ;b;c;: ;c;c;d;::d;e;e;::b; ;::e;b;;;g;;f;g; ;;g;g;h; ; ; ;h;h;i; ;f;; ; ;i;f;;;j;;j;k; ;;k;k;l; ; ;l;m;m; ; ;j;; ; ;m;j;^;n;o;o;_;^;p;`;_;p;_;o;a;`;p;a;p;q;n;^;q;^;a;q;c;b;r;c;r;s;c;s;t;t;d;c;d;t;u;u;e;d;u;r;b;u;b;e;f;v;w;w;g;f;g;w;x;x;h;g;i;h;x;i;x;y;v;f;y;f;i;y;k;j;z;k;z;{;k;{;|;|;l;k;l;|;};};m;l;z;j;};j;m;};;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<;;;;;;;;;;;;;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<< < < < < <<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;J;;;;;;;J;JK;;;;;K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZJ;J;;;K[[;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Z;;;;[Z;;;[;[;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<;<<;<<<;;<;;<;<<;<;;<;<<<;;;<<<;;;;<;<<<;<;;<;;<;< <; < < <;; <;; <; < <<; <;;x< < <x< <<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<x<<<< <.<?<@<0<=<N<==.=?=/=.=.=>=?=@=0=/=/=?=@=1=0=@=@=A=1=2=1=A=A=B=2=C=3=2=2=B=C=============F=6=5=5=E=F=G=7=F=7=6=F=8=(=G=(=7=G=I=9=8=I=8=H=J=:=9=J=9=I=;=:=J=J=K=;=L=<=;=L=;=K===<=L=L=M===>===M=M=N=>=?=>=N=N=O=?=@=?=O=O=P=@=Q=A=@=@=P=Q=R=B=A=A=Q=R=S=C=B=B=R=S=============V=F=E=E=U=V=W=G=V=G=F=V=H=8=W=8=G=W=I=H=X=X=Y=I=J=I=Y=Y=Z=J=[=K=J=[=J=Z=\=L=K=\=K=[=]=M=L=]=L=\=N=M=]=]=^=N=O=N=^=^=_=O=P=O=_=_=`=P=a=Q=P=P=`=a=b=R=Q=Q=a=b=c=S=R=R=b=c=d=T=c=T=S=c=e=U=d=U=T=d=f=V=U=U=e=f=g=W=V=V=f=g=X=H=g=H=W=g=Y=X=h=h=i=Y=Z=Y=i=i=j=Z=[=Z=j=j=k=[=l=\=[=l=[=k=m=]=\=m=\=l=^=]=m=m=n=^=_=^=n=n=o=_=p=`=_=p=_=o=q=a=`=`=p=q=r=b=a=a=q=r=s=c=r=c=b=r=t=d=s=d=c=s=Me=t=e=d=t=f=e=Ne=MNu=g=f=f=Nu=h=X=g=g=u=h=i=h=v=v=w=i=j=i=w=w=x=j=k=j=x=x=y=k=l=k=y=y=z=l=m=l=z=z={=m=n=m={={=|=n=}=o=n=}=n=|=~=p=o=~=o=}==q=~=q=p=~==r==r=q===s=r=r====t==t=s==]Mt=t==]=u=NN^=v=h=u=u==v==w=v=v====x=w=w===y=x====y=z=y====z={=z===={=|={====|==}=|==|===~=}==}======~=====================]====^]===^=^====v=====v=C=D====C=3=C==3===4=3==3====D=4==4==D=E====D=4=D==4===5=4==4====E=5==5==S=T====S=C=S==C===D=C==C====T=D==D==T=U====T=D=T==D===E=D==D====U=E==E==================================================================================================">==">==">==">==">==">==">==">==">==">==">==">==">==">==">====">>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#>>>#> >>#> >#>!>#>>!>==================================================================7>6>5>5>4>7>;>:>9>;>9>8>====================================================================================?>>>=>=><>?>C>B>A>C>A>@>========================================================================================================================================================================>====>>===>>>===>>>=>==>N=>==>NO===N====O=>===>>==>>>=>===>>>===>>==>> >=== > > >= >== >= > >== >= > >== >= >>>=>= >>>>>>>>>>>>>>>>>>>^N>N>>=O__>=>>>>>>>>>>>>>>>>>>>>>>>> >>>>> > > >>>> >> > >> >>> > >> >>> > >> >>>> >> >>>>>>>>>>>>>>>>>>>> >^>>> >_^ > >!>_>_!>!>>>=$>%>%>====%>=%>&>==&>=&>'>$>==$>='>==(>(>)>===)>=)>*>==+>=*>+>(>==(>=+>=,>->->====->=->.>==.>=.>/>,>==,>=/>==0>0>1>===1>=1>2>==3>=2>3>0>==0>=3>$>4>5>5>%>$>6>&>%>6>%>5>'>&>6>'>6>7>$>'>7>7>4>$>)>(>8>8>9>)>*>)>:>)>9>:>+>*>;>*>:>;>;>8>(>;>(>+>,><>=>=>->,>.>->>>->=>>>/>.>>>/>>>?>,>/>?>?><>,>1>0>@>@>A>1>2>1>B>1>A>B>3>2>C>2>B>C>0>3>C>C>@>0>>D>E>>E>F>>F>G>>G>H>>H>I>>I>J>>J>K>>K>L>>L>M>>M>N>>N>O>>O>P>>P>Q>>Q>R>>R>S>S>D>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>U>E>T>E>D>T>V>F>U>F>E>U>W>G>V>G>F>V>H>G>W>W>X>H>I>H>X>X>Y>I>J>I>Y>Y>Z>J>[>K>J>[>J>Z>\>L>K>K>[>\>]>M>L>L>\>]>^>N>M>M>]>^>_>O>N>N>^>_>>>>>>>>>>>>>b>R>Q>b>Q>a>c>S>R>R>b>c>T>D>c>D>S>c>e>U>T>T>d>e>f>V>U>U>e>f>W>V>f>f>g>W>X>W>g>g>h>X>Y>X>h>h>i>Y>Z>Y>i>i>j>Z>k>[>Z>k>Z>j>l>\>[>l>[>k>]>\>l>l>m>]>n>^>]>]>m>n>o>_>^>^>n>o>>>>>>>>>>>>>r>b>a>r>a>q>s>c>b>b>r>s>d>T>s>T>c>s>u>e>d>d>t>u>v>f>e>e>u>v>w>g>f>f>v>w>h>g>w>w>x>h>i>h>x>x>y>i>j>i>y>y>z>j>{>k>j>{>j>z>|>l>k>|>k>{>m>l>|>|>}>m>n>m>}>}>~>n>o>n>~>~>>o>p>o>>>>p>q>p>>>>q>r>q>>>>r>>s>r>r>>>t>d>>d>s>>>u>t>t>@>>v>u>u>>>>w>v>v>>>>x>w>w>>>>y>x>x>>>>z>y>y>>>{>z>>>>{>>|>{>>{>>}>|>>>>}>~>}>>>>~>>~>>>>>>>>>>>>>>>>>>>>>>>O>>>>>O@t>t>>O>>@@P>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_O>O>>>P>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_>_>>>P__>>`>>>>_>`>O>_>>O>>>P>O>>P>>>>`>P>>P>>`>a>>`>>>P>`>>P>>>P>>>>Q>P>>a>Q>>Q>>p>>>>o>p>_>o>>_>>>`>_>>`>>>>p>`>>`>>p>q>>p>>>`>p>>`>>>`>>>>a>`>>q>a>>a>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>?>>>>>?a`??0?a??1?0???2?1???3?2???4?3???5?4???6?5???7?6???8?7???9?8???:?9???;?:???>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>S?R?Q?Q?P?S?W?V?U?W?U?T?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[?Z?Y?[?Y?X?_?^?]?_?]?\??>>?>>?>?>>?>>>>?>?>>>??>>???>>>???>>>???>>>???>>>???>>>?? ?> ?>>> ? ?>> ? ? ?> ?>>> ? ? ?>>> ? ??>>> ???>?>>?????>????????>???????????????????????????????????????? ????? ? ? ???? ? ? ???? ?? ? ? ???? ? ? ????? ? ????????? ????? ?!???? ?!???!?!?????Q?PQ"????Q"???"?"?#??$???$??#?%???%??$?&???&??%?'???'??&???'?'?(????(?(?)??*???*??)?+??*???*?,??+???+?-??,???,?.? ???-?.?/?!? ? ?.?/?/?P?/??!?0?"?QQa0?1?#?"?"?0?1?2?$?#?#?1?2?3?%?$?3?$?2?4?&?%?4?%?3?5?'?&?5?&?4?(?'?5?5?6?(?7?)?(?7?(?6?8?*?7?*?)?7?9?+?8?+?*?8?:?,?9?,?+?9?;?-?:?-?,?:?@?A?A?>>>>A?>A?B?>>B?>B?C?@?>>@?>C?>>D?D?E?>>>E?>E?F?>>G?>F?G?D?>>D?>G?>H?I?I?>>>>I?>I?J?>>J?>J?K?H?>>H?>K?>>L?L?M?>>>M?>M?N?>>O?>N?O?L?>>L?>O?A?@?Q?@?P?Q?B?A?R?A?Q?R?C?B?R?R?S?C?@?C?S?S?P?@?E?D?T?T?U?E?F?E?V?E?U?V?G?F?W?F?V?W?D?G?W?W?T?D?I?H?Y?H?X?Y?J?I?Z?I?Y?Z?K?J?Z?Z?[?K?H?K?[?[?X?H?M?L?\?\?]?M?N?M?^?M?]?^?O?N?_?N?^?_?L?O?_?_?\?L??`?a??a?b??b?c??c?d??d?e??e?f??f?g??g?h??h?i??i?j??j?k??k?l??l?m??m?n??n?o?o?`???a?ba??b????????????????????????????????????????q?a?p?a?`?p?r?b?a?r?a?q?s?c?b?s?b?r?t?d?c?t?c?s?u?e?d?u?d?t?v?f?e?v?e?u?g?f?v?v?w?g?x?h?g?g?w?x?y?i?h?h?x?y?j?i?y?y?z?j?k?j?z?z?{?k?????????????~?n?m?m?}?~??o?n?n?~??p?`??`?o???q?p?p????r?q?q???s?r????s?t?s????t?u?t????u?v?u????v?w?v????w??x?w?w????y?x?x???z?y????z?{?z????{??????????????~?}??}??????~???p?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Q???R?QR????R???????????????????????????????????????????????????????????????????????????????Q???aQ??RRb???????????????????????????????????????????????????????????????????????????????|????{?|?k?{??k???l?k??l????|?l??l??|?}????|?l?|??l???m?l??l????}?m??m????????{???{???|?{??|?????|??|????????|???|???}?|??|?????}??}??????????????????????????????????????????????????????????????????????????????????????????????????Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@??Z@????Z@M@L@[@M@[@bcb[@N@c[@O@N@[@P@O@[@Q@P@[@R@Q@[@S@R@[@T@S@[@U@T@[@V@U@[@W@V@[@X@W@[@X@[@Y@[@L@Y@??????@?????@?@??@@??@?@@??@?@??@@@???@@@?@???@@@???@@@???@@ @???@ @o@n@m@m@l@o@s@r@q@q@p@s@ @??? @ @ @? @?? @?? @?? @@???@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@w@v@u@u@t@w@{@z@y@y@x@{@@ @ @ @@@@ @ @ @@@@? @ @@@@@@@@@ @@@@@ @@@ @ @!@@@@!@!@"@@@@"@"@#@@$@@@$@@#@%@@@%@@$@&@@@&@@%@@@&@&@'@@@@'@'@(@@)@@@@(@)@*@@@@)@*@@@*@*@+@@,@@+@@@+@-@@,@@@,@@@@@-@@/@@@@.@/@0@ @@@/@0@!@ @0@0@1@!@"@!@1@1@2@"@3@#@"@"@2@3@4@$@#@4@#@3@5@%@$@5@$@4@&@%@5@5@6@&@'@&@6@6@7@'@(@'@7@7@8@(@9@)@(@(@8@9@:@*@)@)@9@:@;@+@*@*@:@;@<@,@;@,@+@;@=@-@<@-@,@<@.@@=@@-@=@/@.@>@>@?@/@0@/@?@?@R0@1@0@RRS1@@@2@1@1@S@@A@3@2@2@@@A@4@3@A@A@B@4@5@4@B@B@C@5@6@5@C@C@D@6@7@6@D@D@E@7@8@7@E@E@F@8@G@9@8@8@F@G@H@:@9@9@G@H@I@;@:@:@H@I@J@<@I@<@;@I@K@=@J@=@<@J@.@=@K@K@>@.@?@>@L@L@M@?@R?@M@M@bRN@@@SScN@O@A@@@@@N@O@B@A@O@O@P@B@Q@C@B@Q@B@P@R@D@C@R@C@Q@S@E@D@S@D@R@T@F@E@T@E@S@U@G@T@G@F@T@V@H@U@H@G@U@W@I@V@I@H@V@X@J@I@I@W@X@Y@K@J@J@X@Y@>@K@Y@Y@L@>@ @\@]@]@ @ @? @]@?]@^@??^@?^@_@\@ @?\@?_@ @ @`@ @`@a@? @a@?a@b@??b@?b@c@`@ @?`@?c@@d@e@e@@@ @@e@ @e@f@ @ @f@ @f@g@d@@ @d@ @g@@h@i@i@@@ @@i@ @i@j@k@ @ @k@ @j@h@@ @h@ @k@\@l@m@m@]@\@n@^@]@n@]@m@_@^@n@_@n@o@\@_@o@o@l@\@a@`@p@a@p@q@b@a@r@a@q@r@s@c@b@s@b@r@`@c@s@s@p@`@d@t@u@u@e@d@f@e@v@e@u@v@g@f@v@g@v@w@d@g@w@w@t@d@i@h@x@i@x@y@j@i@z@i@y@z@{@k@j@{@j@z@h@k@{@{@x@h@@|@}@@}@~@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@@@@@@@@@@cdc@@d@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@@}@|@@@~@@~@}@@@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AA@A@@@@@@@@@@@@@@@|@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAA AAAAA A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@S@@@SST@@@@@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@S@@@cS@@T@Td@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@AA@@A@A@@AA@@@AAA@@@@A@AA@@A@AA@@AAA@@@A@AA@@A@AA A@@ A@A@@ A AA@vA A AvA A AvA A AvA AAvAAAvAAAvAAAvAAAvAAAvAAAvAAAvAAAvAAAvAAAvAAAA AvAiAhAwAjAiAwAkAjAwAkAwAdedwAlAewAmAlAwAnAmAwAoAnAwApAoAwAqApAwArAqAwAsArAwAtAsAwAtAwAuAwAhAuAA AA A AAA AA A AAA AA A AAAA AA AAAAAAAA AAA AAA!AAA!AA A"AAA"AA!A#AAA#AA"AAA#A#A$AA%AAAA$A%AAAAAAAAAAAAA(AAA(AA'A)AA(AAA(AA A)A AA)A+AA*AAA*A,AA+AAA+A-AA,AAA,A.AAA.AA-A/AAA/AA.A AA/A/A0A A1A!A A1A A0A2A"A!A2A!A1A3A#A"A3A"A2A$A#A3A3A4A$A%A$A4A4A5A%AAAAAAAAAAAAA8A(A'A8A'A7A9A)A(A(A8A9A*AA9AA)A9A;A+A:A+A*A:AA.A-A>A-A=A?A/A.A?A.A>A0A/A?A?A@A0A1A0A@A@AAA1A2A1AAAAABA2A3A2ABABACA3A4A3ACACADA4A5A4ADADAEA5AFA6A5A5AEAFAGA7AFA7A6AFAHA8A7A7AGAHAIA9A8A8AHAIA:A*A9A9AIA:AKA;A:A:AJAKALAA=AMAMANA>AOA?A>AOA>ANA@A?AOAOAPA@AAA@APAPAQAAABAAAQAQARABASACABASABARATADACATACASAEADATATAUAEAVAFAUAFAEAUAWAGAVAGAFAVAXAHAGAGAWAXAYAIAHAHAXAYAJA:AIAIAYAJA[AKAZAKAJAZA\ALAKAKA[A\A]AMALALA\A]ANAMA]A]ATNANATUUOANA^APAOA^AOAUQAPA^A^A_AQA`ARAQA`AQA_AaASARAaARA`AbATASAbASAaAcAUATAcATAbAdAVAcAVAUAcAeAWAdAWAVAdAfAXAeAXAWAeAgAYAfAYAXAfAZAJAgAJAYAgAiA[AhA[AZAhAjA\AiA\A[AiA]A\AjAjAkA]AdT]Ad]AkAlA^AUlAUemA_A^AmA^AlAnA`A_AnA_AmAoAaA`AoA`AnApAbAaApAaAoAqAcAbAqAbApArAdAqAdAcAqAsAeArAeAdArAtAfAsAfAeAsAuAgAtAgAfAtAhAZAuAZAgAuA%A&AxAxAyA%AA%AyAAyAzAAA{AAzA{AxA&AAxAA{A&A'A|A|A}A&AA&A}AA}A~AAAAA~AA|A'AA|AAA5A6AAAA5A%A5AA%AAA&A%AA%AAAA6A&AA&AA6A7AAAA6A&A6AA&AAA'A&AA&AAAA7A'AA'AAAyAxAAxAAzAyAAyAAA{AzAA{AAAxA{AAAAxA}A|AAAA}A~A}AA}AAAA~AA~AAAAA|AA|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABAABAABAABAABAABAABAABAABAABAABAABAABAABAAAABAABAABAABAABABefeBAfBAABAABAABAABBABBBBBBBBBBBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!B BB BBB%B$B#B%B#B"BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAUVVAAAAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAeUAAVAVfAAAAAAAAAAAAAAAAAAAAAAAABAABAABAABABBABAABBABAABAABAABAABBBAAABABBAA BAB BBAABA BAA B B BAAA BA B BAA BA B B BAA BA BAABBBAAABABBAABABBBAABABAABBBAAABABBAABABBBAABABBBBBBBBBBBBB BBB BBBB BBBBB B BBBB B B BB BBB B BB BBBBB BB B BBBBBBBBB BBB BBB BB B!BBB!B!BBBBB"B"B#BBBB$BB#B$BBB%BB$B%BBB%B%B"BBB&B'BB'B(BB(B)BB)B*BB*B+BB+B,BB,B-BB-B.BB.B/BB/B0BB0B1BB1B2BB2B3BB3B4BB4B5B5B&BBBBBBBBBBBBBBBBBBBfgfBBgBBBBBBBBBBBBBBBBBBBBBBBBB7B'B6B'B&B6B8B(B'B8B'B7B9B)B8B)B(B8B:B*B9B*B)B9B;B+B:B+B*B:BB.B-B>B-B=B?B/B.B?B.B>B0B/B?B?B@B0B1B0B@B@BAB1BBBBBBBBBBBBBDB4B3B3BCBDBEB5B4B4BDBEB6B&BEB&B5BEBGB7BFB7B6BFBHB8B7BHB7BGBIB9B8BIB8BHBJB:B9BJB9BIBKB;B:BKB:BJBLBB=BMBMBNB>B?B>BNBNBOB?BPB@B?BPB?BOBQBAB@BQB@BPBBBBBBBBBBBBBTBDBCBCBSBTBUBEBDBDBTBUBFB6BUB6BEBUBWBGBVBGBFBVBXBHBWBHBGBWBYBIBXBIBHBXBZBJBIBZBIBYB[BKBJB[BJBZB\BLBKB\BKB[BMBLB\B\B]BMBNBMB]B]B^BNBOBNB^B^B_BOB`BPBOB`BOB_BaBQBPBaBPB`BbBRBQBbBQBaBcBSBbBSBRBbBdBTBcBTBSBcBeBUBTBTBdBeBVBFBUBUBeBVBgBWBVBVBfBgBhBXBgBXBWBgBiBYBhBYBXBhBjBZBiBZBYBiBkB[BZBkBZBjBlB\B[BlB[BkB]B\BlBlBmB]B^B]BmBmBnB^BoB_B^BoB^BnBpB`B_BpB_BoBqBaB`BqB`BpBrBbBqBbBaBqBsBcBrBcBbBrBtBdBsBdBcBsBuBeBdBdBtBuBfBVBeBeBuBfBwBgBfBfBvBwBxBhBwBhBgBwByBiBxBiBhBxBjBiByByBzBjBkBjBzBzB{BkBlBkB{B{BVlBmBlBVVWmB|BnBmB|BmBW}BoBnB}BnB|B~BpB}BpBoB}BBqB~BqBpB~BBrBBrBqBBBsBBsBrBBBtBBtBsBBBuBtBtBBBvBfBuBuBBvBBwBBwBvBBBxBwBwBBBByBxBxBBBzByBBBBzB{BzBBBB{BV{BBBfVB|BWBWgB}B|BB|BBB~BB~B}BBBB~BB~BBBBBBBBBBBBBBBBBBBBBBBBBBBvBBvBBBABBBBBBBB1BABB1BBB2B1BBBB2BBBB2BB2BBBBCBBBBBB2BBBB2BBB3B2BB2BBBBCB3BB3BBQBRBBRBBBABQBBABBBBBABBBBBBBRBBBBBBBRBSBBBBRBBBRBBBBBBCBBBBBBBBBSBCBBCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBB CBBBB CCC!CCC!CCC!CCC!CCC!CCC!CC!Cghg!CCh!CCC!CCC!CCC!CCC!CCC!CC!CC!CCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB4C3C2C2C5C4C9C8C7C9C7C6CBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBBBBBCBCBBCCBCBBCCBCBBCBBBBCBCBBBCCCBCBBCCBCBBCCBCBBC CBCBBC CBB CB CBB C CWBBBWWXB CBB CBX CB CBB C CB CBB CCCBCB CCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCC C C CCCC CW CCCgWC CXCXhC C CC CCC C CC CCCC CC CCCCCCCCCCCCCCCCCCCCCCCCCCBB#CB"C#CBB#CB#C$CBB$C$C%CB"CBB"CB%CBB&C&C'CBBB'CB'C(CBB)CB(C)C&CBBB)C&CBB+CB*C+CBB+CB+C,CBB,C,C-CB*CBB*CB-CBB.C.C/CBBB/CB/C0CBB1CB0C1C.CBBB1C.C#C"C3C"C2C3C$C#C4C#C3C4C%C$C4C4C5C%C"C%C5C5C2C"C'C&C6C6C7C'C(C'C8C'C7C8C)C(C9C(C8C9C&C)C9C9C6C&C+C*C;C*C:C;C,C+CC>C?C/C0C/C@C/C?C@C1C0CAC0C@CAC>C.CAC.C1CACCBCCCCCCDCCDCECCECFCCFCGCCGCHCCHCICCICJCCJCKCCKCLCCLCMCCMCNCCNCOCCOCPCCPCQCQCBCCCCCCCCCCCCCCCCCCCCCCCCChihCCiCCCCCCCCCCCCCCCCCCCSCCCBCBCRCSCTCDCSCDCCCSCUCECTCECDCTCVCFCUCFCECUCWCGCVCGCFCVCXCHCWCHCGCWCYCICXCICHCXCZCJCICZCICYCKCJCZCZC[CKC\CLCKC\CKC[C]CMCLC]CLC\CCCCCCCCCCCCC`CPCOC`COC_CaCQCPCPC`CaCRCBCQCQCaCRCcCSCbCSCRCbCdCTCcCTCSCcCeCUCTCeCTCdCfCVCeCVCUCeCgCWCfCWCVCfChCXCgCXCWCgCiCYChCYCXChCjCZCYCjCYCiCkC[CZCkCZCjC\C[CkCkClC\CmC]C\CmC\ClCCCCCCCCCCCCCpC`C_CpC_CoCqCaCpCaC`CpCbCRCaCbCaCqCsCcCrCcCbCrCtCdCcCtCcCsCuCeCdCuCdCtCvCfCeCvCeCuCwCgCvCgCfCvCxChCwChCgCwCyCiChCyChCxCzCjCiCzCiCyC{CkCjC{CjCzC|ClC{ClCkC{C}CmC|CmClC|C~CnC}CnCmC}CCoC~CoCnC~CCpCCpCoCCCqCCqCpCCrCbCqCrCqCCCsCCsCrCCCtCsCCsCCCuCtCCtCCCvCuCCuCCCwCvCCvCCCxCwCCwCCCyCxCCxCCCzCCzCyCCC{CzCCzCCC|CC|C{CCC}CC}C|CCC~CC~C}CCCC~CC~CCCCCCCCCCCCCCCrCCrCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCXCCCCCCXYYCCCCCCCYCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCXCCChXCCYCYiCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC]C^CCCC]CMC]CCCCMCNCMCCMCCCC^CNCCNCC^C_CC^CCCNC^CCNCCCOCNCCCCOCC_COCCOCCmCnCCCCmC]CmCCCC]C^C]CC]CCCCnC^CC^CCnCoCCoCCC^CnCC^CCCC_C^CC^CCCoC_CC_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD>D?DCCC?D?D@DCCCADC@DAD>DCC>DCADCCBDCBDCDCCCDCCDDDCCDDDDEDCBDCCBDCEDCCFDFDGDCCCGDGDHDCCCIDCHDIDFDCCFDCIDCCKDCJDKDCCKDCKDLDMDCCMDCLDJDCCJDCMDOD?D>DOD>DND?DODPDPD@D?DAD@DPDADPDQD>DADQDQDND>DCDBDRDCDRDSDDDCDTDCDSDTDDDTDUDUDEDDDRDBDUDBDEDUDWDGDFDWDFDVDXDHDGDXDGDWDIDHDXDIDXDYDFDIDYDYDVDFDKDJDZDKDZD[DLDKD\DKD[D\DLD\D]D]DMDLDZDJD]DJDMD]DD^D_DD_D`DD`DaDDaDbDDbDcDDcDdDDdDeDDeDfDDfDgDDgDhDDhDiDDiDjDDjDkDDkDlDDlDmDmD^DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDjkjDDkDDDDDDDDDDDDDoD_D^DoD^DnDpD`D_DpD_DoDqDaD`DqD`DpDrDbDqDbDaDqDsDcDrDcDbDrDtDdDcDtDcDsDuDeDtDeDdDtDvDfDuDfDeDuDwDgDvDgDfDvDxDhDwDhDgDwDyDiDxDiDhDxDDDDDDDDDDDDD|DlDkD|DkD{D}DmD|DmDlD|DnD^DmDnDmD}DDoDnDDnD~DDpDoDDoDDDqDpDDpDDDrDDrDqDDDsDDsDrDDDtDsDDsDDDuDtDDtDDDvDuDDuDDDwDvDDvDDDxDwDDwDDDyDDyDxDDDDDDDDDDDDDDD|D{DD{DDD}D|DD|DD~DnD}D~D}DDDDDD~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDZDDDDDDDZDZ[DDDDD[DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDjZDZDDDD[D[kDDDDDDDDDDDDDDDDDDDDDDDDyDzDDDDyDiDyDDDDiDjDiDDiDDDDzDjDDjDDzD{DDDDzDjDzDDjDDDkDjDDjDDDD{DkDDkDDDDDDDDyDDDDDyDzDyDDyDDDDDzDzDDDDDDDDDzDDDDDzD{DzDDzDDDDD{D{DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDXEDDDDXEKEJEYELEKEYEMELEYENEMEYEOENEYEPEOEYEQEPEYEREQEYESEREYETESEYETEYEklkYEUElYEVEUEYEVEYEWEYEJEWEDDDDDDDDDDDDDDDDDDEDDEDDDDEEEDDDEEEDEDDDEEEDEDDEEDEDDEEDEDDEEDEDDEmElEjElEkEjEqEpEoEqEoEnE EDD ED E EDD ED EDDDDD E EDD ED EED EDD EEDDEDEEEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEuEtEsEuEsErEyExEwEyEwEvEE E EE EEE E EE EE ED E E EEE EE E EEEEEE EEEEEEEE EEE EEE!EE EEE E"EEE"EE!E#EEE#EE"E$EEE$EE#E%EEE%EE$E&EEE&EE%E'EEE'EE&E(EE'EEE'E)EE(EEE(E*EE)EEE)E+EEE+EE*EE EEEE+E-EE,EEE,E.EE-EEE-E/EE.EEE.E0E EE0EE/E1E!E E1E E0E2E"E!E2E!E1E3E#E2E#E"E2E4E$E3E$E#E3E5E%E$E5E$E4E6E&E%E6E%E5E7E'E&E7E&E6E8E(E7E(E'E7E9E)E(E9E(E8E:E*E9E*E)E9E;E+E:E+E*E:E,EE;EE+E;E=E-E,E=E,EE.E-E>E-E=E?E/E.E?E.E>E@E0E/E@E/E?EAE1E0EAE0E@EBE2EAE2E1EAECE3EBE3E2EBEDE4ECE4E3ECEEE5EDE5E4EDEFE6E5EFE5EEE[7EFE7E6EFE8E7E[8E[\GE9E8EGE8E\HE:EGE:E9EGEIE;EHE;E:EHEE=ELE=EKEME?E>EME>ELENE@E?ENE?EMEOEAE@EOE@ENEPEBEOEBEAEOEQECEPECEBEPEREDEQEDECEQESEEEREEEDERETEFESEFEEESEk[TE[FETEUEGE\\lUEVEHEGEGEUEVEWEIEHEWEHEVEJEF.F?F/F.F?F.F>F@F0F/F@F/F?FAF1F@F1F0F@FBF2FAF2F1FAFCF3FBF3F2FBFDF4F3F3FCFDFEF5F4F4FDFEFFF6F5F5FEFFFGF7FFF7F6FFF8F(FGF(F7FGFIF9F8FIF8FHFJF:F9FJF9FIFKF;F:FKF:FJFF=FMFMFNF>FOF?F>FOF>FNFPF@F?FPF?FOFQFAF@FQF@FPFRFBFQFBFAFQFSFCFRFCFBFRFTFDFSFDFCFSFUFEFDFDFTFUFVFFFEFEFUFVFWFGFVFGFFFVFHF8FWF8FGFWFYFIFHFHFXFYFZFJFIFZFIFYF[FKFJF[FJFZFLFKF[F[F\FLFMFLF\F\F]FMFNFMF]F]F^FNF_FOFNF_FNF^F`FPFOF`FOF_FaFQFPFaFPF`FbFRFQFbFQFaFcFSFRFcFRFbFdFTFcFTFSFcF]UFdFUFTFdFVFUF^UF]^eFWFVFVF^eFXFHFWFWFeFXFgFYFXFXFfFgFZFYFgFgFhFZF[FZFhFhFiF[FjF\F[FjF[FiFkF]F\FkF\FjFlF^FkF^F]FkFmF_FlF_F^FlFnF`FmF`F_FmFoFaFnFaF`FnFpFbFoFbFaFoFqFcFbFqFbFpFrFdFqFdFcFqFm]rF]dFrFsFeF^^nsFfFXFeFeFsFfF$FvFwFwF#F$FF#FwFFwFxFFFxFFxFyFvF$FFvFFyF$F%FzF$FzF{FF$F{FF{F|FFF|FF|F}FzF%FFF}FzF4F~FFF3F4F#F3FFFF#F$F#FF$FFF~F4F$F$FF~F5FFFF4F5F$F4FFFF$FF%F$FF$FFF5F%F%FFFvFFFFwFvFxFwFFwFFFyFxFFyFFFvFyFFFFvF{FzFF{FFF|F{FF{FFFF}F|FF|FFFzFFzF}FF~FFFFF~FFFFFFFFFFFFFFF~FF~FFFFFFFFFFFFFFFFFFFFFFFFFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGFFGGFGGGGGGnGonGFoFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGG#G"G!G#G!G GFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF^FFFFF^_FFF^FFFF_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGFFFFFGFGFFGn^G^FGFF__oFFFGGGFFFGFGGFFGFGGGFFGFGFFGFG GFF GF G GFF GF G GGFFF GGFF G G GFFF GF GGFFGFGG GFF GFGFGGGFFFFGFGGGFFGFGGFFFGGGGGGGGGGGGGGGGGGGGGGGGGG GGG GGG G GG GGGG G GG GGG GGGGG GGGG G GG GG GGGGGGGGG GGGGG GGG GG G!GGG"GG!G"G#GGG#GG"G#G GG#GGGG$G%GG%G&GG&G'GG'G(GG(G)GG)G*GG*G+GG+G,GG,G-GG-G.GG.G/GG/G0GG0G1GG1G2GG2G3G3G$GGG`GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGoG`o5G%G4G%G$G4G6G&G%G6G%G5G7G'G&G7G&G6G8G(G'G8G'G7G9G)G(G9G(G8G:G*G)G:G)G9G;G+G*G;G*G:GG.G?G/G.G.G>G?GGGGGGGGGGGGGBG2G1GBG1GAGCG3GBG3G2GBG4G$G3G3GCG4GEG5GDG5G4GDGFG6G5GFG5GEGGG7G6GGG6GFGHG8G7GHG7GGGIG9G8GIG8GHG:G9GIGIGJG:GKG;G:GKG:GJGLGG=G=GMGNGOG?G>G>GNGOGGGGGGGGGGGGGRGBGAGRGAGQGSGCGBGBGRGSGDG4GSG4GCGSGUGEGTGEGDGTGFGEGUGUGVGFGWGGGFGWGFGVGXGHGGGXGGGWGIGHGXGXGYGIGJGIGYGYGZGJGKGJGZGZG[GKG\GLGKG\GKG[GMGLG\G\G]GMG^GNGMGMG]G^G_GOGNGNG^G_G`GPGOGOG_G`GaGQGPGPG`GaGbGRGQGQGaGbGcGSGRGRGbGcGTGDGcGDGSGcGeGUGTGTGdGeGVGUGeGeGfGVGWGVGfGfGgGWGXGWGgGgGhGXGYGXGhGhGiGYGZGYGiGiGjGZG[GZGjGjGkG[GlG\G[GlG[GkGmG]G\GmG\GlGnG^G]G]GmGnGoG_GnG_G^GnGpG`GoG`G_GoGqGaG`G`GpGqGrGbGaGaGqGrGsGcGbGbGrGsGdGTGsGTGcGsGtGeGdGdGPtGfGeGtGtGuGfGgGfGuGuGvGgGwGhGgGwGgGvGxGiGhGxGhGwGyGjGiGyGiGxGzGkGjGzGjGyG{GlGkG{GkGzG|GmGlG|GlG{G}GnG|GnGmG|G~GoG}GoGnG}GGpG~GpGoG~GGqGGqGpGGGrGqGqGGG_sGGsGrGG_PdGdGsG_GtGPP`GGuGtGtGGGGvGuGGuGGGwGvGGvGGGxGwGGwGGGyGxGGxGGGzGyGGyGGG{GzGGzGGG|G{GG{GGG}GG}G|GGG~GG~G}GGGGGG~GGGGGGGGGGGGGGo_G_GG?G@GGGG?G/G?GG/GGG0G/GG/GGGG@G0GG0GG@GAGG@GGG0G@GG0GGG1G0GG1GGGGAG1GG1GGOGPGGGGOG?GOGG?GGG@G?GG?GGGGPG@GG@GGQGGGGPGQG@GPGG@GGGGAG@GG@GGGQGAGGAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGG HGGGG HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HHH!HH!HH!HHHGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG3H2H0H2H1H0H7H6H5H7H5H4HGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG;H:H8H:H9H8H?H>H=H?H=HH-H=H>H?H/H.H?H.H>HIH>I?I H?I?It >IH >I uHH@IH@IAI HAI AIBIH BIHBICI@IHH@IHCIHHDIHDIEIHHEIHEIFIHHFIHFIGIDIHHDIHGIHHHIHHIIIHHIIHIIJIHJIKIKIHHHIHHHIHKI>ILIMIMI?I>I?IMININIt?IutNIuNIOI>IuOIOILI>IAI@IPIAIPIQIBIAIRIAIQIRISICIBISIBIRIPI@ISI@ICISIDITIUIUIEIDIFIEIVIEIUIVIGIFIVIGIVIWIDIGIWIWITIDIIIHIXIIIXIYIJIIIZIIIYIZI[IKIJI[IJIZIXIHI[IHIKI[II\I]II]I^II^I_II_I`II`IaIIaIbIIbIcIIcIdIIdIeIIeIfIIfIgIIgI I hIIhIiIIiIjIjI\IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlI]I\I\IkIlImI^IlI^I]IlInI_I^I^ImInIoI`I_I_InIoIpIaI`I`IoIpIqIbIpIbIaIpIrIcIbIrIbIqIsIdIcIsIcIrIeIdIsIsItIeIfIeItItIuIfIvIgIfIvIfIuIIIIIIIIIIIIIxIiIhIxIhIwIyIjIiIiIxIyIkI\IjIjIyIkI{IlIzIlIkIzI|ImI{ImIlI{I}InImImI|I}I~IoInInI}I~IIpI~IpIoI~IIqIIqIpIIIrIqIIqIIsIrIIIIsItIsIIIItIuItIIIIuIIvIuIIuIIIIIIIIIIIIIIIxIwIIwIIIyIxIxIIIzIkIyIyIIzII{II{IzII|I{IIII|I}I|IIII}II~I}I}IIIII~I~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIzIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIvIrvIrIgIvIIgIIIu I gIIwIIII I IIhI IhIIIIwIhIIhIIIIIIIIvIIIvIIIvIIIIIIIIIIIIIIIIIIIIIwIIIwIIwIIIrIrIIIIIIIIuIIIIuruIIIrIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIXJIIIIXJIJHJYJJJIJYJKJJJYJLJKJYJMJLJYJNJMJYJOJNJYJPJOJYJQJPJYJRJQJYJSJRJYJTJSJYJUJTJYJVJUJYJVJYJWJYJHJWJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJIIIJJJIJIIIJJJIIIJJJIJIIJJIJIIJkJjJhJjJiJhJoJnJmJoJmJlJJIIJIJIJIIJIIIIIJIIJJ JIII J J JIII J J JI JII JI J JII JI JJI J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsJrJpJrJqJpJwJvJuJwJuJtJJJJJJJJJJJJIJJJJ JJJJJ J J JJJJ JJ J J JJJ J JJJJ J J JJJJ JJ JJJJJJJJJJJJJJJ JJJJ J J!JJ"JJJJ!J"JJJ"J"J#JJJJ#J#J$JJJJ$J$J%JJ&JJ%JJJ%JJJ&J&J'JJJJ'J'JJJJJ(J(J)JJ*JJJ*JJ)JJJ*J*J+JJJJ+J+J,JJJJ,J,J-JJ.JJJ.JJ-JJJ.J.J/JJ JJ/J/J0J J!J J0J0J1J!J2J"J1J"J!J1J#J"J2J2J3J#J$J#J3J3J4J$J%J$J4J4J5J%J&J%J5J5J6J&J'J&J6J6J7J'JJ'J7J7J(JJ9J)J(J9J(J8J:J*J)J:J)J9J;J+J*J;J*J:J,J+J;J;JJ.J-J>J-J=J?J/J.J?J.J>J@J0J?J0J/J?JAJ1J@J1J0J@JBJ2JAJ2J1JAJCJ3J2J2JBJCJDJ4JCJ4J3JCJEJ5JDJ5J4JDJFJ6JEJ6J5JEJGJ7J6J6JFJGJ(J7JGJGJ8J(J9J8JHJHJIJ9JJJ:J9JJJ9JIJKJ;J:JKJ:JJJJ=JNJ=JMJOJ?J>JOJ>JNJPJ@JOJ@J?JOJQJAJPJAJ@JPJRJBJAJAJQJRJSJCJBJBJRJSJTJDJSJDJCJSJUJEJTJEJDJTJVJFJEJEJUJVJWJGJFJFJVJWJ8JGJWJWJHJ8JJZJJZJ[JIJ[JI[J\JII\JI\J]JZJIZJI]JIwIw^JII^JI^J_JvIvI_JJJ`JJ`JaJJJaJJaJbJJbJbJcJ`JJ`JcJJJdJJdJeJJeJeJfJfJgJgJdJJdJgJiJ[JZJiJZJhJ[JiJjJjJ\J[J]J\JjJ]JjJkJZJ]JkJkJhJZJwvlJlJmJw^JwnJwmJnJ_J^JoJ^JnJoJlJvoJv_JoJqJaJ`JqJ`JpJaJqJrJrJbJaJcJbJrJcJrJsJ`JcJsJsJpJ`JeJdJtJtJuJeJfJeJvJeJuJvJgJfJwJfJvJwJdJgJwJwJtJdJJxJyJJyJzJJzJ{JJ{J|JJ|J}JJ}J~JJ~JJJJJJJJJJJJJJJJ J JJJJJJJJxJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJyJxJxJJJJzJJzJyJJJ{JzJzJJJJ|J{J{JJJJ}JJ}J|JJJ~JJ~J}JJJJ~JJ~JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJxJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKJJJKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJ JJJ J JwJJJJ xJxJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJwJJwJJxwJwJJxJJJJxJJJJJJJJJJJJJJKJJKJJKKKJJJKKJJJJKJKKJJKJKKJKKKJJJJKKKJtKKKtKKKtKK KtK K KtK K KtK K KtK K KtK KKtKKKtKKKtKKKtKK tK tK KtKKKKKtKeKdKuKfKeKuKgKfKuKhKgKuKiKhKuKjKiKuKkKjKuKlKkKuKmKlKuKnKmKuKoKnKuKpKoKuKqKpKuKrKqKuKrKuKsKuKdKsKKKKKKKKKKKKK KKKKK KK K KK KKK K KK KK K KKKK K K KKKK KKK K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK"KK "K !K#KK"KKK"KKKKKK#K%KKK%KK$KKK%K%K&KKKK&K&K'KK(KKK(KK'K)KKK)KK(KKK)K)K*KKKK*K*K+KK,KKKK+K,K-KKKK,K-K.KKKK-K.K/KK.KKK.KKKKKKKKKKKKK2K"K!K!K1K2K3K#K2K#K"K2K$KK#K$K#K3K%K$K4K4K5K%K&K%K5K5K6K&K'K&K6K6K7K'K(K'K7K7K8K(K9K)K(K(K8K9K*K)K9K9K:K*K+K*K:K:K;K+K,K+K;K;KK.K-K-K=K>K/K.K>K>K?K/K0K/K?K?K@K0K1K0K@K@KAK1K2K1KAKAKBK2K3K2KBKBKCK3K$K3KCKCK4K$K5K4KDKDKEK5KFK6K5KFK5KEK7K6KFKFKGK7K8K7KGKGKHK8K9K8KHKHKIK9KJK:K9KJK9KIK;K:KJKJKKK;KKMK>K=KMK?K>KNKNKOK?K@K?KOKOKPK@KAK@KPKPKQKAKBKAKQKQKRKBKCKBKRKRKSKCK4KCKSKSKDK4KUKEKDKUKDKTKVKFKEKVKEKUKWKGKFKWKFKVKHKGKWKWKXKHKIKHKXKXKYKIKZKJKIKZKIKYK[KKKJK[KJKZK\KLK[KLKKK[K]KMK\KMKLK\K^KNK]KNKMK]K_KOKNKNK^K_K`KPK_KPKOK_KaKQK`KQKPK`KbKRKaKRKQKaKcKSKRKRKbKcKDKSKcKcKTKDKUKTKdKdKeKUKfKVKUKfKUKeKgKWKVKgKVKfKXKWKgKgKhKXKYKXKhKhKiKYKjKZKYKjKYKiKkK[KZKkKZKjKlK\KkK\K[KkKmK]KlK]K\KlKnK^KmK^K]KmKoK_K^K^KnKoKpK`KoK`K_KoKqKaKpKaK`KpKrKbKqKbKaKqKsKcKbKbKrKsKTKcKsKsKdKTK KvKwKwKK KKKwKKwKxK KxK xKyKvK K vK yK K!KzK KzK{Kx {K K{KzK!K zK y/K0K|K/K|K}KK/K}KK}K~K KK~K K~KK|K0K K|K KK0K1KK0KKK K0KK KKK KKKK!K KK1K!KK!KKKwKvKKvKKwKKKKxKwKyKxKKyKKKvKyKKKKvK{KzKKKK{Kx{KK{KKKyxKxKKKzKKzKyKK}K|KK|KK}KKKK~K}KK~KKKKK|KKKKK|KKKKKKKKKKKKKKKKKKKKKKKKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLK L KLKKKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLKKLLKLLLLLKLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLKK K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLL!L LL!LLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLKLKKLKLKKKKKLKKLKLLKKLKLLKKLKLLLKKLKLKvKvLKKLKL Ly L K LKK LK L LKK LK L LKK LK L L LKK LK LKKLKLLKKLKLLKLLLKLKLLLLLLLLLLLLLLLLLLLLLLLLLLLvLLLL LLLLLL LLLLy LLvLvyL L LL LLL L LL LLL L LLLL L L LLLL LLLLLLLLL LLL LL L!L!LLLLL!L!LLLL"L#LL#L$LL$L%LL%L&LL&L'LL'L(LL(L)LL)L*LL*L+LL+L,LL,L-LL-L.LL.L/LL/L0LL0L1L1L"LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#L"L2L2L3L#L4L$L#L4L#L3L%L$L4L4L5L%L&L%L5L5L6L&L'L&L6L6L7L'L8L(L'L'L7L8L9L)L(L(L8L9L:L*L9L*L)L9L;L+L:L+L*L:LLL=LLL-L=LL-LLL.L-LL.LLLL>L.LL.LL>L?LL>LLL.L>LL.LLL/L.LL/LLLL?L/LL/LL=L+{=L{L>L=LL>LLLz,>Lz>LL,MLL,LL>L,L>LLL>LLLL?L>LLML?LL?LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLzLLL{zL{L{LLLLLLLLzLLLLzLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLMLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL1M0M/M/M.M1M5M4M3M5M3M2MLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL+9M8M7M7M6M9M=MM?MM?M@MM@MAMMAMBMMBMCMMCMDMMDMEMMEMFMMFMGMMGMHMMHMIMMIMJMMJMKMMKMLMMLMMMMM>MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?M>MNMNMOM?MPM@M?MPM?MOMQMAM@MQM@MPMBMAMQMQMRMBMCMBMRMRMSMCMTMDMCMCMSMTMUMEMDMDMTMUMVMFMUMFMEMUMWMGMVMGMFMVMXMHMGMGMWMXMIMHMHMXMMMMMMMMMMMMMZMLMKMZMKMYM[MMMLM[MLMZM>MMM[M[MNM>MOMNM\M\M]MOM^MPMOM^MOM]M_MQMPM_MPM^MRMQM_M_M`MRMSMRM`M`MaMSMbMTMSMSMaMbMcMUMTMTMbMcMdMVMUMUMcMdMeMWMdMWMVMdMfMXMWMWMeMfMgMXMXMfMgMMMMMMMMMMMMMjMZMYMjMYMiMkM[MZMkMZMjMNM[MkMkM\MNM]M\MlMlMmM]M^M]MmMmMnM^MoM_M^MoM^MnM`M_MoMoMpM`MaM`MpMpMqMaMbMaMqMqMrMbMsMcMbMbMrMsMdMcMsMsMtMdMeMdMtMtMuMeMfMeMuMuMvMfMwMgMfMfMvMwMxMhMwMhMgMwMiMhMxMxMyMiMjMiMyMyMzMjMkMjMzMzM{MkM\MkM{M{MlM\MmMlM|M|M}MmMnMmM}M}M~MnMoMnM~M~MMoMpMoMMMMpMqMpMMMMqMrMqMMMMrMMsMMsMrMMtMsMMMMtMuMtMMMMuMvMuMMMMvMMwMMwMvMMMxMwMwMMMyMxMMMMyMzMyMMMMzM{MzMMMM{M|MlM{M|M{MMM}M|MM|MM~M}MMMM~MMM~MM~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM|MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMIMMIMMMJMIMMJMMMMJMMJMMYMMMMJMMJMMMKMJMMKMMMMYMKMMKMMgMhMMgMMM|MgMMMhMM}hMiMMhMMMhMMMMMMMYMMiMYMMYMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM|MMMMM}|M}MMM}MMMMMMMMMMMMMMMMMMMMMMMMMMMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMM:NMMMM:N+N*N;N,N+N;N-N,N;N.N-N;N/N.N;N0N/N;N1N0N;N2N1N;N3N2N;N4N3N;N5N4N;N6N5N;N7N6N;N8N7N;N8N;N9N;N*N9NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNLNKNKNJNMNQNPNONONNNQNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMUNTNSNSNRNUNYNXNWNWNVNYNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMNNNMNMMNMNMMNNNMMMNNNMMMNNNMN,MNMNM,NNNMMMNNNMMMNN NMMMMM NM NMMM N N NMMM N NMM N N NMMM N NNMMMNNNMNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNN NM NNN NMN N N NNNN N N NNNN NN N NNNNNN NNNNNNNN NNNNN NNN N N!NN"NNN"NN!N#NNN#NN"N$NNN$NN#NNN$N$N%NN&NNN&NN%N'NNN'NN&N(NNN(NN'N)NN(NNN(NN N)N NN)N+NNNN*N+N,NNNN+N,N-NN,NNN,N.NN-NNN-N/NNNN.N/N0N NNN/N0N!N N0N0N1N!N2N"N!N2N!N1N3N#N"N3N"N2N4N$N#N4N#N3N%N$N4N4N5N%N6N&N%N6N%N5N7N'N&N7N&N6N8N(N'N8N'N7N9N)N8N)N(N8N*NN9NN)N9NMNMM>NM>N?NN=NLN=NKNLN?N>NLNLNMN?NO.O-O>O-O=O?O/O.O?O.O>O@O0O/O@O/O?O1O0O@O@OAO1OBO2O1OBO1OAOCO3O2OCO2OBODO4O3ODO3OCOEO5ODO5O4ODO6O&OEO&O5OEOGO7O6O6OFOGOHO8O7O7OGOHOIO9OHO9O8OHOJO:OIO:O9OIOKO;O:O:OJOKOLOO=ONO=OMOOO?O>OOO>ONOPO@O?OPO?OOOAO@OPOPOQOAOROBOAOROAOQOSOCOBOSOBOROTODOCOTOCOSOUOEOTOEODOTOFO6OUO6OEOUOOXOOXOYONOYONYOZONNZONZO[OXONXON[OO\O\O]ON]ON]O^ONN^ON^O_O\OON\ON_OO,`OO`OaOOOaOOaObOObObOcO`O,`OcO,dO,OdOeOeOOdOOOdOOeOYOXOgOXOfOgOZOYOhOYOgOhO[OZOhOhOiO[OXO[OiOiOfOXO]O\OjO]OjOkO^O]OlO]OkOlOmO_O^OmO^OlO\O_OmOmOjO\OaO`OoO`OnOoObOaOpOaOoOpOcObOpOpOqOcO`OcOqOqOnO`OdOrOrOsOtOsOtOuOeOuOtOdOeOuOuOrOdOOvOwOOwOxOOxOyOOyOzOOzO{OO{O|OO|O}OO}O~OO~OOOOOOOOOOOOOOOOOOOOOvOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOwOvOOvOOxOwOOOOxOyOxOOOOyOOzOyOOyOOO{OzOOzOO|O{OOOO|O}O|OOOO}OO~O}O}OOOOO~O~OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOvOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPOOPOPPPPPOPPPOrPPPrPPPrPPPrPPPrPP PrP P PrP P PrP P PrP P PrP PPrPPPrPPPrPPPrPPPrPPPPPrPcPbPsPdPcPsPePdPsPfPePsPgPfPsPhPgPsPiPhPsPjPiPsPkPjPsPlPkPsPmPlPsPnPmPsPoPnPsPpPoPsPpPsPqPsPbPqPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPP P P PPPP P P PPPP PP P PPP P PP PPPP PP PPPPPPPPPPPPPPPPPPPP!PPP!PPPP!P!P"PPPP"P"PPP$PPPP#P$P%PPPP$P%P&PPPP%P&P'PP&PPP&P(PPPP'P(P)PPPP(P)P*PPPP)P*P+PP*PPP*P,PPP,PP+PPP,P,P-PPPP-P-P.PPPPPPPPPPPPPP0P!P0P-"P!P0P0P1P"PP"P1P1P#PP$P#P2P2P3P$P4P%P$P$P3P4P5P&P4P&P%P4P'P&P5P5P6P'P7P(P'P'P6P7P)P(P7P7P8P)P9P*P8P*P)P8P+P*P9P9P:P+P,P+P:P:P;P,P-P,P;P;PP/P-/P>P>P?P-0P-?P?P@P0P1P0P@P@PAP1P#P1PAPAP2P#P3P2PBPBPCP3P4P3PCPCPDP4PEP5P4P4PDPEP6P5PEPEPFP6P7P6PFPFPGP7P8P7PGPGPHP8PIP9P8P8PHPIP:P9PIPIPJP:PKP;P:P:PJPKPP=PMPMPNP>P?P>PNPNPOP?P@P?POPOPPP@PQPAP@PQP@PPPBP2PAPAPQPBPSPCPRPCPBPRPTPDPSPDPCPSPUPEPTPEPDPTPVPFPEPEPUPVPWPGPVPGPFPVPXPHPWPHPGPWPYPIPHPHPXPYPZPJPIPIPYPZPKPJPZPZP[PKPLPKP[P[P\PLP]PMPLP]PLP\P^PNPMP^PMP]POPNP^P^P_POPPPOP_P_P`PPPaPQPPPaPPP`PRPBPQPRPQPaPcPSPbPSPRPbPdPTPcPTPSPcPePUPdPUPTPdPfPVPUPUPePfPgPWPfPWPVPfPhPXPgPXPWPgPiPYPhPYPXPhPjPZPYPYPiPjP[PZPjPjPkP[P\P[PkPkPlP\PmP]P\PmP\PlPnP^P]PnP]PmP_P^PnPnPoP_P`P_PoPoPpP`PqPaP`PqP`PpPbPRPaPbPaPqPP PtPPtPuPPPuPPuPvPPPvPPvPwPtP PPtPPwP PxP PxPyPP PyPPyPzPPPzPPzP{PxPPxPP{P.P/P|P.P|P}PP.P}PP}P~P PP~P P~PP|P/P P|P PP/P-~/P~P P/PP PPP P PPuPtPPtPPPvPuPPuPPPwPvPPPPwPtPwPPPPtPyPxPPyPPPzPyPPyPPPzPPPP{PzPPxPPxP{PP}P|PP|PPP~P}PP}PPPP~PPPPP|PPPPP|PP~PPPPPPPPPPPPPPP~PPP~QPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQPPQQPQQQQQPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQPPPPQQPPPQQPPPPQPPrssPPPPsPsQPPQPQQrPPrPQPPQPQQPPQPQQPPQPQ QQPPQP QP Q Q QPPPP Q Q QPPP QP Q Q QPP QP QPQQQPPPPQPQQQPPQPQQPPQPQQQssQQQQQQQrQQQrQQQQQQQQQQQQ QQQQQQQ QQQQQ QQQQ Q Q Q QQ QQQ Q QQ QQQ Q QQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQ Q!QQ!Q"QQ"Q#QQ#Q$QQ$Q%QQ%Q&QQ&Q'QQ'Q(QQ(Q)QQ)Q*QQ*Q+QQ+Q,QQ,Q-QQ-Q.QQ.Q/Q/Q QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ1Q!Q Q Q0Q1Q2Q"Q!Q!Q1Q2Q3Q#Q"Q3Q"Q2Q4Q$Q#Q4Q#Q3Q%Q$Q4Q4Q5Q%Q&Q%Q5Q5Q6Q&Q'Q&Q6Q6Q7Q'Q(Q'Q7Q7Q8Q(Q)Q(Q8Q8Q9Q)Q*Q)Q9Q9Q:Q*Q+Q*Q:Q:Q;Q+QQQQQQQQQQ>Q.Q-Q>Q-Q=Q?Q/Q.Q.Q>Q?Q0Q Q/Q/Q?Q0QAQ1Q0Q0Q@QAQBQ2Q1Q1QAQBQ3Q2QBQBQCQ3Q4Q3QCQCQDQ4QEQ5Q4QEQ4QDQ6Q5QEQEQFQ6QGQ7Q6Q6QFQGQHQ8Q7Q7QGQHQ9Q8QHQHQIQ9Q:Q9QIQIQJQ:Q;Q:QJQJQKQ;QQQQQQQQQQQQQNQ>Q=QNQ=QMQOQ?Q>Q>QNQOQ@Q0Q?Q?QOQ@QQQAQ@Q@QPQQQBQAQQQQQRQBQCQBQRQRQSQCQDQCQSQSQTQDQUQEQDQUQDQTQVQFQEQEQUQVQWQGQFQFQVQWQXQHQGQGQWQXQYQIQHQHQXQYQJQIQYQYQZQJQ[QKQJQJQZQ[Q\QLQKQKQ[Q\Q]QMQLQLQ\Q]Q^QNQ]QNQMQ]QOQNQ^Q^Q_QOQ@QOQ_Q_QPQ@QQQPQ`Q`QaQQQbQRQQQQQaQbQSQRQbQbQcQSQTQSQcQcQdQTQeQUQTQeQTQdQfQVQUQfQUQeQgQWQVQVQfQgQhQXQWQWQgQhQYQXQhQhQiQYQjQZQYQYQiQjQkQ[QZQZQjQkQlQ\Q[Q[QkQlQmQ]QlQ]Q\QlQ^Q]QmQmQnQ^Q_Q^QnQnQoQ_QPQ_QoQoQ`QPQqQaQ`Q`QpQqQrQbQaQaQqQrQsQcQbQbQrQsQdQcQsQsQtQdQuQeQdQuQdQtQvQfQeQvQeQuQgQfQvQvQwQgQhQgQwQwQxQhQiQhQxQxQyQiQjQiQyQyQzQjQ{QkQjQjQzQ{Q|QlQkQkQ{Q|Q}QmQ|QmQlQ|Q~QnQ}QnQmQ}QoQnQ~Q~QQoQ`QoQQQpQ`QQqQQqQpQQQrQqQqQQQQsQrQrQQQQtQsQsQQQQuQtQQtQQQvQuQQuQQwQvQQQQwQxQwQQQQxQyQxQQQQyQQzQyQQyQQQ{QQ{QzQQQ|QQ|Q{QQQ}QQ}Q|QQQ~Q}Q}QQQQQ~Q~QQQQpQQQQQs;QRR>R?RR?R@RR@RARRARBRRBRCRRCRDRRDRERRERFRRFRGRRGRHRRHRIRRIRJRRJRKRKRRMR>R=RMROR?R>R>RNRORPR@R?R?RORPRQRAR@R@RPRQRRRBRQRBRARQRSRCRBRSRBRRRTRDRCRTRCRSRERDRTRTRURERFRERURURVRFRWRGRFRWRFRVRRRRRRRRRRZRJRIRZRIRYR[RKRJRJRZR[RLRSRR?SR>S?SS=SLS=SKSLS?S>SLS?SLSMST.T?T/T.T?T.T>T@T0T/T@T/T?TAT1T0TAT0T@TBT2T1TBT1TATCT3TBT3T2TBTDT4TCT4T3TCTET5TDT5T4TDT6T&TET&T5TETGT7T6T6TFTGTHT8T7T7TGTHTIT9T8T8THTITJT:T9T9TITJTKT;T:TKT:TJTT=TNT=TMTOT?TNT?T>TNTPT@TOT@T?TOTQTATPTAT@TPTRTBTQTBTATQTSTCTRTCTBTRTTTDTSTDTCTSTUTETTTETDTTTFT6TUT6TETUTTTXTXTYTTSTYTSYTZTSS[TSZT[TXTTSXTS[TTT\T\T]TTxS]TST]TSSySxy\TTS\TSyTT^T^T_TTTT_TT_T`TTTaTT`TaT^TTT^TTaTTTbTbTcTTTTcTTcTdTTTeTTdTeTbTTTTeTbTXTfTgTgTYTXTZTYThTYTgThT[TZThT[ThTiTXT[TiTiTfTXT]T\TjT]TjTkTx]T]TkT\TyjT\T^TlTmTmT_T^T`T_TnT_TmTnTaT`TnTaTnToT^TaToToTlT^TcTbTpTcTpTqTdTcTrTcTqTrTsTeTdTsTdTrTbTeTsTsTpTbTTtTuTTuTvTTvTwTTwTxTTxTyTTyTzTTzT{TT{T|TT|T}TT}T~TT~TTTTTTTTTTTTTTTtTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTuTtTtTTTTvTuTuTTTTwTvTvTTTTxTwTwTTTTyTTyTxTTTzTTzTyTT{TzTTTT{T|T{TTTT|T}T|TTTT}T~T}TTTT~TTT~TT~TTTTTTTTTTTTTTTTTTTTTTTTtTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTvvTTTTTTTTyTTTTyvTTTyvTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTvTTTTTTTTyTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUTTTTUTUUUTTUTTrUUUrUUUrUUUrUUUrUUUrUUUrUU UrU U UrU U UrU U UrU U UrU UUrUUUrUUUrUUUUUrUcUbUsUdUcUsUeUdUsUfUeUsUgUfUsUhUgUsUiUhUsUjUiUsUkUjUsUlUkUsUmUlUsUnUmUsUoUnUsUpUoUsUpUsUqUsUbUqUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUUU U U UUUU UU U U UUU U UUUU U U UUUU UUUUUUUUUUUUU UUUUU U!UUUU U!UUUUU!UU#UU"UUU"U$UU#UUU#U%UU$UUU$U&UU%UUU%U'UUU'UU&U(UUU(UU'U)UUU)UU(U*UUU*UU)UUU*U*U+UUUU+U+U,UUUU,U,U-UUUUUUUUUUU0U UUU/U0U1U!U U U0U1U"UU!U!U1U"U3U#U2U#U"U2U4U$U3U$U#U3U5U%U4U%U$U4U&U%U5U5U6U&U'U&U6U6U7U'U8U(U'U8U'U7U9U)U(U9U(U8U:U*U)U:U)U9U+U*U:U:U;U+U,U+U;U;UU.U-U-U=U>U?U/U.U.U>U?U@U0U/U/U?U@UAU1U0U0U@UAU2U"U1U1UAU2UCU3U2U2UBUCUDU4U3U3UCUDU5U4UDUDUEU5U6U5UEUEUFU6U7U6UFUFUGU7U8U7UGUGUHU8U9U8UHUHUIU9U:U9UIUIUJU:UKU;U:UKU:UJULUU=U=UMUNUOU?U>U>UNUOUPU@UOU@U?UOUQUAUPUAU@UPUBU2UQU2UAUQUSUCUBUBURUSUTUDUCUCUSUTUUUEUDUDUTUUUFUEUUUUUVUFUWUGUFUWUFUVUHUGUWUWUXUHUIUHUXUXUYUIUJUIUYUYUZUJU[UKUJU[UJUZU\ULUKU\UKU[U]UMULU]ULU\U^UNU]UNUMU]U_UOU^UOUNU^U`UPU_UPUOU_UaUQU`UQUPU`URUBUaUBUQUaUSURUbUbUcUSUdUTUSUSUcUdUeUUUTUTUdUeUVUUUeUeUfUVUWUVUfUfUgUWUXUWUgUgUhUXUYUXUhUhUiUYUZUYUiUiUjUZUkU[UZUkUZUjUlU\U[UlU[UkUmU]U\UmU\UlUnU^UmU^U]UmUoU_U^U^UnUoUpU`U_U_UoUpUqUaU`U`UpUqUbURUaUaUqUbUUtUuUuUUU UUuU UuUvUU UvUUvUwUtUUUtUUwUUUxUUxUyUUUyUUyUzUUUzUUzU{UxUUUxUU{U.Uz{{-U.UU-U{{|UUUU|UU|U}Uz.UUzU}U/U~UUU.U/UU.UUUUUUUUUUU~U/UU~UUUtUUUUuUtUvUuUUuUUUwUvUUwUUUtUwUUUUtUyUxUUyUUUzUyUUyUUU{UzUUzUUUxU{UUUUxUU|U{{U}U|UU}UUUz}UUUzU~UUUUUUUUUUUUUUUUU~UUUUU~UVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUUVUVUVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVUUUUVUVVUUVUVVVUUVUVUUVUVVUUVUVVUV V VUUVUUVU V{UU{U VUU{U{|UU|U| V VUU VU VUU VU V VUU VU VVUVVVUU VUU VUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVV VVVVV{ V VV V|V V V VVVV V V VV VVVV VV VVVVVVVVV VVVVV VVVVVV VV V!VV!V"VV"V#VV#V$VV$V%VV%V&VV&V'VV'V(VV(V)VV)V*VV*V+VV+V,VV,V-V-VVVV~VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV~VV/VV.VVV.V0V V/V VV/V1V!V0V!V V0V"V!V1V1V2V"V#V"V2V2V3V#V$V#V3V3V4V$V%V$V4V4V5V%V&V%V5V5V6V&V7V'V&V&V6V7V(V'V7V7V8V(V)V(V8V8V9V)VVVVVVVVVVVVVV/V.V>V@V0V?V0V/V?VAV1V@V1V0V@VBV2VAV2V1VAVCV3V2VCV2VBVDV4V3VDV3VCVEV5V4VEV4VDVFV6V5VFV5VEV7V6VFVFVGV7V8V7VGVGVHV8V9V8VHVHVIV9VVVVVVVVVVLVV.V=V=VMV>VOV?VNV?V>VNVPV@VOV@V?VOVQVAVPVAV@VPVBVAVQVQVRVBVCVBVRVRVSVCVTVDVCVTVCVSVUVEVDVUVDVTVVVFVEVVVEVUVGVFVVVVVWVGVHVGVWVWVXVHVYVIVHVHVXVYVZVJVIVIVYVZV[VKVJVJVZV[V\VLVKVKV[V\V]VMVLVLV\V]VNV>VMVMV]VNV_VOVNVNV^V_V`VPVOVOV_V`VQVPV`V`VaVQVRVQVaVaVbVRVSVRVbVbVcVSVTVSVcVcVdVTVUVTVdVdVeVUVVVUVeVeVfVVVgVWVVVgVVVfVhVXVWVhVWVgViVYVXViVXVhVjVZVYVYViVjVkV[VZVZVjVkVlV\VkV\V[VkVmV]VlV]V\VlV^VNVmVNV]VmVoV_V^V^VnVoVpV`V_V_VoVpVqVaV`V`VpVqVbVaVqVqVrVbVsVcVbVsVbVrVdVcVsVsVtVdVeVdVtVtVuVeVfVeVuVuVvVfVwVgVfVwVfVvVxVhVgVxVgVwVyViVhVyVhVxVzVjVyVjViVyV{VkVzVkVjVzV|VlV{VlVkV{V}VmV|VmVlV|VnV^V}V^VmV}VoVnV~V~VVoVVpVoVoVVVVqVpVpVVVrVqVVVVrVsVrVVVVsVtVsVVVVtVuVtVVVVuVvVuVVVVvVVwVvVVvVVVxVwVVwVVVyVxVVxVVVzVVzVyVVV{VzVzVVVV|V{V{VVVV}V|V|VVV~VnV}V}VV~V:VVVV9V:V)V9VV)VVV*V)VV*VVVV:V*VV*VV:V;VV:VVV*V:VV*VVV+V*VV+VVVV;V+VV+VVJVVVVIVJV9VIVVV|9V:V9V|:V|}VJV:VV:V}KVVVVJVKV:VJVV:VVVV;V:VV:VVVKV;VV;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV|VVVV}VVVVVVVVVVVVVVVVVVVVVVVVVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVWVVVVW W WWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV.W-W,W,W/W.W3W2W1W1W0W3WVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV5W4W4W9W8W7W7W6W9WVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWVVVVVWVVVWWWVVVWWVVWWWVWVVWVWWVVWVWWVVWVWVVWWWVVVWWWV WVV WVW WVV WV W WV WVV WVV WVV W WV WVV WWVVV WWWVWVVWWWWWVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWW W WW WWW WW W WW WVWV WWVWWWVVVVWVW WVV WV W!WWVVWV!WVV"WV"W#WVV#WV#W$WVV$WV$W%W"WVV"WV%WVz&W&WVVVV&WV&W'W}V'WVV'W}zVzVVV(W)W)WVVVV)WV)W*WV*W+W+WVV(WVV(WV+W-WWW-WW,W WW.WW-W.W!W W.W!W.W/WW!W/W/W,WW#W"W0W#W0W1W$W#W2W#W1W2W$W2W3W3W%W$W"W%W3W3W0W"W4W&Wz4Wz'W&W5W&W4W5W5W}5W}'W)W(W6W)W6W7W*W)W8W)W7W8W*W8W9W9W+W*W(W+W9W9W6W(WW:W;WW;WWW>W?WW?W@WW@WAWWAWBWWBWCWWCWDWWDWEWWEWFWWFWGWWGWHWWHWIWIW:WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKW;W:WKW:WJWLWW=WNW=WMW?W>WNWNWOW?WPW@W?WPW?WOWQWAW@WQW@WPWRWBWAWRWAWQWCWBWRWRWSWCWDWCWSWSWTWDWEWDWTWTWUWEWWWWWWWWWWWWWXWHWGWGWWWXWYWIWHWHWXWYWJW:WYW:WIWYW[WKWZWKWJWZW\WLW[WLWKW[W]WMW\WMWLW\W^WNW]WNWMW]W_WOW^WOWNW^W`WPWOW`WOW_WaWQWPWaWPW`WbWRWQWbWQWaWSWRWbWbWcWSWTWSWcWcWdWTWUWTWdWdWeWUWWWWWWWWWWhWXWWWWWgWhWiWYWXWXWhWiWZWJWYWYWiWZWkW[WjW[WZWjWlW\WkW\W[WkWmW]WlW]W\WlWnW^W]WnW]WmWoW_W^WoW^WnWpW`W_WpW_WoWqWaW`WqW`WpWrWbWaWrWaWqWcWbWrWrWsWcWdWcWsWsWtWdWeWdWtWtWuWeWvWfWuWfWeWuWwWgWvWgWfWvWxWhWwWhWgWwWyWiWhWhWxWyWjWZWiWiWyWjW{WkWjWjWzW{W|WlWkWkW{W|W}WmWlWlW|W}W~WnWmW~WmW}WWoWnWWnW~WWpWoWWoWWqWpWWWWqWrWqWWWWrWWsWrWWrWWWtWsWWsWWWuWtWWtWWWvWWvWuWWWwWWwWvWWWxWWxWwWWWyWWyWxWWzWjWWjWyWWW{WzWzWWWW|W{W{WWWW}W|W|WWWW~W}WW}WWWW~WW~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWzWWzWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWUWVWWWWUWEWUWWEWWWFWEWWEWWWWVWFWWFWWVWWWWWWVWFWVWWFWWWGWFWWFWWWWWWGWWGWWeWfWWWWeWUWeWWUWWWVWUWWUWWWWfWVWWVWWfWgW~~fWVWfWVWWWWVWWVWWW~gWWWWWW~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW~WWW~8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWW8XWWWW8X)X(X9X*X)X9X+X*X9X,X+X9X-X,X9X.X-X9X/X.X9X0X/X9X1X0X9X2X1X9X3X2X9X4X3X9X5X4X9X6X5X9X6X9X7X9X(X7XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWJXIXHXHXKXJXOXNXMXMXLXOXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRXQXPXPXSXRXUXTXUXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXWWWXXXWWWXXXWXWWWXXXWWWXXWWXXXWXWWWXXWWXXXWWWWWXW XWXWWXWW X X XWWW X X XWWW X X XW XWWW X XWW X XXWWWXXXWXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXWX XXXXXX X X XXXX XX X XXX XX X XXX X X XXXXX X XXXXXXXXXXXXX XX!XXX!XX X"XXX"XX!XXX"X"X#XXXX#X#X$XX%XXX%XX$X&XXX&XX%X'XX&XXX&XXX'XXX'X)XX(XXX(X*XXXX)X*X+XX*XXX*X,XX+XXX+X-XX,XXX,X.XXXX-X.XXX.X.X/XX XX/X/X0X X1X!X X1X X0X2X"X!X2X!X1X#X"X2X2X3X#X$X#X3X3X4X$X5X%X$X5X$X4X6X&X%X6X%X5X7X'X6X'X&X6X(XX7XX'X7XW:X;X;XWWWW;XW;XXW>X?XWW?XW?X@XWW@XW@XAX>XWW>XWAXWBXCXCXWWWWCXWCXDXWWDXWDXEXBXWWBXWEXWWWFXWWWWGXGXWWFXWWFXWGXIX;X:XIX:XHXXLX?XLXMX@X?XNX?XMXNX@XNXOXOXAX@X>XAXOXOXLX>XQXCXBXQXBXPXDXCXRXCXQXRXEXDXRXEXRXSXBXEXSXSXPXBXTXFXTXUXGXUXFXGXUXUXTXFXXVXWXXWXXXXXXYXXYXZXXZX[XX[X\XX\X]XX]X^XX^X_XX_X`XX`XaXXaXbXXbXcXXcXdXXdXeXeXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgXWXVXgXVXfXhXXXWXhXWXgXiXYXXXiXXXhXjXZXYXjXYXiX[XZXjXjXkX[XlX\X[XlX[XkXmX]X\XmX\XlXnX^X]XnX]XmX_X^XnXnXoX_X`X_XoXoXpX`XaX`XpXpXqXaXXXXXXXXXXXXXtXdXcXtXcXsXuXeXtXeXdXtXfXVXuXVXeXuXwXgXvXgXfXvXxXhXwXhXgXwXyXiXxXiXhXxXzXjXyXjXiXyX{XkXzXkXjXzX|XlXkX|XkX{X}XmXlX}XlX|X~XnXmX~XmX}XoXnX~X~XXoXpXoXXXXpXqXpXXXXqXXXXXXXXXXXtXsXsXXXXuXtXtXXXvXfXuXuXXvXXwXXwXvXXXxXXxXwXXXyXXyXxXXXzXyXXyXXX{XzXXzXXX|X{XX{XXX}X|XX|XXX~X}XX}XXXX~XX~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXqXrXXXXqXaXqXXaXXXbXaXXaXXXXrXbXXbXXrXsXXXXrXbXrXXbXXXcXbXXbXXXXsXcXXcXXXXXXXXqXXXqXXXrXqXXqXXXXXrXXrXXXXXXXXrXXrXXXsXrXrXXXsXsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXTYXXXXTYEYDYUYFYEYUYGYFYUYHYGYUYIYHYUYJYIYUYKYJYUYLYKYUYMYLYUYNYMYUYOYNYUYPYOYUYQYPYUYRYQYUYRYUYSYUYDYSYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgYfYdYfYeYdYkYjYiYkYiYhYYXXXYYYXXXYYXXXXYXYXXXYYYXXXYYYXXXYYYXYXXY YXYXXY YX YXX Y YX YXX YXX Y Y YX YXX YX YYXXYX YYXXYXYnYmYlYlYoYnYqYpYpYYYYYYYYYYYYYYXYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YY YYYY YY Y YY Y YYYY Y Y YYYY Y Y YYYY YYY YY YYYYYYYY YYY YYYYY Y Y!YYYY!Y!Y"YY#YYYY"Y#YYYYY#YY%YYYY$Y%Y&YY%YYY%Y'YY&YYY&Y(YY'YYY'Y)YYYY(Y)Y*YYYY)Y*YYY*Y*Y+YYYY+Y+Y,YY-YYY-YY,YYY-Y-Y.YYYY.Y.Y/YY0Y YY0YY/Y1Y!Y Y1Y Y0Y2Y"Y!Y2Y!Y1Y3Y#Y2Y#Y"Y2Y$YY#Y#Y3Y$Y5Y%Y4Y%Y$Y4Y6Y&Y5Y&Y%Y5Y7Y'Y6Y'Y&Y6Y8Y(Y7Y(Y'Y7Y9Y)Y(Y(Y8Y9Y:Y*Y)Y)Y9Y:Y;Y+Y*Y*Y:Y;YY.Y/Y.Y>Y>Y?Y/Y@Y0Y/Y@Y/Y?YAY1Y0YAY0Y@YBY2Y1YBY1YAYCY3Y2YCY2YBY4Y$YCY$Y3YCYEY5YDY5Y4YDYFY6YEY6Y5YEYGY7YFY7Y6YFY8Y7YGYGYHY8Y9Y8YHYHYIY9Y:Y9YIYIYJY:Y;Y:YJYJYKY;YLYY=YMYMYNY>Y?Y>YNYNYOY?YPY@Y?YPY?YOYQYAY@YQY@YPYRYBYAYRYAYQYSYCYBYSYBYRYDY4YSY4YCYSYXYVYXVYWYXXWYXWYXYXXYYYYYXXVYYXVYXYYYYZYYZY[YXY[YX[Y\YX\Y]Y]YXXZYYXZYX]YYY^YY^Y_YXY_YX_Y`YX`YaYaYYX^YYY^YYaYYY~Y~bYYYbYYbYcYYYYcY~Y~YYeYWYVYeYVYdYfYXYWYfYWYeYYYXYfYYYfYgYVYYYgYgYdYVY[YZYhYhYiY[Y\Y[YjY[YiYjY]Y\YkY\YjYkYZY]YkYkYhYZYmY_Y^YmY^YlY`Y_YnY_YmYnYaY`YnYaYnYoY^YaYoYoYlY^YbY~pYbYcYbYqYbYpYqYcYcYqY0Aedefault  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##################################################################################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&%&&&'&(&)&*&+&,&-&.&/&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?&@&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&^&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''''''''' ' ' ' ' ''''''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}'~''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''((((((((( ( ( ( ( ((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@)A)B)C)D)E)F)G)H)I)J)K)L)M)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])^)_)`)a)b)c)d)e)f)g)h)i)j)k)l)m)n)o)p)q)r)s)t)u)v)w)x)y)z){)|)})~))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))********* * * * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**********************************************************************************************************************************+++++++++ + + + + +++++++++++++++++++ +!+"+#+$+%+&+'+(+)+*+++,+-+.+/+0+1+2+3+4+5+6+7+8+9+:+;+<+=+>+?+@+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+\+]+^+_+`+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|+}+~++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - ------------------- -!-"-#-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-{-|-}-~----------------------------------------------------------------------------------------------------------------------------------......... . . . . ................... .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].^._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~..................................................................................................................................///////// / / / / /////////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/7/8/9/:/;//?/@/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/[/\/]/^/_/`/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/{/|/}/~//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////000000000 0 0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111 1 1 1 1 1111111111111111111 1!1"1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1[1\1]1^1_1`1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|1}1~1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222 2 2 2 2 2222222222222222222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728292:2;2<2=2>2?2@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2`2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333 3 3 3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555 5 5 5 5 5555555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666 6 6 6 6 6666666666666666666 6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777888888888 8 8 8 8 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999::::::::: : : : : ::::::::::::::::::: :!:":#:$:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:5:6:7:8:9:::;:<:=:>:?:@:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:{:|:}:~::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;; ;!;";#;$;%;&;';(;);*;+;,;-;.;/;0;1;2;3;4;5;6;7;8;9;:;;;<;=;>;?;@;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];^;_;`;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;{;|;};~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<< < < < < <<<<<<<<<<<<<<<<<<< =?=@=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=^=_=`=a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}=~==================================================================================================================================>>>>>>>>> > > > > >>>>>>>>>>>>>>>>>>> >!>">#>$>%>&>'>(>)>*>+>,>->.>/>0>1>2>3>4>5>6>7>8>9>:>;><>=>>>?>@>A>B>C>D>E>F>G>H>I>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>^>_>`>a>b>c>d>e>f>g>h>i>j>k>l>m>n>o>p>q>r>s>t>u>v>w>x>y>z>{>|>}>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????? ? ? ? ? ??????????????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;????@?A?B?C?D?E?F?G?H?I?J?K?L?M?N?O?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?^?_?`?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?{?|?}?~??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@@ @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@`@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@{@|@}@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAA A A A A AAAAAAAAAAAAAAAAAAA A!A"A#A$A%A&A'A(A)A*A+A,A-A.A/A0A1A2A3A4A5A6A7A8A9A:A;AA?A@AAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA[A\A]A^A_A`AaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzA{A|A}A~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBB B B B B BBBBBBBBBBBBBBBBBBB B!B"B#B$B%B&B'B(B)B*B+B,B-B.B/B0B1B2B3B4B5B6B7B8B9B:B;BB?B@BABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB[B\B]B^B_B`BaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzB{B|B}B~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCC C C C C CCCCCCCCCCCCCCCCCCC C!C"C#C$C%C&C'C(C)C*C+C,C-C.C/C0C1C2C3C4C5C6C7C8C9C:C;CC?C@CACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC[C\C]C^C_C`CaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzC{C|C}C~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDD D D D D DDDDDDDDDDDDDDDDDDD D!D"D#D$D%D&D'D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD?D@DADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD[D\D]D^D_D`DaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzD{D|D}D~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEE E E E E EEEEEEEEEEEEEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E,E-E.E/E0E1E2E3E4E5E6E7E8E9E:E;EE?E@EAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE[E\E]E^E_E`EaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzE{E|E}E~EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFF F F F F FFFFFFFFFFFFFFFFFFF F!F"F#F$F%F&F'F(F)F*F+F,F-F.F/F0F1F2F3F4F5F6F7F8F9F:F;FF?F@FAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF[F\F]F^F_F`FaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzF{F|F}F~FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGG G G G G GGGGGGGGGGGGGGGGGGG G!G"G#G$G%G&G'G(G)G*G+G,G-G.G/G0G1G2G3G4G5G6G7G8G9G:G;GG?G@GAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG[G\G]G^G_G`GaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzG{G|G}G~GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHH H H H H HHHHHHHHHHHHHHHHHHH H!H"H#H$H%H&H'H(H)H*H+H,H-H.H/H0H1H2H3H4H5H6H7H8H9H:H;HH?H@HAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH[H\H]H^H_H`HaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzH{H|H}H~HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIII I I I I IIIIIIIIIIIIIIIIIII I!I"I#I$I%I&I'I(I)I*I+I,I-I.I/I0I1I2I3I4I5I6I7I8I9I:I;II?I@IAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI[I\I]I^I_I`IaIbIcIdIeIfIgIhIiIjIkIlImInIoIpIqIrIsItIuIvIwIxIyIzI{I|I}I~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJ J J J J JJJJJJJJJJJJJJJJJJJ J!J"J#J$J%J&J'J(J)J*J+J,J-J.J/J0J1J2J3J4J5J6J7J8J9J:J;JJ?J@JAJBJCJDJEJFJGJHJIJJJKJLJMJNJOJPJQJRJSJTJUJVJWJXJYJZJ[J\J]J^J_J`JaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJwJxJyJzJ{J|J}J~JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKK K K K K KKKKKKKKKKKKKKKKKKK K!K"K#K$K%K&K'K(K)K*K+K,K-K.K/K0K1K2K3K4K5K6K7K8K9K:K;KK?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLL L L L L LLLLLLLLLLLLLLLLLLL L!L"L#L$L%L&L'L(L)L*L+L,L-L.L/L0L1L2L3L4L5L6L7L8L9L:L;LL?L@LALBLCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZL[L\L]L^L_L`LaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLzL{L|L}L~LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMM M M M M MMMMMMMMMMMMMMMMMMM M!M"M#M$M%M&M'M(M)M*M+M,M-M.M/M0M1M2M3M4M5M6M7M8M9M:M;MM?M@MAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZM[M\M]M^M_M`MaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMrMsMtMuMvMwMxMyMzM{M|M}M~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNN N N N N NNNNNNNNNNNNNNNNNNN N!N"N#N$N%N&N'N(N)N*N+N,N-N.N/N0N1N2N3N4N5N6N7N8N9N:N;NN?N@NANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN[N\N]N^N_N`NaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzN{N|N}N~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOO O O O O OOOOOOOOOOOOOOOOOOO O!O"O#O$O%O&O'O(O)O*O+O,O-O.O/O0O1O2O3O4O5O6O7O8O9O:O;OO?O@OAOBOCODOEOFOGOHOIOJOKOLOMONOOOPOQOROSOTOUOVOWOXOYOZO[O\O]O^O_O`OaObOcOdOeOfOgOhOiOjOkOlOmOnOoOpOqOrOsOtOuOvOwOxOyOzO{O|O}O~OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPP P P P P PPPPPPPPPPPPPPPPPPP P!P"P#P$P%P&P'P(P)P*P+P,P-P.P/P0P1P2P3P4P5P6P7P8P9P:P;PP?P@PAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZP[P\P]P^P_P`PaPbPcPdPePfPgPhPiPjPkPlPmPnPoPpPqPrPsPtPuPvPwPxPyPzP{P|P}P~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQ Q Q Q Q QQQQQQQQQQQQQQQQQQQ Q!Q"Q#Q$Q%Q&Q'Q(Q)Q*Q+Q,Q-Q.Q/Q0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q:Q;QQ?Q@QAQBQCQDQEQFQGQHQIQJQKQLQMQNQOQPQQQRQSQTQUQVQWQXQYQZQ[Q\Q]Q^Q_Q`QaQbQcQdQeQfQgQhQiQjQkQlQmQnQoQpQqQrQsQtQuQvQwQxQyQzQ{Q|Q}Q~QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRR R R R R RRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R5R6R7R8R9R:R;RR?R@RARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR[R\R]R^R_R`RaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRyRzR{R|R}R~RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSS S S S S SSSSSSSSSSSSSSSSSSS S!S"S#S$S%S&S'S(S)S*S+S,S-S.S/S0S1S2S3S4S5S6S7S8S9S:S;SS?S@SASBSCSDSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZS[S\S]S^S_S`SaSbScSdSeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSxSySzS{S|S}S~SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTT T T T T TTTTTTTTTTTTTTTTTTT T!T"T#T$T%T&T'T(T)T*T+T,T-T.T/T0T1T2T3T4T5T6T7T8T9T:T;TT?T@TATBTCTDTETFTGTHTITJTKTLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT[T\T]T^T_T`TaTbTcTdTeTfTgThTiTjTkTlTmTnToTpTqTrTsTtTuTvTwTxTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUU U U U U UUUUUUUUUUUUUUUUUUU U!U"U#U$U%U&U'U(U)U*U+U,U-U.U/U0U1U2U3U4U5U6U7U8U9U:U;UU?U@UAUBUCUDUEUFUGUHUIUJUKULUMUNUOUPUQURUSUTUUUVUWUXUYUZU[U\U]U^U_U`UaUbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvUwUxUyUzU{U|U}U~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVV V V V V VVVVVVVVVVVVVVVVVVV V!V"V#V$V%V&V'V(V)V*V+V,V-V.V/V0V1V2V3V4V5V6V7V8V9V:V;VV?V@VAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZV[V\V]V^V_V`VaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzV{V|V}V~VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWW W W W W WWWWWWWWWWWWWWWWWWW W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W0W1W2W3W4W5W6W7W8W9W:W;WW?W@WAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWSWTWUWVWWWXWYWZW[W\W]W^W_W`WaWbWcWdWeWfWgWhWiWjWkWlWmWnWoWpWqWrWsWtWuWvWwWxWyWzW{W|W}W~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXXXXXXX X X X X XXXXXXXXXXXXXXXXXXX X!X"X#X$X%X&X'X(X)X*X+X,X-X.X/X0X1X2X3X4X5X6X7X8X9X:X;XX?X@XAXBXCXDXEXFXGXHXIXJXKXLXMXNXOXPXQXRXSXTXUXVXWXXXYXZX[X\X]X^X_X`XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX{X|X}X~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYY Y Y Y Y YYYYYYYYYYYYYYYYYYY Y!Y"Y#Y$Y%Y&Y'Y(Y)Y*Y+Y,Y-Y.Y/Y0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y:Y;YY?Y@YAYBYCYDYEYFYGYHYIYJYKYLYMYNYOYPYQYRYSYTYUYVYWYXYYYZY[Y\Y]Y^Y_Y`YaYbYcYdYeYfYgYhYiYjYkYlYmYnYoYpYqYrYsYtYuYvYwYxYyYzY{Y|Y}Y~YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZ Z Z Z Z ZZZZZZZZZZZZZZZZZZZ Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*Z+Z,Z-Z.Z/Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9Z:Z;ZZ?Z@ZAZBZCZDZEZFZGZHZIZJZKZLZMZNZOZPZQZRZSZTZUZVZWZXZYZZZ[Z\Z]Z^Z_Z`ZaZbZcZdZeZfZgZhZiZjZkZlZmZnZoZpZqZrZsZtZuZvZwZxZyZzZ{Z|Z}Z~ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[ [ [ [ [ [[[[[[[[[[[[[[[[[[[ [!["[#[$[%[&['[([)[*[+[,[-[.[/[0[1[2[3[4[5[6[7[8[9[:[;[<[=[>[?[@[A[B[C[D[E[F[G[H[I[J[K[L[M[N[O[P[Q[R[S[T[U[V[W[X[Y[Z[[[\[][^[_[`[a[b[c[d[e[f[g[h[i[j[k[l[m[n[o[p[q[r[s[t[u[v[w[x[y[z[{[|[}[~[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]]] ] ] ] ] ]]]]]]]]]]]]]]]]]]] ]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^^^^^^^ ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^ ^!^"^#^$^%^&^'^(^)^*^+^,^-^.^/^0^1^2^3^4^5^6^7^8^9^:^;^<^=^>^?^@^A^B^C^D^E^F^G^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_^`^a^b^c^d^e^f^g^h^i^j^k^l^m^n^o^p^q^r^s^t^u^v^w^x^y^z^{^|^}^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_________ _ _ _ _ ___________________ _!_"_#_$_%_&_'_(_)_*_+_,_-_._/_0_1_2_3_4_5_6_7_8_9_:_;_<_=_>_?_@_A_B_C_D_E_F_G_H_I_J_K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_[_\_]_^___`_a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z_{_|_}_~__________________________________________________________________________________________________________________________________````````` ` ` ` ` ``````````````````` `!`"`#`$`%`&`'`(`)`*`+`,`-`.`/`0`1`2`3`4`5`6`7`8`9`:`;`<`=`>`?`@`A`B`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_```a`b`c`d`e`f`g`h`i`j`k`l`m`n`o`p`q`r`s`t`u`v`w`x`y`z`{`|`}`~``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````aaaaaaaaa a a a a aaaaaaaaaaaaaaaaaaa a!a"a#a$a%a&a'a(a)a*a+a,a-a.a/a0a1a2a3a4a5a6a7a8a9a:a;aa?a@aAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa[a\a]a^a_a`aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayaza{a|a}a~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbb b b b b bbbbbbbbbbbbbbbbbbb b!b"b#b$b%b&b'b(b)b*b+b,b-b.b/b0b1b2b3b4b5b6b7b8b9b:b;bb?b@bAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb[b\b]b^b_b`babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzb{b|b}b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccc c c c c ccccccccccccccccccc c!c"c#c$c%c&c'c(c)c*c+c,c-c.c/c0c1c2c3c4c5c6c7c8c9c:c;cc?c@cAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc[c\c]c^c_c`cacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczc{c|c}c~ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeee e e e e eeeeeeeeeeeeeeeeeee e!e"e#e$e%e&e'e(e)e*e+e,e-e.e/e0e1e2e3e4e5e6e7e8e9e:e;ee?e@eAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe[e\e]e^e_e`eaebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze{e|e}e~eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffff f f f f fffffffffffffffffff f!f"f#f$f%f&f'f(f)f*f+f,f-f.f/f0f1f2f3f4f5f6f7f8f9f:f;ff?f@fAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf[f\f]f^f_f`fafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf{f|f}f~ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggg g g g g ggggggggggggggggggg g!g"g#g$g%g&g'g(g)g*g+g,g-g.g/g0g1g2g3g4g5g6g7g8g9g:g;gg?g@gAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg[g\g]g^g_g`gagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzg{g|g}g~gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggghhhhhhhhh h h h h hhhhhhhhhhhhhhhhhhh h!h"h#h$h%h&h'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;hh?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\h]h^h_h`hahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjj j j j j jjjjjjjjjjjjjjjjjjj j!j"j#j$j%j&j'j(j)j*j+j,j-j.j/j0j1j2j3j4j5j6j7j8j9j:j;jj?j@jAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj[j\j]j^j_j`jajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkk k k k k kkkkkkkkkkkkkkkkkkk k!k"k#k$k%k&k'k(k)k*k+k,k-k.k/k0k1k2k3k4k5k6k7k8k9k:k;kk?k@kAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk[k\k]k^k_k`kakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzk{k|k}k~kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllll l l l l lllllllllllllllllll l!l"l#l$l%l&l'l(l)l*l+l,l-l.l/l0l1l2l3l4l5l6l7l8l9l:l;ll?l@lAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl[l\l]l^l_l`lalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzl{l|l}l~llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllmmmmmmmmm m m m m mmmmmmmmmmmmmmmmmmm m!m"m#m$m%m&m'm(m)m*m+m,m-m.m/m0m1m2m3m4m5m6m7m8m9m:m;mm?m@mAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm[m\m]m^m_m`mambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzm{m|m}m~mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnn n n n n nnnnnnnnnnnnnnnnnnn n!n"n#n$n%n&n'n(n)n*n+n,n-n.n/n0n1n2n3n4n5n6n7n8n9n:n;nn?n@nAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn[n\n]n^n_n`nanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynzn{n|n}n~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooooooooo o o o o ooooooooooooooooooo o!o"o#o$o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o5o6o7o8o9o:o;oo?o@oAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`oaobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozo{o|o}o~ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooppppppppp p p p p ppppppppppppppppppp p!p"p#p$p%p&p'p(p)p*p+p,p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;pp?p@pApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp[p\p]p^p_p`papbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzp{p|p}p~ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppqqqqqqqqq q q q q qqqqqqqqqqqqqqqqqqq q!q"q#q$q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q5q6q7q8q9q:q;qq?q@qAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;rr?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsssssssss s s s s sssssssssssssssssss s!s"s#s$s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s5s6s7s8s9s:s;ss?s@sAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszs{s|s}s~ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssttttttttt t t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t0t1t2t3t4t5t6t7t8t9t:t;tt?t@tAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtZt[t\t]t^t_t`tatbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytzt{t|t}t~ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttuuuuuuuuu u u u u uuuuuuuuuuuuuuuuuuu u!u"u#u$u%u&u'u(u)u*u+u,u-u.u/u0u1u2u3u4u5u6u7u8u9u:u;uu?u@uAuBuCuDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu[u\u]u^u_u`uaubucudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzu{u|u}u~uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvv v v v v vvvvvvvvvvvvvvvvvvv v!v"v#v$v%v&v'v(v)v*v+v,v-v.v/v0v1v2v3v4v5v6v7v8v9v:v;vv?v@vAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv[v\v]v^v_v`vavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzv{v|v}v~vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwww w w w w wwwwwwwwwwwwwwwwwww w!w"w#w$w%w&w'w(w)w*w+w,w-w.w/w0w1w2w3w4w5w6w7w8w9w:w;ww?w@wAwBwCwDwEwFwGwHwIwJwKwLwMwNwOwPwQwRwSwTwUwVwWwXwYwZw[w\w]w^w_w`wawbwcwdwewfwgwhwiwjwkwlwmwnwowpwqwrwswtwuwvwwwxwywzw{w|w}w~wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxx x x x x xxxxxxxxxxxxxxxxxxx x!x"x#x$x%x&x'x(x)x*x+x,x-x.x/x0x1x2x3x4x5x6x7x8x9x:x;xx?x@xAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx[x\x]x^x_x`xaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyy y y y y yyyyyyyyyyyyyyyyyyy y!y"y#y$y%y&y'y(y)y*y+y,y-y.y/y0y1y2y3y4y5y6y7y8y9y:y;yy?y@yAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy[y\y]y^y_y`yaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzy{y|y}y~yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzz z z z z zzzzzzzzzzzzzzzzzzz z!z"z#z$z%z&z'z(z)z*z+z,z-z.z/z0z1z2z3z4z5z6z7z8z9z:z;zz?z@zAzBzCzDzEzFzGzHzIzJzKzLzMzNzOzPzQzRzSzTzUzVzWzXzYzZz[z\z]z^z_z`zazbzczdzezfzgzhzizjzkzlzmznzozpzqzrzsztzuzvzwzxzyzzz{z|z}z~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{ { { { { {{{{{{{{{{{{{{{{{{{ {!{"{#{${%{&{'{({){*{+{,{-{.{/{0{1{2{3{4{5{6{7{8{9{:{;{<{={>{?{@{A{B{C{D{E{F{G{H{I{J{K{L{M{N{O{P{Q{R{S{T{U{V{W{X{Y{Z{[{\{]{^{_{`{a{b{c{d{e{f{g{h{i{j{k{l{m{n{o{p{q{r{s{t{u{v{w{x{y{z{{{|{}{~{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||| | | | | ||||||||||||||||||| |!|"|#|$|%|&|'|(|)|*|+|,|-|.|/|0|1|2|3|4|5|6|7|8|9|:|;|<|=|>|?|@|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|[|\|]|^|_|`|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|{|||}|~||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}} } } } } }}}}}}}}}}}}}}}}}}} }!}"}#}$}%}&}'}(})}*}+},}-}.}/}0}1}2}3}4}5}6}7}8}9}:};}<}=}>}?}@}A}B}C}D}E}F}G}H}I}J}K}L}M}N}O}P}Q}R}S}T}U}V}W}X}Y}Z}[}\}]}^}_}`}a}b}c}d}e}f}g}h}i}j}k}l}m}n}o}p}q}r}s}t}u}v}w}x}y}z}{}|}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~~~~ ~!~"~#~$~%~&~'~(~)~*~+~,~-~.~/~0~1~2~3~4~5~6~7~8~9~:~;~<~=~>~?~@~A~B~C~D~E~F~G~H~I~J~K~L~M~N~O~P~Q~R~S~T~U~V~W~X~Y~Z~[~\~]~^~_~`~a~b~c~d~e~f~g~h~i~j~k~l~m~n~o~p~q~r~s~t~u~v~w~x~y~z~{~|~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀӀԀՀր׀؀ـڀۀ܀݀ހ߀  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‚ÂĂłƂǂȂɂʂ˂̂͂΂ςЂт҂ӂԂՂւׂ؂قڂۂ܂݂ނ߂  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒÃăŃƃǃȃɃʃ˃̃̓΃σЃу҃ӃԃՃփ׃؃كڃۃ܃݃ރ߃  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~„ÄĄńƄDŽȄɄʄ˄̄̈́΄τЄф҄ӄԄՄքׄ؄لڄۄ܄݄ބ߄  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~…ÅąŅƅDžȅɅʅ˅̅ͅ΅υЅх҅ӅԅՅօׅ؅مڅۅ܅݅ޅ߅  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~†ÆĆņƆdžȆɆʆˆ̆͆ΆφІц҆ӆԆՆֆ׆؆نچۆ܆݆ކ߆  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‡ÇćŇƇLJȇɇʇˇ͇̇·χЇч҇ӇԇՇևׇ؇هڇۇ܇݇އ߇  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ˆÈĈňƈLjȈɈʈˈ͈̈ΈψЈш҈ӈԈՈֈ׈؈وڈۈ܈݈ވ߈  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‰ÉĉʼnƉljȉɉʉˉ͉̉ΉωЉщ҉ӉԉՉ։׉؉ىډۉ܉݉މ߉  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ŠÊĊŊƊNJȊɊʊˊ̊͊ΊϊЊъҊӊԊՊ֊׊؊يڊۊ܊݊ފߊ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‹ËċŋƋNjȋɋʋˋ̋͋΋ϋЋыҋӋԋՋ֋׋؋ًڋۋ܋݋ދߋ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ŒÌČŌƌnjȌɌʌˌ̌͌ΌόЌьҌӌԌՌ֌׌،ٌڌی܌݌ތߌ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÍčōƍǍȍɍʍˍ͍̍΍ύЍэҍӍԍՍ֍׍؍ٍڍۍ܍ݍލߍ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ŽÎĎŎƎǎȎɎʎˎ͎̎ΎώЎюҎӎԎՎ֎׎؎َڎێ܎ݎގߎ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÏďŏƏǏȏɏʏˏ̏͏ΏϏЏяҏӏԏՏ֏׏؏ُڏۏ܏ݏޏߏ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÐĐŐƐǐȐɐʐː̐͐ΐϐАѐҐӐԐՐ֐אِؐڐېܐݐސߐ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‘ÑđőƑǑȑɑʑˑ̑͑ΑϑБёґӑԑՑ֑בّؑڑۑܑݑޑߑ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~’ÒĒŒƒǒȒɒʒ˒̒͒ΒϒВђҒӒԒՒ֒גْؒڒےܒݒޒߒ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~“ÓēœƓǓȓɓʓ˓͓̓ΓϓГѓғӓԓՓ֓דؓٓړۓܓݓޓߓ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~”ÔĔŔƔǔȔɔʔ˔͔̔ΔϔДєҔӔԔՔ֔הؔٔڔ۔ܔݔޔߔ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~•ÕĕŕƕǕȕɕʕ˕͕̕ΕϕЕѕҕӕԕՕ֕וٕؕڕەܕݕޕߕ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~–ÖĖŖƖǖȖɖʖ˖̖͖ΖϖЖіҖӖԖՖ֖זٖؖږۖܖݖޖߖ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~—×ėŗƗǗȗɗʗ˗̗͗ΗϗЗїҗӗԗ՗֗חؗٗڗۗܗݗޗߗ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~˜ØĘŘƘǘȘɘʘ˘̘͘ΘϘИјҘӘԘ՘֘טؘ٘ژۘܘݘޘߘ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~™ÙęřƙǙșəʙ˙̙͙ΙϙЙљҙәԙՙ֙יؙٙڙۙܙݙޙߙ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~šÚĚŚƚǚȚɚʚ˚͚̚ΚϚКњҚӚԚ՚֚ךؚٚښۚܚݚޚߚ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~›ÛěśƛǛțɛʛ˛̛͛ΛϛЛћқӛԛ՛֛כ؛ٛڛۛܛݛޛߛ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~œÜĜŜƜǜȜɜʜ˜̜͜ΜϜМќҜӜԜ՜֜ל؜ٜڜۜܜݜޜߜ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÝĝŝƝǝȝɝʝ˝̝͝ΝϝНѝҝӝԝ՝֝ם؝ٝڝ۝ܝݝޝߝ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~žÞĞŞƞǞȞɞʞ˞̞͞ΞϞОўҞӞԞ՞֞מ؞ٞڞ۞ܞݞޞߞ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ŸßğşƟǟȟɟʟ˟̟͟ΟϟПџҟӟԟ՟֟ן؟ٟڟ۟ܟݟޟߟ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ àĠŠƠǠȠɠʠˠ̠͠ΠϠРѠҠӠԠՠ֠נؠ٠ڠ۠ܠݠޠߠ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡áġšơǡȡɡʡˡ̡͡ΡϡСѡҡӡԡա֡סء١ڡۡܡݡޡߡ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢âĢŢƢǢȢɢʢˢ̢͢΢ϢТѢҢӢԢբ֢עآ٢ڢۢܢݢޢߢ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~£ãģţƣǣȣɣʣˣ̣ͣΣϣУѣңӣԣգ֣ףأ٣ڣۣܣݣޣߣ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¤äĤŤƤǤȤɤʤˤ̤ͤΤϤФѤҤӤԤդ֤פؤ٤ڤۤܤݤޤߤ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¥åĥťƥǥȥɥʥ˥̥ͥΥϥХѥҥӥԥե֥ץإ٥ڥۥܥݥޥߥ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¦æĦŦƦǦȦɦʦ˦̦ͦΦϦЦѦҦӦԦզ֦צئ٦ڦۦܦݦަߦ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~§çħŧƧǧȧɧʧ˧̧ͧΧϧЧѧҧӧԧէ֧קا٧ڧۧܧݧާߧ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¨èĨŨƨǨȨɨʨ˨̨ͨΨϨШѨҨӨԨը֨רب٨ڨۨܨݨިߨ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~©éĩũƩǩȩɩʩ˩̩ͩΩϩЩѩҩөԩթ֩שة٩ک۩ܩݩީߩ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ªêĪŪƪǪȪɪʪ˪̪ͪΪϪЪѪҪӪԪժ֪תت٪ڪ۪ܪݪުߪ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~«ëīūƫǫȫɫʫ˫̫ͫΫϫЫѫҫӫԫի֫׫ث٫ګ۫ܫݫޫ߫  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¬ìĬŬƬǬȬɬʬˬ̬ͬάϬЬѬҬӬԬլ֬׬ج٬ڬ۬ܬݬެ߬  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~­íĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~®îĮŮƮǮȮɮʮˮ̮ͮήϮЮѮҮӮԮծ֮׮خٮڮۮܮݮޮ߮  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¯ïįůƯǯȯɯʯ˯̯ͯίϯЯѯүӯԯկ֯ׯدٯگۯܯݯޯ߯  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~°ðİŰưǰȰɰʰ˰̰ͰΰϰаѰҰӰ԰հְװذٰڰ۰ܰݰް߰  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~±ñıűƱDZȱɱʱ˱̱ͱαϱбѱұӱԱձֱױرٱڱ۱ܱݱޱ߱  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~²òIJŲƲDzȲɲʲ˲̲ͲβϲвѲҲӲԲղֲײزٲڲ۲ܲݲ޲߲PAs3d-0.2.2.1/objs/xyz.3ds000066400000000000000000000333761361325167000145650ustar00rootroot00000000000000MM6 ==6>= default0  @0   P0   ?@text8A`A6???A$= @C? @C? @>? @>? @ >? @ >`? @?`? @?= @?= @?|> @?|> @?q? @?= @ >=qg@?qg@?qg@>?qg@>?qg@ >?qg@ >`?qg@?`?qg@?=qg@?=qg@?|>qg@?|>qg@?q?qg@?=qg@ >? @+?? @> @ @> @ @+??qg@+??qg@> @qg@> @qg@+? A@                     #""! !! !!"#"### 0Adefault@  !"#$%&'()*+,-./0123456789:;<=>?PA@text7A`A6???Ax4=?%??%?>?>? >? >`??`??=?=?|>?|>?q??= >=0%?0%?>?>? >? >`??`??=?=?|>?|>?q??= >@@? @? @=??=??? @? @;@@;@@? ;@? ;@=?@@=?@@? @? @=??=??? @? @;@@;@@? ;@? ;@=?@@=? A^`                    '!!$' ! $!""#$'&'$$%&0-*0*3)(33*)-0//.-103132+*--,+(()))*++* ++, -!  ,-"!--."/#""./0$##/01%$$012&%%123'&3&2(''3(0Adefault`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_PA@ text6A `A6???A@Lvh$?L`w#=L־`w#=L־LL`w#=L`w#=LF`f$Q?LP+$?LP+$?L<$?L><$?L>P+$?LδP+$?LB$n?LP+$?LP+$?L<$?L<$?LP+$?LP+$?L>$-?L>`w#=L`w#=LLnLn`w#=L.`w#=LvL>?LL>=L־L>=L־L>faLL>faLL>=LL>=LFL>Q?LL>?LL>?LL>?L>L>?L>L>?LδL>?LL>n?LL>?LL>?LL>?LL>?LL>?LL>?LL>-?L>L>=LL>=LL>faLnL>faLnL>=L.L>=L <$+?LS#>LfS#>Lf <$+?LL>+?LL>>LfL>>LfL>+? Ax        *#1#11772110+1+*"##)$##*).-++0.  "542527'&$$)'! "%$&('),+-/.0324657  ! !""!""###$ $$% &  %& &&' ( ( ' (() *  )***+++,-,---.//.//010121233233454565677677:;889:<?>>=<=98=8<:9==>:?;::>?8;??<80Adefaultx  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwPA@~ text5Ar `A6???APu@h$?E@`w#=@`w#=@]@]@`w#=@`w#=@`f$Q?-@P+$?@P+$?@<$?@<$?@P+$?@P+$?-@B$n?%@P+$?E@P+$?E@<$?@<$?@P+$?]@P+$?@>$-?@`w#=@`w#=@}@}@`w#=@`w#=u@L>?E@L>=@L>=@L>fa]@L>fa]@L>=@L>=@L>Q?-@L>?@L>?@L>?@L>?@L>?@L>?-@L>n?%@L>?E@L>?E@L>?@L>?@L>?]@L>?@L>-?@L>=@L>=@L>fa}@L>fa}@L>=@L>=@0 $?@0 $?@Q$=?5@Q$=?5@$?@$?@0 ;@0 ;@$?E@$?E@Q$=?@Q$=?@L>?@L>?@L>=?5@L>=?5@L>?@L>?@L>;@L>;@L>?E@L>?E@L>=?@L>=? An        *#1#11772110+1+*"##)$##*).-++0.  "542527'&$$)'! "%$&('),+-/.0324657  ! !""!""###$ $$% &  %& &&' ( ( ' (() *  )***+++,-,---.//.//010121233233454565677677C:@:=@=:;;<=?@==>?C899:CBCAC@ALIOIFOFEDFDOJILJLKMLNLONFIHHGF98DDE9F:9F9E;:FFG;H<;H;G=<HHI=>=IIJ>K?>>JKL@??KLA@LLMANBAAMNCBNNOCD8CCOD0A@default  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PAf@text4A`A6???A`2p=S ȾkɶMT?S ȾkɶMT?S Ⱦk "?S Ⱦk "?S Ⱦk١Ƅ?S Ⱦk٦?S Ⱦk٦?S Ⱦk!M>?S Ⱦk!M>?S Ⱦkc?S Ⱦk ?S Ⱦk6p>S Ⱦkd>S Ⱦkd>S Ⱦk!䚾S Ⱦk!䚾S Ⱦk96S Ⱦkd>S Ⱦkyd>S Ⱦkp=S Ⱦkp=GCkɶMT?GCkɶMT?GCk "?GCk "?GCk١Ƅ?GCk٦?GCk٦?GCk!M>?GCk!M>?GCkc?GCk ?GCk6p>GCkd>GCkd>GCk!䚾GCk!䚾GCk96GCkd>GCkyd>GCkp=GCk&?S Ⱦki&?S Ⱦk٩٦?S Ⱦk٩٦?S Ⱦki&?GCki&?GCk٩٦?GCk٩٦?GCki A&\             ''('&!'!   $#!$!&((()"!#%$& '        !  !!" #  "###$%%$%%&'&'(('(())-*++,-/.1/10/+*/*.,+//0,1-,,01*-11.*0Adefault\  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[PAv@N text3AB `A6???A B>]%rH@?]%rH@?Wpe%P@k?Wpe%P@k?%Rr@@?Eם%@ ?Eם%@ ?%@?%@?Eם%@@?Eם%@Y?J:%z@?Eם%@.?Eם%@.?%@%@Eם%@=Eם%@@ ?ك%o@@ ?Wpe%P@>Wpe%P@>L>rH@?L>rH@?L>P@k?L>P@k?L>Rr@@?L>@ ?L>@ ?L>@?L>@?L>@@?L>@Y?L>z@?L>@.?L>@.?L>@L>@L>@=L>@@ ?L>o@@ ?L>P@>L>P@0@Κ%Y@ @Κ%Y@ @3%w@?3%w@?%ri@ @%ri@ @-<]%H@0@-<]%H@0@%ri@9@%ri@9@3%w@0@3%w@0@L>Y@ @L>Y@ @L>w@?L>w@?L>ri@ @L>ri@ @L>H@0@L>H@0@L>ri@9@L>ri@9@L>w@0@L>w@ A|             ''(! ''&!  $#!!&$((()"!#%$& '        !  !!" #  "###$%%$%%&'&'(('(())5,2,/2/,--./12//015*++,5453523>;A;8A87686A<;><>=?>@>A@8;::98+*667+8,+8+7-,889-:.-:-9/.::;/<0/</;10<<=1>211=>32>>?3@433?@54@@A56*55A60Adefault|  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{PAs3d-0.2.2.1/s3drc.cmake000066400000000000000000000002331361325167000143650ustar00rootroot00000000000000#! /bin/sh # SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann @CMAKE_INSTALL_PREFIX@/bin/dot_mcp s3d-0.2.2.1/server/000077500000000000000000000000001361325167000136555ustar00rootroot00000000000000s3d-0.2.2.1/server/CMakeLists.txt000066400000000000000000000017241361325167000164210ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2007-2015 Sven Eckelmann include_directories(${s3d_SOURCE_DIR}/libs3d) # base files set(server_src allocate.c cull.c endian.c error.c event.c graphics.c main.c matrix.c mcp.c navigation.c network.c object.c process.c proto.c shm.c shm_ringbuf.c tcp.c user.c) # files for sdl support set(server_sdl_src graphics_sdl.c user_sdl.c) # add sdl files and libs if (SDL2_FOUND) list(APPEND server_src ${server_sdl_src}) list(APPEND server_libs ${SDL2_LIBRARY}) endif (SDL2_FOUND) if (SDL_FOUND) list(APPEND server_src ${server_sdl_src}) list(APPEND server_libs ${SDL_LIBRARY}) endif (SDL_FOUND) # compile base files + sdl specific parts add_executable(server ${server_src}) target_link_libraries(server OpenGL::OpenGL ${MATH_LIBRARIES} ${server_libs}) set_target_properties(server PROPERTIES OUTPUT_NAME "s3d") # install install(TARGETS server RUNTIME DESTINATION "${BIN_INSTALL_DIR}") s3d-0.2.2.1/server/THREADS000066400000000000000000000056341361325167000147020ustar00rootroot00000000000000currently: ---------- mainloop (main.c) onetime nanosleep() user_main() network_main() graphics_main() network_main(): tcp_pollport() polls for new processes tcp_pollproc() reads data from the new processes (connected with TCP) shm_main() check for new data from processes (connected via SHM) user_main: user_main_sdl() get and process SDL events, e.g. sending events to the processes -> graphics_pick_obj() must render the scene, therefore needs exclusive access to GL graphics_main ... setup the camera, set GL stuff render_by_mcp() render the mcp render_virtual_object() render a process (it's an virtual object in the MCPs object space) obj_render render objects from the non-MCP process obj_render() render a "normal" object from the MCP process idea: ----- NEW: process states: UNINITIALIZED: process has just been created, probably waiting for INIT from client GOT_INIT: received the INIT, waiting for cleanup thread to set it up (mcp etc) RUNNING: everything is set up WAIT_TO_DIE: tells the client to quit as soon as possible. THREAD_LEFT: client thread left, process threads: each process has its own thread, blocking in tcp_proc_com_in if TCP, or simply sleeping in SHM (polling will be done in network thread): * block in read() * if process->state == WAIT_TO_DIE, set process->state = THREAD_LEFT and thread is removed * lock processlist readonly * handle incoming packet * maybe send reply network/cleanup thread: does tcp_pollport, spawning new process-threads. After select times out, it polls all SHM connections if there is new data and wakes process threads up if there is anything to do. * block for some time (200ms?), select() for incoming tcp connection * if new connection, * lock proccess list writeonly * setup new process, add mcp-things etc * unlock processlist * lock processlist readonly * iterate over processes, if SHM-connection and there is new data available wake it up (send condition-signal) * if one process wants to quit (process->state == THREAD_LEFT), remember it for deletion * unlock processlist * if a process wants to quit * lock processlist writeonly * remove the process(es) * unlock processlist graphic thread: draws a frame and sleeps until it wakes up. processes make wake it up when new data was received, or user events (pick object, window was resized/damaged). * wait for signal to draw, or sleep 1 second (don't update too often, check for last update) * lock processlist readonly * render_by_mcp() locks mcp * obj_render() locks further objects * unlock processlist user/event thread: processes events from outside (via SDL), send notifications to the processes * block for the next SDL event (SDL_WaitEvent) * lock processlist readonly * when clicking, do as in graphic thread * lock the process which receives the event * send the event * unlock process * unlock processlist s3d-0.2.2.1/server/TODO000066400000000000000000000016071361325167000143510ustar00rootroot00000000000000HIGH: - properly buffer incoming network traffic!! MED: - culling for selection-mode - do it with line-culling, not plane-culling! - stop networking grepping after some deadline to prevent DoS ...? - delete polygon normals when vertex got changed?! - endless loop in proccess_args() (getopts) on linux ppc - recheck atan()s for mousemotion rotate values LOW: - checking for biggest object is not cool implemented - checking on clone sources is not very nice too ... VLOW: - `grep TODO\: *.c *.h` for more ;) IDEAS: - ipv6, unix socket support. - put whole processes in display lists?! WIN32: - select() behaves weird?! - can't use close(), use SocketClose() instead - Master Beej writes: "... For one thing, you can't use close() to close a socket--you need to use closesocket(), instead. Also, select() only works with socket descriptors, not file descriptors (like 0 for stdin)." s3d-0.2.2.1/server/allocate.c000066400000000000000000000123401361325167000156050ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner * SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ /* this file is taken from the batman project (www.open-mesh.net/batman) * to find heap corruptions... */ #include #include #include #include "allocate.h" #define DEBUG_MALLOC #define MAGIC_NUMBER 0x12345678 #if defined DEBUG_MALLOC static struct chunkHeader *chunkList = NULL; struct chunkHeader { struct chunkHeader *next; unsigned int length; int tag; unsigned int magicNumber; }; struct chunkTrailer { unsigned int magicNumber; }; void checkIntegrity(void) { struct chunkHeader *walker; struct chunkTrailer *chunkTrailer; unsigned char *memory; for (walker = chunkList; walker != NULL; walker = walker->next) { if (walker->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", walker->magicNumber, walker->tag); exit(1); } memory = (unsigned char *)walker; chunkTrailer = (struct chunkTrailer *)(memory + sizeof(struct chunkHeader) + walker->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", chunkTrailer->magicNumber, walker->tag); exit(1); } } } void checkLeak(void) { struct chunkHeader *walker; for (walker = chunkList; walker != NULL; walker = walker->next) fprintf(stderr, "Memory leak detected, tag = %d\n", walker->tag); } void *debugMalloc(unsigned int length, int tag) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; unsigned char *chunk; checkIntegrity(); memory = (unsigned char *)malloc(length + sizeof(struct chunkHeader) + sizeof(struct chunkTrailer)); if (memory == NULL) { fprintf(stderr, "Cannot allocate %u bytes, tag = %d\n", (unsigned int)(length + sizeof(struct chunkHeader) + sizeof(struct chunkTrailer)), tag); exit(1); } chunkHeader = (struct chunkHeader *)memory; chunk = memory + sizeof(struct chunkHeader); chunkTrailer = (struct chunkTrailer *)(memory + sizeof(struct chunkHeader) + length); chunkHeader->length = length; chunkHeader->tag = tag; chunkHeader->magicNumber = MAGIC_NUMBER; chunkTrailer->magicNumber = MAGIC_NUMBER; chunkHeader->next = chunkList; chunkList = chunkHeader; return chunk; } void *debugRealloc(void *memoryParameter, unsigned int length, int tag) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; unsigned char *result; unsigned int copyLength; checkIntegrity(); if (memoryParameter) { /* if memoryParameter==NULL, realloc() should work like malloc() !! */ memory = (unsigned char *)memoryParameter; chunkHeader = (struct chunkHeader *)(memory - sizeof(struct chunkHeader)); if (chunkHeader->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", chunkHeader->magicNumber, chunkHeader->tag); exit(1); } chunkTrailer = (struct chunkTrailer *)(memory + chunkHeader->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", chunkTrailer->magicNumber, chunkHeader->tag); exit(1); } } result = (unsigned char *)debugMalloc(length, tag); if (memoryParameter) { copyLength = length; if (copyLength > chunkHeader->length) copyLength = chunkHeader->length; memcpy(result, memoryParameter, copyLength); debugFree(memoryParameter); } return result; } void debugFree(void *memoryParameter) { unsigned char *memory; struct chunkHeader *chunkHeader; struct chunkTrailer *chunkTrailer; struct chunkHeader *walker; struct chunkHeader *previous; checkIntegrity(); memory = (unsigned char *)memoryParameter; chunkHeader = (struct chunkHeader *)(memory - sizeof(struct chunkHeader)); if (chunkHeader->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", chunkHeader->magicNumber, chunkHeader->tag); exit(1); } previous = NULL; for (walker = chunkList; walker != NULL; walker = walker->next) { if (walker == chunkHeader) break; previous = walker; } if (walker == NULL) { fprintf(stderr, "Double free detected, tag = %d\n", chunkHeader->tag); exit(1); } if (previous == NULL) chunkList = walker->next; else previous->next = walker->next; chunkTrailer = (struct chunkTrailer *)(memory + chunkHeader->length); if (chunkTrailer->magicNumber != MAGIC_NUMBER) { fprintf(stderr, "Invalid magic number in header: %08x, tag = %d\n", chunkTrailer->magicNumber, chunkHeader->tag); exit(1); } free(chunkHeader); } #else void checkIntegrity(void) { } void checkLeak(void) { } void *debugMalloc(unsigned int length, int tag) { void *result; result = malloc(length); if (result == NULL) { fprintf(stderr, "Cannot allocate %u bytes, tag = %d\n", length, tag); exit(1); } return result; } void *debugRealloc(void *memory, unsigned int length, int tag) { void *result; result = realloc(memory, length); if (result == NULL) { fprintf(stderr, "Cannot re-allocate %u bytes, tag = %d\n", length, tag); exit(1); } return result; } void debugFree(void *memory) { free(memory); } #endif s3d-0.2.2.1/server/allocate.h000066400000000000000000000010121361325167000156040ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2006-2015 Marek Lindner * SPDX-FileCopyrightText: 2006-2015 Simon Wunderlich */ /* this file is taken from the batman project (www.open-mesh.net/batman) * to find heap corruptions... */ void checkIntegrity(void); void checkLeak(void); void *debugMalloc(unsigned int length, int tag); void *debugRealloc(void *memory, unsigned int length, int tag); void debugFree(void *memoryParameter); s3d-0.2.2.1/server/config.h000066400000000000000000000013251361325167000152740ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* use the global config.h */ #include /* to be filled with configure options ... */ /* */ /* on which port do we listen? */ #define S3D_PORT 6066 /* resolution on startup */ #define X_RES 800 #define Y_RES 600 /* how many frames to wait until test the connection if it's still here */ #define MAX_IDLE 50 /* this is to be set dynamicly later on */ #define VLOW 1 #define LOW 2 #define MED 3 #define HIGH 4 #define VHIGH 5 /* which is the minimum level of debugmessage we want to see? */ /* #define DEBUG LOW *//* should be set with compile, e.g. -DDEBUG=LOW */ s3d-0.2.2.1/server/cull.c000066400000000000000000000041521361325167000147620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * code originated from http://www.racer.nl/reference/vfc.htm * which is (C) Ruud van Gaal */ #include "global.h" #include /* sqrt() */ #if G_SDL #include /* glGetFloatv */ #else #include /* glGetFloatv */ #endif struct t_plane { struct t_vertex n; float d; }; #define LEFT 0 #define RIGHT 1 #define TOP 2 #define BOTTOM 3 #define PNEAR 4 #define PFAR 5 static struct t_plane frustumPlane[6]; void cull_get_planes(void) { t_mtrx m, mproj, mmodel; struct t_plane *p; int i; float d; /* get matrices from opengl */ glGetFloatv(GL_MODELVIEW_MATRIX, mmodel); glGetFloatv(GL_PROJECTION_MATRIX, mproj); mySetMatrix(mproj); myMultMatrix(mmodel); myGetMatrix(m); /* multiply and have the result in m */ p = &frustumPlane[RIGHT]; p->n.x = m[3] - m[0]; p->n.y = m[7] - m[4]; p->n.z = m[11] - m[8]; p->d = m[15] - m[12]; p = &frustumPlane[LEFT]; p->n.x = m[3] + m[0]; p->n.y = m[7] + m[4]; p->n.z = m[11] + m[8]; p->d = m[15] + m[12]; p = &frustumPlane[BOTTOM]; p->n.x = m[3] + m[1]; p->n.y = m[7] + m[5]; p->n.z = m[11] + m[9]; p->d = m[15] + m[13]; p = &frustumPlane[TOP]; p->n.x = m[3] - m[1]; p->n.y = m[7] - m[5]; p->n.z = m[11] - m[9]; p->d = m[15] - m[13]; p = &frustumPlane[PFAR]; p->n.x = m[3] - m[2]; p->n.y = m[7] - m[6]; p->n.z = m[11] - m[10]; p->d = m[15] - m[14]; p = &frustumPlane[PNEAR]; p->n.x = m[3] + m[2]; p->n.y = m[7] + m[6]; p->n.z = m[11] + m[10]; p->d = m[15] + m[14]; /* Normalize all plane normals */ for (i = 0; i < 6; i++) { p = &frustumPlane[i]; d = sqrt(p->n.x * p->n.x + p->n.y * p->n.y + p->n.z * p->n.z); if (d != 0.0) { p->n.x /= d; p->n.y /= d; p->n.z /= d; p->d /= d; } } } int cull_sphere_in_frustum(struct t_vertex *center, float radius) { int i; struct t_plane *p; for (i = 0; i < 6; i++) { p = &frustumPlane[i]; if (p->n.x * center->x + p->n.y * center->y + p->n.z * center->z + p->d <= -radius) { return 0; /* sorry, no ... */ } } return 1; /* it's inside */ } s3d-0.2.2.1/server/endian.c000066400000000000000000000025461361325167000152660ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 S3D contributors */ #include /* htonl(),htons() */ #include #include "global.h" /* convert buffer with floats from host to network endianess */ void htonfb(float *netfloat, int num) { int i; for (i = 0; i < num; i++) { *(uint32_t *) & netfloat[i] = htonl(*(uint32_t *) & netfloat[i]); } } /* convert buffer with floats from network to host endianess */ void ntohfb(float *netfloat, int num) { int i; for (i = 0; i < num; i++) { *(uint32_t *) & netfloat[i] = ntohl(*(uint32_t *) & netfloat[i]); } } /* convert buffer with uint32_ts from host to network endianess */ void htonlb(uint32_t * netint32, int num) { int i; for (i = 0; i < num; i++) { netint32[i] = htonl(netint32[i]); } } /* convert buffer with uint32_ts from network to host endianess */ void ntohlb(uint32_t * netint32, int num) { int i; for (i = 0; i < num; i++) { netint32[i] = ntohl(netint32[i]); } } /* convert buffer with uint16_ts from host to network endianess */ void htonsb(uint16_t * netint16, int num) { int i; for (i = 0; i < num; i++) { netint16[i] = htons(netint16[i]); } } /* convert buffer with uint16_ts from network to host endianess */ void ntohsb(uint16_t * netint16, int num) { int i; for (i = 0; i < num; i++) { netint16[i] = ntohs(netint16[i]); } } s3d-0.2.2.1/server/error.c000066400000000000000000000032661361325167000151610ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* for printf() */ #include /* va_start, va_end */ #include /* for strerror() */ #include /* for exit() */ #define DBM_MAX 1024 /* debug message buffer size */ /* this function writes an error somewhere */ /* basicly, this is for upcoming logfiles, or maybe draw error-messages into */ /* the 3d-space */ /* this is the generic failure routine ... */ void errn(const char *func, int en) { fprintf(stderr, "error: %s: (%d) %s\n", func, en, strerror(en)); } /* ... and it's fatal pendant */ void errnf(const char *func, int en) { fprintf(stderr, "FATAL: %s: (%d) %s\n", func, en, strerror(en)); exit(-1); } /* prints an error with the function and it's error-message */ void errs(const char *func, const char *msg) { fprintf(stderr, "error: %s: %s\n", func, msg); } void errsf(const char *func, const char *msg) { fprintf(stderr, "FATAL: %s: %s\n", func, msg); exit(-1); } #ifdef DEBUG /* printing error message */ void errds(int relevance, const char *func, const char *fmt, ...) { char dbm[DBM_MAX]; va_list args; if (relevance >= DEBUG) { va_start(args, fmt); vsnprintf((char *)&dbm, DBM_MAX, fmt, args); va_end(args); fprintf(stderr, "error: %s:%s\n", func, (char *)&dbm); } } /* printing debug message */ void s3dprintf(int relevance, const char *fmt, ...) { char dbm[DBM_MAX]; va_list args; if (relevance >= DEBUG) { va_start(args, fmt); vsnprintf((char *)&dbm, DBM_MAX, fmt, args); va_end(args); fprintf(stdout, "debug: %s\n", (char *)&dbm); } } #endif s3d-0.2.2.1/server/event.c000066400000000000000000000117131361325167000151450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include "proto.h" #include /* sprintf() */ #ifdef WIN32 #include #else #include /* htonl(),htons() */ #endif #include /* strlen(),strcpy() */ /* I don't plan to keep this until the end, but it can show us how */ /* to interact ... */ int event_obj_click(struct t_process *p, int32_t oid) { uint32_t moid = htonl(oid); s3dprintf(MED, "telling client that oid %d got clicked", oid); prot_com_out(p, S3D_P_S_CLICK, (uint8_t *) & moid, 4); return 0; } /* this functions sends keystroke events to the focused program. */ /* maybe mcp-keystrokes should be catched here. */ /* state = 0 -> pressed, 1 -> released */ int event_key_pressed(uint16_t key, uint16_t uni, uint16_t mod, int state) { uint16_t k[4]; struct t_obj *o; k[0] = htons(key); k[1] = htons(uni); k[2] = htons(mod); k[3] = htons(state); if (OBJ_VALID(get_proc_by_pid(MCP), focus_oid, o)) prot_com_out(get_proc_by_pid(o->virtual_pid), S3D_P_S_KEY, (uint8_t *) k, 8); prot_com_out(get_proc_by_pid(MCP), S3D_P_S_KEY, (uint8_t *) k, 8); /* mcp always gets a copy */ return 0; } /* mouse button changes are sent to the client */ int event_mbutton_clicked(uint8_t button, uint8_t state) { struct t_obj *o; uint8_t b[2]; b[0] = button; b[1] = state; if (OBJ_VALID(get_proc_by_pid(MCP), focus_oid, o)) prot_com_out(get_proc_by_pid(o->virtual_pid), S3D_P_S_MBUTTON, (uint8_t *) & b, 2); prot_com_out(get_proc_by_pid(MCP), S3D_P_S_MBUTTON, (uint8_t *) & b, 2); /* mcp always gets a copy */ return 0; } /* tell the client something about us */ int event_init(struct t_process *p) { char s[S3D_NAME_MAX + 3]; sprintf(s, "%c%c%c%s", S3D_SERVER_MAJOR, S3D_SERVER_MINOR, S3D_SERVER_PATCH, S3D_SERVER_NAME); /* thanks award */ prot_com_out(p, S3D_P_S_INIT, (uint8_t *) s, strlen(S3D_SERVER_NAME) + 4); return 0; } /* this lets a process quit gracefully ... */ int event_quit(struct t_process *p) { prot_com_out(p, S3D_P_S_QUIT, NULL, 0); s3dprintf(HIGH, "sending pid %d QUIT signal", p->id); process_del(p->id); return 0; } /* the cam changed?! we should run and tell this the mcp/focused client! */ int event_cam_changed(void) { struct t_process *p; struct t_obj *o; p = get_proc_by_pid(MCP); event_obj_info(p, 0); if (OBJ_VALID(p, focus_oid, o)) event_obj_info(get_proc_by_pid(o->virtual_pid), 0); return 0; } /* same for the mouse movement! */ int event_ptr_changed(void) { struct t_process *p; struct t_obj *o; p = get_proc_by_pid(MCP); event_obj_info(p, get_pointer(p)); if (OBJ_VALID(p, focus_oid, o)) { p = get_proc_by_pid(o->virtual_pid); /* focused program pointer */ event_obj_info(p, get_pointer(p)); } return 0; } /* inform client about an available shm-segment for the texture */ int event_texshm(struct t_process *p, int32_t oid, int32_t tex) { struct t_obj *o; struct { int32_t oid, tex, shmid; uint16_t tw, th, w, h; } __attribute__ ((__packed__)) shmtex_packet; if (OBJ_VALID(p, oid, o)) { s3dprintf(LOW, "informing process about new texture on oid %d, texture %d, which is available under id %d\n", oid, tex, o->p_tex[tex].shmid); shmtex_packet.oid = htonl(oid); shmtex_packet.tex = htonl(tex); shmtex_packet.shmid = htonl(o->p_tex[tex].shmid); shmtex_packet.tw = htons(o->p_tex[tex].tw); shmtex_packet.th = htons(o->p_tex[tex].th); shmtex_packet.w = htons(o->p_tex[tex].w); shmtex_packet.h = htons(o->p_tex[tex].h); prot_com_out(p, S3D_P_S_SHMTEX, (uint8_t *) & shmtex_packet, sizeof(shmtex_packet)); } return 0; } /* this should replace the mcp_rep_object() function later ... */ int event_obj_info(struct t_process *p, int32_t oid) { struct { int32_t object; uint32_t flags; float trans_x, trans_y, trans_z; float rot_x, rot_y, rot_z; float scale; float r; char name[S3D_NAME_MAX]; } __attribute__ ((__packed__)) mo; struct t_process *ap; struct t_obj *o; if (OBJ_VALID(p, oid, o)) { mo.object = htonl(oid); mo.trans_x = p->object[oid]->translate.x; mo.trans_y = p->object[oid]->translate.y; mo.trans_z = p->object[oid]->translate.z; mo.rot_x = p->object[oid]->rotate.x; mo.rot_y = p->object[oid]->rotate.y; mo.rot_z = p->object[oid]->rotate.z; mo.scale = p->object[oid]->scale; mo.r = p->object[oid]->r; memset(mo.name, 0, S3D_NAME_MAX); switch (o->oflags & OF_TYPE) { case OF_VIRTUAL: ap = get_proc_by_pid(o->virtual_pid); strncpy(mo.name, ap->name, sizeof(mo.name)); mo.name[sizeof(mo.name) - 1] = '\0'; break; case OF_CAM: mo.scale = (float)((float)winw) / winh; /* give aspect ratio to program */ strncpy(mo.name, "sys_camera0", sizeof(mo.name)); mo.name[sizeof(mo.name) - 1] = '\0'; break; case OF_POINTER: strncpy(mo.name, "sys_pointer0", sizeof(mo.name)); mo.name[sizeof(mo.name) - 1] = '\0'; break; } htonfb(&mo.trans_x, 8); prot_com_out(p, S3D_P_S_OINFO, (uint8_t *) & mo, sizeof(mo)); } return 0; } s3d-0.2.2.1/server/global.h000066400000000000000000000326621361325167000152770ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #ifndef _GLOBAL_H_ #define _GLOBAL_H_ #include "config.h" #ifdef __APPLE__ #ifdef SHM #undef SHM #endif #endif #include /* integer types */ #ifdef SHM #include /* key_t */ #endif #ifdef G_SDL #include #endif /* variables and defines */ #ifdef G_SDL #if SDL_VERSION_ATLEAST(2,0,0) extern SDL_Window *sdl_window; #endif #endif extern int frame_mode; /* SDL, ... ? */ extern int running; /* server running flag */ /* relevance macros */ #ifndef S3DUNUSED #if defined(UNUSEDPARAM_ATTRIBUTE) #define S3DUNUSED(x) (x)__attribute__((unused)) #elif defined(UNUSEDPARAM_OMIT) #define S3DUNUSED(x) /* x */ #else #define S3DUNUSED(x) x #endif #endif #ifdef __GNUC_MINOR__ #define S3D_FORMAT(type, fmt_pos, arg_pos) __attribute__ ((format (type, fmt_pos, arg_pos))) #else #define S3D_FORMAT(type, fmt_pos, arg_pos) #endif #ifndef S3D_NAME_MAX #define S3D_NAME_MAX 256 /* limit for names [e.g. process names] */ #endif /* S3D_NAME_MAX */ #define MCP 0 /* the mcp's pid */ #define TEXTURE_MAX_W 4096 #define TEXTURE_MAX_H 4096 /* server version */ #define S3D_SERVER_MAJOR 0 #define S3D_SERVER_MINOR 1 #define S3D_SERVER_PATCH 1 #define S3D_SERVER_NAME "dotslash s3d server" #define MAXPLEN 65536 #define RB_STD_SIZE 1024*512 #define RB_MAX_SIZE 1048*4096 #define SHM_SIZE sizeof(key_t)*2 /* space for the keys */ #define RB_OVERHEAD sizeof(struct buf_t) #define OBJ_VALID(p,oid,o) (oid >= 0) && ((oid < p->n_obj) && ((o=p->object[oid])!=NULL)) typedef float t_mtrx[16]; struct buf_t { uint32_t start, end, bufsize; /* start/end of the data */ }; /* some graphic simple prototypes, they might get into some headerfile later ... */ /* our lovely vertex list ... */ struct t_vertex { float x, y, z; }; struct t_texc { float x, y; }; /* polygon definition; */ /* it's all handled via list types as usually we have only one surface for many polygons, */ /* and many vertexes have 2 or more polygons connected. OpenGL will optimize the lists for us */ /* anyways, so we shouldn't care ... */ struct t_poly { uint32_t v[3]; /* we define a poly as set of 3 vertexes, as its usual */ struct t_vertex n[3]; /* normal vectors */ uint32_t mat; /* material index */ struct t_texc tc[3]; /* texture coords */ }; struct t_line { uint32_t v[2]; struct t_vertex n[2]; /* normal vectors */ uint32_t mat; }; /* material of surfaces, as it's usual in the OpenGL standard */ struct t_mat { float amb_r, amb_g, amb_b, amb_a, /* ambience */ spec_r, spec_g, spec_b, spec_a, /* specualar */ diff_r, diff_g, diff_b, diff_a; /* diffusion */ int32_t tex; /* texture index, -1 if there is no */ }; /* this defines a texture */ struct t_tex { uint16_t w, h; /* width and height */ uint16_t tw, th; /* texture width */ uint8_t *buf; /* the data */ float xs, ys; /* scale data for gl-implementations which require 2^x */ int shmid; /* shared memory id, is -1 if it's not attached */ /* texture sizes. */ int32_t gl_texnum; /* the gl texture number. */ }; /* the object type */ struct t_obj { uint32_t oflags; /* flags, like this object beeing input etc. */ #define OF_TURN_ON 1 #define OF_TURN_OFF 2 #define OF_TURN_SWAP 3 #define OF_VISIBLE 0x00000001 #define OF_SELECTABLE 0x00000002 #define OF_POINTABLE 0x00000004 #define OF_CLONE_SRC 0x01000000 #define OF_LINK_SRC 0x02000000 #define OF_LINK 0x04000000 #define OF_TYPE 0xF0000000 #define OF_NODATA 0xF0000000 /* no data allowed! */ #define OF_CLONE 0x10000000 #define OF_VIRTUAL 0x20000000 #define OF_SYSTEM 0x80000000 #define OF_CAM 0x90000000 #define OF_POINTER 0xA0000000 #define OF_3DPOINTER 0xB0000000 #define OF_MASK 0x00FFFFFF int32_t virtual_pid; /* if virtual, this contains the pid */ int32_t clone_ooid; /* if clone, this contains the oid of the original */ int32_t n_vertex, n_mat, n_poly, n_tex, n_line; int32_t dplist; /* opengl display list number */ int32_t linkid; /* linking target, -1 if there is none */ int32_t lsub, lnext, lprev; /* pointer to our objects; */ struct t_vertex *p_vertex; struct t_mat *p_mat; struct t_poly *p_poly; struct t_line *p_line; struct t_tex *p_tex; struct t_vertex translate, rotate; float scale; t_mtrx m; int m_uptodate; float r, o_r; /* radius, object radius */ }; #ifdef SHM struct t_shmcb { int shmid_ctos, shmid_stoc; key_t key_ctos, key_stoc; char *data_ctos, *data_stoc; int size_ctos, size_stoc; int idle; }; #endif /* l_* is a list-type, t_* is the type itself */ struct t_process { char name[S3D_NAME_MAX]; /* process name */ struct t_obj **object; /* initial pointer to object list */ int32_t n_obj; /* number of objects */ int32_t biggest_obj; /* the biggest object */ int32_t mcp_oid; /* oid in mcp */ int id; /* pid */ int con_type; /* type of connection, one of following: */ #define CON_NULL 0 #define CON_TCP 1 #define CON_SHM 2 #ifdef TCP int sockid; #endif #ifdef SHM struct t_shmcb shmsock; #endif }; enum { zero, FRAME_SDL }; /* main.c */ int rc_init(void); int init(void); void quit(void); void one_time(void); /* network.c */ extern uint8_t ibuf[MAXPLEN]; extern uint8_t obuf[MAXPLEN]; extern volatile int turn; void sigpipe_handler(int); void sigio_handler(int); int network_init(void); int network_quit(void); int network_main(void); int n_readn(struct t_process *p, uint8_t * str, int s); int n_writen(struct t_process *p, uint8_t * str, int s); int n_remove(struct t_process *p); #ifdef G_SDL uint32_t net_turn_off(uint32_t interval, void *param); #endif /* tcp.c */ int tcp_init(void); int tcp_quit(void); int tcp_pollport(void); int tcp_pollproc(void); int tcp_prot_com_in(struct t_process *p); int tcp_writen(int sock, uint8_t * str, int s); int tcp_readn(int sock, uint8_t * str, int s); int tcp_remove(int sock); /* shm.c/shm_ringbuf.c */ int shm_init(void); int shm_quit(void); int shm_main(void); int shm_next_key(void); int shm_remove(struct t_process *p); int shm_writen(struct buf_t *rb, uint8_t * buf, int n); int shm_readn(struct buf_t *rb, uint8_t * buf, int n); int shm_prot_com_in(struct t_process *p); /* shm_ringbuf.c */ void ringbuf_init(char *data, uint32_t init_size); int shm_write(struct buf_t *rb, char *buf, int n); int shm_read(struct buf_t *rb, char *buf, int n); /* proto.c */ extern int focus_oid; int prot_com_in(struct t_process *p, uint8_t * pbuf); int prot_com_out(struct t_process *p, uint8_t opcode, uint8_t * buf, uint16_t length); /* event.c */ int event_obj_info(struct t_process *p, int32_t oid); int event_obj_click(struct t_process *p, int32_t oid); int event_key_pressed(uint16_t key, uint16_t uni, uint16_t mod, int state); int event_mbutton_clicked(uint8_t button, uint8_t state); int event_texshm(struct t_process *p, int32_t oid, int32_t tex); int event_cam_changed(void); int event_ptr_changed(void); int event_init(struct t_process *p); int event_quit(struct t_process *p); int event_ping_in(struct t_process *p, uint32_t o); /* user.c */ extern int but; int user_init(void); int user_quit(void); int user_main(void); #ifdef G_SDL int user_init_sdl(void); int user_quit_sdl(void); int user_main_sdl(void); #endif void user_mouse(int button, int state, int x, int y); void user_key(unsigned short key, unsigned short unicode, unsigned short mod, int state); /* error.c */ void errn(const char *func, int en); void errnf(const char *func, int en); void errs(const char *func, const char *msg); void errsf(const char *func, const char *msg); #ifdef DEBUG void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4); void s3dprintf(int relevance, const char *msg, ...) S3D_FORMAT(printf, 2, 3); #else static void errds(int relevance, const char *func, const char *fmt, ...) S3D_FORMAT(printf, 3, 4); static void s3dprintf(int relevance, const char *msg, ...) S3D_FORMAT(printf, 2, 3); static __inline__ void errds(int relevance __attribute__ ((unused)), const char *func __attribute__ ((unused)), const char *fmt __attribute__ ((unused)), ...) { } static __inline__ void s3dprintf(int relevance __attribute__ ((unused)), const char *msg __attribute__ ((unused)), ...) { } #endif /* graphics.c */ extern int winw, winh; int graphics_quit(void); void graphics_main(void); int graphics_pick_obj(int x, int y); int graphics_init(void); int render_by_mcp(void); #ifdef G_SDL extern int aa_level; extern int SDLFlags; int graphics_init_sdl(void); int graphics_quit_sdl(void); #endif void graphics_reshape(int w, int h); /* navigation.c */ void navi_left(void); void navi_right(void); void navi_fwd(void); void navi_back(void); void navi_rot_left(void); void navi_rot_right(void); void navi_rot_up(void); void navi_rot_down(void); void navi_pos(int xdif, int ydif); void navi_rot(int xdif, int ydif); void ptr_move(int x, int y); /* process.c */ extern struct t_process *procs_p; extern int procs_n; struct t_process *process_add(void); int process_del(int id); int process_init(void); int process_quit(void); struct t_process *process_protinit(struct t_process *p, const char *name); struct t_process *get_proc_by_pid(int pid); /* object.c */ int obj_debug(struct t_process *p, int32_t oid); int obj_new(struct t_process *p); int obj_clone(struct t_process *p, int32_t oid); int obj_clone_change(struct t_process *p, int32_t oid, int32_t toid); int obj_link(struct t_process *p, int32_t oid_from, int32_t oid_to); int obj_unlink(struct t_process *p, int32_t oid); int obj_del(struct t_process *p, int32_t oid); int obj_push_vertex(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_push_mat(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_push_poly(struct t_process *p, int32_t oid, uint32_t * x, int32_t n); int obj_push_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n); int obj_push_tex(struct t_process *p, int32_t oid, uint16_t * x, int32_t n); int obj_pep_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_pep_line_normal(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_pep_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_pep_mat(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_pep_mat_tex(struct t_process *p, int32_t oid, uint32_t * x, int32_t n); int obj_pep_vertex(struct t_process *p, int32_t oid, float *x, int32_t n); int obj_pep_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n); int obj_load_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n); int obj_load_line_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n); int obj_load_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n); int obj_load_mat(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n); int obj_load_tex(struct t_process *p, int32_t oid, int32_t tex, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * pixbuf); int obj_update_tex(struct t_process *p, int32_t oid, int32_t tid, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * pixbuf); int obj_del_vertex(struct t_process *p, int32_t oid, int32_t n); int obj_del_mat(struct t_process *p, int32_t oid, int32_t n); int obj_del_poly(struct t_process *p, int32_t oid, int32_t n); int obj_del_line(struct t_process *p, int32_t oid, int32_t n); int obj_del_tex(struct t_process *p, int32_t oid, int32_t n); int obj_toggle_flags(struct t_process *p, int32_t oid, uint8_t type, uint32_t flags); int obj_translate(struct t_process *p, int32_t oid, float *transv); int obj_rotate(struct t_process *p, int32_t oid, float *rotv); int obj_scale(struct t_process *p, int32_t oid, float scav); int obj_render(struct t_process *p, int32_t oid); int obj_free(struct t_process *p, int32_t oid); void obj_get_maximum(struct t_process *p, struct t_obj *obj); void into_position(struct t_process *p, struct t_obj *obj, int depth); void obj_recalc_tmat(struct t_process *p, int32_t oid); void obj_size_update(struct t_process *p, int32_t oid); void obj_pos_update(struct t_process *p, int32_t oid, int32_t first_oid); void obj_check_biggest_object(struct t_process *p, int32_t oid); int32_t get_pointer(struct t_process *p); void link_delete(struct t_process *p, int32_t oid); void link_insert(struct t_process *p, int32_t oid, int32_t target); /* mcp.c */ int mcp_rep_object(int32_t mcp_oid); int mcp_del_object(int32_t mcp_oid); int mcp_init(void); int mcp_focus(int oid); /* matrix.c */ extern t_mtrx Identity; void myMultMatrix(t_mtrx mat2); void myGetMatrix(t_mtrx mat); void mySetMatrix(t_mtrx mat); void myTranslatef(float x, float y, float z); void myScalef(float x, float y, float z); void myRotatef(float angle, float x, float y, float z); void myLoadIdentity(void); void myTransform4f(float *v); void myTransform3f(float *v); void myTransformV(struct t_vertex *v); int myInvert(void); /* cull.c */ void cull_get_planes(void); int cull_sphere_in_frustum(struct t_vertex *center, float radius); /* allocate.c */ #if DEBUG <= HIGH #include void checkIntegrity(void); void checkLeak(void); void *debugMalloc(unsigned int length, int tag); void *debugRealloc(void *memory, unsigned int length, int tag); void debugFree(void *memoryParameter); #define malloc(x) debugMalloc(x,42) #define free(x) debugFree(x); #define realloc(x,y) debugRealloc(x,y,42) #endif /* endian.c */ void htonfb(float *netfloat, int num); void ntohfb(float *netfloat, int num); void htonlb(uint32_t * netint32, int num); void ntohlb(uint32_t * netint32, int num); void htonsb(uint16_t * netint16, int num); void ntohsb(uint16_t * netint16, int num); #endif /* _GLOBAL_H_ */ s3d-0.2.2.1/server/graphics.c000066400000000000000000000221551361325167000156260ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* memcpy() */ #if G_SDL #include /* GL_RESCALE_NORMAL */ #include /* SDL_GL_SwapBuffers */ #else #include /* GLint */ #include /* GL_RESCALE_NORMAL */ #endif #include /* sin(),cos() */ #ifndef INFINITY #define INFINITY 1<<30 #endif /* this file handles graphics routines */ /* local prototypes ... */ static void render_virtual_object(struct t_obj *o); /* ... and types/variables */ static int select_mode = 0; int winw, winh; /* this detects and opens the SDL things */ int graphics_init(void) { GLfloat shin[] = { 16.0 }; switch (frame_mode) { #ifdef G_SDL case FRAME_SDL: graphics_init_sdl(); break; #endif default: return -1; } /* light */ glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /* depth test */ glEnable(GL_DEPTH_TEST); /* textures */ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glDisable(GL_DITHER); /* lines */ glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); glLineWidth(1.0); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /* polygon smoothing */ glDisable(GL_POLYGON_SMOOTH); /* normalizing */ glDisable(GL_AUTO_NORMAL); glDisable(GL_NORMALIZE); /* don't use the expensive GL_NORMALIZE, we use uniform scaling so GL_RESCALE_NORMAL is sufficent */ glEnable(GL_RESCALE_NORMAL); /* blending */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* set shininess */ glMaterialfv(GL_FRONT, GL_SHININESS, shin); graphics_reshape(X_RES, Y_RES); /* face culling */ glCullFace(GL_FRONT); glEnable(GL_CULL_FACE); return 0; } /* this is to be called when the window is resized or created ... */ void graphics_reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); winw = w; winh = h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w > h) glFrustum(-((1.0 * w) / h), (1.0 * w) / h, -1.0, 1.0, 1.0, 5000); else glFrustum(-1.0, 1.0, -(1.0 * h) / w, (1.0 * h) / w, 1.0, 5000); glMatrixMode(GL_MODELVIEW); if (procs_p != NULL) event_cam_changed(); } static void render_virtual_object(struct t_obj *o) { struct t_process *ap; struct t_vertex x, y; int32_t j, k; t_mtrx m; glPushMatrix(); glMultMatrixf(o->m); glGetFloatv(GL_MODELVIEW_MATRIX, m); cull_get_planes(); if (NULL == (ap = get_proc_by_pid(o->virtual_pid))) { /* the clean way */ errds(HIGH, "render_by_mcp()", "not existing pid (%p) referenced by mcp-object!!", (void *)o); } else { /* now go throu the objects of our app */ for (j = 0; j < ap->n_obj; j++) { if (ap->object[j] != NULL) { if (((select_mode == 0) && ap->object[j]->oflags & OF_VISIBLE) || ((select_mode == 1) && (ap->object[j]->oflags & OF_SELECTABLE))) { /* either select mode is off or it's selectable */ x.x = x.y = x.z = 0.0f; mySetMatrix(ap->object[j]->m); /* get into position ... */ myTransformV(&x); y.x = 1.0; y.y = y.z = 0.0f; myTransformV(&y); y.x -= x.x; y.y -= x.y; y.z -= x.z; k = cull_sphere_in_frustum(&x, ap->object[j]->r * sqrt(y.x * y.x + y.y * y.y + y.z * y.z)); if (k) { if (select_mode == 1) glPushName(j); obj_render(ap, j); if (select_mode == 1) glPopName(); } } } } } glPopMatrix(); } /* this functions renders by going from mcp objects [as it should be], */ /* recursively positiniong the objects into the space. */ int render_by_mcp(void) { struct t_process *p = get_proc_by_pid(MCP); int32_t i; struct t_obj *o; struct t_vertex x, y; int k; for (i = 0; i < p->n_obj; i++) { /* check all mcp objects ... */ o = p->object[i]; if (o != NULL) { if ((select_mode == 0 && o->oflags & OF_VISIBLE) || (select_mode == 1 && o->oflags & OF_SELECTABLE)) { /* it's even visible ;) */ if (o->oflags & OF_VIRTUAL) { /* we have an app here. */ if (o->r != 0.0) { cull_get_planes(); mySetMatrix(o->m); x.x = x.y = x.z = 0.0f; myTransformV(&x); y.x = 1.0; y.y = y.z = 0.0f; myTransformV(&y); y.x -= x.x; y.y -= x.y; y.z -= x.z; k = cull_sphere_in_frustum(&x, o->r * sqrt(y.x * y.x + y.y * y.y + y.z * y.z)); s3dprintf(VLOW, "mcp-object %d is in %s frustum", i, k ? "" : "not"); if (k) { if (select_mode == 1) { s3dprintf(VLOW, "object %d in culling frustrum!", i); glLoadName(i); } render_virtual_object(o); } else { if (select_mode == 1) { s3dprintf(VLOW, "object %d not in culling frustrum!", i); } } } } else if ((o->oflags & OF_CLONE) && (p->object[o->clone_ooid]->oflags & OF_VIRTUAL)) { /* it's a clone of an app */ if (select_mode == 1) glLoadName(o->clone_ooid); /*TODO: what to do if a clone is selected?! */ glPushMatrix(); render_virtual_object(o); render_virtual_object(p->object[o->clone_ooid]); glPopMatrix(); } else { /* it's a "regular" mcp object */ if (select_mode == 1) { s3dprintf(VLOW, "mcp object no. %d", i); glLoadName(-1); glPushName(i); } obj_render(p, i); if (select_mode == 1) glPopName(); } } } } return 0; } /* this picks objects from their screen-positions and sends * OBK_CLICK-events for the selected object(s). * TODO: how big should the select buffer be? */ #define SBSIZE 65536 int graphics_pick_obj(int x, int y) { int i, j; GLint viewport[4]; GLfloat xpos, ypos; float big, z1, z2; int32_t mcp_o, o; struct t_process *p = get_proc_by_pid(MCP); GLuint select_buf[SBSIZE], *ptr; int hits, names; t_mtrx m; select_mode = 1; glSelectBuffer(SBSIZE, select_buf); glRenderMode(GL_SELECT); glMatrixMode(GL_PROJECTION); /* count the objects .... */ glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT, viewport); if (winw > winh) { xpos = ((x - winw / 2.0) / (winw / 2.0)) * (((double)winw / winh)); ypos = (((winh - y) - winh / 2.0) / (winh / 2.0)); } else { xpos = ((x - winw / 2.0) / (winw / 2.0)); ypos = (((winh - y) - winh / 2.0) / (winh / 2.0)) * (((double)winh / winw)); } #define mnear 0.001 /* omg this is so dirty ... but works after all */ glFrustum(xpos - mnear, xpos + mnear, ypos - mnear, ypos + mnear, 1, 5000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* get into position ... */ mySetMatrix(p->object[0]->m); myInvert(); myGetMatrix(m); glMultMatrixf(m); glInitNames(); glPushName(0); render_by_mcp(); glFlush(); hits = glRenderMode(GL_RENDER); if (hits > 0) { big = INFINITY; s3dprintf(LOW, "had %d hits", hits); ptr = select_buf; mcp_o = o = names = -1; /* check all the hits, only select the nearest ... */ for (i = 0; i < hits; i++) { names = *ptr; ptr++; z1 = (float)*ptr / 0x7fffffff; ptr++; z2 = (float)*ptr / 0x7fffffff; ptr++; if (z1 < big) { mcp_o = o = -1; for (j = 0; j < names; j++) { switch (j) { case 0: mcp_o = *ptr; break; case 1: o = *ptr; break; } ptr++; } big = z1; } else for (j = 0; j < names; j++) ptr++; s3dprintf(VLOW, "[HIT %d] names %d [z1:%f|z2:%f] mcp_o=%d, o=%d ", i, names, z1, z2, mcp_o, o); } s3dprintf(VLOW, "mcp_o= %d, o= %d", mcp_o, o); if (mcp_o == -1) { /* it's an mcp object */ s3dprintf(LOW, "clicked on mcp-object no. %d", o); event_obj_click(p, o); } else if ((names > 1) && ((mcp_o >= 0) && (mcp_o < p->n_obj))) { /* it's an usual object */ s3dprintf(LOW, "clicked on mcp-object %d, object %d", mcp_o, o); if (p->object[mcp_o] != NULL) { /* that shouldn't happen anyways ... */ obj_debug(get_proc_by_pid(p->object[mcp_o]->virtual_pid), o); event_obj_click(get_proc_by_pid(p->object[mcp_o]->virtual_pid), o); } } } glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); select_mode = 0; return 0; } void graphics_main(void) { struct t_process *p = get_proc_by_pid(MCP); t_mtrx m; GLfloat pos[] = { 0, 50, 50, 1.0 }; GLfloat light0_spec[] = { 0.7, 0.7, 0.7, 0.0 }; GLfloat light0_shininess[] = { 1.0 }; GLfloat light0_diff[] = { 0.5, 0.5, 0.5, 1.0 }; GLfloat light0_amb[] = { 1.0, 1.0, 1.0, 1.0 }; select_mode = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* clear screen */ /* set up the cam ... */ glMatrixMode(GL_MODELVIEW); glLightfv(GL_LIGHT0, GL_AMBIENT, light0_amb); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diff); glLightfv(GL_LIGHT0, GL_SPECULAR, light0_spec); glLightfv(GL_LIGHT0, GL_SHININESS, light0_shininess); glLoadIdentity(); mySetMatrix(p->object[0]->m); myInvert(); myGetMatrix(m); glMultMatrixf(m); glLightfv(GL_LIGHT0, GL_POSITION, pos); glPushMatrix(); /* save the cam */ render_by_mcp(); glPopMatrix(); /* restore the cam */ glLoadIdentity(); glMultMatrixf(m); switch (frame_mode) { #ifdef G_SDL case FRAME_SDL: /* SDL will glFlush itself */ #if SDL_VERSION_ATLEAST(2,0,0) SDL_GL_SwapWindow(sdl_window); #else SDL_GL_SwapBuffers(); #endif break; #endif #ifdef G_GLX case FRAME_GLX: ... #endif } } /* quit the graphic-interface */ int graphics_quit(void) { return 0; } s3d-0.2.2.1/server/graphics_sdl.c000066400000000000000000000071651361325167000164740ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" int aa_level = 4; #include #include int SDLFlags = 0; /* some flags for SDL */ #if SDL_VERSION_ATLEAST(2,0,0) SDL_Window *sdl_window; #endif int graphics_init_sdl(void) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_GLContext glcontext; #else SDL_Surface *GLwin = NULL; SDL_VideoInfo *VideoInfo; #endif int buffers, samples; s3dprintf(MED, "Using SDL driver ..."); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) errsf("SDL_Init()", SDL_GetError()); #if SDL_VERSION_ATLEAST(2,0,0) SDLFlags = SDL_WINDOW_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_WINDOW_RESIZABLE; sdl_window = NULL; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); do { if (sdl_window) SDL_DestroyWindow(sdl_window); if (aa_level > 0) { if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1)) s3dprintf(VHIGH, "error initializing multisampling"); if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, aa_level)) s3dprintf(VHIGH, "no multisampling available"); } sdl_window = SDL_CreateWindow("S3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, X_RES, Y_RES, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE); if (!sdl_window) errs("SDL_CreateWindow()", SDL_GetError()); /* more opengl-init-stuff */ glcontext = SDL_GL_CreateContext(sdl_window); if (!glcontext) { if (aa_level > 0) { s3dprintf(MED, "retry without multisampling"); aa_level = 0; SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } else { errsf("SDL_GL_CreateContext()", SDL_GetError()); } } } while (!glcontext); #else SDLFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE | SDL_RESIZABLE; if ((VideoInfo = (SDL_VideoInfo *) SDL_GetVideoInfo()) == NULL) errs("SDL_GetVIdeoInfo()", SDL_GetError()); else { if (VideoInfo->hw_available) { s3dprintf(LOW, "detected HW_SURFACE"); SDLFlags |= SDL_HWSURFACE; } else { s3dprintf(LOW, "detected SW_SURFACE"); SDLFlags |= SDL_SWSURFACE; } if (VideoInfo->blit_hw) SDLFlags |= SDL_HWACCEL; } /* set some opengl-attributes */ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); do { if (aa_level > 0) { if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1)) s3dprintf(VHIGH, "error initializing multisampling"); if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, aa_level)) s3dprintf(VHIGH, "no multisampling available"); } /* more opengl-init-stuff */ if ((GLwin = SDL_SetVideoMode(X_RES, Y_RES, 16, SDLFlags)) == NULL) { if (aa_level > 0) { s3dprintf(MED, "retry without multisampling"); aa_level = 0; SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } else errsf("SDL_SetVideoMode()", SDL_GetError()); } } while (GLwin == NULL); SDL_WM_SetCaption("S3D", "S3D"); #endif if (aa_level > 0) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &samples); s3dprintf(LOW, "Buffers: %d Samples: %d", buffers, samples); } /* print some information */ #if !SDL_VERSION_ATLEAST(2,0,0) s3dprintf(MED, "Screen BPP: %d", SDL_GetVideoSurface()->format->BitsPerPixel); #endif s3dprintf(VLOW, "Vendor : %s", glGetString(GL_VENDOR)); s3dprintf(VLOW, "Renderer : %s", glGetString(GL_RENDERER)); s3dprintf(VLOW, "Version : %s", glGetString(GL_VERSION)); s3dprintf(VLOW, "Extensions : %s", glGetString(GL_EXTENSIONS)); graphics_reshape(X_RES, Y_RES); return 0; } int graphics_quit_sdl(void) { SDL_Quit(); return 0; } s3d-0.2.2.1/server/main.c000066400000000000000000000136051361325167000147520ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" /* contains the prototypes of all modules */ #include "config.h" #include /* nanosleep() */ #include /* exit() */ #include /* sleep(), fork() */ #define X_RES 800 #define Y_RES 600 #include /* getopt() */ #include /* strcmp() */ #ifdef SIGS #include /* signal() */ #endif #include /* errno() */ int frame_mode = 0; static int kidpid = 0; static int norc = 0; int running; static const char *rc = NULL; static const char *homerc = "~/.s3drc"; static const char *etcrc = S3D_CFG_INSTALL_DIR "/s3drc"; /*static int father_done=0;*/ static const char **s3drc[] = { &rc, &homerc, &etcrc }; static void mainloop(void); #ifdef SIGS /* handles the SIGINT command. maybe put signals in a special file? */ static void sigint_handler(int S3DUNUSED(sig)) { s3dprintf(HIGH, "oh my gosh there is a sigint/term signal! running away ..."); quit(); } static void sigchld_handler(int S3DUNUSED(sig)) { if (kidpid != 0) { kidpid = 0; s3dprintf(HIGH, "how cruel, my kid died!!"); quit(); } } #endif static void sigusr_handler(int S3DUNUSED(sig)) { s3dprintf(HIGH, "father told use he's done, so lets start to think about the rc file ..."); running = 1; } int rc_init(void) { #ifdef SIGS int ret, i; struct timespec t = { 0, 10 * 1000 * 1000 }; /* 10 mili seconds */ kidpid = fork(); if (kidpid == -1) { errsf("rc_init()", "*sobsob*, can't fork"); exit(1); } if (kidpid == 0) { if (signal(SIGUSR1, sigusr_handler) == SIG_ERR) errn("init():signal()", errno); /* giving the father lots of time to set his signal handler * and all his sockets up */ while (!running) nanosleep(&t, NULL); for (i = 0; i < ((int)(sizeof(s3drc) / sizeof(char **))); i++) { if ((*s3drc[i]) != NULL) { s3dprintf(LOW, "[RC] launching %s", *s3drc[i]); ret = system(*s3drc[i]); s3dprintf(VLOW, "[RC] system() said %d", ret); if (ret < 128) { s3dprintf(LOW, "V[RC] system() did well, I guess. let's die clean now."); exit(0); } } } errs("rc_init()", "no usuable rc script found."); if (rc == NULL) { errs("rc_init()", "You don't have an rc-script? Think about creating one (~/.s3drc), its handy :)"); errs("rc_init()", "Starting anyway ..."); while (1) sleep(1); } else { errs("rc_init()", "no usuable rc script found."); errs("rc_init()", "Check your rc-script!"); } exit(1); } else { if (signal(SIGCHLD, sigchld_handler) == SIG_ERR) { } /* father just returns */ } #endif return 0; } /* the mainloop, should be handling all signals */ static void mainloop(void) { while (running) { one_time(); } } /* things which should be done each time in main loop go here! this is */ /* just for the case we use a function for the mainloop like we do for glut... */ void one_time(void) { struct timespec t = { 0, 10 * 1000 * 1000 }; /* 10 mili seconds */ nanosleep(&t, NULL); user_main(); network_main(); graphics_main(); } /* this initalizes all components. */ int init(void) { #ifdef __APPLE__ NSApplicationLoad(); #endif #ifdef SIGS if (!norc) rc_init(); #else s3dprintf(VHIGH, "rc-files won't work without signals :("); #endif if (!frame_mode) { /* turn default frame_mode on */ #ifdef G_SDL frame_mode = FRAME_SDL; #else #endif } if (!frame_mode) { errsf("init()", "no framework mode available"); return -1; } graphics_init(); network_init(); user_init(); process_init(); running = 1; #ifdef SIGS if (signal(SIGINT, sigint_handler) == SIG_ERR) errn("init():signal()", errno); if (signal(SIGTERM, sigint_handler) == SIG_ERR) errn("init():signal()", errno); if (kidpid != 0) kill(kidpid, SIGUSR1); #endif return 0; } /* things to be cleaned up */ void quit(void) { if (running != 0) { user_quit(); network_quit(); graphics_quit(); process_quit(); #ifdef SIGS if (kidpid != 0) { /* our kid is most probably still alive. kill it!! */ s3dprintf(HIGH, "kill all the kids!!"); kill(kidpid, SIGTERM); kidpid = 0; } #endif } running = 0; s3dprintf(VHIGH, "byebye, s3d quitting ..."); exit(0); } /* processing arguments from the commandline */ static int process_args(int argc, char **argv) { int lopt_idx; int c; struct option long_options[] = { { "multisample", 1, NULL, 'm'}, {"rc", 1, NULL, 'r'}, {"help", 0, NULL, 'h'}, {"use-sdl", 0, NULL, 's'}, {"no-rc", 0, NULL, 'n'}, {NULL, 0, NULL, 0} }; while (-1 != (c = getopt_long(argc, argv, "?hgsnr:m:", long_options, &lopt_idx))) { switch (c) { case 0: break; case 's': #ifdef G_SDL frame_mode = FRAME_SDL; #else errsf("process_args()", "sorry, SDL is not available"); #endif break; case 'r': s3dprintf(VHIGH, "using rc file: %s", optarg); rc = optarg; break; case 'm': aa_level = atoi(optarg); if (aa_level >= 0 || aa_level <= 16) s3dprintf(VHIGH, "aa_level: %d", aa_level); else errsf("process_args()", "bad multisampling level"); break; case 'n': s3dprintf(VHIGH, "Using no rc file!"); norc = 1; break; case '?': case 'h': s3dprintf(VHIGH, "usage: %s [options]", argv[0]); s3dprintf(VHIGH, "s3d, the 3d server:"); s3dprintf(VHIGH, " --multisample, -m:\tSpecify Multisampling level (antialiasing) if available.\n\t\t(value 1-16, default 4, 0 = off),"); s3dprintf(VHIGH, " --rc, -r:\tspecify a rc (startup script)"); s3dprintf(VHIGH, " --no-rc, -n:\tdon't use a rc file (useful for debugging mcp's)"); #ifdef G_SDL s3dprintf(VHIGH, " --use-sdl, -s:\tuse SDL as framework-system"); #endif s3dprintf(VHIGH, " --help, -?, -h: this helpful text"); errsf("process_args()", "exiting for users sake"); return -1; } } return 0; } /* things to be done when program is started */ int main(int argc, char **argv) { process_args(argc, argv); init(); mainloop(); quit(); return 0; } s3d-0.2.2.1/server/matrix.c000066400000000000000000000105751361325167000153350ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* this file gives some simple matrix functionality for things I was unable */ /* to do with OpenGL */ #include "global.h" #include /* memcpy() */ #define DEG2RAD (M_PI/180.0) static t_mtrx MAT; t_mtrx Identity = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; void myLoadIdentity(void) { memcpy(MAT, Identity, sizeof(t_mtrx)); } #define I(x, y) x*4+y #define M(x, y) MAT[I(x, y)] static void mat_debug(t_mtrx S) { s3dprintf(MED, "MAT_0: %.2f %.2f %.2f %.2f", S[I(0, 0)], S[I(1, 0)], S[I(2, 0)], S[I(3, 0)]); s3dprintf(MED, "MAT_1: %.2f %.2f %.2f %.2f", S[I(0, 1)], S[I(1, 1)], S[I(2, 1)], S[I(3, 1)]); s3dprintf(MED, "MAT_2: %.2f %.2f %.2f %.2f", S[I(0, 2)], S[I(1, 2)], S[I(2, 2)], S[I(3, 2)]); s3dprintf(MED, "MAT_3: %.2f %.2f %.2f %.2f", S[I(0, 3)], S[I(1, 3)], S[I(2, 3)], S[I(3, 3)]); } void myMultMatrix(t_mtrx mat2) { int i, j, k; t_mtrx mat_d; /* destination matrix */ for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { mat_d[I(i, j)] = 0.0F; for (k = 0; k < 4; k++) mat_d[I(i, j)] += M(k, j) * mat2[I(i, k)]; } memcpy(MAT, mat_d, sizeof(t_mtrx)); } void myGetMatrix(t_mtrx mat) { memcpy(mat, MAT, sizeof(t_mtrx)); } void mySetMatrix(t_mtrx mat) { memcpy(MAT, mat, sizeof(t_mtrx)); } void myTransform4f(float *v) { float w[4]; w[0] = v[0] * M(0, 0) + v[1] * M(1, 0) + v[2] * M(2, 0) + v[3] * M(3, 0); w[1] = v[0] * M(0, 1) + v[1] * M(1, 1) + v[2] * M(2, 1) + v[3] * M(3, 1); w[2] = v[0] * M(0, 2) + v[1] * M(1, 2) + v[2] * M(2, 2) + v[3] * M(3, 2); w[3] = v[0] * M(0, 3) + v[1] * M(1, 3) + v[2] * M(2, 3) + v[3] * M(3, 3); memcpy(v, w, sizeof(w)); } void myTransform3f(float *v) { float w[3]; w[0] = v[0] * M(0, 0) + v[1] * M(1, 0) + v[2] * M(2, 0) + 1.0F * M(3, 0); w[1] = v[0] * M(0, 1) + v[1] * M(1, 1) + v[2] * M(2, 1) + 1.0F * M(3, 1); w[2] = v[0] * M(0, 2) + v[1] * M(1, 2) + v[2] * M(2, 2) + 1.0F * M(3, 2); memcpy(v, w, sizeof(w)); } void myTransformV(struct t_vertex *v) { struct t_vertex w; w.x = v->x * M(0, 0) + v->y * M(1, 0) + v->z * M(2, 0) + 1.0F * M(3, 0); w.y = v->x * M(0, 1) + v->y * M(1, 1) + v->z * M(2, 1) + 1.0F * M(3, 1); w.z = v->x * M(0, 2) + v->y * M(1, 2) + v->z * M(2, 2) + 1.0F * M(3, 2); memcpy(v, &w, sizeof(struct t_vertex)); } #undef M #define M(x, y) Mm[I(x, y)] #define P(x, y) Pm[I(x, y)] /* this inverts the matrix M into P in the gauss way */ int myInvert(void) { t_mtrx Mm, Pm; int l, lh; /* line */ float f; /* factor */ int i; /* number */ memcpy(Mm, MAT, sizeof(t_mtrx)); /* backup matrix */ memcpy(Pm, Identity, sizeof(t_mtrx)); /* target */ /* step 1 */ for (l = 0; l < 4; l++) { check: if (M(l, l) * M(l, l) > 0.00000001F) { /* it won't work with real zero */ /* s3dprintf(MED,"normalizing line %d",l); */ /* normalize */ f = 1 / M(l, l); M(l, l) = 1.0; for (i = l + 1; i < 4; i++) M(i, l) *= f; /* the left side ... */ for (i = 0; i < 4; i++) P(i, l) *= f; /* ... and the right */ /* mult/fac */ for (lh = l + 1; lh < 4; lh++) { if (M(l, lh) != 0) { /* "first" element of the line */ f = -M(l, lh); M(l, lh) = 0.0; /* yes, this WILL be zero! ... */ for (i = l + 1; i < 4; i++) /* left side */ M(i, lh) += f * M(i, l); for (i = 0; i < 4; i++) /* ... and the right one! */ P(i, lh) += f * P(i, l); } } } else { M(l, l) = 0.0F; for (lh = l + 1; lh < 4; lh++) if (M(l, lh) != 0.0) { for (i = 0; i < 4; i++) { f = M(i, l); M(i, l) = M(i, lh); M(i, lh) = f; f = P(i, l); P(i, l) = P(i, lh); P(i, lh) = f; } goto check; } s3dprintf(MED, "nothing to swap, can't reverse this matrix! returning ... "); mat_debug(Mm); return -1; /* the dead end!! */ } } /* matrix should look like this now: */ /* (1???|????) * (01??|????) * (001?|????) * (0001|????) * * (M = left side, P = right side) * */ /* step 2 */ for (l = 3; l > 0; l--) { /* mult/fac */ for (lh = l - 1; lh >= 0; lh--) { if (M(l, lh) != 0) { /* "first" element of the line */ f = -M(l, lh); M(l, lh) = 0; for (i = 0; i < 4; i++) { /* ... and the right one! */ P(i, lh) += f * P(i, l); } } } } /* now, Mm,is Identity and Pm is result! */ memcpy(MAT, Pm, sizeof(t_mtrx)); /* copy result */ return 0; } s3d-0.2.2.1/server/mcp.c000066400000000000000000000041631361325167000146040ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include "proto.h" /* for S3D_P_OBJECT, to be integrated in proto.c */ #ifdef WIN32 #include #else #include /* htonl() */ #endif #include /* strncpy() */ /* this interacts with the actual mcp client */ struct mcp_object { uint32_t object; float trans_x, trans_y, trans_z; float r; /* char event; */ char name[S3D_NAME_MAX]; }; #define MCP_NEW_OBJECT 1 /* call when a new mcp connects */ int mcp_init(void) { struct t_process *p; uint32_t i; p = get_proc_by_pid(MCP); i = p->n_obj; while (i--) { if (p->object[i] != NULL) switch (p->object[i]->oflags & OF_TYPE) { case OF_VIRTUAL: mcp_rep_object(i); break; case OF_CAM: event_obj_info(p, i); break; } } mcp_focus(-1); return 0; } /* report the mcp about our object */ int mcp_rep_object(int32_t mcp_oid) { struct mcp_object mo; struct t_process *p, *ap; p = get_proc_by_pid(MCP); mo.object = htonl(mcp_oid); mo.trans_x = p->object[mcp_oid]->translate.x; mo.trans_y = p->object[mcp_oid]->translate.y; mo.trans_z = p->object[mcp_oid]->translate.z; mo.r = p->object[mcp_oid]->r; htonfb(&mo.trans_x, 4); ap = get_proc_by_pid(p->object[mcp_oid]->virtual_pid); strncpy(mo.name, ap->name, sizeof(mo.name)); mo.name[sizeof(mo.name) - 1] = '\0'; prot_com_out(p, S3D_P_MCP_OBJECT, (uint8_t *) & mo, sizeof(struct mcp_object)); return 0; } /* tells the mcp that some program vanished ... */ int mcp_del_object(int32_t mcp_oid) { int32_t oid = htonl(mcp_oid); if (mcp_oid == focus_oid) { s3dprintf(MED, "lost the focus of mcp-oid %d", mcp_oid); mcp_focus(-1); } prot_com_out(get_proc_by_pid(MCP), S3D_P_MCP_DEL_OBJECT, (uint8_t *) & oid, 4); return 0; } /* sets a new focus */ int mcp_focus(int oid) { struct t_process *p; struct t_obj *o; focus_oid = -1; p = get_proc_by_pid(MCP); s3dprintf(MED, "request to focus %d", oid); if (OBJ_VALID(p, oid, o)) if (o->oflags & OF_VIRTUAL) { focus_oid = oid; obj_pos_update(p, 0, 0); } return 0; } s3d-0.2.2.1/server/navigation.c000066400000000000000000000033331361325167000161620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* atan() */ void navi_right(void) { navi_pos(1, 0); } void navi_left(void) { navi_pos(-1, 0); } void navi_fwd(void) { navi_pos(0, 1); } void navi_back(void) { navi_pos(0, -1); } void navi_pos(int xdif, int ydif) { float tv[3]; struct t_obj *cam; cam = get_proc_by_pid(MCP)->object[0]; tv[0] = cam->translate.x; tv[1] = cam->translate.y; tv[2] = cam->translate.z; tv[0] += ydif * sin((-cam->rotate.y * M_PI) / 180); tv[2] -= ydif * cos((-cam->rotate.y * M_PI) / 180); tv[0] -= xdif * cos((-cam->rotate.y * M_PI) / 180); tv[2] -= xdif * sin((-cam->rotate.y * M_PI) / 180); obj_translate(get_proc_by_pid(MCP), 0, tv); } void navi_rot(int xdif, int ydif) { float rv[3]; struct t_obj *cam; cam = get_proc_by_pid(MCP)->object[0]; rv[0] = (cam->rotate.x + ydif); rv[1] = (cam->rotate.y + xdif); rv[2] = 0.0F; if (rv[0] > 90) rv[0] = 90; if (rv[0] < -90) rv[0] = -90; if (rv[1] > 360) rv[1] -= 360; if (rv[1] < 0) rv[1] += 360; obj_rotate(get_proc_by_pid(MCP), 0, rv); } void ptr_move(int x, int y) { float tv[3], rv[3], xf, yf; struct t_process *p; int ptr; if (winw > winh) { xf = winw / (float)winh; yf = 1; } else { xf = 1; yf = winh / (float)winw; } tv[0] = (2.0 * x / ((float)winw) - 1.0) * xf; tv[1] = -(2.0 * y / ((float)winh) - 1.0) * yf; tv[2] = -1; rv[0] = 1.5 * 180 / M_PI * atan(tv[1] / 2); /* TODO: Hm, this is not really correct ... */ rv[1] = 1.5 * 180 / M_PI * -atan(tv[0] / 2); rv[2] = 0; p = get_proc_by_pid(MCP); if (-1 != (ptr = get_pointer(p))) { obj_translate(p, ptr, tv); obj_rotate(p, ptr, rv); } } s3d-0.2.2.1/server/network.c000066400000000000000000000060611361325167000155150ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include #include /* free() */ #include /* errno() */ #include /* close(), read(),write() */ #include /* SIGPIPE,SIG_ERR,SIGIO */ #ifdef G_SDL #include /* SDL_SetTimer() */ #endif #ifdef SIGS #include /* sighandler_t SIG_PIPE */ #endif /* here go all the network functions */ /* */ /* right now, there is only a basic implementation for tcp-scokets. */ /* upcoming are unix-sockets and ipv6-support */ /* defines: */ uint8_t ibuf[MAXPLEN]; /* input buffer for a packet */ uint8_t obuf[MAXPLEN]; /* output buffer */ #ifdef SIGS static int sigio = 0; #endif #ifdef SIGS void sigpipe_handler(int S3DUNUSED(unused)) { errs("sigpip_handler()", "there is a broken pipe somewhere"); } void sigio_handler(int S3DUNUSED(unused)) { sigio = 1; } #endif /* maybe change the errors to fatal errors ... */ int network_init(void) { #ifdef SIGS /* struct sigaction act; */ #endif #ifdef TCP tcp_init(); #endif #ifdef SHM shm_init(); #endif #ifdef SIGS if (signal(SIGPIPE, sigpipe_handler) == SIG_ERR) errn("network_init():signal()", errno); if (signal(SIGIO, sigio_handler) == SIG_ERR) errn("s3d_init():signal()", errno); #endif return 0; } volatile int turn; uint32_t net_turn_off(uint32_t S3DUNUSED(interval), void *S3DUNUSED(param)) { s3dprintf(VLOW, "Warning: High traffic on Network, interrupting read."); turn = 0; return 0; } /* this basicly polls for new connection */ int network_main(void) { #ifdef G_SDL SDL_TimerID net_off_timer; #endif turn = 1; #ifdef TCP #ifdef SIGS if (sigio == 1) { /* as long as there is no locking/threadsafety, do like this ... */ #endif tcp_pollport(); /* this polls for new processes */ #ifdef G_SDL net_off_timer = SDL_AddTimer(50, net_turn_off, NULL); #endif while (turn && tcp_pollproc()) { } /* if there is new data, loop please. this is for testing now, and should be combined with timing later .. */ #ifdef G_SDL SDL_RemoveTimer(net_off_timer); #endif #ifdef SIGS sigio = 0; } #endif #endif #ifdef SHM shm_main(); #endif return 0; } int n_remove(struct t_process *p) { switch (p->con_type) { #ifdef SHM case CON_SHM: shm_remove(p); break; #endif #ifdef TCP case CON_TCP: tcp_remove(p->sockid); break; #endif } p->con_type = CON_NULL; return -1; } int n_readn(struct t_process *p, uint8_t * str, int s) { switch (p->con_type) { #ifdef TCP case CON_TCP: return tcp_readn(p->sockid, str, s); #endif #ifdef SHM case CON_SHM: return shm_readn((struct buf_t *)p->shmsock.data_ctos, str, s); #endif } return -1; } int n_writen(struct t_process *p, uint8_t * str, int s) { switch (p->con_type) { #ifdef TCP case CON_TCP: return tcp_writen(p->sockid, str, s); #endif #ifdef SHM case CON_SHM: return shm_writen((struct buf_t *)p->shmsock.data_stoc, str, s); #endif } return -1; } int network_quit(void) { #ifdef TCP tcp_quit(); #endif #ifdef SHM shm_quit(); #endif return 0; } s3d-0.2.2.1/server/object.c000066400000000000000000001672351361325167000153050ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich * SPDX-FileCopyrightText: 2004-2015 Sven Eckelmann */ #include "global.h" #include /* malloc(),realloc(),free() */ #include /* memcpy() */ #if G_SDL #include /* GL_GENERATE_MIPMAP */ #else #include /* gl*, GL* */ #include /* GL_GENERATE_MIPMAP */ #endif #ifndef _ISOC99_SOURCE /* we want isnan() */ #define _ISOC99_SOURCE #endif #include /* sin(),cos() */ #include /* errno */ #ifdef SHM #include #include #include #endif #define MAXLOOP 10 /* if oid is always unsigned, we don't have to check oid>=0 */ static void obj_sys_update(struct t_process *p, int32_t oid); static int texture_shm_register(struct t_tex *tex, int bufsize); static void texture_delete(struct t_tex *tex); /* debugging function for objects, prints out some stuff known about it... */ int obj_debug(struct t_process *p, int32_t oid) { struct t_obj *o; s3dprintf(HIGH, "about pid %d/obj %d:", p->id, oid); if (OBJ_VALID(p, oid, o)) { s3dprintf(HIGH, "vertices: %d, polygons: %d, materials: %d, textures: %d, flags: %010x", o->n_vertex, o->n_poly, o->n_mat, o->n_tex, o->oflags); s3dprintf(HIGH, "linkid %d, displaylist %d", o->linkid, o->dplist); s3dprintf(HIGH, "translation: %f %f %f", o->translate.x, o->translate.y, o->translate.z); s3dprintf(HIGH, "rotation: %f %f %f", o->rotate.x, o->rotate.y, o->rotate.z); s3dprintf(HIGH, "scale: %f", o->scale); if (o->oflags & OF_SYSTEM) { s3dprintf(HIGH, "it's a system object!!"); } else if (o->oflags & OF_CLONE) { s3dprintf(HIGH, "it's a clone linking to %d", o->clone_ooid); obj_debug(p, o->clone_ooid); } } else { s3dprintf(HIGH, "can't get oid %d pid %d", oid, p->id); } return 0; } /* push a few new vertices onto the stack. */ int obj_push_vertex(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, m; struct t_vertex *p_vertex; struct t_vertex *a; struct t_obj *obj; float *px; float r; int is_clnsrc; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_push_vertex()", "error: no data on object allowed!"); return -1; } m = obj->n_vertex; /* saving the first number of vertices */ px = x; /* movable pointer for x, later */ if (NULL != (p_vertex = (struct t_vertex *)realloc(obj->p_vertex, sizeof(struct t_vertex) * (n + (obj->n_vertex))))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_vertex = p_vertex; for (i = 0; i < n; i++) { obj->p_vertex[m + i].x = *(px++); obj->p_vertex[m + i].y = *(px++); obj->p_vertex[m + i].z = *(px++); a = &obj->p_vertex[m + i]; r = obj->scale * sqrt((a->x * a->x) + (a->y * a->y) + (a->z * a->z)); if (r > obj->r) obj->r = r; } if (p->id != MCP) { /* this is doing live update which is quite okay, but we need * to check for biggest update and clonesources ... */ obj_check_biggest_object(p, oid); } if (p->object[oid]->oflags & OF_CLONE_SRC) { is_clnsrc = 0; for (i = 0; i < p->n_obj; i++) { if (p->object[i] != NULL) { if ((p->object[i]->oflags & OF_CLONE) && (p->object[i]->n_vertex == oid)) { /* if it's pointing to our object ... */ is_clnsrc = 1; p->object[i]->r = obj->r * (p->object[i]->r / obj->scale); /* give it the new radius too! */ obj_check_biggest_object(p, i); } } } if (!is_clnsrc) p->object[oid]->oflags &= ~OF_CLONE_SRC; } obj->n_vertex += n; } } else { return -1; } return 0; } int obj_push_mat(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, m; struct t_mat *p_mat; struct t_obj *obj; float *px; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_push_mat()", "error: no data on object allowed!"); return -1; } m = obj->n_mat; /* saving the first number of materials */ px = x; /* movable pointer for x, later */ if (NULL != (p_mat = (struct t_mat *)realloc(obj->p_mat, sizeof(struct t_mat) * (n + (obj->n_mat))))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_mat = p_mat; for (i = 0; i < n; i++) { obj->p_mat[m + i].amb_r = *(px++); obj->p_mat[m + i].amb_g = *(px++); obj->p_mat[m + i].amb_b = *(px++); obj->p_mat[m + i].amb_a = *(px++); obj->p_mat[m + i].spec_r = *(px++); obj->p_mat[m + i].spec_g = *(px++); obj->p_mat[m + i].spec_b = *(px++); obj->p_mat[m + i].spec_a = *(px++); obj->p_mat[m + i].diff_r = *(px++); obj->p_mat[m + i].diff_g = *(px++); obj->p_mat[m + i].diff_b = *(px++); obj->p_mat[m + i].diff_a = *(px++); obj->p_mat[m + i].tex = -1; } obj->n_mat += n; } } else { return -1; } return 0; } /* its always the same ... this time we push some polys on the stack */ int obj_push_poly(struct t_process *p, int32_t oid, uint32_t * x, int32_t n) { int32_t i, m; struct t_poly *p_poly; struct t_obj *obj; uint32_t *px; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_push_poly()", "error: no data on object allowed!"); return -1; } m = obj->n_poly; /* saving the first number of polys */ px = x; /* movable pointer for x, later */ if (NULL != (p_poly = (struct t_poly *)realloc(obj->p_poly, sizeof(struct t_poly) * (n + (obj->n_poly))))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_poly = p_poly; for (i = 0; i < n; i++) { obj->p_poly[m + i].v[0] = *(px++); obj->p_poly[m + i].v[1] = *(px++); obj->p_poly[m + i].v[2] = *(px++); obj->p_poly[m + i].mat = *(px++); obj->p_poly[m + i].n[0].x = obj->p_poly[m + i].n[0].y = obj->p_poly[m + i].n[0].z = 0; obj->p_poly[m + i].n[1].x = obj->p_poly[m + i].n[1].y = obj->p_poly[m + i].n[1].z = 0; obj->p_poly[m + i].n[2].x = obj->p_poly[m + i].n[2].y = obj->p_poly[m + i].n[2].z = 0; obj->p_poly[m + i].tc[0].x = obj->p_poly[m + i].n[0].y = obj->p_poly[m + i].n[0].z = 0; obj->p_poly[m + i].tc[1].x = obj->p_poly[m + i].n[1].y = obj->p_poly[m + i].n[1].z = 0; obj->p_poly[m + i].tc[2].x = obj->p_poly[m + i].n[2].y = obj->p_poly[m + i].n[2].z = 0; } obj->n_poly += n; } } else { return -1; } return 0; } /* its always the same ... this time we push some lines on the stack */ int obj_push_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n) { int32_t i, m; struct t_line *p_line; struct t_obj *obj; uint32_t *px; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_push_line()", "error: no data on object allowed!"); return -1; } m = obj->n_line; /* saving the first number of lines */ px = x; /* movable pointer for x, later */ if (NULL != (p_line = (struct t_line *)realloc(obj->p_line, sizeof(struct t_line) * (n + (obj->n_line))))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_line = p_line; for (i = 0; i < n; i++) { obj->p_line[m + i].v[0] = *(px++); obj->p_line[m + i].v[1] = *(px++); obj->p_line[m + i].mat = *(px++); obj->p_line[m + i].n[0].x = obj->p_line[m + i].n[0].y = obj->p_line[m + i].n[0].z = 0; obj->p_line[m + i].n[1].x = obj->p_line[m + i].n[1].y = obj->p_line[m + i].n[1].z = 0; } obj->n_line += n; } } else { return -1; } return 0; } /* register the texture, if possible */ static int texture_shm_register(struct t_tex *tex, int bufsize) { #ifdef SHM int key; key = shm_next_key(); if ((tex->shmid = shmget(key, bufsize, 0644 | IPC_CREAT)) == -1) { errn("texture_shm_register():shmget()", errno); return -1; } tex->buf = (uint8_t *) shmat(tex->shmid, (void *)0, 0); if ((key_t *) tex->buf == (key_t *) (-1)) { errn("shm_init():shmat()", errno); shmctl(tex->shmid, IPC_RMID, NULL); tex->shmid = -1; return -1; } return 0; #else return -1; #endif } /* delete the texture, eventually detach from the shm segment */ static void texture_delete(struct t_tex *tex) { GLuint t; s3dprintf(HIGH, "texture delete: shmid = %d, buf = %10p\n", tex->shmid, (void *)tex->buf); #ifdef SHM if (tex->shmid != -1) { if (tex->buf != NULL) { shmdt(tex->buf); tex->buf = NULL; } shmctl(tex->shmid, IPC_RMID, NULL); tex->shmid = -1; } #endif if (tex->buf != NULL) free(tex->buf); if (tex->gl_texnum) { t = tex->gl_texnum; glDeleteTextures(1, &t); } } /* creates n new textures on the texture stack, of object oid, with (w,h) * given through *x */ int obj_push_tex(struct t_process *p, int32_t oid, uint16_t * x, int32_t n) { int32_t i, m; struct t_tex *p_tex; struct t_obj *obj; uint16_t *px, hm; int bufsize; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_push_tex()", "error: no data on object allowed!"); return -1; } m = obj->n_tex; /* saving the first number of textures */ px = x; /* movable pointer for x, later */ if (NULL != (p_tex = (struct t_tex *)realloc(obj->p_tex, sizeof(struct t_tex) * (n + (obj->n_tex))))) { obj->p_tex = p_tex; for (i = 0; i < n; i++) { obj->p_tex[m + i].gl_texnum = -1; obj->p_tex[m + i].shmid = -1; obj->p_tex[m + i].tw = *(px++); obj->p_tex[m + i].th = *(px++); if ((obj->p_tex[m + i].tw <= TEXTURE_MAX_W) && (obj->p_tex[m + i].th <= TEXTURE_MAX_H) && (obj->p_tex[m + i].tw > 0) && (obj->p_tex[m + i].th > 0)) { /* find the next power of 2 that can hold the width of the texture */ for (hm = 1; hm < obj->p_tex[m + i].tw; hm *= 2) { } s3dprintf(MED, "hm %d, tw %d", hm, obj->p_tex[m + i].tw); obj->p_tex[m + i].w = hm; if (hm == obj->p_tex[m + i].tw) obj->p_tex[m + i].xs = 1.0; else obj->p_tex[m + i].xs = (float)((double)obj->p_tex[m + i].tw) / ((double)obj->p_tex[m + i].w); /* find the next power of 2 that can hold the height of the texture */ for (hm = 1; hm < obj->p_tex[m + i].th; hm *= 2) { } s3dprintf(MED, "hm %d, th %d", hm, obj->p_tex[m + i].th); obj->p_tex[m + i].h = hm; if (hm == obj->p_tex[m + i].th) obj->p_tex[m + i].ys = 1.0; else obj->p_tex[m + i].ys = (float)((double)obj->p_tex[m + i].th) / ((double)obj->p_tex[m + i].h); errds(LOW, "obj_push_tex()", "setting up %d %d (in mem: %d %d) texture", obj->p_tex[m + i].tw, obj->p_tex[m + i].th, obj->p_tex[m + i].w, obj->p_tex[m + i].h); bufsize = obj->p_tex[m + i].h * obj->p_tex[m + i].w * 4; if (texture_shm_register(&(obj->p_tex[m + i]), bufsize) == 0) event_texshm(p, oid, m + i); else obj->p_tex[m + i].buf = (uint8_t *) malloc(bufsize); memset(obj->p_tex[m + i].buf, 0, bufsize); } else { errds(MED, "obj_push_tex()", "bad size for texture %d (requested size: %dx%d, max %dx%d)", m + i, obj->p_tex[m + i].tw, obj->p_tex[m + i].th, TEXTURE_MAX_W, TEXTURE_MAX_H); obj->p_tex[m + i].buf = NULL; } } obj->n_tex += n; } } else { return -1; } return 0; } /* add some normal information to the polygon buffer */ int obj_pep_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; float len; if (OBJ_VALID(p, oid, obj)) { m = obj->n_poly; if (m < n) /* saving the first number of polys */ n = m; /* when more polygons than available should be pepped, */ /* just pep the first m polygons */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_poly_normal()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping poly's %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { for (j = 0; j < 3; j++) { obj->p_poly[i].n[j].x = *(px++); obj->p_poly[i].n[j].y = *(px++); obj->p_poly[i].n[j].z = *(px++); len = sqrt(obj->p_poly[i].n[j].x * obj->p_poly[i].n[j].x + obj->p_poly[i].n[j].y * obj->p_poly[i].n[j].y + obj->p_poly[i].n[j].z * obj->p_poly[i].n[j].z); if (len == 0) obj->p_poly[i].n[j].x = obj->p_poly[i].n[j].y = obj->p_poly[i].n[j].z = 0; else { obj->p_poly[i].n[j].x /= len; obj->p_poly[i].n[j].y /= len; obj->p_poly[i].n[j].z /= len; } } } } else { return -1; } return 0; } /* add some normal information to the line buffer */ int obj_pep_line_normal(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; float len; if (OBJ_VALID(p, oid, obj)) { m = obj->n_line; if (m < n) /* saving the first number of lines */ n = m; /* when more lines than available should be pepped, */ /* just pep the first m liness */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_line_normal()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping line's %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { for (j = 0; j < 2; j++) { obj->p_line[i].n[j].x = *(px++); obj->p_line[i].n[j].y = *(px++); obj->p_line[i].n[j].z = *(px++); len = sqrt(obj->p_line[i].n[j].x * obj->p_line[i].n[j].x + obj->p_line[i].n[j].y * obj->p_line[i].n[j].y + obj->p_line[i].n[j].z * obj->p_line[i].n[j].z); if (len == 0) obj->p_line[i].n[j].x = obj->p_line[i].n[j].y = obj->p_line[i].n[j].z = 0; else { obj->p_line[i].n[j].x /= len; obj->p_line[i].n[j].y /= len; obj->p_line[i].n[j].z /= len; } } } } else { return -1; } return 0; } /* add textures coordinates to each vertex of the polygon(s) */ int obj_pep_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_poly_texc()", "error: no data on object allowed!"); return -1; } m = obj->n_poly; if (m < n) /* saving the first number of polys */ n = m; /* when more polygons than available should be pepped, */ /* just pep the first m polygons */ px = x; /* movable pointer for x, later */ if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping poly's %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { for (j = 0; j < 3; j++) { obj->p_poly[i].tc[j].x = *(px++); obj->p_poly[i].tc[j].y = *(px++); } } } else { return -1; } return 0; } /* overwrite n latest materials with some other materials */ int obj_pep_mat(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, m; struct t_obj *obj; float *px; if (OBJ_VALID(p, oid, obj)) { m = obj->n_mat; /* saving the first number of materials */ if (m < n) n = m; /* when more mats than available should be pepped, */ /* just pep the first m mats */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_mat()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping mats %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { obj->p_mat[i].amb_r = *(px++); obj->p_mat[i].amb_g = *(px++); obj->p_mat[i].amb_b = *(px++); obj->p_mat[i].amb_a = *(px++); obj->p_mat[i].spec_r = *(px++); obj->p_mat[i].spec_g = *(px++); obj->p_mat[i].spec_b = *(px++); obj->p_mat[i].spec_a = *(px++); obj->p_mat[i].diff_r = *(px++); obj->p_mat[i].diff_g = *(px++); obj->p_mat[i].diff_b = *(px++); obj->p_mat[i].diff_a = *(px++); } } else { return -1; } return 0; } /* overwrite n latest lines with some other lines */ int obj_pep_line(struct t_process *p, int32_t oid, uint32_t * x, int32_t n) { int32_t i, m; struct t_obj *obj; uint32_t *px; if (OBJ_VALID(p, oid, obj)) { m = obj->n_line; /* saving the first number of lines */ if (m < n) n = m; /* when more lines than available should be pepped, */ /* just pep the first m lines */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_line()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping lines %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { obj->p_line[i].v[0] = *(px++); obj->p_line[i].v[1] = *(px++); obj->p_line[i].mat = *(px++); obj->p_line[i].n[0].x = obj->p_line[i].n[0].y = obj->p_line[i].n[0].z = 0; obj->p_line[i].n[1].x = obj->p_line[i].n[1].y = obj->p_line[i].n[1].z = 0; } } else { return -1; } return 0; } /* overwrite n latest vertices with some other vertices */ int obj_pep_vertex(struct t_process *p, int32_t oid, float *x, int32_t n) { int32_t i, m; float r; struct t_vertex *a; struct t_obj *obj; float *px; int is_clnsrc; if (OBJ_VALID(p, oid, obj)) { m = obj->n_vertex; /* saving the first number of vertices */ if (m < n) n = m; /* when more mats than available should be pepped, */ /* just pep the first m mats */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_vertices()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(VLOW, "pepping vertices %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) { obj->p_vertex[i].x = *(px++); obj->p_vertex[i].y = *(px++); obj->p_vertex[i].z = *(px++); a = &obj->p_vertex[i]; r = obj->scale * sqrt((a->x * a->x) + (a->y * a->y) + (a->z * a->z)); if (r > obj->r) obj->r = r; } if (p->id != MCP) { /* this is doing live update which is quite okay, but we need * to check for biggest update and clonesources ... */ obj_check_biggest_object(p, oid); } if (p->object[oid]->oflags & OF_CLONE_SRC) { is_clnsrc = 0; for (i = 0; i < p->n_obj; i++) { if (p->object[i] != NULL) { if ((p->object[i]->oflags & OF_CLONE) && (p->object[i]->clone_ooid == oid)) { /* if it's pointing to our object ... */ is_clnsrc = 1; p->object[i]->r = obj->r * (p->object[i]->r / obj->scale); /* give it the new radius too! */ obj_check_biggest_object(p, i); } } } if (!is_clnsrc) p->object[oid]->oflags &= ~OF_CLONE_SRC; } } else { return -1; } return 0; } /* assign textures to the last n materials */ int obj_pep_mat_tex(struct t_process *p, int32_t oid, uint32_t * x, int32_t n) { int32_t i, m; struct t_obj *obj; uint32_t *px; if (OBJ_VALID(p, oid, obj)) { m = obj->n_mat; /* saving the first number of vertices */ if (m < n) /* saving the first number of polys */ n = m; /* when more mats than available should be pepped, */ /* just pep the first m mats */ px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_mat_tex()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(MED, "pepping mats %d to %d", (m - n), m - 1); for (i = (m - n); i < m; i++) obj->p_mat[i].tex = *(px++); } else { return -1; } return 0; } /* add some normal information to the polygon buffer */ int obj_load_poly_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; float len; if (OBJ_VALID(p, oid, obj)) { if (start < 0) return -1; m = obj->n_poly; if (m < (start + n)) n = m - start; px = x; if (obj->oflags & OF_NODATA) { errds(MED, "obj_load_poly_normal()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } for (i = start; i < (start + n); i++) { for (j = 0; j < 3; j++) { obj->p_poly[i].n[j].x = *(px++); obj->p_poly[i].n[j].y = *(px++); obj->p_poly[i].n[j].z = *(px++); len = sqrt(obj->p_poly[i].n[j].x * obj->p_poly[i].n[j].x + obj->p_poly[i].n[j].y * obj->p_poly[i].n[j].y + obj->p_poly[i].n[j].z * obj->p_poly[i].n[j].z); if (len == 0) obj->p_poly[i].n[j].x = obj->p_poly[i].n[j].y = obj->p_poly[i].n[j].z = 0; else { obj->p_poly[i].n[j].x /= len; obj->p_poly[i].n[j].y /= len; obj->p_poly[i].n[j].z /= len; } } } } else return -1; return 0; } /* add some normal information to the line buffer */ int obj_load_line_normal(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; float len; if (OBJ_VALID(p, oid, obj)) { if (start < 0) return -1; m = obj->n_line; if (m < (start + n)) n = m - start; px = x; if (obj->oflags & OF_NODATA) { errds(MED, "obj_load_line_normal()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } for (i = start; i < (start + n); i++) { for (j = 0; j < 2; j++) { obj->p_line[i].n[j].x = *(px++); obj->p_line[i].n[j].y = *(px++); obj->p_line[i].n[j].z = *(px++); len = sqrt(obj->p_line[i].n[j].x * obj->p_line[i].n[j].x + obj->p_line[i].n[j].y * obj->p_line[i].n[j].y + obj->p_line[i].n[j].z * obj->p_line[i].n[j].z); if (len == 0) obj->p_line[i].n[j].x = obj->p_line[i].n[j].y = obj->p_line[i].n[j].z = 0; else { obj->p_line[i].n[j].x /= len; obj->p_line[i].n[j].y /= len; obj->p_line[i].n[j].z /= len; } } } } else return -1; return 0; } /* add textures coordinates to each vertex of the polygon(s) */ int obj_load_poly_texc(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n) { int32_t i, j, m; struct t_obj *obj; float *px; if (OBJ_VALID(p, oid, obj)) { if (start < 0) return -1; m = obj->n_poly; if (m < (start + n)) n = m - start; px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_load_poly_texc()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } for (i = start; i < (start + n); i++) { for (j = 0; j < 3; j++) { obj->p_poly[i].tc[j].x = *(px++); obj->p_poly[i].tc[j].y = *(px++); } } } else return -1; return 0; } /* load at position start n materials, overwriting old ones */ int obj_load_mat(struct t_process *p, int32_t oid, float *x, int32_t start, int32_t n) { int32_t i, m; struct t_obj *obj; float *px; if (OBJ_VALID(p, oid, obj)) { if (start < 0) return -1; m = obj->n_mat; if (m < (start + n)) n = m - start; px = x; /* movable pointer for x, later */ if (obj->oflags & OF_NODATA) { errds(MED, "obj_pep_mat()", "error: no data on object allowed!"); return -1; } if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } s3dprintf(MED, "pepping %d mats, starting at %d", n, start); for (i = start; i < (start + n); i++) { obj->p_mat[i].amb_r = *(px++); obj->p_mat[i].amb_g = *(px++); obj->p_mat[i].amb_b = *(px++); obj->p_mat[i].amb_a = *(px++); obj->p_mat[i].spec_r = *(px++); obj->p_mat[i].spec_g = *(px++); obj->p_mat[i].spec_b = *(px++); obj->p_mat[i].spec_a = *(px++); obj->p_mat[i].diff_r = *(px++); obj->p_mat[i].diff_g = *(px++); obj->p_mat[i].diff_b = *(px++); obj->p_mat[i].diff_a = *(px++); } } else return -1; return 0; } /* notify graphic system that the texture is updated */ int obj_update_tex(struct t_process *p, int32_t oid, int32_t tid, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * S3DUNUSED(pixbuf)) { GLuint t; struct t_obj *obj; struct t_tex *tex; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_load_tex()", "error: no data on object allowed!"); return -1; } if ((tid < 0) || (tid >= obj->n_tex)) return -1; } else return -1; tex = &obj->p_tex[tid]; if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } if ((tex->gl_texnum) != -1) { t = tex->gl_texnum; s3dprintf(MED, "updating texture %d at [%d %d] with a [%d %d] pixbuf", t, x, y, w, h); glBindTexture(GL_TEXTURE_2D, t); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w, tex->h, GL_RGBA, GL_UNSIGNED_BYTE, tex->buf); } return 0; } /* loads some data into the pixbuf */ int obj_load_tex(struct t_process *p, int32_t oid, int32_t tex, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t * pixbuf) { struct t_obj *obj; struct t_tex *t; int32_t i, p1, p2, m; int16_t mw, mh; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_load_tex()", "error: no data on object allowed!"); return -1; } if (tex < 0) return -1; if (tex < obj->n_tex) { t = &obj->p_tex[tex]; if (t->buf != NULL) { m = t->w * t->th + t->tw; /* maximum: position of the last pixel in the buffer */ if ((x + w) > t->tw) mw = (t->tw - x); else mw = w; if ((y + h) > t->th) mh = (t->th - y); else mh = h; if (mw <= 0) { /* nothing to do */ s3dprintf(MED, "oid %d: texture %d: update out of range\n", oid, tex); return -1; } for (i = 0; i < mh; i++) { p1 = (y + i) * t->w + x; /* scanline start position */ p2 = mw; /* and length */ if (p1 > m) { s3dprintf(MED, "oid %d: texture %d: assert: we shouldn't break here.\n", oid, tex); break; /* need to break here. */ } memcpy(t->buf + 4 * p1, /* draw at p1 position ... */ pixbuf + 4 * i * w, /* scanline number i ... */ 4 * p2); } s3dprintf(MED, "updating texture %d\n", t->gl_texnum); obj_update_tex(p, oid, tex, x, y, w, h, pixbuf); return 0; } else { errds(HIGH, "obj_load_tex()", "no buffer to draw to in oid %d, texture %d", oid, tex); } } } return -1; } int obj_toggle_flags(struct t_process *p, int32_t oid, uint8_t type, uint32_t flags) { struct t_obj *obj; uint32_t f; f = flags & OF_MASK; if (OBJ_VALID(p, oid, obj)) { switch (type) { case OF_TURN_ON: obj->oflags |= f; break; case OF_TURN_OFF: obj->oflags &= ~f; break; case OF_TURN_SWAP: obj->oflags ^= f; break; default: return -1; } } return 0; } /* deletes the last n vertices of the stack. if n>=n_vertex, delete all vertices */ int obj_del_vertex(struct t_process *p, int32_t oid, int32_t n) { int32_t m; struct t_vertex *p_vertex; struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_del_vertex()", "error: can't delete vertices in this object!"); return -1; } s3dprintf(VLOW, "deleting %d vertices of pid %d/ oid %d", n, p->id, oid); m = obj->n_vertex; /* saving the first number of vertices */ if (n >= m) { if (m > 0) free(obj->p_vertex); obj->n_vertex = 0; obj->p_vertex = NULL; } else if (n > 0) { if (NULL != (p_vertex = (struct t_vertex *)realloc(obj->p_vertex, sizeof(struct t_vertex) * (m - n)))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_vertex = p_vertex; obj->n_vertex -= n; } } obj_size_update(p, oid); } else { return -1; } return 0; } /* deletes the last n materials of the stack. if n>=n_mat, delete all materials */ int obj_del_mat(struct t_process *p, int32_t oid, int32_t n) { int32_t m; struct t_mat *p_mat; struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_del_mat()", "error: can't delete materials in this object!"); return -1; } s3dprintf(VLOW, "deleting %d materials of pid %d/ oid %d", n, p->id, oid); m = obj->n_mat; /* saving the first number of materials */ if (n >= m) { if (m > 0) free(obj->p_mat); obj->n_mat = 0; obj->p_mat = NULL; } else if (n > 0) if (NULL != (p_mat = (struct t_mat *)realloc(obj->p_mat, sizeof(struct t_mat) * (m - n)))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_mat = p_mat; obj->n_mat -= n; } } else return -1; return 0; } /* deletes the last n polys of the stack. if n>=n_poly, delete all polys */ int obj_del_poly(struct t_process *p, int32_t oid, int32_t n) { int32_t m; struct t_poly *p_poly; struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_del_poly()", "error: can't delete poly in this object!"); return -1; } s3dprintf(VLOW, "deleting %d polys of pid %d/ oid %d", n, p->id, oid); m = obj->n_poly; /* saving the first number of poly */ if (n >= m) { if (m > 0) free(obj->p_poly); obj->n_poly = 0; obj->p_poly = NULL; } else if (n > 0) if (NULL != (p_poly = (struct t_poly *)realloc(obj->p_poly, sizeof(struct t_poly) * (m - n)))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_poly = p_poly; obj->n_poly -= n; } } else return -1; return 0; } /* deletes the last n lines of the stack. if n>=n_line, delete all lines */ int obj_del_line(struct t_process *p, int32_t oid, int32_t n) { int32_t m; struct t_line *p_line; struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_del_line()", "error: can't delete line in this object!"); return -1; } s3dprintf(VLOW, "deleting %d lines of pid %d/ oid %d", n, p->id, oid); m = obj->n_line; /* saving the first number of line */ if (n >= m) { if (m > 0) free(obj->p_line); obj->n_line = 0; obj->p_line = NULL; } else if (n > 0) if (NULL != (p_line = (struct t_line *)realloc(obj->p_line, sizeof(struct t_line) * (m - n)))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_line = p_line; obj->n_line -= n; } } else return -1; return 0; } /* delete texture object */ int obj_del_tex(struct t_process *p, int32_t oid, int32_t n) { int32_t m; int32_t i; struct t_tex *p_tex; struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if (obj->oflags & OF_NODATA) { errds(MED, "obj_del_tex()", "error: can't delete textures in this object!"); return -1; } s3dprintf(VLOW, "deleting %d textures of pid %d/ oid %d", n, p->id, oid); m = obj->n_tex; /* saving the first number of textures */ if (n >= m) { for (i = 0; i < m; i++) texture_delete(&(obj->p_tex[i])); if (m > 0) free(obj->p_tex); obj->n_tex = 0; obj->p_tex = NULL; } else if (n > 0) { for (i = (m - n); i < m; i++) texture_delete(&(obj->p_tex[i])); if (NULL != (p_tex = (struct t_tex *)realloc(obj->p_tex, sizeof(struct t_tex) * (m - n)))) { if (obj->dplist) { s3dprintf(VLOW, "freeing display list %d to get new data", obj->dplist); glDeleteLists(obj->dplist, 1); obj->dplist = 0; } obj->p_tex = p_tex; obj->n_tex = n; } } } else return -1; return 0; } /* from proto.c, translates the object. */ int obj_translate(struct t_process *p, int32_t oid, float *transv) { struct t_obj *obj; struct t_process *mcp_p = get_proc_by_pid(MCP); float v[3]; if (OBJ_VALID(p, oid, obj)) { if (isnan(transv[0]) || isinf(transv[0])) return -1; if (isnan(transv[1]) || isinf(transv[1])) return -1; if (isnan(transv[2]) || isinf(transv[2])) return -1; if ((p->id != MCP) && (obj->oflags & OF_SYSTEM)) { if (focus_oid == p->mcp_oid) { v[0] = transv[0]; v[1] = transv[1]; v[2] = transv[2]; mySetMatrix(mcp_p->object[p->mcp_oid]->m); myTransform3f(v); obj_translate(mcp_p, oid, v); } } else { obj->translate.x = *transv; obj->translate.y = *(transv + 1); obj->translate.z = *(transv + 2); obj_pos_update(p, oid, oid); } s3dprintf(VLOW, "[translate|pid %d] %d: %3.3f %3.3f %3.3f", p->id, oid, obj->translate.x, obj->translate.y, obj->translate.z); } return 0; } /* set rotate vector .... */ int obj_rotate(struct t_process *p, int32_t oid, float *rotv) { struct t_obj *obj; struct t_process *mcp_p = get_proc_by_pid(MCP); float v[3]; float f; if (OBJ_VALID(p, oid, obj)) { if (isnan(rotv[0]) || isinf(rotv[0])) return -1; if (isnan(rotv[1]) || isinf(rotv[1])) return -1; if (isnan(rotv[2]) || isinf(rotv[2])) return -1; if ((p->id != MCP) && (obj->oflags & OF_SYSTEM)) { if (focus_oid == p->mcp_oid) { v[0] = obj->rotate.x + (rotv[0] - obj->rotate.x); v[1] = obj->rotate.y + (rotv[1] - obj->rotate.y); v[2] = obj->rotate.z + (rotv[2] - obj->rotate.z); obj_rotate(mcp_p, oid, v); } } else { f = *rotv; if (f < 0.0) f += (float)((int)-f / 360) * 360; if (f > 360.0) f += (float)((int)f / 360) * -360; obj->rotate.x = f; f = *(rotv + 1); if (f < 0.0) f += (float)((int)-f / 360) * 360; if (f > 360.0) f += (float)((int)f / 360) * -360; obj->rotate.y = f; f = *(rotv + 2); if (f < 0.0) f += (float)((int)-f / 360) * 360; if (f > 360.0) f += (float)((int)f / 360) * -360; obj->rotate.z = f; obj_pos_update(p, oid, oid); } s3dprintf(VLOW, "[rotate|pid %d] %d: %3.3f %3.3f %3.3f", p->id, oid, obj->rotate.x, obj->rotate.y, obj->rotate.z); } return 0; } /* and scaling ! */ int obj_scale(struct t_process *p, int32_t oid, float scav) { struct t_obj *obj; if (OBJ_VALID(p, oid, obj)) { if ((p->id == MCP) || (!(obj->oflags & OF_SYSTEM))) if (!isinf(scav) && !isnan(scav) && !((scav < 1.0e-10) && (scav > -1.0e-10))) { /* ignore very low values */ s3dprintf(VLOW, "[scale|pid %d] obj %d to %f", p->id, oid, scav); obj->scale = scav; obj_size_update(p, oid); obj_pos_update(p, oid, oid); } } return 0; } /* a recursive function to move/scale the object before rendering. */ void into_position(struct t_process *p, struct t_obj *obj, int depth) { struct t_obj *on; if ((obj->oflags & OF_LINK) && (depth < p->n_obj)) { /* TODO: only MultMatrix if m_uptodate ?! */ if (OBJ_VALID(p, obj->linkid, on)) { into_position(p, on, depth + 1); } else { obj->oflags &= ~OF_LINK; s3dprintf(LOW, "link object is broken, removing link"); } } /* if (depth>=MAXLOOP) */ if (depth >= p->n_obj) s3dprintf(MED, "too much looping ..."); glTranslatef(obj->translate.x, obj->translate.y, obj->translate.z); glRotatef(obj->rotate.y, 0.0, 1.0, 0.0); glRotatef(obj->rotate.x, 1.0, 0.0, 0.0); glRotatef(obj->rotate.z, 0.0, 0.0, 1.0); /* glScalef(obj->scale.x,obj->scale.y,obj->scale.z); */ glScalef(obj->scale, obj->scale, obj->scale); } void obj_size_update(struct t_process *p, int32_t oid) { struct t_obj *o, *o2; struct t_vertex *a, *vp; float r; int vn, is_clnsrc; int32_t i; if (p->id == MCP) return; /* mcp does not need that. */ if (OBJ_VALID(p, oid, o)) { if (o->oflags & OF_SYSTEM) { o->r = o->o_r = 0; /* we don't care about system objects */ return; } vp = o->p_vertex; vn = o->n_vertex; if (o->oflags & OF_CLONE) { o2 = p->object[o->clone_ooid]; /* get the target into o2 */ o->r = o2->r * (o->scale / o2->scale); obj_check_biggest_object(p, oid); return; } else { /* printf(MED,"looking through vertices..."); */ for (i = 0; i < vn; i++) { a = &(vp[i]); r = o->scale * sqrt((a->x * a->x) + (a->y * a->y) + (a->z * a->z)); if (r > o->r) o->r = r; } obj_check_biggest_object(p, oid); if (p->object[oid]->oflags & OF_CLONE_SRC) { is_clnsrc = 0; for (i = 0; i < p->n_obj; i++) { if (p->object[i] != NULL) { if ((p->object[i]->oflags & OF_CLONE) && (p->object[i]->clone_ooid == oid)) { /* if it's pointing to our object ... */ is_clnsrc = 1; p->object[i]->r = o->r * (p->object[i]->r / o->scale); /* give it the new radius too! */ obj_check_biggest_object(p, i); } } } if (!is_clnsrc) p->object[oid]->oflags &= ~OF_CLONE_SRC; } } } } /* checks if the object is (still) the biggest object. assumes that oid */ /* is valid */ void obj_check_biggest_object(struct t_process *p, int32_t oid) { struct t_obj *o, *mcp_o; struct t_process *mcp_p; float r, r2; int32_t i; int found; mcp_p = get_proc_by_pid(MCP); mcp_o = mcp_p->object[p->mcp_oid]; o = p->object[oid]; if (o->oflags & OF_SYSTEM) return; /* we don't care, system objects don't count. */ r = o->r + o->o_r; if (r > mcp_o->r) { /* this is now the biggest object. */ mcp_o->r = r; p->biggest_obj = oid; mcp_rep_object(p->mcp_oid); /* and tell the mcp */ } else { if (p->biggest_obj == oid) { /* oid might now lose the status of the "biggest object". let's check: */ found = 0; for (i = 0; i < p->n_obj; i++) if (p->object[i] != NULL) { if ((r2 = p->object[i]->r + p->object[i]->o_r) > r) { /* this object is bigger than the old biggest one. */ if (!(p->object[i]->oflags & OF_SYSTEM)) { p->biggest_obj = oid; r = r2; found = 1; } } } if (found) { s3dprintf(VLOW, "there is a new biggest object in [%d:\"%s\"]", p->id, p->name); mcp_o->r = r; /* save the new size */ mcp_rep_object(p->mcp_oid); /* and tell the mcp */ } } /* if it wasn't the biggest object, no one cares if it's smaller than process */ /* radius */ } } /* calculates and saves the transformation matrix, if needed */ void obj_recalc_tmat(struct t_process *p, int32_t oid) { GLint matrixmode; if (!p->object[oid]->m_uptodate) { glGetIntegerv(GL_MATRIX_MODE, &matrixmode); /* save matrixmode */ glMatrixMode(GL_MODELVIEW); /* go into modelview */ glPushMatrix(); glLoadIdentity(); into_position(p, p->object[oid], 0); glGetFloatv(GL_MODELVIEW_MATRIX, p->object[oid]->m); glPopMatrix(); glMatrixMode(matrixmode); p->object[oid]->m_uptodate = 1; } } static void obj_sys_update(struct t_process *p, int32_t oid) { struct t_process *mcp_p = get_proc_by_pid(MCP); struct t_obj *o; struct t_vertex fs, fa; float ss, sa, v[3]; fs.x = fs.y = fs.z = 0.0F; fa.x = fa.y = fa.z = 0.0F; sa = ss = 1.0F; /* find the angel of the sys object */ o = mcp_p->object[oid]; while (o != NULL) { fs.x += o->rotate.x; fs.y += o->rotate.y; fs.z += o->rotate.z; ss *= o->scale; if (o->oflags & OF_LINK) o = mcp_p->object[o->linkid]; else o = NULL; } /* mov in the mcp space */ mySetMatrix(mcp_p->object[oid]->m); v[0] = v[1] = v[2] = 0.0; myTransform3f(v); o = mcp_p->object[p->mcp_oid]; while (o != NULL) { fa.x += o->rotate.x; fa.y += o->rotate.y; fa.z += o->rotate.z; sa *= o->scale; if (o->oflags & OF_LINK) o = mcp_p->object[o->linkid]; else o = NULL; } /* reverse in the application space */ mySetMatrix(mcp_p->object[p->mcp_oid]->m); if (myInvert()) return; /* we don't bother if the matrix doesn't work. */ myTransform3f(v); p->object[oid]->rotate.x = fs.x - fa.x; p->object[oid]->rotate.y = fs.y - fa.y; p->object[oid]->rotate.z = fs.z - fa.z; p->object[oid]->translate.x = v[0]; p->object[oid]->translate.y = v[1]; p->object[oid]->translate.z = v[2]; p->object[oid]->scale = ss / sa; obj_pos_update(p, oid, oid); /* now also update the matrix and the objects linking to our sys-object ... */ } /* recalculate the position of an object. this assumes that oid is valid. */ void obj_pos_update(struct t_process *p, int32_t oid, int32_t first_oid) { float v[3]; struct t_obj *ao, *o; struct t_process *ap; o = p->object[oid]; s3dprintf(VLOW, "[obj_pos_upd|pid %d] %d, %d", p->id, oid, first_oid); o->m_uptodate = 0; obj_recalc_tmat(p, oid); if (p->id != MCP) { /* mcp does not need that. */ /* save the matrixmode to reset it later on */ v[0] = v[1] = v[2] = 0.0F; mySetMatrix(o->m); myTransform3f(v); /* and get it's destination point. phew */ o->o_r = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); } else if (o->oflags & OF_SYSTEM) { /* TODO: what will we do if $sys_object is linked to another? */ /* a system object changed position? let's update the focus'ed sys-objects */ if (OBJ_VALID(p, focus_oid, ao)) if (NULL != (ap = get_proc_by_pid(ao->virtual_pid))) { if (OF_POINTER == (o->oflags & 0xF0000000)) { /* we dont have to do that much in this case ... */ if (OBJ_VALID(ap, get_pointer(ap), ao)) { /* we can redefine ao here -> ao = focused app's pointer */ ao->rotate.x = o->rotate.x; ao->rotate.y = o->rotate.y; ao->rotate.z = o->rotate.z; ao->translate.x = o->translate.x; ao->translate.y = o->translate.y; ao->translate.z = o->translate.z; /* just copy */ obj_pos_update(ap, get_pointer(ap), get_pointer(ap)); } } else { obj_sys_update(ap, oid); } } switch (o->oflags & 0xF0000000) { case OF_CAM: event_cam_changed(); break; case OF_POINTER: event_ptr_changed(); break; default: s3dprintf(LOW, "[obj_pos_upd|pid %d] %d unknown system event", p->id, oid); } } /* if it's the root (oid==first_oid), only go down */ if (o->lsub != -1) obj_pos_update(p, o->lsub, first_oid); if ((o->lnext != -1) && (oid != first_oid)) obj_pos_update(p, o->lnext, first_oid); if (p->id != MCP) obj_check_biggest_object(p, oid); } /* calculates the normal for one polygon, if not present. */ static int calc_normal(struct t_obj *obj, uint32_t pn) { struct t_vertex a, b, n; struct t_vertex *v[3]; int32_t vp, i; float len; for (i = 0; i < 3; i++) { /* set and check */ vp = obj->p_poly[pn].v[i]; /* ... get the vertices ... */ if (vp < obj->n_vertex) v[i] = &(obj->p_vertex[vp]); else return -1; } /* check for already set normal */ if ((obj->p_poly[pn].n[0].x * obj->p_poly[pn].n[0].x + obj->p_poly[pn].n[0].y * obj->p_poly[pn].n[0].y + obj->p_poly[pn].n[0].z * obj->p_poly[pn].n[0].z) == 0) { /* normal already defined? */ a.x = v[1]->x - v[0]->x; a.y = v[1]->y - v[0]->y; a.z = v[1]->z - v[0]->z; b.x = v[2]->x - v[0]->x; b.y = v[2]->y - v[0]->y; b.z = v[2]->z - v[0]->z; n.x = a.y * b.z - a.z * b.y; n.y = a.z * b.x - a.x * b.z; n.z = a.x * b.y - a.y * b.x; len = sqrt(n.x * n.x + n.y * n.y + n.z * n.z); if (len == 0.0F) { /* errds(VLOW,"bad polygon (can't normalize ...)"); */ } else { n.x = n.x / len; n.y = n.y / len; n.z = n.z / len; for (i = 0; i < 3; i++) { obj->p_poly[pn].n[i].x = n.x; obj->p_poly[pn].n[i].y = n.y; obj->p_poly[pn].n[i].z = n.z; } } } return 0; } /* checks if a normal is set for a line object, or set some default if not */ static int check_line_normal(struct t_obj *obj, uint32_t pn) { int i, vp; for (i = 0; i < 2; i++) { /* set and check */ vp = obj->p_line[pn].v[i]; /* ... get the vertices ... */ if (vp >= (int)obj->n_vertex) return -1; } if ((obj->p_line[pn].n[0].x * obj->p_line[pn].n[0].x + obj->p_line[pn].n[0].y * obj->p_line[pn].n[0].y + obj->p_line[pn].n[0].z * obj->p_line[pn].n[0].z) == 0) { /* guess we have nothing set yet, so set something */ for (i = 0; i < 2; i++) { obj->p_line[pn].n[0].x = 0; obj->p_line[pn].n[0].y = 0; obj->p_line[pn].n[0].z = 1; } } return 0; } /* generate textures */ static void texture_gen(struct t_obj *obj) { GLuint t; int i; struct t_tex *tex = NULL; for (i = 0; i < obj->n_tex; i++) { tex = &obj->p_tex[i]; if (tex->gl_texnum == -1) { glGenTextures(1, &t); glBindTexture(GL_TEXTURE_2D, t); tex->gl_texnum = t; s3dprintf(LOW, "generated texture %d [%dx%d, in memory %dx%d]", t, tex->tw, tex->th, tex->w, tex->h); /* texture has to be generated yet ... */ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->w, tex->h, 0, /* no border. */ GL_RGBA, GL_UNSIGNED_BYTE, tex->buf); } } } /* activate/bind texture for object */ static struct t_tex *get_texture(struct t_obj *obj, struct t_mat *m) { struct t_tex *tex = NULL; GLfloat matgl[4]; /* int i,j; */ if (m->tex < obj->n_tex) { tex = &obj->p_tex[m->tex]; if (tex->buf != NULL && tex->gl_texnum != -1) { /* texture seems to be okay, select it. */ matgl[0] = 1.0f; matgl[1] = 1.0f; matgl[2] = 1.0f; matgl[3] = 1.0f; glMaterialfv(GL_FRONT, GL_AMBIENT, matgl); glMaterialfv(GL_FRONT, GL_DIFFUSE, matgl); glMaterialfv(GL_FRONT, GL_SPECULAR, matgl); s3dprintf(VLOW, "already have texture %d [%dx%d, in memory %dx%d]", tex->gl_texnum, tex->tw, tex->th, tex->w, tex->h); glBindTexture(GL_TEXTURE_2D, tex->gl_texnum); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } else { /* can't use a texture */ tex = NULL; } } return tex; } /* finally, the rendering portion. */ int obj_render(struct t_process *p, int32_t oid) { int32_t pn; int32_t mat, omat = -1; int32_t v; /* int link_obj; */ struct t_vertex *on; struct t_obj *obj; struct t_mat *m; struct t_tex *tex = NULL; GLfloat matgl[4]; int32_t i; obj = p->object[oid]; glPushMatrix(); glMultMatrixf(obj->m); if (obj->oflags & OF_SYSTEM) return -1; /* can't render system objects */ if (obj->oflags & OF_CLONE) obj = p->object[obj->clone_ooid]; /* it's a clone - draw the clone! */ if (!obj->dplist) { texture_gen(obj); obj->dplist = glGenLists(1); if (obj->dplist) glNewList(obj->dplist, GL_COMPILE); /* only compile and calling later should save time. maybe. */ else s3dprintf(LOW, "couldn't get a new list :/"); omat = -1; for (pn = 0; pn < obj->n_poly; pn++) { /* cycle throu our polygons ... */ if (calc_normal(obj, pn)) { s3dprintf(HIGH, "something is wrong with polygon %d!", pn); if (obj->dplist) glEndList(); glPopMatrix(); /* clean up GL-stuff */ return -1; } mat = obj->p_poly[pn].mat; if (mat != omat) { tex = NULL; if (mat < obj->n_mat) { m = &obj->p_mat[mat]; if (m->tex != -1) tex = get_texture(obj, m); if (tex == NULL) { /* still NULL? then it couldn't get the texture. */ glBindTexture(GL_TEXTURE_2D, 0); matgl[0] = m->amb_r / 2; matgl[1] = m->amb_g / 2; matgl[2] = m->amb_b / 2; matgl[3] = m->amb_a; glMaterialfv(GL_FRONT, GL_AMBIENT, matgl); matgl[0] = m->diff_r / 2; matgl[1] = m->diff_g / 2; matgl[2] = m->diff_b / 2; matgl[3] = m->diff_a; glMaterialfv(GL_FRONT, GL_DIFFUSE, matgl); matgl[0] = m->spec_r / 2; matgl[1] = m->spec_g / 2; matgl[2] = m->spec_b / 2; matgl[3] = m->spec_a; glMaterialfv(GL_FRONT, GL_SPECULAR, matgl); } } else { s3dprintf(MED, "something is wrong with polygon %d! material: [%d,%d]", pn, mat, obj->n_mat); if (obj->dplist) glEndList(); glEnd(); glPopMatrix(); return -1; } } omat = mat; /* saving old material */ glBegin(GL_TRIANGLES); for (i = 0; i < 3; i++) { on = &(obj->p_poly[pn].n[i]); glNormal3f(-on->x, -on->y, -on->z); if (tex != NULL) { glTexCoord2f(obj->p_poly[pn].tc[i].x * tex->xs, (obj->p_poly[pn].tc[i].y * tex->ys)); } v = obj->p_poly[pn].v[i]; /* ... get the vertices ... */ glVertex3f(obj->p_vertex[v].x, obj->p_vertex[v].y, obj->p_vertex[v].z); /* ...and draw them */ } glEnd(); } if (tex != NULL) glBindTexture(GL_TEXTURE_2D, 0); /* switch back to standard texture */ for (pn = 0; pn < obj->n_line; pn++) { if (check_line_normal(obj, pn)) { s3dprintf(HIGH, "something is wrong with line %d!", pn); if (obj->dplist) glEndList(); glPopMatrix(); /* clean up GL-stuff */ return -1; } mat = obj->p_line[pn].mat; if (mat != omat) { tex = NULL; if (mat < obj->n_mat) { m = &obj->p_mat[mat]; /* dont need to care about textures ... it's rather impossible * to get some textures on a line. at least it would look ugly ;)*/ matgl[0] = m->amb_r / 2; matgl[1] = m->amb_g / 2; matgl[2] = m->amb_b / 2; matgl[3] = m->amb_a; glMaterialfv(GL_FRONT, GL_AMBIENT, matgl); matgl[0] = m->diff_r / 2; matgl[1] = m->diff_g / 2; matgl[2] = m->diff_b / 2; matgl[3] = m->diff_a; glMaterialfv(GL_FRONT, GL_DIFFUSE, matgl); matgl[0] = m->spec_r / 2; matgl[1] = m->spec_g / 2; matgl[2] = m->spec_b / 2; matgl[3] = m->spec_a; glMaterialfv(GL_FRONT, GL_SPECULAR, matgl); } else { s3dprintf(MED, "something is wrong with line %d! material: [%d,%d]", pn, mat, obj->n_mat); if (obj->dplist) glEndList(); glEnd(); glPopMatrix(); return -1; } } omat = mat; /* saving old material */ glBegin(GL_LINES); for (i = 0; i < 2; i++) { on = &(obj->p_line[pn].n[i]); glNormal3f(-on->x, -on->y, -on->z); v = obj->p_line[pn].v[i]; /* ... get the vertices ... */ glVertex3f(obj->p_vertex[v].x, obj->p_vertex[v].y, obj->p_vertex[v].z); /* ...and draw them */ } glEnd(); } if (obj->dplist) glEndList(); } if (obj->dplist) glCallList(obj->dplist); /* call the just compiled ore old display list */ glPopMatrix(); return 0; } /* remove the oid out of the link chain */ void link_delete(struct t_process *p, int32_t oid) { struct t_obj *o, *o2; if (OBJ_VALID(p, oid, o)) { s3dprintf(VLOW, "link_delete(): [%d] unlinking %d from %d", p->id, oid, o->linkid); if (o->linkid != -1) { if (o->lprev != -1) if (OBJ_VALID(p, o->lprev, o2)) { /* we have a previous pointer linking to us */ o2->lnext = o->lnext; /* might also be -1 */ } if (OBJ_VALID(p, o->linkid, o2)) { if (o2->lsub == oid) { /* parent is having oid as it's first link in chain */ o2->lsub = o->lnext; } } if (o->lnext != -1) if (OBJ_VALID(p, o->lnext, o2)) { /* fixing next's previous pointer */ o2->lprev = o->lprev; } } o->lnext = -1; o->lprev = -1; o->linkid = -1; o->oflags &= ~OF_LINK; } } /* add an element into the link chain */ void link_insert(struct t_process *p, int32_t oid, int32_t target) { struct t_obj *o, *ot, *o2; if (OBJ_VALID(p, oid, o) && OBJ_VALID(p, target, ot)) { s3dprintf(VLOW, "link_insert(): [%d] linking %d to %d", p->id, oid, target); o->oflags |= OF_LINK; o->linkid = target; o->lnext = ot->lsub; /* we have a new "first" element */ if (o->lnext != -1) if (OBJ_VALID(p, o->lnext, o2)) { /* if we already had an element in the chain, create the backlink */ o2->lprev = oid; } ot->lsub = oid; } } /* creates a link from object from an object to another */ /* to have a translation or anything move with other things */ int obj_link(struct t_process *p, int32_t oid_from, int32_t oid_to) { struct t_obj *o, *o2; if (OBJ_VALID(p, oid_from, o) && OBJ_VALID(p, oid_to, o2)) { if (oid_to == oid_from) { errds(VHIGH, "obj_link()", "can't link to itself!!"); return -1; } if (OF_POINTER == (o->oflags & 0xF0000000)) { errds(VHIGH, "obj_link()", "may not change the link of a pointer"); return -1; } while (o2->oflags & OF_LINK) { if (o2->linkid == oid_from) { /* circular link!! we can't do that */ errds(VHIGH, "obj_link()", "link from %d to %d would produce a circular link!", oid_from, oid_to); return -1; } o2 = p->object[o2->linkid]; /* move to the next object in the linkchain */ } if ((o->oflags & OF_SYSTEM) && (p->id == MCP)) { errds(VHIGH, "obj_link()", "can't link system-objects in non-mcp-apps!"); return -1; } s3dprintf(VLOW, "[link|pid %d] %d -> %d", p->id, oid_from, oid_to); if (oid_to != o->linkid) { /* only if something changed ... */ if (o->linkid != -1) link_delete(p, oid_from); link_insert(p, oid_from, oid_to); p->object[oid_to]->oflags |= OF_LINK_SRC; obj_pos_update(p, oid_from, oid_from); } return 0; } return -1; } /* this unlinks an object ... */ int obj_unlink(struct t_process *p, int32_t oid) { struct t_obj *o; if (OBJ_VALID(p, oid, o)) { if (OF_POINTER == (o->oflags & 0xF0000000)) { errds(VHIGH, "obj_link()", "may not change the link of a pointer"); return -1; } link_delete(p, oid); s3dprintf(VLOW, "removing link of object %d from pid %d", oid, p->id); obj_pos_update(p, oid, oid); return 0; } return -1; } /* creates a new object, returning the object id */ int obj_new(struct t_process *p) { struct t_obj *obj; int32_t pos, reuse = 0; obj = (struct t_obj *)malloc(sizeof(struct t_obj)); /* get an object and define it with our data */ memset(obj, 0, sizeof(struct t_obj)); obj->linkid = -1; obj->lsub = -1; obj->lnext = -1; obj->lprev = -1; obj->rotate.x = obj->rotate.y = obj->rotate.z = 0.0F; obj->translate.x = obj->translate.y = obj->translate.z = 0.0F; obj->scale = 1.0F; obj->n_vertex = obj->n_poly = obj->n_mat = obj->n_tex = 0; obj->clone_ooid = 0; obj->virtual_pid = 0; obj->r = obj->o_r = 0.0F; obj->m_uptodate = 0; memcpy(obj->m, Identity, sizeof(t_mtrx)); /* fresh and clean ... */ if (p != NULL) { /* look for an old object for reuse ... */ for (pos = 0; pos < p->n_obj; pos++) { if (p->object[pos] == NULL) { reuse = 1; break; } } if (!reuse) { if (p->n_obj > 0) p->object = (struct t_obj **)realloc(p->object, sizeof(struct t_obj *) * (p->n_obj + 1)); else p->object = (struct t_obj **)malloc(sizeof(struct t_obj *) * (p->n_obj + 1)); pos = p->n_obj; /* add object at the end */ p->n_obj++; /* increment counter */ } p->object[pos] = obj; s3dprintf(VLOW, "pid %d added new object %d at %10p [pos %d]", p->id, pos, (void *)obj, pos); return pos; } else { return -1; } } /* this changes the clone-target or sets up a new clone link. */ /* this will check and supress looplinks and clonechains */ int obj_clone_change(struct t_process *p, int32_t oid, int32_t toid) { struct t_obj *o, *no; int already_clone, is_clnsrc; int32_t i; if (OBJ_VALID(p, oid, o) && OBJ_VALID(p, toid, no)) { if ((o->oflags & OF_SYSTEM) || (no->oflags & OF_SYSTEM)) { s3dprintf(MED, "can't clone from or to system objects"); } /* get obj pointer and check for availability of the other object. */ if (((already_clone = (o->oflags & OF_CLONE)) || (!(o->n_vertex | o->n_mat | o->n_poly | o->n_tex))) && (!(o->oflags & OF_VIRTUAL))) { if (no->oflags & OF_CLONE) { /* target is clone */ errds(VHIGH, "obj_clone_change()", "couldn't clone %d from %d (on pid %d): clone target is already clone.", oid, toid, p->id); return -1; } if (!already_clone) { /* some other object could link to us, so we check the other objects and forward them just in case. */ if (p->object[oid]->oflags & OF_CLONE_SRC) { is_clnsrc = 0; for (i = 0; i < p->n_obj; i++) if (p->object[i] != NULL) if ((p->object[i]->oflags & OF_CLONE) && (p->object[i]->clone_ooid == oid)) { /* it's linking to our object! */ errds(VHIGH, "obj_clone_change()", "couldn't clone %d from %d (on pid %d): object %d is already cloning from object %d.", oid, toid, p->id, oid, i); return -1; } if (!is_clnsrc) { s3dprintf(MED, "obj_clone_change(): %d in process %d is no longer a clone-source", oid, p->id); p->object[oid]->oflags &= ~OF_CLONE_SRC; } } } if (oid != toid) { /* don't looplink */ o->oflags |= OF_CLONE; no->oflags |= OF_CLONE_SRC; o->clone_ooid = toid; obj_size_update(p, oid); s3dprintf(LOW, "changed clone-target of obj %d to %d of process %d", oid, toid, p->id); if (p->id != MCP) obj_check_biggest_object(p, oid); } else { errds(MED, "obj_clone_change()", "couldn't clone %d from %d (on pid %d): cloning from itself doesn't make sense!", oid, toid, p->id); return -1; } } else { errds(MED, "obj_clone_change()", "couldn't clone %d from %d (on pid %d): object %d is not empty", oid, toid, p->id, oid); obj_debug(p, oid); obj_debug(p, toid); return -1; } } return 0; } /* object-deletion request from proto.c */ int obj_del(struct t_process *p, int32_t oid) { struct t_process *mcp_p; struct t_obj *o; float r, mr; int32_t i; int32_t mcp_oid = -1; mcp_p = get_proc_by_pid(MCP); if (OBJ_VALID(p, oid, o)) { if (o->oflags & OF_SYSTEM) { s3dprintf(HIGH, "can't delete system object!"); return 0; } if (p->id == MCP) { if (o->oflags & OF_VIRTUAL) { /* only delete if virtual */ s3dprintf(HIGH, "the mcp wants %d to be closed", o->virtual_pid); event_quit(get_proc_by_pid(o->virtual_pid)); return 0; } } else mcp_oid = p->mcp_oid; if (OBJ_VALID(p, oid, o)) { obj_free(p, oid); if ((p->id != MCP) && (p->biggest_obj == oid)) { /* if object was the biggest object, find a new one. */ mr = -1; p->biggest_obj = -1; for (i = 0; i < p->n_obj; i++) if (p->object[i] != NULL) { r = p->object[i]->r + p->object[i]->o_r; if (r > mr) { if (!(p->object[i]->oflags & OF_SYSTEM)) { p->biggest_obj = i; mr = r; } } } mcp_p->object[mcp_oid]->r = mr; s3dprintf(MED, "new biggest object is :%d (size: %f)", p->biggest_obj, mr); } /* check if someone depended on this object as clone.... */ if (o->oflags & OF_CLONE_SRC) for (i = 0; i < p->n_obj; i++) if (p->object[i] != NULL) if ((p->object[i]->oflags & OF_CLONE) && (p->object[i]->clone_ooid == oid)) { /* it's linking to our object! */ p->object[i]->oflags &= ~OF_CLONE; /* disable clone flag */ p->object[i]->clone_ooid = -1; /* and "clone reference" to 0 */ p->object[i]->r = 0.0F; /* empty object, so radius is zero! */ if (p->id != MCP) obj_check_biggest_object(p, i); } return 0; } } return -1; } /* this is the "direct" freeing function, without checking for perfomance */ int obj_free(struct t_process *p, int32_t oid) { int32_t i; struct t_obj *o = p->object[oid]; s3dprintf(HIGH, "deleting object %d of process %d", oid, p->id); /* clearing links */ if (o->linkid != -1) link_delete(p, oid); while (o->lsub != -1) { i = o->lsub; link_delete(p, o->lsub); if (i == o->lsub) { s3dprintf(HIGH, "something is wrong!!"); o->lsub = -1; } } if (!(o->oflags & OF_NODATA)) { if (o->n_vertex > 0) free(o->p_vertex); if (o->n_poly > 0) free(o->p_poly); if (o->n_mat > 0) free(o->p_mat); for (i = 0; i < o->n_tex; i++) texture_delete(&(o->p_tex[i])); if (o->n_tex > 0) free(o->p_tex); } if (o->dplist) { if (!(o->oflags & (OF_CLONE | OF_SYSTEM))) { s3dprintf(VLOW, "freeing display list %d", o->dplist); glDeleteLists(o->dplist, 1); } } free(o); p->object[oid] = NULL; if (oid == (p->n_obj - 1)) { i = oid; while ((i != -1) && (p->object[i] == NULL)) i--; p->n_obj = i + 1; p->object = (struct t_obj **)realloc(p->object, sizeof(struct t_obj *) * (p->n_obj)); } return 0; } /* get the object of the pointer (that's 1, usually */ int32_t get_pointer(struct t_process * p) { int32_t i; for (i = 0; i < p->n_obj; i++) { if (OF_POINTER == (p->object[i]->oflags & 0xF0000000)) { return i; } } return -1; } s3d-0.2.2.1/server/process.c000066400000000000000000000165241361325167000155070ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* for malloc, free */ #include /* strncmp(), strncpy() */ #include /* this piece of code handles processes */ #define mcp_p (&procs_p[0]) struct t_process *procs_p = NULL; /* pointer to the processes */ int procs_n; /* number of processes */ static int p_del(struct t_process *p); /* local prototype */ static int process_list_rm(int pid); static int process_sys_init(struct t_process *p); /* protocol request for process initialization */ struct t_process *process_protinit(struct t_process *p, const char *name) { int con_type; int32_t mcp_oid; if ((strncmp(name, "sys_", 4) == 0)) { /* we don't like "sys_"-apps, kicking this */ errds(VHIGH, "process_protinit()", "appnames starting with 'sys_' not allowed."); return NULL; } if ((p->id != MCP) && (strncmp(name, "mcp", 3) == 0)) { if (procs_p[MCP].con_type == CON_NULL) { s3dprintf(MED, "free mcp place, pid %d becoming mcp!", p->id); con_type = p->con_type; /* move connection data */ #ifdef TCP procs_p[MCP].sockid = p->sockid; /* don't save contype yet, or p_del will notify mcp about a deleted mcp-object (which is itselfs, actually) */ #endif #ifdef SHM memcpy(&procs_p[MCP].shmsock, &p->shmsock, sizeof(struct t_shmcb)); #endif p_del(p); /* deleting data/mcp object */ procs_p[MCP].con_type = con_type; mcp_init(); process_list_rm(p->id); /* remove old process, but don't kill connection */ return &procs_p[MCP]; } else { s3dprintf(LOW, "the place for the mcp is already taken ..."); return NULL; } } else { strncpy(p->name, name, sizeof(p->name)); p->name[sizeof(p->name) - 1] = '\0'; process_sys_init(p); /* register the new process in the mcp */ if (-1 != (mcp_oid = obj_new(&procs_p[MCP]))) { mcp_p->object[mcp_oid]->oflags |= OF_VIRTUAL | OF_VISIBLE | OF_SELECTABLE; mcp_p->object[mcp_oid]->virtual_pid = p->id; /* mcp_p->object[mcp_oid]->p_mat=(struct t_material *)new_p; */ /* dirty, but it's just a pointer after all ... */ p->mcp_oid = mcp_oid; s3dprintf(LOW, "process %d now has mcp_oid %d", p->id, mcp_oid); mcp_rep_object(mcp_oid); if (mcp_p->con_type == CON_NULL) { /* there is no mcp connected! setting focus to the new program: */ mcp_focus(mcp_oid); } } else { s3dprintf(LOW, "couldn't add object to mcp ..."); } } return p; } /* adds system objects to the app, like camera, pointers etc ... */ static int process_sys_init(struct t_process *p) { int cam, ptr; struct t_obj *o; cam = obj_new(p); ptr = obj_new(p); if (p->id == MCP) { /* this is only called once within process_init, later mcp's are will be registered as "real" apps first */ p->object[cam]->translate.z = 5; p->object[cam]->oflags = OF_CAM; p->object[ptr]->translate.z = -1; p->object[ptr]->oflags = OF_POINTER; link_insert(p, ptr, cam); } else { /* TODO: ... get the cam and ptr position of the mcp, somehow */ p->object[cam]->oflags = OF_CAM; if (OBJ_VALID(mcp_p, get_pointer(mcp_p), o)) { /* get parent pointer, copy parent */ p->object[ptr]->rotate.x = o->rotate.x; p->object[ptr]->rotate.y = o->rotate.y; p->object[ptr]->rotate.z = o->rotate.z; p->object[ptr]->translate.x = o->translate.x; p->object[ptr]->translate.y = o->translate.y; p->object[ptr]->translate.z = o->translate.z; } p->object[ptr]->oflags = OF_POINTER; link_insert(p, ptr, cam); } s3dprintf(MED, "process_sys_init(): added object cam0 %d", cam); s3dprintf(MED, "process_sys_init(): added object ptr0 %d", ptr); obj_pos_update(get_proc_by_pid(MCP), cam, cam); obj_pos_update(get_proc_by_pid(MCP), ptr, ptr); event_obj_info(p, 0); /* tell the new program about the thing */ return 0; } /* this is to be called when a new connection appears. a pointer to the added process will be returned */ struct t_process *process_add(void) { struct t_process *new_p; procs_n++; procs_p = (struct t_process *)realloc(procs_p, sizeof(struct t_process) * procs_n); /* increase the block */ new_p = &procs_p[procs_n - 1]; new_p->id = procs_n - 1; new_p->object = NULL; new_p->n_obj = 0; new_p->mcp_oid = -1; new_p->biggest_obj = -1; new_p->con_type = CON_NULL; /* this is to be changed by the caller */ new_p->name[0] = '\0'; return new_p; } /* deletes the process with pid */ int process_del(int pid) { if (pid == MCP) { n_remove(&procs_p[pid]); p_del(&procs_p[pid]); return 0; } if ((pid > 0) && (pid < procs_n)) { n_remove(&procs_p[pid]); p_del(&procs_p[pid]); process_list_rm(pid); return 0; } return -1; } /* just kick process out of the process list, no network/mcp-oid cleanup */ static int process_list_rm(int pid) { if (pid != (procs_n - 1)) { /* copy last block, swap pid */ memcpy(&procs_p[pid], &procs_p[procs_n - 1], sizeof(struct t_process)); procs_p[pid].id = pid; /* change the pid of the new procs_p */ if (procs_p[pid].mcp_oid != -1) /* the last process could just appear without initializing yet ... */ procs_p[0].object[procs_p[pid].mcp_oid]->virtual_pid = pid; /* change the mcp-objects pid-pointer to the right position! */ /* this is kind of pointer madness */ } procs_n--; procs_p = (struct t_process *)realloc(procs_p, sizeof(struct t_process) * procs_n); /* decrease the block, wipe the last one */ return 0; } struct t_process *get_proc_by_pid(int pid) { if ((pid >= 0) && (pid < procs_n)) return &procs_p[pid]; return NULL; } /* this actually deleted the process with all it's parts */ /* it's quite the same as the original version, but without free() */ static int p_del(struct t_process *p) { int j, i = p->n_obj; if (p->id != MCP) { if (p->mcp_oid != -1) { for (j = 0; j < mcp_p->n_obj; j++) /* remove clones and links pointing on this app-object ... */ if (mcp_p->object[j] != NULL) { if ((mcp_p->object[j]->oflags & OF_CLONE) && (mcp_p->object[j]->clone_ooid == p->mcp_oid)) { /* it's linking to our object! */ mcp_p->object[j]->oflags &= ~OF_CLONE; /* disable clone flag */ mcp_p->object[j]->clone_ooid = 0; /* and "clone reference" to 0 */ mcp_p->object[j]->r = 0.0F; /* empty object, so radius is zero! */ } } obj_free(mcp_p, p->mcp_oid); /* free the mcp-app-object. */ mcp_del_object(p->mcp_oid); /* tell MCP that it's object is beeing deleted. */ } if (i > 0) { for (i = 0; i < p->n_obj; i++) if (p->object[i]) obj_free(p, i); free(p->object); } } else { /* the mcp keeps in our memory ... */ /* so we just delete the objects added */ /* by the last mcp */ s3dprintf(MED, "clean up mcp's junk ..."); for (i = 0; i < p->n_obj; i++) { if (p->object[i] != NULL) if (!(p->object[i]->oflags & (OF_SYSTEM | OF_VIRTUAL))) obj_free(p, i); } } return 0; /* successfully deleted */ } int process_init(void) { procs_n = 0; procs_p = NULL; process_add(); /* set up mcp */ if (!mcp_p) return -ENOMEM; strncpy(mcp_p->name, "mcp", sizeof(mcp_p->name)); mcp_p->name[sizeof(mcp_p->name) - 1] = '\0'; mcp_p->con_type = CON_NULL; process_sys_init(mcp_p); return 0; } int process_quit(void) { int i; s3dprintf(HIGH, "telling %d processes to go away", procs_n); for (i = (procs_n - 1); i >= 0; i--) { s3dprintf(HIGH, "[QUIT] for %d", i); event_quit(&procs_p[i]); } free(procs_p); return 0; } s3d-0.2.2.1/server/proto.c000066400000000000000000000261471361325167000151760ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include "proto.h" #include /* malloc() */ #include /* strncpy(),memset() */ #include #ifdef WIN32 #include #else #include /* htonl(),htons() */ #endif /* this code should do the protocol work .... */ /* */ int focus_oid = -1; /* initially focus the pid */ /* handle an incoming command from the client .. */ int prot_com_in(struct t_process *p, uint8_t * pbuf) { uint8_t command; int i; char name[S3D_NAME_MAX]; struct t_process *np; uint8_t *buf, *cptr = NULL; uint16_t length; uint16_t num; uint16_t w, h, x, y; uint32_t oid, toid; uint8_t type; int32_t flags, mcp_oid = -1; command = pbuf[0]; if (p->id != 0) { mcp_oid = p->mcp_oid; /* get mcp-oid if we need to report something to */ /* the mcp */ if ((mcp_oid == -1) && (command != S3D_P_C_INIT)) { s3dprintf(MED, "prot_com_in(): commands without beeing initialized ?! no way, kicking ..."); event_quit(p); } } length = ntohs(*((uint16_t *) ((uint8_t *) pbuf + 1))); cptr = buf = pbuf + sizeof(int_least32_t); switch (command) { case S3D_P_C_INIT: memset(name, 0, S3D_NAME_MAX); if (length > S3D_NAME_MAX) i = S3D_NAME_MAX; else i = length; strncpy(name, (char *)buf, i); name[sizeof(name) - 1] = '\0'; s3dprintf(LOW, "[%d]\"%s\" logged in", p->id, name); if (NULL == (np = process_protinit(p, name))) event_quit(p); /* couldn't get process */ else event_init(np); break; case S3D_P_C_NEW_OBJ: oid = htonl(obj_new(p)); prot_com_out(p, S3D_P_S_NEWOBJ, (uint8_t *) & oid, 4); break; case S3D_P_C_DEL_OBJ: if (length == 4) { oid = ntohl(*((uint32_t *) cptr)); obj_del(p, oid); } break; case S3D_P_C_CLONE: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); obj_clone_change(p, oid, toid); } break; case S3D_P_C_LINK: if (length == 4) { oid = ntohl(*((uint32_t *) cptr)); obj_unlink(p, oid); } if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); obj_link(p, oid, toid); } break; case S3D_P_C_QUIT: s3dprintf(LOW, "QUIT issued"); event_quit(p); break; case S3D_P_C_PUSH_VERTEX: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 3); ntohfb((float *)cptr, num * 3); obj_push_vertex(p, oid, (float *)cptr, num); } break; case S3D_P_C_PUSH_MAT: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 12); ntohfb((float *)cptr, num * 12); obj_push_mat(p, oid, (float *)cptr, num); } break; case S3D_P_C_PUSH_POLY: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 4); ntohlb((uint32_t *) cptr, num * 4); /* convert index names */ obj_push_poly(p, oid, (uint32_t *) cptr, num); } break; case S3D_P_C_PUSH_LINE: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 3); s3dprintf(VLOW, "received %d new lines for object oid...%d", num, oid); ntohlb((uint32_t *) cptr, num * 3); /* convert index names */ obj_push_line(p, oid, (uint32_t *) cptr, num); } break; case S3D_P_C_PUSH_TEX: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (2 * 2); s3dprintf(LOW, "received %d new textures for object oid...%d", num, oid); ntohsb((uint16_t *) cptr, num * 2); /* convert index names */ obj_push_tex(p, oid, (uint16_t *) cptr, num); } break; case S3D_P_C_PEP_POLY_NORMAL: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (9 * 4); ntohfb((float *)cptr, num * 9); s3dprintf(VLOW, "PEP_POLY_NORMAL[%d]: oid %d, %f polys", length, oid, (length - 4) / (9.0 * 4.0)); obj_pep_poly_normal(p, oid, (float *)cptr, num); } break; case S3D_P_C_PEP_LINE_NORMAL: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (6 * 4); ntohfb((float *)cptr, num * 6); s3dprintf(VLOW, "PEP_LINE_NORMAL[%d]: oid %d, %.1f lines", length, oid, (length - 4) / (6.0 * 4.0)); obj_pep_line_normal(p, oid, (float *)cptr, num); } break; case S3D_P_C_PEP_POLY_TEXC: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (6 * 4); ntohfb((float *)cptr, num * 6); s3dprintf(VLOW, "PEP_POLY_TEXC[%d]: oid %d, %f polys", length, oid, (length - 4) / (6.0 * 4.0)); obj_pep_poly_texc(p, oid, (float *)cptr, num); } break; case S3D_P_C_PEP_MAT: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 12); ntohfb((float *)cptr, num * 12); s3dprintf(VLOW, "PEP_MAT[%d]: %d materials for object oid...%d", length, num, oid); obj_pep_mat(p, oid, (float *)cptr, num); } break; case S3D_P_C_PEP_VERTEX: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 3); ntohfb((float *)cptr, num * 3); s3dprintf(VLOW, "pepping %d new vertices for object oid...%d", num, oid); obj_pep_vertex(p, oid, (float *)cptr, num); } break; case S3D_P_C_PEP_MAT_TEX: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4); s3dprintf(VLOW, "PEP_MAT_TEX[%d]: %d materials for object oid...%d", length, num, oid); ntohlb((uint32_t *) cptr, num); obj_pep_mat_tex(p, oid, (uint32_t *) cptr, num); } break; case S3D_P_C_PEP_LINE: if (length > 4) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 4) / (4 * 3); s3dprintf(VLOW, "pepping %d new lines for object oid...%d", num, oid); ntohlb((uint32_t *) cptr, num * 3); obj_pep_line(p, oid, (uint32_t *) cptr, num); } break; case S3D_P_C_LOAD_LINE_NORMAL: if (length > 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 8) / (6 * 4); ntohfb((float *)cptr, num * 6); s3dprintf(VLOW, "LOAD_POLY_NORMAL[%d]: oid %d, %.2f lines", length, oid, (length - 8) / (6.0 * 4.0)); obj_load_line_normal(p, oid, (float *)cptr, toid, num); } break; case S3D_P_C_LOAD_POLY_NORMAL: if (length > 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 8) / (9 * 4); ntohfb((float *)cptr, num * 9); s3dprintf(MED, "LOAD_POLY_NORMAL[%d]: oid %d, %f polys", length, oid, (length - 8) / (9.0 * 4.0)); obj_load_poly_normal(p, oid, (float *)cptr, toid, num); } break; case S3D_P_C_LOAD_POLY_TEXC: if (length > 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 8) / (6 * 4); ntohfb((float *)cptr, num * 6); s3dprintf(MED, "LOAD_POLY_TEXC[%d]: oid %d, %f polys", length, oid, (length - 8) / (6.0 * 4.0)); obj_load_poly_texc(p, oid, (float *)cptr, toid, num); } break; case S3D_P_C_LOAD_MAT: if (length > 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); cptr += 4; num = (length - 8) / (4 * 12); ntohfb((float *)cptr, num * 12); s3dprintf(LOW, "LOAD_MAT[%d]: %d materials for object oid...%d", length, num, oid); obj_load_mat(p, oid, (float *)cptr, toid, num); } break; case S3D_P_C_LOAD_TEX: if (length > 16) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; toid = ntohl(*((uint32_t *) cptr)); cptr += 4; x = ntohs(*((uint16_t *) cptr)); cptr += 2; y = ntohs(*((uint16_t *) cptr)); cptr += 2; w = ntohs(*((uint16_t *) cptr)); cptr += 2; h = ntohs(*((uint16_t *) cptr)); cptr += 2; num = length - 16; s3dprintf(MED, "LOAD_TEX[%d]: oid %d, texture %d, [%d x %d] data at [%d x %d] (%d = %d)", length, oid, toid, w, h, x, y, num, w * h * 4); if ((w * h * 4) == num) /* check correct size */ obj_load_tex(p, oid, toid, x, y, w, h, cptr); } break; case S3D_P_C_UPDATE_TEX: if (length == 16) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); toid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); x = ntohs(*((uint16_t *) cptr)); cptr += sizeof(uint16_t); y = ntohs(*((uint16_t *) cptr)); cptr += sizeof(uint16_t); w = ntohs(*((uint16_t *) cptr)); cptr += sizeof(uint16_t); h = ntohs(*((uint16_t *) cptr)); s3dprintf(VLOW, "UPDATE_TEX[%d]: oid %d, texture %d, [%d x %d] data at [%d x %d] ", length, oid, toid, w, h, x, y); obj_update_tex(p, oid, toid, x, y, w, h, NULL); } break; case S3D_P_C_DEL_VERTEX: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); num = ntohl(*((uint32_t *) cptr)); obj_del_vertex(p, oid, num); } break; case S3D_P_C_DEL_POLY: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); num = ntohl(*((uint32_t *) cptr)); obj_del_poly(p, oid, num); } break; case S3D_P_C_DEL_LINE: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); num = ntohl(*((uint32_t *) cptr)); s3dprintf(VLOW, "deleting %d lines for object oid...%d", num, oid); obj_del_line(p, oid, num); } break; case S3D_P_C_DEL_MAT: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); num = ntohl(*((uint32_t *) cptr)); obj_del_mat(p, oid, num); } break; case S3D_P_C_DEL_TEX: if (length == 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); num = ntohl(*((uint32_t *) cptr)); obj_del_tex(p, oid, num); } break; case S3D_P_C_TOGGLE_FLAGS: if (length == 9) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t);; type = *cptr; cptr += sizeof(unsigned char); flags = ntohl(*((uint32_t *) cptr)); obj_toggle_flags(p, oid, type, flags); } break; case S3D_P_C_TRANSLATE: if (length >= 16) { oid = ntohl(*((uint32_t *) cptr)); cptr += sizeof(uint32_t); ntohfb((float *)cptr, 3); obj_translate(p, oid, (float *)cptr); } break; case S3D_P_C_ROTATE: if (length >= 16) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; ntohfb((float *)cptr, 3); obj_rotate(p, oid, (float *)cptr); } break; case S3D_P_C_SCALE: if (length >= 8) { oid = ntohl(*((uint32_t *) cptr)); cptr += 4; ntohfb((float *)cptr, 3); obj_scale(p, oid, *((float *)cptr)); } break; case S3D_P_MCP_FOCUS: if ((p->id == MCP) && (length == 4)) { oid = ntohl(*((uint32_t *) cptr)); mcp_focus(oid); } break; default: s3dprintf(LOW, "don't know this command (%d)", command); } return 0; } /* this pushes some buffer out on the wire... */ int prot_com_out(struct t_process *p, uint8_t opcode, uint8_t * buf, uint16_t length) { uint8_t *ptr; if (p->con_type != CON_NULL) { *(obuf) = opcode; ptr = obuf + 1; *((uint16_t *) ptr) = htons(length); if (length) memcpy(obuf + 3, buf, length); if (n_writen(p, obuf, length + 3) < 0) { s3dprintf(LOW, "prot_com_out():n_writen(): connection seems to be dead (pid %d)", p->id); process_del(p->id); } return 0; } return -1; } s3d-0.2.2.1/server/proto.h000066400000000000000000000113511361325167000151720ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ /* this defines the protocol */ /* simply put, a command can be issued from either the client or */ /* the server. of course, the client's command-set should be kept */ /* as low as possible to keep the library added to the client's code */ /* small. */ /* S3D_P_(C=Client,S=Server)_(command) */ /* C/S defines if who can invoke the command */ /* */ /* every command is 1 byte long, arguments differ. */ #define S3D_P_C_INIT 1 /* max 256b: name */ #define S3D_P_C_QUIT 2 /* no argument */ #define S3D_P_C_NEW_OBJ 3 /* add a new object */ /* return: 4b: object id */ #define S3D_P_C_DEL_OBJ 4 /* 4b: object id */ #define S3D_P_C_CLONE 5 /* 4b: object id */ /* return: 4b: object id */ /* if 8b: */ /* 4b: object id */ /* 4b: target oid */ #define S3D_P_C_LINK 6 /* if 4b: */ /* 4b: oid (for unlink) */ /* if 8b: */ /* 4b: oid from */ /* 4b: oid to */ #define S3D_P_C_PUSH_LINE 7 /* 4b: object id */ /* n*3d from vertex, to vertex, color */ #define S3D_P_C_PUSH_VERTEX 8 /* 4b: object id */ /* n*3f: vertexes, each with x,y,z in float */ #define S3D_P_C_PUSH_MAT 9 /* 4b: object id */ /* 3*4f: material elements [amb,spec,diff with r,g,b,a] */ #define S3D_P_C_PUSH_POLY 10 /* 4b: object id */ #define S3D_P_C_PUSH_TEX 11 /* 4b: object id */ /* nx(2x2b): width,height */ #define S3D_P_C_DEL_VERTEX 12 /* 4b: object id */ /* 4b: number */ #define S3D_P_C_DEL_POLY 13 /* 4b: object id */ /* 4b: number */ #define S3D_P_C_DEL_MAT 14 /* 4b: object id */ /* 4b: number */ #define S3D_P_C_DEL_TEX 15 /* 4b: object id */ /* 4b: number */ #define S3D_P_C_PEP_POLY_NORMAL 16 /* 4b: object id */ /* n*9f: normals (3* x/y/z for each vertex of the poly) */ #define S3D_P_C_PEP_POLY_TEXC 17 /* 4b: object id */ /* n*6f poly texture coordinates (3* u/v for each vertex of the poly) */ #define S3D_P_C_PEP_MAT 18 /* 4b: object id */ /* 3*4f: material elements [amb,spec,diff with r,g,b,a] */ #define S3D_P_C_PEP_MAT_TEX 19 /* 4b: object id */ /* 4b: texture index references */ #define S3D_P_C_PEP_VERTEX 20 /* 4b: object id */ /* n*3f: vertexes, each with x,y,z in float */ #define S3D_P_C_PEP_LINE 21 /* 4b: object id */ /* n*3u: line information (from,to,color)*/ #define S3D_P_C_DEL_LINE 22 /* 4b: object id */ /* 4b: number */ #define S3D_P_C_PEP_LINE_NORMAL 23 /* 4b: object id */ /* n*6f: normals (2* x/y/z for each vertex of the line) */ #define S3D_P_C_LOAD_POLY_NORMAL 24 /* 4b: object id */ /* 4b: position */ /* n*9f: normals (3* x/y/z for each vertex of the poly) */ #define S3D_P_C_LOAD_POLY_TEXC 25 /* 4b: object id */ /* 4b: position */ /* n*6f poly texture coordinates (3* u/v for each vertex of the poly) */ #define S3D_P_C_LOAD_MAT 26 /* 4b: object id */ /* 4b: position */ /* 3*4f: material elements [amb,spec,diff with r,g,b,a] */ #define S3D_P_C_UPDATE_TEX 29 /* 4b: object id */ /* 4b: texture id */ /* 4*2b: xpos,ypos,width,height */ #define S3D_P_C_LOAD_TEX 28 /* 4b: object id */ /* 4b: texture number */ /* 4*2b: xpos,ypos,width,height */ /* n*2b: pixbuf (16bit) */ #define S3D_P_C_LOAD_MAT_TEX 29 /* 4b: object id */ /* 4b: texture index references */ #define S3D_P_C_LOAD_LINE_NORMAL 30 /* 4b: object id */ /* 4b: position */ /* n*6f: normals (2* x/y/z for each vertex of the line) */ #define S3D_P_C_TOGGLE_FLAGS 32 /* 4b: object id */ /* 1b: type */ /* 4b: flags */ #define S3D_P_C_TRANSLATE 33 /* 4b: object id */ /* 3f: position */ #define S3D_P_C_ROTATE 34 /* 4b: object id */ /* 3f: rotation angle over x,y,z axis */ #define S3D_P_C_SCALE 35 /* 4b: object id */ /* 1f: scale */ #define S3D_P_C_GET_SIZE 36 /* 4b: object id */ #define S3D_P_MCP_FOCUS 66 /* set the app which should get the keystrokes etc */ /* 4b: object id/pid */ /* */ /* */ /* */ #define S3D_P_MCP_OBJECT 67 /* 4b: oid */ /* 3*f: translate */ /* ... ? */ /* max 256b:name */ #define S3D_P_MCP_DEL_OBJECT 68 #define S3D_P_S_INIT 1 /* 1b: acknowledged */ /* 3b: version,major,minor */ /* description string */ #define S3D_P_S_QUIT 2 #define S3D_P_S_CLICK 3 /* 4b: oid */ #define S3D_P_S_KEY 4 /* 2b: button */ /* 2b: unicode translation */ /* 2b: modifier information */ /* 2b: state */ #define S3D_P_S_MBUTTON 5 /* 1b: button number */ /* 2b: button state */ #define S3D_P_S_SHMTEX 6 /* 4b: object id */ /* 4b: texture number */ /* 4b: shmid */ /* 4*2b: width, height, bufwidth, bufheight */ #define S3D_P_S_NEWOBJ 16 /* 4b: oid */ #define S3D_P_S_OINFO 32 /* 4b: oid */ /* 3*f: translate */ /* 3*f: rotate */ /* 1*f: scale */ /* 1*f: radius */ /* max 256b:name */ s3d-0.2.2.1/server/shm.c000066400000000000000000000167301361325167000146170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #ifdef G_SDL #include /* SDL_SetTimer() */ #endif #ifdef SHM #include /* printf(),fopen(),fclose() */ #include /* unlink(),usleep() */ #include /* realloc(),free() */ #include /* memcpy() */ #include /* signal() */ #include /* errno */ #ifdef WIN32 /* sohn wars */ #include #else /* sohn wars */ #include /* ntohs(),htons(),htonl(),ntohl() */ #endif /* sohn wars */ #include #include #include #include /* nanosleep() */ #include static struct t_shmcb waiting_comblock; static key_t *data = NULL; static char ftoken[] = "/tmp/.s3d"; static int shmid; static int mkey; /* increasing key */ static int shm_new_comblock(key_t * data); int shm_next_key(void) { mkey = mkey + 1; return mkey; } int shm_init(void) { FILE *fp; key_t key; /* create an empty token file */ fp = fopen(ftoken, "wb"); if (fp) fclose(fp); /* make the key: */ if ((key = ftok(ftoken, 'R')) == -1) { errnf("shm_init():ftok()", errno); return 1; } s3dprintf(LOW, "shm_init(): init key is 0x%08x", key); mkey = key; /* connect to (and possibly create) the segment: */ if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) { errnf("shm_init():shmget()", errno); return 1; } /* attach to the segment to get a pointer to it: */ data = (key_t *) shmat(shmid, (void *)0, 0); if (data == (key_t *) (-1)) { errnf("shm_init():shmat()", errno); return 1; } shm_new_comblock(data); return 0; } static void comblock_init(struct t_shmcb *p_cb) { p_cb->shmid_ctos = -1; p_cb->shmid_stoc = -1; p_cb->key_stoc = -1; p_cb->key_ctos = -1; p_cb->data_ctos = NULL; p_cb->data_stoc = NULL; } /* registers a communication block, and sets waiting_comblock */ static int shm_new_comblock(key_t * data) { struct t_shmcb *mycb; comblock_init(&waiting_comblock); mycb = &waiting_comblock; mycb->key_stoc = shm_next_key(); mycb->key_ctos = shm_next_key(); s3dprintf(MED, "shm_open_comblock():stoc: %08x, ctos: %08x", mycb->key_stoc, mycb->key_ctos); /* connect & create the client to server segment: */ if ((mycb->shmid_ctos = shmget(mycb->key_ctos, RB_STD_SIZE, 0644 | IPC_CREAT)) == -1) { errn("shm_open_comblock:shmget()", errno); return 1; } mycb->data_ctos = (char *)shmat(mycb->shmid_ctos, (void *)0, 0); if (mycb->data_ctos == (char *)(-1)) { errn("shm_open_comblock:shmat()", errno); return 1; } /* connect & create the client to server segment: */ if ((mycb->shmid_stoc = shmget(mycb->key_stoc, RB_STD_SIZE, 0644 | IPC_CREAT)) == -1) { errn("shm_open_comblock:shmget()", errno); return 1; } mycb->data_stoc = (char *)shmat(mycb->shmid_stoc, (void *)0, 0); if (mycb->data_stoc == (char *)(-1)) { errn("shm_open_comblock:shmat()", errno); return 1; } /* init ringbuffers */ ringbuf_init(mycb->data_stoc, RB_STD_SIZE); ringbuf_init(mycb->data_ctos, RB_STD_SIZE); data[0] = mycb->key_ctos; data[1] = mycb->key_stoc; mycb->idle = 0; s3dprintf(LOW, "shm_open_comblock():data: %08x, %08x", data[0], data[1]); return 0; } int shm_quit(void) { /* detach from the segment: */ s3dprintf(LOW, "shm_quit()..."); unlink(ftoken); if (data != NULL) { data[0] = data[1] = 0; s3dprintf(MED, "shm_quit():removing init block"); if (shmdt(data) == -1) errn("shm_quit():shmdt()", errno); if (shmctl(shmid, IPC_RMID, NULL) == -1) errn("shm_quit():shmctl()", errno); data = NULL; } return 0; } int shm_remove(struct t_process *p) { s3dprintf(MED, "shm_remove(): removing pid %d", p->id); s3dprintf(MED, "shm_remove():freeing keys: %08x, %08x", p->shmsock.key_ctos, p->shmsock.key_stoc); if (shmdt(p->shmsock.data_ctos) == -1) errn("shm_rmove():shmdt()", errno); if (shmctl(p->shmsock.shmid_ctos, IPC_RMID, NULL) == -1) errn("shm_quit():shmctl()", errno); if (shmdt(p->shmsock.data_stoc) == -1) errn("shm_quit():shmdt()", errno); if (shmctl(p->shmsock.shmid_stoc, IPC_RMID, NULL) == -1) errn("shm_quit():shmctl()", errno); return 0; } int shm_main(void) { int i /*,found */ ; struct buf_t *dai; /* data in, data out */ struct t_process *new_p; struct shmid_ds d; int iterations; #ifdef G_SDL SDL_TimerID net_off_timer; #endif iterations = 0; for (i = 0; i < procs_n; i++) { iterations++; #ifdef G_SDL net_off_timer = SDL_AddTimer(100, net_turn_off, NULL); #endif if (procs_p[i].con_type == CON_SHM) { dai = (struct buf_t *)procs_p[i].shmsock.data_ctos; if (dai->start != dai->end) { /* found=1; */ procs_p[i].shmsock.idle = 0; shm_prot_com_in(&procs_p[i]); if (turn) i--; /* evil hack: decrease i so it will be our turn again in the next round */ else { s3dprintf(MED, "client %d [%s] seems to want to keep us busy ... ", i, procs_p[i].name); #ifdef G_SDL SDL_RemoveTimer(net_off_timer); /* restart timer */ net_off_timer = SDL_AddTimer(100, net_turn_off, NULL); #endif turn = 1; /* don't decrease, it's next connections turn */ } } else { if (procs_p[i].shmsock.idle++ > MAX_IDLE) { /* maybe the function timed out somehow ...? let's check ... */ shmctl(procs_p[i].shmsock.shmid_ctos, IPC_STAT, &d); if (d.shm_nattch == 1) { /* we're all alone ... remove it!! */ s3dprintf(MED, "client [%s] detached, removing ... ", procs_p[i].name); process_del(procs_p[i].id); } else { procs_p[i].shmsock.idle = 0; } } } } if (iterations > 500) { turn = 0; iterations = 0; } } #ifdef G_SDL SDL_RemoveTimer(net_off_timer); #endif if ((data[0] == 0) && (data[1] == 0)) { new_p = process_add(); new_p->con_type = CON_SHM; memcpy(&new_p->shmsock, &waiting_comblock, sizeof(struct t_shmcb)); s3dprintf(HIGH, "shm_main():registered new connection (keys %d, %d) as pid %d", new_p->shmsock.key_ctos, new_p->shmsock.key_stoc, new_p->id); s3dprintf(LOW, "shm_main():new client attached! allocating shm block for further clients ..."); if (shm_new_comblock(data)) return 1; } return 0; } int shm_prot_com_in(struct t_process *p) { uint16_t length; struct buf_t *dai; dai = (struct buf_t *)p->shmsock.data_ctos; if (dai != NULL) if (3 == shm_readn(dai, ibuf, 3)) { length = ntohs(*((uint16_t *) ((uint8_t *) ibuf + 1))); s3dprintf(VLOW, "command %d, length %d", ibuf[0], length); if (length > 0) { shm_readn(dai, ibuf + sizeof(int_least32_t), length); } prot_com_in(p, ibuf); } return 0; } #define SHM_MAXLOOP 20 static struct timespec t = { 0, 1000 * 1000 }; /* 1 mili seconds */ int shm_writen(struct buf_t *rb, uint8_t * buf, int n) { int no_left, no_written, wait = 0; no_left = n; while (no_left > 0) { no_written = shm_write(rb, (char *)buf, no_left); if (no_written <= 0) return no_written; no_left -= no_written; buf += no_written; if (wait++ > SHM_MAXLOOP) { s3dprintf(HIGH, "shm_writen():waited too long ..."); return -1; } if (wait > 10) nanosleep(&t, NULL); } return n - no_left; } int shm_readn(struct buf_t *rb, uint8_t * buf, int n) { int no_left, no_read, wait = 0; no_left = n; while (no_left > 0) { no_read = shm_read(rb, (char *)buf, no_left); if (no_read < 0) return no_read; if (no_read == 0) break; no_left -= no_read; buf += no_read; if (wait++ > SHM_MAXLOOP) { s3dprintf(HIGH, "shm_readn():waited too long ..."); return -1; } if (wait > 10) nanosleep(&t, NULL); } return n - no_left; } #endif s3d-0.2.2.1/server/shm_ringbuf.c000066400000000000000000000033361361325167000163310ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* printf(), getchar() */ #include /* uint32_t */ #include /* memcpy() */ int shm_write(struct buf_t *rb, char *buf, int n) { int wrap = 0; int rs; int32_t e, s, size; char *data; e = rb->end; s = rb->start; size = rb->bufsize; data = ((char *)rb) + sizeof(struct buf_t); if (e < s) { wrap = 1; } if ((((s + size * (1 - wrap)) - e) < (n + 1))) { /* checking free space */ printf("buffer reached maxsize, no resizing possible"); } if ((e + n) > size) { rs = size - e; memcpy(data + e, buf, rs); /* copy the first part ... */ memcpy(data, buf + rs, n - rs); /* .. end the rest */ } else { memcpy(data + e, buf, n); /* plain copy */ } rb->end = e + n; /* update end of the buffer */ if (rb->end >= rb->bufsize) rb->end -= rb->bufsize; return 0; } int shm_read(struct buf_t *rb, char *buf, int n) { int wrap = 0; int mn; int rs; int32_t e, s, size; char *data; e = rb->end; s = rb->start; size = rb->bufsize; data = ((char *)rb) + sizeof(struct buf_t); if (e < s) wrap = 1; rs = (e + wrap * size - s); mn = (n > rs) ? rs : n; if ((wrap) && (mn > (size - s))) { rs = size - s; /* size of the first part */ memcpy(buf, data + s, rs); memcpy(buf + rs, data, mn - rs); } else { /* no wrap (needed) */ memcpy(buf, data + s, mn); } rb->start = s + mn; if (rb->start >= rb->bufsize) rb->start -= rb->bufsize; return mn; } void ringbuf_init(char *data, uint32_t init_size) { struct buf_t *ringbuf = (struct buf_t *)data; ringbuf->start = 0; ringbuf->end = 0; ringbuf->bufsize = init_size - RB_OVERHEAD; } s3d-0.2.2.1/server/tcp.c000066400000000000000000000142751361325167000146200ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #ifdef TCP #include /* errno */ #include /* memset() */ #ifdef WIN32 /* sohn wars */ #include #else /* sohn wars */ #include /* fd_set, FD*, socket, accept ... */ #include /* socket, accept ... */ #include /* fd_set,FD* */ #include /* fd_set,FD* */ #include /* ntohs(),htons(),htonl(),ntohl() */ #include /* network */ #endif /* sohn wars */ #include /* select() timeval things */ #include /* fcntl(),F_SETOWN */ #ifndef F_SETOWN /* somehow it is not set with -ansi */ #define F_SETOWN 8 #endif #include /* read(),write(),getpid(),close() */ #include /* malloc(),free() */ #include static int tcp_sockid; int tcp_init(void) { int yes = 1; struct sockaddr_in my_addr; s3dprintf(LOW, "server: creating socket"); #ifdef WIN32 /* sohn wars */ WSADATA datainfo; if (WSAStartup(257, &datainfo) != 0) errnf("startup()", 0); #endif /* auch sohn */ if ((tcp_sockid = socket(AF_INET, SOCK_STREAM, 0)) < 0) errnf("socket()", errno); s3dprintf(LOW, "server: binding my local socket"); /* allow addresses to be reused */ /* this seems to have something to do with servers using one port */ if (setsockopt(tcp_sockid, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) errn("setsockopt(...,SO_REUSEADDR...)", errno); memset((char *)&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(S3D_PORT); my_addr.sin_addr.s_addr = htons(INADDR_ANY); if (bind(tcp_sockid, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) errnf("bind()", errno); if (listen(tcp_sockid, 5) < 0) errnf("listen()", errno); #ifdef SIGS if (fcntl(tcp_sockid, F_SETFL, O_ASYNC | O_NONBLOCK) < 0) errnf("fcntl()", errno); if (fcntl(tcp_sockid, F_SETOWN, getpid()) < 0) errnf("fcntl()", errno); #endif return 0; } int tcp_quit(void) { close(tcp_sockid); #ifdef WIN32 WSACleanup(); #endif return 0; } /* watches the port for new connections */ int tcp_pollport(void) { fd_set fs_port; /* filedescriptor set for listening port(s) */ int newsd; /* new socket descriptor */ struct timeval tv; /* time structure */ struct t_process *new_p; /* pointer to new process */ struct sockaddr client_addr; /* new client's address */ socklen_t clilen = sizeof(client_addr); /* length of client's address */ FD_ZERO(&fs_port); FD_SET(tcp_sockid, &fs_port); select_again: tv.tv_sec = tv.tv_usec = 0; if (select(FD_SETSIZE, &fs_port, NULL, NULL, &tv) < 0) { if (errno == EINTR) { /* interruption by some evil signal, just do again :) */ errn("tcp_pollport():select()", errno); goto select_again; /* oh no, a goto!! that's evil */ } else errn("tcp_pollport():select()", errno); } else if (FD_ISSET(tcp_sockid, &fs_port)) { /* redundant, I guess */ s3dprintf(HIGH, "select(): new connection!!"); if ((newsd = accept(tcp_sockid, (struct sockaddr *)&client_addr, &clilen)) < 0) errn("accept()", errno); else { #ifdef SIGS if (fcntl(newsd, F_SETFL, O_ASYNC) < 0) errnf("fcntl()", errno); if (fcntl(newsd, F_SETOWN, getpid()) < 0) errnf("fcntl()", errno); #endif new_p = process_add(); new_p->con_type = CON_TCP; new_p->sockid = newsd; s3dprintf(HIGH, "registered new connection %d as pid %d", new_p->sockid, new_p->id); } } return 0; } /* this is about looking for new data on the sockets */ /* returns 1 when there was new data. */ int tcp_pollproc(void) { fd_set fs_proc; /* filedescriptor set for listening port(s) */ struct timeval tv; /* time structure */ struct t_process *p; int found = 0; int i, unfinished, n, off; off = 0; do { FD_ZERO(&fs_proc); unfinished = 0; n = 0; for (i = off; i < procs_n; i++) { p = &procs_p[i]; if (p->con_type == CON_TCP) { FD_SET(p->sockid, &fs_proc); n++; if (n >= FD_SETSIZE) { /* don't overflow the setsize! */ off = i; unfinished = 1; break; } } } /* maybe having a global fd_set for all the processes would have been better */ /* than generating them new in every poll. to be optimized... */ select_again_poll: tv.tv_sec = tv.tv_usec = 0; if (select(FD_SETSIZE, &fs_proc, NULL, NULL, &tv) == -1) { if (errno == EINTR) { errn("tcp_pollproc():select()", errno); goto select_again_poll; } else { errn("tcp_pollproc():select()", errno); } } else { /* data is available */ for (i = 0; i < procs_n; i++) { p = &procs_p[i]; if (p->con_type == CON_TCP) { if (FD_ISSET(p->sockid, &fs_proc)) { FD_CLR(p->sockid, &fs_proc); /* clear it from the fd */ tcp_prot_com_in(p); found = 1; } } } } } while (unfinished); return found; } /* read some data from the line, pushes it into the buffer and calls prot_com_in */ int tcp_prot_com_in(struct t_process *p) { uint16_t length; if (3 == tcp_readn(p->sockid, ibuf, 3)) { length = ntohs(*((uint16_t *) ((uint8_t *) ibuf + 1))); s3dprintf(VLOW, "command %d, length %d", ibuf[0], length); if (length > 0) { tcp_readn(p->sockid, ibuf + sizeof(int_least32_t), length); /* uint16_t is limited to 65536, so */ /* length can't be bigger than that ... lucky */ } prot_com_in(p, ibuf); } else { s3dprintf(LOW, "tcp_prot_com_in():n_readn():fd seems to be dead (pid %d, sock %d)", p->id, p->sockid); process_del(p->id); } return 0; } /* shamelessly ripped from simple ftp server */ int tcp_readn(int sock, uint8_t * str, int s) { int no_left, no_read; no_left = s; while (no_left > 0) { no_read = read(sock, str, no_left); if (no_read < 0) { errn("read()", errno); return no_read; } if (no_read == 0) break; no_left -= no_read; str += no_read; } return s - no_left; } int tcp_writen(int sock, uint8_t * str, int s) { int no_left, no_written; no_left = s; while (no_left > 0) { no_written = write(sock, str, no_left); if (no_written <= 0) { errn("write()", errno); return no_written; } no_left -= no_written; str += no_written; } return s - no_left; } int tcp_remove(int sock) { return close(sock); } #endif s3d-0.2.2.1/server/user.c000066400000000000000000000035431361325167000150040ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" /* this file reads user input */ static int ox, oy; int but = -1; int user_init(void) { switch (frame_mode) { #ifdef G_SDL case FRAME_SDL: user_init_sdl(); break; #endif default: return -1; } ox = oy = 0xFFFFFF; return 0; } int user_main(void) { switch (frame_mode) { #ifdef G_SDL case FRAME_SDL: user_main_sdl(); #endif /* fall through */ default: return 0; } } void user_key(uint16_t key, uint16_t unicode, uint16_t mod, int state) { event_key_pressed(key, unicode, mod, state); } void user_mouse(int button, int state, int x, int y) { switch (state) { case 0: /* mouse_down ... */ switch (button) { case 0: graphics_pick_obj(x, y); break; case 1: if ((ox != 0xFFFFFF) && (oy != 0xFFFFFF)) navi_pos(ox - x, oy - y); break; case 2: if ((ox != 0xFFFFFF) && (oy != 0xFFFFFF)) navi_rot(ox - x, oy - y); break; case 3: navi_fwd(); break; case 4: navi_back(); break; default: s3dprintf(VLOW, "button is ... %d", button); } ox = x; oy = y; event_mbutton_clicked(button, state); break; case 1: /* mouse up */ ox = oy = 0xFFFFFF; event_mbutton_clicked(button, state); /* s3dprintf(LOW,"state is: %d,button is %d",state,button); */ break; case 2: /* mouse still down */ switch (button) { case 1: if ((ox != 0xFFFFFF) && (oy != 0xFFFFFF)) navi_pos(ox - x, oy - y); break; case 2: if ((ox != 0xFFFFFF) && (oy != 0xFFFFFF)) navi_rot(ox - x, oy - y); break; case 3: navi_fwd(); break; case 4: navi_back(); break; default: s3dprintf(VLOW, "button is ... %d", button); } ox = x; oy = y; break; } but = button; /* mouse changed? */ ptr_move(x, y); } int user_quit(void) { return 0; } s3d-0.2.2.1/server/user_sdl.c000066400000000000000000000113021361325167000156360ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /* SPDX-FileCopyrightText: 2004-2015 Simon Wunderlich */ #include "global.h" #include /* this file reads user input */ /* this is done right now by SDL-polling */ int user_init_sdl(void) { #if SDL_VERSION_ATLEAST(2,0,0) #else SDL_EnableUNICODE(1); #endif return 0; } int user_main_sdl(void) { SDL_Event event; uint32_t unicode = 0; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEMOTION: /* s3dprintf(VLOW,"Current mouse position is: (%d, %d),button %d", event.motion.x, event.motion.y,event.button.button); */ switch (event.button.button) { case SDL_BUTTON_LEFT: user_mouse(0, 2, event.motion.x, event.motion.y); break; case SDL_BUTTON_MIDDLE: user_mouse(1, 2, event.motion.x, event.motion.y); break; case SDL_BUTTON_RIGHT: case SDL_BUTTON_RMASK: user_mouse(2, 2, event.motion.x, event.motion.y); break; case 0: user_mouse(-1, -1, event.motion.x, event.motion.y); break; /* no button ... */ default: s3dprintf(LOW, "don't know button %d", event.button.button); } break; case SDL_MOUSEBUTTONDOWN: switch (event.button.button) { case SDL_BUTTON_LEFT: user_mouse(0, 0, event.motion.x, event.motion.y); break; case SDL_BUTTON_MIDDLE: user_mouse(1, 0, event.motion.x, event.motion.y); break; case SDL_BUTTON_RIGHT: user_mouse(2, 0, event.motion.x, event.motion.y); break; #if !SDL_VERSION_ATLEAST(2,0,0) case SDL_BUTTON_WHEELUP: user_mouse(3, 0, event.motion.x, event.motion.y); break; case SDL_BUTTON_WHEELDOWN: user_mouse(4, 0, event.motion.x, event.motion.y); break; #endif default: s3dprintf(LOW, "don't know button %d", event.button.button); } break; case SDL_MOUSEBUTTONUP: switch (event.button.button) { case SDL_BUTTON_LEFT: user_mouse(0, 1, event.motion.x, event.motion.y); break; case SDL_BUTTON_MIDDLE: user_mouse(1, 1, event.motion.x, event.motion.y); break; case SDL_BUTTON_RIGHT: user_mouse(2, 1, event.motion.x, event.motion.y); break; #if !SDL_VERSION_ATLEAST(2,0,0) case SDL_BUTTON_WHEELUP: user_mouse(3, 1, event.motion.x, event.motion.y); break; case SDL_BUTTON_WHEELDOWN: user_mouse(4, 1, event.motion.x, event.motion.y); break; #endif default: s3dprintf(LOW, "don't know button %d", event.button.button); } break; #if SDL_VERSION_ATLEAST(2,0,0) case SDL_MOUSEWHEEL: if (event.wheel.y > 0) { user_mouse(3, 0, event.motion.x, event.motion.y); user_mouse(3, 1, event.motion.x, event.motion.y); } if (event.wheel.y < 0) { user_mouse(4, 0, event.motion.x, event.motion.y); user_mouse(4, 1, event.motion.x, event.motion.y); } break; #endif case SDL_KEYDOWN: case SDL_KEYUP: unicode = 0; #if SDL_VERSION_ATLEAST(2,0,0) if (event.key.keysym.sym < 256) { unicode = event.key.keysym.sym; if (unicode >= 'a' && unicode <= 'z') { int shifted = !!(event.key.keysym.mod & KMOD_SHIFT); int capslock = !!(event.key.keysym.mod & KMOD_CAPS); if ((shifted ^ capslock) != 0) { unicode = SDL_toupper(unicode); } } } #else unicode = event.key.keysym.unicode; #endif user_key(event.key.keysym.sym, unicode, event.key.keysym.mod, (event.type == SDL_KEYUP) ? 1 : 0); break; case SDL_QUIT: s3dprintf(HIGH, "SDL_QUIT"); quit(); break; /* these events are not processed right now ... */ #if !SDL_VERSION_ATLEAST(2,0,0) case SDL_ACTIVEEVENT: s3dprintf(VLOW, "SDL_ACTIVEEVENT"); break; #endif case SDL_SYSWMEVENT: s3dprintf(VLOW, "SDL_SYSWMEVENT"); break; #if SDL_VERSION_ATLEAST(2,0,0) case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: graphics_reshape(event.window.data1, event.window.data2); break; } break; #else case SDL_VIDEORESIZE: if (SDL_SetVideoMode(event.resize.w, event.resize.h, 16, SDLFlags) == NULL) errsf("SDL_SetVideoMode()", SDL_GetError()); graphics_reshape(event.resize.w, event.resize.h); break; case SDL_VIDEOEXPOSE: s3dprintf(VLOW, "SDL_VIDEOEXPOSE"); break; #endif case SDL_USEREVENT: s3dprintf(VLOW, "SDL_USEREVENT"); break; case SDL_JOYAXISMOTION: s3dprintf(VLOW, "SDL_JOYAXISMOTION"); break; case SDL_JOYBALLMOTION: s3dprintf(VLOW, "SDL_JOYBALLMOTION"); break; case SDL_JOYHATMOTION: s3dprintf(VLOW, "SDL_JOYHATMOTION"); break; case SDL_JOYBUTTONDOWN: s3dprintf(VLOW, "SDL_JOYBUTTONDOWN"); break; case SDL_JOYBUTTONUP: s3dprintf(VLOW, "SDL_JOYBUTTONUP"); break; default: s3dprintf(MED, "SDL_PollEvent(): unhandled event"); break; } } return 0; } int user_quit_sdl(void) { return 0; }