pax_global_header00006660000000000000000000000064152106141760014515gustar00rootroot0000000000000052 comment=88c424d4f458412787df96fcc95218acbca224fd stevengj-nlopt-88c424d/000077500000000000000000000000001521061417600150365ustar00rootroot00000000000000stevengj-nlopt-88c424d/.github/000077500000000000000000000000001521061417600163765ustar00rootroot00000000000000stevengj-nlopt-88c424d/.github/ISSUE_TEMPLATE/000077500000000000000000000000001521061417600205615ustar00rootroot00000000000000stevengj-nlopt-88c424d/.github/ISSUE_TEMPLATE/0_bug.yml000077500000000000000000000027771521061417600223200ustar00rootroot00000000000000name: Bug Report description: Create a bug report. labels: - bug body: - type: textarea id: what attributes: label: What happened? description: What should have happened instead? Please provide as many details as possible. validations: required: true - type: textarea id: info attributes: label: How to reproduce the issue? description: Please add the minimal code that helps replicating the issue. render: shell validations: required: true - type: textarea id: version attributes: label: Version description: | Please tell us the version you are using. ```python import nlopt print(nlopt.__version__) ``` validations: required: true - type: dropdown id: oscheck attributes: label: Operating System description: Please provide the operating system running. options: - unknown - Windows - Linux - MacOS - all - other validations: required: true - type: dropdown id: sourcecheck attributes: label: Installation media description: Please provide the installation media. options: - unknown - pip - conda - from source - other validations: required: true - type: textarea id: context attributes: label: Additional Context description: Include any additional information that you think would be valuable. stevengj-nlopt-88c424d/.github/workflows/000077500000000000000000000000001521061417600204335ustar00rootroot00000000000000stevengj-nlopt-88c424d/.github/workflows/build.yml000066400000000000000000000041261521061417600222600ustar00rootroot00000000000000name: Build on: [push, pull_request] jobs: linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build run: | sudo apt-get update -y && sudo apt-get install python3-dev python3-numpy guile-3.0-dev octave-dev cmake gfortran g++-mingw-w64-x86-64 gfortran-mingw-w64-x86-64 pip install mkdocs python-markdown-math --user PATH=$PATH:~/.local/bin mkdocs build mkdir build && pushd build cmake -DCMAKE_INSTALL_PREFIX=~/.local -DNLOPT_FORTRAN=ON -DCMAKE_C_FLAGS='-std=c89 -pedantic -D_POSIX_C_SOURCE=200809L -Wall -Wextra -Wshadow' -DCMAKE_CXX_FLAGS='-Wall -Wextra -pedantic -Wshadow' -DSWIG_COMPILE_FLAGS="-Wno-shadow -Wno-unused-parameter -Wno-missing-field-initializers" -DNLOPT_TESTS=ON .. make install -j4 && ctest -j4 --output-on-failure rm -rf * ~/.local cmake -DCMAKE_INSTALL_PREFIX=~/.local -DNLOPT_PYTHON=OFF -DNLOPT_OCTAVE=OFF -DNLOPT_GUILE=OFF -DNLOPT_FORTRAN=ON -DCMAKE_TOOLCHAIN_FILE=$PWD/../cmake/toolchain-x86_64-w64-mingw32.cmake -DNLOPT_TESTS=ON .. make install -j4 macos: runs-on: macos-latest steps: - uses: actions/checkout@v6 - name: Build run: | brew install swig guile mkdir build && pushd build cmake -DCMAKE_INSTALL_PREFIX=~/.local -DNLOPT_FORTRAN=OFF -DNLOPT_TESTS=ON .. make install -j3 && ctest --output-on-failure windows: runs-on: windows-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: '3.12' - name: Build shell: cmd run: | pip install numpy cmake -DCMAKE_INSTALL_PREFIX=%cd:\=/%/install -DNLOPT_TESTS=ON . cmake --build . --config Release --target install xcopy %cd%\install\bin\nlopt.dll %cd%\src\swig\python xcopy %cd%\install\Lib\site-packages\_nlopt*.pyd %cd%\src\swig\python xcopy %cd%\install\bin\nlopt.dll %cd%\src\swig\Release dir /p %cd%\src\swig ctest -C Release --output-on-failure --timeout 100 stevengj-nlopt-88c424d/.readthedocs.yaml000066400000000000000000000002441521061417600202650ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.12" mkdocs: configuration: mkdocs.yml python: install: - requirements: doc/requirements.txt stevengj-nlopt-88c424d/AUTHORS000066400000000000000000000005751521061417600161150ustar00rootroot00000000000000NLopt was originally written/packaged by: Steven G. Johnson with subsequent contributions by Julien Schueller and other contributors that can be found in the git history, summarized here: https://github.com/stevengj/nlopt/graphs/contributors See the subdirectories for the authors of the original nonlinear optimization libraries utilized by NLopt. stevengj-nlopt-88c424d/CITATION.bib000066400000000000000000000146461521061417600167410ustar00rootroot00000000000000% the software: @misc{NLopt, title = {The {NLopt} nonlinear-optimization package}, author = {Steven G. Johnson}, year = {2007}, howpublished = {\url{https://github.com/stevengj/nlopt}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % optimization algorithms (cite as needed): @article{DIRECT, title = {{L}ipschitzian optimization without the {L}ipschitz constant}, author = {D. R. Jones and C. D. Perttunen and B. E. Stuckman}, doi = {10.1007/bf00941892}, year = {1993}, volume = {79}, pages = {157--181}, journal = {Journal of Optimization Theory and Applications} } @article{DIRECT_L, title = {A locally-biased form of the {DIRECT} algorithm}, author = {J. M. Gablonsky and C. T. Kelley}, doi = {10.1023/a:1017930332101}, year = {2001}, volume = {21}, pages = {27--37}, journal = {Journal of Global Optimization} } @article{CRS2, title = {Some variants of the controlled random search algorithm for global optimization}, author = {P. Kaelo and M. M. Ali}, doi = {10.1007/s10957-006-9101-0}, year = {2006}, volume = {130}, pages = {253--264}, journal = {Journal of Optimization Theory and Applications} } @article{MLSL, title = {Stochastic global optimization methods part {II}: Multi level methods}, author = {A. H. G. Rinnooy Kan and G. T. Timmer}, doi = {10.1007/bf02592071}, year = {1987}, volume = {39}, pages = {57--78}, journal = {Mathematical Programming} } @misc{StoGO, title = {{StoGO}: A program for global optimization}, author = {K. Madsen and S. Zertchaninov and A. Zilinskas}, year = {1998}, howpublished = {\url{http://www.imm.dtu.dk/projects/scicomp/GlobOpt/opt.html}} } @book{AGS, title = {Global Optimization with Non-Convex Constraints}, author = {Roman G. Strongin and Yaroslav D. Sergeyev}, doi = {10.1007/978-1-4615-4677-1}, year = {2000}, publisher = {Springer} } @article{ISRES, title = {Search biases in constrained evolutionary optimization}, author = {T. P. Runarsson and X. Yao}, doi = {10.1109/tsmcc.2004.841906}, year = {2005}, volume = {35}, pages = {233--243}, journal = {{IEEE} Transactions on Systems, Man, and Cybernetics, Part C (Applications and Reviews)} } @article{ESCH, title = {Designing novel photonic devices by bio-inspired computing}, author = {da Silva Santos, Carlos Henrique and Marcos Sergio Gon{\c{c}}alves and Hugo Enrique Hern{\'{a}}ndez-Figueroa}, doi = {10.1109/lpt.2010.2051222}, year = {2010}, volume = {22}, pages = {1177--1179}, journal = {{IEEE} Photonics Technology Letters} } @incollection{COBYLA, title = {A direct search optimization method that models the objective and constraint functions by linear interpolation}, author = {M. J. D. Powell}, doi = {10.1007/978-94-015-8330-5_4}, year = {1994}, publisher = {Springer}, pages = {51--67}, editor = {S. Gomez and J.-P. Hennart}, series = {Mathematics and Its Applications}, volume = {275}, booktitle = {Advances in Optimization and Numerical Analysis} } @techreport{BOBYQA, author = {M. J. D. Powell}, title = {The {BOBYQA} algorithm for bound constrained optimization without derivatives}, institution = {Department of Applied Mathematics and Theoretical Physics, Cambridge University}, year = {2009}, number = {NA2009/06}, address = {Cambridge, UK} } @incollection{NEWUOA, author = {M. J. D. Powell}, title = {The {NEWUOA} software for unconstrained optimization without derivatives}, doi = {10.1007/0-387-30065-1_16}, year = {2006}, publisher = {Springer}, pages = {255--297}, editor = {G. Di Pillo and M. Roma} series = {Nonconvex Optimization and Its Applications}, volume = {83}, booktitle = {Large-Scale Nonlinear Optimization} } @Book{PRAXIS, author = {Richard Brent}, title = {Algorithms for Minimization without Derivatives}, publisher = {Prentice-Hall}, year = {1972}, } @article{NELDERMEAD, author = {J. A. Nelder and R. Mead}, title = {A simplex method for function minimization}, doi = {10.1093/comjnl/7.4.308}, year = {1965}, volume = {7}, pages = {308--313}, journal = {The Computer Journal} } @phdthesis{SUBPLEX, author = {Thomas Harvey Rowan}, title = {Functional stability analysis of numerical algorithms}, school = {Department of Computer Science, University of Texas at Austin}, year = {1990}, address = {Austin, TX} } % CCSA: MMA and CCSAQ @article{CCSA, author = {Krister Svanberg}, title = {A class of globally convergent optimization methods based on conservative convex separable approximations}, doi = {10.1137/s1052623499362822}, year = {2002}, volume = {12}, pages = {555--573}, journal = {{SIAM} Journal on Optimization} } @article{SLSQP, author = {Dieter Kraft}, title = {Algorithm 733: {TOMP}--Fortran modules for optimal control calculations}, doi = {10.1145/192115.192124}, year = {1994}, volume = {20}, pages = {262--281}, journal = {{ACM} Transactions on Mathematical Software} } @article{LBFGS, author = {Dong C. Liu and Jorge Nocedal}, title = {On the limited memory {BFGS} method for large scale optimization}, doi = {10.1007/bf01589116}, year = {1989}, volume = {45}, pages = {503--528}, journal = {Mathematical Programming} } @article{TNEWTON, author = {Ron S. Dembo and Trond Steihaug}, title = {Truncated-{N}ewton algorithms for large-scale unconstrained optimization}, doi = {10.1007/bf02592055}, year = {1983}, volume = {26}, pages = {190--212}, journal = {Mathematical Programming} } @article{VAR, author = {Jan Vl{\v{c}}ek and Ladislav Luk{\v{s}}an}, title = {Shifted limited-memory variable metric methods for large-scale unconstrained optimization}, doi = {10.1016/j.cam.2005.02.010}, year = {2006}, volume = {186}, pages = {365--390}, journal = {Journal of Computational and Applied Mathematics} } @article{AUGLAG, author = {Andrew R. Conn and Nicholas I. M. Gould and Philippe Toint}, title = {A globally convergent augmented {Lagrangian} algorithm for optimization with general constraints and simple bounds}, doi = {10.1137/0728030}, year = {1991}, volume = {28}, pages = {545--572}, journal = {{SIAM} Journal on Numerical Analysis} } @article{AUGLAG2, author = {E.G. Birgin and J.M. Mart{\'{\i}}nez}, title = {Improving ultimate convergence of an augmented {Lagrangian} method}, doi = {10.1080/10556780701577730}, year = {2008}, volume = {23}, pages = {177--195}, journal = {Optimization Methods and Software} } stevengj-nlopt-88c424d/CMakeLists.txt000066400000000000000000000370431521061417600176050ustar00rootroot00000000000000#============================================================================== # NLOPT CMake file # # NLopt is a free/open-source library for nonlinear optimization, providing # a common interface for a number of different free optimization routines # available online as well as original implementations of various other # algorithms # WEBSITE: http://ab-initio.mit.edu/wiki/index.php/NLopt # AUTHOR: Steven G. Johnson # # This CMakeLists.txt file was created to compile NLOPT with the CMAKE utility. # Benoit Scherrer, 2010 CRL, Harvard Medical School # Copyright (c) 2008-2009 Children's Hospital Boston #============================================================================== cmake_minimum_required (VERSION 3.18) set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type") project (nlopt) #============================================================================== # version set (NLOPT_MAJOR_VERSION "2") set (NLOPT_MINOR_VERSION "11") set (NLOPT_BUGFIX_VERSION "0") set (NLOPT_VERSION_STRING ${NLOPT_MAJOR_VERSION}.${NLOPT_MINOR_VERSION}.${NLOPT_BUGFIX_VERSION}) message (STATUS "NLopt version ${NLOPT_VERSION_STRING}") # This is the ABI version number, which differes from the API version above # (it indicates ABI compatibility), but they are typically incremented together. set(SO_MAJOR 1) set(SO_MINOR 1) set(SO_PATCH 0) #============================================================================== list (APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) option (NLOPT_CXX "enable cxx routines" ON) option (NLOPT_FORTRAN "enable fortran" OFF) option (BUILD_SHARED_LIBS "Build NLopt as a shared library" ON) option (NLOPT_PYTHON "build python bindings" ON) option (NLOPT_OCTAVE "build octave bindings" ON) option (NLOPT_MATLAB "build matlab bindings" OFF) option (NLOPT_GUILE "build guile bindings" ON) option (NLOPT_JAVA "build java bindings" ON) option (NLOPT_SWIG "use SWIG to build bindings" ON) option (NLOPT_LUKSAN "enable LGPL Luksan solvers" ON) option (NLOPT_TESTS "build unit tests" OFF) if (NLOPT_FORTRAN) enable_language (Fortran) endif () include (GNUInstallDirs) # Offer the user the choice of overriding the installation directories set (NLOPT_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING "Installation directory for libraries") set (NLOPT_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE STRING "Installation directory for executables") set (NLOPT_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING "Installation directory for header files") set (NLOPT_INSTALL_DATADIR ${CMAKE_INSTALL_DATADIR}/nlopt CACHE STRING "Installation directory for data files") set (NLOPT_INSTALL_MANDIR ${CMAKE_INSTALL_MANDIR} CACHE STRING "Installation directory for man documentation") set (NLOPT_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/nlopt CACHE STRING "Installation directory for cmake config files") set (CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${NLOPT_INSTALL_LIBDIR} CACHE PATH "rpath") set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "use link path") include (CheckIncludeFiles) include (CheckFunctionExists) include (CheckTypeSize) include (CheckCSourceCompiles) #============================================================================== # COMPILATION CHECKINGS and CONFIGURATION GENERATION #============================================================================== check_include_file (getopt.h HAVE_GETOPT_H) check_include_file (unistd.h HAVE_UNISTD_H) check_include_file (stdint.h HAVE_STDINT_H) check_include_file (time.h HAVE_TIME_H) check_include_file (sys/time.h HAVE_SYS_TIME_H) if (HAVE_TIME_H AND HAVE_SYS_TIME_H) set (TIME_WITH_SYS_TIME TRUE) endif () check_function_exists (getpid HAVE_GETPID) check_function_exists (syscall HAVE_GETTID_SYSCALL) check_function_exists (isinf HAVE_ISINF) check_function_exists (isnan HAVE_ISNAN) check_function_exists (gettimeofday HAVE_GETTIMEOFDAY) check_function_exists (qsort_r HAVE_QSORT_R) check_function_exists (time HAVE_TIME) check_function_exists (copysign HAVE_COPYSIGN) check_function_exists (getopt HAVE_GETOPT) check_type_size ("uint32_t" SIZEOF_UINT32_T) set (HAVE_UINT32_T ${SIZEOF_UINT32_T}) check_type_size ("unsigned int" SIZEOF_UNSIGNED_INT) check_type_size ("unsigned long" SIZEOF_UNSIGNED_LONG) find_library(M_LIBRARY m) if (M_LIBRARY) set (LIBS_PRIVATE "-lm") endif() if (NOT DEFINED HAVE_FPCLASSIFY) message(STATUS "Looking for fpclassify") file (WRITE ${PROJECT_BINARY_DIR}/fpclassify.c "#include \n") file (APPEND ${PROJECT_BINARY_DIR}/fpclassify.c "int main(void) {\n") file (APPEND ${PROJECT_BINARY_DIR}/fpclassify.c "if (!fpclassify(3.14159)) fpclassify(2.7183);\n") file (APPEND ${PROJECT_BINARY_DIR}/fpclassify.c " return 0; }\n") try_compile (HAVE_FPCLASSIFY ${PROJECT_BINARY_DIR}/build_fpclassify ${PROJECT_BINARY_DIR}/fpclassify.c CMAKE_FLAGS -DLINK_LIBRARIES=m) message(STATUS "Looking for fpclassify - ${HAVE_FPCLASSIFY}") endif () option (WITH_THREADLOCAL "check thread local keyword" ON) if (WITH_THREADLOCAL AND NOT DEFINED THREADLOCAL) foreach (_THREADLOCAL_KEY "__thread" "__declspec(thread)") unset (HAVE_THREAD_LOCAL_STORAGE CACHE) check_c_source_compiles(" ${_THREADLOCAL_KEY} int tls; int main(void) { return 0; }" HAVE_THREAD_LOCAL_STORAGE) if (HAVE_THREAD_LOCAL_STORAGE) set (THREADLOCAL ${_THREADLOCAL_KEY} CACHE STRING "Thread local keyword") endif () endforeach() endif () #============================================================================== # CREATE nlopt_config.h #============================================================================== configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt_config.h IMMEDIATE) # pkgconfig file configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt.pc.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt.pc @ONLY) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/nlopt.pc DESTINATION ${NLOPT_INSTALL_LIBDIR}/pkgconfig) #============================================================================== # nlopt LIBRARY TARGET (SHARED OR STATIC) #============================================================================== set (NLOPT_HEADERS src/api/nlopt.h ${PROJECT_BINARY_DIR}/nlopt.hpp ) add_custom_command (OUTPUT nlopt.hpp COMMAND ${CMAKE_COMMAND} -DAPI_SOURCE_DIR=${PROJECT_SOURCE_DIR}/src/api -P ${PROJECT_SOURCE_DIR}/cmake/generate-cpp.cmake MAIN_DEPENDENCY src/api/nlopt-in.hpp) add_custom_target (generate-cpp ALL DEPENDS nlopt.hpp) if (NLOPT_FORTRAN) add_custom_command (OUTPUT nlopt.f COMMAND ${CMAKE_COMMAND} -DAPI_SOURCE_DIR=${PROJECT_SOURCE_DIR}/src/api -P ${PROJECT_SOURCE_DIR}/cmake/generate-fortran.cmake MAIN_DEPENDENCY src/api/nlopt.h) add_custom_target (generate-fortran ALL DEPENDS nlopt.f) list (APPEND NLOPT_HEADERS ${PROJECT_BINARY_DIR}/nlopt.f) endif() set (NLOPT_SOURCES src/algs/direct/DIRect.c src/algs/direct/direct_wrap.c src/algs/direct/DIRserial.c src/algs/direct/DIRsubrout.c src/algs/direct/direct-internal.h src/algs/direct/direct.h src/algs/cdirect/cdirect.c src/algs/cdirect/hybrid.c src/algs/cdirect/cdirect.h src/algs/praxis/praxis.c src/algs/praxis/praxis.h src/algs/crs/crs.c src/algs/crs/crs.h src/algs/mlsl/mlsl.c src/algs/mlsl/mlsl.h src/algs/mma/mma.c src/algs/mma/mma.h src/algs/mma/ccsa_quadratic.c src/algs/cobyla/cobyla.c src/algs/cobyla/cobyla.h src/algs/newuoa/newuoa.c src/algs/newuoa/newuoa.h src/algs/neldermead/nldrmd.c src/algs/neldermead/neldermead.h src/algs/neldermead/sbplx.c src/algs/auglag/auglag.c src/algs/auglag/auglag.h src/algs/bobyqa/bobyqa.c src/algs/bobyqa/bobyqa.h src/algs/isres/isres.c src/algs/isres/isres.h src/algs/slsqp/slsqp.c src/algs/slsqp/slsqp.h src/algs/esch/esch.c src/algs/esch/esch.h src/api/general.c src/api/options.c src/api/optimize.c src/api/deprecated.c src/api/nlopt-internal.h src/api/nlopt.h src/api/f77api.c src/api/f77funcs.h src/api/f77funcs_.h ${PROJECT_BINARY_DIR}/nlopt.hpp src/util/mt19937ar.c src/util/sobolseq.c src/util/soboldata.h src/util/timer.c src/util/stop.c src/util/nlopt-util.h src/util/redblack.c src/util/redblack.h src/util/qsort_r.c src/util/rescale.c ) if(NLOPT_LUKSAN) list(APPEND NLOPT_SOURCES src/algs/luksan/plis.c src/algs/luksan/plip.c src/algs/luksan/pnet.c src/algs/luksan/mssubs.c src/algs/luksan/pssubs.c src/algs/luksan/luksan.h) endif() set_property(SOURCE src/algs/bobyqa/bobyqa.c src/algs/cdirect/hybrid.c src/algs/mma/ccsa_quadratic.c src/algs/cobyla/cobyla.c src/util/redblack.c src/algs/neldermead/nldrmd.c src/algs/newuoa/newuoa.c src/util/qsort_r.c src/util/mt19937ar.c PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) # workaround for false positive in newuoa if (CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12) set_source_files_properties(src/algs/newuoa/newuoa.c PROPERTIES COMPILE_FLAGS -U_FORTIFY_SOURCE) endif () if (NLOPT_CXX) list (APPEND NLOPT_SOURCES src/algs/stogo/global.cc src/algs/stogo/linalg.cc src/algs/stogo/local.cc src/algs/stogo/stogo.cc src/algs/stogo/tools.cc src/algs/stogo/global.h src/algs/stogo/linalg.h src/algs/stogo/local.h src/algs/stogo/stogo_config.h src/algs/stogo/stogo.h src/algs/stogo/tools.h src/algs/ags/data_types.hpp src/algs/ags/evolvent.hpp src/algs/ags/evolvent.cc src/algs/ags/solver.hpp src/algs/ags/solver.cc src/algs/ags/local_optimizer.hpp src/algs/ags/local_optimizer.cc src/algs/ags/ags.h src/algs/ags/ags.cc) set_property(SOURCE src/algs/ags/solver.cc src/algs/ags/local_optimizer.cc src/algs/ags/ags.cc src/algs/slsqp/slsqp.c PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) endif () install (FILES ${NLOPT_HEADERS} DESTINATION ${NLOPT_INSTALL_INCLUDEDIR}) set (nlopt_lib nlopt) add_library (${nlopt_lib} ${NLOPT_SOURCES}) add_dependencies(${nlopt_lib} generate-cpp) if (NLOPT_LUKSAN) target_include_directories(${nlopt_lib} PRIVATE src/algs/luksan) target_compile_definitions (${nlopt_lib} PRIVATE NLOPT_LUKSAN) endif () if (M_LIBRARY) target_link_libraries (${nlopt_lib} PRIVATE ${M_LIBRARY}) endif () set_target_properties (${nlopt_lib} PROPERTIES SOVERSION ${SO_MAJOR}) set_target_properties (${nlopt_lib} PROPERTIES VERSION "${SO_MAJOR}.${SO_MINOR}.${SO_PATCH}") if (NLOPT_CXX) target_compile_features (${nlopt_lib} PUBLIC cxx_lambdas) endif () #============================================================================== # INCLUDE DIRECTORIES #============================================================================== target_include_directories (${nlopt_lib} PRIVATE ${PROJECT_BINARY_DIR} src/algs/stogo src/algs/ags src/util src/algs/direct src/algs/cdirect src/algs/praxis src/algs/crs src/algs/mlsl src/algs/mma src/algs/cobyla src/algs/newuoa src/algs/neldermead src/algs/auglag src/algs/bobyqa src/algs/isres src/algs/slsqp src/algs/esch src/api) get_target_property (NLOPT_PRIVATE_INCLUDE_DIRS ${nlopt_lib} INCLUDE_DIRECTORIES) target_include_directories (${nlopt_lib} INTERFACE "$" "$/${CMAKE_INSTALL_INCLUDEDIR}>") if (BUILD_SHARED_LIBS) target_compile_definitions (${nlopt_lib} PUBLIC NLOPT_DLL) if (WIN32) # needed to switch between dllexport/dllimport target_compile_definitions (${nlopt_lib} PRIVATE NLOPT_DLL_EXPORT) endif () endif () # needed for the language plugins set_target_properties (${nlopt_lib} PROPERTIES POSITION_INDEPENDENT_CODE ON) # for consistent floating-point operations across architectures option (DISABLE_FP_CONTRACT "Disable floating-point contractions" ON) if (DISABLE_FP_CONTRACT AND CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffp-contract=off") endif () install ( TARGETS ${nlopt_lib} EXPORT NLoptLibraryDepends RUNTIME DESTINATION ${NLOPT_INSTALL_BINDIR} LIBRARY DESTINATION ${NLOPT_INSTALL_LIBDIR} ARCHIVE DESTINATION ${NLOPT_INSTALL_LIBDIR} ) if (MSVC AND BUILD_SHARED_LIBS) install (FILES $ DESTINATION ${NLOPT_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT Debug) endif () # install man if (UNIX) install (FILES src/api/nlopt.3 src/api/nlopt_minimize.3 src/api/nlopt_minimize_constrained.3 DESTINATION ${NLOPT_INSTALL_MANDIR}/man3) endif () if (NLOPT_PYTHON) option (NLOPT_PYTHON_SABI "Use Python stable ABI" OFF) if (NLOPT_PYTHON_SABI AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.26) find_package (Python 3.6 COMPONENTS Interpreter Development.SABIModule NumPy) add_library (Python::Module ALIAS Python::SABIModule) else () find_package (Python 3.6 COMPONENTS Interpreter Development.Module NumPy) endif () endif () if (WIN32) set (INSTALL_PYTHON_DIR Lib/site-packages CACHE STRING "site packages dir") else () set (INSTALL_PYTHON_DIR ${NLOPT_INSTALL_LIBDIR}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages CACHE STRING "site packages dir") endif () if (NLOPT_GUILE) find_package (Guile) endif () if (NLOPT_JAVA) # we do not really need any component, only the main JNI target, but if the # list of components is left empty, FindJNI defaults to "JVM AWT", and we # specifically do not want to check for the AWT library that is not available # on headless installations find_package (JNI COMPONENTS JVM) # FindJNI.cmake in CMake versions prior to 3.24 does not export any targets if(JNI_FOUND AND NOT TARGET JNI::JNI) add_library(JNI::JNI IMPORTED INTERFACE) set_property(TARGET JNI::JNI PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${JAVA_INCLUDE_PATH}) if(NOT JNI_INCLUDE_PATH2_OPTIONAL AND JAVA_INCLUDE_PATH2) set_property(TARGET JNI::JNI APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${JAVA_INCLUDE_PATH2}) endif() endif() find_package (Java 1.5) endif () if (NLOPT_SWIG) find_package (SWIG 3) if (SWIG_FOUND) add_subdirectory (src/swig) endif () endif () if (NLOPT_OCTAVE) find_package (Octave) endif () if (NLOPT_MATLAB) find_package (Matlab COMPONENTS MX_LIBRARY MAIN_PROGRAM) endif () if (OCTAVE_FOUND OR Matlab_FOUND) add_subdirectory (src/octave) endif () if (NLOPT_TESTS) enable_testing () add_subdirectory (test) endif () set (CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") set (CPACK_PACKAGE_VERSION_MAJOR "${NLOPT_MAJOR_VERSION}") set (CPACK_PACKAGE_VERSION_MINOR "${NLOPT_MINOR_VERSION}") set (CPACK_PACKAGE_VERSION_PATCH "${NLOPT_BUGFIX_VERSION}") set (CPACK_SOURCE_GENERATOR "TBZ2;TGZ" ) set (CPACK_BINARY_STGZ OFF CACHE BOOL "STGZ") set (CPACK_BINARY_TBZ2 ON CACHE BOOL "TBZ2") set (CPACK_BINARY_TGZ ON CACHE BOOL "TGZ") set (CPACK_BINARY_TZ OFF CACHE BOOL "TZ") set (CPACK_SOURCE_IGNORE_FILES ".git;/build;.*~;${CPACK_SOURCE_IGNORE_FILES}") set (CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${NLOPT_VERSION_STRING}) include (CPack) # configuration files export (TARGETS ${nlopt_lib} NAMESPACE NLopt:: FILE ${PROJECT_BINARY_DIR}/NLoptLibraryDepends.cmake) # Install the export set for use with the install-tree install(EXPORT NLoptLibraryDepends NAMESPACE NLopt:: DESTINATION ${NLOPT_INSTALL_CMAKEDIR} COMPONENT Development) # Create a NLOPTConfig.cmake file for the use from the install tree # and install it set (NLOPT_LIBRARIES "NLopt::${nlopt_lib}") configure_file (cmake/NLoptConfig.cmake.in NLoptConfig.cmake @ONLY) configure_file (cmake/NLoptConfigVersion.cmake.in NLoptConfigVersion.cmake @ONLY) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/NLoptConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/NLoptConfigVersion.cmake DESTINATION ${NLOPT_INSTALL_CMAKEDIR} COMPONENT Development) stevengj-nlopt-88c424d/CMakePresets.json000066400000000000000000000010331521061417600202540ustar00rootroot00000000000000{ "version": 2, "configurePresets": [ { "name": "linux-debug", "binaryDir": "${sourceDir}/build", "generator": "Unix Makefiles", "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo", "CMAKE_C_FLAGS": "-Wall -Wextra -Wpedantic -Wshadow", "CMAKE_CXX_FLAGS": "-Wall -Wextra -Wpedantic -Wshadow -D_GLIBCXX_ASSERTIONS -fno-inline", "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install", "SWIG_COMPILE_FLAGS": "-O1 -Wno-unused-parameter -Wno-shadow" } } ] } stevengj-nlopt-88c424d/COPYING000066400000000000000000000040411521061417600160700ustar00rootroot00000000000000NLopt combines several free/open-source nonlinear optimization libraries by various authors. See the COPYING, COPYRIGHT, and README files in the subdirectories for the original copyright and licensing information of these packages. The compiled NLopt library, i.e. the combined work of all of the included optimization routines, is licensed under the conjunction of all of these licensing terms. By default, the most restrictive terms are for the code in the "luksan" directory, which is licensed under the GNU Lesser General Public License (GNU LGPL), version 2.1 or later (see luksan/COPYRIGHT). That means that, by default, the compiled NLopt library is governed by the terms of the LGPL. --------------------------------------------------------------------------- However, NLopt also offers the option to be built without the code in the "luksan" directory. In this case, NLopt, including any modifications to the abovementioned packages, are licensed under the standard "MIT License:" Copyright (c) 2007-2024 Massachusetts Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. stevengj-nlopt-88c424d/COPYRIGHT000066400000000000000000000022611521061417600163320ustar00rootroot00000000000000/* Copyright (c) 2007-2020 Massachusetts Institute of Technology * and other contributors * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ stevengj-nlopt-88c424d/ChangeLog000066400000000000000000000001061521061417600166050ustar00rootroot00000000000000See https://github.com/stevengj/nlopt for a detailed version history. stevengj-nlopt-88c424d/NEWS.md000066400000000000000000000463351521061417600161470ustar00rootroot00000000000000# NLopt Release Notes ## NLopt 2.11 5 June 2026 * New CCSA and MMA parameters `inner_gradients` and `always_improve` ([#623]). * Various minor bugfixes ([35df45](https://github.com/stevengj/nlopt/commit/35df45ca2247f17d7550c60f449f834cdf0ec1ed), [#637], [#640]). ## NLopt 2.10.1 9 February 2026 * Fixed octave 10.x build ([#616]). * Fixed slsqp constraints count ([#598]). * Fixed build with libstdc++ debug iterators ([#627]). * Fixed PRAXIS evaluations count ([#606]). ## NLopt 2.10 4 February 2025 * New Java bindings ([#578]). * Allow disabling exceptions with `set_exceptions_enabled` ([#580]). * Configurable `tolg` tolerance parameter for Luksan gradient stopping condition ([#585]). * Restored `LD_LBFGS_NOCEDAL` enum value (dropped in 2.9) to ease backwards compatibility for wrappers in other languages (though this algorithm is currently unimplemented) ([#587]). ## NLopt 2.9.1 25 November 2024 * Fixed PRAXIS box constraints ([#528]) ## NLopt 2.9 10 November 2024 * New `NLOPT_LUKSAN` cmake option to build without Luksan LGPL code ([#568]). * Dropped unused `LD_LBFGS_NOCEDAL` enum value. * Python 3.13 support ([#565]). * Fixed COBYLA not returning the optimum ([#57]) * Fixed SLSQP returning infeasible optimum ([#368]) * Fixed STOGO not registering new optimum ([#504]) * Various minor bugfixes ([#570], [#563], [#379], [#511]) ## NLopt 2.8 9 August 2024 * Support C++ functors for objective functions ([#457]). * CCSA/MMA an now use the `initial_step` parameter to bound their initial stepsize, and also expose a new internal parameter `rho_init` ([#561]). * Install `pkg-config` file on Windows ([#534]). * Allow having more equality constraints than there are variables ([#509]). * Bugfixes to `nlopt_algorithm_name` ([#558]), Matlab `NLOPT_GN_AGS` ([#533]), forced stop for empty dimensions ([#473]), SLSQP ([#465]), and build improvements ([#551], [#535],[#510], [#445]…). ## NLopt 2.7.1 3 December 2021 * Various minor bugfixes ([#268], [#409], [#420]) and build improvements (support Octave 6.x, Guile 3.x, Cmake 3.2). ## NLopt 2.7 18 November 2020 * New `nlopt_set_param` API for setting internal algorithm parameters ([#365]). * Avoid library-symbol conflicts ([#355], [#361]) ## NLopt 2.6.2 15 April 2020 * Fixed forced stop exception with dimension elimination ([#317]) * Fixed `get_initial_step` wrapping ([#319]) * Various build fixes ([#314], [#308], [#303], [#278]) ## NLopt 2.6.1 13 April 2019 * Fix `nlopt_version` result for 2.6.x and update soname. ## NLopt 2.6 12 April 2019 * New `nlopt_set_upper_bound` and `nlopt_set_lower_bound` functions in the low-level C API to set one bound at a time ([#257]). * There is no longer a separate `libnlopt_cxx` library: C++ algorithms (STOGO and AGS) are compiled and included by default ([#198]). * Various build fixes ([#197], [#216], [#245], [#250], [#230], [#261], etc.), other fixes ([#242], [#258]). ## NLopt 2.5 26 July 2018 * New AGS global solver ([#194]), thanks to Vladislav Sovrasov. * New `nlopt_get_numevals` function providing a built-in evaluation counter ([#160]). * New `nlopt_get_errmsg` function for more descriptive error messages. * Build system is converted to `cmake` ([#49]), thanks to Julien Schueller * Plugins updated for recent Octave and Guile versions. * Various other build fixes and minor bug fixes. ## NLopt 2.4.2 20 May 2014 * Fix CRS for empty dimensions (where lower `==` upper bound) (issue [#13]). * Improvements to CMake (thanks to @xantares) and Windows builds (issue [#12]). * Fix guile2 compatibility (issue [#21]). ## NLopt 2.4.1 19 November 2013 * Use `cdecl` calling convention instead of stdcall on Win32, to simplify shared-library usage and for consistency with Win64. ## NLopt 2.4 2 November 2013 * New genetic algorithm ESCH, thanks to Carlos Henrique da Silva Santos. * Fix swig dir for `VPATH` builds, thanks to Sandro Vitenti for the bug report. * Use `python-config` program in the `configure` script to find the include directories for Python, if possible (may be overridden by `PYTHON_CONFIG` environment variable). * Bugfix in copy constructor for C++ and Python interfaces. * Bugfix in return value for setting min/max objective. * Handle negative rescalings in COBYLA and BOBYQA. * Plugin installation honors the `configure --prefix`, if any (thanks to xantares@github). * Various compilation fixes for compatibility with recent software. ## NLopt 2.3.1 16 September 2012 * Bug fix: COBLYA should return `ROUNDOFF_LIMITED` rather than `XTOL_REACHED` if the trust-region radius underflows to zero; thanks to David Liu. * Bug fix: incorrect return value from set min/max objective. * Handle case of negative rescalings (from negative dx) in COBYLA and BOBYQA; thanks to Alexander Law for the bug report ## NLopt 2.3 20 July 2012 * In Matlab/Octave interface, make returning NaN from the objective equivalent to `nlopt_force_stop`; thanks to Norman Violet for the suggestion. * Added CCSA-quadratic (`NLOPT_LD_CCSAQ`), similar to MMA. * Added interface for supplying a preconditioner (approximate Hessian); currently only supported in CCSAQ. * When adding mconstraints, allow `tol==NULL` as synonym for zero tolerances. * Added missing `NLOPT_LD_SLSQP` constant in Matlab/Octave. * Lower tolerance for dual optimization in MMA/CCSAQ; thanks to Christophe Leruste for the problem report * Fixed bug in timer, thanks to William Vaughn for the patch. * Bug fix to convergence test in sbplx; thanks to Douglas Bates. ## NLopt 2.2.4 9 June 2011 * Fixed linking problem for C++ and Python shared libraries on MacOS X; thanks to Volker Lorrmann for the bug report. ## NLopt 2.2.3 8 June 2011 * Fixed additional re-entrancy problem in Luksan algorithms missed in the previous version; thanks to Gert Wollny for the bug report. * Fixed set/get `vector_storage` in Fortran interface for Fortran compilers with all-uppercase linkage. ## NLopt 2.2.2 26 May 2011 * Added `set_vector_storage` API to modify the memory usage and the subspace dimension for low-storage quasi-Newton methods. * Fixed missing support for maxtime stopping criteria in Luksan and `ORIG_DIRECT` algorithms; thanks to Jurgen Werner for the bug report. * Fixed algorithms to support the case where the lower and upper bounds are equal for some variables (which effectively eliminates those variables from optimization). * Added missing xtol check to SLSQP, which caused erroneous `ROUNDOFF_LIMITED` error codes to be returned; thanks to Alexander Riess for the bug report. * Fixed slight overcounting of function evaluations for maxeval check in SLSQP. * Fixed deprecated API to support `xtol_abs == NULL` for backward compatibility (thanks to Francesco Biscani for the bug report). * Made Luksan algorithms (e.g. LBFGS and other quasi-Newton methods) re-entrant; thanks to Gert Wollny for the bug report. (Fixes Gentoo bug #368685.) * Fixed bug in DIRECT (not `ORIG_DIRECT`), where a typo caused suboptimal convergence in some cases; thanks to Sinisa Hristov for the bug report. ## NLopt 2.2.1 6 September 2010 * If you compile `nlopt.h` with the `NLOPT_DLL_EXPOR`T symbol `#defined`, it now uses the `dllexport` directive (under Windows), useful for compiling an NLopt DLL under Microsoft compilers; thanks to Benoit Scherrer for the suggestion. * Handle case where `copysign` function is missing, e.g. on Windows; thanks to Benoit Scherrer for the bug report. * Remove C99-style mixed declaration and code in a couple files, so that code compiles in C89; thanks to Benoit Scherrer for the bug report. * Removed a few compiler warnings under Microsoft compilers; thanks to Benoit Scherrer for the bug report. * Export `nlopt_get_algorithm_name` function on Windows; thanks to Ofek Shilon for the bug report. * Don't use `dllimport` directive with `lcc` on Windows (which doesn't support it); thanks to Laurent Vanbeylen for the bug report. * Update Nodedal README directory to indicate that Nocedal's LBFGS code is now available under the GPL, and therefore may be distributed with a future NLopt version (although Luksan's LBFGS code already works well). * Bug fix in `set`/`get_xtol_abs`; thanks to David Rivest-Henault for the report. ## NLopt 2.2 15 July 2010 * Added SLSQP algorithm for gradient-based local optimization with nonlinear constraints via sequential quadratic programming, based on the implementation by Dieter Kraft that was adapted for SciPy. * Modified BOBYQA and COBYLA algorithms to support unequal initial step sizes in different directions; thanks to Tom Fiddaman for pointing out the need for this in the case where different directions have very different scales. * Added Python module docstring; thanks to Sebastian Walter for the suggestion. * Added `GUILE_INSTALL_DIR` variable to allow the user to change the Guile installation directory. * Added Fortran interface for vector-valued constraints. * Throw correct exceptions in Python for the `add_*constraint` functions; thanks to Dmitrey Kroshko for the bug report. * Support forced stop and exceptions in `ORIG_DIRECT` algorithm. * Remove arbitrary `1e20` upper bound on function values from `ORIG_DIRECT` code. * Bugfix in C++ interface (and some other language front-ends) when deallocating the nlopt_opt object in cases like MLSL where local_optimizer is used; thanks to Jurgen Werner for the bug report. ## NLopt 2.1.2 8 July 2010 * The Python mconstraint (vector-valued constraint) functions now pass a 2-dimensional array for the gradient argument, rather than a flattened 1d array. * Improved handling of exceptions and forced stops for constrained optimization, making sure that no constraints are evaluated after the stop. * Return an `NLOPT_INVALID_ARGS` error if more than n equality constraints are added in an n-dimensional problem. * Fix bug that could cause spurious `NLOPT_INVALID_ARGS` errors when adding constraints under rare circumstances. * Eliminate a few small memory leaks that could occur under error conditions. ## NLopt 2.1.1 7 July 2010 * More robust configure check for Python include directories, via `distutils.sysconfig.get_python_inc()` and `numpy.get_include()`. Thanks to Nathaniel Smith for the tip. * Bug fix in Guile interface: added missing prefix to nlopt-version-major etcetera. ## NLopt 2.1 6 July 2010 * New vector-valued constraint feature; thanks to Dmitrey Kroshko of OpenOpt for the suggestion. * COBYLA now accepts equality constraints. * Guard against multiple inclusion in `nlopt.hpp`; thanks to Saul Thurrowgood for the suggestion. ## NLopt 2.0.2 17 June 2010 * Fixed compilation failure in Microsoft Visual Studio, due to incorrect usage of `__stdcall` keyword; thanks to Dave Katz for the bug report. ## NLopt 2.0.1 16 June 2010 * Bug fix in Fortran API (for `nlo_get_` functions returning arrays). * Fixed buggy compilation with MinGW. ## NLopt 2.0 15 June 2010 * New C API, that works by creating an `nlopt_opt` "object" and then calling functions to set the optimization parameters — much more extensible than the old API (which is preserved for backwards compatibility). (Updated Fortran, Matlab, and GNU Octave wrappers as well.) * C++ `nlopt.hpp` wrapper around C API, allowing namespaces, object constructors/destructors, `std::vector`, and exceptions to be exploited. * New nlopt wrappers callable from Python and GNU Guile, generated with the help of SWIG. * New `man nlopt` manual page documenting new API. * New AUGLAG algorithm(s) implementing an augmented-Lagrangian method proposed by Birgin and Martinez (2008), which supports nonlinear equality and inequality constraints "wrapped around" other local/global optimization methods. * Added API for nonlinear equality constraints (currently only supported by AUGLAG and ISRES algorithms). * Support inequality constraints directly in `ORIG_DIRECT` algorithms (no need to return NaN when constraint is violated). * Inequality/equality constraints now have optional tolerances that are used as conditions in stopping criteria. * Pseudo-randomize simplex steps in COBYLA algorithm, improving robustness by avoiding accidentally taking steps that don't improve conditioning (which seems to happen sometimes with active bound constraints). The algorithm remains deterministic (a deterministic seed is used), however. * Allow COBYLA to increase the trust-region radius if the predicted improvement was approximately right and the simplex is OK, following a suggestion in the SAS manual for PROC NLP that seems to improve convergence speed. * Added `nlopt_force_stop` function to force a (graceful) halt to the optimization, and corresponding `NLOPT_FORCED_STOP` return code. * Improved thread-safety in random-number generation: thread-local storage is used for random-number state, on compilers that support it (e.g. gcc, Intel, Microsoft), to make the generation thread-safe. In this case, the random-number seed must be set per-thread. * Return an error in global-search algorithms if the domain is not finite. * Use `stdcall` convention on Windows; thanks to Alan Young for the suggestion. * Added missing absolute-tolerance criteria in Luksan algorithms; thanks to Greg Nicholas for the bug report. * Fixed compilation under C++, and use C++ compiler for everything in `--with-cxx` mode; thanks to Greg Nicholas for the bug report. * In MMA, only stop at minf_max/stopval if the point is feasible. * Fix Matlab mex file to not include unnecessary `nlopt-util.h` file, simplifying Windows compilation. ## NLopt 1.2 18 November 2009 * Added Powell's BOBYQA algorithm for box-constrained optimization without derivatives, an improvement on NEWUOA. * Added ISRES genetic algorithm, supporting nonlinearly constrained global optimization. * New functions `nlopt_{set/get}_stochastic_population` to provide optional greater control over the random "population" sizes in stochastic algorithms (although it still has a sensible default). * Bug fix: remove extraneous text accidentally included in `nlopt.f` Fortran include file. * Bug fix: `configure` script now correctly handles Matlab installation when `MEX_INSTALL_DIR` is specified manually by the user. ## NLopt 1.1 12 November 2009 * `configure` script detects whether `--enable-shared` is required in order to compile Matlab and Octave plugins (as is the case on x86_64), and disables compilation of those plugins if `--enable-shared` is not used. * Added `--without-octave` and `--without-matlab` configure options to disable Octave and Matlab plugins, respectively. * Modified COBYLA algorithm to have better support for bound constraints. * Added new `NLOPT_ROUNDOFF_LIMITED` failure code to indicate cases in which optimization breaks down due to roundoff errors, in which case it is possible that useful results were obtained. * Experimental support for nonlinear equality constraints via augmented-Lagrangian method. * Support for compiling under Windows (ideally with MinGW) as a DLL, although you have to manually add `#define NLOPT_DLL` to nlopt.h *after* installing (after compiling NLopt). * Added several checks for roundoff-related breakdown to NEWUOA code. * When only a relative error tolerance is specified, no longer fails to halt when exact convergence to zero is obtained. * Workaround for incompatible `qsort_r` functions in BSD and GNU libc by always using my own version; thanks to Wendy Vandoolaeghe and Philippe Preux for the bug report and explanation. * Workaround for gcc 3.4.x conflict with `HUGE_VAL` definition in Solaris (gcc bug 19933). * Better identification of Matlab-plugin installation directory. * Fixed identification of Octave-plugin installation directory for recent Octave versions. ## NLopt 1.0.1 13 Nov. 2008 * Allow user to override Matlab-plugin installation directory with `MEX_INSTALL_DIR`. * Bug fix in my DIRECT code that prevented convergence (DIRECT-L unaffected). * MLSL needs a nonzero default `ftol_rel` and/or `xtol_rel` to ensure that its local searches terminate; use roughly machine precision as defaults. ## NLopt 1.0 11 Nov. 2008 * Initial public release. [#12]: https://github.com/stevengj/nlopt/issues/12 [#13]: https://github.com/stevengj/nlopt/issues/13 [#21]: https://github.com/stevengj/nlopt/issues/21 [#49]: https://github.com/stevengj/nlopt/issues/49 [#57]: https://github.com/stevengj/nlopt/issues/57 [#160]: https://github.com/stevengj/nlopt/issues/160 [#194]: https://github.com/stevengj/nlopt/issues/194 [#197]: https://github.com/stevengj/nlopt/issues/197 [#198]: https://github.com/stevengj/nlopt/issues/198 [#216]: https://github.com/stevengj/nlopt/issues/216 [#230]: https://github.com/stevengj/nlopt/issues/230 [#242]: https://github.com/stevengj/nlopt/issues/242 [#245]: https://github.com/stevengj/nlopt/issues/245 [#250]: https://github.com/stevengj/nlopt/issues/250 [#257]: https://github.com/stevengj/nlopt/issues/257 [#258]: https://github.com/stevengj/nlopt/issues/258 [#261]: https://github.com/stevengj/nlopt/issues/261 [#268]: https://github.com/stevengj/nlopt/issues/268 [#278]: https://github.com/stevengj/nlopt/issues/278 [#303]: https://github.com/stevengj/nlopt/issues/303 [#308]: https://github.com/stevengj/nlopt/issues/308 [#314]: https://github.com/stevengj/nlopt/issues/314 [#317]: https://github.com/stevengj/nlopt/issues/317 [#319]: https://github.com/stevengj/nlopt/issues/319 [#355]: https://github.com/stevengj/nlopt/issues/355 [#361]: https://github.com/stevengj/nlopt/issues/361 [#365]: https://github.com/stevengj/nlopt/issues/365 [#368]: https://github.com/stevengj/nlopt/issues/368 [#379]: https://github.com/stevengj/nlopt/issues/379 [#409]: https://github.com/stevengj/nlopt/issues/409 [#420]: https://github.com/stevengj/nlopt/issues/420 [#445]: https://github.com/stevengj/nlopt/issues/445 [#457]: https://github.com/stevengj/nlopt/issues/457 [#465]: https://github.com/stevengj/nlopt/issues/465 [#473]: https://github.com/stevengj/nlopt/issues/473 [#504]: https://github.com/stevengj/nlopt/issues/504 [#509]: https://github.com/stevengj/nlopt/issues/509 [#510]: https://github.com/stevengj/nlopt/issues/510 [#511]: https://github.com/stevengj/nlopt/issues/511 [#528]: https://github.com/stevengj/nlopt/issues/528 [#533]: https://github.com/stevengj/nlopt/issues/533 [#534]: https://github.com/stevengj/nlopt/issues/534 [#535]: https://github.com/stevengj/nlopt/issues/535 [#551]: https://github.com/stevengj/nlopt/issues/551 [#558]: https://github.com/stevengj/nlopt/issues/558 [#561]: https://github.com/stevengj/nlopt/issues/561 [#563]: https://github.com/stevengj/nlopt/issues/563 [#565]: https://github.com/stevengj/nlopt/issues/565 [#568]: https://github.com/stevengj/nlopt/issues/568 [#570]: https://github.com/stevengj/nlopt/issues/570 [#578]: https://github.com/stevengj/nlopt/issues/578 [#580]: https://github.com/stevengj/nlopt/issues/580 [#585]: https://github.com/stevengj/nlopt/issues/585 [#587]: https://github.com/stevengj/nlopt/issues/587 [#598]: https://github.com/stevengj/nlopt/issues/598 [#606]: https://github.com/stevengj/nlopt/issues/606 [#616]: https://github.com/stevengj/nlopt/issues/616 [#623]: https://github.com/stevengj/nlopt/issues/623 [#627]: https://github.com/stevengj/nlopt/issues/627 [#637]: https://github.com/stevengj/nlopt/issues/637 [#640]: https://github.com/stevengj/nlopt/issues/640 stevengj-nlopt-88c424d/README.md000066400000000000000000000035321521061417600163200ustar00rootroot00000000000000[![Latest Docs](https://readthedocs.org/projects/nlopt/badge/?version=latest)](http://nlopt.readthedocs.io/en/latest/) [![Build Status](https://github.com/stevengj/nlopt/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/stevengj/nlopt/actions/workflows/build.yml) NLopt is a library for nonlinear local and global optimization, for functions with and without gradient information. It is designed as a simple, unified interface and packaging of several free/open-source nonlinear optimization libraries. The latest release can be downloaded from the [NLopt releases](https://github.com/stevengj/nlopt/releases) page on Github, and the [NLopt manual](https://nlopt.readthedocs.io/en/latest/) is hosted on readthedocs. To build it refer to the [installation instructions](https://nlopt.readthedocs.io/en/latest/#download-and-installation). To use in your C/C++ programs see the [C reference manual](https://nlopt.readthedocs.io/en/latest/NLopt_Reference/). There are also interfaces for [C++](https://nlopt.readthedocs.io/en/latest/NLopt_C-plus-plus_Reference/), [Fortran](https://nlopt.readthedocs.io/en/latest/NLopt_Fortran_Reference/), [Python](https://nlopt.readthedocs.io/en/latest/NLopt_Python_Reference/), [Matlab or GNU Octave](https://nlopt.readthedocs.io/en/latest/NLopt_Matlab_Reference/), [OCaml](https://bitbucket.org/mkur/nlopt-ocaml), [GNU Guile](https://nlopt.readthedocs.io/en/latest/NLopt_Guile_Reference/), [GNU R](https://www.ucl.ac.uk/~uctpjyy/nloptr.html), [Lua](https://github.com/rochus-keller/LuaNLopt), [Perl](https://metacpan.org/pod/Math::NLopt), [Rust](https://github.com/jesskfullwood/rust-nlopt), [Ruby](https://github.com/ankane/nlopt-ruby), [Julia](https://github.com/JuliaOpt/NLopt.jl), and [Java](https://nlopt.readthedocs.io/en/latest/NLopt_Java_Reference/). Interfaces for other languages may be added in the future. stevengj-nlopt-88c424d/TODO000066400000000000000000000007261521061417600155330ustar00rootroot00000000000000Add nonlinearly constrained multistart algorithm. Add option to control subspace size (mf) in LBFGS etcetera. STOGO has bitrotted - doesn't return proper NLopt codes, doesn't support forced stop, etcetera. Needs to be fixed. If local_optimizer is set, STOGO should use it instead of its own BFGS. Wrappers for GNU R, Java, Perl, Ocaml, C#, ... Updates from Jones, D.R., Martins, J.R.R.A., (2021) "The DIRECT algorithm: 25 years Later." J Glob Optim 79, 521–566.stevengj-nlopt-88c424d/cmake/000077500000000000000000000000001521061417600161165ustar00rootroot00000000000000stevengj-nlopt-88c424d/cmake/FindGuile.cmake000066400000000000000000000067151521061417600207770ustar00rootroot00000000000000# Copyright (c) 2008, 2014 OpenCog.org (http://opencog.org) # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # - Try to find Guile; Once done this will define # # GUILE_FOUND - system has the GUILE library # GUILE_INCLUDE_DIRS - the GUILE include directory # GUILE_LIBRARIES - The libraries needed to use GUILE # GUILE_VERSION_STRING - Version # GUILE_SITE_DIR - site dir # GUILE_EXTENSION_DIR - extension dir # GUILE_ROOT_DIR - prefix dir # Look for the header file # Look for guile-2.2 first, then 2.0, then 1.8 # Macports for OSX puts things in /opt/local find_path (GUILE_INCLUDE_DIR libguile.h PATH_SUFFIXES guile/3.0 guile/2.2 guile/2.0 guile/1.8 libguile guile HINTS /opt/local/include ) # Look for the library find_library (GUILE_LIBRARY NAMES guile-3.0 guile-2.2 guile-2.0 guile HINTS /opt/local/lib ) set (GUILE_LIBRARIES ${GUILE_LIBRARY}) set (GUILE_INCLUDE_DIRS ${GUILE_INCLUDE_DIR}) find_path (GMP_INCLUDE_DIR gmp.h) if (GMP_INCLUDE_DIR) list (APPEND GUILE_INCLUDE_DIRS ${GMP_INCLUDE_DIR}) endif () # check guile's version if we're using cmake >= 2.6 if (GUILE_INCLUDE_DIR) SET(GUILE_VERSION_MAJOR 0) SET(GUILE_VERSION_MINOR 0) SET(GUILE_VERSION_PATCH 0) IF(NOT EXISTS "${GUILE_INCLUDE_DIR}/libguile/version.h") MESSAGE(FATAL_ERROR "Found ${GUILE_INCLUDE_DIR}/libguile.h but not version.h; check your guile installation!") ENDIF(NOT EXISTS "${GUILE_INCLUDE_DIR}/libguile/version.h") # Extract the libguile version from the 'version.h' file SET(GUILE_MAJOR_VERSION 0) FILE(READ "${GUILE_INCLUDE_DIR}/libguile/version.h" _GUILE_VERSION_H_CONTENTS) STRING(REGEX MATCH "#define SCM_MAJOR_VERSION[ ]+([0-9])" _MATCH "${_GUILE_VERSION_H_CONTENTS}") SET(GUILE_VERSION_MAJOR ${CMAKE_MATCH_1}) STRING(REGEX MATCH "#define SCM_MINOR_VERSION[ ]+([0-9]+)" _MATCH "${_GUILE_VERSION_H_CONTENTS}") SET(GUILE_VERSION_MINOR ${CMAKE_MATCH_1}) STRING(REGEX MATCH "#define SCM_MICRO_VERSION[ ]+([0-9]+)" _MATCH "${_GUILE_VERSION_H_CONTENTS}") SET(GUILE_VERSION_PATCH ${CMAKE_MATCH_1}) SET(GUILE_VERSION_STRING "${GUILE_VERSION_MAJOR}.${GUILE_VERSION_MINOR}.${GUILE_VERSION_PATCH}") endif () find_program(GUILE_EXECUTABLE NAMES guile3.0 guile2.2 guile2.0 guile ) find_program(GUILE_CONFIG_EXECUTABLE NAMES guile-config3.0 guile-config2.2 guile-config2.0 guile-config ) if (GUILE_CONFIG_EXECUTABLE) execute_process (COMMAND ${GUILE_CONFIG_EXECUTABLE} info prefix OUTPUT_VARIABLE GUILE_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${GUILE_CONFIG_EXECUTABLE} info sitedir OUTPUT_VARIABLE GUILE_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${GUILE_CONFIG_EXECUTABLE} info extensiondir OUTPUT_VARIABLE GUILE_EXTENSION_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) endif () # IF(GUILE_FOUND AND GUILE_VERSION_MAJOR EQUAL 2) # ADD_DEFINITIONS(-DHAVE_GUILE2) # ENDIF(GUILE_FOUND AND GUILE_VERSION_MAJOR EQUAL 2) # handle REQUIRED and QUIET options include (FindPackageHandleStandardArgs) find_package_handle_standard_args (Guile REQUIRED_VARS GUILE_EXECUTABLE GUILE_ROOT_DIR GUILE_INCLUDE_DIRS GUILE_LIBRARIES VERSION_VAR GUILE_VERSION_STRING) mark_as_advanced (GUILE_INCLUDE_DIR GUILE_LIBRARY) stevengj-nlopt-88c424d/cmake/FindOctave.cmake000066400000000000000000000172451521061417600211530ustar00rootroot00000000000000# - Find Octave # GNU Octave is a high-level interpreted language, primarily intended for numerical computations. # available at http://www.gnu.org/software/octave/ # # This module defines: # OCTAVE_EXECUTABLE - octave interpreter # OCTAVE_INCLUDE_DIRS - include path for mex.h, mexproto.h # OCTAVE_LIBRARIES - required libraries: octinterp, octave, cruft # OCTAVE_OCTINTERP_LIBRARY - path to the library octinterp # OCTAVE_OCTAVE_LIBRARY - path to the library octave # OCTAVE_CRUFT_LIBRARY - path to the library cruft # OCTAVE_VERSION_STRING - octave version string # OCTAVE_MAJOR_VERSION - major version # OCTAVE_MINOR_VERSION - minor version # OCTAVE_PATCH_VERSION - patch version # OCTAVE_OCT_FILE_DIR - object files that will be dynamically loaded # OCTAVE_OCT_LIB_DIR - oct libraries # OCTAVE_ROOT_DIR - octave prefix # OCTAVE_M_SITE_DIR - .m files site dir # OCTAVE_OCT_SITE_DIR - .oct files site dir # # The macro octave_add_oct allows to create compiled modules. # octave_add_oct (target_name # [SOURCES] source1 [source2 ...] # [LINK_LIBRARIES lib1 [lib2 ...]] # [EXTENSION ext] #) # # To install it, you can the use the variable OCTAVE_OCT_FILE_DIR as follow: # file (RELATIVE_PATH PKG_OCTAVE_OCT_SITE_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_OCT_SITE_DIR}) # install ( # TARGETS target_name # DESTINATION ${PKG_OCTAVE_OCT_SITE_DIR} #) #============================================================================= # Copyright 2013, Julien Schueller # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # The views and conclusions contained in the software and documentation are those # of the authors and should not be interpreted as representing official policies, # either expressed or implied, of the FreeBSD Project. #============================================================================= find_program(OCTAVE_CONFIG_EXECUTABLE NAMES octave-config ) if (OCTAVE_CONFIG_EXECUTABLE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p OCTAVE_HOME OUTPUT_VARIABLE OCTAVE_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} --m-site-dir OUTPUT_VARIABLE OCTAVE_M_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} --oct-site-dir OUTPUT_VARIABLE OCTAVE_OCT_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p BINDIR OUTPUT_VARIABLE OCTAVE_BIN_PATHS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p OCTINCLUDEDIR OUTPUT_VARIABLE OCTAVE_INCLUDE_PATHS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p OCTLIBDIR OUTPUT_VARIABLE OCTAVE_LIBRARIES_PATHS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p OCTFILEDIR OUTPUT_VARIABLE OCTAVE_OCT_FILE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -p OCTLIBDIR OUTPUT_VARIABLE OCTAVE_OCT_LIB_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${OCTAVE_CONFIG_EXECUTABLE} -v OUTPUT_VARIABLE OCTAVE_VERSION_STRING OUTPUT_STRIP_TRAILING_WHITESPACE) if (OCTAVE_VERSION_STRING) string (REGEX REPLACE "([0-9]+)\\..*" "\\1" OCTAVE_MAJOR_VERSION ${OCTAVE_VERSION_STRING}) string (REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" OCTAVE_MINOR_VERSION ${OCTAVE_VERSION_STRING}) string (REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" OCTAVE_PATCH_VERSION ${OCTAVE_VERSION_STRING}) endif () endif () find_program(OCTAVE_EXECUTABLE HINTS ${OCTAVE_BIN_PATHS} NAMES octave ) find_program(OCTAVE_MKOCTFILE HINTS ${OCTAVE_BIN_PATHS} NAMES mkoctfile ) find_library(OCTAVE_OCTINTERP_LIBRARY NAMES octinterp liboctinterp HINTS ${OCTAVE_LIBRARIES_PATHS} ) find_library(OCTAVE_OCTAVE_LIBRARY NAMES octave liboctave HINTS ${OCTAVE_LIBRARIES_PATHS} ) find_library(OCTAVE_CRUFT_LIBRARY NAMES cruft libcruft HINTS ${OCTAVE_LIBRARIES_PATHS} ) set (OCTAVE_LIBRARIES ${OCTAVE_OCTINTERP_LIBRARY}) list (APPEND OCTAVE_LIBRARIES ${OCTAVE_OCTAVE_LIBRARY}) if (OCTAVE_CRUFT_LIBRARY) list (APPEND OCTAVE_LIBRARIES ${OCTAVE_CRUFT_LIBRARY}) endif () find_path (OCTAVE_INCLUDE_DIR NAMES octave/oct.h PATHS "${OCTAVE_INCLUDE_PATHS}/.." ) if (OCTAVE_INCLUDE_DIR) set (OCTAVE_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIR} ${OCTAVE_INCLUDE_DIR}/octave) endif () macro (octave_add_oct FUNCTIONNAME) set (_CMD SOURCES) set (_SOURCES) set (_LINK_LIBRARIES) set (_EXTENSION) set (_OCT_EXTENSION oct) foreach (_ARG ${ARGN}) if (${_ARG} MATCHES SOURCES) set (_CMD SOURCES) elseif (${_ARG} MATCHES LINK_LIBRARIES) set (_CMD LINK_LIBRARIES) elseif (${_ARG} MATCHES EXTENSION) set (_CMD EXTENSION) else () if (${_CMD} MATCHES SOURCES) list (APPEND _SOURCES "${_ARG}") elseif (${_CMD} MATCHES LINK_LIBRARIES) list (APPEND _LINK_LIBRARIES "${_ARG}") elseif (${_CMD} MATCHES EXTENSION) set (_OCT_EXTENSION ${_ARG}) endif () endif () endforeach () add_library (${FUNCTIONNAME} SHARED ${_SOURCES}) target_link_libraries (${FUNCTIONNAME} PRIVATE ${OCTAVE_LIBRARIES} ${_LINK_LIBRARIES}) set_target_properties (${FUNCTIONNAME} PROPERTIES PREFIX "" SUFFIX ".${_OCT_EXTENSION}" ) endmacro () # handle REQUIRED and QUIET options include (FindPackageHandleStandardArgs) find_package_handle_standard_args (Octave REQUIRED_VARS OCTAVE_EXECUTABLE OCTAVE_ROOT_DIR OCTAVE_INCLUDE_DIRS OCTAVE_LIBRARIES VERSION_VAR OCTAVE_VERSION_STRING) mark_as_advanced ( OCTAVE_OCT_FILE_DIR OCTAVE_OCT_LIB_DIR OCTAVE_OCTINTERP_LIBRARY OCTAVE_OCTAVE_LIBRARY OCTAVE_CRUFT_LIBRARY OCTAVE_LIBRARIES OCTAVE_INCLUDE_DIR OCTAVE_INCLUDE_DIRS OCTAVE_ROOT_DIR OCTAVE_VERSION_STRING OCTAVE_MAJOR_VERSION OCTAVE_MINOR_VERSION OCTAVE_PATCH_VERSION ) stevengj-nlopt-88c424d/cmake/NLoptConfig.cmake.in000066400000000000000000000013031521061417600217040ustar00rootroot00000000000000 # Tell the user project where to find our headers and libraries set (NLOPT_VERSION "@NLOPT_VERSION_STRING@") set (NLOPT_INCLUDE_DIRS "@CMAKE_INSTALL_PREFIX@/@NLOPT_INSTALL_INCLUDEDIR@") set (NLOPT_LIBRARY_DIRS "@CMAKE_INSTALL_PREFIX@/@NLOPT_INSTALL_LIBDIR@") # Allows loading NLOPT settings from another project set (NLOPT_CONFIG_FILE "${CMAKE_CURRENT_LIST_FILE}") # List of compilation flags -DTOTO to export set (NLOPT_DEFINITIONS "@NLOPT_DEFINITIONS@") # Our library dependencies (contains definitions for IMPORTED targets) include ("${CMAKE_CURRENT_LIST_DIR}/NLoptLibraryDepends.cmake") # These are IMPORTED targets created by NLOPTLibraryDepends.cmake set (NLOPT_LIBRARIES "@NLOPT_LIBRARIES@") stevengj-nlopt-88c424d/cmake/NLoptConfigVersion.cmake.in000066400000000000000000000006111521061417600232530ustar00rootroot00000000000000 set (PACKAGE_VERSION "@NLOPT_VERSION_STRING@") # Check whether the requested PACKAGE_FIND_VERSION is compatible if ("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") set (PACKAGE_VERSION_COMPATIBLE FALSE) else () set (PACKAGE_VERSION_COMPATIBLE TRUE) if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set (PACKAGE_VERSION_EXACT TRUE) endif () endif () stevengj-nlopt-88c424d/cmake/generate-cpp.cmake000066400000000000000000000041001521061417600214650ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.13) # generate nlopt.hpp from nlopt-in.hpp file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp "") file (STRINGS ${API_SOURCE_DIR}/nlopt-in.hpp NLOPT_HPP_LINES) foreach (NLOPT_HPP_LINE ${NLOPT_HPP_LINES}) list(LENGTH NLOPT_HPP_LINE line_len) # handling trailing backlashes in "file (STRINGS" is a little tricky if (line_len VERSION_LESS 8) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp "${NLOPT_HPP_LINE}\n") else () set (prev_inst FALSE) foreach(NLOPT_HPP_SUBLINE ${NLOPT_HPP_LINE}) # test is we need to add the eaten semicolon if (NLOPT_HPP_SUBLINE MATCHES "\\)$" OR NLOPT_HPP_SUBLINE MATCHES "return") set (new_inst TRUE) else () set (new_inst FALSE) endif () if (NOT prev_inst) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp "${NLOPT_HPP_SUBLINE}") if (new_inst) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp ";") endif () list (FIND NLOPT_HPP_LINE "${NLOPT_HPP_SUBLINE}" index) math (EXPR index "${index} + 1") list (LENGTH NLOPT_HPP_LINE total) if (NOT index STREQUAL total) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp " \\") endif () file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp "\n") endif () set (prev_inst ${new_inst}) endforeach () endif () if (NLOPT_HPP_LINE MATCHES "GEN_ENUMS_HERE") file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp " enum algorithm {\n") file (STRINGS ${API_SOURCE_DIR}/nlopt.h NLOPT_H_LINES REGEX " NLOPT_[A-Z0-9_]+") foreach (NLOPT_H_LINE ${NLOPT_H_LINES}) string (REGEX REPLACE "NLOPT_" "" ENUM_LINE ${NLOPT_H_LINE}) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp "${ENUM_LINE}\n") if (NLOPT_H_LINE MATCHES "NLOPT_NUM_ALGORITHMS") file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp " };\n enum result {\n") elseif (NLOPT_H_LINE MATCHES "NLOPT_NUM_RESULTS") file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.hpp " };\n") endif () endforeach () endif () endforeach () stevengj-nlopt-88c424d/cmake/generate-fortran.cmake000066400000000000000000000014311521061417600223620ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.13) # generate nlopt.f from nlopt.h enums file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt.f "") file (STRINGS ${API_SOURCE_DIR}/nlopt.h NLOPT_H_LINES REGEX " NLOPT_[A-Z0-9_]+") set (i 0) foreach (NLOPT_H_LINE ${NLOPT_H_LINES}) if (NOT NLOPT_H_LINE MATCHES "NLOPT_NUM_") string (REGEX REPLACE ".*NLOPT_([A-Z0-9_]+).*" "\\1" ENUM_STRING ${NLOPT_H_LINE}) string (REGEX REPLACE ".*NLOPT_[A-Z0-9_]+ = (-?[0-9]+).*" "\\1" ENUM_VAL ${NLOPT_H_LINE}) if (ENUM_VAL MATCHES "^-?[0-9]+$") set (i ${ENUM_VAL}) endif () set (ENUM_LINE " integer NLOPT_${ENUM_STRING}\n parameter (NLOPT_${ENUM_STRING}=${i})\n") file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt.f "${ENUM_LINE}") math (EXPR i "${i} + 1") endif () endforeach () stevengj-nlopt-88c424d/cmake/toolchain-i686-w64-mingw32.cmake000066400000000000000000000021461521061417600234770ustar00rootroot00000000000000set (CMAKE_SYSTEM_NAME Windows) # specify the cross compiler set (CMAKE_C_COMPILER i686-w64-mingw32-gcc) set (CMAKE_CXX_COMPILER i686-w64-mingw32-g++) # where is the target environment set (CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) # search for programs in the build host directories set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # Make sure Qt can be detected by CMake set (QT_BINARY_DIR /usr/i686-w64-mingw32/bin /usr/bin) set (QT_INCLUDE_DIRS_NO_SYSTEM ON) # set the resource compiler (RHBZ #652435) set (CMAKE_RC_COMPILER i686-w64-mingw32-windres) set (CMAKE_MC_COMPILER i686-w64-mingw32-windmc) # override boost thread component suffix as mingw-w64-boost is compiled with threadapi=win32 set (Boost_THREADAPI win32) # These are needed for compiling lapack (RHBZ #753906) set (CMAKE_Fortran_COMPILER i686-w64-mingw32-gfortran) set (CMAKE_AR:FILEPATH i686-w64-mingw32-ar) set (CMAKE_RANLIB:FILEPATH i686-w64-mingw32-ranlib) stevengj-nlopt-88c424d/cmake/toolchain-x86_64-w64-mingw32.cmake000066400000000000000000000021701521061417600237360ustar00rootroot00000000000000set (CMAKE_SYSTEM_NAME Windows) # specify the cross compiler set (CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set (CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) # where is the target environment set (CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) # search for programs in the build host directories set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # Make sure Qt can be detected by CMake set (QT_BINARY_DIR /usr/x86_64-w64-mingw32/bin /usr/bin) set (QT_INCLUDE_DIRS_NO_SYSTEM ON) # set the resource compiler (RHBZ #652435) set (CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) set (CMAKE_MC_COMPILER x86_64-w64-mingw32-windmc) # override boost thread component suffix as mingw-w64-boost is compiled with threadapi=win32 set (Boost_THREADAPI win32) # These are needed for compiling lapack (RHBZ #753906) set (CMAKE_Fortran_COMPILER x86_64-w64-mingw32-gfortran) set (CMAKE_AR:FILEPATH x86_64-w64-mingw32-ar) set (CMAKE_RANLIB:FILEPATH x86_64-w64-mingw32-ranlib) stevengj-nlopt-88c424d/doc/000077500000000000000000000000001521061417600156035ustar00rootroot00000000000000stevengj-nlopt-88c424d/doc/README000066400000000000000000000015131521061417600164630ustar00rootroot00000000000000This is the documentation tree for NLopt. Markdown (.md) files for NLopt documentation live in $(top_src_dir)/doc/docs. To build and visualize the HTML documentation locally using the mkdocs package (useful for verifying on your local machine before committing): 1. Install the `mkdocs` package, together with the requirements in requirements.txt: % pip install mkdocs % pip install -r requirements.txt 2. Run the following command from the top-level NLopt repository tree: % mkdocs serve and then open the following URL in a browser window: http://127.0.0.1:8000/NLopt This launches a little web server on your local machine plus a filesystem hook for rebuilding the documentation tree automatically whenever any .md file is modified, so you can see what the actual HTML documentation looks like in real time as you edit the source. stevengj-nlopt-88c424d/doc/docs/000077500000000000000000000000001521061417600165335ustar00rootroot00000000000000stevengj-nlopt-88c424d/doc/docs/Citing_NLopt.md000066400000000000000000000012561521061417600214120ustar00rootroot00000000000000--- # Citing NLopt --- If you use NLopt in work that leads to a publication, we would appreciate it if you would kindly cite NLopt in your manuscript. Please cite *both* the NLopt library *and* the authors of the specific algorithm(s) that you employed in your work. Cite NLopt as something like: - Steven G. Johnson, The NLopt nonlinear-optimization package, The authors and appropriate citations for the specific optimization algorithms in NLopt are listed in the [NLopt Algorithms](NLopt_Algorithms.md) page. See also the [NLopt `CITATION.bib` file](https://github.com/stevengj/nlopt/blob/master/CITATION.bib) for citations in BibTeX format. stevengj-nlopt-88c424d/doc/docs/NLopt_Algorithms.md000066400000000000000000001407731521061417600223160ustar00rootroot00000000000000--- # NLopt Algorithms --- NLopt includes implementations of a number of different optimization algorithms. These algorithms are listed below, including links to the original source code (if any) and citations to the relevant articles in the literature (see [Citing NLopt](Citing_NLopt.md)). Even where I found available free/open-source code for the various algorithms, I modified the code at least slightly (and in some cases noted below, substantially) for inclusion into NLopt. I apologize in advance to the authors for any new bugs I may have inadvertantly introduced into their code. Nomenclature ------------ Each algorithm in NLopt is identified by a named constant, which is passed to the NLopt routines in the various languages in order to select a particular algorithm. These constants are mostly of the form `NLOPT_{G,L}{N,D}_xxxx`, where `G`/`L` denotes global/local optimization and `N`/`D` denotes derivative-free/gradient-based algorithms, respectively. For example, the `NLOPT_LN_COBYLA` constant refers to the COBYLA algorithm (described below), which is a local (`L`) derivative-free (`N`) optimization algorithm. Two exceptions are the MLSL and augmented Lagrangian algorithms, denoted by `NLOPT_G_MLSL` and `NLOPT_AUGLAG`, since whether or not they use derivatives (and whether or not they are global, in `AUGLAG`'s case) is determined by what subsidiary optimization algorithm is specified. Many of the algorithms have several variants, which are grouped together below. Comparing algorithms -------------------- For any given optimization problem, it is a good idea to compare several of the available algorithms that are applicable to that problem—in general, one often finds that the "best" algorithm strongly depends upon the problem at hand. However, comparing algorithms requires a little bit of care because the function-value/parameter tolerance tests are not all implemented in exactly the same way for different algorithms. So, for example, the same fractional 10−4 tolerance on the function value might produce a much more accurate minimum in one algorithm compared to another, and matching them might require some experimentation with the tolerances. Instead, a more fair and reliable way to compare two different algorithms is to run one until the function value is converged to some value *f*A, and then run the second algorithm with the minf_max [termination test](NLopt_Introduction.md#termination-conditions) set to minf_max=*f*A. That is, ask how long it takes for the two algorithms to reach the same function value. Better yet, run some algorithm for a really long time until the minimum *f*M is located to high precision. Then run the different algorithms you want to compare with the termination test: minf_max=*f*M+Δ*f*. That is, ask how long it takes for the different algorithms to obtain the minimum to within an absolute tolerance Δ*f*, for some Δ*f*. (This is *totally different* from using the ftol_abs termination test, because the latter uses only a crude estimate of the error in the function values, and moreover the estimate varies between algorithms.) Global optimization ------------------- All of the algorithms currently require you to specify bound constraints on all the optimization parameters. Of these algorithms, only ISRES, AGS, and ORIG_DIRECT support nonlinear inequality constraints, and only ISRES supports nonlinear equality constraints. (However, any of them can be applied to nonlinearly constrained problems by combining them with the [augmented Lagrangian method](#augmented-lagrangian-algorithm) below.) **Something you should consider** is that, after running the global optimization, it is often worthwhile to then use the global optimum as a starting point for a local optimization to "polish" the optimum to a greater accuracy. (Many of the global optimization algorithms devote more effort to searching the global parameter space than in finding the precise position of the local optimum accurately.) ### DIRECT and DIRECT-L DIRECT is the DIviding RECTangles algorithm for global optimization, described in: - D. R. Jones, C. D. Perttunen, and B. E. Stuckmann, "Lipschitzian optimization without the lipschitz constant," *J. Optimization Theory and Applications*, vol. 79, p. 157 (1993). and DIRECT-L is the "locally biased" variant proposed by: - J. M. Gablonsky and C. T. Kelley, "A locally-biased form of the DIRECT algorithm," *J. Global Optimization*, vol. 21 (1), p. 27-37 (2001). These are deterministic-search algorithms based on systematic division of the search domain into smaller and smaller hyperrectangles. The Gablonsky version makes the algorithm "more biased towards local search" so that it is more efficient for functions without too many local minima. NLopt contains several implementations of both of these algorithms. I would tend to try `NLOPT_GN_DIRECT_L` first; YMMV. First, it contains a from-scratch re-implementation of both algorithms, specified by the constants `NLOPT_GN_DIRECT` and `NLOPT_GN_DIRECT_L`, respectively. Second, there is a slightly randomized variant of DIRECT-L, specified by `NLOPT_GN_DIRECT_L_RAND`, which uses some randomization to help decide which dimension to halve next in the case of near-ties. The DIRECT and DIRECT-L algorithms start by rescaling the bound constraints to a hypercube, which gives all dimensions equal weight in the search procedure. If your dimensions do *not* have equal weight, e.g. if you have a "long and skinny" search space and your function varies at about the same speed in all directions, it may be better to use unscaled variants of these algorthms, which are specified as `NLOPT_GN_DIRECT_NOSCAL`, `NLOPT_GN_DIRECT_L_NOSCAL`, and `NLOPT_GN_DIRECT_L_RAND_NOSCAL`, respectively. However, the unscaled variations make the most sense (if any) with the original DIRECT algorithm, since the design of DIRECT-L to some extent relies on the search region being a hypercube (which causes the subdivided hyperrectangles to have only a small set of side lengths). The `NLOPT_GN_DIRECT*` algorithms supports the following internal parameter, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `magic_eps` (defaults to `0`) "Jones' epsilon parameter". Finally, NLopt also includes separate implementations based on the [original Fortran code](http://www4.ncsu.edu/~ctk/SOFTWARE/DIRECTv204.tar.gz) by Gablonsky et al. (1998-2001), which are specified as `NLOPT_GN_ORIG_DIRECT` and `NLOPT_GN_ORIG_DIRECT_L`. These implementations have a number of hard-coded limitations on things like the number of function evaluations; I removed several of these limitations, but some remain. On the other hand, there seem to be slight differences between these implementations and mine; most of the time, the performance is roughly similar, but occasionally Gablonsky's implementation will do significantly better than mine or vice versa. Most of the above algorithms only handle bound constraints, and in fact require finite bound constraints (they are not applicable to unconstrained problems). They do not handle arbitrary nonlinear constraints. However, the `ORIG` versions by Gablonsky et al. include some support for arbitrary nonlinear inequality constraints. The `NLOPT_GN_ORIG_DIRECT*` algorithms supports the following internal parameter, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `magic_eps` (defaults to `0`) "Jones' epsilon parameter". * `magic_eps_abs` (defaults to `0`) "absolute version of Jones' epsilon parameter". * `sigma_reltol` (defaults to `-1`) "relative tolerance on hypercube measure". * `fglobal_reltol` (defaults to `0`) "relative tolerance on how close we should find fglobal". ### Controlled Random Search (CRS) with local mutation My implementation of the "controlled random search" (CRS) algorithm (in particular, the CRS2 variant) with the "local mutation" modification, as defined by: - P. Kaelo and M. M. Ali, "Some variants of the controlled random search algorithm for global optimization," *J. Optim. Theory Appl.* **130** (2), 253-264 (2006). The original CRS2 algorithm was described by: - W. L. Price, "A controlled random search procedure for global optimization," in *Towards Global Optimization 2*, p. 71-84 edited by L. C. W. Dixon and G. P. Szego (North-Holland Press, Amsterdam, 1978). - W. L. Price, "Global optimization by controlled random search," *J. Optim. Theory Appl.* **40** (3), p. 333-348 (1983). The CRS algorithms are sometimes compared to genetic algorithms, in that they start with a random "population" of points, and randomly "evolve" these points by heuristic rules. In this case, the "evolution" somewhat resembles a randomized Nelder-Mead algorithm. The published results for CRS seem to be largely empirical; limited analytical results about its convergence were derived in: - Eligius M. T. Hendrix, P. M. Ortigosa, and I. García, "On success rates for controlled random search," *J. Global Optim.* **21**, p. 239-263 (2001). The initial population size for CRS defaults to 10×(*n*+1) in *n* dimensions, but this can be changed with the [nlopt_set_population](NLopt_Reference.md#stochastic-population) function; the initial population must be at least *n*+1. Only bound-constrained problems are supported by this algorithm. CRS2 with local mutation is specified in NLopt as `NLOPT_GN_CRS2_LM`. ### MLSL (Multi-Level Single-Linkage) This is my implementation of the "Multi-Level Single-Linkage" (MLSL) algorithm for global optimization by a sequence of local optimizations from random starting points, proposed by: - A. H. G. Rinnooy Kan and G. T. Timmer, "Stochastic global optimization methods," *Mathematical Programming*, vol. 39, p. 27-78 (1987). (Actually 2 papers — part I: clustering methods, p. 27, then part II: multilevel methods, p. 57.) We also include a modification of MLSL use a Sobol' [low-discrepancy sequence](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) (LDS) instead of pseudorandom numbers, which was argued to improve the convergence rate by: - Sergei Kucherenko and Yury Sytsko, "Application of deterministic low-discrepancy sequences in global optimization," *Computational Optimization and Applications*, vol. 30, p. 297-318 (2005). In either case, MLSL is a "multistart" algorithm: it works by doing a sequence of local optimizations (using some other local optimization algorithm) from random or low-discrepancy starting points. MLSL is distinguished, however by a "clustering" heuristic that helps it to avoid repeated searches of the same local optima, and has some theoretical guarantees of finding all local optima in a finite number of local minimizations. The local-search portion of MLSL can use any of the other algorithms in NLopt, and in particular can use either gradient-based (`D`) or derivative-free algorithms (`N`) The local search uses the derivative/nonderivative algorithm set by `nlopt_opt_set_local_optimizer`. LDS-based MLSL with is specified as `NLOPT_G_MLSL_LDS`, while the original non-LDS original MLSL (using pseudo-random numbers, currently via the [Mersenne twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm) is indicated by `NLOPT_G_MLSL`. In both cases, you must specify the [local optimization](NLopt_Reference.md#localsubsidiary-optimization-algorithm) algorithm (which can be gradient-based or derivative-free) via `nlopt_opt_set_local_optimizer`. **Note**: If you do not set a maximum evaluation number of maximum runtime the algorithm will run indefinitely. If you do not set a stopping tolerance for your local-optimization algorithm, MLSL defaults to ftol_rel=10−15 and xtol_rel=10−7 for the local searches. Note that it is perfectly reasonable to set a relatively large tolerance for these local searches, run MLSL, and then at the end run another local optimization with a lower tolerance, using the MLSL result as a starting point, to "polish off" the optimum to high precision. By default, each iteration of MLSL samples 4 random new trial points, but this can be changed with the [nlopt_set_population](NLopt_Reference.md#stochastic-population) function. Only bound-constrained problems are supported by this algorithm. ### StoGO This is an algorithm adapted from the code downloaded from - [StoGO global optimization library](http://www.imm.dtu.dk/projects/scicomp/GlobOpt/opt.html) by Madsen et al. StoGO is a global optimization algorithm that works by systematically dividing the search space (which must be bound-constrained) into smaller hyper-rectangles via a branch-and-bound technique, and searching them by a gradient-based local-search algorithm (a BFGS variant), optionally including some randomness (hence the "Sto", which stands for "stochastic" I believe). StoGO is written in C++, which means that it is only included when you compile the [C++ algorithms](NLopt_Installation.md) enabled, in which case (on Unix) you must link to `-lnlopt_cxx` instead of `-lnlopt`. StoGO is specified within NLopt by `NLOPT_GD_STOGO`, or `NLOPT_GD_STOGO_RAND` for the randomized variant. Some references on StoGO are: - S. Gudmundsson, "Parallel Global Optimization," M.Sc. Thesis, IMM, Technical University of Denmark, 1998. - K. Madsen, S. Zertchaninov, and A. Zilinskas, "Global Optimization using Branch-and-Bound," unpublished (1998). A preprint of this paper is included in the `stogo` subdirectory of NLopt as `paper.pdf`. - S. Zertchaninov and K. Madsen, "A C++ Programme for Global Optimization," IMM-REP-1998-04, Department of Mathematical Modelling, Technical University of Denmark, DK-2800 Lyngby, Denmark, 1998. A copy of this report is included in the `stogo` subdirectory of NLopt as `techreport.pdf`. Only bound-constrained problems are supported by this algorithm. **Note**: If you do not set a maximum evaluation number of maximum runtime the algorithm will run indefinitely. ### AGS This algorithm adapted from [this repo](https://github.com/sovrasov/glob_search_nlp_solver). AGS can handle arbitrary objectives and nonlinear inequality constraints. Also bound constraints are required for this method. To guarantee convergence, objectives and constraints should satisfy the Lipschitz condition on the specified hyperrectangle. AGS is derivative-free and employs the Hilbert curve to reduce the source problem to the univariate one. The algorithm divides the univariate space into intervals, generating new points by using posterior probabilities. On each trial AGS tries to evaluate the constraints consequently one by one. If some constraint is violated at this point, the next ones won't be evaluated. If all constraints are preserved, i.e. the trial point is feasible, AGS will evaluate the objective. Thus, some of constraints (except the first one) and objective can be partially undefined inside the search hyperrectangle. Current implementation of AGS doesn't support vector constraints. Limitations of the machine arithmetic don't allow to build a tight approximation for Hilbert when the space dimension is greater than 5, so this implementation of AGS is restricted in that sense. It supports up to 10 dimensions, but the method can stop early in case of 6 and more ones. AGS, like StoGO, is written in C++, but it requires C++11. If the library is built with [C++](NLopt_Installation.md) and compiler supports C++11, AGS will be built too. AGS is specified within NLopt by `NLOPT_GN_AGS`. Additional parameters of AGS which are not adjustable from the common NLOpt interface are declared and described in `ags.h`. Also an example of solving a constrained problem is given in the AGS source folder. References: - Yaroslav D. Sergeyev, Dmitri L. Markin: An algorithm for solving global optimization problems with nonlinear constraints, Journal of Global Optimization, 7(4), pp 407–419, 1995 - Strongin R.G., Sergeyev Ya.D., 2000. Global optimization with non-convex constraints. Sequential and parallel algorithms. Kluwer Academic Publishers, Dordrecht. - Gergel V. and Lebedev I.: Heterogeneous Parallel Computations for Solving Global Optimization Problems. Proc. Comput. Science 66, pp. 53–62 (2015) - [Implementation](https://github.com/sovrasov/multicriterial-go) of AGS for constrained multi-objective problems. **Note**: If you do not set a maximum evaluation number of maximum runtime the algorithm will run indefinitely. ### ISRES (Improved Stochastic Ranking Evolution Strategy) This is my implementation of the "Improved Stochastic Ranking Evolution Strategy" (ISRES) algorithm for nonlinearly-constrained global optimization (or at least semi-global; although it has heuristics to escape local optima, I'm not aware of a convergence proof), based on the method described in: - Thomas Philip Runarsson and Xin Yao, "[Search biases in constrained evolutionary optimization](http://www3.hi.is/~tpr/papers/RuYa05.pdf)," *IEEE Trans. on Systems, Man, and Cybernetics Part C: Applications and Reviews*, vol. 35 (no. 2), pp. 233-243 (2005). It is a refinement of an earlier method described in: - Thomas P. Runarsson and Xin Yao, "[Stochastic ranking for constrained evolutionary optimization](http://www3.hi.is/~tpr/software/sres/Tec311r.pdf)," *IEEE Trans. Evolutionary Computation*, vol. 4 (no. 3), pp. 284-294 (2000). This is an independent implementation by S. G. Johnson (2009) based on the papers above. Runarsson also has his own Matlab implemention available from his web page [here](http://www3.hi.is/~tpr). The evolution strategy is based on a combination of a mutation rule (with a log-normal step-size update and exponential smoothing) and differential variation (a Nelder–Mead-like update rule). The fitness ranking is simply via the objective function for problems without nonlinear constraints, but when nonlinear constraints are included the stochastic ranking proposed by Runarsson and Yao is employed. The population size for ISRES defaults to 20×(*n*+1) in *n* dimensions, but this can be changed with the [nlopt_set_population](NLopt_Reference.md#stochastic-population) function. This method supports arbitrary nonlinear inequality and equality constraints in addition to the bound constraints, and is specified within NLopt as `NLOPT_GN_ISRES`. ### ESCH (evolutionary algorithm) This is a modified Evolutionary Algorithm for global optimization, developed by Carlos Henrique da Silva Santos's and described in the following paper and Ph.D thesis: - C. H. da Silva Santos, M. S. Gonçalves, and H. E. Hernandez-Figueroa, "Designing Novel Photonic Devices by Bio-Inspired Computing," *IEEE Photonics Technology Letters* **22** (15), pp. 1177–1179 (2010). - C. H. da Silva Santos, "[Parallel and Bio-Inspired Computing Applied to Analyze Microwave and Photonic Metamaterial Strucutures](http://www.bibliotecadigital.unicamp.br/document/?code=000767537&opt=4&lg=en_US)," Ph.D. thesis, University of Campinas, (2010). The algorithm is adapted from ideas described in: - H.-G. Beyer and H.-P. Schwefel, "Evolution Strategies: A Comprehensive Introduction," *Journal Natural Computing*, **1** (1), pp. 3–52 (2002_. - Ingo Rechenberg, "Evolutionsstrategie – Optimierung technischer Systeme nach Prinzipien der biologischen Evolution," Ph.D. thesis (1971), Reprinted by Fromman-Holzboog (1973). The method supports bound constraints only (no nonlinear constraints), and is specified within NLopt as `NLOPT_GN_ESCH`. **Note**: If you do not set a maximum evaluation number of maximum runtime the algorithm will run indefinitely. Local derivative-free optimization ---------------------------------- Of these algorithms, only COBYLA currently supports arbitrary nonlinear inequality and equality constraints; the rest of them support bound-constrained or unconstrained problems only. (However, any of them can be applied to nonlinearly constrained problems by combining them with the [augmented Lagrangian method](#augmented-lagrangian-algorithm) below.) A unique consideration when using local derivative-free algorithms is that the optimizer must somehow decide on an initial step size. By default, NLopt chooses this initial step size heuristically, but this may not always be the best choice. If you run into trouble, you can modify the initial step size, as described in the [NLopt reference](NLopt_Reference.md#initial-step-size). ### COBYLA (Constrained Optimization BY Linear Approximations) This is a derivative of Powell's implementation of the COBYLA (Constrained Optimization BY Linear Approximations) algorithm for derivative-free optimization with nonlinear inequality and equality constraints, by M. J. D. Powell, described in: - M. J. D. Powell, "A direct search optimization method that models the objective and constraint functions by linear interpolation," in *Advances in Optimization and Numerical Analysis*, eds. S. Gomez and J.-P. Hennart (Kluwer Academic: Dordrecht, 1994), p. 51-67. and reviewed in: - M. J. D. Powell, "Direct search algorithms for optimization calculations," *Acta Numerica* **7**, 287-336 (1998). It constructs successive linear approximations of the objective function and constraints via a simplex of *n*+1 points (in *n* dimensions), and optimizes these approximations in a trust region at each step. The original code itself was written in Fortran by Powell and was converted to C in 2004 by Jean-Sebastien Roy (js@jeannot.org) for the SciPy project. The version in NLopt was based on Roy's C version, downloaded from: - NLopt's version is slightly modified in a few ways. First, we incorporated all of the NLopt termination criteria. Second, we added explicit support for bound constraints (although the original COBYLA could handle bound constraints as linear constraints, it would sometimes take a step that violated the bound constraints). Third, we allow `COBYLA` to increase the trust-region radius if the predicted improvement was approximately right and the simplex is OK, following a suggestion in the [SAS manual for PROC NLP](http://www.uc.edu/sashtml/iml/chap17/sect164.htm) that seems to improve convergence speed. Fourth, we pseudo-randomize simplex steps in COBYLA algorithm, improving robustness by avoiding accidentally taking steps that don't improve conditioning (which seems to happen sometimes with active bound constraints); the algorithm remains deterministic (a deterministic seed is used), however. Also, we support unequal initial-step sizes in the different parameters (by the simple expedient of internally rescaling the parameters proportional to the initial steps), which is important when different parameters have very different scales. (The underlying COBYLA code only supports inequality constraints. Equality constraints are automatically [transformed into pairs](NLopt_Introduction.md#equality-constraints) of inequality constraints, which in the case of this algorithm seems not to cause problems.) It is specified within NLopt as `NLOPT_LN_COBYLA`. ### BOBYQA This is an algorithm derived from the [BOBYQA subroutine](http://plato.asu.edu/ftp/other_software/bobyqa.zip) of M. J. D. Powell, converted to C and modified for the NLopt stopping criteria. BOBYQA performs derivative-free bound-constrained optimization using an iteratively constructed quadratic approximation for the objective function. See: - M. J. D. Powell, "[The BOBYQA algorithm for bound constrained optimization without derivatives](http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf)," Department of Applied Mathematics and Theoretical Physics, Cambridge England, technical report NA2009/06 (2009). (Because BOBYQA constructs a quadratic approximation of the objective, it may perform poorly for objective functions that are not twice-differentiable.) The NLopt BOBYQA interface supports unequal initial-step sizes in the different parameters (by the simple expedient of internally rescaling the parameters proportional to the initial steps), which is important when different parameters have very different scales. This algorithm, specified in NLopt as `NLOPT_LN_BOBYQA`, largely supersedes the NEWUOA algorithm below, which is an earlier version of the same idea by Powell. ### NEWUOA + bound constraints This is an algorithm derived from the NEWUOA subroutine of M. J. D. Powell, converted to C and modified for the NLopt stopping criteria. I also modified the code to include a variant, NEWUOA-bound, that permits efficient handling of bound constraints. This algorithm is largely superseded by BOBYQA (above). The original NEWUOA performs derivative-free unconstrained optimization using an iteratively constructed quadratic approximation for the objective function. See: - M. J. D. Powell, "[The NEWUOA software for unconstrained optimization without derivatives](http://www.optimization-online.org/DB_HTML/2005/01/1045.html)," *Proc. 40th Workshop on Large Scale Nonlinear Optimization* (Erice, Italy, 2004). (Because NEWUOA constructs a quadratic approximation of the objective, it may perform poorly for objective functions that are not twice-differentiable.) The original algorithm is specified in NLopt as `NLOPT_LN_NEWUOA`, and only supports unconstrained problems. For bound constraints, my variant is specified as `NLOPT_LN_NEWUOA_BOUND`. In the original NEWUOA algorithm, Powell solved the quadratic subproblems (in routines TRSAPP and BIGLAG) in a spherical trust region via a truncated conjugate-gradient algorithm. In my bound-constrained variant, we use the MMA algorithm for these subproblems to solve them with both bound constraints and a spherical trust region. In principle, we should also change the BIGDEN subroutine in a similar way (since BIGDEN also approximately solves a trust-region subproblem), but instead I just truncated its result to the bounds (which probably gives suboptimal convergence, but BIGDEN is called only very rarely in practice). Shortly after my addition of bound constraints to NEWUOA, Powell released his own version of NEWUOA modified for bound constraints as well as some numerical-stability and convergence enhancements, called BOBYQA. NLopt now incorporates BOBYQA as well, and it seems to largely supersede NEWUOA. **Note:** NEWUOA requires the dimension *n* of the parameter space to be ≥ 2, i.e. the implementation does not handle one-dimensional optimization problems. ### PRAXIS (PRincipal AXIS) "PRAXIS" gradient-free local optimization via the "principal-axis method" of Richard Brent, based on a C translation of Fortran code downloaded from [Netlib](https://en.wikipedia.org/wiki/Netlib): - The original Fortran code was written by Richard Brent and made available by the Stanford Linear Accelerator Center, dated 3/1/73. The appropriate reference seems to be: - Richard Brent, *Algorithms for Minimization without Derivatives* (Prentice-Hall, 1972). (Reprinted by Dover, 2002.) Specified in NLopt as `NLOPT_LN_PRAXIS` This algorithm was originally designed for unconstrained optimization. In NLopt, bound constraints are emulated by variable transformation unlike gradient-free algorithms that natively support them like COBYLA or BOBYQA. ### Nelder-Mead Simplex My implementation of almost the original Nelder-Mead simplex algorithm (specified in NLopt as `NLOPT_LN_NELDERMEAD`), as described in: - J. A. Nelder and R. Mead, "A simplex method for function minimization," *The Computer Journal* **7**, p. 308-313 (1965). This method is simple and has demonstrated enduring popularity, despite the later discovery that it fails to converge at all for some functions (and examples may be constructed in which it converges to point that is not a local minimum). Anecdotal evidence suggests that it often performs well even for noisy and/or discontinuous objective functions. I would tend to recommend the Subplex method (below) instead, however. The main change compared to the 1965 paper is that I implemented explicit support for bound constraints, using essentially the method proposed in: - M. J. Box, "A new method of constrained optimization and a comparison with other methods," *Computer J.* **8** (1), 42-52 (1965). and later reviewed in: - J. A. Richardson and J. L. Kuester, "The complex method for constrained optimization," *Commun. ACM* **16** (8), 487-489 (1973). Whenever a new point would lie outside the bound constraints, Box advocates moving it "just inside" the constraints by some fixed "small" distance of 10−8 or so. I couldn't see any advantage to using a fixed distance inside the constraints, especially if the optimum is on the constraint, so instead I move the point exactly onto the constraint in that case. The danger with implementing bound constraints in this way (or by Box's method) is that you may collapse the simplex into a lower-dimensional subspace. I'm not aware of a better way, however. In any case, this collapse of the simplex is somewhat ameliorated by restarting, such as when Nelder-Mead is used within the Subplex algorithm below. ### Sbplx (based on Subplex) This is my re-implementation of Tom Rowan's "Subplex" algorithm. As Rowan expressed a preference that other implementations of his algorithm use a different name, I called my implementation "Sbplx" (referred to in NLopt as `NLOPT_LN_SBPLX`). Subplex (a variant of Nelder-Mead that uses Nelder-Mead on a sequence of subspaces) is claimed to be much more efficient and robust than the original Nelder-Mead, while retaining the latter's facility with discontinuous objectives, and in my experience these claims seem to be true in many cases. (However, I'm not aware of any proof that Subplex is globally convergent, and perhaps it may fail for some objectives like Nelder-Mead; YMMV.) I used the description of Rowan's algorithm in his PhD thesis: - T. Rowan, "Functional Stability Analysis of Numerical Algorithms", Ph.D. thesis, Department of Computer Sciences, University of Texas at Austin, 1990. I would have preferred to use Rowan's original implementation, posted by him on Netlib: - Unfortunately, the legality of redistributing or modifying this code is unclear, because it lacks anything resembling a license statement. After some friendly emails with Rowan in which he promised to consider providing a clear open-source/free-software license, I lost touch with him and his old email address now seems invalid. Since the algorithm is not too complicated, however, I just rewrote it. There seem to be slight differences between the behavior of my implementation and his (probably due to different choices of initial subspace and other slight variations, where his paper was ambiguous), but the number of iterations to converge on my test problems seems to be quite close (within ±10% of the number of function evaluations for most problems). The only major difference between my implementation and Rowan's, as far as I can tell, is that I implemented explicit support for bound constraints (via the method in the Box paper as described above). This seems to be a big improvement in the case where the optimum lies against one of the constraints. Local gradient-based optimization --------------------------------- Of these algorithms, only MMA and SLSQP support arbitrary nonlinear inequality constraints, and only SLSQP supports nonlinear equality constraints; the rest support bound-constrained or unconstrained problems only. (However, any of them can be applied to nonlinearly constrained problems by combining them with the [augmented Lagrangian method](#augmented-lagrangian-algorithm) below.) ### MMA (Method of Moving Asymptotes) and CCSA My implementation of the globally-convergent method-of-moving-asymptotes (MMA) algorithm for gradient-based local optimization, including nonlinear inequality constraints (but *not* equality constraints), specified in NLopt as `NLOPT_LD_MMA`, as described in: - Krister Svanberg, "[A class of globally convergent optimization methods based on conservative convex separable approximations](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.146.5196)," *SIAM J. Optim.* **12** (2), p. 555-573 (2002). This is an improved CCSA ("conservative convex separable approximation") variant of the original MMA algorithm published by Svanberg in 1987, which has become popular for topology optimization. (*Note:* "globally convergent" does *not* mean that this algorithm converges to the global optimum; it means that it is guaranteed to converge to *some* local minimum from any feasible starting point.) At each point **x**, CCSA forms a local approximation using the gradient of *f* and the constraint functions, plus a quadratic "penalty" term to make the approximations "conservative" (upper bounds for the exact functions). The precise approximation MMA forms is difficult to describe in a few words, because it includes nonlinear terms consisting of a poles at some distance from *x* (outside of the current trust region), almost a kind of Padé approximant. The main point is that the approximation is both convex and separable, making it trivial to solve the approximate optimization by a dual method. Optimizing the approximation leads to a new candidate point **x**. The objective and constraints are evaluated at the candidate point. If the approximations were indeed conservative (upper bounds for the actual functions at the candidate point), then the process is restarted at the new **x**. Otherwise, the approximations are made more conservative (by increasing the penalty term) and re-optimized. (If you contact [Professor Svanberg](https://people.kth.se/~krille/), he has been willing in the past to graciously provide you with his original code, albeit under restrictions on commercial use or redistribution. The MMA implementation in NLopt, however, is completely independent of Svanberg's, whose code we have not examined; any bugs are my own, of course.) I also implemented another CCSA algorithm from the same paper, `NLOPT_LD_CCSAQ`: instead of constructing local MMA approximations, it constructs simple quadratic approximations (or rather, affine approximations plus a quadratic penalty term to stay conservative). It seems to have similar convergence rates to MMA for most problems, which is not surprising as they are both essentially similar. My CCSAQ implementation seems to behave better in some ways that the MMA variant, in fact, so I generally recommend trying `NLOPT_LD_CCSAQ` first rather than `NLOPT_LD_MMA`. For the quadratic variant I also implemented the possibility of [preconditioning](NLopt_Reference.md#preconditioning-with-approximate-hessians): including a user-supplied Hessian approximation in the local model. It is easy to incorporate this into the proof in Svanberg's paper, and to show that global convergence is still guaranteed as long as the user's "Hessian" is positive semidefinite, and in practice it can greatly improve convergence if the preconditioner is a good approximation for the real Hessian (at least for the eigenvectors of the largest eigenvalues). The `NLOPT_LD_MMA` and `NLOPT_LD_CCSAQ` algorithms support the following internal parameters, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `inner_maxeval`: If ≥ 0, gives maximum number of "inner" iterations of the algorithm where it tries to ensure that its approximatations are "conservative"; defaults to `0` (no limit). It can be useful to specify a finite number (e.g. `5` or `10`) for this parameter if inaccuracies in your gradient or objective function are preventing the algorithm from making progress. * `dual_algorithm` (defaults to `NLOPT_LD_MMA`), `dual_ftol_rel` (defaults to `1e-14`), `dual_ftol_abs` (defaults to `0`), `dual_xtol_rel` (defaults to `0`), `dual_xtol_abs` (defaults to `0`), `dual_maxeval` (defaults to `100000`): These specify how the algorithm internally solves the "dual" optimization problem for its approximate objective. Because this subsidiary solve requires no evaluations of the user's objective function, it is typically fast enough that we can solve it to high precision without worrying too much about the details. Howeve,r in high-dimensional problems you may notice that MMA/CCSA is taking a long time between optimization steps, in which case you may want to increase `dual_ftol_rel` or make other changes. If these parameters are not specified, NLopt takes them from the [subsidiary-optimizer algorithm](NLopt_Reference.md#localsubsidiary-optimization-algorithm) if that has been specified, and otherwise uses the defaults indicated here. * `verbosity`: If > 0, causes the algorithm to print internal status information on each iteration. * `rho_init`: if specified, should be a rough upper bound for the second derivative (the biggest eigenvalue of the Hessian of the objective or constraints); defaults to `1.0`. CCSA/MMA will adaptively adjust this as the optimization progresses, so even it if `rho_init` is completely wrong the algorithm will still converge. A `rho_init` that is too large will cause the algorithm to take overly small steps at the beginning, while a `rho_init` that is too small will cause it to take overly large steps (and have to backtrack) at the beginning. Similarly, you can also use the "initial stepsize" option ([NLopt reference](NLopt_Reference.md#initial-step-size)) to control the maximum size of the initial steps (half the diameter of the trust region). * `inner_gradients` (defaults to `1`): if `0`, the gradient is *not* computed on "inner" iterations of the CCSA algorithm. This can be useful in order to save computations on inner iterations, and also for the caller to distinguish inner and outer iterations. However, that means that your functions are called twice on outer iterations: once for the last inner iteration (without gradients), and again with the gradient; to save wasted computation, you may want to cache the last function value and not recompute it (only compute the gradient) if `x` does not change between subsequent calls. * `always_improve` (defaults to `1`): if `0`, only update the current point (whence the gradients and model) on outer iterations, as in the original Svanberg paper; if `1`, we are slightly more aggressive about updating the current point, even doing so on inner iterations if the new point is strictly better (e.g. feasible and better objective) than the previous point. ### SLSQP Specified in NLopt as `NLOPT_LD_SLSQP`, this is a sequential quadratic programming (SQP) algorithm for nonlinearly constrained gradient-based optimization (supporting both inequality and equality constraints), based on the implementation by Dieter Kraft and described in: - Dieter Kraft, "A software package for sequential quadratic programming", Technical Report DFVLR-FB 88-28, Institut für Dynamik der Flugsysteme, Oberpfaffenhofen, July 1988. - Dieter Kraft, "Algorithm 733: TOMP–Fortran modules for optimal control calculations," *ACM Transactions on Mathematical Software*, vol. 20, no. 3, pp. 262-281 (1994). (I believe that SLSQP stands for something like "Sequential Least-Squares Quadratic Programming," because the problem is treated as a sequence of constrained least-squares problems, but such a least-squares problem is equivalent to a QP.) The algorithm optimizes successive second-order (quadratic/least-squares) approximations of the objective function (via BFGS updates), with first-order (affine) approximations of the constraints. The Fortran code was obtained from the SciPy project, who are responsible for [obtaining permission](http://permalink.gmane.org/gmane.comp.python.scientific.devel/6725) to distribute it under a free-software (3-clause BSD) license. The code was modified for inclusion in NLopt by S. G. Johnson in 2010, with the following changes. The code was converted to C and manually cleaned up. It was modified to be re-entrant (preserving the reverse-communication interface but explicitly saving the state in a data structure). The reverse-communication interface was wrapped with an NLopt-style interface, with NLopt stopping conditions. The inexact line search was modified to evaluate the functions including gradients for the first step, since this removes the need to evaluate the function+gradient a second time for the same point in the common case when the inexact line search concludes after a single step; this is motivated by the fact that NLopt's interface combines the function and gradient computations. Since roundoff errors sometimes pushed SLSQP's parameters slightly outside the bound constraints (not allowed by NLopt), we added checks to force the parameters within the bounds. We fixed [a bug](http://projects.scipy.org/scipy/ticket/1231) in the LSEI subroutine (use of uninitialized variables) for the case where the number of equality constraints equals the dimension of the problem. The LSQ subroutine was modified to handle infinite lower/upper bounds (in which case those constraints are omitted). **Note:** Because the SLSQP code uses dense-matrix methods (ordinary BFGS, not low-storage BFGS), it requires *O*(*n*2) storage and *O*(*n*3) time in *n* dimensions, which makes it less practical for optimizing more than a few thousand parameters. ### Low-storage BFGS This algorithm in NLopt (specified by NLOPT_LD_LBFGS), is based on a Fortran implementation of the low-storage BFGS algorithm written by Prof. Ladislav Luksan, and graciously posted online under the GNU LGPL at: - The original L-BFGS algorithm, based on variable-metric updates via Strang recurrences, was described by the papers: - J. Nocedal, "Updating quasi-Newton matrices with limited storage," *Math. Comput.* **35**, 773-782 (1980). - D. C. Liu and J. Nocedal, "On the limited memory BFGS method for large scale optimization," ''Math. Programming' **45**, p. 503-528 (1989). I converted Prof. Luksan's code to C with the help of [f2c](https://en.wikipedia.org/wiki/f2c), and made a few minor modifications (mainly to include the NLopt termination criteria). One of the parameters of this algorithm is the number *M* of gradients to "remember" from previous optimization steps: increasing *M* increases the memory requirements but may speed convergence. NLopt sets *M* to a heuristic value by default, but this can be [changed by the set_vector_storage function](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms). The `NLOPT_LD_LBFGS` algorithm supports the following internal parameter, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `tolg` (defaults to `1e-8`) "gradient tolerance": the algorithm will stop successfully if either the *maximum absolute value of the negative lagrange multiplier* or the *norm of the transformed gradient* falls below *tolg*. ### Preconditioned truncated Newton This algorithm in NLopt, is based on a Fortran implementation of a preconditioned inexact truncated Newton algorithm written by Prof. Ladislav Luksan, and graciously posted online under the GNU LGPL at: - NLopt includes several variations of this algorithm by Prof. Luksan. First, a variant preconditioned by the low-storage BFGS algorithm with steepest-descent restarting, specified as `NLOPT_LD_TNEWTON_PRECOND_RESTART`. Second, simplified versions `NLOPT_LD_TNEWTON_PRECOND` (same without restarting), `NLOPT_LD_TNEWTON_RESTART` (same without preconditioning), and `NLOPT_LD_TNEWTON` (same without restarting or preconditioning). The algorithms are based on the ones described by: - R. S. Dembo and T. Steihaug, "Truncated Newton algorithms for large-scale optimization," *Math. Programming* **26**, p. 190-212 (1983) . I converted Prof. Luksan's code to C with the help of [f2c](https://en.wikipedia.org/wiki/f2c), and made a few minor modifications (mainly to include the NLopt termination criteria). One of the parameters of this algorithm is the number *M* of gradients to "remember" from previous optimization steps: increasing *M* increases the memory requirements but may speed convergence. NLopt sets *M* to a heuristic value by default, but this can be [changed by the set_vector_storage function](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms). All the `NLOPT_LD_TNEWTON` algorithms support the following internal parameter, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `tolg` (defaults to `1e-8`) "gradient tolerance": the algorithm will stop successfully if either the *maximum absolute value of the negative lagrange multiplier* or the *norm of the transformed gradient* falls below *tolg*. ### Shifted limited-memory variable-metric This algorithm in NLopt, is based on a Fortran implementation of a shifted limited-memory variable-metric algorithm by Prof. Ladislav Luksan, and graciously posted online under the GNU LGPL at: - There are two variations of this algorithm: `NLOPT_LD_VAR2`, using a rank-2 method, and `NLOPT_LD_VAR1`, using a rank-1 method. The algorithms are based on the ones described by: - J. Vlcek and L. Luksan, "Shifted limited-memory variable metric methods for large-scale unconstrained minimization," *J. Computational Appl. Math.* **186**, p. 365-390 (2006). I converted Prof. Luksan's code to C with the help of [f2c](https://en.wikipedia.org/wiki/f2c), and made a few minor modifications (mainly to include the NLopt termination criteria). One of the parameters of this algorithm is the number *M* of gradients to "remember" from previous optimization steps: increasing *M* increases the memory requirements but may speed convergence. NLopt sets *M* to a heuristic value by default, but this can be [changed by the set_vector_storage function](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms). The `NLOPT_LD_VAR1` and `NLOPT_LD_VAR2` algorithms support the following internal parameter, which can be specified using the [`nlopt_set_param` API](NLopt_Reference.md#algorithm-specific-parameters): * `tolg` (defaults to `1e-8`) "gradient tolerance": the algorithm will stop successfully if either the *maximum absolute value of the negative lagrange multiplier* or the *norm of the transformed gradient* falls below *tolg*. Augmented Lagrangian algorithm ------------------------------ There is one algorithm in NLopt that fits into all of the above categories, depending on what subsidiary optimization algorithm is specified, and that is the augmented Lagrangian method described in: - Andrew R. Conn, Nicholas I. M. Gould, and Philippe L. Toint, "A globally convergent augmented Lagrangian algorithm for optimization with general constraints and simple bounds," *SIAM J. Numer. Anal.* vol. 28, no. 2, p. 545-572 (1991). - E. G. Birgin and J. M. Martínez, "[Improving ultimate convergence of an augmented Lagrangian method](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.6121)," *Optimization Methods and Software* vol. 23, no. 2, p. 177-195 (2008). This method combines the objective function and the nonlinear inequality/equality constraints (if any) in to a single function: essentially, the objective plus a "penalty" for any violated constraints. This modified objective function is then passed to *another* optimization algorithm with *no* nonlinear constraints. If the constraints are violated by the solution of this sub-problem, then the size of the penalties is increased and the process is repeated; eventually, the process must converge to the desired solution (if it exists). The subsidiary optimization algorithm is specified by the `nlopt_set_local_optimizer` function, described in the [NLopt Reference](NLopt_Reference.md#localsubsidiary-optimization-algorithm). (Don't forget to set a stopping tolerance for this subsidiary optimizer!) Since all of the actual optimization is performed in this subsidiary optimizer, the subsidiary algorithm that you specify determines whether the optimization is gradient-based or derivative-free. In fact, you can even specify a global optimization algorithm for the subsidiary optimizer, in order to perform global nonlinearly constrained optimization (although specifying a good stopping criterion for this subsidiary global optimizer is tricky). The augmented Lagrangian method is specified in NLopt as `NLOPT_AUGLAG`. We also provide a variant, `NLOPT_AUGLAG_EQ`, that only uses penalty functions for equality constraints, while inequality constraints are passed through to the subsidiary algorithm to be handled directly; in this case, the subsidiary algorithm must handle inequality constraints (e.g. MMA or COBYLA). While NLopt uses an independent re-implementation of the Birgin and Martínez algorithm, those authors provide their own free-software implementation of the method as part of the [TANGO](http://www.ime.usp.br/~egbirgin/tango/) project, and implementations can also be found in [semi-free](http://www.gnu.org/philosophy/categories.html#semi-freeSoftware) packages like [LANCELOT](http://www.numerical.rl.ac.uk/lancelot/blurb.html). stevengj-nlopt-88c424d/doc/docs/NLopt_C-plus-plus_Reference.md000066400000000000000000000514321521061417600243000ustar00rootroot00000000000000--- # NLopt C-plus-plus Reference --- NLopt is written in C and the C NLopt programming interface (API), as described in the [NLopt Reference](NLopt_Reference.md), is directly callable from C++. However, we also provide a C++ header file, nlopt.hpp, that wraps a more natural C++ interface around the NLopt API, which may be more convenient for C++ programmers. (This C++ API is also the basis for the NLopt wrappers in some other languages, such as [Python](NLopt_Python_Reference.md).) The main distinctions of the C++ API are: - Use of the `nlopt::` namespace. - Use of a bona-fide C++ `nlopt::opt` class, instead of `nlopt_opt`, with constructors, destructors, etcetera. - Use of `std::vector` instead of array arguments. - Use of exceptions instead of returning error codes, and exception-safety in the objective/constraint functions. - Overloading and related C++ features to simplify some parts of the API. The main purpose of this section is to document the syntax and unique features of the C++ API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). Compiling and linking your program to NLopt ------------------------------------------- An NLopt program in C++ should include the NLopt C++ header file: `#include ` On Unix, you would normally link your program exactly as for the C API, with a command something like: *`compiler`*` `*`...source/object` `files...`*` -lnlopt -lm -o myprogram` where *compiler* is `g++` or whatever is appropriate for your machine/system. The `nlopt::opt` object ----------------------- The NLopt API revolves around an object of type `nlopt::opt`. Via methods of this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally calls the `nlopt::opt::optimize` method in order to perform the optimization. The object should normally be created via the constructor: ``` nlopt::opt(nlopt::algorithm, unsigned n); ``` given an `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). Whereas the C algorithms are specified by `nlopt_algorithm` constants of the form `NLOPT_MMA`, `NLOPT_COBYLA`, etcetera, the C++ `nlopt::algorithm` values are of the form `nlopt::MMA`, `nlopt::COBYLA`, etcetera (with the `NLOPT_` prefix replaced by the `nlopt::` namespace). There are also a copy constructor `nlopt::opt(nlopt::opt` `const&)` and an assignment `operator=(nlopt::opt` `const&)`, both of which make a copy of a given object (equivalent to `nlopt_copy` in the C API). If there is an error in the constructor (or copy constructor, or assignment), a `std::bad_alloc` exception is thrown. There is, of course, a `~nlopt::opt()` destructor, so the object will be automatically deallocated once it goes out of scope. The algorithm and dimension parameters of the object are immutable (cannot be changed without constructing a new object), but you can query them for a given object by the methods: ``` nlopt::algorithm nlopt::opt::get_algorithm() const; unsigned nlopt::opt::get_dimension() const; ``` You can get a (0-terminated) C-style string description of the algorithm via: ``` const char *nlopt::opt::get_algorithm_name() const; ``` (These accessor methods, along with the other methods below, will throw an exception if you use them on an object initialized with the default no-argument constructor, i.e. if you didn't specify an algorithm or dimensionality yet.) Objective function ------------------ The objective function is specified by calling one of the methods: ``` void nlopt::opt::set_min_objective(nlopt::vfunc f, void* f_data); void nlopt::opt::set_max_objective(nlopt::vfunc f, void* f_data); ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. The function `f` should be of the form: ```  double f(const std::vector`` &x, std::vector`` &grad, void* f_data); ``` The return value should be the value of the function at the point `x`, where `x` is a vector of length `n` of the optimization parameters (the same as the dimension passed to the constructor). In addition, if the argument `grad` is not empty, i.e. `!grad.empty()` or equivalently `grad.size()>0`, then `grad` is a vector of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad[i]` should upon return contain the partial derivative $\partial f / \partial x_i$, for $0 \leq i < n$, if `grad` is non-empty. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be empty and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be empty for some calls.) The `f_data` argument is the same as the one passed to `nlopt_set_min_objective` or `nlopt_set_max_objective`, and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from `void*` by a typecast.) You can just pass `NULL` for `f_data` if you don't want to pass any additional information. Note that the `nlopt::opt` object does *not* make a copy of whatever is pointed to by your `f_data` pointer; you must not deallocate its contents until *after* you are done calling `nlopt::opt::optimize`. (There is a low-level way to make the nlopt::opt object "take ownership" of the f_data pointer, which is mainly used for wrapping other languages.) Technically, in order to use `std::vector` arguments for your objective function, wrapping the C API which only uses `double*`, NLopt has to make a copy of the C `double*` array to convert it to `std::vector`. This incurs a slight memory and time overhead, which is likely to be negligible in most applications, but can be avoided by instead passing a C-style objective function: ``` void nlopt::opt::set_min_objective(nlopt::func f, void* f_data); void nlopt::opt::set_max_objective(nlopt::func f, void* f_data); ``` where `f` is of the same form as the [C objective function](NLopt_Reference.md#objective-function). Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by calling the methods: ``` void nlopt::opt::set_lower_bounds(const std::vector`` &lb); void nlopt::opt::set_upper_bounds(const std::vector`` &ub); ``` where `lb` and `ub` are vectors of length *n* (the same as the dimension passed to the `nlopt::opt` constructor). For convenience, these are overloaded with functions that take a single number as arguments, in order to set the lower/upper bounds for all optimization parameters to a single constant: ``` void nlopt::opt::set_lower_bounds(double lb); void nlopt::opt::set_upper_bounds(double ub); ``` To retrieve the values of the lower/upper bounds, you can call one of: ``` void nlopt::opt::get_lower_bounds(std::vector`` &lb); void nlopt::opt::get_upper_bounds(std::vector`` &ub); std::vector`` nlopt::opt::get_lower_bounds(); std::vector`` nlopt::opt::get_upper_bounds(); ``` where the first two functions set their arguments (which must be vectors of length `n`) to copies of the bounds, and the second two functions return copies of the bounds as new vectors. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by the methods: ``` void nlopt::opt::add_inequality_constraint(nlopt::vfunc fc, void *fc_data, double tol=0); void nlopt::opt::add_equality_constraint(nlopt::vfunc h, void *h_data, double tol=0); ``` where the arguments `fc` and `h` have the same form as the objective function above. Just as for the objective function, these constraint functions can either take `std::vector` arguments or can take double\* arguments exactly as in the C API. To remove all of the inequality and/or equality constraints from a given problem, you can call the following methods: ``` void nlopt::opt::remove_inequality_constraints(); void nlopt::opt::remove_equality_constraints(); ``` ### Vector-valued constraints Just as for [nonlinear constraints in C](NLopt_Reference.md#vector-valued-constraints), you can specify nonlinear inequality and equality constraints by the methods: ``` void nlopt::opt::add_inequality_mconstraint(nlopt::mfunc c, void *c_data, const vector`` &tol); void nlopt::opt::add_equality_mconstraint(nlopt::mfunc c, void *c_data, const vector`` &tol); ``` Here, `tol` is a vector of the tolerances in each constraint dimension; the dimensionality *m* of the constraint is determined by `tol.size()`. The constraint function `c` is of the same form as in C. (You can add multiple vector-valued constraints and/or scalar constraints in the same problem.) Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) For each stopping criteria, there are (at least) two method: a `set` method to specify the stopping criterion, and a `get` method to retrieve the current value for that criterion. The meanings of each criterion are exactly the same as in the C API. ``` void nlopt::opt::set_stopval(double stopval); double nlopt::opt::get_stopval() const; ``` Stop when an objective value of at least stopval is found. ``` void nlopt::opt::set_ftol_rel(double tol); double nlopt::opt::get_ftol_rel() const; ``` Set relative tolerance on function value. ``` void nlopt::opt::set_ftol_abs(double tol); double nlopt::opt::get_ftol_abs() const; ``` Set absolute tolerance on function value. ``` void nlopt::opt::set_xtol_rel(double tol); double nlopt::opt::get_xtol_rel() const; ``` Set relative tolerance on optimization parameters. ``` void nlopt::opt::set_x_weights(const std::vector`` &w); void nlopt::opt::set_x_weights(double w); void nlopt::opt::get_x_weights(std::vector`` &w) const; std::vector`` nlopt::opt::get_x_weights() const; ``` Set/get the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above. ``` void nlopt::opt::set_xtol_abs(const std::vector`` &tol); void nlopt::opt::set_xtol_abs(double tol); void nlopt::opt::get_xtol_abs(std::vector`` &tol) const; std::vector`` nlopt::opt::get_xtol_abs() const; ``` Set absolute tolerances on optimization parameters. The `tol` vector must be of length `n` (the dimension specified in the `nlopt::opt` constructor). The second `set_xtol_abs` variant sets all `n` tolerances to the same value `tol`. The first `get_xtol_abs` variant modifies its argument to a copy of the current tolerances, whereas the second variant returns a copy. ``` void nlopt::opt::set_maxeval(int maxeval); int nlopt::opt::get_maxeval() const; ``` Stop when the number of function evaluations exceeds `maxeval`. ``` void nlopt::opt::set_maxtime(double maxtime); double nlopt::opt::get_maxtime() const; ``` Stop when the optimization time (in seconds) exceeds `maxtime`. ``` int nlopt::opt::get_numevals() const; ``` Request the number of evaluations. ### Forced termination In certain cases, the caller may wish to *force* the optimization to halt, for some reason unknown to NLopt. For example, if the user presses Ctrl-C, or there is an error of some sort in the objective function. You can do this by throwing *any* exception inside your objective/constraint functions: the exception will be caught, the optimization will be halted gracefully, and another exception (possibly not the same one) will be rethrown. See [Exceptions](#exceptions), below. The C++ equivalent of `nlopt_forced_stop` from the [C API](NLopt_Reference.md#forced-termination) is to throw an `nlopt::forced_stop` exception. Algorithm-specific parameters ----------------------------- Certain NLopt optimization algorithms allow you to specify additional parameters by calling ``` void nlopt::opt::set_param(const char *name, double val); bool nlopt::opt::has_param(const char *name); double nlopt::opt::get_param(const char *name, double defaultval); unsigned nlopt::opt::num_params(); const char *nlopt::opt::nth_param(unsigned n); ``` where the string `name` is the name of an algorithm-specific parameter and `val` is the value you are setting the parameter to. These functions are equivalent to the [C API](NLopt_Reference.md#algorithm-specific-parameters) functions of the corresponding names. Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ``` nlopt::result nlopt::opt::optimize(std::vector`` &x, double &opt_f); ``` On input, `x` is a vector of length `n` (the dimension of the problem from the `nlopt::opt` constructor) giving an initial guess for the optimization parameters. On successful return, `x` contains the optimized values of the optimization parameters, and `opt_f` contains the corresponding value of the objective function. The return value (see below) is positive on success, indicating the reason for termination. On failure (negative return codes), by default, it throws an exception (see [Exceptions](#exceptions), below). You can also call the following methods to retrieve the `opt_f` value from the last `optimize` call, and the return value (including negative/failure return values) from the last `optimize` call: ``` double nlopt::opt::last_optimum_value() const; nlopt::result nlopt::opt::last_optimize_result() const; ``` ### Return values The possible return values are the same as the [return values in the C API](NLopt_Reference.md#return-values), except that the `NLOPT_` prefix is replaced with the `nlopt::` namespace. That is, `NLOPT_SUCCESS` becomes `nlopt::SUCCESS`, etcetera. Exceptions ---------- If exceptions are enabled (the default), the [Error codes (negative return values)](NLopt_Reference.md#error-codes-negative-return-values) in the C API are replaced in the C++ API by thrown exceptions. The following exceptions are thrown by the various routines: ``` std::runtime_error ``` Generic failure, equivalent to `NLOPT_FAILURE`. ``` std::invalid_argument ``` Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera), equivalent to `NLOPT_INVALID_ARGS`. ``` std::bad_alloc ``` Ran out of memory (a memory allocation failed), equivalent to `NLOPT_OUT_OF_MEMORY`. `nlopt::roundoff_limited` (subclass of `std::runtime_error`) Halted because roundoff errors limited progress, equivalent to `NLOPT_ROUNDOFF_LIMITED`. `nlopt::forced_stop` (subclass of `std::runtime_error`) Halted because of a [forced termination](#forced-termination): the user called `nlopt::opt::force_stop()` from the user’s objective function or threw an `nlopt::forced_stop` exception. Equivalent to `NLOPT_FORCED_STOP`. Whether this behavior is enabled or whether `nlopt::opt::optimize` just returns the error code as is is controlled by the `enable_exceptions` flag in `nlopt::opt`, which can be set and retrieved with the methods below. ``` void nlopt::opt::set_exceptions_enabled(bool enable); bool nlopt::opt::get_exceptions_enabled() const; ``` The default is `true`, i.e., to throw an exception. When setting `set_exceptions_enabled(false)`, it is the caller's responsibility to *manually* check the return code, as in C (or, equivalently, the `last_optimize_result`). This is especially useful in the bindings for other programming languages (e.g., Python), where `nlopt::opt::optimize` is modified to return the best point as a return value instead of overwriting the start point, and hence, if an exception is thrown, the best point can no longer be retrieved. But it can also be useful for pure C++ code. If your objective/constraint functions throw *any* exception during the execution of `nlopt::opt::optimize`, it will be caught by NLopt and the optimization will be halted gracefully, and, if exceptions are enabled, `nlopt::opt::optimize` will re-throw an exception. However, the exception that is re-thrown by `nlopt::opt::optimize` will be one of the five exceptions above; if the exception thrown by your code was not one of these five, it will be converted to a generic `std::runtime_error` exception. (The reason for this is that C++ has no clean way to save an arbitrary exception and rethrow it later, outside the original `catch` statement.) Therefore, if you want to do something special in response to a particular exception that is not one of these five, you should catch it yourself in your function, handle it however you want, and re-throw if desired. If exceptions are disabled, `nlopt::opt::optimize` will return `NLOPT_FORCED_STOP` instead of rethrowing a C++ exception, though bindings for languages such as Python may rethrow, e.g., Python exceptions. Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ``` void nlopt::opt::set_local_optimizer(const nlopt::opt &local_opt); ``` Here, `local_opt` is another `nlopt::opt` object whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `local_opt` are ignored.) The dimension `n` of `local_opt` must match that of `opt`. This function makes a copy of the `local_opt` object, so you can freely destroy your original `local_opt` afterwards. Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. The C++ equivalents of the C functions are the following methods: ``` void nlopt::opt::set_initial_step(const std::vector &dx); void nlopt::opt::set_initial_step(double dx); void nlopt::opt::get_initial_step(const std::vector &x, std::vector &dx) const; ``` Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by the methods: ``` void nlopt::opt::set_population(unsigned pop); unsigned nlopt::opt::get_population() const; ``` (A `pop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ``` void nlopt::srand(unsigned long seed); ``` To reset the seed based on the system time, you can call: ``` void nlopt::srand_time(); ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `nlopt::srand` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can get and set the [number *M* of stored vectors](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms) for limited-memory quasi-Newton algorithms, via the methods: ``` void nlopt::opt::set_vector_storage(unsigned M); unsigned nlopt::opt::get_vector_storage() const; ``` (The default is *M*=0, in which case NLopt uses a heuristic nonzero value.) Version number -------------- To determine the version number of NLopt at runtime, you can call: ``` void nlopt::version(int &major, int &minor, int &bugfix); ``` For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. You can also retrieve these three values individually by calling: ``` int nlopt::version_major(); int nlopt::version_minor(); int nlopt::version_bugfix(); ``` stevengj-nlopt-88c424d/doc/docs/NLopt_Deprecated_API_Reference.md000066400000000000000000001006541521061417600247060ustar00rootroot00000000000000--- # NLopt Deprecated API Reference --- NLopt is a library, not a stand-alone program—it is designed to be called from your own program in C, C++, Fortran, Matlab, GNU Octave, or other languages. This reference section describes the original programming interface (API) of NLopt, used in versions of NLopt prior to 2.0. This interface is still supported in NLopt 2.0 (and will continue to be supported indefinitely if possible), for backwards compatibility, but is now deprecated in favor of the new object-style API in the [NLopt Reference](NLopt_Reference.md). The reason why this API is deprecated is that it is not easily extensible. A single optimization function was appropriate when NLopt started out as a library just handling bound constraints, but as more and more optimization parameters were added it became difficult to do this in a backwards-compatible way. (Also, functions with dozens of parameters at some point become unreadable.) Other sources of information include the Unix [man pages](https://en.wikipedia.org/wiki/Manual_page_(Unix)) for the functions. On Unix, you can run e.g. `man` `nlopt_minimize` for documentation of the `nlopt_minimize` function. In Matlab and GNU Octave, the corresponding command is to type `help` `nlopt_minimize`. Linking your program to NLopt ----------------------------- For programs in compiled languages like C or Fortran, when you compile your program you will have to link it to the NLopt library. This is *in addition* to including the header file (`#include ` in C/C++). On Unix, you would normally link with a command something like: *`compiler`*` `*`...source/object` `files...`*` -lnlopt -lm -o myprogram` where *compiler* is `cc`, `f77`, `g++`, or whatever is appropriate for your machine/language. *Note:* the `-lnlopt` `-lm` options, which link to the NLopt library (and the math library, which it requires), must come *after* your source/object files. In general, the rule is that if *A* depends upon *B*, then *A* must come before *B* in the link command. *Note:* the above example assumes that you have installed the NLopt library in a place where the compiler knows to find it (e.g. in a standard directory like `/usr/lib` or `/usr/local/lib`). If you installed somewhere else (e.g. in your home directory if you are not a system administrator), then you will need to use a `-L` flag to tell the compiler where to find the library. See [the installation manual](NLopt_Installation.md#changing-the-installation-directory). C/C++ programming interface --------------------------- To use NLopt from C or C++, you should first include the NLopt header file: `#include ` Then, you should write functions to express your objective and constraints. Finally, you should call the function `nlopt_minimize_constrained` (for nonlinearly constrained optimization) or `nlopt_minimize` (for unconstrained or box-constrained optimization) to perform the optimization. There are also a couple of other utility routines described below. ### `nlopt_minimize_constrained` ``` nlopt_result nlopt_minimize_constrained(nlopt_algorithm algorithm,                                         int n,                                         nlopt_func f, void* f_data,                                         int m,                                         nlopt_func fc, void* fc_data, ptrdiff_t fc_datum_size,                                         const double* lb, const double* ub,                                         double* x,                                         double* minf,                                         double minf_max,                                         double ftol_rel, double ftol_abs,                                         double xtol_rel, const double* xtol_abs,                                         int maxeval, double maxtime); ``` This function attempts to minimize a nonlinear function `f` of `n` optimization parameters, subject to `m` nonlinear constraints described by the function `fc`, using the specified algorithm. The minimum function value found is returned in `minf`, with the corresponding optimization parameter values returned in the array `x` of length `n`. The input values in `x` should be a starting guess for the minimum. The inputs `lb` and `ub` are arrays of length `n` containing lower and upper bounds, respectively, on the design variables `x`. The other parameters specify termination criteria (tolerances, the maximum number of function evaluations, etcetera) and other information described in more detail below. The return value is an integer code indicating success (positive) or failure (negative), as described below. #### Parameters The parameters specifying the optimization problem are: - `algorithm` — which optimization algorithm to use; its values are one of a set of predefined constants like`NLOPT_LD_MMA`, `NLOPT_GN_DIRECT`, etcetera, as described on the [NLopt Algorithms](NLopt_Algorithms.md) page. - `n` — the dimension *n* ≥ 0 of the optimization problem, the number of optimization parameters. - `f` — the objective function (see below) - `f_data` — a pointer to any data you want to pass to the objective function (see below) - `m` — the number of nonlinear inequality constraints (zero for no such constraints). - `fc` — the nonlinear inequality constraint function (see below). Ignored if `m` = 0. - `fc_data`, `fc_datum_size` — `fc_data` is a pointer to an array of data to pass to the constraint function `fc`. The array should of length `m`, and each element of the array should have size `fc_datum_size` bytes. (See below for more information on constraint functions.) Ignored if `m` = 0. - `lb` — pointer to an array of length `n` of lower bounds on each optimization variable. That is, the optimization variables are constrained to have `x[i]` ≥ `lb[i]`. If you don't want a particular variable to be bounded below, just set the corresponding `lb[i]` to be `-HUGE_VAL`. (`HUGE_VAL` is a standard C constant, usually giving +∞.) - `ub` — pointer to an array of length `n` of upper bounds on each optimization variable. That is, the optimization variables are constrained to have `x[i]` ≤ `ub[i]`. If you don't want a particular variable to be bounded above, just set the corresponding `ub[i]` to be `+HUGE_VAL`. Starting guess and returned optimum: - `x` — an array of length `n` of the optimization parameters `x[0]`, ..., `x[n-1]`. On input, a starting guess for the optimum parameters; on output, the best found values of the parameters. (For a *local* optimization routine, the starting guess `x` determines which local optimum is found.) The starting guess is required to satisfy the bound constraints `lb` and `ub`; it need not satisfy the nonlinear inequality constraints `fc` (although it might be more efficient if you have a feasible starting guess.) - `minf` — on output, the minimum value of the objective function that was found (corresponding to the output value of the parameters `x`). The remaining parameters specify the termination conditions. Please read the [introduction to the termination conditions](NLopt_Introduction.md#termination-conditions) for a general overview of these criteria. (In particular, note that you do *not* need to use *all* of these conditions; typically, you will use only one or two, and set the remainder to innocuous values.) - `minf_max` — stop if the objective function value drops below `minf_max`. (Set to `-HUGE_VAL` to ignore.) - `ftol_rel`, `ftol_abs` — relative and absolute tolerances in the objective function value. (Set to zero to ignore.) - `xtol_rel`, `xtol_abs` — relative and absolute tolerances in the optimization parameter values. `xtol_abs` should either be `NULL`, in which case it is ignored (equivalent to zero tolerance), or otherwise it should point to an array of length `n` containing absolute tolerances in each parameter `x[i]`. Set any tolerance to zero for it to be ignored. - `maxeval` — stop if the objective function is evaluated at least `maxeval` times. Set to zero to ignore. - `maxtime` — stop if the elapsed wall-clock time, in seconds, exceeds `maxtime`. Set to zero to ignore. #### Return value The value returned is one of the following enumerated constants. Successful termination (positive return values): - `NLOPT_SUCCESS` (= +1) — Generic success return value. - `NLOPT_MINF_MAX_REACHED` (= +2) — Optimization stopped because `minf_max` (above) was reached. - `NLOPT_FTOL_REACHED` (= +3) — Optimization stopped because `ftol_rel` or `ftol_abs` (above) was reached. - `NLOPT_XTOL_REACHED` (= +4) — Optimization stopped because `xtol_rel` or `xtol_abs` (above) was reached. - `NLOPT_MAXEVAL_REACHED` (= +5) — Optimization stopped because `maxeval` (above) was reached. - `NLOPT_MAXTIME_REACHED` (= +6) — Optimization stopped because `maxtime` (above) was reached. Error codes (negative return values): - `NLOPT_FAILURE` (= −1) — Generic failure code. - `NLOPT_INVALID_ARGS` (= −2) — Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera). - `NLOPT_OUT_OF_MEMORY` (= −3) — Ran out of memory. - `NLOPT_ROUNDOFF_LIMITED` (= −4) — Roundoff errors led to a breakdown of the optimization algorithm. In this case, the returned minimum may still be useful. (e.g. this error occurs in NEWUOA if one tries to achieve a tolerance too close to machine precision.) ### `nlopt_minimize` ``` nlopt_result nlopt_minimize(nlopt_algorithm algorithm,                             int n,                             nlopt_func f, void* f_data,                             const double* lb, const double* ub,                             double* x,                             double* minf,                             double minf_max,                             double ftol_rel, double ftol_abs,                             double xtol_rel, const double* xtol_abs,                             int maxeval, double maxtime); ``` This function is exactly equivalent to calling `nlopt_minimize_constrained` with `m` = 0. That is, this is minimization with no nonlinear inequality constraints (although there may still be bound constraints `lb` and `ub`). ### Objective function You should define your objective function (the function you want to minimize) as a function of the following form: ``` double f(int n, const double *x, double *grad, void *f_data) {     .... } ``` The return value should be the value of the function at the point **x**, where `x` points to an array of length `n` containing the optimization parameters. (That is, the optimization parameters are `x[0]`, `x[1]`, ..., `x[n-1]`.) The dimension `n` is the same as the one passed to `nlopt_minimize` or `nlopt_minimize_constrained`. In addition, if the argument `grad` is not `NULL`, then `grad` points to an array of length `n` that should (upon return) be set to the gradient of your function *f* with respect to the design variables *x*. That is, `grad[i]` should upon return contain the partial derivative ∂`f`/∂`x[i]`, for `i`=0,...,`n-1`. Not all of the [optimization algorithms](NLopt_Algorithms.md) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be `NULL` and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be `NULL` for some calls.) The `f_data` argument is the same as the one passed to `nlopt_minimize` or `nlopt_minimize_constrained`, and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from `void*` by a typecast.) ### Nonlinear constraints The `nlopt_minimize_constrained` function allows you to specify `m` nonlinear constraints via the function `fc`, where `m` is any nonnegative integer. However, nonzero `m` is currently only supported by the `NLOPT_LD_MMA` and `NLOPT_LN_COBYLA` [algorithms](NLopt_Algorithms.md). In particular, the nonlinear constraints are of the form *fc*(*x*) ≤ 0, where the function fc is of the same form as the objective function described above: ``` double fc(int n, const double* x, double* grad, void* fc_datum); ``` The return value should be the value of the constraint function at the point `x` (an array of length `n`), where the dimension `n` is identical to the one passed to `nlopt_minimize_constrained`. As for the objective function, if the argument `grad` is not `NULL`, then `grad` points to an array of length `n` which should (upon return) be set to the gradient of the constraint function with respect to **x**. (For any algorithm listed as "derivative-free", the `grad` argument will always be `NULL` and need never be computed.) The `fc_datum` argument is based on the `fc_data` argument passed to `nlopt_minimize_constrained`, and may be used to pass any additional data through to the function, and is used to distinguish between different constraints. In particular, the constraint function `fc` will be called (at most) `m` times for each `x`, and the *i*-th constraint (0 ≤ *i* < *m*) will be passed an `fc_datum` argument equal to `fc_data` offset by *i*â‹…`fc_datum_size`. For example, suppose that you have a data structure of type `foo` that describes the data needed by each constraint, and you store the information for the constraints in an array `foo` `data[m]`. In this case, you would pass `data` as the `fc_data` parameter to `nlopt_minimize_constrained`, and `sizeof(foo)` as the `fc_datum_size` parameter. Then, your `fc` function would be called `m` times for each point, and be passed `&data[0]` through `&data[m-1]` in sequence. ### Mixed global/local search algorithm Some of the [global optimization algorithms](NLopt_Algorithms.md#global-optimization) (currently, only MLSL) combine some global search scheme with a separate local optimization algorithm for local searches. For example, MLSL performs a sequence of local searches from semi-random starting points. Using the following functions, you can control *which* local search algorithm is used for MLSL (and any similar algorithm that is added in the future), as well as specifying a maximum number of function evaluations for the local search: ``` void nlopt_set_local_search_algorithm(nlopt_algorithm deriv, nlopt_algorithm nonderiv, int maxeval); ``` Set the local gradient-based search algorithm to `deriv` (default is `NLOPT_LD_MMA`), the local derivative-free search algorithm to `nonderiv` (default is `NLOPT_LN_COBYLA`), and the maximum number of function evaluations on each local search to `maxeval` (default is `-1`, for no maximum). Conversely, you can get the current values of these parameters by calling: ``` void nlopt_get_local_search_algorithm(nlopt_algorithm *deriv, nlopt_algorithm *nonderiv, int *maxeval) ``` *Note:* these parameters have no effect on local searches that you perform yourself; they are *only* for local searches that are performed *within* another algorithm like MLSL. ### Population size for stochastic algorithms Stochastic (randomized) optimization algorithms are often parameterized by some initial "population" size (a set of sample points where the function is evaluated). NLopt tries to pick a reasonable default value for these population sizes, but in some cases the use may want finer control. This is achieved by the following two functions: ``` void nlopt_set_stochastic_population(int pop); int nlopt_get_stochastic_population(void); ``` which set and get the current (global) setting of the population parameter for stochastic algorithms. The default value of this population parameter is *zero*: a zero population is specially interpreted to mean that the algorithm should choose an algorithm-specific default value. These algorithm-specific defaults are documented with the [algorithms](NLopt_Algorithms.md) that use the population parameter. Fortran programming interface ----------------------------- NLopt is callable from Fortran 77 (and later Fortran dialects), via special Fortran-callable wrapper subroutines that are included in the NLopt library. Although the functionality is the same as that of the C routines, the Fortran routines have different names and the arguments are passed in slightly different ways, as explained below. The most noticeable difference is that all function return values in C are changed into the first argument in Fortran, because there is no portable way to call C functions that return a value from Fortran or vice versa. The other noticeable difference is that, because there is no (portable) way to pass `NULL` in Fortran, any C argument that can optionally be `NULL` is converted to two arguments in Fortran, where the second argument is a flag to say whether that argument should be treated as `NULL` (i.e., ignored). ### Constants and include files In C/C++, the `nlopt.h` header file declares the various constants (`NLOPT_LN_NELDERMEAD`, `NLOPT_FAILURE`, etcetera) used to specify the optimization algorithm, return codes, and so forth. In Fortran, the corresponding definitions are located in the `nlopt.f` file, which is installed into the same directory as `nlopt.h` (in `/usr/local/include` by default). That is, in any Fortran subroutine where you want to use NLopt subroutines, you should do: ``` include 'nlopt.f' ``` to include the constant definitions. (Like in C, most Fortran compilers allow you to pass `-I` options to specify search directories for include files, if you did not install NLopt in a standard location; see the [installation instructions](NLopt_Installation.md).) If you have some ancient Fortran compiler that does not support the `include` directive (which technically was nonstandard until Fortran 90, although most Fortran 77 compilers implement it), then I suppose you could also copy-and-paste the `nlopt.f` file directly into your source code. ### `nloptc` The Fortran analogue to the `nlopt_minimize_constrained` function is: ``` call nloptc(info, algorithm, n,             f, f_data,             m, fc, fc_data, fc_second_datum,              lb, ub,             x, minf,              minf_max, ftol_rel, ftol_abs, xtol_rel, xtol_abs, have_xtol_abs, maxeval, maxtime) ``` The parameters are similar to those of `nlopt_minimize_constrained` (see also the documentation above): - `info` (integer, OUT) — on output, the return value, positive on success and negative on failure (see above for the specific return codes `NLOPT_SUCCESS` etcetera). - `algorithm` (integer, IN) — integer constant (`NLOPT_LN_NELDERMEAD`, etcetera) indicating the optimization algorithm to use (defined in `nlopt.f` include file as described above) - `n` (integer, IN) — the dimension of the problem (the number of optimization parameters, as in C) - `f` (subroutine, IN) — the objective function, actually a subroutine as described below - `f_data` (any type, IN) — any additional data to pass to the objective function - `m` (integer, IN) — the number of nonlinear inequality constraints (zero if none). - `fc` (subroutine, IN) — the constraint subroutine, as described below (ignored if *m*=0) - `fc_data`, `fc_second_datum` (arbitrary types, IN) — data to pass to the constraint subroutine, as described below (ignored if *m*=0) - `lb` (double precision array(`n`), IN) — lower bounds on the optimization parameters. (For unbounded dimensions, use `-Infinity` or `-Inf` in the Fortran 2003 standard; I don't know of a standard way to do it in earlier Fortran versions, maybe `-1.0/0.0`?) - `ub` (double precision array(`n`), IN) — upper bounds on the optimization parameters. (For unbounded dimensions, use `+Infinity` or `+Inf` in the Fortran 2003 standard; I don't know of a standard way to do it in earlier Fortran versions, maybe `+1.0/0.0`?) - `x` (double precision array(`n`), IN/OUT) — on input, an initial guess for the optimization parameters; on output, the best parameters found - `minf` (double precision, OUT) — on output, the minimum value of the objective function that was found Termination conditions (see [introduction](NLopt_Introduction.md#termination-conditions)): - `minf_max` (double precision, IN) — stop if the an objective function value ≤ `minf_max` is found (set to `-Infinity`, or a huge negative number, to ignore). - `ftol_rel`, `ftol_abs` (double precision, IN) — relative and absolute tolerances in the objective function value (ignored if zero). - `xtol_rel` (double precision, IN) — relative tolerance in the optimization parameters (ignored if zero) - `xtol_abs` (double precision array(`n`), IN) — if `have_xtol_abs` is nonzero, then `xtol_abs` is an array of the absolute tolerances in each optimization parameter (ignored if zero). - `have_xtol_abs` (integer, IN) — if zero, then `xtol_abs` is ignored - `maxeval` (integer, IN) — stop if the objective function is evaluated at least `maxeval` times (set to zero to ignore) - `maxtime` (double precision, IN) — stop if the elapsed wall-clock time exceeds `maxtime` seconds (set to zero to ignore) ### `nloptm` The Fortran analogue to the `nlopt_minimize` function is: ``` call nloptm(info, algorithm, n,             f, f_data,             lb, ub,             x, minf,              minf_max, ftol_rel, ftol_abs, xtol_rel, xtol_abs, have_xtol_abs, maxeval, maxtime) ``` This is exactly equivalent to calling `nloptc` with `m`=0. ### Objective function in Fortran You should define your objective function (the function you want to minimize) as a subroutine of the following form: ``` subroutine f(val, n, x, grad, need_gradient, f_data) double precision val integer n double precision x(n) double precision grad(n) integer need_gradient ``` The `n`, `x`, `need_gradient`, and `f_data` parameters are inputs, and the `val` and `grad` parameters are outputs. Upon return, `val` should be set to the value of your objective function at the point **x**. The dimension `n` is the same as the one passed to `nloptm` or `nloptc`. In addition, if the argument `need_gradient` is not zero, then `grad` is an array of length `n` that should (upon return) be set to the gradient of your function *f* with respect to the design variables *x*. That is, `grad(i)` should upon return contain the partial derivative ∂`f`/∂`x(i)`, for `i`=1,...,`n`. Not all of the [optimization algorithms](NLopt_Algorithms.md) use the gradient information: for algorithms listed as "derivative-free," the `need_gradient` argument will always be zero and need never be computed. (For algorithms that do use gradient information, however, `need_gradient` may still be zero for some calls.) You should *not* access the `grad` array *at all* if `need_gradient` is zero. The `f_data` argument is the same as the one passed to `nloptm` or `nloptc`, and may be used to pass any additional data through to the function. It can be declared as any arbitrary type that you want, as long as it is the same type as the variable you passed to `nloptm` or `nloptc` ### Nonlinear constraints in Fortran The `nloptc` function allows you to specify `m` nonlinear constraints via the subroutine `fc`, where `m` is any nonnegative integer. However, nonzero `m` is currently only supported by the `NLOPT_LD_MMA` and `NLOPT_LN_COBYLA` [algorithms](NLopt_Algorithms.md). In particular, the nonlinear constraints are of the form *fc*(*x*) ≤ 0, where the function fc is of the same form as the objective function described above: ``` subroutine fc(val, n, x, grad, need_gradient, fc_datum) ``` As above, upon return `val` should be the value of the constraint function at the point `x` (an array of length `n`), where the dimension `n` is identical to the one passed to `nloptc`. As for the objective function, if the argument `need_gradient` is not zero, then `grad` is an array of length `n` that should (upon return) be set to the gradient of the constraint function with respect to **x**. (For any algorithm listed as "derivative-free", the `need_gradient` argument will always be zero and the gradient need never be computed.) The `fc_datum` argument is based on the `fc_data` argument passed to `nloptc`, and may be used to pass any additional data through to the function, and is used to distinguish between different constraints. In particular, the constraint subroutine `fc` will be called (at most) `m` times for each `x`, and the *i*-th constraint (1 ≤ *i* ≤ *m*) will be passed an `fc_datum` argument equal to `fc_data` offset by the difference between `fc_data` and `fc_second_datum`. For example, suppose that your constraint function `fc` is parameterized by three numbers for each constraint, so you want your `fc_data` to be an array of length 3*m*: `double` `precision` `fc_data(3*m)`. Then, as the `fc_second_datum` argument to `nloptc`, you would pass `fc_data(4)`, which is the first data element for the second constraint. When `fc` is called the first time, it will be passed `fc_data(1:3)`; when it is called the second time it will be passed `fc_data(4:6)`, and so on in sequence. ### Pseudorandom numbers in Fortran The Fortran equivalent of `nlopt_srand` (above), is: ``` call nlosr(seed) ``` where `seed` is an `integer`. The Fortran equivalent of `nlopt_srand_time` (above) is: ``` call nlosrt ``` ### Version number in Fortran To determine the version number of NLopt at runtime, you can call: ``` call nloptv(major, minor, bugfix) ``` where the three arguments are `integer`s, as in `nlopt_version` above. For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. ### Mixed global/local search algorithm in Fortran The Fortran analogues of `nlopt_set_local_search_algorithm` and `nlopt_get_local_search_algorithm` are: ``` call nlosls(deriv, nonderiv, maxeval) call nlogls(deriv, nonderiv, maxeval) ``` where the arguments are all `integer`s and have the same meaning as those of `nlopt_set_local_search_algorithm` and `nlopt_get_local_search_algorithm`, above. ### Population size for stochastic algorithms in Fortran The Fortran analogues of `nlopt_set_stochastic_population` and `nlopt_get_stochastic_population` are: ``` call nlossp(pop) call nlogsp(pop) ``` where the arguments are `integer`s and have the same meaning as the parameter of `nlopt_set_stochastic_population` and the return value of `nlopt_get_stochastic_population`, respectively. GNU Octave and Matlab interface ------------------------------- We also provide an interface to NLopt that is callable from Matlab and [GNU Octave](https://en.wikipedia.org/wiki/GNU_Octave) (a free Matlab clone). This interface consists of two functions, `nlopt_minimize_constrained` and `nlopt_minimize`, which parallel the corresponding C functions above. ### `nlopt_minimize_constrained` in Matlab ``` [xopt, fmin, retcode] = nlopt_minimize_constrained(algorithm, f, f_data, fc, fc_data, lb, ub, xinit, stop) ``` Minimize a nonlinear multivariable function `f(x,` `f_data{:})`, subject to optional nonlinear constraints described by `fc` and `fc_data` (see below), where `x` is a row vector of the optimization parameters, returning the optimal parameters found (`xopt`) along with the minimum function value (`fmin`) and a return code (`retcode`, positive on success and negative on failure). A variety of local and global optimization algorithms can be used, as specified by the `algorithm` parameter. `lb` and `ub` are row vectors giving the upper and lower bounds on `x`, `xinit` is a row vector giving the initial guess for `x`, and `stop` is a structure containing termination conditions (see below). Parameters: - `algorithm` — constant indicating the [optimization algorithm](NLopt_Algorithms.md) (predefined constants NLOPT_LN_NELDERMEAD etcetera are supplied as in C). - `f` — function handle (e.g. `@sin`) of the objective function being minimized, described below - `f_data` — cell array `{...}` of any additional arguments to pass to f (see below) - `fc` — cell array `{...}` of function handles to nonlinear inequality constraints (see below); can be empty `{}` for no nonlinear constraints - `fc_data` — cell array `{...}` of cell arrays: each element `fc_data{i}` is a cell array of additional arguments to pass to the function `fc{i}`; `length(fc_data)` must equal `length(fc)` - `lb` — row vector of lower bounds on each optimization parameter (set any component of `lb` to `-inf` for a parameter that is not bounded below) - `ub` — row vector of lower bounds on each optimization parameter (set any component of `ub` to `+inf` for a parameter that is not bounded above) - `xinit` — row vector containing a starting guess for the optimization parameters - `stop` — structure describing the termination conditions via a number of optional fields (see below) Notice that, unlike in C and Fortran, we do not explicitly pass the dimension *n* of the parameter space: *n* is implicitly the length of the `lb`, `ub`, and `xinit` vectors (which must all be the same length). #### Matlab objective function The parameter `f` should be a handle (`@`) to a function of the form: ```   [val, gradient] = f(x, ...) ``` where `x` is a row vector, `val` is the function value *f*(**x**), and `gradient` is a row vector giving the gradient of the function with respect to `x`. The gradient is only used for gradient-based optimization algorithms; some of the algorithms are derivative-free and only require f to return val (its value), so for these algorithms you need not return the gradient. f can take additional arguments `(...)` which are passed via the argument `f_data`: `f_data` is a cell array of the additional arguments to pass to `f`. (Recall that cell arrays are specified by curly brackets { ... }. For example, pass `f_data={}` for functions that require no additional arguments.) #### Matlab nonlinear constraints Some of the algorithms (currently `NLOPT_LD_MMA` and `NLOPT_LN_COBYLA`) support nonlinear constraints. These (if any) are specified by `fc` and `fc_data`. `fc` is a cell array of function handles, and `fc_data` is a cell array of cell arrays of the corresponding arguments. Both must have the same length m, the number of nonlinear constraints. That is, `fc{i}` is a handle to a function of the form: ```  [val, gradient] = fc(x, ...) ``` (where the `gradient` return value is only used for gradient-based algorithms), and the `...` arguments are given by `fc_data{i}{:}`. If you have no nonlinear constraints, i.e. `fc` = `fc_data` = `{}`, then it is equivalent to calling the `nlopt_minimize` function below, which omits the `fc` and `fc_data` arguments. #### Matlab termination conditions `stop` describes the termination criteria, and is a structure with a number of optional fields: - `stop.fmin_max` — stop when *f* ≤ `fmin_max` is found - `stop.ftol_rel` — fractional tolerance on function value - `stop.ftol_abs` — absolute tolerance on function value - `stop.xtol_rel` — fractional tolerance on **x** - `stop.xtol_abs` — row vector of absolute tolerances on **x** components - `stop.maxeval` — maximum number of function evaluations - `stop.maxtime` — maximum run time in seconds - `stop.verbose` — > 0 indicates verbose output You do *not* need to set all of these fields; termination conditions corresponding to any fields that you do not set are ignored. As discussed in the [introduction](NLopt_Introduction.md#termination-conditions), normally you only want one or two of these conditions. For example to set a relative **x** tolerance of 10−4 and run for no more than 5 minutes, you would do: ``` stop.xtol_rel = 1e-4; stop.maxtime = 5 * 60; ``` and not create any other fields of `stop`. ### `nlopt_minimize` in Matlab ``` [xopt, fmin, retcode] = nlopt_minimize(algorithm, f, f_data, lb, ub, xinit, stop) ``` This is equivalent to calling `nlopt_minimize_constrained` with no nonlinear constraints, i.e. `fc` = `fc_data` = `{}`. stevengj-nlopt-88c424d/doc/docs/NLopt_FAQ.md000066400000000000000000000035041521061417600206020ustar00rootroot00000000000000--- # NLopt FAQ --- General ------- ### What is NLopt? NLopt is a free/open-source library for nonlinear optimization. ### Why use NLopt, when some of the same algorithms are available elsewhere? Several of the algorithms provided by NLopt are based on free/open-source packages by other authors, which we have put together under a common interface in NLopt. If you are using one of these packages and are happy with it, great! However, our experience is that, for nonlinear optimization, the best algorithm is highly problem-dependent; the best approach is to try several different techniques and see which one works best for *you*. NLopt makes this easy by providing a single package and a common interface for many different algorithms, callable from many different languages. Installation ------------ ### Where can I install NLopt? NLopt should be straightforward to install on any Unix-like system (GNU/Linux is fine) with a C compiler (gcc is fine). It should be possible to compile under Windows, too, but to simplify life we plan to provide precompiled DLL files soon for Windows, cross-compiled using [MinGW](https://en.wikipedia.org/wiki/MinGW). Usage ----- ### I included your header file, but the compiler still complains You need to link to the NLopt library in addition to doing `#include `. On Unix, this means adding `-lnlopt` `-lm` at the *end* of your link command. ### It's not converging The most common cause of convergence problems is if you use a gradient-based algorithm and return an incorrect gradient. It seems surprisingly easy to have bugs in code to compute derivatives—you should test it by comparing to finite-difference derivatives for a few random points and directions. You could also try switching algorithms to see if it is a problem in a particular algorithm (but check the gradient first!). stevengj-nlopt-88c424d/doc/docs/NLopt_Fortran_Reference.md000066400000000000000000000452671521061417600236000ustar00rootroot00000000000000--- # NLopt Fortran Reference --- The NLopt library includes an interface callable from the [Fortran programming language](https://en.wikipedia.org/wiki/Fortran). The main purpose of this section is to document the syntax and unique features of the Fortran API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). Before anything else, make sure NLopt is compiled with Fortran support explicitely enabled (with `cmake -DNLOPT_FORTRAN=ON` option). Compiling and linking your Fortran program ------------------------------------------ To obtain the definitions of the NLopt constants in Fortran, your Fortran program/subroutine should include the following line: ``` include 'nlopt.f' ``` The `nlopt.f` file is installed into the `include` directory along with the C/C++ header files (by default, this is `/usr/local/include` ... you may need to include `-I/usr/local/include` in your Fortran compiler flags if this directory is not in your compiler's standard include path). When you compile your program you will have to link it to the NLopt library. On Unix, you would normally link with a command something like: *`compiler`*` `*`...source/object` `files...`*` -lnlopt -lm -o myprogram` where *compiler* is `f77`, `gfortran`, or whatever is appropriate for your machine. *Note:* the above example assumes that you have installed the NLopt library in a place where the compiler knows to find it (e.g. in a standard directory like `/usr/lib` or `/usr/local/lib`). If you installed somewhere else (e.g. in your home directory if you are not a system administrator), then you will need to use a `-L` flag to tell the compiler where to find the library. See [the installation manual](NLopt_Installation.md#changing-the-installation-directory). Fortran vs. C API ----------------- As explained in the [NLopt Tutorial](NLopt_Tutorial.md#example-in-fortran), there are a few simple rules that define the differences between the C and Fortran APIs: - All `nlopt_` functions are converted into `nlo_` subroutines, with return values converted into the first argument. - The `nlopt_opt` type corresponds to `integer*8`. (Technically, we could use any type that is big enough to hold a pointer on all platforms; `integer*8` is big enough for pointers on both 32-bit and 64-bit machines.) - Your objective/constraint subroutines must be declared as `external`, and must be defined as described below. - `include` `'nlopt.f'` in order to get the various constants like `NLOPT_LD_MMA`. - The C `int` or `unsigned` types become a Fortran `integer`, and the C `double` type becomes `real*8` or `double` `precision` in Fortran. The `nlopt_opt` object ---------------------- The NLopt API revolves around an "object" corresponding to the C type `nlopt_opt`. This object is internally a pointer, so it should be declared as an `integer*8` in Fortran (see above). Via functions that modify this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally calls `nlo_optimize` in order to perform the optimization. The object should normally be created via the constructor: ``` integer*8 opt opt = 0 call nlo_create(opt, algorithm, n) ``` given an `integer` `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values, defined in the `nlopt.f` include file) and the `integer` dimensionality of the problem (`n`, the number of optimization parameters). Just as in C, the algorithm is specified by constants of the form `NLOPT_MMA`, `NLOPT_COBYLA`, etcetera. If the constructor succeeds, `opt` will be nonzero after nlo_create, so you can check for an error by checking whether `opt` is zero (if you do this, be sure to initialize it to zero before calling nlo_create). When you are finished with the object, you must deallocate its associated storage by calling: ``` call nlo_destroy(opt) ``` There are also a copy subroutine `call` `nlo_copy(new_opt,` `opt)` to make a copy of a given object (equivalent to `nlopt_copy` in the C API). The algorithm and dimension parameters of the object are immutable (cannot be changed without constructing a new object), but you can query them for a given object by the subroutines: ``` call nlo_get_algorithm(algorithm, opt) call nlo_get_dimension(n, opt) ``` Objective function ------------------ The objective function is specified by calling one of the methods: ``` external f call nlo_set_min_objective(ires, opt, f, f_data) call nlo_set_max_objective(ires, opt, f, f_data) ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. `ires` is an `integer` return value which is positive on success and negative on failure (see below for more specific [return-value meanings](#return-values)). The function `f` should be of the form: ```      subroutine f(result, n, x, grad, need_gradient, f_data)      integer need_gradient      double precision result, x(n), grad(n)      if (need_gradient.ne.0) then ``` `        `*`..store` `gradient` `in` `grad...`* ```      endif ``` `     result = `*`...value` `of` `f(x)...`* ```      end ``` The return value in `result` should be the value of the function at the point `x`, where `x` is an array of length `n` of the optimization parameters (the same as the dimension passed to the constructor). In addition, if the argument `need_gradient` is not zero, then `grad` is an array of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad(i)` should upon return contain the partial derivative $\partial f / \partial x_i$, for $1 \leq i \leq n$. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be empty and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be empty for some calls.) The `f_data` argument can be used to pass through a single variable containing any data and any type to your subroutine. That is, whatever `f_data` variable you pass to `nlo_set_min_objective` is also passed to your function. NLopt does *not* pass a *copy* of your variable, it passes a reference to the original `f_data` variable. This means that you must call nlo_optimize while the `f_data` variable is still valid (e.g. it cannot be a local variable of a subroutine that has exited). Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by calling the methods: ``` double precision lb(n), ub(n) call nlo_set_lower_bounds(ires, opt, lb) call nlo_set_upper_bounds(ires, opt, ub) ``` where `lb` and `ub` are arrays of length *n* (the same as the dimension passed to the `nlopt.opt` constructor), and `ires` is an `integer` [return value](#return-values) (positive on success). For convenience, we also provide subroutines that take a single number as arguments, in order to set the lower/upper bounds for all optimization parameters to a single constant `value`. ``` call nlo_set_lower_bounds1(ires, opt, value) call nlo_set_upper_bounds1(ires, opt, value) ``` To retrieve the values of the lower/upper bounds, you can call one of: ``` call nlo_get_lower_bounds(ires, opt, lb) call nlo_get_upper_bounds(ires, opt, ub) ``` To specify an unbounded dimension, you can use ±`huge(lb(1))` in Fortran to specify ±∞, where `huge` is a Fortran 90 intrinsic function. If you have a Fortran 77 compiler that does not support this intrinsic, then you can call `nlo_get_upper_bounds` or `nlo_get_lower_bounds` first to get the default ±∞ upper/lower bounds. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by the methods: ``` call nlo_add_inequality_constraint(ires, opt, fc, fc_data, tol) call nlo_add_equality_constraint(ires, opt, h, h_data, tol) ``` where the arguments `fc` and `h` have the same form as the objective function above. The `double` `precision` `tol` arguments specify a tolerance in judging feasibility for the purposes of stopping the optimization, as in C, and `ires` is an `integer` [return value](#return-values) (positive on success). To remove all of the inequality and/or equality constraints from a given problem, you can call the following methods: ``` call nlo_remove_inequality_constraints(ires, opt) call nlo_remove_equality_constraints(ires, opt) ``` ### Vector-valued constraints Just as for [nonlinear constraints in C](NLopt_Reference.md#vector-valued-constraints), you can specify vector-valued nonlinear inequality and equality constraints by the subroutines ``` double precision tol(m) call nlo_add_inequality_mconstraint(ires, opt, m, c, c_data, tol) call nlo_add_equality_mconstraint(ires, opt, m, c, c_data, tol) ``` Here, *m* is the dimensionality of the constraint result and `tol` is a length-*m* array of the tolerances in each constraint dimension. The constraint subroutine `c` must be of the form: ```      subroutine c(m, result, n, x, grad, need_gradient, f_data)      integer need_gradient      double precision result(m), x(n), grad(n,m)      if (need_gradient.ne.0) then ``` `        `*`..store` `gradient` `in` `grad...`* ```      endif ``` `     `*`...store` `value` `of` `c(x)` `in` `result...`* ```      end ``` This evaluates the constraint function(s) $\mathbf{c}(\mathbf{x})$ at the point `x`, an array of length `n` (the same as the dimension passed to `nlo_create`). Upon return, the output value of the constraints should be stored in `result`, an array of length `m` (the same as the dimension passed to `nlo_add_*_mconstraint`), so that `result(i)` stores *c**i*. In addition, if `grad` is non-`NULL`, then `grad` is an *n*×*m* array that should, upon return, be set to the gradients of the constraint functions with respect to `x`. That is, $\part c_i / \part x_j$ is stored in `grad(j,i)`. An inequality constraint corresponds to $c_i \le 0$ for $1 \le i \le m$, and an equality constraint corresponds to $c_i = 0$, in both cases with tolerance `tol(i)` for purposes of termination criteria. (You can add multiple vector-valued constraints and/or scalar constraints in the same problem.) Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) For each stopping criteria, there are (at least) two subroutines: a `set` subroutine to specify the stopping criterion, and a `get` subroutine to retrieve the current value for that criterion. The meanings of each criterion are exactly the same as in the C API. The first argument `ires` of each `set` subroutine is an `integer` [return value](#return-values) (positive on success). ``` call nlo_set_stopval(ires, opt, stopval) call nlo_get_stopval(stopval, opt) ``` Stop when an objective value of at least `stopval` is found. ``` call nlo_set_ftol_rel(ires, opt, tol) call nlo_get_ftol_rel(tol, opt) ``` Set relative tolerance on function value. ``` call nlo_set_ftol_abs(ires, opt, tol) call nlo_get_ftol_abs(tol, opt) ``` Set absolute tolerance on function value. ``` call nlo_set_xtol_rel(ires, opt, tol) call nlo_get_xtol_rel(tol, opt) ``` Set relative tolerance on optimization parameters. ``` call nlo_set_x_weights(ires, opt, w) call nlo_set_x_weights1(ires, opt, w1) call nlo_get_x_weights(ires, opt, w) ``` Set/get the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above. ``` call nlo_set_xtol_abs(ires, opt, tol) call nlo_set_xtol_abs1(ires, opt, tol1) call nlo_get_xtol_abs(ires, opt, tol) ``` Set absolute tolerances on optimization parameters. The `tol` input must be an array of length `n` (the dimension specified in the `nlopt_opt` constructor). Alternatively, we provide the subroutine `nlo_set_xtol_abs1` where you pass a single number `tol1` in order to set the same tolerance for all optimization parameters. `nlo_get_xtol_abs` returns the tolerance array in `tol`. ``` call nlo_set_maxeval(ires, opt, maxeval) call nlo_get_maxeval(maxeval, opt) ``` Stop when the number of function evaluations exceeds the `integer` `maxeval`. (Zero or negative for no limit.) ``` call nlo_get_numevals(nevals, opt) ``` Request the number of evaluations. ``` call nlo_set_maxtime(ires, opt, maxtime) call nlo_get_maxtime(maxtime, opt) ``` Stop when the optimization time (in seconds) exceeds `maxtime` (`double` `precision`). (Zero or negative for no limit.) ### Forced termination In certain cases, the caller may wish to *force* the optimization to halt, for some reason unknown to NLopt. For example, if the user presses Ctrl-C, or there is an error of some sort in the objective function. In this case, it is possible to tell NLopt to halt the optimization gracefully, returning the best point found so far, by calling the following subroutine from *within* your objective or constraint functions (exactly analogous to the corresponding [C routines](NLopt_Reference.md#forced-termination)): ``` call nlo_force_stop(ires, opt) ``` `ires` is an `integer` [return value](#return-values) (positive on success). More generally, you can set and retrieve a force-stop integer code `ival`, where a nonzero value indicates a forced stop. ``` call nlo_set_force_stop(ires, opt, ival) call nlo_get_force_stop(ires, opt, ival) ``` The force-stop value is reset to zero at the beginning of `nlopt_optimize`. Passing `ival=0` to `nlo_set_force_stop` tells NLopt *not* to force a halt. Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ``` double precision x(n), minf call nlo_optimize(ires, opt, x, minf) ``` On input, `x` is an array of length `n` (the dimension of the problem from the `nlopt.opt` constructor) giving an initial guess for the optimization parameters. Upon successful return, `x` contains the optimized values of the optimization parameters and `minf` contains the optimized objective-function value. `ires` is an `integer` [return value](#return-values) (positive on success). ### Return values The possible return values are the same as the [return values in the C API](NLopt_Reference.md#return-values), with the corresponding integer constants defined in the `nlopt.f` include file. Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ``` nlo_set_local_optimizer(ires, opt, local_opt) ``` Here, `local_opt` is another `nlopt_opt` object (`integer*8`) whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `local_opt` are ignored.) The dimension `n` of `local_opt` must match that of `opt`. `ires` is an `integer` [return value](#return-values) (positive on success). This function makes a copy of the `local_opt` object, so you can freely change or destroy your original `local_opt` afterwards without affecting `opt`. Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. The Fortran equivalents of the C functions are the following methods: ``` double precision x(n) dx(n), dx1 call nlo_set_initial_step(ires, opt, dx) call nlo_set_initial_step1(ires, opt, dx1) call nlo_get_initial_step(ires, opt, x, dx) ``` Here, `dx` is an array of the (nonzero) initial steps for each dimension. For convenience, you can also pass a single number `dx1` to `nlo_set_initial_step1` if you wish to use the same initial steps for all dimensions. `nlo_get_initial_step` sets `dx` to the initial step that will be used for a starting guess of `x` in `nlo_optimize(ires,` `opt,` `x,` `minf)`. `ires` is an `integer` [return value](#return-values) (positive on success) Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by the methods: ``` call nlo_set_population(ires, opt, ipop) call nlo_get_population(ipop, opt) ``` where `ipop` is an integer and `ires` is an `integer` [return value](#return-values) (positive on success). (An `ipop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ``` call nlosr(iseed) ``` where `iseed` is an `integer`. To reset the seed based on the system time, you can call: ``` call nlosrt ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `nlosr` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can get and set the [number *M* of stored vectors](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms) for limited-memory quasi-Newton algorithms: ``` call nlo_set_vector_storage(ires, opt, M) call nlo_get_vector_storage(M, opt) ``` (The default is *M*=0, in which case NLopt uses a heuristic nonzero value.) Version number -------------- To determine the version number of NLopt at runtime, you can call: ``` call nloptv(major, minor, bugfix) ``` where the three arguments are `integer`s. For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. stevengj-nlopt-88c424d/doc/docs/NLopt_Guile_Reference.md000066400000000000000000000401421521061417600232150ustar00rootroot00000000000000--- # NLopt Guile Reference --- The NLopt includes an interface callable from the [Scheme programming language](https://en.wikipedia.org/wiki/Scheme_(programming_language)) as implemented in [GNU Guile](https://en.wikipedia.org/wiki/GNU_Guile) (which allows Scheme to be used as an extension language for other programs). The main purpose of this section is to document the syntax and unique features of the Guile API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). Using the NLopt Guile API ------------------------- To use NLopt in GNU Guile, your Guile program should include the lines: ``` (use-modules (nlopt)) ``` which imports the `nlopt` module. The `nlopt-opt` class --------------------- The NLopt API revolves around an opaque "object", analogous to `nlopt::opt` in C++. Via "methods" of this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally calls the `opt.optimize` method in order to perform the optimization. The object should normally be created via the constructor: ``` (new-nlopt-opt algorithm n) ``` given an `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). Whereas the C algorithms are specified by `nlopt_algorithm` constants of the form `NLOPT_MMA`, `NLOPT_COBYLA`, etcetera, the Guile `algorithm` values are of the form `nlopt-MMA`, `nlopt-COBYLA`, etcetera (i.e., underscores are turned into dashes). There are also a copy constructor `(new-nlopt-opt` `opt)` to make a copy of a given object (equivalent to `nlopt_copy` in the C API). If there is an error in the constructor (or copy constructor, or assignment), an exception is thrown. The algorithm and dimension parameters of the object are immutable (cannot be changed without constructing a new object), but you can query them for a given object by the methods: ``` (nlopt-opt-get-algorithm opt) (nlopt-opt-get-dimension opt) ``` You can get a string description of the algorithm via: ``` (nlopt-opt-get-algorithm-name opt) ``` ### Relationship to C++ interface In general, there is a simple relationship between the Guile interface and the [C++ interface](NLopt_C-plus-plus_Reference.md): - The `nlopt::` namespace becomes a prefix`nlopt-`, and `nlopt::opt` becomes `nlopt-opt-`. (Constants are prefixed with `NLOPT-`, however.) - Underscores (_) are turned into hyphens (-). - The `nlopt-opt` object becomes the first parameter of its methods. - `std::vector` is turned into a Scheme `vector` (a `list` is also supported for input parameters). Objective function ------------------ The objective function is specified by calling one of the methods: ``` (nlopt-opt-set-min-objective opt f) (nlopt-opt-set-max-objective opt f) ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. The function `f` should be of the form: ``` (define (f x grad)    (if grad       (begin `*`...set` `grad` `to` `gradient,` `in-place...`*`))    return `*`...value` `of` `f(x)...`*`) ``` The return value should be the value of the function at the point `x`, where `x` is a `vector` of length `n` of the optimization parameters (the same as the dimension passed to the constructor). In addition, if the argument `grad` is not `#f` (false), then `grad` is a `vector` of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `(vector-ref` `grad` `i)` should upon return contain the partial derivative $\partial f / \partial x_i$, for $0 \leq i < n$, if `grad` is not `#f`. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be empty and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be empty for some calls.) Note that `grad` must be modified `in-place` by your function `f`, by using `(vector-set!` `grad` `i` *`value`*`)`. Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by calling the methods: ``` (nlopt-opt-set-lower-bounds opt lb) (nlopt-opt-set-lower-bounds opt ub) ``` where `lb` and `ub` are vectors or lists of length *n* (the same as the dimension passed to the `nlopt.opt` constructor). For convenience, these are overloaded with functions that take a single number as arguments, in order to set the lower/upper bounds for all optimization parameters to a single constant. To retrieve the values of the lower/upper bounds, you can call one of: ``` (nlopt-opt-get-lower-bounds opt) (nlopt-opt-get-upper-bounds opt) ``` both of which return vectors. To specify an unbounded dimension, you can use `(inf)` or `(-` `(inf))` in Guile to specify ±∞, respectively. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by the methods: ``` (nlopt-opt-add-inequality-constraint opt fc tol) (nlopt-opt-add-equality-constraint opt h tol) ``` where the arguments `fc` and `h` have the same form as the objective function above. The (optional) `tol` arguments specify a tolerance in judging feasibility for the purposes of stopping the optimization, as in C (defaulting to zero if they are omitted). To remove all of the inequality and/or equality constraints from a given problem, you can call the following methods: ``` (nlopt-opt-remove-inequality-constraints opt) (nlopt-opt-remove-equality-constraints opt) ``` Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) For each stopping criteria, there are (at least) two method: a `set` method to specify the stopping criterion, and a `get` method to retrieve the current value for that criterion. The meanings of each criterion are exactly the same as in the C API. ``` (nlopt-opt-set-stopval opt stopval) (nlopt-opt-get-stopval opt) ``` Stop when an objective value of at least `stopval` is found. ``` (nlopt-opt-set-ftol-rel opt tol) (nlopt-opt-get-ftol-rel opt tol) ``` Set relative tolerance on function value. ``` (nlopt-opt-set-ftol-abs opt tol) (nlopt-opt-get-ftol-abs opt tol) ``` Set absolute tolerance on function value. ``` (nlopt-opt-set-xtol-rel opt tol) (nlopt-opt-get-xtol-rel opt tol) ``` Set relative tolerance on optimization parameters. ``` (nlopt-opt-set-xtol-abs opt tol) (nlopt-opt-get-xtol-abs opt tol) ``` Set absolute tolerances on optimization parameters. The `tol` input must be a vector or list of length `n` (the dimension specified in the `nlopt.opt` constructor); alternatively, you can pass a single number in order to set the same tolerance for all optimization parameters. `get-xtol-abs()` returns the tolerances as a vector. ``` (nlopt-opt-set-x-weights opt x) (nlopt-opt-get-x-weights opt x) ``` Set the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above. ``` (nlopt-opt-set-maxeval opt maxeval) (nlopt-opt-get-maxeval opt) ``` Stop when the number of function evaluations exceeds `maxeval`. (0 or negative for no limit.) ``` (nlopt-opt-get-nevals opt) ``` Request the number of evaluations. ``` (nlopt-opt-set-maxtime opt maxtime) (nlopt-opt-get-maxtime opt) ``` Stop when the optimization time (in seconds) exceeds `maxtime`. (0 or negative for no limit.) Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ``` (nlopt-opt-optimize opt x) ``` On input, `x` is a vector or list of length `n` (the dimension of the problem from the `nlopt.opt` constructor) giving an initial guess for the optimization parameters. The return value is a vector containing the optimized values of the optimization parameters. You can call the following methods to retrieve the optimized objective function value from the last `optimize` call, and also the return code (including negative/failure return values) from the last `optimize` call: ``` (nlopt-opt-last-optimum-value opt) (nlopt-opt-last-optimize-result opt) ``` The return code (see below) is positive on success, indicating the reason for termination. On failure (negative return codes), by default, `optimize` throws an exception (see [Exceptions](#exceptions), below). ### Return values The possible return values are the same as the [return values in the C API](NLopt_Reference.md#return-values), except that the `NLOPT_` prefix is replaced with the `NLOPT-` namespace. That is, `NLOPT_SUCCESS` becomes `NLOPT-SUCCESS`, etcetera. Exceptions ---------- If exceptions are enabled (the default), the [Error codes (negative return values)](NLopt_Reference.md#error-codes-negative-return-values) in the C API are replaced in the Guile API by thrown exceptions. The exception key takes the form of a Scheme symbol. The following exception keys are thrown by the various routines: ``` runtime-error ``` Generic failure, equivalent to `NLOPT_FAILURE`. ``` invalid-argument ``` Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera), equivalent to `NLOPT_INVALID_ARGS`. ``` bad-alloc ``` Ran out of memory (a memory allocation failed), equivalent to `NLOPT_OUT_OF_MEMORY`. `roundoff-limited` (subclass of `Exception`) Halted because roundoff errors limited progress, equivalent to `NLOPT_ROUNDOFF_LIMITED`. `forced-stop` (subclass of `Exception`) Halted because of a forced termination: the user called `opt.force_stop()` from the user’s objective function. Equivalent to `NLOPT_FORCED_STOP`. Whether this behavior is enabled or whether `nlopt-opt-optimize` just returns the error code as is is controlled by the `enable_exceptions` flag in `nlopt::opt`, which can be set and retrieved with the methods below. ``` (nlopt-opt-set_exceptions_enabled opt enable) (nlopt-opt-get_exceptions_enabled opt) ``` The default is `#t` (true), i.e., to throw an exception. When setting `(nlopt-opt-set_exceptions_enabled opt #f)` (false), it is the caller's responsibility to *manually* check `(nlopt-opt-last-optimize-result opt)`. While that makes the `#f` setting more error-prone, it has the advantage that the best point found (which can be quite good even in some error cases) can still be returned through the return value of `nlopt-opt-optimize`, so is not lost, whereas if exceptions are enabled through `(nlopt-opt-set_exceptions_enabled opt #t)`, the exception prevents the best point from being returned. Currently, NLopt does not catch any exceptions that you might throw from your objective or constraint functions. (In the future, we might catch these exceptions, halt the optimization gracefully, and then re-throw, as in Python or C++, but this is not yet implemented.) So, throwing an exception in your objective/constraint may result in a memory leak. To catch an [exception in Guile](http://www.gnu.org/software/guile/manual/html_node/Exceptions.html), you need to define a [throw-handler](http://www.gnu.org/software/guile/manual/html_node/Throw-Handlers.html) function. For example, the following code calls `nlopt-opt-optimize`, catches *any* exception (a key of `#t` in `catch`), and prints out the error return code: ``` (define xopt    (catch #t        (lambda () (nlopt-opt-optimize opt x))       (lambda (key . args)          (display "Caught exception ") (display key) (display " ") (display args) (newline)          (display "NLopt result ") (display (nlopt-opt-last-optimize-result opt)) (newline)          #f)        )) ``` Note that the [catch statement](http://www.gnu.org/software/guile/manual/html_node/Catch.html) takes three arguments: the first is a key to catch (`#t` for all), the second is a [thunk](https://en.wikipedia.org/wiki/Thunk) function to do whatever it is that might throw exceptions (the equivalent of a C++ `try` block), and the third is a function that is called if there is an exception (the equivalent of a C++ `catch` block). Note that `xopt` is set to the return value of `nlopt-opt-optimize` on success, or `#f` (the return value of our throw handler) on an exception. Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ``` (nlopt-opt-set-local-optimizer opt local-opt) ``` Here, `local-opt` is another `nlopt-opt` object whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `local-opt` are ignored.) The dimension `n` of `local-opt` must match that of `opt`. This function makes a copy of the `local-opt` object, so you can freely change your original `local-opt` afterwards without affecting `opt`. Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. The Guile equivalents of the C functions are the following methods: ``` (nlopt-opt-set-initial-step opt dx) (nlopt-opt-get-initial-step opt x) ``` Here, `dx` is a vector or list of the (nonzero) initial steps for each dimension, or a single number if you wish to use the same initial steps for all dimensions. `nlopt-opt-get-initial-step` returns the initial step (vector) that will be used for a starting guess of `x` in `(nlopt-opt-optimize` `opt` `x)`. Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by the methods: ``` (nlopt-opt-set-population opt pop) (nlopt-opt-get-population opt) ``` (A `pop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ``` (nlopt-srand seed) ``` where `seed` is an integer. o reset the seed based on the system time, you can call: ``` (nlopt-srand-time) ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `nlopt-srand` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can get and set the [number *M* of stored vectors](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms) for limited-memory quasi-Newton algorithms, via the functions: ``` (nlopt-opt-set-vector-storage opt M) (nlopt-opt-get-vector-storage opt) ``` (The default is *M*=0, in which case NLopt uses a heuristic nonzero value.) Version number -------------- To determine the version number of NLopt at runtime, you can call: ``` (nlopt-version-major) (nlopt-version-minor) (nlopt-version-bugfix) ``` For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. stevengj-nlopt-88c424d/doc/docs/NLopt_Installation.md000066400000000000000000000230311521061417600226310ustar00rootroot00000000000000--- # NLopt Installation --- The installation of NLopt is fairly standard and straightforward, at least on Unix-like systems (GNU/Linux is fine). It doesn't require any particular packages to be installed except for a C compiler, although you need to have [Octave](https://en.wikipedia.org/wiki/GNU_Octave), Matlab, [Guile](https://www.gnu.org/software/guile/) or [Python](https://www.python.org/) installed if you want to install the corresponding plugins. In particular, NLopt uses the standard [CMake](https://cmake.org/) `cmake` build system, which means that you compile it via: ```sh mkdir build cd build cmake .. make ``` in the `nlopt` directory. Then install the NLopt libraries and header files via: ```sh sudo make install ``` By default, this installs the NLopt shared library (`libnlopt.so`) in `/usr/local/lib` and the NLopt header file (`nlopt.h`) in `/usr/local/include`, as well manual pages and a few other files. In the following, we describe a few details of this installation process, including how to change the installation location. Changing the installation directory ----------------------------------- You may wish to install NLopt in a directory other than `/usr/local`, especially if you do not have administrator access to your machine. You can do this using the `CMAKE_INSTALL_PREFIX` variable of the `cmake` utility. For example, suppose that you want to install into the `install` subdirectory of your home directory (`$HOME`). You would do: ```sh cmake -DCMAKE_INSTALL_PREFIX=$HOME/install .. make make install ``` This will create the directories `$HOME/install/lib` etcetera and install NLopt into them. However, now when you compile code using NLopt, you will need to tell the compiler where to find the NLopt header files (using `-I`) and libraries (using `-L`) with something like: ```sh cc -I$HOME/install/include myprogram.c -L$HOME/install/lib -lnlopt -lm -o myprogram ``` See also below for how to change the installation directories for Octave, Matlab, and Guile plugins, if you are installing those. Note also that the `-DCMAKE_INSTALL_PREFIX` flag will change the location where the Python plugins are installed, so you may need to change the [Python module search path](http://docs.python.org/tutorial/modules.html#the-module-search-path) via the `PYTHONPATH` environment variable. However, at this point you need to tell the operating system where to find the shared library, so that the runtime linker works properly. There are at least two ways to do this. First, you can use the `LD_LIBRARY_PATH` environment variable. For example, if you installed into the `/foo/bar` directory, so that the library is in `/foo/bar/lib`, then you would do ```sh export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/foo/bar/lib ``` in the [bash](https://en.wikipedia.org/wiki/Bash) shell, or ```sh setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/foo/bar/lib ``` in [csh](https://en.wikipedia.org/wiki/csh) or [w:tcsh](https://en.wikipedia.org/wiki/tcsh). Alternatively, in GNU/Linux systems, you can add the library directory to the system-wide file `/etc/ld.so.conf` and then (as root) run `/sbin/ldconfig`. Static libraries ---------------- By default, NLopt compiles as a shared library (also called a dynamic-link library). The alternative is to compile NLopt as a static library. Compiling NLopt as a static library is easy. Just add `-DBUILD_SHARED_LIBS=OFF` to the `cmake` flags, as in: ```sh cmake -DBUILD_SHARED_LIBS=OFF .. ``` Then you run `make` and `make` `install` as usual. Vcpkg ----- Alternatively, you can build and install NLopt using [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install ./vcpkg install nlopt The NLopt port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. Octave and Matlab plugins ------------------------- When you compile NLopt using the above commands, it will automatically compile plugins for both Matlab and GNU Octave (a free Matlab clone) if the latter programs are installed. On most current systems, Matlab and Octave plugins require NLopt to be compiled as a shared library (see above). ### Matlab In particular, for Matlab plugins to be installed, you should provide the Matlab installation dir, eg: ```sh cmake -DNLOPT_MATLAB=ON -DMatlab_ROOT_DIR=/opt/matlab/RYYYYx/ .. ``` Some versions of Matlab also require that you compile NLopt as a shared library in order to produce a Matlab plugin; see below. You can manually disable the Matlab-plugin build with `-DNLOPT_MATLAB=OFF`. The Matlab plugins (along with help files and other `.m` files) are installed into `INSTALL_MEX_DIR`. You can override the default by passing a `INSTALL_MEX_DIR` to `cmake`, via (in addition to other `cmake` arguments): ```sh cmake -DINSTALL_MEX_DIR=dir .. ``` to install the Matlab plugins in directory *dir*. In this case, however, when you run Matlab you will either need to run in the *dir* directory or explicitly add *dir* to your Matlab path (see the Matlab `path` command). Matlab's standard C++ library might be incompatible with the one used by your compiler, in that case you can try to disable the C++ algorithms: ```sh cmake -DNLOPT_CXX=OFF .. ``` ### Octave For the Octave plugins to be installed, you need to have the Octave `mkoctfile` program in your PATH. `mkoctfile` is Octave's equivalent of `mex`. If you are using a GNU/Linux system, and you installed Octave using one of the precompiled packages for your distribution, then you probably need to install a *separate package* to get `mkoctfile`. For example, on Debian you need to install the `octave-headers` package, and on Redhat you need the `octave-devel` package. By default, the compiled Octave plugins (`.oct` files) are installed into the octave extension binary directory relatively to the installation prefix (usually something like `/usr/local/lib/octave/2.1.73/site/oct/i486-pc-linux-gnu`), and the .m script files are installed into the site extension directory relatively to the installation prefix (usually something like `/usr/local/share/octave/2.1.73/site/m/`). You can change these defaults by passing `INSTALL_OCT_DIR` and `INSTALL_M_DIR`, respectively, to the cmake script, via: ```sh cmake -DINSTALL_OCT_DIR=octdir -DINSTALL_M_DIR=mdir .. ``` You can manually disable the Octave-plugin build with `-DNLOPT_OCTAVE=OFF`. Python plugins -------------- If [Python](https://en.wikipedia.org/wiki/Python_(programming_language)) and [SWIG](https://www.swig.org/) are installed on your machine, then NLopt will automatically compile and install a Python `nlopt` module. You also need [NumPy](https://en.wikipedia.org/wiki/NumPy) to be installed, as NLopt's Python interface uses NumPy array types. To specify a particular version or location of Python, use the `Python_EXECUTABLE` variable to set the full path to the `python` executable: ```sh cmake -DPython_EXECUTABLE=/usr/bin/python .. ``` You can manually disable the Python-plugin build with `-DNLOPT_PYTHON=OFF`. GNU Guile plugins ----------------- If [Guile](https://en.wikipedia.org/wiki/GNU_Guile) and [SWIG](https://www.swig.org/) are installed on your machine, then a Guile `nlopt` module will automatically be compiled and installed. Note that many GNU/Linux distributions come with only the Guile program and shared libraries pre-installed; to compile the NLopt plugin you will also need the Guile programming header files, which are usually in a `guile-dev` or `guile-devel` package that you must install separately. If you want to specify a particular version or a nonstandard location of Guile, you should use the `GUILE_CONFIG_EXECUTABLE` and `GUILE_EXECUTABLE` variables to specify the locations of the `guile-config` and `guile` programs: ```sh cmake -DGUILE_EXECUTABLE=/usr/bin/guile GUILE_CONFIG_EXECUTABLE=/usr/bin/guile-config .. ``` (The `cmake` script uses these programs to determine the compiler flags and installation directories for Guile plugins.) By default, the Guile plugin is installed in the guile extension directory defined relatively to the installation prefix. Note, however, that if you do this then Guile may not know where to load the `nlopt` module from. You can [update the Guile load path](http://www.gnu.org/software/guile/manual/html_node/Build-Config.html) by changing the `%load-path` variable in Guile or using the `GUILE_LOAD_PATH` environment variable. You can manually disable the Guile-plugin build with `-DNLOPT_GUILE=OFF`. NLopt with C++ algorithms ------------------------- NLopt, as-is, is callable from C, C++, and Fortran, with optional Matlab and GNU Octave plugins (and even installs an `nlopt.hpp` C++ header file to allow you to call it in a more C++ style). By default, it includes subroutines written in C (or written in Fortran and converted to C) and C++. If you configure with: ```sh cmake -DNLOPT_CXX=OFF .. ``` however, it will disable algorithms implemented in C++ (StoGO and AGS algorithms). The resulting library has the *same* interface as the ordinary NLopt library, and can *still* be called from ordinary C, C++, and Fortran programs. However, one no longer has to link with the C++ standard libraries, which can sometimes be convenient for non-C++ programs, and allows libnlopt to be compatible with multiple C++ compilers simultaneously. LGPL solvers ------------ It is possible to build NLopt as fully permissive library by disabling the LGPL Luksan solvers with: ```sh cmake -DNLOPT_LUKSAN=OFF .. ``` stevengj-nlopt-88c424d/doc/docs/NLopt_Introduction.md000066400000000000000000000530521521061417600226570ustar00rootroot00000000000000--- # NLopt Introduction --- In this chapter of the manual, we begin by giving a general overview of the optimization problems that NLopt solves, the key distinctions between different types of optimization algorithms, and comment on ways to cast various problems in the form NLopt requires. We also describe the background and goals of NLopt. [TOC] Optimization problems --------------------- NLopt addresses general nonlinear optimization problems of the form: $$\min_{\mathbf{x}\in\mathbb{R}^n} f(\mathbf{x})$$, where *f* is the **objective function** and **x** represents the *n* **optimization parameters** (also called *design variables* or *decision parameters*). This problem may optionally be subject to the **bound constraints** (also called *box constraints*): $$lb_i \leq x_i \leq ub_i$$ for $i=1,\ldots,n$ given lower bounds *lb* and upper bounds *ub* (which may be −∞ and/or +∞, respectively, for partially or totally unconstrained problems). (If $lb_i = ub_i$, that parameter is effectively eliminated.) One may also optionally have *m* **nonlinear inequality constraints** (sometimes called a **nonlinear programming** problem): $$fc_i(\mathbf{x}) \leq 0$$ for $i=1,\ldots,m$ for **constraint functions** *fc**i*(**x**). Some of the NLopt algorithms also support *p* **nonlinear equality constraints**: $$h_i(\mathbf{x}) = 0$$ for $i=1,\ldots,p$ (More generally, several constraints at once might be combined into a single function that returns a vector-valued result.) A point **x** that satisfies all of the bound, inequality, and equality constraints is called a **feasible point**, and the set of all feasible points is the **feasible region**. *Note:* in this introduction, we follow the usual mathematical convention of letting our indices begin with one. In the C programming language, however, NLopt follows C's zero-based conventions (e.g. *i* goes from 0 to *m*−1 for the constraints). ### Global versus local optimization NLopt includes algorithms to attempt either *global* or *local* optimization of the objective. **Global optimization** is the problem of finding the feasible point **x** that minimizes the objective *f*(**x**) over the *entire* feasible region. In general, this can be a *very difficult* problem, becoming exponentially harder as the number *n* of parameters increases. In fact, unless special information about *f* is known, it is not even possible to be certain whether one has found the true global optimum, because there might be a sudden dip of *f* hidden somewhere in the parameter space you haven't looked at yet. However, NLopt includes several global optimization algorithms that work well on reasonably well-behaved problems, if the dimension *n* is not too large. **Local optimization** is the *much easier* problem of finding a feasible point **x** that is only a *local* minimum: *f*(**x**) is less than or equal to the value of *f* for all nearby feasible points (the intersection of the feasible region with at least some small neighborhood of **x**). In general, a nonlinear optimization problem may have *many* local minima, and which one is located by an algorithm typically depends upon the starting point that the user supplies to the algorithm. Local optimization algorithms, on the other hand, can often quickly locate a local minimum even in very high-dimensional problems (especially using gradient-based algorithms). (An algorithm that is guaranteed to find some *local* minimum from any feasible starting point is, somewhat confusingly, called *globally convergent*.) In the special class of **convex optimization** problems, for which both the objective and inequality constraint functions are [convex](https://en.wikipedia.org/wiki/Convex_function) (and the equality constraints are [affine](https://en.wikipedia.org/wiki/Affine_transformation) or in any case have [convex](https://en.wikipedia.org/wiki/Convex_set) [level sets](https://en.wikipedia.org/wiki/Level_set)), there is only *one* local minimum value of *f* , so that a *local* optimization method finds a *global* optimum. There may, however, be more than one point **x** that yield the same minimum *f*(**x**), with the optimum points forming a convex subset of the (convex) feasible region. Typically, convex problems arise from functions of special analytical forms, such as linear programming problems, semidefinite programming, quadratic programming, and so on, and specialized techniques are available to solve these problems very efficiently. NLopt includes only general methods that do not assume convexity; if you have a provably convex problem, you may be better off with a different software package, such as the [CVX package for Python](https://www.cvxpy.org/) or the [JuMP package for Julia](https://jump.dev/). ### Gradient-based versus derivative-free algorithms Especially for local optimization, the most efficient algorithms typically require the user to supply the gradient ∇*f* in addition to the value *f*(**x**) for any given point **x** (and similarly for any nonlinear constraints). This exploits the fact that, in *principle*, the gradient can almost always be computed at the same time as the value of *f* using very little additional computational effort (at worst, about the same as that of evaluating *f* a second time). If a quick way to compute the derivative of *f* is not obvious, one typically finds ∇*f* using an [adjoint method](http://math.mit.edu/~stevenj/18.336/adjoint.pdf), or possibly using [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation) tools. Gradient-based methods are critical for the efficient optimization of very high-dimensional parameter spaces (e.g. *n* in the thousands or more). On the other hand, computing the gradient is sometimes cumbersome and inconvenient if the objective function is supplied as a complicated program. It may even be impossible, if *f* is not differentiable (or worse, is discontinuous). In such cases, it is often easier to use a *derivative-free* algorithm for optimization, which only requires that the user supply the function *values* *f*(**x**) for any given point **x**. Such methods typically must evaluate *f* for at *least* several-times-*n* points, however, so they are best used when *n* is small to moderate (up to hundreds). NLopt provides both derivative-free and gradient-based algorithms with a common interface. **Note**: If you find yourself computing the gradient by a finite-difference approximation (e.g. $\partial f/\partial x \approx [f(x+\Delta x) - f(x -\Delta x)]/2\Delta x$ in one dimension), then you should probably use a derivative-free algorithm instead. Finite-difference approximations are not only expensive (2*n* function evaluations for the gradient using center differences), but they are also notoriously susceptible to roundoff errors unless you are very careful. On the other hand, finite-difference approximations are very useful to *check* that your *analytical* gradient computation is correct—this is always a good idea, because in my experience it is very easy to have bugs in your gradient code, and an incorrect gradient will cause weird problems with a gradient-based optimization algorithm. ### Equivalent formulations of optimization problems There are many equivalent ways to formulate a given optimization problem, even within the framework defined above, and finding the best formulation can be something of an art. To begin with a trivial example, suppose that you want to *maximize* the function *g*(**x**). This is equivalent to minimizing the function *f*(**x**)=−*g*(**x**). Because of this, there is no need for NLopt to provide separate maximization routines in addition to its minimization routines—the user can just flip the sign to do maximization. As a convenience, however, NLopt provides a maximization interface (which performs the necessary sign flips for you, internally). A more interesting example is that of a **minimax** optimization problem, where the objective function *f*(**x**) is the maximum of *N* functions: $$f(\mathbf{x}) = \max \{ g_1(\mathbf{x}), g_2(\mathbf{x}), \ldots, g_N(\mathbf{x}) \}$$ You could, of course, pass this objective function directly to NLopt, but there is a problem: it is not everywhere differentiable (it is only piecewise differentiable, assuming *gk* is differentiable). Not only does this mean that the most efficient gradient-based algorithms are inapplicable, but even the derivative-free algorithms may be slowed down considerably. Instead, it is possible to formulate the *same* problem as a differentiable problem by adding a *dummy* variable *t* and *N* new nonlinear constraints (in addition to any other constraints): $$\min_{x\in\mathbb{R}^n, t\in\mathbb{R}} t$$ subject to $g_k(\mathbf{x}) - t \leq 0$ for $k=1,2,\ldots,N$. This solves *exactly* the same minimax problem, but now we have a differentiable objective and constraints, assuming that the functions *g**k* are individually differentiable. Notice that, in this case, the objective function by itself is the boring linear function *t*, and all of the interesting stuff is in the constraints. This is typical of many nonlinear programming problems. Yet another example would be minimizing the absolute value $|g(\mathbf{x})|$ of some function *g*(**x**). This is equivalent to minimizing $\max \{ g(\mathbf{x}), -g(\mathbf{x}) \}$, however, and can therefore be transformed into differentiable nonlinear constraints as in the minimax example above. ### Equality constraints Suppose that you have one or more **nonlinear equality constraints** $$h_i(\mathbf{x}) = 0$$. In *principle*, each equality constraint can be expressed by two inequality constraints $h_i(\mathbf{x}) \leq 0$ and $-h_i(\mathbf{x}) \leq 0$, so you might think that any code that can handle inequality constraints can automatically handle equality constraints. In practice, this is not true—if you try to express an equality constraint as a pair of nonlinear inequality constraints, some algorithms will fail to converge. Equality constraints sometimes require special handling because they reduce the *dimensionality* of the feasible region, and not just its size as for an inequality constraint. Only some of the NLopt algorithms (AUGLAG, SLSQP, COBYLA, and ISRES) currently support nonlinear equality constraints. #### Elimination Sometimes, it is possible to handle equality constraints by an **elimination** procedure: you use the equality constraint to explicitly solve for some parameters in terms of other unknown parameters, and then only pass the latter as optimization parameters to NLopt. For example, suppose that you have a *linear* (technically, affine) equality constraint: $$A\mathbf{x} = \mathbf{b}$$ for some constant matrix *A*. Given a particular solution **ξ** of these equations and a matrix *N* whose columns are a basis for the nullspace of *A*, one can express all possible solutions of these linear equations in the form: $$\mathbf{x} = \boldsymbol{\xi} + N\mathbf{z}$$ for unknown vectors **z**. You could then pass **z** as the optimization parameters to NLopt, rather than **x**, and thus eliminate the equality constraint. (Some care is required in [numerically computing the nullspace](https://en.wikipedia.org/wiki/Kernel_(matrix)#Numerical_computation_of_null_space) matrix *N*, because [rounding errors](https://en.wikipedia.org/wiki/Round-off_error) will tend to make the matrix *A* less singular than it should be. A standard technique is to compute the [SVD](https://en.wikipedia.org/wiki/Singular_value_decomposition) of *A* and set any singular values less than some threshold to zero.) #### Penalty functions Another popular approach to equality constraints (and inequality constraints, for that matter) is to include some sort of **penalty function** in the objective function, which penalizes **x** values that violate the constraints. A standard technique of this sort is known as the **augmented Lagrangian** approach, and a variant of this approach is implemented in NLopt's [AUGLAG algorithm](NLopt_Algorithms.md#augmented-lagrangian-algorithm). (For inequality constraints, a variant of the penalty idea is a **barrier method**: this is simply a penalty that diverges as you approach the constraint, which forces the optimization to stay within the feasible region.) Termination conditions ---------------------- For any optimization algorithm, one must supply some **termination conditions** specifying when the algorithm halts. Ideally, the algorithm should halt when the optimum is found to within some desired tolerance. In practice, however, because the true optimum is not known *a priori*, one uses some heuristic estimate for the error in the solution instead of the actual error. NLopt gives the user a choice of several different termination conditions. You do *not* need to specify *all* of these termination conditions for any given problem. You should just set the conditions you want; NLopt will terminate when the *first* one of the specified termination conditions is met (i.e. the *weakest* condition you specify is what matters). The termination conditions supported by NLopt are: ### Function value and parameter tolerances First, you can specify a fractional tolerance ftol_rel and an absolute tolerance ftol_abs on the function values. Ideally, these would be the maximum fractional and absolute error compared to the exact minimum function value, but this is impossible because the minimum is not known. Instead most algorithms implement these as a tolerance for the decrease Δf in the function value from one iteration to next (or something similar to that): the algorithm stops if |Δf|/|f| is less than ftol_rel, or |Δf| is less than ftol_abs. Similarly, you can specify a fractional tolerance xtol_rel and an absolute tolerance xtol_abs*i* on the parameters **x**. Again, it is practically impossible for these to be tolerances on the actual error Δ**x** compared to the (unknown) minimum point, so in practice Δ**x** is usually some measure of how much **x** changes by from one iteration to the next, or the diameter of a search region, or something like that. Then the algorithm stops when either |Δ*x**i*| < xtol_abs*i* or when |Δ*x**i*|/|*x**i*| < xtol_rel. However, there is some variation in how the different algorithms implement **x** tolerance tests; for example, some of them check instead whether |Δ**x**|/|**x**| < xtol_rel, where |•| is some norm. - Note: generally, you can only ask for about *half* as many decimal places in the xtol as in the ftol. The reason is that, near the minimum, $\Delta f \approx f'' (\Delta x)^2 / 2$ from the [Taylor expansion](https://en.wikipedia.org/wiki/Taylor_expansion), and so (assuming $f'' \approx 1$ for simplicity) a change in *x* by 10–7 gives a change in *f* by around 10–14. In particular, this means that it is generally hopeless to request an xtol_rel much smaller than the *square root* of [machine precision](https://en.wikipedia.org/wiki/Machine_epsilon). In most cases, the fractional tolerance (tol_rel) is the most useful one to specify, because it is independent of any absolute scale factors or units. Absolute tolerance (tol_abs) is mainly useful if you think that the minimum function value or parameters might occur at or close to zero. If you don't want to use a particular tolerance termination, you can just set that tolerance to zero and it will be ignored. ### Stopping function value Another termination test that NLopt supports is that you can tell the optimization to stop when the objective function value *f*(**x**) reaches some specified value, `stopval`, for any feasible point **x**. This termination test is especially useful when [comparing algorithms](NLopt_Algorithms.md#comparing-algorithms) for a given problem. After running one algorithm for a long time to find the minimum to the desired accuracy, you can ask how many iterations algorithms require to obtain the optimum to the same accuracy or to some better accuracy. ### Bounds on function evaluations and wall-clock time Finally, one can also set a termination condition by specifying a maximum number of function evaluations (maxeval) or a maximum [wall-clock time](https://en.wikipedia.org/wiki/Wall_clock_time) (maxtime). That is, the simulation terminates when the number of function evaluations reaches maxeval, or when the total elapsed time exceeds some specified maxtime. These termination conditions are useful if you want to ensure that the algorithm gives you *some* answer in a reasonable amount of time, even if it is not absolutely optimal, and are also useful ways to control global optimization. Note that these are only rough maximums; a given algorithm may exceed the specified maximum time or number of function evaluations slightly. ### Termination tests for global optimization In general, deciding when to terminate a global optimization algorithm is a rather difficult problem, because there is no way to be certain (without special information about a particular *f*) that you have truly reached the global minimum, or even come close. You never know when there might be a much smaller value of the objective function lurking in some tiny corner of the feasible region. Because of this, the most reasonable termination criterion for global optimization problems seems to be setting bounds on the run time. That is, set an upper bound on how long you are willing to wait for an answer, and use that as the maximum run time. Another strategy is to start with a shorter run time, and repeatedly double the run time until the answer stops changing to your satisfaction. (Although there can be no guarantee that increasing the time further won't lead to a much better answer, there's not much you can do about it.) I would advise you *not* to use function-value (ftol) or parameter tolerances (xtol) in global optimization. I made a half-hearted attempt to implement these tests in the various global-optimization algorithms, but it doesn't seem like there is any really satisfactory way to go about this, and I can't claim that my choices were especially compelling. For the [MLSL](NLopt_Algorithms.md#mlsl-multi-level-single-linkage) algorithm, you need to set the ftol and xtol [parameters of the local optimization algorithm](NLopt_Reference.md#localsubsidiary-optimization-algorithm) control the tolerances of the *local* searches, *not* of the global search; you should definitely set these, lest the algorithm spend an excessive amount of time trying to run local searches to machine precision. Background and goals of NLopt ----------------------------- NLopt was started because some of the students in our group needed to use an optimization algorithm for a nonlinear problem, but it wasn't clear which algorithm would work best (or work at all). One student started by downloading one implementation from the Web, figuring out how to plug it into her Matlab program, getting it to work, only to find that it didn't converge very quickly so she needed another one, and so on... Then another student went through the same process, only his program was in C and he needed to get the algorithms to work with that language, and he obtained a different set of algorithms. It quickly became apparent that the duplication of effort was untenable, and the considerable labor required to decipher each new subroutine, figure out how to build it, figure out how to bridge the gap from one language (e.g. Fortran) to another (e.g. Matlab or C), and so on, was so substantial that it was hard to justify trying more than one or two. Even though the first two algorithms tried might converge poorly, or might be severely limited in the types of constraints they could handle, or have other limitations, effective experimentation was impractical. Instead, since I had some experience in wrapping C and Fortran routines and making them callable from C and Matlab and other languages, it made sense to put together a common wrapper interface for a few of the more promising of the free/open-source subroutines I could find online. Soon, it became clear that I wanted at least one decent algorithm in each major category (constrained/unconstrained, global/local, gradient-based/derivative-free, bound/nonlinear constraints), but there wasn't always free code available. Reading the literature turned up tantalizing hints of algorithms that were claimed to be very powerful, but again had no free code. And some algorithms had free code, but only in a language like Matlab that was impractical to use in stand-alone fashion from C. So, in addition to wrapping existing code, I began to write my own implementations of various algorithms that struck my interest or seemed to fill a need. Initially, my plan was to handle only bound constraints, and leave general nonlinear constraints to others—who needs such things? That attitude lasted until we found that we needed to solve a 10,000-dimensional minimax-type problem, which seemed intractable unless gradient-based algorithms could be brought to bear...as discussed above, this requires nonlinear constraints to make the problem differentiable. After some reading, I came across the MMA algorithm, which turned out to be easy to implement (300 lines of C), and worked beautifully (at least for my problem), so I expanded the NLopt interface to support nonlinear constraints. Overall, I've found that this has been surprisingly fun. Every once in a while, I come across a new algorithm to try, and now that I've implemented a few algorithms and built up a certain amount of infrastructure, it is relatively easy to add new ones (much more so than when I first started out). So, I expect that NLopt will continue to grow, albeit perhaps more slowly now that it seems to include decent algorithms for a wide variety of problems. stevengj-nlopt-88c424d/doc/docs/NLopt_Java_Reference.md000066400000000000000000000524331521061417600230370ustar00rootroot00000000000000--- # NLopt Java Reference --- The NLopt includes an interface callable from the [Java programming language](https://en.wikipedia.org/wiki/Java_(programming_language)). The main purpose of this section is to document the syntax and unique features of the Java API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). [TOC] Using the NLopt Java API ------------------------ To use NLopt in Java, your Java program should usually include the line: ```java import nlopt.*; ``` which imports the complete `nlopt` package, or alternatively, individual imports of every class you intend to use (which some Java IDEs will maintain automatically for you). Java also allows using the package with explicit namespacing, e.g., `nlopt.Opt opt = new nlopt.Opt(nlopt.Algorithm.LD_MMA, 2);`, but this is typically not recommended. In addition, your Java program *must* ensure that the JNI library `nloptjni` is loaded before using the `nlopt` package, because Java will otherwise be unable to find the native methods of the NLopt Java binding and throw a runtime error. This can be done with the line: ```java System.loadLibrary("nloptjni"); ``` Simple programs will typically call this at the beginning of `main`. In more complex applications, the most suitable spot is a constructor or a static initializer in the application class interfacing to NLopt. The application may also already have a wrapper around `System.loadLibrary` that sets library search paths and/or extracts libraries from JARs. In that case, that wrapper can also be used for `nloptjni`. The `nlopt.Opt` class --------------------- The NLopt API revolves around an object of type `nlopt.Opt`, analogous to (and internally wrapping) `nlopt::opt` in C++. Via methods of this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally calls the `Opt.optimize` method in order to perform the optimization. The object should normally be created via the constructor: ```java Opt opt = new Opt(algorithm, n); ``` given an `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). (Writing just `Opt` assumes that `nlopt.Opt` has been imported with `import nlopt.*;` or `import nlopt.Opt;` in the import section of the class. Otherwise, you have to write `nlopt.Opt` explicitly.) The code snippets below assume that `opt` is an instance of `nlopt.Opt`, constructed as above. Whereas the C algorithms are specified by `nlopt_algorithm` constants of the form `NLOPT_LD_MMA`, `NLOPT_LN_COBYLA`, etcetera, the Java `Algorithm` values are of the form `nlopt.Algorithm.LD_MMA`, `nlopt.Algorithm.LN_COBYLA`, etcetera (with the `NLOPT_` prefix replaced by the `nlopt.Algorithm.` enum). (Again, the `nlopt.` package can be omitted if `nlopt.Algorithm` has been imported. It is also possible to import the individual enum entries using `import static`, e.g., `import static nlopt.Algorithm.*;` or `import static nlopt.Algorithm.LD_MMA`, allowing to write, e.g., just `LD_MMA` in the code below.) There are also a copy constructor `nlopt.Opt(Opt)` to make a copy of a given object (equivalent to `nlopt_copy` in the C API). If there is an error in the constructor (or copy constructor, or assignment), a runtime exception such as `IllegalArgumentException` or `NullPointerException`, or an `OutOfMemoryError` is thrown. The algorithm and dimension parameters of the object are immutable (cannot be changed without constructing a new object), but you can query them for a given object by the methods: ```java opt.getAlgorithm() opt.getDimension() ``` You can get a string description of the algorithm via: ```java opt.getAlgorithmName() ``` Objective function ------------------ The objective function is specified by calling one of the methods: ```java opt.setMinObjective(f) opt.setMaxObjective(f) ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. The function `f` must implement the interface `nlopt.Opt.Func`, which specifies a method `double apply(double[] x, double[] gradient)`. This can be done in 3 ways: 1. explicitly, by declaring a named or anonymous class implementing the interface. (In Java versions prior to 1.8, this was the only way.) 2. as an explicit lambda, of the form ```java (x, grad) -> { if (grad != null) { ...set grad to gradient, in-place... } return ...value of f(x)...; } ``` 3. as a static method reference of the form `MyClass::f` where `MyClass` contains a method of the form: ```java private static double f(double[] x, double[] grad) { if (grad != null) { ...set grad to gradient, in-place... } return ...value of f(x)...; } ``` Note that, if the reference `MyClass::f` is within the same class `MyClass`, the method `f` can and should be `private`. Otherwise, it needs a higher visibility, e.g., `public`. Also note that `MyClass::f` is just a shortcut for the lambda `(x, grad) -> MyClass.f(x,grad)`, which is itself a shortcut for `(x, grad) -> {return MyClass.f(x,grad);}`. The return value should be the value of the function at the point `x`, where `x` is a `double[]` array of length `n` of the optimization parameters (the same as the dimension passed to the constructor). In addition, if the argument `grad` is not null, i.e. `grad != null`, then `grad` is a `double[]` array of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad[i]` should upon return contain the partial derivative $\partial f / \partial x_i$, for $0 \leq i < n$, if `grad` is non-null. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be null and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be null for some calls.) Note that `grad` must be modified *in-place* by your function `f`. Generally, this means using indexing operations `grad[...] = ...;` to overwrite the contents of `grad`, as described below. ### Assigning results in-place Your objective and constraint functions must overwrite the contents of the `grad` (gradient) argument in-place (although of course you can allocate whatever additional storage you might need, in addition to overwriting `grad`). However, typical Java assignment operations do *not* do this. For example: ```java grad = Arrays.stream(x).map(t -> 2*t).toArray(); ``` might seem like the gradient of the function `sum(x*x)`, but it will *not work* with NLopt because this expression actually allocates a *new* array to store `2*x` and re-assigns `grad` to point to it, rather than overwriting the old contents of `grad`. Instead, you should either explicitly copy the local array to `grad` using `System.arraycopy`: ```java double[] mygrad = Arrays.stream(x).map(t -> 2*t).toArray(); System.arraycopy(mygrad, 0, grad, 0, grad.length); ``` or set `grad` in place to begin with, e.g.: ```java Arrays.setAll(grad, i -> 2*x[i]); ``` or simply: ```java int n = x.length; for (int i = 0; i < n; i++) { grad[i] = 2*x[i]; } ``` Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by calling the methods: ```java opt.setLowerBounds(lb); opt.setUpperBounds(ub); ``` where `lb` and `ub` are `DoubleVector` instances of length *n* (the same as the dimension passed to the `nlopt.Opt` constructor). For convenience, these are overloaded with functions that take a single number as arguments, in order to set the lower/upper bounds for all optimization parameters to a single constant. To retrieve the values of the lower/upper bounds, you can call one of: ```java opt.getLowerBounds(); opt.getUpperBounds(); ``` both of which return `DoubleVector` instances. To specify an unbounded dimension, you can use `Double.POSITIVE_INFINITY` or `Double.NEGATIVE_INFINITY` in Java to specify $\pm\infty$, respectively. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by the methods: ```java opt.addInequalityConstraint(fc, tol); opt.addEqualityConstraint(h, tol); ``` where the arguments `fc` and `h` have the same form as the objective function above. The (optional) `tol` arguments specify a tolerance in judging feasibility for the purposes of stopping the optimization, as in C (defaulting to zero if they are omitted). To remove all of the inequality and/or equality constraints from a given problem, you can call the following methods: ```java opt.removeInequalityConstraints(); opt.removeEqualityConstraints(); ``` ### Vector-valued constraints Just as for [nonlinear constraints in C](NLopt_Reference.md#vector-valued-constraints), you can specify vector-valued nonlinear inequality and equality constraints by the methods ```java opt.addInequalityMconstraint(c, tol) opt.addEqualityMconstraint(c, tol) ``` Here, `tol` is a `DoubleVector` of the tolerances in each constraint dimension; the dimensionality *m* of the constraint is determined by `tol.size`. The constraint function `c` must implement the interface `nlopt.Opt.MFunc`, which specifies a method `double[] apply(double[] x, double[] gradient);`. It can be implemented in the same 3 ways as the `nlopt.Opt.Func` interface, but now the lambda must be of the form: ```java (x, grad) -> { if (grad != null) { ...set grad to gradient, in-place... } double[] result = new double[m]; result[0] = ...value of c_0(x)... result[1] = ...value of c_1(x)... return result; } ``` It should return a `double[]` array whose length equals the dimensionality *m* of the constraint (same as the length of `tol` above) and containing the constraint results at the point `x` (a `double[]` array whose length *n* is the same as the dimension passed to the constructor). In addition, if the argument `grad` is not null, i.e. `grad != null`, then `grad` is a `double[]` array of length `m*n` which should (upon return) be set in-place ([see above](#assigning-results-in-place)) to the Jacobian (i.e., the matrix of gradient rows, in row-major order) of the constraints with respect to the optimization parameters at `x`. That is, `grad[i*n+j]` should upon return contain the partial derivative $\partial c_i / \partial x_j$, for $0 \leq j < n$, if `grad` is non-null. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be null and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be null for some calls.) An inequality constraint corresponds to $c_i \le 0$ for $0 \le i < m$, and an equality constraint corresponds to $c_i = 0$, in both cases with tolerance `tol[i]` for purposes of termination criteria. (You can add multiple vector-valued constraints and/or scalar constraints in the same problem.) Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) For each stopping criteria, there are (at least) two methods: a `set` method to specify the stopping criterion, and a `get` method to retrieve the current value for that criterion. The meanings of each criterion are exactly the same as in the C API. ```java opt.setStopval(stopval); opt.getStopval(); ``` Stop when an objective value of at least `stopval` is found. ```java opt.setFtolRel(tol); opt.getFtolRel(); ``` Set relative tolerance on function value. ```java opt.setFtolAbs(tol); opt.getFtolAbs(); ``` Set absolute tolerance on function value. ```java opt.setXtolRel(tol); opt.getXtolRel(); ``` Set relative tolerance on optimization parameters. ```java opt.setXtolAbs(tol); opt.getXtolAbs(); ``` Set absolute tolerances on optimization parameters. The `tol` input must be a `DoubleVector` of length `n` (the dimension specified in the `nlopt.Opt` constructor); alternatively, you can pass a single number in order to set the same tolerance for all optimization parameters. `getXtolAbs()` returns the tolerances as a `DoubleVector`. ```java opt.setXWeights(w); opt.getXWeights(); ``` Set the weights used when the computing Lâ‚� norm for the `xtolRel` stopping criterion above. ```java opt.setMaxeval(maxeval); opt.getMaxeval(); ``` Stop when the number of function evaluations exceeds `maxeval`. (0 or negative for no limit.) ```java opt.setMaxtime(maxtime); opt.getMaxtime(); ``` Stop when the optimization time (in seconds) exceeds `maxtime`. (0 or negative for no limit.) ```java opt.getNumevals(); ``` Request the number of evaluations. ### Forced termination In certain cases, the caller may wish to *force* the optimization to halt, for some reason unknown to NLopt. For example, if the user presses Ctrl-C, or there is an error of some sort in the objective function. You can do this by raising *any* exception inside your objective/constraint functions: the optimization will be halted gracefully, and the same exception will be raised to the caller. See [Exceptions](#exceptions), below. The Java equivalent of `nlopt_forced_stop` from the [C API](NLopt_Reference.md#forced-termination) is to throw an `nlopt.ForcedStopException`. Algorithm-specific parameters ----------------------------- Certain NLopt optimization algorithms allow you to specify additional parameters by calling ```java opt.setParam("name", val); opt.hasParam("name"); opt.getParam("name", defaultval); opt.numParams(); opt.nthParam(n); ``` where the string `"name"` is the name of an algorithm-specific parameter and `val` is the value you are setting the parameter to. These functions are equivalent to the [C API](NLopt_Reference.md#algorithm-specific-parameters) functions of the corresponding names. Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ```java DoubleVector xopt = opt.optimize(x); ``` On input, `x` is a `DoubleVector` of length `n` (the dimension of the problem from the `nlopt.Opt` constructor) giving an initial guess for the optimization parameters. The return value `xopt` is a `DoubleVector` containing the optimized values of the optimization parameters. You can call the following methods to retrieve the optimized objective function value from the last `optimize` call, and also the return code (including negative/failure return values) from the last `optimize` call: ```java double opt_val = opt.lastOptimumValue(); Result result = opt.lastOptimizeResult(); ``` The return code (see below) is positive on success, indicating the reason for termination. On failure (negative return codes), by default, `optimize()` throws an exception (see [Exceptions](#exceptions), below). ### Return values The possible return values are the same as the [return values in the C API](NLopt_Reference.md#return-values), except that the `NLOPT_` prefix is replaced with the `nlopt.Result` enum. That is, `NLOPT_SUCCESS` becomes `Result.SUCCESS`, etcetera. Exceptions ---------- If exceptions are enabled (the default), the [Error codes (negative return values)](NLopt_Reference.md#error-codes-negative-return-values) in the C API are replaced in the Java API by thrown exceptions. The following exceptions are thrown by the various routines: ``` RuntimeException ``` Generic failure, equivalent to `NLOPT_FAILURE`. Note that, since other, more specific exceptions will typically be subclasses of `RuntimeException`, this should be caught *last*. ``` IllegalArgumentException ``` Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera), equivalent to `NLOPT_INVALID_ARGS`. ``` OutOfMemoryError ``` Ran out of memory (a memory allocation failed), equivalent to `NLOPT_OUT_OF_MEMORY`. `nlopt.RoundoffLimitedException` (subclass of `RuntimeException`) Halted because roundoff errors limited progress, equivalent to `NLOPT_ROUNDOFF_LIMITED`. `nlopt.ForcedStopException` (subclass of `RuntimeException`) Halted because of a [forced termination](#forced-termination): the user called `opt.forceStop()` from the user’s objective function or threw an `nlopt.ForcedStop` exception. Equivalent to `NLOPT_FORCED_STOP`. Whether this behavior is enabled or whether `nlopt.Opt.optimize` just returns the error code as is is controlled by the `enableExceptions` flag in `nlopt.Opt`, which can be set and retrieved with the methods below. ```java opt.setExceptionsEnabled(enable) opt.getExceptionsEnabled() ``` The default is `true`, i.e., to throw an exception. When setting `opt.setExceptionsEnabled(false)`, it is the caller's responsibility to *manually* check `opt.lastOptimizeResult()`. While that makes the `false` setting more error-prone, it has the advantage that the best point found (which can be quite good even in some error cases) can still be returned through the return value of `optimize`, so is not lost, whereas if exceptions are enabled through `opt.setExceptionsEnabled(true)`, the exception prevents the best point from being returned. If your objective/constraint functions throw *any* (runtime) exception during the execution of `opt.optimize`, it will be caught by NLopt and the optimization will be halted gracefully, and `opt.optimize` will re-throw the *same* exception to its caller. (Note that the Java compiler will not allow you to throw a checked exception from your callbacks, only a runtime exception.) For Java, the exception *will always* be rethrown, even if exceptions are otherwise disabled (`opt.setExceptionsEnabled(false)`). Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ```java opt.setLocalOptimizer(localOpt); ``` Here, `localOpt` is another `nlopt.Opt` object whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `localOpt` are ignored.) The dimension `n` of `localOpt` must match that of `opt`. This function makes a copy of the `localOpt` object, so you can freely change your original `localOpt` afterwards without affecting `opt`. Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. The Java equivalents of the C functions are the following methods: ```java opt.setInitialStep(dx); DoubleVector dx = opt.getInitialStep(x); ``` Here, `dx` is a `DoubleVector` of the (nonzero) initial steps for each dimension, or a single number if you wish to use the same initial steps for all dimensions. `opt.getInitialStep(x)` returns the initial step that will be used for a starting guess of `x` in `opt.optimize(x)`. Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by the methods: ```java opt.setPopulation(pop); opt.getPopulation(); ``` (A `pop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ```java NLopt.srand(seed); ``` where `seed` is an integer. To reset the seed based on the system time, you can call: ```java NLopt.srandTime(); ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `NLopt.srand` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can get and set the [number *M* of stored vectors](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms) for limited-memory quasi-Newton algorithms, via the methods: ```java opt.setVectorStorage(M); opt.getVectorStorage(); ``` (The default is *M*=0, in which case NLopt uses a heuristic nonzero value.) Version number -------------- To determine the version number of NLopt at runtime, you can call: ```java int major = NLopt.versionMajor(); int minor = NLopt.versionMinor(); int bugfix = NLopt.versionBugfix(); ``` For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. stevengj-nlopt-88c424d/doc/docs/NLopt_License_and_Copyright.md000066400000000000000000000035711521061417600244330ustar00rootroot00000000000000--- # NLopt License and Copyright --- The NLopt library is under the [GNU Lesser General Public License](https://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License) (LGPL), and the copyrights are owned by a variety of authors. In general, the different code in NLopt comes from different sources, and have a variety of licenses. For example, all of the *new* code we wrote for NLopt is under the [MIT License](https://en.wikipedia.org/wiki/MIT_License) (which imposes essentially no practical restrictions, and is hence compatible with the LGPL). The *combination* of all of this software is under the conjunction of the license terms, and in particular they are limited by the most restrictive of the licenses for the portions, which in this case is the LGPL. (The other portions of NLopt are under LGPL-compatible, less-restrictive licenses like the MIT license. So, if you remove the LGPL portions, which are currently code [by Ladislav Luksan](http://www.cs.cas.cz/~luksan/subroutines.html), the remainder reverts to a looser license.) New code written for NLopt, including tutorial code at [NLopt Tutorial](NLopt_Tutorial.md), is Copyright © 2007-2020 Massachusetts Institute of Technology and other authors, and comes with **no warranty**: **THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** Please [cite NLopt](Citing_NLopt.md) and the authors of the respective algorithms in any publication for which you find it useful. (This is not a legal requirement, just a polite request.) stevengj-nlopt-88c424d/doc/docs/NLopt_Matlab_Reference.md000066400000000000000000000242211521061417600233500ustar00rootroot00000000000000--- # NLopt Matlab Reference --- The NLopt includes interfaces callable from the [Matlab](https://en.wikipedia.org/wiki/MATLAB) and [GNU Octave](https://en.wikipedia.org/wiki/GNU_Octave) (a free-software Matlab-like program), using identical syntax. The main purpose of this section is to document the syntax and unique features of the Matlab API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). Using the NLopt Matlab API -------------------------- On Unix, the Matlab and Octave interfaces should automatically be installed in places where they will be found at runtime, assuming you have Matlab and Octave correctly installed on your machine, as documented in the [Installation manual](NLopt_Installation.md). On Windows, we provide a precompiled the NLopt library, which includes a `matlab` directory. Using this or your own compiled version, you can then download [`nlopt-optimize-mex.c` file](https://github.com/stevengj/nlopt/blob/master/src/octave/nlopt_optimize-mex.c), rename it to `nlopt-optimize.c`, and compile it into a [MEX file](https://en.wikipedia.org/wiki/MEX_file) callable from Matlab — the result must be put into your Matlab path or your working directory. You will also want to copy the the `.m` files (mostly implementing constants and documentation) from the `src/octave` directory of the NLopt release and put it into the same directory as the MEX file. The `opt` structure ------------------- The NLopt API revolves around an [Matlab structure](http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f2-88951.html), analogous to the `nlopt_opt` object in C and similar objects in NLopt's interfaces for other languages. All of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera) simply by assigning fields to this structure, and then one finally calls the `nlopt_optimize(opt)` function in order to perform the optimization. Every `opt` structure should specify the algorithm, via: `opt.algorithm = `*`algorithm`* given an *`algorithm`* (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). Just as in C, algorithms are specified by predefined constants of the form `NLOPT_MMA`, `NLOPT_COBYLA`, etcetera. *You need not set all the fields* of the structure; any fields that are not specified take on innocuous default values (the same as if you did not specify those parameters in the C interface). The dimension *n* of the problem (the number of optimization parameters) is determined implicitly by the length of the vector you pass to `nlopt_optimize` as the initial guess. An error will occur if you use vectors of inconsistent lengths (e.g. you set `opt.lower_bounds` to be a different length). Objective function ------------------ The objective function is specified setting either the `opt.min_objective` or `opt.max_objective` field to a [function handle](http://www.mathworks.com/access/helpdesk/help/techdoc/ref/function_handle.html) for the objective function *f*, depending on whether one wishes to minimize or maximize `f`, respectively. The function `f` should be of the form: ``` function [val, gradient] = myfunc(x) ``` `   val = `*`...value` `of` `f(x)...`* ```    if (nargout > 1) ``` `       gradient = `*`...gradient` `at` `x...`* ```    end ``` The first return value should be the value of the function at the point `x`, where `x` row or column vector of the `n` of the *n* optimization parameters (the same length as the initial guess passed to `nlopt_optimize`). (Whether `x` is a row or column vector depends on whether the initial guess you pass to `nlopt_optimize` is a row or column vector, respectively.) In addition, if the caller requests two return values (`nargout` `>` `1`), then the second return value `gradient` should be a vector (row or column) of length `n` that is the gradient of the function with respect to the optimization parameters at `x`. That is, `grad(i)` should upon return contain the partial derivative $\partial f / \partial x_i$, for $1 < i \leq n$. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `nargout` will always be 1 and the gradient need never be computed. If your objective function returns [NaN](https://en.wikipedia.org/wiki/NaN) (`nan` in Matlab), that will force the optimization to terminate, equivalent to calling [nlopt_force_stop](NLopt_Reference.md#forced-termination) in C. Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by setting `opt.lower_bounds` and/or `opt.upper_bounds` to vectors of length *n* (the same as the length of the initial guess passed to `nlopt_optimize`). To specify an unbounded dimension, you can use ±`inf` in Matlab to specify ±∞. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by setting `opt.fc` and `opt.h` to be [cell arrays](http://blogs.mathworks.com/loren/2006/06/21/cell-arrays-and-their-contents/) of function handles (of the same form as the objective function above) for the inequality and equality constraints, respectively. Recall that a cell array is specified via `{...}` in Matlab, e.g. `{` `@constraint1,` `@constraint2` `}`. Optionally, you can specify a tolerance in judging feasibility for the purposes of stopping the optimization, as in C. Tolerances are specified as fields `opt.fc_tol` and `opt.h_tol`, which (if they are set) should be vectors (not cell arrays) of tolerances, of the same lengths as `opt.fc` and `opt.h`, respectively. (If they are not specified, the tolerances default to zero.) Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) The various stopping criteria can be specified via the following fields of your structure. ``` opt.stopval ``` Stop when an objective value of at least `stopval` is found. ``` opt.ftol_rel ``` Set relative tolerance on function value. ``` opt.ftol_abs ``` Set absolute tolerance on function value. ``` opt.xtol_rel ``` Set relative tolerance on optimization parameters. ``` opt.x_weights ``` Set the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above. The `opt.x_weights` value must be a vector of length `n` (the same length as the initial guess passed to `nlopt_optimize`). ``` opt.xtol_abs ``` Set absolute tolerances on optimization parameters. The `opt.xtol_abs` value must be a vector of length `n` (the same length as the initial guess passed to `nlopt_optimize`) of the tolerances. ``` opt.maxeval ``` Stop when the number of function evaluations exceeds `maxeval`. (0 or negative for no limit.) An integer. ``` opt.maxtime ``` Stop when the optimization time (in seconds) exceeds `maxtime`. (0 or negative for no limit.) Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given structure `opt`, you can perform the optimization by calling: ``` [xopt, fmin, retcode] = nlopt_optimize(opt, x); ``` On input, `x` is a vector (row or column) of length `n` (this specifies the dimension of the problem, and must be consistent with vectors you use elsewhere as mentioned above) giving an initial guess for the optimization parameters. The return value `xopt` is a vector (row or column, same as `x`) containing the optimized values of the optimization parameters. The second return value `fmin` is the optimized value of the objective function, and the third value is a return code (negative on failure and positive on success). Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by setting the `opt.local_optimizer` field to *another* optimization structure. For example, `opt.local_optimizer.algorithm` `=` `NLOPT_LN_BOBYQA;` `opt.local_optimizer.ftol_rel` `=` `1e-4` will set the local optimizer to use BOBYQA and a relative function tolerance of `1e-4`. The fields of `opt.local_optimizer` are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `opt.local_optimizer` are ignored.) Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. In Matlab, you set the `opt.initial_step` field to a vector of the (nonzero) initial steps for each dimension. Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by setting `opt.population` to an (integer) initial population. (An `opt.population` of zero implies that the heuristic default will be used.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can set the [number *M* of stored vectors for limited-memory quasi-Newton algorithms](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms), via: ``` opt.vector_storage ``` (The default is 0, in which case NLopt uses a heuristic nonzero value.) Verbose output -------------- If you set `opt.verbose` to `1`, the Matlab interface will output information as the optimization progresses, such as the objective function values. Of course, your objective function and constraints can also output anything you wish, using `disp` and similar Matlab functions. stevengj-nlopt-88c424d/doc/docs/NLopt_Python_Reference.md000066400000000000000000000445131521061417600234370ustar00rootroot00000000000000--- # NLopt Python Reference --- The NLopt includes an interface callable from the [Python programming language](https://en.wikipedia.org/wiki/Python_(programming_language)). The main purpose of this section is to document the syntax and unique features of the Python API; for more detail on the underlying features, please refer to the C documentation in the [NLopt Reference](NLopt_Reference.md). [TOC] Using the NLopt Python API -------------------------- To use NLopt in Python, your Python program should include the lines: ```py import nlopt from numpy import * ``` which imports the `nlopt` module, and also imports the numpy ([NumPy](https://en.wikipedia.org/wiki/NumPy)) that defines the array data types used for communicating with NLopt. The `nlopt.opt` class --------------------- The NLopt API revolves around an object of type `nlopt.opt`. Via methods of this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally calls the `opt.optimize` method in order to perform the optimization. The object should normally be created via the constructor: ```py opt = nlopt.opt(algorithm, n) ``` given an `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). Whereas the C algorithms are specified by `nlopt_algorithm` constants of the form `NLOPT_LD_MMA`, `NLOPT_LN_COBYLA`, etcetera, the Python `algorithm` values are of the form `nlopt.LD_MMA`, `nlopt.LN_COBYLA`, etcetera (with the `NLOPT_` prefix replaced by the `nlopt.` namespace). There are also a copy constructor `nlopt.opt(opt)` to make a copy of a given object (equivalent to `nlopt_copy` in the C API). If there is an error in the constructor (or copy constructor, or assignment), a `MemoryError` exception is thrown. The algorithm and dimension parameters of the object are immutable (cannot be changed without constructing a new object), but you can query them for a given object by the methods: ```py opt.get_algorithm() opt.get_dimension() ``` You can get a string description of the algorithm via: ```py opt.get_algorithm_name() ``` Objective function ------------------ The objective function is specified by calling one of the methods: ```py opt.set_min_objective(f) opt.set_max_objective(f) ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. The function `f` should be of the form: ```py def f(x, grad): if grad.size > 0: ...set grad to gradient, in-place... return ...value of f(x)... ``` The return value should be the value of the function at the point `x`, where `x` is a NumPy array of length `n` of the optimization parameters (the same as the dimension passed to the constructor). In addition, if the argument `grad` is not empty, i.e. `grad.size>0`, then `grad` is a NumPy array of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad[i]` should upon return contain the partial derivative $\partial f / \partial x_i$, for $0 \leq i < n$, if `grad` is non-empty. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be empty and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be empty for some calls.) Note that `grad` must be modified *in-place* by your function `f`. Generally, this means using indexing operations `grad[...] = ...` to overwrite the contents of `grad`, as described below. ### Assigning results in-place Your objective and constraint functions must overwrite the contents of the `grad` (gradient) argument in-place (although of course you can allocate whatever additional storage you might need, in addition to overwriting `grad`). However, typical Python assignment operations do *not* do this. For example: ```py grad = 2*x ``` might seem like the gradient of the function `sum(x**2)`, but it will *not work* with NLopt because this expression actually allocates a *new* array to store `2*x` and re-assigns `grad` to point to it, rather than overwriting the old contents of `grad`. Instead, you should do: ```py grad[:] = 2*x ``` Assigning any [slice or view](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html) `grad[...]` of the array will overwrite the contents, which is what NLopt needs you to do. So, you should generally use indexing expressions `grad[...] = ...` to assign the gradient result. In specific cases, there are a few other NumPy and SciPy functions that are documented to operate in-place on their arguments, and you can also use such functions to modify `grad` if you want. If a function is not *explicitly documented to modify its arguments in-place*, however, you should assume that it does *not*. Bound constraints ----------------- The [bound constraints](NLopt_Reference.md#bound-constraints) can be specified by calling the methods: ```py opt.set_lower_bounds(lb) opt.set_upper_bounds(ub) ``` where `lb` and `ub` are arrays (NumPy arrays or Python lists) of length *n* (the same as the dimension passed to the `nlopt.opt` constructor). For convenience, these are overloaded with functions that take a single number as arguments, in order to set the lower/upper bounds for all optimization parameters to a single constant. To retrieve the values of the lower/upper bounds, you can call one of: ```py opt.get_lower_bounds() opt.get_upper_bounds() ``` both of which return NumPy arrays. To specify an unbounded dimension, you can use ±`float('inf')` (or ±`numpy.inf`) in Python to specify $\pm\infty$. Nonlinear constraints --------------------- Just as for [nonlinear constraints in C](NLopt_Reference.md#nonlinear-constraints), you can specify nonlinear inequality and equality constraints by the methods: ```py opt.add_inequality_constraint(fc, tol=0) opt.add_equality_constraint(h, tol=0) ``` where the arguments `fc` and `h` have the same form as the objective function above. The optional `tol` arguments specify a tolerance in judging feasibility for the purposes of stopping the optimization, as in C. To remove all of the inequality and/or equality constraints from a given problem, you can call the following methods: ```py opt.remove_inequality_constraints() opt.remove_equality_constraints() ``` ### Vector-valued constraints Just as for [nonlinear constraints in C](NLopt_Reference.md#vector-valued-constraints), you can specify vector-valued nonlinear inequality and equality constraints by the methods ```py opt.add_inequality_mconstraint(c, tol) opt.add_equality_mconstraint(c, tol) ``` Here, `tol` is an array (NumPy array or Python list) of the tolerances in each constraint dimension; the dimensionality *m* of the constraint is determined by `tol.size`. The constraint function `c` must be of the form: ```py def c(result, x, grad): if grad.size > 0: ...set grad to gradient, in-place... result[0] = ...value of c_0(x)... result[1] = ...value of c_1(x)... ... ``` `result` is a NumPy array whose length equals the dimensionality *m* of the constraint (same as the length of `tol` above), which upon return should be set *in-place* ([see above](#assigning-results-in-place)) to the constraint results at the point `x` (a NumPy array whose length *n* is the same as the dimension passed to the constructor). Any return value of the function is ignored. In addition, if the argument `grad` is not empty, i.e. `grad.size>0`, then `grad` is a 2d NumPy array of size *m*×*n* which should (upon return) be set in-place ([see above](#assigning-results-in-place)) to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad[i,j]` should upon return contain the partial derivative $\partial c_i / \partial x_j$ if `grad` is non-empty. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be empty and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be empty for some calls.) An inequality constraint corresponds to $c_i \le 0$ for $0 \le i < m$, and an equality constraint corresponds to $c_i = 0$, in both cases with tolerance `tol[i]` for purposes of termination criteria. (You can add multiple vector-valued constraints and/or scalar constraints in the same problem.) Stopping criteria ----------------- As explained in the [C API Reference](NLopt_Reference.md#stopping-criteria) and the [Introduction](NLopt_Introduction.md#termination-conditions)), you have multiple options for different stopping criteria that you can specify. (Unspecified stopping criteria are disabled; i.e., they have innocuous defaults.) For each stopping criteria, there are (at least) two methods: a `set` method to specify the stopping criterion, and a `get` method to retrieve the current value for that criterion. The meanings of each criterion are exactly the same as in the C API. ```py opt.set_stopval(stopval) opt.get_stopval() ``` Stop when an objective value of at least `stopval` is found. ```py opt.set_ftol_rel(tol) opt.get_ftol_rel() ``` Set relative tolerance on function value. ```py opt.set_ftol_abs(tol) opt.get_ftol_abs() ``` Set absolute tolerance on function value. ```py opt.set_xtol_rel(tol) opt.get_xtol_rel() ``` Set relative tolerance on optimization parameters. ```py opt.set_xtol_abs(tol) opt.get_xtol_abs() ``` Set absolute tolerances on optimization parameters. The `tol` input must be an array (NumPy array or Python list) of length `n` (the dimension specified in the `nlopt.opt` constructor); alternatively, you can pass a single number in order to set the same tolerance for all optimization parameters. `get_xtol_abs()` returns the tolerances as a NumPy array. ```py opt.set_x_weights(w) opt.get_x_weights() ``` Set the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above. ```py opt.set_maxeval(maxeval) opt.get_maxeval() ``` Stop when the number of function evaluations exceeds `maxeval`. (0 or negative for no limit.) ```py opt.set_maxtime(maxtime) opt.get_maxtime() ``` Stop when the optimization time (in seconds) exceeds `maxtime`. (0 or negative for no limit.) ```py opt.get_numevals() ``` Request the number of evaluations. ### Forced termination In certain cases, the caller may wish to *force* the optimization to halt, for some reason unknown to NLopt. For example, if the user presses Ctrl-C, or there is an error of some sort in the objective function. You can do this by raising *any* exception inside your objective/constraint functions:the optimization will be halted gracefully, and the same exception will be raised to the caller. See [Exceptions](#exceptions), below. The Python equivalent of `nlopt_forced_stop` from the [C API](NLopt_Reference.md#forced-termination) is to throw an `nlopt.ForcedStop` exception. Algorithm-specific parameters ----------------------------- Certain NLopt optimization algorithms allow you to specify additional parameters by calling ```py opt.set_param("name", val); opt.has_param("name"); opt.get_param("name", defaultval); opt.num_params(); opt.nth_param(n); ``` where the string `"name"` is the name of an algorithm-specific parameter and `val` is the value you are setting the parameter to. These functions are equivalent to the [C API](NLopt_Reference.md#algorithm-specific-parameters) functions of the corresponding names. Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ```py xopt = opt.optimize(x) ``` On input, `x` is an array (NumPy array or Python list) of length `n` (the dimension of the problem from the `nlopt.opt` constructor) giving an initial guess for the optimization parameters. The return value `xopt` is a NumPy array containing the optimized values of the optimization parameters. You can call the following methods to retrieve the optimized objective function value from the last `optimize` call, and also the return code (including negative/failure return values) from the last `optimize` call: ```py opt_val = opt.last_optimum_value() result = opt.last_optimize_result() ``` The return code (see below) is positive on success, indicating the reason for termination. On failure (negative return codes), by default, `optimize()` throws an exception (see [Exceptions](#exceptions), below). ### Return values The possible return values are the same as the [return values in the C API](NLopt_Reference.md#return-values), except that the `NLOPT_` prefix is replaced with the `nlopt.` namespace. That is, `NLOPT_SUCCESS` becomes `nlopt.SUCCESS`, etcetera. Exceptions ---------- If exceptions are enabled (the default), the [Error codes (negative return values)](NLopt_Reference.md#error-codes-negative-return-values) in the C API are replaced in the Python API by thrown exceptions. The following exceptions are thrown by the various routines: ``` RunTimeError ``` Generic failure, equivalent to `NLOPT_FAILURE`. ``` ValueError ``` Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera), equivalent to `NLOPT_INVALID_ARGS`. ``` MemoryError ``` Ran out of memory (a memory allocation failed), equivalent to `NLOPT_OUT_OF_MEMORY`. `nlopt.RoundoffLimited` (subclass of `Exception`) Halted because roundoff errors limited progress, equivalent to `NLOPT_ROUNDOFF_LIMITED`. `nlopt.ForcedStop` (subclass of `Exception`) Halted because of a [forced termination](#forced-termination): the user called `opt.force_stop()` from the user’s objective function or threw an `nlopt.ForcedStop` exception. Equivalent to `NLOPT_FORCED_STOP`. Whether this behavior is enabled or whether `optimize` just returns the error code as is is controlled by the `enable_exceptions` flag in `nlopt.opt`, which can be set and retrieved with the methods below. ``` opt.set_exceptions_enabled(enable) opt.get_exceptions_enabled() ``` The default is `True`, i.e., to throw an exception. When setting `opt.set_exceptions_enabled(False)`, it is the caller's responsibility to *manually* check `opt.last_optimize_result()`. While that makes the `False` setting more error-prone, it has the advantage that the best point found (which can be quite good even in some error cases) can still be returned through the return value of `optimize`, so is not lost, whereas if exceptions are enabled through `opt.set_exceptions_enabled(True)`, the exception prevents the best point from being returned. If your objective/constraint functions throw *any* exception during the execution of `opt.optimize`, it will be caught by NLopt and the optimization will be halted gracefully, and `opt.optimize` will re-throw the *same* exception to its caller. For Python, the exception *will always* be rethrown, even if exceptions are otherwise disabled (`opt.set_exceptions_enabled(False)`). Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ```py opt.set_local_optimizer(local_opt) ``` Here, `local_opt` is another `nlopt.opt` object whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `local_opt` are ignored.) The dimension `n` of `local_opt` must match that of `opt`. This function makes a copy of the `local_opt` object, so you can freely change your original `local_opt` afterwards without affecting `opt`. Initial step size ----------------- Just as in the C API, you can [get and set the initial step sizes](NLopt_Reference.md#initial-step-size) for derivative-free optimization algorithms. The Python equivalents of the C functions are the following methods: ```py opt.set_initial_step(dx) dx = opt.get_initial_step(x) ``` Here, `dx` is an array (NumPy array or Python list) of the (nonzero) initial steps for each dimension, or a single number if you wish to use the same initial steps for all dimensions. `opt.get_initial_step(x)` returns the initial step that will be used for a starting guess of `x` in `opt.optimize(x)`. Stochastic population --------------------- Just as in the C API, you can [get and set the initial population](NLopt_Reference.md#stochastic-population) for stochastic optimization algorithms, by the methods: ```py opt.set_population(pop) opt.get_population() ``` (A `pop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ```py nlopt.srand(seed) ``` where `seed` is an integer. To reset the seed based on the system time, you can call: ```py nlopt.srand_time() ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `nlopt.srand` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Just as in the C API, you can get and set the [number *M* of stored vectors](NLopt_Reference.md#vector-storage-for-limited-memory-quasi-newton-algorithms) for limited-memory quasi-Newton algorithms, via the methods: ```py opt.set_vector_storage(M) opt.get_vector_storage() ``` (The default is *M*=0, in which case NLopt uses a heuristic nonzero value.) Version number -------------- To determine the version number of NLopt at runtime, you can call: ```py nlopt.version_major() nlopt.version_minor() nlopt.version_bugfix() ``` For example, NLopt version 3.1.4 would return `major=3`, `minor=1`, and `bugfix=4`. stevengj-nlopt-88c424d/doc/docs/NLopt_R_Reference.md000066400000000000000000000010301521061417600223420ustar00rootroot00000000000000--- # NLopt R Reference --- An NLopt interface for [GNU R](https://en.wikipedia.org/wiki/GNU_R) was developed by [Jelmer Ypma](https://www.linkedin.com/in/jelmerypma/) when he was at [University College London](https://en.wikipedia.org/wiki/University_College_London) (UCL), and is currently available as a separate download (with documentation) from: - Stable: [https://CRAN.R-project.org/package=nloptr](https://CRAN.R-project.org/package=nloptr) - Development: [https://github.com/jyypma/nloptr](https://github.com/jyypma/nloptr) stevengj-nlopt-88c424d/doc/docs/NLopt_Reference.md000066400000000000000000000750721521061417600221020ustar00rootroot00000000000000--- # NLopt Reference --- NLopt is a library, not a stand-alone program—it is designed to be called from your own program in C, C++, Fortran, Matlab, GNU Octave, or other languages. This reference section describes the programming interface (API) of NLopt in the C language. Links to the reference manuals for other languages can be found in the left sidebar. The old API from versions of NLopt prior to 2.0 is deprecated, but continues to be supported for backwards compatibility. You can find it described in the [NLopt Deprecated API Reference](NLopt_Deprecated_API_Reference.md). Other sources of information include the Unix [man page](https://en.wikipedia.org/wiki/Manual_page_(Unix)): On Unix, you can run e.g. `man nlopt` for documentation of C API. In Matlab and GNU Octave, the corresponding command is to type `help nlopt_optimize`. [TOC] Compiling and linking your program to NLopt ------------------------------------------- An NLopt program in C should include the NLopt header file: ```c #include ``` For programs in compiled languages like C or Fortran, when you compile your program you will have to link it to the NLopt library. This is *in addition* to including the header file (`#include ` in C or `#include ` in C++). On Unix, you would normally link with a command something like: ```c compiler ...source/object files... -lnlopt -lm -o myprogram ``` where `compiler` is `cc`, `f77`, `g++`, or whatever is appropriate for your machine/language. *Note:* the `-lnlopt` `-lm` options, which link to the NLopt library (and the math library, which it requires), must come *after* your source/object files. In general, the rule is that if *A* depends upon *B*, then *A* must come before *B* in the link command. *Note:* the above example assumes that you have installed the NLopt library in a place where the compiler knows to find it (e.g. in a standard directory like `/usr/lib` or `/usr/local/lib`). If you installed somewhere else (e.g. in your home directory if you are not a system administrator), then you will need to use a `-L` flag to tell the compiler where to find the library. See [the installation manual](NLopt_Installation.md#changing-the-installation-directory). The `nlopt_opt` object ---------------------- The NLopt API revolves around an "object" of type `nlopt_opt` (an opaque pointer type). Via this object, all of the parameters of the optimization are specified (dimensions, algorithm, stopping criteria, constraints, objective function, etcetera), and then one finally passes this object to `nlopt_optimize` in order to perform the optimization. The object is created by calling: ```c nlopt_opt nlopt_create(nlopt_algorithm algorithm, unsigned n); ``` which returns a newly allocated `nlopt_opt` object (or NULL if there was an error, e.g. out of memory), given an `algorithm` (see [NLopt Algorithms](NLopt_Algorithms.md) for possible values) and the dimensionality of the problem (`n`, the number of optimization parameters). When you are finished with the object, you must deallocate it by calling: ```c void nlopt_destroy(nlopt_opt opt); ``` Simple assignment (`=`) makes two pointers to the same object. To make an independent copy of an object, use: ```c nlopt_opt nlopt_copy(const nlopt_opt opt); ``` The algorithm and dimension parameters of the object are immutable (cannot be changed without creating a new object), but you can query them for a given object by calling: ```c nlopt_algorithm nlopt_get_algorithm(const nlopt_opt opt); unsigned nlopt_get_dimension(const nlopt_opt opt); ``` You can get a descriptive (null-terminated) string corresponding to a particular algorithm by calling: ```c const char *nlopt_algorithm_name(nlopt_algorithm algorithm); ``` You can convert an `nlopt_algorithm` to/from a string identifier (`NLOPT_FOO` converts to/from `"FOO"`) by calling: ```c const char *nlopt_algorithm_to_string(nlopt_algorithm algorithm); nlopt_algorithm nlopt_algorithm_from_string(const char *name); ``` Objective function ------------------ The objective function is specified by calling one of: ```c nlopt_result nlopt_set_min_objective(nlopt_opt opt, nlopt_func f, void* f_data); nlopt_result nlopt_set_max_objective(nlopt_opt opt, nlopt_func f, void* f_data); ``` depending on whether one wishes to minimize or maximize the objective function `f`, respectively. The function `f` should be of the form: ```c  double f(unsigned n, const double* x, double* grad, void* f_data); ``` The return value should be the value of the function at the point `x`, where `x` points to an array of length `n` of the optimization parameters. The dimension `n` is identical to the one passed to `nlopt_create`. In addition, if the argument `grad` is not `NULL`, then `grad` points to an array of length `n` which should (upon return) be set to the gradient of the function with respect to the optimization parameters at `x`. That is, `grad[i]` should upon return contain the partial derivative $\partial f / \partial x_i$, for $0 \leq i < n$, if `grad` is non-`NULL`. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the `grad` argument will always be `NULL` and need never be computed. (For algorithms that do use gradient information, however, `grad` may still be `NULL` for some calls.) The `f_data` argument is the same as the one passed to `nlopt_set_min_objective` or `nlopt_set_max_objective`, and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from `void*` by a typecast.) Bound constraints ----------------- Most of the algorithms in NLopt are designed for minimization of functions with simple bound constraints on the inputs. That is, the input vectors `x[i]` are constrainted to lie in a hyperrectangle `lb[i]` ≤ `x[i]` ≤ `ub[i]` for 0 ≤ `i` < `n`. NLopt guarantees that your objective function and any nonlinear constraints will *never* be evaluated outside of these bounds (unlike nonlinear constraints, which may be violated at intermediate steps). These bounds are specified by passing arrays `lb` and `ub` of length `n` (the dimension of the problem, from `nlopt_create`) to one or both of the functions: ```c nlopt_result nlopt_set_lower_bounds(nlopt_opt opt, const double* lb); nlopt_result nlopt_set_upper_bounds(nlopt_opt opt, const double* ub); ``` (Note that these functions make a copy of the `lb` and `ub` arrays, so subsequent changes to the caller's `lb` and `ub` arrays have no effect on the `opt` object.) If a lower/upper bound is not set, the default is no bound (unconstrained, i.e. a bound of infinity); it is possible to have lower bounds but not upper bounds or vice versa. Alternatively, the user can call one of the above functions and explicitly pass a lower bound of `-HUGE_VAL` and/or an upper bound of `+HUGE_VAL` for some optimization parameters to make them have no lower/upper bound, respectively. (`HUGE_VAL` is the standard C constant for a floating-point infinity, found in the `math.h` header file.) It is permitted to set `lb[i]` `==` `ub[i]` in one or more dimensions; this is equivalent to fixing the corresponding `x[i]` parameter, eliminating it from the optimization. Note, however, that some of the algorithms in NLopt, in particular most of the global-optimization algorithms, do not support unconstrained optimization and will return an error in `nlopt_optimize` if you do not supply finite lower and upper bounds. For convenience, the functions `nlopt_set_*_bounds1` are supplied in order to set the lower/upper bounds for all optimization parameters to a single constant (so that you don’t have to fill an array with a constant value), along with `nlopt_set_*_bound` to set the bound for a single variable `x[i]`: ```c nlopt_result nlopt_set_lower_bounds1(nlopt_opt opt, double lb); nlopt_result nlopt_set_upper_bounds1(nlopt_opt opt, double ub); nlopt_result nlopt_set_lower_bound(nlopt_opt opt, int i, double lb); nlopt_result nlopt_set_upper_bound(nlopt_opt opt, int i, double ub); ``` The values of the lower and upper bounds can be retrieved by calling: ```c nlopt_result nlopt_get_lower_bounds(const nlopt_opt opt, double* lb); nlopt_result nlopt_get_upper_bounds(const nlopt_opt opt, double* ub); ``` where `lb` and `ub` are arrays of length `n` that, upon successful return, are set to copies of the lower and upper bounds, respectively. Nonlinear constraints --------------------- Several of the algorithms in NLopt (`MMA`, `COBYLA`, and `ORIG_DIRECT`) also support arbitrary nonlinear inequality constraints, and some additionally allow nonlinear equality constraints (`ISRES` and `AUGLAG`). For these algorithms, you can specify as many nonlinear constraints as you wish by calling the following functions multiple times. In particular, a nonlinear inequality constraint of the form $f_c(\mathbf{x}) \leq 0$, where the function $f_c$ (or `fc`) is of the same form as the objective function described above, can be specified by calling: ```c nlopt_result nlopt_add_inequality_constraint(nlopt_opt opt, nlopt_func fc, void* fc_data, double tol); ``` Just as for the objective function, `fc_data` is a pointer to arbitrary user data that will be passed through to the fc function whenever it is called. The parameter `tol` is a tolerance that is used for the purpose of stopping criteria *only*: a point $\mathbf{x}$ is considered feasible for judging whether to stop the optimization if $f_c(\mathbf{x}) \leq tol$. A tolerance of zero means that NLopt will try not to consider any $\mathbf{x}$ to be converged unless $f_c$ is strictly non-positive; generally, at least a small positive tolerance is advisable to reduce sensitivity to rounding errors. (The [return value](#return-values) is negative if there was an error, e.g. an invalid argument or an out-of-memory situation.) Similarly, a nonlinear equality constraint of the form $h(\mathbf{x}) = 0$, where the function $h$ (or `h`) is of the same form as the objective function described above, can be specified by calling: ```c nlopt_result nlopt_add_equality_constraint(nlopt_opt opt, nlopt_func h, void* h_data, double tol); ``` Just as for the objective function, `h_data` is a pointer to arbitrary user data that will be passed through to the `h` function whenever it is called. The parameter tol is a tolerance that is used for the purpose of stopping criteria *only*: a point *x* is considered feasible for judging whether to stop the optimization if |`h`(*x*)| ≤ `tol`. For equality constraints, a small positive tolerance is strongly advised in order to allow NLopt to converge even if the equality constraint is slightly nonzero. (For any algorithm listed as "derivative-free" below, the `grad` argument to `fc` or `h` will always be `NULL` and need never be computed.) To remove all of the inequality and/or equality constraints from a given problem `opt`, you can call the following functions: ```c nlopt_result nlopt_remove_inequality_constraints(nlopt_opt opt); nlopt_result nlopt_remove_equality_constraints(nlopt_opt opt); ``` ### Vector-valued constraints In some applications with multiple constraints, it is more convenient to define a single function that returns the values (and gradients) of all constraints at once. For example, different constraint functions might share computations in some way. Or, if you have a large number of constraints, you may wish to compute them in parallel. This possibility is supported by the following function, which defines multiple constraints at once, or equivalently a vector-valued constraint function $\mathbf{c}: \mathbb{R}^n \to \mathbb{R}^m$: ```c nlopt_result nlopt_add_inequality_mconstraint(nlopt_opt opt, unsigned m,                                               nlopt_mfunc c, void* c_data, const double *tol); nlopt_result nlopt_add_equality_mconstraint(nlopt_opt opt, unsigned m,                                             nlopt_mfunc c, void* c_data, const double *tol); ``` Here, `m` is the dimensionality of the constraint result and `tol` points to an array of length `m` of the tolerances in each constraint dimension (or `NULL` for zero tolerances). The constraint function must be of the form: ```c  void c(unsigned m, double *result, unsigned n, const double* x, double* grad, void* f_data); ``` This evaluates the constraint function(s) $\mathbf{c}(\mathbf{x})$ at the point `x`, an array of length `n` (the same as the dimension passed to `nlopt_create`). Upon return, the output value of the constraints should be stored in `result`, an array of length `m` (the same as the dimension passed to `nlopt_add_*_mconstraint`), so that `result[i]` stores *c**i*. In addition, if `grad` is non-`NULL`, then `grad` points to an array of length `m*n` which should, upon return, be set to the gradients of the constraint functions with respect to `x`. The `n` dimension of `grad` is stored contiguously, so that $\partial c_i / \partial x_j$ is stored in `grad[i*n` `+` `j]`. An inequality constraint corresponds to $c_i \le 0$ for $0 \le i < m$, and an equality constraint corresponds to $c_i = 0$, in both cases with tolerance `tol[i]` for purposes of termination criteria. (You can add multiple vector-valued constraints and/or scalar constraints in the same problem.) Stopping criteria ----------------- Multiple stopping criteria for the optimization are supported (see also the [Introduction](NLopt_Introduction.md#termination-conditions)), as specified by the functions to modify a given optimization problem `opt`. The optimization halts whenever any one of these criteria is satisfied. In some cases, the precise interpretation of the stopping criterion depends on the optimization algorithm above (although we have tried to make them as consistent as reasonably possible), and some algorithms do not support all of the stopping criteria. **Note:** you do not need to use *all* of the stopping criteria! In most cases, you only need one or two, and can omit the remainder (all criteria are disabled by default). For each stopping criteria, there are (at least) two functions: a `set` function to specify the stopping criterion, and a `get` function to retrieve the current value for that criterion. ```c nlopt_result nlopt_set_stopval(nlopt_opt opt, double stopval); double nlopt_get_stopval(const nlopt_opt opt); ``` Stop when an objective value of at least stopval is found: stop minimizing when an objective value ≤ `stopval` is found, or stop maximizing a value ≥ `stopval` is found. (Setting `stopval` to `-HUGE_VAL` for minimizing or `+HUGE_VAL` for maximizing disables this stopping criterion.) ```c nlopt_result nlopt_set_ftol_rel(nlopt_opt opt, double tol); double nlopt_get_ftol_rel(const nlopt_opt opt); ``` Set relative tolerance on function value: stop when an optimization step (or an estimate of the optimum) changes the objective function value by less than `tol` multiplied by the absolute value of the function value. (If there is any chance that your optimum function value is close to zero, you might want to set an absolute tolerance with `nlopt_set_ftol_abs` as well.) Criterion is disabled if `tol` is non-positive. ```c nlopt_result nlopt_set_ftol_abs(nlopt_opt opt, double tol); double nlopt_get_ftol_abs(const nlopt_opt opt); ``` Set absolute tolerance on function value: stop when an optimization step (or an estimate of the optimum) changes the function value by less than `tol`. Criterion is disabled if `tol` is non-positive. ```c nlopt_result nlopt_set_xtol_rel(nlopt_opt opt, double tol); double nlopt_get_xtol_rel(const nlopt_opt opt); ``` Set relative tolerance on optimization parameters: stop when an optimization step (or an estimate of the optimum) causes a relative change the parameters $x$ by less than `tol`, i.e. $\Vert \Delta x \Vert_w < \mbox{tol}\cdot\Vert x \Vert_w$ as measured by a weighted Lâ‚� norm $\Vert x \Vert_w = \sum_i w_i |x_i|$, where the weights $w_i$ default to 1. (If there is any chance that the optimal $\Vert x \Vert$ is close to zero, you might want to set an absolute tolerance with `nlopt_set_xtol_abs` as well.) Criterion is disabled if `tol` is non-positive. ```c nlopt_result nlopt_set_x_weights(nlopt_opt opt, const double *w); nlopt_result nlopt_set_x_weights1(nlopt_opt opt, const double w); nlopt_result nlopt_get_x_weights(const nlopt_opt opt, double *w); ``` Set/get the weights used when the computing Lâ‚� norm for the `xtol_rel` stopping criterion above, where `*w` must point to an array of length equal to the number of optimization parameters in `opt`. `nlopt_set_x_weights1` can be used to set all of the weights to the same value `w`. Also passing NULL to `nlopt_set_x_weights` allows to unset all the weights. The weights default to `1`, but non-constant weights can be used to handle situations where the different parameters `x` have different units or importance, for example. ```c nlopt_result nlopt_set_xtol_abs(nlopt_opt opt, const double *tol); nlopt_result nlopt_set_xtol_abs1(nlopt_opt opt, double tol); nlopt_result nlopt_get_xtol_abs(const nlopt_opt opt, double *tol); ``` Set absolute tolerances on optimization parameters. `tol` is a pointer to an array of length `n` (the dimension from `nlopt_create`) giving the tolerances: stop when an optimization step (or an estimate of the optimum) changes every parameter `x[i]` by less than `tol[i]`. (Note that `nlopt_set_xtol_abs` makes a copy of the `tol` array, so subsequent changes to the caller's `tol` have no effect on `opt`.) In `nlopt_get_xtol_abs`, `tol` must be an array of length `n`, which upon successful return contains a copy of the current tolerances. For convenience, the `nlopt_set_xtol_abs1` may be used to set the absolute tolerances in all `n` optimization parameters to the same value. Also passing NULL to `nlopt_set_xtol_abs` allows to unset the tolerances. Criterion is disabled if `tol` is non-positive. ```c nlopt_result nlopt_set_maxeval(nlopt_opt opt, int maxeval); int nlopt_get_maxeval(nlopt_opt opt); ``` Stop when the number of function evaluations exceeds `maxeval`. (This is not a strict maximum: the number of function evaluations may exceed maxeval slightly, depending upon the algorithm.) Criterion is disabled if `maxeval` is non-positive. ```c nlopt_result nlopt_set_maxtime(nlopt_opt opt, double maxtime); double nlopt_get_maxtime(nlopt_opt opt); ``` Stop when the optimization time (in seconds) exceeds `maxtime`. (This is not a strict maximum: the time may exceed maxtime slightly, depending upon the algorithm and on how slow your function evaluation is.) Criterion is disabled if `maxtime` is non-positive. ```c int nlopt_get_numevals(nlopt_opt opt); ``` Request the number of evaluations. ### Forced termination In certain cases, the caller may wish to *force* the optimization to halt, for some reason unknown to NLopt. For example, if the user presses Ctrl-C, or there is an error of some sort in the objective function. (This is used to implement exception handling in the NLopt wrappers for C++ and other languages.) In this case, it is possible to tell NLopt to halt the optimization gracefully, returning the best point found so far, by calling the following function from *within* your objective or constraint functions: ``` nlopt_result nlopt_force_stop(nlopt_opt opt); ``` This causes `nlopt_optimize` to halt, returning the `NLOPT_FORCED_STOP` error code (below). It has no effect if not called during `nlopt_optimize`. If you want to provide a bit more information, you can call ```c nlopt_result nlopt_set_force_stop(nlopt_opt opt, int val) ``` to set a forced-stop integer value `val`, which can be later retrieved by calling: ```c int nlopt_get_force_stop(nlopt_opt opt) ``` which returns the last force-stop value that was set since the last `nlopt_optimize`. The force-stop value is reset to zero at the beginning of `nlopt_optimize`. Passing `val=0` to `nlopt_set_force_stop` tells NLopt *not* to force a halt. Algorithm-specific parameters ----------------------------- Certain NLopt optimization algorithms allow you to specify additional parameters by calling ```c nlopt_result nlopt_set_param(nlopt_opt opt, const char *name, double val); ``` where the string `name` is the name of an algorithm-specific parameter and `val` is the value you are setting the parameter to. For example, the MMA algorithm has a parameter `"inner_maxeval"`, an upper bound on the number of "inner" iterations of the algorithm, which you can set via `nlopt_set_param(opt, "inner_maxeval", 100)`. You can also check whether a parameter is set or get the current value of a parameter with ```c int nlopt_has_param(const nlopt_opt opt, const char *name); double nlopt_get_param(const nlopt_opt opt, const char *name, double defaultval); ``` where `defaultval` is returned by `nlopt_get_param` if the parameter `name` has not been set. To inspect the list of currently set parameters, you can use: ```c unsigned nlopt_num_params(const nlopt_opt opt); const char *nlopt_nth_param(const nlopt_opt opt, unsigned n); ``` which return the number of set parameters and the name of the `n`-th set parameters (from `0` to `num_params-1`), respectively. Performing the optimization --------------------------- Once all of the desired optimization parameters have been specified in a given object `opt`, you can perform the optimization by calling: ```c nlopt_result nlopt_optimize(nlopt_opt opt, double *x, double *opt_f); ``` On input, `x` is an array of length `n` (the dimension of the problem from `nlopt_create`) giving an initial guess for the optimization parameters. On successful return, `x` contains the optimized values of the parameters, and `opt_f` contains the corresponding value of the objective function. The return value (see below) is positive on success and negative on failure. Return values ------------- Most of the NLopt functions return an enumerated constant of type `nlopt_result`, which takes on one of the following values: ### Successful termination (positive return values) ``` NLOPT_SUCCESS = 1 ``` Generic success return value. ``` NLOPT_STOPVAL_REACHED = 2 ``` Optimization stopped because `stopval` (above) was reached. ``` NLOPT_FTOL_REACHED = 3 ``` Optimization stopped because `ftol_rel` or `ftol_abs` (above) was reached. ``` NLOPT_XTOL_REACHED = 4 ``` Optimization stopped because `xtol_rel` or `xtol_abs` (above) was reached. ``` NLOPT_MAXEVAL_REACHED = 5 ``` Optimization stopped because `maxeval` (above) was reached. ``` NLOPT_MAXTIME_REACHED = 6 ``` Optimization stopped because `maxtime` (above) was reached. ### Error codes (negative return values) ``` NLOPT_FAILURE = -1 ``` Generic failure code. ``` NLOPT_INVALID_ARGS = -2 ``` Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera). ``` NLOPT_OUT_OF_MEMORY = -3 ``` Ran out of memory. ``` NLOPT_ROUNDOFF_LIMITED = -4 ``` Halted because roundoff errors limited progress. (In this case, the optimization still typically returns a useful result.) ``` NLOPT_FORCED_STOP = -5 ``` Halted because of a [forced termination](#forced-termination): the user called `nlopt_force_stop(opt)` on the optimization’s `nlopt_opt` object `opt` from the user’s objective function or constraints. A string with further details about the error is available through `nlopt_get_errmsg` if an error is set: ```c const char * nlopt_get_errmsg(nlopt_opt opt); ``` You can convert an `nlopt_result` to/from a string identifier (`NLOPT_FOO` converts to/from `"FOO"`) by calling: ```c const char *nlopt_result_to_string(nlopt_result result); nlopt_result nlopt_result_from_string(const char *name); ``` Local/subsidiary optimization algorithm --------------------------------------- Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: ```c nlopt_result nlopt_set_local_optimizer(nlopt_opt opt, const nlopt_opt local_opt); ``` Here, `local_opt` is another `nlopt_opt` object whose parameters are used to determine the local search algorithm, its stopping criteria, and other algorithm parameters. (However, the objective function, bounds, and nonlinear-constraint parameters of `local_opt` are ignored.) The dimension `n` of `local_opt` must match that of `opt`. This function makes a copy of the `local_opt` object, so you can freely destroy your original `local_opt` afterwards. Initial step size ----------------- For derivative-free local-optimization algorithms, the optimizer must somehow decide on some initial step size to perturb *x* by when it begins the optimization. This step size should be big enough that the value of the objective changes significantly, but not too big if you want to find the local optimum nearest to *x*. By default, NLopt chooses this initial step size heuristically from the bounds, tolerances, and other information, but this may not always be the best choice. You can modify the initial step size by calling: ```c nlopt_result nlopt_set_initial_step(nlopt_opt opt, const double* dx); ``` Here, `dx` is an array of length `n` (the dimension of the problem from `nlopt_create`) containing the (nonzero) initial step size for each component of the optimization parameters `x`. If you pass `NULL` for `dx`, then NLopt will use its heuristics to determine the initial step size. For convenience, if you want to set the step sizes in every direction to be the same value, you can instead call: ```c nlopt_result nlopt_set_initial_step1(nlopt_opt opt, double dx); ``` You can get the initial step size by calling: ```c nlopt_result nlopt_get_initial_step(const nlopt_opt opt, const double *x, double *dx); ``` Here, `x` is the same as the initial guess that you plan to pass to `nlopt_optimize` – if you have not set the initial step and NLopt is using its heuristics, its heuristic step size may depend on the initial *x*, which is why you must pass it here. Both `x` and `dx` are arrays of length `n` (the dimension of the problem from `nlopt_create`), where `dx` on successful return contains the initial step sizes. Stochastic population --------------------- Several of the stochastic search algorithms (e.g., `CRS`, `MLSL`, and `ISRES`) start by generating some initial "population" of random points *x*. By default, this initial population size is chosen heuristically in some algorithm-specific way, but the initial population can by changed by calling: ```c nlopt_result nlopt_set_population(nlopt_opt opt, unsigned pop); ``` (A `pop` of zero implies that the heuristic default will be used.) Pseudorandom numbers -------------------- For stochastic optimization algorithms, we use pseudorandom numbers generated by the [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_twister) algorithm, based on code from Makoto Matsumoto. By default, the [seed](https://en.wikipedia.org/wiki/Random_seed) for the random numbers is generated from the system time, so that you will get a different sequence of pseudorandom numbers each time you run your program. If you want to use a "deterministic" sequence of pseudorandom numbers, i.e. the same sequence from run to run, you can set the seed by calling: ```c void nlopt_srand(unsigned long seed); ``` Some of the algorithms also support using low-discrepancy sequences (LDS), sometimes known as quasi-random numbers. NLopt uses the Sobol LDS, which is implemented for up to 1111 dimensions. To reset the seed based on the system time, you can call: ```c void nlopt_srand_time(void); ``` (Normally, you don't need to call this as it is called automatically. However, it might be useful if you want to "re-randomize" the pseudorandom numbers after calling `nlopt_srand` to set a deterministic seed.) Vector storage for limited-memory quasi-Newton algorithms --------------------------------------------------------- Some of the NLopt algorithms are limited-memory "quasi-Newton" algorithms, which "remember" the gradients from a finite number *M* of the previous optimization steps in order to construct an approximate 2nd derivative matrix. The bigger *M* is, the more storage the algorithms require, but on the other hand they *may* converge faster for larger *M*. By default, NLopt chooses a heuristic value of *M*, but this can be changed/retrieved by calling: ```c nlopt_result nlopt_set_vector_storage(nlopt_opt opt, unsigned M); unsigned nlopt_get_vector_storage(const nlopt_opt opt); ``` Passing *M*=0 (the default) tells NLopt to use a heuristic value. By default, NLopt currently sets *M* to 10 or at most 10 [MiB](W:Mebibyte.md) worth of vectors, whichever is larger. Preconditioning with approximate Hessians ----------------------------------------- If you know the Hessian (second-derivative) matrix of your objective function, i.e. the matrix *H* with $H_{ij} = \frac{\partial^2 f}{\partial x_i \partial x_j}$ for an objective *f*, then in principle this could be used to accelerate local optimization. In fact, even a reasonable *approximation* for *H* could be useful if it captures information about the largest eigenvalues of *H* and the corresponding eigenvectors. Such an approximate Hessian is often called a *preconditioner* in the context of iterative solvers, so we adopt that terminology here. Currently, support for preconditioners in NLopt is somewhat experimental, and is only used in the `NLOPT_LD_CCSAQ` algorithm. You specify a preconditioned objective function by calling one of: ```c nlopt_result nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data); nlopt_result nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data); ``` which are identical to `nlopt_set_min_objective` and `nlopt_set_max_objective`, respectively, except that they additionally specify a preconditioner `pre`, which is a function of the form: ```c void pre(unsigned n, const double *x, const double *v, double *vpre, void *f_data); ``` This function should take a vector *v* and should compute *vpre = H(x) v* where *H* is an approximate second derivative at *x*. The CCSAQ algorithm **requires** that your matrix *H* be [positive semidefinite](https://en.wikipedia.org/wiki/Positive-definite_matrix#Positive-semidefinite), i.e. that it be real-symmetric with nonnegative eigenvalues. Version number -------------- To determine the version number of NLopt at runtime, you can call: ```c void nlopt_version(int *major, int *minor, int *bugfix); ``` For example, NLopt version 3.1.4 would return `*major=3`, `*minor=1`, and `*bugfix=4`. stevengj-nlopt-88c424d/doc/docs/NLopt_Tutorial.md000066400000000000000000001020431521061417600217740ustar00rootroot00000000000000--- # NLopt Tutorial --- In this tutorial, we illustrate the usage of NLopt in various languages via one or two trivial examples. Example nonlinearly constrained problem --------------------------------------- ![right|thumb|400px|Feasible region for a simple example optimization problem with two nonlinear (cubic) constraints.](images/NLopt-example-constraints.png) As a first example, we'll look at the following simple nonlinearly constrained minimization problem: $$\min_{\mathbf{x}\in\mathbb{R}^2} \sqrt{x_2}$$ subject to $x_2 \geq 0$, $x_2 \geq (a_1 x_1 + b_1)^3$, and $x_2 \geq (a_2 x_1 + b_2)^3$ for parameters *a*1=2, *b*1=0, *a*2=-1, *b*2=1. The feasible region defined by these constraints is plotted at right: *x*2 is constrained to lie above the maximum of two cubics, and the optimum point is located at the intersection (1/3, 8/27) where the objective function takes on the value $\sqrt{8/27} \approx 0.5443310539518\ldots$. (This problem is especially trivial, because by formulating it in terms of the cube root of *x*2 you can turn it into a linear-programming problem, but we won't do that here.) In principle, we don't need the bound constraint *x*2≥0, since the nonlinear constraints already imply a positive-*x*2 feasible region. However, NLopt doesn't guarantee that, on the way to finding the optimum, it won't violate the nonlinear constraints at some intermediate steps, while it *does* guarantee that all intermediate steps will satisfy the bound constraints. So, we will explicitly impose *x*2≥0 in order to ensure that the √*x*2 in our objective is real. **Note:** The objective function here is not differentiable at *x*2=0. This doesn't cause problems in the examples below, but may cause problems with some other algorithms if they try to evaluate the gradient at *x*2=0 (e.g. I've seen it cause AUGLAG with a gradient-based solver to fail). To prevent this, you might want to use a small nonzero lower bound instead, e.g. *x*2≥10−6. Example in C/C++ ---------------- To implement the above example in C or C++, we would first do: ```c #include  #include  ``` to include the NLopt header file as well as the standard math header file (needed for things like the `sqrt` function and the `HUGE_VAL` constant), then we would define our objective function as: ```c double myfunc(unsigned n, const double *x, double *grad, void *my_func_data) {     if (grad) {         grad[0] = 0.0;         grad[1] = 0.5 / sqrt(x[1]);     }     return sqrt(x[1]); } ``` There are several things to notice here. First, since this is C, our indices are zero-based, so we have `x[0]` and `x[1]` instead of *x*1 and *x*2. The return value of our function is the objective $\sqrt{x_2}$. Also, if the parameter `grad` is not `NULL`, then we set `grad[0]` and `grad[1]` to the partial derivatives of our objective with respect to `x[0]` and `x[1]`. The gradient is only needed for [gradient-based algorithms](NLopt_Introduction.md#gradient-based-versus-derivative-free-algorithms); if you use a derivative-free optimization algorithm, `grad` will always be `NULL` and you need never compute any derivatives. Finally, we have an extra parameter `my_func_data` that can be used to pass additional data to `myfunc`, but no additional data is needed here so that parameter is unused. For the constraints, on the other hand, we *will* have additional data. Each constraint is parameterized by two numbers *a* and *b*, so we will declare a data structure to hold this information: ```c typedef struct {     double a, b; } my_constraint_data; ``` Then, we implement our constraint function as follows. ```c double myconstraint(unsigned n, const double *x, double *grad, void *data) {     my_constraint_data *d = (my_constraint_data *) data;     double a = d->a, b = d->b;     if (grad) {         grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);         grad[1] = -1.0;     }     return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);  } ``` The form of the constraint function is the same as that of the objective function. Here, the `data` parameter will actually be a pointer to `my_constraint_data` (because this is the type that we will pass to `nlopt_minimize_constrained` below), so we use a typecast to get the constraint data. NLopt always expects constraints to be of the form `myconstraint`(**x**) ≤ 0, so we implement the constraint *x*2 ≥ (*a* *x*1 + *b*)3 as the function (*a* *x*1 + *b*)3 − *x*2. Again, we only compute the gradient if `grad` is non-`NULL`, which will never occur if we use a derivative-free optimization algorithm. Now, to specify this optimization problem, we create an "object" of type `nlopt_opt` (an opaque pointer type) and set its various parameters: ```c double lb[2] = { -HUGE_VAL, 0 }; /* lower bounds */ nlopt_opt opt; ``` ```c opt = nlopt_create(NLOPT_LD_MMA, 2); /* algorithm and dimensionality */ nlopt_set_lower_bounds(opt, lb); nlopt_set_min_objective(opt, myfunc, NULL); ``` Note that we do not need to set an upper bound (`nlopt_set_upper_bounds`), since we are happy with the default upper bounds (+∞). To add the two inequality constraints, we do: ```c my_constraint_data data[2] = { {2,0}, {-1,1} }; ``` ```c nlopt_add_inequality_constraint(opt, myconstraint, &data[0], 1e-8); nlopt_add_inequality_constraint(opt, myconstraint, &data[1], 1e-8); ``` Here, the `1e-8` is an optional tolerance for the constraint: for purposes of convergence testing, a point will be considered feasible if the constraint is violated (is positive) by that tolerance (10−8). A nonzero tolerance is a good idea for many algorithms lest tiny errors prevent convergence. Speaking of convergence tests, we should also set one or more stopping criteria, e.g. a relative tolerance on the optimization parameters **x**: ```c nlopt_set_xtol_rel(opt, 1e-4); ``` There are many more possible parameters that you can set to control the optimization, which are described in detail by the [reference manual](NLopt_Reference.md), but these are enough for our example here (any unspecified parameters are set to innocuous defaults). At this point, we can call nlopt_optimize to actually perform the optimization, starting with some initial guess: ```c double x[2] = { 1.234, 5.678 };  /* `*`some` `initial` `guess`*` */ double minf; /* `*`the` `minimum` `objective` `value,` `upon` `return`*` */ if (nlopt_optimize(opt, x, &minf) < 0) {     printf("nlopt failed!\n"); } else {     printf("found minimum at f(%g,%g) = %0.10g\n", x[0], x[1], minf); } ``` `nlopt_optimize` will return a negative result code on failure, but this usually only happens if you pass invalid parameters, it runs out of memory, or something like that. (Actually, most of the other NLopt functions also return an error code that you can check if you are paranoid.) (However, if it returns the failure code `NLOPT_ROUNDOFF_LIMITED`, indicating a breakdown due to roundoff errors, the minimum found may still be useful and you may want to still use it.) Otherwise, we print out the minimum function value and the corresponding parameters **x**. Finally, we should call nlopt_destroy to dispose of the `nlopt_opt` object when we are done with it: ```c nlopt_destroy(opt); ``` Assuming we save this in a file tutorial.c, we would compile and link (on Unix) with: ``` cc tutorial.c -o tutorial -lnlopt -lm ``` The result of running the program should then be something like: ``` found minimum at f(0.333334,0.296296) = 0.544330847 ``` That is, it found the correct parameters to about 5 significant digits and the correct minimum function value to about 6 significant digits. (This is better than we specified; this often occurs because the local optimization routines usually try to be conservative in estimating the error.) ### Number of evaluations Let's modify our program to print out the number of function evaluations that were required to obtain this result. First, we'll change our objective function to: ```c int count = 0; double myfunc(int n, const double *x, double *grad, void *my_func_data) {     ++count;     if (grad) {         grad[0] = 0.0;         grad[1] = 0.5 / sqrt(x[1]);     }     return sqrt(x[1]); } ``` using a global variable `count` that is incremented for each function evaluation. (We could also pass a pointer to a counter variable as `my_func_data`, if we wanted to avoid global variables.) Then, adding a `printf`: ```c printf("found minimum after %d evaluations\n", count); ``` we obtain: ``` found minimum after 11 evaluations found minimum at f(0.333334,0.296296) = 0.544330847 ``` For such a simple problem, a gradient-based local optimization algorithm like MMA can converge very quickly! ### Switching to a derivative-free algorithm We can also try a derivative-free algorithm. Looking at the [NLopt Algorithms](NLopt_Algorithms.md) list, another algorithm in NLopt that handles nonlinear constraints is COBYLA, which is derivative-free. To use it, we just change `NLOPT_LD_MMA` ("LD" means local optimization, derivative/gradient-based) into `NLOPT_LN_COBYLA` ("LN" means local optimization, no derivatives), and obtain: ``` found minimum after 31 evaluations found minimum at f(0.333329,0.2962) = 0.544242301 ``` In such a low-dimensional problem, derivative-free algorithms usually work quite well—in this case, it only triples the number of function evaluations. However, the comparison is not perfect because, for the same relative **x** tolerance of 10−4, COBYLA is a bit less conservative and only finds the solution to 3 significant digits. To do a fairer comparison of the two algorithms, we could set the **x** tolerance to zero and ask how many function evaluations each one requires to get the correct answer to three decimal places. We can specify this by using the `stopval` termination criterion, which allows us to halt the process as soon as a feasible point attains an objective function value less than `stopval`. In this case, we would set `stopval` to $\sqrt(8/27)+10^{-3}$, replacing `nlopt_set_xtol_rel` with the statement: ```c nlopt_set_stopval(opt, sqrt(8./27.)+1e-3); ``` corresponding to the last line of arguments to `nlopt_minimize_constrained` being `sqrt(8./27.)+1e-3,` `0.0,` `0.0,` `0.0,` `NULL,` `0,` `0.0`. If we do this, we find that COBYLA requires 25 evaluations while MMA requires 10. The advantage of gradient-based algorithms over derivative-free algorithms typically grows for higher-dimensional problems. On the other hand, derivative-free algorithms are much easier to use because you don't need to worry about how to compute the gradient (which might be tricky if the function is very complicated). Example in C++ -------------- Although it is perfectly possible to use the C interface from C++, many C++ programmers will find it more natural to use real C++ objects instead of opaque `nlopt_opt` pointers, `std::vector` instead of arrays, and exceptions instead of error codes. NLopt provides a C++ header file `nlopt.hpp` that you can use for this purpose, which simply wraps a C++ object interface around the C interface above. ```cpp #include #include #include #include  ``` The equivalent of the above example would then be: ```cpp nlopt::opt opt(nlopt::LD_MMA, 2); std::vector lb(2); lb[0] = -HUGE_VAL; lb[1] = 0; opt.set_lower_bounds(lb); opt.set_min_objective(myfunc, NULL); my_constraint_data data[2] = { {2,0}, {-1,1} }; opt.add_inequality_constraint(myconstraint, &data[0], 1e-8); opt.add_inequality_constraint(myconstraint, &data[1], 1e-8); opt.set_xtol_rel(1e-4); std::vector x(2); x[0] = 1.234; x[1] = 5.678; double minf; try{ nlopt::result result = opt.optimize(x, minf); std::cout << "found minimum at f(" << x[0] << "," << x[1] << ") = " << std::setprecision(10) << minf << std::endl; } catch(std::exception &e) { std::cout << "nlopt failed: " << e.what() << std::endl; } ``` There is no need to deallocate the `opt` object; its destructor will do that for you once it goes out of scope. Also, there is no longer any need to check for error codes; the NLopt C++ functions will throw exceptions if there is an error, which you can `catch` normally. Here, we are using the same objective and constraint functions as in C, taking `double*` array arguments. Alternatively, you can define objective and constraint functions to take `std::vector` arguments if you prefer. (Using `std::vector` in the objective/constraint imposes a slight overhead because NLopt must copy the `double*` data to a `std::vector`, but this overhead is unlikely to be significant in most real applications.) That is, you would do: ```cpp double myvfunc(const std::vector &x, std::vector &grad, void *my_func_data) {     if (!grad.empty()) {         grad[0] = 0.0;         grad[1] = 0.5 / sqrt(x[1]);     }     return sqrt(x[1]); } ``` ```cpp double myvconstraint(const std::vector &x, std::vector &grad, void *data) {     my_constraint_data *d = reinterpret_cast(data);     double a = d->a, b = d->b;     if (!grad.empty()) {         grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);         grad[1] = -1.0;     }     return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]); } ``` Notice that, instead of checking whether `grad` is `NULL`, we check whether it is empty. (The vector arguments, if non-empty, are guaranteed to be of the same size as the dimension of the problem that you specified.) We then specify these in the same way as before: ```cpp opt.set_min_objective(myvfunc, NULL); opt.add_inequality_constraint(myvconstraint, &data[0], 1e-8); opt.add_inequality_constraint(myvconstraint, &data[1], 1e-8); ``` Note that the data pointers passed to these functions must remain valid (or rather, what they point to must remain valid) until you are done with `opt`. (It might have been nicer to use `shared_ptr`, but I don't like to rely on bleeding-edge language features.) Instead of passing a separate data pointer, some users may wish to define a C++ [function object](https://en.wikipedia.org/wiki/Function_object) class that contains all of the data needed by their function, with an overloaded `operator()` method to implement the function call. You can easily do this with a two-line helper function. If your function class is MyFunction, then you could define a static member function: ```cpp static double wrap(const std::vector`` &x, std::vector`` &grad, void *data) {     return (*reinterpret_cast``(data))(x, grad); } ``` which you would then use e.g. by `opt.set_min_objective(MyFunction::wrap, &some_MyFunction)`. Again, you have to make sure that `some_MyFunction` does not go out of scope before you are done calling `nlopt::opt::optimize`. To link your program, just link to the C NLopt library (`-lnlopt` `-lm` on Unix). Example in Matlab or GNU Octave ------------------------------- To implement this objective function in Matlab (or GNU Octave), we would write a file myfunc.m that looks like: ```matlab function [val, gradient] = myfunc(x)     val = sqrt(x(2));     if (nargout > 1)         gradient = [0, 0.5 / val];     end ``` Notice that we check the Matlab builtin variable `nargout` (the number of output arguments) to decide whether to compute the gradient. If we use a derivative-free optimization algorithm below, then `nargout` will always be 1 and the gradient need never be computed. Our constraint function looks similar, except that it is parameterized by the coefficients *a* and *b*. We can just add these on as extra parameters, in a file `myconstraint.m`: ```matlab function [val, gradient] = myconstraint(x,a,b)     val = (a*x(1) + b)^3 - x(2);     if (nargout > 1)         gradient = [3*a*(a*x(1) + b)^2, -1];     end ``` The equivalent of the `nlopt_opt` is just a [structure](http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f2-88951.html), with fields corresponding to any parameters that we want to set. (Any structure fields that we don't include are equivalent to not setting those parameters, and using the defaults instead). You can get more information on the available parameters by typing `help` `nlopt_optimize` in Matlab. The equivalent of the C example above is to define an `opt` structure by: ```matlab opt.algorithm = NLOPT_LD_MMA opt.lower_bounds = [-inf, 0] opt.min_objective = @myfunc opt.fc = { (@(x) myconstraint(x,2,0)), (@(x) myconstraint(x,-1,1)) } opt.fc_tol = [1e-8, 1e-8]; opt.xtol_rel = 1e-4 ``` We do not need to specify the dimension of the problem; this is implicitly specified by the size of the initial-guess vector passed to `nlopt_optimize` below (and must match the sizes of other vectors like `opt.lower_bounds`). The inequality constraints are specified as a [cell array](http://blogs.mathworks.com/loren/2006/06/21/cell-arrays-and-their-contents/) `opt.fc` of function handles (and the corresponding tolerances are in an array `opt.fc_tol`); notice how we use `@(x)` to define an anonymous/inline function in order to pass additional arguments to `myconstraint`. Finally, we call `nlopt_optimize`: ```matlab [xopt, fmin, retcode] = nlopt_optimize(opt, [1.234 5.678]) ``` `nlopt_optimize` returns three things: `xopt`, the optimal parameters found; `fmin`, the corresponding value of the objective function, and a return code `retcode` (positive on success and negative on failure). The output of the above command is: ``` xopt =  0.3333  0.2963 fmin = 0.5443 retcode = 4 ``` (The [return code](NLopt_Reference.md#return-values) `4` corresponds to `NLOPT_XTOL_REACHED`, which means it converged to the specified *x* tolerance.) To switch to a derivative-free algorithm like COBYLA, we just change `opt.algorithm` parameter: ```matlab opt.algorithm = NLOPT_LN_COBYLA ``` ### Matlab verbose output It is often useful to print out some status message to see what is happening, especially if your function evaluation is much slower or if a large number of evaluations are required (e.g. for global optimization). You can, of course, modify your function to print out whatever you want. As a shortcut, however, you can set a verbose option in NLopt's Matlab interface by: ```matlab opt.verbose = 1; ``` If we do this, then running the MMA algorithm as above yields: ```matlab nlopt_minimize_constrained eval #1: 2.38286 nlopt_minimize_constrained eval #2: 2.35613 nlopt_minimize_constrained eval #3: 2.24586 nlopt_minimize_constrained eval #4: 2.0191 nlopt_minimize_constrained eval #5: 1.74093 nlopt_minimize_constrained eval #6: 1.40421 nlopt_minimize_constrained eval #7: 1.0223 nlopt_minimize_constrained eval #8: 0.685203 nlopt_minimize_constrained eval #9: 0.552985 nlopt_minimize_constrained eval #10: 0.544354 nlopt_minimize_constrained eval #11: 0.544331 ``` This shows the objective function values at each intermediate step of the optimization. As in the C example above, it converges in 11 steps. The COBYLA algorithm requires a few more iterations, because it doesn't exploit the gradient information: ```matlab nlopt_optimize eval #1: 2.38286 nlopt_optimize eval #2: 2.38286 nlopt_optimize eval #3: 3.15222 nlopt_optimize eval #4: 1.20627 nlopt_optimize eval #5: 0.499441 nlopt_optimize eval #6: 0.709216 nlopt_optimize eval #7: 0.20341 nlopt_optimize eval #8: 0.745201 nlopt_optimize eval #9: 0.989693 nlopt_optimize eval #10: 0.324679 nlopt_optimize eval #11: 0.804318 nlopt_optimize eval #12: 0.541431 nlopt_optimize eval #13: 0.561137 nlopt_optimize eval #14: 0.531346 nlopt_optimize eval #15: 0.515784 nlopt_optimize eval #16: 0.541724 nlopt_optimize eval #17: 0.541422 nlopt_optimize eval #18: 0.541504 nlopt_optimize eval #19: 0.541499 nlopt_optimize eval #20: 0.541514 nlopt_optimize eval #21: 0.541352 nlopt_optimize eval #22: 0.542089 nlopt_optimize eval #23: 0.542575 nlopt_optimize eval #24: 0.543027 nlopt_optimize eval #25: 0.544911 nlopt_optimize eval #26: 0.541793 nlopt_optimize eval #27: 0.545225 nlopt_optimize eval #28: 0.544331 nlopt_optimize eval #29: 0.544256 nlopt_optimize eval #30: 0.544242 nlopt_optimize eval #31: 0.544116 ``` Notice that some of the objective function values are below the minimum of 0.54433 — these are simply values of the objective function at infeasible points (violating the nonlinear constraints). Example in Python ----------------- The same example in Python is: ```python import nlopt from numpy import * def myfunc(x, grad):     if grad.size > 0:         grad[0] = 0.0         grad[1] = 0.5 / sqrt(x[1])     return sqrt(x[1]) def myconstraint(x, grad, a, b):     if grad.size > 0:         grad[0] = 3 * a * (a*x[0] + b)**2         grad[1] = -1.0     return (a*x[0] + b)**3 - x[1] opt = nlopt.opt(nlopt.LD_MMA, 2) opt.set_lower_bounds([-float('inf'), 0]) opt.set_min_objective(myfunc) opt.add_inequality_constraint(lambda x,grad: myconstraint(x,grad,2,0), 1e-8) opt.add_inequality_constraint(lambda x,grad: myconstraint(x,grad,-1,1), 1e-8) opt.set_xtol_rel(1e-4) x = opt.optimize([1.234, 5.678]) minf = opt.last_optimum_value() print("optimum at ", x[0], x[1]) print("minimum value = ", minf) print("result code = ", opt.last_optimize_result()) ``` Notice that the `optimize` method returns only the location of the optimum (as a NumPy array), and that the value of the optimum and the result code are obtained by `last_optimum_value` and `last_optimize_result` values. Like in C++, the NLopt functions raise exceptions on errors, so we don't need to check return codes to look for errors. The objective and constraint functions take NumPy arrays as arguments; if the `grad` argument is non-empty it must be modified *in-place* to the value of the gradient. Notice how we use Python's `lambda` construct to pass additional parameters to the constraints. Alternatively, we could define the objective/constraints as classes with a `__call__(self,` `x,` `grad)` method so that they can behave like functions. The result of running the above code should be: ```python optimum at  0.333333331366 0.296296292697 minimum value =  0.544331050646 result =  4 ``` finding the same correct optimum as in the C interface (of course). (The [return code](NLopt_Reference.md#return-values) `4` corresponds to `nlopt.XTOL_REACHED`, which means it converged to the specified *x* tolerance.) ### Important: Modifying `grad` in-place The grad argument of your objective/constraint functions must be modified *in-place*. If you use an operation like ```python grad = 2*x ``` however, Python allocates a new array to hold `2*x` and reassigns grad to point to it, rather than modifying the original contents of grad. **This will not work.** Instead, you should do: ```python grad[:] = 2*x ``` which *overwrites* the old contents of grad with `2*x`. See also the [NLopt Python Reference](NLopt_Python_Reference.md#assigning-results-in-place). Example in GNU Guile (Scheme) ----------------------------- In [GNU Guile](https://en.wikipedia.org/wiki/GNU_Guile), which is an implementation of the [Scheme programming language](https://en.wikipedia.org/wiki/Scheme_(programming_language)), the equivalent of the example above would be: ```guile (use-modules (nlopt)) (define (myfunc x grad)   (if grad       (begin         (vector-set! grad 0 0.0)         (vector-set! grad 1 (/ 0.5 (sqrt (vector-ref x 1))))))   (sqrt (vector-ref x 1))) (define (myconstraint x grad a b)   (let ((x0 (vector-ref x 0)) (x1 (vector-ref x 1)))     (if grad         (begin           (vector-set! grad 0 (* 3 a (expt (+ (* a x0) b) 2)))           (vector-set! grad 1 -1.0)))     (- (expt (+ (* a x0) b) 3) x1))) (define opt (new-nlopt-opt NLOPT-LD-MMA 2)) (nlopt-opt-set-lower-bounds opt (vector (- (inf)) 0)) (nlopt-opt-set-min-objective opt myfunc) (nlopt-opt-add-inequality-constraint opt (lambda (x grad)                                            (myconstraint x grad 2 0))                                      1e-8) (nlopt-opt-add-inequality-constraint opt (lambda (x grad)                                            (myconstraint x grad -1 1))                                      1e-8) (nlopt-opt-set-xtol-rel opt 1e-4) (define x (nlopt-opt-optimize opt (vector 1.234 5.678))) (define minf (nlopt-opt-last-optimum-value opt)) (define result (nlopt-opt-last-optimize-result opt)) ``` Note that the objective/constraint functions take two arguments, `x` and `grad`, and return a number. `x` is a vector whose length is the dimension of the problem; grad is either false (`#f`) if it is not needed, or a `vector` that must be modified *in-place* to the gradient of the function. On error conditions, the NLopt functions throw [exceptions](http://www.gnu.org/software/guile/manual/html_node/Exceptions.html) that can be caught by your Scheme code if you wish. The heavy use of side-effects here is a bit unnatural in Scheme, but is used in order to closely map to the C++ interface. (Notice that `nlopt::` C++ functions map to `nlopt-` Guile functions, and `nlopt::opt::` methods map to `nlopt-opt-` functions that take the `opt` object as the first argument.) Of course, you are free to wrap your own Scheme-like functional interface around this if you wish. Example in Java --------------- In Java (1.8 or later), the equivalent of the example above would be: ```java import nlopt.*; public class t_java { private static double myfunc(double[] x, double[] grad) { if (grad != null) { grad[0] = 0.0; grad[1] = 0.5 / Math.sqrt(x[1]); } return Math.sqrt(x[1]); } private static double myconstraint(double[] x, double[] grad, double a, double b) { if (grad != null) { grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b); grad[1] = -1.0; } return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]); } public static void main(String[] args) { System.loadLibrary("nloptjni"); Opt opt = new Opt(Algorithm.LD_MMA, 2); opt.setLowerBounds(new DoubleVector(Double.NEGATIVE_INFINITY, 0.)); opt.setMinObjective(t_java::myfunc); opt.addInequalityConstraint((x, grad) -> myconstraint(x, grad, 2, 0), 1e-8); opt.addInequalityConstraint((x, grad) -> myconstraint(x, grad, -1, 1), 1e-8); opt.setXtolRel(1e-4); DoubleVector x = opt.optimize(new DoubleVector(1.234, 5.678)); double minf = opt.lastOptimumValue(); System.out.println("optimum at " + x); System.out.println("minimum value: " + minf); System.out.println("result code: " + opt.lastOptimizeResult()); } } ``` Note that the objective/constraint functions take two arguments, `x` and `grad`, and return a number. `x` is a vector whose length is the dimension of the problem; grad is either `null` if it is not needed, or a `DoubleVector` that must be modified *in-place* to the gradient of the function. Also note that the above example uses lambdas, both in the explicit `(x, grad) -> ` notation and using the `::` operator, so it will compile as is only with Java 1.8 or later. The Java binding supports Java 1.5 or later, but if you wish to support versions 1.5 to 1.7, you cannot use lambdas. Instead, for Java prior to 1.8, you would have to explicitly declare the anonymous classes implementing the interfaces, leading to less readable code. On error conditions, the NLopt functions throw Java runtime exceptions (unchecked exceptions) that can be caught by your Java code if you wish. Note that the class and method names are renamed to camel case as usual in Java: upper camel case for classes, lower camel case for methods. The exception classes additionally have `Exception` appended to their names. The `nlopt` C++ namespace maps to the `nlopt` Java package, global `nlopt::` C++ functions map to static methods of the `nlopt.NLopt` class, methods of classes (e.g., `nlopt::opt`) map to the methods of the corresponding Java class (e.g., `nlopt.Opt`), and `std::vector` maps to `nlopt.DoubleVector`. Example in Fortran ------------------ In [Fortran](https://en.wikipedia.org/wiki/Fortran), the equivalent of the C example above would be as follows. First, we would write our functions as: ```fortran      subroutine myfunc(val, n, x, grad, need_gradient, f_data)      double precision val, x(n), grad(n)      integer n, need_gradient      if (need_gradient.ne.0) then         grad(1) = 0.0         grad(2) = 0.5 / dsqrt(x(2))      endif      val = dsqrt(x(2))      end ``` ```fortran      subroutine myconstraint(val, n, x, grad, need_gradient, d)      integer need_gradient      double precision val, x(n), grad(n), d(2), a, b      a = d(1)      b = d(2)      if (need_gradient.ne.0) then         grad(1) = 3. * a * (a*x(1) + b)**2         grad(2) = -1.0      endif      val = (a*x(1) + b)**3 - x(2)      end ``` Notice that that the "functions" are actually subroutines. This is because it turns out to be hard to call Fortran functions from C or vice versa in any remotely portable way. Therefore: - In the NLopt Fortran interface, all C functions become subroutines in Fortran, with the return value becoming the first argument. So, here the first argument `val` is used for the return value. Also, because there is no way in Fortran to pass `NULL` for the `grad` argument, we add an additional `need_gradient` argument which is nonzero if the gradient needs to be computed. Finally, the last argument is the equivalent of the `void*` argument in the C API, and can be used to pass a single argument of any type through to the objective/constraint functions: here, we use it in `myconstraint` to pass an array of two values for the constants *a* and *b*. Then, to run the optimization, we can use the following Fortran program: ```fortran      program main      external myfunc, myconstraint      double precision lb(2)      integer*8 opt      double precision d1(2), d2(2)      double precision x(2), minf      integer ires      include 'nlopt.f'            call nlo_create(opt, NLOPT_LD_MMA, 2)      call nlo_get_lower_bounds(ires, opt, lb)      lb(2) = 0.0      call nlo_set_lower_bounds(ires, opt, lb)      call nlo_set_min_objective(ires, opt, myfunc, 0)            d1(1) = 2.      d1(2) = 0.      call nlo_add_inequality_constraint(ires, opt,      $     myconstraint, d1, 1.D-8)      d2(1) = -1.      d2(2) = 1.      call nlo_add_inequality_constraint(ires, opt,     $     myconstraint, d2, 1.D-8)            call nlo_set_xtol_rel(ires, opt, 1.D-4)            x(1) = 1.234      x(2) = 5.678      call nlo_optimize(ires, opt, x, minf)      if (ires.lt.0) then         write(*,*) 'nlopt failed!'      else         write(*,*) 'found min at ', x(1), x(2)         write(*,*) 'min val = ', minf      endif            call nlo_destroy(opt)            end ``` There are a few things to note here: - All `nlopt_` functions are converted into `nlo_` subroutines, with return values converted into the first argument. - The "`nlopt_opt`" variable `opt` is declared as `integer*8`. (Technically, we could use any type that is big enough to hold a pointer on all platforms; `integer*8` is big enough for pointers on both 32-bit and 64-bit machines.) - The subroutines must be declared as `external`. - We `include` `'nlopt.f'` in order to get the various constants like `NLOPT_LD_MMA`. There is no standard Fortran 77 equivalent of C's `HUGE_VAL` constant, so instead we just call `nlo_get_lower_bounds` to get the default lower bounds (-∞) and then change one of them. In Fortran 90 (and supported as an extension in many Fortran 77 compilers), there is a `huge` intrinsic function that we could have used instead: ```fortran      lb(1) = -huge(lb(1)) ``` Example in Julia ---------------- The same example in the [Julia programming language](https://en.wikipedia.org/wiki/Julia_(programming_language)) can be found at the [NLopt.jl](https://github.com/stevengj/NLopt.jl) web page. stevengj-nlopt-88c424d/doc/docs/NLopt_manual.md000066400000000000000000000014501521061417600214460ustar00rootroot00000000000000--- # NLopt manual --- Welcome to the manual for [NLopt](index.md), our nonlinear optimization library. The manual is divided into a the following sections: - [NLopt Introduction](NLopt_Introduction.md) — overview of the library and the problems that it solves - [NLopt Installation](NLopt_Installation.md) — installation instructions - [NLopt Tutorial](NLopt_Tutorial.md) — some simple examples in C, Fortran, and Octave/Matlab - [NLopt Reference](NLopt_Reference.md) — reference manual, listing the NLopt API functions - [NLopt Algorithms](NLopt_Algorithms.md) — the optimization algorithms available in NLopt (including literature citations and links to original source code, where available) - [NLopt License and Copyright](NLopt_License_and_Copyright.md) — legal information stevengj-nlopt-88c424d/doc/docs/NLopt_on_Windows.md000066400000000000000000000061541521061417600223250ustar00rootroot00000000000000--- # NLopt on Windows --- NLopt on Windows ---------------- NLopt works fine on Microsoft Windows computers, and you can compile it directly using the included [CMake](https://en.wikipedia.org/wiki/CMake) build scripts. To simplify installation, there are also precompiled 32-bit and 64-bit Windows [DLLs](https://en.wikipedia.org/wiki/Dynamic-link_library) (along with binaries for many other systems) at [NLoptBuilder/releases](https://github.com/stevengj/NLoptBuilder/releases). In particular, the Windows builds are - [NLopt.v2.6.2.i686-w64-mingw32.tar.gz](https://github.com/stevengj/NLoptBuilder/releases/download/v2.6.2/NLopt.v2.6.2.i686-w64-mingw32.tar.gz) (32-bit) - [NLopt.v2.6.2.x86_64-w64-mingw32.tar.gz](https://github.com/stevengj/NLoptBuilder/releases/download/v2.6.2/NLopt.v2.6.2.x86_64-w64-mingw32.tar.gz) (64-bit) These `.tar.gz` files unpack (with a variety of Windows software, e.g. 7-zip) into a folder with a `bin` subdirectory that contains `libnlopt.dll`. To link with this in your compiler, you will typically also want the [import library](https://stackoverflow.com/questions/3573475/how-does-the-import-library-work-details) for the DLL, which can be found in the `lib` subdirectory and is called `libnlopt.dll.a` (this can be used similarly to the `.lib` files you may be used to). See, in particular, [these instructions for nlopt](https://www.mathworks.com/matlabcentral/answers/380072-mex-error-undefined-reference#answer_356517). If you need a step-by-step guide on how to install NLopt and run the [tutorial](https://nlopt.readthedocs.io/en/latest/NLopt_Tutorial/) you might be interested in [this blog post](https://medium.com/@gabrielr.domingos/installing-nlopt-on-windows-and-using-it-with-c-3e84d91c8960). Unofficial Python binaries for Windows are available from Christoph Gohike: - [Python binaries for 64-bit Windows](http://www.lfd.uci.edu/~gohlke/pythonlibs/#nlopt) ### NLopt with MinGW If you want to compile NLopt on Windows with [MinGW](https://www.mingw-w64.org/), be sure to install the MinGW version of `cmake` (e.g. with `pacman -S mingw-w64-x86_64-cmake`) and then build via `cmake -G"MSYS Makefiles" . && make` in order to ensure that `cmake` produces the correct type of makefile. ### Octave plugin To build the NLopt plugin for [GNU Octave](https://en.wikipedia.org/wiki/GNU_Octave) (a free Matlab clone, which uses the [same NLopt interface as in Matlab](NLopt_Matlab_Reference.md)), you will need the following additional steps. (See [Octave for Windows](https://wiki.octave.org/Octave_for_Microsoft_Windows) on the Octave web page to download Octave.) 1. First, download the `.dll` and import library (`.dll.a`) from above. 2. Download [`nlopt_optimize-oct.cc`](https://github.com/stevengj/nlopt/raw/master/src/octave/nlopt_optimize-oct.cc) and put it in the same directory as the `.dll` and `.dll.a` files. 3. Compile the Octave plugin (`.oct` file) with `mkoctfile -lnlopt --output nlopt_optimize.oct nlopt_optimize-oct.cc` (`mkoctfile` is a program included with Octave). 4. Finally, move `libnlopt.dll` to the *octave*``bin` directory (the location of `octave.exe`) so that Octave can find it. stevengj-nlopt-88c424d/doc/docs/images/000077500000000000000000000000001521061417600200005ustar00rootroot00000000000000stevengj-nlopt-88c424d/doc/docs/images/NLopt-example-constraints.png000066400000000000000000000312231521061417600255410ustar00rootroot00000000000000‰PNG  IHDR°„>_­ pHYsgŸÒRtIMEØ 6ÒyÓ÷"tEXtCreation Time13-Nov-2008 16:26:53¢B‘å$tEXtSoftwareMATLAB, The Mathworks, Inc.ºÄRÏ IDATxœíÝQv›È@Qx+£�æ?4y¼bš (¨ª»÷ê�´mYHŽ"Žom×u ñüïî à‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@PîÞ6iÛvü¿]×ݵ%@5L Ð×`×uCNú`‡Ö¬)gCøM~LC"Þ°M@-L‚„A B€ CX€ñƒŸŽ*ø– ,ƒËN§³d (AX€÷‹L¸!pœ%£YÛwB¹@•ÄËéþܽ$ñz½îÞ8Íãù4ôHÁ’јÙãùü1ðHCæk¡÷ÌÊ€ã!@P‚ÈW¿^ôñxܽ!u„x_;º|–Q€-!@P‚0_³W¢oÛÖÉEÅzÑtaÖº_Í¿)8|*æ‚©¹0}äp:B _Ö‹&%€Y/zA” 2e½hj‚ÈŽõ¢×„@ŽŒ/ ‚„@^¬½Œ ²c½è5!@P‚Ȉõ¢W„@^¬½Œ J%€\<žÏ¦ëîÞŠ@!@P‚ (AdÁzÑë B€ !@P‚¸Ÿõ¢·„A B€ !p3ëEï"‚„A BàNÖ‹ÞH%‚„Àm¬½— J%‚„À=@x;A” J7°^4‚ (A” ®f½h&!@P‚ (A\ÊzÑ|B€ !@P‚¸Žõ¢Y„A B€ !pëEs#‚„A Bà Ö‹fH%€äŒó$‚„A B -ëE³%‚„A B !ëEsöçî `IÛ¶Ë_Ðyi{™ækµ sƃ™3!,ÀìP. ¬}ZÚ× õ¢À–ŒæKïP4ëEó'‚„¥2?r aaœK€"X/ZB€ a‘¬ gƃ¥°d´$Ö‹P1»»×„@–×ÁÉÅ,Îd½hAL ãèAà,&„Å0"Î%€ÓX/ZA” J–¡?€ÐeÈ™õ¢Å„A¹ìDÌ€Ó™'°^´D‚ (A” ޲^´P‚ (A” ±^´\‚ (A” ö³^´h‚ (A” v²^´t‚ (A” ö°^´‚ (A” ¾f½h!@P‚ (A|ÇzÑjB€ !@P‚ø‚õ¢5„A B€ !°•õ¢•„A B€ !°‰õ¢õ„A B€ !°ÎzÑ* B€ !°Âx°V‚ (A” –X/Z1A” JY/Z7A” Jó¬­ž J%€Ö‹F ‚„À”ñ`‚ (A” þa½h‚ (AüÇx0A” JY/� JMc<ÒŸ»7€ï´m;þßÎ+ØKcœ‚:8N–¡¯A@"Ö‹Æä¨A ¬MŽ€ŒÃ2!J–ÁzQàt–Œæk²^ÔYFHÁzÑÈLËжm×uC¶mëðBà ÂŒç�ýŸÕ §0 N©ëº~Hhí(Õ0ö¸ž ²°<í�‹)8†‚²^A” JÀjiNg½(� ÌÙÂ1µ}":Å(p„ €pŒé¹ìD†‘ å£ÀYaÖ†E¡}5h±(pœ ,ƒà,Ö‹2p !@P‚ (A�X/ʘ J@ƃLB€ !@P‚B°^”w‚ (A” €úY/Ê,A” €Êò‰ J% fÖ‹²@% Zƃ,„A B¨“ñ «!@P‚ (A²^”-!@P‚jc<ÈF‚ (AU1d;A” €zòA” J@%¬å[‚ (A50dA” €â²� J% lÖ‹²› J@ÁŒ9B%‚„P*ëE9H% Hƃ'‚„A B(�õ¢œB% 0ƃœE% $ƃœH%‚„P ëE9— J@Œ9� J% Ö‹’Ÿ»7€MÚ¶�ýxç`/‚©A€ ŒIÄ„°mÛj?àt&„A™fíÓ¡ƒÄa½(é˜%Ëж­i!@@ƃ$eÉhI†&tŽà8A˜µqø�'„ýŸe!p„ ,FŸŽBÏçsò‘×ëuË–ì3ÞþÙ-ï¿`÷ƒ¾YOKR«Ï9P(ëEIMfœ…®Oõ™¤Îð¿Ïç³ô½ü÷ʽòæÁðãz‚ u¾†µ/íÞ DǃËÓ¹˜‚³ŒÉ`8΄ _“…£¥¨r™9Ï9Ô'àx�[B€,,TŸ}} KF‚2!Ì×Âeè]‡ bÖ‹rB€ aÆ'ØmÛÖùv*f<È•,ÍW×uCûM"ÐbQ¨Ã§ÉL>>{R™ÙÛ®ž~æÓ=.ßðýV¯×«ÿàê¶m9#Îì÷_½Õ·ßóø·�\(rùº‘»7àøÏèÛ¿¿~üeß~²%³&ü nŸö°¿Ýõ>ò|>n»°[¿pÃÙ[ÍF˾Ëc|úV»c÷ó³}ó&Ÿ|Û#ð™ãÛŽ¿rÇ%I>}óÙ¶ßøÛŠáƒš P–Œ@.¬åb­T}Ú¶õ›Z(ÎÆ á§…š«7ÿ´¾qᆠK"·¯–\ÞÔfn6ûÙ¯¾ùŽçgÕò,nò(ömÀÆU¸³ßdã_€¯þnÌÞõò Ñ»'´­x9Ÿ%£5/ ¼`ýÞp áÁo2û¿Ç¿ó§û:ñùùö;¬nÀjp.ݪ�ß|ù.f?~Êß` ¹ž (Ãòg£Ý9q×ägû]Ÿòül´cΖƒl7 € B€ÂìÈ|;’zÿâO½Ó:Ý>°º}Æ6nÌø9w†¸‹ñ ·pR€ L sÖÅôšµYÜû%NÙ€Ônß¼Û7(‘ñ w1!du»ev­iV«"ë0>§ÎûÓë  AÅpÉgÈ”…˜½ºýøy6{„Zr#AP˜}v䢽ׯã“Ôí›td&M¸c¢ _„pãAî%j3™Pí^Ûùé†WŽªRÜWÎ#ÄÉHpv*û•ñÍ·_‚b÷ÝPAP†�{öß^]p÷Æì»á»/´xúósñì>Èó¸Û#Â2äv.;P¤Ù�¬(8¾æxÿç÷qâû÷¼edtÖÕ5¾z~NôíL.ïqîF?èåon6� ¸ß{•-ì²Ï&Üø ÞoÒ¼õÆ–ÍXØžSÎ{9‰“É÷}ÏÏϹÎÚ€ÓëŽ7lò½²“�1ãAr`É(@Pmç×ÕiÛÖ/z¡«n-/þÜø•[n²¼¾qã´jááüâã_¿û_Åoï÷Èl?�oËÁŠÿò¬~çÝÏ Ð3Ü¡mÅËù<§„…ÚÑ„@¡á‚0ÇÀý6Èçt P5H>C” !Üé”S¶À>&„PëE¡Ö‹’AYx>Ÿ¯i–ÀYœ¨§BÎ2 Pœ-Ó?ÿ¶CŒ�p–ÑL‚rR¸ßòÕÞÍ¡ƃdH@.„³d’3$O‚ (A” €´¬%[‚ (A ’3A” €TŒÉœ J@ƃäO%à|ƃA%‚„p2ëE)… JÀ™Œ)ˆ JÀiŒ)‹ JÀ9Œ)Ž JÀ Œ)‘ JÀQƃJ%àãAÊ%‚„°Ÿñ E„A BØÉx�Ò B€ !ìa÷3 ¨Œñ 4&„ Æs¿¾ €š˜Nõí7 ¿®ëú�TÀxz‚ð ã,¼{[ØI Â@~Mu„S[ŽÔ„…2„1A8o5öœ](� œÑ+¸zþMPãA˜pÙ‰�¶¯(‘ !!Â;A” œrîP€ú¬(A¸1óÔ @}Ô |%·Pƒ@(�‚p¡÷V¯0@¡ŒaA  l>4¡b „ý5ÇÃÀÉ`°¿ý=@ƃ°,Ê…éûÒzï}*8|JAšj€jª(AØGàìÉcÔ S” lރÃN1 PãAØ"PŽ��œdaqø|>îÞ€Û¨AØ(ÊIe³ Dëv]Ó¶�¦i^¯Ÿ»·ÈT  áêU%*;˜°ëš®3*Â1„íá•5aÓhBࣶ¾¢m§?Ö~%¬å£@õŒ+ö¾—Ëq&„!X> ¼„�hB nƃð-A‹&j¥aAŽ&z‚0"MTÆxö„AiB@Æ¥ €:Ân‚04M”N ‚0:Ma B4!P*ãA8HÒ4š(�„ãþܽä¢ëš¶}4Mózýܽ-ÀLùO×e0„S˜2eTA˜–¡ýuÍÝu]ózýy2„³´�×RÆ>àòO­mOû±¶­9!�5Ö‰{¹ ,-Àð÷~èÃË^ –�@Å,ÍW_}ãð»å7"Î4äÃxÎ%ÙD·Sƒp:AÈVš*#óõ¾@t8†ð®£i5!pãAHÁIeŠÑ×àí'Vrš¨† aÆç½ìj„Ÿ8Í p1ãAHD–arºÑÛ›°±|ÊçÚŽ…§à§ŸÝr.žûwåz 5ãÁ8VÇâåtŽ!¬Óe/•þ�BMÀqË;±9¬’«�%£…™¬Í�µ£@:ƃ�” äšHA Bj‚�shB(Ž“Ê©m—~pËŸMª_×í�Bà8ãA&nÜË­˜ a¾Ú_ï¼k“V¹D!Dr>Md<ׄF‚ÃòŸ•kBÈŸ Ì׸úú•¢Ý¯·j;Mìc<—q\f…²:ÜÖif€¯¨A>Éj/·&„¤å43�-‘]¡<wbT¬2dAž{¹¥3!ä"]×¼^?F…À'j®'¹Îãñ°|òaêZ¡ü‡é–�ƃ¬Ê/·D&„ÜÀ™f ‚�ÛhB g<w1u­PYÃtËG 85ÈFeíå–„�›Y> w„dA@Lƃp/S× •;L·|BQƒ|¥Ü½Üœ™’ËGàJ‚�ìhBˆÀxr É‘&€º©AÈÄŸ»7æu]Ó¶�Æ!…�Œ !ùrH!TÉxò!É�&€š¨AÈŠ ¤šRp)� Õz…W)€ÒrD­{¹÷2!¤)€¢©AÈ� ¤0šÎ")�&€âBž,íP�ÕÕ)€R¨ANd/÷b&„”Ê!…p� ¤lš2g<93u­PÀaºå£�'5ȉîå^À„�X> ;Bê¡  +ƃ�?S× ¦[> 9Pƒœ.ø^n"&„ÔÆòQØHdWÈïNzF…pãAR°—›‚ !Õ2*€[¨A(ÈŸ»7Ò꺦m�Q!¼1!¤~F…pãA(‹e¸²ºúG@Rj0º~g«iý5°—›‚ !�@:j0´¶ý¯›æŸ?“7ÇŽ£ �S<ŸÏáϯ×ëÆ-ÈÂð뀾ÛÖ/Š`BHD]×¼^?F…pãÁÐ&íçoBQ!A=ËGàjÊeÉ(¡Y> pÔä×ý’Q¿#(„õTÈù—vh[M{ò�”5h/7KF¡igfŒOÌRƒüc8¹¨³Œ–Ã’QøËòQøŠdªÿûà,£E1!„ÿ¸P!00Øirý ò&aJÀªpãÁÉ…×'ÿWœÕ�ßñ¸BýÝ(œ%£0ÃòQÎx–E¬Áf.r>%b)OΰýÃRÏÙGÚu?UÊãâNÔS!ç_:‘³�B&&…öz½¶|ýðeo¾Ü�“[�¿xöN¶aãf¬~ÍûF.lØò}¥ÛHê¦ÿùxóï�sƒüŸ¢Éö/|pü©í�+ÁéFíå¦à9­�—ʹ4!Üh�Ù´[ ¡þ >eÞBƼßï½|Ú¼¯¶a¡EWóuKß.$_Ò�¤J9áBÆœò�·×Ñ8 s{–&¾}hËŸšýⳟ{¹)X2 +,€AŽ58vîTjùÀ¹œŸ‡U«Ç.äÜû§ÞŸö�¥ŒJdWÈïNéÿe“…p™÷ÕŒ“O­~vò5Û×R®ßšµ%£Ë ;W·ä«u›ßN¯ÜH*SF ŽoêŽZ“r\y¢Õ¥¡³Ÿj><öÙÕ³ ¾½Üœe¶rQ ¸ÒÆÃùžÏçò:Æq¥¼~�µ‘ÛMîô}V¿àEl$7ʽ›ß·êÁÁs~:üêQÏ>Š-íS{çžÉöùá�%£ð+HáJ$ÇóùLz/[¾ùíeUÄFÂV“‹à¥˜V•^;‹ñ«ƒKN3!„¯ £BÓBHayè7X]ܸñ¶À_�?]�ïÊKö�çT»ïî”ÎÉáÙ8‹ð«Ž „�¬  ˆ=‹E'‹‡?�ÿpMZìËÂãy6yø™<'*¥`YcÉ(b)u;çÐÁaña²Ó�¬ß{Ò ¬oɤ۟ 1!„£Œ `Þîs–”nû�ðl�7B8‡Q!õ9óÌ¢Içr[î}�z<¸ñ,�R�<˜ÂiŒ ¨É958¹Äõ4>nðöCõÎ}6ÞÏUóét5�´†Ë™ÂÉŒ ¨À™³Á®»§F®™ NînõŽîz6àB8ŸQ!1¾vüÆëI¹Œ„KPÀ¥®i¡ë§‚ûNsðÙèÚä¿ÕOÁ¿LËÐþþ{Ñy1—è’úöÚƒgݶ#éœ9l®½>ÁÅSÁñ�n¼»‚ƃv;c0!ÌZûká#ą̈v Úf\½íì=¾'gMFvïŸ]½ù–»XØÎ…­ÝþRl$¥H5\˜’åly;·¬«œ}੟�¯®…ø~׫Ûsë�Ï^n žÓ| е­&„„f+XvQ 6ÿ¦TÎ{, åsV 6 ž�}g¸é¿~Kì Âê8†0_þºWÌQ…d%ᡃ“ä&)5{øÜŽäøö<([¾ó§ î8çÊ‘gcõS;No39Ïé÷BÞ!Üã÷_`Y@�>ÃrH¼ÒêM.0‰±Û³ïÙo@R雸 ae†,Ô„Ü%Éu&v{ mŽ%ÚþOCÂËä`ùümá ‚îg)wɨßÃïö¶á®+CLí»W&[Î&K²}<¸påz£ÅîÞ¸– ‚Kˆì¬-ŸVôÓïHüî¤JF…œ¢¤ñ`ÛymüË^n &„P£BŽ+©�Kˆì|m9¯® a@F…ìSX ±©×ð„ü²—›‚ç4_«Aøégç¥�,à+j°`ž“_örSðœVÈK%×¥`‹âk0øñ„‚ð—½Ü<§òR Ũ€e…Õà'E<„Dá/{¹)8© ”m8ÙŒóÍ@)žÏçÝ›@ ÅÔಠÂmû÷¿Ùÿ…“ü¹{€ôo”mû0* T1«o�'„K˜ºVÈ0=2+H¡ÏçóõzݽÔ¯’ñ ü²—›‚ !Te6² 65l!¡B² 85l$¡Z² &5lç,£P¹á4¤woðŸ×ëå\£$¢�¯˜B]gTP?5|KBV�ÔM ;BˆE0p)� ¹B �rÑÂáèDy ßr5BNdæ„SƒÀ&„À£ÂíS¾Iûé@€[¨Aà Aü劅p1W#ä 5gÉ(ð��+H'Ÿí3Òœ ,‚˜úöÒjàzƃÀ),æm\A:|�µ¦°ƒU£ì£�³B`ÉêÉf^¯ŸÉ¹FHJ '„ÀŠ-ç Õ„×PƒÀ¹!lÕ¶MÛÞ½§ZxDïŸZÍBǤ¦�Ó Bؤ¯£šÞ…—ãö÷¼23ÿöŠ…À2‡²‘Rp–QXWY nœsvÝß9áûÿö4¤¤�DL©DŸ.)–tVYƒΧ9áðÙ×ëg2-Ô‡§Sƒ@:&„ÔæÜ~«ì Áfï3ó>'ü}ž]×üüüXA �ˆ’j;ÿÄT§mãþXßσrÊ7¬òéž«ÕG7û$Ln>~æ a‡çóùz½îÞ ²£a,ò^n:&„Te's®”ñà5Õ:öG¾ßû0-”…©AàŽ!¤Bý™0‡÷Ðú.‘‰áy°ñDÈIDATï®<�áL¤÷m@ñÔ p BR™½bÁûÇ“¾Ù�ïq÷m÷Aw sð›_l~+£B€=Ô pËp+”ÕêêÙÕn90oœ4[îzû!vß~“Óþ¾oøÕ<òlô·•…°Êa„ôÔ |’Õ^n5L¹ÈpÚ]§i™L ¯ÏÑ{þ�\´`;5\L’ÖìjÃ8ïtÁþ˜,X¥�뙺V(·aúd­æõÓ¹ÙÍØþõ·ö‚‡Ÿù’ÑOßMÂ;«F#Sƒ°*·½Ü:˜’ÜxJvK ~›‚ç:÷á/œÜeöSyþ›iZ0¡�»B®°ï4•Ç¥KÁOgö^îzø™“…=5ÜHrµk†„÷N|ø³·-úD5²N ÷² ·B®®¾òâ{g¥à‰GÍ¥~øÅC¸z/Ê�ÈFŠ„¯d¸—[�ÿݽDñ~!¾Óµí?Ý’Õ?<ü ô?µ×ëçù|<Ÿ�»7 -5ä@’ÜÂÅÙÝKVo¯×<üš<YTO ™„\axËKúÞwn ¦øV¥¿õ_¹ý²¨˜òan…²Z]={xÛ5¤w|;¯yø©�!¼ýçõóóÓ7¡c Âa„uSƒ°[V{¹Õp–QZ •».R�œþxÍjþ?…~ZØ8)P>5äF’ʧ«±OŸ›­‘#©o�ÊÛò��\?ðÈÃ_ýÔÄW»³�hËŒ1‡YM „¤òé-où­ð½—Vor�3´}|�‰ì^YšY”H y² ·BE¯®þ4O»ñ]¥g]Gñ,™4ù'ýæÉBêã0ÂʨA8EÑ{¹Ù2!$##‹6ÏÒoÃeÚýŽ¿®¸¯U™×`óï´°Q†@–Ô �3—�€uYEÚeò¯Á�+ÚÙRƒ@æL]+TÙ0=Ÿ,¹rKnÔ·oÀn®QA5¬­€„sU¶—› KFa«Pÿþ”û`ûkTÈBàvj(‚ $kåΩ¸—,nôx>›Æ»PÇÕê³°ëÇ—y<Ÿ?¯—Jan…ªY]y<ù±§ãÇa„űL’ªf/7+–Œ’5/yNäŠö@Rj(‘ $SÑ®ñÀed!�‚ %É‘“¤æŠöÀ‰Ô P.Ëp+Túêj5Øx.çðB²å0Âü©A¸Lé{¹y2!$/ŸB¨m½Û’�u¤À>j(� $#Ãqƒ ä²øŠ* )C�7ÜI ÿäágÂá…À*—žªan…¬®†9¼�Û9Œ07ƒp{¹)˜–Äk®g`Œ©A 2‚°­ãêà>ÃîŸ# !25ÔG@ B> !,5TÉÄbôY¸åçee)\Ɔ\Ãa„·Sƒ�{¹)˜ìçJ�*&Ž’…P15ÔÍÔµ–ŒB†c~•!ç²jôz.6¹±—›‚ !À™œ�ê`0!’p>R(—â„ BqÔ Še¸ÅøêÂ…Ïú‰Ã�aÈ#¼€„{­^Û®ìéLëä¥yš eÙp ÈÁòNìj.²ƒ ¸�2„¬ a B€;)C¸—Á ÜÿîÞš¦iºîïÏçãù|ܽ9äèõz=ûzá$�çóçõRƒ@d&„y_¯Â´Òé—‰úí œ È‘,„t,B€|¹º=œÎùcÆ\‡°_]‡Ð�ª4>Û¶8 ËÕ�PƒP4{¹)˜fíýZ+ã�x=@4Ëþççg8ñŒ2„-,˜%³&ù€Y�ÇÃõ*`;ƒA€OL]+d˜1õ daV�~E B5ìå¦`BP '&… ËDV B€ªÈBè l!*äz§6² ·BVWÃù‰•a5Fø‰e¢P1{¹)˜ÔÏ)I‰@ ì Q†ÔÊQ€}!@Dïe؈CÊd0p„e¸²ºØáçççù46,‰Ã¥ Dc/7Bš¦i�‡¥ÄQ€SB¦”!938‘ à#eHn Îen…¬®ÒqIì„:ŒÐ`°—›‚ !_pzRna0�ˆ `�açÜéIIÊ` )S× ¦w± ôzu¯5Æìå¦`BÀiœ„†³ \Cp>eÈnRàJ‚€„œ„†í¤ Àõ,í�ÕÕ@æ†C qx†O‡tx¡¶°—›‚ !W¿››&òì+{Rà^‚€;‰Ã°úüy½�Çê�ˆ  ®mx–ÌǃãÔ‚÷² ·BVW5qÀáØ–Ã‡ÌðBSAà{¹)˜�5kJÇ^¯Wß{ÆÞ2SA€< BŠ!Ÿ²0ÏÅ¢�ç³ÿáIA€ÜBŠ6‡!aó–…Ö “ˆdÎ2Ü Y] „çl4[ÚïÞe¥R8�½ÜL¨ÇãñvB� ³" "²+äw'UžªtuHxý„P IÙËMÁsZ!/€ã8l ïÃå&¼2¥ p{¹)X2 @,“}‰ZW–^Vƒ.-P4‘]!¿;اĕ¥Ÿ†„¡.f/7Ïi…¼TŽ+(g›0iJAàörS°df »q.e±Å8µ @Dv…üî ‘ldžïCÂÓ'„NÜÎ^n žÓ y©\ ·8œ4á‰A(�LØËMÁ’QØc¼O2>Ui“GžB TOdWÈïNîu×¥‡!áññ 2d/7Ïi…¼T²reöM¸;úSï#@~ìå¦`É(¤5Ù{¯/Ídq©KdWÈïNJ1öVâóùÜ8!Ô�@Yìå¦à9­�— @ÑRT☠e/7Ïi…¼TêsÊ�ˆNÍ^n žÓ y©Tï«>4ê`/7Ïi…¼T¢÷á8��šØËMÁsZ!/€È&ÃCo@5ìå¦à²P‹¶mš¦kþ©@}ÀA…šo®öÞ®‚8ó T"@X‚Ê´Ø�ŸÌ~­JK@9Æév^±­V¢8¨• €ìí4¾«Ùb#Ê' Wwtà¬O÷ÿ)n@V!d&›\µ°�ŽK(‚ €<”Ó�[l9{M l‚îìÌ-®��A× � ¶_cáë8B@bJ~ãÛã·Ü€O!œM¦±üD-ì à0˜£E€aÚßÊ:ï]·s(`9Œ>„èk°�ÀþÏmÛjB€‹|Êÿ×bßhÑϨƒ ÌÚ0òoÈBMp>—Aà_»—¡îûž×„Äfå'»ìþËbêdEæë}<8èºÎ�àk€dÀÔÈŠ  "Î&IÉRL�|[ A@i,¹ƒí>�êîï TC�ó8ϾWÌîõ«Ë¼|!7‚€”Ì& L‰^…):Ó?p„ `'»Î�⟄DÃÌ}ü›Gqa�ÚÏÿ4:1)!dµwPÿt¹Êêß'ï?GÖIõQ뇨…÷Ÿ¤ôv ‚8‰%…¥„À7œî "‚°mÛN–€."G9Ý?@‚0_]×-‡ŸÙÏ Aõ›m?Õ€ „:�#Pûð� ÌZ¿(´mÛá0Âa©õ¢4Í畟þz°� ,@0áøxB5‘•ŸœM–Aeå') BÈÉd (HI­ ÷„p9 Aȃ „« (ȃ „Ät ¹„�€E¡”@ÂID ¥„p€ d‚¾$¨… „mœ€êBX¤¨— „9:€!Œè@"„ J[Ÿ‚:€�!! € $#Aø%‰ÁHÞBª¦à3AH�t l ©ˆ€oBªàT1ð=AHᤠì%)–€c!¥q  œDR#A8• ¤R„äM @2‚�\IAHL’¥¶•‚�š $3ƒpAH6¤ \K’)w„ÜJ À}!7‘‚p7AÈå¤ äAr!)9„\B @~!‰IAÈ• $¥¶•‚�-AHƒ�=AÈÙ¤ Br)E„œA @�!‡9s ”Ir€Á ”L²—Á Nò=ƒA¨‚ äKƒP AÈfƒPAÈ6ƒPAȃA¨” d‘Á ÔKò�Á ÔN2Ç`øßÝ@~Ô Ä`BȈe¢‰ ä—Á #1€ axƒ• Ì`bs–Ñ’´}Â�ô½š®Sƒp½3_ÈÀÙ¼B�hL‹qÚ[”Á Ð4� ,ÂùƒAKF‹Ðu]wJÅ©A`Ä„0ËD€7‚0ƒA`Ž%£µSƒÀ&„õ²LX$+e0¬±d´RjXcBX§3/]œÍ+ræ „"+tÎE €Ú ÂÛ,üRÑp !@P&„·1îeB” J%‚j�Ú$gËׯõ³Ž„AY2 ”ëf²ˆôÛï§5¨Åp�ƒ¯_à ï¡Pº¶µ¼ñ|&„%éߊº®^ ËnäuHôú6ò ¥ó¾™ˆÈ.Ãð˜ü¼†··�ßÄ�®wÊëØÍ{(”nœ‚^‰§3!ò5žís:AX€O¿Ú>²:@oÛÖ�nqüõ á=`™ JÆâל°�÷P J.;ÑÂú`�÷P 2‚0„ñ›Öø·›Nr˼‡u³d4§i€}¼‡õ„A¹:6ìã=¨‰ Ê1„÷[øåbêu)]×ùÕ&ìà=¨ƒ !@P&„÷Û>lÛvòÅ~7 ¥ðú…{y Ì2!,Àj1:ãdËëîå5°Ì„°~ —Ðu %Xà=¨ž !@PÓõôälüËÈO¿³|ÿøø‰åélyýéx…ÒË'" 39þÓ –ɧ>7ï§WZ}ýIy…â,ŸüÉËð‚ (Ç%‚„A B€ !@P‚ (A” Jõçî €¼´m;ùH×uïï?Ek½ŸÀ»!ÿÆo”ý½uP KF`ÉP†j€úB˜1~j€ÊBXñ~T!ÔÁ1„ðÑ8½cPBøHP7A›X8 @}!|$¨› €%ï×!€jB˜·pmz¨ƒ €�†tvª$`Æû$phBCBª!`ªO¾…© & ‚þ1ÄÞ¤ú–ÿwã§ +­ƒ"àD«ÓEÈÇŸ»7*a0@q,€st]g0@Y!@P‚ (A” J%‚„A B€ !@P‚ (A” ªíºîîm€âµm;ûqï³äLeÉ(@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@P‚ (A” J%‚„A B€ !@PÿÂ?è ÇÊx[IEND®B`‚stevengj-nlopt-88c424d/doc/docs/images/Nlopt-logo.png000066400000000000000000000670461521061417600225550ustar00rootroot00000000000000‰PNG  IHDR ÷°ìZ\ pHYs&&äë�mØIDATxÚìý ¼USÃÇq¬Û¤�HBz2DòxyLBƒJ”ÈP é)SòГ§D†<$ôDÆôD%Jd($ÊФ”&Í·é6�·;ýß½:Ç-ºÕÙûì3ìs~ßÿú<¯W§;�}×ÿœµ×2íþûïoÖ¬Ù�!C¶nÝ*€£$ ÁrrrŽ8â³KéÒ¥�¶ðÎ;ïlܸQ"‰AI@‚}÷Ýw¡†°§R¥J5iÒdàÀ�´€ø£$ ñ¾ÿþû¦M›ch É€’€dñ /³Ï¶…uëÖI †( H"×_½1H‰%6løæ›oÒb„’€$òꫯih 1BI@ùì³ÏŒqÚ€¿( H"®ÞIØ[±bÅêÖ­Û¯_¿5kÖHÀ#J’Hûöí�ñ!´€hP�DjÔ¨aŒŸ¡-x@I@²˜1c†1±ŠÓ.¹ä’>}údffJ`( H]»v5&æÉÈȸøâ‹�¶�››+€"P�,N=õTc┪U«J h”$…_ýÕ˜Øæ�C9î¸ãŠ/îüó=÷Ü#€¢Q�zôèaL S¿~ýõë×;Ñ–-[>ùä“yóæI h”$…ÓN;͘æ·ß~“@D( H¼8¬5ŠöCH'Lž�x±^kä?~¼D"BI@âÅz­‘£U«Vˆ% 6oÞ{éҥŋ7ÆK:è uëÖI`Ÿ( H˜š5kã:={ötþl³fÍŒñ˜Ð#`_( HŒ%K–ã% ,pþø¸qãŒñ˜ªU«æççK h”$F¯^½Œq�ÓN;í÷�óÏž{Â| €¢Q�ÞÖõèÑã÷Ы¯¾jŒÇÔ®]["E£$ <¯5š7oÞï�¡mÛ¶vØaÆxÌìÙ³%PJ úµF!�:u2ÆcÚµk'8¹¹¹1AI@\tÑEƸΞk�B.\˜‘‘aŒ—”+WnóæÍR ³zõêòåË7oÞ|øðáÛ·o—ð%ñ–™™émf¿çZ£BMš41Æcžþy)�éÛ·¯Ù£íЀ¿( ˆ·>}úã:5jÔ�ŠÈçŸnŒÇœtÒIR Óºukcþœ²eË6kÖlÈ�![·n•ðŽ’€x«U«–1®ÓµkW©ˆœrÊ)Æx̨Q£¤àÅù¬?ùä“óÎ;Ϙ"RºtiÚˆ%qåy­Ñ¬Y³¤¢ãí­‰�F�IAMNNÎ…^hÌ>C[ÞPWþ®5 Ù¼yó!‡bŒ—8�eÑ¢ERPã”®2eÊs€Ð€+”Ä•¿k� ÝsÏ=ÆxLÇŽ¥çôÓO7&Ò„Ú Aƒ6nÜ(P4JâgõêÕÅŠ3Æuö³Ö(dΜ9ÆxÌa‡è}�4h`Œë”*UªI“&¤-€½Q?ýúõ3ÆuªW¯.8 64Æcœ,ÚÏ-qN<ñDc¼‡¶öFI@üÔ­[××éܹ³tà|üñÇÆxÌÞg9ÅæÍ›�ñ'ï½÷žD€EI@œx^k4mÚ4éÀÉÏϯV­š13~üx)x6l˜1>¤téÒ�^süEI@œx[käÌû#ÿ+z÷îmŒÇ4kÖL ^š7onŒ—}ôÑ]ºtùꫯ>úè£nݺuïÞ]" Œ’€8‰éZ£�õë×—-[Ö/)^¼xff¦¤lß¾½\¹rƸÎG1oÞ<‰€¢Q±^kT¨]»vÆxL—.]¤ ÅóZ£¯¿þZ"`Ÿ( ˆ‡7ÞxÃ×qµÖ(dæÌ™ÆxL¥J•rss¥À¤U«VƸΥ—^*°?”ă·ýIxàÉuj×®mŒÇ 0@ F²³³Ë—/oŒëŒ=Z"`( ˆ¹uëÖ•(QÂ×ùá‡$×ùàƒŒñ˜¿ÿýïR02räHc\§R¥J@I@Ìy[kTµjUÉKòòòœ?ëáo ñÖLâÏÛZ£víÚI%1çm­Q§N�$�éÙ³§1ãL¾£ý„cÏóZ£1cÆH%±çµF!k×®=è ƒŒñ’’%KfeeIIok�*T¨ p`”ÄÖ›o¾iŒëx^kTèÖ[o5Æczôè!%u¼­5ºí¶Û$Œ’€Øjܸ±1®sÿý÷KQeêÔ©ÆxÌ1Ç“ŸŸ/%i<¯55j”DÀ�QC7n,Uª”1®óÍ7ßHÑæÂ /4Æc†*%i>ûì3c\§B… ÉÜ|@R¡$ †hŒëT®\Yò!C† 1Æc.¹ä)IsÛm·ã:¬5‘£$ †¼­5ºûî»%’““sÌ1Çã13gΔ’.Î'U¡Bc\‡µF r”ÄJb×…<úè£ÆxÌwÜ!%]œ¹¾‡Ï…µFÀJb%±k�BV­ZU²dIc¼¤L™26l�’+ÞÖµnÝZ" R”ÄÊUW]eŒëøµÖ¨PË–-�ñ˜^½zIIÏk�FŽ))JbbË–-¥K—6Æu¾þúkÉÏLš4É�9þøã¥$Š·µFåË—ÏÍÍ•ˆ%1ámg¡J•*IþçÜsÏ5Æc’ê5xok�Zµj%à%1ѬY3c\§]»v’ÿ0`€1Ó A))’——W±bEc\'©zJüçy­Ñ˜1c$ÿ“��]©R%chŒÇ<ôÐCR¼ãÔ§Ê•+ã:¬5žQà›$_k²hÑ¢bÅŠã%‡~xvv¶×L˜0Á×a­ˆ%¾1b„1®sØa‡Åg­Q¡«®ºÊ�yóÍ7¥¸æî»ï6Æu®½öZ‰�( ðM«V­Œq�ø ìí>à�3Ïhݺµ1®sã�7J‰L£F�Œñ˜ÁƒK1LAAAÕªU�q�AƒID…’€håääT¨PÁ×Iø‘ÀŸ~ú©1sÁH1̤I“Œq�R¥JmÙ²E" *”DkÔ¨QƸN2 œŸŸÒI'ã1Ó¦M“bok�7n,-J¢uÛm·ã:ñÜHt?žþyc<æÖ[o•bÏk�(-J¢ܵF!7n,W®œ1^rÐA­_¿^ò?¬5‰EI@T‚»Ö¨Pûöí�ñ˜ž={Jþ‡µF ±( ˆJ ×…üòË/Æx̱Ç+ùրĢ$À»¼¼¼Š+ã:Év$pݺu�ñ˜>ø@ò3“'O6ÆuXk|DI€wcÆŒ1Æu’ðHà?üÐ�q F´ýuîÜÙ×iذ¡D€?( ð®]»vƸN œ——wÜqÇã1³gÏ–|KµjÕŒq�7ÞxC"À”xäL¬+UªdŒë$ÛZ£�ÿüç?ÆxLûöí%âm­Q‰%6nÜ(àJ6Ÿ‘ÙµY“_÷°Ö$J„µF Pà…çµFƒ ’’4Ó§O7ÆcªW¯.EÖ€$AI€ãÆ�3Æu’›ÎZµjã1£G�–¢ k�@’ $À‹»ï¾Û×Iþ#�‡jŒÇ\yå•RT©Q£†1®óꫯJø‰’×òóó+W®lŒë$ÿ‘À¹¹¹UªT1ÆK222-Z$yÌŒ3Œq�bÅŠ­]»V"ÀO”¸6aÂc\'ù×…ôèÑÃ�éÔ©“ä1]»v5Æu|?Ê @”x�ªk�BV¯^íôŸ ã°Ãó¼Á«·µFýúõ“ð%î¤ðZ£B7ß|³1ãíÖ€¤BI€;ÞÖ•(QbÓ¦MR0òÃ?ã1§Ÿ~ºä:¬5I…’wî¿ÿ~c\'pÛtÖ¬YÓ�qz”Û¿ŽµF ©PàBAAAÕªU�q�À ( ˆˆ3ßõ0�M�#�û÷ïoŒÇÜ|óÍÒþ’صFÒ¥Kc" m€”GI@DœI¡‡él ×…lß¾ýðÃ7ÆKJ•*•••%í3ÞÖ=÷Üs’ÿyýõ×�qÚ©Š’€ËÏÏOϵF!Þ RÈã�?.�ùóçã%Ë—/—üO4|òÉݺu›1c†DH”Ø{ï½gŒë¤ÀZ£�%K–8Ÿ‹·Ùs•*UœŠUäÃöìÙÓשY³¦“Ü{ï½ÆD›5jÐH”ÀÎ�;Ï8ã c\çÒK/•R$W_}µ1óþûïKEäì³Ï6Æuzõê%Å$矾1¾Åi Ç—�DIÀþ8 ¡I“&Æx‰¿Ût&ÖØ±c�ñ˜K.¹Dús,X`Œ—Äh­QfffFF†1~æ³Ï>“�ä®$ 0@"©lÒ¤Iµk×¾ï¾ûúõëסCo·"˜ØlÓ™X§žzª1óË/¿HH²­5r�çÏnO'�tÒ)§œR¼xñ#Ž8b_ë¬@òsQ.\X½zu‰¤2§D;OÜ%FÛt&�Óš<5Ú¶m+ý!ɶÖÈù~yþìB.¾øâ©S§†mÇŽ‹/–Aå¢$¼ð ÎTà§Ÿ~’HjÊÏÏ?ꨣŒñ!Ý»w—R*[·n=ôÐC�ñ’²eËnÚ´é÷Gò¾ÖhéÒ¥’ÿ‰~­ÑYg�µç'‚ÎEI¨[·®3¸÷Þ{%’²œùbŸ>}êÔ©ãy?Ÿ�O?ýTJµtìØÑ�Ùópok�Î>ûl)&‰r­‘S0~ûí7‰�:"- 7n,Q¢„3!¨\¹²DRßêÕ«ûõëç4ComaæÌ™RªeÁ‚ž_q¯V­Úï£sÏ=××qªE´ŸÀ>D¹Ö誫®’)%Ò’0tèÐß§æ»ï¾“HºÈÊÊzã�76lj‰úàƒ¤Ì•W^iŒÇ|üñÇÚuê‚·?¾hÑ"ÉÿD¿Öhüøñ ¥DZnºé¦ß§¦S§NI;ëÖ­sÚ‚3K.Uª”1HëÖ­¥̨Q£Œñ§h9�ЫW/c\'i×U­ZU"¤šˆJB^^^…  Óì²qãÆ�6nÜxÿmaèСRª¥  àä“O6Æc,XP³fMc\'i×ñ’))¢’0nÜ8cþ�iÓ¦I$ÝmÚ´iÈ�!Íš5+]º´1NñâÅ[·n=kÖ,)¥ÚæËϧ'íZ£~øA"¤šˆJB§N�ŒùC:wî,„mÙ²Åi ×_}¹råŒùCœ9èŠ+¤Ô‰S�>ø`câ—³Î:KŠIXkŠQI¨^½º1Èž[µ…¶oß>lذæÍ›¶…SO=UJµÜu×]ÆÄ/=zô�bÖ€"¸$Ì™3ǘ"2}út‰ hN[9rd«V­žyæ)Õ2{ölcâ—yóæIþ‡µF`_\œI^‘óƒ®]»Jiª~ýúÆÄ#§�vš“°ÖìË�KÂ%—\bL©Q£†D�¦>úè#câÖ€ø;@IX·nÝ~ÜM½�k€åççüñÆÄ<¬5ñw€’0pà@cö™G}T"HSÞŽEs…µF !P®¿þzcö™¿ýío °í;5o¹¾ž®Ac4â[;¾šjÿÏï~Ñ´vü¶B‹Viy–6lµcg®D~·nݺ2eÊðÖ$ÄþJÂÎ�;Ë—/oÌþ£3žà£õ[4s‘Fý¨×>Ñ£Ô¶—.H§ß¦Ã¯’©ízœÖFÍ{è±ÿÙF1?SyùR§mÛ¶ÆÄ0³gÏ–ük�Àþí¯$|ñÅÆ Ï>û¬D’Hn¾}à•‘ºýY�p£J^&S{Ÿ£x=s�jv°£iW;.íh‡óžq‡ǵ°ãèf:´±Ê4”©ýçáü˳Úêæ§ôìP}2IKVK锟þÙ˜X%v{°ÖìßþJ½÷ÞkÌrÁH$Á¯ÒЯõ@?ÕºGe/—ùã<¾t�|³jwTË'Õù5õ¡áôýle®uý>À†­ÿ³ú�T‡l—¨ÐD¦vãž>š0CùRd_ÛE/v» ³ÖìßþJÂqÇgÌ’‘‘±zuš½zœœÉú“õÄÛjÜEG^#óÇ9z¥«uÅ¿Ôc ]b´f£ˬ\o?’燩Íìû{~•¯M‹¶0lØ0cb’íÆZ#p@û, 3fÌ0&¢¼ú꫉9gªýÝ/zø U½A¦öŸ×ü\t�:½¬wÇÚûŒkò\ý³ß>ÈÔn ¹¹¹ùË_Œñ9I»Öè¸ãŽ“)nŸ%áÉ'Ÿ4&¢\qʼn•MÛôÞ8ÝÒSG4Ý=í.VWÿׯÞuðÊHM_`ïCH6N˜4Ûv§!¤|[ˆüɹ¤]kÔ¹sg‰�âöYÎ?ÿ|c"ÊA´}ûv‰øiÞr»†§n'•¨·{’}ê­zð�™¢-;¤€ÄéN+h×Û.‚*üDN¹Å6Ÿ”±fÍçYÍÌ{oI»ÖhÚ´i Å]V­Zµ÷L"´%üÁlÌŸ3|øp‰D+'ÏžQÐée{Ÿqá|ºT}]ö€^f�,´¼|[on{f÷§væúð[)%rË-·ã[ªW¯.Å$½{÷6Æ{ªU«&R_Ñ%¡ÿþÆìNùòå_|ñÅÐfGÝ»wýõ×�8âcvÇ™!Eû�¤±Uë5ð {øÀ¡�wO �¼F·>­aãƒô¦A„œÏ¨ç`öû'{N;{ƒuÐMž<Ùß»%=5kÖ4Æ{b÷�€¤RtIhÚ´éï³sÒI'Í™3Çù—÷ÝwŸÙUœ^ºté¹çžûûb*V¬(w¶ïÔà¯ì6D{Þ‚|æêú¦~œ“j«ö÷¶a«ºØÝ‹jv°ï3Zä+ô(FKz–,YbLT‰Ñ’M%aÇŽeË– Í Î8㌬¬¬Ð¿ß³$8¶mÛV§N�ß'fâĉ90göÿåµ~Z7Ú}òßÛéÕ�µ,KJ³„ªB¹ß¿µ;jÜt)˜4h�1>$vKzzõêeŒ÷Äîɦˆ’ðé§Ÿ†ægŸ}ö¦M›~ÿ×. ÚÕ wJéÒ¥‹Dögú»7è1×í~ßàœvöfƒ•ë¥ôNÖ&{Ê[aUhð Ýì5p²³³‹¼cÇ­Ø-éa­ˆP%¡]»v΄àØc�]µê[îï]ëÖ­;ùä“�ÿ·¿ýM"EX–¥§ë´6»»Áq-ÔåuÍ^"‘=8UáÁWìùС¯Ò]/j[¶¨ÜvÛmÆD›-éa­ˆÜŸKBAAA•*U=ôÐÙ³gKH‘%ÁñÛo¿…îcÎÌÌ”HØÆ­ê?Ê®ŸÉ¨žõÖXm{Ùý@±+Ö©E�ð­z+{ØB€|ýõׯD•Ø-éa­ˆÜŸKÂÔ©SK”(1vìXéÏÙWIp|÷Ýw¥J•êß¿¿”îÉÉÓȉºá±Ý¯ˆ—ª¯kºéƒo”�#‘È8Uêøá6~Ã~UaóæÍÆD•Ø-éa­ˆÜŸK‚Ózôè!‘ý”GŸ>}Z·n-¥o¯²ÓÙC®Ø½¬è¢{ì‰Èë·HĽ-;ìl¡¯äwhæ")é3oÞ}úÔªUË—ªP²dI)&a­p‹’‘)ótû³*{yx†zT3{Ðw$ÄÀ/thcû]¨|­ý¾$ƒÌÌÌèÛ™gž)Å$¬5nQög[¶Þ­sÿ±{â:÷kè×Ú™Fw^$£eYú{;ûí(ÓP#¾•’&Ñ´…zõêIþ‡µFÀJBÑægªýóªÐ$Ü œx Ÿæ,•HrØ‘£æ=‹¾žyWJ²xh 'žx¢äXk< $üÙØijòðîýL/¸Koi§¤H6R×7Ãߦ;žMÒ× ÛB±bÅŒÙ_œÿ 7.³Öx@IËÎQÿQúÛíáIgÉËt]÷`à•æœ Wª~x%؆­R²fõêÕýúõ«[·î~ÚÂ1dzbÅ É·°ÖxCIЪõê>@G^®G4µ¯O¯\/‘€øf¦*îÚõä›í:±$·ÿ¶P®\¹x`åJƒ`­ð&­KÂôjýtøuhgœz«^ÿ”•E�ôÛ �r‹ý&~•&Ì�‚�ý´…ë®»Nò!¬5Þ¤cIÈ/°‡Ôî¸{Ϣ˲'%#Ð6lU½ÂKÅ~!'{·…¡C‡JцµFÀ³ô* ›·ëÅá:±e¸”n`ox�½D")!'Ow>þæ>ü†´„ÚÂW\±sçN)Ú°Öx–.%aÑ*uzYå¯Ü}Úão+k“DRγCU¬®ý._Ù%I·<ŠÖÏR¿$|3SÍ Ï�qÆúß眆–â>ú.üínòpšöÖ€h¤lIÈÍ·[šžÓ.¾{ۢ˰w*#M8=á¡WÃßúç‡I~§°'œß!¥öEe­ðE2–„qÓÕð¡ðÑ) 7=“íó‘üþ1xòÉï8=¡X]ûà-zH)Ö¿$QIÈ/Їߪf‡ð¼°LCÝùœ]n„töìÐðÏÿ^“üÎ÷³Ãç1?ü†ü°Öø%)JÂÎ\ m�IMk¬nýíÍÊ€ãå�ì9ÎÆÝ/J~gø„ðƒ÷%<¬5~IpIزÃîSTõ†p=¨|­z eÛ"üÙ;_†—ÝöŒ}ÇÉ_½††7]ýrŠذÖø(a%!k“]q^¸«é‰-õÚ'ö- HÃ'Øy¼ó£rÓþßjÜþyûÈå¯Ôì%R0ÃZ#ࣔ„%«í—å…ëÁ™whè×þ¿<ŒÔóé÷á[š<¼Ïž�—¯wÇJ.ãü©F�ÃGpôx>Öŵ$ÌZ¬ÖO‡_vFíŽõ£D±¯¦êà]õ²þ?‹>âà·ö]©\÷'ilÞnûªóÈç´SàO`­ðWœJÂÄYºêßá;D�ÿmÚUßÌ”Ü+<2ùÒŽÚ´MúcœÚéü¿¼Á¶( @´®ën{Â¥¥‡µF >( @´–gÙÛ—�žÐ”³°ÖÄ %ðA¿‘¶$ÖX«7H± k�@ÜPHßk{µݥ؄µF n( €?æ,ÕA lOøè;Éï°ÖÄ%ðÍ“ïØ’PùZmÜ*ùÖ€x¢$¾ÉÍ×w؞ж—äkXk≒øé§¹*^Ïö„qÓ%ŸÂZ#g”Àgô³%ᤖÊΑük�@œQŸmËVµ›lOxèUÉ�°ÖÄ%ðßWSmI(^OÓHÑ%úµFíÛ·ÿõ×_%"EIbâ¶glO8«­ò ¤(zÞEïôÓOïÑ£mD‚’ÄĆ­:ª™í O–¼fÅŠ¥K—6ÆÏÐÀQ€X6Þ–„’—iA¦ä>Û¶m«S§Ž1± mì %ˆ¡Ë°=¡ÁƒRùàƒÞ{ï½… nÚ´iøðá]t‘1ñH¨-üöÛo%ˆ¡¹ËTª¾í ÃÆKûMAAAÕªU�IdÎ>ûìž={Ò%ˆ­®oÚ’ð—ëµu‡´ïüøã�Æ$Kh ¤9J[;rÂÇ&ü³Ÿ´ï,^¼¸sçÎÕªU3&‰B[ =Q€˜õ£- %êé—EÒ�2yòdÚH,J×u·=á’û¤ˆC[‰BIâay–¹Âö„·¿”\†¶âŒ’ÄIï÷mI8òmÚ&y mÄ%ˆ“Ü|�q‡í ^�¢K¨-üñÆ$Qh ¤ J?g)£ŽŠÕÕ´RÔ)((˜4iR§N�~ÀŸœ{î¹Ï=÷Ü’%K$@ Q€¸jÛ˾™p^{É¿$m[¨Y³&m€ ¢$qµn³*]m{ÂkŸH~‡¶|AIâí­Ñ¶$Th¢µ›¤Ø„¶¢AIâ­@ºø^ÛnVŠqh ÀJ�³Û˜�ž0q–—Ð@ä( @b<ÐÏ–„3ïP~�ÇÐÀQ€ÄزCÇ\g{ÂKJ‰mì %H˜Á_ÅüæH$y[ÈÌÌ”¢Ê¶mÛ6nÜ("EI¦@ºä>ÛîˆýÌ‘Hζ�‘‘qñÅ÷éÓÇs[èÖ­[©R¥®¾úê1cÆH€£$‰4}�Š×³Ç0ÿ8GJš¤R[XµjU¹råB�àüÙh¿4¤J�`w½hßLø{;)ùâ´…o¾ùæî»ï®\¹²1É’ÈÛB~~~ëÖ­ ÿ”S¢ýŠ�( @‚­ß¢#šÆê f¿8³í &«-dee5hÐà÷ÿÖÔªUK"D„’$žSœ’P±©6l•’;ÉÙÕªUkÞ¼ù³Ï>ûÞ{ïõìÙ³M›6UªT1fwXk@ä( @âåèœv¶'´ë-$IÛŠÄZ#\¡$Iaâ,[2êhê|)P D[`­®P€dÑúiÛÎï 3ÉÜ^~ùe‰ /_ `( @²Xµ^寴=áÍϤ 'ÙÚB±bÅÖ®]+@¼};S'¶Ôœ¥RÐBI’ÈsïÙ’PéjmLú;˜#‘$m¡nݺÄÛȉ*ÓÐþf¿í)h¡$I$7_mm¯&w½(¥PÛúõë'@\½ñ©ŠÕµ¿Ó›÷PNž´P€ä2fн ¯§ ¥”KüÛk�ñ×c ýmîŒûúJÁ %H:×u·—• ï–R7qk ¬5ÄS^¾]jO¼-6” é,^e÷Bu..}'¥zœ¶0~üøvíÚUªTÉÿÃZ#DdË]z©W_-—.»,üÕÒ^vŽ®ÝõJ_±º�߆„’$£GØKÌ 7ÚËMšÈËË3fŒ¿m�µFˆÔ† 2&<àÊš5|é€��[uiGûë»LC}ø­ðP€d´}§Žoa/4O¾#¥Y|l ¬5B¤ö, Sñ~ Ø™2E”@Zž¥ê­ì/îòWê›™RðCI’Ô°ñöZSör­X'¥e¢o ¬5B¤ö, ={J$bά€’€´7m�ª\okÑT3I)J�¼ê=`¯87>.¥w¼µÖÁ…=KBÅŠZ½Z"X²D‡*JÒÛ¨up#ûûúÜhõ)UBI’׬Åv/TçºóÝ/qÙXkö, Î(WN�?®I“´|¹rÒæÆ 9_§Lœ¨‡VéÒÚó뤟WF†C¸¦›]*œJ( @R»¯¯½ôœÕV"{ÈÉÉ2dH­ZµŒ1¬5‚þTÞ�N ¤_ ouzÿKÊ/�R+” ©mܪJWÛ Ð«Kd/S§N½øâ‹�ùsJ”(±~ýz‰ 2”_�6¶ï jT¬®^úPJÅP€d÷ú§ö2äT…MÛ$²—¼¼¼=z/^ܘÝiذ¡D1J‚/Hk6ꂻ›‹|2IJÑP€d—_ ¿·³£Ž�=Ú=œKÓž%á�7Þ�"FIðeiàÇ9*ÝÀþR®|­¦Î—R7” &βףõ4g©DвeË–Š+®5Ú¸q£D1J‚/Huƒ¿ 7„·hé)¥CI‚á–žöªÔàA‰ìÃyç�ÇZ#xDIðe©«@êòzø6回Hµ�ŒŠDI‚aÅ:r…½6�œ(‘¢œ|òɬ5‚G”_�¢¶ìPÓ®öWpF==XJ�P€Àxæ]{…ªv“rò$²—+VôëׯQ£F¬5‚k”_�Š­Òßn·¿n”^¯ÓQ€ÀØ™«“o¶×©§Ið%Á—¤œ 3‘ßB¿,’Ò)” HFýh/UåÙÕG|CIðe©¥÷ûá›.í¨¬MRš…’Lã.ö‚Õ¢‡D¿P|@ªØºC7?n^HÓU¾” `æ-W©úö²5q–D_P|@Jp~ÏžÖÆþžu~Û¾ú±”®¡$Áó¯×ìÅëì;%ø‚’àË‚oÄ·*¥ý%{lsý4WJãP€àÙ²CÇ\g/a¯* z{—„ÃWƺãuë¦çŸ�ëp5//]ZÏ?×ñï«MûÅ)_^ÆP�2òòõЫá%F Òú-Rz‡’ÒÛ_Ú«X¥«µi›D€(ý©$<ø ¸‘®«’pè¡R‚’•¥öíe( H+׫vÇðI�P~�”ö¡$�ä\¾.¸Ë^Î:ö•¥=KBÂOìJI©YS”ܸé:¬±ý•Z¡‰Fÿ(‘]( @PMžk_ð(QOs–JˆÆž%᫯¤„&X%aøpQöaãV}=ÝžlÓ}€÷õµ£ÍÔúi{|o·þö=açJ¾y»D$'O�_S±º¶!üµµ–¬–Èï( @€Ýþ¬½®5xP"@4ö, [½9X%aþ|Q~·n³}ºç`]×]'µ ¯n�dT¹Þn§óÄÛš½D"ñ2g©Îjk¿þNIèòzšîsº” ÀVooÂ�VÅ'@NŽV®ÔÌ™ö5æ¡CõÖ[zÿ}}ó�fÏÖš5ÊÏ—HÀ–„2e¤D'X%!;[i_œÉåˆouuW™?NýKÕ×yíívû¡wž{OϳN¼5Úþsç×Ôì�~›J7ОªÆ-vÂ:9½÷Õ‰µ©ßH•ih¿à¹^ã–È^( @°…΃¬v/�DmÆ ;ûæ=ô�n¿]�ëüóU½º;LÆìoddèˆ#tÊ)ºè"5k¦;ïT—.êÝ[ƒiñb‰A^ž¦M³cVœ?¬’ ]Ï�ÐW/ý8Sù{ú¨bÓÝSüÓÚ¨m/½ö‰¦Î�ô²ìLX—®±Íá†Ç¯ûvŒ'ß±k–à¯5ÃÇ’†N&ÝÀWx( @°9¿„N¹Å^éž$·²²4x°n½UÇ#cb2œòpÏ=úøcmå"¸’�~2×ê?CômvOè�ëpÏÁZ–%E—�¹úü'{ÄïA¿¿½P®‘ò¾ùô{y�ýÂr…~!‘}£$�7úÇð/’ë$r@997N?¬sαoD_"%Kªvm=ý´¦L‘ö�’�IJ6íÞJ߇_¥öÏë‡_%¿S }öCxSNg”¨§k»kæ"‰xµ}§m_¡¯çwiáJ‰ì%HWýÛ^õZ>)‘}Y°@ÿý¯š4ÑÁ˘�J•tÓMúßÿ´š—±JBRÚ²ÃÞWphãð,óÜhØxeçH1Î÷³í­ uì_Z¼ží$NQ�[SçÛÍ‹B_ÃGØsÓp@” ,È´«W�ËßÄ$XP�t&MRÓ¦2&GÉ’jÛÖ %!Élß©^CwßxpÙš4[Šoæ,µ;&…ª‚STž{Ï.LB$ò ìڰЯÈnä·¤ ” Eüë5{<ûN‰úö[{0VôSùX�âÅí}sÙÍ»P’†3ï7R•¯ ׃šì©[ 4y®.¹/üÁTo¥wÇJd¿f/±·’‡¾b·ô´o!r” E8×¾c®³×Á×?•È×_ëÒKeL�FF†š7OŠÝu�X”„ä0vZøWgœy‡>ž$%G†OЉ¿ÂÐì­\/‘½l˶;É–¼Ì~•Ê^®¡_KÄ%J�:ÞþÒ^ +]­MÛ¤´Í¨QvëÒè§ì‰NU¸úêôÜMa”„DÛ²c÷®Ît|ÈX»d%©ìÌÕcÿ oóhcõ%‘=|ô�Žmþ^ÓÍî0 ( @êp~‹]p—½&ÞÓGJ·hÄ�{®ŒI‘Ѹ±½›iˆ’�Pc§éøá …ºˆô¬ƒ„X¸RõO…�øm…”öY¼JMMNjiwÿƒg” ¥LœÞ½á×¥RúdÝ:;¥Ž~^ž„£cG»g+Ò %!A¶eëîÃóË3îÐô l(P ½ùYxÏ¥2 íñšÉö¦GÜì̵gÏ…Þ])ÝÀ¾Ó‡½§R%H5-Ÿ´—Ⱥ�¤4ÉĉªZUƤì¨YSK–H$mPa ûÂsèE–‡ßHê7ö¶r½½9¡poÖ4€ó –¼Ì¾I’çˆý©y�Ýí1BIRÖ5Ýì5´ÉÃRÊdçN5i"c|Î$Þ™Ê;­Ã™Ö;“{ß9ð„ r.›µj©dIãÏÈÈГOJ$EQbly–Îko/�¥êÛ­�Rز,5ïžOW¾Vï|)6Ûwê¿#v׃[jÀhåÅà²�B” e-^e·�s.¦Ÿÿ$¥@ Ô¢…Œñgœy¦=W!ž»‹nÙ¢~ýü\%õòËIE”„XúvføîÞ£›éûZb´ã¦ë´6á¹õE÷hZ¶vÝ“Sž¶{õ n( @*{ìáerSàzÚ¹³ŒñaÔ¬©Ï÷â¡SKÞzK'ž(c¢ÅŠéã�%’r( 1óêÇví�sU<¿ƒÝ'}8¿^®Ã‡oÑîð‚Öm–’>ªm­·¿¤Ä%He;rÂG‡ö,:ýúɘh‡SF�’’ ¹¹¶*œt’Œ‰j”)£É“%’Z( 1°3Wm{…çšw<°cü²zƒn6¼ÙkŦê;"yO^[¼J�¿mϬ(¬CÆ&ïG›ª( @Šûè;{…-×ÈžŸTŸ|b_5�f2}É%7NJ²äçkÈ�rŠŒñ>Ž<Ònµ„TBIðÛÊõv™MèÞ—?’Ò;?ü¾%Ã'ßlïNžÍ²·îÐÿ>W�ûÃM†z�X” õ5|È^j[ô�‚˜É“U¶¬Œñ8J–Ô‹/JIœ�;u÷Ý2Æû¨QÃîÊŠ”AIðÕ÷³uÌuá�p¾™)Ù9·S–ª\žˆWlj÷Ë^•¸«HÁ®+Z?­ƒ…?¤Rõu]w}<‰z�H” õÍ]^†;a†¬,Z¤£Ž’1GÕªúþ{)y÷]|°Œñ8jÕŠëM؈)J‚>ü6<éü{;-]#‘=ääÙýŽÎ¼c÷¼¼q�ú1®÷°-ÈÔ#o…—Å~§úŽÆ-)�’¤…ίًïßnÔ«2ë×Gµ§aC­]+'¿þªÿû?ãqÜpƒDR%Á'¯~loÒu.}ÍIÁ“|ôå5ê¼{š^¡‰n{&†maÑ*»=ÑíÏÚ}Š ÿÒ£šéŸýôË"‰$ J�¶ì¿áþßR RP ÚµeŒ—Q¬˜zôˆÉ¹±¶u«n¾YÆx�<"‘à£$ø¡û€ðìóÁW$�é ÔéeU»I{¶…kºé•‘ö6†í;¥(2?SýGÙEÇíñ¦Ah\×]ŸLbÏ¢dDIÒÅ�±ör|Xc­Ý$% ’1^FÅŠ3F r^}ÕãÉk¥Jiñb‰%!:Ît³p#£†IÄ¥Ésí- 5nÑžSùbuuê­ºé =ó®]Äõõt{Þ¬Åöm�u›µ-ÛþÁì»+ѤÙ>ÁÞóðï7íFR�:‡ßÏ)å¯Ô•]ôô`û_ÆèÍ ø‚’$µåY’O)�.¹/¼ý_²Û¾]Ç+c\�ƒÒw)qFÿoÈ/ãúë%p”„(lÝ¡«þÞÈhè׉Âì%zt€®í®ê­vo7ämThb¿/ÏÕOsyÓ 0( @òê1P5Јo%Ÿ2c¡ÝvÚ¹ÖOž+%szö”1^Æà Ÿ±χÇMš$‘ £$x•µIgß~­z̉øg[¶]tôú§ºûE{oñ%÷éŒ;ì» ÇµÐ¡�í¯*çËîür©|­Ý_õê®ö¼¶§ÙýL¿œ¢_—êv8üŽ’$¯ÐyÉ'Üèç²÷ô±�é\ēך5*_^Ƹ�?.¥P tíµ2Æõ¸ðB‰%Á“5uZ›pC˜¾@ŠY~š«/8Ãi€’$¯í;Uõû;ï™w%Ÿ²~‹*]móÍϤäLûö2Æõ¸ùf)å²m›Î;OƸï½'‘À¢$¸·,K'íÚ*§ÊõvWÍØùð[•ih·óŸÅí?Hu” © þ*üÂX–w¿ñiø\¡MÛ¤d˯¿ªxqãn¤ð)«Vy¹=ã„”›+‘`¢$¸4?3¼'ω-c{ÂG„ïÁmÞC;y†!ÕQ€¤V ]p—ý�tçs’OÉ/ŸÉ__)ÙÒ¸±Œq7Nf�û¥äÉYgÉw㢋¤4È–-:ê(ãnÜŸTß]DŒ’™ uDS{;¿C O®Ù¨ ï¶K¹Föb }P€Xž¥²—ÛßRû·¹åê ö`5ç1ß'%C~þYƸ©q*B$úö•1îFÅŠ JB B�û£= x?æ-ß}t3M�/¤J ¡íP«·òs;Ôÿް�ù—ëµ#nú}üqãn4i"¥Mvî´w_¸ý�K’ 7( òÓÜx4„og†ÿ–So�íýÐ@r¢$ÁP¸jï÷%Ÿâô�¿Ýnóá7¤„çÜseŒ‹‘‘¡Y³¤tÊàÁ2ÆÝèØQ"ACIدïgÛ ßbÝÞ¯Ò ÂKìÖ2ÉŒ’Fh;ÔÃkÝfɧŒ›n³T}-\)%0™™2ÆÝhÝZJ³¸¾mãøã%4”„}‹OCè5Ôníàü-·ôTNžD�–( @`n‡ÚáÉ¿Üø¸}Ì+»H Ì+¯È£dI-[&¥_F�’1îÆÌ™ JÂ>ü4W‡\Û†�—¯»^ ouúÈ[A£$AÚµx=?û\žeOuö³¤D¥Q#ãb\~¹”–)(PåÊ2ÆÅxôQ‰ %¡(ó3í�ΕêÒŽ±jÛ²uÕ¿í_Qò2½5Z"Ho” `BÛ¡6|Hò/O¶�yR˽±¾e‹J•’1.F¿~Rº¦];ãbœy¦D…’°—Å«Â'¦ÕºÇ{CX½AÚwV­×9íÂ'Ü1Y"H{” ` ·CíߎÝ;sUãû˜O ’âŸaÃdŒ»±j•”®ùì3ãn,_.‘à $üѲ,�Ø2|bšç{ˆsóuM7iùu©ŽoÞííçß$P€ m‡zÊ-Ê/�|ʨíc:õ#s­çÜr‹Œq1Î=WJãdgëàƒeŒ‹ñ‚¯w± Ö( {X³Q§µ±W'ç×Fq¦ò‹ÃíÙÌEÿsøÐ˜3¡$ÁS¸ªókÏGM»ÚÇlÞCŠgòòtøá2ÆÅxâ )½sÝu2ÆÅ¸ôR‰%áw·ê¬¶öºtbKeEÑœvQ¡‰}œ½ þÊÞ�ZÃÉV§Àž( @ …¶C=ü*ûKÔ/ W†÷Ÿ0CŠ[–,‘1îÆìÙRzç�wdŒ‹Q¡‚D‚ƒ’°Ë¶l»¾È¹"Û<Úø;¼Þ°h~¦´Gž|'üïïxÖîk`O” � ·C½¯¯TT¼­DêÖßÿs�`Ò$ãbœx¢”öY¿^%JÈBIØu£TèWåz-È”¢È/‹ìŽp¡2ðÄÛáéT‚¶½ÂÿÒ© öFI‚*´j‰zšWÔ]©ÞnAÞº#¼�éñ·¥ødÄãb´o/§#^ c\ŒÅþmš‹XKû’àÌà¯ín/DeÚ)~”<.Î8ä »ôhóv»¸(´Õé 1ŠBI,´êÿ’þ˜ÙKì-ÈÞ|ô�}̃è·RòòË2ÆÅèÙS"Róæ2ÆÅ˜8Q"‘ö%!ô¿sûqŽ]>™´»!„F›ÿèÌ;§×�›.`( @€n‡:fŠ´Gn}ÚþKϯÀ]ÓÍþñzHqH×®2ÆÅxë-‰Ø+²»¯Û°a ˆô. ]ß ¿Æý.Ï;suòÍ2, uìÿ×Ân{ `?( @°…¶C=­Í oÖ1ð ÉS–eÙ7å�GxçK)ÖiÛVƸ£FIDöW_·—^’H@¤qIxqxx*ïËÅç¹÷dj1œ+ä{_KØ/Jl…Û¡¾ü‘ý?­²·‡~ÞÅ´0ô«úˆ¦Z¿EŠi®¸BƸS§JDêß_Ƹ?,‘€Hגڴͽߗ¢Îš�ö`„"KBèý„®oÊÛ@š $�úÍêLè'ÎÒ1×íþ-X»£ä5yù:÷áõ»±uÎ92ÆÅX·N"îÏ]¾ýv‰DZ–„Q?†ßýg?É�ü£·LíŒZ÷Ø·,–E·¿*�ª( @àn‡zP}íùûo_Ç‹FhÚ‚ð¾�ã–b—£�–1‘ŽŒ ‰ì2eŠŒq1.÷z';â/ýJ„v##çjÓúiÉ�ÌX¸{ÛÓHF�[ôoRDIfźÝÇ‚æhÒl=øŠþr½Lí"F”¯�=ÐÏ>È)·('OŠEòóU¼¸Œ‰ty¤DvY±BƸg�%‘€H³’0o¹*6µ—šËòí„–zÈÔŽhœØRϼ«u›%ü%˜‰³ìÊ¢õtä5öÄåýÿþ>AŠ"[wسN�ÇyìR,²r¥Œq1N=U"»ääÈ㨣¤½â\Ï]=H²�Œ ;E®ZÕþ`Ô¬©zõtõÕjÝZwß­GÑháB)€I§’°f£Nji/2—vÔŽÉ�ŒøV¦öFÉËtÃcÞÀž( @ðÌYªã[ÈÔ>ðèú¦]>ÞµËøA 4w™ä{6l�1.FåÊÙeõjãbwœ´W‚^"åËë’Ktï½öVïéÙ?mJ¶ìðRÉ¿¶Þýi”væÚ7öÿÖÁ†hõ‰ûEIiÕz�ÓN¦öÆ•]¤¨s]÷hoƒÞŸÒ¥eL¤£D ‰ìòË/2ÆÅ8ÿ|i¯ôìi_Œ�~" Q½ºž|RK“{‡üô( yùjöˆ½¶ÝLKVK>å™wej1J7ÐMOðÖà%ªmÙjò°Líý�c®“¢ÎŠu*¥}´£%ßS­šŒq1vì�ˆ4fŒŒq1®¹F**¹¹ÊÌÔ„ jÜXƤËpªÑe—é�w´}»”|I�’p__{U)×HSçK>eõ†ðÅjÏqN;»Cô†­Ü $–—¯Ž}ejïoøò«ñ¥íCUlªµ›$sÁ2ÆÅ˜=["ÒàÁ2ÆÅhß^:P\Ƥ×8ä=÷œòbtc¾WiPžf/)ÅêÚ�O}tçs»/}N[hÿ¼¦Ì“à %¼—?²¿k÷UFûñ;8¿@5;ØGókƒÂÝ®»NƸcÇJDêÝ[ƸOvšäcîºKƸC†HDêÜYƸ¯¿.E�zõdL:ŽbÅÔ±£¶úñ¾[ôRº$Œ›>¡Kd?’‘kÞÃî=k±D?P€1sQx»Ò?�“|Jç×ìVo¥lŸv*´ž|RƸ}úHDºí6ãb|ú©Aš7—1é;ªVÕ¬YR¢ãêcTIX¸2|$Â��K¾&¿À·3„P€Ô±r½þ¾×–GΜÞ/Û²uÂ�ö1»õ—üÊ›oÊ£‹6¥€F�dŒ‹1%²]]Ú·—1i=ªTÑo¿I �«88%aãV{2£s¹èž˜�ÏÀ?” ¥8óøÐ®‚…#£ŽoG9Fýh³T}{Vƒ?F�’1.FýúRÚ'?ߎæêë¶!²má»v•1é>NÎ ”„çÞ oxúùO‚’¤¬qÓuøUöws›ÿH¾æ•‘öa+4ñiÙÀ)§È£E )½ãö+vã�RdqU6´ÿ}BF§NúÇ?tóÍjÚÔîÈäLè+T�1>�W^‘‘Ô* #'†7<}éC‰ÁAIRÙ¼åúkk�ÕVò5Ò…wÛßú-Ÿ”¢�Û×ÅË—OØK¼É`î\ãn *EW%áùç¥dʪUúúk½ü²n¿Ýõ=EŽ£�Ö¶mRÜ“B%aê|{¦²s­èð‚D€@¡$)nÓ6{+³ï~Y¤»ŽMøjªe¾ûNƸŸ.¥kžyFƸ¥Jiûv)²º$ìÉ©‘'Ú½°ªT‘1ÞG�RÜ“*%!s­þr½½J4xÐnQ X( @ê+PLvïòºýõb˨�Mpæs•*É£C)]sá…2ÆÅhÔHŠ8)S 9é©§ì»OÞJÂÁkíZ)¾I‰’°-;¼áé_[Û—*%€GÛwªÚMvððR”iÓFƸUª¤éŠ£ÌLedÈãÕW¥ˆ“z%!$+Ëû9q�:IñMðKB�Ôb×6h%êiÑ*‰DIàÝ“Ãó€h·5üðCãn¼þº”~¹ûnãb8�bÍ)â¤jIpèÞ{eŒëQµªß¿$<ñ¶½2”n ŸæJ&J€¨´|ÒÎ.¼[Š&Û·«tiãbT©¢ìl)�²`�=&ÂÕWé‚ $7Iá’âm�×¹ñ�ê¼$|ø­=Ãѹ, þJ"@`QDeõ»ª3!xõc)š\u•Œq7þã÷Þ®IdŒ»áöK”ò%ÁQ·®Œq7ž{NŠc‚\f.ÒÁ»¶3êüšD€ £$ˆÖëŸÚ9Áa�µf£ä9¯¿.cÜ�ÃÓ&_Nj‚©S]ß�àŒ $7I‡’0w®:HƸ HqL`KÂÚM:¾…½4î" à( ¢U ÕºÇÎ ZD³]äªU^&Á=$¥G6”1îÆ_ÿ*¹L:”ÇÃËÃ);wJñJ0KBNžjw´×�SoÕæˆ7Ý�´( |0k±JÕ·óƒÑ?JžÓ²¥Œq7J—ÖŠRªgìXãzx¸·;MJ¯¿ÊwcÌ)^ fIøGïðAì WJ>Jtëo§'ܨž�MX²ÄõíËθõV)¥“›«¿ÿ]Ƹ§Ÿîe—Ø4) Ž“O–1.Fý‹×ÓØiR%€?œnP½UÔ7,vé"c\�~ý¤ÔÍ�wÊ×ãË/%÷IŸ’ðàƒ2ÆÅèÙSŠK¶o—1.F©RR‚ãƒÐùë/}( UPøfÌ”ð± 3IÞ²i“ëÓ—�Q¬˜>ÿ\JÅôê%c\�† %OIŸ’0t¨Œq1þùO).Y¾\Ƹ µx•mlŸøwÆw (±FIà§›Ÿ²Ó…¿·“<çå—eŒëQ¾¼fÍ’R+#FØþãöKQ¼¸~ùEò”ô) ß|#c\Œ›o–â’Ÿ–1îÆ²eRb²#Gç´³Où î²7.H%”~Z³Qe/·“†£%oÉ͵Ûòxè Çk·HJ“'«Lãz´m+yMú”„¹seŒ‹Ñ¨‘— .cÜ�¯vhYë§í“½òµZµ^"@j¡$ðÙ;_Úyá�•¹Vò–�?–1^ƹçÚ%Ý)`éRU®,c\�rå¢jJéS6o–1.†ó£×\#cÜ�Ý»ßçûL/y™&Í–�r( ü×´«�=Ô�fw½z2ÆËhÖL9ž÷WJk×êŒ3dŒ—Ñ#š³*Ò©$ìØ!c\Œ“N’bŸ‘#U¢„Œq7Ê–õxŸzÆÿ¾YùµO$¤"Jÿ­\¯Ã¯²ˆ×?•¼eút/g«¾è»d‰Ìüðƒ]7åí¯REÙÙRIŸ’°l™Œq1Î?_ŠMF�Ök¯©kW]t‘Œñ>œ^Ý­›Ýª5öG:,ÏÒQÍì¼m/‰)Š’ &B‹Ž¹B˲$oyäãqT¬ÿ×V}ЯŸÝÑÒÛ§\¢„¾øBŠ.éS~úIƸ7Ü Å&у"GŒONÈÎÑyíí³Ûù_nVR%@¬D»è¨ À.¶öö˜äGÒ§$<þ¸Œq1ž}VŠMZ·öy´o/Å*¯Œ ߬ü�×]v%@ …•k¤EžwÜÙ´Igž)c¼�ã�ר±RR&?_ÚC¢ùo»Mò)éS.½TƸC†H鞉³l=pžÑ}GHHu”±ZtT;šÅ™™Þïå-µkkÜ8)iâÔgÞéíDˆ=GÆö¡ü’&%aÛ6•,)c\Œo¾‘Ò:…o ¶~Z"@ $ˆ-gnQ¡IÔ¯>ΚeWZG9ŸN’ªàW=pÆYgiëVÉ¿¤IIm>$ ÍPÄ�?‹Ž´ëü„N�dLl‡3˯TÉ®ºøb]w�þñu릾}í±eÎü¸Kµm«¦Muá…ö½ˆ dLlGéÒzã )–Iá’à4„fÍdŒ»Q¼¸–-“Ò47>nŸ°Ç6×ú-Ò %@ü.:zæ])úŒ�©y’ŒSO�Õ£=¥jIX°@gœ!c\�‡Ò÷%ô‡Û§j©úúi®D€ôCIW¡EG5°k�}°l™.ºHƤø¸õV»µ¤^IÈÎVÿþïc9餴Ýùô»_Â禽þ©D€´DIo¡EGgÞ¡ü)úäæê_ÿŠÕ eËjÀ)^I¥’0¾|P+Ê�#!ûä&�UëuÌuöIz+ç¦iŒ’ Þ–g©ìå~ï—òùçöÆ€è'åI5jÕ²§ÈÅS@KB~¾6lÐâÅúá½ø¢n¼Q'œ c¢wÞ)¥còòíùèÎÓóo·kç¦iŒ’ †~mg!Åëi¢�s`g¦8|¸—ík’p4i¢o¿•âW%¡ti»Œ'á£lYãó8æmIÓ{uzÕ>7¹"º£%@b´~ÚÎEªÝ¤-;$3~¼5’1Á%KÚÛâüîÁž\•„TG�{Ä“Òg?Øg¥3>JëããX”‰±y»N¸1–ëžgÌPË–v Ëèg�qåÊÙM]—/—JBùòvÍRZZ²ZšØ§ä?ûIH{” óÝ/*V×NJ†O�b”%Ktï½v ýô1FãÈ#õä“Ú¸QJ‚¤yIHㆰ3Wçw°OÆ‹îñiGGI�H�¼eç%‡_¥ÌµRì²v­z÷Ö•Wê�CdLRŒJ•Ô¼¹=—m‡ïË­¢�Î%¡L»P-]Ý××>+]m÷Q$Vn¾jîzý²ÞR’›«I“Ô³§6ŒÉ ¯û‡nOnîÛW¿ü"%eÒ¶$wœ¾Kßeø|cŸƒuôÅd‰Ø…’ Áægª\#;Gyî=)žÙ¹Sß|£ÇW½zv£žè'šEŽCUÓ¦v·ÐiÓìþKI.=KB›6Ú¼YJÓ,ÈTù+í°{ä�ü( ï�Oí¥T}Í\$%$;vèë¯íûݺ鮻tÓMºür�wž=s÷ðÃeÌþFñâvíP�ºà»¢éæ›Õ±£zôÐK/é§Ÿ”—''éVŽ8B~(¥oväèì;í³¯n'nEð”I¡Ù#v¦rZe'áùMZ·ÎžàûÃ5J#Fè‹/4y²-Ò¦MR %­JÂ5×hõj)­Ó®·}ÞU¾Vk’ãÎyɃ’ )¬Ý¤c®³ó•ûúJ$QÒ¡$”(¡V­ôóÏRºgðWá3 'Ì�€?¢$H_LäÄÝ“ “Ú%áàƒõÀZ¶L"úuiø^ žƒ%`/”I¤cßðâ‡õ[$)YÊ—WãÆúï“å0Š$°u‡N¾Ù>×®ì"E¡$H"Ù9:ý6;w¹¦›Dâ/eJÂA©n]{JݤIvß[üQë§í³ì¨f´qûDI�\f,ÔA ì æÍÏ$g®JBÆö¿O†á”�W^ÑûïkìXÍœ©+ìþ¶Ø‡·FÛçW‰zú~¶Dì%@Òya˜�Ä”kdwpG\¹* Ï?/‘€)¼áÙ¡°o”I§@jð �Çœq‡ruÌ@àQRÚö�v—aç™Õ¨³Dì%@2Ê\«JW³#jÜQRZÛ^ö9Uåz­KߦDŠ’ IMœe—M;sšaã%”„Ô5d¬}6««ogJÀ�P$¯ÞïÛiMù+õÛ ‰Ä%!EÍ[®ƒwÝŠðøÛJ€äU ]Ý5|sBvŽDb�’�ŠœçÎYmíó¨þ?% 2”ImÃVU»ÉÎoî|N"±FIHEw½>a §Éˆ%@²›k.¹Oùà%@0lÙ¡·ØÏÍOI$F( )äž>öùRéj­\/.QÆŒ…*{¹�÷¼ù™Db�’�*>øÆ>S2êè³$À=J€ yk´�ú”n Ÿ“ˆï( )aA¦Ýu+B·þà %@À´ù��ýœÔÒ.@‚Ï( Á—�£³ï´Ï‘zp+ï( fûN�ÖÆÎ�®í.Q‚ï½í³£òµœŠ *”Á3w™ndgBÿ!QnÈXû¼(^OßΔ€(PRh2Tò2ý8G"~¡$Ù¯KÃåù™w% :”Au׋v>Tåz­ß"_P«pÞUÿ–€¨QUvŽþo׬¨ÎýÊÍ—Hô( �uëÓö¹pÂ�Ú°U"¢FI`ó–«B;7jÏ|Õ”„` m \ª¾¦Ì“?PÛ˜)ö6Mg†Ôo¤D¢DI ÂC_á)¤�)S¦8³ñÏ>û,;;[Ša( ¯ï;C*QOc§I$”„ Ù²C5n±?ÿ7=! =¬\¹òòË//W®Ü5×\óÖ[oeeeIþ‡’ ´Ûµ7üáWiáJ‰xFI”éšnö'ÿÔ[µ•³�tRPPðÄO83sG±bÅjÕªõÌ3ÏÌ™ãç~”© 'O—v´³¥¿¶Öæíñ†’(=ÛŸygÌZ, ý 4¨dÉ’¡ªrÒI'uêÔiܸqyyyRT¡$Hk7Ù­]œ ÓÿR~�D< $ÇÇ“T¬®ý�çK‰éjüøñ*T0æÏqþe«V­ÞÿýÍ›7K^BI�:~Y¤C®°Ó¦_‘ˆ”„€˜½$ü£þÏ~ÒÛŒ3?üpcŠN©R¥êׯÿßÿþwñbwï9R¤”‘Ã/¯¾ÍË«P‚`ý�ÔÒþ�7êÌ›f¬ï¿ÿ¾\¹rÆ gœqF·nÝ~úé'éÀ¡$H5Oïÿýl‰¸BIHzyùºìû^ãmÚ&»|øá‡ÆD”cŽ9¦mÛ¶Ÿ|òÉöíû¼��’ µ|Ò΢Žj¦e1Ù.uQ’Þ}}íÏö¡�5w™Dì¡C‡ƸKÙ²e›6mÚ¿ÿ5kÖHˆ‹’ТE 籜ÿÉí½a�Üb�3—ªvÆ¡Ã>1‚Dä×-dL„cÆí·�Aâêî'§8?ÕÅêtñÛ#€?8pàŸ6;Š\FFÆ…^øôÓOÿòË/®KB­ZµŒ!¢TesÁr»Aä©ïC"ò¨1Šxt4†ÄUù Í%9öGú/÷CÄJõêÕ?ýôS%á©§žj ÁQ»q§âu²�IÕ)—nÚ”Ø�SN‘1Ž7N?½iS' ¯º½tÝ Îó± Æ6mJ-’Û—÷¥X±b_|qïÞ½ÿ¿½?�®ª:ô8Ž@KËkÄ©NUðÙŠø^뫊$ QfQ, b„*âÀPQA‹LB¥‚HE@QpAA KDAA†&BF’�û{gs�¹! É 9çæ&÷ûùí?*ky“’³\û—³÷Þ{÷î­Ø›¨vf/un›šû™DÊÅž„°”uDWßkãkûš{ T‹/¶¬ '***&&fêԩŶ%PÔp�MwzÂêM)%!üø¤®ÃÍüÛ[µ/U"J“žž~É%—XV°±»AóæÍ'Nœ˜””$•J€ΞcÝò˜™c�ÞY›vI¤ ”„ðóø §å~µY"JãóùºvíjYå§V­Z-[¶œ4iÒ‰ºA!J€š/7ß9Zþ¼xíáPÔ2PÂÌKï; aÆ"‰8�~ýúYVY©S§NlllÉ5Ee $ˆéÙº¦�™l]v·¹°¥{è!YV°ã©§$â¡EkT»•yh‡Ï”€Òø|¾Áƒ[Vé©[·n\\ܬY³RS+¼Z‘’ R$§©I3åúóýÊΕHI‰‰²¬`Ç�!ñÊÚ-ª×Ö<®w?#¥ÉÉÉéÖ­›eOÆ {öì9wîܬ¬“¿˜�’ ‚lß§sºš‰W»¡*ðI¤˜¸8YV°#!A"žØ±_gw1jìß8Î@éRRR®»î:Ë ¤qãÆƒ Z¶lÙÑ£.ü‡ƒ’ ²¬ÿA¿io¦_wñ Ú’š5“e;š7—ˆû¦ë÷=Í#ú?‰f™”´víÚ‹/¾Ø.µk×nѢųÏ>»i“ËGøQDœåëU7ÖL†L•H¡õëeYQQÚ¹S"n:’§ú›‡óünÚ{P"ŽçóùÆ�ß´iÓÄÄÄ7ß|óСC’'¡$ˆDï|®Z-ÍTlÜ[±íÛ§öíeYݺ)-M"îðI·»¡~m¤(Mrrò>û¿ØÞ£$ˆPÓ:‡KÎúHŠÌìØ¡Ù³5fŒz÷V½z²¬“§�¦~ýôÜsš3G»wKää=8Å<�§´6/» jQD®‘¯8s²Ek¤L…nEfpsB%L˜ë´Ö7–J@U£$ˆhý&˜iÙ/oÒj—w|U”„°ñêÇNC;["Â%@D;Z øfrvzgmÚ%ETæÍÓ]w¹9>üP"¶`¥y�e?„&K@x $ˆt¹ùj5ØLÑ΋מ‰ „¯qBÿ‰6(  ÃYºú^3Q;§«RK!±d�Yêf?x}ÆI@8¡$€‘œfVÙÓµËè …UU¯­yäîx’û¿„J8v§¨q3ikÒƒuGðÖ6;7wNCŽ( `÷„¦ fêÖ˜žÏ|³]�޽¶ê8LyG% üPà8ÉifÅ=Ùš¤3ãÌ3HGò$ ,Q ¸Âžð»îÚ–$¸Ä~œÎ�7�Ö ý•�+¹—üó‚ÜBI€RØ=áÊD3™³§tô¸âÇýº°»y¨þôWs –‹|RÂsPÒ¼àJ”.-ÓLæè pÅÖ$]t»yœš&¸ÜlO¼l>ù”ÖZ¾^"Ü@I€*Ú6î”NÊ÷»œUF—öt£Ë´…æ“í1g™D¸„’e)ì �:kÉ ‚ Ï2òâ Ž÷¾T­–æÃŸ["ÜCI€rd昃hè 8 «6ªa'Oö!ø?ÜaóÀÉà*J€ëëm’KÉ:è œ!ƒ }¾Á¹1Í~x2r$W³e�ó‚"~„D¸�’ fšõ‘ÙÇùètÉ¥ö{Ú·z“DP¦%ëœ_ó·êòi§¶Ÿéâ;̇ß8€ëØx‚’ fzçsEŘYÔkŸH.Åî í1ŸiOþ¯‘N`ÁJý"Ö<*]žpŸ™£kúxuPøQÔXO¿n&R§¶ÑßI.%7ßé µ[éŸïJ%ÌYfÞbÙÉ�£Uà“\M~�n~È9qËõƒ’ %@Mv÷3f:uÆ-æ+·-ЀÉΡ“NqˆjmÌγqß8Éíø/Mó¯yûv‡Dx†’ &ËÍWóœÓ'Ó³%÷2e�sôdÇafù`·G»ø°—$Â¥iB†’ †;pX�{8ûGÝý­ÿ¢5ÎÙ5W&j7 ?"[FŽÚ>ìÌàg}$y�ßãÒ4¡CIPómÚ¥úÌìj€ÛÇÉoØ¡ »›O>§«Öm•HDJ:`Š¢ý4èèÕïø¬äÒ4!EI>^«:­ÌËõÝÆûSum_çÈ£ù+$a¾Þ¦óâÍpÑíÚ¼[ò _|眦úà‰ J€H1õ]3Ͳ«Â'k%W“�«n#͇GÅèÙ7%1¯Ñ¯Û™ýuý”rX:Ùü°÷„ÿº]<ü—¦Ý6J"B…’ ‚ ûF"ª%@„z}‰™‡Õj©w¿�™ŸlÃNÎ�/¾'yÿui¥Žßu׫K@U£$@Àžýå)s¡AÉÙÛÕ÷JÞäp–YÎäÿ*gu173xq–Júz›®ÿy ýµ}Ÿ’4ë%+ºø8»‹©+ìN&( `fföqè4s8i‹@¾Ù.y–%ësÇ«zkùz‰x&-Sý'šmÁößöµÕ3¯‡®˜Ù?Ù’‡�~Õ¬A€ðAI¹g™MgÆÉŠjØÓJO-0 QθÅùr·�Ò�û%â*» ¼ú±ycãÿKî1Z{J!Lá¸ö8¥µy¨R<;C N%@D+ð™å=Aö„ͦ¯¥ejÈT3}´Ž]»öèt6*¸fÃÝ8Àùi^qO¼®± I�VÎ7?Ârቒf^>pr`öVÆ(¼EÁk›w«ã0狞ÓU//–H%$§™«‹ýë‹Në ‰ï˜÷6¡7b¦ùš? Õ›$ ŒQÀñÝ�Š$+º¬Ñz°Â|ô]žà|é?Þ§/¾“HÊÔð™ÎQ1JSew“å¨Í½÷¥D„=JçµOÌ93'* ö,sW²ÂØ3Ë) œ3:íqûßCý T_9fCpýÎ_]³^Uüûû¼£¡Û •DI€âgiðÏ»JŽ3¥�'5C~^U7Vƒ^0¿ ljdçêstzgçGve"¿¿€Š¡$@é6ïÜÂ[t\Ø]ª¢|¿Kí†:߯¯n6G3yz*ku”›¯Ió&hþ ‰@Q ,¬Öï{Ê:¾'|²Vªº,Z£› Üøvã½µ¼j¶á†•ƒé;;°ûüw™]æ,CI€r䘫p wøo0¨r[öè�Iæ.ÿ·tn¼žü·~:$E^ÖmU¯±�‹ðÎéªW>¤@¥P (‡2ÍNÿF…SÛ„Ë–€Œ½0_—ݸœëÎÑZµQЀ俛w×õ ì)ï8L~%¨4JT@áõß‘Â&>™P·<¦Z-ç¥Î\¬œ<É£¤§káB�©N�§'ŸÔ¢EÊÊ’B‘ow˜{- 74訿ýSÛ÷I\BI€ [ø¥¹.7 íØ¯‡§VF5ê¬Gþ¥�;%w³l™.¸@–U|\r‰V¯–¼Ê¶$=õZàâÿ±E/½ïe€HEI€“‘›/…k²s5c‘™@N¦›õÒã3´v‹Tù ®¨(YVé£vm�'¹™¤÷–®íø¿S¯­:?¦•ßJ¼AI€kŵĹlØ?Îï¦þµdÝÉž†4¾,«œaWˆO?•*•üs½ô/ë†þ�sœêƪËš½Ô´ €§( PÃåä™õQ÷þÃûSô ×Öƒ5j–) YG¤`’œ¬³Î’e•?.¼PRÅRà3ç=ûfñbsjóÞà�¥ÊÌ‘„%"…OZó½�nVm µ[éO5—L¿ó¹YÛsBÇ˲‚Ï?/•ŸŸ™–2òóŠ AGý®šô0ÅfÖGJ �ƒ¤ ¢P mK2ûz?g.+\Ïã ;éúþJcî&›¿Âè”wôؿӶ­,+ØÑ½øÅÔvEÙ{PË×kÊõ¯;êb·Ô�¯žOëåÅÚù“D êP Ò¥fèýUö’¢ê—7ÉŠ.eØÓ÷Ôº�dYAŽƒg70Y·ÿÝ,jºâã•’"¨Þ( €Š›9S­[«A§4j¤›nÒœ9€š€’¨„íÛµs§D Fù×iªÖ6×-IEND®B`‚stevengj-nlopt-88c424d/doc/docs/index.md000066400000000000000000000107401521061417600201660ustar00rootroot00000000000000--- # NLopt --- ![center|600px](images/Nlopt-logo.png) NLopt ----- **NLopt** is a free/open-source library for **nonlinear optimization**, providing a common interface for a number of different free optimization routines available online as well as original implementations of various other algorithms. Its features include: - Callable from [C](NLopt_Reference.md), [C++](NLopt_C-plus-plus_Reference.md), [Fortran](NLopt_Fortran_Reference.md), [Matlab or GNU Octave](NLopt_Matlab_Reference.md), [Python](NLopt_Python_Reference.md), [GNU Guile](NLopt_Guile_Reference.md), [Java](NLopt_Java_Reference.md), [Julia](https://github.com/stevengj/NLopt.jl), [GNU R](NLopt_R_Reference.md), [Lua](https://github.com/rochus-keller/LuaNLopt), [OCaml](https://bitbucket.org/mkur/nlopt-ocaml), [Rust](https://github.com/adwhit/rust-nlopt) and [Crystal](https://github.com/konovod/nlopt.cr). - A common interface for [many different algorithms](NLopt_Algorithms.md)—try a different algorithm just by changing one parameter. - Support for large-scale optimization (some algorithms scalable to millions of parameters and thousands of constraints). - Both global and local optimization algorithms. - Algorithms using function values only (derivative-free) and also algorithms exploiting user-supplied gradients. - Algorithms for unconstrained optimization, bound-constrained optimization, and general nonlinear inequality/equality constraints. - Free/open-source software under the [GNU LGPL](https://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License) (and looser licenses for some portions of NLopt). See the [NLopt Introduction](NLopt_Introduction.md) for a further overview of the types of problems it addresses. Download and installation ------------------------- Version 2.10.1 of NLopt is the latest version available from GitHub: - [v2.10.1.tar.gz](https://github.com/stevengj/nlopt/archive/refs/tags/v2.10.1.tar.gz) See the [NLopt release notes](https://github.com/stevengj/nlopt/blob/master/NEWS.md) for the release history. NLopt is designed to be installed on any Unix-like system (GNU/Linux is fine) with a C compiler, using the standard ``` cmake . && make && sudo make install ``` procedure. See the [NLopt Installation](NLopt_Installation.md) instructions for more information. For Microsoft Windows, see [NLopt on Windows](NLopt_on_Windows.md) for more information and precompiled libraries. For **developers**, the latest development sources can be found at [](https://github.com/stevengj/nlopt). Documentation and Mailing Lists ------------------------------- See the [NLopt manual](NLopt_Introduction.md) for information on how to use NLopt and what optimization algorithms it includes. Please [cite NLopt](Citing_NLopt.md) and the authors of the algorithm(s) you use in any publication that stems from your use of NLopt. ### Mailing Lists The NLopt mailing lists (and their archives) are another source of information about NLopt. Subscribe to the (read-only) [nlopt-announce mailing list](http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-announce) to receive an email when NLopt is updated in the future. Subscribe to the (unmoderated) [nlopt-discuss mailing list](http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss) for discussion of questions and ideas about using NLopt. As an alternative to the *nlopt-announce* mailing list, an [Atom newsfeed](https://en.wikipedia.org/wiki/Atom_(standard)) for NLopt releases is available from the [Freshmeat.net NLopt page](http://freshmeat.net/projects/nlopt). Acknowledgements ---------------- We are grateful to the many authors who have published useful optimization algorithms implemented in NLopt, especially those who have provided free/open-source implementations of their algorithms. *Please cite* these authors if you use their code or the implementation of their algorithm in NLopt. See the documentation for the appropriate citation for each of the [algorithms in NLopt](NLopt_Algorithms.md) — please see the [Citing NLopt](Citing_NLopt.md) information. Contact and Feedback -------------------- For bug reports and feature requests, please [file a github issue](https://github.com/stevengj/nlopt/issues). If you have questions or problems regarding NLopt, you are encouraged query the [nlopt-discuss mailing list](http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss) (see above). As your first resort, please look at the [nlopt-discuss archives](http://ab-initio.mit.edu/pipermail/nlopt-discuss/). stevengj-nlopt-88c424d/doc/requirements.txt000066400000000000000000000000251521061417600210640ustar00rootroot00000000000000python-markdown-math stevengj-nlopt-88c424d/mkdocs.yml000066400000000000000000000025631521061417600170470ustar00rootroot00000000000000site_name: NLopt Documentation site_author: S. G. Johnson et al. repo_url: https://github.com/stevengj/nlopt/ edit_uri: edit/master/doc/docs docs_dir: 'doc/docs' site_dir: 'doc/site' theme: readthedocs markdown_extensions: - wikilinks - toc: title: Table of Contents - attr_list - fenced_code - mdx_math: enable_dollar_delimiter: True extra_javascript: ['https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML','mathjaxhelper.js'] nav: - NLopt: - Overview: index.md - FAQ: NLopt_FAQ.md - NLopt manual: - NLopt manual: NLopt_manual.md - Introduction: NLopt_Introduction.md - Installation: NLopt_Installation.md - Tutorial: NLopt_Tutorial.md - NLopt reference: - General reference: NLopt_Reference.md - C++ reference: NLopt_C-plus-plus_Reference.md - Fortran reference: NLopt_Fortran_Reference.md - Matlab reference: NLopt_Matlab_Reference.md - Python reference: NLopt_Python_Reference.md - Guile reference: NLopt_Guile_Reference.md - R reference: NLopt_R_Reference.md - Java reference: NLopt_Java_Reference.md - Deprecated API reference: NLopt_Deprecated_API_Reference.md - NLopt algorithms: - NLopt algorithms: NLopt_Algorithms.md - NLopt on Windows: NLopt_on_Windows.md - License and Copyright: NLopt_License_and_Copyright.md - Citing NLopt: Citing_NLopt.md stevengj-nlopt-88c424d/nlopt.pc.in000066400000000000000000000004471521061417600171300ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${exec_prefix}/@NLOPT_INSTALL_LIBDIR@ includedir=${prefix}/include Name: NLopt Description: nonlinear optimization library Version: @NLOPT_VERSION_STRING@ Libs: -L${libdir} -lnlopt Libs.private: @LIBS_PRIVATE@ Cflags: -I${includedir} stevengj-nlopt-88c424d/nlopt_config.h.in000066400000000000000000000101031521061417600202700ustar00rootroot00000000000000/*============================================================================== # NLOPT CMake configuration file # # NLopt is a free/open-source library for nonlinear optimization, providing # a common interface for a number of different free optimization routines # available online as well as original implementations of various other # algorithms # WEBSITE: http://ab-initio.mit.edu/wiki/index.php/NLopt # AUTHOR: Steven G. Johnson # # This config.cmake.h.in file was created to compile NLOPT with the CMAKE utility. # Benoit Scherrer, 2010 CRL, Harvard Medical School # Copyright (c) 2008-2009 Children's Hospital Boston # # Minor changes to the source was applied to make possible the compilation with # Cmake under Linux/Win32 #============================================================================*/ /* Bugfix version number. */ #define BUGFIX_VERSION @NLOPT_BUGFIX_VERSION@ /* Define to enable extra debugging code. */ #undef DEBUG /* Define to 1 if you have the `BSDgettimeofday' function. */ #undef HAVE_BSDGETTIMEOFDAY /* Define if the copysign function/macro is available. */ #cmakedefine HAVE_COPYSIGN /* Define if the fpclassify() function/macro is available. */ #cmakedefine HAVE_FPCLASSIFY /* Define to 1 if you have the header file. */ #cmakedefine HAVE_GETOPT_H /* Define to 1 if you have the getopt function in your standard library. */ #cmakedefine HAVE_GETOPT /* Define to 1 if you have the `getpid' function. */ #cmakedefine HAVE_GETPID /* Define if syscall(SYS_gettid) available. */ #undef HAVE_GETTID_SYSCALL /* Define to 1 if you have the `gettimeofday' function. */ #cmakedefine HAVE_GETTIMEOFDAY /* Define if the isinf() function/macro is available. */ #cmakedefine HAVE_ISINF /* Define if the isnan() function/macro is available. */ #cmakedefine HAVE_ISNAN /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `qsort_r' function. */ #cmakedefine HAVE_QSORT_R /* Define to 1 if you have the header file. */ #cmakedefine HAVE_STDINT_H /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_TIME_H /* Define to 1 if you have the `time' function. */ #cmakedefine HAVE_TIME /* Define to 1 if the system has the type `uint32_t'. */ #cmakedefine HAVE_UINT32_T /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Major version number. */ #define MAJOR_VERSION @NLOPT_MAJOR_VERSION@ /* Minor version number. */ #define MINOR_VERSION @NLOPT_MINOR_VERSION@ /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* replacement for broken HUGE_VAL macro, if needed */ #undef REPLACEMENT_HUGE_VAL /* The size of `unsigned int', as computed by sizeof. */ #define SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@ /* The size of `unsigned long', as computed by sizeof. */ #define SIZEOF_UNSIGNED_LONG @SIZEOF_UNSIGNED_LONG@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to C thread-local keyword, or to nothing if this is not supported in your compiler. */ #define THREADLOCAL @THREADLOCAL@ /* Define to 1 if you can safely include both and . */ #cmakedefine TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* Define if compiled including C++-based routines */ #cmakedefine NLOPT_CXX /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif stevengj-nlopt-88c424d/src/000077500000000000000000000000001521061417600156255ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/000077500000000000000000000000001521061417600165535ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/ags/000077500000000000000000000000001521061417600173255ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/ags/COPYRIGHT000066400000000000000000000020661521061417600206240ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2018 Sovrasov V. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. stevengj-nlopt-88c424d/src/algs/ags/README000066400000000000000000000015061521061417600202070ustar00rootroot00000000000000An implementation of the algorithm AGS to solve constrained nonlinear programming problems with Lipschitzian functions. AGS was introduced by prof. R.G. Strongin (see R. G. Strongin, D. L. Markin, ,Minimization of multiextremal functions under nonconvex constraints, Cybernetics 22(4), 486-493. Translated from Russian. Consultant Bureau. New York, 1986.). The method exploits Peano-type curve to reduce dimension of the source bounded multidimensional constrained NLP problem and then solves a univariate one. AGS is proven to converge to a global optima if all objectives and constraints satisfy Lipschitz condition in a given hyperrectangle, the reliability parameter r is large enough and accuracy parameter eps is zero. Contributed to NLopt by Vladislav Sovrasov from https://github.com/sovrasov/glob_search_nlp_solverstevengj-nlopt-88c424d/src/algs/ags/ags.cc000066400000000000000000000070371521061417600204150ustar00rootroot00000000000000// A C-callable front-end to the AGS global-optimization library. // -- Vladislav Sovrasov #include "ags.h" #include "solver.hpp" #include #include #include #include double ags_eps = 0; double ags_r = 3; double eps_res = 0.001; unsigned evolvent_density = 12; int ags_refine_loc = 0; int ags_verbose = 0; int ags_minimize(unsigned n, nlopt_func func, void *data, unsigned m, nlopt_constraint *fc, double *x, double *minf, const double *l, const double *u, nlopt_stopping *stop) { int ret_code = NLOPT_SUCCESS; if (n > ags::solverMaxDim) return NLOPT_INVALID_ARGS; if(m != nlopt_count_constraints(m, fc) || m > ags::solverMaxConstraints) return NLOPT_INVALID_ARGS; if (ags_verbose && n > 5) std::cout << "Warning: AGS is unstable when dimension > 5" << std::endl; std::vector lb(l, l + n); std::vector ub(u, u + n); std::vector functions; for (unsigned i = 0; i < m; i++) { if (fc[i].m != 1) return NLOPT_INVALID_ARGS; functions.push_back([fc, n, i](const double* x_) { double val = 0; nlopt_eval_constraint(&val, NULL, &fc[i], n, x_); return val; }); } functions.push_back([func, data, n, stop](const double* x_) { ++ *(stop->nevals_p); return func(n, x_, NULL, data);}); ags::SolverParameters params; params.r = ags_r; params.itersLimit = stop->maxeval != 0 ? stop->maxeval : std::numeric_limits::max(); params.eps = ags_eps; params.evolventDensity = evolvent_density; params.epsR = eps_res; params.stopVal = stop->minf_max; params.refineSolution = static_cast(ags_refine_loc); ags::NLPSolver solver; solver.SetParameters(params); solver.SetProblem(functions, lb, ub); ags::Trial optPoint; try { auto external_stop_func = [stop, &ret_code](){ if (nlopt_stop_time(stop)) { ret_code = NLOPT_MAXTIME_REACHED; return true; } else if (nlopt_stop_forced(stop)) { ret_code = NLOPT_FORCED_STOP; return true; } else return false; }; optPoint = solver.Solve(external_stop_func); } catch (const std::exception& exp) { std::cerr << "AGS internal error: " << std::string(exp.what()) << std::endl; return NLOPT_FAILURE; } if (ags_verbose) { auto calcCounters = solver.GetCalculationsStatistics(); auto holderConstEstimations = solver.GetHolderConstantsEstimations(); std::cout << std::string(20, '-') << "AGS statistics: " << std::string(20, '-') << std::endl; for (size_t i = 0; i < calcCounters.size() - 1; i++) std::cout << "Number of calculations of constraint # " << i << ": " << calcCounters[i] << "\n"; std::cout << "Number of calculations of objective: " << calcCounters.back() << "\n";; for (size_t i = 0; i < holderConstEstimations.size() - 1; i++) std::cout << "Estimation of Holder constant of function # " << i << ": " << holderConstEstimations[i] << "\n"; std::cout << "Estimation of Holder constant of objective: " << holderConstEstimations.back() << "\n"; if (optPoint.idx != static_cast(m)) std::cout << "Feasible point not found" << "\n"; std::cout << std::string(40, '-') << std::endl; } if (static_cast(m) == optPoint.idx) { memcpy(x, optPoint.y, n*sizeof(x[0])); *minf = optPoint.g[optPoint.idx]; } else //feasible point not found. return NLOPT_FAILURE; if (solver.GetCalculationsStatistics()[0] >= params.itersLimit) return NLOPT_MAXEVAL_REACHED; return ret_code; } stevengj-nlopt-88c424d/src/algs/ags/ags.h000066400000000000000000000030001521061417600202410ustar00rootroot00000000000000/* A C-callable front-end to the AGS global-optimization library. -- Vladislav Sovrasov */ #ifndef AGS_H #define AGS_H #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* The algorithm supports 3 types of stop criterions: stop by execution time, stop by value and stop by exceeding limit of iterations. */ int ags_minimize(unsigned n, nlopt_func func, void *data, unsigned m, nlopt_constraint *fc, double *x, double *minf, const double *l, const double *u, nlopt_stopping *stop); extern double ags_eps; /* method tolerance in Holder metric on 1d interval. Less value -- better search precision, less probability of early stop. */ extern double ags_r; /* reliability parameter. Higher value of r -- slower convergence, higher chance to cache the global minima. */ extern double eps_res; /* parameter which prevents method from paying too much attention to constraints. Greater values of this parameter speed up convergence, but global minima can be lost. */ extern unsigned evolvent_density; /* density of evolvent. By default density is 2^-12 on hybercube [0,1]^N, which means that maximum search accuracyis 2^-12. If search hypercube is large the density can be increased accordingly to achieve better accuracy. */ extern int ags_refine_loc; /* refine the final optimum using built-in local optimizer */ extern int ags_verbose; /* print additional info */ #ifdef __cplusplus } #endif #endif stevengj-nlopt-88c424d/src/algs/ags/data_types.hpp000066400000000000000000000027751521061417600222060ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #pragma once #include #include #define NLP_SOLVER_ERROR(msg) throw std::runtime_error(std::string(msg)) #define NLP_SOLVER_ASSERT(expr, msg) if(!(expr)) NLP_SOLVER_ERROR(msg) namespace ags { const unsigned solverMaxDim = 10; const unsigned solverMaxConstraints = 10; template class IGOProblem { public: ~IGOProblem() {} virtual fptype Calculate(const fptype* y, int fNumber) const = 0; virtual int GetConstraintsNumber() const = 0; virtual int GetDimension() const = 0; virtual void GetBounds(fptype* left, fptype* right) const = 0; virtual int GetOptimumPoint(fptype* y) const = 0; virtual fptype GetOptimumValue() const = 0 ; }; struct Trial { double x; double y[solverMaxDim]; double g[solverMaxConstraints + 1]; int idx; Trial() {} Trial(double _x) : x(_x) {} }; struct Interval { Trial pl; Trial pr; double R; double delta; Interval() {} Interval(const Trial& _pl, const Trial& _pr) : pl(_pl), pr(_pr) {} }; struct CompareIntervals { bool operator() (const Interval* i1, const Interval* i2) const { return i1->pl.x < i2->pl.x; } }; class CompareByR { public: bool operator() (const Interval* i1, const Interval* i2) const { return i1->R < i2->R; } }; } stevengj-nlopt-88c424d/src/algs/ags/evolvent.cc000066400000000000000000000101531521061417600214760ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #include "evolvent.hpp" #include #include #include using namespace ags; void mapd(double x, int m, double* y, int n, int key = 1); /* map x to y */ Evolvent::Evolvent() { mIsInitialized = false; } Evolvent::~Evolvent() { } Evolvent::Evolvent(int dimension, int tightness, const double* lb, const double* ub) { assert(tightness > 2); mDimension = dimension; mTightness = tightness; mShiftScalars.resize(mDimension); mRho.resize(mDimension); for (int i = 0; i < mDimension; i++) { mRho[i] = ub[i] - lb[i]; mShiftScalars[i] = 0.5*(lb[i] + ub[i]); } mIsInitialized = true; } void Evolvent::TransformToStandardCube(const double *y, double *z) { for (int i = 0; i < mDimension; i++) z[i] = (y[i] - mShiftScalars[i]) / mRho[i]; } void Evolvent::TransformToSearchDomain(const double *y, double *z) { for (int i = 0; i < mDimension; i++) z[i] = mRho[i]*y[i] + mShiftScalars[i]; } void Evolvent::GetImage(double x, double y[]) { if(mDimension != 1) mapd(x, mTightness, y, mDimension); else y[0] = x - 0.5; TransformToSearchDomain(y, y); } void mapd(double x, int m, double* y, int n, int key) { /* mapping y(x) : 1 - center, 2 - line, 3 - node */ // use key = 1 int n1, nexp, l, iq, iu[10], iv[10]; double d, mne, dd, dr;//,tmp; double p, r; int iw[11]; int it, is = 0, i, j, k; void node(int is, int n1, int nexp, int& l, int& iq, int iu[], int iv[]); p = 0.0; n1 = n - 1; for (nexp = 1, i = 0; i 2) { dr = mne / nexp; dr = dr - fmod(dr, 1.0); //dr=(dr>0)?floor(dr):ceil(dr); dd = mne - dr; dr = d*dd; dd = dr - fmod(dr, 1.0); //dd=(dr>0)?floor(dr):ceil(dr); dr = dd + (dd - 1) / (nexp - 1); dd = dr - fmod(dr, 1.0); //dd=(dr>0)?floor(dr):ceil(dr); d = dd*(1. / (mne - 1.0)); } for (j = 0; j(d); d = d - is; } i = is; node(i, n1, nexp, l, iq, iu, iv); i = iu[0]; iu[0] = iu[it]; iu[it] = i; i = iv[0]; iv[0] = iv[it]; iv[it] = i; if (l == 0) l = it; else if (l == it) l = 0; if ((iq>0) || ((iq == 0) && (is == 0))) k = l; else if (iq<0) k = (it == n1) ? 0 : n1; r = r*0.5; it = l; for (i = 0; i= iff) { if ((is == iff) && (is != 1)) { l = i; iq = -1; } is = is - iff; k2 = 1; } else { k2 = -1; if ((is == (iff - 1)) && (is != 0)) { l = i; iq = 1; } } j = -k1*k2; iv[i] = j; iu[i] = j; k1 = k2; } iv[l] = iv[l] * iq; iv[n1] = -iv[n1]; } } stevengj-nlopt-88c424d/src/algs/ags/evolvent.hpp000066400000000000000000000013731521061417600217040ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #pragma once #include namespace ags { class Evolvent { protected: int mDimension; int mTightness; std::vector mRho; std::vector mShiftScalars; void TransformToStandardCube(const double *y, double *z); void TransformToSearchDomain(const double *y, double *z); bool mIsInitialized; public: Evolvent(); Evolvent(int dimension, int tightness, const double* lb, const double* ub); ~Evolvent(); virtual void GetImage(double x, double y[]); }; } stevengj-nlopt-88c424d/src/algs/ags/local_optimizer.cc000066400000000000000000000077321521061417600230410ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #include "local_optimizer.hpp" #include #include #include using namespace ags; #define MAX_LOCAL_ITERATIONS_NUMBER 20 void HookeJeevesOptimizer::SetParameters(double eps, double step, double stepMult) { NLP_SOLVER_ASSERT(eps > 0 && step > 0 && stepMult > 0, "Wrong papameters of the local optimizer"); mEps = eps; mStep = step; mStepMultiplier = stepMult; } Trial HookeJeevesOptimizer::Optimize(std::shared_ptr> problem, const Trial& startPoint, std::vector& trialsCounters) { mProblem = problem; mStartPoint = startPoint; mTrialsCounters = std::vector(mProblem->GetConstraintsNumber() + 1, 0); int k = 0, i=0; bool needRestart = true; /* currentFvalue will be initialized below, init here to avoid maybe-uninitialized warning */ double currentFValue = 0.0, nextFValue; while (i < MAX_LOCAL_ITERATIONS_NUMBER) { i++; if (needRestart) { k = 0; mCurrentPoint = mStartPoint; mCurrentResearchDirection = mStartPoint; currentFValue = ComputeObjective(mCurrentPoint.y); needRestart = false; } std::swap(mPreviousResearchDirection, mCurrentResearchDirection); mCurrentResearchDirection = mCurrentPoint; nextFValue = MakeResearch(mCurrentResearchDirection.y); if (currentFValue > nextFValue) { DoStep(); k++; currentFValue = nextFValue; } else if (mStep > mEps) { if (k != 0) std::swap(mStartPoint, mPreviousResearchDirection); else mStep /= mStepMultiplier; needRestart = true; } else break; } mPreviousResearchDirection.idx = 0; while (mPreviousResearchDirection.idx < mProblem->GetConstraintsNumber()) { mTrialsCounters[mPreviousResearchDirection.idx]++; mPreviousResearchDirection.g[mPreviousResearchDirection.idx] = mProblem->Calculate(mPreviousResearchDirection.y, mPreviousResearchDirection.idx); if (mPreviousResearchDirection.g[mPreviousResearchDirection.idx] > 0) break; mPreviousResearchDirection.idx++; } if (mPreviousResearchDirection.idx == mProblem->GetConstraintsNumber()) { mPreviousResearchDirection.g[mPreviousResearchDirection.idx] = mProblem->Calculate(mPreviousResearchDirection.y, mPreviousResearchDirection.idx); mTrialsCounters[mPreviousResearchDirection.idx]++; } for(size_t j = 0; j < mTrialsCounters.size(); ++ j) trialsCounters[i] += mTrialsCounters[i]; return mPreviousResearchDirection; } void HookeJeevesOptimizer::DoStep() { for (int i = 0; i < mProblem->GetDimension(); i++) mCurrentPoint.y[i] = (1 + mStepMultiplier)*mCurrentResearchDirection.y[i] - mStepMultiplier*mPreviousResearchDirection.y[i]; } double HookeJeevesOptimizer::ComputeObjective(const double* x) const { for (int i = 0; i <= mProblem->GetConstraintsNumber(); i++) { double value = mProblem->Calculate(x, i); mTrialsCounters[i]++; if (i < mProblem->GetConstraintsNumber() && value > 0) return std::numeric_limits::max(); else if (i == mProblem->GetConstraintsNumber()) return value; } return std::numeric_limits::max(); } double HookeJeevesOptimizer::MakeResearch(double* startPoint) { double bestValue = ComputeObjective(startPoint); for (int i = 0; i < mProblem->GetDimension(); i++) { startPoint[i] += mStep; double rightFvalue = ComputeObjective(startPoint); if (rightFvalue > bestValue) { startPoint[i] -= 2 * mStep; double leftFValue = ComputeObjective(startPoint); if (leftFValue > bestValue) startPoint[i] += mStep; else bestValue = leftFValue; } else bestValue = rightFvalue; } return bestValue; } stevengj-nlopt-88c424d/src/algs/ags/local_optimizer.hpp000066400000000000000000000017441521061417600232400ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #pragma once #include "data_types.hpp" #include #include namespace ags { class HookeJeevesOptimizer { private: double mEps; double mStep; double mStepMultiplier; mutable std::vector mTrialsCounters; std::shared_ptr> mProblem; Trial mCurrentPoint; Trial mStartPoint; Trial mCurrentResearchDirection; Trial mPreviousResearchDirection; void DoStep(); double ComputeObjective(const double* x) const; double MakeResearch(double*); public: void SetParameters(double eps, double step, double stepMult); Trial Optimize(std::shared_ptr> problem, const Trial& startPoint, std::vector& trialsCounters); }; } stevengj-nlopt-88c424d/src/algs/ags/solver.cc000066400000000000000000000312451521061417600211530ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #include "solver.hpp" #include #include using namespace ags; namespace { const double zeroHLevel = 1e-12; class ProblemInternal : public IGOProblem { private: std::vector mFunctions; std::vector mLeftBound; std::vector mRightBound; unsigned mDimension; unsigned mConstraintsNumber; public: ProblemInternal(const std::vector& functions, const std::vector& leftBound, const std::vector& rightBound) { mFunctions = functions; mConstraintsNumber = static_cast(mFunctions.size() - 1); mDimension = static_cast(leftBound.size()); mLeftBound = leftBound; mRightBound = rightBound; } virtual ~ProblemInternal() {} double Calculate(const double* y, int fNumber) const { return mFunctions[fNumber](y); } int GetConstraintsNumber() const { return mConstraintsNumber; } int GetDimension() const { return mDimension; } void GetBounds(double* left, double* right) const { for(size_t i = 0; i < mDimension; i++) { left[i] = mLeftBound[i]; right[i] = mRightBound[i]; } } int GetOptimumPoint(double*) const {return 0;} double GetOptimumValue() const {return 0;} }; } NLPSolver::NLPSolver() {} void NLPSolver::SetParameters(const SolverParameters& params) { mParameters = params; } void NLPSolver::SetProblem(std::shared_ptr> problem) { mProblem = problem; NLP_SOLVER_ASSERT(mProblem->GetConstraintsNumber() <= (int)solverMaxConstraints, "Current implementation supports up to " + std::to_string(solverMaxConstraints) + " nonlinear inequality constraints"); InitLocalOptimizer(); } void NLPSolver::SetProblem(const std::vector& functions, const std::vector& leftBound, const std::vector& rightBound) { NLP_SOLVER_ASSERT(leftBound.size() == rightBound.size(), "Inconsistent dimensions of bounds"); NLP_SOLVER_ASSERT(leftBound.size() > 0, "Zero problem dimension"); mProblem = std::make_shared(functions, leftBound, rightBound); NLP_SOLVER_ASSERT(mProblem->GetConstraintsNumber() <= (int)solverMaxConstraints, "Current implementation supports up to " + std::to_string(solverMaxConstraints) + " nonlinear inequality constraints"); InitLocalOptimizer(); } std::vector NLPSolver::GetCalculationsStatistics() const { return mCalculationsCounters; } std::vector NLPSolver::GetHolderConstantsEstimations() const { return mHEstimations; } void NLPSolver::InitLocalOptimizer() { std::vector leftBound(mProblem->GetDimension()); std::vector rightBound(mProblem->GetDimension()); mProblem->GetBounds(leftBound.data(), rightBound.data()); double maxSize = 0; for(size_t i = 0; i < leftBound.size(); i++) maxSize = std::max(rightBound[i] - leftBound[i], maxSize); NLP_SOLVER_ASSERT(maxSize > 0, "Empty search domain"); mLocalOptimizer.SetParameters(maxSize / 1000, maxSize / 100, 2); } void NLPSolver::InitDataStructures() { double leftDomainBound[solverMaxDim], rightDomainBound[solverMaxDim]; mProblem->GetBounds(leftDomainBound, rightDomainBound); mEvolvent = Evolvent(mProblem->GetDimension(), mParameters.evolventDensity, leftDomainBound, rightDomainBound); mNextPoints.resize(mParameters.numPoints); mOptimumEstimation.idx = -1; mZEstimations.resize(mProblem->GetConstraintsNumber() + 1); std::fill(mZEstimations.begin(), mZEstimations.end(), std::numeric_limits::max()); mNextIntervals.resize(mParameters.numPoints); mHEstimations.resize(mProblem->GetConstraintsNumber() + 1); std::fill(mHEstimations.begin(), mHEstimations.end(), 1.0); mCalculationsCounters.resize(mProblem->GetConstraintsNumber() + 1); std::fill(mCalculationsCounters.begin(), mCalculationsCounters.end(), 0); mQueue = PriorityQueue(); mIterationsCounter = 0; mMinDelta = std::numeric_limits::max(); mMaxIdx = -1; } void NLPSolver::ClearDataStructures() { for (const auto& ptr : mSearchInformation) delete ptr; mSearchInformation.clear(); mQueue = PriorityQueue(); } Trial NLPSolver::Solve() { return Solve([](){return false;}); } Trial NLPSolver::Solve(std::function externalStopFunc) { mNeedStop = false; InitDataStructures(); FirstIteration(); do { InsertIntervals(); EstimateOptimum(); if (mNeedRefillQueue || mQueue.size() < mParameters.numPoints) RefillQueue(); CalculateNextPoints(); MakeTrials(); mNeedStop = mNeedStop || mMinDelta < mParameters.eps || externalStopFunc(); mIterationsCounter++; } while(mIterationsCounter < mParameters.itersLimit && !mNeedStop); ClearDataStructures(); if (mParameters.refineSolution && mOptimumEstimation.idx == mProblem->GetConstraintsNumber()) { auto localTrial = mLocalOptimizer.Optimize(mProblem, mOptimumEstimation, mCalculationsCounters); int idx = mOptimumEstimation.idx; if (localTrial.idx == idx && localTrial.g[idx] < mOptimumEstimation.g[idx]) mOptimumEstimation = localTrial; } return mOptimumEstimation; } void NLPSolver::FirstIteration() { Trial leftBound = Trial(0); leftBound.idx = -1; Trial rightBound = Trial(1.); rightBound.idx = -1; for (size_t i = 1; i <= mParameters.numPoints; i++) { mNextPoints[i - 1] = Trial(static_cast(i) / (mParameters.numPoints + 1)); mEvolvent.GetImage(mNextPoints[i - 1].x, mNextPoints[i - 1].y); } MakeTrials(); EstimateOptimum(); for (size_t i = 0; i <= mParameters.numPoints; i++) { Interval* pNewInterval; if (i == 0) pNewInterval = new Interval(leftBound, mNextPoints[i]); else if (i == mParameters.numPoints) pNewInterval = new Interval(mNextPoints[i - 1], rightBound); else pNewInterval = new Interval(mNextPoints[i - 1], mNextPoints[i]); pNewInterval->delta = pow(pNewInterval->pr.x - pNewInterval->pl.x, 1. / mProblem->GetDimension()); mMinDelta = std::min(mMinDelta, pNewInterval->delta); auto insRes = mSearchInformation.insert(pNewInterval); UpdateAllH(insRes.first); } RefillQueue(); CalculateNextPoints(); MakeTrials(); mIterationsCounter += 2; } void NLPSolver::MakeTrials() { for (size_t i = 0; i < mNextPoints.size(); i++) { int idx = 0; while(idx < mProblem->GetConstraintsNumber()) { mNextPoints[i].idx = idx; double val = mProblem->Calculate(mNextPoints[i].y, idx); mCalculationsCounters[idx]++; mNextPoints[i].g[idx] = val; if (val > 0) break; idx++; } if(idx > mMaxIdx) { mMaxIdx = idx; for(int j = 0; j < mMaxIdx; ++ j) mZEstimations[j] = -mParameters.epsR*mHEstimations[j]; mNeedRefillQueue = true; } if (idx == mProblem->GetConstraintsNumber()) { mCalculationsCounters[idx]++; mNextPoints[i].idx = idx; mNextPoints[i].g[idx] = mProblem->Calculate(mNextPoints[i].y, idx); } if(mNextPoints[i].idx == mMaxIdx && mNextPoints[i].g[mMaxIdx] < mZEstimations[mMaxIdx]) { mZEstimations[mMaxIdx] = mNextPoints[i].g[mMaxIdx]; mNeedRefillQueue = true; } } } void NLPSolver::InsertIntervals() { for (size_t i = 0; i < mParameters.numPoints; i++) { Interval* pOldInterval = mNextIntervals[i]; Interval* pNewInterval = new Interval(mNextPoints[i], pOldInterval->pr); pOldInterval->pr = mNextPoints[i]; pOldInterval->delta = pow(pOldInterval->pr.x - pOldInterval->pl.x, 1. / mProblem->GetDimension()); pNewInterval->delta = pow(pNewInterval->pr.x - pNewInterval->pl.x, 1. / mProblem->GetDimension()); mMinDelta = std::min(mMinDelta, pNewInterval->delta); mMinDelta = std::min(mMinDelta, pOldInterval->delta); auto insResult = mSearchInformation.insert(pNewInterval); bool wasInserted = insResult.second; if(!wasInserted) throw std::runtime_error("Error during interval insertion."); UpdateAllH(insResult.first); UpdateAllH(--insResult.first); if(!mNeedRefillQueue) { pNewInterval->R = CalculateR(pNewInterval); mNextIntervals[i]->R = CalculateR(mNextIntervals[i]); mQueue.push(pNewInterval); mQueue.push(pOldInterval); } } } void NLPSolver::CalculateNextPoints() { for(size_t i = 0; i < mParameters.numPoints; i++) { mNextIntervals[i] = mQueue.top(); mQueue.pop(); mNextPoints[i].x = GetNextPointCoordinate(mNextIntervals[i]); if (mNextPoints[i].x >= mNextIntervals[i]->pr.x || mNextPoints[i].x <= mNextIntervals[i]->pl.x) mNeedStop = true; mEvolvent.GetImage(mNextPoints[i].x, mNextPoints[i].y); } } void NLPSolver::RefillQueue() { mQueue = PriorityQueue(); for (const auto& pInterval : mSearchInformation) { pInterval->R = CalculateR(pInterval); mQueue.push(pInterval); } mNeedRefillQueue = false; } void NLPSolver::EstimateOptimum() { for (size_t i = 0; i < mNextPoints.size(); i++) { if (mOptimumEstimation.idx < mNextPoints[i].idx || (mOptimumEstimation.idx == mNextPoints[i].idx && mOptimumEstimation.g[mOptimumEstimation.idx] > mNextPoints[i].g[mNextPoints[i].idx])) { mOptimumEstimation = mNextPoints[i]; mNeedRefillQueue = true; if (mOptimumEstimation.idx == mProblem->GetConstraintsNumber() && mOptimumEstimation.g[mOptimumEstimation.idx] < mParameters.stopVal) mNeedStop = true; } } } void NLPSolver::UpdateH(double newValue, int index) { if (newValue > mHEstimations[index] || (mHEstimations[index] == 1.0 && newValue > zeroHLevel)) { mHEstimations[index] = newValue; mNeedRefillQueue = true; } } void NLPSolver::UpdateAllH(std::set::iterator iterator) { Interval* pInterval = *iterator; if (pInterval->pl.idx < 0) return; if (pInterval->pl.idx == pInterval->pr.idx) UpdateH(fabs(pInterval->pr.g[pInterval->pr.idx] - pInterval->pl.g[pInterval->pl.idx]) / pInterval->delta, pInterval->pl.idx); else { auto rightIterator = iterator; auto leftIterator = iterator; //right lookup ++rightIterator; while(rightIterator != mSearchInformation.end() && (*rightIterator)->pl.idx < pInterval->pl.idx) ++rightIterator; if (rightIterator != mSearchInformation.end() && (*rightIterator)->pl.idx >= pInterval->pl.idx) { int idx = pInterval->pl.idx; UpdateH(fabs((*rightIterator)->pl.g[idx] - pInterval->pl.g[idx]) / pow((*rightIterator)->pl.x - pInterval->pl.x, 1. / mProblem->GetDimension()), idx); } //left lookup --leftIterator; while(leftIterator != mSearchInformation.begin() && (*leftIterator)->pl.idx < pInterval->pl.idx) --leftIterator; if (leftIterator != mSearchInformation.begin() && (*leftIterator)->pl.idx >= pInterval->pl.idx) { int idx = pInterval->pl.idx; UpdateH(fabs((*leftIterator)->pl.g[idx] - pInterval->pl.g[idx]) / pow(pInterval->pl.x - (*leftIterator)->pl.x, 1. / mProblem->GetDimension()), idx); } } } double NLPSolver::CalculateR(Interval* i) const { if(i->pl.idx == i->pr.idx) { const int v = i->pr.idx; return i->delta + pow((i->pr.g[v] - i->pl.g[v]) / (mParameters.r * mHEstimations[v]), 2) / i->delta - 2.*(i->pr.g[v] + i->pl.g[v] - 2*mZEstimations[v]) / (mParameters.r * mHEstimations[v]); } else if(i->pl.idx < i->pr.idx) return 2*i->delta - 4*(i->pr.g[i->pr.idx] - mZEstimations[i->pr.idx]) / (mParameters.r * mHEstimations[i->pr.idx]); else return 2*i->delta - 4*(i->pl.g[i->pl.idx] - mZEstimations[i->pl.idx]) / (mParameters.r * mHEstimations[i->pl.idx]); } double NLPSolver::GetNextPointCoordinate(Interval* i) const { double x; if(i->pr.idx == i->pl.idx) { const int v = i->pr.idx; double dg = i->pr.g[v] - i->pl.g[v]; x = 0.5 * (i->pr.x + i->pl.x) - 0.5*((dg > 0.) ? 1. : -1.) * pow(fabs(dg) / mHEstimations[v], mProblem->GetDimension()) / mParameters.r; } else x = 0.5 * (i->pr.x + i->pl.x); return x; } bool solver_utils::checkVectorsDiff(const double* y1, const double* y2, size_t dim, double eps) { for (size_t i = 0; i < dim; i++) { if (fabs(y1[i] - y2[i]) > eps) return true; } return false; } stevengj-nlopt-88c424d/src/algs/ags/solver.hpp000066400000000000000000000070401521061417600213510ustar00rootroot00000000000000/* Copyright (C) 2018 Sovrasov V. - All Rights Reserved * You may use, distribute and modify this code under the * terms of the MIT license. * You should have received a copy of the MIT license with * this file. If not visit https://opensource.org/licenses/MIT */ #pragma once #include "data_types.hpp" #include "evolvent.hpp" #include "local_optimizer.hpp" #include #include #include #include #include #include namespace ags { struct SolverParameters { double eps = 0.01; //method tolerance in Holder metric on 1d interval. Less value -- better search precision, less probability of early stop. double stopVal = std::numeric_limits::lowest(); //method stops after objective becomes less than this value double r = 3; //reliability parameter. Higher value of r -- slower convergence, higher chance to cache the global minima. unsigned numPoints = 1; //number of new points per iteration. > 1 is useless in current implementation. unsigned itersLimit = 20000; // max number of iterations. unsigned evolventDensity = 12; // density of evolvent. By default density is 2^-12 on hybercube [0,1]^N, // which means that maximum search accuracyis 2^-12. If search hypercube is large the density can be increased accordingly to achieve better accuracy. double epsR = 0.001; // parameter which prevents method from paying too much attention to constraints. Greater values of this parameter speed up convergence, // but global minima can be lost. bool refineSolution = false; //if true, the fibal solution will be refined with the HookJeves method. SolverParameters() {} SolverParameters(double _eps, double _r, double epsR_, unsigned _trialsLimit) : eps(_eps), r(_r), itersLimit(_trialsLimit), epsR(epsR_) {} }; class NLPSolver { protected: using PriorityQueue = std::priority_queue, CompareByR>; HookeJeevesOptimizer mLocalOptimizer; SolverParameters mParameters; std::shared_ptr> mProblem; Evolvent mEvolvent; std::vector mHEstimations; std::vector mZEstimations; std::vector mNextPoints; PriorityQueue mQueue; std::set mSearchInformation; std::vector mNextIntervals; Trial mOptimumEstimation; std::vector mCalculationsCounters; unsigned mIterationsCounter; bool mNeedRefillQueue; bool mNeedStop; double mMinDelta; int mMaxIdx; void InitLocalOptimizer(); void FirstIteration(); void MakeTrials(); void InsertIntervals(); void CalculateNextPoints(); void RefillQueue(); void EstimateOptimum(); void InitDataStructures(); void ClearDataStructures(); void UpdateAllH(std::set::iterator); void UpdateH(double newValue, int index); double CalculateR(Interval*) const; double GetNextPointCoordinate(Interval*) const; public: using FuncPtr = std::function; NLPSolver(); void SetParameters(const SolverParameters& params); void SetProblem(std::shared_ptr> problem); void SetProblem(const std::vector& functions, const std::vector& leftBound, const std::vector& rightBound); Trial Solve(std::function externalStopFunc); Trial Solve(); std::vector GetCalculationsStatistics() const; std::vector GetHolderConstantsEstimations() const; }; namespace solver_utils { bool checkVectorsDiff(const double* y1, const double* y2, size_t dim, double eps); } } stevengj-nlopt-88c424d/src/algs/ags/tst.cc000066400000000000000000000030161521061417600204460ustar00rootroot00000000000000#define _USE_MATH_DEFINES #include #include #include #include "nlopt.hpp" double f_obj(const std::vector& x, std::vector&, void*) { return -1.5*pow(x[0], 2) * exp(1 - pow(x[0], 2) - 20.25*pow(x[0] - x[1], 2)) - pow(0.5 * (x[1] - 1)*(x[0]- 1), 4) * exp(2 - pow(0.5 * (x[0] - 1), 4) - pow(x[1] - 1, 4)); } double f_c0(const std::vector& x, std::vector&, void*) { return 0.01*(pow(x[0] - 2.2, 2) + pow(x[1] - 1.2, 2) - 2.25); } double f_c1(const std::vector& x, std::vector&, void*) { return 100 * (1 - pow(x[0] - 2, 2) / 1.44 - pow(0.5*x[1], 2)); } double f_c2(const std::vector& x, std::vector&, void*) { return 10 * (x[1] - 1.5 - 1.5*sin(2*M_PI*(x[0] - 1.75))); } int ags_verbose = 1; double ags_eps = 0.001; double eps_res = 0.1; int main(int argc, char **argv) { nlopt::opt opt(nlopt::GN_AGS, 2); opt.set_lower_bounds({0, -1}); opt.set_upper_bounds({4, 3}); opt.add_inequality_constraint(f_c0, NULL, 0); opt.add_inequality_constraint(f_c1, NULL, 0); opt.add_inequality_constraint(f_c2, NULL, 0); opt.set_min_objective(f_obj, NULL); opt.set_maxeval(2000); double minf; std::vector x(2); try { nlopt::result result = opt.optimize(x, minf); std::cout << "found minimum at f(" << x[0] << "," << x[1] << ") = " << std::setprecision(10) << minf << std::endl; } catch(std::exception &e) { std::cout << "nlopt failed: " << e.what() << std::endl; } return EXIT_SUCCESS; } stevengj-nlopt-88c424d/src/algs/auglag/000077500000000000000000000000001521061417600200135ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/auglag/README000066400000000000000000000020211521061417600206660ustar00rootroot00000000000000This directory contains my implementation of the "augmented Lagrangian" method to express constrained optimization problems (including equality constraints) in terms of unconstrained optimization problems (or just inequality constraints, or just box constraints). I used the algorithm description (but no source code) from the outline in the paper: E. G. Birgin and J. M. Martinez, "Improving ultimate convergence of an augmented Lagrangian method," Optimization Methods and Software vol. 23, no. 2, p. 177-195 (2008). http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.6121 (The authors of this paper have their own free-software implementation of this idea and its variations, in the TANGO project: http://www.ime.usp.br/~egbirgin/tango/ ....I did *not* use any code from TANGO here, or even look at the TANGO code. TANGO is GPLed, and I'm trying to keep NLopt at most LGPLed.) The code in this directory is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson November 2008 stevengj-nlopt-88c424d/src/algs/auglag/auglag.c000066400000000000000000000223521521061417600214230ustar00rootroot00000000000000#include #include #include #include #include "auglag.h" int auglag_verbose = 0; #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /***************************************************************************/ typedef struct { nlopt_func f; void *f_data; int m, mm; nlopt_constraint *fc; int p, pp; nlopt_constraint *h; double rho, *lambda, *mu; double *restmp, *gradtmp; nlopt_stopping *stop; } auglag_data; /* the augmented lagrangian objective function */ static double auglag(unsigned n, const double *x, double *grad, void *data) { auglag_data *d = (auglag_data *) data; double *gradtmp = grad ? d->gradtmp : NULL; double *restmp = d->restmp; double rho = d->rho; const double *lambda = d->lambda, *mu = d->mu; double L; int i, ii; unsigned j, k; L = d->f(n, x, grad, d->f_data); ++ *(d->stop->nevals_p); if (nlopt_stop_forced(d->stop)) return L; for (ii = i = 0; i < d->p; ++i) { nlopt_eval_constraint(restmp, gradtmp, d->h + i, n, x); if (nlopt_stop_forced(d->stop)) return L; for (k = 0; k < d->h[i].m; ++k) { double h = restmp[k] + lambda[ii++] / rho; L += 0.5 * rho * h*h; if (grad) for (j = 0; j < n; ++j) grad[j] += (rho * h) * gradtmp[k*n + j]; } } for (ii = i = 0; i < d->m; ++i) { nlopt_eval_constraint(restmp, gradtmp, d->fc + i, n, x); if (nlopt_stop_forced(d->stop)) return L; for (k = 0; k < d->fc[i].m; ++k) { double fc = restmp[k] + mu[ii++] / rho; if (fc > 0) { L += 0.5 * rho * fc*fc; if (grad) for (j = 0; j < n; ++j) grad[j] += (rho * fc) * gradtmp[k*n + j]; } } } return L; } /***************************************************************************/ nlopt_result auglag_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_constraint *fc, int p, nlopt_constraint *h, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt sub_opt, int sub_has_fc) { auglag_data d; nlopt_result ret = NLOPT_SUCCESS; double ICM = HUGE_VAL, minf_penalty = HUGE_VAL, penalty; double *xcur = NULL, fcur; int i, ii, feasible, minf_feasible = 0; unsigned int k; int auglag_iters = 0; int max_constraint_dim; /* magic parameters from Birgin & Martinez */ const double tau = 0.5, gam = 10; const double lam_min = -1e20, lam_max = 1e20, mu_max = 1e20; d.f = f; d.f_data = f_data; d.m = m; d.fc = fc; d.p = p; d.h = h; d.stop = stop; /* whether we handle inequality constraints via the augmented Lagrangian penalty function, or directly in the sub-algorithm */ if (sub_has_fc) d.m = 0; else m = 0; max_constraint_dim = MAX(nlopt_max_constraint_dim(d.m, fc), nlopt_max_constraint_dim(d.p, h)); d.mm = nlopt_count_constraints(d.m, fc); d.pp = nlopt_count_constraints(d.p, h); ret = nlopt_set_min_objective(sub_opt, auglag, &d); if (ret<0) return ret; ret = nlopt_set_lower_bounds(sub_opt, lb); if (ret<0) return ret; ret = nlopt_set_upper_bounds(sub_opt, ub); if (ret<0) return ret; ret = nlopt_set_stopval(sub_opt, d.m==0 && d.p==0 ? stop->minf_max : -HUGE_VAL); if (ret<0) return ret; ret = nlopt_remove_inequality_constraints(sub_opt); if (ret<0) return ret; ret = nlopt_remove_equality_constraints(sub_opt); if (ret<0) return ret; for (i = 0; i < m; ++i) { if (fc[i].f) ret = nlopt_add_inequality_constraint(sub_opt, fc[i].f, fc[i].f_data, fc[i].tol[0]); else ret = nlopt_add_inequality_mconstraint(sub_opt, fc[i].m, fc[i].mf, fc[i].f_data, fc[i].tol); if (ret < 0) return ret; } xcur = (double *) malloc(sizeof(double) * (n + max_constraint_dim * (1 + n) + d.pp + d.mm)); if (!xcur) return NLOPT_OUT_OF_MEMORY; memcpy(xcur, x, sizeof(double) * n); d.restmp = xcur + n; d.gradtmp = d.restmp + max_constraint_dim; memset(d.gradtmp, 0, sizeof(double) * (n*max_constraint_dim + d.pp+d.mm)); d.lambda = d.gradtmp + n * max_constraint_dim; d.mu = d.lambda + d.pp; *minf = HUGE_VAL; /* starting rho suggested by B & M */ if (d.p > 0 || d.m > 0) { double con2 = 0; ++ *(d.stop->nevals_p); fcur = f(n, xcur, NULL, f_data); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } penalty = 0; feasible = 1; for (i = 0; i < d.p; ++i) { nlopt_eval_constraint(d.restmp, NULL, d.h + i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < d.h[i].m; ++k) { double hi = d.restmp[k]; penalty += fabs(hi); feasible = feasible && fabs(hi) <= h[i].tol[k]; con2 += hi * hi; } } for (i = 0; i < d.m; ++i) { nlopt_eval_constraint(d.restmp, NULL, d.fc + i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < d.fc[i].m; ++k) { double fci = d.restmp[k]; penalty += fci > 0 ? fci : 0; feasible = feasible && fci <= fc[i].tol[k]; if (fci > 0) con2 += fci * fci; } } *minf = fcur; minf_penalty = penalty; minf_feasible = feasible; d.rho = (con2 > 0) ? MAX(1e-6, MIN(10, 2 * fabs(*minf) / con2)) : 10; } else d.rho = 1; /* whatever, doesn't matter */ if (auglag_verbose) { printf("auglag: initial rho=%g\nauglag initial lambda=", d.rho); for (i = 0; i < d.pp; ++i) printf(" %g", d.lambda[i]); printf("\nauglag initial mu = "); for (i = 0; i < d.mm; ++i) printf(" %g", d.mu[i]); printf("\n"); } do { double prev_ICM = ICM; ret = nlopt_optimize_limited(sub_opt, xcur, &fcur, stop->maxeval - *(stop->nevals_p), stop->maxtime - (nlopt_seconds() - stop->start)); if (auglag_verbose) printf("auglag: subopt return code %d\n", ret); if (ret < 0) break; ++ *(d.stop->nevals_p); fcur = f(n, xcur, NULL, f_data); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } if (auglag_verbose) printf("auglag: fcur = %g\n", fcur); ICM = 0; penalty = 0; feasible = 1; for (i = ii = 0; i < d.p; ++i) { nlopt_eval_constraint(d.restmp, NULL, d.h + i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < d.h[i].m; ++k) { double hi = d.restmp[k]; double newlam = d.lambda[ii] + d.rho * hi; penalty += fabs(hi); feasible = feasible && fabs(hi) <= h[i].tol[k]; ICM = MAX(ICM, fabs(hi)); d.lambda[ii++] = MIN(MAX(lam_min, newlam), lam_max); } } for (i = ii = 0; i < d.m; ++i) { nlopt_eval_constraint(d.restmp, NULL, d.fc + i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < d.fc[i].m; ++k) { double fci = d.restmp[k]; double newmu = d.mu[ii] + d.rho * fci; penalty += fci > 0 ? fci : 0; feasible = feasible && fci <= fc[i].tol[k]; ICM = MAX(ICM, fabs(MAX(fci, -d.mu[ii] / d.rho))); d.mu[ii++] = MIN(MAX(0.0, newmu), mu_max); } } if (ICM > tau * prev_ICM) { d.rho *= gam; } auglag_iters++; if (auglag_verbose) { printf("auglag %d: ICM=%g (%sfeasible), rho=%g\nauglag lambda=", auglag_iters, ICM, feasible ? "" : "not ", d.rho); for (i = 0; i < d.pp; ++i) printf(" %g", d.lambda[i]); printf("\nauglag %d: mu = ", auglag_iters); for (i = 0; i < d.mm; ++i) printf(" %g", d.mu[i]); printf("\n"); } if ((feasible && (!minf_feasible || penalty < minf_penalty || fcur < *minf)) || (!minf_feasible && penalty < minf_penalty)) { ret = NLOPT_SUCCESS; if (feasible) { if (fcur < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_ftol(stop, fcur, *minf)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, xcur, x)) ret = NLOPT_XTOL_REACHED; } *minf = fcur; minf_penalty = penalty; minf_feasible = feasible; memcpy(x, xcur, sizeof(double) * n); if (ret != NLOPT_SUCCESS) break; } if (nlopt_stop_forced(stop)) {ret = NLOPT_FORCED_STOP; break;} if (nlopt_stop_evals(stop)) {ret = NLOPT_MAXEVAL_REACHED; break;} if (nlopt_stop_time(stop)) {ret = NLOPT_MAXTIME_REACHED; break;} /* TODO: use some other stopping criterion on ICM? */ /* The paper uses ICM <= epsilon and DFM <= epsilon, where DFM is a measure of the size of the Lagrangian gradient. Besides the fact that these kinds of absolute tolerances (non-scale-invariant) are unsatisfying and it is not clear how the user should specify it, the ICM <= epsilon condition seems not too different from requiring feasibility, especially now that the user can provide constraint-specific tolerances analogous to epsilon. */ if (ICM == 0) {ret = NLOPT_FTOL_REACHED; break;} } while (1); done: free(xcur); return ret; } stevengj-nlopt-88c424d/src/algs/auglag/auglag.h000066400000000000000000000033131521061417600214240ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef AUGLAG_H #define AUGLAG_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern int auglag_verbose; nlopt_result auglag_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_constraint *fc, int p, nlopt_constraint *h, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt sub_opt, int sub_has_fc); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/bobyqa/000077500000000000000000000000001521061417600200305ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/bobyqa/COPYRIGHT000066400000000000000000000022771521061417600213330ustar00rootroot00000000000000/* Copyright (c) 2009 M. J. D. Powell (mjdp@cam.ac.uk) * Modifications Copyright (c) 2010 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ stevengj-nlopt-88c424d/src/algs/bobyqa/README000066400000000000000000000016731521061417600207170ustar00rootroot00000000000000This is the BOBYQA software by M. J. D. Powell, which performs derivative-free unconstrained optimization using an iteratively constructed quadratic approximation for the objective function. See: M. J. D. Powell, "The BOBYQA algorithm for bound constrained optimization without derivatives," Department of Applied Mathematics and Theoretical Physics, Cambridge England, technical report NA2009/06 (2009). http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf http://plato.asu.edu/ftp/other_software/bobyqa.zip The C translation by S. G. Johnson (2009) includes a few minor modifications, mainly to use the NLopt stopping criteria (and to take the objective function as an argument rather than a global). The original Fortran code was released by Powell with "no restrictions or charges", and the C translation by S. G. Johnson is released in a similar spirit under the MIT License (see the COPYRIGHT file in this directory). stevengj-nlopt-88c424d/src/algs/bobyqa/README.orig000066400000000000000000000073701521061417600216560ustar00rootroot00000000000000=========================================================================== On 8/13/09 added the paper on BOBYQA =========================================================================== For simplicity, the Makefi;e has been replaced by a one-line compile script "comp" which needs to be adjusted if the compiler name is not f77. All Fortran files are in bobyla.f. Compiling and running bobyqa should produce results similar to those in RESULTS. Hans Mittelmann, Jan 2009 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Fortran version of BOBYQA is attached. Its purpose is to seek the least value of a function F of several variables, when derivatives are not available, where F is specified by the user through a subroutine called CALFUN. The name BOBYQA denotes Bound Approximation BY Quadratic Approximation, the constraints being lower and upper bounds on every variable, which can be set to huge values for unconstrained variables. The algorithm is intended to change the variables to values that are close to a local minimum of F. The user, however, should assume responsibility for finding out if the calculations are satisfactory, by considering carefully the values of F that occur. The BOBYQA software has been developed from the method of the paper "The NEWUOA software for unconstrained minimization without derivatives", in Large-Scale Nonlinear Optimization, editors G. Di Pillo and M. Roma, Springer (2006), pages 255-297. A report that describes the details of the development is going to be written soon. The attachments in sequence are a suitable Makefile, followed by a main program and a CALFUN routine for the "Invdist2" problem, in order to provide an example for testing. Then BOBYQA and its six auxiliary routines, namely BOBYQB, ALTMOV, PRELIM, RESCUE, TRSBOX and UPDATE, are given. Finally, the computed output that the author obtained for the Invdist2 problems is listed. In addition to providing CALFUN, an initial vector of variables and the lower and upper bounds, the user has to set the values of the parameters RHOBEG, RHOEND and NPT. After scaling the individual variables if necessary, so that the magnitudes of their expected changes are similar, RHOBEG is the initial steplength for changes to the variables, a reasonable choice being the mesh size of a coarse grid search. Further, RHOEND should be suitable for a search on a very fine grid. Typically, the software calculates a vector of variables that is within distance 10*RHOEND of a local minimum. Another consideration is that every trial vector of variables is forced to satisfy the lower and upper bounds, but there has to be room to make a search in all directions. Therefore an error return occurs if the difference between the bounds on any variable is less than 2*RHOBEG. The parameter NPT specifies the number of interpolation conditions on each quadratic model, the value NPT=2*N+1 being recommended for a start, where N is the number of variables. It is often worthwhile to try other choices too, but much larger values tend to be inefficient, because the amount of routine work of each iteration is of magnitude NPT**2, and because the achievement of adequate accuracy in some matrix calculations becomes more difficult. Some excellent numerical results have been found in the case NPT=N+6 even with more than 100 variables. The way of calling BOBYQA should be clear from the Invdist2 examples and from the comments near the beginning of SUBROUTINE BOBYQA. There are no restrictions on or charges for the use of the software. I hope that the time and effort I have spent on developing the package will be helpful to much research and to many applications. January 5th, 2009 M.J.D. Powell (mjdp@cam.ac.uk) stevengj-nlopt-88c424d/src/algs/bobyqa/bobyqa.c000066400000000000000000002671501521061417600214640ustar00rootroot00000000000000/* BOBYQA derivative-free optimization code by M. J. D. Powell. Original Fortran code by Powell (2009). Converted via v2c, cleaned up, and incorporated into NLopt by S. G. Johnson (2009). See README. */ #include #include #include #include "bobyqa.h" typedef double (*bobyqa_func)(int n, const double *x, void *func_data); #define MIN2(a,b) ((a) <= (b) ? (a) : (b)) #define MAX2(a,b) ((a) >= (b) ? (a) : (b)) #define IABS(x) ((x) < 0 ? -(x) : (x)) static void update_(int *n, int *npt, double *bmat, double *zmat, int *ndim, double *vlag, double *beta, double *denom, int *knew, double *w) { /* System generated locals */ int bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2; double d__1, d__2, d__3; /* Local variables */ int i__, j, k, jp; double one, tau, temp; int nptm; double zero, alpha, tempa, tempb, ztest; /* The arrays BMAT and ZMAT are updated, as required by the new position */ /* of the interpolation point that has the index KNEW. The vector VLAG has */ /* N+NPT components, set on entry to the first NPT and last N components */ /* of the product Hw in equation (4.11) of the Powell (2006) paper on */ /* NEWUOA. Further, BETA is set on entry to the value of the parameter */ /* with that name, and DENOM is set to the denominator of the updating */ /* formula. Elements of ZMAT may be treated as zero if their moduli are */ /* at most ZTEST. The first NDIM elements of W are used for working space. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --vlag; --w; /* Function Body */ one = 1.; zero = 0.; nptm = *npt - *n - 1; ztest = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { i__2 = nptm; for (j = 1; j <= i__2; ++j) { /* L10: */ /* Computing MAX */ d__2 = ztest, d__3 = (d__1 = zmat[k + j * zmat_dim1], fabs(d__1)); ztest = MAX2(d__2,d__3); } } ztest *= 1e-20; /* Apply the rotations that put zeros in the KNEW-th row of ZMAT. */ i__2 = nptm; for (j = 2; j <= i__2; ++j) { if ((d__1 = zmat[*knew + j * zmat_dim1], fabs(d__1)) > ztest) { /* Computing 2nd power */ d__1 = zmat[*knew + zmat_dim1]; /* Computing 2nd power */ d__2 = zmat[*knew + j * zmat_dim1]; temp = sqrt(d__1 * d__1 + d__2 * d__2); tempa = zmat[*knew + zmat_dim1] / temp; tempb = zmat[*knew + j * zmat_dim1] / temp; i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { temp = tempa * zmat[i__ + zmat_dim1] + tempb * zmat[i__ + j * zmat_dim1]; zmat[i__ + j * zmat_dim1] = tempa * zmat[i__ + j * zmat_dim1] - tempb * zmat[i__ + zmat_dim1]; /* L20: */ zmat[i__ + zmat_dim1] = temp; } } zmat[*knew + j * zmat_dim1] = zero; /* L30: */ } /* Put the first NPT components of the KNEW-th column of HLAG into W, */ /* and calculate the parameters of the updating formula. */ i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] = zmat[*knew + zmat_dim1] * zmat[i__ + zmat_dim1]; /* L40: */ } alpha = w[*knew]; tau = vlag[*knew]; vlag[*knew] -= one; /* Complete the updating of ZMAT. */ temp = sqrt(*denom); tempb = zmat[*knew + zmat_dim1] / temp; tempa = tau / temp; i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { /* L50: */ zmat[i__ + zmat_dim1] = tempa * zmat[i__ + zmat_dim1] - tempb * vlag[ i__]; } /* Finally, update the matrix BMAT. */ i__2 = *n; for (j = 1; j <= i__2; ++j) { jp = *npt + j; w[jp] = bmat[*knew + j * bmat_dim1]; tempa = (alpha * vlag[jp] - tau * w[jp]) / *denom; tempb = (-(*beta) * w[jp] - tau * vlag[jp]) / *denom; i__1 = jp; for (i__ = 1; i__ <= i__1; ++i__) { bmat[i__ + j * bmat_dim1] = bmat[i__ + j * bmat_dim1] + tempa * vlag[i__] + tempb * w[i__]; if (i__ > *npt) { bmat[jp + (i__ - *npt) * bmat_dim1] = bmat[i__ + j * bmat_dim1]; } /* L60: */ } } } /* update_ */ static nlopt_result rescue_(int *n, int *npt, const double *xl, const double *xu, /* int *maxfun */ nlopt_stopping *stop, bobyqa_func calfun, void *calfun_data, double *xbase, double *xpt, double *fval, double *xopt, double *gopt, double *hq, double *pq, double *bmat, double *zmat, int *ndim, double *sl, double *su, /* int *nf, */ double *delta, int *kopt, double *vlag, double * ptsaux, double *ptsid, double *w) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2, i__3; double d__1, d__2, d__3, d__4; /* Local variables */ double f; int i__, j, k, ih, jp, ip, iq, np, iw; double xp = 0.0, xq = 0.0, den; int ihp = 0; double one; int ihq, jpn, kpt; double sum, diff, half, beta; int kold; double winc; int nrem, knew; double temp, bsum; int nptm; double zero, hdiag, fbase, sfrac, denom, vquad, sumpq; double dsqmin, distsq, vlmxsq; /* The arguments N, NPT, XL, XU, MAXFUN, XBASE, XPT, FVAL, XOPT, */ /* GOPT, HQ, PQ, BMAT, ZMAT, NDIM, SL and SU have the same meanings as */ /* the corresponding arguments of BOBYQB on the entry to RESCUE. */ /* NF is maintained as the number of calls of CALFUN so far, except that */ /* NF is set to -1 if the value of MAXFUN prevents further progress. */ /* KOPT is maintained so that FVAL(KOPT) is the least calculated function */ /* value. Its correct value must be given on entry. It is updated if a */ /* new least function value is found, but the corresponding changes to */ /* XOPT and GOPT have to be made later by the calling program. */ /* DELTA is the current trust region radius. */ /* VLAG is a working space vector that will be used for the values of the */ /* provisional Lagrange functions at each of the interpolation points. */ /* They are part of a product that requires VLAG to be of length NDIM. */ /* PTSAUX is also a working space array. For J=1,2,...,N, PTSAUX(1,J) and */ /* PTSAUX(2,J) specify the two positions of provisional interpolation */ /* points when a nonzero step is taken along e_J (the J-th coordinate */ /* direction) through XBASE+XOPT, as specified below. Usually these */ /* steps have length DELTA, but other lengths are chosen if necessary */ /* in order to satisfy the given bounds on the variables. */ /* PTSID is also a working space array. It has NPT components that denote */ /* provisional new positions of the original interpolation points, in */ /* case changes are needed to restore the linear independence of the */ /* interpolation conditions. The K-th point is a candidate for change */ /* if and only if PTSID(K) is nonzero. In this case let p and q be the */ /* int parts of PTSID(K) and (PTSID(K)-p) multiplied by N+1. If p */ /* and q are both positive, the step from XBASE+XOPT to the new K-th */ /* interpolation point is PTSAUX(1,p)*e_p + PTSAUX(1,q)*e_q. Otherwise */ /* the step is PTSAUX(1,p)*e_p or PTSAUX(2,q)*e_q in the cases q=0 or */ /* p=0, respectively. */ /* The first NDIM+NPT elements of the array W are used for working space. */ /* The final elements of BMAT and ZMAT are set in a well-conditioned way */ /* to the values that are appropriate for the new interpolation points. */ /* The elements of GOPT, HQ and PQ are also revised to the values that are */ /* appropriate to the final quadratic model. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xl; --xu; --xbase; --fval; --xopt; --gopt; --hq; --pq; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --sl; --su; --vlag; ptsaux -= 3; --ptsid; --w; /* Function Body */ half = .5; one = 1.; zero = 0.; np = *n + 1; sfrac = half / (double) np; nptm = *npt - np; /* Shift the interpolation points so that XOPT becomes the origin, and set */ /* the elements of ZMAT to zero. The value of SUMPQ is required in the */ /* updating of HQ below. The squares of the distances from XOPT to the */ /* other interpolation points are set at the end of W. Increments of WINC */ /* may be added later to these squares to balance the consideration of */ /* the choice of point that is going to become current. */ sumpq = zero; winc = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { distsq = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { xpt[k + j * xpt_dim1] -= xopt[j]; /* L10: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1]; distsq += d__1 * d__1; } sumpq += pq[k]; w[*ndim + k] = distsq; winc = MAX2(winc,distsq); i__2 = nptm; for (j = 1; j <= i__2; ++j) { /* L20: */ zmat[k + j * zmat_dim1] = zero; } } /* Update HQ so that HQ and PQ define the second derivatives of the model */ /* after XBASE has been shifted to the trust region centre. */ ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { w[j] = half * sumpq * xopt[j]; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L30: */ w[j] += pq[k] * xpt[k + j * xpt_dim1]; } i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; /* L40: */ hq[ih] = hq[ih] + w[i__] * xopt[j] + w[j] * xopt[i__]; } } /* Shift XBASE, SL, SU and XOPT. Set the elements of BMAT to zero, and */ /* also set the elements of PTSAUX. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { xbase[j] += xopt[j]; sl[j] -= xopt[j]; su[j] -= xopt[j]; xopt[j] = zero; /* Computing MIN */ d__1 = *delta, d__2 = su[j]; ptsaux[(j << 1) + 1] = MIN2(d__1,d__2); /* Computing MAX */ d__1 = -(*delta), d__2 = sl[j]; ptsaux[(j << 1) + 2] = MAX2(d__1,d__2); if (ptsaux[(j << 1) + 1] + ptsaux[(j << 1) + 2] < zero) { temp = ptsaux[(j << 1) + 1]; ptsaux[(j << 1) + 1] = ptsaux[(j << 1) + 2]; ptsaux[(j << 1) + 2] = temp; } if ((d__2 = ptsaux[(j << 1) + 2], fabs(d__2)) < half * (d__1 = ptsaux[( j << 1) + 1], fabs(d__1))) { ptsaux[(j << 1) + 2] = half * ptsaux[(j << 1) + 1]; } i__2 = *ndim; for (i__ = 1; i__ <= i__2; ++i__) { /* L50: */ bmat[i__ + j * bmat_dim1] = zero; } } fbase = fval[*kopt]; /* Set the identifiers of the artificial interpolation points that are */ /* along a coordinate direction from XOPT, and set the corresponding */ /* nonzero elements of BMAT and ZMAT. */ ptsid[1] = sfrac; i__2 = *n; for (j = 1; j <= i__2; ++j) { jp = j + 1; jpn = jp + *n; ptsid[jp] = (double) j + sfrac; if (jpn <= *npt) { ptsid[jpn] = (double) j / (double) np + sfrac; temp = one / (ptsaux[(j << 1) + 1] - ptsaux[(j << 1) + 2]); bmat[jp + j * bmat_dim1] = -temp + one / ptsaux[(j << 1) + 1]; bmat[jpn + j * bmat_dim1] = temp + one / ptsaux[(j << 1) + 2]; bmat[j * bmat_dim1 + 1] = -bmat[jp + j * bmat_dim1] - bmat[jpn + j * bmat_dim1]; zmat[j * zmat_dim1 + 1] = sqrt(2.) / (d__1 = ptsaux[(j << 1) + 1] * ptsaux[(j << 1) + 2], fabs(d__1)); zmat[jp + j * zmat_dim1] = zmat[j * zmat_dim1 + 1] * ptsaux[(j << 1) + 2] * temp; zmat[jpn + j * zmat_dim1] = -zmat[j * zmat_dim1 + 1] * ptsaux[(j << 1) + 1] * temp; } else { bmat[j * bmat_dim1 + 1] = -one / ptsaux[(j << 1) + 1]; bmat[jp + j * bmat_dim1] = one / ptsaux[(j << 1) + 1]; /* Computing 2nd power */ d__1 = ptsaux[(j << 1) + 1]; bmat[j + *npt + j * bmat_dim1] = -half * (d__1 * d__1); } /* L60: */ } /* Set any remaining identifiers with their nonzero elements of ZMAT. */ if (*npt >= *n + np) { i__2 = *npt; for (k = np << 1; k <= i__2; ++k) { iw = (int) (((double) (k - np) - half) / (double) (*n) ); ip = k - np - iw * *n; iq = ip + iw; if (iq > *n) { iq -= *n; } ptsid[k] = (double) ip + (double) iq / (double) np + sfrac; temp = one / (ptsaux[(ip << 1) + 1] * ptsaux[(iq << 1) + 1]); zmat[(k - np) * zmat_dim1 + 1] = temp; zmat[ip + 1 + (k - np) * zmat_dim1] = -temp; zmat[iq + 1 + (k - np) * zmat_dim1] = -temp; /* L70: */ zmat[k + (k - np) * zmat_dim1] = temp; } } nrem = *npt; kold = 1; knew = *kopt; /* Reorder the provisional points in the way that exchanges PTSID(KOLD) */ /* with PTSID(KNEW). */ L80: i__2 = *n; for (j = 1; j <= i__2; ++j) { temp = bmat[kold + j * bmat_dim1]; bmat[kold + j * bmat_dim1] = bmat[knew + j * bmat_dim1]; /* L90: */ bmat[knew + j * bmat_dim1] = temp; } i__2 = nptm; for (j = 1; j <= i__2; ++j) { temp = zmat[kold + j * zmat_dim1]; zmat[kold + j * zmat_dim1] = zmat[knew + j * zmat_dim1]; /* L100: */ zmat[knew + j * zmat_dim1] = temp; } ptsid[kold] = ptsid[knew]; ptsid[knew] = zero; w[*ndim + knew] = zero; --nrem; if (knew != *kopt) { temp = vlag[kold]; vlag[kold] = vlag[knew]; vlag[knew] = temp; /* Update the BMAT and ZMAT matrices so that the status of the KNEW-th */ /* interpolation point can be changed from provisional to original. The */ /* branch to label 350 occurs if all the original points are reinstated. */ /* The nonnegative values of W(NDIM+K) are required in the search below. */ update_(n, npt, &bmat[bmat_offset], &zmat[zmat_offset], ndim, &vlag[1] , &beta, &denom, &knew, &w[1]); if (nrem == 0) { goto L350; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L110: */ w[*ndim + k] = (d__1 = w[*ndim + k], fabs(d__1)); } } /* Pick the index KNEW of an original interpolation point that has not */ /* yet replaced one of the provisional interpolation points, giving */ /* attention to the closeness to XOPT and to previous tries with KNEW. */ L120: dsqmin = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { if (w[*ndim + k] > zero) { if (dsqmin == zero || w[*ndim + k] < dsqmin) { knew = k; dsqmin = w[*ndim + k]; } } /* L130: */ } if (dsqmin == zero) { goto L260; } /* Form the W-vector of the chosen original interpolation point. */ i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L140: */ w[*npt + j] = xpt[knew + j * xpt_dim1]; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { sum = zero; if (k == *kopt) { } else if (ptsid[k] == zero) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L150: */ sum += w[*npt + j] * xpt[k + j * xpt_dim1]; } } else { ip = (int) ptsid[k]; if (ip > 0) { sum = w[*npt + ip] * ptsaux[(ip << 1) + 1]; } iq = (int) ((double) np * ptsid[k] - (double) (ip * np)); if (iq > 0) { iw = 1; if (ip == 0) { iw = 2; } sum += w[*npt + iq] * ptsaux[iw + (iq << 1)]; } } /* L160: */ w[k] = half * sum * sum; } /* Calculate VLAG and BETA for the required updating of the H matrix if */ /* XPT(KNEW,.) is reinstated in the set of interpolation points. */ i__2 = *npt; for (k = 1; k <= i__2; ++k) { sum = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L170: */ sum += bmat[k + j * bmat_dim1] * w[*npt + j]; } /* L180: */ vlag[k] = sum; } beta = zero; i__2 = nptm; for (j = 1; j <= i__2; ++j) { sum = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L190: */ sum += zmat[k + j * zmat_dim1] * w[k]; } beta -= sum * sum; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L200: */ vlag[k] += sum * zmat[k + j * zmat_dim1]; } } bsum = zero; distsq = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L210: */ sum += bmat[k + j * bmat_dim1] * w[k]; } jp = j + *npt; bsum += sum * w[jp]; i__2 = *ndim; for (ip = *npt + 1; ip <= i__2; ++ip) { /* L220: */ sum += bmat[ip + j * bmat_dim1] * w[ip]; } bsum += sum * w[jp]; vlag[jp] = sum; /* L230: */ /* Computing 2nd power */ d__1 = xpt[knew + j * xpt_dim1]; distsq += d__1 * d__1; } beta = half * distsq * distsq + beta - bsum; vlag[*kopt] += one; /* KOLD is set to the index of the provisional interpolation point that is */ /* going to be deleted to make way for the KNEW-th original interpolation */ /* point. The choice of KOLD is governed by the avoidance of a small value */ /* of the denominator in the updating calculation of UPDATE. */ denom = zero; vlmxsq = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { if (ptsid[k] != zero) { hdiag = zero; i__2 = nptm; for (j = 1; j <= i__2; ++j) { /* L240: */ /* Computing 2nd power */ d__1 = zmat[k + j * zmat_dim1]; hdiag += d__1 * d__1; } /* Computing 2nd power */ d__1 = vlag[k]; den = beta * hdiag + d__1 * d__1; if (den > denom) { kold = k; denom = den; } } /* L250: */ /* Computing MAX */ /* Computing 2nd power */ d__3 = vlag[k]; d__1 = vlmxsq, d__2 = d__3 * d__3; vlmxsq = MAX2(d__1,d__2); } if (denom <= vlmxsq * .01) { w[*ndim + knew] = -w[*ndim + knew] - winc; goto L120; } goto L80; /* When label 260 is reached, all the final positions of the interpolation */ /* points have been chosen although any changes have not been included yet */ /* in XPT. Also the final BMAT and ZMAT matrices are complete, but, apart */ /* from the shift of XBASE, the updating of the quadratic model remains to */ /* be done. The following cycle through the new interpolation points begins */ /* by putting the new point in XPT(KPT,.) and by setting PQ(KPT) to zero, */ /* except that a RETURN occurs if MAXFUN prohibits another value of F. */ L260: i__1 = *npt; for (kpt = 1; kpt <= i__1; ++kpt) { if (ptsid[kpt] == zero) { goto L340; } if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { w[j] = xpt[kpt + j * xpt_dim1]; xpt[kpt + j * xpt_dim1] = zero; temp = pq[kpt] * w[j]; i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { ++ih; /* L270: */ hq[ih] += temp * w[i__]; } } pq[kpt] = zero; ip = (int) ptsid[kpt]; iq = (int) ((double) np * ptsid[kpt] - (double) (ip * np)) ; if (ip > 0) { xp = ptsaux[(ip << 1) + 1]; xpt[kpt + ip * xpt_dim1] = xp; } if (iq > 0) { xq = ptsaux[(iq << 1) + 1]; if (ip == 0) { xq = ptsaux[(iq << 1) + 2]; } xpt[kpt + iq * xpt_dim1] = xq; } /* Set VQUAD to the value of the current model at the new point. */ vquad = fbase; if (ip > 0) { ihp = (ip + ip * ip) / 2; vquad += xp * (gopt[ip] + half * xp * hq[ihp]); } if (iq > 0) { ihq = (iq + iq * iq) / 2; vquad += xq * (gopt[iq] + half * xq * hq[ihq]); if (ip > 0) { iw = MAX2(ihp,ihq) - (i__3 = ip - iq, IABS(i__3)); vquad += xp * xq * hq[iw]; } } i__3 = *npt; for (k = 1; k <= i__3; ++k) { temp = zero; if (ip > 0) { temp += xp * xpt[k + ip * xpt_dim1]; } if (iq > 0) { temp += xq * xpt[k + iq * xpt_dim1]; } /* L280: */ vquad += half * pq[k] * temp * temp; } /* Calculate F at the new interpolation point, and set DIFF to the factor */ /* that is going to multiply the KPT-th Lagrange function when the model */ /* is updated to provide interpolation to the new function value. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { /* Computing MIN */ /* Computing MAX */ d__3 = xl[i__], d__4 = xbase[i__] + xpt[kpt + i__ * xpt_dim1]; d__1 = MAX2(d__3,d__4), d__2 = xu[i__]; w[i__] = MIN2(d__1,d__2); if (xpt[kpt + i__ * xpt_dim1] == sl[i__]) { w[i__] = xl[i__]; } if (xpt[kpt + i__ * xpt_dim1] == su[i__]) { w[i__] = xu[i__]; } /* L290: */ } ++ *(stop->nevals_p); f = calfun(*n, &w[1], calfun_data); fval[kpt] = f; if (f < fval[*kopt]) { *kopt = kpt; } if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (f < stop->minf_max) return NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; diff = f - vquad; /* Update the quadratic model. The RETURN from the subroutine occurs when */ /* all the new interpolation points are included in the model. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { /* L310: */ gopt[i__] += diff * bmat[kpt + i__ * bmat_dim1]; } i__3 = *npt; for (k = 1; k <= i__3; ++k) { sum = zero; i__2 = nptm; for (j = 1; j <= i__2; ++j) { /* L320: */ sum += zmat[k + j * zmat_dim1] * zmat[kpt + j * zmat_dim1]; } temp = diff * sum; if (ptsid[k] == zero) { pq[k] += temp; } else { ip = (int) ptsid[k]; iq = (int) ((double) np * ptsid[k] - (double) (ip * np)); ihq = (iq * iq + iq) / 2; if (ip == 0) { /* Computing 2nd power */ d__1 = ptsaux[(iq << 1) + 2]; hq[ihq] += temp * (d__1 * d__1); } else { ihp = (ip * ip + ip) / 2; /* Computing 2nd power */ d__1 = ptsaux[(ip << 1) + 1]; hq[ihp] += temp * (d__1 * d__1); if (iq > 0) { /* Computing 2nd power */ d__1 = ptsaux[(iq << 1) + 1]; hq[ihq] += temp * (d__1 * d__1); iw = MAX2(ihp,ihq) - (i__2 = iq - ip, IABS(i__2)); hq[iw] += temp * ptsaux[(ip << 1) + 1] * ptsaux[(iq << 1) + 1]; } } } /* L330: */ } ptsid[kpt] = zero; L340: ; } L350: return NLOPT_SUCCESS; } /* rescue_ */ static void altmov_(int *n, int *npt, double *xpt, double *xopt, double *bmat, double *zmat, int *ndim, double *sl, double *su, int *kopt, int *knew, double *adelt, double *xnew, double *xalt, double * alpha, double *cauchy, double *glag, double *hcol, double *w) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2; double d__1, d__2, d__3, d__4; /* Local variables */ int i__, j, k; double ha, gw, one, diff, half; int ilbd, isbd; double slbd; int iubd; double vlag, subd, temp; int ksav = 0; double step = 0.0, zero, curv; int iflag; double scale, csave = 0.0, tempa, tempb, tempd, const__, sumin, ggfree; int ibdsav = 0; double dderiv, bigstp, predsq, presav, distsq, stpsav = 0.0, wfixsq, wsqsav; /* The arguments N, NPT, XPT, XOPT, BMAT, ZMAT, NDIM, SL and SU all have */ /* the same meanings as the corresponding arguments of BOBYQB. */ /* KOPT is the index of the optimal interpolation point. */ /* KNEW is the index of the interpolation point that is going to be moved. */ /* ADELT is the current trust region bound. */ /* XNEW will be set to a suitable new position for the interpolation point */ /* XPT(KNEW,.). Specifically, it satisfies the SL, SU and trust region */ /* bounds and it should provide a large denominator in the next call of */ /* UPDATE. The step XNEW-XOPT from XOPT is restricted to moves along the */ /* straight lines through XOPT and another interpolation point. */ /* XALT also provides a large value of the modulus of the KNEW-th Lagrange */ /* function subject to the constraints that have been mentioned, its main */ /* difference from XNEW being that XALT-XOPT is a constrained version of */ /* the Cauchy step within the trust region. An exception is that XALT is */ /* not calculated if all components of GLAG (see below) are zero. */ /* ALPHA will be set to the KNEW-th diagonal element of the H matrix. */ /* CAUCHY will be set to the square of the KNEW-th Lagrange function at */ /* the step XALT-XOPT from XOPT for the vector XALT that is returned, */ /* except that CAUCHY is set to zero if XALT is not calculated. */ /* GLAG is a working space vector of length N for the gradient of the */ /* KNEW-th Lagrange function at XOPT. */ /* HCOL is a working space vector of length NPT for the second derivative */ /* coefficients of the KNEW-th Lagrange function. */ /* W is a working space vector of length 2N that is going to hold the */ /* constrained Cauchy step from XOPT of the Lagrange function, followed */ /* by the downhill version of XALT when the uphill step is calculated. */ /* Set the first NPT components of W to the leading elements of the */ /* KNEW-th column of the H matrix. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xopt; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --sl; --su; --xnew; --xalt; --glag; --hcol; --w; /* Function Body */ half = .5; one = 1.; zero = 0.; const__ = one + sqrt(2.); i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L10: */ hcol[k] = zero; } i__1 = *npt - *n - 1; for (j = 1; j <= i__1; ++j) { temp = zmat[*knew + j * zmat_dim1]; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L20: */ hcol[k] += temp * zmat[k + j * zmat_dim1]; } } *alpha = hcol[*knew]; ha = half * *alpha; /* Calculate the gradient of the KNEW-th Lagrange function at XOPT. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L30: */ glag[i__] = bmat[*knew + i__ * bmat_dim1]; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { temp = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L40: */ temp += xpt[k + j * xpt_dim1] * xopt[j]; } temp = hcol[k] * temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L50: */ glag[i__] += temp * xpt[k + i__ * xpt_dim1]; } } /* Search for a large denominator along the straight lines through XOPT */ /* and another interpolation point. SLBD and SUBD will be lower and upper */ /* bounds on the step along each of these lines in turn. PREDSQ will be */ /* set to the square of the predicted denominator for each line. PRESAV */ /* will be set to the largest admissible value of PREDSQ that occurs. */ presav = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { if (k == *kopt) { goto L80; } dderiv = zero; distsq = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = xpt[k + i__ * xpt_dim1] - xopt[i__]; dderiv += glag[i__] * temp; /* L60: */ distsq += temp * temp; } subd = *adelt / sqrt(distsq); slbd = -subd; ilbd = 0; iubd = 0; sumin = MIN2(one,subd); /* Revise SLBD and SUBD if necessary because of the bounds in SL and SU. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = xpt[k + i__ * xpt_dim1] - xopt[i__]; if (temp > zero) { if (slbd * temp < sl[i__] - xopt[i__]) { slbd = (sl[i__] - xopt[i__]) / temp; ilbd = -i__; } if (subd * temp > su[i__] - xopt[i__]) { /* Computing MAX */ d__1 = sumin, d__2 = (su[i__] - xopt[i__]) / temp; subd = MAX2(d__1,d__2); iubd = i__; } } else if (temp < zero) { if (slbd * temp > su[i__] - xopt[i__]) { slbd = (su[i__] - xopt[i__]) / temp; ilbd = i__; } if (subd * temp < sl[i__] - xopt[i__]) { /* Computing MAX */ d__1 = sumin, d__2 = (sl[i__] - xopt[i__]) / temp; subd = MAX2(d__1,d__2); iubd = -i__; } } /* L70: */ } /* Seek a large modulus of the KNEW-th Lagrange function when the index */ /* of the other interpolation point on the line through XOPT is KNEW. */ if (k == *knew) { diff = dderiv - one; step = slbd; vlag = slbd * (dderiv - slbd * diff); isbd = ilbd; temp = subd * (dderiv - subd * diff); if (fabs(temp) > fabs(vlag)) { step = subd; vlag = temp; isbd = iubd; } tempd = half * dderiv; tempa = tempd - diff * slbd; tempb = tempd - diff * subd; if (tempa * tempb < zero) { temp = tempd * tempd / diff; if (fabs(temp) > fabs(vlag)) { step = tempd / diff; vlag = temp; isbd = 0; } } /* Search along each of the other lines through XOPT and another point. */ } else { step = slbd; vlag = slbd * (one - slbd); isbd = ilbd; temp = subd * (one - subd); if (fabs(temp) > fabs(vlag)) { step = subd; vlag = temp; isbd = iubd; } if (subd > half) { if (fabs(vlag) < .25) { step = half; vlag = .25; isbd = 0; } } vlag *= dderiv; } /* Calculate PREDSQ for the current line search and maintain PRESAV. */ temp = step * (one - step) * distsq; predsq = vlag * vlag * (vlag * vlag + ha * temp * temp); if (predsq > presav) { presav = predsq; ksav = k; stpsav = step; ibdsav = isbd; } L80: ; } /* Construct XNEW in a way that satisfies the bound constraints exactly. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = xopt[i__] + stpsav * (xpt[ksav + i__ * xpt_dim1] - xopt[i__]); /* L90: */ /* Computing MAX */ /* Computing MIN */ d__3 = su[i__]; d__1 = sl[i__], d__2 = MIN2(d__3,temp); xnew[i__] = MAX2(d__1,d__2); } if (ibdsav < 0) { xnew[-ibdsav] = sl[-ibdsav]; } if (ibdsav > 0) { xnew[ibdsav] = su[ibdsav]; } /* Prepare for the iterative method that assembles the constrained Cauchy */ /* step in W. The sum of squares of the fixed components of W is formed in */ /* WFIXSQ, and the free components of W are set to BIGSTP. */ bigstp = *adelt + *adelt; iflag = 0; L100: wfixsq = zero; ggfree = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { w[i__] = zero; /* Computing MIN */ d__1 = xopt[i__] - sl[i__], d__2 = glag[i__]; tempa = MIN2(d__1,d__2); /* Computing MAX */ d__1 = xopt[i__] - su[i__], d__2 = glag[i__]; tempb = MAX2(d__1,d__2); if (tempa > zero || tempb < zero) { w[i__] = bigstp; /* Computing 2nd power */ d__1 = glag[i__]; ggfree += d__1 * d__1; } /* L110: */ } if (ggfree == zero) { *cauchy = zero; goto L200; } /* Investigate whether more components of W can be fixed. */ L120: temp = *adelt * *adelt - wfixsq; if (temp > zero) { wsqsav = wfixsq; step = sqrt(temp / ggfree); ggfree = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (w[i__] == bigstp) { temp = xopt[i__] - step * glag[i__]; if (temp <= sl[i__]) { w[i__] = sl[i__] - xopt[i__]; /* Computing 2nd power */ d__1 = w[i__]; wfixsq += d__1 * d__1; } else if (temp >= su[i__]) { w[i__] = su[i__] - xopt[i__]; /* Computing 2nd power */ d__1 = w[i__]; wfixsq += d__1 * d__1; } else { /* Computing 2nd power */ d__1 = glag[i__]; ggfree += d__1 * d__1; } } /* L130: */ } if (wfixsq > wsqsav && ggfree > zero) { goto L120; } } /* Set the remaining free components of W and all components of XALT, */ /* except that W may be scaled later. */ gw = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (w[i__] == bigstp) { w[i__] = -step * glag[i__]; /* Computing MAX */ /* Computing MIN */ d__3 = su[i__], d__4 = xopt[i__] + w[i__]; d__1 = sl[i__], d__2 = MIN2(d__3,d__4); xalt[i__] = MAX2(d__1,d__2); } else if (w[i__] == zero) { xalt[i__] = xopt[i__]; } else if (glag[i__] > zero) { xalt[i__] = sl[i__]; } else { xalt[i__] = su[i__]; } /* L140: */ gw += glag[i__] * w[i__]; } /* Set CURV to the curvature of the KNEW-th Lagrange function along W. */ /* Scale W by a factor less than one if that can reduce the modulus of */ /* the Lagrange function at XOPT+W. Set CAUCHY to the final value of */ /* the square of this function. */ curv = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { temp = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L150: */ temp += xpt[k + j * xpt_dim1] * w[j]; } /* L160: */ curv += hcol[k] * temp * temp; } if (iflag == 1) { curv = -curv; } if (curv > -gw && curv < -const__ * gw) { scale = -gw / curv; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = xopt[i__] + scale * w[i__]; /* L170: */ /* Computing MAX */ /* Computing MIN */ d__3 = su[i__]; d__1 = sl[i__], d__2 = MIN2(d__3,temp); xalt[i__] = MAX2(d__1,d__2); } /* Computing 2nd power */ d__1 = half * gw * scale; *cauchy = d__1 * d__1; } else { /* Computing 2nd power */ d__1 = gw + half * curv; *cauchy = d__1 * d__1; } /* If IFLAG is zero, then XALT is calculated as before after reversing */ /* the sign of GLAG. Thus two XALT vectors become available. The one that */ /* is chosen is the one that gives the larger value of CAUCHY. */ if (iflag == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { glag[i__] = -glag[i__]; /* L180: */ w[*n + i__] = xalt[i__]; } csave = *cauchy; iflag = 1; goto L100; } if (csave > *cauchy) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L190: */ xalt[i__] = w[*n + i__]; } *cauchy = csave; } L200: return; } /* altmov_ */ static void trsbox_(int *n, int *npt, double *xpt, double *xopt, double *gopt, double *hq, double *pq, double *sl, double *su, double *delta, double *xnew, double *d__, double *gnew, double *xbdi, double *s, double *hs, double *hred, double *dsq, double *crvmin) { /* System generated locals */ int xpt_dim1, xpt_offset, i__1, i__2; double d__1, d__2, d__3, d__4; /* Local variables */ int i__, j, k, ih; double ds; int iu; double dhd, dhs, cth, one, shs, sth, ssq, half, beta, sdec, blen; int iact = 0, nact; double angt, qred; int isav; double temp, zero, xsav = 0.0, xsum, angbd = 0.0, dredg = 0.0, sredg = 0.0; int iterc; double resid, delsq, ggsav = 0.0, tempa, tempb, redmax, dredsq = 0.0, redsav, onemin, gredsq = 0.0, rednew; int itcsav = 0; double rdprev, rdnext = 0.0, stplen, stepsq; int itermax = 0; /* The arguments N, NPT, XPT, XOPT, GOPT, HQ, PQ, SL and SU have the same */ /* meanings as the corresponding arguments of BOBYQB. */ /* DELTA is the trust region radius for the present calculation, which */ /* seeks a small value of the quadratic model within distance DELTA of */ /* XOPT subject to the bounds on the variables. */ /* XNEW will be set to a new vector of variables that is approximately */ /* the one that minimizes the quadratic model within the trust region */ /* subject to the SL and SU constraints on the variables. It satisfies */ /* as equations the bounds that become active during the calculation. */ /* D is the calculated trial step from XOPT, generated iteratively from an */ /* initial value of zero. Thus XNEW is XOPT+D after the final iteration. */ /* GNEW holds the gradient of the quadratic model at XOPT+D. It is updated */ /* when D is updated. */ /* XBDI is a working space vector. For I=1,2,...,N, the element XBDI(I) is */ /* set to -1.0, 0.0, or 1.0, the value being nonzero if and only if the */ /* I-th variable has become fixed at a bound, the bound being SL(I) or */ /* SU(I) in the case XBDI(I)=-1.0 or XBDI(I)=1.0, respectively. This */ /* information is accumulated during the construction of XNEW. */ /* The arrays S, HS and HRED are also used for working space. They hold the */ /* current search direction, and the changes in the gradient of Q along S */ /* and the reduced D, respectively, where the reduced D is the same as D, */ /* except that the components of the fixed variables are zero. */ /* DSQ will be set to the square of the length of XNEW-XOPT. */ /* CRVMIN is set to zero if D reaches the trust region boundary. Otherwise */ /* it is set to the least curvature of H that occurs in the conjugate */ /* gradient searches that are not restricted by any constraints. The */ /* value CRVMIN=-1.0D0 is set, however, if all of these searches are */ /* constrained. */ /* A version of the truncated conjugate gradient is applied. If a line */ /* search is restricted by a constraint, then the procedure is restarted, */ /* the values of the variables that are at their bounds being fixed. If */ /* the trust region boundary is reached, then further changes may be made */ /* to D, each one being in the two dimensional space that is spanned */ /* by the current D and the gradient of Q at XOPT+D, staying on the trust */ /* region boundary. Termination occurs when the reduction in Q seems to */ /* be close to the greatest reduction that can be achieved. */ /* Set some constants. */ /* Parameter adjustments */ xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xopt; --gopt; --hq; --pq; --sl; --su; --xnew; --d__; --gnew; --xbdi; --s; --hs; --hred; /* Function Body */ half = .5; one = 1.; onemin = -1.; zero = 0.; /* The sign of GOPT(I) gives the sign of the change to the I-th variable */ /* that will reduce Q from its value at XOPT. Thus XBDI(I) shows whether */ /* or not to fix the I-th variable at one of its bounds initially, with */ /* NACT being set to the number of fixed variables. D and GNEW are also */ /* set for the first iteration. DELSQ is the upper bound on the sum of */ /* squares of the free variables. QRED is the reduction in Q so far. */ iterc = 0; nact = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xbdi[i__] = zero; if (xopt[i__] <= sl[i__]) { if (gopt[i__] >= zero) { xbdi[i__] = onemin; } } else if (xopt[i__] >= su[i__]) { if (gopt[i__] <= zero) { xbdi[i__] = one; } } if (xbdi[i__] != zero) { ++nact; } d__[i__] = zero; /* L10: */ gnew[i__] = gopt[i__]; } delsq = *delta * *delta; qred = zero; *crvmin = onemin; /* Set the next search direction of the conjugate gradient method. It is */ /* the steepest descent direction initially and when the iterations are */ /* restarted because a variable has just been fixed by a bound, and of */ /* course the components of the fixed variables are zero. ITERMAX is an */ /* upper bound on the indices of the conjugate gradient iterations. */ L20: beta = zero; L30: stepsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] != zero) { s[i__] = zero; } else if (beta == zero) { s[i__] = -gnew[i__]; } else { s[i__] = beta * s[i__] - gnew[i__]; } /* L40: */ /* Computing 2nd power */ d__1 = s[i__]; stepsq += d__1 * d__1; } if (stepsq == zero) { goto L190; } if (beta == zero) { gredsq = stepsq; itermax = iterc + *n - nact; } if (gredsq * delsq <= qred * 1e-4 * qred) { goto L190; } /* Multiply the search direction by the second derivative matrix of Q and */ /* calculate some scalars for the choice of steplength. Then set BLEN to */ /* the length of the step to the trust region boundary and STPLEN to */ /* the steplength, ignoring the simple bounds. */ goto L210; L50: resid = delsq; ds = zero; shs = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] == zero) { /* Computing 2nd power */ d__1 = d__[i__]; resid -= d__1 * d__1; ds += s[i__] * d__[i__]; shs += s[i__] * hs[i__]; } /* L60: */ } if (resid <= zero) { goto L90; } temp = sqrt(stepsq * resid + ds * ds); if (ds < zero) { blen = (temp - ds) / stepsq; } else { blen = resid / (temp + ds); } stplen = blen; if (shs > zero) { /* Computing MIN */ d__1 = blen, d__2 = gredsq / shs; stplen = MIN2(d__1,d__2); } /* Reduce STPLEN if necessary in order to preserve the simple bounds, */ /* letting IACT be the index of the new constrained variable. */ iact = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] != zero) { xsum = xopt[i__] + d__[i__]; if (s[i__] > zero) { temp = (su[i__] - xsum) / s[i__]; } else { temp = (sl[i__] - xsum) / s[i__]; } if (temp < stplen) { stplen = temp; iact = i__; } } /* L70: */ } /* Update CRVMIN, GNEW and D. Set SDEC to the decrease that occurs in Q. */ sdec = zero; if (stplen > zero) { ++iterc; temp = shs / stepsq; if (iact == 0 && temp > zero) { *crvmin = MIN2(*crvmin,temp); if (*crvmin == onemin) { *crvmin = temp; } } ggsav = gredsq; gredsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { gnew[i__] += stplen * hs[i__]; if (xbdi[i__] == zero) { /* Computing 2nd power */ d__1 = gnew[i__]; gredsq += d__1 * d__1; } /* L80: */ d__[i__] += stplen * s[i__]; } /* Computing MAX */ d__1 = stplen * (ggsav - half * stplen * shs); sdec = MAX2(d__1,zero); qred += sdec; } /* Restart the conjugate gradient method if it has hit a new bound. */ if (iact > 0) { ++nact; xbdi[iact] = one; if (s[iact] < zero) { xbdi[iact] = onemin; } /* Computing 2nd power */ d__1 = d__[iact]; delsq -= d__1 * d__1; if (delsq <= zero) { goto L90; } goto L20; } /* If STPLEN is less than BLEN, then either apply another conjugate */ /* gradient iteration or RETURN. */ if (stplen < blen) { if (iterc == itermax) { goto L190; } if (sdec <= qred * .01) { goto L190; } beta = gredsq / ggsav; goto L30; } L90: *crvmin = zero; /* Prepare for the alternative iteration by calculating some scalars */ /* and by multiplying the reduced D by the second derivative matrix of */ /* Q, where S holds the reduced D in the call of GGMULT. */ L100: if (nact >= *n - 1) { goto L190; } dredsq = zero; dredg = zero; gredsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] == zero) { /* Computing 2nd power */ d__1 = d__[i__]; dredsq += d__1 * d__1; dredg += d__[i__] * gnew[i__]; /* Computing 2nd power */ d__1 = gnew[i__]; gredsq += d__1 * d__1; s[i__] = d__[i__]; } else { s[i__] = zero; } /* L110: */ } itcsav = iterc; goto L210; /* Let the search direction S be a linear combination of the reduced D */ /* and the reduced G that is orthogonal to the reduced D. */ L120: ++iterc; temp = gredsq * dredsq - dredg * dredg; if (temp <= qred * 1e-4 * qred) { goto L190; } temp = sqrt(temp); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] == zero) { s[i__] = (dredg * d__[i__] - dredsq * gnew[i__]) / temp; } else { s[i__] = zero; } /* L130: */ } sredg = -temp; /* By considering the simple bounds on the variables, calculate an upper */ /* bound on the tangent of half the angle of the alternative iteration, */ /* namely ANGBD, except that, if already a free variable has reached a */ /* bound, there is a branch back to label 100 after fixing that variable. */ angbd = one; iact = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] == zero) { tempa = xopt[i__] + d__[i__] - sl[i__]; tempb = su[i__] - xopt[i__] - d__[i__]; if (tempa <= zero) { ++nact; xbdi[i__] = onemin; goto L100; } else if (tempb <= zero) { ++nact; xbdi[i__] = one; goto L100; } /* Computing 2nd power */ d__1 = d__[i__]; /* Computing 2nd power */ d__2 = s[i__]; ssq = d__1 * d__1 + d__2 * d__2; /* Computing 2nd power */ d__1 = xopt[i__] - sl[i__]; temp = ssq - d__1 * d__1; if (temp > zero) { temp = sqrt(temp) - s[i__]; if (angbd * temp > tempa) { angbd = tempa / temp; iact = i__; xsav = onemin; } } /* Computing 2nd power */ d__1 = su[i__] - xopt[i__]; temp = ssq - d__1 * d__1; if (temp > zero) { temp = sqrt(temp) + s[i__]; if (angbd * temp > tempb) { angbd = tempb / temp; iact = i__; xsav = one; } } } /* L140: */ } /* Calculate HHD and some curvatures for the alternative iteration. */ goto L210; L150: shs = zero; dhs = zero; dhd = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (xbdi[i__] == zero) { shs += s[i__] * hs[i__]; dhs += d__[i__] * hs[i__]; dhd += d__[i__] * hred[i__]; } /* L160: */ } /* Seek the greatest reduction in Q for a range of equally spaced values */ /* of ANGT in [0,ANGBD], where ANGT is the tangent of half the angle of */ /* the alternative iteration. */ redmax = zero; isav = 0; redsav = zero; iu = (int) (angbd * 17. + 3.1); i__1 = iu; for (i__ = 1; i__ <= i__1; ++i__) { angt = angbd * (double) i__ / (double) iu; sth = (angt + angt) / (one + angt * angt); temp = shs + angt * (angt * dhd - dhs - dhs); rednew = sth * (angt * dredg - sredg - half * sth * temp); if (rednew > redmax) { redmax = rednew; isav = i__; rdprev = redsav; } else if (i__ == isav + 1) { rdnext = rednew; } /* L170: */ redsav = rednew; } /* Return if the reduction is zero. Otherwise, set the sine and cosine */ /* of the angle of the alternative iteration, and calculate SDEC. */ if (isav == 0) { goto L190; } if (isav < iu) { temp = (rdnext - rdprev) / (redmax + redmax - rdprev - rdnext); angt = angbd * ((double) isav + half * temp) / (double) iu; } cth = (one - angt * angt) / (one + angt * angt); sth = (angt + angt) / (one + angt * angt); temp = shs + angt * (angt * dhd - dhs - dhs); sdec = sth * (angt * dredg - sredg - half * sth * temp); if (sdec <= zero) { goto L190; } /* Update GNEW, D and HRED. If the angle of the alternative iteration */ /* is restricted by a bound on a free variable, that variable is fixed */ /* at the bound. */ dredg = zero; gredsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { gnew[i__] = gnew[i__] + (cth - one) * hred[i__] + sth * hs[i__]; if (xbdi[i__] == zero) { d__[i__] = cth * d__[i__] + sth * s[i__]; dredg += d__[i__] * gnew[i__]; /* Computing 2nd power */ d__1 = gnew[i__]; gredsq += d__1 * d__1; } /* L180: */ hred[i__] = cth * hred[i__] + sth * hs[i__]; } qred += sdec; if (iact > 0 && isav == iu) { ++nact; xbdi[iact] = xsav; goto L100; } /* If SDEC is sufficiently small, then RETURN after setting XNEW to */ /* XOPT+D, giving careful attention to the bounds. */ if (sdec > qred * .01) { goto L120; } L190: *dsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ /* Computing MIN */ d__3 = xopt[i__] + d__[i__], d__4 = su[i__]; d__1 = MIN2(d__3,d__4), d__2 = sl[i__]; xnew[i__] = MAX2(d__1,d__2); if (xbdi[i__] == onemin) { xnew[i__] = sl[i__]; } if (xbdi[i__] == one) { xnew[i__] = su[i__]; } d__[i__] = xnew[i__] - xopt[i__]; /* L200: */ /* Computing 2nd power */ d__1 = d__[i__]; *dsq += d__1 * d__1; } return; /* The following instructions multiply the current S-vector by the second */ /* derivative matrix of the quadratic model, putting the product in HS. */ /* They are reached from three different parts of the software above and */ /* they can be regarded as an external subroutine. */ L210: ih = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { hs[j] = zero; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ++ih; if (i__ < j) { hs[j] += hq[ih] * s[i__]; } /* L220: */ hs[i__] += hq[ih] * s[j]; } } i__2 = *npt; for (k = 1; k <= i__2; ++k) { if (pq[k] != zero) { temp = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L230: */ temp += xpt[k + j * xpt_dim1] * s[j]; } temp *= pq[k]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L240: */ hs[i__] += temp * xpt[k + i__ * xpt_dim1]; } } /* L250: */ } if (*crvmin != zero) { goto L50; } if (iterc > itcsav) { goto L150; } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L260: */ hred[i__] = hs[i__]; } goto L120; } /* trsbox_ */ static nlopt_result prelim_(int *n, int *npt, double *x, const double *xl, const double *xu, double *rhobeg, nlopt_stopping *stop, bobyqa_func calfun, void *calfun_data, double *xbase, double *xpt, double *fval, double *gopt, double *hq, double *pq, double *bmat, double *zmat, int *ndim, double *sl, double *su, int *kopt) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2; double d__1, d__2, d__3, d__4; /* Local variables */ double f; int i__, j, k, ih, np, nfm; double one; int nfx, ipt = 0, jpt = 0; /* fbeg will be initialized below, init here to avoid maybe-uninitialized warning */ double two, fbeg = 0.0, diff, half, temp, zero, recip, stepa = 0.0, stepb = 0.0; int itemp; double rhosq; int nf; /* The arguments N, NPT, X, XL, XU, RHOBEG, and MAXFUN are the */ /* same as the corresponding arguments in SUBROUTINE BOBYQA. */ /* The arguments XBASE, XPT, FVAL, HQ, PQ, BMAT, ZMAT, NDIM, SL and SU */ /* are the same as the corresponding arguments in BOBYQB, the elements */ /* of SL and SU being set in BOBYQA. */ /* GOPT is usually the gradient of the quadratic model at XOPT+XBASE, but */ /* it is set by PRELIM to the gradient of the quadratic model at XBASE. */ /* If XOPT is nonzero, BOBYQB will change it to its usual value later. */ /* NF is maintaned as the number of calls of CALFUN so far. */ /* KOPT will be such that the least calculated value of F so far is at */ /* the point XPT(KOPT,.)+XBASE in the space of the variables. */ /* SUBROUTINE PRELIM sets the elements of XBASE, XPT, FVAL, GOPT, HQ, PQ, */ /* BMAT and ZMAT for the first iteration, and it maintains the values of */ /* NF and KOPT. The vector X is also changed by PRELIM. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --x; --xl; --xu; --xbase; --fval; --gopt; --hq; --pq; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --sl; --su; /* Function Body */ half = .5; one = 1.; two = 2.; zero = 0.; rhosq = *rhobeg * *rhobeg; recip = one / rhosq; np = *n + 1; /* Set XBASE to the initial vector of variables, and set the initial */ /* elements of XPT, BMAT, HQ, PQ and ZMAT to zero. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { xbase[j] = x[j]; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L10: */ xpt[k + j * xpt_dim1] = zero; } i__2 = *ndim; for (i__ = 1; i__ <= i__2; ++i__) { /* L20: */ bmat[i__ + j * bmat_dim1] = zero; } } i__2 = *n * np / 2; for (ih = 1; ih <= i__2; ++ih) { /* L30: */ hq[ih] = zero; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { pq[k] = zero; i__1 = *npt - np; for (j = 1; j <= i__1; ++j) { /* L40: */ zmat[k + j * zmat_dim1] = zero; } } /* Begin the initialization procedure. NF becomes one more than the number */ /* of function values so far. The coordinates of the displacement of the */ /* next initial interpolation point from XBASE are set in XPT(NF+1,.). */ nf = 0; L50: nfm = nf; nfx = nf - *n; ++(nf); if (nfm <= *n << 1) { if (nfm >= 1 && nfm <= *n) { stepa = *rhobeg; if (su[nfm] == zero) { stepa = -stepa; } xpt[nf + nfm * xpt_dim1] = stepa; } else if (nfm > *n) { stepa = xpt[nf - *n + nfx * xpt_dim1]; stepb = -(*rhobeg); if (sl[nfx] == zero) { /* Computing MIN */ d__1 = two * *rhobeg, d__2 = su[nfx]; stepb = MIN2(d__1,d__2); } if (su[nfx] == zero) { /* Computing MAX */ d__1 = -two * *rhobeg, d__2 = sl[nfx]; stepb = MAX2(d__1,d__2); } xpt[nf + nfx * xpt_dim1] = stepb; } } else { itemp = (nfm - np) / *n; jpt = nfm - itemp * *n - *n; ipt = jpt + itemp; if (ipt > *n) { itemp = jpt; jpt = ipt - *n; ipt = itemp; } xpt[nf + ipt * xpt_dim1] = xpt[ipt + 1 + ipt * xpt_dim1]; xpt[nf + jpt * xpt_dim1] = xpt[jpt + 1 + jpt * xpt_dim1]; } /* Calculate the next value of F. The least function value so far and */ /* its index are required. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ /* Computing MAX */ d__3 = xl[j], d__4 = xbase[j] + xpt[nf + j * xpt_dim1]; d__1 = MAX2(d__3,d__4), d__2 = xu[j]; x[j] = MIN2(d__1,d__2); if (xpt[nf + j * xpt_dim1] == sl[j]) { x[j] = xl[j]; } if (xpt[nf + j * xpt_dim1] == su[j]) { x[j] = xu[j]; } /* L60: */ } ++ *(stop->nevals_p); f = calfun(*n, &x[1], calfun_data); fval[nf] = f; if (nf == 1) { fbeg = f; *kopt = 1; } else if (f < fval[*kopt]) { *kopt = nf; } /* Set the nonzero initial elements of BMAT and the quadratic model in the */ /* cases when NF is at most 2*N+1. If NF exceeds N+1, then the positions */ /* of the NF-th and (NF-N)-th interpolation points may be switched, in */ /* order that the function value at the first of them contributes to the */ /* off-diagonal second derivative terms of the initial quadratic model. */ if (nf <= (*n << 1) + 1) { if (nf >= 2 && nf <= *n + 1) { gopt[nfm] = (f - fbeg) / stepa; if (*npt < nf + *n) { bmat[nfm * bmat_dim1 + 1] = -one / stepa; bmat[nf + nfm * bmat_dim1] = one / stepa; bmat[*npt + nfm + nfm * bmat_dim1] = -half * rhosq; } } else if (nf >= *n + 2) { ih = nfx * (nfx + 1) / 2; temp = (f - fbeg) / stepb; diff = stepb - stepa; hq[ih] = two * (temp - gopt[nfx]) / diff; gopt[nfx] = (gopt[nfx] * stepb - temp * stepa) / diff; if (stepa * stepb < zero) { if (f < fval[nf - *n]) { fval[nf] = fval[nf - *n]; fval[nf - *n] = f; if (*kopt == nf) { *kopt = nf - *n; } xpt[nf - *n + nfx * xpt_dim1] = stepb; xpt[nf + nfx * xpt_dim1] = stepa; } } bmat[nfx * bmat_dim1 + 1] = -(stepa + stepb) / (stepa * stepb); bmat[nf + nfx * bmat_dim1] = -half / xpt[nf - *n + nfx * xpt_dim1]; bmat[nf - *n + nfx * bmat_dim1] = -bmat[nfx * bmat_dim1 + 1] - bmat[nf + nfx * bmat_dim1]; zmat[nfx * zmat_dim1 + 1] = sqrt(two) / (stepa * stepb); zmat[nf + nfx * zmat_dim1] = sqrt(half) / rhosq; zmat[nf - *n + nfx * zmat_dim1] = -zmat[nfx * zmat_dim1 + 1] - zmat[nf + nfx * zmat_dim1]; } /* Set the off-diagonal second derivatives of the Lagrange functions and */ /* the initial quadratic model. */ } else { ih = ipt * (ipt - 1) / 2 + jpt; zmat[nfx * zmat_dim1 + 1] = recip; zmat[nf + nfx * zmat_dim1] = recip; zmat[ipt + 1 + nfx * zmat_dim1] = -recip; zmat[jpt + 1 + nfx * zmat_dim1] = -recip; temp = xpt[nf + ipt * xpt_dim1] * xpt[nf + jpt * xpt_dim1]; hq[ih] = (fbeg - fval[ipt + 1] - fval[jpt + 1] + f) / temp; } if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (f < stop->minf_max) return NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; if (nf < *npt) { goto L50; } return NLOPT_SUCCESS; } /* prelim_ */ static nlopt_result bobyqb_(int *n, int *npt, double *x, const double *xl, const double *xu, double *rhobeg, double * rhoend, nlopt_stopping *stop, bobyqa_func calfun, void *calfun_data, double *minf, double *xbase, double *xpt, double *fval, double *xopt, double *gopt, double *hq, double *pq, double *bmat, double *zmat, int *ndim, double *sl, double *su, double *xnew, double *xalt, double *d__, double *vlag, double *w) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2, i__3; double d__1, d__2, d__3, d__4; /* Local variables */ double f; int i__, j, k, ih, jj, nh, ip, jp; double dx; int np; double den, one, ten, dsq, rho, sum, two, diff, half, beta, gisq; int knew; double temp, suma, sumb, bsum, fopt; int kopt, nptm; double zero, curv; int ksav; double gqsq, dist, sumw, sumz, diffa, diffb, diffc = 0.0, hdiag; int kbase; double alpha = 0.0, delta, adelt = 0.0, denom, fsave, bdtol, delsq; int nresc, nfsav; double ratio = 0.0, dnorm, vquad, pqold, tenth; int itest; double sumpq, scaden; double errbig, cauchy = 0.0, fracsq, biglsq, densav; double bdtest; double crvmin, frhosq; double distsq; int ntrits; double xoptsq; nlopt_result rc = NLOPT_SUCCESS, rc2; /* The arguments N, NPT, X, XL, XU, RHOBEG, RHOEND, and MAXFUN */ /* are identical to the corresponding arguments in SUBROUTINE BOBYQA. */ /* XBASE holds a shift of origin that should reduce the contributions */ /* from rounding errors to values of the model and Lagrange functions. */ /* XPT is a two-dimensional array that holds the coordinates of the */ /* interpolation points relative to XBASE. */ /* FVAL holds the values of F at the interpolation points. */ /* XOPT is set to the displacement from XBASE of the trust region centre. */ /* GOPT holds the gradient of the quadratic model at XBASE+XOPT. */ /* HQ holds the explicit second derivatives of the quadratic model. */ /* PQ contains the parameters of the implicit second derivatives of the */ /* quadratic model. */ /* BMAT holds the last N columns of H. */ /* ZMAT holds the factorization of the leading NPT by NPT submatrix of H, */ /* this factorization being ZMAT times ZMAT^T, which provides both the */ /* correct rank and positive semi-definiteness. */ /* NDIM is the first dimension of BMAT and has the value NPT+N. */ /* SL and SU hold the differences XL-XBASE and XU-XBASE, respectively. */ /* All the components of every XOPT are going to satisfy the bounds */ /* SL(I) .LEQ. XOPT(I) .LEQ. SU(I), with appropriate equalities when */ /* XOPT is on a constraint boundary. */ /* XNEW is chosen by SUBROUTINE TRSBOX or ALTMOV. Usually XBASE+XNEW is the */ /* vector of variables for the next call of CALFUN. XNEW also satisfies */ /* the SL and SU constraints in the way that has just been mentioned. */ /* XALT is an alternative to XNEW, chosen by ALTMOV, that may replace XNEW */ /* in order to increase the denominator in the updating of UPDATE. */ /* D is reserved for a trial step from XOPT, which is usually XNEW-XOPT. */ /* VLAG contains the values of the Lagrange functions at a new point X. */ /* They are part of a product that requires VLAG to be of length NDIM. */ /* W is a one-dimensional array that is used for working space. Its length */ /* must be at least 3*NDIM = 3*(NPT+N). */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --x; --xl; --xu; --xbase; --fval; --xopt; --gopt; --hq; --pq; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --sl; --su; --xnew; --xalt; --d__; --vlag; --w; /* Function Body */ half = .5; one = 1.; ten = 10.; tenth = .1; two = 2.; zero = 0.; np = *n + 1; nptm = *npt - np; nh = *n * np / 2; /* The call of PRELIM sets the elements of XBASE, XPT, FVAL, GOPT, HQ, PQ, */ /* BMAT and ZMAT for the first iteration, with the corresponding values of */ /* of NF and KOPT, which are the number of calls of CALFUN so far and the */ /* index of the interpolation point at the trust region centre. Then the */ /* initial XOPT is set too. The branch to label 720 occurs if MAXFUN is */ /* less than NPT. GOPT will be updated if KOPT is different from KBASE. */ rc2 = prelim_(n, npt, &x[1], &xl[1], &xu[1], rhobeg, stop, calfun, calfun_data, &xbase[1], &xpt[xpt_offset], &fval[1], &gopt[1], &hq[1], &pq[1], &bmat[ bmat_offset], &zmat[zmat_offset], ndim, &sl[1], &su[1], &kopt); xoptsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xopt[i__] = xpt[kopt + i__ * xpt_dim1]; /* L10: */ /* Computing 2nd power */ d__1 = xopt[i__]; xoptsq += d__1 * d__1; } fsave = fval[1]; if (rc2 != NLOPT_SUCCESS) { rc = rc2; goto L720; } kbase = 1; /* Complete the settings that are required for the iterative procedure. */ rho = *rhobeg; delta = rho; nresc = *(stop->nevals_p); ntrits = 0; diffa = zero; diffb = zero; itest = 0; nfsav = *(stop->nevals_p); /* Update GOPT if necessary before the first iteration and after each */ /* call of RESCUE that makes a call of CALFUN. */ L20: if (kopt != kbase) { ih = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ++ih; if (i__ < j) { gopt[j] += hq[ih] * xopt[i__]; } /* L30: */ gopt[i__] += hq[ih] * xopt[j]; } } if (*(stop->nevals_p) > *npt) { i__2 = *npt; for (k = 1; k <= i__2; ++k) { temp = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L40: */ temp += xpt[k + j * xpt_dim1] * xopt[j]; } temp = pq[k] * temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L50: */ gopt[i__] += temp * xpt[k + i__ * xpt_dim1]; } } } } /* Generate the next point in the trust region that provides a small value */ /* of the quadratic model subject to the constraints on the variables. */ /* The int NTRITS is set to the number "trust region" iterations that */ /* have occurred since the last "alternative" iteration. If the length */ /* of XNEW-XOPT is less than HALF*RHO, however, then there is a branch to */ /* label 650 or 680 with NTRITS=-1, instead of calculating F at XNEW. */ L60: trsbox_(n, npt, &xpt[xpt_offset], &xopt[1], &gopt[1], &hq[1], &pq[1], &sl[ 1], &su[1], &delta, &xnew[1], &d__[1], &w[1], &w[np], &w[np + *n], &w[np + (*n << 1)], &w[np + *n * 3], &dsq, &crvmin); /* Computing MIN */ d__1 = delta, d__2 = sqrt(dsq); dnorm = MIN2(d__1,d__2); if (dnorm < half * rho) { ntrits = -1; /* Computing 2nd power */ d__1 = ten * rho; distsq = d__1 * d__1; if (*(stop->nevals_p) <= nfsav + 2) { goto L650; } /* The following choice between labels 650 and 680 depends on whether or */ /* not our work with the current RHO seems to be complete. Either RHO is */ /* decreased or termination occurs if the errors in the quadratic model at */ /* the last three interpolation points compare favourably with predictions */ /* of likely improvements to the model within distance HALF*RHO of XOPT. */ /* Computing MAX */ d__1 = MAX2(diffa,diffb); errbig = MAX2(d__1,diffc); frhosq = rho * .125 * rho; if (crvmin > zero && errbig > frhosq * crvmin) { goto L650; } bdtol = errbig / rho; i__1 = *n; for (j = 1; j <= i__1; ++j) { bdtest = bdtol; if (xnew[j] == sl[j]) { bdtest = w[j]; } if (xnew[j] == su[j]) { bdtest = -w[j]; } if (bdtest < bdtol) { curv = hq[(j + j * j) / 2]; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L70: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1]; curv += pq[k] * (d__1 * d__1); } bdtest += half * curv * rho; if (bdtest < bdtol) { goto L650; } } /* L80: */ } goto L680; } ++ntrits; /* Severe cancellation is likely to occur if XOPT is too far from XBASE. */ /* If the following test holds, then XBASE is shifted so that XOPT becomes */ /* zero. The appropriate changes are made to BMAT and to the second */ /* derivatives of the current model, beginning with the changes to BMAT */ /* that do not depend on ZMAT. VLAG is used temporarily for working space. */ L90: if (dsq <= xoptsq * .001) { fracsq = xoptsq * .25; sumpq = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { sumpq += pq[k]; sum = -half * xoptsq; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L100: */ sum += xpt[k + i__ * xpt_dim1] * xopt[i__]; } w[*npt + k] = sum; temp = fracsq - half * sum; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] = bmat[k + i__ * bmat_dim1]; vlag[i__] = sum * xpt[k + i__ * xpt_dim1] + temp * xopt[i__]; ip = *npt + i__; i__3 = i__; for (j = 1; j <= i__3; ++j) { /* L110: */ bmat[ip + j * bmat_dim1] = bmat[ip + j * bmat_dim1] + w[ i__] * vlag[j] + vlag[i__] * w[j]; } } } /* Then the revisions of BMAT that depend on ZMAT are calculated. */ i__3 = nptm; for (jj = 1; jj <= i__3; ++jj) { sumz = zero; sumw = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { sumz += zmat[k + jj * zmat_dim1]; vlag[k] = w[*npt + k] * zmat[k + jj * zmat_dim1]; /* L120: */ sumw += vlag[k]; } i__2 = *n; for (j = 1; j <= i__2; ++j) { sum = (fracsq * sumz - half * sumw) * xopt[j]; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L130: */ sum += vlag[k] * xpt[k + j * xpt_dim1]; } w[j] = sum; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L140: */ bmat[k + j * bmat_dim1] += sum * zmat[k + jj * zmat_dim1]; } } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ip = i__ + *npt; temp = w[i__]; i__2 = i__; for (j = 1; j <= i__2; ++j) { /* L150: */ bmat[ip + j * bmat_dim1] += temp * w[j]; } } } /* The following instructions complete the shift, including the changes */ /* to the second derivative parameters of the quadratic model. */ ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { w[j] = -half * sumpq * xopt[j]; i__1 = *npt; for (k = 1; k <= i__1; ++k) { w[j] += pq[k] * xpt[k + j * xpt_dim1]; /* L160: */ xpt[k + j * xpt_dim1] -= xopt[j]; } i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; hq[ih] = hq[ih] + w[i__] * xopt[j] + xopt[i__] * w[j]; /* L170: */ bmat[*npt + i__ + j * bmat_dim1] = bmat[*npt + j + i__ * bmat_dim1]; } } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xbase[i__] += xopt[i__]; xnew[i__] -= xopt[i__]; sl[i__] -= xopt[i__]; su[i__] -= xopt[i__]; /* L180: */ xopt[i__] = zero; } xoptsq = zero; } if (ntrits == 0) { goto L210; } goto L230; /* XBASE is also moved to XOPT by a call of RESCUE. This calculation is */ /* more expensive than the previous shift, because new matrices BMAT and */ /* ZMAT are generated from scratch, which may include the replacement of */ /* interpolation points whose positions seem to be causing near linear */ /* dependence in the interpolation conditions. Therefore RESCUE is called */ /* only if rounding errors have reduced by at least a factor of two the */ /* denominator of the formula for updating the H matrix. It provides a */ /* useful safeguard, but is not invoked in most applications of BOBYQA. */ L190: nfsav = *(stop->nevals_p); kbase = kopt; rc2 = rescue_(n, npt, &xl[1], &xu[1], stop, calfun, calfun_data, &xbase[1], &xpt[xpt_offset], &fval[1], &xopt[1], &gopt[1], &hq[1], &pq[1], &bmat[bmat_offset], &zmat[zmat_offset], ndim, &sl[1], &su[1], &delta, &kopt, &vlag[1], &w[1], &w[*n + np], &w[*ndim + np]); /* XOPT is updated now in case the branch below to label 720 is taken. */ /* Any updating of GOPT occurs after the branch below to label 20, which */ /* leads to a trust region iteration as does the branch to label 60. */ xoptsq = zero; if (kopt != kbase) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xopt[i__] = xpt[kopt + i__ * xpt_dim1]; /* L200: */ /* Computing 2nd power */ d__1 = xopt[i__]; xoptsq += d__1 * d__1; } } if (rc2 != NLOPT_SUCCESS) { rc = rc2; goto L720; } nresc = *(stop->nevals_p); if (nfsav < *(stop->nevals_p)) { nfsav = *(stop->nevals_p); goto L20; } if (ntrits > 0) { goto L60; } /* Pick two alternative vectors of variables, relative to XBASE, that */ /* are suitable as new positions of the KNEW-th interpolation point. */ /* Firstly, XNEW is set to the point on a line through XOPT and another */ /* interpolation point that minimizes the predicted value of the next */ /* denominator, subject to ||XNEW - XOPT|| .LEQ. ADELT and to the SL */ /* and SU bounds. Secondly, XALT is set to the best feasible point on */ /* a constrained version of the Cauchy step of the KNEW-th Lagrange */ /* function, the corresponding value of the square of this function */ /* being returned in CAUCHY. The choice between these alternatives is */ /* going to be made when the denominator is calculated. */ L210: altmov_(n, npt, &xpt[xpt_offset], &xopt[1], &bmat[bmat_offset], &zmat[ zmat_offset], ndim, &sl[1], &su[1], &kopt, &knew, &adelt, &xnew[1] , &xalt[1], &alpha, &cauchy, &w[1], &w[np], &w[*ndim + 1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L220: */ d__[i__] = xnew[i__] - xopt[i__]; } /* Calculate VLAG and BETA for the current choice of D. The scalar */ /* product of D with XPT(K,.) is going to be held in W(NPT+K) for */ /* use when VQUAD is calculated. */ L230: i__1 = *npt; for (k = 1; k <= i__1; ++k) { suma = zero; sumb = zero; sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { suma += xpt[k + j * xpt_dim1] * d__[j]; sumb += xpt[k + j * xpt_dim1] * xopt[j]; /* L240: */ sum += bmat[k + j * bmat_dim1] * d__[j]; } w[k] = suma * (half * suma + sumb); vlag[k] = sum; /* L250: */ w[*npt + k] = suma; } beta = zero; i__1 = nptm; for (jj = 1; jj <= i__1; ++jj) { sum = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L260: */ sum += zmat[k + jj * zmat_dim1] * w[k]; } beta -= sum * sum; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L270: */ vlag[k] += sum * zmat[k + jj * zmat_dim1]; } } dsq = zero; bsum = zero; dx = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* Computing 2nd power */ d__1 = d__[j]; dsq += d__1 * d__1; sum = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L280: */ sum += w[k] * bmat[k + j * bmat_dim1]; } bsum += sum * d__[j]; jp = *npt + j; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L290: */ sum += bmat[jp + i__ * bmat_dim1] * d__[i__]; } vlag[jp] = sum; bsum += sum * d__[j]; /* L300: */ dx += d__[j] * xopt[j]; } beta = dx * dx + dsq * (xoptsq + dx + dx + half * dsq) + beta - bsum; vlag[kopt] += one; /* If NTRITS is zero, the denominator may be increased by replacing */ /* the step D of ALTMOV by a Cauchy step. Then RESCUE may be called if */ /* rounding errors have damaged the chosen denominator. */ if (ntrits == 0) { /* Computing 2nd power */ d__1 = vlag[knew]; denom = d__1 * d__1 + alpha * beta; if (denom < cauchy && cauchy > zero) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { xnew[i__] = xalt[i__]; /* L310: */ d__[i__] = xnew[i__] - xopt[i__]; } cauchy = zero; goto L230; } /* Computing 2nd power */ d__1 = vlag[knew]; if (denom <= half * (d__1 * d__1)) { if (*(stop->nevals_p) > nresc) { goto L190; } /* Return from BOBYQA because of much cancellation in a denominator. */ rc = NLOPT_ROUNDOFF_LIMITED; goto L720; } /* Alternatively, if NTRITS is positive, then set KNEW to the index of */ /* the next interpolation point to be deleted to make room for a trust */ /* region step. Again RESCUE may be called if rounding errors have damaged */ /* the chosen denominator, which is the reason for attempting to select */ /* KNEW before calculating the next value of the objective function. */ } else { delsq = delta * delta; scaden = zero; biglsq = zero; knew = 0; i__2 = *npt; for (k = 1; k <= i__2; ++k) { if (k == kopt) { goto L350; } hdiag = zero; i__1 = nptm; for (jj = 1; jj <= i__1; ++jj) { /* L330: */ /* Computing 2nd power */ d__1 = zmat[k + jj * zmat_dim1]; hdiag += d__1 * d__1; } /* Computing 2nd power */ d__1 = vlag[k]; den = beta * hdiag + d__1 * d__1; distsq = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L340: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1] - xopt[j]; distsq += d__1 * d__1; } /* Computing MAX */ /* Computing 2nd power */ d__3 = distsq / delsq; d__1 = one, d__2 = d__3 * d__3; temp = MAX2(d__1,d__2); if (temp * den > scaden) { scaden = temp * den; knew = k; denom = den; } /* Computing MAX */ /* Computing 2nd power */ d__3 = vlag[k]; d__1 = biglsq, d__2 = temp * (d__3 * d__3); biglsq = MAX2(d__1,d__2); L350: ; } if (scaden <= half * biglsq) { if (*(stop->nevals_p) > nresc) { goto L190; } /* Return from BOBYQA because of much cancellation in a denominator. */ rc = NLOPT_ROUNDOFF_LIMITED; goto L720; } } /* Put the variables for the next calculation of the objective function */ /* in XNEW, with any adjustments for the bounds. */ /* Calculate the value of the objective function at XBASE+XNEW, unless */ /* the limit on the number of calculations of F has been reached. */ L360: i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MIN */ /* Computing MAX */ d__3 = xl[i__], d__4 = xbase[i__] + xnew[i__]; d__1 = MAX2(d__3,d__4), d__2 = xu[i__]; x[i__] = MIN2(d__1,d__2); if (xnew[i__] == sl[i__]) { x[i__] = xl[i__]; } if (xnew[i__] == su[i__]) { x[i__] = xu[i__]; } /* L380: */ } if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; if (rc != NLOPT_SUCCESS) goto L720; ++ *(stop->nevals_p); f = calfun(*n, &x[1], calfun_data); if (ntrits == -1) { fsave = f; rc = NLOPT_XTOL_REACHED; if (fsave < fval[kopt]) { *minf = f; return rc; } goto L720; } if (f < stop->minf_max) { *minf = f; return NLOPT_MINF_MAX_REACHED; } /* Use the quadratic model to predict the change in F due to the step D, */ /* and set DIFF to the error of this prediction. */ fopt = fval[kopt]; vquad = zero; ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { vquad += d__[j] * gopt[j]; i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; temp = d__[i__] * d__[j]; if (i__ == j) { temp = half * temp; } /* L410: */ vquad += hq[ih] * temp; } } i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L420: */ /* Computing 2nd power */ d__1 = w[*npt + k]; vquad += half * pq[k] * (d__1 * d__1); } diff = f - fopt - vquad; diffc = diffb; diffb = diffa; diffa = fabs(diff); if (dnorm > rho) { nfsav = *(stop->nevals_p); } /* Pick the next value of DELTA after a trust region step. */ if (ntrits > 0) { if (vquad >= zero) { /* Return from BOBYQA because a trust region step has failed to reduce Q. */ rc = NLOPT_ROUNDOFF_LIMITED; /* or FTOL_REACHED? */ goto L720; } ratio = (f - fopt) / vquad; if (ratio <= tenth) { /* Computing MIN */ d__1 = half * delta; delta = MIN2(d__1,dnorm); } else if (ratio <= .7) { /* Computing MAX */ d__1 = half * delta; delta = MAX2(d__1,dnorm); } else { /* Computing MAX */ d__1 = half * delta, d__2 = dnorm + dnorm; delta = MAX2(d__1,d__2); } if (delta <= rho * 1.5) { delta = rho; } /* Recalculate KNEW and DENOM if the new F is less than FOPT. */ if (f < fopt) { ksav = knew; densav = denom; delsq = delta * delta; scaden = zero; biglsq = zero; knew = 0; i__1 = *npt; for (k = 1; k <= i__1; ++k) { hdiag = zero; i__2 = nptm; for (jj = 1; jj <= i__2; ++jj) { /* L440: */ /* Computing 2nd power */ d__1 = zmat[k + jj * zmat_dim1]; hdiag += d__1 * d__1; } /* Computing 2nd power */ d__1 = vlag[k]; den = beta * hdiag + d__1 * d__1; distsq = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L450: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1] - xnew[j]; distsq += d__1 * d__1; } /* Computing MAX */ /* Computing 2nd power */ d__3 = distsq / delsq; d__1 = one, d__2 = d__3 * d__3; temp = MAX2(d__1,d__2); if (temp * den > scaden) { scaden = temp * den; knew = k; denom = den; } /* L460: */ /* Computing MAX */ /* Computing 2nd power */ d__3 = vlag[k]; d__1 = biglsq, d__2 = temp * (d__3 * d__3); biglsq = MAX2(d__1,d__2); } if (scaden <= half * biglsq) { knew = ksav; denom = densav; } } } /* Update BMAT and ZMAT, so that the KNEW-th interpolation point can be */ /* moved. Also update the second derivative terms of the model. */ update_(n, npt, &bmat[bmat_offset], &zmat[zmat_offset], ndim, &vlag[1], & beta, &denom, &knew, &w[1]); ih = 0; pqold = pq[knew]; pq[knew] = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = pqold * xpt[knew + i__ * xpt_dim1]; i__2 = i__; for (j = 1; j <= i__2; ++j) { ++ih; /* L470: */ hq[ih] += temp * xpt[knew + j * xpt_dim1]; } } i__2 = nptm; for (jj = 1; jj <= i__2; ++jj) { temp = diff * zmat[knew + jj * zmat_dim1]; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L480: */ pq[k] += temp * zmat[k + jj * zmat_dim1]; } } /* Include the new interpolation point, and make the changes to GOPT at */ /* the old XOPT that are caused by the updating of the quadratic model. */ fval[knew] = f; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xpt[knew + i__ * xpt_dim1] = xnew[i__]; /* L490: */ w[i__] = bmat[knew + i__ * bmat_dim1]; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { suma = zero; i__2 = nptm; for (jj = 1; jj <= i__2; ++jj) { /* L500: */ suma += zmat[knew + jj * zmat_dim1] * zmat[k + jj * zmat_dim1]; } if (nlopt_isinf(suma)) { /* SGJ: detect singularity here (happens if we run for too many iterations) ... is there another way to recover? */ rc = NLOPT_ROUNDOFF_LIMITED; goto L720; } sumb = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L510: */ sumb += xpt[k + j * xpt_dim1] * xopt[j]; } temp = suma * sumb; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L520: */ w[i__] += temp * xpt[k + i__ * xpt_dim1]; } } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L530: */ gopt[i__] += diff * w[i__]; } /* Update XOPT, GOPT and KOPT if the new calculated F is less than FOPT. */ if (f < fopt) { kopt = knew; xoptsq = zero; ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { xopt[j] = xnew[j]; /* Computing 2nd power */ d__1 = xopt[j]; xoptsq += d__1 * d__1; i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; if (i__ < j) { gopt[j] += hq[ih] * d__[i__]; } /* L540: */ gopt[i__] += hq[ih] * d__[j]; } } i__1 = *npt; for (k = 1; k <= i__1; ++k) { temp = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L550: */ temp += xpt[k + j * xpt_dim1] * d__[j]; } temp = pq[k] * temp; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L560: */ gopt[i__] += temp * xpt[k + i__ * xpt_dim1]; } } if (nlopt_stop_ftol(stop, f, fopt)) { rc = NLOPT_FTOL_REACHED; goto L720; } } /* Calculate the parameters of the least Frobenius norm interpolant to */ /* the current data, the gradient of this interpolant at XOPT being put */ /* into VLAG(NPT+I), I=1,2,...,N. */ if (ntrits > 0) { i__2 = *npt; for (k = 1; k <= i__2; ++k) { vlag[k] = fval[k] - fval[kopt]; /* L570: */ w[k] = zero; } i__2 = nptm; for (j = 1; j <= i__2; ++j) { sum = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L580: */ sum += zmat[k + j * zmat_dim1] * vlag[k]; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L590: */ w[k] += sum * zmat[k + j * zmat_dim1]; } } i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L600: */ sum += xpt[k + j * xpt_dim1] * xopt[j]; } w[k + *npt] = w[k]; /* L610: */ w[k] = sum * w[k]; } gqsq = zero; gisq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sum = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L620: */ sum = sum + bmat[k + i__ * bmat_dim1] * vlag[k] + xpt[k + i__ * xpt_dim1] * w[k]; } if (xopt[i__] == sl[i__]) { /* Computing MIN */ d__2 = zero, d__3 = gopt[i__]; /* Computing 2nd power */ d__1 = MIN2(d__2,d__3); gqsq += d__1 * d__1; /* Computing 2nd power */ d__1 = MIN2(zero,sum); gisq += d__1 * d__1; } else if (xopt[i__] == su[i__]) { /* Computing MAX */ d__2 = zero, d__3 = gopt[i__]; /* Computing 2nd power */ d__1 = MAX2(d__2,d__3); gqsq += d__1 * d__1; /* Computing 2nd power */ d__1 = MAX2(zero,sum); gisq += d__1 * d__1; } else { /* Computing 2nd power */ d__1 = gopt[i__]; gqsq += d__1 * d__1; gisq += sum * sum; } /* L630: */ vlag[*npt + i__] = sum; } /* Test whether to replace the new quadratic model by the least Frobenius */ /* norm interpolant, making the replacement if the test is satisfied. */ ++itest; if (gqsq < ten * gisq) { itest = 0; } if (itest >= 3) { i__1 = MAX2(*npt,nh); for (i__ = 1; i__ <= i__1; ++i__) { if (i__ <= *n) { gopt[i__] = vlag[*npt + i__]; } if (i__ <= *npt) { pq[i__] = w[*npt + i__]; } if (i__ <= nh) { hq[i__] = zero; } itest = 0; /* L640: */ } } } /* If a trust region step has provided a sufficient decrease in F, then */ /* branch for another trust region calculation. The case NTRITS=0 occurs */ /* when the new interpolation point was reached by an alternative step. */ if (ntrits == 0) { goto L60; } if (f <= fopt + tenth * vquad) { goto L60; } /* Alternatively, find out if the interpolation points are close enough */ /* to the best point so far. */ /* Computing MAX */ /* Computing 2nd power */ d__3 = two * delta; /* Computing 2nd power */ d__4 = ten * rho; d__1 = d__3 * d__3, d__2 = d__4 * d__4; distsq = MAX2(d__1,d__2); L650: knew = 0; i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L660: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1] - xopt[j]; sum += d__1 * d__1; } if (sum > distsq) { knew = k; distsq = sum; } /* L670: */ } /* If KNEW is positive, then ALTMOV finds alternative new positions for */ /* the KNEW-th interpolation point within distance ADELT of XOPT. It is */ /* reached via label 90. Otherwise, there is a branch to label 60 for */ /* another trust region iteration, unless the calculations with the */ /* current RHO are complete. */ if (knew > 0) { dist = sqrt(distsq); if (ntrits == -1) { /* Computing MIN */ d__1 = tenth * delta, d__2 = half * dist; delta = MIN2(d__1,d__2); if (delta <= rho * 1.5) { delta = rho; } } ntrits = 0; /* Computing MAX */ /* Computing MIN */ d__2 = tenth * dist; d__1 = MIN2(d__2,delta); adelt = MAX2(d__1,rho); dsq = adelt * adelt; goto L90; } if (ntrits == -1) { goto L680; } if (ratio > zero) { goto L60; } if (MAX2(delta,dnorm) > rho) { goto L60; } /* The calculations with the current value of RHO are complete. Pick the */ /* next values of RHO and DELTA. */ L680: if (rho > *rhoend) { delta = half * rho; ratio = rho / *rhoend; if (ratio <= 16.) { rho = *rhoend; } else if (ratio <= 250.) { rho = sqrt(ratio) * *rhoend; } else { rho = tenth * rho; } delta = MAX2(delta,rho); ntrits = 0; nfsav = *(stop->nevals_p); goto L60; } /* Return from the calculation, after another Newton-Raphson step, if */ /* it is too short to have been tried before. */ if (ntrits == -1) { goto L360; } L720: /* originally: if (fval[kopt] <= fsave) -- changed by SGJ, since this seems like a slight optimization to not update x[] unnecessarily, at the expense of possibly not returning the best x[] found so far if the algorithm is stopped suddenly (e.g. runs out of time) ... it seems safer to execute this unconditionally, and the efficiency loss seems negligible. */ { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ /* Computing MAX */ d__3 = xl[i__], d__4 = xbase[i__] + xopt[i__]; d__1 = MAX2(d__3,d__4), d__2 = xu[i__]; x[i__] = MIN2(d__1,d__2); if (xopt[i__] == sl[i__]) { x[i__] = xl[i__]; } if (xopt[i__] == su[i__]) { x[i__] = xu[i__]; } /* L730: */ } f = fval[kopt]; } *minf = f; return rc; } /* bobyqb_ */ /**************************************************************************/ #define U(n) ((unsigned) (n)) typedef struct { double *s, *xs; nlopt_func f; void *f_data; } rescale_fun_data; static double rescale_fun(int n, const double *x, void *d_) { rescale_fun_data *d = (rescale_fun_data*) d_; nlopt_unscale(U(n), d->s, x, d->xs); return d->f(U(n), d->xs, NULL, d->f_data); } nlopt_result bobyqa(int n, int npt, double *x, const double *xl, const double *xu, const double *dx, nlopt_stopping *stop, double *minf, nlopt_func f, void *f_data) { /* System generated locals */ int i__1; double d__1, d__2; /* Local variables */ int j, id, np, iw, igo, ihq, ixb, ixa, ifv, isl, jsl, ipq, ivl, ixn, ixo, ixp, isu, jsu, ndim; double temp, zero; int ibmat, izmat; double rhobeg, rhoend; double *w0 = NULL, *w; nlopt_result ret; double *s = NULL, *sxl = NULL, *sxu = NULL, *xs = NULL; rescale_fun_data calfun_data; /* SGJ 2010: rescale parameters to make the initial step sizes dx equal in all directions */ s = nlopt_compute_rescaling(U(n), dx); if (!s) return NLOPT_OUT_OF_MEMORY; for (j = 0; j < n; ++j) if (s[j] == 0 || !nlopt_isfinite(s[j])) { nlopt_stop_msg(stop, "invalid scaling %g of dimension %d: possible over/underflow?", s[j], j); ret = NLOPT_INVALID_ARGS; goto done; } /* this statement must go before goto done, so that --x occurs */ nlopt_rescale(U(n), s, x, x); --x; xs = (double *) malloc(sizeof(double) * (U(n))); if (!xs) { ret = NLOPT_OUT_OF_MEMORY; goto done; } sxl = nlopt_new_rescaled(U(n), s, xl); if (!sxl) { ret = NLOPT_OUT_OF_MEMORY; goto done; } xl = sxl; sxu = nlopt_new_rescaled(U(n), s, xu); if (!sxu) { ret = NLOPT_OUT_OF_MEMORY; goto done; } xu = sxu; nlopt_reorder_bounds(n, sxl, sxu); rhobeg = fabs(dx[0] / s[0]); /* equals all other dx[i] after rescaling */ calfun_data.s = s; calfun_data.xs = xs; calfun_data.f = f; calfun_data.f_data = f_data; /* SGJ, 2009: compute rhoend from NLopt stop info */ rhoend = stop->xtol_rel * (rhobeg); if (stop->xtol_abs) { for (j = 0; j < n; ++j) if (rhoend < stop->xtol_abs[j] / fabs(s[j])) rhoend = stop->xtol_abs[j] / fabs(s[j]); } /* This subroutine seeks the least value of a function of many variables, */ /* by applying a trust region method that forms quadratic models by */ /* interpolation. There is usually some freedom in the interpolation */ /* conditions, which is taken up by minimizing the Frobenius norm of */ /* the change to the second derivative of the model, beginning with the */ /* zero matrix. The values of the variables are constrained by upper and */ /* lower bounds. The arguments of the subroutine are as follows. */ /* N must be set to the number of variables and must be at least two. */ /* NPT is the number of interpolation conditions. Its value must be in */ /* the interval [N+2,(N+1)(N+2)/2]. Choices that exceed 2*N+1 are not */ /* recommended. */ /* Initial values of the variables must be set in X(1),X(2),...,X(N). They */ /* will be changed to the values that give the least calculated F. */ /* For I=1,2,...,N, XL(I) and XU(I) must provide the lower and upper */ /* bounds, respectively, on X(I). The construction of quadratic models */ /* requires XL(I) to be strictly less than XU(I) for each I. Further, */ /* the contribution to a model from changes to the I-th variable is */ /* damaged severely by rounding errors if XU(I)-XL(I) is too small. */ /* RHOBEG and RHOEND must be set to the initial and final values of a trust */ /* region radius, so both must be positive with RHOEND no greater than */ /* RHOBEG. Typically, RHOBEG should be about one tenth of the greatest */ /* expected change to a variable, while RHOEND should indicate the */ /* accuracy that is required in the final values of the variables. An */ /* error return occurs if any of the differences XU(I)-XL(I), I=1,...,N, */ /* is less than 2*RHOBEG. */ /* MAXFUN must be set to an upper bound on the number of calls of CALFUN. */ /* The array W will be used for working space. Its length must be at least */ /* (NPT+5)*(NPT+N)+3*N*(N+5)/2. */ /* SUBROUTINE CALFUN (N,X,F) has to be provided by the user. It must set */ /* F to the value of the objective function for the current values of the */ /* variables X(1),X(2),...,X(N), which are generated automatically in a */ /* way that satisfies the bounds given in XL and XU. */ /* Return if the value of NPT is unacceptable. */ /* Parameter adjustments */ --xu; --xl; /* Function Body */ np = n + 1; if (npt < n + 2 || npt > (n + 2) * np / 2) { /* Return from BOBYQA because NPT is not in the required interval */ ret = NLOPT_INVALID_ARGS; nlopt_stop_msg(stop, "invalid number of sampling points"); goto done; } /* Partition the working space array, so that different parts of it can */ /* be treated separately during the calculation of BOBYQB. The partition */ /* requires the first (NPT+2)*(NPT+N)+3*N*(N+5)/2 elements of W plus the */ /* space that is taken by the last array in the argument list of BOBYQB. */ ndim = npt + n; ixb = 1; ixp = ixb + n; ifv = ixp + n * npt; ixo = ifv + npt; igo = ixo + n; ihq = igo + n; ipq = ihq + n * np / 2; ibmat = ipq + npt; izmat = ibmat + ndim * n; isl = izmat + npt * (npt - np); isu = isl + n; ixn = isu + n; ixa = ixn + n; id = ixa + n; ivl = id + n; iw = ivl + ndim; w0 = (double *) malloc(sizeof(double) * U((npt+5)*(npt+n)+3*n*(n+5)/2)); if (!w0) { ret = NLOPT_OUT_OF_MEMORY; goto done; } w = w0 - 1; /* Return if there is insufficient space between the bounds. Modify the */ /* initial X if necessary in order to avoid conflicts between the bounds */ /* and the construction of the first quadratic model. The lower and upper */ /* bounds on moves from the updated X are set now, in the ISL and ISU */ /* partitions of W, in order to provide useful and exact information about */ /* components of X that become within distance RHOBEG from their bounds. */ zero = 0.; i__1 = n; for (j = 1; j <= i__1; ++j) { temp = xu[j] - xl[j]; if (temp < rhobeg + rhobeg) { /* Return from BOBYQA because one of the differences XU(I)-XL(I)s is less than 2*RHOBEG. */ ret = NLOPT_INVALID_ARGS; nlopt_stop_msg(stop, "insufficient space between the bounds: %g - %g < %g", xu[j], xl[j], rhobeg+rhobeg); goto done; } jsl = isl + j - 1; jsu = jsl + n; w[jsl] = xl[j] - x[j]; w[jsu] = xu[j] - x[j]; if (w[jsl] >= -(rhobeg)) { if (w[jsl] >= zero) { x[j] = xl[j]; w[jsl] = zero; w[jsu] = temp; } else { x[j] = xl[j] + rhobeg; w[jsl] = -(rhobeg); /* Computing MAX */ d__1 = xu[j] - x[j]; w[jsu] = MAX2(d__1,rhobeg); } } else if (w[jsu] <= rhobeg) { if (w[jsu] <= zero) { x[j] = xu[j]; w[jsl] = -temp; w[jsu] = zero; } else { x[j] = xu[j] - rhobeg; /* Computing MIN */ d__1 = xl[j] - x[j], d__2 = -(rhobeg); w[jsl] = MIN2(d__1,d__2); w[jsu] = rhobeg; } } /* L30: */ } /* Make the call of BOBYQB. */ ret = bobyqb_(&n, &npt, &x[1], &xl[1], &xu[1], &rhobeg, &rhoend, stop, rescale_fun, &calfun_data, minf, &w[ixb], &w[ixp], &w[ifv], &w[ixo], &w[igo], &w[ihq], &w[ipq], &w[ibmat], &w[izmat], &ndim, &w[isl], &w[isu], &w[ixn], &w[ixa], &w[id], &w[ivl], &w[iw]); done: free(w0); free(sxl); free(sxu); free(xs); ++x; nlopt_unscale(U(n), s, x, x); free(s); return ret; } /* bobyqa_ */ stevengj-nlopt-88c424d/src/algs/bobyqa/bobyqa.h000066400000000000000000000004571521061417600214640ustar00rootroot00000000000000#ifndef BOBYQA_H #define BOBYQA_H 1 #include "nlopt-util.h" #include "nlopt.h" extern nlopt_result bobyqa(int n, int npt, double *x, const double *lb, const double *ub, const double *dx, nlopt_stopping *stop, double *minf, nlopt_func f, void *f_data); #endif /* BOBYQA_H */ stevengj-nlopt-88c424d/src/algs/cdirect/000077500000000000000000000000001521061417600201705ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/cdirect/README000066400000000000000000000022561521061417600210550ustar00rootroot00000000000000From-scratch re-implementation of the DIRECT and DIRECT-L algorithms described in: D. R. Jones, C. D. Perttunen, and B. E. Stuckmann, "Lipschitzian optimization without the lipschitz constant," J. Optimization Theory and Applications, vol. 79, p. 157 (1993). J. M. Gablonsky and C. T. Kelley, "A locally-biased form of the DIRECT algorithm," J. Global Optimization 21 (1), p. 27-37 (2001). I re-implemented the algorithms for a couple of reasons. First, because I was interested in the algorithms and wanted to play with them by trying some variations (originally, because I wanted to experiment with a hybrid approach combining DIRECT with local search algorithms, see hybrid.c). Second, I wanted to remove some arbitrary restrictions in the original Fortran code, e.g. a fixed upper bound on the number of function evaluations. Third, because it was fun to code. As far as I can tell, my version converges in about the same number of iterations as Gablonsky's code (with occasional slight differences due to minor differences in how I break ties, etc.). The code in this directory is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson stevengj-nlopt-88c424d/src/algs/cdirect/cdirect.c000066400000000000000000000473551521061417600217670ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include "nlopt-util.h" #include "nlopt.h" #include "cdirect.h" #include "redblack.h" #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /***************************************************************************/ /* basic data structure: * * a hyper-rectangle is stored as an array of length L = 2n+3, where [1] * is the value (f) of the function at the center, [0] is the "size" * measure (d) of the rectangle, [3..n+2] are the coordinates of the * center (c), [n+3..2n+2] are the widths of the sides (w), and [2] * is an "age" measure for tie-breaking purposes. * * we store the hyper-rectangles in a red-black tree, sorted by (d,f) * in lexographic order, to allow us to perform quick convex-hull * calculations (in the future, we might make this data structure * more sophisticated based on the dynamic convex-hull literature). * * n > 0 always, of course. */ /* parameters of the search algorithm and various information that needs to be passed around */ typedef struct { int n; /* dimension */ int L; /* size of each rectangle (2n+3) */ double magic_eps; /* Jones' epsilon parameter (1e-4 is recommended) */ int which_diam; /* which measure of hyper-rectangle diam to use: 0 = Jones, 1 = Gablonsky */ int which_div; /* which way to divide rects: 0: orig. Jones (divide all longest sides) 1: Gablonsky (cubes divide all, rects longest) 2: Jones Encyc. Opt.: pick random longest side */ int which_opt; /* which rects are considered "potentially optimal" 0: Jones (all pts on cvx hull, even equal pts) 1: Gablonsky DIRECT-L (pick one pt, if equal pts) 2: ~ 1, but pick points randomly if equal pts ... 2 seems to suck compared to just picking oldest pt */ const double *lb, *ub; nlopt_stopping *stop; /* stopping criteria */ nlopt_func f; void *f_data; double *work; /* workspace, of length >= 2*n */ int *iwork; /* workspace, length >= n */ double minf, *xmin; /* minimum so far */ /* red-black tree of hyperrects, sorted by (d,f,age) in lexographical order */ rb_tree rtree; int age; /* age for next new rect */ double **hull; /* array to store convex hull */ int hull_len; /* allocated length of hull array */ } params; /***************************************************************************/ /* Evaluate the "diameter" (d) of a rectangle of widths w[n] We round the result to single precision, which should be plenty for the use we put the diameter to (rect sorting), to allow our performance hack in convex_hull to work (in the Jones and Gablonsky DIRECT algorithms, all of the rects fall into a few diameter values, and we don't want rounding error to spoil this) */ static double rect_diameter(int n, const double *w, const params *p) { int i; if (p->which_diam == 0) { /* Jones measure */ double sum = 0; for (i = 0; i < n; ++i) sum += w[i] * w[i]; /* distance from center to a vertex */ return ((float) (sqrt(sum) * 0.5)); } else { /* Gablonsky measure */ double maxw = 0; for (i = 0; i < n; ++i) if (w[i] > maxw) maxw = w[i]; /* half-width of longest side */ return ((float) (maxw * 0.5)); } } #define ALLOC_RECT(rect, L) if (!(rect = (double*) malloc(sizeof(double)*(L)))) return NLOPT_OUT_OF_MEMORY static int sort_fv_compare(void *fv_, const void *a_, const void *b_) { const double *fv = (const double *) fv_; int a = *((const int *) a_), b = *((const int *) b_); double fa = MIN(fv[2*a], fv[2*a+1]); double fb = MIN(fv[2*b], fv[2*b+1]); if (fa < fb) return -1; else if (fa > fb) return +1; else return 0; } static void sort_fv(int n, double *fv, int *isort) { int i; for (i = 0; i < n; ++i) isort[i] = i; nlopt_qsort_r(isort, (unsigned) n, sizeof(int), fv, sort_fv_compare); } static double function_eval(const double *x, params *p) { double f = p->f(p->n, x, NULL, p->f_data); if (f < p->minf) { p->minf = f; memcpy(p->xmin, x, sizeof(double) * p->n); } ++ *(p->stop->nevals_p); return f; } #define FUNCTION_EVAL(fv,x,p,freeonerr) fv = function_eval(x, p); if (nlopt_stop_forced((p)->stop)) { free(freeonerr); return NLOPT_FORCED_STOP; } else if (p->minf < p->stop->minf_max) { free(freeonerr); return NLOPT_MINF_MAX_REACHED; } else if (nlopt_stop_evals((p)->stop)) { free(freeonerr); return NLOPT_MAXEVAL_REACHED; } else if (nlopt_stop_time((p)->stop)) { free(freeonerr); return NLOPT_MAXTIME_REACHED; } #define THIRD (0.3333333333333333333333) #define EQUAL_SIDE_TOL 5e-2 /* tolerance to equate side sizes */ /* divide rectangle idiv in the list p->rects */ static nlopt_result divide_rect(double *rdiv, params *p) { int i; const int n = p->n; const int L = p->L; double *c = rdiv + 3; /* center of rect to divide */ double *w = c + n; /* widths of rect to divide */ double wmax = w[0]; int imax = 0, nlongest = 0; rb_node *node; for (i = 1; i < n; ++i) if (w[i] > wmax) wmax = w[imax = i]; for (i = 0; i < n; ++i) if (wmax - w[i] <= wmax * EQUAL_SIDE_TOL) ++nlongest; if (p->which_div == 1 || (p->which_div == 0 && nlongest == n)) { /* trisect all longest sides, in increasing order of the average function value along that direction */ double *fv = p->work; int *isort = p->iwork; for (i = 0; i < n; ++i) { if (wmax - w[i] <= wmax * EQUAL_SIDE_TOL) { double csave = c[i]; c[i] = csave - w[i] * THIRD; FUNCTION_EVAL(fv[2*i], c, p, 0); c[i] = csave + w[i] * THIRD; FUNCTION_EVAL(fv[2*i+1], c, p, 0); c[i] = csave; } else { fv[2*i] = fv[2*i+1] = HUGE_VAL; } } sort_fv(n, fv, isort); if (!(node = nlopt_rb_tree_find(&p->rtree, rdiv))) return NLOPT_FAILURE; for (i = 0; i < nlongest; ++i) { int k; w[isort[i]] *= THIRD; rdiv[0] = rect_diameter(n, w, p); rdiv[2] = p->age++; node = nlopt_rb_tree_resort(&p->rtree, node); for (k = 0; k <= 1; ++k) { if (!isfinite(fv[2*isort[i]+k])) return NLOPT_FAILURE; double *rnew; ALLOC_RECT(rnew, L); memcpy(rnew, rdiv, sizeof(double) * L); rnew[3 + isort[i]] += w[isort[i]] * (2*k-1); rnew[1] = fv[2*isort[i]+k]; rnew[2] = p->age++; if (!nlopt_rb_tree_insert(&p->rtree, rnew)) { free(rnew); return NLOPT_OUT_OF_MEMORY; } } } } else { int k; if (nlongest > 1 && p->which_div == 2) { /* randomly choose longest side */ i = nlopt_iurand(nlongest); for (k = 0; k < n; ++k) if (wmax - w[k] <= wmax * EQUAL_SIDE_TOL) { if (!i) { i = k; break; } --i; } } else i = imax; /* trisect longest side */ if (!(node = nlopt_rb_tree_find(&p->rtree, rdiv))) return NLOPT_FAILURE; w[i] *= THIRD; rdiv[0] = rect_diameter(n, w, p); rdiv[2] = p->age++; node = nlopt_rb_tree_resort(&p->rtree, node); for (k = 0; k <= 1; ++k) { double *rnew; ALLOC_RECT(rnew, L); memcpy(rnew, rdiv, sizeof(double) * L); rnew[3 + i] += w[i] * (2*k-1); FUNCTION_EVAL(rnew[1], rnew + 3, p, rnew); rnew[2] = p->age++; if (!isfinite(rnew[1])) { free(rnew); return NLOPT_FAILURE; } if (!nlopt_rb_tree_insert(&p->rtree, rnew)) { free(rnew); return NLOPT_OUT_OF_MEMORY; } } } return NLOPT_SUCCESS; } /***************************************************************************/ /* Convex hull algorithm, used later to find the potentially optimal points. What we really have in DIRECT is a "dynamic convex hull" problem, since we are dynamically adding/removing points and updating the hull, but I haven't implemented any of the fancy algorithms for this problem yet. */ /* Find the lower convex hull of a set of points (x,y) stored in a rb-tree of pointers to {x,y} arrays sorted in lexographic order by (x,y). Unlike standard convex hulls, we allow redundant points on the hull, and even allow duplicate points if allow_dups is nonzero. The return value is the number of points in the hull, with pointers stored in hull[i] (should be an array of length >= t->N). */ static int convex_hull(rb_tree *t, double **hull, int allow_dups) { int nhull = 0; double minslope; double xmin, xmax, yminmin, ymaxmin; rb_node *n, *nmax; /* Monotone chain algorithm [Andrew, 1979]. */ n = nlopt_rb_tree_min(t); if (!n) return 0; nmax = nlopt_rb_tree_max(t); xmin = n->k[0]; yminmin = n->k[1]; xmax = nmax->k[0]; if (allow_dups) do { /* include any duplicate points at (xmin,yminmin) */ hull[nhull++] = n->k; n = nlopt_rb_tree_succ(n); } while (n && n->k[0] == xmin && n->k[1] == yminmin); else hull[nhull++] = n->k; if (xmin == xmax) return nhull; /* set nmax = min mode with x == xmax */ #if 0 while (nmax->k[0] == xmax) nmax = nlopt_rb_tree_pred(nmax); /* non-NULL since xmin != xmax */ nmax = nlopt_rb_tree_succ(nmax); #else /* performance hack (see also below) */ { double kshift[2]; kshift[0] = xmax * (1 - 1e-13); kshift[1] = -HUGE_VAL; nmax = nlopt_rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */ } #endif ymaxmin = nmax->k[1]; minslope = (ymaxmin - yminmin) / (xmax - xmin); /* set n = first node with x != xmin */ #if 0 while (n->k[0] == xmin) n = nlopt_rb_tree_succ(n); /* non-NULL since xmin != xmax */ #else /* performance hack (see also below) */ { double kshift[2]; kshift[0] = xmin * (1 + 1e-13); kshift[1] = -HUGE_VAL; n = nlopt_rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */ } #endif for (; n != nmax; n = nlopt_rb_tree_succ(n)) { double *k = n->k; if (k[1] > yminmin + (k[0] - xmin) * minslope) continue; /* performance hack: most of the points in DIRECT lie along vertical lines at a few x values, and we can exploit this */ if (nhull && k[0] == hull[nhull - 1][0]) { /* x == previous x */ if (k[1] > hull[nhull - 1][1]) { double kshift[2]; /* because of the round to float in rect_diameter, above, it shouldn't be possible for two diameters (x values) to have a fractional difference < 1e-13. Note that k[0] > 0 always in DIRECT */ kshift[0] = k[0] * (1 + 1e-13); kshift[1] = -HUGE_VAL; n = nlopt_rb_tree_pred(nlopt_rb_tree_find_gt(t, kshift)); continue; } else { /* equal y values, add to hull */ if (allow_dups) hull[nhull++] = k; continue; } } /* remove points until we are making a "left turn" to k */ while (nhull > 1) { double *t1 = hull[nhull - 1], *t2; /* because we allow equal points in our hull, we have to modify the standard convex-hull algorithm slightly: we need to look backwards in the hull list until we find a point t2 != t1 */ int it2 = nhull - 2; do { t2 = hull[it2--]; } while (it2 >= 0 && t2[0] == t1[0] && t2[1] == t1[1]); if (it2 < 0) break; /* cross product (t1-t2) x (k-t2) > 0 for a left turn: */ if ((t1[0]-t2[0]) * (k[1]-t2[1]) - (t1[1]-t2[1]) * (k[0]-t2[0]) >= 0) break; --nhull; } hull[nhull++] = k; } if (allow_dups) do { /* include any duplicate points at (xmax,ymaxmin) */ hull[nhull++] = nmax->k; nmax = nlopt_rb_tree_succ(nmax); } while (nmax && nmax->k[0] == xmax && nmax->k[1] == ymaxmin); else hull[nhull++] = nmax->k; return nhull; } /***************************************************************************/ static int small(double *w, params *p) { int i; for (i = 0; i < p->n; ++i) if (w[i] > (p->stop->xtol_abs ? p->stop->xtol_abs[i] : 0) && w[i] > (p->ub[i] - p->lb[i]) * p->stop->xtol_rel) return 0; return 1; } static nlopt_result divide_good_rects(params *p) { const int n = p->n; double **hull; int nhull, i, xtol_reached = 1, divided_some = 0; double magic_eps = p->magic_eps; if (p->hull_len < p->rtree.N) { p->hull_len += p->rtree.N; p->hull = (double **) realloc(p->hull, sizeof(double*)*p->hull_len); if (!p->hull) return NLOPT_OUT_OF_MEMORY; } nhull = convex_hull(&p->rtree, hull = p->hull, p->which_opt != 1); divisions: for (i = 0; i < nhull; ++i) { double K1 = -HUGE_VAL, K2 = -HUGE_VAL, K; int im, ip; /* find unequal points before (im) and after (ip) to get slope */ for (im = i-1; im >= 0 && hull[im][0] == hull[i][0]; --im) ; for (ip = i+1; ip < nhull && hull[ip][0] == hull[i][0]; ++ip) ; if (im >= 0) K1 = (hull[i][1] - hull[im][1]) / (hull[i][0] - hull[im][0]); if (ip < nhull) K2 = (hull[i][1] - hull[ip][1]) / (hull[i][0] - hull[ip][0]); K = MAX(K1, K2); if (hull[i][1] - K * hull[i][0] <= p->minf - magic_eps * fabs(p->minf) || ip == nhull) { /* "potentially optimal" rectangle, so subdivide */ nlopt_result ret = divide_rect(hull[i], p); divided_some = 1; if (ret != NLOPT_SUCCESS) return ret; xtol_reached = xtol_reached && small(hull[i] + 3+n, p); } /* for the DIRECT-L variant, we only divide one rectangle out of all points with equal diameter and function values ... note that for p->which_opt == 1, i == ip-1 should be a no-op anyway, since we set allow_dups=0 in convex_hull above */ if (p->which_opt == 1) i = ip - 1; /* skip to next unequal point for next iteration */ else if (p->which_opt == 2) /* like DIRECT-L but randomized */ i += nlopt_iurand(ip - i); /* possibly do another equal pt */ } if (!divided_some) { if (magic_eps != 0) { magic_eps = 0; goto divisions; /* try again */ } else { /* WTF? divide largest rectangle with smallest f */ /* (note that this code actually gets called from time to time, and the heuristic here seems to work well, but I don't recall this situation being discussed in the references?) */ rb_node *max = nlopt_rb_tree_max(&p->rtree); rb_node *pred = max; double wmax = max->k[0]; do { /* note: this loop is O(N) worst-case time */ max = pred; pred = nlopt_rb_tree_pred(max); } while (pred && pred->k[0] == wmax); return divide_rect(max->k, p); } } return xtol_reached ? NLOPT_XTOL_REACHED : NLOPT_SUCCESS; } /***************************************************************************/ /* lexographic sort order (d,f,age) of hyper-rects, for red-black tree */ int cdirect_hyperrect_compare(double *a, double *b) { if (a[0] < b[0]) return -1; if (a[0] > b[0]) return +1; if (a[1] < b[1]) return -1; if (a[1] > b[1]) return +1; if (a[2] < b[2]) return -1; if (a[2] > b[2]) return +1; return (int) (a - b); /* tie-breaker, shouldn't be needed */ } /***************************************************************************/ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, double magic_eps, int which_alg) { params p; int i; double *rnew; nlopt_result ret = NLOPT_OUT_OF_MEMORY; p.magic_eps = magic_eps; p.which_diam = which_alg % 3; p.which_div = (which_alg / 3) % 3; p.which_opt = (which_alg / (3*3)) % 3; p.lb = lb; p.ub = ub; p.stop = stop; p.n = n; p.L = 2*n+3; p.f = f; p.f_data = f_data; p.xmin = x; p.minf = HUGE_VAL; p.work = 0; p.iwork = 0; p.hull = 0; p.age = 0; nlopt_rb_tree_init(&p.rtree, cdirect_hyperrect_compare); p.work = (double *) malloc(sizeof(double) * (2*n)); if (!p.work) goto done; p.iwork = (int *) malloc(sizeof(int) * n); if (!p.iwork) goto done; p.hull_len = 128; /* start with a reasonable number */ p.hull = (double **) malloc(sizeof(double *) * p.hull_len); if (!p.hull) goto done; if (!(rnew = (double *) malloc(sizeof(double) * p.L))) goto done; for (i = 0; i < n; ++i) { rnew[3+i] = 0.5 * (lb[i] + ub[i]); rnew[3+n+i] = ub[i] - lb[i]; } rnew[0] = rect_diameter(n, rnew+3+n, &p); rnew[1] = function_eval(rnew+3, &p); rnew[2] = p.age++; if (!nlopt_rb_tree_insert(&p.rtree, rnew)) { free(rnew); goto done; } ret = divide_rect(rnew, &p); if (ret != NLOPT_SUCCESS) goto done; while (1) { double minf0 = p.minf; ret = divide_good_rects(&p); if (ret != NLOPT_SUCCESS) goto done; if (p.minf < minf0 && nlopt_stop_f(p.stop, p.minf, minf0)) { ret = NLOPT_FTOL_REACHED; goto done; } } done: nlopt_rb_tree_destroy_with_keys(&p.rtree); free(p.hull); free(p.iwork); free(p.work); *minf = p.minf; return ret; } /* in the conventional DIRECT-type algorithm, we first rescale our coordinates to a unit hypercube ... we do this simply by wrapping cdirect() around cdirect_unscaled(). */ double cdirect_uf(unsigned n, const double *xu, double *grad, void *d_) { cdirect_uf_data *d = (cdirect_uf_data *) d_; double f; unsigned i; for (i = 0; i < n; ++i) d->x[i] = d->lb[i] + xu[i] * (d->ub[i] - d->lb[i]); f = d->f(n, d->x, grad, d->f_data); if (grad) for (i = 0; i < n; ++i) grad[i] *= d->ub[i] - d->lb[i]; return f; } nlopt_result cdirect(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, double magic_eps, int which_alg) { cdirect_uf_data d; nlopt_result ret; const double *xtol_abs_save = NULL; int i; d.f = f; d.f_data = f_data; d.lb = lb; d.ub = ub; d.x = (double *) calloc(n * (stop->xtol_abs ? 4 : 3), sizeof(double)); if (!d.x) return NLOPT_OUT_OF_MEMORY; for (i = 0; i < n; ++i) { x[i] = (x[i] - lb[i]) / (ub[i] - lb[i]); d.x[n+i] = 0; d.x[2*n+i] = 1; } if (stop->xtol_abs) { for (i = 0; i < n; ++i) d.x[3*n+i] = stop->xtol_abs[i] / (ub[i] - lb[i]); xtol_abs_save = stop->xtol_abs; stop->xtol_abs = d.x + 3*n; } ret = cdirect_unscaled(n, cdirect_uf, &d, d.x+n, d.x+2*n, x, minf, stop, magic_eps, which_alg); stop->xtol_abs = xtol_abs_save; for (i = 0; i < n; ++i) x[i] = lb[i]+ x[i] * (ub[i] - lb[i]); free(d.x); return ret; } stevengj-nlopt-88c424d/src/algs/cdirect/cdirect.h000066400000000000000000000051711521061417600217620ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef CDIRECT_H #define CDIRECT_H #include "nlopt-util.h" #include "nlopt.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, double magic_eps, int which_alg); extern nlopt_result cdirect(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, double magic_eps, int which_alg); extern nlopt_result cdirect_hybrid(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, nlopt_algorithm local_alg, int local_maxeval, int randomized_div); extern nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, nlopt_algorithm local_alg, int local_maxeval, int randomized_div); /* internal routines and data structures: */ extern int cdirect_hyperrect_compare(double *a, double *b); typedef struct { nlopt_func f; void *f_data; double *x; const double *lb, *ub; } cdirect_uf_data; extern double cdirect_uf(unsigned n, const double *xu, double *grad, void *d_); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* DIRECT_H */ stevengj-nlopt-88c424d/src/algs/cdirect/hybrid.c000066400000000000000000000257711521061417600216310ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include "nlopt-util.h" #include "nlopt.h" #include "cdirect.h" #include "redblack.h" /* Hybrid algorithm, inspired by DIRECT, that uses another local * optimization algorithm within each rectangle, and then looks * in the largest remaining rectangle (breaking ties by minimum * function value and then by age. * * Each hyperrect is represented by an array of length 3*n+3 consisting * of (d, -f, -a, x, c, w), where d=diameter, f=f(x), a=age, x=local optimum * c=center, w=widths. */ typedef struct { int n; /* dimension */ int L; /* 3*n+3 */ const double *lb, *ub; nlopt_stopping *stop; /* stopping criteria */ nlopt_func f; void *f_data; double minf, *xmin; /* min so far */ rb_tree rtree; /* red-black tree of rects, sorted by (d,-f,-a) */ int age; /* age for next new rect */ double *work; /* workspace of length >= 2*n */ nlopt_opt local_opt; /* local search algorithm */ int local_maxeval; int randomized_div; /* 1 to use randomized division algorithm */ } params; #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define THIRD (0.3333333333333333333333) /* 1/3 */ /************************************************************************/ static double fcount(unsigned n, const double *x, double *grad, void *p_) { params *p = (params *) p_; ++ *(p->stop->nevals_p); return p->f(n, x, grad, p->f_data); } static nlopt_result optimize_rect(double *r, params *p) { int i, n = p->n; double *lb = p->work, *ub = lb + n; double *x = r + 3, *c = x + n, *w = c + n; double t = nlopt_seconds(); double minf; nlopt_stopping *stop = p->stop; nlopt_result ret; if (stop->maxeval > 0 && *(stop->nevals_p) >= stop->maxeval) return NLOPT_MAXEVAL_REACHED; if (stop->maxtime > 0 && t - stop->start >= stop->maxtime) return NLOPT_MAXTIME_REACHED; for (i = 0; i < n; ++i) { lb[i] = c[i] - 0.5 * w[i]; ub[i] = c[i] + 0.5 * w[i]; } ret = nlopt_set_lower_bounds(p->local_opt, lb); if (ret != NLOPT_SUCCESS) return ret; ret = nlopt_set_upper_bounds(p->local_opt, ub); if (ret != NLOPT_SUCCESS) return ret; if (p->local_maxeval > 0) { ret = nlopt_set_maxeval(p->local_opt, MIN(p->local_maxeval, stop->maxeval - *(stop->nevals_p))); if (ret != NLOPT_SUCCESS) return ret; } ret = nlopt_set_maxtime(p->local_opt, stop->maxtime - (t - stop->start)); if (ret != NLOPT_SUCCESS) return ret; ret = nlopt_optimize(p->local_opt, x, &minf); r[1] = -minf; if (ret > 0) { if (minf < p->minf) { p->minf = minf; memcpy(p->xmin, x, sizeof(double) * n); if (ret == NLOPT_MINF_MAX_REACHED) return ret; } return NLOPT_SUCCESS; } return ret; } /* given a hyperrect r, randomize the starting guess within the middle third of the box (don't guess too close to edges) */ static void randomize_x(int n, double *r) { double *x = r + 3, *c = x + n, *w = c + n; int i; for (i = 0; i < n; ++i) x[i] = nlopt_urand(c[i] - w[i]*(0.5*THIRD), c[i] + w[i]*(0.5*THIRD)); } /************************************************************************/ static double longest(int n, const double *w) { double wmax = w[n-1]; for (n = n-2; n >= 0; n--) if (w[n] > wmax) wmax = w[n]; return wmax; } #define EQUAL_SIDE_TOL 5e-2 /* tolerance to equate side sizes */ static nlopt_result divide_largest(params *p) { int L = p->L; int n = p->n; rb_node *node = nlopt_rb_tree_max(&p->rtree); /* just using it as a heap */ double minf_start = p->minf; double *r = node->k, *rnew = NULL; double *x = r + 3, *c = x + n, *w = c + n; const double *lb = p->lb, *ub = p->ub; int i, idiv; double wmax; nlopt_result ret; /* printf("rect:, %d, %g, %g, %g, %g\n", p->stop->nevals_p, c[0], c[1], w[0], w[1]); */ /* check xtol */ for (i = 0; i < n; ++i) if (w[i] > p->stop->xtol_rel * (ub[i] - lb[i]) && w[i] > (p->stop->xtol_abs ? p->stop->xtol_abs[i] : 0)) break; if (i == n) return NLOPT_XTOL_REACHED; if (p->randomized_div) { /* randomly pick among ~largest sides */ int nlongest = 0; wmax = longest(n, w); for (i = 0; i < n; ++i) if (wmax - w[i] < EQUAL_SIDE_TOL * wmax) ++nlongest; i = 1 + nlopt_iurand(nlongest); for (idiv = 0; idiv < n; ++idiv) { if (wmax - w[idiv] < EQUAL_SIDE_TOL * wmax) --i; if (!i) break; } } else { /* just pick first largest side */ wmax = w[idiv = 0]; for (i = 1; i < n; ++i) if (w[i] > wmax) wmax = w[idiv = i]; } if (fabs(x[idiv] - c[idiv]) > (0.5 * THIRD) * w[idiv]) { /* bisect */ double deltac = (x[idiv] > c[idiv] ? 0.25 : -0.25) * w[idiv]; w[idiv] *= 0.5; c[idiv] += deltac; r[0] = longest(n, w); /* new diameter */ /* r[1] unchanged since still contains local optimum x */ r[2] = p->age--; node = nlopt_rb_tree_resort(&p->rtree, node); rnew = (double *) malloc(sizeof(double) * L); if (!rnew) return NLOPT_OUT_OF_MEMORY; memcpy(rnew, r, sizeof(double) * L); rnew[2] = p->age--; rnew[3+n+idiv] -= deltac*2; if (p->randomized_div) randomize_x(n, rnew); else memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */ ret = optimize_rect(rnew, p); if (ret != NLOPT_SUCCESS) { free(rnew); return ret; } if (!nlopt_rb_tree_insert(&p->rtree, rnew)) { free(rnew); return NLOPT_OUT_OF_MEMORY; } } else { /* trisect */ w[idiv] *= THIRD; r[0] = longest(n, w); /* r[1] unchanged since still contains local optimum x */ r[2] = p->age--; node = nlopt_rb_tree_resort(&p->rtree, node); for (i = -1; i <= +1; i += 2) { rnew = (double *) malloc(sizeof(double) * L); if (!rnew) return NLOPT_OUT_OF_MEMORY; memcpy(rnew, r, sizeof(double) * L); rnew[2] = p->age--; rnew[3+n+idiv] += w[i] * i; if (p->randomized_div) randomize_x(n, rnew); else memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */ ret = optimize_rect(rnew, p); if (ret != NLOPT_SUCCESS) { free(rnew); return ret; } if (!nlopt_rb_tree_insert(&p->rtree, rnew)) { free(rnew); return NLOPT_OUT_OF_MEMORY; } } } if (p->minf < minf_start && nlopt_stop_f(p->stop, p->minf, minf_start)) return NLOPT_FTOL_REACHED; return NLOPT_SUCCESS; } /************************************************************************/ nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, nlopt_algorithm local_alg, int local_maxeval, int randomized_div) { params p; int i; double *rnew; nlopt_result ret = NLOPT_OUT_OF_MEMORY; p.n = n; p.L = 3*n+3; p.lb = lb; p.ub = ub; p.stop = stop; p.f = f; p.f_data = f_data; p.minf = HUGE_VAL; p.xmin = x; p.age = 0; p.work = 0; p.randomized_div = randomized_div; p.local_opt = 0; nlopt_rb_tree_init(&p.rtree, cdirect_hyperrect_compare); p.work = (double *) malloc(sizeof(double) * (2*n)); if (!p.work) goto done; if (!(rnew = (double *) malloc(sizeof(double) * p.L))) goto done; for (i = 0; i < n; ++i) { rnew[3+i] = rnew[3+n+i] = 0.5 * (lb[i] + ub[i]); rnew[3+2*n+i] = ub[i] - lb[i]; } rnew[0] = longest(n, rnew+2*n); rnew[2] = p.age--; p.local_opt = nlopt_create(local_alg, n); if (!p.local_opt) { ret = NLOPT_INVALID_ARGS; goto done; } p.local_maxeval = local_maxeval; ret = nlopt_set_stopval(p.local_opt, stop->minf_max); if (ret != NLOPT_SUCCESS) goto done; ret = nlopt_set_ftol_rel(p.local_opt, stop->ftol_rel); if (ret != NLOPT_SUCCESS) goto done; ret = nlopt_set_ftol_abs(p.local_opt, stop->ftol_abs); if (ret != NLOPT_SUCCESS) goto done; ret = nlopt_set_xtol_rel(p.local_opt, stop->xtol_rel); if (ret != NLOPT_SUCCESS) goto done; if (stop->xtol_abs) { ret = nlopt_set_xtol_abs(p.local_opt, stop->xtol_abs); if (ret != NLOPT_SUCCESS) goto done; } ret = nlopt_set_min_objective(p.local_opt, fcount, &p); if (ret != NLOPT_SUCCESS) goto done; ret = optimize_rect(rnew, &p); if (ret != NLOPT_SUCCESS) { free(rnew); goto done; } if (!nlopt_rb_tree_insert(&p.rtree, rnew)) { free(rnew); goto done; } do { ret = divide_largest(&p); } while (ret == NLOPT_SUCCESS); done: nlopt_rb_tree_destroy_with_keys(&p.rtree); free(p.work); nlopt_destroy(p.local_opt); *minf = p.minf; return ret; } /* rescaled to unit hypercube so that all x[i] are weighted equally */ nlopt_result cdirect_hybrid(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop, nlopt_algorithm local_alg, int local_maxeval, int randomized_div) { cdirect_uf_data d; nlopt_result ret; const double *xtol_abs_save = NULL; int i; d.f = f; d.f_data = f_data; d.lb = lb; d.ub = ub; d.x = (double *) calloc(n * (stop->xtol_abs ? 4 : 3), sizeof(double)); if (!d.x) return NLOPT_OUT_OF_MEMORY; for (i = 0; i < n; ++i) { x[i] = (x[i] - lb[i]) / (ub[i] - lb[i]); d.x[n+i] = 0; d.x[2*n+i] = 1; } if (stop->xtol_abs) { for (i = 0; i < n; ++i) d.x[3*n+i] = stop->xtol_abs[i] / (ub[i] - lb[i]); xtol_abs_save = stop->xtol_abs; stop->xtol_abs = d.x + 3*n; } ret = cdirect_hybrid_unscaled(n, cdirect_uf, &d, d.x+n, d.x+2*n, x, minf, stop, local_alg, local_maxeval, randomized_div); stop->xtol_abs = xtol_abs_save; for (i = 0; i < n; ++i) x[i] = lb[i]+ x[i] * (ub[i] - lb[i]); free(d.x); return ret; } stevengj-nlopt-88c424d/src/algs/cobyla/000077500000000000000000000000001521061417600200245ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/cobyla/COPYRIGHT000066400000000000000000000022751521061417600213250ustar00rootroot00000000000000Copyright (c) 1992, Michael J. D. Powell (M.J.D.Powell@damtp.cam.ac.uk) Copyright (c) 2004, Jean-Sebastien Roy (js@jeannot.org) Copyright (c) 2008, Steven G. Johnson (stevenj@alum.mit.edu) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. stevengj-nlopt-88c424d/src/algs/cobyla/README000066400000000000000000000040331521061417600207040ustar00rootroot00000000000000This code implements COBYLA (Constrained Optimization BY Linear Approximations) algorithm derivative free optimization with nonlinear inequality constraints by M. J. D. Powell, described by: M. J. D. Powell, "A direct search optimization method that models the objective and constraint functions by linear interpolation," in Advances in Optimization and Numerical Analysis, eds. S. Gomez and J.-P. Hennart (Kluwer Academic: Dordrecht, 1994), p. 51-67. and reviewed in: M. J. D. Powell, "Direct search algorithms for optimization calculations," Acta Numerica 7, 287-336 (1998). It constructs successive linear approximations of the objective function and constraints via a simplex of n+1 points (in n dimensions), and optimizes these approximations in a trust region at each step. The original code itself was written in Fortran by Powell, and apparently released without restrictions (like several of his other programs), and was converted to C in 2004 by Jean-Sebastien Roy (js@jeannot.org) for the SciPy project. The C version was released under the attached license (basically the MIT license) at: http://www.jeannot.org/~js/code/index.en.html#COBYLA It was incorporated into NLopt in 2008 by S. G. Johnson, and kept under the same MIT license. In incorporating it into NLopt, SGJ adapted it to include the NLopt stopping conditions (the original code provided an x tolerance and a maximum number of function evaluations only). The original COBYLA did not have explicit support for bound constraints; these are included as linear constraints along with any other nonlinear constraints. This is mostly fine---linear constraints are handled exactly by COBYLA's linear approximations. However, occasionally COBYLA takes a "simplex" step, either to create the initial simplex or to fix a degenerate simplex, and these steps could violate the bound constraints. SGJ modified COBYLA to explicitly honor the bound constraints in these cases, so that the objective/constraints are never evaluated outside of the bound constraints, without slowing convergence. stevengj-nlopt-88c424d/src/algs/cobyla/README.orig000066400000000000000000000054641521061417600216540ustar00rootroot00000000000000# COBYLA : constrained optimization by linear approximation # Version 1.1 # Copyright (c) 1992, Michael J. D. Powell (M.J.D.Powell@damtp.cam.ac.uk) # Copyright (c) 2004, J.S. Roy (js@jeannot.org) # See the LICENSE file for copyright information. # $Jeannot: README,v 1.7 2004/04/18 14:04:20 js Exp $ This software is a C version of COBYLA2, a contrained optimization by linear approximation package developed by Michael J. D. Powell in Fortran. The original source code can be found at : http://plato.la.asu.edu/topics/problems/nlores.html Reference article for the method: Powell, J.M.D. (1992), "A Direct Search Optimization Method that Models the Objective and Constraint Functions by Linear Interpolation", DAMTP/NA5, Cambridge, England. This package was initially built by J.S. Roy to ease integration into SciPy. See: http://www.scipy.org/ Many thanks to Michael J. D. Powell for allowing this to happen ! This software, a derivative free non-linear optimizer, aims at minimizing the value of a nonlinear function subject to nonlinear constraints. It requires to be able to evaluate the function and the value of the constraints. COBYLA will try to make all the values of the constraints positive. So if you want to input a constraint j such as variable x[i] <= MAX, set: constraint[j] = MAX - x[i] See the comments in cobyla.c for more details. This software has been converted from the Fortran into C and provides the following modifications : - reentrancy, no global variables or functions ; - ability to pass a pointer to the function to be optimized (to provide access to constants) ; - ability to end the minimization at any time ; And other small changes. The last version (and other software) is avalaible at the URL : http://www.jeannot.org/~js/code/index.en.html A Python interface module is also provided. Contents : - cobyla.c : Source - cobyla.h : Header, and API documentation - LICENSE : License and copyright information - HISTORY : Release history - README : This file - example.c : A simple example - Makefile : Make file used to build the examples - moduleCobyla.c : the source of the python module - cobyla.py : the python module wrapper - example.py : an example for the python module - setup.py : the python installer Use is described in cobyla.h. For more information, see the example. The example can be built and executed by doing : make test You may need to adjust the Makefile before building cobyla. To install the module in the current directory, use: python setup.py build_ext --inplace To test it, execute: python cobyla.py To install it globaly, use: python setup.py install If you make use of this software, or if you make modifications to it (for a specific platform for example), you are encouraged to contact the author of this Fortran to C conversion at the following email : js@jeannot.org Thanks ! stevengj-nlopt-88c424d/src/algs/cobyla/cobyla.c000066400000000000000000001553631521061417600214560ustar00rootroot00000000000000/* cobyla : contrained optimization by linear approximation */ /* * Copyright (c) 1992, Michael J. D. Powell (M.J.D.Powell@damtp.cam.ac.uk) * Copyright (c) 2004, Jean-Sebastien Roy (js@jeannot.org) * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * This software is a C version of COBYLA2, a contrained optimization by linear * approximation package developed by Michael J. D. Powell in Fortran. * * The original source code can be found at : * http://plato.la.asu.edu/topics/problems/nlores.html * * Original RCS id * static char const rcsid[] = * " @(#) $Jeannot: cobyla.c,v 1.11 2004/04/18 09:51:36 js Exp $"; * */ #include #include #include #include "cobyla.h" /* SGJ, 2008: modified COBYLA code to take explicit account of bound constraints. Since bound constraints are linear, these should already be handled exactly when COBYLA optimizes it linear model. However, they were not handled properly when COBYLA created its initial simplex, or when COBYLA updated unacceptable simplices. Since NLopt guarantees that the objective will not be evaluated outside the bound constraints, this required us to handle such points by putting a slope discontinuity into the objective & constraints (below), which slows convergence considerably for smooth functions. Instead, handling them explicitly prevents this problem */ #define ENFORCE_BOUNDS 1 #define MIN2(a,b) ((a) <= (b) ? (a) : (b)) #define MAX2(a,b) ((a) >= (b) ? (a) : (b)) #define U(n) ((unsigned) (n)) /**************************************************************************/ /* SGJ, 2008: NLopt-style interface function: */ typedef struct { nlopt_func f; void *f_data; unsigned m_orig; nlopt_constraint *fc; unsigned p; nlopt_constraint *h; double *xtmp; double *lb, *ub; double *con_tol, *scale; nlopt_stopping *stop; } func_wrap_state; static int func_wrap(int ni, int mi, double *x, double *f, double *con, func_wrap_state *s) { unsigned n = U(ni); unsigned i, j, k; double *xtmp = s->xtmp; const double *lb = s->lb, *ub = s->ub; (void) mi; /* unused */ /* in nlopt, we guarante that the function is never evaluated outside the lb and ub bounds, so we need force this with xtmp ... note that this leads to discontinuity in the first derivative, which slows convergence if we don't enable the ENFORCE_BOUNDS feature above. */ for (j = 0; j < n; ++j) { if (x[j] < lb[j]) xtmp[j] = lb[j]; else if (x[j] > ub[j]) xtmp[j] = ub[j]; else xtmp[j] = x[j]; } nlopt_unscale(n, s->scale, xtmp, xtmp); *f = s->f(n, xtmp, NULL, s->f_data); if (nlopt_stop_forced(s->stop)) return 1; i = 0; for (j = 0; j < s->m_orig; ++j) { nlopt_eval_constraint(con + i, NULL, s->fc+j, n, xtmp); if (nlopt_stop_forced(s->stop)) return 1; for (k = 0; k < s->fc[j].m; ++k) con[i + k] = -con[i + k]; i += s->fc[j].m; } for (j = 0; j < s->p; ++j) { nlopt_eval_constraint(con + i, NULL, s->h+j, n, xtmp); if (nlopt_stop_forced(s->stop)) return 1; for (k = 0; k < s->h[j].m; ++k) con[(i + s->h[j].m) + k] = -con[i + k]; i += 2 * s->h[j].m; } for (j = 0; j < n; ++j) { if (!nlopt_isinf(lb[j])) con[i++] = x[j] - lb[j]; if (!nlopt_isinf(ub[j])) con[i++] = ub[j] - x[j]; } return 0; } /* * Verbosity level */ typedef enum { COBYLA_MSG_NONE = 0, /* No messages */ COBYLA_MSG_EXIT = 1, /* Exit reasons */ COBYLA_MSG_ITER = 2, /* Rho and Sigma changes */ COBYLA_MSG_INFO = 3 /* Informational messages */ } cobyla_message; /* * A function as required by cobyla * state is a void pointer provided to the function at each call * * n : the number of variables * m : the number of constraints * x : on input, then vector of variables (should not be modified) * f : on output, the value of the function * con : on output, the value of the constraints (vector of size m) * state : on input, the value of the state variable as provided to cobyla * * COBYLA will try to make all the values of the constraints positive. * So if you want to input a constraint j such as x[i] <= MAX, set: * con[j] = MAX - x[i] * The function must returns 0 if no error occurs or 1 to immediately end the * minimization. * */ typedef int cobyla_function(int n, int m, double *x, double *f, double *con, func_wrap_state *state); /* * cobyla : minimize a function subject to constraints * * n : number of variables (>=0) * m : number of constraints (>=0) * x : on input, initial estimate ; on output, the solution * minf : on output, minimum objective function * rhobeg : a reasonable initial change to the variables * stop : the NLopt stopping criteria * lb, ub : lower and upper bounds on x * message : see the cobyla_message enum * calcfc : the function to minimize (see cobyla_function) * state : used by function (see cobyla_function) * * The cobyla function returns the usual nlopt_result codes. * */ extern nlopt_result cobyla(int n, int m, double *x, double *minf, double rhobeg, double rhoend, nlopt_stopping *stop, const double *lb, const double *ub, int message, cobyla_function *calcfc, func_wrap_state *state); nlopt_result cobyla_minimize(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, unsigned p, nlopt_constraint *h, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, const double *dx) { unsigned i, j; func_wrap_state s; nlopt_result ret; double rhobeg, rhoend; s.f = f; s.f_data = f_data; s.m_orig = m; s.fc = fc; s.p = p; s.h = h; s.stop = stop; s.lb = s.ub = s.xtmp = s.con_tol = s.scale = NULL; s.scale = nlopt_compute_rescaling(n, dx); if (!s.scale) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (j = 0; j < n; ++j) if (s.scale[j] == 0 || !nlopt_isfinite(s.scale[j])) { nlopt_stop_msg(stop, "invalid scaling %g of dimension %d: possible over/underflow?", s.scale[j], j); ret = NLOPT_INVALID_ARGS; goto done; } s.lb = nlopt_new_rescaled(n, s.scale, lb); if (!s.lb) { ret = NLOPT_OUT_OF_MEMORY; goto done; } s.ub = nlopt_new_rescaled(n, s.scale, ub); if (!s.ub) { ret = NLOPT_OUT_OF_MEMORY; goto done; } nlopt_reorder_bounds(n, s.lb, s.ub); s.xtmp = (double *) malloc(sizeof(double) * n); if (!s.xtmp) { ret = NLOPT_OUT_OF_MEMORY; goto done; } /* SGJ, 2008: compute rhoend from NLopt stop info */ rhobeg = fabs(dx[0] / s.scale[0]); rhoend = stop->xtol_rel * (rhobeg); if (stop->xtol_abs) for (j = 0; j < n; ++j) if (rhoend < stop->xtol_abs[j] / fabs(s.scale[j])) rhoend = stop->xtol_abs[j] / fabs(s.scale[j]); /* each equality constraint gives two inequality constraints */ m = nlopt_count_constraints(m, fc) + 2 * nlopt_count_constraints(p, h); /* add constraints for lower/upper bounds (if any) */ for (j = 0; j < n; ++j) { if (!nlopt_isinf(lb[j])) ++m; if (!nlopt_isinf(ub[j])) ++m; } s.con_tol = (double *) malloc(sizeof(double) * m); if (m && !s.con_tol) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (j = 0; j < m; ++j) s.con_tol[j] = 0; for (j = i = 0; i < s.m_orig; ++i) { unsigned ji = j, jnext = j + fc[i].m; for (; j < jnext; ++j) s.con_tol[j] = fc[i].tol[j - ji]; } for (i = 0; i < s.p; ++i) { unsigned ji = j, jnext = j + h[i].m; for (; j < jnext; ++j) s.con_tol[j] = h[i].tol[j - ji]; ji = j; jnext = j + h[i].m; for (; j < jnext; ++j) s.con_tol[j] = h[i].tol[j - ji]; } nlopt_rescale(n, s.scale, x, x); ret = cobyla((int) n, (int) m, x, minf, rhobeg, rhoend, stop, s.lb, s.ub, COBYLA_MSG_NONE, func_wrap, &s); nlopt_unscale(n, s.scale, x, x); /* make sure e.g. rounding errors didn't push us slightly out of bounds */ for (j = 0; j < n; ++j) { if (x[j] < lb[j]) x[j] = lb[j]; if (x[j] > ub[j]) x[j] = ub[j]; } done: free(s.con_tol); free(s.xtmp); free(s.ub); free(s.lb); free(s.scale); return ret; } /**************************************************************************/ /* SGJ, 2010: I find that it seems to increase robustness of the algorithm if, on "simplex" steps (which are intended to improve the linear independence of the simplex, not improve the objective), we multiply the steps by pseudorandom numbers in [0,1). Intuitively, pseudorandom steps are likely to avoid any accidental dependency in the simplex vertices. However, since I still want COBYLA to be a deterministic algorithm, and I don't care all that much about the quality of the randomness here, I implement a simple linear congruential generator rather than use nlopt_urand, and set the initial seed deterministically. */ #if defined(HAVE_STDINT_H) # include #endif #ifndef HAVE_UINT32_T # if SIZEOF_UNSIGNED_LONG == 4 typedef unsigned long uint32_t; # elif SIZEOF_UNSIGNED_INT == 4 typedef unsigned int uint32_t; # else # error No 32-bit unsigned integer type # endif #endif /* a simple linear congruential generator */ static uint32_t lcg_rand(uint32_t *seed) { return (*seed = *seed * 1103515245 + 12345); } static double lcg_urand(uint32_t *seed, double a, double b) { return a + lcg_rand(seed) * (b - a) / ((uint32_t) -1); } /**************************************************************************/ static nlopt_result cobylb(int *n, int *m, int *mpp, double *x, double *minf, double *rhobeg, double rhoend, nlopt_stopping *stop, const double *lb, const double *ub, int *iprint, double *con, double *sim, double *simi, double *datmat, double *a, double *vsig, double *veta, double *sigbar, double *dx, double *w, int *iact, cobyla_function *calcfc, func_wrap_state *state); static nlopt_result trstlp(int *n, int *m, double *a, double *b, double *rho, double *dx, int *ifull, int *iact, double *z__, double *zdota, double *vmultc, double *sdirn, double *dxnew, double *vmultd); /* ------------------------------------------------------------------------ */ nlopt_result cobyla(int n, int m, double *x, double *minf, double rhobeg, double rhoend, nlopt_stopping *stop, const double *lb, const double *ub, int iprint, cobyla_function *calcfc, func_wrap_state *state) { int icon, isim, isigb, idatm, iveta, isimi, ivsig, iwork, ia, idx, mpp; int *iact; double *w; nlopt_result rc; /* * This subroutine minimizes an objective function F(X) subject to M * inequality constraints on X, where X is a vector of variables that has * N components. The algorithm employs linear approximations to the * objective and constraint functions, the approximations being formed by * linear interpolation at N+1 points in the space of the variables. * We regard these interpolation points as vertices of a simplex. The * parameter RHO controls the size of the simplex and it is reduced * automatically from RHOBEG to RHOEND. For each RHO the subroutine tries * to achieve a good vector of variables for the current size, and then * RHO is reduced until the value RHOEND is reached. Therefore RHOBEG and * RHOEND should be set to reasonable initial changes to and the required * accuracy in the variables respectively, but this accuracy should be * viewed as a subject for experimentation because it is not guaranteed. * The subroutine has an advantage over many of its competitors, however, * which is that it treats each constraint individually when calculating * a change to the variables, instead of lumping the constraints together * into a single penalty function. The name of the subroutine is derived * from the phrase Constrained Optimization BY Linear Approximations. * * The user must set the values of N, M, RHOBEG and RHOEND, and must * provide an initial vector of variables in X. Further, the value of * IPRINT should be set to 0, 1, 2 or 3, which controls the amount of * printing during the calculation. Specifically, there is no output if * IPRINT=0 and there is output only at the end of the calculation if * IPRINT=1. Otherwise each new value of RHO and SIGMA is printed. * Further, the vector of variables and some function information are * given either when RHO is reduced or when each new value of F(X) is * computed in the cases IPRINT=2 or IPRINT=3 respectively. Here SIGMA * is a penalty parameter, it being assumed that a change to X is an * improvement if it reduces the merit function * F(X)+SIGMA*MAX(0.0,-C1(X),-C2(X),...,-CM(X)), * where C1,C2,...,CM denote the constraint functions that should become * nonnegative eventually, at least to the precision of RHOEND. In the * printed output the displayed term that is multiplied by SIGMA is * called MAXCV, which stands for 'MAXimum Constraint Violation'. The * argument MAXFUN is an int variable that must be set by the user to a * limit on the number of calls of CALCFC, the purpose of this routine being * given below. The value of MAXFUN will be altered to the number of calls * of CALCFC that are made. The arguments W and IACT provide real and * int arrays that are used as working space. Their lengths must be at * least N*(3*N+2*M+11)+4*M+6 and M+1 respectively. * * In order to define the objective and constraint functions, we require * a subroutine that has the name and arguments * SUBROUTINE CALCFC (N,M,X,F,CON) * DIMENSION X(*),CON(*) . * The values of N and M are fixed and have been defined already, while * X is now the current vector of variables. The subroutine should return * the objective and constraint functions at X in F and CON(1),CON(2), * ...,CON(M). Note that we are trying to adjust X so that F(X) is as * small as possible subject to the constraint functions being nonnegative. * * Partition the working space array W to provide the storage that is needed * for the main calculation. */ *(stop->nevals_p) = 0; if (n == 0) { if (iprint>=1) fprintf(stderr, "cobyla: N==0.\n"); return NLOPT_SUCCESS; } if (n < 0 || m < 0) { if (iprint>=1) fprintf(stderr, "cobyla: N<0 or M<0.\n"); return NLOPT_INVALID_ARGS; } /* workspace allocation */ w = (double*) malloc(U(n*(3*n+2*m+11)+4*m+6)*sizeof(*w)); if (w == NULL) { if (iprint>=1) fprintf(stderr, "cobyla: memory allocation error.\n"); return NLOPT_OUT_OF_MEMORY; } iact = (int*)malloc(U(m+1)*sizeof(*iact)); if (iact == NULL) { if (iprint>=1) fprintf(stderr, "cobyla: memory allocation error.\n"); free(w); return NLOPT_OUT_OF_MEMORY; } /* Parameter adjustments */ --iact; --w; --x; --lb; --ub; /* Function Body */ mpp = m + 2; icon = 1; isim = icon + mpp; isimi = isim + n * n + n; idatm = isimi + n * n; ia = idatm + n * mpp + mpp; ivsig = ia + m * n + n; iveta = ivsig + n; isigb = iveta + n; idx = isigb + n; iwork = idx + n; rc = cobylb(&n, &m, &mpp, &x[1], minf, &rhobeg, rhoend, stop, &lb[1], &ub[1], &iprint, &w[icon], &w[isim], &w[isimi], &w[idatm], &w[ia], &w[ivsig], &w[iveta], &w[isigb], &w[idx], &w[iwork], &iact[1], calcfc, state); /* Parameter adjustments (reverse) */ ++iact; ++w; free(w); free(iact); return rc; } /* cobyla */ /* ------------------------------------------------------------------------- */ static nlopt_result cobylb(int *n, int *m, int *mpp, double *x, double *minf, double *rhobeg, double rhoend, nlopt_stopping *stop, const double *lb, const double *ub, int *iprint, double *con, double *sim, double *simi, double *datmat, double *a, double *vsig, double *veta, double *sigbar, double *dx, double *w, int *iact, cobyla_function *calcfc, func_wrap_state *state) { /* System generated locals */ int sim_dim1, sim_offset, simi_dim1, simi_offset, datmat_dim1, datmat_offset, a_dim1, a_offset, i__1, i__2, i__3; double d__1, d__2; /* Local variables */ double alpha, delta, denom, tempa, barmu; double beta, cmin = 0.0, cmax = 0.0; double cvmaxm, dxsign, prerem = 0.0; double edgmax, pareta, prerec = 0.0, phimin, parsig = 0.0; double gamma_; double phi, rho, sum = 0.0; double ratio, vmold, parmu, error, vmnew; double resmax, cvmaxp; double resnew, trured; double temp, wsig, f; double weta; int i__, j, k, l; int idxnew; int iflag = 0; int iptemp; int isdirn, izdota; int ivmc; int ivmd; int mp, np, iz, ibrnch; int nbest, ifull = 0, iptem, jdrop; nlopt_result rc = NLOPT_SUCCESS; uint32_t seed = (uint32_t) (*n + *m); /* arbitrary deterministic LCG seed */ int feasible; /* SGJ, 2008: added code to keep track of minimum feasible function val */ *minf = HUGE_VAL; /* Set the initial values of some parameters. The last column of SIM holds */ /* the optimal vertex of the current simplex, and the preceding N columns */ /* hold the displacements from the optimal vertex to the other vertices. */ /* Further, SIMI holds the inverse of the matrix that is contained in the */ /* first N columns of SIM. */ /* Parameter adjustments */ a_dim1 = *n; a_offset = 1 + a_dim1 * 1; a -= a_offset; simi_dim1 = *n; simi_offset = 1 + simi_dim1 * 1; simi -= simi_offset; sim_dim1 = *n; sim_offset = 1 + sim_dim1 * 1; sim -= sim_offset; datmat_dim1 = *mpp; datmat_offset = 1 + datmat_dim1 * 1; datmat -= datmat_offset; --x; --con; --vsig; --veta; --sigbar; --dx; --w; --iact; --lb; --ub; /* Function Body */ iptem = MIN2(*n,4); iptemp = iptem + 1; np = *n + 1; mp = *m + 1; alpha = .25; beta = 2.1; gamma_ = .5; delta = 1.1; rho = *rhobeg; parmu = 0.; if (*iprint >= 2) { fprintf(stderr, "cobyla: the initial value of RHO is %12.6E and PARMU is set to zero.\n", rho); } temp = 1. / rho; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { double rhocur; sim[i__ + np * sim_dim1] = x[i__]; i__2 = *n; for (j = 1; j <= i__2; ++j) { sim[i__ + j * sim_dim1] = 0.; simi[i__ + j * simi_dim1] = 0.; } rhocur = rho; #if ENFORCE_BOUNDS /* SGJ: make sure step rhocur stays inside [lb,ub] */ if (x[i__] + rhocur > ub[i__]) { if (x[i__] - rhocur >= lb[i__]) rhocur = -rhocur; else if (ub[i__] - x[i__] > x[i__] - lb[i__]) rhocur = 0.5 * (ub[i__] - x[i__]); else rhocur = 0.5 * (x[i__] - lb[i__]); } #endif sim[i__ + i__ * sim_dim1] = rhocur; simi[i__ + i__ * simi_dim1] = 1.0 / rhocur; } jdrop = np; ibrnch = 0; /* Make the next call of the user-supplied subroutine CALCFC. These */ /* instructions are also used for calling CALCFC during the iterations of */ /* the algorithm. */ /* SGJ comment: why the hell couldn't he just use a damn subroutine? #*&!%*@ Fortran-66 spaghetti code */ L40: if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (*(stop->nevals_p) > 0) { if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; } if (rc != NLOPT_SUCCESS) goto L600; ++ *(stop->nevals_p); if (calcfc(*n, *m, &x[1], &f, &con[1], state)) { if (*iprint >= 1) { fprintf(stderr, "cobyla: user requested end of minimization.\n"); } rc = NLOPT_FORCED_STOP; goto L600; } resmax = 0.; feasible = 1; /* SGJ, 2010 */ if (*m > 0) { i__1 = *m; for (k = 1; k <= i__1; ++k) { d__1 = resmax, d__2 = -con[k]; resmax = MAX2(d__1,d__2); if (d__2 > state->con_tol[k-1]) feasible = 0; /* SGJ, 2010 */ } } /* SGJ, 2008: check for minf_max reached by feasible point */ if (f < stop->minf_max && feasible) { rc = NLOPT_MINF_MAX_REACHED; goto L620; /* not L600 because we want to use current x, f, resmax */ } if (*(stop->nevals_p) == *iprint - 1 || *iprint == 3) { fprintf(stderr, "cobyla: NFVALS = %4d, F =%13.6E, MAXCV =%13.6E\n", *(stop->nevals_p), f, resmax); i__1 = iptem; fprintf(stderr, "cobyla: X ="); for (i__ = 1; i__ <= i__1; ++i__) { if (i__>1) fprintf(stderr, " "); fprintf(stderr, "%13.6E", x[i__]); } if (iptem < *n) { i__1 = *n; for (i__ = iptemp; i__ <= i__1; ++i__) { if (!((i__-1) % 4)) fprintf(stderr, "\ncobyla: "); fprintf(stderr, "%15.6E", x[i__]); } } fprintf(stderr, "\n"); } con[mp] = f; con[*mpp] = resmax; if (ibrnch == 1) { goto L440; } /* Set the recently calculated function values in a column of DATMAT. This */ /* array has a column for each vertex of the current simplex, the entries of */ /* each column being the values of the constraint functions (if any) */ /* followed by the objective function and the greatest constraint violation */ /* at the vertex. */ i__1 = *mpp; for (k = 1; k <= i__1; ++k) { datmat[k + jdrop * datmat_dim1] = con[k]; } if (*(stop->nevals_p) > np) { goto L130; } /* Exchange the new vertex of the initial simplex with the optimal vertex if */ /* necessary. Then, if the initial simplex is not complete, pick its next */ /* vertex and calculate the function values there. */ if (jdrop <= *n) { if (datmat[mp + np * datmat_dim1] <= f) { x[jdrop] = sim[jdrop + np * sim_dim1]; } else { /* improvement in function val */ double rhocur = x[jdrop] - sim[jdrop + np * sim_dim1]; /* SGJ: use rhocur instead of rho. In original code, rhocur == rho always, but I want to change this to ensure that simplex points fall within [lb,ub]. */ sim[jdrop + np * sim_dim1] = x[jdrop]; i__1 = *mpp; for (k = 1; k <= i__1; ++k) { datmat[k + jdrop * datmat_dim1] = datmat[k + np * datmat_dim1] ; datmat[k + np * datmat_dim1] = con[k]; } i__1 = jdrop; for (k = 1; k <= i__1; ++k) { sim[jdrop + k * sim_dim1] = -rhocur; temp = 0.f; i__2 = jdrop; for (i__ = k; i__ <= i__2; ++i__) { temp -= simi[i__ + k * simi_dim1]; } simi[jdrop + k * simi_dim1] = temp; } } } if (*(stop->nevals_p) <= *n) { /* evaluating initial simplex */ jdrop = *(stop->nevals_p); /* SGJ: was += rho, but using sim[jdrop,jdrop] enforces consistency if we change the stepsize above to stay in [lb,ub]. */ x[jdrop] += sim[jdrop + jdrop * sim_dim1]; goto L40; } L130: ibrnch = 1; /* Identify the optimal vertex of the current simplex. */ L140: phimin = datmat[mp + np * datmat_dim1] + parmu * datmat[*mpp + np * datmat_dim1]; nbest = np; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = datmat[mp + j * datmat_dim1] + parmu * datmat[*mpp + j * datmat_dim1]; if (temp < phimin) { nbest = j; phimin = temp; } else if (temp == phimin && parmu == 0.) { if (datmat[*mpp + j * datmat_dim1] < datmat[*mpp + nbest * datmat_dim1]) { nbest = j; } } } /* Switch the best vertex into pole position if it is not there already, */ /* and also update SIM, SIMI and DATMAT. */ if (nbest <= *n) { i__1 = *mpp; for (i__ = 1; i__ <= i__1; ++i__) { temp = datmat[i__ + np * datmat_dim1]; datmat[i__ + np * datmat_dim1] = datmat[i__ + nbest * datmat_dim1] ; datmat[i__ + nbest * datmat_dim1] = temp; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = sim[i__ + nbest * sim_dim1]; sim[i__ + nbest * sim_dim1] = 0.; sim[i__ + np * sim_dim1] += temp; tempa = 0.; i__2 = *n; for (k = 1; k <= i__2; ++k) { sim[i__ + k * sim_dim1] -= temp; tempa -= simi[k + i__ * simi_dim1]; } simi[nbest + i__ * simi_dim1] = tempa; } } /* Make an error return if SIGI is a poor approximation to the inverse of */ /* the leading N by N submatrix of SIG. */ error = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n; for (j = 1; j <= i__2; ++j) { temp = 0.; if (i__ == j) { temp += -1.; } i__3 = *n; for (k = 1; k <= i__3; ++k) if (sim[k + j * sim_dim1] != 0) { temp += simi[i__ + k * simi_dim1] * sim[k + j * sim_dim1]; } d__1 = error, d__2 = fabs(temp); error = MAX2(d__1,d__2); } } if (error > .1) { if (*iprint >= 1) { fprintf(stderr, "cobyla: rounding errors are becoming damaging.\n"); } rc = NLOPT_ROUNDOFF_LIMITED; goto L600; } /* Calculate the coefficients of the linear approximations to the objective */ /* and constraint functions, placing minus the objective function gradient */ /* after the constraint gradients in the array A. The vector W is used for */ /* working space. */ i__2 = mp; for (k = 1; k <= i__2; ++k) { con[k] = -datmat[k + np * datmat_dim1]; i__1 = *n; for (j = 1; j <= i__1; ++j) { w[j] = datmat[k + j * datmat_dim1] + con[k]; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = 0.; i__3 = *n; for (j = 1; j <= i__3; ++j) { temp += w[j] * simi[j + i__ * simi_dim1]; } if (k == mp) { temp = -temp; } a[i__ + k * a_dim1] = temp; } } /* Calculate the values of sigma and eta, and set IFLAG=0 if the current */ /* simplex is not acceptable. */ iflag = 1; parsig = alpha * rho; pareta = beta * rho; i__1 = *n; for (j = 1; j <= i__1; ++j) { wsig = 0.; weta = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { d__1 = simi[j + i__ * simi_dim1]; wsig += d__1 * d__1; d__1 = sim[i__ + j * sim_dim1]; weta += d__1 * d__1; } vsig[j] = 1. / sqrt(wsig); veta[j] = sqrt(weta); if (vsig[j] < parsig || veta[j] > pareta) { iflag = 0; } } /* If a new vertex is needed to improve acceptability, then decide which */ /* vertex to drop from the simplex. */ if (ibrnch == 1 || iflag == 1) { goto L370; } jdrop = 0; temp = pareta; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (veta[j] > temp) { jdrop = j; temp = veta[j]; } } if (jdrop == 0) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (vsig[j] < temp) { jdrop = j; temp = vsig[j]; } } } /* Calculate the step to the new vertex and its sign. */ temp = gamma_ * rho * vsig[jdrop]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dx[i__] = temp * simi[jdrop + i__ * simi_dim1]; } cvmaxp = 0.; cvmaxm = 0.; i__1 = mp; for (k = 1; k <= i__1; ++k) { sum = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { sum += a[i__ + k * a_dim1] * dx[i__]; } if (k < mp) { temp = datmat[k + np * datmat_dim1]; d__1 = cvmaxp, d__2 = -sum - temp; cvmaxp = MAX2(d__1,d__2); d__1 = cvmaxm, d__2 = sum - temp; cvmaxm = MAX2(d__1,d__2); } } dxsign = 1.; if (parmu * (cvmaxp - cvmaxm) > sum + sum) { dxsign = -1.; } /* Update the elements of SIM and SIMI, and set the next X. */ temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* SGJ, 2010: pseudo-randomize simplex steps (see LCG comments above) */ dx[i__] = dxsign * dx[i__] * lcg_urand(&seed, 0.01, 1); /* SGJ: make sure dx step says in [lb,ub] */ #if ENFORCE_BOUNDS { double xi = sim[i__ + np * sim_dim1]; fixdx: if (xi + dx[i__] > ub[i__]) dx[i__] = -dx[i__]; if (xi + dx[i__] < lb[i__]) { if (xi - dx[i__] <= ub[i__]) dx[i__] = -dx[i__]; else { /* try again with halved step */ dx[i__] *= 0.5; goto fixdx; } } } #endif sim[i__ + jdrop * sim_dim1] = dx[i__]; temp += simi[jdrop + i__ * simi_dim1] * dx[i__]; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { simi[jdrop + i__ * simi_dim1] /= temp; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (j != jdrop) { temp = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp += simi[j + i__ * simi_dim1] * dx[i__]; } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { simi[j + i__ * simi_dim1] -= temp * simi[jdrop + i__ * simi_dim1]; } } x[j] = sim[j + np * sim_dim1] + dx[j]; } goto L40; /* Calculate DX=x(*)-x(0). Branch if the length of DX is less than 0.5*RHO. */ L370: iz = 1; izdota = iz + *n * *n; ivmc = izdota + *n; isdirn = ivmc + mp; idxnew = isdirn + *n; ivmd = idxnew + *n; rc = trstlp(n, m, &a[a_offset], &con[1], &rho, &dx[1], &ifull, &iact[1], &w[ iz], &w[izdota], &w[ivmc], &w[isdirn], &w[idxnew], &w[ivmd]); if (rc != NLOPT_SUCCESS) goto L600; #if ENFORCE_BOUNDS /* SGJ: since the bound constraints are linear, we should never get a dx that lies outside the [lb,ub] constraints here, but we'll enforce this anyway just to be paranoid */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { double xi = sim[i__ + np * sim_dim1]; if (xi + dx[i__] > ub[i__]) dx[i__] = ub[i__] - xi; if (xi + dx[i__] < lb[i__]) dx[i__] = xi - lb[i__]; } #endif if (ifull == 0) { temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = dx[i__]; temp += d__1 * d__1; } if (temp < rho * .25 * rho) { ibrnch = 1; goto L550; } } /* Predict the change to F and the new maximum constraint violation if the */ /* variables are altered from x(0) to x(0)+DX. */ resnew = 0.; con[mp] = 0.; i__1 = mp; for (k = 1; k <= i__1; ++k) { sum = con[k]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { sum -= a[i__ + k * a_dim1] * dx[i__]; } if (k < mp) { resnew = MAX2(resnew,sum); } } /* Increase PARMU if necessary and branch back if this change alters the */ /* optimal vertex. Otherwise PREREM and PREREC will be set to the predicted */ /* reductions in the merit function and the maximum constraint violation */ /* respectively. */ barmu = 0.; prerec = datmat[*mpp + np * datmat_dim1] - resnew; if (prerec > 0.) { barmu = sum / prerec; } if (parmu < barmu * 1.5) { parmu = barmu * 2.; if (*iprint >= 2) { fprintf(stderr, "cobyla: increase in PARMU to %12.6E\n", parmu); } phi = datmat[mp + np * datmat_dim1] + parmu * datmat[*mpp + np * datmat_dim1]; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = datmat[mp + j * datmat_dim1] + parmu * datmat[*mpp + j * datmat_dim1]; if (temp < phi) { goto L140; } if (temp == phi && parmu == 0.f) { if (datmat[*mpp + j * datmat_dim1] < datmat[*mpp + np * datmat_dim1]) { goto L140; } } } } prerem = parmu * prerec - sum; /* Calculate the constraint and objective functions at x(*). Then find the */ /* actual reduction in the merit function. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = sim[i__ + np * sim_dim1] + dx[i__]; } ibrnch = 1; goto L40; L440: vmold = datmat[mp + np * datmat_dim1] + parmu * datmat[*mpp + np * datmat_dim1]; vmnew = f + parmu * resmax; trured = vmold - vmnew; if (parmu == 0. && f == datmat[mp + np * datmat_dim1]) { prerem = prerec; trured = datmat[*mpp + np * datmat_dim1] - resmax; } /* Begin the operations that decide whether x(*) should replace one of the */ /* vertices of the current simplex, the change being mandatory if TRURED is */ /* positive. Firstly, JDROP is set to the index of the vertex that is to be */ /* replaced. */ ratio = 0.; if (trured <= 0.f) { ratio = 1.f; } jdrop = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp += simi[j + i__ * simi_dim1] * dx[i__]; } temp = fabs(temp); if (temp > ratio) { jdrop = j; ratio = temp; } sigbar[j] = temp * vsig[j]; } /* Calculate the value of ell. */ edgmax = delta * rho; l = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (sigbar[j] >= parsig || sigbar[j] >= vsig[j]) { temp = veta[j]; if (trured > 0.) { temp = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { d__1 = dx[i__] - sim[i__ + j * sim_dim1]; temp += d__1 * d__1; } temp = sqrt(temp); } if (temp > edgmax) { l = j; edgmax = temp; } } } if (l > 0) { jdrop = l; } if (jdrop == 0) { goto L550; } /* Revise the simplex by updating the elements of SIM, SIMI and DATMAT. */ temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sim[i__ + jdrop * sim_dim1] = dx[i__]; temp += simi[jdrop + i__ * simi_dim1] * dx[i__]; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { simi[jdrop + i__ * simi_dim1] /= temp; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (j != jdrop) { temp = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp += simi[j + i__ * simi_dim1] * dx[i__]; } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { simi[j + i__ * simi_dim1] -= temp * simi[jdrop + i__ * simi_dim1]; } } } i__1 = *mpp; for (k = 1; k <= i__1; ++k) { datmat[k + jdrop * datmat_dim1] = con[k]; } /* Branch back for further iterations with the current RHO. */ if (trured > 0. && trured >= prerem * .1) { /* SGJ, 2010: following a suggestion in the SAS manual (which mentions a similar modification to COBYLA, although they didn't publish their source code), increase rho if predicted reduction is sufficiently close to the actual reduction. Otherwise, COBLYA seems to easily get stuck making very small steps. Also require iflag != 0 (i.e., acceptable simplex), again following SAS suggestion (otherwise I get convergence failure in some cases.) */ if (trured >= prerem * 0.9 && trured <= prerem * 1.1 && iflag) { rho *= 2.0; } goto L140; } L550: if (iflag == 0) { ibrnch = 0; goto L140; } /* SGJ, 2008: convergence tests for function vals; note that current best val is stored in datmat[mp + np * datmat_dim1], or in f if ifull == 1, and previous best is in *minf. This seems like a sensible place to put the convergence test, as it is the same place that Powell checks the x tolerance (rho > rhoend). */ { double fbest = ifull == 1 ? f : datmat[mp + np * datmat_dim1]; if (fbest < *minf && nlopt_stop_ftol(stop, fbest, *minf)) { rc = NLOPT_FTOL_REACHED; goto L600; } *minf = fbest; } /* Otherwise reduce RHO if it is not at its least value and reset PARMU. */ if (rho > rhoend) { rho *= .5; if (rho <= rhoend * 1.5) { rho = rhoend; } if (parmu > 0.) { denom = 0.; i__1 = mp; for (k = 1; k <= i__1; ++k) { cmin = datmat[k + np * datmat_dim1]; cmax = cmin; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { d__1 = cmin, d__2 = datmat[k + i__ * datmat_dim1]; cmin = MIN2(d__1,d__2); d__1 = cmax, d__2 = datmat[k + i__ * datmat_dim1]; cmax = MAX2(d__1,d__2); } if (k <= *m && cmin < cmax * .5) { temp = MAX2(cmax,0.) - cmin; if (denom <= 0.) { denom = temp; } else { denom = MIN2(denom,temp); } } } if (denom == 0.) { parmu = 0.; } else if (cmax - cmin < parmu * denom) { parmu = (cmax - cmin) / denom; } } if (*iprint >= 2) { fprintf(stderr, "cobyla: reduction in RHO to %12.6E and PARMU =%13.6E\n", rho, parmu); } if (*iprint == 2) { fprintf(stderr, "cobyla: NFVALS = %4d, F =%13.6E, MAXCV =%13.6E\n", *(stop->nevals_p), datmat[mp + np * datmat_dim1], datmat[*mpp + np * datmat_dim1]); fprintf(stderr, "cobyla: X ="); i__1 = iptem; for (i__ = 1; i__ <= i__1; ++i__) { if (i__>1) fprintf(stderr, " "); fprintf(stderr, "%13.6E", sim[i__ + np * sim_dim1]); } if (iptem < *n) { i__1 = *n; for (i__ = iptemp; i__ <= i__1; ++i__) { if (!((i__-1) % 4)) fprintf(stderr, "\ncobyla: "); fprintf(stderr, "%15.6E", x[i__]); } } fprintf(stderr, "\n"); } goto L140; } else /* rho <= rhoend */ rc = rhoend > 0 ? NLOPT_XTOL_REACHED : NLOPT_ROUNDOFF_LIMITED; /* Return the best calculated values of the variables. */ if (*iprint >= 1) { fprintf(stderr, "cobyla: normal return.\n"); } if (ifull == 1) { goto L620; } L600: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = sim[i__ + np * sim_dim1]; } f = datmat[mp + np * datmat_dim1]; resmax = datmat[*mpp + np * datmat_dim1]; L620: *minf = f; if (*iprint >= 1) { fprintf(stderr, "cobyla: NFVALS = %4d, F =%13.6E, MAXCV =%13.6E\n", *(stop->nevals_p), f, resmax); i__1 = iptem; fprintf(stderr, "cobyla: X ="); for (i__ = 1; i__ <= i__1; ++i__) { if (i__>1) fprintf(stderr, " "); fprintf(stderr, "%13.6E", x[i__]); } if (iptem < *n) { i__1 = *n; for (i__ = iptemp; i__ <= i__1; ++i__) { if (!((i__-1) % 4)) fprintf(stderr, "\ncobyla: "); fprintf(stderr, "%15.6E", x[i__]); } } fprintf(stderr, "\n"); } return rc; } /* cobylb */ /* ------------------------------------------------------------------------- */ static nlopt_result trstlp(int *n, int *m, double *a, double *b, double *rho, double *dx, int *ifull, int *iact, double *z__, double *zdota, double *vmultc, double *sdirn, double *dxnew, double *vmultd) { /* System generated locals */ int a_dim1, a_offset, z_dim1, z_offset, i__1, i__2; double d__1, d__2; /* Local variables */ double alpha, tempa; double beta; double optnew, stpful, sum, tot, acca, accb; double ratio, vsave, zdotv, zdotw, dd; double sd; double sp, ss, resold = 0.0, zdvabs, zdwabs, sumabs, resmax, optold; double spabs; double temp, step; int icount; int i__, j, k; int isave; int kk; int kl, kp, kw; int nact, icon = 0, mcon; int nactx = 0; /* This subroutine calculates an N-component vector DX by applying the */ /* following two stages. In the first stage, DX is set to the shortest */ /* vector that minimizes the greatest violation of the constraints */ /* A(1,K)*DX(1)+A(2,K)*DX(2)+...+A(N,K)*DX(N) .GE. B(K), K=2,3,...,M, */ /* subject to the Euclidean length of DX being at most RHO. If its length is */ /* strictly less than RHO, then we use the resultant freedom in DX to */ /* minimize the objective function */ /* -A(1,M+1)*DX(1)-A(2,M+1)*DX(2)-...-A(N,M+1)*DX(N) */ /* subject to no increase in any greatest constraint violation. This */ /* notation allows the gradient of the objective function to be regarded as */ /* the gradient of a constraint. Therefore the two stages are distinguished */ /* by MCON .EQ. M and MCON .GT. M respectively. It is possible that a */ /* degeneracy may prevent DX from attaining the target length RHO. Then the */ /* value IFULL=0 would be set, but usually IFULL=1 on return. */ /* In general NACT is the number of constraints in the active set and */ /* IACT(1),...,IACT(NACT) are their indices, while the remainder of IACT */ /* contains a permutation of the remaining constraint indices. Further, Z is */ /* an orthogonal matrix whose first NACT columns can be regarded as the */ /* result of Gram-Schmidt applied to the active constraint gradients. For */ /* J=1,2,...,NACT, the number ZDOTA(J) is the scalar product of the J-th */ /* column of Z with the gradient of the J-th active constraint. DX is the */ /* current vector of variables and here the residuals of the active */ /* constraints should be zero. Further, the active constraints have */ /* nonnegative Lagrange multipliers that are held at the beginning of */ /* VMULTC. The remainder of this vector holds the residuals of the inactive */ /* constraints at DX, the ordering of the components of VMULTC being in */ /* agreement with the permutation of the indices of the constraints that is */ /* in IACT. All these residuals are nonnegative, which is achieved by the */ /* shift RESMAX that makes the least residual zero. */ /* Initialize Z and some other variables. The value of RESMAX will be */ /* appropriate to DX=0, while ICON will be the index of a most violated */ /* constraint if RESMAX is positive. Usually during the first stage the */ /* vector SDIRN gives a search direction that reduces all the active */ /* constraint violations by one simultaneously. */ /* Parameter adjustments */ z_dim1 = *n; z_offset = 1 + z_dim1 * 1; z__ -= z_offset; a_dim1 = *n; a_offset = 1 + a_dim1 * 1; a -= a_offset; --b; --dx; --iact; --zdota; --vmultc; --sdirn; --dxnew; --vmultd; /* Function Body */ *ifull = 1; mcon = *m; nact = 0; resmax = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n; for (j = 1; j <= i__2; ++j) { z__[i__ + j * z_dim1] = 0.; } z__[i__ + i__ * z_dim1] = 1.; dx[i__] = 0.; } if (*m >= 1) { i__1 = *m; for (k = 1; k <= i__1; ++k) { if (b[k] > resmax) { resmax = b[k]; icon = k; } } i__1 = *m; for (k = 1; k <= i__1; ++k) { iact[k] = k; vmultc[k] = resmax - b[k]; } } if (resmax == 0.) { goto L480; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sdirn[i__] = 0.; } /* End the current stage of the calculation if 3 consecutive iterations */ /* have either failed to reduce the best calculated value of the objective */ /* function or to increase the number of active constraints since the best */ /* value was calculated. This strategy prevents cycling, but there is a */ /* remote possibility that it will cause premature termination. */ L60: optold = 0.; icount = 0; L70: if (mcon == *m) { optnew = resmax; } else { optnew = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { optnew -= dx[i__] * a[i__ + mcon * a_dim1]; } } if (icount == 0 || optnew < optold) { optold = optnew; nactx = nact; icount = 3; } else if (nact > nactx) { nactx = nact; icount = 3; } else { --icount; if (icount == 0) { goto L490; } } /* If ICON exceeds NACT, then we add the constraint with index IACT(ICON) to */ /* the active set. Apply Givens rotations so that the last N-NACT-1 columns */ /* of Z are orthogonal to the gradient of the new constraint, a scalar */ /* product being set to zero if its nonzero value could be due to computer */ /* rounding errors. The array DXNEW is used for working space. */ if (icon <= nact) { goto L260; } kk = iact[icon]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dxnew[i__] = a[i__ + kk * a_dim1]; } tot = 0.; k = *n; L100: if (k > nact) { sp = 0.; spabs = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = z__[i__ + k * z_dim1] * dxnew[i__]; sp += temp; spabs += fabs(temp); } acca = spabs + fabs(sp) * .1; accb = spabs + fabs(sp) * .2; if (spabs >= acca || acca >= accb) { sp = 0.; } if (tot == 0.) { tot = sp; } else { kp = k + 1; temp = sqrt(sp * sp + tot * tot); alpha = sp / temp; beta = tot / temp; tot = temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = alpha * z__[i__ + k * z_dim1] + beta * z__[i__ + kp * z_dim1]; z__[i__ + kp * z_dim1] = alpha * z__[i__ + kp * z_dim1] - beta * z__[i__ + k * z_dim1]; z__[i__ + k * z_dim1] = temp; } } --k; goto L100; } /* Add the new constraint if this can be done without a deletion from the */ /* active set. */ if (tot != 0.) { ++nact; zdota[nact] = tot; vmultc[icon] = vmultc[nact]; vmultc[nact] = 0.; goto L210; } /* The next instruction is reached if a deletion has to be made from the */ /* active set in order to make room for the new active constraint, because */ /* the new constraint gradient is a linear combination of the gradients of */ /* the old active constraints. Set the elements of VMULTD to the multipliers */ /* of the linear combination. Further, set IOUT to the index of the */ /* constraint to be deleted, but branch if no suitable index can be found. */ ratio = -1.; k = nact; L130: zdotv = 0.; zdvabs = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = z__[i__ + k * z_dim1] * dxnew[i__]; zdotv += temp; zdvabs += fabs(temp); } acca = zdvabs + fabs(zdotv) * .1; accb = zdvabs + fabs(zdotv) * .2; if (zdvabs < acca && acca < accb) { temp = zdotv / zdota[k]; if (temp > 0. && iact[k] <= *m) { tempa = vmultc[k] / temp; if (ratio < 0. || tempa < ratio) ratio = tempa; } if (k >= 2) { kw = iact[k]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dxnew[i__] -= temp * a[i__ + kw * a_dim1]; } } vmultd[k] = temp; } else { vmultd[k] = 0.; } --k; if (k > 0) { goto L130; } if (ratio < 0.) { goto L490; } /* Revise the Lagrange multipliers and reorder the active constraints so */ /* that the one to be replaced is at the end of the list. Also calculate the */ /* new value of ZDOTA(NACT) and branch if it is not acceptable. */ i__1 = nact; /* This pragma fixes a known problem compiling with VS2013 or VS2015 in Release */ /* see https://connect.microsoft.com/VisualStudio/feedback/details/1028781/c1001-on-release-build */ #if defined(_MSC_VER) && _MSC_VER >= 1800 #pragma loop(no_vector) #endif for (k = 1; k <= i__1; ++k) { d__1 = 0., d__2 = vmultc[k] - ratio * vmultd[k]; vmultc[k] = MAX2(d__1,d__2); } if (icon < nact) { isave = iact[icon]; vsave = vmultc[icon]; k = icon; L170: kp = k + 1; kw = iact[kp]; sp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sp += z__[i__ + k * z_dim1] * a[i__ + kw * a_dim1]; } d__1 = zdota[kp]; temp = sqrt(sp * sp + d__1 * d__1); alpha = zdota[kp] / temp; beta = sp / temp; zdota[kp] = alpha * zdota[k]; zdota[k] = temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = alpha * z__[i__ + kp * z_dim1] + beta * z__[i__ + k * z_dim1]; z__[i__ + kp * z_dim1] = alpha * z__[i__ + k * z_dim1] - beta * z__[i__ + kp * z_dim1]; z__[i__ + k * z_dim1] = temp; } iact[k] = kw; vmultc[k] = vmultc[kp]; k = kp; if (k < nact) { goto L170; } iact[k] = isave; vmultc[k] = vsave; } temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp += z__[i__ + nact * z_dim1] * a[i__ + kk * a_dim1]; } if (temp == 0.) { goto L490; } zdota[nact] = temp; vmultc[icon] = 0.; vmultc[nact] = ratio; /* Update IACT and ensure that the objective function continues to be */ /* treated as the last active constraint when MCON>M. */ L210: iact[icon] = iact[nact]; iact[nact] = kk; if (mcon > *m && kk != mcon) { k = nact - 1; sp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sp += z__[i__ + k * z_dim1] * a[i__ + kk * a_dim1]; } d__1 = zdota[nact]; temp = sqrt(sp * sp + d__1 * d__1); alpha = zdota[nact] / temp; beta = sp / temp; zdota[nact] = alpha * zdota[k]; zdota[k] = temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = alpha * z__[i__ + nact * z_dim1] + beta * z__[i__ + k * z_dim1]; z__[i__ + nact * z_dim1] = alpha * z__[i__ + k * z_dim1] - beta * z__[i__ + nact * z_dim1]; z__[i__ + k * z_dim1] = temp; } iact[nact] = iact[k]; iact[k] = kk; temp = vmultc[k]; vmultc[k] = vmultc[nact]; vmultc[nact] = temp; } /* If stage one is in progress, then set SDIRN to the direction of the next */ /* change to the current vector of variables. */ if (mcon > *m) { goto L320; } kk = iact[nact]; temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp += sdirn[i__] * a[i__ + kk * a_dim1]; } temp += -1.; temp /= zdota[nact]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sdirn[i__] -= temp * z__[i__ + nact * z_dim1]; } goto L340; /* Delete the constraint that has the index IACT(ICON) from the active set. */ L260: if (icon < nact) { isave = iact[icon]; vsave = vmultc[icon]; k = icon; L270: kp = k + 1; kk = iact[kp]; sp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sp += z__[i__ + k * z_dim1] * a[i__ + kk * a_dim1]; } d__1 = zdota[kp]; temp = sqrt(sp * sp + d__1 * d__1); alpha = zdota[kp] / temp; beta = sp / temp; zdota[kp] = alpha * zdota[k]; zdota[k] = temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = alpha * z__[i__ + kp * z_dim1] + beta * z__[i__ + k * z_dim1]; z__[i__ + kp * z_dim1] = alpha * z__[i__ + k * z_dim1] - beta * z__[i__ + kp * z_dim1]; z__[i__ + k * z_dim1] = temp; } iact[k] = kk; vmultc[k] = vmultc[kp]; k = kp; if (k < nact) { goto L270; } iact[k] = isave; vmultc[k] = vsave; } --nact; /* If stage one is in progress, then set SDIRN to the direction of the next */ /* change to the current vector of variables. */ if (mcon > *m) { goto L320; } temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp += sdirn[i__] * z__[i__ + (nact + 1) * z_dim1]; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sdirn[i__] -= temp * z__[i__ + (nact + 1) * z_dim1]; } goto L340; /* Pick the next search direction of stage two. */ L320: temp = 1. / zdota[nact]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sdirn[i__] = temp * z__[i__ + nact * z_dim1]; } /* Calculate the step to the boundary of the trust region or take the step */ /* that reduces RESMAX to zero. The two statements below that include the */ /* factor 1.0E-6 prevent some harmless underflows that occurred in a test */ /* calculation. Further, we skip the step if it could be zero within a */ /* reasonable tolerance for computer rounding errors. */ L340: dd = *rho * *rho; sd = 0.; ss = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = dx[i__], fabs(d__1)) >= *rho * 1e-6f) { d__2 = dx[i__]; dd -= d__2 * d__2; } sd += dx[i__] * sdirn[i__]; d__1 = sdirn[i__]; ss += d__1 * d__1; } if (dd <= 0.) { goto L490; } temp = sqrt(ss * dd); if (fabs(sd) >= temp * 1e-6f) { temp = sqrt(ss * dd + sd * sd); } stpful = dd / (temp + sd); step = stpful; if (mcon == *m) { acca = step + resmax * .1; accb = step + resmax * .2; if (step >= acca || acca >= accb) { goto L480; } step = MIN2(step,resmax); } /* SGJ, 2010: check for error here */ if (nlopt_isinf(step)) return NLOPT_ROUNDOFF_LIMITED; /* Set DXNEW to the new variables if STEP is the steplength, and reduce */ /* RESMAX to the corresponding maximum residual if stage one is being done. */ /* Because DXNEW will be changed during the calculation of some Lagrange */ /* multipliers, it will be restored to the following value later. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dxnew[i__] = dx[i__] + step * sdirn[i__]; } if (mcon == *m) { resold = resmax; resmax = 0.; i__1 = nact; for (k = 1; k <= i__1; ++k) { kk = iact[k]; temp = b[kk]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp -= a[i__ + kk * a_dim1] * dxnew[i__]; } resmax = MAX2(resmax,temp); } } /* Set VMULTD to the VMULTC vector that would occur if DX became DXNEW. A */ /* device is included to force VMULTD(K)=0.0 if deviations from this value */ /* can be attributed to computer rounding errors. First calculate the new */ /* Lagrange multipliers. */ k = nact; L390: zdotw = 0.; zdwabs = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = z__[i__ + k * z_dim1] * dxnew[i__]; zdotw += temp; zdwabs += fabs(temp); } acca = zdwabs + fabs(zdotw) * .1; accb = zdwabs + fabs(zdotw) * .2; if (zdwabs >= acca || acca >= accb) { zdotw = 0.; } vmultd[k] = zdotw / zdota[k]; if (k >= 2) { kk = iact[k]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dxnew[i__] -= vmultd[k] * a[i__ + kk * a_dim1]; } --k; goto L390; } if (mcon > *m) { d__1 = 0., d__2 = vmultd[nact]; vmultd[nact] = MAX2(d__1,d__2); } /* Complete VMULTC by finding the new constraint residuals. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dxnew[i__] = dx[i__] + step * sdirn[i__]; } if (mcon > nact) { kl = nact + 1; i__1 = mcon; for (k = kl; k <= i__1; ++k) { kk = iact[k]; sum = resmax - b[kk]; sumabs = resmax + (d__1 = b[kk], fabs(d__1)); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + kk * a_dim1] * dxnew[i__]; sum += temp; sumabs += fabs(temp); } acca = sumabs + fabs(sum) * .1f; accb = sumabs + fabs(sum) * .2f; if (sumabs >= acca || acca >= accb) { sum = 0.f; } vmultd[k] = sum; } } /* Calculate the fraction of the step from DX to DXNEW that will be taken. */ ratio = 1.; icon = 0; i__1 = mcon; for (k = 1; k <= i__1; ++k) { if (vmultd[k] < 0.) { temp = vmultc[k] / (vmultc[k] - vmultd[k]); if (temp < ratio) { ratio = temp; icon = k; } } } /* Update DX, VMULTC and RESMAX. */ temp = 1. - ratio; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dx[i__] = temp * dx[i__] + ratio * dxnew[i__]; } i__1 = mcon; for (k = 1; k <= i__1; ++k) { d__1 = 0., d__2 = temp * vmultc[k] + ratio * vmultd[k]; vmultc[k] = MAX2(d__1,d__2); } if (mcon == *m) { resmax = resold + ratio * (resmax - resold); } /* If the full step is not acceptable then begin another iteration. */ /* Otherwise switch to stage two or end the calculation. */ if (icon > 0) { goto L70; } if (step == stpful) { goto L500; } L480: mcon = *m + 1; icon = mcon; iact[mcon] = mcon; vmultc[mcon] = 0.; goto L60; /* We employ any freedom that may be available to reduce the objective */ /* function before returning a DX whose length is less than RHO. */ L490: if (mcon == *m) { goto L480; } *ifull = 0; L500: return NLOPT_SUCCESS; } /* trstlp */ stevengj-nlopt-88c424d/src/algs/cobyla/cobyla.h000066400000000000000000000044351521061417600214540ustar00rootroot00000000000000/* cobyla : contrained optimization by linear approximation */ /* * Copyright (c) 1992, Michael J. D. Powell (M.J.D.Powell@damtp.cam.ac.uk) * Copyright (c) 2004, Jean-Sebastien Roy (js@jeannot.org) * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * This software is a C version of COBYLA2, a contrained optimization by linear * approximation package developed by Michael J. D. Powell in Fortran. * * The original source code can be found at : * http://plato.la.asu.edu/topics/problems/nlores.html */ /* $Jeannot: cobyla.h,v 1.10 2004/04/18 09:51:37 js Exp $ */ #ifndef _COBYLA_ #define _COBYLA_ #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* NLopt-style interface function */ nlopt_result cobyla_minimize(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, unsigned p, nlopt_constraint *h, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, const double *dx); #ifdef __cplusplus } #endif #endif /* _COBYLA_ */ stevengj-nlopt-88c424d/src/algs/cquad/000077500000000000000000000000001521061417600176505ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/cquad/README000066400000000000000000000024031521061417600205270ustar00rootroot00000000000000An experimental method for nonlinearly constrained optimization without derivatives, by SGJ, using conservative quadratic approximations. It is based on a combination of two ideas: 1) first, quadratic approximations for the function & constraints are constructed based on the techniques suggested by M. J. D. Powell for his unconstrained NEWUOA software (2004) [*]. 2) second, the quadratic approximation is successively solved and refined using conservative-approximation inner/outer iterations based on those of the MMA algorithm of Svanberg (2002). It doesn't really work very well yet (it converges extremely slowly), unfortunately, so I'm keeping it out of NLopt until/unless I have a chance to think about it yet. [*] Actually, we use a greatly simplified version of Powell's technique. Powell goes to great lengths to ensure that his quadratic approximation is constructed iteratively with only O(n^2) work at each step, where n is the number of design variables. Instead, I just use an O(n^3) method, based on the assumptions that (a) the objective function is relatively costly and (b) n is not too big (in the hundreds, not in the thousands) -- if you have thousands of unknowns, you really need to be using a gradient-based method, I think. stevengj-nlopt-88c424d/src/algs/cquad/cquad.c000066400000000000000000000432071521061417600211170ustar00rootroot00000000000000#include #include #include #include #include "cquad.h" #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /**************************************************************************/ /* a quadratic model for n-dimensional data. in Matlab notation: model(x) = q0 + q' (x-x0) + 0.5 * (x-x0)' * Q * (x-x0) where x0 is an origin (array of length n), q is the gradient vector (length n), and Q is the n x n Hessian matrix. */ typedef struct { int n; const double *x0; /* length n vector of reference pt */ double q0, *q, *Q; /* q is a length n vector, and Q is an n x n matrix */ } quad_model; static quad_model alloc_model(int n) { quad_model model; model.n = n; model.x0 = 0; model.q0 = 0; model.q = (double *) malloc(sizeof(double) * n); model.Q = (double *) malloc(sizeof(double) * n*n); return model; } static void free_model(quad_model *model) { free(model->Q); model->Q = 0; free(model->q); model->q = 0; } /* evaluate the model for the vector x (length x) */ static double eval_model(const quad_model *model, const double *x) { double q0 = model->q0, *q = model->q, *Q = model->Q; const double *x0 = model->x0; int j, n = model->n; double val = q0; for (j = 0; j < n; ++j) { double sum = 0; int k; for (k = 0; k < n; ++k) sum += Q[j*n + k] * (x[k] - x0[k]); val += (q[j] + 0.5 * sum) * (x[j] - x0[j]); } return val; } /* gradient of the model at x -> grad */ static void eval_model_grad(const quad_model *model, const double *x, double *grad) { double *q = model->q, *Q = model->Q; const double *x0 = model->x0; int j, n = model->n; for (j = 0; j < n; ++j) { double sum = 0; int k; for (k = 0; k < n; ++k) sum += Q[j*n + k] * (x[k] - x0[k]); grad[j] = q[j] + sum; } } #define DSYSV_BLOCKSIZE 64 #define DSYSV dsysv_ /* LAPACK routine to solve a real-symmetric indefinite system A X = B */ extern void DSYSV(const char *uplo, const int *N, const int *NRHS, double *A, const int *LDA, int *ipiv, double *B, const int *LDB, double *work, const int *lwork, int *info); /* update the model when one of the x vectors has been changed. W is an N by N array (N = M + n + 1), r is length N; both uninitialized. X is an M x n array of the input vectors, inew is the index (0 <= inew < M) of the changed vector, and fnew is the function value at the new point. iwork has length N, and work has length DSYSV_BLOCKSIZE * N. See Powell (2004) for how this routine works. Here, we use the simple O((M+n)^3) technique, rather than the fancy O((M+n)^2) method described by Powell, as explained in the README. */ static void update_model(quad_model *model, double *W, double *r, int M, double *X, int inew, double fnew, int *iwork, double *work) { double *q = model->q, *Q = model->Q; const double *x0 = model->x0; double *lam = r, *c = r + M, *g = r + M+1; int i, j, k, n = model->n, N = M + n + 1, one = 1; int lwork = N * DSYSV_BLOCKSIZE, info; /* set A matrix; A = 0.5 * (X * X').^2 */ for (i = 0; i < M; ++i) { double *xi = X + i*n; for (j = 0; j < M; ++j) { double sum = 0, *xj = X + j*n; for (k = 0; k < n; ++k) sum += (xi[k] - x0[k]) * (xj[k] - x0[k]); W[i * N + j] = W[j * N + i] = 0.5 * sum * sum; } } /* update X matrix: */ for (i = 0; i < M; ++i) { double *xi = X + i*n; W[M * N + i] = W[i * N + M] = 1.0; for (k = 0; k < n; ++k) W[(M+1+k) * N + i] = W[i * N + (M+1+k)] = xi[k] - x0[k]; } memset(r, 0, sizeof(double) * N); r[inew] = fnew - eval_model(model, X + inew*n); /* solve s = W \ r, via the LAPACK symmetric-indefinite solver */ DSYSV("U", &N, &one, W, &N, iwork, r, &N, work, &lwork, &info); if (info != 0) { fprintf(stderr, "nlopt cquad: failure %d in dsysv", info); abort(); } /* update model */ model->q0 += *c; for (k = 0; k < n; ++k) q[k] += g[k]; for (i = 0; i < n; ++i) for (j = i; j < n; ++j) { double sum = 0; for (k = 0; k < M; ++k) sum += lam[k] * (X[k*n+i] - x0[i]) * (X[k*n+j] - x0[j]); Q[i*n + j] = Q[j*n + i] = Q[i*n + j] + sum; } } /* insert the new point xnew (length n) into the array of points X (M x n), given the current optimal point xopt (length n). Returns index inew of replaced point in X. */ static int insert_new_point(int n, const double *xnew, const double *xopt, int M, double *X) { int inew = 0, i, j; double dist2max = 0; /* just use a simple algorithm: replace the point farthest from xopt */ for (i = 0; i < M; ++i) { double *xi = X + i * n; double dist2 = 0; for (j = 0; j < n; ++j ) dist2 += (xi[j] - xopt[j]); if (dist2 > dist2max) { dist2max = dist2; inew = i; } } memcpy(X + inew * n, xnew, sizeof(double) * n); return inew; } /**************************************************************************/ /* a conservative quadratic model is the generic quadratic model above, plus 0.5 * |(x - xopt) / sigma|^2 * rho, where rho is nonnegative */ typedef struct { const double *xopt, *sigma; quad_model model; double rho; } conservative_model; static double cmodel_func(int n, const double *x, double *grad, void *data) { conservative_model *cmodel = (conservative_model *) data; double rho = cmodel->rho, val; const double *xopt = cmodel->xopt, *sigma = cmodel->sigma; int j; val = eval_model(&cmodel->model, x); if (grad) eval_model_grad(&cmodel->model, x, grad); for (j = 0; j < n; ++j) { double siginv = 1.0 / sigma[j]; double dx = (x[j] - xopt[j]) * siginv; val += (0.5 * rho) * dx*dx; if (grad) grad[j] += rho * dx * siginv; } return val; } /* just the rho part of the model (what Svanberg calls the "w" function) */ static double wfunc(int n, const double *x, const conservative_model *cmodel) { const double *xopt = cmodel->xopt, *sigma = cmodel->sigma; double val = 0; int j; for (j = 0; j < n; ++j) { double dx = (x[j] - xopt[j]) / sigma[j]; val += 0.5 * dx*dx; } return val; } /**************************************************************************/ /* magic minimum value for rho in MMA ... the 2002 paper says it should be a "fixed, strictly positive `small' number, e.g. 1e-5" ... grrr, I hate these magic numbers, which seem like they should depend on the objective function in some way ... in particular, note that rho is dimensionful (= dimensions of objective function) */ #define MMA_RHOMIN 1e-5 int cquad_verbose = 1; nlopt_result cquad_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_func fc, void *fc_data_, ptrdiff_t fc_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_algorithm model_alg, double model_tolrel, int model_maxeval) { nlopt_result ret = NLOPT_SUCCESS; double *x0, *xcur, *sigma, *xprev, *xprevprev, fcur, gval; double *fcval_cur, *gcval, *model_lb, *model_ub; double *W, *X, *r, *work; int *iwork; int i, j, k = 0, M = 2*n + 1, N = M + n + 1; char *fc_data = (char *) fc_data_; conservative_model model, *modelc; int feasible, feasible_cur; sigma = (double *) malloc(sizeof(double) * (n*7 + m*2 + N*N + M*n + N + DSYSV_BLOCKSIZE * N)); if (!sigma) return NLOPT_OUT_OF_MEMORY; x0 = sigma + n; xcur = x0 + n; xprev = xcur + n; xprevprev = xprev + n; model_lb = xprevprev + n; model_ub = model_lb + n; fcval_cur = model_ub + n; gcval = fcval_cur + m; W = gcval + m; X = W + N*N; r = X + M*n; work = r + N; model.model.q = model.model.Q = 0; modelc = 0; iwork = (int *) malloc(sizeof(int) * N); if (!iwork) { ret = NLOPT_OUT_OF_MEMORY; goto done; } model.xopt = x; model.sigma = sigma; model.rho = 1; model.model = alloc_model(n); if (!model.model.q || !model.model.Q) { ret = NLOPT_OUT_OF_MEMORY; goto done; } model.model.x0 = x0; modelc = (conservative_model *) malloc(sizeof(conservative_model) * m); if (m > 0 && !modelc) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (i = 0; i < m; ++i) modelc[i].model.q = modelc[i].model.Q = 0; for (i = 0; i < m; ++i) { modelc[i].xopt = x; modelc[i].sigma = sigma; modelc[i].rho = 1; modelc[i].model = alloc_model(n); if (!modelc[i].model.q || !modelc[i].model.Q) { ret = NLOPT_OUT_OF_MEMORY; goto done; } modelc[i].model.x0 = x0; } feasible = 0; *minf = HUGE_VAL; { int iM = 0; double *dx = xprev; /* initial step to construct quad. model */ for (j = 0; j < n; ++j) { if (nlopt_isinf(ub[j]) || nlopt_isinf(lb[j])) sigma[j] = 1.0; /* arbitrary default */ else sigma[j] = 0.25 * (ub[j] - lb[j]); dx[j] = sigma[j]; if (x[j] + dx[j] > ub[j]) x0[j] = x[j] - dx[j]; else if (x[j] - dx[j] < lb[j]) x0[j] = x[j] + dx[j]; else x0[j] = x[j]; } /* initialize quadratic model via simple finite differences around x0, as suggested by Powell */ model.model.q0 = f(n, x0, NULL, f_data); memcpy(X + (iM++ * n), x0, n * sizeof(double)); memset(model.model.Q, 0, sizeof(double) * n*n); *(stop->nevals_p)++; feasible_cur = 1; for (i = 0; i < m; ++i) { modelc[i].model.q0 = fc(n, x0, NULL, fc_data + fc_datum_size*i); memset(modelc[i].model.Q, 0, sizeof(double) * n*n); feasible_cur = feasible_cur && (modelc[i].model.q0 <= 0); } if (feasible_cur) { *minf = model.model.q0; memcpy(x, x0, sizeof(double) * n); feasible = 1; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; memcpy(xcur, x0, sizeof(double) * n); for (j = 0; j < n; ++j) { double fmp[2], *fcmp[2]; int s; fcmp[0] = work; fcmp[1] = work + m; for (s = 0; s < 2; ++s) { xcur[j] = x0[j] + (2*s - 1) * dx[j]; fmp[s] = fcur = f(n, xcur, NULL, f_data); memcpy(X + (iM++ * n), xcur, n * sizeof(double)); *(stop->nevals_p)++; feasible_cur = 1; for (i = 0; i < m; ++i) { fcmp[s][i] = fcval_cur[i] = fc(n, xcur, NULL, fc_data + fc_datum_size*i); feasible_cur = feasible_cur && (fcval_cur[i] <= 0); } if (feasible_cur && fcur < *minf) { *minf = fcur; memcpy(x, xcur, sizeof(double) * n); feasible = 1; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; } xcur[j] = x0[j]; model.model.q[j] = (fmp[1] - fmp[0]) / (2 * dx[j]); model.model.Q[j*n+j] = (fmp[1] + fmp[0] - 2*model.model.q0) / (dx[j]*dx[j]); for (i = 0; i < m; ++i) { modelc[i].model.q[j] = (fcmp[1][i] - fcmp[0][i]) / (2 * dx[j]); modelc[i].model.Q[j*n+j] = (fcmp[1][i] + fcmp[0][i] - 2*modelc[i].model.q0) / (dx[j]*dx[j]); } } } fcur = *minf; memcpy(xcur, x, sizeof(double) * n); while (1) { /* outer iterations */ double fprev = fcur; if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; if (++k > 1) memcpy(xprevprev, xprev, sizeof(double) * n); memcpy(xprev, xcur, sizeof(double) * n); while (1) { /* inner iterations */ double min_model; int inner_done, iMnew; nlopt_result reti; /* solve model problem */ for (j = 0; j < n; ++j) { model_lb[j] = MAX(lb[j], x[j] - 0.9 * sigma[j]); model_ub[j] = MIN(ub[j], x[j] + 0.9 * sigma[j]); } model_solution: memcpy(xcur, x, sizeof(double) * n); reti = nlopt_minimize_constrained( model_alg, n, cmodel_func, &model, m, cmodel_func, modelc, sizeof(conservative_model), model_lb, model_ub, xcur, &min_model, -HUGE_VAL, model_tolrel,0., 0.,NULL, model_maxeval, stop->maxtime - (nlopt_seconds() - stop->start)); if (reti == NLOPT_FAILURE && model_alg != NLOPT_LD_MMA) { /* LBFGS etc. converge quickly but are sometimes very finicky if there are any rounding errors in the gradient, etcetera; if it fails, try again with MMA called recursively for the model */ model_alg = NLOPT_LD_MMA; if (cquad_verbose) printf("cquad: switching to MMA for model\n"); goto model_solution; } if (reti < 0 || reti == NLOPT_MAXTIME_REACHED) { ret = reti; goto done; } got_new_xcur: /* evaluate final xcur etc. */ gval = cmodel_func(n, xcur, NULL, &model); for (i = 0; i < m; ++i) gcval[i] = cmodel_func(n, xcur, NULL, modelc + i); fcur = f(n, xcur, NULL, f_data); *(stop->nevals_p)++; feasible_cur = 1; inner_done = gval >= fcur; for (i = 0; i < m; ++i) { fcval_cur[i] = fc(n, xcur, NULL, fc_data + fc_datum_size * i); feasible_cur = feasible_cur && (fcval_cur[i] <= 0); inner_done = inner_done && (gcval[i] >= fcval_cur[i]); } if (cquad_verbose) { printf("cquad model converged to g=%g vs. f=%g:\n", gval, fcur); for (i = 0; i < MIN(cquad_verbose, m); ++i) printf(" cquad gc[%d]=%g vs. fc[%d]=%g\n", i, gcval[i], i, fcval_cur[i]); } /* update the quadratic models */ iMnew = insert_new_point(n, xcur, x, M, X); update_model(&model.model, W, r, M, X, iMnew, fcur, iwork,work); for (i = 0; i < m; ++i) update_model(&modelc[i].model, W, r, M, X, iMnew, fcval_cur[i], iwork,work); /* once we have reached a feasible solution, the algorithm should never make the solution infeasible again (if inner_done), although the constraints may be violated slightly by rounding errors etc. so we must be a little careful about checking feasibility */ if (feasible_cur) feasible = 1; if (fcur < *minf && (inner_done || feasible_cur || !feasible)) { if (cquad_verbose && !feasible_cur) printf("cquad - using infeasible point?\n"); *minf = fcur; memcpy(x, xcur, sizeof(double)*n); } if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; /* check for ill-conditioned model matrix, as indicated by a model that doesn't match f(xcur)=fcur as required */ if (0 && fabs(eval_model(&model.model, xcur) - fcur) > 1e-6 * fabs(fcur)) { if (cquad_verbose) printf("cquad conditioning problem, diff = %g\n", eval_model(&model.model, xcur) - fcur); /* pick a random point to insert, using X diameter */ for (j = 0; j < n; ++j) { double diam = 1e-3 * sigma[j]; /* minimum diam */ for (i = 0; i < M; ++i) { double diami = fabs(X[i*n+j] - x[j]); if (diami > diam) diam = diami; } diam *= 0.1; xcur[j] = x[j] + nlopt_urand(-diam, diam); } goto got_new_xcur; } if (inner_done) break; if (fcur > gval) model.rho = MIN(10*model.rho, 1.1 * (model.rho + (fcur-gval) / wfunc(n, xcur, &model))); for (i = 0; i < m; ++i) if (fcval_cur[i] > gcval[i]) modelc[i].rho = MIN(10*modelc[i].rho, 1.1 * (modelc[i].rho + (fcval_cur[i]-gcval[i]) / wfunc(n, xcur, &modelc[i]))); if (cquad_verbose) printf("cquad inner iteration: rho -> %g\n", model.rho); for (i = 0; i < MIN(cquad_verbose, m); ++i) printf(" cquad rhoc[%d] -> %g\n", i, modelc[i].rho); } if (nlopt_stop_ftol(stop, fcur, fprev)) ret = NLOPT_FTOL_REACHED; if (nlopt_stop_x(stop, xcur, xprev)) ret = NLOPT_XTOL_REACHED; if (ret != NLOPT_SUCCESS) goto done; /* update rho and sigma for iteration k+1 */ model.rho = MAX(0.1 * model.rho, MMA_RHOMIN); if (cquad_verbose) printf("cquad outer iteration: rho -> %g\n", model.rho); for (i = 0; i < m; ++i) modelc[i].rho = MAX(0.1 * modelc[i].rho, MMA_RHOMIN); for (i = 0; i < MIN(cquad_verbose, m); ++i) printf(" cquad rhoc[%d] -> %g\n", i, modelc[i].rho); if (k > 1) { for (j = 0; j < n; ++j) { double dx2 = (xcur[j]-xprev[j]) * (xprev[j]-xprevprev[j]); double gam = dx2 < 0 ? 0.7 : (dx2 > 0 ? 1.2 : 1); sigma[j] *= gam; if (!nlopt_isinf(ub[j]) && !nlopt_isinf(lb[j])) { sigma[j] = MIN(sigma[j], 10*(ub[j]-lb[j])); sigma[j] = MAX(sigma[j], 0.01*(ub[j]-lb[j])); } } for (j = 0; j < MIN(cquad_verbose, n); ++j) printf(" cquad sigma[%d] -> %g\n", j, sigma[j]); } } done: free(modelc); for (i = 0; i < m; ++i) free_model(&modelc[i].model); free_model(&model.model); free(iwork); free(sigma); return ret; } stevengj-nlopt-88c424d/src/algs/cquad/cquad.h000066400000000000000000000033541521061417600211230ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef CQUAD_H #define CQUAD_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern int cquad_verbose; nlopt_result cquad_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_func fc, void *fc_data_, ptrdiff_t fc_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_algorithm model_alg, double dual_tolrel, int dual_maxeval); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/crs/000077500000000000000000000000001521061417600173425ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/crs/README000066400000000000000000000012521521061417600202220ustar00rootroot00000000000000This is my implementation of the "controlled random search" (CRS2) algorithm with the "local mutation" modification, as defined by: P. Kaelo and M. M. Ali, "Some variants of the controlled random search algorithm for global optimization," J. Optim. Theory Appl. 130 (2), 253-264 (2006). The original CRS2 algorithm was described by: W. L. Price, "A controlled random search procedure for global optimization," in Towards Global Optimization 2, p. 71-84 edited by L. C. W. Dixon and G. P. Szego (North-Holland Press, Amsterdam, 1978). It is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson September 2007 stevengj-nlopt-88c424d/src/algs/crs/crs.c000066400000000000000000000226331521061417600203030ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include "crs.h" #include "redblack.h" /* Controlled Random Search 2 (CRS2) with "local mutation", as defined by: P. Kaelo and M. M. Ali, "Some variants of the controlled random search algorithm for global optimization," J. Optim. Theory Appl. 130 (2), 253-264 (2006). */ typedef struct { int n; /* # dimensions */ const double *lb, *ub; nlopt_stopping *stop; /* stopping criteria */ nlopt_func f; void *f_data; int N; /* # points in population */ double *ps; /* population array N x (n+1) of tuples [f(x), x] */ double *p; /* single point array (length n+1), for temp use */ rb_tree t; /* red-black tree of population, sorted by f(x) */ nlopt_sobol s; /* sobol data for LDS point generation, or NULL to use pseudo-random numbers */ } crs_data; /* sort order in red-black tree: keys [f(x), x] are sorted by f(x) */ static int crs_compare(double *k1, double *k2) { if (*k1 < *k2) return -1; if (*k1 > *k2) return +1; return (int)(k1 - k2); /* tie-breaker */ } /* set x to a random trial value, as defined by CRS: x = 2G - x_n, where x_0 ... x_n are distinct points in the population with x_0 the current best point and the other points are random, and G is the centroid of x_0...x_{n-1} */ static void random_trial(crs_data *d, double *x, rb_node *best) { int n = d->n, n1 = n+1, i, k, i0, jn; double *ps = d->ps, *xi; /* initialize x to x_0 = best point */ memcpy(x, best->k + 1, sizeof(double) * n); i0 = (int)((best->k - ps) / n1); jn = nlopt_iurand(n); /* which of remaining n points is "x_n", i.e. which to reflect through ... this is necessary since we generate the remaining points in order, so just picking the last point would not be very random */ /* use "method A" from Jeffrey Scott Vitter, "An efficient algorithm for sequential random sampling," ACM Trans. Math. Soft. 13 (1), 58--67 (1987). to randomly pick n distinct points out of the remaining N-1 (not including i0!). (The same as "method S" in Knuth vol. 2.) This method requires O(N) time, which is fine in our case (there are better methods if n << N). */ { int Nleft = d->N - 1, nleft = n; int Nfree = Nleft - nleft; i = 0; i += i == i0; while (nleft > 1) { double q = ((double) Nfree) / Nleft; double v = nlopt_urand(0., 1.); while (q > v) { ++i; i += i == i0; --Nfree; --Nleft; q = (q * Nfree) / Nleft; } xi = ps + n1 * i + 1; if (jn-- == 0) /* point to reflect through */ for (k = 0; k < n; ++k) x[k] -= xi[k] * (0.5*n); else /* point to include in centroid */ for (k = 0; k < n; ++k) x[k] += xi[k]; ++i; i += i == i0; --Nleft; --nleft; } i += nlopt_iurand(Nleft); i += i == i0; xi = ps + n1 * i + 1; if (jn-- == 0) /* point to reflect through */ for (k = 0; k < n; ++k) x[k] -= xi[k] * (0.5*n); else /* point to include in centroid */ for (k = 0; k < n; ++k) x[k] += xi[k]; } for (k = 0; k < n; ++k) { x[k] *= 2.0 / n; /* renormalize */ if (x[k] > d->ub[k]) x[k] = d->ub[k]; else if (x[k] < d->lb[k]) x[k] = d->lb[k]; } } #define NUM_MUTATION 1 /* # "local mutation" steps to try if trial fails */ static nlopt_result crs_trial(crs_data *d) { rb_node *best = nlopt_rb_tree_min(&d->t); rb_node *worst = nlopt_rb_tree_max(&d->t); int mutation = NUM_MUTATION; int i, n = d->n; random_trial(d, d->p + 1, best); do { d->p[0] = d->f(n, d->p + 1, NULL, d->f_data); ++ *(d->stop->nevals_p); if (nlopt_stop_forced(d->stop)) return NLOPT_FORCED_STOP; if (d->p[0] < worst->k[0]) break; if (nlopt_stop_evals(d->stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(d->stop)) return NLOPT_MAXTIME_REACHED; if (mutation) { for (i = 0; i < n; ++i) { double w = nlopt_urand(0.,1.); d->p[1+i] = best->k[1+i] * (1 + w) - w * d->p[1+i]; if (d->p[1+i] > d->ub[i]) d->p[1+i] = d->ub[i]; else if (d->p[1+i] < d->lb[i]) d->p[1+i] = d->lb[i]; } mutation--; } else { random_trial(d, d->p + 1, best); mutation = NUM_MUTATION; } } while (1); memcpy(worst->k, d->p, sizeof(double) * (n+1)); nlopt_rb_tree_resort(&d->t, worst); return NLOPT_SUCCESS; } static void crs_destroy(crs_data *d) { nlopt_sobol_destroy(d->s); nlopt_rb_tree_destroy(&d->t); free(d->ps); } static nlopt_result crs_init(crs_data *d, int n, const double *x, const double *lb, const double *ub, nlopt_stopping *stop, nlopt_func f, void *f_data, int population, int lds) { int i; if (!population) { /* TODO: how should we set the default population size? the Kaelo and Ali paper suggests 10*(n+1), but should we add more random points if maxeval is large, or... ? */ d->N = 10 * (n + 1); /* heuristic initial population size */ } else d->N = population; if (d->N < n + 1) { /* population must be big enough for a simplex */ nlopt_stop_msg(stop, "population %d should be >= dimension + 1 = %d", d->N, n+1); return NLOPT_INVALID_ARGS; } d->n = n; d->stop = stop; d->f = f; d->f_data = f_data; d->ub = ub; d->lb = lb; d->ps = (double *) malloc(sizeof(double) * (n + 1) * (d->N + 1)); if (!d->ps) return NLOPT_OUT_OF_MEMORY; d->p = d->ps + d->N * (n+1); nlopt_rb_tree_init(&d->t, crs_compare); /* we can either use pseudorandom points, as in the original CRS algorithm, or use a low-discrepancy Sobol' sequence ... I tried the latter, however, and it doesn't seem to help, probably because we are only generating a small number of random points to start with */ d->s = lds ? nlopt_sobol_create((unsigned) n) : NULL; nlopt_sobol_skip(d->s, (unsigned) d->N, d->ps + 1); /* generate initial points randomly, plus starting guess x */ memcpy(d->ps + 1, x, sizeof(double) * n); d->ps[0] = f(n, x, NULL, f_data); ++ *(stop->nevals_p); if (!nlopt_rb_tree_insert(&d->t, d->ps)) return NLOPT_OUT_OF_MEMORY; if (d->ps[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; for (i = 1; i < d->N; ++i) { double *k = d->ps + i*(n+1); if (d->s) nlopt_sobol_next(d->s, k + 1, lb, ub); else { int j; for (j = 0; j < n; ++j) k[1 + j] = nlopt_urand(lb[j], ub[j]); } k[0] = f(n, k + 1, NULL, f_data); ++ *(stop->nevals_p); if (!nlopt_rb_tree_insert(&d->t, k)) return NLOPT_OUT_OF_MEMORY; if (k[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; } return NLOPT_SUCCESS;; } nlopt_result crs_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int population, /* initial population (0=default) */ int lds) /* random or low-discrepancy seq. (lds) */ { nlopt_result ret; crs_data d; rb_node *best; ret = crs_init(&d, n, x, lb, ub, stop, f, f_data, population, lds); if (ret < 0) return ret; best = nlopt_rb_tree_min(&d.t); *minf = best->k[0]; memcpy(x, best->k + 1, sizeof(double) * n); while (ret == NLOPT_SUCCESS) { if (NLOPT_SUCCESS == (ret = crs_trial(&d))) { best = nlopt_rb_tree_min(&d.t); if (best->k[0] < *minf) { if (best->k[0] < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_f(stop, best->k[0], *minf)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, best->k + 1, x)) ret = NLOPT_XTOL_REACHED; *minf = best->k[0]; memcpy(x, best->k + 1, sizeof(double) * n); } if (ret != NLOPT_SUCCESS) { if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; } } } crs_destroy(&d); return ret; } stevengj-nlopt-88c424d/src/algs/crs/crs.h000066400000000000000000000032261521061417600203050ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef CRS_H #define CRS_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result crs_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int population, /* initial population (0=default) */ int random); /* random or low-discrepancy seq. */ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/direct/000077500000000000000000000000001521061417600200255ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/direct/AUTHORS000066400000000000000000000001731521061417600210760ustar00rootroot00000000000000C conversion: Steven G. Johnson (stevenj@alum.mit.edu) Original Fortran code: Joerg.M.Gablonsky (jmgablon@mailandnews.com) stevengj-nlopt-88c424d/src/algs/direct/COPYING000066400000000000000000000030071521061417600210600ustar00rootroot00000000000000This code is based on the DIRECT 2.0.4 Fortran code by Gablonsky et al. at http://www4.ncsu.edu/~ctk/SOFTWARE/DIRECTv204.tar.gz The C version was initially converted via f2c and then cleaned up and reorganized by Steven G. Johnson (stevenj@alum.mit.edu), August 2007. ******** Copyright and license for the original Fortran DIRECT code ******** Copyright (c) 1999, 2000, 2001 North Carolina State University This program is distributed under the MIT License (see http://www.opensource.org/licenses/mit-license.php): Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. stevengj-nlopt-88c424d/src/algs/direct/DIRect.c000066400000000000000000001265531521061417600213170ustar00rootroot00000000000000/* DIRect-transp.f -- translated by f2c (version 20050501). f2c output hand-cleaned by SGJ (August 2007). */ #include #include "direct-internal.h" /* Common Block Declarations */ /* Table of constant values */ /* +-----------------------------------------------------------------------+ */ /* | Program : Direct.f | */ /* | Last modified : 07-16-2001 | */ /* | Written by : Joerg Gablonsky (jmgablon@unity.ncsu.edu) | */ /* | North Carolina State University | */ /* | Dept. of Mathematics | */ /* | DIRECT is a method to solve problems of the form: | */ /* | min f: Q --> R, | */ /* | where f is the function to be minimized and Q is an n-dimensional | */ /* | hyperrectangle given by the following equation: | */ /* | | */ /* | Q={ x : l(i) <= x(i) <= u(i), i = 1,...,n }. | */ /* | Note: This version of DIRECT can also handle hidden constraints. By | */ /* | this we mean that the function may not be defined over the whole| */ /* | hyperrectangle Q, but only over a subset, which is not given | */ /* | analytically. | */ /* | | */ /* | We now give a brief outline of the algorithm: | */ /* | | */ /* | The algorithm starts with mapping the hyperrectangle Q to the | */ /* | n-dimensional unit hypercube. DIRECT then samples the function at | */ /* | the center of this hypercube and at 2n more points, 2 in each | */ /* | coordinate direction. Uisng these function values, DIRECT then | */ /* | divides the domain into hyperrectangles, each having exactly one of | */ /* | the sampling points as its center. In each iteration, DIRECT chooses| */ /* | some of the existing hyperrectangles to be further divided. | */ /* | We provide two different strategies of how to decide which | */ /* | hyperrectangles DIRECT divides and several different convergence | */ /* | criteria. | */ /* | | */ /* | DIRECT was designed to solve problems where the function f is | */ /* | Lipschitz continues. However, DIRECT has proven to be effective on | */ /* | more complex problems than these. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_direct_(fp fcn, doublereal *x, integer *n, doublereal *eps, doublereal epsabs, integer *maxf, integer *maxt, double starttime, double maxtime, int *force_stop, doublereal *minf, doublereal *l, doublereal *u, integer *algmethod, integer *ierror, FILE *logfile, doublereal *fglobal, doublereal *fglper, doublereal *volper, doublereal *sigmaper, void *fcn_data) { /* System generated locals */ integer i__1, i__2; doublereal d__1; /* changed by SGJ to be dynamically allocated ... would be even better to use realloc, below, to grow these as needed */ integer MAXFUNC = *maxf <= 0 ? 101000 : (*maxf + 1000 + *maxf / 2); integer MAXDEEP = *maxt <= 0 ? MAXFUNC/5: *maxt + 1000; const integer MAXDIV = 5000; /* Local variables */ integer increase; doublereal *c__ = 0 /* was [90000][64] */, *f = 0 /* was [90000][2] */; integer i__, j, *s = 0 /* was [3000][2] */, t; doublereal *w = 0; doublereal divfactor; integer ifeasiblef, iepschange, actmaxdeep; integer actdeep_div__, iinfesiblef; integer pos1, newtosample; integer ifree, help; doublereal *oldl = 0, fmax; integer maxi; doublereal kmax, *oldu = 0; integer oops, *list2 = 0 /* was [64][2] */, cheat; doublereal delta; integer mdeep, *point = 0, start; integer *anchor = 0, *length = 0 /* was [90000][64] */, *arrayi = 0; doublereal *levels = 0, *thirds = 0; doublereal epsfix; integer oldpos, minpos, maxpos, tstart, actdeep, ifreeold, oldmaxf; integer numfunc, version; integer jones; /* FIXME: change sizes dynamically? */ #define MY_ALLOC(p, t, n) p = (t *) malloc(sizeof(t) * (n)); \ if (!(p)) { *ierror = -100; goto cleanup; } /* Note that I've transposed c__, length, and f relative to the original Fortran code. e.g. length was length(maxfunc,n) in Fortran [ or actually length(maxfunc, maxdims), but by using malloc I can just allocate n ], corresponding to length[n][maxfunc] in C, but I've changed the code to access it as length[maxfunc][n]. That is, the maxfunc direction is the discontiguous one. This makes it easier to resize dynamically (by adding contiguous rows) using realloc, without having to move data around manually. */ MY_ALLOC(c__, doublereal, MAXFUNC * (*n)); MY_ALLOC(length, integer, MAXFUNC * (*n)); MY_ALLOC(f, doublereal, MAXFUNC * 2); MY_ALLOC(point, integer, MAXFUNC); if (*maxf <= 0) *maxf = MAXFUNC - 1000; MY_ALLOC(s, integer, MAXDIV * 2); MY_ALLOC(anchor, integer, MAXDEEP + 2); MY_ALLOC(levels, doublereal, MAXDEEP + 1); MY_ALLOC(thirds, doublereal, MAXDEEP + 1); if (*maxt <= 0) *maxt = MAXDEEP; MY_ALLOC(w, doublereal, (*n)); MY_ALLOC(oldl, doublereal, (*n)); MY_ALLOC(oldu, doublereal, (*n)); MY_ALLOC(list2, integer, (*n) * 2); MY_ALLOC(arrayi, integer, (*n)); /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE Direct | */ /* | On entry | */ /* | fcn -- The argument containing the name of the user-supplied | */ /* | SUBROUTINE that returns values for the function to be | */ /* | minimized. | */ /* | n -- The dimension of the problem. | */ /* | eps -- Exceeding value. If eps > 0, we use the same epsilon for | */ /* | all iterations. If eps < 0, we use the update formula from | */ /* | Jones: | */ /* | eps = max(1.D-4*abs(minf),epsfix), | */ /* | where epsfix = abs(eps), the absolute value of eps which is| */ /* | passed to the function. | */ /* | maxf -- The maximum number of function evaluations. | */ /* | maxT -- The maximum number of iterations. | */ /* | Direct stops when either the maximum number of iterations | */ /* | is reached or more than maxf function-evalutions were made.| */ /* | l -- The lower bounds of the hyperbox. | */ /* | u -- The upper bounds of the hyperbox. | */ /* |algmethod-- Choose the method, that is either use the original method | */ /* | as described by Jones et.al. (0) or use our modification(1)| */ /* | logfile -- File-Handle for the logfile. DIRECT expects this file to be| */ /* | opened and closed by the user outside of DIRECT. We moved | */ /* | this to the outside so the user can add extra informations | */ /* | to this file before and after the call to DIRECT. | */ /* | fglobal -- Function value of the global optimum. If this value is not | */ /* | known (that is, we solve a real problem, not a testproblem)| */ /* | set this value to -1.D100 and fglper (see below) to 0.D0. | */ /* | fglper -- Terminate the optimization when the percent error | */ /* | 100(f_min - fglobal)/max(1,abs(fglobal)) < fglper. | */ /* | volper -- Terminate the optimization when the volume of the | */ /* | hyperrectangle S with f(c(S)) = minf is less then volper | */ /* | percent of the volume of the original hyperrectangle. | */ /* |sigmaper -- Terminate the optimization when the measure of the | */ /* | hyperrectangle S with f(c(S)) = minf is less then sigmaper.| */ /* | | */ /* | User data that is passed through without being changed: | */ /* | fcn_data - opaque pointer to any user data | */ /* | | */ /* | On return | */ /* | | */ /* | x -- The final point obtained in the optimization process. | */ /* | X should be a good approximation to the global minimum | */ /* | for the function within the hyper-box. | */ /* | | */ /* | minf -- The value of the function at x. | */ /* | Ierror -- Error flag. If Ierror is lower 0, an error has occurred. | */ /* | The values of Ierror mean | */ /* | Fatal errors : | */ /* | -1 u(i) <= l(i) for some i. | */ /* | -2 maxf is too large. | */ /* | -3 Initialization in DIRpreprc failed. | */ /* | -4 Error in DIRSamplepoints, that is there was an error | */ /* | in the creation of the sample points. | */ /* | -5 Error in DIRSamplef, that is an error occurred while | */ /* | the function was sampled. | */ /* | -6 Error in DIRDoubleInsert, that is an error occurred | */ /* | DIRECT tried to add all hyperrectangles with the same| */ /* | size and function value at the center. Either | */ /* | increase maxdiv or use our modification (Jones = 1). | */ /* | Termination values : | */ /* | 1 Number of function evaluations done is larger then | */ /* | maxf. | */ /* | 2 Number of iterations is equal to maxT. | */ /* | 3 The best function value found is within fglper of | */ /* | the (known) global optimum, that is | */ /* | 100(minf - fglobal/max(1,|fglobal|)) < fglper. | */ /* | Note that this termination signal only occurs when | */ /* | the global optimal value is known, that is, a test | */ /* | function is optimized. | */ /* | 4 The volume of the hyperrectangle with minf at its | */ /* | center is less than volper percent of the volume of | */ /* | the original hyperrectangle. | */ /* | 5 The measure of the hyperrectangle with minf at its | */ /* | center is less than sigmaper. | */ /* | | */ /* | SUBROUTINEs used : | */ /* | | */ /* | DIRheader, DIRInitSpecific, DIRInitList, DIRpreprc, DIRInit, DIRChoose| */ /* | DIRDoubleInsert, DIRGet_I, DIRSamplepoints, DIRSamplef, DIRDivide | */ /* | DIRInsertList, DIRreplaceInf, DIRWritehistbox, DIRsummary, Findareas | */ /* | | */ /* | Functions used : | */ /* | | */ /* | DIRgetMaxdeep, DIRgetlevel | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Parameters | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | The maximum of function evaluations allowed. | */ /* | The maximum dept of the algorithm. | */ /* | The maximum number of divisions allowed. | */ /* | The maximal dimension of the problem. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Global Variables. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | EXTERNAL Variables. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | User Variables. | */ /* | These can be used to pass user defined data to the function to be | */ /* | optimized. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Place to define, if needed, some application-specific variables. | */ /* | Note: You should try to use the arrays defined above for this. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | End of application - specific variables ! | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Internal variables : | */ /* | f -- values of functions. | */ /* |divfactor-- Factor used for termination with known global minimum. | */ /* | anchor -- anchors of lists with deepness i, -1 is anchor for list of | */ /* | NaN - values. | */ /* | S -- List of potentially optimal points. | */ /* | point -- lists | */ /* | ifree -- first free position | */ /* | c -- midpoints of arrays | */ /* | thirds -- Precalculated values of 1/3^i. | */ /* | levels -- Length of intervals. | */ /* | length -- Length of intervall (index) | */ /* | t -- actual iteration | */ /* | j -- loop-variable | */ /* | actdeep -- the actual minimal interval-length index | */ /* | Minpos -- position of the actual minimum | */ /* | file -- The filehandle for a datafile. | */ /* | maxpos -- The number of intervalls, which are truncated. | */ /* | help -- A help variable. | */ /* | numfunc -- The actual number of function evaluations. | */ /* | file2 -- The filehandle for another datafile. | */ /* | ArrayI -- Array with the indexes of the sides with maximum length. | */ /* | maxi -- Number of directions with maximal side length. | */ /* | oops -- Flag which shows if anything went wrong in the | */ /* | initialisation. | */ /* | cheat -- Obsolete. If equal 1, we don't allow Ktilde > kmax. | */ /* | writed -- If writed=1, store final division to plot with Matlab. | */ /* | List2 -- List of indicies of intervalls, which are to be truncated. | */ /* | i -- Another loop-variable. | */ /* |actmaxdeep-- The actual maximum (minimum) of possible Interval length. | */ /* | oldpos -- The old index of the minimum. Used to print only, if there | */ /* | is a new minimum found. | */ /* | tstart -- The start of the outer loop. | */ /* | start -- The position of the starting point in the inner loop. | */ /* | Newtosample -- The total number of points to sample in the inner loop.| */ /* | w -- Array used to divide the intervalls | */ /* | kmax -- Obsolete. If cheat = 1, Ktilde was not allowed to be larger| */ /* | than kmax. If Ktilde > kmax, we set ktilde = kmax. | */ /* | delta -- The distance to new points from center of old hyperrec. | */ /* | pos1 -- Help variable used as an index. | */ /* | version -- Store the version number of DIRECT. | */ /* | oldmaxf -- Store the original function budget. | */ /* |increase -- Flag used to keep track if function budget was increased | */ /* | because no feasible point was found. | */ /* | ifreeold -- Keep track which index was free before. Used with | */ /* | SUBROUTINE DIRReplaceInf. | */ /* |actdeep_div-- Keep track of the current depths for divisions. | */ /* | oldl -- Array used to store the original bounds of the domain. | */ /* | oldu -- Array used to store the original bounds of the domain. | */ /* | epsfix -- If eps < 0, we use Jones update formula. epsfix stores the | */ /* | absolute value of epsilon. | */ /* |iepschange-- flag iepschange to store if epsilon stays fixed or is | */ /* | changed. | */ /* |DIRgetMaxdeep-- Function to calculate the level of a hyperrectangle. | */ /* |DIRgetlevel-- Function to calculate the level and stage of a hyperrec. | */ /* | fmax -- Keep track of the maximum value of the function found. | */ /* |Ifeasiblef-- Keep track if a feasible point has been found so far. | */ /* | Ifeasiblef = 0 means a feasible point has been found, | */ /* | Ifeasiblef = 1 no feasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 09/25/00 Version counter. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 09/24/00 Add another actdeep to keep track of the current depths | */ /* | for divisions. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* |JG 01/13/01 Added epsfix for epsilon update. If eps < 0, we use Jones | */ /* | update formula. epsfix stores the absolute value of epsilon| */ /* | then. Also added flag iepschange to store if epsilon stays | */ /* | fixed or is changed. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 fmax is used to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Ifeasiblef is used to keep track if a feasible point has | */ /* | been found so far. Ifeasiblef = 0 means a feasible point | */ /* | has been found, Ifeasiblef = 1 if not. | */ /* | JG 03/09/01 IInfeasible is used to keep track if an infeasible point | */ /* | has been found. IInfeasible > 0 means a infeasible point | */ /* | has been found, IInfeasible = 0 if not. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Start of code. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --u; --l; --x; /* Function Body */ jones = *algmethod; /* +-----------------------------------------------------------------------+ */ /* | Save the upper and lower bounds. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { oldu[i__ - 1] = u[i__]; oldl[i__ - 1] = l[i__]; /* L150: */ } /* +-----------------------------------------------------------------------+ */ /* | Set version. | */ /* +-----------------------------------------------------------------------+ */ version = 204; /* +-----------------------------------------------------------------------+ */ /* | Set parameters. | */ /* | If cheat > 0, we do not allow \tilde{K} to be larger than kmax, and| */ /* | set \tilde{K} to set value if necessary. Not used anymore. | */ /* +-----------------------------------------------------------------------+ */ cheat = 0; kmax = 1e10; mdeep = MAXDEEP; /* +-----------------------------------------------------------------------+ */ /* | Write the header of the logfile. | */ /* +-----------------------------------------------------------------------+ */ direct_dirheader_(logfile, &version, &x[1], n, eps, maxf, maxt, &l[1], &u[1], algmethod, &MAXFUNC, &MAXDEEP, fglobal, fglper, ierror, &epsfix, & iepschange, volper, sigmaper); /* +-----------------------------------------------------------------------+ */ /* | If an error has occurred while writing the header (we do some checking| */ /* | of variables there), return to the main program. | */ /* +-----------------------------------------------------------------------+ */ if (*ierror < 0) { goto cleanup; } /* +-----------------------------------------------------------------------+ */ /* | If the known global minimum is equal 0, we cannot divide by it. | */ /* | Therefore we set it to 1. If not, we set the divisionfactor to the | */ /* | absolute value of the global minimum. | */ /* +-----------------------------------------------------------------------+ */ if (*fglobal == 0.) { divfactor = 1.; } else { divfactor = fabs(*fglobal); } /* +-----------------------------------------------------------------------+ */ /* | Save the budget given by the user. The variable maxf will be changed | */ /* | if in the beginning no feasible points are found. | */ /* +-----------------------------------------------------------------------+ */ oldmaxf = *maxf; increase = 0; /* +-----------------------------------------------------------------------+ */ /* | Initialiase the lists. | */ /* +-----------------------------------------------------------------------+ */ direct_dirinitlist_(anchor, &ifree, point, f, &MAXFUNC, &MAXDEEP); /* +-----------------------------------------------------------------------+ */ /* | Call the routine to initialise the mapping of x from the n-dimensional| */ /* | unit cube to the hypercube given by u and l. If an error occurred, | */ /* | give out a error message and return to the main program with the error| */ /* | flag set. | */ /* | JG 07/16/01 Changed call to remove unused data. | */ /* +-----------------------------------------------------------------------+ */ direct_dirpreprc_(&u[1], &l[1], n, &l[1], &u[1], &oops); if (oops > 0) { if (logfile) fprintf(logfile,"WARNING: Initialization in DIRpreprc failed.\n"); *ierror = -3; goto cleanup; } tstart = 2; /* +-----------------------------------------------------------------------+ */ /* | Initialise the algorithm DIRECT. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ direct_dirinit_(f, fcn, c__, length, &actdeep, point, anchor, &ifree, logfile, arrayi, &maxi, list2, w, &x[1], &l[1], &u[1], minf, &minpos, thirds, levels, &MAXFUNC, &MAXDEEP, n, n, & fmax, &ifeasiblef, &iinfesiblef, ierror, fcn_data, jones, starttime, maxtime, force_stop); /* +-----------------------------------------------------------------------+ */ /* | Added error checking. | */ /* +-----------------------------------------------------------------------+ */ if (*ierror < 0) { if (*ierror == -4) { if (logfile) fprintf(logfile, "WARNING: Error occurred in routine DIRsamplepoints.\n"); goto cleanup; } if (*ierror == -5) { if (logfile) fprintf(logfile, "WARNING: Error occurred in routine DIRsamplef..\n"); goto cleanup; } if (*ierror == -102) goto L100; } else if (*ierror == DIRECT_MAXTIME_EXCEEDED) goto L100; numfunc = maxi + 1 + maxi; actmaxdeep = 1; oldpos = 0; tstart = 2; /* +-----------------------------------------------------------------------+ */ /* | If no feasible point has been found, give out the iteration, the | */ /* | number of function evaluations and a warning. Otherwise, give out | */ /* | the iteration, the number of function evaluations done and minf. | */ /* +-----------------------------------------------------------------------+ */ if (ifeasiblef > 0) { if (logfile) fprintf(logfile, "No feasible point found in %d iterations " "and %d function evaluations.\n", tstart-1, numfunc); } else { if (logfile) fprintf(logfile, "%d, %d, %g, %g\n", tstart-1, numfunc, *minf, fmax); } /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Main loop! | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ i__1 = *maxt; for (t = tstart; t <= i__1; ++t) { /* +-----------------------------------------------------------------------+ */ /* | Choose the sample points. The indices of the sample points are stored | */ /* | in the list S. | */ /* +-----------------------------------------------------------------------+ */ actdeep = actmaxdeep; direct_dirchoose_(anchor, s, &MAXDEEP, f, minf, *eps, epsabs, levels, &maxpos, length, &MAXFUNC, &MAXDEEP, &MAXDIV, n, logfile, &cheat, & kmax, &ifeasiblef, jones); /* +-----------------------------------------------------------------------+ */ /* | Add other hyperrectangles to S, which have the same level and the same| */ /* | function value at the center as the ones found above (that are stored | */ /* | in S). This is only done if we use the original DIRECT algorithm. | */ /* | JG 07/16/01 Added Errorflag. | */ /* +-----------------------------------------------------------------------+ */ if (*algmethod == 0) { direct_dirdoubleinsert_(anchor, s, &maxpos, point, f, &MAXDEEP, &MAXFUNC, &MAXDIV, ierror); if (*ierror == -6) { if (logfile) fprintf(logfile, "WARNING: Capacity of array S in DIRDoubleInsert reached. Increase maxdiv.\n" "This means that there are a lot of hyperrectangles with the same function\n" "value at the center. We suggest to use our modification instead (Jones = 1)\n" ); goto cleanup; } } oldpos = minpos; /* +-----------------------------------------------------------------------+ */ /* | Initialise the number of sample points in this outer loop. | */ /* +-----------------------------------------------------------------------+ */ newtosample = 0; i__2 = maxpos; for (j = 1; j <= i__2; ++j) { actdeep = s[j + MAXDIV-1]; /* +-----------------------------------------------------------------------+ */ /* | If the actual index is a point to sample, do it. | */ /* +-----------------------------------------------------------------------+ */ if (s[j - 1] > 0) { /* +-----------------------------------------------------------------------+ */ /* | JG 09/24/00 Calculate the value delta used for sampling points. | */ /* +-----------------------------------------------------------------------+ */ actdeep_div__ = direct_dirgetmaxdeep_(&s[j - 1], length, &MAXFUNC, n); delta = thirds[actdeep_div__ + 1]; actdeep = s[j + MAXDIV-1]; /* +-----------------------------------------------------------------------+ */ /* | If the current dept of division is only one under the maximal allowed | */ /* | dept, stop the computation. | */ /* +-----------------------------------------------------------------------+ */ if (actdeep + 1 >= mdeep) { if (logfile) fprintf(logfile, "WARNING: Maximum number of levels reached. Increase maxdeep.\n"); *ierror = -6; goto L100; } actmaxdeep = MAX(actdeep,actmaxdeep); help = s[j - 1]; if (! (anchor[actdeep + 1] == help)) { pos1 = anchor[actdeep + 1]; while(! (point[pos1 - 1] == help)) { pos1 = point[pos1 - 1]; } point[pos1 - 1] = point[help - 1]; } else { anchor[actdeep + 1] = point[help - 1]; } if (actdeep < 0) { actdeep = (integer) f[(help << 1) - 2]; } /* +-----------------------------------------------------------------------+ */ /* | Get the Directions in which to decrease the intervall-length. | */ /* +-----------------------------------------------------------------------+ */ direct_dirget_i__(length, &help, arrayi, &maxi, n, &MAXFUNC); /* +-----------------------------------------------------------------------+ */ /* | Sample the function. To do this, we first calculate the points where | */ /* | we need to sample the function. After checking for errors, we then do | */ /* | the actual evaluation of the function, again followed by checking for | */ /* | errors. | */ /* +-----------------------------------------------------------------------+ */ direct_dirsamplepoints_(c__, arrayi, &delta, &help, &start, length, logfile, f, &ifree, &maxi, point, &x[ 1], &l[1], minf, &minpos, &u[1], n, &MAXFUNC, & MAXDEEP, &oops); if (oops > 0) { if (logfile) fprintf(logfile, "WARNING: Error occurred in routine DIRsamplepoints.\n"); *ierror = -4; goto cleanup; } newtosample += maxi; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ direct_dirsamplef_(c__, arrayi, &delta, &help, &start, length, logfile, f, &ifree, &maxi, point, fcn, &x[ 1], &l[1], minf, &minpos, &u[1], n, &MAXFUNC, & MAXDEEP, &oops, &fmax, &ifeasiblef, &iinfesiblef, fcn_data, force_stop); if (force_stop && *force_stop) { *ierror = -102; goto L100; } if (nlopt_stop_time_(starttime, maxtime)) { *ierror = DIRECT_MAXTIME_EXCEEDED; goto L100; } if (oops > 0) { if (logfile) fprintf(logfile, "WARNING: Error occurred in routine DIRsamplef.\n"); *ierror = -5; goto cleanup; } /* +-----------------------------------------------------------------------+ */ /* | Divide the intervalls. | */ /* +-----------------------------------------------------------------------+ */ direct_dirdivide_(&start, &actdeep_div__, length, point, arrayi, & help, list2, w, &maxi, f, &MAXFUNC, &MAXDEEP, n); /* +-----------------------------------------------------------------------+ */ /* | Insert the new intervalls into the list (sorted). | */ /* +-----------------------------------------------------------------------+ */ direct_dirinsertlist_(&start, anchor, point, f, &maxi, length, & MAXFUNC, &MAXDEEP, n, &help, jones); /* +-----------------------------------------------------------------------+ */ /* | Increase the number of function evaluations. | */ /* +-----------------------------------------------------------------------+ */ numfunc = numfunc + maxi + maxi; } /* +-----------------------------------------------------------------------+ */ /* | End of main loop. | */ /* +-----------------------------------------------------------------------+ */ /* L20: */ } /* +-----------------------------------------------------------------------+ */ /* | If there is a new minimum, show the actual iteration, the number of | */ /* | function evaluations, the minimum value of f (so far) and the position| */ /* | in the array. | */ /* +-----------------------------------------------------------------------+ */ if (oldpos < minpos) { if (logfile) fprintf(logfile, "%d, %d, %g, %g\n", t, numfunc, *minf, fmax); } /* +-----------------------------------------------------------------------+ */ /* | If no feasible point has been found, give out the iteration, the | */ /* | number of function evaluations and a warning. | */ /* +-----------------------------------------------------------------------+ */ if (ifeasiblef > 0) { if (logfile) fprintf(logfile, "No feasible point found in %d iterations " "and %d function evaluations\n", t, numfunc); } /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Termination Checks | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Calculate the index for the hyperrectangle at which | */ /* | minf is assumed. We then calculate the volume of this | */ /* | hyperrectangle and store it in delta. This delta can be | */ /* | used to stop DIRECT once the volume is below a certain | */ /* | percentage of the original volume. Since the original | */ /* | is 1 (scaled), we can stop once delta is below a certain | */ /* | percentage, given by volper. | */ /* +-----------------------------------------------------------------------+ */ *ierror = jones; jones = 0; actdeep_div__ = direct_dirgetlevel_(&minpos, length, &MAXFUNC, n, jones); jones = *ierror; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Use precalculated values to calculate volume. | */ /* +-----------------------------------------------------------------------+ */ delta = thirds[actdeep_div__] * 100; if (delta <= *volper) { *ierror = 4; if (logfile) fprintf(logfile, "DIRECT stopped: Volume of S_min is " "%g%% < %g%% of the original volume.\n", delta, *volper); goto L100; } /* +-----------------------------------------------------------------------+ */ /* | JG 01/23/01 Calculate the measure for the hyperrectangle at which | */ /* | minf is assumed. If this measure is smaller then sigmaper,| */ /* | we stop DIRECT. | */ /* +-----------------------------------------------------------------------+ */ actdeep_div__ = direct_dirgetlevel_(&minpos, length, &MAXFUNC, n, jones); delta = levels[actdeep_div__]; if (delta <= *sigmaper) { *ierror = 5; if (logfile) fprintf(logfile, "DIRECT stopped: Measure of S_min " "= %g < %g.\n", delta, *sigmaper); goto L100; } /* +-----------------------------------------------------------------------+ */ /* | If the best found function value is within fglper of the (known) | */ /* | global minimum value, terminate. This only makes sense if this optimal| */ /* | value is known, that is, in test problems. | */ /* +-----------------------------------------------------------------------+ */ if ((*minf - *fglobal) * 100 / divfactor <= *fglper) { *ierror = 3; if (logfile) fprintf(logfile, "DIRECT stopped: minf within fglper of global minimum.\n"); goto L100; } /* +-----------------------------------------------------------------------+ */ /* | Find out if there are infeasible points which are near feasible ones. | */ /* | If this is the case, replace the function value at the center of the | */ /* | hyper rectangle by the lowest function value of a nearby function. | */ /* | If no infeasible points exist (IInfesiblef = 0), skip this. | */ /* +-----------------------------------------------------------------------+ */ if (iinfesiblef > 0) { direct_dirreplaceinf_(&ifree, &ifreeold, f, c__, thirds, length, anchor, point, &u[1], &l[1], &MAXFUNC, &MAXDEEP, n, n, logfile, &fmax, jones); } ifreeold = ifree; /* +-----------------------------------------------------------------------+ */ /* | If iepschange = 1, we use the epsilon change formula from Jones. | */ /* +-----------------------------------------------------------------------+ */ if (iepschange == 1) { /* Computing MAX */ d__1 = fabs(*minf) * 1e-4; *eps = MAX(d__1,epsfix); } /* +-----------------------------------------------------------------------+ */ /* | If no feasible point has been found yet, set the maximum number of | */ /* | function evaluations to the number of evaluations already done plus | */ /* | the budget given by the user. | */ /* | If the budget has already be increased, increase it again. If a | */ /* | feasible point has been found, remark that and reset flag. No further | */ /* | increase is needed. | */ /* +-----------------------------------------------------------------------+ */ if (increase == 1) { *maxf = numfunc + oldmaxf; if (ifeasiblef == 0) { if (logfile) fprintf(logfile, "DIRECT found a feasible point. The " "adjusted budget is now set to %d.\n", *maxf); increase = 0; } } /* +-----------------------------------------------------------------------+ */ /* | Check if the number of function evaluations done is larger than the | */ /* | allocated budget. If this is the case, check if a feasible point was | */ /* | found. If this is a case, terminate. If no feasible point was found, | */ /* | increase the budget and set flag increase. | */ /* +-----------------------------------------------------------------------+ */ if (numfunc > *maxf) { if (ifeasiblef == 0) { *ierror = 1; if (logfile) fprintf(logfile, "DIRECT stopped: numfunc >= maxf.\n"); goto L100; } else { increase = 1; if (logfile) fprintf(logfile, "DIRECT could not find a feasible point after %d function evaluations.\n" "DIRECT continues until a feasible point is found.\n", numfunc); *maxf = numfunc + oldmaxf; } } /* L10: */ } /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | End of main loop. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | The algorithm stopped after maxT iterations. | */ /* +-----------------------------------------------------------------------+ */ *ierror = 2; if (logfile) fprintf(logfile, "DIRECT stopped: maxT iterations.\n"); L100: /* +-----------------------------------------------------------------------+ */ /* | Store the position of the minimum in x. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = c__[i__ + minpos * i__1 - i__1-1] * l[i__] + l[i__] * u[i__]; u[i__] = oldu[i__ - 1]; l[i__] = oldl[i__ - 1]; /* L50: */ } /* +-----------------------------------------------------------------------+ */ /* | Store the number of function evaluations in maxf. | */ /* +-----------------------------------------------------------------------+ */ *maxf = numfunc; /* +-----------------------------------------------------------------------+ */ /* | Give out a summary of the run. | */ /* +-----------------------------------------------------------------------+ */ direct_dirsummary_(logfile, &x[1], &l[1], &u[1], n, minf, fglobal, &numfunc, ierror); /* +-----------------------------------------------------------------------+ */ /* | Format statements. | */ /* +-----------------------------------------------------------------------+ */ cleanup: #define MY_FREE(p) if (p) free(p) MY_FREE(c__); MY_FREE(f); MY_FREE(s); MY_FREE(w); MY_FREE(oldl); MY_FREE(oldu); MY_FREE(list2); MY_FREE(point); MY_FREE(anchor); MY_FREE(length); MY_FREE(arrayi); MY_FREE(levels); MY_FREE(thirds); } /* direct_ */ stevengj-nlopt-88c424d/src/algs/direct/DIRparallel.c000066400000000000000000000460251521061417600223330ustar00rootroot00000000000000/* DIRparallel.f -- translated by f2c (version 20050501). f2c output hand-cleaned by SGJ (August 2007). */ #include "direct-internal.h" /* Table of constant values */ static integer c__0 = 0; static integer c_n1 = -1; /* +-----------------------------------------------------------------------+ */ /* | Program : Direct.f (subfile DIRseriell.f) | */ /* | Last modified : 02-22-01 | */ /* | Written by : Joerg Gablonsky | */ /* | Subroutines, which differ depending on the serial or parallel version.| */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Parallel Direct. This routine replaces the normal main routine DIRect.| */ /* | In it, we find out if this pe is the master or slave. If it is the | */ /* | master, it calls the serial DIRect main routine. The only routine that| */ /* | has to change for parallel Direct is DIRSamplef, where the actual | */ /* | sampling of the function is done. If we are on the slave, wait for | */ /* | either the coordinates of a point to sample the function or the | */ /* | termination signal. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ int direct_pardirect_(fp fcn, doublereal *x, integer *n, doublereal *eps, integer *maxf, integer *maxt, doublereal *minf, doublereal *l, doublereal *u, integer *algmethod, integer *ierror, FILE *logfile, doublereal *fglobal, doublereal *fglper, doublereal *volper, doublereal *sigmaper, void *fcn_data) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, k; integer tid; integer flag__; doublereal fval; integer tids[360], kret; integer mytid; doublereal fscale; integer nprocs; /* +-----------------------------------------------------------------------+ */ /* | Parameters | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | The maximum of function evaluations allowed. | */ /* | The maximum dept of the algorithm. | */ /* | The maximum number of divisions allowed. | */ /* | The maximal dimension of the problem. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Global Variables. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | External Variables. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | User Variables. | */ /* | These can be used to pass user defined data to the function to be | */ /* | optimized. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Parallel programming variables | */ /* +-----------------------------------------------------------------------+ */ /* maxprocs should be >= the number of processes used for DIRECT */ /* +-----------------------------------------------------------------------+ */ /* | End of parallel programming variables | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Internal variables | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 02/28/01 Begin of parallel additions | */ /* | DETERMINE MASTER PROCESSOR. GET TIDS OF ALL PROCESSORS. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --u; --l; --x; /* Function Body */ getmytidif_(&mytid); getnprocsif_(&nprocs); gettidif_(&c__0, tids); /* +-----------------------------------------------------------------------+ */ /* | If I am the master get the other tids and start running DIRECT. | */ /* | Otherwise, branch off to do function evaluations. | */ /* +-----------------------------------------------------------------------+ */ if (mytid == tids[0]) { i__1 = nprocs - 1; for (i__ = 1; i__ <= i__1; ++i__) { gettidif_(&i__, &tids[i__]); /* L46: */ } /* +-----------------------------------------------------------------------+ */ /* | Call Direct main routine. This routine calls DIRSamplef for the | */ /* | function evaluations, which are then done in parallel. | */ /* +-----------------------------------------------------------------------+ */ direct_direct_(fcn, &x[1], n, eps, maxf, maxt, minf, &l[1], &u[1], algmethod, ierror, logfile, fglobal, fglper, volper, sigmaper, fcn_data); /* +-----------------------------------------------------------------------+ */ /* | Send exit message to rest of pe's. | */ /* +-----------------------------------------------------------------------+ */ flag__ = 0; i__1 = nprocs; for (tid = 2; tid <= i__1; ++tid) { mastersendif_(&tids[tid - 1], &tids[tid - 1], n, &flag__, &flag__, &x[1], &u[1], &l[1], &x[1]); /* L200: */ } } else { /* +-----------------------------------------------------------------------+ */ /* | This is what the slaves do!! | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Receive the first point from the master processor. | */ /* +-----------------------------------------------------------------------+ */ slaverecvif_(tids, &c_n1, n, &flag__, &k, &fscale, &u[1], &l[1], &x[1] ); /* +-----------------------------------------------------------------------+ */ /* | Repeat until master signals to stop. | */ /* +-----------------------------------------------------------------------+ */ while(flag__ > 0) { /* +-----------------------------------------------------------------------+ */ /* | Evaluate f(x). | */ /* +-----------------------------------------------------------------------+ */ direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &fval, &kret, & fcn_data); /* +-----------------------------------------------------------------------+ */ /* | Send result and wait for next point / message with signal to stop. | */ /* +-----------------------------------------------------------------------+ */ slavesendif_(tids, &mytid, &k, &mytid, &fval, &kret); slaverecvif_(tids, &c_n1, n, &flag__, &k, &fscale, &u[1], &l[1], & x[1]); } } return 0; } /* pardirect_ */ /* +-----------------------------------------------------------------------+ */ /* | Subroutine for sampling. This sampling is done in parallel, the master| */ /* | prozessor is also evaluating the function sometimes. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirsamplef_(doublereal *c__, integer *arrayi, doublereal *delta, integer *sample, integer *new__, integer *length, FILE *logfile, doublereal *f, integer *free, integer *maxi, integer *point, fp fcn, doublereal *x, doublereal *l, doublereal * minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, integer *maxdeep, integer *oops, doublereal *fmax, integer * ifeasiblef, integer *iinfesiblef, void *fcn_data) { /* System generated locals */ integer length_dim1, length_offset, c_dim1, c_offset, f_dim1, f_offset, i__1; doublereal d__1; /* Local variables */ integer i__, j, k, helppoint, tid, pos; integer flag__, tids[360], kret, npts; doublereal fhelp; integer oldpos, nprocs, datarec; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 fcn must be declared external. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Removed fcn. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* | Added variable to keep track if feasible point was found. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Variables to pass user defined data to the function to be optimized. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Parallel programming variables. | */ /* +-----------------------------------------------------------------------+ */ /* JG 09/05/00 Increase this if more processors are used. */ /* +-----------------------------------------------------------------------+ */ /* | Find out the id's of all processors. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --u; --l; --x; --arrayi; --point; f_dim1 = *maxfunc; f_offset = 1 + f_dim1; f -= f_offset; length_dim1 = *maxfunc; length_offset = 1 + length_dim1; length -= length_offset; c_dim1 = *maxfunc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ getnprocsif_(&nprocs); i__1 = nprocs - 1; for (i__ = 0; i__ <= i__1; ++i__) { gettidif_(&i__, &tids[i__]); /* L46: */ } /* +-----------------------------------------------------------------------+ */ /* | Set the pointer to the first function to be evaluated, | */ /* | store this position also in helppoint. | */ /* +-----------------------------------------------------------------------+ */ pos = *new__; helppoint = pos; /* +-----------------------------------------------------------------------+ */ /* | Iterate over all points, where the function should be | */ /* | evaluated. | */ /* +-----------------------------------------------------------------------+ */ flag__ = 1; npts = *maxi + *maxi; k = 1; while(k <= npts && k < nprocs) { /* +-----------------------------------------------------------------------+ */ /* | tid is the id of the prozessor the next points is send to. | */ /* +-----------------------------------------------------------------------+ */ tid = k + 1; /* +-----------------------------------------------------------------------+ */ /* | Copy the position into the helparray x. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = c__[pos + i__ * c_dim1]; /* L60: */ } /* +-----------------------------------------------------------------------+ */ /* | Send the point. | */ /* +-----------------------------------------------------------------------+ */ mastersendif_(&tids[tid - 1], &tids[tid - 1], n, &flag__, &pos, &x[1], &u[1], &l[1], &x[1]); ++k; pos = point[pos]; /* +-----------------------------------------------------------------------+ */ /* | Get the next point. | */ /* +-----------------------------------------------------------------------+ */ } /* +-----------------------------------------------------------------------+ */ /* | Get data until it is all received. | */ /* +-----------------------------------------------------------------------+ */ datarec = 0; while(datarec < npts) { if ((doublereal) datarec / (doublereal) nprocs - datarec / nprocs < 1e-5 && k <= npts) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = c__[pos + i__ * c_dim1]; /* L165: */ } direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &fhelp, &kret, fcn_data); oldpos = pos; f[oldpos + f_dim1] = fhelp; ++datarec; /* +-----------------------------------------------------------------------+ */ /* | Remember if an infeasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ *iinfesiblef = MAX(*iinfesiblef,kret); if (kret == 0) { /* +-----------------------------------------------------------------------+ */ /* | if the function evaluation was O.K., set the flag in | */ /* | f(pos,2). | */ /* +-----------------------------------------------------------------------+ */ f[oldpos + (f_dim1 << 1)] = 0.; *ifeasiblef = 0; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* Computing MAX */ d__1 = f[pos + f_dim1]; *fmax = MAX(d__1,*fmax); } /* +-----------------------------------------------------------------------+ */ /* | Remember if an infeasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ *iinfesiblef = MAX(*iinfesiblef,kret); if (kret == 1) { /* +-----------------------------------------------------------------------+ */ /* | If the function could not be evaluated at the given point, | */ /* | set flag to mark this (f(pos,2) and store the maximum | */ /* | box-sidelength in f(pos,1). | */ /* +-----------------------------------------------------------------------+ */ f[oldpos + (f_dim1 << 1)] = 2.; f[oldpos + f_dim1] = *fmax; } /* +-----------------------------------------------------------------------+ */ /* | If the function could not be evaluated due to a failure in | */ /* | the setup, mark this. | */ /* +-----------------------------------------------------------------------+ */ if (kret == -1) { f[oldpos + (f_dim1 << 1)] = -1.; } ++k; pos = point[pos]; } /* +-----------------------------------------------------------------------+ */ /* | Recover where to store the value. | */ /* +-----------------------------------------------------------------------+ */ masterrecvif_(&c_n1, &c_n1, &oldpos, &tid, &fhelp, &kret); f[oldpos + f_dim1] = fhelp; ++datarec; /* +-----------------------------------------------------------------------+ */ /* | Remember if an infeasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ *iinfesiblef = MAX(*iinfesiblef,kret); if (kret == 0) { /* +-----------------------------------------------------------------------+ */ /* | if the function evaluation was O.K., set the flag in | */ /* | f(pos,2). | */ /* +-----------------------------------------------------------------------+ */ f[oldpos + (f_dim1 << 1)] = 0.; *ifeasiblef = 0; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* Computing MAX */ d__1 = f[oldpos + f_dim1]; *fmax = MAX(d__1,*fmax); } if (kret == 1) { /* +-----------------------------------------------------------------------+ */ /* | If the function could not be evaluated at the given point, | */ /* | set flag to mark this (f(pos,2) and store the maximum | */ /* | box-sidelength in f(pos,1). | */ /* +-----------------------------------------------------------------------+ */ f[oldpos + (f_dim1 << 1)] = 2.; f[oldpos + f_dim1] = *fmax; } /* +-----------------------------------------------------------------------+ */ /* | If the function could not be evaluated due to a failure in | */ /* | the setup, mark this. | */ /* +-----------------------------------------------------------------------+ */ if (kret == -1) { f[oldpos + (f_dim1 << 1)] = -1.; } /* +-----------------------------------------------------------------------+ */ /* | Send data until it is all sent. | */ /* +-----------------------------------------------------------------------+ */ if (k <= npts) { /* +-----------------------------------------------------------------------+ */ /* | Copy the position into the helparray x. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = c__[pos + i__ * c_dim1]; /* L160: */ } mastersendif_(&tid, &tid, n, &flag__, &pos, &x[1], &u[1], &l[1], & x[1]); ++k; pos = point[pos]; } } pos = helppoint; /* +-----------------------------------------------------------------------+ */ /* | Iterate over all evaluated points and see, if the minimal | */ /* | value of the function has changed. If this has happend, | */ /* | store the minimal value and its position in the array. | */ /* | Attention: Only valied values are checked!! | */ /* +-----------------------------------------------------------------------+ */ i__1 = *maxi + *maxi; for (j = 1; j <= i__1; ++j) { if (f[pos + f_dim1] < *minf && f[pos + (f_dim1 << 1)] == 0.) { *minf = f[pos + f_dim1]; *minpos = pos; } pos = point[pos]; /* L50: */ } } /* dirsamplef_ */ stevengj-nlopt-88c424d/src/algs/direct/DIRserial.c000066400000000000000000000165301521061417600220140ustar00rootroot00000000000000/* DIRserial-transp.f -- translated by f2c (version 20050501). f2c output hand-cleaned by SGJ (August 2007). */ #include "direct-internal.h" /* +-----------------------------------------------------------------------+ */ /* | Program : Direct.f (subfile DIRserial.f) | */ /* | Last modified : 04-12-2001 | */ /* | Written by : Joerg Gablonsky | */ /* | SUBROUTINEs, which differ depENDing on the serial or parallel version.| */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE for sampling. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirsamplef_(doublereal *c__, integer *arrayi, doublereal *delta, integer *sample, integer *new__, integer *length, FILE *logfile, doublereal *f, integer *free, integer *maxi, integer *point, fp fcn, doublereal *x, doublereal *l, doublereal * minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, const integer *maxdeep, integer *oops, doublereal *fmax, integer * ifeasiblef, integer *iinfesiblef, void *fcn_data, int *force_stop) { /* System generated locals */ integer length_dim1, length_offset, c_dim1, c_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, helppoint, pos, kret; (void) logfile; (void) free; (void) maxfunc; (void) maxdeep; (void) oops; (void) delta; (void) sample; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 fcn must be declared external. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Removed fcn. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* | Added variable to keep track IF feasible point was found. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Variables to pass user defined data to the function to be optimized. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Set the pointer to the first function to be evaluated, | */ /* | store this position also in helppoint. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --u; --l; --x; --arrayi; --point; f -= 3; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; c_dim1 = *n; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ pos = *new__; helppoint = pos; /* +-----------------------------------------------------------------------+ */ /* | Iterate over all points, where the function should be | */ /* | evaluated. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *maxi + *maxi; for (j = 1; j <= i__1; ++j) { /* +-----------------------------------------------------------------------+ */ /* | Copy the position into the helparrayy x. | */ /* +-----------------------------------------------------------------------+ */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] = c__[i__ + pos * c_dim1]; /* L60: */ } /* +-----------------------------------------------------------------------+ */ /* | Call the function. | */ /* +-----------------------------------------------------------------------+ */ if (force_stop && *force_stop) /* skip eval after forced stop */ f[(pos << 1) + 1] = *fmax; else direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &f[(pos << 1) + 1], &kret, fcn_data); if (force_stop && *force_stop) kret = -1; /* mark as invalid point */ /* +-----------------------------------------------------------------------+ */ /* | Remember IF an infeasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ *iinfesiblef = MAX(*iinfesiblef,kret); if (kret == 0) { /* +-----------------------------------------------------------------------+ */ /* | IF the function evaluation was O.K., set the flag in | */ /* | f(2,pos). Also mark that a feasible point has been found. | */ /* +-----------------------------------------------------------------------+ */ f[(pos << 1) + 2] = 0.; *ifeasiblef = 0; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* Computing MAX */ d__1 = f[(pos << 1) + 1]; *fmax = MAX(d__1,*fmax); } if (kret >= 1) { /* +-----------------------------------------------------------------------+ */ /* | IF the function could not be evaluated at the given point, | */ /* | set flag to mark this (f(2,pos) and store the maximum | */ /* | box-sidelength in f(1,pos). | */ /* +-----------------------------------------------------------------------+ */ f[(pos << 1) + 2] = 2.; f[(pos << 1) + 1] = *fmax; } /* +-----------------------------------------------------------------------+ */ /* | IF the function could not be evaluated due to a failure in | */ /* | the setup, mark this. | */ /* +-----------------------------------------------------------------------+ */ if (kret == -1) { f[(pos << 1) + 2] = -1.; } /* +-----------------------------------------------------------------------+ */ /* | Set the position to the next point, at which the function | */ /* | should e evaluated. | */ /* +-----------------------------------------------------------------------+ */ pos = point[pos]; /* L40: */ } pos = helppoint; /* +-----------------------------------------------------------------------+ */ /* | Iterate over all evaluated points and see, IF the minimal | */ /* | value of the function has changed. IF this has happEND, | */ /* | store the minimal value and its position in the array. | */ /* | Attention: Only valid values are checked!! | */ /* +-----------------------------------------------------------------------+ */ i__1 = *maxi + *maxi; for (j = 1; j <= i__1; ++j) { if (f[(pos << 1) + 1] < *minf && f[(pos << 1) + 2] == 0.) { *minf = f[(pos << 1) + 1]; *minpos = pos; } pos = point[pos]; /* L50: */ } } /* dirsamplef_ */ stevengj-nlopt-88c424d/src/algs/direct/DIRsubrout.c000066400000000000000000001654321521061417600222460ustar00rootroot00000000000000/* DIRsubrout.f -- translated by f2c (version 20050501). f2c output hand-cleaned by SGJ (August 2007). */ #include #include "direct-internal.h" /* Table of constant values */ static integer c__1 = 1; static integer c__32 = 32; static integer c__0 = 0; /* +-----------------------------------------------------------------------+ */ /* | INTEGER Function DIRGetlevel | */ /* | Returns the level of the hyperrectangle. Depending on the value of the| */ /* | global variable JONES. IF JONES equals 0, the level is given by | */ /* | kN + p, where the rectangle has p sides with a length of| */ /* | 1/3^(k+1), and N-p sides with a length of 1/3^k. | */ /* | If JONES equals 1, the level is the power of 1/3 of the length of the | */ /* | longest side hyperrectangle. | */ /* | | */ /* | On Return : | */ /* | the maximal length | */ /* | | */ /* | pos -- the position of the midpoint in the array length | */ /* | length -- the array with the dimensions | */ /* | maxfunc -- the leading dimension of length | */ /* | n -- the dimension of the problem | */ /* | | */ /* +-----------------------------------------------------------------------+ */ integer direct_dirgetlevel_(integer *pos, integer *length, integer *maxfunc, integer *n, integer jones) { /* System generated locals */ integer length_dim1, length_offset, ret_val, i__1; /* Local variables */ integer i__, k, p, help; (void) maxfunc; /* JG 09/15/00 Added variable JONES (see above) */ /* Parameter adjustments */ length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ if (jones == 0) { help = length[*pos * length_dim1 + 1]; k = help; p = 1; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (length[i__ + *pos * length_dim1] < k) { k = length[i__ + *pos * length_dim1]; } if (length[i__ + *pos * length_dim1] == help) { ++p; } /* L100: */ } if (k == help) { ret_val = k * *n + *n - p; } else { ret_val = k * *n + p; } } else { help = length[*pos * length_dim1 + 1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (length[i__ + *pos * length_dim1] < help) { help = length[i__ + *pos * length_dim1]; } /* L10: */ } ret_val = help; } return ret_val; } /* dirgetlevel_ */ /* +-----------------------------------------------------------------------+ */ /* | Program : Direct.f (subfile DIRsubrout.f) | */ /* | Last modified : 07-16-2001 | */ /* | Written by : Joerg Gablonsky | */ /* | Subroutines used by the algorithm DIRECT. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRChoose | */ /* | Decide, which is the next sampling point. | */ /* | Changed 09/25/00 JG | */ /* | Added maxdiv to call and changed S to size maxdiv. | */ /* | Changed 01/22/01 JG | */ /* | Added Ifeasiblef to call to keep track if a feasible point has| */ /* | been found. | */ /* | Changed 07/16/01 JG | */ /* | Changed if statement to prevent run-time errors. | | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirchoose_(integer *anchor, integer *s, integer *actdeep, doublereal *f, doublereal *minf, doublereal epsrel, doublereal epsabs, doublereal *thirds, integer *maxpos, integer *length, integer *maxfunc, const integer *maxdeep, const integer *maxdiv, integer *n, FILE *logfile, integer *cheat, doublereal *kmax, integer *ifeasiblef, integer jones) { /* System generated locals */ integer s_dim1, s_offset, length_dim1, length_offset, i__1; /* Local variables */ integer i__, j, k; doublereal helplower; integer i___, j___; doublereal helpgreater; integer novaluedeep = 0; doublereal help2; integer novalue; /* Parameter adjustments */ f -= 3; ++anchor; s_dim1 = *maxdiv; s_offset = 1 + s_dim1; s -= s_offset; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ helplower = HUGE_VAL; helpgreater = 0.; k = 1; if (*ifeasiblef >= 1) { i__1 = *actdeep; for (j = 0; j <= i__1; ++j) { if (anchor[j] > 0) { s[k + s_dim1] = anchor[j]; s[k + (s_dim1 << 1)] = direct_dirgetlevel_(&s[k + s_dim1], &length[ length_offset], maxfunc, n, jones); goto L12; } /* L1001: */ } L12: ++k; *maxpos = 1; return; } else { i__1 = *actdeep; for (j = 0; j <= i__1; ++j) { if (anchor[j] > 0) { s[k + s_dim1] = anchor[j]; s[k + (s_dim1 << 1)] = direct_dirgetlevel_(&s[k + s_dim1], &length[ length_offset], maxfunc, n, jones); ++k; } /* L10: */ } } novalue = 0; if (anchor[-1] > 0) { novalue = anchor[-1]; novaluedeep = direct_dirgetlevel_(&novalue, &length[length_offset], maxfunc, n, jones); } *maxpos = k - 1; i__1 = *maxdeep; for (j = k - 1; j <= i__1; ++j) { s[k + s_dim1] = 0; /* L11: */ } for (j = *maxpos; j >= 1; --j) { helplower = HUGE_VAL; helpgreater = 0.; j___ = s[j + s_dim1]; i__1 = j - 1; for (i__ = 1; i__ <= i__1; ++i__) { i___ = s[i__ + s_dim1]; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Changed IF statement into two to prevent run-time errors | */ /* | which could occur if the compiler checks the second | */ /* | expression in an .AND. statement although the first | */ /* | statement is already not true. | */ /* +-----------------------------------------------------------------------+ */ if (i___ > 0 && ! (i__ == j)) { if (f[(i___ << 1) + 2] <= 1.) { help2 = thirds[s[i__ + (s_dim1 << 1)]] - thirds[s[j + ( s_dim1 << 1)]]; help2 = (f[(i___ << 1) + 1] - f[(j___ << 1) + 1]) / help2; if (help2 <= 0.) { if (logfile) fprintf(logfile, "thirds > 0, help2 <= 0\n"); goto L60; } if (help2 < helplower) { if (logfile) fprintf(logfile, "helplower = %g\n", help2); helplower = help2; } } } /* L30: */ } i__1 = *maxpos; for (i__ = j + 1; i__ <= i__1; ++i__) { i___ = s[i__ + s_dim1]; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Changed IF statement into two to prevent run-time errors | */ /* | which could occur if the compiler checks the second | */ /* | expression in an .AND. statement although the first | */ /* | statement is already not true. | */ /* +-----------------------------------------------------------------------+ */ if (i___ > 0 && ! (i__ == j)) { if (f[(i___ << 1) + 2] <= 1.) { help2 = thirds[s[i__ + (s_dim1 << 1)]] - thirds[s[j + ( s_dim1 << 1)]]; help2 = (f[(i___ << 1) + 1] - f[(j___ << 1) + 1]) / help2; if (help2 <= 0.) { if (logfile) fprintf(logfile, "thirds < 0, help2 <= 0\n"); goto L60; } if (help2 > helpgreater) { if (logfile) fprintf(logfile, "helpgreater = %g\n", help2); helpgreater = help2; } } } /* L31: */ } if (helpgreater <= helplower) { if (*cheat == 1 && helplower > *kmax) { helplower = *kmax; } if (f[(j___ << 1) + 1] - helplower * thirds[s[j + (s_dim1 << 1)]] > MIN(*minf - epsrel * fabs(*minf), *minf - epsabs)) { if (logfile) fprintf(logfile, "> minf - epslminfl\n"); goto L60; } } else { if (logfile) fprintf(logfile, "helpgreater > helplower: %g %g %g\n", helpgreater, helplower, helpgreater - helplower); goto L60; } goto L40; L60: s[j + s_dim1] = 0; L40: ; } if (novalue > 0) { ++(*maxpos); s[*maxpos + s_dim1] = novalue; s[*maxpos + (s_dim1 << 1)] = novaluedeep; } } /* dirchoose_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRDoubleInsert | */ /* | Routine to make sure that if there are several potential optimal | */ /* | hyperrectangles of the same level (i.e. hyperrectangles that have| */ /* | the same level and the same function value at the center), all of| */ /* | them are divided. This is the way as originally described in | */ /* | Jones et.al. | */ /* | JG 07/16/01 Added errorflag to calling sequence. We check if more | */ /* | we reach the capacity of the array S. If this happens, we | */ /* | return to the main program with an error. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirdoubleinsert_(integer *anchor, integer *s, integer * maxpos, integer *point, doublereal *f, const integer *maxdeep, integer * maxfunc, const integer *maxdiv, integer *ierror) { /* System generated locals */ integer s_dim1, s_offset, i__1; /* Local variables */ integer i__, oldmaxpos, pos, help, iflag, actdeep; (void) maxdeep; (void) maxfunc; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Added flag to prevent run time-errors on some systems. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ ++anchor; f -= 3; --point; s_dim1 = *maxdiv; s_offset = 1 + s_dim1; s -= s_offset; /* Function Body */ oldmaxpos = *maxpos; i__1 = oldmaxpos; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__ + s_dim1] > 0) { actdeep = s[i__ + (s_dim1 << 1)]; help = anchor[actdeep]; pos = point[help]; iflag = 0; /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Added flag to prevent run time-errors on some systems. On | */ /* | some systems the second conditions in an AND statement is | */ /* | evaluated even if the first one is already not true. | */ /* +-----------------------------------------------------------------------+ */ while(pos > 0 && iflag == 0) { if (f[(pos << 1) + 1] - f[(help << 1) + 1] <= 1e-13) { if (*maxpos < *maxdiv) { ++(*maxpos); s[*maxpos + s_dim1] = pos; s[*maxpos + (s_dim1 << 1)] = actdeep; pos = point[pos]; } else { /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Maximum number of elements possible in S has been reached!| */ /* +-----------------------------------------------------------------------+ */ *ierror = -6; return; } } else { iflag = 1; } } } /* L10: */ } } /* dirdoubleinsert_ */ /* +-----------------------------------------------------------------------+ */ /* | INTEGER Function GetmaxDeep | */ /* | function to get the maximal length (1/length) of the n-dimensional | */ /* | rectangle with midpoint pos. | */ /* | | */ /* | On Return : | */ /* | the maximal length | */ /* | | */ /* | pos -- the position of the midpoint in the array length | */ /* | length -- the array with the dimensions | */ /* | maxfunc -- the leading dimension of length | */ /* | n -- the dimension of the problem | */ /* | | */ /* +-----------------------------------------------------------------------+ */ integer direct_dirgetmaxdeep_(integer *pos, integer *length, integer *maxfunc, integer *n) { /* System generated locals */ integer length_dim1, length_offset, i__1, i__2, i__3; /* Local variables */ integer i__, help; (void) maxfunc; /* Parameter adjustments */ length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ help = length[*pos * length_dim1 + 1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MIN */ i__2 = help, i__3 = length[i__ + *pos * length_dim1]; help = MIN(i__2,i__3); /* L10: */ } return help; } /* dirgetmaxdeep_ */ static integer isinbox_(doublereal *x, doublereal *a, doublereal *b, integer *n, integer *lmaxdim) { /* System generated locals */ integer ret_val, i__1; /* Local variables */ integer outofbox, i__; (void) lmaxdim; /* Function Body */ outofbox = 1; i__1 = *n; for (i__ = 0; i__ < i__1; ++i__) { if (a[i__] > x[i__] || b[i__] < x[i__]) { outofbox = 0; goto L1010; } /* L1000: */ } L1010: ret_val = outofbox; return ret_val; } /* isinbox_ */ /* +-----------------------------------------------------------------------+ */ /* | JG Added 09/25/00 | */ /* | | */ /* | SUBROUTINE DIRResortlist | */ /* | | */ /* | Resort the list so that the infeasible point is in the list with the | */ /* | replaced value. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ static void dirresortlist_(integer *replace, integer *anchor, doublereal *f, integer *point, integer *length, integer *n, integer * maxfunc, integer *maxdim, const integer *maxdeep, FILE *logfile, integer jones) { /* System generated locals */ integer length_dim1, length_offset, i__1; /* Local variables */ integer i__, l, pos; integer start; (void) maxdim; (void) maxdeep; /* +-----------------------------------------------------------------------+ */ /* | Get the length of the hyper rectangle with infeasible mid point and | */ /* | Index of the corresponding list. | */ /* +-----------------------------------------------------------------------+ */ /* JG 09/25/00 Replaced with DIRgetlevel */ /* l = DIRgetmaxDeep(replace,length,maxfunc,n) */ /* Parameter adjustments */ --point; f -= 3; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; ++anchor; /* Function Body */ l = direct_dirgetlevel_(replace, &length[length_offset], maxfunc, n, jones); start = anchor[l]; /* +-----------------------------------------------------------------------+ */ /* | If the hyper rectangle with infeasibel midpoint is already the start | */ /* | of the list, give out message, nothing to do. | */ /* +-----------------------------------------------------------------------+ */ if (*replace == start) { /* write(logfile,*) 'No resorting of list necessarry, since new ', */ /* + 'point is already anchor of list .',l */ } else { /* +-----------------------------------------------------------------------+ */ /* | Take the hyper rectangle with infeasible midpoint out of the list. | */ /* +-----------------------------------------------------------------------+ */ pos = start; i__1 = *maxfunc; for (i__ = 1; i__ <= i__1; ++i__) { if (point[pos] == *replace) { point[pos] = point[*replace]; goto L20; } else { pos = point[pos]; } if (pos == 0) { if (logfile) fprintf(logfile, "Error in DIRREsortlist: " "We went through the whole list\n" "and could not find the point to replace!!\n"); goto L20; } /* L10: */ } /* +-----------------------------------------------------------------------+ */ /* | If the anchor of the list has a higher value than the value of a | */ /* | nearby point, put the infeasible point at the beginning of the list. | */ /* +-----------------------------------------------------------------------+ */ L20: if (f[(start << 1) + 1] > f[(*replace << 1) + 1]) { anchor[l] = *replace; point[*replace] = start; /* write(logfile,*) 'Point is replacing current anchor for ' */ /* + , 'this list ',l,replace,start */ } else { /* +-----------------------------------------------------------------------+ */ /* | Insert the point into the list according to its (replaced) function | */ /* | value. | */ /* +-----------------------------------------------------------------------+ */ pos = start; i__1 = *maxfunc; for (i__ = 1; i__ <= i__1; ++i__) { /* +-----------------------------------------------------------------------+ */ /* | The point has to be added at the end of the list. | */ /* +-----------------------------------------------------------------------+ */ if (point[pos] == 0) { point[*replace] = point[pos]; point[pos] = *replace; /* write(logfile,*) 'Point is added at the end of the ' */ /* + , 'list ',l, replace */ goto L40; } else { if (f[(point[pos] << 1) + 1] > f[(*replace << 1) + 1]) { point[*replace] = point[pos]; point[pos] = *replace; /* write(logfile,*) 'There are points with a higher ' */ /* + ,'f-value in the list ',l,replace, pos */ goto L40; } pos = point[pos]; } /* L30: */ } L40: ; } } } /* dirresortlist_ */ /* +-----------------------------------------------------------------------+ */ /* | JG Added 09/25/00 | */ /* | SUBROUTINE DIRreplaceInf | */ /* | | */ /* | Find out if there are infeasible points which are near feasible ones. | */ /* | If this is the case, replace the function value at the center of the | */ /* | hyper rectangle by the lowest function value of a nearby function. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirreplaceinf_(integer *free, integer *freeold, doublereal *f, doublereal *c__, doublereal *thirds, integer *length, integer *anchor, integer *point, doublereal *c1, doublereal *c2, integer *maxfunc, const integer *maxdeep, integer *maxdim, integer *n, FILE *logfile, doublereal *fmax, integer jones) { /* System generated locals */ integer c_dim1, c_offset, length_dim1, length_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Local variables */ doublereal a[32], b[32]; integer i__, j, k, l; doublereal x[32], sidelength; integer help; (void) freeold; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --point; f -= 3; ++anchor; length_dim1 = *maxdim; length_offset = 1 + length_dim1; length -= length_offset; c_dim1 = *maxdim; c_offset = 1 + c_dim1; c__ -= c_offset; --c2; --c1; /* Function Body */ i__1 = *free - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (f[(i__ << 1) + 2] > 0.) { /* +-----------------------------------------------------------------------+ */ /* | Get the maximum side length of the hyper rectangle and then set the | */ /* | new side length to this lengths times the growth factor. | */ /* +-----------------------------------------------------------------------+ */ help = direct_dirgetmaxdeep_(&i__, &length[length_offset], maxfunc, n); sidelength = thirds[help] * 2.; /* +-----------------------------------------------------------------------+ */ /* | Set the Center and the upper and lower bounds of the rectangles. | */ /* +-----------------------------------------------------------------------+ */ i__2 = *n; for (j = 1; j <= i__2; ++j) { sidelength = thirds[length[i__ + j * length_dim1]]; a[j - 1] = c__[j + i__ * c_dim1] - sidelength; b[j - 1] = c__[j + i__ * c_dim1] + sidelength; /* L20: */ } /* +-----------------------------------------------------------------------+ */ /* | The function value is reset to 'Inf', since it may have been changed | */ /* | in an earlier iteration and now the feasible point which was close | */ /* | is not close anymore (since the hyper rectangle surrounding the | */ /* | current point may have shrunk). | */ /* +-----------------------------------------------------------------------+ */ f[(i__ << 1) + 1] = HUGE_VAL; f[(i__ << 1) + 2] = 2.; /* +-----------------------------------------------------------------------+ */ /* | Check if any feasible point is near this infeasible point. | */ /* +-----------------------------------------------------------------------+ */ i__2 = *free - 1; for (k = 1; k <= i__2; ++k) { /* +-----------------------------------------------------------------------+ */ /* | If the point k is feasible, check if it is near. | */ /* +-----------------------------------------------------------------------+ */ if (f[(k << 1) + 2] == 0.) { /* +-----------------------------------------------------------------------+ */ /* | Copy the coordinates of the point k into x. | */ /* +-----------------------------------------------------------------------+ */ i__3 = *n; for (l = 1; l <= i__3; ++l) { x[l - 1] = c__[l + k * c_dim1]; /* L40: */ } /* +-----------------------------------------------------------------------+ */ /* | Check if the point k is near the infeasible point, if so, replace the | */ /* | value at */ /* +-----------------------------------------------------------------------+ */ if (isinbox_(x, a, b, n, &c__32) == 1) { /* Computing MIN */ d__1 = f[(i__ << 1) + 1], d__2 = f[(k << 1) + 1]; f[(i__ << 1) + 1] = MIN(d__1,d__2); f[(i__ << 1) + 2] = 1.; } } /* L30: */ } if (f[(i__ << 1) + 2] == 1.) { f[(i__ << 1) + 1] += (d__1 = f[(i__ << 1) + 1], fabs(d__1)) * 1e-6f; i__2 = *n; for (l = 1; l <= i__2; ++l) { x[l - 1] = c__[l + i__ * c_dim1] * c1[l] + c__[l + i__ * c_dim1] * c2[l]; /* L200: */ } dirresortlist_(&i__, &anchor[-1], &f[3], &point[1], &length[length_offset], n, maxfunc, maxdim, maxdeep, logfile, jones); } else { /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 | */ /* | Replaced fixed value for infeasible points with maximum value found, | */ /* | increased by 1. | */ /* +-----------------------------------------------------------------------+ */ if (! (*fmax == f[(i__ << 1) + 1])) { /* Computing MAX */ d__1 = *fmax + 1., d__2 = f[(i__ << 1) + 1]; f[(i__ << 1) + 1] = MAX(d__1,d__2); } } } /* L10: */ } /* L1000: */ } /* dirreplaceinf_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRInsert | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ static void dirinsert_(integer *start, integer *ins, integer *point, doublereal *f, integer *maxfunc) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, help; /* JG 09/17/00 Rewrote this routine. */ /* DO 10,i = 1,maxfunc */ /* IF (f(ins,1) .LT. f(point(start),1)) THEN */ /* help = point(start) */ /* point(start) = ins */ /* point(ins) = help */ /* GOTO 20 */ /* END IF */ /* IF (point(start) .EQ. 0) THEN */ /* point(start) = ins */ /* point(ins) = 0 */ /* GOTO 20 */ /* END IF */ /* start = point(start) */ /* 10 CONTINUE */ /* 20 END */ /* Parameter adjustments */ f -= 3; --point; /* Function Body */ i__1 = *maxfunc; for (i__ = 1; i__ <= i__1; ++i__) { if (point[*start] == 0) { point[*start] = *ins; point[*ins] = 0; return; } else if (f[(*ins << 1) + 1] < f[(point[*start] << 1) + 1]) { help = point[*start]; point[*start] = *ins; point[*ins] = help; return; } *start = point[*start]; /* L10: */ } } /* dirinsert_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRInsertList | */ /* | Changed 02-24-2000 | */ /* | Got rid of the distinction between feasible and infeasible points| */ /* | I could do this since infeasible points get set to a high | */ /* | function value, which may be replaced by a function value of a | */ /* | nearby function at the end of the main loop. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirinsertlist_(integer *new__, integer *anchor, integer * point, doublereal *f, integer *maxi, integer *length, integer * maxfunc, const integer *maxdeep, integer *n, integer *samp, integer jones) { /* System generated locals */ integer length_dim1, length_offset, i__1; /* Local variables */ integer j; integer pos; integer pos1, pos2, deep; (void) maxdeep; /* JG 09/24/00 Changed this to Getlevel */ /* Parameter adjustments */ f -= 3; --point; ++anchor; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ i__1 = *maxi; for (j = 1; j <= i__1; ++j) { pos1 = *new__; pos2 = point[pos1]; *new__ = point[pos2]; /* JG 09/24/00 Changed this to Getlevel */ /* deep = DIRGetMaxdeep(pos1,length,maxfunc,n) */ deep = direct_dirgetlevel_(&pos1, &length[length_offset], maxfunc, n, jones); if (anchor[deep] == 0) { if (f[(pos2 << 1) + 1] < f[(pos1 << 1) + 1]) { anchor[deep] = pos2; point[pos2] = pos1; point[pos1] = 0; } else { anchor[deep] = pos1; point[pos2] = 0; } } else { pos = anchor[deep]; if (f[(pos2 << 1) + 1] < f[(pos1 << 1) + 1]) { if (f[(pos2 << 1) + 1] < f[(pos << 1) + 1]) { anchor[deep] = pos2; /* JG 08/30/00 Fixed bug. Sorting was not correct when */ /* f(1,pos2) < f(1,pos1) < f(1,pos) */ if (f[(pos1 << 1) + 1] < f[(pos << 1) + 1]) { point[pos2] = pos1; point[pos1] = pos; } else { point[pos2] = pos; dirinsert_(&pos, &pos1, &point[1], &f[3], maxfunc); } } else { dirinsert_(&pos, &pos2, &point[1], &f[3], maxfunc); dirinsert_(&pos, &pos1, &point[1], &f[3], maxfunc); } } else { if (f[(pos1 << 1) + 1] < f[(pos << 1) + 1]) { /* JG 08/30/00 Fixed bug. Sorting was not correct when */ /* f(pos1,1) < f(pos2,1) < f(pos,1) */ anchor[deep] = pos1; if (f[(pos << 1) + 1] < f[(pos2 << 1) + 1]) { point[pos1] = pos; dirinsert_(&pos, &pos2, &point[1], &f[3], maxfunc); } else { point[pos1] = pos2; point[pos2] = pos; } } else { dirinsert_(&pos, &pos1, &point[1], &f[3], maxfunc); dirinsert_(&pos, &pos2, &point[1], &f[3], maxfunc); } } } /* L10: */ } /* JG 09/24/00 Changed this to Getlevel */ /* deep = DIRGetMaxdeep(samp,length,maxfunc,n) */ deep = direct_dirgetlevel_(samp, &length[length_offset], maxfunc, n, jones); pos = anchor[deep]; if (f[(*samp << 1) + 1] < f[(pos << 1) + 1]) { anchor[deep] = *samp; point[*samp] = pos; } else { dirinsert_(&pos, samp, &point[1], &f[3], maxfunc); } } /* dirinsertlist_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRInsertList2 (Old way to do it.) | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ static void dirinsertlist_2__(integer *start, integer *j, integer *k, integer *list2, doublereal *w, integer *maxi, integer *n) { /* System generated locals */ integer list2_dim1, list2_offset, i__1; /* Local variables */ integer i__, pos; /* Parameter adjustments */ --w; list2_dim1 = *n; list2_offset = 1 + list2_dim1; list2 -= list2_offset; /* Function Body */ pos = *start; if (*start == 0) { list2[*j + list2_dim1] = 0; *start = *j; goto L50; } if (w[*start] > w[*j]) { list2[*j + list2_dim1] = *start; *start = *j; } else { i__1 = *maxi; for (i__ = 1; i__ <= i__1; ++i__) { if (list2[pos + list2_dim1] == 0) { list2[*j + list2_dim1] = 0; list2[pos + list2_dim1] = *j; goto L50; } else { if (w[*j] < w[list2[pos + list2_dim1]]) { list2[*j + list2_dim1] = list2[pos + list2_dim1]; list2[pos + list2_dim1] = *j; goto L50; } } pos = list2[pos + list2_dim1]; /* L10: */ } } L50: list2[*j + (list2_dim1 << 1)] = *k; } /* dirinsertlist_2__ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRSearchmin | */ /* | Search for the minimum in the list. ! */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ static void dirsearchmin_(integer *start, integer *list2, integer * pos, integer *k, integer *n) { /* System generated locals */ integer list2_dim1, list2_offset; /* Parameter adjustments */ list2_dim1 = *n; list2_offset = 1 + list2_dim1; list2 -= list2_offset; /* Function Body */ *k = *start; *pos = list2[*start + (list2_dim1 << 1)]; *start = list2[*start + list2_dim1]; } /* dirsearchmin_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRSamplepoints | */ /* | Subroutine to sample the new points. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirsamplepoints_(doublereal *c__, integer *arrayi, doublereal *delta, integer *sample, integer *start, integer *length, FILE *logfile, doublereal *f, integer *free, integer *maxi, integer *point, doublereal *x, doublereal *l, doublereal *minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, const integer *maxdeep, integer *oops) { /* System generated locals */ integer length_dim1, length_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer j, k, pos; (void) minf; (void) minpos; (void) maxfunc; (void) maxdeep; (void) oops; /* Parameter adjustments */ --u; --l; --x; --arrayi; --point; f -= 3; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; c_dim1 = *n; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ *oops = 0; pos = *free; *start = *free; i__1 = *maxi + *maxi; for (k = 1; k <= i__1; ++k) { i__2 = *n; for (j = 1; j <= i__2; ++j) { length[j + *free * length_dim1] = length[j + *sample * length_dim1]; c__[j + *free * c_dim1] = c__[j + *sample * c_dim1]; /* L20: */ } pos = *free; *free = point[*free]; if (*free == 0) { if (logfile) fprintf(logfile, "Error, no more free positions! " "Increase maxfunc!\n"); *oops = 1; return; } /* L10: */ } point[pos] = 0; pos = *start; i__1 = *maxi; for (j = 1; j <= i__1; ++j) { c__[arrayi[j] + pos * c_dim1] = c__[arrayi[j] + *sample * c_dim1] + * delta; pos = point[pos]; c__[arrayi[j] + pos * c_dim1] = c__[arrayi[j] + *sample * c_dim1] - * delta; pos = point[pos]; /* L30: */ } ASRT(pos <= 0); } /* dirsamplepoints_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRDivide | */ /* | Subroutine to divide the hyper rectangles according to the rules. | */ /* | Changed 02-24-2000 | */ /* | Replaced if statement by min (line 367) | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirdivide_(integer *new__, integer *currentlength, integer *length, integer *point, integer *arrayi, integer *sample, integer *list2, doublereal *w, integer *maxi, doublereal *f, integer * maxfunc, const integer *maxdeep, integer *n) { /* System generated locals */ integer length_dim1, length_offset, list2_dim1, list2_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j, k, pos, pos2; integer start; (void) maxfunc; (void) maxdeep; /* Parameter adjustments */ f -= 3; --point; --w; list2_dim1 = *n; list2_offset = 1 + list2_dim1; list2 -= list2_offset; --arrayi; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ start = 0; pos = *new__; i__1 = *maxi; for (i__ = 1; i__ <= i__1; ++i__) { j = arrayi[i__]; w[j] = f[(pos << 1) + 1]; k = pos; pos = point[pos]; /* Computing MIN */ d__1 = f[(pos << 1) + 1], d__2 = w[j]; w[j] = MIN(d__1,d__2); pos = point[pos]; dirinsertlist_2__(&start, &j, &k, &list2[list2_offset], &w[1], maxi, n); /* L10: */ } ASRT(pos <= 0); i__1 = *maxi; for (j = 1; j <= i__1; ++j) { dirsearchmin_(&start, &list2[list2_offset], &pos, &k, n); pos2 = start; length[k + *sample * length_dim1] = *currentlength + 1; i__2 = *maxi - j + 1; for (i__ = 1; i__ <= i__2; ++i__) { length[k + pos * length_dim1] = *currentlength + 1; pos = point[pos]; length[k + pos * length_dim1] = *currentlength + 1; /* JG 07/10/01 pos2 = 0 at the end of the 30-loop. Since we end */ /* the loop now, we do not need to reassign pos and pos2. */ if (pos2 > 0) { pos = list2[pos2 + (list2_dim1 << 1)]; pos2 = list2[pos2 + list2_dim1]; } /* L30: */ } /* L20: */ } } /* dirdivide_ */ /* +-----------------------------------------------------------------------+ */ /* | | */ /* | SUBROUTINE DIRINFCN | */ /* | | */ /* | Subroutine DIRinfcn unscales the variable x for use in the | */ /* | user-supplied function evaluation subroutine fcn. After fcn returns | */ /* | to DIRinfcn, DIRinfcn then rescales x for use by DIRECT. | */ /* | | */ /* | On entry | */ /* | | */ /* | fcn -- The argument containing the name of the user-supplied | */ /* | subroutine that returns values for the function to be | */ /* | minimized. | */ /* | | */ /* | x -- A double-precision vector of length n. The point at | */ /* | which the derivative is to be evaluated. | */ /* | | */ /* | xs1 -- A double-precision vector of length n. Used for | */ /* | scaling and unscaling the vector x by DIRinfcn. | */ /* | | */ /* | xs2 -- A double-precision vector of length n. Used for | */ /* | scaling and unscaling the vector x by DIRinfcn. | */ /* | | */ /* | n -- An integer. The dimension of the problem. | */ /* | kret -- An Integer. If kret = 1, the point is infeasible, | */ /* | kret = -1, bad problem set up, | */ /* | kret = 0, feasible. | */ /* | | */ /* | On return | */ /* | | */ /* | f -- A double-precision scalar. | */ /* | | */ /* | Subroutines and Functions | */ /* | | */ /* | The subroutine whose name is passed through the argument fcn. | */ /* | | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirinfcn_(fp fcn, doublereal *x, doublereal *c1, doublereal *c2, integer *n, doublereal *f, integer *flag__, void *fcn_data) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; /* +-----------------------------------------------------------------------+ */ /* | Variables to pass user defined data to the function to be optimized. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | Unscale the variable x. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --c2; --c1; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = (x[i__] + c2[i__]) * c1[i__]; /* L20: */ } /* +-----------------------------------------------------------------------+ */ /* | Call the function-evaluation subroutine fcn. | */ /* +-----------------------------------------------------------------------+ */ *flag__ = 0; *f = fcn(*n, &x[1], flag__, fcn_data); /* +-----------------------------------------------------------------------+ */ /* | Rescale the variable x. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = x[i__] / c1[i__] - c2[i__]; /* L30: */ } } /* dirinfcn_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRGet_I | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirget_i__(integer *length, integer *pos, integer * arrayi, integer *maxi, integer *n, integer *maxfunc) { /* System generated locals */ integer length_dim1, length_offset, i__1; /* Local variables */ integer i__, j, help; (void) maxfunc; /* Parameter adjustments */ --arrayi; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; /* Function Body */ j = 1; help = length[*pos * length_dim1 + 1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (length[i__ + *pos * length_dim1] < help) { help = length[i__ + *pos * length_dim1]; } /* L10: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (length[i__ + *pos * length_dim1] == help) { arrayi[j] = i__; ++j; } /* L20: */ } *maxi = j - 1; } /* dirget_i__ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRInit | */ /* | Initialise all needed variables and do the first run of the | */ /* | algorithm. | */ /* | Changed 02/24/2000 | */ /* | Changed fcn Double precision to fcn external! | */ /* | Changed 09/15/2000 | */ /* | Added distinction between Jones way to characterize rectangles | */ /* | and our way. Common variable JONES controls which way we use. | */ /* | JONES = 0 Jones way (Distance from midpoint to corner) | */ /* | JONES = 1 Our way (Length of longest side) | */ /* | Changed 09/24/00 | */ /* | Added array levels. Levels contain the values to characterize | */ /* | the hyperrectangles. | */ /* | Changed 01/22/01 | */ /* | Added variable fmax to keep track of maximum value found. | */ /* | Added variable Ifeasiblef to keep track if feasibel point has | */ /* | been found. | */ /* | Changed 01/23/01 | */ /* | Added variable Ierror to keep track of errors. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirinit_(doublereal *f, fp fcn, doublereal *c__, integer *length, integer *actdeep, integer *point, integer *anchor, integer *free, FILE *logfile, integer *arrayi, integer *maxi, integer *list2, doublereal *w, doublereal *x, doublereal *l, doublereal *u, doublereal *minf, integer *minpos, doublereal *thirds, doublereal *levels, integer *maxfunc, const integer * maxdeep, integer *n, integer *maxor, doublereal *fmax, integer * ifeasiblef, integer *iinfeasible, integer *ierror, void *fcndata, integer jones, double starttime, double maxtime, int *force_stop) { /* System generated locals */ integer c_dim1, c_offset, length_dim1, length_offset, list2_dim1, list2_offset, i__1, i__2; /* Local variables */ integer i__, j; integer new__, help, oops; doublereal help2, delta; /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* +-----------------------------------------------------------------------+ */ /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable Ifeasiblef to keep track if feasibel point | */ /* | has been found. | */ /* | JG 01/23/01 Added variable Ierror to keep track of errors. | */ /* | JG 03/09/01 Added IInfeasible to keep track if an infeasible point has| */ /* | been found. | */ /* +-----------------------------------------------------------------------+ */ /* JG 09/15/00 Added variable JONES (see above) */ /* +-----------------------------------------------------------------------+ */ /* | Variables to pass user defined data to the function to be optimized. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --point; f -= 3; ++anchor; --u; --l; --x; --w; list2_dim1 = *maxor; list2_offset = 1 + list2_dim1; list2 -= list2_offset; --arrayi; length_dim1 = *n; length_offset = 1 + length_dim1; length -= length_offset; c_dim1 = *maxor; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ *minf = HUGE_VAL; /* JG 09/15/00 If Jones way of characterising rectangles is used, */ /* initialise thirds to reflect this. */ if (jones == 0) { i__1 = *n - 1; for (j = 0; j <= i__1; ++j) { w[j + 1] = sqrt(*n - j + j / 9.) * .5; /* L5: */ } help2 = 1.; i__1 = *maxdeep / *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n - 1; for (j = 0; j <= i__2; ++j) { levels[(i__ - 1) * *n + j] = w[j + 1] / help2; /* L8: */ } help2 *= 3.; /* L10: */ } } else { /* JG 09/15/00 Initialiase levels to contain 1/j */ help2 = 3.; i__1 = *maxdeep; for (i__ = 1; i__ <= i__1; ++i__) { levels[i__] = 1. / help2; help2 *= 3.; /* L11: */ } levels[0] = 1.; } help2 = 3.; i__1 = *maxdeep; for (i__ = 1; i__ <= i__1; ++i__) { thirds[i__] = 1. / help2; help2 *= 3.; /* L21: */ } thirds[0] = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { c__[i__ + c_dim1] = .5; x[i__] = .5; length[i__ + length_dim1] = 0; /* L20: */ } direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &f[3], &help, fcndata); if (force_stop && *force_stop) { *ierror = -102; return; } f[4] = (doublereal) help; *iinfeasible = help; *fmax = f[3]; /* 09/25/00 Added this */ /* if (f(1,1) .ge. 1.E+6) then */ if (f[4] > 0.) { f[3] = HUGE_VAL; *fmax = f[3]; *ifeasiblef = 1; } else { *ifeasiblef = 0; } /* JG 09/25/00 Remove IF */ *minf = f[3]; *minpos = 1; *actdeep = 2; point[1] = 0; *free = 2; delta = thirds[1]; if (nlopt_stop_time_(starttime, maxtime)) { *ierror = DIRECT_MAXTIME_EXCEEDED; return; } direct_dirget_i__(&length[length_offset], &c__1, &arrayi[1], maxi, n, maxfunc); new__ = *free; direct_dirsamplepoints_(&c__[c_offset], &arrayi[1], &delta, &c__1, &new__, & length[length_offset], logfile, &f[3], free, maxi, & point[1], &x[1], &l[1], minf, minpos, &u[1], n, maxfunc, maxdeep, &oops); /* +-----------------------------------------------------------------------+ */ /* | JG 01/23/01 Added error checking. | */ /* +-----------------------------------------------------------------------+ */ if (oops > 0) { *ierror = -4; return; } /* +-----------------------------------------------------------------------+ */ /* | JG 01/22/01 Added variable to keep track of the maximum value found. | */ /* | Added variable to keep track if feasible point was found. | */ /* +-----------------------------------------------------------------------+ */ direct_dirsamplef_(&c__[c_offset], &arrayi[1], &delta, &c__1, &new__, &length[ length_offset], logfile, &f[3], free, maxi, &point[ 1], fcn, &x[1], &l[1], minf, minpos, &u[1], n, maxfunc, maxdeep, &oops, fmax, ifeasiblef, iinfeasible, fcndata, force_stop); if (force_stop && *force_stop) { *ierror = -102; return; } if (nlopt_stop_time_(starttime, maxtime)) { *ierror = DIRECT_MAXTIME_EXCEEDED; return; } /* +-----------------------------------------------------------------------+ */ /* | JG 01/23/01 Added error checking. | */ /* +-----------------------------------------------------------------------+ */ if (oops > 0) { *ierror = -5; return; } direct_dirdivide_(&new__, &c__0, &length[length_offset], &point[1], &arrayi[1], & c__1, &list2[list2_offset], &w[1], maxi, &f[3], maxfunc, maxdeep, n); direct_dirinsertlist_(&new__, &anchor[-1], &point[1], &f[3], maxi, & length[length_offset], maxfunc, maxdeep, n, &c__1, jones); } /* dirinit_ */ /* +-----------------------------------------------------------------------+ */ /* | SUBROUTINE DIRInitList | */ /* | Initialise the list. | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirinitlist_(integer *anchor, integer *free, integer * point, doublereal *f, integer *maxfunc, const integer *maxdeep) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; /* f -- values of functions. */ /* anchor -- anchors of lists with deep i */ /* point -- lists */ /* free -- first free position */ /* Parameter adjustments */ f -= 3; --point; ++anchor; /* Function Body */ i__1 = *maxdeep; for (i__ = -1; i__ <= i__1; ++i__) { anchor[i__] = 0; /* L10: */ } i__1 = *maxfunc; for (i__ = 1; i__ <= i__1; ++i__) { f[(i__ << 1) + 1] = 0.; f[(i__ << 1) + 2] = 0.; point[i__] = i__ + 1; /* point(i) = 0 */ /* L20: */ } point[*maxfunc] = 0; *free = 1; } /* dirinitlist_ */ /* +-----------------------------------------------------------------------+ */ /* | | */ /* | SUBROUTINE DIRPREPRC | */ /* | | */ /* | Subroutine DIRpreprc uses an afine mapping to map the hyper-box given | */ /* | by the constraints on the variable x onto the n-dimensional unit cube.| */ /* | This mapping is done using the following equation: | */ /* | | */ /* | x(i)=x(i)/(u(i)-l(i))-l(i)/(u(i)-l(i)). | */ /* | | */ /* | DIRpreprc checks if the bounds l and u are well-defined. That is, if | */ /* | | */ /* | l(i) < u(i) forevery i. | */ /* | | */ /* | On entry | */ /* | | */ /* | u -- A double-precision vector of length n. The vector | */ /* | containing the upper bounds for the n independent | */ /* | variables. | */ /* | | */ /* | l -- A double-precision vector of length n. The vector | */ /* | containing the lower bounds for the n independent | */ /* | variables. | */ /* | | */ /* | n -- An integer. The dimension of the problem. | */ /* | | */ /* | On return | */ /* | | */ /* | xs1 -- A double-precision vector of length n, used for scaling | */ /* | and unscaling the vector x. | */ /* | | */ /* | xs2 -- A double-precision vector of length n, used for scaling | */ /* | and unscaling the vector x. | */ /* | | */ /* | | */ /* | oops -- An integer. If an upper bound is less than a lower | */ /* | bound or if the initial point is not in the | */ /* | hyper-box oops is set to 1 and iffco terminates. | */ /* | | */ /* +-----------------------------------------------------------------------+ */ /* Subroutine */ void direct_dirpreprc_(doublereal *u, doublereal *l, integer *n, doublereal *xs1, doublereal *xs2, integer *oops) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; doublereal help; /* Parameter adjustments */ --xs2; --xs1; --l; --u; /* Function Body */ *oops = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* +-----------------------------------------------------------------------+ */ /* | Check if the hyper-box is well-defined. | */ /* +-----------------------------------------------------------------------+ */ if (u[i__] <= l[i__]) { *oops = 1; return; } /* L20: */ } /* +-----------------------------------------------------------------------+ */ /* | Scale the initial iterate so that it is in the unit cube. | */ /* +-----------------------------------------------------------------------+ */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { help = u[i__] - l[i__]; xs2[i__] = l[i__] / help; xs1[i__] = help; /* L50: */ } } /* dirpreprc_ */ /* Subroutine */ void direct_dirheader_(FILE *logfile, integer *version, doublereal *x, integer *n, doublereal *eps, integer *maxf, integer * maxt, doublereal *l, doublereal *u, integer *algmethod, integer * maxfunc, const integer *maxdeep, doublereal *fglobal, doublereal *fglper, integer *ierror, doublereal *epsfix, integer *iepschange, doublereal * volper, doublereal *sigmaper) { /* System generated locals */ integer i__1; /* Local variables */ integer imainver, i__, numerrors, isubsubver, ihelp, isubver; (void) maxdeep; (void) ierror; /* +-----------------------------------------------------------------------+ */ /* | Variables to pass user defined data to the function to be optimized. | */ /* +-----------------------------------------------------------------------+ */ /* Parameter adjustments */ --u; --l; --x; /* Function Body */ if (logfile) fprintf(logfile, "------------------- Log file ------------------\n"); numerrors = 0; *ierror = 0; imainver = *version / 100; ihelp = *version - imainver * 100; isubver = ihelp / 10; ihelp -= isubver * 10; isubsubver = ihelp; /* +-----------------------------------------------------------------------+ */ /* | JG 01/13/01 Added check for epsilon. If epsilon is smaller 0, we use | */ /* | the update formula from Jones. We then set the flag | */ /* | iepschange to 1, and store the absolute value of eps in | */ /* | epsfix. epsilon is then changed after each iteration. | */ /* +-----------------------------------------------------------------------+ */ if (*eps < 0.) { *iepschange = 1; *epsfix = -(*eps); *eps = -(*eps); } else { *iepschange = 0; *epsfix = 1e100; } /* +-----------------------------------------------------------------------+ */ /* | JG 07/16/01 Removed printout of contents in cdata(1). | */ /* +-----------------------------------------------------------------------+ */ /* write(logfile,*) cdata(1) */ if (logfile) { fprintf(logfile, "DIRECT Version %d.%d.%d\n" " Problem dimension n: %d\n" " Eps value: %e\n" " Maximum number of f-evaluations (maxf): %d\n" " Maximum number of iterations (MaxT): %d\n" " Value of f_global: %e\n" " Global percentage wanted: %e\n" " Volume percentage wanted: %e\n" " Measure percentage wanted: %e\n", imainver, isubver, isubsubver, *n, *eps, *maxf, *maxt, *fglobal, *fglper, *volper, *sigmaper); fprintf(logfile, *iepschange == 1 ? "Epsilon is changed using the Jones formula.\n" : "Epsilon is constant.\n"); fprintf(logfile, *algmethod == 0 ? "Jones original DIRECT algorithm is used.\n" : "Our modification of the DIRECT algorithm is used.\n"); } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (u[i__] <= l[i__]) { *ierror = -1; if (logfile) fprintf(logfile, "WARNING: bounds on variable x%d: " "%g <= xi <= %g\n", i__, l[i__], u[i__]); ++numerrors; } else { if (logfile) fprintf(logfile, "Bounds on variable x%d: " "%g <= xi <= %g\n", i__, l[i__], u[i__]); } /* L1010: */ } /* +-----------------------------------------------------------------------+ */ /* | If there are to many function evaluations or to many iteration, note | */ /* | this and set the error flag accordingly. Note: If more than one error | */ /* | occurred, we give out an extra message. | */ /* +-----------------------------------------------------------------------+ */ if (*maxf + 20 > *maxfunc) { if (logfile) fprintf(logfile, "WARNING: The maximum number of function evaluations (%d) is higher than\n" " the constant maxfunc (%d). Increase maxfunc in subroutine DIRECT\n" " or decrease the maximum number of function evaluations.\n", *maxf, *maxfunc); ++numerrors; *ierror = -2; } if (*ierror < 0) { if (logfile) fprintf(logfile, "----------------------------------\n"); if (numerrors == 1) { if (logfile) fprintf(logfile, "WARNING: One error in the input!\n"); } else { if (logfile) fprintf(logfile, "WARNING: %d errors in the input!\n", numerrors); } } if (logfile) fprintf(logfile, "----------------------------------\n"); if (*ierror >= 0) { if (logfile) fprintf(logfile, "Iteration # of f-eval. minf\n"); } /* L10005: */ } /* dirheader_ */ /* Subroutine */ void direct_dirsummary_(FILE *logfile, doublereal *x, doublereal * l, doublereal *u, integer *n, doublereal *minf, doublereal *fglobal, integer *numfunc, integer *ierror) { /* Local variables */ integer i__; /* Parameter adjustments */ --u; --l; --x; (void) ierror; /* Function Body */ if (logfile) { fprintf(logfile, "-----------------------Summary------------------\n" "Final function value: %g\n" "Number of function evaluations: %d\n", *minf, *numfunc); if (*fglobal > -1e99) fprintf(logfile, "Final function value is within %g%% of global optimum\n", 100*(*minf - *fglobal) / MAX(1.0, fabs(*fglobal))); fprintf(logfile, "Index, final solution, x(i)-l(i), u(i)-x(i)\n"); for (i__ = 1; i__ <= *n; ++i__) fprintf(logfile, "%d, %g, %g, %g\n", i__, x[i__], x[i__]-l[i__], u[i__] - x[i__]); fprintf(logfile, "-----------------------------------------------\n"); } } /* dirsummary_ */ stevengj-nlopt-88c424d/src/algs/direct/README000066400000000000000000000031351521061417600207070ustar00rootroot00000000000000The DIRECT algorithm (DIviding RECTangles) is a derivative-free global optimization algorithm invented by Jones et al.: D. R. Jones, C. D. Perttunen, and B. E. Stuckmann, "Lipschitzian optimization without the lipschitz constant," J. Optimization Theory and Applications, vol. 79, p. 157 (1993). This is a deterministic-search algorithm based on systematic division of the search domain into smaller and smaller hyperrectangles. The implementation is based on the 1998-2001 Fortran version by J. M. Gablonsky at North Carolina State University, converted to C by Steven G. Johnson. The Fortran source was downloaded from: http://www4.ncsu.edu/~ctk/SOFTWARE/DIRECTv204.tar.gz Gablonsky et al implemented a modified version of the original DIRECT algorithm, as described in: J. M. Gablonsky and C. T. Kelley, "A locally-biased form of the DIRECT algorithm," J. Global Optimization 21 (1), p. 27-37 (2001). Both the original Jones algorithm (NLOPT_GN_DIRECT) and the Gablonsky modified version (NLOPT_GN_DIRECT_L) are implemented and available from the NLopt interface. The Gablonsky version makes the algorithm "more biased towards local search" so that it is more efficient for functions without too many local minima. Also, Gablonsky et al. extended the algorithm to handle "hidden constraints", i.e. arbitrary nonlinear constraints. In NLopt, a hidden constraint is represented by returning NaN (or Inf, or HUGE_VAL) from the objective function at any points violating the constraint. Further information on the DIRECT algorithm and Gablonsky's implementation can be found in the included userguide.pdf file. stevengj-nlopt-88c424d/src/algs/direct/direct-internal.h000066400000000000000000000126141521061417600232660ustar00rootroot00000000000000#ifndef DIRECT_INTERNAL_H #define DIRECT_INTERNAL_H #include #include #include #include "direct.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef int integer; typedef double doublereal; typedef direct_objective_func fp; #define ASRT(c) if (!(c)) { fprintf(stderr, "DIRECT assertion failure at " __FILE__ ":%d -- " #c "\n", __LINE__); exit(EXIT_FAILURE); } #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /* DIRsubrout.c */ extern void direct_dirheader_( FILE *logfile, integer *version, doublereal *x, integer *n, doublereal *eps, integer *maxf, integer * maxt, doublereal *l, doublereal *u, integer *algmethod, integer * maxfunc, const integer *maxdeep, doublereal *fglobal, doublereal *fglper, integer *ierror, doublereal *epsfix, integer *iepschange, doublereal * volper, doublereal *sigmaper); extern void direct_dirinit_( doublereal *f, fp fcn, doublereal *c__, integer *length, integer *actdeep, integer *point, integer *anchor, integer *free, FILE *logfile, integer *arrayi, integer *maxi, integer *list2, doublereal *w, doublereal *x, doublereal *l, doublereal *u, doublereal *minf, integer *minpos, doublereal *thirds, doublereal *levels, integer *maxfunc, const integer * maxdeep, integer *n, integer *maxor, doublereal *fmax, integer * ifeasiblef, integer *iinfeasible, integer *ierror, void *fcndata, integer jones, double starttime, double maxtime, int *force_stop); extern void direct_dirinitlist_( integer *anchor, integer *free, integer * point, doublereal *f, integer *maxfunc, const integer *maxdeep); extern void direct_dirpreprc_(doublereal *u, doublereal *l, integer *n, doublereal *xs1, doublereal *xs2, integer *oops); extern void direct_dirchoose_( integer *anchor, integer *s, integer *actdeep, doublereal *f, doublereal *minf, doublereal epsrel, doublereal epsabs, doublereal *thirds, integer *maxpos, integer *length, integer *maxfunc, const integer *maxdeep, const integer *maxdiv, integer *n, FILE *logfile, integer *cheat, doublereal *kmax, integer *ifeasiblef, integer jones); extern void direct_dirdoubleinsert_( integer *anchor, integer *s, integer *maxpos, integer *point, doublereal *f, const integer *maxdeep, integer *maxfunc, const integer *maxdiv, integer *ierror); extern integer direct_dirgetmaxdeep_(integer *pos, integer *length, integer *maxfunc, integer *n); extern void direct_dirget_i__( integer *length, integer *pos, integer *arrayi, integer *maxi, integer *n, integer *maxfunc); extern void direct_dirsamplepoints_( doublereal *c__, integer *arrayi, doublereal *delta, integer *sample, integer *start, integer *length, FILE *logfile, doublereal *f, integer *free, integer *maxi, integer *point, doublereal *x, doublereal *l, doublereal *minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, const integer *maxdeep, integer *oops); extern void direct_dirdivide_( integer *new__, integer *currentlength, integer *length, integer *point, integer *arrayi, integer *sample, integer *list2, doublereal *w, integer *maxi, doublereal *f, integer *maxfunc, const integer *maxdeep, integer *n); extern void direct_dirinsertlist_( integer *new__, integer *anchor, integer *point, doublereal *f, integer *maxi, integer *length, integer *maxfunc, const integer *maxdeep, integer *n, integer *samp, integer jones); extern void direct_dirreplaceinf_( integer *free, integer *freeold, doublereal *f, doublereal *c__, doublereal *thirds, integer *length, integer *anchor, integer *point, doublereal *c1, doublereal *c2, integer *maxfunc, const integer *maxdeep, integer *maxdim, integer *n, FILE *logfile, doublereal *fmax, integer jones); extern void direct_dirsummary_( FILE *logfile, doublereal *x, doublereal *l, doublereal *u, integer *n, doublereal *minf, doublereal *fglobal, integer *numfunc, integer *ierror); extern integer direct_dirgetlevel_( integer *pos, integer *length, integer *maxfunc, integer *n, integer jones); extern void direct_dirinfcn_( fp fcn, doublereal *x, doublereal *c1, doublereal *c2, integer *n, doublereal *f, integer *flag__, void *fcn_data); /* DIRserial.c / DIRparallel.c */ extern void direct_dirsamplef_( doublereal *c__, integer *arrayi, doublereal *delta, integer *sample, integer *new__, integer *length, FILE *logfile, doublereal *f, integer *free, integer *maxi, integer *point, fp fcn, doublereal *x, doublereal *l, doublereal * minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, const integer *maxdeep, integer *oops, doublereal *fmax, integer * ifeasiblef, integer *iinfesiblef, void *fcn_data, int *force_stop); /* DIRect.c */ extern void direct_direct_( fp fcn, doublereal *x, integer *n, doublereal *eps, doublereal epsabs, integer *maxf, integer *maxt, double starttime, double maxtime, int *force_stop, doublereal *minf, doublereal *l, doublereal *u, integer *algmethod, integer *ierror, FILE *logfile, doublereal *fglobal, doublereal *fglper, doublereal *volper, doublereal *sigmaper, void *fcn_data); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* DIRECT_INTERNAL_H */ stevengj-nlopt-88c424d/src/algs/direct/direct.h000066400000000000000000000026761521061417600214630ustar00rootroot00000000000000#ifndef DIRECT_H #define DIRECT_H #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef double (*direct_objective_func)(int n, const double *x, int *undefined_flag, void *data); typedef enum { DIRECT_ORIGINAL, DIRECT_GABLONSKY } direct_algorithm; typedef enum { DIRECT_INVALID_BOUNDS = -1, DIRECT_MAXFEVAL_TOOBIG = -2, DIRECT_INIT_FAILED = -3, DIRECT_SAMPLEPOINTS_FAILED = -4, DIRECT_SAMPLE_FAILED = -5, DIRECT_MAXFEVAL_EXCEEDED = 1, DIRECT_MAXITER_EXCEEDED = 2, DIRECT_GLOBAL_FOUND = 3, DIRECT_VOLTOL = 4, DIRECT_SIGMATOL = 5, DIRECT_MAXTIME_EXCEEDED = 6, DIRECT_OUT_OF_MEMORY = -100, DIRECT_INVALID_ARGS = -101, DIRECT_FORCED_STOP = -102 } direct_return_code; #define DIRECT_UNKNOWN_FGLOBAL (-HUGE_VAL) #define DIRECT_UNKNOWN_FGLOBAL_RELTOL (0.0) extern direct_return_code direct_optimize( direct_objective_func f, void *f_data, int dimension, const double *lower_bounds, const double *upper_bounds, double *x, double *minf, int max_feval, int max_iter, double start, double maxtime, double magic_eps, double magic_eps_abs, double volume_reltol, double sigma_reltol, int *force_stop, double fglobal, double fglobal_reltol, FILE *logfile, direct_algorithm algorithm); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* DIRECT_H */ stevengj-nlopt-88c424d/src/algs/direct/direct_wrap.c000066400000000000000000000067261521061417600225070ustar00rootroot00000000000000/* C-style API for DIRECT functions. SGJ (August 2007). */ #include "direct-internal.h" /* Perform global minimization using (Gablonsky implementation of) DIRECT algorithm. Arguments: f, f_data: the objective function and any user data -- the objective function f(n, x, undefined_flag, data) takes 4 args: int n: the dimension, same as dimension arg. to direct_optimize const double *x: array x[n] of point to evaluate int *undefined_flag: set to 1 on return if x violates constraints or don't touch otherwise void *data: same as f_data passed to direct_optimize return value = value of f(x) dimension: the number of minimization variable dimensions lower_bounds, upper_bounds: arrays of length dimension of variable bounds x: an array of length dimension, set to optimum variables upon return minf: on return, set to minimum f value magic_eps, magic_eps_abs: Jones' "magic" epsilon parameter, and also an absolute version of the same (not multipled by minf). Jones suggests setting this to 1e-4, but 0 also works... max_feval, max_iter: maximum number of function evaluations & DIRECT iters volume_reltol: relative tolerance on hypercube volume (0 if none) sigma_reltol: relative tolerance on hypercube "measure" (??) (0 if none) fglobal: the global minimum of f, if known ahead of time -- this is mainly for benchmarking, in most cases it is not known and you should pass DIRECT_UNKNOWN_FGLOBAL fglobal_reltol: relative tolerance on how close we should find fglobal -- ignored if fglobal is DIRECT_UNKNOWN_FGLOBAL logfile: an output file to write diagnostic info to (NULL for no I/O) algorithm: whether to use the original DIRECT algorithm (DIRECT_ORIGINAL) or Gablonsky's "improved" version (DIRECT_GABLONSKY) */ direct_return_code direct_optimize( direct_objective_func f, void *f_data, int dimension, const double *lower_bounds, const double *upper_bounds, double *x, double *minf, int max_feval, int max_iter, double start, double maxtime, double magic_eps, double magic_eps_abs, double volume_reltol, double sigma_reltol, int *force_stop, double fglobal, double fglobal_reltol, FILE *logfile, direct_algorithm algorithm) { integer algmethod = algorithm == DIRECT_GABLONSKY; integer ierror; doublereal *l, *u; int i; /* convert to percentages: */ volume_reltol *= 100; sigma_reltol *= 100; fglobal_reltol *= 100; /* make sure these are ignored if <= 0 */ if (volume_reltol <= 0) volume_reltol = -1; if (sigma_reltol <= 0) sigma_reltol = -1; if (fglobal == DIRECT_UNKNOWN_FGLOBAL) fglobal_reltol = DIRECT_UNKNOWN_FGLOBAL_RELTOL; if (dimension < 1) return DIRECT_INVALID_ARGS; l = (doublereal *) malloc(sizeof(doublereal) * dimension * 2); if (!l) return DIRECT_OUT_OF_MEMORY; u = l + dimension; for (i = 0; i < dimension; ++i) { l[i] = lower_bounds[i]; u[i] = upper_bounds[i]; } direct_direct_(f, x, &dimension, &magic_eps, magic_eps_abs, &max_feval, &max_iter, start, maxtime, force_stop, minf, l, u, &algmethod, &ierror, logfile, &fglobal, &fglobal_reltol, &volume_reltol, &sigma_reltol, f_data); free(l); return (direct_return_code) ierror; } stevengj-nlopt-88c424d/src/algs/direct/tstc.c000066400000000000000000000020341521061417600211450ustar00rootroot00000000000000#include #include #include "direct.h" /* has two global minima at (0.09,-0.71) and (-0.09,0.71), plus 4 additional local minima */ static int cnt=0; double tst_obj(int n, const double *xy, int *undefined_flag, void *unused) { double x, y, f; x = xy[0]; y = xy[1]; f = ((x*x)*(4-2.1*(x*x)+((x*x)*(x*x))/3) + x*y + (y*y)*(-4+4*(y*y))); printf("feval:, %d, %g, %g, %g\n", ++cnt, x,y, f); return f; } int main(int argc, char **argv) { int n = 2; double x[2], l[2], u[2]; long int maxits = 0; int info; double minf; int force_stop = 0; maxits = argc < 2 ? 100 : atoi(argv[1]); l[0] = -3; l[1] = -3; u[0] = 3; u[1] = 3; info = direct_optimize(tst_obj, NULL, n, l, u, x, &minf, maxits, 500, 0, 0, 0, 0, 0.0, -1.0, &force_stop, DIRECT_UNKNOWN_FGLOBAL, 0, stdout, DIRECT_GABLONSKY); printf("min f = %g at (%g,%g) after %d evals, return value %d\n", minf, x[0], x[1], cnt, info); return EXIT_SUCCESS; } stevengj-nlopt-88c424d/src/algs/direct/userguide.pdf000066400000000000000000037266751521061417600225460ustar00rootroot00000000000000%PDF-1.4 %Çì�¢ 5 0 obj <> stream xœ]S]OÛ@|·ú#î‘Jõr_¾�G�RƒáÝ'¹6Žƒmªöß÷nïŸ�Ù™ÛÙ™¯?Fh¸Ò½í‹Ëµ&Û© äÎÿ¶ÅGÁ°€¤[Û“ëÚ1HœÔ›"RKF8çÀ%Q´cHÝ7÷ëÛUý½þêÌÐ$¥¾©ß‹‹×pÎ8hfm‚ºqrÃ!à•„ÊZ•p4€%óÒ.ÁHÊñèeêÆp&(CY"Ü}º÷.ê ~Ö/¥ñOTQATCé ï]X“è�ˆqBy™Ô²yÛ‡é÷?tbd¬gÚÏìeCÅÓ0Î;ôBÁ2[%⪇½;48–NàóÜÌhP¨<€—ƒûƒÒd–ÉŒ˜:cÑÓ¤°„oºc3Î}‡ù)s.F²E»'hؤ™í2ßc3ﺾ™];ÅîÒ�j«ã$±7qæÔ>æïÃÊÜ 'P.•ënꚱńœJwi ²¨Ê0bIæ¹uQ]°üEÏî6äè‚®†þøéNËT 4,LJêzHý³F£�ôÏpZ!ÓGŒåïyÝì;·ÝýH{Š«iO+ôR对V{ ›—–ñ­ø©™ú*j%ðð�œ† ‡WÇÑíÓÂdQ1ƒ6üX- '³€ÞÖÅOýÀvèendstream endobj 6 0 obj 485 endobj 78 0 obj <> stream xœíZ]oÛ6}7ö# ìaPsü¥Ç5Í’ûHk{pó X²­Õ²]YÎÒýúQ$%]Zr`´i¦FP$¥/eŠçÜ{Ͻä§>F¤�‹û{šö~~'ûóm÷/Õ¿yïS�hƒ¾ý5Mû/ÇÊÈ÷ŠI´?žõÌÔ!é‚‘ï÷½€ ì÷Çioðêõ»‹óñÙøo5# Õ Î–�T³ÆQopG.L(G�|;ú~gzTªI˜ÙÑË]Åæyפ�ú˳6Iù¹¨>2_ FûÌC>ÇT›�¯W…!ãp-y¬©‡¤§ììàÖ>‘àú‰žzW¦V«Li1¿0$…‘H� °s_ëçŠH56äÙúlÈ0ÆÈ Ñnš'j-7ã7=ÏC¬Þ‚|m¾8« àöÂÅQ/@ÜÚ�æn ™Ç‹Ý \YiDì[û~a§¯³õí2N‹¸D˜ãr£x;Í’�^´úPj뫽BÅP€¨Z$ïàP�Â3YêS¿ �¿ÇÈwæSäIYð]Ã]ØÑ&ßßo“Õ¼A[æ#Z3ëm™z6.×Dä­þFmÖFÝ¿a®}›ÂÑD»1!е“Õt¹‹âH³Ü«6 1^Ë�WOÏ:ðP é¾ §vÀàGíz�åP87“) ê½:Ñôëhª)¢H!~Í(¢MJœ‡Ëe39F¢FÎa&`—Ï(Æ�"áãQŒŠIH1Ö¤Ø(L7Kíæ\  :K§¡ '4€Ap“­çY¨Ó«PQ­ì:1âFÈ#s#kæÆ_ô‡ùg»Xg¹•¡ ×há笨Tí�’à�âì.‰ÿÑ„£F×ÚÙ3ýEÂÑ’‹¸û(«Tâ¡”\(õzYár¾Î’|¡YëÄëï W‘õÀüõÎHx®w´T¿©¿±A”ü0 ‡Zúià£ÀMî…ÄÔI› ‰Ê� ­ŠVTþÉÚTÁ«ä.‰lPݫߚڣu鸅qýRß'Ã;2ôˆ.Ë Ô"V+(EÈé�LqŰEEm~€*€Ò3ûpV?<4K€®¹0Þ ^g2ø¼©xgÓÝ­-±?ˆMñGÿ«J÷„ðW ì;¡ÀèÁ'…7‹§y¸š/ ²>†™¿Kht3¡,¥ƒY‹‚¿.†d¡Ö«œ¸.Û5D£SFóDiýÏ:m`ÄARÝäI.Ë|Yƒ~<šÛNÑpÔNÕ=„ù> î¶hèq›Lá yv¸D;¬T”6àp¿S(ÿÒHx“1VvXSØ`-DfÝb•0¶›«úÚhô¸t¤á—q°ÖÀß!d€,€�‰&d÷*noKm_ô�÷{ÞzþW£AQP[¹hPØõé’OuÙý‚WªJÔ~T¯öM·àµÑœ:ñW#¥ûÁ¸=Þæ6�ƒ@oÏLý§éµy½¢À³ØˆŽ }kd÷+ÞÖP¸¸¯l|Ø@˜­3«e€õ"‰"«œÃìi‘'²²Sì9¢Â8ðÊÆ äÇu_ÓS(º1ç¶\~¹NãõpùŒ™…XM¹Ñ,ñ;Qœøp,È!§ok0CR{dùH[}žÂºÒƒªfb/@Ýž i(ç–ƒ8Ò­á´!Ûî�¼Y¯bSÐPxNç(\ê7sψ'DF²N\?øÖî·î€mÞ×vÈü°;‰–<•Ü6’áú²É.ÝØAÐ4˜†i¼¼5—IÝ"â£YZŽ=弌“ª™‰é⪃Œycžì`.^Œ±¾'å^Ÿ_£$5'æXX:ç@# ¡eÊš v¥æ£Jóe¹}Œ@7zšÑ•…ÆG#ðĽåo¶“Âìd}v"KˉÛï¶Øuý~‡ù.3ê–sçXË�ŠÖWÇjó_µfs.d@µ®Šù'ïÀ>׈¡w"Z˱Ý»4VY¸ŠpÔ™Â}·4펡?tiOe÷ãrG'ú‹qï­úùدëendstream endobj 79 0 obj 1772 endobj 203 0 obj <> stream xœ�W]oÛ6ݳ0`AÀ^ ¦E‰"¥>mM².Ò¥‰Û<yPdÅV«Gñ²_¿ËIW¶ÓtCÑ¥ÈËËÃsϹ|´]BmWþ1¿Iaͯ…½n,×~×Ö£EÕÛü$…ýn“B.yöâÁÒKgÔ¦Ô%ahóˆ7´…åœ]\ŸŸ.N_aED‡̇ ®\·XYΓG\9Åc$â®gF?7i­F¡4ŠÌèû.[¥:uÇ€^ÈIh¦dYÿ=¾Ïü�BpÛ‡i ¶�ó®êô!NŽsm�ODBM[l²FåK‡œ—Ϊ:™yQ_8IW¤åÉÝâƒÅÂÆƒµr]Hw)ï“S±(E±œXEòìô:}Êš¬*å+a©T€ÉX»Q§ð\â�Q³ÐàÇ]—™Ñu�ŸO‰?º ïTXN˜õ@¶•c$'~‘CbÀ:­û,}†¯”éXâU§¯¸_–Û<�É¡™pÂpЦ¾IˆÕ\L‡6nÇýQêz³)K¡ãΘ˜øî� b Oôi%PýÂ…Áš¡4–NŸÌ˜bCä|­jÅ…)"‰ºÊ¸M\®SÅ?Äøf¥A‰# ×;`é$@@ßu]ØÄ�+•;z¢gTmhíQT^\ôlH]qTNüå�)7³2É»�‰! ÷1†T�Ž¥êTu¶ÎÊ8?¸æoŒ÷Ò•LÅ"ÎׯÝrbàcÆÇ�á+Š4m’:»7•ê ']) Šoù^.ãê>û”ŸU$¨'óÿUin ´jLyIƒ»7G�ö™€Ä$Ò>7jó*ÒéßmZöHOüa¤÷Áé«~¨d„0p•k)˜m›lµÒ¥Ìì$UÙ´u¬ÙÉøD|šcx¡€Åÿ‰j��:‘‡³1Ú(i×ç²�ë8ÏSE'Fqñ<©cOôö�Z:š!áÜ©Ú�)Ò/ÛˆFôùxÝW_.�t"©9šöåÕÅ�g8 ¤Ý(I™y\9¥$H‘°°ð‘¾Iï1ÑXâÑ„ñfï`r´Áš¼ïXÓ(œuk•õ%ŠÞ°t4Ä•ûPu:?˜°±5žrĪ< áC•ç•wDû]V®UT× ÜÞÞs%báè ñjU§Mc1fî¼ÕÓ#Ð=ןÐqsXôm»};Ÿïv;FʤéHºêæiÕÌ;èDšy2OÚoê@0i¸£ôdF¥ ÂR>ËåójÛfEö�†XÂu¾°>Y�Ð}èNIÚóÃPj‚sdçõîš_\ÚmÝ¥ÖüÖ¦ÖüOùÏ»«Sø¹8³²Î/ìO/vd“Êê[2p¹‹ìÇö]£!šùÀÔyµE®aãpãl¢bƒûõµXgE\+µd —J¢ÉE&D'í�yÂíׇf-páü˜3èÖjF….­�Dr¥ÞÄègŸÈ%1É¡MÞÇ÷9¨Ü·g}vªC;KAwZÓ„@o‚HfÚ¼“cj}ñ D¢“¡fbß\É9§:6�&Þ¯›`¨7ÜÐ 6Íÿ:mÒ¸NŒp£ô6ÆËPë2n’ÌtXKL›ýœEèxZÛN ˆ�\ƒõ±ªµ~N{ Ó¸®rè]Vî§½È4øs™=¶ ³KAo�V ÝÒ·Fy C×qžfë�ò'�¿>ðÇS³I˜'xÌBÏ T nDßÏ×b­(ò[Wê „À½À³6ŠÌg�“i¸13Ïó4iëªÌÆA€U±ˆ³ÜÜÚfx@ ÞÂK&­ët¥Í%òõɆ' Ž¿„eêZ!­!®ã�æ¶‹ü×´YC5-�¦Ûn•¬À›º½¶ï²°‰¼ØeMßG­t¯8í3?õs ô¼Ÿÿ‡Ž*PTiFƒ»Ãç6Î6qžöš¿ž]Þôo%žŽ‘pÝ€Go{aµ&”…”ªÏ îüЧÇR \W¸ðÆùÛ?�ÐË#–Ö©Ý9ä`߃çlbÑu¥šB ßžÏ|m¸ªš@šäÿ©ß¥sÓmGcIëDI„ôo™ŠìQ”tŽù¦&�ù_»CI{ PnçM©­µ\Ó®x þž·¦ÿñ1NWúÅ JÆm�%‡¾Ye¯™<@:YZ„°Ïö]¹8ö”Gê8éx=ì�¯u¼þþ#n;ئÎóòs¿û{�z¯½Sáb›ÖL�Ð‰ê ²ÐݰêŽ>YÿEFgÀendstream endobj 204 0 obj 1649 endobj 225 0 obj <> stream xœíZK�ä¶>ä6ìKN9µsêA¶‘¢^kì!“8Ɔ³ÙL�ÃŒšnM·¼j©-©wfýë]|›œœA`,Œ]«I‘UõÕW_‘úq‘ºHÄý÷zö§÷Åb;�%‹¯á¿íÙ�gTXè¿ÖûÅÅ% *s1‰-.oÏÔÔ]Pš�²\ä%I¹¸ÜŸ-ÿúöýW¹<¿üfTÔÎà) HļËÍÙò##‰Â8©ò„é§ÿššQ>-¥U¥Ÿ~}l7�zMÜ YY�Ì̤æ÷Ìþ¾JKFòr‘æ¤ä°„Æ*’¤U©g¾íÅ3 ï²+^-çq8_ñ$IHž-7ÇõÜýù÷—ßœU·œµ,KK·­”äîíØxó+šg¤` –VT…{¹k'¹¿¿áh|ÂIéžn�ORJŒÖr7�ùY<‚•ò„æúQ3ÊUhIRçùZy!'©³®ÝºfßÈ_x…™ké±<·Ë·ò)xµ¼9_±ª*Iž/‡y']Á-ЫvÒ Žq»ÆvÛöu§ü†`ÇaO;ׇZÝm‡•´Jó ° œpùËØÎ»½´‚áÕë~#·Äwk ÇQïãd0I%Lªå¦ýíZúå•4³H°ÇîvíZÎO1öv:`h·wâQ)q0õ¨,“ÄL\×]×l÷€¥{•rϪ‹8¨$UfwA‚÷”ÒHö"7+ìRŠó£�*�3ƒ>pY3ïŒ×8xM:k•ÀJ™Œ%)Ê-šá€OC'M+’¹x5¡·Ýp£à“f„ÇÀxìÕÊÀÈ롟æ±næs¼Ê¬lá( Ãan÷íO6ò oö07�?Ò-=ÁV*R’=ózÒÖ§aVtŸš¹Èt‡æMóQ3™5¸é†ƒ¶¹È—�¶¸ ‰ õÒ¹qI·f�OÚŸýß }3éLaÎÍÍLêŽhNEq¿¢Ù÷D9wÃßJR†‰l§,e1¾©¦é m @+*G;TÈ€}̈½¢4x1Z͘†Y®ß!æ­‚Kæåg}8tíºÖìYá• Ó%( ò“¶qö}¥C�œÅB*~¥OÑ#®fr¼�ì•¶­rÛÎ#ã(×)ˆ¶¢âãÞþ­‡¡©‘ºk».¤¬¡Wðó‹ÔÍØ6×£üAÀ˾ä P9­ÇVŲ§€•D4¹Wi ¹RT¹rD®“"W†eƒ)ÈÁViQŠÚìxf­ˆQÿN1‘—­ô‘Ü�ðus?7ýFA˜½¼�u0¸gŒìì«k´wyœb$�šÈÍ;#„¿]»Ù¨bž–8¢�qÞ¤�_‡#_:/å(ÒÄ®­ÎYF<ú,O­äxƒWÕ«P„Ð$‚iñ¨°¯¾F�m¨øÝG�ò‡´Â,Úö0~/±$ScEATpî¥õŸog=5Á8«u’˜ÿŸvÃ8ëaÞ A©ÐŠÐLIê ʬÀ+hó²úŸÍÚî`BŸ/€šžÊÆ K²ço‚�8änWÏ!¶E%Ô+¤¾Ú~ÝMNä¼–È‘Š�ŠÄC½ÖaG?(’Åò¥ÞšÉe,ÑÏr\¾b˜…:¤_Ž:­ˆH÷)5Mtf¢MúNGÑHUX d%¸¨×"WÔêü¼m•.È &¦°"d#ÎqàvFsèêÞéŽÉBëî5H:p #!È­ôÎ8v± ?ñ$EIò€êžˆª 6âoX/e ¶ëå9v°' ¸r0RE§¹“‘2y¼`NZ…eجfTêà†ãÞL³~j©ìد­¦àž)±¸¼ŽÍÁÒ ÄKí(­ðâÓ°WA(qJõ¡î;î›ÔN§­=6Ó±›'Ý(0`KWg3›ô�©ñ*H9‰›“Ê;Uªäª j«ÊåÖƒ‰ƒ_ÅiÂÄ?¥‡ž_ÅÖÓÜR×ãj9wjÙëbðHSâ!Èoü~7l�ãœw;tÝH%(øýVËmôTÔ¹×ÚW4qNeUF`Sâ@Áœ‹ è@B¢ZFuõEö^/ßiä.*«²ÅJá@½5 Ék¦ <ìúܼÏá –Df«ÀŠù®™Í$wôâ�úËeu£gÐ 5º9 Ó †÷�*Ù{3€ã7HƒVIä?ĸï½8âa_†@΄§­l¼îuBìù&´à°‡‹›\»�Ìõx/îT(^èlšx‘È$<ìud¯‚êm;T‡ëÒ‚ÆNÖÐ(Ù‚€WfÌï¢`A”q['b�¢Ê«¬q®Á%Ë>jKª�Oì:Û0[NúI�øúM¸/àÓ*Œ«Äê¢×*÷pP®û(Ñ‘í!Ž ‹ÈOëoMr÷€&Õ{ùÄñzL°&ÌIéS0>±ù¶=Lë];ÿ¤ëk†Ž~üÉC?·ýq8*¶æ–hug•á6,˜:Íuá'qHÝ]�‘@zGT8q# ‚&O¯‰xËÃaŽ„j²ð…E‹&0.}4(#ÓqmzPD ³nüí¯h%¡If1d„9; ñ6© ­!o"iéÉúü ˜‚ ¥¨õô”W=�g qè›Õ€°›µ¥Ð#š a"Æ2Îë–ûC[V†kĸßÄlVûcd1¯|)a”‰-ë;+ï@©‰¸Ñ wº]g)î šp ~J¾ÝO}0íœtÚÆCƒ¤ÏE„‹«å´-¼Ê ÑXvJ RLçÕjÚVejgxQ¨|ãì@BÇ­h–‰ÙÜôˆÑ?šËÄ®ò4iÒ‚9ó”`ÝMCèÄgKÔý0*ÕYáTß´Ÿ­AÿK;¼ÃÛÿE›f¢Õ^˜ËÄG-ûEŠ6"iaQ–¤ô¿&iQ¥¾ˆ·;ñþ}$Sð(eÇÎ?OªKŠ�S ž7#š®ðØ2nRî_Dü�“S êaO¢£«Op’G ¹§,�°Js`M†ÎZ^ ‹>S T/†Ò(�W†ô´2Ä苹Ù_>Ó „õÞc›È´l} <¡þÉ{£‰e÷¾5GµX`©ssî•k´ g çg^—xÚZÉNZ ¼ÊNWàWä…Žcšþ:ŒåŠAuæårZ*�_¤)P8'ºRøS]y")}\„›öÙá%Ê2MUùøUYþ*Kö«²|¹²”‡™bôÛÈ9‘Ï¥‘x—BÖ~4©f­æÐÃà Â|mä>¹©»O³8|V‡õY‰u‹<Öð5ÄÃw]%z4™€ çšON‰Zú*¦U&NSr·w÷J}tÙj£5ôæ3$‘9N4¸ÛWÿË4}àN½û…wXr»‹{0Qà³BïÊ=e2d­óûú¦S7|@ô& ´ YÄ�´ð?î‘;¸t;¹ÿƒZ)ø~§À0Í�D¨d‚ ”FoÁ\ƒ†Ú›xpÑ�Ìs¨plùƒ¸mú¨îŒ’ ó©Å\Éy›¶ßYŸ<�\îúÊÇO—ðs-@Ê>þíÜáè®Èsç±íXï%j3üAÏò»an4> stream xœÝXÛnÛFí3Ñ�à£D+î…K2}p’¶*àÖ‰•º€Óš¢m6¢¤ðÇùúÎÞÈY‹Ž$‚"p /÷2{æÌ™™}F„†‘úgu°x�„Wm…¿ÀÏUð> zBhux´‚I©T‹X¸º ÌÒ9 )�Hš†2£$JÃUÌ^,_¿|¾z²úVdtX!8LˆÔºÕ:˜}`$RS˜ ™Œ˜}Ó–�M¥YfGé«uiö£Ñ¸!K»•Ì}�‡ïsž2"Ó�K’ 8b˜Æ2ñ,ά¶Wf5ãé°:ŽI”d‰�„ïÄ„ÏH…²4aÏ$†=õ!„ª™pn2^âì:ïÔ¨ˆñÕªV�QI8Û›~]®Õ)àhÕVÏNI:šß]—1„ã>/ô 'ñ¸ï;5”¨ý"·8¿šÀuθT„ŒÚÊÁ‰Î=Ÿ»'s–eÉÒ¸çïÕo“hÆ,ßê+À6ãåÎgk·Œ'³¢¯Ë­^ ¨ˆñž]ÞU;}W.0iŠ\2Š <Ÿ]è S"å̘Aa³Ñu—»ÞÂFÃxƒrrHš #—»ÍfgDž¼±|ÈùùÙÙÙ<_¯›²Õ.M)þøL 9ai”ןԇkíd}7·ëöÏ‹››A¶EÛ“rÝ/Ê]»è!6ÚE±(ºwÆN€F8 Ê'sE‰“ÙfSÞªå‹Ý¾«êê“ÁRáòr¼ ÞC<˜ØpQÁÓTÙ'`„1hÁÑ2X,�îéË`qÒ`ñ«úïèä9üZ¾^.ÃW÷jfÒ BöN–2%†>\™)ú´äZ›1ƒhÜÕœï œ&‰úôǶ(m,ÓqÁ­ŠI"#*íЮ×hyüºÎõ˜[õáp•Þ;Õ|aü@±úãÆ�Æk§8Ä�t(½#œtyC®>Æeñ¨eO ) Ôõîð“=ÈY_J–]þ!o~_þe|+…½'ˆÌl ôU½jvÛÚ| ·îÙ!Nó”L‡ƒSÎ~[}´"+G)lœ‰?M@<-¸ê·Ÿª½÷dXu¿ °5Ij.ŽiöõÁq‡¢=ÿx©¬—w­Ô°CÄP…�å¥Eá{?ó½Ü"¢iá ¨£!Ótq,võ¾ï,iÀóˆJ_èwHÂÙ¤Õã‘Oe«ì a(3÷žZWÆ� rIÜœ:·TæwÖeJ_†uÛÒ¤Y¿ÞèL° |C Üœ'�…Š}IÿN”ˆÑú}³»jòZgƒç@·ŒïÚoä.{H/í¹ïþÑi‰9ÆI"Œ"ªÝ�V‚•ó‘’H#lØh´�1‰'*™pæ?µ…Ú둾©6»ø Mϼ,k9¯Ì’hÛ_Øœ$³ÙºjÊ¢Û5·:/É×aEIvíta¬9Ç4‚l‰‘¡èÑ!2ÈGÑMê"^a !ß[]^mmpò sÀQ%³®c/£µSZÍ%‡` yjÄÍ @D.¯Ë!â]ñèþ®s“z q£[6;¥6%™8˜F™ªâqš€ƒ¡ªòÍÔÙ2C%Äùìt?Ö›ekL�“â�©öôÖÔçj�©¹9ÖF™ü ãšÖU°W4;k0î¤ön4ð­üfb '–ùì´ÏÅÔI˜ 7¨š`bß&w°žéå©ÏcåÉÞˆ§ºuÄIUqª¿PWœDK`±>5 ÖH÷{+†~3dHï_†cMù ÇC9’0/@T�M]Êp‡úi^ïMñê;Ȧ-›ÉQˆ:G§8§ŽzƒîŠ‚„z=ÿ¾G Nûþ Xz\‰Ö_gñêÚôÜ~Êo4€òr„bn2W Îù"P1D{Ûq•.çOäpO˜»²íl2zNÈ©ªa3[DÈ3çªM*šêª€@]ë(�=Y·•½G®Ó²p5ôö(‰éè ªµÄÑ¡õY5‘¸ DÜòNÃÜ’¨Í~XA�翵åL÷ËXpk[ ¡ ß*wNbŒ¸/Ä4:Pd2[2UXßÍ–õ¾šL•^ÁúË{Šqü=ä¿&öî eåã“åtšL@HúMÇè=}¨§ EC®øŸAvòçñ$×#Ç©‘ëù;SÕá.®_Cð3­WèÛ…^Cä2/ËN`H¨§-Š :Ÿ½�]Œ¯LЧ™¢†a´¼ŠÅäøz)øöÉ=˜jt¼D¼¯ÔDûò¦ÞUÃáí�r¡ß§©ûØ7y{Ã�P¡{ ‡äC[,õ½’RÔëɺAósµñkw׸ºz°ßÞiÅ æln�OûònÉtFÉÄ †Š�»oˆæ Úkflï$=Q21¢ÕòèØŽ"íôdÁlþçB(XÄ]³¸›Eèÿ5³(~§0o(eC¼ þ ’þ§endstream endobj 325 0 obj 1804 endobj 351 0 obj <> stream xœ­YÛŽÛFÝga�ý>Ò€Äa_xËC€xlgÀÉØÖ&ã<Ð%qM‰2I�ÇÙŸßêîj²Z¤Æ¹Á°ÇnöõÔ©S§ÛŸ¼0`^¨~áÏõavó6ñví,ô¾‡ß»Ù§Ó<ü±>xÏWÐ)�Õ î­¶33tÁ<ÆÂ M½8cA˜z«Ã̱|ûòvõlõ_‘±~„Ð!TãV›™ÿÀƒPuá2Èâ�cëڢѭIÀX–aë÷çrS˜ùX8LÈÓ$ˆìH�ßYØ_ˆ”qê‰8H%,¡º�T·Dm6‹;9¨¶—«Ù›Ù'OÂaÌÉ$ü…‰„I5F!õ|9»Y¾öºæ\Ìn~ñØìæßê�çw·ðcùÂûÇìåÒ{sAº¿BÉT¬p©!슶 Ö‡ÍøÐQ°¯We¥�á"à¶]­Ú˜¤mÍù¨;ªóô�w?¿V�EÖ㡚¢ ‰CcSÑ´e­Ç AÃUoõB‚?åM^UE¥¾À¹âþ˽¿®Ÿ-D†¥ýuõÚN¥§gq †¸w{s¸�yùü52„‹¾»»áªu!`ƒœ]š5Ûó �38‡^Î ®ëÃéÜM0Á 84Ô–Ê$Ktÿ3pt§œÚq|’”îkµ/u+<¹b@ð,Ëžøëó¡8êmɈƦÓûY0Áqµ#‡W†Ã siÑSMY�’¦¶Ðà±T·bcifH®#û€ Ù{Ñ|éöåq§#S¨>«¦4éÊÍÇv®�˜Òž›ÃÉŸŠå¶®ªi™ ø ‹3 ói(4L:ÇòÑtä�è½0Dýù¾G¸‘0¯uޱ(°\ß”M±î&V‡ÌÓù¤B¢Ïú‡üã8/‹)*rƒeÂ__~‚K = àˆÁB¦F‰)ê+ŒeÔG·Í'£D  ¶ñÔÔ»&×ê*í†Ú}}®4ä"¥òÔÖ•abFYT 9‰&ÔG³6§ýP‡d�ŃÑ|,õFuNFÌÆ²h×MùaÈÊb£S2â$1î}Ó2*ö ®0È%¥ $A\=,�F˜@’A˜üw0jªt²Oš¼E—ž=‘Ö½ãº:o �T#‚�Y�9åµ³ÂÃ)x§|­»&4 ?½W Ù¦|g“•.£'dÌ©4d7j �e®õ_„´Œ­°ˆË€º†C@-旅²Û5y‹È¤4>®€U… @¶:H«ÚBD!œ‚ Á¼z2=�È¢Yű_w{à´_e[7¨Ù¤ÈNùõÝ« Q÷ü¸A3�ŽBä·…Ÿr‒S5Æ4>`EHeTÛÁ¢y³i,¿ …˜_�2!IASª8 TÔͨJsB¸Y1Fh ;·e–»Ï‹ô ‡ÖÌéR' �E�JEŸ˜†\f áè•Í÷Txjï¸ÊBÄP¿$sôâêT_¢•×ÃĈ*ìsÝ�?�Ñx�r²&ºB’@NgBÒWáI»0„jþËÜpØô•uàø^”hÇàEcn4|ÚŠZß©�ž:qÍ;¬gyKíÿX7€�×¶ÝæM]•ÇœÖÝ{ÿ]¿8˜ïËÅy_³o‹#R”ˆmWXY"bóÞÿñöÝíûgšNÒ¡4ú %øÿÄ«܊ÜŠ a]·~�‡Âz¤SlÇZêEðAŒ&gÎ䧇ÃÔTàíªk$€S&»Üè‰5BTc2ÕÔ_(®m¾.�WVäšúÜ•Gƒ8}"Æýu-žÒw6¦º¸HŠ9V%(®ÜûMÑžÐÕp5à9ì]ƒL\T_P*IÔçÆò«y6UL{é òü¹)»®˜°:TSìÈÅt|ößßUú'ØwfoÉæ¼kÊõž�x­ãR’‹„€xK’&¶žR@/ÓÒw ÚŒeïæ­ ¼Š"Z”®™‘EÆñÊÀMz‡P;â‚n­·¤`¢zåæ)È Ùâ¥�•xtIÞz·Q)ÅëRNLݧsq4¬ví'V*׬ſˬqº´%Ø€Añxª0ëÀC‰‘%r)oè´%À©…;}Ç6.“^±[§ =qÅz�Ñs„ 8íɤ%1GwÂ/Kž;ãÙ>ˆ ºøÎ>ˆ�Á&Br%öóòÕ«ÛŸ&d4¦Q¸–“}JìëÒ(“ Rä•N20²vȽ c~Es˜2õ”Ñ׃WP¤*£<À5~¡<±óšq�ø®Ù«Š•›dçb×Õpªœº¦ËÆ/¥©bÍXB5¨= šÅžDèó¾#2ÏÕMŽxäî£�º¤D<ŒK͹í�3ôþu>�VNm�UB‘'Rý¬àA�éþ…¡/•Œœ¨¢Œ)¦T#.”Ðv¤YùB¿´¼÷·kc«£”æÇãóƒ�Óôƒ<êNøøähþ!ÜÎñünójŽ"O&ÝÂÍÆL’ÑSVswFjÌÙ®?ìóÞϫݡèöôms®å6©Ø,‹¦©›9²�P¥ªwàŒ°†ƒÈ„’Ü,·»ªþ�›½ÀÝ–høäøI³(÷I×{ïדÃh‚U-w‡Üt³Ý÷‚²'åp¿*7y—Ï1]ȪeÙ–¿™A‰íŸ¯õÞ ½ça¶¸@>¦.}ʵ÷þÙ«-_é[ÙWiý]Ó—‰H:Õfâ™wa»ô‘?ŠåÄ:â{°îHJμ±:@2¶*ûËÓpSÇÂ1y9p.ùu³12¦Øéû½¥$!ÏOô‚�ãKyæ¼Û•“Q)vW¦."¥§l ¬Ñú­Û §‘މGxõ°¥^Øh0ÿwQ;:¢7%jôÒì6rÞR}týŸ=ofÿŸëUðendstream endobj 352 0 obj 2111 endobj 374 0 obj <> stream xœµZÛŽãÆÍó`�oУX1ìæý!’xaŒ‘ÉBŒýÀ¡(‰1EʼÌx�ŸO±¯UbSšÙµ±X,–jö¥.眪æO+ßc+ú£þ-Nwø”¬ý�¿úþî~ºcbÀJýSœVÙ 4ž^â«íþN¾ºa+Æ|/MWqÆWOÿÝ—�xšxŒe™zúíXíJ9óí„7ã^¬~­úégxÚ7†£ØŸŽnæÝa<•b~8kf÷?L�2q"½Ý¢ãœÓž~È«¦jbß ƒ,½¶\“ŸÄÓ€áµÚ½˜7ôü¯�`êM?žÏuU7< ½0\Á»¡Ñ�Ï];U#ÞŽ2�cäâT<ö{€®Æ®ö þáEÌàEÈy=–bdàSï[á}–y²žÚ=ÃØ�M1TÒˆaBvÖŠ)"=éÓúùaó,õÒx]>ü°ýn²:O²D½p£o¤Òp e0À´Qõã/åΓñÁãÐ3÷Rk`UáÉð�“Œ8‚ŸH²Ë�Æh£¡¼+‹:蠟h˜Ãñ‘¥?þgûñÓ?þü·ù~RæñÐŒ«e&>�fRäu­"rÓÔCÑqîÚC—ŸÄ‹¡™©¼½#Ù9vÎr²´ñåt7 µîK9ܸ»�Ãz>_ â ]plõüuϰ»—â$Æ©¥Ò�™èrlŒ„写D±ZvŠPPd™c$i¹xÂÇx�¥ÂjzжûQ�‹ìËy×åó§Ÿ{µ<ÚÚhr™+T!^l=€EѲ)�hšÆ+�þ"$Ïbc<0v¹¨ß´#$ãæŸ]YT“ñÄ2Yˆ1Fá(ÇY–;IÒ GÐaúñ÷E¥”Ž�!c�æ0½6WWæ½Ì¢S¢Â—@g!õ �3•›†Œ¢XÉHD ¯G¹9�è© KƒÄå«2¢M”§õÙ&e;À,S^òTò˜:c¤øYM�1çÊl$ý˜�ùÄ<×ë¿d».ê? ¹oªÿf96Ï�7´2wU™p‰N›7ÚÄÄV°2ç\'0í …¤5â®^Lt"y`ØÝ�Wj²ëRÕ²¿i�_Öi!ÙÙLŽ}y¹¥w/ôÐv¦.ôîmÝ’Dó>˜- §Î›FàÓŒ �“Ê}ÄJ9¤´sõ¥êâ‚LÙ AŠ„ñKãp\r¨ÏXq—qž!;n·Ú³Š¶°×}ÛIr"Lè•£”ºo€!KGŸÛr"ö�Š—MÐë2•¹ó‰¬«Né/û)áWºjZÕ “¾ñ‚ŒñƯ Aqt’´.îìʼ¸G•ƤÉZæ]]©< YµvÅ,=Р[&m0G2=¦¥™¾Q¸ì%PÁz�¾ ÓbúÎ0Û)úNñ9cEÞ$l—É;rÝú>»ÖÖ^~’×m t–gGö�¬ò8ê "�çÁÞ¿FäW‚o‰Æõñ~SPWë6B…Ÿ‰<œ†§È•§aäØ%,cjÙý1#ÿú�SŽofä_­s1ÑBTÇ4¬–§â¨’~_ëT¼Ozä � ÅØ|hªËæ0çÑ0�ÂÑq»hJLyrê(#�îÊû¦¼l%YA€j†÷õÔ°>%M±©FîEJG d²ª/zɺ¦ &÷ ›Ëa‚ãON»RÖ”€ ɺ„ÿÊ¢2JH=6Md{ÁË7Xªƒaùh{Ô g„Þ7«Îb|Fí¹!r¡-ܳS|†Üö<§rZ0Yä…®"À!b¥¸wèòJó5nÖk4BYêUÑI¯˜K,s«‡ýzæŒ*ÿR¶ÍB{ÏcðÏy÷ˆXnl$»ƒ?â·:c£¢Ò\÷‡r�uRœ)'Q:va�èwaš…"Ò›º=¤uRv�Q'™m!¾R�r”| Qäu1ÖV•ÅDQšïR¸c¥)«+Õ£á�#0Ÿ>Ç19þZ Gi°9à˜{t㾈tã¨'d£†*_›†(ÔîÙ†AÚ¹oëÑ(ÖÈÙ¾‰q™Ú¸µÁ³”¨ôÓ�çzP†°¨.ùíVÛU ‚Ìõ’¦_„-¯–kY{ã1ZˆAU‚ºpòÓ…P f:WóÀyÄé‹#'M§ò6Ì#ìïg茓ªl™¡i{E1´½†_¤çcÐmz†)Ñ2�Z$§.z}ïR9ó›­êéÒÙ¬[­°Ê–wš…韓…‰#],ÌlÀ½‡‚©BºEÃ�ÃÒ¸ ߌ?M=p¨oŽ­=½Ìá˜\É|ÍUý4ï¦/qþXÉê6ÀÑsœa�Ü¿ðp˜­ 7Îoaã‹Öžì 1ütkJ6]9 õ×–ä~¦P…(^%€¹ù°„jú¹<°šÁÜ(atcäVŸ66§åø[µ\>Ê‚]Ù]õŒâl§eëùD;²ßµÊ_�Fù²¼¼få)vå‹~PVÒQóýzž7á¤LÑhbs+îÐ�nØ9â‘„Ùç`åÿ J9kå‹Ö;˜áÇn†Íàìƒê¾�—Æ*sR닯>åÇíÝ¿àÏÿ)UzÅendstream endobj 375 0 obj 2778 endobj 386 0 obj <> stream xœÕZßsÛ6î³&å™M$Þ]_ò£­oææšT7}ˆï�–(™9‰tH*¶Ûþ¿"$«éMg:™Ä.‹o¿ýÐç(‰I”ˆ?úçj?»þPDÛa–DßÃßíìóŒÈ‘þ±ÚG¯—0ˆ3ñR-73õê‚D„$1ç+Iœðh¹ŸÍßÞ|x÷fyµüo”ľ‘Q�ˆ÷–ëÙüK'bHšÅ%KRýôßCÝ˧ELHYê§ßšu­ì‘ÄLyçæÍ\|¾ I,¢,æ|+> )ž…Ü^Åò)�9-¹~úS-çHÅr¬›C½›®Pã�µ/$±¾,¡1Ë"ÂâR8.Æíºí«]í½úëtàÓŸ~×ìêÅU»Vo1ªŸo:RÄ̹;ÞËA¤ŒÍ5ŸtŽò8u‹p’'èùÇyýôpµH˲ŒÓb+®þ³üÇ,#qf'i”4Î]üôª |Æó±Óá'q‘ Þ—öï¤uÆæµ4 KH‹²0ówxú¶^›é‘ï ˆÕ®jùœæx·îdØäHãë³ô”Ĺ{[G.…eºWyðº[iw�=p E¿ÛH» ÍVa–ñÏsŒõŸµ‰{¿Öñb1e"`¹Í^F’äðÜþ"MŠ©ˆ ¸Z= cÓ�âÞ¦ÈÝðžœZbgÎÅá¢×mÜ hƒªvâj½>ò°~ûJn#àÒÍÜ´€ø}µ�1J�©Õ\¤£Z)àÊ·‹EØ ÄÄA×e¾�S˜Za Erë“Á¡3UmFKVì\ˆVÕn7�FÈa„ #zI3'>½l¶»î®’–�ZQzž'™·ÝáhæÇ¾^5ÄRÎ&RÐÅÿ;•FJ£CkyПLc3Gc«Ý¡¤R c‚™è–å'w÷06Šø½´‘«f³ŠÃ^.--qÞÞ(/hL1h˜dØ�ó 39¡Þ{(qÚnÔPAÿÛvxˆÇ[�äá-øSI”à@7Ã_t@4ò(qùÄx¤ð�(œ˜LÞ}ѵ4QUš¨Œ­¾VÙ*J—…}(ÚK—2WÌҼ˕ڛ#õ`⃦Öo¯¤ÅÒs¿§¡C¹Í.Û´ì¨Z]HIî2$Ã`ýfšB*CLdH¢FP$p p… ŒE&Ñ•ê�I a…>ÁoçºÊsL¤ŠG‰WͤÊÉÜ^t�F½̹’Ñ?OѶ«úm­ÓQ[o«±‘Fh�KY­ö’£P´Ó¢{ØëêäD—O²=ì³àØ4��vd”•xÔbèîA'€…z-ÃîÞxÌî§ÂçàË®S®€î³Òdþ¨€“aáp¤rò4¡òƒ$N‚¤MTkTëP³"ªÖp<Ï×x†Ó@j½BÒ�‹Õ¾i«QÕùóª’–ª�i÷Í/•a|V`º|¼¯Û)±j+°°—ë�ó¼í+xU®×HÛQó<íU&@�Gt5€;ëzPh�ì(²ÍK2 ; Ø¢…!Gû+ÐéI0‡hHO|RNX…çH@#ƒÛ«R6£ó<¿R2—¥LÌón9{?ûq–Hø&‚%x”r*@”奨u¢{}3»¾ùg4ö‡zvýsDf×?ˆ^ÿø~ܼ�¾™½»‰ÞŸlÑ<ÐDºGƒiâ,‹2!"T�¶¯žtåEds;'�{¢ðoSæÌqتûij� -khè·Äìho<~šæˆ7Ï\%°ï ›®.¸öY ü»bXTû/ðñÁ$.ÅEé¯!È…^ŠhªÙúËD\A$(�&À+Ô2$Pv¡¤{)ݽjê4R|“Œ/qÿѵ«Z ÝâC�ºÓíûZ˹Pe\®´1îÍÜÂ0,öÉ1ŽU»ÝÕDŒcùôS ¬ÔÒàc3Þh…ã³™Z�õ2qrnj"¼f㳚šÈ=E÷²‰À: ¹ç©M]Ï<ùým Û3\6S‘“ �Sð ÞM¢FÜÂŒ²2Ù²ùš"uTQbÕýúY×"TÍäX94Åí”öÅ]µ)ÐûZ )(žðWBTH>mJ‹Ì³ ÎbÑGñô:ƒÞœ¾÷”Þ®�^WÙª ¨¤Âk\:-”ÜÉPP(Ù³—>ü\�ö–oÚ¨iÜŽÀKÑË'-âQs:³è›-Лê}SÌ?SÒø8ÆäjÉ!ÖìàŸâe™øÕlC³ÝWÊèiQq{§TM³®ÆJ7’ü¢l¹iµÀ4Poë@SPõêüèõOϪIÅýºÅ8³Ko·[ŽKiŽBÖ/¡«×·ÆÓ2´4g ÛºØW»Sèå‡j0'Þ ÃCŸ"ž&b‚m6ø/÷êÊô02tz }~¬•W¹UqöœUðÐqð‹özÁ~¶Ïyûª6 ™W= ö<4‡o+B§Å&`êLß ‚¥.Jæÿ+SRà"5ªD"~ �BNV½aëÀ!¢w%yÊ [£ÌK–S× þž÷ ¾³óz*†%è�ƒ&™h*ýœ7Yã·G_™ö±¶„ïê´}ÿZ(¤Îd�Ÿø$ÁÅÒÑÖQâ—8+ƒ�œ Ë€ù¹þͨyôÖ"¿ì©�F$¾);½Rm¡0�¡C”|Íúr+H4šÌЗªGzÕ;þúP ¡ÏýK硸v¯ÿNè¡C!½ÿ?êÖ'"QॄA'º(/+‹9†…Ýù@¼¹¯új¥ïµrwbþG`ku[îví�Ä–¸vö4×-¾‡4·Nü‰8í«Ñ•&òÎ ‚ E ¥ýz¤§þÕêÚ‰&üP�‡¾UZD`ŠœøøIËv):=Rd§I±¸H BpB½gyp½Œ ˆoæC¶üa;…›QÏtÜù{ºÎ¶½(:¯tË jÆ-ÆëÞ;}ª á¶–TÒpÔuw '±ªš6$2Uü& õô Ñ:Øwº}få|=‡j2w“cc‚P>Üw‡ÝÚ¯šþÍ��LÝèýÖ;›¡ÞeÛ¹o™tîuõmqïå®}ª‡ãÈØ¶W,BØf5OÍޮׯƣùG6¹iŒ‚ë]w£pBW×Èk4šb誫µÔžÐéKC¯ÓÎã‰ïÙnïôRH‚8Œ¼Øý¯wè¬$Ü&ê#TïÛ º‹¥¯$Ì(¤%˜¥úWcPÆ¿i¤¥XÖÚ†+ðÕïÜéüõrqžµƒO·dêhòˆÏ½¶çiW—äÒå¥ÓûÙÿW¿=–endstream endobj 387 0 obj 2544 endobj 410 0 obj <> stream xœ½Y[�Û6î³Q`ÿ‚=@̈u˶M;m]´A“x± töAñȶRYrdi&iÿ|oâ¡D{º[ Xt§•)òð;ßùÎE‚�Ð ÿÓ·ÇÅó7i°?/Âà;øg¿ø° rA ÿl�ÁË ,Êñ 6»…zuEJC’eA’SfÁæ¸X~³~sûõæfóÞÈéø�`A(ÞÛÜ/–Œ„b ã$OB¦Ÿþë\vòiJ(Ísýô»¡º/Õ~4´²,%±y3Ñ¿Ópü}Á6) ¢„dŽËÖe×µòˆ(³Gs~ŸoOIô¯ëFü �¬Q}¹/;"wŠHå™Y»“k)‰íZt*lj×Vg½=kÊ}ÑWrqŠ+ŸÉÅŒ0»¸�òÑÎ]ѵÄ/Á—OgáöåC!�g!IGü²loV,Ïœd¹Ý]WÞ“›ÿn~X¬X Oó€ÂùþæP*—ŠÿŠå½�WŠz(Õ!91ËZP„Át²Ö,‹NAs£‡ 5>î¸k뺕§P’ÚMÕº„$ŠâÑŠ¦)‰qé$ñ÷â‡D¾>žcÀŒ›€yÖ~G®xá!`¢W€ ¹9hEÕB€ÓR mwî–ÕÝ�Y•Y¾G$�ÇU_̛ˠ1æé9‡á`«Ñ9N\…˜»;å01êÜKíVME<жK\ØS‹�»¹a°2 ÌÞè…a�L¼…ÛžÔE·/ÉÜuëfەŹœ[Åc¼NX54Û¹aœað¡ÀBJø„‘GsÖMÕWE]ý‚ÐJ JrlOÕxpŒ0ÝAŠO&¬0‡ÕCãpñÜ+—×ì¨j¡ÇÀy9Fêrü©ËÝ¢ˆç×.ı À…ÞÇS]ž$&D[5ýÙCgŽ�#E4#4 ©QÍþPôZ4¹Ë-Ç­ý¡TjäÒðQm" ´@Åàñò¢ÑQ4•FÉÔ­+–Q‘X±HõZqCa¿1@p×ðƒ;`�JË�[Ì·8KHåÝrI'�’D«B Hd¶9{y�ÂE¸ËòøÏî{�è­‘�H¾œôx*1àS�Ç$›zÕÚgNÁ>³æøÒ¦„Œg8`Uí¡�öÉŠ¥@›_…ÖŒŽ�1/sÎ&EåSo¸fÀÿ<Ÿhrò”Ÿ~*>VGi|ŒóÃpœg^¥UN6RË &r¤Öï,Ç îÓ ÓïYœÄ1®û²;V�MÅW¡PÀÍMKôj%üJ»›£�½~ ¯Ö{—©­]b´¡Š”W’>x‘÷ïÛ¦Ô ÃõÒ@%ÿN'ä|±�\�`ʃªs'¢Ôz%a¨l<¨ä.‡g…P.š6ŒŠ¯²¨˜.ƒ!F¸¨œ{ ´a6”†q,XÚ]éÛžbhîuÈÆ3f…8¥>VýÁ—°@'QÚíë“.ÌŠŽ“›;YNû—M«…ÍÝòצ�á´|lT�©…K2"QÚ×í;íxŽ¯Óžz¥óàID“áøLCDqæ)ÚA�´‚ÀÎE¿b”ꆞƴ5X™|&ý»»iu|²<êêÞ™ÀÛ |6ß”RÔ°8î¡EÈs i´¬á©ø×ˆ.%âœÛÍâõâC�%*ÌÂ`dÀrÑæÃe’\tåbhòr½x¾þ)軡\<ÿw@Ï¿ÿ÷òç¯áÏú›à³Åí:x}q˜âx=ÐÓ8N�âŒDLS ÈæùõnI=vHùO½A‹à Í‚÷ó@FlYü¿@6qMŠåè½§�Ãç,}­®œÍ€©@ eóÆt¼ üO»5¦Ë“MWô_Ì�Z1ACÀžÙyÕö¦Í�•ŽN‚PǸl’ˆ¹’;]šUûÆyMýIï�©;)-Ïê>È�:‰¡úâBQéD=²IF½ú�; Ã5¹ŒÉD�á”V$*„ücóLËTŽ%ÍS�?›·¨…ßQ~„öOtë~âäųn« (ÊÝúL^¾úíBs›+Sq æënç)Ë)Í4Ž)b~[jŒâVÔZô9â\©5¡{˜ÕØ¿,?�äôƒ’Hô)å¶/š=4‚/i¤¬·)K—Mé,³À9ÔS€d(Õ¹v…!_1ž‹™ëÈ·kôqF¿6á:³O_æfÿzó ìÿè©]¬Z�Šs[�ûR1.L�†¸ì¶ºˆ ¢½jÉ2¤°cq†²m¿ç‰Ÿn”^ÞÒº¥uWí+­4œýä!Zàݹf¦º&\ÅùúüyHp!ýÆåGh¡5Sá±3ɹŠ\òW‚€Í#`^[9îñG€Sðü…@ág#À™�ûjö3Hu­8ËÃÉxçÉnÒϱ8ir] 烙W+–ˆ™™ñªXõ�¹‚:•˜üijz;œNuUÊÛfŽä^å¶±òTàªv&Â{ /¸ª™ßïºvè«F}yXÑt3FrÁY±ä÷«ò0ý®1iVOËÓšJÛg¦fh.ᑜ4ÌS}Pžèißäã Û¦8š1BäüuÊ$Nž=�ÐH{3okˆÇüÈMn2}7 ¼å§irc õŒƒùÀç e�ce’‹joTÔA¥{çs�žêSUÄÔ´´Ðdìûr[�ºŠKO¼Þÿö?›Û7¯¾úqîŸ4ïECc¤ÖÖY8œÝJ5‘çC;Ô*ÒÓñìƒ*nÌON( ™3È,ç»ô9¬jö2 ¢Ð¨]ÛçÅÀ�åPŠEÛ'G}ñ«|hAR*tü4ÙµžC¼Óèòã8ŽvgCªÉvÓÂçµgçöÆÇOÂÄ3ÁáÎh÷îF¶²ÿ{½øC|endstream endobj 411 0 obj 2223 endobj 424 0 obj <> stream xœ�XÛnÜ6}_ä#öq7õ²¤HÝZ䥉¤@Š6Þ¢(¼}�µò.[­´ÑÅ—ôç;¼HZrÚA`˜‡gΜú󒶤êŸý™Ÿß~Š—‡vA—ïáÿañyÁ´ÁÒþÈO˶`”DjS°ÜÞ.ÌÖ [2FI’,£”š,·§Åê݇O—o·ëퟰ#eãÁÁ€ª}ÛýbuªLAÒˆvõ×¶hôjLKS»ú¾—ûÂøcÔ9 ’˜„ÃÎØ|Gn‚”’8Zòˆ$NPVmÓÔ}'+í.ŠI§Üz8=ÞöU¾[=\èoŒž&ö[¥×XB„»Ám™ô2�†£é팩”û¬Ëô‘’`\må—B¯n‚0!1G‘Ï 6‘¾PŸ3-T,ÆÙýËäÑ‹üP|7Ó$Ã1 ‘Œ':œ`†ÜÖ�=qÜè�é,ã,x:÷0‰·ßÏõP1üäQGkMæÌáרË�rP®7!ôŸ•V+]ÿO‚åÞøkƒ�ð 6¨�% ž†˜M¹Q¬eÃÈÃ1ÌÅC‘÷]¯™Ö¾Y\ô…} u”«CgÆ€yܵ ±Ò´h´FÇ eOÛU7Í[ªÅuØp1—†úsý‹Ï?�å u8¦ïü”Æq¿øøóÝL�ûc±|¡7Æ�5\�1­­Ë»iõ™ÄãןÊåX÷Þ]á$ Ω5�D^?½?ÊÜnA‚tœ>Eî�FQ”j+[‘[º†§D›7Ò )á±2„ qˆúµm¿AºL–vò |j; qU¸y‡â‰V�I_ÿ¿bËý“=½E8[ÉÅ´ÿ˜uevóվ؃Râ·uw4/,è�(榯,_ÆðÊ©ò‚F·…�±‘| 1ŇÐîew´¼Œf¦Ã¾ê÷]‚Azüà¤näAVF“½Á[ð¼ý¿ÊdåœuG‹O•–Œa¤øÏœußø�nòv0C�•p`·Ô�qSÎD™`m!¶["ÈŸãóÞÒ}k�…z„Òûi]–µ]Žñ Tì†8°—  fÔ é´'¥þˆ&­D)þs’¥©nÜ—ÛÅ/ðï^µqÀendstream endobj 425 0 obj 1773 endobj 469 0 obj <> stream xœÍYÛnÛF}Wûz”�jCî.o}K› h‘—:*ZÀé-®l¶”è�”“´?ßÙû¬¸RŒ A Ã0°ÜÛœ™9sfýn™�t™Èów»_<».–wã"Y¾‚߻ŻEª&,ÍŸí~ùÃ&•¹\D—›ÝB/]§Ë4MHY.ó*%I¹Üì«?]¿üqsµùVT©[ÁLHäºM³X=R’È)”“*O¨ýuƒ-HšV•}ul¡÷K¿!- ’Ù•¥ùž&îûš•”äå’å¤äp„œÖ´ƒØNÏöõÔÕ·ó-aGæoóBMî‡�rbÆHá?½¿o·ê¢`«J3z/‡RŠï¾íj ò«§º=Œr˜%ø¼é^YISRú=ýUyJ¨ðaèï†zOÔÝrüec¶ÉˆÝãÛN¨ãÖŒU¤ Ë”~ùv¢Q×˰ͭžËSwÖtߪ�)u‡55^¹ñz¥p#º„( Òdmp{ û¹o`«|n$Ç`{¬`×<JÝ&'•Ÿ=õÊޱŽãîë®S3e»TŒÓ‰ÙpÌm'ö#‰IHHŽTšªa7ÇÚl³i{¸‹Îð­¯EݘÐA–Ç}£!JçÆ1»IGdáŒÜ ýÞÜ2¿¸úxˆÍB¹4šÉ{Ê™£˜ttÄÌ,R’yƒÞˆé‰—¨Á»bƒºž`ÏíúA„™«¾r30YáÛiþ6Qû(DõNãL Ĭ+3욨u—8¬òCæÑ6×E47cß=ª¡Šdþ 5'-!Ù½9ï‡v�˜=i"óÆlø›:#Å×–«ç™u`{h§¶îÚ¿ë©Õ|”—8'�½Ôþ%¦Å¯êÙª”u#„â-• 6û¿C"4>º½4A�Vç É)¥, 8¿?NÇxþ¸X\‚’YÅ‹b=kd‰}gy¹À§8j.œ¥ŒÚ9K0R’Jú&)Ã<ÊÎÜÒ¸áÙ5͹¾ <©ÛrÅ|.ëÖºKNäšêTŠJƒÉôaŠDj…ÕAÌA•>BÕω±4ß1O1œê›'rQêè岸�0+bâ&([³€l–Â…˜j‡d¢W8I�£‘(ÏàŠw(9ì´Ï–9hö¥¦W¡Ô1ôuU˜NNî\b‚³îaaDšý¿*¦ TsÉ=Ó(¶�âqÊOAÁ!õ¹È  > ™<„åkð/KRÂ�Äp31å —ü£Åž è7Ñê Ñl�ã´íw&…汆G«]9OhN’�5ŸzÓ~#q0%%/ªÂΖC¥Ú’zWœÕð®QIiÂ0Ñ"5úÈÙš2mêür�fu®>‘iKL„†PóEÀ.ðwÇž4Vv‹ˆ ÷oÚ�áYNCOYôQ8~ ú5çÚ¯€K‘²|¾›ôãó¹­‡�Ö°CÏ”…‰“,ÌÚù�üVH²šÆYb�Õj½y´oV·W ¥bÌWâê�ÍÏ H•Eh–b*íºÞ”CD<ï�-Ðq¡Qñajc8j�ÇÜZ2Z³œI8\]t…íûy$Ò#Ê3H­ÅÅKÕçêVqÏINt´“ }h¬PV+Ó¡BþZÇÐë“5 cË5•SþÔ“fšdê3ž¦*Vn 5a)?¼ÄÖøËïS}«ïÏJW�ºvœlAÉܨG¹Ig ª[Öúã^‹N„Q\ƒŠ.اðÑå˜EûîxØÚ$çþÍB< ±R鎵•GL`§Ž`Ë-ˆB4F4B­>4&£íº·üfõ€MÚ7H« ©¡D™(†AÓÔMÄ’o¡ãæPio„7>x0Ï¿½šÏ¯Õ‰`w“FÈe˜Hq+î🧛dBðe@†ýÃÔîϵw�·{HåîâTh|†þ Ÿ^�¯‚}�°Õ›¬»È6%ÎßhØÉûDª$�¾1ÂÖë¯û»yñùJ®=h{7C1{³ª5Þ@@ÅJÞO"a1òÆ]:Ô!µåh_Qèll§ŒFMi�º=GqÒ´�­É3Nçï|ñn5PÁ�†pQÁs"µE |L©;�ª$2“€N  ¦ÕÞð= ºÚuå(…åA,„¯iŸtK¡wâ !×€du;'Ò�Vub´ûÓm�£lwI± ­|F7 ˆ¼Æ~Ìü¾w³jĸZ_¼XA­–á•бðâ~»°Ë@ñâ�Eç�ý^nDpkÀ: dUQ…ñ…ò‚-xj} * ÿS Ó9ã9¾çx¯2ÇEéý8óBíé²Ë”/D�ZVCC`¢�¾ÓAP  ¨[_> stream xœ½YI“Û¶¾+þ:j*#š÷ܲ8.ç�íéUÎ;p(JbÌE!)O&ñ�  4Dj©J*žrM ½|ýõÂß—¾Ç–¾øÁßE³xýs²Ü ùþï¿/˜Ü°Ä_E³üj›ÒX¼Ä—›ÝB½ºfKÆ|/M—qÆ,ijÐÓgló1ÿuÅ~}˜Ú/(Eæ²|@K�‰ºXÊ “JIõÝS]6ò&ûB›7¥ôBAÜi¿KÊUÆ4u­À•Ò`zF#¸.5ˆ9Ý%d'Kó–KœÔB˜Ù}áˆÈ�×§R “y¡_Ð`²çÔ@Ü��ÖÒ¦8)‹-LGT2¦o ƒñ?p÷�DÌ£äA}~j�UÔ§-úÁå!Ô‰eÄ ïWO K–zq xo·ÃÃÿ6ß-BŸ¢XÅ<øÀŸÜ9lÖà}•Ò «01FÿE¾Í¨ÎVžz‰ÿ¼ºÃö*„¸«¡²GD8«SìÊYíÒR‚4«�A×WûªU¤îx+dF“K®rsR^ïá°ñ C.âŽy{Ä];õ3¾jº‡uàûàœlµ­^*§‡­y¢iÓĸŠ:°qb�w8zsé,Q·C<ÇŠvÐ&eE1õ„3ÐÚ r Â[¹L1 ѦÚnk¹®%8Kq!½#•SÚ7ìÂh€½R‡ñ+È •`Ì«v@Ò"9m5 „ $Ì�Y¨Ã@ „å)¸…$Nµ5Bª‹MáT뢫O�¼’ î†.u˜%³è‚.˜$*´\Bz>Tº�BaJc¾w‹ÃÀp±‰ÏØm'ˆË âÃ3²I¦M^ת†#†Ø�Ú¨ßb# ¬œ¬qrÅ$)ÅŸÍòÜ,:\Y‚§DàAeÆ"”%rñþ‡v.U¶SZRDÇœ˜Úå=ÖEÀ¿�àC¸C ÐPÖL©¿ÅvÿM M3÷iTµª:`Ä̧fR³¹Æë•í¨uup‡TŽ3磖1娓Dô Â3ÕU�BÙV;'¥¼Œ6-žòþqâúU®L Ž�‘·Î1€9¥ bzŸúû†éÓù�]°©däÍZ/¢ ¹4î%.Ðd€zÈÒD1KéÆ!›:ÜY5¥—SYT³•”éyŒöÛr(úJÙØ5¨ê%£oÎV*}™ØÊÄÔÏÏ„AýËÉi î%¹÷¢8QÖdƒ aÏ1è'YbñNM“«¤û÷wŽïÚi4YKhu_am#n�±u8ã+î6bÆW„r×wRNhÞÎtn¥t¹WK€ ¡K"uZâÝ›KtÿÏs–«Ì'û€-u–'éuÀ¨CÅpªùõôÿåv[ RÄytjÀ¥ƒ�$M€H»c©»|÷�i¶nrÑdÎ ­ïö}Þ¨ž†g‘èi€…¤,âùWe­Ç=Qž„€/Ï32þ¹2?tÇ3zÄEsáysT¥ŒË½;œØ¤s†O Ñé:(£/PzŽj&è6bWL=ÛŒ AFË|4¶¼+q?I`±“„â‹ÉÚbvˆóÊ„š'ÁL]í:ý˜+ŠpZš3ye_~�¦‘Ècd"‘ž!ØIáë5Pö¤ˆ¥÷«Ï×—þ=¬Ep&A¶’0A Q²Ò�21W¿ú×ç2ž}'Y’†ÎL¬½!²«?§ØUÄ”ÜS¶I�3ŸTèD@Öd†òiZqë�GÀ$Og¯? åÌ^+‚;Ì»émÝq¬šêO•ÀEü¹À†ìgdîuA§fƧôñË¡*dÆ_ÞHõL^›Z cÓšöš �¨•ÚNµÒéžú|ÈÇ{Ë�úó@œ8•u_ž�qÒŸ |ªÞÝòba–ºãÃv컺F%ž^f\p8jWÕˆç#’BJ'˜P®¾–n‹ ¦g!À¦@Ín*ë:ý‡g•±\[½†ºj÷¥šâ¸ê~וý~zÐÛü©¸}xy¼mª½q%OcJt_Ö£*�óÌǾ*>(wewiê¢Þ_³è5÷}¦j\‘ã®�ñ¯1Ÿ¶Å÷ñ)ô±^NÝ/ŸÕz[õe¡'åÌí—ö/Ògˆ’:²X$k§ûïƒû<8i �í©ÇfäP\¨y³Yü?ÿÔ:Ǭendstream endobj 479 0 obj 2253 endobj 495 0 obj <> stream xœÍWÛnã6}÷W苃…Xo"íËv�`mÑnÕ}iŠB±eG­%e%;Mÿ¾Cê.Ê‹n‘‰"‡gfÎ\8úPµŸöw›¯¾þ‡zEƒkü?¬>­À íÏ6ÞÄ(¤•=Ä‚x¿jކP¢u  ªƒ8_­ß¾û°ù.¾ŠÿÄú‚£µçâÝjýÀµ"L£(kW­ÓÊ­FÀ˜võúœíÒèÈ4%Z �ÀÈÄ�GŠè€ã—@ VêÇ$w@œ’hÀ/÷v 4ƒ}÷Uy{Ló]rJìfÄ©ÙÙgnjׂ>8Sߥ¥GI²"³›!(e)A„Û�ÓúÔª™©8×éÎ-bf*P«æ¦”-+@¯A "UÀ5Ñ‘‰Ó"­’£–”È2+öe•'§¬,|ú:Q ‘#ü¶/þ]…Æhq³v@)ž�Ü�«ßã÷+F Õ*þ¾<´ÑWŸ£õ²¾V¨õ“U2eíèÒrš‰Óªný†tÁÃô$Ü…M+ÄÅ ö@¿¸¸†Ž{) èÜŸ‹mÇeØmá9G£øi÷H×Û,O‹Î½>‡Š&­Œ�É( ¦§�i†¥4˜¹¹¯g?$dzã˜�$L�GRH#r¹ iãþœÆ’Ç,?Ï](ÎùmSºSÓ–Jk¦Ö—uÎÄŽáfûf�'�û›+ÆÆÝáµ�ÅÐTÚØ)58ºåOdkvÂÂé UQÃÞ�Å�C1jb(Ë9¥ª7rFæÇ."ؤFŽö–ŒºÉþ�ñ¼mЏ-ñ‹¬„6† 7¯(q3ÉÄëlJÂ}ZmÓâ”Rßá¿“âÔ4&?#—–}.�ç¦ ?�æ×Qû«N{ïz›¾iRŸ«t–ÿU7ÿ?Š{α"³£×i²ÚÛbÂ�P/qP�=½ïË"­Ò¦ÊYÑöùIcºÔû’ã�îr¿óôf�rÐÞK�IŒa½)ÏÅ®^(©ÂyHª,¹mš=Z9*›ÇöeÃøwÞB¤„v}`Dì7ßúÊ3ŸìFnŠ#È�sfo®q(ŸÍaö²~æðò—åíó‡W¼‡góbë>΋‘jÇäwÝ­ç|©u°ö.«OeõÏ´؊=Á´ˆ[8øJóeOs�Ï̇ã§/8fÇJå^LFÓà„«Ñ ÿ•ÿBpy"þ ±Ï³fŽ�í’�0SeüK+´I.AP#Z˜\ÃÜ?$ø Q”цEŒKºˆ"|97/Ä7C´]KÁ€ÏPzŸäP4rorBE [4'òQ´gN„4k8:,¢hÅx(š€dÂP„1—œZŒ1s C(hª#Àr�\´¥ë£õBe+Üp!´4JÍ êb` XÌ3 ì,£W:’r‘"XHðóÇ1N#tP¹ØlâÕÏøùG:³endstream endobj 496 0 obj 1073 endobj 513 0 obj <> stream xœµXK“ÓF¾»ø:ÊUh2/½ö`CÁ!•€sÚå ,­W‰%-’¼°ÿ>=/©Ç²�,lµí™žž¯¿þºÇ_JX@Õ�ýÛ¬~ù�»aEƒ·ðw·ú²bzA`ÿÛ6Á« ,ʵ‰›»•Ù±€1J²,HrFhlšUøæÝ‡ë×›õæoØ‘³i‡°€ª}›r>rBÕ.IžPn­ U¯­)a,Ï­õí¡.+ã�ÑÙ!ÏI¤]ØY€BŒDœÁ‘�LÂz™TË’”$s(,Ö{SA2k‰àNL¤I–ĹÔaFL2"³€I"í¦SŽâSŽb.dž‰TGq7VŽbuCµjÌÇh»‡‡ª¼RŸÄ13"wMÝ*« $�­_ëñÞØ}?w»ýƒÁÕ·wwÊÆ2¸ØdÛí»ÏÅ~¹¬›CCl�aæ©81ðÖ«ÕMSôO‹”Ѐ3"â›öÓRÿÌv�ªÝ¹@˜Oƒä�s‰ôjé@¨±„g∥¾Ü̱$�F–š3 ˜¥W%ügžb."~þòg!==ù^íÓÊ•Çùó~;v‚ïÒoÏØ¦dÓo Ôk®± †«£,ÆâDÛ¶kP«8Bk ö™Âì«á°—5utÝ›SpêéÀ¹Ö> stream xœÅZY�ÛFÎS„ ¿A�Äâ²^6ò’�76Q°ö>p$ŽÄ…$ŽIÉ3þ÷©>جb·ŽñØö`Èfwu_}UÝï¦qĦ±ú±¿—»É?~ϦënO‚ëÉ» Ó¦ö×r7ýaƒòT}ħ‹»‰ùtΦŒÅQžOÓ‚Eq>]ì&³ùýõ?7‹ÿÃs_HbõÝb5™½çQ¬†piÌíÓ?»ªÕO³ˆ±¢°O:Ö«ÊÌÇâaBž³(•v ãf—Ò ˜‹,�ò©€ÿ$,¡†‰ˆ©qð(æÿ±~_¯êýZ½I“(ä9l*+rÕìÊzïË3g"Ž`yÎ#îæíêF•i$†ëN=c<ô·eW­´p"â¢ÈíãÆ®ÄÓ|P¾Ú–yý›/$¦�¯ê]µWb”[½Á«öÐÖ]µ<ÀÛH½L²(–þüé¬üýŒ C£Ežã…ʽ–žƒôƒ™ÕXnǦÃãU5WÁ@4;e2’êù›Y·lëÛ›¹ˆã8J‹Yuó¿Å¯!ÝÚ›Æ(Îþù`ÕX`“傽o¬°DTì ‘l;òww×hÇd9ZêG1¶ìFëX«Ø~úföá^ïˆEbVµËc¿¿8·ûK@Ÿ<žå3–iÁvå~½5+dïå…ú8ÓzèµÎ RE32LÊ‹¢ˆ �Üá½±Hâ„«¶´xÛ7²^Éâ!:daâ_°ˆS?’I”B1‘8H›;½L‚C¦WL1RL¦VŠó‘bŒG!8óâXmfˆãW?¹‚=·á¥†¹z?q«õQ�ÚEa+(Öz¤�¯‡ý-+í³î�¬zOPâÍì~˜¾pR hùí7ê‹\fœS} ìUZŸ…Ö:ÿ8ŽŒCP_Ø­9wÞ®›¶>lvÚÈ.ª÷֢ȗÊí±õH€›S±°¥¤²'! Ë�Ziòì×�n2i¸¡TßÂíô"HÚn&vj«m}ÄÄQÞnàE@åCayH§ü+_"w(Åü}w=‡ä9¥ÓÖ�GÙ˜c�þÛPç̬À‘¬²sôˆ(; 8Ú�ð5B›¯×å©9+“Âyø_õúhÚÊ"ÅT�•#âÕÙ³½Ó‘‡Îæ|2e1®åüXîî·z I"ÎíT†¢¥ËÑ ¡§)ôýç9#ù9Øzu*(wqžÅŒ˜œÊKå£N"a[§:‰øôó4 &—<çUÈsp~ÊýÕé 8/H{%@fbÍYœγ)Ë®Ó'ÿ;ô™>[Ÿüsè“_+Ø-”*o2Ò/l«»Æøz2œž… Dó(Ab™:HC 9“r½1œÍ\[># tåó¥.-¦}'Ruè'’"°óò±îtþ‚„϶Cå«ëŸ’úÃU>Ù ¢5û\$2JqG°º×Ë‹'¬¤ÇAÏ膡^ž:�Âu-;uÖzÆz¤séz^Ük~œ+”‚ÖKмö ¬ú Ýxº ¤¸ÍR_ðÂå}î:üb± _õJ± ^×I-­µ‘¦ŸÊO¥£—ÖwH°6{sï„v"±G‘V¹mŒŽÇXz~�O…a¨mOI²ÍâL¨’+Z›ziñyüÆÄYÎð §YÙu@‡Ì•ªÇæ±ñ¡ÃÆÜM ±~ ))õ[›uõÀ5¢Uµl+{^+‡KePB±S"UíÀõwæ^™ÌƒE9FŒ4 –6ÁS™ì >Ô·ÉSf;¯ê^�¦È\TgÄR3—•Ø­OHÛêÌgPXÒ³öÞKýîëpi`¶¯¶TBõ�ƒßdÜÞ;¡ï.�’äøÓ“aK.Ï¡‚„´‹û¼ i#ñû`Žè6¥ CA®–àmvŸhþ·³ÿŽ|ߺ4æ$ÕãýÖ^»”¤;ê…žý�ÚÛ ¥0L/3œ¸TˆôtÔáLƒ€Œ ü¦›È³YÓÙ»Œ|¨šOÃ#Ðpröž/õñåô�%M Œ¡ßÞD¶B¯ú“^�+|rjƒ4¦ ºL(_¢�>gB”AH݈Laƒòºº‘tUÐý&zÝAùuÙ­Óõfg"Bq\:À71Ž{í�/,Rº–ý ’gg D´nÍX|-õZeKDÔ¯ÖW0,Øè8ß—”�@IÔàH ‚ —ÈI=L�<�6û¥�ð׋Éàç/¨±Kendstream endobj 527 0 obj 2633 endobj 541 0 obj <> stream xœÝ\]�%7}Ÿ_qߘEš¦Ývñ ˆ’á)â6›°(ËÇ¢€ø÷”ísN•›™ Y!!�¢h¶ê–O�²ë–?Ú}ÿv›§t›ëøûúÝÝO>ßoßüýn¾}fÿs÷·»Ô nøóúÝíg�ftlµÑr{üú®7}H·”æé8nÛ™¦ù¸=¾»»ÿä—ŸúóÇW�²gR‹’Í`®í¿º»ÿÇ2ÍÕd)Ó¹Í ´¿ýû›÷M»O)�'´Ÿ}÷ö«7/͸iÚ lR®Ÿ>Þýæ®sþü3üãýóñ¬%ß–yÚS.Sº�ó´žçv+³…ÖBúC·�Ê:å|6‡¿o<�Ó(äÛã¯ïî_¿úüOÇ<ïG²ŽL)Ÿ“E·榔[ZÊb�%•iÙ¶Ûû7w_ÿøn™ÖãLûퟭÿ¿¿Éwi]ó´œ7ë¢4�ý³�:è÷™|!GÅœOûNGø”ï³q˜\JšŽ‘ï~�yÖæ‹¦ÝjݰMK*󇩂îg±aÊÓž×6PksR ÷ëh-}s»b·gL%RÚ�mÊé¶l)OùöΖ·´ïeÚm ÖcŸŠÑÙ70—_›yÙj®ºE.ÓšÙB¯ÖTXöo75Þ,Ìt:<äÚdAºØ¿nñ²"úcÍ?(ól6ëbʳ™Ù 5ϳŒC~){Xnщ;åîÃCËsÍh�-Ïöµ+[ðÑe�Í-È’cct‹}�§y±t^öA3JS*Þ«�àÉÃ"ÊÝG¸¥vtö‘[j¹^Üä0r²K!Œqôè–Å*ìzx:JQóÉøÓy(ÙŒ™¶3¤ã’ŒG>ƒE9&µîÿf®Hn©¤–È4a+å�âÚFê­¼Û´VâhIƒ¾ÎµçV‹\{v�£•sË·°y`Ùe�5ìk"p,èÃG‹,d–B㸌–¢sMç¦>wõª¢S¿Ë¢�Š Ò/ ¦æ . MhAŠD¸q8ÕE*Zacw±ê±C½.²Ëe�!éÍ!¨.JÑ˳êÞë" È‚t0°GHãà�K™ ~¿}ÛÍÎÍÊÍÌ ¸˜]8¬S¾ `ÁŠšhuYáXe[ÊËÓVÂ’•˜¹è`}ÂVO¬„~èºÃhX:ÕÁžvìºî8Ãb¢.[ þ€åÆ-Ã'_ÞçWi9²MÖúw�¿º{hKÅÙV¦Þ~Õr%[^ÕÙËgB×ôy,§ÅVé§æ¹œ¬Oö3Ì„y>͇ØŠ}:½=ENQRô9L­ûçðœ�-H—z*ÿÀñÉiµÎ¬ ¶SØú~S/•²[>¬¡—\Ó£,År¶’C'”bdÓz©”lUi†Õú‡”†kz ŽÐ;Â}°«œ-È’cÕUeµïÛ¹>ÓU /ø®éõšãÉrÎ÷‚�”�AOµ§ÈbLª5[£˜ ^å^d‚¸„Ð{ɵqZb`Ò`"ªõdË>O�ûÞ' Ídç–ûI‹5ÕÚå”5—Q鈜ªèÃ'3²`td©îã@t6-ô¹UÑIƒn_lÜ×0*K¶äˆ«�l.¦3ZØ6?o�²FŽr#¹Ó‡�YÈ,…0Æ�è8¢óvŽUn™×uZOʹäXå({RÒIÇö»OÊùÈý;‹Öç«å�”² A\B¸–—þ”1°\'+�˾òSðÛE� ƒ4ÚRêØS¶™²•h´]Ë”C—A1É‚Üpaÿ‘•ÛÒ¹¯m³PZ9j;÷´Lg±žzXm ?êñO=òi3'?²¢¿æµÒ΂›Ît´é¸Øtü@‹š§ë¶]fOÖSÿÖ¸¦ç<+2¿¬Ùþ­aUw‹^õ�23Zä¼ð��}kÄB`)„1Ž>%Kµ3F' ¸åì ÷bßÖi�‘Y‚`Ö ¬XM‡ïB]VdÔ�È.<°F@Ÿ‚�Z�üÕ6ÓwÇ®¯õܰQè¼W[imqw\Öí˜r´X7ìe€@Y‘QCnD wúðÐÈ‚dI„KˆŽ#©Jçš^©” (dÊU:å“,�oB ÌRäš^¬¡3÷Árç,hA–Dã¸D§rçšV²Ûë™ü²Ü‰?o¶¦Èzäš^±¼}¯hî€5ÏЂ‰0†ðqK°²Ogû¾>Uó¶ôlͳ�þËšWŽgjžŠ6·½RÔ}«J>6µš´íå¬AÌ)­1þÍ-©ä¶ceCìg…¬¯|Ë‚L{û‘x;Û|9Á´ÕÀZ¶¶|R4T4B6ìm±E²kõ°ÅhÖÊ"XØ2¿n{s HŠÎˆ�I˜ð È‚t0°ÇùÑžŽ>‡èüH¬™wó{x-¶µ€õl¬Ö˶ÓÖåÛ¶õu:$kÕM WÝDછ>|ÕM´ K"\⸠˜¯º¥Áš™}Æ55{ÕWÝìwZpXˆ Y«nj¸f&×Ôôá«n²�X aŒã2v:©¥¢�µ²ÇxË>õ“Zöº,0*­9�ÕJÑÏZÙ˜G±„÷ÃZ …èv€‘ý’¸¦oã‰Êm>ýúA™¹E'.Éܤ»¦àÐ�}›ï>xà,`!–@¸Ä1¦c8 ’‡9H�õ UÂa’IH6!HÖy�48ÏÎ{äC'BbA ²$ÂÇeñÀt”¢æ“æm$›fv¥£æ~Y`mЛC`¶¸¢e“#Ù¯tY�.ömözaµA:ÎÜÖÅ ‰ŠÆé8R«Ø$|T9†tTÑÂRb-lA!Iѱ1 ÞC"Y�.öiÞJ?ßÒ†Clj'?+síÚx"fë¿2…]äœÂf£ Úi4‘›´ã‚À¾Ë kY€šFò—Qò�¤)v³+=$v¶,0B ¬È¨!7"�;}xtd! °ÂÇeÀ”ƒT´$b�1ÃØ§žƒèt¤Ì¦)LX�zâ  ÓŠ˜žxô* rDû�òG8µ–gÎ@Õ™4ü†SëNÌ R­Sœ¥ ⤙íp-`UË5-H�#ù1ñBHÒ€†\Œ‘!$¤�[ô´rÊŠLp¸Ë‡¢ Z�%Æ8ðømÞ’m¹né¬ÛÑúe<çÚk)ŸG-­íÁSYlr›ëIg¶ª=E|V¶úÌ3Øt9š,‡åüâQ1>ÄËõ|íÌnFÅhvmà‚ÏkÛ€™Yÿ¶¶zÖ—wÛ,/O9ŒÂ“>=ÿ¤ï óÄ“>ö¯z@>ôºØ­Ðå£Ñ¥éG/ýçðå#§¶hW'­ó^j.=i%(Y…n¢ÕóÝtÅyª›ò¾Ö�ÀÀ¶ÈÖ<×Ë\ÁšhD¤º¶ežQ3XÕ'¶Ô VÐ|ûñ�ÃcÚ/ïÏW[j+ðû£?RýÏG²áÁkæƒW«í¤åúàÕæ·2ïQ}†ç¹+.'îíü~ѺZÉ,»îYL6wïî²ß/r ò&ÂÇpÛíåŸytÒ€Ï�È�'SŽ®dÐϵÔ¢ÜJÑy±5h ^�‰€,H—†s¼×0`gµ*1°3áñ9pϹ~ÁÝ3dŒ Îö»ì´‚°v®x8Nø.‡ÀdA‚¸„p l¶þ=S l¶‚´%l¶ Âìò){`4q¶§Øx`©®ó—Ms“?¼„¢âç ‡ÆöãùIÈBj˜E8¹P’ál#d!N?d�Ó!PöD”‰D&}x*’…,È›cãÙ—G' ¸ñÔ‰Üy.åÑñäÊ-úÉ–(˳k:7!€»|(:± …xáÇx:äÑIn<Î wxxt<q‹~bâ�åÙ5�›À]>�XÈ‚¼‰0Æ1½¼à†¡S�tMÂ3uà¢ʳj¤¸ÉÜ…@™EÌ5½Ì9ŠgêôÁBé,hA–Dã¸D§Béš^è„‹:(Ï*”â& pe–3iz½@¯†òÀj) ü Ùz aܡ¤¤†)…]´Rûì�”؉»Eß©;dOJi�RD`Êч'%YÈ‚¼‰0Æ1¾„è¨!7œ€ˆ;ÎHBtýÅ R­S,“ÁíH˜À]Ë‚d 0’ß+°OmTKX—¹ØÀ-�ÍãÞ2°l¥ìKc·è _G Ü}øÒض({8G8Î:pî£Ë¾4v ²$ÂǰîyÁ CWªU ®T³äÁ•5ÕŠ Ç�Cp²u!Pn.BlÅvö‡‡¶Î¹�ÉÐäš,ÈC —7y¶ÚÅÛ<›¹ß›<ÛR_&ô·l ‡7yd�÷t„@¹ûoòlÞõ!‚ù:›<�Û<² K"ŒqŒ¯„¤”)…[þJ9¼’o ¸E‘À(+)¥AJ )'JJ± YaŒc|7Ä£sMçÆ3È�¯nxt|¹Ã-Ú»‘~¥èļy'îšS€…(áĸ»ñÐ\Ó™qAâÜ€xhØ È ï^Ôž"ÝJÑy©u§íð Ì Ð‚p aØg¿¨¸†c�tE/o‚Eù“cH2£x³=E/É­¶±-*ŸÀUå^¤×Û�ôǘ¼6º¦W6½Z�ʧ—/Tùv ðîÛSdÑ’bûhÝ‹žÃ³,:Z� .!Œûì�…Ò ‹°ÃU’a²»dY`-ÉJDi�HB@¢É‡RQ,hA–Dã¸Ü1Ѱ¹¦w»nw`TtÿCæ"²À "Hf¿ºfÃ-"ô‘q;g ±Â%ŽËOJi�T¼ÝÁœãýOJÞ¡o�A²òRä•�wò¡Ì Z�%Æ8Ʊ Sš4˜‘Ðkš°Ð¯aJCÏ»E!HÖ¤& æ$!`Î’Íjb ±Â%Žq+êѹ¦sã>�ܹQô踓t‹¾ÑtÊôìšÎÍ:w÷Áèœ-È’cÃÉË n:Îo®èó“`1}ɱæ7Q“¨ �2æ W´9Jí1…Ƀ&9q�9`ˆa Ìë‰kz5ÐKq¨zmNõD/ÖÉ/Þ �2¿ë®Ùðòzµp¬'΂dI„1ŽñŒ$$¥4H)œN(åp~’'nÑO@�²’R¤”�rò¡¤ Z�%Æ8.T|ì¤AÏó–G†÷H|ìpÑD)‡Ö)NqÑßl‡á°L®iAjÉ_.¨xHÒ€¯†�1/�xH¼^" \?eE& ¸ ÜåCщ-È’c々t”É„^S²¡_C:öŽwƒ”Cëç5ˆH!¶C† X9(×´ 5ŒäÇ;7åHeª^¼r³Ž—D>ð‹6¼Æ±f›Xç.v¬»í¦mg.v#(‚ ¯ZPçW6ž´”¬ ‰V ~zêGÐEÙ’¡ÏEOô_ÚÏǺM)…×ø­TÎõM˜oÃO+h+þô�¬ø?5ÑŠ-Ý*bñRÀ‚&Zñ’[Q3`1äwŽž2 PÝ(r—ÑøãFOÝLb³ÜL"Š'�û W“‚£Õ¥­£Åð.M…5ô&ÓNýÄä|ÊÊ¡h{JVÏ÷Ôè¿[õ”�üA‡Õ*×nù«tHµHç·f~Èoñ#ýrÎì×u’•³-ÑÁGÀ®“­a¶ˆû°,ë´¬Çí!•2�VŽ…ÿDLá׉>ò–Òÿ&ìÿŽÃs?™1þ–œ~ÎnI[�Pê�¬¥%Â/Þ~óÝûöësÙ¶YV&ùƒs?m‘X^ú�Ú}òöo¿zûçoq Ñ­ÿòuï{«ùúY»ö rgÃ䝨ý±ª¶öÛwøI¼/ïÿõ×Wí~k¾óþõwhÒl‹‰û7S ±]äúÍÝ¿Bª}mendstream endobj 542 0 obj 4429 endobj 548 0 obj <> stream xœÝZK�Ü6Îy —ý}ìÜŠ(ê¹ØG6p²Ø‡1ÁÆ9ÈÝši:ÝÒXR�í=ìoß"Y¤ª$öL;Þ°0‚`Ôɪúê«ß­âH¬býÿ¿=^}ýªXÝWñê;øïþêÝ•0/¬ðÛãêw7ðR™ë�’ÕÍÝ•ýt#VBÄQY®òJDq¹º9^­ÿðòÕ·¿¿¹¾y _T‘Jx!ÖßÝì®Ö�IëW’4ªò8Á§?Mož‘U…O¿;©]c×ñ´`RŠ(Oñ‘ê62«¢¤\É<*SXUÿòGuêÍçú©¬J÷ÅV?þ9ì;óweÓyÞø¬šN3îÍb czqÜ«~gëý½”ÃØ< ”Å´‚jͪ’î\µ>Üw½÷GýS&éÊw�Q”(@ùþ!œÂ8I¢|zÚ|¨�‡&2‹Ä‘ÓØK{Š4Ê'�¸62¯¢|?¦LЍ“Z�Z‰›ý½:ð„NÈ�zDóÊ”éY?JýkïõŸeÃŽNc°JãGäø¨o¶cÝÞšá…·d›ï•±y"Í2øtoÔScÔ/¢¢jöõ®Ù-‚Lä i´1QGw‡6N©vcI; Xx jÃÚê¿Ô&ÔÈôFfÿw'8—+—›Öìƒ9BZQ)”Ñ H"Iž ËgÖ½©ˆ ‚É™ÔÖ šSÈÔu£Ûõ®¶½zs½IªªŠÒb +ÿtóýU{z�Ý®í e”çksüȼû;ãÞì�V�muoéAJêN £´$£Vq@.cMÉõ}mÝO /Xmq¤—Læ8B§¡NÙî–>vߌ—×,ñÞ®ÝZüúU’¦ÞW6¢¨`«8‚Y[¿ ^�ÜEDþë³ÝØX¹bz‚QÕ‡ÃG<@žNo?ŒêXÐGˆÚöÖͲI·ë�×›4Žã(N×M?¹˜1÷ö�(ó(-WÆ¿­‘’roÙP�=lI ÂŽÝCã:£n„ÞYN+vÖ*² wD['LDÕÞ÷ÍNYu¥ŒïG+½ Œ2m¶ˆ<"N繌 =»¿°H•™¤©�ÿ�ã&„O:dp‚Î]³ulšQ7}šûä ¹Á€ŒcÉ¥ý‹ÂÖŸ‡ �±;q9?b $Gl›#ˆ,«Æ¦¯5Š¢…2A3Šs¦€LAÐgÏi *+ÊŽµ X�Púz˜èË8žÖ Œ¢Ô{x$1ñ¼4¡'ýŠÏ’XrN½1vÍ—-R³o(ùÐï*ç“@Ô¤,DLt—O§+ÈÒÒ¢*¬žéyBÈ@¢Ë'¢;ÿú“›’o3º/Êé‹I²¯–tý›¥�¹[Ä�3Ä”ÞØXç¬Ô ct֫ɪ&'ÊüÁº4ðØ °oùâ];€!G„�dZ$õÜCPKñ…b’.‹Š¬*Šä– ­Ý¹ �FChãÞ:£…`žJößžúŸ’L¦±"nd‘PO›ï1ŒÈæn‹»SëDZP.x¬'7A¿Äx¿EH{Zûø€œM>nìyÂÛðÃ� ÏõM2®·A(Qj–6Ôj‡9Jº ðŒFìç�ÈQwkH³Íõ&ÓAºkàL¹È±(ñH¯lu‡ipLV™„S#Â¥–h"Ic½Ï¹oóA 6õ�„Š˜dèŽ�’MÖ¤ÁœMnþ¹Ô´ÿ�¾÷Ã2Ð…\>�ÔÃËpy^+ §í~™ÏŽû:ào›<¶ŽjòâstÿBgìz½ÀHkÒ`r[@lšy·}H""iôâ�öõ5®£“p§§/zBÀ]b C²ä½[°Å&×éY•¬w˜R \±<“€Îe^‚_®¢Aë?¨l¨&Ý1T°Ú+€Fÿ+ÊNÌiæÊ.´²“"¬ld¸™t]XÒ~Âñß,°Y¸ cår‘Üû»úféV<‹Ã 6“N%ì/Šÿ'ïyÞoþçsYJ@w*£‚¥_vb ‹¯–‹˜L?^L JIK¬3g•å3gÍm¦º™kîìN¿‰Ô•…Nf¥ÎÞõkØË£)ëQ®¼'©[µóNœe®cSØON3šoL�‚‚õ…ÙËUÍkìﻫԄ%·cTLfœT4KºÙOhORjÎê‘}7R^ÈtâçÔ,ªL>>5‘zÚS°Ì×?@¯å3-��Òõ“mFndšG¼Qz×wGÌë–À nñ¤¯Ô…ÑW’“[$&*»˜V«$ïìbÓÕŸæÑÖẦÕ¶lÚպ7ûæ#B…ô´X§†µ©|³©ûQ^ÐýØÈ<Ñ=Mï@¼B*ŸOn€äÁØÔ`ý”æK'"yÓœ›¾‘dç¬Ó\Áîä¦F¶|‚WˆÂ.\P¦[àË ¸?ïm"yÂìv;J¬Aèõ(×'«ü8ǹ•ƒ�ïàÜÊ­ gw"³¢ž¹8Ê@¬Ë| ·´;2"$ÏlΫCwøPˆÏ\ð‡`œ€5Üo\ÃW’¼Wºæm2ÒÕ³)вQÞ¼gì,“©gþwszÁø}‰˜{õÈ h_¡±«2jöèzt;.šmº?øö_EYÓ�±–)Ÿ2|bÿÛl˦›¾I™_ôºmRndRaÝÇ7Eb騗½í9ñ§»mJr[=µ~6b8«6>TäB%t�i‡¢ë¥+Í·êµoÀ²ö˜9¤m›É¨¹BîØ«�Upa¸�LÓÞ„šeÜmˆç>|v Êñ»íNmÀj¬KÚ³w©Ø2‹ máf}:b¤«ŠžTö6ÔÅ�Ì€ÕÀ3¶ E%‚“±Ü€!ˆŽO:.t‘÷{Ò»Œ©ÞÇ¥Þùdë’ész‘ê«€êi Cå“}>Cù‚MS\ C¸Ò‡t‹ù¬¤ºþ±=¨ŸQ£DYȯt¦pÄ¡ºŸÖ�}½3垟›Òñ«Îjˆ¥³°z quÜw&¡ûWëÝðÂöic^24nc*©›Ü;n«€ÜP'O$ÀÒ8àxø]Õ˜’ÏÞÔƒAIA©¿ ìàmŒëSÁŒ0àÒ’f{çbNHìe¦/y<¾l�ÒêÝb.×eQh;dpvs§¾Cx/Š"ŠâÓQÜLfÁQ¥uoA‰ �…%÷—ì|«·¾»Þ¡sãt F ã!žœ!$b‡0!9¾×®˜"~•–´úý3ËtÕ5ÓÉôj0�C*’‡Q„`Á— |ÿYtbf˜3:¡Ã5ŽðòI½�˜¥îKÁÝvn@&ðŽÊtÙgìÕvÄ›±w«¦ÇÚâ-$’]žÏš¿´vA~QfÞ h¶Ëäùg”•†8OôôºÉÔî ;tín/“œØ!¸˜�Ì …¡­¼ +!þ¿�CŠ_,rÁ€¢jÊp>mÒà/f!Áºé/iÿøILº.·œšdˆô2RÈoäJ�9Ô|·rhŸ³DÉôÜšÂÂUûÀ®2aXÞ¹P5»oÅŠ“æýÒ«]æÌ|¾’¼$·âäèÜê>0aŒKx6eÙ¸ Y ˜œÞ;{–ÉSånf¦^Z%°+fEΠD±¨'øäþ¢‡é”ûÄ0¨7êî�`Íeà$ËÏêàÒÔ`äÉÙ…5}v úz%¢A¨V†P{*tW3xKAµ-^¤;Þ®.%‹KðYëà™çÃ×S�''EeKûö&¡Ûñ?Èt̓h%xäYì!bb¡Ú›{ßÞ\ý þý ¬dÇUendstream endobj 549 0 obj 2890 endobj 566 0 obj <> stream xœí[Y�ÜÆv^ô’ÀG.ì¡Ø›Í(1Y‚³‰XÖyØõÃh–»Ke.ÍpV–òÛÓ7«†=ÇÚ¬‘À°SÍ>¾ªúê«j·$ÏH’ëÜŸ“Ùàù�erµäÉwêß«Á‡1÷Çd–¼©ARè—h2ºØW‡$!$ϤLDE²\&£Ù }uúãëoG'£÷ê�Š„78SrýÞèb�ÞÐ,×C(Ï*‘S÷ô§u½2OËŒ�ªrO¿Û4µ��äÝ„T’Lp7†zÀëÑàÍàC¤,2aw(3®÷(3¡6)ͨÔ'~y:x~ú÷¤]mêÁó&dðü/ú?/øVýqú*ùbðú4y³ BòÝP<ãŠ?O¯«¦½žéÍ uÔîPÄBš«=€ ŠðÔLde7ËyjGPuºtVˆœ7büB� $óH½³òÌ�~–^ž ‹<'¥é‹“ŸGÕ£Fyf^¨´�¬óͬiÍsVf,ìçLÿ…šN!¡æãéf>1â#ð ôüd‡åx&;ËñªÐ ÞßrEµ\© &³RË‘?ô¡',eUº}ÿc±š�§Í¯Æ3 ‘‘Î�Ûkó�*ƒ²Jº‡ëz¼šô]þÚ™¼¾^Ž'fF Ç´ 3TÁÀ;Kß� iU)ŒDZ[Û‰Œw‹v;)»ù7ó¦5O `:»aâ.xƧåÉ�iS²´^M6ïÌÿå*ŽÝb…7âGåä.pi·ú¤ž›-ã-Ù'2“ááYºtç�"]4s39¥Y´ïåC¦â)/«DÂíjvœSd¹ZC€r%tІj#& ÍJš33Žî°~絯oÌ!<Ùxº·u«¬€Ö½ìO]jfÌý4‡cúø“¢°ÓûW« ýyû2^(Êìvç¶OKÖ.‹ª,ÃÚ³f�¯²ÎVÿSqeö(@ñâóÕÆ¶ß1à#çýu îaÒÈ:³¨«ݤ‘ubq@•…%]<10ס øxÝLcþÎá ƒ>ùû;2 %–í|lÍ/ú )†@(àsûU8 Ë�é œ±P³h"°³\,bXåBeH€�¦×Ó K†”@öo›ËOî©?iGÙ0%Ô TÌ|ñiqé0‚ùzÙå�E[;â•YQt|ÝŒ§S³I–Cr_,ÛF%@ýœö2Ú¾D²ª'íx~5­×}Œ-ÏÕ±4´…Þ§ž±ˆx"F÷(OtQR@„h7@ô!Ìam½‹øE‹X2E©Rñ”ç¼s$q$VBå<²ñÄ Ý»àø—@nDШ MÒ÷ýIÄ54âq®·‘)ùf2"4_yðLodz¥µ‡ñšÎë�N¨ÄÐg#ZaýµÓ „¨oœèî°3]#…ÉBˆSÒ±‰LR9b˜À™îv§ùŠnG…JF‚h¼hn\‘¤¶ÏzRtÈTP+Ó?;>HÍ–JÅ´]EàÕÞVD è¯Â†¶õ–2±�ÝNä!ï8K² ©x’é…¶™¥ ”Ž‘óÇEŠ ÆžHAþ]X" ™ÿÎùvŸ°‰Í€ô+΀¼ ç„ó,µ G‚‚±:Œ±\ƒÓQ<×�Cðý\œC�u¤1*ß²*˜Ô“k„Ì sf?ÝU U˜ &HÉ38éÕ!ö€¹@òAóÊqÀ쾤D\ƒf?N2îƒ52ƒ0ÄÄw»VL i«Lè9„Æ¡ Âe?6 |ÎEù0>rÊ·f¸²¸+ð£5z3ŸÛê”å `ÏÒé¢# ÅÒ’4ªøÏÓu[/Í„ÄVžŸd}5w:w)d¨ÅfåRpˆåx¥ÄWíEÞè„9³’’WP µã¶Y˜çXý,æVÅÑíŠ}0ø€ƒA•á Rãæ…¯ž›ußÉüIš_ë‹Ì’ª+}|üЯŒ"íåÑN�b¬± |k™¾ÒqÒUgõÊJ‚*”ã©ÝwiJiÿpU;5Ò{Óiy÷õe}á¶TÒ»^¦M?Ù8½?Ìå»z¸…ºY7ó+k%lLu&@¤—‹étÑGñ£{ÙôQ`>þ¾žÍÆDdÀÐ}G[Õ—‹•I<ŒA·ÝL�°RH_{U9o¼sš&i˜‰d}j¥:&J™¶Þ\ –x^ä�½}o-Ž–S,¸Â3›|Jà‹ßDÓ>0GÙCÓ8Ï�@Ç%ÂØ‰T`½¥�Oß‹µðÆê<”´'xòÅ|­Ô[Ûç /4Ì4 ‡ÈöË©¢b2&§8 †‚œ: A瀺&›ÕʱT×ûTù¦u‹Ý ¯[ëä%w©>°Ô¥ªþ½3òî¬7ª,¨30°Þ±NÄÑG|é¤ ØköµJÀ\}k…3Ej¦¹Ÿ§SÛ.!XÍü¢ñ-é�Å- ÷˜Ts«#S.a”׿4ëVñNæ²–¼¶ÊŠTT]ÜÝ#¨éîé.WÎH¿ ¥(êëîÑ�Mÿ]‰ª…X�’Ói„Wr¸zD5â,éc :}ºñGlbs€§m•¡C1kDts㺠€ºêG€ß÷×ýMÉ@tqÛ¢ ŽFm‹—pÛò½v90nWÀìŸÍ®[Íëo޵­‰Š{ÚVËlœi¶ÊHõÃÌþÀ`›¸2”û/S9œ3›h¥.ÿPÝxêB‹¼S\Ñn$Ô_ñnä]l¹b(lNë!VUg¦ÐÐe…Mk™ ©*0ì'Ô̸€ÕXÄÆJT˜p7í<à†p¡…•¾ù{©¶Í.´Üe°Åï£./p0}æSDžé¨SsÜöZn»-£[F˜!Ûà ¥CrŸOÞ‰àðäVr»Y¨I> Í::<•VÒMIí|Ì¢’’«~}èDxÐZ£­#è[ %C«žÿ“gŽP숿9ádk¬†Šß¢0w½™Øï P¯¹½G_CîšÖ¾ãaê”ñ/}磮áoUPjzÑëäİ]éŒ_HÐî3Ÿè,kHTÜÙ­Ì~†ÄQÈo�=¼ ¿ˆ±Çå×”\¯ï:’””º®O´–ÓavÿŽ$‚"qIÊhƹŠOé?»›*ÁWܘ}øßBR‚%¨nÃè2Þû%H(–ÝØí(bK¸qØ}‹-BaFîÚàHÄ9Ìc„³Ã® çHNðתÿ…p¾U=:œ lÃ|ƃ€ÏtŽç¥XL3.ËGˆi&” ½mLGNì�fÿ-„=¾Î3ù…tDjˆ ö½ÏS¾WkÈ®Q­þ iűûzÓü9¹˜Õ%ÃÐþ‡5Ö®»^È4¥UjGçSK¾ÞÉsx•Vé’GÿÉ´‡<„“C¸BâÊKíäD}m�<â_ždòû™ÈU‘Ã=Q®Ý�þý*âìîN ¹Í±qã�¦%1”èE‚�ü1°R‹„§‚µ.�ػүWÓJ}³ÇUÓO ý‚¬õÛN¿÷b&”~©nF=h´DÓ/f•.Zî¦w1ýúê6¤ßè/wÉmå¶C_6â¯HŽû yËl*œ§Å�®„æÛT[E `á5ÂSsïí8­@;hßìxOÁ”»E‡(÷ñÿ ”ûÔu j`Hf~+E ú@ŸTŶ”"\ #þùØö­‹DËÍ�}¢…ŸƉöˆ_µlßÁÜò÷‘�1•°d�H…µt ÎJïË®8rß„{ŒåÊ¡%*}u¯¯0X((ò €´½¶·#à·Sÿ‘ ëî&cÿÅü9Eÿ×gè3èËÅÆ–�ŒÂœi�Ä?%9«~΂C¿üï"«–endstream endobj 567 0 obj 2830 endobj 593 0 obj <> stream xœÍ[M“ܶÍy£*ßsšã¨²Ã�à÷!‡ÈQ\ÊÅŽjR9H>p9ÜJrMr´Ò¿OhÝü˜Ý•I¹l•8 t¿~ýºÿ¶ñ½`ãËðÏò|ó—÷éæ8Üø›ŸàßãÍo7�°Á?ÊóæÍe‰|Ilö÷7úÕ]° ß˲M’žŸmöç›íßß½ûãþõþ¼‘ö�(„¾|o¸Ù~ž/‡ˆÈË_àÓU¯ž¦^ä9>ýéR*=_à» ExI„c‚DQdìÂ4ñ²Mÿ‰àrXèEréÙz4‘6³þ´þV߈cŠ�²;?`0õKè¥Äã~�<» u{T è$.&öõ_-Õ/€2ü¾ï”�9W¸IˆƒKm ñ"‚š?ƒŒùva¹*0€º…ÝlßVýí<ЊV 'Ã&QûP/>#dÈpmHÂ9Âò²Jn`^áÆŸ;8"§OïêbÐÎ"!PÀÝùOÐWÑt< è6†ýl[�ojÁ;TE_ÎóÔIÜNÄö88íO†”ˆ·‡ªì´CʱWɘå§52Î\X�?Ýþ a<”q2—ê/H°ad1RŒó�çN³3l×�G}ù2È}Ø>Ì™Æ÷Ò8g|á!_ìOzñ)Bõp;§óúñ”3vÔ� }Ê�šaAÅ / §¢E6N&6 ¨«_h£Ô¥ÏÇZgY‘°àX¢Ÿ¡8WÓJò8übÖRV‰2º­u FsÈ„4Vº¶ù6� ‡âduA vpÖ´ÄTWÝcU�¯’+MãÍ?eÓcLý\‹ºE?H”è<6CƒŸ‡`Ÿ³QHƒP¿­Ô¨p¶®Ï}‡H!ÄüEñ¡|˜]UgMõàZ1É–™|âOì*ypE”Mâè¾ëÏ*!õäñÔ#3•¶ÂåÊÐ1So:Äe>‘Šƒ “l‰#B‰ò�D±`)h쎕ŒML¤f=}5\šq 4ZKÑ:†±™å»fAre½ÞB±D²TØ_ª ÷ªÚˆçÕÆÛ¯cÕj[Ò�“’ÿ›Z"H=x j ߬ü?((‰ËRNÑ †(7xЩ:ʰÈ÷Ç…€`´k‚ÉL ,zh*L¥dbˆ¤»¦:øI2;¡EØS}8XJ>‰z{ä âqðlûC!I.„ €Kµ‹ÁýÆ «e•Š˜ˆŠO¨„²m÷Y§¹„š3qŒý…l?6 ~1Õ‡ó5ìVøa°Ù™BŽóý9(rY±¡ãmŒ˜e,%.wC5ÎËbŒ7ø«Ü†‹Fâ�?Í—E°ð±Ep�@° ™ÄTÛ�s™z¬¿0 VŽ¢IuP´Eóm¬AêgtßÞÜ™ïî1nRú}”éæÁ=$ÙúNÃ8Ãz�prWk(œ3Gžmq§ìK÷Ýu¦ �e`VK&™uNåw—ñÂzûª­@4Gê0å´ÑTEù‰1O(Ê'z-@8�?´Qçf"k£XãÇ&¤ôÑJ©ƺ�Ow©p É)—!g­Q7ø*,pD?0Øû,�º­^¨·"F´ú!è0^÷·¨ß‰�zXÛP1(¤œä] âe`ñc £6Ä$˜•Š—ˆt½~<¡Üd=”g,³Hn«£ŠÅˆ‰öub ‰�‚MaO†÷¢F$paP†¤°^ƒ0ëj~Ø s‹T–ÂÈÜÄëÈFÀ4ªyi�…ûŒ7ªÕñrXÆow'ÄK¯Úƒé90œ±l2¥AVûÔt r³R’ð*ÔÎ$3ç°¦ÄjPût”i)2ž^¯_cŠâár”mBìÕ˜‘wòo¼}õ ãÐ yïaD”ýXôØF 3ê‡Á¯YášRb›`TCÙ×wÊÜÜPV!ËL‡ŽcÕV=F–O�W1 jÞ�»—©ü`ž,òع~U8•ȼ gûG„ÕXÔ j¢TTLJ›hçÄð]�sX7"o2Ç^k)ncÚ–„*¡><8Kè¸i!v;§Üu–ôÑפJ°µË$²:ñ×K«uAkˆUt2/tQŽ�9±à•/ ʬT!'¡çR†ëâ,¡ó&α:†‘$R² I¥)úc5?>ùÓ¤r½×22ÈòSU2o5±:Ê¢�¼O3äé„Ý/ÏD™œ„Œ¨+hs°3•jè_Ëg¸U+€’1p¶zÕš.D2#ÈÏÆ£ÃDž¤@ê$M¬ûK[ªÆã~ÚŒÆVDLZ4ZMš9¦KÀ«‚A7’&€Ãì=þJ?bÙÌKS{øq6%;+ðô�ä,”ö'#éyó _o�-/KɈëËÊtßÃ.ëÏó/Y¾û#Å�k–t?-˜Ž‰™—X�ÕXèãÝ•¦T±Ü$ã.ž¸€¶ê»£‘0¬­¹‚$£� ™gV<Å«!›¼41hþ£k1eãSôSáQHœLQµ)FŸ:öøý|©I uõ˹è?Ï ¹øõ\„}ÁÚq3›¼°µ1 ‚À¢¾DVàò:¡ä²iââsMNñè~¬›s ‚…%:Ö žÊ°Èʰ˜›Îfº•ʃž,x~ù‹I&!¤`Zß:W'²»6«V@ª+?«ZqN£g§…ˆ{Ô{ÌY«ÅìÛ¬õo¬�—X$ˆ¹‚y¦ô9Øò†�å,H"Ù¡A0mJ�O»dž÷ÕCSì0¢a=ç/«wíýÜ~€ådÁõÄTM�zÄ… üîaжúÊ4’k¨>« ô#‡„¬¤×°Ø�/Ç‹®¸âïå~Ks˜'O�â¨�wI£¤šžªù°-êƒ" %Àô>ÊÊ^¸`g"²ûx¯×»èˆ„9âVã)'ÙñŽÙá¸u"AÞÊĈáí\ð=uY¦†rÓ"? èæiqéø§ŸÃ ñÎîa¼ü„¥žÉ5Ö!"t†ýß[Ÿ ¦ô66»V5­Š·žM*1 �xA”ò{ÀsÜ—­õÁôœ+RŒ®KH„#Võq*�ÖH{Y§¢®­çj^ «‹mö$´«ÇjýN­]¶¿Ý ÞWýó�5êÍ™ÝÝå®ÁÏE)»úb�p/xÑv 9‹%½ê;*%Ýí.{�§º1§ðD:}^™êÁ¤Ž„e ÞÓ2‡â|îµK6šÐéU[q„Á3{_d¿¯LFgUIÄÊ´•ª$Ž�Ü—Xn›×; †4Ì·]i(–^š”‰ÙJÿ[½:z† F.ç¦?¡6!þµg-ÓddUPÝÖgT€´a~Æ”5?ô^¬4ã… Žøés3—ëÀN˜Ú“HÊpKZ"eÒð ½»ÐgÕQ^šÂ´YžX‹3~JÂÄÞóD[Ý‹×,HÇœ[÷²ì¶àÉbvÓ„ìÜC“Gï°ë‘IÇ’¾¶S5Ä�W¡Áo0U_ëAŸ—,m×~ùNO4a-«ÈÙX„5U—#¾Îî°xˉÝKv­'§¼:]ºt‘]«¨(SXm2ïO®ÉÚª²ŒLd¼ø|_|­½Í8=ÓÑ.±;1št-"ºÒ§›+ŽÆ 5Fk4¦6™þÿôZVWM¿ÊÉw±ï“¯Ú¾ûÕÎÞ՚ީ܉\ I£ó \z‹�½^­RP\ðÊ&œ…æÑõ ÀéâfÆL?Ì�Êï¬üCŠ|;ðͬ¥fò¢„º1!þA� ÉÿÕà®3$ó/çúöÒ‰²¹¥Ï(D^<¾Œúê“2~šÙ¯ü,©ì±Ö*6Ž—ûMìÊuüÛýÍ¿àŸÿæ¶ÒZendstream endobj 594 0 obj 3197 endobj 607 0 obj <> stream xœ½ZK“Û¸N®ªTí_ÐQSkÑ ð'‡xíl&UÙZÛría&Z¢4´%rLRc;¿> л èQΣ\ö”9 Ðϯ¿nâó< Ø<þÀÏõaöüm:ßu³pþ³ü»›}ž1µ`?Ö‡ùË•\”%ÃKÑ|µ�éW—lÎXdÙ<ÉYfóÕa¶xuûöõO«›ÕGùFÎì<– Âá½Õf¶xŠ‚pXñ Ož¾ïÊV=MÆòžþ|¬6¥Þ�…ã†QÆ‚„Ö ^¯fofŸçq–‰ ÑfdÌ‚D ™$QeƒÆ/ogÏoÿ1ïÛc9{þۜ͞ÿmøçå¯?É·¯æ¿›½¾�¿9i ÆÂÓ¦<àÚÙïš¶êƒp‰TuT*Ò a“†RFk lE¬uœé¸ËýB¯ˆ¤vÖÐ�HB–ÀŠâŰ‚±ÀXêƒ~`ô»Åöf)Â�Q´xqóÏÕß‡Õ ·NùA½�~²»ÖÇCÕ«çqÄVž»ár;i ¹_ëµÚ�ªÀs¬èýÍ Ïñ =Çs1õ?÷œH½žK‡GIœi¢<ÇþèšžÅXî_šöPì«©ÈIÀÆ0îÔÃH:4Î3xØ•E»vCþ܃^ï‹µÚ f8búF-•f±BÜ->Ü,£<—6J¥ö]ðñÐQ’tÜÿXW½z*�ë´ ‰Ê;ßo–ñàÊxQ¶ëãõ¿Pæ1&Œ1¾È ‡Ä�ÆÓ×e­D¦"égY�Ù‡w‹GÐ#KMU«Í£(°u£|Ë|’ˆ#íÁõazMŒ G¡[…‰,�ÈVÜ]o7 #†Á¿¯¶ßà©ÑtDl\JJäB|牆Q¿Ù‚�p¹~ËGÓ—€»Y Ä×U±ß+!ãc{óØW²þ ¿à‘SÐÎÕ‘¶\÷E½Û—XŸÚ–‡R­Á´b�sØQx"‘Z÷ªH EL` Eã‚Ä5aˆ“hò. ஈ”1y)—ù†| ¤ÄHqЉóJçWpÉñ 8bkäØ'‹�®FÁšÈqÄ\ï< Iö¦*"v_zQ§wÅáQû�ã|]Ôåà) Jb³ªÐ=z�:ˆò 8/ ‡“åšlO"˜²(Tf2�ØŒÍa†wú>e€ò‰q€BÉ"Q6nª'葤ø±ÃD—±Ljézg“ti³TÉ”&j Õ›äc‚£ï•gʶø€œ£٥ظ[¼×&’Ù”-6ƒÇ4h�bLBßOQT*:…D·Ð0fëþwWÛs´Æ·ÁÏ!™tÿÞ—Ì)JæƒÏÔI"íÈH*æ—SÑWih1òWvÉü<‡ØŠÊ;™r*Ÿxmj ÕeBél¶ÛùÌ#»�2‚…ž*CK^i3¹ •²¿��ƒv÷õ“t÷÷]éI«CÖÛòq/[ÃÛÚƒJÒÛ–B4.j(*Ìm?”k·3û ‰mhÖàÿU½-‹®ú U )p%–‘)�4žn‰cÕ¿�–˜‚u«ddrPËŽZ½�à·±€KÉup\)'yðŽt4_(Æ–OY%µßÕBuŒp9+ôJÑÁJYlür\ìóO&Å©ö¡*aС3Ó¢“ÊMòéºìLyvHT™7 { Ú×Z%™ÙŒhàí­2ë­ó@saTÆCI{ÿ;CNŒðs:äŒSHâº:\Î'�帊Vnœd-EûÉMærì ¹¥-mGa>:b“Š¢å Ñ0ÅÄð788œ0åA)Ø]Wíj RnKR‡˜Þ¡øZ©âK[�ã–òë²-±©¼mŽÚùrC„Ã]v@±-Úgž¨øVõZ¨Ó†ÞäLL"XógA�Žœ/gøTO„6Î!‹?´�¦ÙK&UËÄKÿZí ÁãGTŠ Éƒ�j´îK5ÉQ˜O€9†ôqàG6€FƒSØ€˜³…hÑɊЗ»o�qÈóHŠö< θûõ�ÐBXW¸¦Xï›®\•4Âr¿.Ж¦°&²Ã- žá.«µ|0§ üœæ0‰äúÆ\ÓÜQjñ«Ë.µÇtÑ)s'±Bbsg"œË¯7U½Ó0M Òõè· o\3'êö‡ ïMÓ÷:#â {e¬+5ÓÀ|§Ô×�Ùоhw�o$Îì>zw2Ï$üÅc~Úwá|T²˜Ü8� ªºª§-ˆ!S>DÀÄXy¯žœ ºe¿:9æP‹·<�#p�ÔÉ}ªm™^ž1¿9‰SWQllªeB ³-{i “{x§Â`gñ0q²önj=ˆÈ­¨ºþ–’`6íö |ÑL¬ðP±Ý�三9Eä`)*�Ky}ó�D»tµË6+’£híª¯�‘øZ e™Ÿý�î`N2 W€C ®áV‚eWw…¾.lWéϦ†¸ÛÛ\轓3%B‘XøÂMòÞ„š2Eî/O¤¡8"¸]e!8ùêG·ÜR­€èk'tè£[ZâÁÃ6nXènAɹg :›.̇_/^áú _•ùµ£FâõÂw­„zùýr»D¡íá*þÆçYeºK)7þ>Øô` œ²¡€Ë4œù6ô¾ìäÛf ¢¸`¶gN�ôìHXÞ$˜ÍÜ� á¹»‘‡�ÖOƓ˔ø�LnÖè’m>®›’�`¤¼€¦d+·ÄæÊkÊ7~ü6§˜A� ¦‡p/4D„GO(öÔî£ëL÷† Þ0-1sDØÎ§�¯eEFÜ!½¤N5õíæÍìß¡Céjendstream endobj 608 0 obj 2955 endobj 613 0 obj <> stream xœÝMwä¶­ç¹ô/Ì­Þ¶ÖŠ¤DIish²›Ô}ýH"÷å°ÉÁ±gmoGãÍØNš_�@P¤í5yíóËÛŒ‰�ðM„Fú~]Wj]»ÿðó|Z½üª[_Þ®êõçðïrõýJy„5~œOëON©·î"½>}» —«µRuÕ÷k;¨ªî×§ÓêèÕÉW¯?=}qú®_Ñ@¨Ýu§«£tU;ÝTƒ­5Bÿy»Ù{hW)5 ýüþúbè©:Ô½ªlƒ8ªw¯OW_®¾_›¾o+$ì«ÆÉØW„´­vŸ ñ''«—'[ßíï7«—_¯ÕêåŸÝÿ>ùâSø8yµþÕêõÉúË-¡Tý°)ZSµÚ›âOÛË›ýõÝÕ䄳 jTÊä Áå6Zè«ÍûíÙùæd÷ö›£€«U˸m/qß"èF¿:ǯº&^[ÕfèÁ,UïQ®sò¦2¶V´BœË‡9ü¡ ]¥ûÂáIé¶¹t¦jºÁ�K§›Z›_\º·%ÛuíÐuKl']M¾yñ@Ø6p-‡mðþg [mó°5]5„°=Ù½¿¿s‚]©¸;?Êu=VMÕ9 ØÇ¦‚¾¿vx ´ÿ¨Ôp¨zO&ð9v]En?ß켘¶j �w›ý­Ï?ZnÕ/½2óÊïhŸ¥ÐÐDFGq•ÛlœÓr>áÞIÇät‡÷÷\£äq{^¢U…€4ZUMïâ±q|�Ç¥)鿌Ç[¬qŠGôÜv³»¼»ò1Ù$Žç˜°»«@¡–›vA ¶º6ÿ¿±ZöO_7�&åŸ;V•¯OÆjD+ƪ5>q:o¨¿\u*›ië/A¶÷»ó»ëŸ=›–1pëÖÇ.yêl{¿ ét�¡sæK ¥OecÑëpä‹nrA� OË OZ° r!Éâ ?6mëj~¶ÿr/Žô4‚­HU>v�-´ÛÝÐ%û�û;l =ØèºR«×i‡±¼Uø%#þáÔüæèBIÃP™îèÂ‡Š "þ>j<Û⛇vf„¶‹G‰cÕš¤t)4drÞ0Ië³Ç¤ßÅít¶ÝæVT�4ó‡·]ÒN”ŠÙ–×»·›³Ûëï¶›\ÐVÉSÜÅMI_…A ºþ(g©[YD>õ{Õ÷¦�4ÃölÎŽÆ„0;43xŸÎ �®ú†�úªpbk’Ķ¿¹ß]ä†71Ÿ>Ðh¹bñˆÕ³.…Žƒè&ÚÒ|”K’Úò³‚BšEýØoMözM×»|{©Á•�nÑÒY'^-´‡«}Æ'ÍÐ@V óaBƒœåQÞ‘^Ò@=ušó¤�eJ{•g˜'Îrºñž ”w9™f¾Ež<�ªËÒ΀8nmRšB2H=z]HžàB1aù ½JNùcÁ¡‰ÏU! ܵB˹+ßÔ1ÛB0B¼ÖyÚÄØ…�‘»�‹03Ì‚>©?¿Ã’$Ò©ªó�síи“zð·CüUÀ3ƒ”�LmsS7.…AH…�¢ýŸh é >åQl¿+…“v[CF“}2š6ÛÛM)Ñ ;·+díÔ¹ÓÙþ_µj™©—@V� >l·¾KK‡±Pë.IØmA¥þiã„LŸÎ/iÿ%´Û:4[Îøîdå‡'ëz‘>û'æE¦…Â¥œAUAe!®�^O 0-4¸M»Þ®­úùÑ·««Õ×ëÝÊ d;ÈÃ?B?Ò¹ÈWÖBçÓ®�…M8´ "tÎûÍj„†XòSN¿µ¶�ìÚam s´º‡.BhÀ‚nL_�CÇ/!°¸ÐX!E ¸`_pjöÇþ2H>ïÜDaZA‡>@'�^�ÊqÒ Ð|hF eÓ4.º¶Hp¶äËßþŽ:4rÍZЭ�™§•65ÔuHª¦´ˆÃÄ1u38†©Á Ö Dy›ñJè\luR´²¸0BXH&ž³#RÞf¼Rܽ¤�ê«®O.dã0ñœA�ò6㕠йÜ+hû„;.éÛH6gD¤¹Í¸¤¬ |#Y7­E?N„°xL—xÖˆëãHÀÁ²E ΖÑs.É~�÷:FWâ’|DòK„DÏæñ?ã’h�Å=ªC-DDˆÄaî¬u vH¸•©3‰An'ÙÁàç4Í(y*'º9¤¤vl£ÙÙ|f‹…9B‡Ju^Î [ç9¯ ô;²Uh[Õ¸ä³+G-nƒ,¬‰f)º§�§…ˆ!ˆÃ*äj2Å“\•E”ë¡Mû•áX7V¥¹�!ìb¦œC¤Ó)ZDY !F©ƒVœZfÇ&ZÆJsHbqÞ¯¬9zWhÅÖœuˆÖÉôÌöýœWÒN ͱuâƒ-YwV$ äšæg©— ;zK:ú˜…—赈�…5ÑÌ!%ÖÂì�îÒD!lvœ I„D#ç!8ã`R,N¤q†°~îü22Ê…™q ¬æk_°$Y‚0ß,¯3$òš #¹`r¡lÂîFFäM^²»mLóñQË!‰£yªÇLÑ­<ç£%3å€ yDå£Á—D_yNšŸf–�œÆ &h‹óÃagAUô·ó.tYÇ;f0A[t|KzÉH›;•¤¥XÖ¸ŒYe‹„e_ÒŒi � ¥á°ò3¦A;’Þ¡©uLâS!ÆÝIc6ñ› “ÌeSÓQäŠi>›?tö?¦Ó±i>�Z6ç5o¯b¾; !ŽéLk*Œ'‚Ž)`*ÔíC»ƒ1uN…î²qñ˜íThjm� NJšÕe-ñ˜²™ ÇÌ?ÆŽY¹Tœ&>¡Ž)§©0:tØ$dS£ùlgÙiL™M…yí¡Sá1KÖB\1–]2ð³”0æùËîDÚâæOv£fÁí 1;YO…‘è²ñ«È²ù�‹xÝ‚³ÿ˜uêS¡^Ðp Æ{¼Ù�Øew}ÇlR9æ2‡N„Äñ¦pvëvÙmâ1»«0¦†Ë&”cVã…ÜñÎè�7w‹!—ÝØZpûl̘ qã�äE7ÃÇ4 §ùÑjÙnÌväT¸Ý³ìÖÒ˜9t* Ô— ïÇ,ȧÂ`cÙeÌ`Sa\´l45f°©0X6…ˆö¦Ú~,£ù3ü¢†�°¨¦HôÓÙþ„Ÿö´ü â`K‡ýk ,“¸)£Àþ]Ê-<á¶¿\ùM¢Œl²q\÷{q·ÖîiU DZŸÃÚ=í 0ÜÓ4½ @ëÀÃ_�Û¹ÇQ#…®­ÜƒqÌ#¬Ý$a�”D!ÕãÜÏØž­rWbϤ±gÓØƒ:×{1ãñŸ!AX«ªXA(mÊÿ@ŒM`j÷hŸ@€¦¥Õ‚­Iº ò3� ^ä@ˆ2ÉHR-ÎÃ÷yªv%rÕ'ÚÄô|Û4Pà¤þ@é´FGí0¥ õÕWÚ ÷X«0 ¯Y† øLÕcl–‚0PH"�(<û,Küê:¥G��mpOoé¨{[·� Ê…k¡;c fL�Ö�…н5îÏ‘4ø­0/®…êŒ�2âõ‰ ‰KŸ“ZIf‡BùNj”öIÝ7–Ö·élÕBe†àÓ|g¡Ë…DŽm ­A0Ý[Ÿ$£|1" ¼<ÜÜÃæk¦ÐCÓ¨šÈ×pIA,%R˜éÜúl•sÎ}‡ÿj°F­¿…néb+wØÓ´ûÖöü™làh :d¤.…a4*c`3Z³A‚êR—xDƒ�Œ�B�D ïë7h…ç©`²™eëLû>ƒ[H÷mr ˆ! ÐuZ8gû>ìjMÓ ZŸ»yG]ÕJ`@•r�53Zî ‚Xh7ÜDNŽ®çcaí®@!�d$©a7?SÕ’Ê;;¥¾¥4 À”Ÿ éG©&Z€’c`²" ¼f 0` ¨ ó` °ˆÁR"…™i®~vÊ]=ùPJòóúòéš�ÄÜ‘G;1µ¤žž¬@]´ O L€Öl&† ’DmÀØJ,a�ŒD Õ"=2=3Õ’ä-�LY3†i?êO”žªiGu%ªO•‡1°21Z³þ Añ™ªÇ<Ø,a �D Q"鯟—bW2'Ç£C°ó§„A'J)ñì@I‡10)^óÙ�!¡÷gx2`|v`!ƒ… fZ¤ù™©öáùøñQæK îùHw¿Ò=(kgXtw1ÅÒ<<ÅßžGüVõÞ1,#=üÜO~+ƒ§Çcö³ƒ)�ùf¿Ï}­` ½ xEÁY$¾˜ÌïZoÈ‚ÕÐ…w ª_þ¢\<ý+@ô‹ß¸§å¬øÿ¢Õ¿8V} â©Á¿ßAÛÊ5ak�v¤ýÓÝÇDôØ Uë†�þ;ÿ"ÉÇÁ�A<Õ×ô<ðÉÎ?ûk;À„°ÕU§”‘_ùO�5ÈЦ×� ®¬[ü‚Ÿò]ö.7eZÿ Xì³ëËû}xaF/Ÿi¯Ú€,'^ÑñúßgÓûð&h\éqr|áN+Ö>ÛåW§¯�¼_�ñæ(¼A¥‡H<º¹Þ_芄 oªy}Æ?“ͯn‹ pù#¾BH¼ÅæúîerÞÞï÷7—øÆIà?ðZÏ×ÊwÙ\߆èk�ψŸŸmÏï·îu0•p×¾‘Ñcendstream endobj 614 0 obj 4075 endobj 624 0 obj <> stream xœÝ]Ks$¹q¾3¡¿Ð7ÏÊf©ÞûdKkÅ*–´¤C‡YZdÏ�RW÷ˆ�í¿7PÈïËÐ|öž:ŠYdg%2‰|ÅúǪ,ªUéÿ'ÿ^Íg¿ú~X}¾?+W¿uÿÿ|ö�³jAXÉ?Wóê¿/ÒØû‡êÕå§³ðèyµªª²ÇU?UE9®.糿ùîûo}ùÍåßÜSÅ'ÚÆ!”þ¹Ëë³?ÖEéQ궘ú²èÿÝoîèPTÕ4 ô·�·×›@¯*•`=VEß N5y„o/Ïþä¹oƺèºUÝõ]ÑO«™�~誢®VÛ³¶¯úb¬@ðÔöìæìÏ«ÝYÐÁÝ糺îÚ¢kWŽßªp’ÍR5EÕ¯êºжqã²/J?nÆ¢9¾rOÔS1YŒº^Ø ŒÃËiÊ¢VJ¡Ša0s„±\\‚B,ÇÕÙ§_žÕE3ŒU»úzÂbÞœ]œÕÕÐõ°ê¦n,ºUU»5ozù·^Ým<Ž<Ù�Sç­z6�±/š†èÆa*ê†Üa¬PŒ ŸRÀ8Ì¡覲)Æ–è&·Å¦Vç�±j@1„KRˆå }²ÂEË;6Î;ôÉúöÉúýXÔ�UÁÐME;© †ÎmŒIÙ“±Q1D@RÀ8ÌaT0 jÞÝ0¶Î+ýeh¤ÇïàϺ’¶Ëz*2E«9”­[¾vkßVEkýU×7µ7NÜ×]Ñ©¿ÂØHN ‘‹0sÉûÎ$#|ß že�#Œ�øÄ— Ë/ëÉ ­¯3‰'¶jår�ÁŠ€ð^ÕÎÙ«hUUcg…¯œ»('Å(�»˜&%À1…'DX'�sPx0aÏG"„e=A±–-Ûq1]Ð:^ÐfèKŸ]Å:CòiBmô£� _3øÄ¢¦üM?-Lª†š~tÞbŒ -Rà($H¨‚thH¹ r)9–µ?]á¼4}ãÂsÿÌ–&Fã’—,4cYte#UãÐ¥ÍRrŒjì{›ƒT£Kè*›¥Tc;Ù<Æ�]X« Œ‘A"9)HÂ9˜¥� b—¤˱XÀé ç- -+·®Éúº:ÑYIW%Nài7!FÒ—cg�ÿ†àÐ8›n›Ê"‰hã8\ÒAITWÛy«×T¶éúbè †ÓJß 3•‰(( QŚʂ b—¤ËBÄÉ ·¸‰ºk^0ÖoµK:[¨ôuïMEëÐÚ姃*›:”Re’ÆaS‡Ö.Im´PéëÉy¹ÖÌƦ%¸…XŽ(¯;=ᢠ�äía•Ã7uo£ !ÜSXˆ Æ�ÎTªÊFÁ±rΡ3åR<(Œ ‘F ã8£ ¹¸…XŽâOV¸›�±ÔTH(™:H!Éä‚¥&ÓbHz £TÈ`²—PJ*})5•�ð;ùLÞbËç““éÆÆG-3‘2ÎeÜ»Ä�A ³Ð D R�:‚s°Ð À— ËÇÇ“Îî1mÂ*$´Pah±Â^´ ƒRŒ`m¤À1¤ -T¥Z¬:š°Ê…`�K¡�Èm¶ÓîÆö£šÑ=uâšaô%8›%Ž@1šNœŒMˆÒ�!ŒÃ¦eÓL½‹±$к,Ì4…ÂÐôkð;8”§câVÔ)ɵ,u]mo2m…„<¹­«�­JÝÖ.¯é+“i·•{ÖwO€Q9ã:¥À1²`B$O&É£93mrA á9–U;]ánl!%šuÜ nZ­ pãÚª i[o=ª�¦mZ«�¦­«ƒ;B„Rù0@ˆ <’@,Eð¤'*ZäG»ª�K¤®+»å¤–›}rÖVoÆÆßC¼ )`æ0þ¦«9Ê :çó[s&cãrˆ.A!–#v¦''Ü�)î´ºUH¨MQy vEm¢Õ-ªÅÕ�RÀ•§BBmªBíªs ºU.€.A!–#*îNO¸¨fPÃ$DÌ -Ì)¯&’bbHÒL Ó0 ³˜æPÃÄ— Ë× ''ܲë&g<Ãdƒ!âË'gnËá‹øú©[²‰S[ÛFs35 -¥€1£ pæ g�94€ b—¤ËvÝÉ g¦i?"Í´jÐ\@3GÛh÷CÚA¤€1Û„ ¦[$íÒGû� Èïào0}¢¨¥rj2E Å"H!¡„!M)q8)‹ rE a™0F•¢�¥Œ!�PäpAd¿ƒCy:!^¬S’ëÆ\ ÐSäD¹qB‚Sp=CÁ990pŽó œ€€NH0‡ž¡D,òùH„èÁ)‰Å0íœ"}o8XôÅႵs'M q⤀1;ç„Hß›¤/Î9Ø9'À— Ëǰ“.Z:&W ©éJêÄ™™\‘7b豈1…„Ôˆ$uâL®È1À%(ÄrÄKwrÂE×v’6Ê¡ó:U!Â>½³ˆG÷MпCÜ?)`L"ìƒÄêpA p ±qô;9á–Õí½E7~ gïj@›*×}5Å×M¤Œî÷å2£RÀ˜á¸{P@4À.À1„KRˆå�ðd…³Ù‹Ö«H±)µ(B°V«ÒÀ@ŽY­"µ&( ÅZ­ Dñ|$B”½œ’XÑɸúBÄ à^§¼êGp L 9#ŽéG/ ð˜Cý¸¹ ‰ñùÉ vÚ_ Dºp¾èÀ=kœâàIcöAwÐ=ÀÚ_Ä.I!–#Žo''\´ëT:B„7˜x‡Ñ¨t0+bˆÙ�Ç”ð às¨tàà9â]wrÂEçwöm¬ôø}j½-@ˆœõ£Ó�»è…ëmtˉ!ÝtRÀ˜·‘³~R�»œƒ·È0À%(Ärć ''\TWÄ·<£<Úz 7’ÛàÑUP¡ÝŽïW}?¼HÇ�¦©wQ?ÿÿ~ç4-µS�¡öiÉÐÊ�Ù:H_-ï» '[ƒ£Á©Úå|«”s)/÷Âà ì¾ïzŸ›Ì i˺h=Z5¹œžÛjôÐÃ1â2(ºÛl¦m8‘sˆªiqãX ÒRs|7nmú1’K"t·ÙLazÉÀTzB(^RÙB\bU@(m:W$¿a%.æjˆ¢8S½ì&ƒ#e ™+0� Í†‰w]ç7 !Nq¤ú08€(KÞÛa¯ì¡e_ M:èâLgp¾¢Õ+[ƒ£Á‘ÑV)çR¶ °CFâú ˆû—Ììâ×�Ý™‰rizå'{Ôì~ݵØÙ.û÷�0³û 8áXÕìõBÊFv¬£Ênö¶H×7ÍddçP~åD¤™CHÓÈn 2‘K•¹DÏŠ0D¿R¥¤™CHÓ®8§ÖåzaMÛ®òÍ,º�)çË@ʧ‘]9‡t´pâp`ϤœC"Ã)u»€¨SíǺè­O@1¤ã`P¢n7™)–__¦lä²ÉK{†”�'$xFÚb÷|Êçld¡tâãŒt„G<šÁD5�éÄ„]e€5�ajc¢8b”G œ.�+òûF”E¥Cž¤Ò¢ÁáZ£shs�X×CßGÏBEçÂ<‡8d5¤œC¬ï£aèÝÒ|ÀÀ¸ç‰c pRt[™ÓIçŠ5ÀÜO¥#çp1¡X1Ë«Á ÅÓåd�(óKC„ >4X‚³'†ò«f ™CHÓª^¨ÜÛÜ·P+%Š�3SÎ2ÜܘÝorf/šÏ,ÎΦ3 ”¡(€hÆ“å@~Ý%56{Ý×!Ã6ÛbÐ_%ÛçéL±ÙqÝiv±Õ‘b(ŽBG·k¶Íò\À$ÝÆõ¢�UÝ !ª#hM•”Ê›ÎÇ}»J· ·‚�â(i)Õ,ÁÌ7ãr3®NfSÁPø;ªBzSœTÞ¼2 ˜À †öª,cÞ(JEIKŒ¼2;À�, Iõ·'DK3kZš¥EV^ˆúHÙ7K³A¬ºz¹‡WŒÕÒ²(ôÎMSõKÑCïÒ4eéÿ‹. ( \~ÐÍ!‘w&š,˜óœe%L¶M;Í‹HÍrzó¯ÁönIðoŒEZ±2¶–_Û+MøŸ˜±–¾ŽZ!\áÖ·RªÉ¬°Bˆ#û  \ót® c9ÊVQâòf¹!Nˆâ€mÅI§Kç  ç¥ BâÍèv{´ÉB²Mœlºt®…�¶s›£ªL%D3`î E—þ>ØY\�b9X‚=kmiñð<ÖóÖÆ|âÙ½’ñõ,–uþרƒ¤´cñ0µ@t}¥emÖ—µXŽÚIºâé\± °åëÊ2³ò$Š� "éæ[ЍuýÓ¡­¹Q DP�h�n±U@ã$°noVÃlÓ•Cœh(„8Ë (¶KIo:W,?ã …c<€p,zE!Eu–I›Î¹ #?/YR6œ˜¨l„§3ŠˆÊŸÌ›Ÿ¾,Ûb„„m!ªC¢ j,“5�gkC�JO%Ó¿-ÉBéq)J¥„²¦smE]#½2àJ�¢´¹°BG^n38Q’¹âŠ9ÄÖAÌûô¥d˜DƒZÕÑ)ŽB‡;�”sHÄ€x(£z@T­âéŒZ Q,˜â¤ŠNçŠ�O/§Â°"hX!áPë"ÓTcÍŒ,�%v;ìþØxâvhäD1IŽ˜-eÙN:S¤zãv@¸]üyb¹]BGÔap¢n7 DV~¶`5¤3^‹p,xÕ3+DPèª37›ç&ë1ò3€hHÁíÒ�ˆ†fk Íi�Í‘OÎÐÏÐôÀÉGh·šSMBˆÃÓRâdçœé\Qña4À Bé$Ó7Ò¢8ñ;‡ÂlŒìæÓ[0-MY¾bÁG!‚Ãõ%åbƒoZK*ÂáìÔC¢ÞG6…ñ>„‡~�8™?JçŠyÔŠ Ž @.¬8 õk™WÊÕfƒÓcò©Î€Ù ¶*6/²¶C6¢V‰­®ÒŠ?­¸gS•k�²[§Bö*ˆˆÖòYu€ÍÖ":q›"Ô2øfA3�eke79³1†éZ˜üŒM4‘zj¢™¦ŒyVgÛ‰z’q\ó�8ÙuŒù¸ë–rrÞ4{Þdh§ õù¸†ºå:ÑÑ|l«ÚÒNAæ÷‚dˆ.²½0ë5‰s‘Í7Ÿ½óÂRvõá"ƒÚo»‘�l]<ûÕ�Î9œ¶¨ÇÒ9:~y òW¼—ÛÙ.D-Ÿ¨ÿgå4®ÎÝô½¿A¸| ã·Ò¨:¿7ªf�ÇXŒ¹DñÆ+ÙŃ‹l¦ù½!.Kæ/2 š�­0Œ%¦ó¾_[æ·¿ó‘Ý Uªö-‹w½SqÀ¥÷uçãîë»K¯`Ïﻂ�Ý'5”Í…÷w]oÏ.‰_dú7´ßvƒ7»‚oÖѼõÆ·¡²·k UóÚ×»^òÊÞպȴoh¿í6oö"ÚEövÜ|ìÛq¶“š¼ú7ûêŸ�-¨�žû<† ¼ü%Ù®¿�Ç"'BÊ^°–¹ž£„ƒ…§ÿBPzky>îÖ²]‹ä=ÐùØ÷@­�I.;ÏÇ^v¶´“·wçãÞÞ�¬3¬ÆsËÊS¦g—Ç#ÏR’ÙžüZÓ�pø¾—u²·ßßz³m!íå ¯G],°Û;ò™OË>õeœ)m¯²òßwàRí›õÔô}áôPµ�æxø··M@‚~@ÿŠÎÝÎ*»•=v‘Gj<=“‚±ôÖ[ýÁÿQ�ô=Òsç/;çT}/ò/—¿ÓVý‚V¶¦9ÏvýïÏ.ùÑwñÏ«©¯]öm~ÿ0ÙŒÎ`ôB>EçEM8#pØ->A'NdR5”+ßç©D@íDýéÉu±Ÿ²N¿¦Ý†¿¶á×än??Þ-_¿nüâv¬†®lóËztÎyÀ·ÿ\Ï_¶ f;8ÚØ‡ek‹R]ï˜38Üî>mÖ÷· O»í9ðãÛ?|ù漞&ç7ûûÛÝ¢´º&ý‡³hõÛÞ_oö÷�c·õãÞ?.Ä‹ÎÑh½}Ü@Ÿú½ï¯4.£½¾iÍgÁï6_¶ë«Íõ"qï–� üu±Ž3ý´<_R䇛eâófp²¸DÚi¨}‘ËÖ(šm,çkš,~¸Ù‹Fk§ÑûÍý¢Òf°�D&í²ošôÝæêa½ûLß`ÿëíÃM® ÈfKeÂ,lýäÂì�êÖ»°jÞ»ýƒØ�™Uøw©¸ÙÊû,ÌÌa¸V·öö~õ½+H©ø˜Ù?æ+ãÿf’ÚTÌÌî»?ãæ�*v°zëÃrÏrÀôö·×\Eÿ‰Í6l„  Û{Q$¦ùr·wë4/ ÕYüŒ ÄøñÞ;o¿¥±ßM¾0>®ÜþKp´]é¹}Á¥Q ­W Íð÷ñaƱcÜ&‰ uR?à6ÜÝþóúaªž ñÙ£‰|É&~Ñ�=oHꡯBP­•©x;§³û¼ESLªÁÛ�øAÎúJB�áûF–θ‘ýãÃæ.XŠÏ¢#C¹u?­n÷»Be&\ü¬ða5s‡Ígæx"`xÈÁG9Ð�sûݽÄ;cF_oDùƳÃvhé¯àÊ]øa|»YqëÔ”¥¯q�C.–ur»»ê¸yÏ—Oœø¿Y”.W_ˆý"ßãU´¸ÿ•§Ýæk–¼*„O\æûÛëjWûÓ]Åí=òئãCÿ¥õ<âàC"7� š e»‹8—w(¼ÞÉZé¶øðéqwå�Jò-³[_�ٹ;6§ÌñGJ€ã?oœõ­z‘õýýíç³>Cü~€çud°«{²É(¦ÄÉÒFVs° ß§ýãîº�øa-¬rÂä¿5 öUvy÷q“yì�~ æí2.·"Æ=oCcvêG·?Üï÷ðZ­óZ»kä{CäK˜ÈŒYê¯À«ª‚ñeÛe:}û£Û"üœM‚ßS-Ê´â”í©LËåkfY‹@¸çÂÜí?/‹á¿|”;%ãª<Ë÷²#">Úšô^—î©I‡9¯Åe”6²kšÔ&âõÆãÖÎG<ÝU÷óz» ›~ù;~êB˜»™�¶Ûç!jÞß!º·�d’ÓÛ¼gl4aªêåª(®À~Ðc²±'£ÇXœg¤&L®eßNf÷9¯ÂP9~Øÿ=ÈR-Y#ü©Øµ3©ÞV›ë‡¾‘l© {ÏÆ)Sû�vg⦫æþ&¬Ioã÷× áú�ÀÌÖÛ˜ÖÁ �¥Æ�ö©ß ËMmyúòŸ&wìQ²Ý| Mßæy¹Æ‹ÓêÃbŠC«ÒÈWYY®¶®n:üÂ…èêÈÁ°žŸ¬¬üâë÷Z¨Òg�m¶¡m¼*ݼîlåîŒñA"a$ê«|ee·ãëÜ”Içö—b=”¡��\ufØ¿rî%÷Ÿ!¹ }k ÑÔ,Æ– ߇6�tÞbîúÚÎ\È¢›µzª23eÐ3&ÕDÉ0�ÙîëÝv}÷YÖÀ¨ÞöÍnÓ ºóI„ä¦Õ*û•h,¦&õ­]TIê}gÒ°|¢›ƒÿñ¶Å¨™Ö‹:Xdmc©MsóÈiòÕHo‘æÓfØþÁ¿Ú>^KÍÚuZÎQÛcÓh§õõÝOÞÙz1–Š©û£,RºGE9|C<罤¨Î ãdE«©§baåž/iú?%‰-£mfûeõk|iC&½,V—Pέ&-½§›ââëT… .Ý;­™Yþ-ßþ|\%ûEž~·QûæoÒ½¨K¦�Iě鉸EÜVæ¨õN^•æÄkOáužà¼•æ»5À? ÊçeVÜ_»o›ª4ñ’4 ¶y„ÉMzó›`h6öIÇ$nÎÖ¾Þš­×q1ÀúÅ{ý¦ÅާÃÄ å\¯æ³?°a:»¯Ž&f¢6�]ìâ¶^ìÅYÅnó5+¸¸d–Ì&.u|¤ÃÌ)øøÞ*=²…§ºö.†-ôœºOÊØ:Êg^uTÒÝxµ/Ö¢ÁíØâ�uT£4 ƒu>ïËŒš,xtú÷ñõ9J�Õ·�´¿$ÝùsO­�ÛU(v](²�ûu¨œÜv3uªi÷Ùä¯I@^ï5‘ ›šô4w§¨Ýå¦8p -ÚÛö|´…qŽ­Ó',SÓXÜTRø¥f%Q=_æó¦ñç]j؇V:b™®±/)Ýÿj=Ƽ¾ûûÂXeÍ‹Dæ¸YZ8ÚJw{z+›½¶Ö‘#Ê©øÿ˜vèendstream endobj 625 0 obj 7083 endobj 629 0 obj <> stream xœÕYÛŽG�”7‡�˜G¯wú67/!� ÈQ"yyì±=Á—e<^._ŸêëT{Úk¢ D„`—žšî®SUçT÷¼K(a UìÏùvôó«Fû yÁH&­ §Î õ‘g¤Hü#a e&õì%¡¢,ì›Óµž[”DöÛÓÛg <óCõ¡ÓvÛýÞîßlêía¸»‰†g„çe®­ÿ´³¢ÕõÚIÁ[½֬ą¶£«æV¿�žñ°Þ·�uÐᲨó¶¹éšýNo2ïýRÏÉIÞ/Tm6f!<Ø�XIÒþíÎBÂ9½éò¸›ûådIœ§ï͆•ï2ô!ë‡fãÍþj"(¥�,ãýÛ«×Óg#ÎGˆ-ªŽèÿÃ4vä7í§Þ½÷sÓ+”Wï'jLg‰eÂ$ ¦Æ›ÝJ»E=ŠÖ}ÎΡšâP�ó”Q\‡ãv[µÍ'ý(-ñ'ËÍÆÍöæjÂËœÌÆäj§�‘9N%‹R;èü^ÖUwlk ‰³ÙF^Þ�ùe1HA8'Br…SÊ©0èïö•>«fž7zË%9¸¯·+= ×&Y7¯¯ôÞr’£¬<¶äÝÎD{wÜÖm3¯tºÊŒd½'àòqÓtfH†¡…j?˜zØËyµ³Kf~ÉÙøMºñнÔÖ‹ýÎL–᪪«C³ù¨Ç™Ê,_M·6(B¾äYŸpxàŽ~–›j®C”ãÁ·:Y‚ª¯VîeÞ›Öä{†ëõhtA Uq){ª*¨Jƒ4’dŽ«$aÖ3D��ëj�TÊ|½uUkœ•¾Öƒ¤9åEà5øHƒcþå)†Ês`ŠÃÚ­Ûº¶¸žcœ§â]¥ØÏ'� §dÕYN,ú=VmH õ‡j{³©Ý.�¥/6¡9ì·3Y' ”uãî'm,pä6Í®®Z›¶È=[~�P%AùôîX-Úªkt¥Ïä±Òy�¦èÙlüÜÀà ŠuÕ¦„ËS dŒ®<_†•³®  Ò§áÞÔ· à Û‹ž*p;�IrŒÄÒÌ|ç‹�b‰Ršt⊃-&”¡Çƒ‡noÇo­êÎ*§‡Ðð4t4Ê4]M�B /¸[Ô­J™…Õ§<(îˆÂäYƒ¦Ì±9ÇëQ©Ä#R„9Àz½_4?Ôm½›×f޵ãÄi﹫rkGÒÅP´îܷͪÙYe€îUÌf»õV§¿Àò×{ïëÖ QŽªdëÈ"+ÁÉ{óJåÑûσŽÑ1›<«§ißbX6�ð0Š:ØT7‘Àwܱ²áet‘�z2‘'í@�tk[ È ¿,Pª¸€óÔ)Àr˜.¹Ê—µ âɤÊæ¤áÃpŠÌ놑þÜ£ýÐö¢¨½f”—ED5÷`¸t؈º¯w¶ëFc‘¥f‘•Âf*²RªòÇãÁ^Û)rN‘Šdç=—2|1\Êe:6»QOžª J@t”ÅÓ]„„baµI'H bÐ(¬Újk[¨K½z©iÔ  µ�D§ÀTû"¡]< N"…À h$ÓRU‚&,W |X ϽXÊSÕndž*u…Ð,ñ5¿DÉåp@TŇ‹¤Š^ü6ì"¢Ä‹¤e™Á©B©S2æŠÔ1œ8›‡YëÈ~Ç,ÆLôâ2QÝžŸÔó¿"SÀcèÞ ¢Íp§ÃЗ£ºée îá°¾µ �@‡‡ÙŸ¬s®Ög¤¢§T�+�gÃ"„ Uû÷CïÜÍ6{h›Ô•]�c"Hq�öÀ qvÝÿœ¡ŒM˜Tî0‰òý$´¨a®“B·; ¼�´šQ¨£YÏÝõÁº: ;:ÓÇ VÇ.lú­‡²vk\ ÎÉ›£Ë t¢ums€­N—Ã;5¸`z&ÀÑÓ¨à•´daç'†b÷õ2ë4‡­“2…9€t}}CªÇ¨mi“œ‘'µý‰;Rÿ7�ò Åe™Šè)l_•;’©Ïê’�±=¶Âàl¾»$dé¥ö!¢"èï„+w ˆ*wÕ0 Qo}•ʋ;%ñ¥õ¼¿˜ðÂ!*¢º³¸3s\"é Ô«oŠÑ8±N/6ëÁòg7ëb À�™`t�F ΂Ãô¿Vß�“¢ê›iböá‰3ä°H°Y$Ï®cE*ïå"ºT†_I»¿ œSåÝê_8Åùÿ«¿9I]TÿÞ,*x±+y'ÿÒÄL iöäF¾§‹¬×Ú¥»aÅx­›ÅÂ^Þ Ü½ë›è¶jÌÙ_ìöžÒ™ÞÞ Ã¥ûÞÆÞë{÷a-ï¿ôŸÑ=ÿId3¿Ñ­¹L /F—í~k§Eµûl¿³Æ sÓŒÉ×o8ø#r}Ú «?«•»ôE׆î®Ñ|ñAßE_lwóŠ}"rÕ'îÄ«ž<g?éý—¸©«;RmŒ%âŒ1ã×ãéè%üùß:_endstream endobj 630 0 obj 2029 endobj 642 0 obj <> stream xœì½Ë²%˲¤fÕâMw5fZ'ß‘ÙÕ“Û“î>B]@ºº «ÂL’�ø ÞÐá'@<~ƒ7]Äó7wî1gÌY{×={×Zµ†]»vö5332Âcd„‡ûð¿ÿ2½Î/“üŸýïßþòéw\^þô~š^þZýÿ?ýô÷?Íí/ö?ûËË_ü}ýÑyÈEËËïÿî'½ô/Ì/ó<½žçËqͯÓùòû/Ÿþü_þ£?þ+é÷ÿòïÿ^½âšqŶÖLrÝïÿΧ?ÿï-¯“üdÙ^¯cZ ý›ÿðOþACËë<_—¡íßý·ÿΟèýæ)n¸œóë±Ùo–Y~ðW~ÿéo´ÖÏûëVuìõÇ×Ë—zù¼–Èg ûrí¯ûR¿*�ëÓßzùwê«þéÝ¿ÍeZ^—íe^÷íõ(/ÿàO^jƒöiz]ç—}½Ö×R{fyÝ®úÛùÜ_—µþæÓßýW>Õ6Ÿë\^þQ½ïß«ÿÿ×n/ûàØËùz­ÒØ£Þë¼ì’Ï·÷øüé§Ö·wúÒÿp[ôVud®�ÓŽøûí•JYÔ6äµöùåöŽÕœþâ}úÝ_úéw|lÛ§ßý­—ùÓïþÕ—£þç_üëéåüô»¿ú»¿úùÓýå—ÿ¿üÇÿý?þoÿ«ÿî¿þo¦²îó±lÿÃÿþ?ÿ¯ÿãÿö?ý/ýoýô7ÿÆ¿öÇ¿ÿÿ‹ÿä?û�þóÿø?ý§ÿ¥î_øgþÅöŸÿ?þ¿ÿëÿù'ÿïÿùÿëú·ÿäßø»ÿæßùsîoþÿÔ?ùôWþèåoüß Õý0ÝŒÁO£î¾¸Ÿ~ÎpÿtsïŸyŸûöüŒ»ØOöjϧ¶xª3yÒ=*~µ×ËÄhÒ¯±Æ±í/ëëzëÌQíæ¨3è¨Ú®×iSêø ÓëŽyìM;æ’Û%v�²÷ù¿ksŽéu;ŽÖœé®-e�ë¿ææÒµ(~å�J¿úÖv•ùõšgm× —Îm¯ÿž[fHײø•·,ýê[[vÖÜKkÙ|×®Êî¯k7€†tíŠ_y»Ò¯¾µ]×özN«¶ë¾ÇŽ©Ô_RËé¦rüÊZ–õ�-;¦£~<Ôä—»vÍç•%v-²÷æø¿k[*fïË —Ö©²úždHצø•7+ýê[[¶\u ¿Þµk«íîìÝ‘®]ñ+oWúÕ·¶k«óÏì}ôؾ.½Å;Ò"ð+oYúÕ·¶l¯wª”–mÑ®7öájë©y½^·‚¥ÒR×ëy»Tª‹£›~�ÖB[]DžûÁÞÜEZ1�n~wáOwÏû2xÞO?§™?ÝÞýgÞéI›ž>íá�ö­ÒÏ1?x»@ŽãuZ­¯ï ˜d�¸¯Ó.†P´ìúu�¯Ã¼u¦®�gXj�hÜ/mØRY®^Ú5¬na¢iëu¼n[jš¹i†¥¦ùö¦Õ&­uýyÓ´#š¶/õ_RËìïÜ0…R»øöfmç벜·Í ‚™+uÕ¥rj—¹a†¥–ùö¦ÕÊÊqÛ´ø¦Îå\^ç#5Í�Ü4ÃRÓ€|{ÓJy]®®e±œœ¯ºk>²�9�›eXj�ooÖy¾–µï±ÜaËT§ÿœl @j™c‰�|sË–ú±¬«Ñ›–¥ÏØ\çþy¥–9�[fXj�ooÙ¼ÕÅû|Ó²˜–ËR§þš)Û�Ü2ÃRË€|{Ë–òºN7V–¸ìá§kÙÍW(—¾½e[ͽoY¢ÿûoS]º¬ýšä¾íõ›ruÂ_jüS5R¹Áù:¯ÇÝ7Ée ²Ô*CºfáWhWúÕ/nXµ„mo{á«lƒ�’·­®«_ËžÛfH×6ü mK¿úÖ¶U®=·yðUò¶•ÚúyÍm3¤k~…¶¥_}kÛJý’”kðiò¶�•J7¦†tmïжô«om›¸É¶Ñ·ÉÛv�Çë|æ¶Òµ ¿BÛÒ¯¾au6Ï•k¯Êçvûuò%à<ÕGo©aŽt´�_yÃò¯~q§��ÐŽ:S—û¯Z¶,u畦@×.ÿ š¿ùÖV-ÒmÇݧ ÍZ+ë�ÙÊé†_¡eéWßÚ´ºy¼öíîÛ„¦mGíÈLµŽtMïдô«omÚ¶Õ)´Þ}œF{kÚ`Ó”¿NÖ´ô«o´ÿú�{=öëk_§7°-lÞíÑ3w¡ÎnëÛ�ðæwmØÂ»Ý:êu?ê4ûuC^¦½y綺ò=t \;©më’Qýä@®º š©û±æ,ž^×1PßE–B»ø¼:`6wÇ\ê·é”kæºÑ8!u9-_âzõ¼7d«½µöHýzV ^È96tÃ2Ÿ'¢$"‰ˆDôÑO¶ âzˆ4D" }Çõ©‡ÔCê!õ|§Páˆ,D" qDê!õ�z> õøèœé"‘‡ÈC\‘zH=¤žC=¾ºVz�ÈCä!ò—@¤R©çÃPO[½N4s D"‘‡¸"õ�zH=„z~ºM[Ïõõ Kµ‹³öÌ™­,Úu3`ôwÀ6µ6Ä´€™µMõí·<ûȼK’nšÃÛ²Hþh‡œ¯%“Ã=Pûpîxh;�¦ ÷¹–×këî3@j‹»öíµËEëà)Rû`¹ò{Ž�SâµRñ.5�ôùÝßëüzìyÜ€`l÷jÒg¶�@`E¸JÍ,þt;t±˜ê=`m‹Äg…÷AÌœb}3ÐG #:J1·ˆ�v0ÄvË® dz½2õb(ìÛkG3nhOµÎÔ–{@M<½’Mƒ§ˆMžè¬¢“0:=hâ`ðˆ3L �¢­ÀˆnˆFWAd²Ù‡ìóÛ³�ú‚fº‚¸ûÌý÷ct‘zH=¤ž�C=·iñÜ‹q/ƽØgîÅè "û�}È>„}ÔDGwcŸ¹ãnŒŽ R©‡Ôóq¨çFˆ;1îĸûÌ�ý@d²Ù烰�ú�V†q;¦·cŸ¹£'ˆÔCê!õ|깓IänŒ»1îÆ>s7F_Ù‡ìCöù 죾 M¤é ↌2nÈè "õ�zH=…zîô¢¹ãnŒ»±ÏÜ�ÑDö!û�}>û¨/h§j47dŠpCö™2ú‚H=¤Rχ ž»ÂÜ�q7ÆÝØgîÆè "û�}È>„}t!DW÷cŠp?ö™û1º‚H=¤Rχ žÛºÜ‹q/ƽØgîÅè "û�}È>„}n ©.uuúºg* Äï²Ô5¢¾R{LúÓÚ±ÌuÛûx[‡È¬ïãïœë—e®CÛÞÇûn„luåõjE–×éì�úÔcM£;Bj;ælŒË\GNæ`FÖ6éÜö°–LWyí.™Jiså92ëìAcȱ #¦—šö³ÍžçHíŠ5w×Ùö×ýÌ݈ÍT·Ksæ’!R-&/Ë¢Z޶¡‚9àÆ83âì‰;Ák¾StÎâè0ýÑÞÄc�'|‹†ˆŽ7¾i0µ§ˆhÜg€˜¡G{|2ûÜ—ùBéXKµ¯%mÇ*RúíØ!wë¶c‡4`ºÒ;Ö«Å•‘mšÅáö+ÆŠ²>~€´•ç±ÍmÐ!ëëlÛ¯¶‚íYäVàäЕò±ÕV]ú–º¾Îˆ.Á�MZ5?BÚJ>]e«ýçˆîR{ˆî5Ò[Ù~dˆxïè&&uàh;¡4ŽÄXé†*FóîoÝ“%‹«±��[VFªw[½c]�þÏ©Ûêkí¹åà�¯Ôf[d K·ý=Váðc XG®Bã%wBlˆaöóbC½×ç-ÙsD­3n3ÔÄ£5> ž#:�â=ˆOTôV Þ£˜Ýèõb$�± DäLƒÑ¿ážÎ?DB"!‘�HHß—�|¹Äà"ìó`Ÿûßû`ŸÁEä r9è-�¬ØÊ3þ—ØUñŒŸgü /"õ�zH=?<õÜ­ç?�øyÄÿ™Gü 0"û�}È>„}nNÌxœÏã|çó8ÿmç3¾ˆ„DB"!½BòÕRax�öy´Ï£ý<^D"‘ƒ>= /ºVªñŒ?6U<ãç?ËH=¤RÏO=ºÚb Ä~ðó€ÿ3ø^Dö!û�}>ûôf<Ìça>óy˜ÿ6ó]DB"!‘�Þ !ùb©eæ3¾ˆgû=³}ží3¾ˆD"}ƽNGËÜg|ùyÈÏC~Æ‘zH=¤ž�B=_´”/â ?OøyÂÏø"²Ù‡ìóáØçöÈŒú<Ðç�>ô߯�>#ŒHH$$Ò›!$_.µä|Fñt¿GxºÏÓ}F‘ƒÈAä �ÃAã#- K%õó¨ŸGý<êg”©‡ÔCêùÔ£QF 2â1?�ùyÌÏ #²Ù‡ìóñØçöÔŒgú<Óç™>Ïô߯™>ƒŒHH$$Ò›!$uMðñ€Ÿü<àç?ƒŒÈAä rЇä q�‘ÅÝf¯ñ Ÿý<èçA?cŒH=¤RÏL=ê,b�4òó�Ÿ‡ü 1"û�}È>Ž}<ĨI:¦3³8ÑÄOÞÜídGséÏ©÷WÇùÞi°8'LÈÒ»Öâ¼q„¨C.Î-Ý�—uõʼnèQ—aœ«º£ñ+HsO¦û us¦ö˜+ô+Hs ¦7 êˆM=ˆ÷ª¹sSÏ��æN#ˆ>¨y–“ 8àg¯q�Ÿàâ§üñ` Þ|�%‚xtb†ˆv'"bÑ–„ØÐ!Šbˆ¨ ÃŽ(`‡æáç_A. ^‰û˜E>EÌŽ£�ÄæC¼¨Ï™âæ3-:u€ØŒ�ÁÁÆbæûßÎ0 0¦ZêÎÖÈUä*r¹êÍrÕ=rªÄ@JR2�’�”o#�’‘Ý$$ éÍ’.—fv3¨’A• ªüîA• ì&‘ƒÈAß“ƒÆ�Ý«ËGR<’Ñ•Œ®dt%»I=¤Rχ¡õ�3Õ#\ÉàJW2´›ìCö!û|8öñÐnFv3Z’Ñ’Œ–|/Ñ’Œì&W‘«ÈUï�«EvÏ ìf%ã(Gù¶â(ØMB"!‘�Þ !éj‰qÝŒ©dL%c*¿{L%ãºÉAä rÐ÷ä q\÷¶�ë>¨ØÍèJFW2º’�ݤR©çÃP�úŠ®•šÝ ­dh%C+ØMö!û�}>ûx`wa\7c%+ÉXÉ÷+ɸnr¹Š\õ¸êQ\7úEÉ(JFQ¾­(J†u“�HH$¤7CHºXZ)ØÍ JU2¨òûU2°›D"}Ovï‡ v3¬›±•Œ­dl%úI=¤RÏG¡YY!\†u3°’�• ¬dX7Ù‡ìCöùXìãaÝ­t »,É`IK¾‡`Iv“«ÈUäª÷ÀU»_ì .Á•r¾ž%ûÁ˹½uF;rM2ŸÃ9VêÚpßn‘³s|Ÿu�Yæ9_;¿·ø*÷€züÄ㹚'Qý„i®Ä³Î¶åæ�<ël›Õ§j¾Ð§ˆyPã>Ä<±Ñ÷Ö>EÔÅ‹·¼ÿ[½Ä証/Í×Ý�wXǨÁȺ×ÛF?#µçΟ.¿ôw®ƒ³îùáuo¸cÀÞ Ô½áÞ9öK�ƒÇ™º¡Ô W®1`]Y¦â^z€„Ø •:ßÊò±Á>ê <Õl®ðŒ¨çû�½Íö1gxºÊLí)¢öÍjäñV>ž#:{¢¿ˆÍÁèu ÌeŒÞ1N€ ��€[`K7lÓÅ‘‚HA¤ RÐoLA·áÛL.ar “K>1¹äM$—0Û�„DB"!½BÒåÒaJfš0Ó„™&Ì4a¶9ˆDú�4Îvód·¶Xb¾“N˜t»q&�0ß�ÔCê!õüÈÔ#Ë Ù–A—/ƒ˜u¬f�|fÖ sÞÈ>d²Ïa¾ö…óH˜GÒ#Ì#aÉÌ#aιŠ\E®z\õ8ç�)oÌ7ùÄ|æ›0å�D "}X º�áf† 3L˜aò‰&o"Ä)o$$ éÍ’.—¬v SÞ˜nÒ#L7aº SÞÈAä rÐÇá qÊ[ÑPïu^˜ñÆ´¦�0í„o¤R©ç£PÏ�¶…�'W¶EŽ'§$8.-=|›w€Å±'÷¨#áBµxøäf WŸœµ�¸C×âó;DBø“_øÐ<€ä^Öä� hzAò[[ÂW�–·� ÏÍˆÈ  —EõùkZöÅñ�Ô¥#¤å~¤¡q$†OSHb€ïþÖ,”d$@`H–Ê’¼Û@àßÄUê�?§.¹%9Qïo<|±�,}ÊOòéëÌð ûdD‡)¼ÎĆ;|×n}O5Ùt›{@í>µÆæÆSÄæX¼ç±Ù‹þ ÄûSý>@œ90z�ú§ÑÆÿ†�º¬8²YŠ,E–zƒ,%î%Sð¢qÌåe./syÓ׆¹¼T û�}È>?6ûhDÒt‘Äì\fç2;—Ù¹o6;—Jä*r¹ê=pÕc%�B!fñ2‹—Y¼ ‘‚HA•‚n3㘷˼]æí~bÞî›ÈÛ¥� ‰„DBz3„¤Ë%ê0‡—9¼Ìáýþ9¼Ô ‘ƒÈAß“ƒÆ:§�£Ž“y™ÌËd^ê�zH=¤žC=·UK˜ Ë]&è>@˜ ût)#@–"K‘¥Þ6K‰wiuïR¡Œy™ÈËD^Ê�}È>dŸ�Å>�4SE€™¹/ÌÌefî{ÉÌ¥Š¹Š\E®z\õXEà¼-’Â$^&ñv“x™ÄKR)ˆôCSÐMb³v™µË¬ÝOÌÚ}Y»” !‘�HHo†�tµT¨"À ^fð2ƒ÷{gðRE€D"}O«\kÑ8ïÛ“6æò2—·C˜ËË\ÞGeH=¤RÏ»¤ž›’%ÌÏe~.ós ÌÏ}ù¹T K‘¥ÈRo›¥Ä»´¹wéF¢‰‰¼Läe"/y?Óv)#@ö!û�}~ öÑx$ª03÷…™¹ÌÌ}/™¹T W‘«ÈUï�««ìGÛtLe«N)*Ó9{,�bÙ­¡>Õ•ðt<@,Ò}ºN9KNÈŒ%0j�øÈ‚m0ú7üÓçÍ‘”HJ$%’Òw'%_6µÐpŠ/Qù„Ê'T>¡ø)ˆD ú˜ÔË Pê„R'”:‰Ž¤ÔÉ'j/‘�HH$$’/–λš)T>¡ò •O¨|Bõ%r9ˆô¡8h¤¾4KjE—¨|Bå“—Ø„Sù„¢K¤R©çG¦ž» o4¡  M 4y‚&”]"K‘¥ÈRo›¥î’Þ\‹ B']¾ ì€ Ïe"P/#Ëçr îˆEº*bïÓvˆ°CW„ÈH�ˆxÆ{À”'",ÒE/ž"&•‘î3@Tr#Zã²OóÀk•AWà½iÂ"Ñá Ð1qu’7 [—8‰àI xÃUŠ‚À98bëî{ƒÑ‚0>ï‡õ Ö�2èƒ�¨F 6àÒèº'QÝ“–tá“„¨òIºÈ¬í)¢&šZs¨�§—²¹ð± Ý5BtF·ÁÐ`:cøˆÓŒ ôcº!œ^z‰,D" ‘…~{Ò°¤õ.,‰Â&6¡° …MÞ¬° E˜ÈUä*rÕ{àªÇ"LÔ`¢Ü åN(wòæäN¨ÁDR")‘”Þ)©³j:–É  P…(@ù­P¨ÁD "‘‚¾»SÈ Pô„¢'=‰Ž¤èÉ'ª0‘�HH$$Ò@Å›©+L]aêÊ„©+o u… vd)²Yêm³Ôm@3[˜ÙÂÌf¶0¿Ž,D" }TÒó¹m-̯cÎ sV˜³ò^rV˜_G®"W‘«ÞW=ί+L¯c& 3Y˜É’§êÈdazI‰¤DRzS¤¤¾ª»Pr¦¶0µ…©-Lmav)ˆD ú@¤+¢ §wLfa2 “Y>1™åM$³0»Ž„DB"!½BºÓgbÞ óV˜·òaÞÊÈ[avYŠ,E–zÛ,uÎÄ´¦µ0­…i-L®# ‘…ÈB•…Ôß´,^Ç„•&¬0aå½$¬0¹Ž\E®"W½®zœ\×TÇ™^ÇLf²0“åMe²0½Ž¤DR")½)RRo³ë˜ÚlÁÔ¦¶0»ŽD "}8 ª "gv“Y˜ÌÂd–7”ÌÂì: ‰„ôfÉ�Ýv«±âs±} Ä]~À ³@|ñæç„±À"³ÆpùB1_Lú±e,8GˆÆÂÕM3¢«±$!z@ k?Öí�vôKv?0Nˆž)§‹ìØù+ÈlQƒÞœ¢‡Þéµì`ü+H;`O6@ô >u< Ž�÷§!-l ‹F${rÀ×ðq�ï+ñ½g<Û÷§r.ù°ËMˆn„ѾUÚ¡ØmcbC…}üÑ!‡?öö1+�û ³öh�ψ§ˆÍ#¼è=`³�€÷'&5ú<#{O; ßÚ颙ÈEä"r¹è»qÑ=r­Ä¼æ­0o…y+Ìž# ‘…ÈB•…|aÔä-ÆÍˆIFL2bòMEL2Œ›¤DR")½)RÒ0î•eRE™ø‚Q”Œ¢d 7)ˆD úpäž$&1€Á x+Á L"‘‹ÈEo�‹&áü�! `HC˜D" ‘…>* Ý•‘c cÀ€7ÀÀ$’I‰¤ô¦Hé‘>@0T ~€ãI ±Ö@GÜ<TŒÜ_:ïhš£ïFˆi£c  ¨žóbtGˆya#ðU>GÔÃ÷ &eíq¹ûçˆÊæÇ›“ß�â�ê"þèö •bìññµ‚a¸Å5ÎF 1ÆŠG;«�çF àOt8vˆh‡‚©1 ±úø ­(€oI‡Ú_Zc ¯1€Ï* Ïa”eør<@,r¯}6ÛX3(3ÒVÀ{íúi¶ŒÞëÿNºÛ’CÑK‘KlËñ§ˆ-âÓ�ˆ¦­Fû<µõ)b ±ñæ#Dk£�x'[z.FáîoËð�‘‚ÑöLa³ˆŒì‹�c㪭ôξƒÓKÇ/˰¶oKí¯µGV±¥Ô[�Ky€X_nuB¬]övFt”¶úÛíb£½Ö«wÛëkâpF4qx­D]8Î hÚpºÄLï)¢öšÚr¨Ñ§W²‰ñ±é�5BtZF§âã“;o€8GÀ±}Ÿ Œè†zzåòùˆ|D>úž|ôÓ§Ù¥�¦.<ÈÉCªÂ\�À¤=4 VX€æ L-�‹é7B4Þ,¦±G©e¤­|ƒî[>Í”co‘w¹ä™ ±µ¦ÅÙ¥y,Þ.»¹.‚o¯«XÛ^õ×�ß-M³t¤ ú§®÷¥y§Ex®M,-컄„XÈa¼¶‡%>E4–1úsh@d 9 «ÄÐÞým‘™a@`BáŒÆŠ«¶ÒÿéænŽqXÛcbâ“Ϻ æç=`ýÓÜ{?!6BA ÄF:hÈÍ%#jR ·{ÀÌ0]cæüÑ9�:‘â�|²=GtŠFo ›êÑç�ø¸8aÄØ�ãX@ ú '/ØÐ �õáæä8r9Ž÷£qÜm<»Ÿ,®e'o wXKé7œ‡ü¶Ûpò/ëð£ÑµNÿ9+t[�þS^Wä»#vT»ÍÍú;d}�»#ߌ´h‡m¾$¯uX°ÃVGâÒ±;$À‚6ÐÙ mxŽh°Cº�…6Wù¢GÑ©˜â9»ð‡Šâd‚ ¤‹~“¸á¨>N‹ÄEâ"q‘¸Þqéêë‚ÀÕ±Ý Ä×pPf×E^úsv“wÇJqˆ¨L2™�Ì÷1˜OƒðPšnB°` ~¸õ)éÏ©�m‰¦õ}â•r¨}À‡ºÊÖX]·§-ˆÐ»¾ØŒ¨w­«ï£óò®Õ&ͼÊáKŒ œÅë³ÆTd~-êf•* 9’tðRÔ°.½�9¦a�9ÄMF w¶LíBóŠ/×ä'²aºRh)\éÏuÉÇ£ˆ¹öã%ÜýÿÑCƒè°b‡1�øû!FØÁÑÃ�°§@ò K¤nÔq�sp ÎÓñ`£òàÍ÷¯|1Ð øª íN|›bß/ KBlèð"jøžº%àç+øPÃüž#jÆé>6Až"6Ï¢�Äfg¼¨Ïà²ôÁ6©SˆñG ò1¾œÍ`(@`L7$Ù+“9ÉœdN2'™óç0ç=¢J+§x&8¥³@t@,@Wæm‹Ò«¿çšq—ÚEËÒ#¦B°@ ÐUpè‚ÊÊV ÌUìG]…‡G"˜-L)dpâtV_»3Ô¾¶Ý°ËÔßNI ²wyßJ•ª ü�*?˜’ 9ŒFû`&gÅ“z osug9gsàb#ȸ?HÜTG~ë³â̰DQl¶Mê)[¿œñfæ¸K ´"êkií±ÔÉbëZˆìºÙª%Wd·Œ·³÷ôTd÷�f‰ðZ^rÆ›çÛÍHUðìºJã]Åxœ'×M‹'éíók—çóù:…C 4…´œç¼p!—ÁÙDbcôIejAF)s¹tæ’³h¦A"ݬU™û`Òé�ôGúû0ôw�xfqé‹÷R›XWÓ‰QZ�Eùù@¼D=š�2öCD_ºÈh•‘M_Ξ«Èêop�Ø”©8{Û¸%ÄÆ¶È±Æò19êöô\³=fD­ø8akÆ��AÆE>=ž#:©¢9Ä&g¼–OàçˆNûè°bôƒã$8B”Ë€ÀXŒÞ(çëYºkÎÍóò¹&OÌóg_‡z:äìHñ¬s³Ì=r¾vœ(;×ý *û_=�óaHˆ ÕYßd9!:äg}Ëü§ÉÑ#ENƒÒUn“gå8Ë•½æ‘Ÿ.L&ÑÌh²›¶ÈÏÚ‰ÝzŠ›'ÞÛgÈ9Åãªï‰Î’Ô«ä.ÆL«f{Ùü¬¿ÞòÀ`~žÅ3åö¢ ‚áÄ<n1¾h™¹ÉÀeu?Né§Š,þôúoEžU;uë¶r ÉKM§>3Z8ÅõkBòy�¼GÞû¼w�h@á~Ü–cõ楣¼T b-Í�‰ì�³;ë@·'ä|íŽ:||G€úfϺο:�îY'ôž5ãÅlÌ�jŽb’}d@�>ÒEæ�–ûž9¬º!vcžmiÍ–cd+RìœÀÎ9N2x1ÿø‘ló̧~JT€i¨'þœkwtúðè:Ö5êà?ë¶Å‚”íPà¬4ÞÕ7L#bg 1h °; ˆ±ûðS˜x N…q•³e Ψx¸“î°7wâüî�OÀ°ÎÄ—ž|£Fˆ�$¾u0�Œ¨á#:BÌôÒUfÁO5ûhÎЩoåÓé9¢s0úk€ØLŽ^‚‘#`ôFˆ1 lì [ºá¬þ —DF"#‘‘ÈÞ%‘ÉAnÑœßu^þ¢/â“< mÐâ$îÕ&+â ±wu†ØÁ´Y�‰Ø�¬íC3Áµ*Pº²Š^0Ñ„ÜéÚJ(z8†ýÆ„ê¸l˜Ð�{s!t ]¯�u¡ƒP]p¡ƒÚÄ¥×:@dŠht‚[± >‹ÙꢹyÑë^EË@Cü îYô¾µç[üÍSíª!P �joD†DH"$’ß9ª�5ÑXZˆ¥…¾_i¡£…šwˆR«=^²tÈ÷Q ENåܦùÒ5G¿ö‘­Y‘C–¹´P["Ô¾˜|f®WÓiH•…lv¬u®™ØÜ"ò¤¹°�Ψu™m/Š:GÔ9ªŸ[3TJ,Ýh¢ÎQçÝ�I~í€"GëaÎP læÕ·×ܱ䖖¹Ë­í&©\‘¢¹®ûªÏA�»}üYŸ�$J%‰’Dÿ�$ª‹Òé¸]–›5F=5ê®u_û–rù£mÅ,Žå¥Û™‡‹>�%òt½ŽcùÖŸËš]ý¾î/×Ü�KE`$Ë¡‡ð82°-F¹Šù·}[ÒÎFÌl1Ðta;ø³ÎShUã‹ßÒŸµáÝ–^¢L[u÷Ó;Zñ]UØlÇ*]’Ž‚|/†ˆ »"ê›|998 ¹šŸ±Øå=Elo˜î<@.‹ñú>ô)b»W¼úÐ=0:4ÛIÇqPtl};6¶æ{ú°Y páã*¸ù�à(ÀŽÓ‚{ÀÞ €à`Âû!/ˆug‚ø dD*ŽWˆ xÒ¸qeDM2Ž|§Ÿ5ìt‘Í §ˆM»hÍ=`“7^Ê'ø3ĉÝ5BŒ^Ðí@04 ) ßqrƒ�¡€$aL7´Ù»=É¥äRr)¹”\úm\ªÊ5åMéÖ¸@q…Ôp…‡\á¡"&xi 2ú$Wx¨ÈÒEIk ã˜^s–T<$Äpr�Ù¨}‡j»†¸¸¾C¥–>ðD’­z1‡ép5ÙJåC5¨;Lí�ŸCÝaòýIh9,®m@1Š9¼W1‡7#HCr"9‘œHN7J3/¢øËõ¨Q Òµ W$&k¾æ,šúçæêŠ®˜º"ÏyŸ„5²:«+¦.²zL1U,0çÆ5­e5rÒouÁÔ:ÙMÑSë:vÓ‹æKžCãÕSEãõÈ™îY=[H6WÖu}ÊUìAÓ¸Tær­´d‚u?±õr¤u—UšG~×íë2Õ]–zí%èeªÑ¥St…¨j5éÓ~ãªGŸ…G UJ¨RBuü6âÓ¤IÒ$i’4ù¡hr¤4mqŽ&7Íúw9X†U ~ø*PÕŽ½oí³Ÿ+ú4O–jà#’~cã˜-ñ„ï(J< rÚ~ùÒ*JQýÈlF�-§6Ĥ…ÍñG•')qa‰uZå á4nÓ(‹�’NQf)€5'Æ#j£�…ëHY¤,RÖG¡¬QÙáÐ<$J€rª”S�ÍåTÿ0rªålñ QwEEÚ:‹Œa¾�:9êÓ‹ë�]‡U^@{ÔüPÀ!tZ+#ÙVu·Sˆ©ºLk¥B›ßrl—SUC¸ÕNÙš¨)ÂB9Õe[0�ÖÊê¦s%Qy 0 k«­êÙ¤fRª>—ë[®n¾×/�í[+ ¯�Õ€%j·ž¦ðuê£BMÕÙ¦ÒÛÕ©ýmå�Ž#Îueñ½ÞMî\Löä†AoTªÉªdU²*Y•¬úgdÕ;@V³§/g†žÎ~=½UÛ°ÀèIR’RRÀeË–³tjζöGºyíÓÝRùÎ^<ÒÖ뾦 •–±*–x¤a�Z,xÚ$Ò!aaºn¡1mÿ½¯}É#’@| d#Ùˆyòt«:ë¦^²Âu#Æ݈úú[¯!¹O ¨âeÒ¬p•×xO*‹FpJH.E#(Aш?°zi�´GÚ#íý`´§ÇoXªØ£~D=­¦œ… ê@<ˆ:®² ê<ˆZ6¿ê¯µ jéS}¶QC© AÔ EÄLO3Üá3 Å3ÉÝÒ­œ¿”Qûzµ(©éá‚ä 0éù‚íÖñ¼ìÅB}%%© šNñÍ&›‹!ö½HÄ_8Ù°`e)-ßþNAÒç-À¨iFMÿð)$’ɇä3(|G—NZè)ÏxöÀ³‡¯Ÿ=¸nEöæÏÈ¿±³ñÎ+â' ^;!gw"€“Ï›¬ÈÚD0âDÀOÄN-@~±lF?ð£‡iw—»Ÿ4øGw™«µìùDÀÎÄÝbSµ2ü–}48i�/ᔣþñ�kÀ–¿s1çêËÚ|ZÏFßéDÀçî‰JOV‘)ùÿ}ÆWd>;V(móÚ�ÒÄIÒ‰€³Ë�”ƒC÷áÛ±yå5g©ŠÌ9>y—í·E9×§*¯ž·u5w‹ÖïŽpÉ£äQò(y”<ú‹yôÑ$ãuNr‚�øêНR|•â«ß ¾ZŒÿÒÿ¢�]EÞ£k™å'é‰WdTΠM¦4tUÍø"Ê{;ö›èl7Y‰¢v™×Ób±¡¬º[¾é,5Ç0¿–ÜÇPy]ŠŸ6¾Íºª&òººÇEêm¬† ¯+ÜäÚl ®ðºs·©ÞÒ!¡ …×ÍQÐsÝW(¼n1QUHºÖWŸíµÅ!UÄEJ@aÇbZv² j «‡Wïvĸ^šâ&bÖK¯¨SEˆI²$Y’,I–$û«�l[ÖÚ�´¬jý d ¡™�þ–†D×ÌÚ!CÀúw®ÿ`¡5 ñqm�#½&ë�ƒ`¾‚¨Ý¥û˜Í�kŽÍ”Ôä¢3.^ÜgåSÄæò,ó`}„('ÌÓfi^ŽLr’”4EÙ2NÇ0~’Xá¹ôÈl­Nr²§5s¤î¨;]ÔCv᥿ój�Äxøb¶v÷··¿NÛŽÅ'©Ô:çn˜j7LËĺsª3w_žŒhTËu�^±ì±8—«þËš…ó¿‚L·÷©²öí©]"ÄmÞª)J~c¼© gI�áÆ?-¨—ă°Öï–º?Á°Ùfcñ'a0њʚÂæ-Þ‹�uÊ[2zÇêÁquÀ—†\�O¾n Ç&¹È“DDϼek…å­³HYflW¶Z§±t#Ä„XE·ºðÕ–˜›$7ÎyQ­þê©K�ä3òùŒ|ö#𙚷ôg96¿«Ä\×x{B],)�Œå€žµ¸G6" ôç=ŒÒý¸|yÂÂf pˆøqº‡qžÕ„mq«Cšã·=¨Ú#U,„Zb[T§ÕC¨á­nÛ‚¾¨ª…¥J\ÍÒiê{‚‚]Sðv5�éÊÁÛAÑÛAÑÛA�èíô¡·¾½õÔóäzïâÙÏÑÛˆ˜ž}ÕñÑ»S"ã£ý#ÆG+}ݤ…�ÓÈiä4rÚ;ç4w²E¨£�R—J¢Ä*Œà´uIñÚ%85G}“bgí¨“‚ú„ع>*°Œ @"dDƒP á5�XÈC\äÑϑ٪ÜxsˆÅvÄkyüÇsD£F¢ÃˆEŸDÇÁàx K àÑP� Ä‹ÆxD jÆðEq�×1 Äkų½R‡œ]L ª*%ÄR×½+¼4ÓÐE}' CBl¨P9jˆè�£Õ2 qw€ÅÓœ‹Å§ˆ¾î¼uw¹”*Ò³ÕÚPV«m/oà6+/mjÓªoàÝ0‹µ¹§ÜôK½Û¥È¼h©!ô¸Gá &YCÎ\·¬Nª–ŸšÆÒãrJ%‘I§ý¢õÅÂ|*J ºÅ÷T“®(•r\nÁ&p%S5^9Pkˆé:lš¿P*±,3Tú_M“áhaMeß-¶ÈéD4Ln¡�.$“ ÉÅFKg[T…�ƒÌ¶É£˜ªá´Ö`vÜФ…7’;É�äNr'¹óqç=¢!�'BŸ•Ø�×.T¼"›Ö…®È¬Çà~ÄêÛ»¥à…d÷néuQ öÉj¡âeàìQ Î­3 µcy#öúÆ{.1u6ÛiG]€�¬^`…áhÑ‚#Y_ýsõ·öŠ+ä‚Ô®s ¯ ~dL  ìöŠÓÕ¢R³*¾WXl¯–IÿljYlßÔá!ø y µ¸íãxíÊ >@”+@5€ÓéhÕXŒgÅX wˤùöáÊ|¥Š )“”IÊ$e’2¿RQåÅÊ÷%Ϩ°Iˆì‚­ýk ¬Á±<Ú?�ÈÜw=ï÷Ã|ôƒ°Ã–—ã0D–Æ%ˆ$À¸$dmLñÍéX�­8kp�G-À*¦}®›•ˆuçN[/·ÈVHTâÕÈV„U€Š§Jݶ REÏÆX$î`Žp ˜±6˜•¬§9‚>|gq!˜ ‚؃$%-“,qž)àÄ7•×åú�"c*›-D©4Ê¿r$ v¸ÏݧûÜ#F©9F0Ï%ªôZ÷ˆ^ôï@§MtúPî�q ÄG×(< À˜,®�éâ�ö8–â/àq,@Ç‚Ž@ËÑE †!!ÆØˆV"Êáˆzë�#¹,଎;XísD§Cº�ÍÖ1bSÆf}4y€{Ä«;çw†ÔJj%µ’ZI­jÕ²-ßV´ÅÓû ¥°â²í(S±÷@\">®2ùLy>=\ë$ˆ…YÅo«“ ˆæá¹¤½¤(y»›’]*UPµ·P!Ê çõ€)‚ž®¿™~¤TBÜ•ÀPàܬîº×¨Í¼ Ø^¯œâ‡B•l÷´£l) sÞ¹¦4QA@*)Ë"\ÙXá­Ôd!·�[È-ä–ŸWråæ”1éþŸrýå+°ÀK„/ü€•æWdÚ­¥û‰—�Ù× œTS-ú¨º­?ÖNÀßKL¦Ý¹L§nS¢Å^+ Ž¿ÅÍxe€iFØûÜ(>Þ[meÃZœO£Pð7–�lé’J“` :ê+  þóeåt¡àï¥BÁ±/s(ø{±€Pð÷YX{íBžÁÙtÿ¡àï³9ü7“/ ç€cõ  ç‰ ƒ•å›%…‚¿ó;{ßq¼fF ÚëÐæôôgápäDr"9‘œHNœ—!¢§¹Ns}©iÞÙ´c n » }û*·Ô]™ê`ûÚ¸œÅ}E-»…YW¶oû[ßëê=\ö¶À`OÇë ûÓt�í-Ò}mû‘žm{–Ô>Û Æ;ø5ÞS|áë‘ûÂwC’¦~èolÇ$gzÜâû¬RíÍ÷b»Þ>pß� b[¼UåMžÃž¯Ô9jµF·EEp¸b[G9Ù»íf©Y )©˜Žq|ÏZŽÝŠÑ�÷�Ÿ|±þp¸kïx}�À3ìï çñ=à]4:8x·ˆ ]øÈÝ(2¢†Î÷bæ–®²�ëSÄ Í6ðV˜0O›fè¯â“½#ƒ)�Ñ!F° ° lé†bzOy‡¼CÞ!ïü¼#瀳�Bçï˜� èë4ÄZ`-ƒÕ„»sM9ص°W3¬táêЋ8ªcÙªˆ…R\K±¬}hÅV]a‚àI"ÕUJ‹ÇWºLéµTL¦4R7[ù†BªÉ”†@ªË”V‚²PYz^iÙÊ¥PHµ ‰$‘jAqø°�--K¤Ú ¹h¤î�~zh¤ºp&4Re—1•, ê:¥ÐH…N)êÓS•”ª¤?€*é1ÇŠF #…‘ÂÞ)…©'jÓšmIÖƒü‚¶±$ì•Å ß1HAZvÏ <$J4J ~É÷ñ¡A+JÓ!‹�f©D£¸ê·ü^22Õh,E³ž¢H£—Œ” °™ñ¥rZQ¥ÑKF"íÉ‚­Q¦ÑëEF™Æ=„Ê,–ÔêE"A å!£N#Ôi´ú�Q¦Qr  ±`q/eëæ~îË4Z�ȺTò*C»fˆ¡J#jDŃÙ+“–,ÂU#kŸÙ¸Lšì‹EÑÈŠtñ±ÕÎ�œÅo’,?ذôÄŒéÒÖ€äLr&9“œIÎüYœ©‹Î ‹Î[%¼/ŸFJxÅ,+”ðð›©�!©ï}B²ÙtùêÎs²SÞK{Â{+TAëöÜŽp]ôp¡ÍLÄG!DA+²ä£êŠ?†v Ð�-­†¹Ì/Y¶ÔEA÷Ù�˜]t»\Œ_Ž—,RêÒ [œä›è†0ˆºóm“*Ä+Mt³â]!läB +TÍÏUSšMÓ…@!S !PÈ”ŠÊÔ¶¤IJ !SêJ ¡S*³ìLÓ9„?C§2Ÿ— õPæ³G(óùÖe>SŒ�ŒGÆ#ãýàŒw�h6hó;~=!Ôó‡�ÖQïÒ)"5dë²ñ䔸ÊòWØ£b¥=ªnô6î‘÷-œ€ E«"SŸ¢…t&¤h�Æ‘¢…³äh•˶LÈÑŠœ'OÉ*�Û©#½æSä ¡ž'2�ÊîQ%ž�T|Çä Ke±<’œp¤tn­"eœ:yªT¦>Gë°,v$d‡Ë51E+ÛS´¾Oú'™„LB&!“ü¼dO;ÕHý\uVwKÉ•™µÄ¬¥7•µ´bG¹¶ ¡”\äYKö§x¿K¾«§,M®�Ž”¥ÚÛ|U–_ÖÜ6üH-%ïíìÞÐR–"µÈS–<ú§ö´Ë™EÓÍ÷4R–"³hjj’9³È“˜ü›9KeÑHòŠœí»‰Ež²T¿F¦‘¿XT$yÊÒáe�0ë‡ßvLZ.*'ùTŽÄ"OYŠÌ"'€È,r’ˆÌ"OYÚòö­þ¹YIEKWºÏ»Ü,:=„%­‘ÖHk¤µ€Ö>Q©›JÝßA©ÛUžqÕ¶yž•=©©í‡½q›‡:»4w.ͽ¹v´¹qqî¸ÊŹ7ÈT¹87ZqîÐ¥vqîJÈ]²];…Ñ|2Hqû¹LEü\ÆC!\œ‘çÞ.Íó†8÷nQÓãÞgÓÁ„7Â'¤ s›ªŸ€D·?ÅÔÜ-\“¥ÚS+æ‰ p€P�^åÌq,þÞ,@‚!Á�`~3‚Ñ#³+ŽÌí¿·óê/)G`G<žgì MP9Vm‘¡ ÕçÕ…—çKX6Díû]SwsIkF¤P»Ç�ybQ$5YbQä4éá}ÎiòT#Wü@b\ÍH,r™�Â7�ie‰Eð|#³¨®§-Ú®\šý9Lžk”Ë,ª+õ³Ïc‰´&�NiMžsz­äÌ\³)e#¯yM»èM/9UÈós�×äI=žÖÄô"¦}·ô¢óÆ‹~ÃHž!Iš"M‘¦HSo–¦î/ªÞ–[íèÏÜV¢¢QÇø‹º­JÚˆŸ¸<üa 1/„?FˆùÞ 7_FÔ9aø¶1c\äÞÌçÈlE¼9Ä\©ñZî|}ލ7:l€˜ëZ%�¸V ÈP&"ꇆVI ®UâîlH•p¥’¸Æ€ñRñl/ÇÑ!gçÐFQ�„hœºÂ+ƒŒíP”Y¤t³ÌÍŒèÀœsq�¶PÉ™oc£ONÀj¾7¿nj®™I©Ìáµo¯&Ìom^pé™k½E¬¯ä3stýiŽqÙšTB;×nÔŒ¥tÍa�Zºfq'³M¨ -¼aÅw0¥ŠGë/j5k´¢>p¥—:æIWQÃ0w¥—-Î¥Úæ6Ù™O粞Zæ§NyÙ„&ãTóšŒñ$“—`"Œ�S‹‰`úÜЖ�÷‘ËÈeä2rÙ;ç²{D}dM¤ÿ&¬\Ãs0¨ä=ª§ÍÈÊjy­;+«UÔB@[ WY¤\ �²ÐϲÜèâ¸6B?6‰ÐÏŠ¸'u7•ߎ"T2ƒô*Å&Á Çi{Dƒbç‹`Ĉ·ôF—*r9ÃØQ#îQä�“W¹mÃ=VÒÂ)]x1˜u#s·Y­x2¤¹æ“ ‚?ÝOÀpP†ƒþŠá ÍÜ–“KÈ%ärÉ7r‰Ê,7Š[mÁtI>¦"»ÍÔŽ…ö*ê=VDMP%RT%Lbn’¼�gE±I9V@W’Rx\/YmáW”Ž•ÁRÏ�•Ž­3Ê…-v]†y9\TŽ�r¸V'¶ÎÐÉü•‡jÇ¢®Ž=଼qæ…oŽ­ÿk $^&6Šß–Ô“QüÖ¼å²ê¶ZžærMµnï¯$z®ÞäÊ‚ºÀGõ[¯HzºGø%Waõ ¦Wóœ[•S¹“këÿ¨åŠú¯S'=Ãú¯©·Yÿõ·¨ÿjA0IàŠEŠ"E‘¢ÞEI®Þ~XaFÏÔ³�ñµM±/LWaºÊ:]Å%n��R²£cö+_ä}WM׿u÷Þ?âÑ>‘Gâã„<ÙÇ÷oà *H$‘•¥{mÏOñ€’HGAÉÑ÷.H‚JrDvŠejGrJä�xrJ žœâõ憞úš[ž�²»;uÂ"‡Ä³S*rôÙ)›U�©È©Q=[ç`–HžbNèÒ¼Û)‹Ä'{]žì}jÊzh…·y/2ê£Ä¸Õ>æšQGú!ý�~H?¿9ýÜ#êoÚ£Üà�ñ,Í(Fü‰bÄ¿½ñ!i#yâú/–zÉþ4ßÇå‰?ÈØ«Uw‡:ñâ:6ÂvW~ˆ¯®³³�E“T\‡Ø”‰WDѺqˆß#®CŒœ!²¦;úÀ®C\IÄ""�]³aBØ¥ˆåˆÂ¦F¹É%q)âcqÃ>Y*É~+N¬�lÈ¢ªn!lâĵ�«ìRβlŽ—½6)âÓþ*âàHvâÚ‹ÅH¤�…±B†øš½rËl�I<ÝtˆëçkÕƒÁ¦®~NÌq[‘çÈsä9òÜ�Ìs¨¾›FÕ<׃x­÷ú^W“¿›�¦ÛïÈç!R;HN^÷j2jx#¤ùñ÷½Zžð\×ör|ÿ¹OEMô!RZä?ñ2[u'ÔŽœQWë�ªä]Z ¤˜ÔűØAJ1‚óZ\¥ºñ§Ÿøú“ãTøñöÇér ~xàý§ÔÄú3N»}2¢#çèÄFåИ–CDûÓ£�)ÇчeÝZR·v£yѼþÐæu�ÜŠŒpçÀ�·¯4Ân„º}=™JÆ 7°´¯÷m_ÂŒ¹ÁàƒûWš×;2¯ûפ+Ç­·Ü¿Ò?¸*-^L“åþ‚ûWÚ×û¶¯q÷Ü_pûJózGæõhû:s÷Ê�ÃÛØ8p÷J#üîFXYÑ]zܽrwÁÝ+íëýÚ×ú÷çZ?L%›!Ÿ‡ˆ5ï\ù—ˆ¾æ¹Ôá½rWÑÁ*õC]–ˆ úQ?ïçší-!f:æh„ÎÅ1g~9?�¥ß„~úåh_ïÒ¾úl/ºLè2y€Ð-G{6öH¤„~úMè–£y½#ózä–Û 5B�="tËÑ?¸Š[nõ€9†ËÑmB·íëÛ×mÆ�&tš<@蘣�½{”›Û†[$žËAoÍsDß!Ö™C¤õE¬W½¿†ˆ­{½—cmêXªµ�Xïâ{·ÁØ7â{‹¸j=ú?§þ3;˜‚ð�PB–~;ªbŠ�†!#:TØó�rìa:÷HÞªÒæhs¿©Íý»Õy­Ÿ­3;ˆ¯º^Ía¨ÎÀ爺¯ëÔÏ˱Mø4múQÂFý9¢þ©ŽÓ´<@Ìq0Í»ô]F–:ì/Éý0-嵌óaLëê. —~iá ™ê,<ö)û�Ce:g]b$¤è×&^WÙÓñ±W¨xu.Ÿ¹vι官kW”õ¢]:ëLH‘ó}ÌËâ�¢Þ�y9ÝÇ“�£õ˜ùGÐÛ×ÉN:š!Íð;™áN���ñd–æõ&ÍëÑÉìÎÚ8Šñd–FøáŒPNf-\å>ûŸGg<:ãÑ,íë=Ù×mÖ?�ÍxlöáÑ,mì}ØØy&ž’�ž’ñd–6÷ÎmŽ'³<ûþGb<™¥¾3«°óälŒð䌳4¯7i^�fy.ûá‘Ïei„Îå\Ö‚UêðT–§f<•¥}½[ûº}â‰OÌ <•¥�½‹sò€l ð€Œ‡²´¹wns·pçá Äé¾bp+ü„Ïõ.‚µGˆy)Áþðd>GÔÿ‰ïÊ1?*¾O�ø7 ÞX|çFˆ9uñ½ Ä¿©p㻈›ã*ÿ~âßøxº¯:äìüÃXO$D—è _”ŒíR¬l0 ±Ášiˆè ãƒzkMýiMŒ&ö+˜Ø=òSŽüo‘ô]ÅA.(uŒèȉgÆCD gÏ ý§ˆ}*pª=Dô“ƒÓq 8Aǧ §ì#Ä>�8­Oˆ�èã;ŠSÿ@<2 ®òè�„X„A<݂2à±è ÄCŒëRÄU` 2¢› DlŒÛ^ ò[‡;¤ 4¡ÕÑê~c«ë·°Œtb¤S,ÜÑ ?ª>ª¯È˜¨1˜(†ÜѼޤy= ¹c�Š1Â`'FÜÑ?œÞˆß1z€ÑF¨ÐÆÞ‡�=ªSÁx�1ÀxÆ¨ÐæÞ¹Í݈¥0~€ñi ¢B{o&Æ ¼�`†¨Ðê¾_ˆŠïaÀè€4X R¡~T3Ô# “og� £>1H…æõ.ÍëA�Ê@È�~ä1@?2Ï.hsïÜæÆùô+?@èWæÑMì-›Øèè"K¿Ë¨MŒãYÔ((j’~�BPÔœ¾i×ÕEU›¿–>(Êä *V7;ÒÁ}˜ÔÔ�åõÊç†xàC©>D¸mõãÙêOŸf?0™ÉÊŠ½öî¾Õþ:61ܵŽí¶ ²«aÈN`;!^¸MÍG!¾îöƒºêoW\¯{kÉ6ïòþû¶×KÛ;n‹HÃdMÄmY„ë+R·»"ç«øhö]¾8ÔÿÜ~R^}T}¡©ýæ´ŸJ»ïe›ˆm;›ÝlÇl–´íbóXíOî7‰–á±ÙPnõszÉmŽÃv=[ýxÎí7¾iØäc)ýPêGJŸ]6í¼Šœú ç¤w®&j]!ßÏö›x[ýX^Ò[åx-Û#ä’‰\‘S�ëöi—¶ïr=rÜë„™K–�Îr)¢'xâ¯)òæÕÏöV{5ç¦UY_nQÀcгÜë8ÚE—uE ñ›"«ŽüpG0¾¸JÍ&þô)ïm�Àå=àí‡âe ®x‰·†¾åñÞƒ¾%:8!6з 6–¡oéV’µ$(^ pœPsL—˜™?ElnD[î›OñJ> Ÿ!>wÑY#Äf<:=°o€€kÜnØG¿¥¤$R)‰”ôF(IôÖ]n}»-›±w¾‘"6Ô®ïWÄmëbÙuáiñPõQ½ØµKd×Õ½IC×éT=Ö™ºµé.ëa ç Aìí¼EºüJd¿= v î×Ôd?ï$N~£ì"¾…œ^�¤ìÅÝÏUþ«K¸¶¤ìÚ]–û+ž„­K¸®ë�©t מ¦]‘Ó|ÁíkÞ¥`[–s] ˜¹�§å lÏŒ^ºµ³ã)ÙÈÐ.ò!nnàK®%i×ïÎ4wӶ߉v —†ûªðc1”~磹 ­'¾ÜŸ8e땺3~È,_¤ŠÌÒõ‚ìm³xˆÅiëê¾D¬' TÝaȶ±"õZY¤³±ÊMŸ^?GûMµØS‘U6…Éæú…œåªãÒ�ó"Q�El¸¶ÔZ(ë ¹OýŠiœ¥DS.ò^u[¬æ6×½ÀÙ®òx¥¹~•yV]i§ Ó¥Hó,“|•(¯ë¢À$ÛCìpoŸd² °Ú{Nõ›¼´»Ìê€^¦Ú+mfn—½çTû`–߈É2˲¬"‡½çTÛ.Q 2AÚ–|™¤¥gžDÓ~ ‹4ÄX*“\µz¸—ÄÇî'ææíŸõ#>Ë+Öž×É1ÕI}�îÖ úçr´7ŽV€AÃ0 0+<Ømñð–bÞ:óÖ_7féÑNŠyˆÏRïì„Ø€Ä,!:°1MÍ`›Zs@ìî9¢Öšîcóà)bó)8@lÆ‹úL!Þa>ã£SˆñD ˜xK@ò­%K‘¥ÈRd©·ËRwÀ£âcŒêƨÎË�ÛçM¹Ðù(îãìS~¾ö¡ Þšõ°3“E\¾ ŠúF§xJRp(ÞQ²kÌ_³µ>ÏÁ¡³²p µÀϹX¸ÂÜh0bEÏý5k»¥ÀP$ºžF@ O¦!Ó�¿Ñ�”Qc†ù#ä�˜§œa^‘–Õæ9»ó©´/ôTW¼ �–Ó}¬ºÊó®cª Ómu£–%ÍTW�¦®�”¨>éúq”¨~øk}ÐÔu &М sÖuô~Pÿmæƒn×á¯é –5†%,Òˆ”"êÙžèÜãÙÄóñç)�ÔÓ?ëLR·ÍZ×#ƒáHÿ¬Èeþò6ïrb©'„ÊÁ†:Ìë„iÇÈH,•¡–/‡õÞVºçcîEÆõjö·iÐÓ"ËÌ’�Ë™ÈLÃýA ÷ë)ÒïB“äÐ/nÒ$Ù$++�¸JÉ2ùydEÄš$õ‹¶ïY‚¤LÒýY‚ä8eÿ–%H\dÛ$`­!Íɘ4IÄ·»¤%ŽS±Œ½_jtˆ�ÓîgÛ2b�ÒŽ\ç,ú”´M&¿3ÕN~Ñ8 ü[å||u]ÿ£9CνÅä¹{êKBü<©"ð¡{‘sÓØ9Žhký³ÚG;ÿÚíÛW‘õµª•M»žIi¼¶$™íW‡Ì›†¹ÄU²Ã*=2kÀŠDÉ· K¹v jÑÆ•º8ºÖ‰(,=²¨síðˆÂRMªùÒ›/s³k¿±íT+Ö“8 “,Õ×]O릶Ÿ‘ô±Kôt£Yê¢åÚÒß,ùdÍß&ÓF³–¶í‹Óü´"~«E5d¯Ô�\‹’njKµ•ãÊ^Å2ënT–3E›S×[Ñ£KÍ»%®r—æ=àφ_Ô‘ð�z‹Ã¿:Bô=ÃOˆûr½w2Òº4\Â÷€ Cx–}0b>뢆W¹õ=EÌf£=Ä,=ÞÊgÃñÞ±)8tÚÅ8`"b¬|®úhÞýíSìŠP¯yƒ¼AÞ oüÞ¸Gú:qs©ÛIò°ë,]/!³¼Š\¹â†¶—:åÔ�X–µ¥•:å–dh P«Úe.ê™–ÙPCÔ›k6Ô�3Íܸ4u»"G²˜|_µ�öhM(gËÍK�Qƒi/ IFEé%�®¼#„v1Û+Ó^EvóòŸuý¿oŠd ªÀúz%s©Àb™j-óÝ­ãÐ1@.¼YGEN�Ì5k¨À. iƒ¿—œ.oæ0B�@ï·A¶ü=à�Fú<¤Ïû Wþð·Fª<:&ïM¤ÊƒH•÷±Ìˆ@$Ï3›t•’Ñs¤1XjÎ0Æ[ÁÌŸ"69Ð_ÄgzF£7Bl:ÀÀN@0ÀZй‚\A® W|�+n‚?,‡Þý&_·Ìç¯ -_:ßGsª ºj²Lìt >BZ†f:>·¬ïçˆæŠ§õ¢É>qÄîH±kêz:O¿4ÿ=°âì–DŸNØ�àdWád<?÷‡û©÷ÝßÞ~?€Spï†8ó Ö�qæíƒ�M¢�3ïbiõqæ-ò ¢—”_HW%ÄL l½§¸"{‹�6 Ò:o*ª óœ:#ë.\ƒD²ÏbL " ” ó–ìÅÙðìõuͱ›†Ë§ø Ñ–(]ŒÅ&;×’­Df•ìWÃ’|žMB•zÝ%'û=Œ‡ÉŒ»Æ ž|m ÊוgÃ&Yl%Ï'‹Ê÷—ýd•xó4ñ¶}j}‘&08§ø�ë»:"èyI×8$+’ÉŠdõæÉê‘£¦¢MëMmØ,>±mjâ¦3 � ‹F‰‰öRéÄ'êî`=5âÐà7ÊN{¢vÏÙÔ(&—X¨]ØâB|ÂU-fwÄJ^Ç’C6BÕb:¡©×Î7Cj2Ój£UwrÖZ�e¸.èštõ›UÎ2ü{Ö£€ĵ pÑ„#Ä gÁ�{“àÉš®bq˜Ûš*¿†l -—–ûÆ-÷®°™§ÑÿKníf AÄ'ÄoV I›WûÔ ÎÁôfÉIÑÔ¿ºø‘¯lÄKx¢Ÿ¤ Z®Øø’£,<)VòwEjWJžHÄfxRìtÍžJ[»2¯à�w8µ<”ì-?/ʃÐç�ø¸`ÞaìFˆÍVX@ ú Ÿà°´›)ßg+‘Èä��É£ €®H^›³‹'@ÂêD™sMÂø „؈ªŸ'A7;'̈ž.&©¸¢§”IrÎÎ6;¤�†”�š Çªé;yý 2kåJ4f€èIpz);-þ ²híRt×ѳêÔí�¸¶��y'%»ÒÎΓ¶] ú vþž¤í€².€²(ÛáÁP¶›êxoW÷�kQR¼vÜYxpîë>/­ºˆ×¯Œ�ú0xÑÖª:¬ä[›½ö+†\Âíõ@Ií€f7¹Z¢Iå­r±z´’Š%ŠÎÍò’K#šß:ï&�X-¢•'ˆZ‰gµ±—\ÑË2V¤è“ªñ¶‚RQÑË2® ¤‹ÕB„.c¦Ú&‹Ã¨&}®/¹2¢×+D‘%‰æ8ŽT/"ŠЏ‚U`<µJ<¡V¢ÔœW`V%*TŽBÉEÔ›bÆß¦z(�ŸÆÿÿ:Ë;ÃW9Ç0'Ii•*Ä€ÏK?Rê@Úêsm¿¹ÌµÍÍÕ•¶Þ[µSIˆD³è¶ú‰”ô·m[%H¬!çkÑo¦æÔª úv]š0· "Ëu~5§Ï™“\Û—z²œÛ–�öøša»ËÿX^³&ê&/•¥'ß–%'ÿ—çPËÕÖ¾ºèi‹( ¸Ðd^ËΖÉj ú¥Åb‰‚œîí8¼4¼"vŽeÉâ±!šb¾Kôiiè-1}—dêb¹ìއ•—e·g@â+rZ¾»fÑ·ÝÑ#èQ\´•þO| \3÷€7ž@Ü „W„§h€xÇÀã„ÞLˆõ8|YÄF.0™tðn8B½ç$‰ƒÄñ‹ˆã6ûù}Ê’à¿-–9Ab‚”%‰µú|mXÿÔÜ<Ä( Òè(‘)}̧Ū$UA4ÄsFê¿Õ�‚ÜJ +Äf�Q„H‹ -B.sµ}ÑZNÕ¬V� �jV›ÆP¾ŸjVï¶8mîÝÚœ:Þ¢±1°ïþ¾€·“†´R{ž¾ôû�ô«MZ(¦CÂØ®YôÑÔìtS{Š˜êXj๬쵿¦Ëd�Ïvq­Ë!*ÒòÙŽ„|¶)}A.ûîoÓ ùl �Ïvͱ�Ï‚°¸j=ú?§nÑs¬â˜Õ¦^V"¿ðƯ“‹¨Ù+ûMç–^†?­ÓÄgc+ºjÖ­`6šå�¿Ö)j]¿ÎgvÚ`ÈÖݪlÍ¢ £%èW_�ÛЯ;TÂ*Á”N¦ß¼M‚ß³’:vdõ|WüJˆÞª²^ 9ôéèn7×UTÆ ºµ­y�l¬²0Õ¿UO+Ö•±Ös·:·Û¦Š°ÝAâu³ióm½ PV'øÙ©éÛ$•%›½ör¨>ìS]H_`–Õ|2fðÃtZôË c˜!i„4B!�|;�èÊ$òcYY> Ý/¬,_ì.ZI8Õš÷Û –‹”„ß;sDkPIÆÒ ’YËbùÈg#Qõsd *>ÍPõuí%EBÏw|ºÎ§™‹IŽ:𕕮Ñ ‡DM¶®58ÊØÛp¦¢õ@VßÔ]ÆÖ—±?Š6&êÖ×ÞóÙŒIŽÏÌ´ ].S,Â…¹&ýÔ$t~QMú¼9äàø€S@âaÏÙbo%b—¦Ü„6§<”2%æèô0]zs.î¨Ðãêô0]zsöü¼ZŽz˜.½ée~Û«¯KÖôM¹”6c*^bxë=3Yݼ\²Ú¶MMNê—�ެøÙLǯ ~ ÁIY¾\É”›«|³ 0›ÇÝÝé�»,¶zƒFfYm@!«)¹ts‡Phó±Ð¦é�D,-—–ûn,WWå†ÀúÇk;RÕ?¾,‚D�¦Šµ�%SvÉ:y²èDúÖjwk–É“—+kÿ¡¬ò:™0ÐiÂtQÙ¸BÓw�ÊÆg‹lÍ…Œ«©N×K.d쵘ë>rCÎ6¿äÒÆÅ\åQÚX’f²ßÛ´�rc/×,‰Év „ M>Ñ^j©²q‘“³aãÍÂMÌ:ÆØBÝ4Tê¯XpÛW¸R¾DamÃöèK ²=*~˜; ‚c}ˆ½êO4T»³‹ØnK«�8C—Š@­Ô&[<§E—«,¥Xš…Ÿ/‡VnED£kØVÛkš\m3*Dµ7/Â"]SªÕ›®©fŠn›iƪøæªÅ6>«mÉ[5HÏ¢¦-„feó¦1�Rý½{úæ :ŸRbײ*LÔËò.¢4uáŸ.2*È’“<ŽU+k|±RÙñYNÂn¥qiꢧ`ºå”Žºã;_5%a=^»V\•(W{MUi]7[‰ˆ®ñkÐç@0px²[Ä=à­…¡9¡¨þÖx:B´¯"5<õNˆ KžŽ̈<5» ÀE[#Õ�í9¢&šîcsá)b3(8@lÞÅ‹úd!Þa>ãSHÏ–ßEB!¡�PH(B¹GnbJ°Î¿FÉé,‘›iн‘wéëî爮»#s€˜¢kä]ºêësDÕe#s€˜þmäfâ™o®½tDóAR&^ 9©$e)È¥ñKêÊ{ݺIU4[1{°­ç>¢ÁbàG÷š¥Yf�˜lâ®ϼD'×íˆm.;@'†Æ ú`@Å�䛤«w0YS«&¤MC”èOwS-2h’Ñé®­ˆj†–õT¿ÛškT!œ•TC}ÇçXf›˜ö -/ŸªõçÙOçK¬•ÉäòÀGæ�{D½½¤»Fªü~–4øµXKÖà·ˆ´sÙ]/_cD³ÿÑbt“¿” Y²ê¾«ýו¤‡=mL’¿†¹f!~w—ƒ¬¹G Ä/;Š­Sâ/V-t÷]H^Žœhi/Yˆ_ ¸ìYvzôõ]<öhÎ#èîKx\ÕwÝ}¨ÚW[´ a/Ý} Q.YvrùrH×.’­½!þAvDˆÿAA š.M÷­›î]P¦s}™´ 5þôB–þÁˆò—þiʈ~¾¢®¦¯¯±O`\ä_Ûçˆ~µ£9ľõQEÓWÏ]iD]Íb듨´ •6}�u5Gˆ®Ž¢Ò&ÔÕ´%U”ÕtÕ/q ª_AõK<Õ/3¢Gþç4y¤@ýPGw•÷ŵøBr×XÆô¬ÝJ¼D{¼—e�ôb ³Và4^«Dæ³¹¢ð'†¸RØd‹·µ¯@S‰’¢R¼½¨W�뾉ܼ¤¾t+»GNu¹Zºb¦¾˜“rmVžúR©§4TjÉe›r5‚Žñõ ! c ¼ý¦üªÏ¢²à¼¼.ð–%—/ðŠøÈ,œ¥hk`’¾Ä+³WGŸë*­½' Ùçp˜¿ ÛÑ!‰lGj 5�H =5Üü)n`[Oü=æEÃà¢!ÐK]á…(è¼t’´ó.IOI’Vâ‘–5¥ú±wCÔ¦]ý64iMë6h°Ú5skpÒ¤uñÛÅRŠšúíò’%i¥é%åÛ:òV¦[Ãø“­ ÝÖ]ÿ„˜ü–i´.t['™Õ™.*d”hK߬7ëê·R+Ç".JË*ˆÀC(Ū¬ÀçO!&š´÷TjoUjÿìÍœœ`>Ü•²w‰ÆR?gS paG©Zl*¨j˜iãí‘e™íˆÛ4$å0ÔtDê×tÏÛw¢”ŠÉzönêªrȺšÜêª+x\o5<&yYÖÃuRwû½ນ² ˜MoõhRá¦pµMAL§ÅôVK5~Ó¨Q-‚äípÖ".zÓñÄÂeü\bmñÏRe§!§®Üõ⢔N€µˆ"ú©ÈÙ–íáÓquRYŒ¹¦©»†Üä*§¥¾�¦%›4j)V;¢-[,y˜\`µœVƒš¬ù7† sp:†ÆŽ¾¼Á0 0?¼8¼<Ä;^trBldàå 6ÀáåqÓɈ\ø}\©5!j·é"›O›UÑš{Àfb¼”Ïßgf½w× ˜4É�ä@r 9Ü’ƒ0çSÖ§MÄýP iDE…ˆûdÇ3��^ŸB.<½n¯*jVº�ÿ"pÊŪ×ÃyÁUÛí6DÛ'�Þ6= ±x—q÷Ã]ˆ¶o.{Ñöíp¥j©RÐpß\ÈŠí»ç@±}_´äRCÎ\#*4Üh µðÝö ¡1êðw”ɽˆU¨—£¬Ì–íHGî¡‚îÕ± �.'ZKž¨"¯!�Phuxj¶HÍöS·£ºX �È•¼&´0<- @âäÉ2 âTɳ±ž#’çLÄrÁ‰îdÏ]pÂ;oEÍ’O-§.q€ÛH�F¤¦µuNDÇ¥[ì6­—Ò3™L:ñh‚°±Yh/5§��xK߸M:ŽYO_�û!ލ×9¤¤y—î¼H�¶,Ä™’Èâ¬í”ÉO¢¬”\½ ßÎ#e�ci\n'Âm0vÒ"j£¸5®>ÓG‹ûõ-îU�ŸÏ}Q¿º£¿$DŽN5“§%û$aSKíiÈfYEëëžô/šw÷³R·0œªœªœªo~ªÞ#òᵊäª{ÐéMOMÔ»©ö6ù›¤­ë½Óì5©6Í� m]Sè1“@ßmSÚºUž”t÷ ù8{?,ù8&Ò~Ý­…’®+Á–Ë5„K+ˆœts¡(ë¡: ™\펽9´j�ÓËq¹Â­´Ë"·u‘Ž(åÕ}Ýcr öù°Š˜î„‘Þ{„²½e{'“žï§iº4Ý÷cº·. _¹Dâ¶ß–HlH;ô¢‰QìÐ�©ÚËe 7Zº(•?,ZÛ(•?”DÅÒU@,úJKûLæ ˆEº)@´J©¢fûäˆrîþ¡È£o]µÃÒ´ýR±C+(Ž&!Š€Ê|Ñ’N©üa1ißTì°Ñþ¨6i=?®õܤúY‚â²h¦ÏH+7œäÃMLÔÃT¥2Ô÷Êõ]ÑÐE<å­ð)äÃe5ÜLÂåÃ7‰÷ß³|¸Eû%µðRš‚kÒGÙÒé‡Ë*{éôë©¶q µp‹5œê‡Þ°&‰òáê‰ËòáêÑËúá.�já®�~®®¾ÖÜ‹Y>¼þÓºvòá§•wõIBà“§: "o•Å�VÇæýȇÿ\�{š%Íò7UµŸe §²�P$ڥÿ$#Ia^ˆA ²J�¸.2¹&½íç$V­fåºaÕ‚nç¡¶­½ % oA%lóïÔÑkH‹tí ƒèÓÀíj‡¡‚Á[%?Ɇüj‡ñênmæZÚ••RD‡Y²V‹r<4ÏEºR73A9}°ƒÉ&ÔA˜z‘„Õ ÉEBŒ¡ªàÄeêxû§ÓtpˆÛ<²i' �¸pN™!“€ííš­JGIKùÓ,Yþ¨ø%TŽÛçISÙC¸ÀõP¥ªu*l�T�ûê¢kÒr!Çà‚uÝ3™‚i$„@U~4Õ�¹½„§3§3§ó»žÎ@bá#çM½Ew|Ɉ+ÀÖ!oáþ¡‹ßL¶�ñó¬CÂtUx ÃìNðs±C¢ró)ô±ªb`œ¿q;ىܤdÛÚ©ÝÑÆ!Ÿ]"�°˜z«èú¸vbØvÃvHÚqh/vÊØN"#—w™êÕÇ’6Õ~xy¬ºI�óζ9W[9ÝJÚÀû¹i’øµ£ÕÈ{^¦:'×ìñ#Ú†¬Y9? ~ö›$‡§mÓ>…,±�!Wd5± ;y®ÈŒ æ(�à±WWàôRDûü.ñžŽDù³}#a8þÞa€#D{+Ì6—)ö^Oˆ�LÈ�áÐ)6Ó À"#’p±ÛÛsDÍ6ÝÇ&ÄSÄg8@|6âEoæyWd‘“Ÿ“Ÿ“ÿ#Mþ{DÖ[z+€6(<°Ö¹¯w¤MЍ°ÌjºQ@ó8R}€{À* >ê,—×p¤�Ì­àE¶ÉËT8ºúB>7Õ¼ ÁîiEÂ>K>!ˆÂbS–ì3ßÌa’’'JD1ËÀIÒÿ^ŠÀRššÖvæi…Â’—Þ€Ãfkª`Úÿ•ŸNCškìã•x^.ƒVK«}‹V«çXgµðüs8·|šK�æpA{ž� W#ªÈ©u«�ÓPÖ�öÑLˆŒ´d V½�%X$DslÒ5–c#OR) ÏÜdî²=¤ ÇêHéßÁrDBïÞ³n±î96eÝìØÁsMB6ßóQJ]ƒL†ìÖîŽ÷¼–ä÷Ü—"ù…&…µª¬ÿaGʧ¸Œ²t!’l¤ûõ˜|ø~8ìï4üõh^ þRð×ëŠð×{—fD"<øĆ/]eVð1ÓAs€™Þ &ù1CF 7ô:ŒUL#7‚›‰åÙkœmœmœm¿þl““ÂÙÎ ýq“õY�»Wͯ á&;Ž­n·š,Üä"Qçäb$Òu/Y·É5¢Ê¦›àV»цJ“kDUd‚ÆJ±, ×Xi뇤Ò±¢ºt±³l;+¯;$Ž*ââI&ƒç½U¡§;Ô” º ¦Ýе%å&—…¡–“›SRA£�ý6¦ ÷Ûð³ØyÞ"ñ˜õéêNOSnŠ8ТòDj�5D<Èκ8…æ��6T)äÏqÞî¦r§Š#9è÷‰èB‰‘Ù²2¦7GôK.Cõ–"ŽÑ_+â!GÈf‚°ó�øÕªçz i§ª)>SD» Nïw ]ì'{ÚS×?Ýè"Ât>&-˜‰°T#‚º¿‡”äe Že£Ž)ºl±Vë–üN8ákHHq– »’<N\áÕh±`mKí>+r4ç8ª€Â"Ñ/‡�ŠŠ‰ÂŽï‘ìzáàø¸@\è¦à»º„o'ü%ýmçN¡&œ߆E@j;—ÚŽ‹\j[¼Xyk—U§]k»"‡É1›Ö6BÄ¡µ-jªº§¿=™,Ä·+`Ó&¾-GhíoWÚÖ`˜ÏŸ ´�‰¥í:¶9­ÑÞ $°]|»"¶íuµí:ùæ¼-oÓðÌòÎN–óN„³›‚=' ' 'ÌÏ›0·ëvd:neCÛzBÅ¢+röµ‚ªñ¶Ê°Q,¨Þ±U-�bAªµ˜‹Y:q* T�·ɯ„¶I�òæìD± ƒLÅ‚¤«[]U¯$L­n®W 2�ÉTHb\Z¡"Ô2eÊTHŽðÖœóà‡z©6P‹ž™S6…§DGi NU8µ‚=!¦ÇçU !Ù‡Àù�ùÛqBá¿óðV…ÿÔÐóñ#ggÃÇž £*HI¼î�ŽüB9»7%g¢s~Áqxäîºéð†êœ?X܈k×ÜP�»Güµwß›ê]G×ï>Ï¢ŠNߊ‰™O‡I Ù+ù8¹,pEZ™ìÜ ®fçu¸C¾Îɸ"m–{Ó5íj—˜ej±1(&içÉo!i·4eù†:[C|Î5í4VñsR°«¡«kAÎÎF iWWÎ:êÐõæU»yÒ¬´ÛYgùœŠœŠœŠß{*Þ#·ŽŸo­¢+O¤a!©<ÑÑW"²3¸i^½c$8äèjÍï— í$ð;­¢é|lÓQsótñ}ÂÛ‡Æ^Ù–*‚¦<ö*Ê'êélšòØ+3ž%#±œ/9BÊc¯�ÅnÝ�#¤<öj‡zMqÙÌåF3E�5‡´ð§Ët^f15φG<’—¬@ÈÒ¶@¿e¿Q@è“tˆVrDÀÔ©žý=‚J�â&J�–BKyh)J0[Lh ¬ê7 á„ rE¥ÇCÁÔþöÞ¦g—&7Ûϯx�lœ…žôçÝÝY&H¼vJ@F6¶%ÛÁi)$8ȯO}±šE²›Wiæ�y€æ=|úbÕ]$‹d±ÈHceH¨h‰ÜJæI~ ¦/oBeH¦Z5¯Ô ™Ö:õ­âóùœ\5H†ª�ZÉ‘æGk%G¢”­5HjúêUÜ„j�4Ï_+wÑž—iE2Ú£4ë0•òW*­Ñž»iå7Ú³9­hG{±g�¦j¸—úµðÙù¬XÈQ³ßåCþ¤Ê‡ÌÍ ý½�¾·Ó÷vú%Û©O Ç^ÉŒ30N=e«Vx{%³¼'ÁŬ�Ù£˜c©?ÁÅŒ�ÊoL¶G1ÓDÎìQLº¢<ÄõP ¢�c9µG1S1¡ü e{3]cÎ�·G1—aË\¯G1kH™=ŠY¯;§71)²^_úl�bÖ(9{3ÅÚÓ^�b¶‡=¯G1éÏ}­….j¤Ÿ¿ŠÍ T�½ŠYrø«˜õOö&½]™²*Ÿ±~®W1Saß?•'0á—Y¿×Ü÷šûeÏ®öWد7Ê“ß�ŒåWs >¥0-{„ø,c;i­/mò¨ÏÍMÞ~)™uU´÷Dhl1ÝÌ;_W:óàÓãÍÉŸœÑ;¿pv=αuõ‘4¹B ôG:þµªC÷v•X%â ™ï¥ó½tð¥£)VÁÇê0ÙôûÁŠÃ\%[¦1— «%[j˜8ÜCS›ûÒ•l©*ñ*ÙÒêÀÄÁ«)zcMÎn%[r20¯ÏBÅa>#½fSßWõBÀ6Í_õ “Ëáñ ®÷ÒÕ³jþ§ŠG·,ÊJÞ¢É{Tûqèkf¶ ± T¼š®\ëVì´îdø½ý¾·ß÷öû×Ý~šRt£ñ|p4‡•®>l+9uÉo¿°wRãÀ¦ÀÞI�Ó=¤î^ï¤Öt×-þÖš…__meï¤ÆIL.öNj´b'¾D[‚sº\3žç2À×3©©Üçç7þLj¹QÁžI¥7ZÓóÖ5zHO_³gR?s)‰q=“JO´¦×¶Û-�b}¶gR?»0æR.p.›q=ŠJ��2ÊRÖãõL*=fz=ŠºåzKœ²�åG�¢öµõþد¤–µ$žøý^`ß ìW/0õŠ=º^ÂM'�0X½«zau³èIøgJyYžñ©¯Ø?RÊÁ‰UÒ²(G}‰*iÕCšI¡ÚZõhÇjiYl”«ºV9i^ÕµÔ¿Ëa••æl”Vˆ³zY!ÎF‰[©<Ç�(¹ \+«ÙøÄ­D™Àõ©¬V›“zó™êþXÓ»Ž]=Ïö“ZÍÏ4ëÖu§M¢ðcðõ>Y¤,¥JiûU4/é1˜±fEò#6m(h2¯¢{©Ä6Î¥­‰V÷®úJØ”âsù¤hjÍÏ=g3ÙÖcêwóålüѺkt�/¥¨|øSwm{Œ3½-[KŸ·­Éì[Ž °%K›l¢îÍùqU¾ò»}X_ß{ó{o~ïÍ?¹½©”A dm¤Zl·£ô~Ýt¶(eÞ®»Ï4Û�”ºD®ûÑ¥,µëÆ4Q®ÓuÅ^¦5¡®ûë¾ôE¡ûÒ´®ûÒ�Òî97T»è|Qè¢35N�Õ¿©ÿtñ¹ÚÝç5Ùiáâ‘¥oµn@Ö³:–)¼7ú0v¿§¼ÎÍîv¯qÝn¿ÿ½ÙùÏiµX°ºÍí°Ñ»:‰’¯o_£9d<ñ¸³ænVh¥¸ äDú6•I ä˜w›þå(·¯%Òè°Q´ãÈ?�-¬¥¼ŸÊ–ãµô¯WÒKél¶Ð÷)GÊÙöè·PÕˆßûê{_}ï«_º¯4%¥DÏôÐëÖUX#ÅyrÊBo*ÏSyázš§ë+`íýæ¤ÇKåšúXsº¤SkÙ¤eÄ�¿ëÜ¡¾ðu½•;LTZgxZ'=ÞLVÇõxó±Õ ØäŠÌ¶Õõ°0=Þ|Qèñæ8CŸ.y)AôhpI^º^,¦·›©&øõRsËgM®Û…`×ÛÍûD™6ôòq4ªjb=޼íåælJ1⹵דË+eƒ}?¹üGxr™UBûÞ2ß[æ{ËüÌ+åIå#U« Ýê…îé2ÀÉ*‘ÊV¿´•ƒ¥§­0@«Œ;‘º¥Ê¸S½IyUÆm5d[!ÜéSuk+„Ûj´B¸‘RøRÜØñµ{;3Ýð¢#—¡c¥h©2nÜøÅ›ÐŠÈNcÍë¹*ãÕæºÊÓý—éô[Üß%mÿKÚÖ™«7¯Ûïuû;[·¥”R¿]­¶”¹• \K ºñ²XT�+žÆjí§rRãe±¨×U‹ n-½1V*êµ²XTm+H}¬åx,*)5·º¨U+€ç[–Á¢òUi…õE¯âA¹¾¿I·ŒRY;½ãù;.žUæS”Yûžä?ÏIf¯+_edSÑŠr@ù.ÌüÇ*Ì|•O&=Ê›3ÊÆ¾|25œ®óö? ÝÄ–’ZM Óo^è͘6RW_5…F|Þ(É«Ýøo¦y¢ç®2ÌTg+RŽ"E®Ñ¤ÂÌd—Lù:ØÔÍfŽŇ­¬dµ óÀ§±UekB\+ÁWC9Œ&�ß{WMæa/²`JWéò0°‚åµ&s´y†JéöN=ño¨ï õ½¡~͆ҔæKå´üxjÿ"ÞÉ_Ä;ªÕÐÞz¼(ôÖcñß_ç›L)É]ôÖcj¾¤–µ÷#¥|‡üèŸE¤GS¨ œ­èiÂa*™oôÔc*'5°S\&”cS{à°¾1Y@ê�Õ1ÝÔYºÇ‡Û3Šñ‡­åzj1ÎÂÑS¾_ü5�/æ·H¿×ß÷úûc?þÙ(%½sÕ:�­gYΟVoß íUòõ«Y�§ìæ êNho­>9޽¬Nï”_/«—„bö²úJï·wÔé]ò–(•"Ï¡ŠëuzˆüzG�žÿ|èW­cI»ÞQ§gǯ‡Ô—­<|½œ^gbNW?ZÒögù�¿¥žŠs}~ão©§J©õzjNUÀò?ÛËéuÊÓËé]a~^šè{©|/d©¿à|ù[5Üœ¥Ï®g'‹°ø “sfâÅðZÁç±¥IPy甩^Rj…竎tºÐS¨æóH—Z…ç©Þ3hž§™2·%ßšf¥¥©ä3½åsUxnnôV‘˜^Š”úÊ`«.ÝJ>“S©?nÏ ¶Éí9Åšc•^¦§[qfº‚ñ]­ùgª5×[$¬¤À÷šý^³¿‹5ked=”,¥-~$ʜ˳"S©ØÄªüÕz‚ñPò,¨œóUå/©àí`jìª'¸MÕ�‘ìüµK¬ ò�;ݶ̇ýƒçUÔG´YU?ª' µÒ^yÓ›Wõ£ú�©üE):˜lùOµhÕø†zÍ”êEý(­æO«¦ŸS-ò{ŠÿS\NkG«'u§Màü—PÔ˜Ol(ÊI¸Úš>_})B�kO÷�¶ŸE/H_õˆI�ÑeþVªGLÏy\Õ‡)̘+ªŽwäRõá-³;–§¦–�M6M¥(Zý=¿vó«)áʼH¥ Æ•'þ´â-Ë#QJL›rE¥äù0PÍóÙÆZ�°%¡$JŸ¸’ Z•äJnÙR!ȸ&ú$JyŠgKotwš)õ'•Î:ºDŸm¬µw[jM*ÈPê)!göz¬ÝÓñ{Ï×'�BlÚ½gƒR¿î=ÓÏâ”òÓ¯›Ð¥CÕq¤”$�«;¡ÎgûUmÎ)´RhØÅÚ©™dß ê{AýªU\9ú1NÒNä.j:”øÓ^§Jžª"óZ†%þ¤€j{w5¤¯|JjÊ–ûsåã|öš�Öòq(#¦e?¶<𖥨r® ʾiˆW†Î‘êMt”?­œf:|OΟêä#~“å�¶}h tµØãUAeé«¥7-¯–B¥Z>m\–R²•OIY +/–²éò/–BuZ–æ‡_kY«X j¹Š¥ÔÁJ£P¥ªêDoób)Ÿ:ä¥Q¨TKÓ'Õí΋¥lC©?cTBY(âð‹+¡Ôyé7Õ÷dý‰O–,PI¶öžžmÜøAê*vW ø«�]ò Ì‚²•JcÃå¿(É8W±ä;ØØ@´Çj®‚e9fcCÜÛ´Ñé ÝwÙTÑûg¬ÆZ.\0²)ÏÇ*»Ú½¬v•|Ë/oò2qÉ·3òš)Ù’ké¢0ek<¿ ²&•}¢7E®ÒPíý�VPŠ¸Õœº¥*UþwZDT·ê"Ä3ß´%m§:‘?ÔÔöçïùþóŸoM W²=U¨—oÐë®s£´;Ó6½îU7J»�]Ä7»°� ž�Þg7Ák-5v[�û#+–Bø¾÷wàhÝpoÚ÷òú^^¿xyÉLÌûÇ–³à-Ï)ÑÓדÈ)„Ò™RâþÀË÷Ðã€ìýãþe¿\¢•Cë—AÈßC¦7�¯ç�S–ËÌŸRÊ«‡ëºë çöQ{Ã9Î(YÏåáÁëe¢dr/Ý;DÕPgïUcž½CTcÏ©fN5{‡¥¼ûÓž!¢÷ ¯G‡røxü£?°ý=ç–s^ê9 ?ti¤N�S©ä¿äóÜ÷…°� ak¹Ðp¡–±æÄ K¾1ÄQÔú¼S�”u¨W‰[[ô+âú+^ä �#VŸ7¾~�!Ue¸Æ™ªëçÇ‚îwMÕÛßóÕ4>€t¿küP5ºÍ5¶÷ÛŽ¹OZl¼†£=)Xot ô=§Pa nÙö¯R|¯åïµü{^ËšRÄö•ÐN¹ÀCV_ç•ù;PÙù”rô›” uÖ§Ö§-¹À)iNdþõHŸÞ2úÔUÊ&3¼å7Û½eþŽõ…ÍH™¿ºSBKŽ:l©ÀôòVK’�Z‘Ê$N2ý–Rk§…J Rúmòèñò–¬LÍ_Xo]&5±ü{í|¯�ŸX;2TVm?åêÜwwVÇ}¡§§ü ¯ì^¹¤‹ó¥Ý#Y/œ õ$RJiÔVl}ÏOü¸*Ð^�¡òëíîØZ ,òèT~�Þ¡Ï5`žÎ|MB¤ˆ©‹ƒGµ[‹g›•E¯õÖÓ:/\Òù´Pöt˜ûJ<Î Ý­Úk) tå„–ÛÔ=6ðæù�,¿×ò÷Zþ3XËš’Âõ=èòF˜s1çºJQ²‰ùUŠzG£•2­Xv•¢&)_W)Ú�£Ö÷¢û^tÿŠ‹NSŠ¯ç£«š–ËA5tå÷‡®Ôê+ºft²hJ­nevÇWáéΔZ]«o]™Õ-NÜ2«¯lgÊ[Ny_¼ »ˆNïþq3¢ézU—®þ=¬¿jX‹‹`¹\TC¨FºNEùqÕ"Jl¥Uü>¬ÿIEäj°½Ô„J{{š¡–¸nJ ã”rjÝ»(ôZr™E©?¼¡Ú𙔥«võР´©º&OLg.8ö=ëa³®)éØ9”'©ÅÅñ)_¶ÿc_,Žã7�=…¾™j8ªñI9мñ&�§d=M¼vJ»ÈK®éë"o<û-5Ó äK_ñ(ºÈÛî"׌ åÃ'.k�é/SMIËø ï =�(jå�œ2&ãœm#F¡J}ôjN“f9Â3å˜7)=…=M…ªŽô0X«Ø^•lõéœ~•Tl^)*©˜îÎv’( ü§¯l¸ÓeÚ?ËR‡\g}ÏéŸÇœjJÚÊþRË™<òŒóLË:ž”GÛÒ*[m£PíÐÏ ‹ƒ¶<Úá Z¤”GKyWÖlºí³²usÕ(¾²fJîoi³) ­_ ¨þ™f·´a¿§ïw;}嘸~&I^?Çž®MŸWP;]ƒ«ÕäâùxZùÅMÊH—;ך)P¯Æe)ì²ÜÐSÕ†Ó9ê½Öv�”¢îW�ŠÕ_Å(ÖAÞP¥ÿ6 «YÛDU‹×d¦ìü¦+e¤kyÓÚQ.ÎħõРPë×¥>3Jý]×jJžëî+M§Ôéj·a)Á€QÖ|1ÇB•Iîâ®ß3ÿ5óšRD®ªB¯Û’jöÎåÁo›ÇÿÊ7À¯ÛætÑ}&{좴ûçtÕýºmž2·î¶9Ýu¿n›¯sòðÛæëG,°v³=®�±zi&®Ûæ“åW·Í—ª^ºÒßCd ‘rFþlõè¥wÏçr%äß*C×:Ë—Ý]9¯ G'ýW!èz«1oÛ(�<Óîj²BÐTU¹FóëW;/M”¯2ÐËPR/®¢ÏTC9š÷åþšzÛ™#V\»ME ğ㓜g¢¬½Åá÷½¦¾×Ô¯\SšR‚Ï*ô\ܪ§¢0å|Ý®åx(“b¤-Í»ÅH¯0%ÅHÛQ¼Iã�\j�´>·ø‹—ô#ºxðŸùoM~°zöNí¤¶ÒéÎ'Ë2óû^<©¬&zÕw|ÚÝÌ+‡ƒr×ZöJú�‰{G[ò9(/Ï0Û»—ºÿ’öþ|¸4ŒŸîoFJ%ò¶îN-ݾîÔÒ%àëíT‘Ø Ú:tìm½Ä:Œô«ë¥_v¥¶”â7hÓÞÚº´µ8øuƒ–F<ž)ËodÓ}r&o�~iJލ¿ý“ìWÐUHÒD×ÅGrSOi1ýˆÑUÈa¦‡»éªÖê÷þž§PÊeÏ*ÑÀlÓ^wf®k«×…?zD3ÚKS}2³]i£;€QYÖ7`è`‹�´+-³c{åS\Ÿ£8»bG5d®kxk Ï&‡êÐoå—÷ÖUR~×ùÒ«±SOásU�ïßó÷»�?EHf==¿“3Vº¤«ò£~A‚PµjFN»°Þ2rèñõ\A“8”‘“Ѝôù74ä]NÓï£Ëš¢îÉ6Ït´ÛŽ?X2oúÒÕAOÊ\~þrœ““>övªŽü­V»mŽóZMû'ç¥{"¶ð;és;Ô¶ìŠôÙïs^‘þ¸Žš,S#ýéa&´@?‰¿+Ð?Ö áW  w Z Ÿ¶æ– óã_3d_eÍŒøËüéÅ:YZe£ËóQÌ;™û&j*Z¢Õ}s9YÈ}Ó‹JXÿœÛ…^ëë\L=êã-ž1ÌkR›uËo¼ªW‹‹\¥:ëóœW©Î‚ä…9kt…Uæ\²‹’Wæ¬aJVš³J¤4gíq³úÿ ÊTkëùÙG×Ò3e;ŸR�;w!5‡ÑÐ*$çÌÙQgÚŸB ·g»J×îú%'Ë΃™ì›vL¢ûv9mÚõ1}¡Ì¸tVžà5´®‡t¬þÝu[SD°”¬¨;ɹ Võôâ ãÅÒëƒW¬Xzº`ÕÅEêーZzYƒ¼Z:k}Ý$….þô;©ë°þR2–¯p}~,\O¨–{üÏÈø%ÍÉû%ìÙ¢²¿¬žJ`VO v±÷�>µ’PzÏaû /$UÎÜêúc´/çýÁ�®/Õ ûSNÝäÞÞT+iî|»ÿ\ç÷/oNÍ»¨�r>ÖN¡+Ò ÕÊvDÊ8JJW•%ûLþõšÓ”  ÌœœB†úÒ]9Ö5iòïø|4E¦À¤+±Q>­s¹a; é÷îñúDÖ¹]Õý%|ÔÂÅrNNiY›ÃV„Õ}‰�4˜¿ˆ•¦ä3 y[«S­šø×Œ±#šáŽêQ¥,‡!æýn—¯ºpÍ ,#Z[³u%¯‰_Â)uo¬,=¥$®¶ë=•éÙ"óéùNK¾_ô/Å\S Ùœ:9ekyÎCÂOeªŠøû%¬4%¨ZU'¯UuTõ¸¦B ½ë WeCþVšb�"ú"i!–¥f¡ :©ÒyMÿVʹÎ[.CQ_Î>9e ·îç\œÿz][¢êÈþVš" Öe(R¢pwáô9ÄwˆQýç²*œGU—ã’™·>—NÖþ N›»ô¶g± OFÑï’å˜íÔŸr1).ú�Œ2Ñ5&u�µü¨ò®jÍùDz"õ›†ŠEÿFšbHQæd”B>XSOÕdX§ÿ¹¬4E-°æt?rÙT¶Jµ¾~Ó/ïWÀÔ|³}ì‹Ô­©nÐ>Ù‘ þ“þ˜þWõi;Üñ¸M¥u½t„Ý;S¯‹žVÄPÄù]*¥áÿîÿícòz&�òIÙõIBMùYæ©Q~4Ê:EQŽ·uQþËþÏßþ.óË¿¬þß<û_þúÿÓÿñYÖßâBý|æå·¿þÛúëãêÛâFJðyL–ó_Ÿø7ÿïÿø×ÿw¤‡æhf$@ümQhüUýÿ¿þOø7ãõ!㜸þUü_êAô!¹c£}}Œï˜O&óÖítw!]sXKŸÿíߟóÿýö·ÿôwÿñÿëßÿÝo÷Oçø›ømN<þ·¿Ž£üïnÇ%Žcβ¸¸ÇΧ´­té,þ€8_©�ÿý¿þçú‡¿Iü¢&ýì ”»¹üω–ª)ÌÇ^iÿëßÿ]"¦âd•ò�ÿOÿ�IéÕ»†ý~üý?fêÂÑÿ·™ã µFûÇÿ’›þ«´‘£a”RÉ2=ÿìÜ©t¼=Žúùÿ�9ÌQ0ÆÑ/¤<Gn‡:E£õÕFé¿ýaJ¾ô%j„8à_ÉÌ_>Q'ƹ«„�°Æ%Y³o*梔•8þöŸÕ߯|Ï0îüùÈÉsÿð7¿ýmd-˜”¨ôIÇ·5·Z(Ÿ8Z¥ÐYøÙ‹÷Y£¹;pÊz¤_Jâðk›÷iùí¿ÇÖãüöosÉ'íÞhòå uÑKc5g§oò/%?È%vúW°éxä¾õ\.¶Ÿy�JøÓ_ÄIý¬ð‡ÿÍW*»ÍÄßþ¯¸6ÿSœÅqÝ£%ôߣ0ù·îð@¿5~t¤R]ùmé5�IâWs½|Í`¥dI»¾ÊG€½˜¦ñUÞË\Ò{™ù«uÊ·™ÖTmb«Ý´ë«Ï·ÃTL½%å’ù·.KyÊtN·'’7z_—Ö{A»¾ú¬ó@6½^ìz‚¢�Æü©Åm­do¥aØ�RÂ}Éï�ƯÒã1¹í÷òdi�¤ë›8…[Iþ�œ’³,}´FÙz¤)Œ¾<Ý�:[ž¤]_}R©¹¡48O5égM—bÓ9%èÆ¼ŠöùC½êI×7Ÿä;ºÝi??æ?ÇÊ”MÄ*gì¼Á�ÊíEc¼ÒMÓuéyCÍj¸qÞé¼&iŒ×>­EÚšC¹ôÍxMëH.Ic¼Ž¥�¯qúÔ F¸9UÓ¼*�­Ò”7ú™{^S2–?œW*:= ^•Æx�Ÿ­: JüÜL¶ Ù»çß7™Hš Ø˜¿Jd 6é½àœö°~Úå–¨äŸMÎeûD3•Ùnsä²% "_‰ž³yõWc3B 9�Œˆ•J3–!~ÙfN¢I¶yb=•&£õØÕ=Šš½äbƪGÍ·�¦R£Éý™Šo¥&‡«=%ô£pÌYoë:/_ÇO5Y¥„“lå•öø/4dõš×p”€K9˾o2= Ÿ®œ§—]·Ò(›I¹|æšU´%Ëãu{ó'½Š{䥳ޫZ:JÓÄ•ºÕ9ØÈý¶ÍTa7{濦ú»¥£•ÒœüH)[oMµî‡Æî¹ðiJé]ÄêѺkžÊÁ6R&Òo›Œ+rÎKòšËîwj‰ñI÷¯ÖÏçø¹› «9¥ëÄ£ÅZäøØ^qþ|ö5vªÅxúH“ùI‡¸�Z?ZgR›[”ÇÏ�kÎøO,Òý¡UN¥V­Ôä‘î®-ÿ¬&�ä#^o–iàÚd´fÒ‡?Ùä'�p™ËI7y)jjrLBáŸ×dºGõ)MκÉKŸS“ÓÒ¢ ?ÛdJ™K“‹nòRûÔäü©Ù(?ßd:�ÌEu­�_£5ËíˆR�­YD‰¢x-y^má5J9µë´ö%š#YíïËç¶ðŸóÕØ}­G¢Hò�—= ,r‘u‡q„MP´Ó`�¾Š¶A6,KA,ë«øM¾i)K‹ À h§Á,˜?¨ç~3.û�ù«Ü!þUÏý‡Á½tÂb¿Qú²ãSΗÝ˳„ÖèEJŽžEÊX²QJ—\`P´Ó`fÝΰƳoïÅš‘À€w^�z¾â�˜G9çâÓ%€AÑ~vºRö(§Þm{3]Íž.ä«øÍ‘¯�ìs}.wcßÓNƒ6zzêËHÃŽ­#sáéôÜ­¬n1ü0Cé– Ä–dÈ^ýº\RùÓüÇh½™#)%ueŸë›¥e¢<\P´Óà¥×¯^]S/VŽÀ´×zúÇ­ˆÍêJ‚—�ÀIº>îGzo–1@˜ƒû<ÿ7g¥›øu¥ `tãt­½Ø7ýÞº|ö£¬–¡xkzÞ?4oÚ,.`ý|ܸSöpì)½o|³q.(š½q#mɉ×{<¿/ó�ª›°tÁÅÙ:Dmh%;äúï[Â÷�Äa¿¶Ÿw#eÎWkËñš lì;Úi03†G®ñZ0—²§%,(Ú�ðó>Ò#_z1÷'Ñ’*zoÆ Hþž´Ì†ñÅž–¸ höž–³äAôкñš‚æ’¯á1çÜW‡¿­‹…ô(]ñp¶.¶‘Þtï"FàÜOõQºÑœ¦~Z›”ÃFAƒ¢ÙãЧ$"˜øÍžýN©”ûÔº„4fI É,(š%�â7Göc¶A/�p�AÑNƒ™#neŸaqûs?6÷yøÊÜ¿j0ÇÐ?b–>x8l+²D NÞÔ�Ûã _k,Ü5§®í)m{2'5RJ¿=�·[‡|`P´Ó`fÏeÏýÅ•Àv•-Üa/'&ƒ´VîŸ:ãàn4®œH_ÿôM½P@à~Ù'ÖAJ+Kî4,ÐV˺«¾Ð–ünÎOTûöFèJ`P´[9ä~¥eéÆXá\èJ 0TYz8h!ï$.(Ú�¼“säb´.Ã4kt-Æ\ØaO嫦WBNƒ¢ÙBŽË—5߉L=\6[ÈѧÎ<ãL`N¤Úñ=o\ÂI\Àú™Ëã³Eâà’ÂêãZ¦b¸æyI; fýü,_Ÿòõ°ÞH[ù³iC?ã°¡×ò_KЮ©’WàÖkµ§µäsâ�®wã"Oƒ¢Ý*u%†\œ.q#U:Tè ·òäù­NJÛc@1é½ãŒ–Z´w�a$ ZS 1¦Rã�ꆽôÇEÓîÚ¾�’VØaOÐ¥ “Ä#],_È9‰ ’dK9à£øIö¯ö«b.h§Á«ŸŸ,Êk{:nÔ�xhë!s•ü똿�öðŽf÷r¤Í)—Ê–ï‚y邇ƒ~Ÿ\¤iÎR~`šëuº3«…Ü.kÄÞÌJ (‰Ò‰NÑ(p*€]–óå’({rܶ1)wggÚ’ÆN×¢[0Çe¾°§®ÌOC›“)bǧfÂy2_¡‚¢™2ÿy§RÙ7Ÿœ‰Ó‹¬€AÑn¬à+=ø¥{h&Åyã¨w Êóè­kI±cR ¥°¥×#åc•ŸsuŃYNrò7´hÞÐ ~UŸA¥¬ª Ý©d±Nj܆ Ei7©}J#âM»ÉØôOV‚h·0€}VË×Ó¼‹ëö¼Ö‹?’v*NýÐH }¼í\Æ€–ƒE»·ºµãbô4�ØsÃæô 4äÇÈGSüòÆ/§¹r€¦áf £6Rº¯G lEÂTî| ZAâ‚$Ýë„n){-ÕJü¦0 )Çg-G¨ôäÈj{J)ÓŒ9@ÓÞ34¼«6E[¸æTÀvПC¾E±�c)§+P� Šv«BUFjjùÈ1T†E»SýBr!z:hŒÜ¶°¹U³–«ß¬éUäý0d{ÞUù*U*r`APNƒ‘m tŒa­%Pꢫ'R—sš$Õ¨Eõ„E»Óbz¼e¯{é‘¿] aTCäþ½YH6»?Ûyþ Þ³O¿“;Ø–À hö:~«µMr‡|Ä’.­­sz[#¤)I; fÆ´å iÆä7  £L-Ù2F.Ð4ÊŒõÿd‰fp HØg×äØË}ò=Eåç&‡ÄEÃLީ䮧úí7ôîilÑ|98Ó`nÚ蘿±z0€=•³ä¤6ÊÎf³D|�>–ÄéÎè�4ºE»µÖܯô�DØó)$à– ƒîÃ^^¶°´ºµeš<œ­×µØöÕh×Ô 5*pëµ\5CÉOYeë�e*–õÇÞX¦jmнkë�bÀ€w\Iîý(Ùîq(çfŽ"jJƒ¢Ý™iþWú'’�Ø#ã¥ä^ {½ ¡èRï�AñŒ3èZ…¹Ê©oWN°N{öÖžßÍ¿ Ü·@í- ŠfÛ[ÈW‘’ã]ù‡l×aì;Úi0Ó[:þ¼¡®´y¹1³ä6¡qq€ØfEò^*Úíå) +Yƒ¢ÝšcîWyt³—(•‰æS…°W¶†d†}›2&ûŽvçTñ¿R ¯ôâŽ*Ïœ]’ ¹ï7V¦”d+8@ÛÊÔ"GJ7eõM½°¦$ûÁ®5µçT†<üs!Àš’¸ hÖÔ“õ²ʱ�‰Ìz‘À h÷Ö  9×ÕÙÊÒÖ�üée€<œiÝéQTRNm�¾%|[I\Àz-&ÌQ½T©CîT`ë^L˜»è´*.V+¦×å­åÆSü`]nÌ_¹XI'8@ÛüÕ+_©oeNöm½°C%0€³¦-•�\S}ü­GM Šf›8ÈW‘’Ód"%g¢N`ì;Úi03&*ïÊ«mÚo-rh1?ãìÓˆ9™Êb똿°ô.`ýTP[JÙf™ÊS¸}ÅQ¡'ئ�X²ÏŸk[úá5‚‰j5(ù/ùçM7§&iÔÒ:yÆÙ§&Ó@VÆGÇü…±%pë§§··ì ]wzÈ VÜ TÝå•0ö”í'~9uè > ¸»†^èm� XŸ]­=ä·^¸Yjm Šö“Z{/ÏP§¦†Ï­-�AÑîµöÕ!Ééßž;„¬Ul 广A-Ž*ýß-´ÔŸëP*¢ºù:Œ7VÄ–Ã}‡|œm^jQ«U×7ôÃh¨ � ¿®×°M£~­ Ù ²ùàa}hjäÂËåËô¨×�ù+7- Š´Í_-|C¯kê…¡'pìö£q³íåþpJkûÚ5n$*(ÚÏ7c¹1϶fÜ\P4Û¸cã"„qIKÇm0S•Èóv`–ÿsÕ½—?Û¹í4x y(7TÙâWDZDi³?ãìã‚ZíBiºËMÛw4>î:ÅŒE¹š·üˆL·”�,Ö)©ñgœm'[K^Zg=kØ•°€õÒ3k¶òôc*züƨéaAPî šn79­ˆKg܆0�îÚWÛQÜ(²/ì+‰ Švk_‰¥û Ñk‚&Ëk ]^[=öÍ-V¥¬rùcÉÄs€¶U®Gε%ú¦^؈ý`µ¡¶ì¡Üʵ†DªeŸ'”á±´»Vr=_T5JT@z¨6sNµÉ€£u¹·|·µ¸äÒEÎk(<œiùJV¶…ÞóÆÏ#~Y?QûÀü}íÞ>è�hùŽþ� ÛЕû€ÆÄÚ–®ÞT¾ÅÒ·õÂd‘ÀvÜ3Z¶ìCÍUã?MÈ!F‹EûY£eËwâöòlµH`P4Ûnñ¤\Üéæþ–žr|#ç.H’-ë aó ÑsAÂÆk ›W1<î€j!K¦Œ;˜ÄV#”CÐñ‹–9& ½mN¯)å54åàÁ,CO2ºYõçŠsiÞ……_ÔIж4[G»õ¹ûÈ!.G@‰”5U§év¢:†HYAr€öAÄ<Ê2í¹¿0i%0€]UûÄUªù§L£TGˆ6–´Ó`†­(m“”N`K0pÔzQ–pÄäÚLÄb¦¿E»=4¹_é…@ra¬ª¼^ذ _[{OæÆÀ˹ yo¶Zy>îÆÀ¼ ³›7õÆìîqëµZ7s.“:ŸÉõ@+ùgÏôÚ6¸T|ƒ«Ù�4{ƒ»Fy÷ã_Øä°qT#”ý�qšçT ÷Æj˜µÄLÛ옿°è.€õ,º-§HäN׌Т“À h·gp÷«EÚÓ´—î¾müÔV¤Ltá4+%0(šm~vMN.ï& ´k0(šm׈•ã"ô’(šÂÖ—1mŽŒÊ­os.WHn’vÌ”õg:~“ÏùBä KÄ2‹$3c�\ lƒéÆ$íÞëfmÚËnÜn�e±diÖà�±¬Ö¿ÚlÚ¬êÚzc� `;îÙcŸ-ݘïv?d�I\P´{{ìÙþÉïÓç ;-oì� Šö`ÿ°�–L²ê«Eó”}(zÙhδÍQT+¿çýCó.=pqí§¿ùÐ.€žaÙµJ܉Ô;„Ö­»°íæ[�q2×ÜÖøÆìP¡'ØÆŸ{Êxùäû1Ýr�Œ‰ Š=.DÛœ´x¼¦ óUnhW(e-9×ùiK‘f–Ê—Ìôjþ¥P[nê@#¤�Ð3Î>Ð(Á¨fìyÅiã“Æçy�bf¬g ~²'HẌ5(�AÑîNþWz³�µ°Gvž¶ÿØš²LF¶:x"‚ ŠvÌ#Y.|ØHÖ;ë¸k$Rx0ªÚÈ$éÖhõ>Ò:¹ôbèwÏ"Ž{v/JÁ b� ’twt?ÒÛ”d‹ÏÜòŸô®t¤-Í ¤lpñóÈ sp¶ ®†Ê·eú¦^Ø2ˆý^C”;iŽÍ(Þ¤ÎN¡rP¶/I[k,Ľ´Úû†pk_âØi)C\3K  ×>ƒ%�»¸„B†²$={FÌÏœ �m©lÅÍyPŽR�ј<ãL‡�–‰rÉ(3}ÝŠý“j3´þ ç Šf[êj_�¹|\Úhµê¿á^è· ��ƒƒ¶ì�UÚ1cƒ `{ªMa9®{ ìªÁŽØ›ígìÍì„Ì¿goª280(šmr*3Ë]fú— ¬OlÕ*v†^´±Üß�-45Jjž×5]çÌ?.K˜½e�\\P´;Úû(J]?(si4KVÐG¨En2ïhwV²³ßÐIðœÜj„úm¼–´ÿ$r¦ÏÝ¡MìO xsj³6»2š{î/¬m `W]k;Nêš™L_Ÿ7ƶÀIº3µ×œÓÊ׺öeKš–ˆÄ,yÀÔî›ÂMm‰Ã~¯)ʦµ·†„ñ×&¿O0ô�AÑNƒ™i÷ÌqóVâÜQ_àd7�Y€‰)mwœ€OPÓZñe„Ÿ4ªÛð]² ³ª%0(Ú½]½éõy‹Ð«_ŸMaÒOmOöh ž‹/³�Ó€´õâÛöòì,¥™lÏ8óì¬�ìè[Â�°^FíÃ&ÐRƒFçqç ÒGÙÅkvüåe0Lo j Šv{.q¿Ò–héÆ0kå"‰›¡þºúÎ�>ÊÙ§MôŒ³�…ÖJÒ烎ù‹s…À´Ÿq˜²*Õs»; ÞdÄ;8è÷ù†lßÐ CV±_«EÛú5gi8RÑeí,Ö! �ƒ³}¥–¥©Œªžù #RØSßf‹ûtËißó×ñÆd¸ Iw›ûQþaG6ø%9ŒyG; ^7à1×»K“7·¥�€0(Úí1Õý*R²i‘—ý¥\0îʺ¼ �0»ÕâÌI†u)„G�Z&mÔTJ…nMÜí¨)b”Ñ×sa-J`»ª6딋 n©8Àdƒ×žŽ„¡ÔJ,=òpæ1X²B$j×Ð ‰*pë´kMËŸ€ZÓú§KšmM#_iã«ôcXrr–rP3�v}zKû ¤6¡Íä1�f[Ú=÷ `WÕbIz£ÊQ TÍÓ3ÌöXÚ±?tŒÑ£„´ƒKiÄ͵Qíã(1äâÉi6µïãnÎ=/{§ôÌ_ì Ä~!ÔS©ãï3Æ/䤇£L·&ç©—Œê¸+×?�‰Äv!p¸ê›ÂWÀnJðÁ”P[‚à£ùí+o6µñWÚöW�¤Ù†¤š™ìªãZK9å�ÓX<Â̧9yê ֱƜ Nªe¡Žã×Z³<ÉçŠ#.(š}ŒÈ¢Þ,9(™eT}JYÒQ@­«´D\œiLKVÆè¨CBß~¸�¸€õZ-Þl ³Aøĺ 98hibE*(Yô\Hš)_ÜP÷»ß€0€ƒ(Çg©IÓ[Úˆ¶m-Õ0­ègf Ø'‚Žù‹ã�À¸ŸY�ïTäÕðÞˆƒL]³�¨×�:ùvýÕΣž£€)$Ýšsæ»§HB¢’Z|ÆÙ¾!%œ}³¾k7ë,`}îµ€·ïu3de{òê±*ô÷+¤BZôSu ¼qh(Ñ£„Š2Ò—O®¹mír#v ‘¸ h¦‘îÛß9•'ï‡úh/j `P´Ûìû•Ø´4Iooû«í$­×eËoDóCdõJ\P´Ÿ´z—œJ“[ZÚ 0{%.(šmøö;Ü[bú‡—ì/Mh Åúõû¯&ii÷‡c«Ü1ƒ—å똺ýÚÁíÞ~6�I ö»­oë…á&�Ø/6ÄÛRjº³…(]—Â*£1z†™žK˾S6PÏ·�$.`Ýì%›¶>ò‰2�i}5[0(šmWøÃ2—ò§lcƒE»·øÉ£U>§pc<’õ¸ Iö�,ufaO£¹=¥?~SØ´ª sGTïÞÒ#`*0QàXTS©½¾Môú hQ \P´[§û•V¤&ö€F÷ͺ8ü¹"uªÌ:¿±ì$0(ÚíñR‹§¡ËÝFz”¾Í”¿ýBñ¾×K€v’×´šÔ¹c¨…>m$dð ☽Kr‘tû³z.HÒ�Í;×;©”ÚzcóÎG.£žª.7YçãlcVð²·rÏüÅV–@ìB=•êæÖê6~aGº·¹»•:•bÎl?ª£™”Ô!hŸÎ´Èq�}S/ŽÀ~+Eí?jc”F¸ÉÜ©UFIÙ>þŠ€ì9GÚ\¿Æµ –f{C Šv{–r¿Ò+€¦a,'×¢›·âOµž?/,:‰ Šö`ÑM¼?S=2LÍT”§61Ô!xsjS³é凉æÒn9_ßKÍÜK€ÑÛýø7F¯p$[&N|>ø¥‹ÇcFƒ¢ÝÇþWZ �±G4ªoSEá–Ë`§çWÚ†™UÍ4:|{"6U<××,aö„E»;Âø_é5@ðG”{îPF§Ôêî÷“?†–—¬ �@ ÂäÝÑn-¾Pæ­T?MÏi4A!Ì<¹HÂ8@ÛÌÓËI*KeôM½°'$0ÀýžKNvzdn¹1¬$ó2*ζ˜¬Žj�Õ1a3ôû¤”Uúd^r]áχÞ*õ�ÀIº=×)q=JyòÏNïò�r^ƒ¢ÝÊy÷+­íi]ìÓAI4oð´N)=‚ÐOJ¢(á1Ÿµ›(PêK`P´{©ÏE¾Ð+‚d¾Û¶¼-4–RZ©ÈäñJ `P4[Y¨Y[JA@¶Q•Á §ƒÖ‘´Msn•lPFÀ® e¤ää<—:xlwAz@â‚¢Ùz _Ês©QûY¿vS<(ñZ:ãÁ죆%©•ëx¿ànÊ�¦£TJ…Öv|$,(š9¾ôJµ›TNø•ô¸ hÒ÷AÔM¥²Ù‡®f¡’®ÇIº—sŽPKeK&ç@¡"€AÑl¡’º4^n†å3¤·šÖmŸÓ[�g¢,­þÿ˜-™%éªéh­r ŠvÌ‚ÉkÝjÙÊáB;!�AÑî:á¿ÙËó*ú ûžvÌêä´å²¤‹‡Yj’TüÞÆï-=r�بëå²ÎíÎn¹>«~E¤,% Äîܸ h§æeÏSÏüż˸8è÷Ù»¤gþb—H ö ˺>lal%‡8i©•Ö2kë‡ÑVˆýb`ã–QåApÛv ÐóIî|¾@p¬LŽŒ{Úipòwì²¶ŒëyÇw¬„E»Ù±îGbŒKóg`®ÔJNécÙè>jÁ8p¯J\P´;™â}¤‡¶tbîÏ’Ú¨sJáÎû­š‘ZvÈ[:䱿¦ï¹¿�À®Ji!v_d±Ö»ŸÞ³ÍÞ³ÈWy$Ë[t¹ŠÞ5-ûŽvÌ´àP[0…œ×B)‰ôÐÆ•¨ höÖ}þD�ui` L™Þ{c=?“— Þ´ ܶ.F�téÐ4uûôCó ŠvÌR¯–¶©X·R1ß=UK_ˆû’pë\ ‰ýsuËE; f½a¡Tó<}U-L¥ \�¤[KÑûHo•Òˆ9°íäŽRZ9¶´ÖRgGÓ›ˆ:—À h·Æªû•Þ*4*{`ßµD�”žRFfÌe…÷ÏFÁ©òå"¥N¹À h§Á 6tºöÞ:ÀÎó 5–bµ©ìB›a©‹­Bcäàl\m»,GzîŽ÷iO @ ç½O{Mþ­|öi.©0¼O¸ h§æeèñ±”mmÙ~†Ý.7õÈÚ¹¹µE×qc `» š‚c®¿¾G£rze ö¸ Iwv ±Å<˜Þ:4]^sØ6�Ó!WyÝÓ·WÆi� ’tcœ~Ídr´.y(¹§¨K~k’v¼ ƒy(Y]-Û¶˜0(Ú­Íì~¥w ÂØŽ¾ÕK èRÏ?YI\ÀúÙ¢UqEok7,ûôIù‚Æá§ý–}ŒvÛ"†å$é4X�§½¾1ü´'që¸4B#$ß;iE �Š.4Hqöq¬çþâÈ)�ìêåD]?—u³å›~Çq›¦$á¶´‡ÙÐT™GCãá‚¢�/KFÖ驸=ÝToç áOŽºäàlwŠ’–Ð ´o ?�J\{žDa�@¥tèXæ¯fa3)óÃ�24H�0LÐa‡ÏÒÖžÜ/Žž=*ÊͱSK!¤¥ Ÿ§¶0A¥Âê([*wÏ–´B^œA%0(Úí´ID÷s-ehxÜv0‘5æù>l¾ç#ŠñšG[¹ãAZ£:}�pAÑNÍKÛΟruòhGúîۤ׳¯äí48™çsÆ?œw €ô:W.û>¥õøX₢݀µ—Ò…iIË'è©9Hh[‡r}®�­-Iœ,k­ž‡%.(š}6¼”.LJ\&¯1@ts‰£Î¸±‰|.=^9¾9K`P´;w¡ÿ•–®4{DTK)³– ãíÑ íìöpé�òˆ}vîãÞ‰ X'-Y³Fs0�œgÚžÚ(¥�‰´]€Z$A¹î `ßMy³¦üì(7ÖZoÒpJIBƒåm÷žK€Ï o ÷H\;® å¥\�Mot§Xæ”"¥ôÈÚ^?-ŸÝ}3/üÀ>“2iŸÆôî…uÔo¿+îŽëå8í4˜¡Þ�¾½î `ç•3aI¦Òzf1šRÒH9@L(Û§ýžû �†°«�3¡2:†…­mÀ™ qAÑîœ ´„Æ�-m§¥2Ÿ°Ç1oHÉå+­þÏJ·ú”«WŠ?êÒ#ÌôôjAŠø\º¦p—‹€¨Óžo#rÈï ¤B­/|íÖë~¥Å/MÂ�å–K£0ߣ!U3þ´cUŠ9Þ« íY5e¦p�ô¼a¿Š„°›\•Î¥tCª˜3ßxT¥t+}q�˜Œµ/=÷ž `W}OJü¯ô†Ó1~ê¹ 'Eâ‚¢ÙžK5x0-ôi®¼æ ýñìÝ©­Ä¦‡0QïŽDE»óîø_5±9ŒW•:”{G;5/ÛÅ™Oé«m­b ·ïÔ)gû¸•ªÀü<}s/=À¾®îiÊcìóQë¥+_·”o¥O ‘¯¨—§o vóHX€ºÍ¥òT*ȤbGã�£[J:ˆÉ[ÛÑÓsáè‘Àv5KånHŽ” Ú}^EíCÔò!yE³å¶ëvŠMå÷‹èñ^Èí$@A’ ·“:N=~¯e,�Ëc#€¤6eMa»§ËÃ7~n)Cxwîq¶Ÿ[Ë#Ì!Æ[{ãëqë¸)l¦üÎÉžÌ׿ò~n)Gh  íèÖB t‡uí½q‡ `;øžÆRX*½¹r·Šë{À h·¾q÷+-åJ'0ö€È4]NãWšÓq¥âgÒ%ÔíÃÆ�.(Úiðºñÿpæoœ^=.`ý|Kc}²ŒJéþ% Švë[r¿R‚Ÿæáî+Ë_xïé¾Ý�ÿ½o¼K÷°ï»”” [‰·öÆ«ÔãÖqħ4ä—#÷õ r SIà‚¢Ýúçݯ´l-}ÀØ‚ÚÁÒ#3”Òzéâï;WŽE»uË»_iOã‚°´æO*Ííñ/ûÁ‡Æõ' `P4ÛŸd:ý]œ’·|¬Ûƒd÷³�i( ©6ìbêqA’nLÞGZÖÓh̽a ¿ÂüŽËÕ*ý½Tã}º‡Ýøù¥€L¼µ7¦°ŽË–öÔ åq¾«66èḠh¦‡øè»ÃÄ�3sN: V¨�i¼r{I`P4Ûí%C#>F‰><�mAªÄu�¥RNzb`Ùø90‰ ŠfûÁ�¯´*ƒ±G䌫Ííé>ÃB#8ã$.(Ú�3N«/§«Ç1-‡9䯽¤E¥ÛùqÈI`P4Û!‡|¥Å,� À‘ÙJ•î5÷i^ �²–ºäí0€%¸µ­çþÂý&�ì*ä~«ŒöqhH ÷›ÄE³ÝoÂ`ŽBsMCמ†�eüdK#RvÒrqAÑNƒW¤*˜Çnñ<ü†6߉ïucùñ’vÌ:e™I·ÌUíµ$ëMÓ’ÔÍV¹RwUÎ×#”:ˆ$µïÑ=ÎŒ#Y N»{Þ¸«RâÖOÄUI+íÚ=UÄU)aAÑn\•*„䢴Ž,óä·©[ÃS©¼}±­T®~_›Dë$š4·-LÁA®ËÚ\ª8o|˜<×¥E»s]j½áã´FàƒõØ ¦^˜æÈøî-.c\R!Ôž<�ÌØ•©X”ë‘1Æý•(ݳ‚HQ­n)•nœì "IPºãáÌ ’Ö&¾¿²o ÷WJ\Àz­Î|Â^ÖÔa-¡ø=à숕¥M”Û±gþÂ_)�ì)挜–$Á·VVt J`P4Û5ˆ|¥ÕÍÂÐeFœ&2sºð–êfX®;-[©WÐŽÓhAmyMµß±oï…ÃRØyßa9.å�ªôâ+‡¥E»sXú_ i[z€ñöä¶ô ÎI[åg܆ÕtÜå–§ìI[™tqAÑNÍË´^{Þ¸cRâØOß1YÇ>õzÛø"ñ“ÍwL–Ï�i¥|å“ʇ/˜ å35™rröÜ_xG%0€]õ½£‘Ëš«â¬_ó+÷¨E»s�ú_i%H“ƒ°4ªÛ«Ü÷Z™BGö¤ä}ºCÙq=­K!)kë…´C¤Ë€?’DÒòaN.×)QAÑnü‘–¢tqZÒŒ¹ bêT)JåhŒâ ?Z)×îB<”ÍöP"_i5LÚ aètÌMZÛÛ#~ÜùØx~R Švç)*ËÅh]ÄGê±1L±µ1Z—ÒûŽ‘D5Êz]ÀºÔtuÉbIÀ¥û³6“(Gó¸#~S ŠfûM‘¯´.âCâ±ä)­FÓ~ôÖ—ã'íP¡'Ø>R÷!ñ¹åùÈÕSˆ74¶“ëÞ|¾¶ ƒë   I¦+ÔÐP�­|h`T˜ëp§òNê¼Óë¼ ÃQƒ¢ÙGä+­bJ'0ö€¾Âü‹µ½}š(« ô/J`P4Û¿ˆ|¥U �= ¯î�œ±�üTìz$cõrJTP´[?§û•–Ý4{@`.ÏÚÞ1|¾ºqñ\ž$ÉvyZá:&¤9¦§¶µà;�’Û¤A@Ú�3âR%å± äOÀ h7þ4CC¸0-úK¯€ö0=¢d±ö“%C$Žü�ük=.H’í]>Rò–†àí‹n òÅ¢üì0鳺N“ä,*bؾjZy;Mù° h§b•¾J]âíøPýäž÷ƒwé‚ xGU̬çŽÇ%Îþ‰FLÐý+àÈIö (ÿj^o{JÛXùzãÁ²¶Ò�]f{¸›€ àuãæÌßxx{\ÀúÉM†üõ1­¿:(L6¸›X 2+_3oê�«¹Ç¬×Ü ¢]µ¥,ûg£wQo� ’d;x��´UD³0,,ËÇ,œ¶¹©=½N½ð!ypóöˆ I¦“WÇ!!Ú2bãrß`_A>Þ*»öuHwóJ\P4ÛÙ‹|¥ .föˆ5%ÏöÊg›úL…²6Ïâì•À h¶³ùJÙ;4*wÀv2ýÍÊc[›K¥Ô?+ÏÕ+�AÑn\½F,ÔÇ)}ÃÇê±=HwÑ ­?9Ár™Ú• NÆ_ýi2žúãà‚¢™ú‚«åW®­$Ê6Ò”!i Švã�¿�Qz‡Ïc[�ƒ¼Ñ±µ”ºGzT ôFKPP4Ë­U•ƒQªˆÆç¹!_¡)'ˆô0{’ø‘ÐŽ"˜gZâ‚¢Ù¾iä+mâ—á€Ø#çÀA^Û?C3°¹„E»q�Ëб Ò*šÒSc�¶*t¨µïç©Ù«*h+u#õÇÚáXKÑjW{Ïý…�^ØUK‰W¹ûËë&‚¶R;ò±yÚáX­j!'}ßÜ '½°ï®“>2)yÅSKk„üôí4xa_iµHs°Gt¬ï¶¯mQšÞ¸í%.(Ú©yÙñe¦U#¦§æ -+õÖ°•œÕxú™[ü¬èJ�TúãáÌh­¥Ü´¾ç�{î%.`ýÔJ«‚ömhaqB•úˆÊ=Î ¡jÕ†¹îûÖp׽Ĭç†(Œ¨9[[™ E•2ŽÊÚQT-0!Ï}ßÜ Ï½°ïJ@Kxd2$y¶¬iÇÂ~s Švç7ïôª‡ÐŠ€fÍk Ò)®˜ÓZ‹”ý«¦ÐAn| Šv*V†D\Sô*ʇ�~¥ö§Ko}é� Äb©K#“ÏC¾¾¤œ^ËÛ|�poÔ»À h§Á ð®÷MáÞu‰ `·¥¢¯˜#HSó鉘¸Tá|Œ€vL\ÛOîö¾ÜÝ.qì1óiÄ¥µ%]÷Ùéqeš—Z“6—ÄT·éáî™ãn‰ `G­Ð|ÅíûØnÞ©è¼T”|d€v€^k]ÄãÝ·†;½%.€=·âóU>íËuy^Å祢äúhÇçµÖµ<òÚ«Ý·÷Â.�ì¼Ô«Ê£™ŒIûÌGË„<ÑÍôDi‚¦Êg˜#˜Ó¹¶–ž~Xø°xNg‰ Šf:�¥½á˜ñßKšáHØùÆw-‰žrŒ´2u»¯Õ$Ÿ°§Ÿ i\›­|�yùZFÆ—Åf¥^âý¹Ç™±Y­âÜAß �¸€uÚwÉG³oOú&ßÖA\òÍtÉiMIö©ÏPº�¾Ãû1}-lPŠÏ#'�Ïô„袗À hw.zÿ+m5”N`ìÄÔí…{z>äòËŠ8·ÔÚ¼[@;έM,rз÷"r �ì¼Tdr,Ê�íU¨¦¢ø@=ƒ¢ÙúN©²¸Q’FšY¯-Í=)bÌRP� e65‹r#÷Ü_øŸ%0€]õœ½óQªv&q¼q÷*`P4Ûå‹|)IÇü–‹6µÃÆ^ÐNƒ™áw.CÉÞ[ÑQ\¡+ùjyÀÙQ\Kï*vÏü…ï[ØSßû]¹Ó§ebîo Švço‘dÿs­«ù$=¶ƒ)~å3P>äØÖœ³ÈGzt>K`P4ÛýŒ|¥6� ÂÐþ¦-Ü÷}mH½•š‘wëh‡oµšE<á}k¸+\âØsufŸ’¾ˆGè½ýuiVfòÐ09@ûÒ¬™¤]æ÷7I>À®‚ÎïÂi_ö¿�ßíÆùmÙ`.NW|ÊÄ,5iíh¯öøµ§�ä ïqA’l_8ð‘6aJ æ€9dºã3söj�Ž´KUÉ:õ€Ãôõ�oœ3èqë§ïwSg£ªÞ“°|ãwÀ h¶ß].F[4Knc˜)¢Ôz᜜/ŸÙôÖk}Í»ô´#Ö¦òWþúŽù‹x„À°£�ó}LYeQ-~è}Èù.PAÑlç»i÷PZQÓDy­A:Ÿûx Ëm;ÚBÓQm¡y_€˜Š¾qÑwÜß%0€]…"õ@¶î)‡ìM@ƒ¢�3ì+m$”N`ì‹£*íË’Ò[·io2^GÒ{}L=rp7!r©Û­„vâ—ÖÒcA—'òþ `P´Ó`vÁvqJAò¡zlR¶m”†®CÇ:¶¼õNCþ04$ïÑ0(š­n¥ 8”Dßù4çˆ M@zÆAÊè&DÒñ~"¸€õŒKFG4Ó¶7q  Šv*V7JÔAiÉ'ê¡1DÓ>G%†œ½mCsO‚Q  Šv̰¯´*¢á@ØzÍÞûgO²Ÿñæáa¡Šx§€7áa¥×ÀPI×Þ›P‰°óˆóŸü´ì'Ìù¯€AÑNƒ™¥È˜ÖPÜÉüئî¼�Dj*¿µ¸Ä�ÉÓ„$0(Úi0þÒÒ—†Åg‰rá›�5ý¬u+gX�˜�t·¿=å�Ì0ƒd”?ÚKjè~|•Hœóƒsiý�ö‘¿·—�xމ˜¿’“Nƒ•1+ò'êkˆàØ`ÍÙè,×#S|õ]u¡Ë•øîãìŒÁ ˆ‰–àx‘¬×"ß!ARðbC?Œ½ûÅg.(ÚiðRjÀh…Í—Îcc˜öwÃ#ÔÖ1�íÎ:QÀ h§ÁŒ«vàs¥´ùø<6n¨&55äk ËW�@¤Fâ‚$�+è#e6Ј¸¼  ŠPc{Ô0ÛÁʼnŠ(`P´Ó`fe^0­°ùH=¶‡iÿ§hMY[Ò¹ûÐü·P´Fƒ¢�3ì+m0”!AØCÖ‡‘vAÜ÷uj—•dÚ…2x·€fÚ…a}A$†­áñ `×Eü†”\ŠÃÔbß2ëBio¦gd@°pÊ ¼á’¬ŸP¬æ²Ú»nP¬Fá‚¢�š—ijø0mDð¹zj²GÜøQjiLÊ/n‚¡ ?RÀ h§ÁL¦†mAйmaæˆÑ¢¦¶ec¡ ¤¥€AÑNƒö•2ø¨4*>{H“yñ´1Õ³�ÿœÚqˆ§ PP´S3zŽØ´_A-F�…l0(Úi03ÓAwŒÓ×ÈaW6ˆT‰|¶îaf6ˆÖ®^ئoŽÚHXÀº,œ)ilÙ»ÏamMö !JÑêq€˜F´b%‚9+Q¸vÔŒ•ܾM_‡]‰Jò�¹Ç™y¶n•�‹ž9­‘¸€õÓˆ@h>É‘ô�ßÜœ_€ó_ƒ¢�3+!€)…Èeàcs�rõ©¥1?°¯²�PÀ h§ÁÌp]¸­iŒÜÆ0 ë(æcN™5, Ž(.(ÚiðbsÔ,{. ø©Ù¹`,@ƒ¢�3C³{XÿúÒ#_sCÉÕ»Û}­·K_€ß�Oa jæ˜æf…!a … Švj^†^÷ JeóÁyj QþJ¯‹XCjgM¶R´Ég´yQ(XP´S³‚>ÒÚšÆ`î+~$A�íûÜ|P8Bƒ¢�33ûÀ)ýÍGê±=ÈàneH­Lù¶Ç("6NxBƒ¢�3ì«¥O¾£á@x{i|Pt„»Þ£# í4˜Ý˜b.NÛX|¨Ä 67>’TʱÊÖ9Ý�‰E; fØWÚª*�ÀØ&š´t\c¤5¾§WÆx�\+FÒNƒÙM„„¾ZžýÞ+C2| €f:†mÉp‹àŽÇi0€]õÂ"Ää˜×ê1Ã" í4˜©”£í>S��aF‘<áÈ`Gjê“bÏË^kâcA… Švj^ÐGÚ|¡1˜û–Im%Ë!‚Ç ’tœl›ÇCi[†ÆÈk ³‹¸q‘ynÉîX¹SþÊ¿PFëËÎL¬° Bé™ãQ"‰ X?Më¢ÊøõS ê4e6tÊáh¦96 ­á `וm1¥:šQ;Ï_mxûÄe3”y83ñÁ°?€ˆ5¶ÇÆÆOïÂxŠ)\P´Óàefc8­*ùH=6ˆéÝç05tD%@‡ $Œ¤pAÑNƒ—JÅ0Zuózl ³¤:�RÚwÔIc‚2ÆWâƒR”Ô#h¦4ØZW¨w<²¥€쪑ú@¸cX›2©R_ò‘¹‡Y™Zó"!%ÑRR°€uÛ â$&S¾ ²4¿%ÄQÀ h§Á ûJ)Mš&„»¯€Uê±N/8~šOºO}PÚ‰÷éh¦>ª‰,‰æàȒ°ë–"+þâë¥I•w T÷3ß㬼CÛa1�®±1� XÇ�ÊøõÉï[¬Mk€ Šv̰¯´ð¥™BØ’\Æ(ö½^ãœÛ’S�œxDÈ™&Ã’Ž µK>ÐŽäHfvªBÏýE¤DØU×é#ûÍ,§g§�õƒ{Ú�Óç1zS�$�Ñ Šv̰¯®õ ‹K`ìe†ˆbv£ÎÇ|‘à?µ®›ÊÉPššzõŒ³’2 ¥„’º–^Ä’.`½V†Ê&[ÔtSó¨BÑ Šv̰¯´ù§ÉcØB`øfüÒ>Ü>ͧ€…o.(Ú©yݘL4T^s�½>…å¶Oµ¶¥*· ÏxGîP¡'œ››HRÇŽ$ T@zh™4ò¥O+yF+¥K.ð&yFY>` I¾o ’ôû¦Pç•­¥C1åíÍéøšÚÄA!œ$é4XAi+ަ `X„œðõý5ÒãÂXˆ¡ i§Á Ž!µ77תªÀR� ’t¬Œ¢í6m�Ma¶º©Olî_ÃÌÈ�Üô¸ I§ÁªÏ™ñ¾Ö›ÇV0ãC:½t fH¹à™rÅ¡ŽE; fØWÚh¡QAØ�·)Ì÷}kr�«"ìÞ«àM®Še|¨ PÇüEðHàØQfFD)–®tlÛ\ß·2S„š&ñç1KÁŒðôÌñ–İ£Xü¨rJO|Ò¶ÆâGí4˜a_iÛ€O�Ã14ÜxQU„‰°u>~'^$qAÑNƒö•²O¸Êv¸¶" aÜÚ]o,<$�AÑNƒ`ÚìŸdÄGÊš’B_˜6Í6m�¯â7[r#DJÝ­÷žvj^¶u妲›º�yšÈ©1{}eu>Ú>Ô©1½™Býqp7™1Òäñ#y}S/"yÀ~»‘¼Êd[&æöC"yí4˜a_i“‰O”ñ¿Œì˜�^[Ý›‹E¥ÇK�:õŒƒŒ4¸Ø·†G%.`=W¾6«L¶ÏÚ.]Bq4‰ Švj^ÐGÚ€áóô̰…�H^uȧ×U©4%É“À h§ÁÌÊ‘ñQÚ¢âq�Çæ0ó ŠäÅæòÍŠéÓª`¡< ŠvÌl«ÃÇis‚Ëm³M¤î¨œ�uJ–>ãÌòR¤Rà]zÚ‰)ZÃ(›Uéö,92åó¡ÉC¢{í4˜a_iÕDã°GôœbÜ×dãFÊZKÝ£!F ŠvÌúXšŠFÑ/O±ön’œ(–ÀI: Vý±xK¿+—Öó%e°EJÓ2žYÆE; fØWzØK'0öت¤¯Áƒ#�]…×]mŠüZµÏSy-ýøé±É}ô°$í4xÙÁÎÊüÒ*Æœå.IK†wêg'/YV‘Ž@vÌ_Ä[.`ýT&— Æ5‘&`ÝjÝx4°(pA’Nƒ•:A¸mÚÑBöZÂÌD,¢XšK�^E.HÒi°²lB¤m=6L��avãc�³—*/✈É63ÜXa×#ÊF•´ñ¸H|Ú)T–Á¨£=÷1O `W¥•U]/ÉO¶¶P…Hä’æ�‹´S´,[LÅ {æx|QâØQec¹F�v¯•Q¬'I³}un0�œf‘ ùÛ¡`žÄE; ^�Ñç®Ì9¾f›�LC™%I¯MCs«,!¡©CÒÑϑž<²(qì°V¡C>cí6�JXºš�ÍÎÎD2ô¾öÌ_Ä%0€=µÒ•ö\OoÝ÷$ 'Ò•„†&7·ƒ³Ó•”¶‡‚�}k/‚�À®?F+ƒm[¾¶�÷Æ‹4J`P´Ó`†}¥->O{Äì°2…Hd·‡Š�L!©¥»(É=³ì¨"öí½ˆ>J`;¯lŒOrDE ¼´¸¿L`’Š›êÙvð±ç�%.`ý”Q>(‹«ïÈÅñ?t- °I\P´SóBlõ‡¥•)­ °I\P´SóÒ&� ÑÆ _7OMAv‘L_ª|�yj¯qÈô%©³yîqfú’Vÿn²o@J\À:­öùš.ȾËÏ]“Ôßd5;@̊ж� áõM½ˆýI`ûmèø Û£æYgcÉDRyóqzÚÙDÚ€"’}s/B’À¾KgTĬI5>´u’‘´+h  �ed)*’×s”ÀvÕÔó—ž\^ºà!Ku’ œ�ÍÐNbÒÖì[{”ÀvÝ ¸•Syzáxiþa‘æ#u?Î?í4Sªà]ÏýEÔOØU©@’8�Ó9µ±Ù"R/Ô1yDÙ©"ZÃøHÖЋðc‡ HµK¾¡�°”© Ú°< ìLS©¨È!cý"ÞØ¡ÒC~ðÓѨ¡xYãL~V(Œ%€AÑNƒAÚ«Ó÷Š˜á£zÂipGñgoéÚØ0±YGí4xÙé;>Nkfš3·ALÍ{Ñ›ÚÒ¶î_Ó›è�ÄE; ^ØWZ-óAñØ:ÞP“e“¤‡¥gò'Š ©þøæºÇÙ Lkgš:·=LÕûœ}N£¬šlÄ"8í4˜a_ …Tz€ñöT×[®b‰”1�‚DdPH’vj^P$©‡,p I6%H§Áª�ÚÔѾÞÊV©:�vì¦èdæéh-«"?=cÉœö–J„Åk$0(Úi0Æh+…¼Y�lŒ$.(8Fî�Ð-m÷×cæKU©L�¸ìö¦%E®Š4%xo€v²Š¶Kü[ßÖ‹ ›°ãjï̶Ì_Ë]öŠ4pø(=íìÓZR¡¦žû‹Øš°«P$+2š“±UO-æF²$0(Úi0»±Ð\œ¶½hÆÜ1CN…²R=©uûl)—–1f‰4ÒÜ¡=ãì ÓtÒ‘&ÎüM0­Ç¬Ÿ`+3JïNúã±ÄêqA’NƒÕ�=äÁ´�æê±9ÌfÖPÕEãÑ´£Ê]‘6E§Äî�vòŠ6PÀ˜Zi�’L¤^¿©õ¸ I§Áê&ƒÅƒiË‚�ÔSs˜•âØJ3ÇüIEÃà›@E; N†fu1ZeòÑyl Ó¿^¤-*ƒ©Pö:>H¤M ‚¢�'ì+­,iDö€æµò0 óýXÛñDåaHeÉ{õ´ó0´æ£K]{o¢KÀÎK÷Ô˜’{£™t¤Sî©4Õ­©hœ¤-o¢Kó7Ñ% `O�èRñe§ŸWâ9½²ä.ð{ØM†¡wUÀ‡³~Ýêa뤩¬†r¥`º´®Î½èÕ�‰ƒ»I½�* %u­½ % `»®r0 æH“Ùüø<C¨">F7 +C)4¥êcÆñnKãÉS „̧Ž<¡¬Kuè˜TÇŽd T@zøÉÚrž\NMùt8�, ’tjNÈ7Ú'’ÛGXÞ•üAÏ[¯ôì£Ìþ¨S�­«Z7(+ýC°ñh]pM ÒU0€E¯\Zµq0‚%€AÑNƒÙ�©àâ´ Àçë±AÌ �¦B}æzIFéD¡©CÏ8̸‰dqæo"Y=.`ý4R>®G®ç.ŠÁr>z ÌÇ䆘p«kìEKàÖq&·ü�׺E�FöŸ®&!RÛŠt�AÑNƒ™Ç깿ˆcI`» ű*#öÂ8Ç’À h§ÁÌ´§|˜6”ø„=¶‡Y]½ã&òÍ—€Öv3Rçå#�úóŒÃÌ;®Ô1H¸€õ“)Ïòõ>Ì­Ò�Nz‘�Æî&DéX?Ó5õ"#pëµÌþˆ�tâ7’á:ùC(i gÜMò‡Rø��¡®•q!� X‡å� B¶xˆ˜Ff¢ôj‘�ÍRÍv„¤gþ" $�ì©¥2£é|äö¸ÑÉ(B–¡q�7Ù(J³b˜¾½ `çÝLe²Å_òéÜúNFâ‚¢�/ì+­§ùd9ì¥o<6õºµN‘ŠšºåíKë«èɦðÆ¢.ÀŽ å½—{S\îÍy+>„N¤!qp�^æÇä+~Ó3ø‘ÀöTêÌŠI¯kO�“Ÿ¥xmÈGåggx(Í E}úÖð¨�İç~¤¥r9¦£]ÄÀ"-í4˜uºÜÿ\ii>g�Í@_y÷Tô$6•oQÌÛׯGÇ‹º\�¤Ó`}¤u4 ‰ÏÑ÷F*Eå½ïYÔŸJþ0T!ïÔÐN¥Ðz FõͽFI`ûîF}¢rÛ’Úû ­šõ‘¸ h§æ}¤mò�úÌsÃJ¤¨¼ÙÓÖ*‘B*FÞ§{¤›¡0T߆’°€õÚÒÕ9�žk>6î�¾r¤àNí{œ™³ Õ šê[ÃCS°ž»A ÈcL"~Z¦’¸ h§ÁK%Qø­&iÖܶ0�ëǧj[Û<¶Dn,D%�AÑNƒö•R�|XåÎRõ‰Ç°)U:Èw�E‹$.(ÚiðBâEô³S¹¢~†œ�‘E; fhd$žÕö¤ïŽ|YÿEdDƒ¢�3SÉû0­½Ëôía¦€Pò•ñåûÒÄ–È«�ê›÷èhçUX¶€ ªôÌñ ‘İ£HÈ&òIZà3¥G�ð��€I:5'KÇ{­½i–œ¦ ;€  Ìq‹ k]8GV®@ÄÁYG`AÑNÍÊ¥t¼_D‹.`Ý´"Ÿô|a~ÅûÓB"ÁDÚ 4*ÐN01 \鹿ˆÊH`»* œŠI5CŽ•cŠéòÃ0]ø°Üã‚$ÙV�%ŠÍ S¡P$%’¸ h§Á ûJÛ)4"{Äè‘ú›8{ËRT©R1w]ºÚÙZË?Å®úVðؕİÇVòGÅãÐòÍUò‡4ø=íämq¸!¬¾)<„%qì¶7ÚÖä�”+ Å�$.(Ú©yAiû ta˜fШðN¯V/#çÍò,„…Àûô€³ó,,kCEpzæ/âVÀžÊ‘²D.K~ à ñ`tFƒ¢�3ì+e!ÐÔ Ü}k ÕæÒ«ÕŸ…�Œ ’À h§ÁÌLCñaÚfàcõØf€x1£ØÒ¸Ê›�‘€I:5'äm#Ðpø¬}kÃ�Õ†ÒõØkѱ"‰ Švj^½÷¾Öª™ÍS+�– ÇlÙÕ)#ÝIÆÂ1íÔ¼ ¥íA´:.ò›‚4»ÒÙ…ï6ïôò¥N´�Ú˜wèh'Z˜ª]Fzzæx„HâØQ+©"âÖ¤Âö‰9ÂDR…T†42SÉ`àªoîEàJØwé=Rq–ÊdûŒt ÐH`P´Ó`†}¥Í>Y{Àæ0Uyq¦²×£už…ÔÑÔ-h'Zh…�…¯úö^į$0€�ÇFÛœ ;ó‡�Áˆ‘E; fØWZE–N`ì}ë†djSG4–¦nX¼�ŒE; f:çÂÇh…Éé±1Lû cpþJ»xž@&9HÕ@Ýy„AÊÉPª*èÓ5„ÇŠ,@]¶´FíÇD »:¯@j6>8;­@k(Òµö" "pë¸TcsÒºñ,?S1H�é õ�‘´³Le§â=÷‘ `W�°CeÃÆâí4xݨ0§uŸ®Ç1E÷‰­ŒÉ`ˆ¦æÑùþŸ"íÔ¬ ߊi?§…~il¼¦é4XÙ™•wz'yéâ:,óBjmÞ© �z¡M(jÓ7÷"j#�ì»ÔöÓמ*$ÅóQ}‰Hg„H5^zäí”mø!œ¾­1 `Ç…¶W‘�Êc›>)¡íEEƒ¢�3ì+¥¿ùÒµ pÛK`P´›�/Kõ·q�u?õÊ ©?kÿðs½³³B+;ÜÓñ~ظ€uÓJK‰°5Y·ÃüÕ$sßn´l�xvΗp&zéU'‡H#¦ôÉÚÉ!Ú"ÂâJ]soâJÀ¾ ãbL…—£~“0g^t–#"­&h§˜&ˆŠuÌ_D—.€}çéÍàmê:ãÅs0(Úi0þR*šOŠÇÝW÷¦Ú,Ì�tÄà¼Y†Ð‡¼O÷0;C©V ¶Ä[z[êqë´Òâõ]àù ë¬:DjF ˆéç›ðOÇýM€KØUS‹\z˜â˜*#Cêg>6@;#C+{0èÕµ÷&è%€ì¼ôË�i.£NžÚAHç‰-Måo2@,•¯£D÷7á% `W-ÕY`é-ृñD¡ùÐ<oE”‚ƒ^]{o‚^ÀΛÑ%Ÿ‰Ëì·ü(íÞä×éqA’Nƒ•‘±áA´º,ýñ›ÂT/Ôò]‚£mB#:zÂi°é6ž¿Uª‰†ä¹HÇ 3p¨Wræ8oœ-OJ �w戩%;ØÓ1׸vŠ% ù*ÅžÒã©KH(©‡I: NÐGZõмÌ5&ÔPo’,tuB§?™Ïûs�ÃÏM\‡3ºêqë' ù¨sÁ�E; fØWZÇäN`ì……ÅB>ôzìÞ c,"�AÑNƒ™­!}œÒ}4Xn{�uC!µ¥Øå–s�…B$0(Úi0Ó:ÒÇýÇè±%@“ ¥â±™|“!R®€�¸ h§æ}¤�‡ÏÐan¸�bc‘pƒ„E;5+3É¡¢ö#¿ïaøã•ät³s¤F…¢}[pôAÂÖmßÓ™ä[ËÖ6æé—À h§Á ûJiFš&€; e—zm,½ã:-|\<ŸºE»ñª«L¥•5¨Çæ0ͯ\ýÊ_þÙSÐ8R¦¯¥sj{Žv Švçj×þ“³eóÓ²”¥ò ¤ê.#åí¼m@€¾¹ `ßenAÅËÑ|Ñ*·@*o>P@;·@[žû¿¶”([]P˜û_ƒ¢�3ì+­µù¨8ì@êÖȹ�¨ר@ºÔšÔ¡G˜G×ú—‡#”G¿kX€z … ›cØšÕŒD*HÒ©Ù*ÞCiåͦê©1È ð£Ÿ-—¢Ú¾^.HÒi°‚>Ò¶C„9b‡hõ^Y§W^)ø¯‚øRoó>=í(¾6°¨DßÞ‹¨„°ó®û?2Éåh>sz×þ…û_ƒ¢�3Ðó^¥WVr+ Žw� ’d»Ý��´Š¦õã3GÔ=“ȑ眬´a¥Z\*>,d-uåfÇ}•Øvë]C¸_]ÀÖe”­�c<èõb”‚ŸÎ=ÌŒÉ*rïYï=ë°žöV K9Ç_± ‘¢ž†ÄÁÙYCmh×wÏü…s_ØS+ú¥à–/) Í‘¦¢¯R®–¡q�vôU iËá/ç}k¸Ã]âØs¡*d[×–h¤‚±RÖóQzÚÁXKq(¯xÏ÷úK\;jE^#nIr;�vvÓ­ Œƒ³¯JyY�íJï›{თÀösvò‚‹”9%ˆáÎn‰ Šf:»¥Úr!J#ÑÜy-!ºÍwt׆Žyh¡GÀÑ-QAÑ G7ÓZηZ%ñA¹oÐlBi)—õgM•*"eku�1_·E³½ÝÈWZ•N@ìåfè‡Ê|?†&­dDXJ~Þ©{œíÕJr»÷�á~w‰ XÇå!8BÖ$¿—½Ýq‘Z©hŒžq�.²}Ü=oÜÇ-që§© Œ=p©ƒÄRèóqyÚá_­A/wßÚ /·°ë˜K9rJ°©ó’zîd Ý¿m7²÷…Ö4A[@‘úÞâØÎ�®˜EeÿéÜêž·Xƒ¢ÙÞb£ö!ZÒ¹ma U(*å®-mÓDµü@×±EûI×119&*xˆùŽ%.(Ú�÷Ør’.éÄÏÊ#óÛ‰@¨þ¥W.Ð…ššDº\{渫VâØQ¥§ f‹«rl^Ž•òŸ�ÊSB¦¿¶gŽûk%.€5üµù¡£ôv¡éMÕ’žå ebM�¡§Œõ _q‡ H ç§r!F&cο¨Ôæz”¸ h7®GÙôa½æ£éqÛòUè“#ô3§ôíH(er„JXP4Ó |¤ehéÄÜǾó³¶tŒù!Üû)qAÑLÿ§®saZœòAzj’Ìž74¶³æ,Üh97Ÿ à •¸ h¦7sDVFéÅ7 /`ŽH ŠvçˆÔá)'DÍ›Û ,]/dlgJzdÝèTÐ )�AÑl/¤%› ,=´öÙ8ì LI©KcôŒ3cNZ€c^ɾ5Ü+)që¹ïiûäü´üÊØÕ!ÀÕ&qAÑLgð‘V¥ s_ŸJ $aéÒ#Ȉ(qйdºfP—Œ ¿R>Ò+AëWç¸àA!÷hXžq71%C•C¼0NOÎ3çÌ=âeߦ2‹ó!zô¼q‰ f½×J;ºfÞx�0€}6åâ�ó€ŽxŠ¡c»vŽ �Gƒäo¼ãJz‚Þ£®½7î# `ç Ù8””—ÏÞô¡ð ¹Gõ„²üÃJ|‚nš®%ØM#Pé³!‰Ö#g¿Äý86ˆtX )“{äânÖJbAŽš®µŽ� XÇ•OD9ÖúÐÆ’N¢/$ÉvH0yä~­å M—× &³¤;¢0>Æ•ó6œØb+³=ànœØ–XPŽ�Žù ‡ˆÀ¬ŸÖ6_Ë3û¶ÑíwÃI,¶0�‹¼q+y9Eúæp§ˆÄ°ë؉?ŠÐœôq=žø%0(Ú�«ÔÿJI“2_w@2I¡—�©1VŽX!N¨CÎö±*Ñ„�ïûæ^œï%0€}gÞÙ5? 7ðÖd¹òΊ-MCäà ±‚œìû¦^œì%0€ý†Nök¹àÿÐ& 8ÙKÜÿOÚµeK‹óº©ôö*êÎ8<��ù¿BåH&ÿyênwäx‡"V,F¶““=UBSo1íÒe³I»•rf}}Š˜´½ç¾•±µ3+�lggV®;æ8ÞõêJ j[¨v”^ç{–;õ¾þðÞWŽÓ4²�«yÊq¼ñ´ÕJ'Ôv1ÜvÏóãÛž’ç$Þì>¤0.@òΑùû™ô#?âLŒ:?òe·Ô¼æ©}õ]<ò#ÐÈvräçms‡}çoù‹âÚ#nˆíÂ%À¸öÈ»«vôïç»pôG ‰Áóæùzÿmäsj¯[á $nŠu©2\\ƒä V9öw“]8øδ¸•³öêæ½¿nyƒŸvÖFœ‘í¬:˜�â ¹])Á½²»ãÝ¿z¾m¯˜ÿŽ£ TØð®n�qq��wˆÑñº›D?]Ì´pÓ³õîc¾Í­B:ZÌЬ£_ ãMÅ_«ÑtÚ¥�µ_¯R<]-Óñt˜vÖF ‘í¬ö–�¢�¤Æ y6¥ Ž¶ú~–ßåãsüø±Ž†;I‹iŒ ëh¼)E‡}>/÷³éçlÄ™9�³_åÿ¬7ïçoWp¨¸ws[£1,¬íEû�y{×ú9q¦…I»N…” ÙC\9 6¿ ç°°šF[ÓðxßÏ¡ïgZ¼Ò¹õõ\IZ±Lí¡,ñàŠ@#ÛÙÑ•ëz9Ž÷¶–0¡¶Qj‡××v&÷¯¯4²�^ƒ=(ÅñîÒV+�PÛªÂÃëv;¿Jƒf\YÃ|�iˆÒ¶˜øÌí\_88w(S"¤#󳶯Ìǹjhx? 1@Å´pg #¬s}á¸Þ¡L‰0ÚpåsYÛ["§ã'Å;ÜIj<)0®Þñ¶$��ûé.œ�hbìá~ó(ÛÅö’Ľ¹�kx¸‘´ÅJ€q �w%álÜO¦Ÿ�gbàÑI”Ns«£iëy¶üÄc �l'ÇÀ ª˜ã`{i/�Mبè\z/mÉÛù¬ÝT•Ú¨Ÿï§¼ Å“ãª: O�½sýpŒ8•N�¯í�ð«á޾ߥ�gd;;r],Çñ^Ó.W:¡¶qqjõ}/ÛÖûÕº�¨…wu‹iŒ ‹P¼A„Çe:qö³é'UÄ™y´Måùèí¥jû›Ì¸4†M *ÆU/Þµ´ós7Ý•4MŒ]8­nyzµÜÛ#õâqpF¶ðÀê‹eÙhÞuÚ5Ëf‘6°pkª¾ç•\Î'53Üt|L縰hÆû—p˜îfºpšœiQ‹§Å©!ë½ý:~Dâi€F¶³Ób°1¥8ÞrÚÅK'Ôö/ñ´8í¢éñâ0õ´@#ÛÙi‘÷¦Æ›N[¬t>m£½é¶«£·¦r! 6�Q†;)dѦªý\ò™º™svªmïØzL@9ÕÊÈŸj}Y-ΛM»Né<ÚÎnJí5QÛGïN*k°Û´°àIe�¶.íøÝMwåø @c�ºÏ¹êl¿—7…5Øl¶°ràIa-Ú¹èìÙ{¿pÚF ‰¡FwüŠ+ºÚwýNa«¿›Û² 0Q ·í8ÛÍ£žfdB¼¸÷ìãKF»u¡¤ûŠ_•3TTÒ¢í)?U¯³<ÊÓü¿ÏÞ‹§jÙâSµvzÜ=}ç퉰 §GÙÎN�TfËa¼­´+—ΧíQÊ™v�íV2ñkvg5åP‹@#ÛÙ±‹l9Š7™¶RétÚŽ%kŸßÒ9¶ÞÝŸ¿K§ZÀšÎδ¼)¥0Úpê:å³I{î«ßòLøüm¯xâÞç-ž1..pñž1<Ðv³\8Ðδ€£�é¹5­ûËûï8´@­ 7œ¶>c\\kãÍK;ewÓ]8eδÈySz~ Û\÷–¹½Ë‡‹Z¸ÛÔuJ�qU‹·.íHÛÏwáH‹@ƒÎŽ+ì]nÓÇûï`èPÖ‚ý¦-Õµ‚­‹Ï �ï gWÀ™¦»ç×Ñ�Â�Ö_[묡‚ÜÍm1\\P£�!=E÷3é§hÄ™õð¨¸;˜§OùÀý…£"�lñQ j9†6½†sITtv]�ß ølï�Œ jxÿ¶¨`\P‹6>KöÞ/ hb¨Qùl=¬}ú®pù îâº4)NÚIÔós?Ý…ó3MŒ=<ºn÷Û>ÛpX¯Â»º­Õ–¬Â –½kùüŒ0Ó¢ÌÏ­Ï��oMM«ÒŽ®4²ÅX·æÃyŸk×'�GÛ4ƒÕú#û–Û°¼Ò÷¤B…÷s *Ãi›Šxpíf»pnœi�‡÷üë¯üD/ ájÞËm�Ƹ¸XÅû‚rjí&»phœiq‡çÃWy·Ry]HëK ¢ÞÜm™Æ8i{ ¶½kù„Š0Ó¢LO¨«�Ûö²×öqGí€ 0CÓÉñ4¸¹*ê;Ïíí¦\«‚Û¦]¡—ªè”Ωýlú9q&Fœ Ÿe;XIÒ£Õ¹P÷M )ÅÅuªè¤Zïü±�&F”¥VØsãEK4X–Â{§-Ì'ݽڑ´ŸK>’"Ì´°‡Â?m-óS{ìO;"ÎÈvV*ÊÑfÒ.�à;Ý–ò×óQ:äWË­¼]?q!ÎÈvrââ T ã�¤•O'íIÚ)p�íUv©Ï£½NS<"ÐÈŸ£TŽãÍ¥­U:¡¶SE7üæÔ¿ƒJ@x/· Æ¸°ÄÛ‚vTígÓ�ªˆ3-r¬=ïå;êÛ·ÉZ}–ŠA¸ËÔˆR`\ â-K;¦öó]8§"ÐÄài“ª˜ù~kOæs¥ ·¿R`\©â½lxPì§¹pPD ‰1+ÅÕÏÖjðh߸ÒΉ34��ƒ3ƒñNØ.Z6�¶«†»À½”hü+1¸6„÷w‹*Ƶ!Þ,´ãk7Ý…ã+àL ]<,nÝuë-þqQI§EÙâób¸A¥8ÞyjX„Ú6F•¬êy~¬ÿ<)dá­î#:ÇÅu,Þ6´ƒd{×Ãö¾ª IÀÙÎj9Ù ÚnÚª¾Ó�K:3Nõ+ì¯OkŽÏŒ€3²…gÆ H”�ø–nk”M&íÚòV¿Š~ª½x‚ ‘íì ìF)Ž·™–0¡¶gùƒ$ǶÂÛö• ÛQ¦QŽq€3²…¹°LSaóíqè%\§�›¹-Q<)ÔÐÎ çºù®œçhbðÁ^Ð^ºði�üŸËÛZ%À“â mây®›ïÊy€&/�çÇ›žÇIE9ÏÎÐtvž£]*Eñî³…$̦ídn3X}m§¼va>NÉXU‚Û¼“O*F´gä‡Ë~® ‡Kšx´츹�«ÓrÜã~¥À“zmùᲟëÂá�&.�žVG›öù´7—h§'ÄÙÎNO¼;å8ÞvÚåK'Ôö°èP÷øþÍåv]ñÏÃ;”v`ã©Q¥¸¸´lb|Æê�_8W"ÐÄHµ³Òc›g{ACÓ�µ³�lñY w¦Ã[N»ZédÚþåŠ9«ÓòaØùþlŸ©âbÞÖ-šsx�H“ýTúaq&†&éH¶:Ú>˜ú}—s˜~”Cœ‘íä0G¯Å{_»rÙlÒ6ªæë™}SìŽ7Tˆ§9ÙÎÎs\\Êq¼éÔ•&Ôv0í@·ÎW?8;•Nó :ÙΊPù(ÞùÚÚî•m4¸ÝVçÛùåø„6—nð>jA�qqU†ïIítÙMwáp 8Ó"WÎp�wý–é{jß·Ïp4²��ápÈQ|w׋'L§mÊqi�mûVè}ÍGÇ E8.!ÎÈvVøÉGñ�ÜFp¯ì Ã3Û:Mýxèí(�jg6ÙÎÎlÊiõT>ˆY>¬ÜŽÚÚ �F¶ø€Ýû9ŽîêvéÒù¤"<�¼ê'0?Û-×Jð¾®Q¥À¸Vnt²é½_8!ÐÄPµ#Ñêiûääúî;ŽDˆ3²…G¢ Š”¢xwi—+›MÚ¨ò“È:Óö ÊÛ·}gK<‰ ÐÈvZIIGñÓVEq/ìVXÙ=½ù{VÁÍŇ4ÆÞ©†'´~š '4š³tøXyÛÇ%¿·öi$ñô�@#ÛÙùƒ«F9Ž·™–0¡¶g…»Ñ³~Óñ÷Ê®Žà>ÓÂJ€qu„7-í`ÔÏwá`„@ƒ�F|´X=m§ˆÖ<%žHz˜�åì4ÂU¤ Åû_»xÉdÚVª��í[�îs¶Ú qF¶³o )Œïõ”0Ÿ¶q„?òGýJàïév.J௷…•ã¢ß Ê!©ŸíÂ! �&†’è ±:Ú>¸æ�÷Ár• �l''”h?Hqx«·ë—N§ìáyà^¿“·’ˆc}ûRÞX5¤VÂ[”Î�ký80“‚Ô#«Ÿ×þ´öÞÉ!Fhd‹#\ ÉQ|ÿ´ •N§ÝŒÑmvß¿—÷(_Ã�‹xÿ´¨`\gà›Q;�tÓ]9žÐÄØé€ÂÚ¿˜÷(q_9ÐÈö?Ÿ ¦¿OU3ç祣A�34Ѱf’Áè6¯!å³I;†Èçí³uŸ§£L ïq†¦3ìPŒwž¶NÙtÚ.Ýt¿'§?gU ¸™ZLcÜI•‚nLñ´â§»rXéq¦E.QðöpõT$s�‚ÌÈvFÁagJ1¼åÔ€„É´ý‹v¦êy^‰LcÑ\'è÷ÑwR&ÀýK;ܪ¬ñ}×M<ÐÈvv$v§GûN[ªt>i Ï)·]Ø8²ãýýÔ‚Jp'gñàÞäcCçüÊQ €&FÝû+A˜÷‡˜¸¾·õT ë´?h’~.ù@‚0“–$«›ò½1÷9GíD‚8#[|& Š9ŒoëvåÒù´=‚OÞ«ïM>xÍŠOÞðãmA%@íÒÎ)ýlÎ)41ôàœrÿn’Byîâ8Ý@5Àu¥2\\ ˆn>5tÎ/œ”gZœÝ^ý¼¶'j9M¡Û3²�Ðm¾ûSß×íJeÓI[ÿ¢ï›Û¾é·¿=•ËøSm!%À¸À¿{é ÐO§ŸgbèÁ`ýýmŸŒZ�ZMg¥ƒ7üzëJ¥8é Iyï[?† ÎÄ8s~½zylýÕïãBiü�F6�_ï˜"‹}âƒ?ÞÐí* aá¹?Ú˜§w®uz0“‚ŒhôŠÚ>[õù–jxÈÇÛ¤-Éò£;Ž yï['òˆ3-N�Èßßõ«U¿Gl5"�8#[Hä£3} ã{·^«|:iyý»~´ªüê^'§z¼{[P 0>ׇ[ÑíÞû…ãM U¢Î÷×ö¡¡ßwñDæ 8CÓo¦³|Šâ›¨†”ϦÝ�ѽ¶:ß¾)ô:>ÔË'V¼‹ZT 0>±ò-©1úÙ.1hbèÑ©uÅ=¶zû£áøÔŠ?á¶V P»‘´CF?›~È@œ‰‘GwßkûÎPùÚ4Ÿœ¦á¾j •àâÓ4Ý£Çï§»@òhbìÍÖÏ½í«æ|pÅßp *Æ×ð† ÞÝ{¿pÖ@ ‰¡J´þþÜ?;4µ[�Ö#ÎÈÒúèfËP|µ«•Í&Ý‘)§^‡–ÄÌ¥ð}…T#ÎÈÓêè|ŸãøªQ j·£Æ¶×ù^eÅ?÷¿ã礰mÀšb¶§SßQm¥²é´»S£ºëtÛ§us{‰¶Èuhd;c»¼¤0¾ÑÛZ¥ói»†ÆÁ·Çõà·wµ‹¼CYoˆ©wø¿×o¶|·—ÚÇç9øõÖxR\|ž£;Aá½ýd:ïEœ‰�k¼÷~¯qù=Ò&ò^ÙN�¢é(¾ƒÚåRÜ ·cø“¾×ï´LßÒ¬ŸèºŸk‹)AÅÇ9øá‹Ä»›ì ñ ‰‘k$wÚ>Eò�§rB½@rgd;!¹|¯e(¾‹jLùlÒ œå¦Zª|mo3ŒÏrxµ�`|–ãÛQbÝÝlWX7M =ü�ßj uýù=žgg9ø×°RàÉaŽî�óvÓ]!½41öð8מùšÚ[‚ãÜXm±àÉqŽîR‘üvó]!¿41øà÷~«ßâx¿÷7‰ç;ø·¥ãNŽwtOhÜ×Ïv�úö0ÓâŽæ­Va¿ÜÄNø·eJ€''Îèv`¶Úy¿Bshb¨ÑÅšæòFèuÕߥ�)><õ×a *…Åg'¼¢Õí'Ó©.âL <¤•D̦oý¬Âï9%‘Ñ!ÐÈvÆèøD—ãø×R¯Ÿ0¡öÓÓˆæúoõs �¿·Ì3dh Y¦@�V'ÛW~_J¹�lgÇ™|ÿ\Û…Ü+¿}…­³Ýö‡a¦ce ‡@#Û…ã{-ÇñMÔÖ*�P»#57}öï Lí½€"‰C ‘íŒÄ)tiõtß¾ïú*wﺄ@#Û]¢3T㻩^Ca>íÖäßûôÞßY?µßòéÈ5¨Ÿø®(\?™NágbàaZm﬿ÏÇ X#L4²Å„Iã*Ó{Ù÷­(2:YAœ‘í„€¦ƒø:´_Pî\¸¤ ˜^õMÕ¿g%D€@#Û  ßPãG�J˜Oû¥EìrzÖ·Cæc÷'v‰¿ŽV Œé%ÿÔŽÂY¾Ÿî=@ ‰±‡¿¬çöšè_k<“^üÅ´µãbÎË¿>�tÓ]`€3-r)Û­üt{yîw.ÿçB¶C ‘MÎv�úªÚ׫õ3»ƒ¨1¥¸˜ÜE«Ié§w~!á"ÐÄHÃ÷÷p{,ÌT—$ÅIm¼�õÎ/lg41RØÎpcX]l¥äï•ݤYoˆ÷‘tȶ|[éþ”žàßµÈ÷¶%ð”lcïOiwÙ”�ï¥m �F¶³d˜�â ^×Cr¯üzp/]=o�°~¦ýchœêºËÞƒÂ$F?Þ{ÇúFŠ8Ó‚,¿�_c×ýý.�g¾×ßÏôh€ò¨÷üÚ_…[œ–‡£ßë¯îx½kŽ3²-�/ÞÜßõñ¾õXøøœä9üË[@ P[þpî�ëq&Z/ÒÑSz_wþy]ÈÏí¶¿þ¹`îÛøî}nýi¥8#Û¾Ž_MëÙ(ŽËƒ…ï•P=Ž�¨t1½¿sÛíW'å‘Öb¹Ý]D Ðȶ΂øªÝs{§y˜“ñr´ˆÆ8éç¨Þ·ž…gZœ·ÿi½-ÉöÔà÷³?+Gùâø‰”÷xÝýUJ€F¶%p†9r\?�šebÀ.3¾ŸÛC„ŸÛco(Ëôý)êýú…Ùï�J 4²-�3Þ‡ŸÛÃyïùÑv…õ¯þn›ç}ï¢�{çQ4²-�³~}(÷®ÓLÛ™e« ]HÚ4²�'íîöN1|Û´J'ÓîÁœG¼ÛÄŸö>‰GÈÐ𸫆£ù†©q$S·]F%Ö)Êó�%ýÏß TqF¶˜J(£ð†ù­†â¾³-�³þ.zì�üµoïüo�MŒ™5ßkõW¨ú}¿{×aóñ^/j£ÕÇûûþÃx8#Û¾‚;豟lïûÓc†Û£”àb6L·ZÊ>û™.°OšvNýVty¶­ÐµïÁkê‡8#[Hý„A|ËÖ$çùÝ/�Ï{y¨vµÜÕ“È'�l1ùTFá}ó[Å}g[gžjÁàxí™L�hd‹I0ÞO)„o”‘0—v×'žêËÅçÛ�Òº]¢ò`m÷)Qhd[g'tµó~…˜ÐÄPÇl¸:(öÓE“²aÙFlØíz)†÷3•†“i›cNЧ¿�R¿.Ñóf`9§æÝ˜ xck‹“L¤í‘´ñl£jFpê…íd�fˆ:9óF3üŸë+ç�2%ÂŒ‡ï=ŸOù¦Ñ*8#Ûé98Å;F�As/l?~c¹mõ¿OùÌê»1B·c¸hŽ£E“MÜ~ð.fžÛjÝÅ2M—4²ÅeîmQçé†3<¡¬©´¼Öý{ÿî/jTO(4²�UòQpknh¾Ó›¼? íNËæÛ9mG˜Š/ÿu|Q7šôcÄïr¬ÎgZ�ùáluÒ¿¬_<œ!ÎÈvRIñ^Ù.Iî\Øv1Ñí~?·ï�Ùœ|nïÖ'Øo]}<ç8CÓ¸ h�°Ö™Ê#Îå<õ™®ÍhdÎÜ”@xçlK”Î¥møH¯o}¾zú–¾ w”Úw¯ÁîUCJ�F¶x+Dþ¶{.§»wx¸ã›ØGtŽÓ6’øüÚ9¿p|œiq¦'ÅÕÇöl‹ë`ÐNŠ4²�ÕgòQ¼—µë"¸W6FÚq¾åÛŸò£?M~¦ÛþÀ6ì-¿€†0#Û¸RNÏëLÛ³è+ßh2íôŒ@#ÛÙé9ul'󺛾f·*‚ûÞ¶Δóê>W9b¾§+çUÙΊyù(Þæýº$AÝgû¬A9M¾�ƒ6”ê`ÿ¨¥8i‹N×½kù¬Œ0£¤úSFs +T¤Ã¬-IŒ‹tÑvÛÞµz`G”‰Aö‡æ±½Œá{;’,•Âp«hë‘ãRX´ïðé·÷~áØŒ@C›w夻?æ&›hd;«Úå£x«ò×%q¯ì{xv§óïë½=YYκû)Ò±aF¶¸N—�áM¢.ˆà:ßmÜïƒ�¾ëÛ+1SIàê�QF¶°*– á�¡­Bæ8Ý_²Ãú>‡W3…Ó:¢Œláy=rÄÿþ¾þ~ò¿àØ–À ÔWŸÛ‹?ÞßRŸŒ �¸-µ` ¶9ÆGõÞû…³:M 5?­ï^ÊûwUŽë4²�Øû«4ÎÛµ¿JÃy´½?=«¿^Û{øÞó»=á-žÕhd;+™æ£xîAHî•ÝŸ ¯¿m£œš$ÍEQÜ:[Dc\\í ·a*=tÎ/”,gZœ°Ón§Ese7Q· \\™ä 9­Ÿt3é候3”.øð¿úØÞmðë<«4²�–SÓQ¼¯¶k¤¸6iÚ~ŸÛ‹ŸJ}a>ë ¼¯Ö�R ‘ít“†BHï[®Ÿ ÌÄ0±~²c¾ë¦õ<Š…]máØØæÛìÔÊhd[gqý¤÷~¡~‚@C¥-÷¹½‘ë=Ïû[üƒB6昶. 0.d‡ ‹Ê ½÷ õšj^?Y½<žµÂðy_¨Ÿ ÎÈvVËÍÑ6Ú.Œà;Ý�óòÉ:ÑöÖ´ãë2jù�F¶Ójr:Š·ò¶(Š{!/`ªŽ?Ósx·ƒý v0Ï)LÙAó‚Îúw|¶®�Çq+kÙN Éé(Þ»jš{a#¤-®zþÜîíÃ%bÜ6|H ¶yõ§ªÒôÓ\(ï ÐĘñ4Be’ÕÉóS-·£² ÔWhd;¯±t»oŠá}µ]²t2m“ö—ìQ_xôx|ƒê¶¸§µh`\º 7H*ãôÞ/Ôhb¨p6¡‚Êîãײ!bghŠ‹1 c%‹åþ†Ë’8ïlKàK©½îûI�®z±„@#Ûi=(Åû{ Bs/$‹añe�æ½íG/X’¬ø‚@#[\|QFñfÚ–Dq/ì̸çÞ·W˜•êÈc«#¼™¶ˆ`\0wf*äôÞ/T€hb¨”«÷§ÊïÏÖÌvܾں$@m�Ë4�ó e(À™(l´áÛJ¨Ü[¨_’.®¦GÛ1Õf:ßêP€31NdÝS}½Ýñ!ê æ�;h (Æ5ïp;æNçýJå€&†*T~ª—Ïm½“)­üÐÈvZùIGñ^î/Næ^H Tý™êWÉVF¾¿}Ë3‡—y=o9A"Ù–ÀÙIy¦ó~¥@CÅ,4�%÷®jåtÜÙý² €Z~‘êQÝ\WêQ41p^¤ÒYR>þõ=  À>ßÖhŒ“RMp6šŽN—VÊ <ì²>žsœ´ÑŸ¦:ß*S€3-NÚönÛÇ.Ë«G9 …ØbkD)PÛèOjS�÷+µ)šêmû D)=ç°jÄ;{[‰xRy§4‘Ⱥ©®”ȨýÁT&«ˆïJo¾ÂáaõK4j»üI™¬ó~¥L@CÊd·íó¥rtD$UÉzœ¡)®‘ ƒxOoFp.äÚjoÿ½Ü›;ö¯=œ!JÛAO*g?×WJ`eJ„Ãâ×s®ý�ÏAµµâ�lgů|oš[š{e†3–�ö‰|’TzBœ‘í´ôä?N#`Ž?êýõ-7Êdh[g´ñïŽ?Ó»l¾Îñ¾£ÿ vtÑhd‹ÓÕç¨ÂµÎµ}–óóÜ?ʪ–Æhd‹KcÊ(ÞÓÛºî•áooªpíÓ”~¦Ûì—$+�!ÐÈ—Æ”Q”TüŠ$Þ…”õ;m¹âxÝL ˆøMµE“ „M=.œõ®/hbœHÖ}p{9ú}û¦XT8ãí½.J ŒÕ‡(Wpé¬÷~¡8ˆ@CÍ*s»ߟ%Uægd;©Ì¥ƒ8Åøë2v.d«´0·N´½:þ÷âs±0‡@#ÛYa.Åûw[Á½’ Ü»:½oÛÏç�¬IÁ­³E“cmƒ÷a:/S¡­ŸëB…�&ŽºSžýšîs”ÐŽ�k^‰Á¯¬‘�lKà,.¡õÞ/” hb¨i…îù)¯•¹W@‰:Ùâ �2ŠM½6’{-kq9mõ¾}[d½‚Ÿ¹­„R‡C ‘mT‰sI1Åp¢ië’N¦e­>í~]WÉ4˜h|<ç¸X¦á¤•×*»©.Ô*gZÔ¸ñ­�í;«ÿ{W¿r’ æ�¶B 0–l¢$Æ•¼Þû…j%M•êf;®ÔÍ>/DV(D ‘-.*£8ÁøË‘¸W²U_\ýnÝe·ƒ›“Bƒ{‹gŒÓ²K\ºëœ_¨Nδ8©,ˆÅµê£ÔÑöo>h59€šâŠœ0ˆ3›»$‰s%K&EÁçºÞÛD¿Æ4¡(ˆ(#ÛYQ0E›e]É»°ñzjû®üyÞŽJ I¸Eµ` ¶QƵÁÞû…Ú M 5/Æí^|gšVŒC ‘í,Æ­Nî�Z?kMaZ1�F¶¸§ŒâdÒ~.‚{%3aEp÷ì±$öQÑ'íåq=°w~¡ˆ@#õ·4•Ôž¯¿ùYËgóQµJqˆ3² JqŽdgJ-5ž|&%I¥…Áuž÷«–ÎZË�PD”‘-( b"JœdÚÂŒ§rU^\gÙ>‚vŸK§õ…ê �lquÐÿ„Óá¼Ó·¥IçÑÒ˪_×bÇjîó> 0–‹Â¤A¿Þû…J!M sR…|Ê#³]yqO6ÿ‚dã—e4²�f®Wý@Ýï³c, á¶Ú‚H€Úæ,{ï –ÔþƤ`¹;(-wÓÝG“,hd‹ –Ê(Î0þºdî…tµ•(Ux–.ºíYÊGXA<öÖyšý†›áŒlKàK)™vS]¨˜δ¨17VDi¤»<Ä©V˜÷ü €±j&Qª8öÞ/”*hb¨”Ÿõ£“åB~Ã2g½¶. 0V­ÂJÇÞû…R%M 5)U®.îÿù&F­R 0CS\§qškEp.¤L*M>þæ­›ïÙúÆX9ÃͽF”µ×{ïê£4=Ô:ª”펲7ˆS˜WüBœãbm*ÌQT_ìœ_¨KNúûÒªäêá½5ó�ÔjUIÄÙâª$ežC9¥]¡t.)?JL_ìÛgrï_ÔŠ„ˆ3² ‹„G<)„ó‹_¡á\r²zü= Ó,¯½ûZžSÌp3oA$@-¥GV*Bîs¹žJ­x‰8#[X¼QNñk’øN³Ó°xúÜ_S»þ³J­xŠ@#[\< rP‚á}½­N:Ù…$qÛÞ{ð(ûrTÆ£]ÕÇ0ÀI;;S©øØÏt¡j‰@íÏUª–Ï{ë¾£«-fh K–�œ’ñœuj,é4Rþ¢Dp/�Z/÷vK’«p‹oáŒq¡f *<ö¾õ‚%âL‹“öÜ{mâšïÇ>M’î¦mM`¬G…[3U{ïÊ•41Ôq…pYîã^¾Ú|¥B@#[\!TFñÆ^ƒÐÜ Y"-SÖ™Þ�B‰5J�²ÞW'I?Ž?¥X~O¦Ó m <ñö_½–2bƒ�r†ûºgŒ5±0Ipųó~¥T @ÓCå2âþ2å÷·ICj©€F¶¸TJ‰0ÅPŽk×&�KÊ—~Si/V~–¯qF%EÞÒ}0 –WNʦ�÷+eSš*–M·,»G£±°yü!óýá^ušâŒlKà+®ezß ·=Ì´(ó2éþ êã­«j•´ÇšNk¤Ù αîŠdÎ…|-TH§½õñþ÷:®�T! ‘í´BšŽâdß–Eq/0HÇõ[²`çS­�f€:Që(iS¡s¢^R­@:q/©%íõ·ÚÍw¿ýu5Õ=·¹å8r[ (Ãi VªØÞöFËOû¤Z± ‘-®Ø"WI!œzý çÒò¸Oˆ·rq·²æ¯ Ž:"$™MÔRÝé%s¥×nª ¥eÀ™6UR+¦<–Ý–”4¼>ëø:‡)iï¤úÛ¹¾PÉœiabv\ϯZÙÜŸ^ ô»>ïµIp'ò]�C¹Û9¿R» é‘R ö1—_ÕöÃí¨°+µ[ÙâÚ­2Šî„æ^ÉÞTÌ 2ì>—ï~•Ê·ˆ3²�p9:púó 4šHʤyw�ikö[Ï2�£Ö£phd;+àæ£8áµU܋ٓʪ»÷Ï4ÁJ$UdÄÙÂ*²0ˆÓˆ_†±s!#%uÚuš{áŸßçÁ&¥B-âŒlq©VÅi¤­ˆà^ÉIxôØ=»—÷Ê!ìâ>¤PË%qQ·÷~¡j�@CÍ‹Æ�•âÍÿuí¥ZÑ�F¶³¢q>Š·ñzq$÷JNptvuº½¥ñåVä:Ü3[0c\¬ÖEû/W~;ç*Æ€3-N¬ÓVˆ{<Š©Ç_Ñj3˜‘m \•eïX-÷“ÂKKÄ«‹çÖ{úúë.KV!œ¡é¬>œâ4Ö®Dî\I‰yavŸêû¹g?©0‹8#[X˜q*ók2v.dEJ5ßâïåÞÌ nß- ¨%‘¤ZÝOs¡Z�@c†Bññ�èC-÷ØØçûÛŸ6R ‘m œ…õÜÞ¹^­Fœ‰�âyk®�•ÞAO­T«Eœ‘mT«ýƒÃ¿^%a2�>Pù˜ °ë\¯­ùôÕÞþ(Vnhd‹+·Ê(JºmYïBÏŠÇûDÅ2½üš ‹Çˆ2²…Åãdf]¿#·Iꆴ¼;,5ÝV�#Ñ®d€‹5SJÞi»ŸI¯`#ÎĨy�î[óíí¸%IÐÅôÛV(Æ‚n”˹ôÜ{¿P³F ‰¡kÖ»ƒRÃýø`²’5à MqÁZÄ ×_“±s%yç%êÇ»ä¯í¥ó•5âŒl'UêtçÛº&Šs!u§Eê}¢RÂý>ÝŠdEjÄÙNŠÔé Îø~EÆÎ5ò@5ÞÕ÷»ä¤uÿ›§¶Jq�F¶¸8¬ŒâœÞÖAp¯(W¿®˜TSL©>žs\¬š†é™jË�ó 5iÀ™'f½ò(ih]Äö€’ÏgnIŽ|Ö–dŒ34Å©kä»ßïs>:®H¶ÅLâµ|×È{ïjä49ÔuÔm®5äï7,"Sk ‘àb94J‰Tëî�_(’#Pû ±LÎ¥æÝÇ÷û9Z��F¶¸F­Œâdê¯Lâ^ÉÌy¡|=zl'µÙi:J�p†¦%p% âtZ#Pœ+©™ŽÂ¯B™|ç3k‘°…¶€œ´�ÇòÞù… 9MŒtT!_ÿí^òçú?¾-¡@0CÓx’ñfÙ.ˆà\Øx³úø>Q1<'¿ ãú8ÂŒlKà*È|S ¹�·Ç8MwQ¿@ ¶—ó ëÏýLzÝq&FMdåY6Àõ„újßqf™÷õQ ŒÐ0IPº÷~¡t�@C¥í¿bÜ;´Y¢„�Ý/Ë+”Q’ ’rïüBý�&FšV¬W'ïg÷J±b�@#ÛYÅ:ÕVs~”íÀ]Å{g[ØW�«c×ÌÒ1&Ѩ¥¼¸´Ý{¿P¦F ‰¡·ÐcûÖÓ×azñ_[•1,Ôn£J•æÞµ^¡FœiaRv¬�ÒòûŠõ[L|~ANa‘„ËŽíT{îg‘KÖ3)à´p½º¸míÉŸ&žj…kÄÙµ0ˆSn»8‚s){WOß÷ñ V�1»ù@-ÇÆÕãÞû… 9µ¿±ç×Xâ}<Š–ú*¯UßÔJÈ3²Å¥aeg׃æ^HÕXŸæ"ï>Wy�ÄsòË’U‡hd‹ëÃÊ(Îñ~]2÷a€"5WzשžßZ×��Ò¨R"F ‘í´HœŽâüÚ–Eq¯%ëGé£ý–]ñ(gƒ<Œ­Å0ÆiY5®SwÎ/”©'ý}”í­±øÑœ6ŒyÌ-ÈK¿aNÄ:rç[/“Ì´(óuuò)ßåìT„¬D 8CS\¢q.w—$s.ðª¬R)ß�ÌDª,f´P†ÓÒj\Äîœ_¨Óδ8}æÝFnkv~D¥lN©n1Îa¡ÞËÉ9P0 ªÝM¤—ífRÈP/¯_0)/éØ¿4Ïê0¦Õ¶6 0V~ÃMeïÞû…z9M •N{XuÞ�”žë××G”T«gdV«�xRçy�†sɤa%q%U­¿Àû±� C‚k1$8)ÉJ%ü:U±ÜŽŽRœ‘ma_”˜3%<¿<£y”ÔIYñ^û~Wqï*Þ{¾û…sä»N‚3²…¹³ß€k/úTÊ,ΧÓKa—÷± pR¦‰Õ…Î÷up&ÆIi`Úz�K5»ýÞI;…¾”âbé4Ê\bïœ_Qhb¤BÚšl¿ŸïÑ,$Vðhd[gÚ(Î4íÚ(î…´%Tð§£#{Ú¿ZpF¶…}Iƒ8ÛùEIœç‰Ë÷\¯_?)/ïhû›V9œ‘ma_Ò csŸ×Ýñ÷>͹7-�+©vß>s|øT­ÝÐȶδQœnýªdî…ÜM7Ïm￞þ^o_²tÒ6ìê5¢ '%–“úzçû‚|8Óâ¤êý­õbUmV·ëþÝO žèÛà줴Þy¿""ÐÄP±vÏðÛÞ†ýjÏÌ«•sÙ–À™6Šó­¿6™{-yßö>ëϱk³Š ¶‘OTì(]s…½ó~EE ö7†{IëÁ¾u¯cCŠõë2žèØ”¯=±æº|7Í•‚>MŒ™ ú\¿Õí÷AkÅRz�34-�+i§üv…ç} ¼|+_0ìZ²YΆ„Û"J€'r6eo¬'p�¾›êJe€¦Ç�•ïû\ž�Z³ÝtT¥Ê>âŒlKà‹ïíÃùw‹H™LKæ}Ea÷ë^"Û�ù|@ –Ê|ï\×gb tFĪùîä³Þ�íþ–ªíˆ3²-�/" 9„Ù€¿Jù4j‘Öÿשž[ù«}O«ÿ#Îȶ¾´Qœ”󻔥 ?’öYÜW)4 qF¶%ð¥�â$ì$q¯dô¾ø¿ú�¶Fòç¡°ôÞçàO‚;ÑÔƒ|NµùÞùý�&F ™q‡øVrÞ!åùUO$õ(RÕ¾÷~¡Ü�@“C]ÓÔ·¤«é~HÁ¨zcâ­ ‘á¤Ü ½o]p@œô÷Q6®€Ò=ÿü8€“½1Åù9ÇIY6–$zߺĀ8ÓâÌE†ÕÉ«d«ûãè•DÄÙö% â<ß®Jî\  .Éì.¿Ïסç£ä�ùÔ‡rŽ %ï(5³ÑûÖ…Ä™g®r¬Nî[ÿ­œku•qF¶…}Iƒ8©·«’;øÝ3$ì3}¿÷ö™Q]@ ‘m œi£8£úUIÜ+é™*+¤Ü?%m-ü�»_—L`@ ‘m œi£8¥Öu‘Ü+ù¹¬ÊÓ »çò–™Çì+Þ‡plÝëb2ч4Ù–ÀK/¤_ôS]>hbÜTb!ñ`õòÞ[ú_>¢Ltœ¡i \Iƒ8é¶«”;W8�ûêö³þóuøu9÷_�s}< ‘-N๠³ÎQö„õ,÷9®‘"ÃÎд®úL��æØ'›EK¦¹S§ro‹åÀš–Àçí )Áüô×€ Ù-Ð7prGa†¤�n¦ ’àL z4m½ý·ÒÙ±P>vKräã¶$ 0î9ˆ’;+½÷ ª µ¿QDv/îÃ)¢ ‚@#Û8ÓF1)ð'q¯0 ÒAPM¸¿Ë·#Öäws"ž B Îȶ¾(içÎÆu‰„¹´ÔŽI{÷ì ~HÇ>¢.nDR;+½ó Ò MŒ4W!Êã›å¤wÅ[M…@ ‘m œi£( ·K#x2:”^ªÛòÀçáÝ:!Ÿg€‹¢$JJEïü‚ƒ@#Mu‡ÕÉýY¥‚NÊdÀš–À•4ˆÒm»*¹o!si!å`Ÿéûš�þ'Mr@ ‘m œi£8÷úUIÜ+‰Ü]ÒVÆ>ïOü´)Et@ ‘m œi£8÷× $÷ ‘È”�}¦ïz oOsKÊâŒl û’qâ÷K2v.p”=^E“îž †Lp-ž¨¥ÙX—è½_Ð^hr¨ë¨ÇþÂþ0nKÀ¼ÚV"Æ} a’&m¢÷~A|A ö7æÚÇîý-I?hd[gÚ(έþÒdî…D�Å\Vö¹Šf°+2¢ü€@#Û8ÓFQŠ÷Ë’yÏé%âWIa¯ïóÛŽ Ü€¶E”ãÖN×CY¦Ÿæ‚.ƒ@c¦"ma÷òû¸Œ¨IÎд®úÕÉFsæ÷—j4‹Æ"‚[ †ugülL¼Úƒ¢4�@#Û8ÓFqî¯Ahî"�º:v�HpOf=ѨåÞà¤JšG?×±�&ž‹%«—"fJ¸ßêšV8CÓ¸’+;—·z~Ýeœw¶%ðTY6Çßõ†»uŽ]rЧ•P©¾‹œÑ*O’40CÓx"&“˜¡¸åN¤±�L§Y'ºOUZy]Òihd[gÁœb˜¬´%J'Ó˜�ÏOÕéwýÉÏ�S×Ò€iÙG3Æ= aŽGݧw®ëEˆ31ÐTŸYWsÞXÚ½|–Q×ggd[_Ú(b'5Í{Îtèw[?�ö¢ n¬@Fà#ã– ¦X¡#=¥Ÿê‚f„@ãr6«—÷þHÇí(ì*J �lKàLÅŒ ])Ž@/RudŸj^o•½ô ª#4²-�3mÑ¿*™÷œâäMïÏq´.!I Aœ‘ma_Ò bmIß)¿ »çQú/^ßù9J�} îð-œ1NJ2±0ÓûÖ…Ä™'v.ì÷Yê\Øÿ÷©¢¶-t~r‰¨ŸD—ˆgZÀ¸÷£È±»(ô¹¿\8‰6‚0#Û®¤AœüýµIœK<â¾5Ûßw'óA·æµB Œ»8Io"‘¥Ÿë‚:ƒ@í/ÆÚ 軃¢eÌ]4™0‚@#Û8 v¸Éß_³ád‹ÀNŠÕós{fc:ôj¥À¤ÛBJ€q/gp8³‘ÓÏtA¼A ‰acq¨BÜc%ÜÆ€)Ø/Ñ·1„ùœô•Þû �¦‡Z?AXâh�‰Ô=�™¯­DÔÒÒy¿¢!Pû)9²²ªñ;»‚¼¤œÐȶδQœ{ý¥ÉÜ ‰œŽŒ¬€LeŽMíøJQNgd[Ø“† Á| Æ“Ï$Q AÈ©3}_SûH´*äÐȶδQœŒýªdî…Ì>ÔK¦­§ß}uIÔKgd[_Ú(æmA÷¹€„Xý~×­G©Ÿ3�hŒ{%8mELÔaº¹®841ð\À™ö®þߣ%¢€@#Û8ÓFqòmWJq/dr’lHø˜ö§=nå�ÀÙ–À—6êHBóóÙﻊûζÎÕfý©—_j½ ÚÎȶ¾ø×›B˜«´%JçÒˆO¦ãÔ‰ÜkÆDpF¶%ð¥�bºä×$s/p/Úöªç"®´÷£Uñ! €'�&ïa¨ó~E@ ‰¡ú„½;ñ9éŒÛ?€œÔhRàIûGÄtXãé¼_Q±hb¨ÄíX‡Ù?Çùûž˜¨ßÎȶ°/i³$eç9á¤[ɹ«åSžéº¢ ÐȶδQLIÚª(î~CE¡êÙ?ÿÂ�ÀI|HàI£GDpXûé¼_�hb¨(Ýög^>‡ ½&@IÚ¢ aqIDnX÷ñ®/ÈE=̤ ‰±°är;žuy|\8©T8#Û¾¤AœíýIœçÄ¡?­)ñû©ßã~ÄÖÈo[89P˲|#믨Õи‘ò‹iÔ²\,2õÞ/¨h41Ô\ÄÚ½¸�ª(*¢Œl z†Ëèæ¼:Â>¸òDªÏ:Ãk{çù×I5™Z8CÓ¸bv’B˜v´uɦÒ( ®);ûLß÷«}ÔYÔ²hd[gÚ(&~U÷ ‹Éõ¢u®ûö8Îã÷»Qä"Àš–À•4ˆó}[“ܹÂP¯Zͯyý»¾±šDév�f’Ò},9Ï”²eJ€©$5Íõ?‡ £èQÊzøab’˜od8�Æ\`U¦oé\Þž³yÞ›chßÀ¤VÃI�Zj�õ£Þû� �&†Ú×rvÄïë&ܺ�™Õ/Ê9.n݈²4kL�ó ÚàL‹ÒÍŽ(ýº=ĵ�@¢õ+2ÀÅ­!AÒfM©w~AŒB ‰‘)ø–_Ôö`Í­S&\÷f×¶, 0îÞˆR5«J½÷ rM ÕU·öá¿�q $V¿ ç°¸$ÈѬ)u¾/hQ€3-L8s­·t9oÌkièÌè2[[Œ1HH¬±(Ôy¾ ‚δ ¹d’Í´(»'†4­�F¶%p¦�‚_¯ˆä;% $5‘\³O4?ží�·¢Îƒ@#Û8ÓF›ãüüºGi5÷½m œ1)©ŽýC<Ô®‚‰ÞG4jt#Ö¤zï&š*�’íÁš—çõÌ@®o‹’à$¾ L½ó MŒ4˜v/åSp·£¬L4²-�3msm÷ � Lë4÷íù�çOÅPô%Àš–À•4ˆ©F[ŽÜ¹B[H["�fŸÊ}ÜNTvhd[g=GJ‡ùðË3œF"2x­ wÞÓ¹µ/rs P€PŠ“hH¬2õÎ/¨L41RÌBâŸÚ¡þä!~UÀ¸ó…IM®{õs]нhbà 9­�÷öÏt4«Q· R“¶H 0n„‰xiC½s]øBœ‰�R…§bʃ<­#€šA0úUµ4‹O½÷ êM 5Øg æs¯Ý¡F ÌÂ~]À¸ƒSz&‰õ3]�Ähbع$¶zy”„·þä§£~¬Hb4²-�3m‘ƒv�ïÑ@AŒå¥}*/ˆ ¢¢Œl z Ê>ëåüïå>XÇ�*ÈÚêŒqqJÈ8PVê|ëjÀL‹‹ƒâûžË‡üÊÉÿ‚œìÖc€ÓˆA¬DuÎ/Q€3-Îà.îÅœéU>âÑ=µ$‰@ˆ3²-�/m³€ƒä^¡SY•}A6§ï[ýpør¤™ÕòÚu¹Šßê3Y]0œ¡i \¥¢Øþ7Ï·ïÑj–‹b2²-ìHÄTÄ_™±s�Õ_y•;i{pé{÷~]« r€PÔ˜H £õ®UY Q&I÷ïöùí¦½ÅŸ{B0½¶I€qOçêT©ë§º Ô!Ðĸ‘lwá>?¤‰dˆ3²-�¯€#¤Îÿþš 'ÓÈDªšíSMé{‰‚j†8#Û¾¤AÄü’$¾S6AÌéYžÏ~}_ßö®îZ�\ÃIq ˆõ¬ÞùÍ�&FêKAuxùJÞ¾7Q» 2¿ 縰%$(iõ®eÁa¦EYw¸MX·Ÿ×š¸Ÿï£6¿!VË«1Ûžü$Ù–ÀY*àÕ‰VëAF¶ C˜�¸¥;Έ &Ÿê²”¦¦ÇáÒ5Ï`Þõ�œ¡„¤+v½_U±C”)N­‚ñû}> ӼͿæ�òŸGBý V‹ËU‚²Þ°nX;dõ­Î²½Œ¯ý25Ù�F¶%pýH Ä=3Åmד‚âôûü´ç3¹£¹‡�fÔP¨áõÎu q¦ú(ÿ÷U¾fø¹ûQ¿Vd5„ 'ñžXØë}ëJ⤿o£GågúãGä}{½›Q¹Æjyìµ£BÝšŒ€F¶%pÜÍõ¯ø~ŸÎ­k1Bîã/Ñ (ì/ 9Ézα®Zv ÂK¥ÂÕÁ³M” hd[gÚ(æ@íZ(îB5í»êïÇú,´¦n?Ç«åsôtÔ¨‹h4²-�3A®Üÿø¹¼©æ’\‰@#Û8ÓF1%ó*s/ð;*Ö/M¯ÛN;Q¯²¡Ñ§Q²XO¬ÎïUÓf`YGDÙ’ñL„ÜbŒ¦Ñ8U°Á–œ°^õV=¥'¤A.ž.n] ) ™�ó º-àL‹“ʳ÷ò!Äí º__@ßâ„´£Æ“á$æ+¤½o]!Eœiq¦¢äîÃ}!S%gd[_Ú(æAþ²dîR•)“ëLï푲ûß!kÂ$À MKàIÜ£­†à9#1�¢ªÞ>�{.M”hd[gÚ(f@~M2÷�šÚ}s;¶’dzJ…s,"ù…”�lKà,‘Iûi.è¤41fRJ7Ìk^oÎïÔ0Ð^…dÈ-Ð÷W…ÌŠ”ÏÞûÉ�&†Jœé¾?mw¼„’û«z.âWeSØP¬kö¾/¨¶41P¨•ßëS÷ïQM¥n*ÈÿmIœÄAê½ýøø[»ø�×x߇T²ï<ÿ: 6ó÷Q^‰ÕÇ3ÀÙö%©ÊwzÚRT•hd[gÚ(æ$~Y2÷Á!åö¾?~ø`©»k÷Êm Œ¼ÐÙ‰äÜy¿"ÐÄP‰Óµï~ÿlóB¶V#ÊpaŸ?dS, w]“gZЂœ\�|ßSy•þ9pF¶…}Iƒ€ÏõW(ñ�Òб’ܾþ¬Ò&R¹s)€F¶%plw)‰ÝouÒÉÐÓ=œ¿Ú<¯4i=b>�çŸÌÄÉ…4Ùb–+ÞÝTWoš7dq–�ëåø®$úíÊugÙ–À™6ЉœÿédîV˜KàS}8m~ÅLQ ‘m œ 4Å0³k‹”N¦ÑÄ©þtn> ÷í6•ûðç÷§c#¹ê�lKàL컹®hö41ð\&¿Õ'ÚÖáëšL@#Û8ÓF!ßkAhî¾ 5×ê×ËÈÜN´Ê4jäîDËî¼_ëhb¨H¹nû£Ÿ_׫ƒ„@¦ü² €'Ý�3c‘»ó~E ‰¡ŽÕñõ,QØÜ­”2®ˆã=Î䮤AÈï~×Dp®qS–Ž7çå©ÏöâQïq†¦%p% B×-Bæ\à¤È£¶ßØJ‡Ö4ÛüvÊ5ó£Ïgd‹¹– Õû©®(õ=δ¨IFÚ ¯ï÷sì>ÜʄͭÐxÒ«±?Ö;×r· L q…”‡[¿ñ�…@Õü‚ €'½…ïcñ½ó~Eµ ‰¡æªý­ô䬖Ûßq‘$ѾÇš–ÀUÀà23³v•²©4–‡=¬Âo3­–ï¡aˆò=�lKà,8TLyåÈëé1¾é¸¢[£ð¤é1"žÔ Ð9¿ÐC8%ByÛ æ÷® Âs9 i~M@�*†��o½“`&†‰)à6×'9ï÷ãÁqn¼†¶”5žÊý½s½�q&ê¸ä>üû\ã<írìY¢_�î¤ËgÞØÐOu¡³�&ÆMEVçëfù*ßBÞ?2*ªú4²-�3¼bÉp¢´íŠ¥ÓHôi^u¼Ñµ÷Û9nî8Ðgd É œ÷?ôûyÿMÿ‡-‘Àžüòœ¡ê¶;ônÅv™p»uüO'sG&𥶠Pcmá­ - ý\zhbàyïCõ²’¦ù ŸZï�lKàŒÈg!Zé.Ûx*‰¢ÙÛWu.U=ï·kçGàI+(Q¼£ŸëB?M WD-ÉHá|@ F$•æš~® Í541pß'±}´Ð¿Ä›¤‘0µåÂÂöç�zQ§IçZo¬˜‰AîcÊË"^³ä¤�.ù¿ÿ¦ðµ¸­¥w­÷© Núë”>•Û«|³pclï+}*ˆ3²-ì‹xfŠ`YãÉg’ÈhÚ6S'Z-si˜½Ð9ƒ@#Û8 6”ÃôÑ-Ñx2�‹b²®Žýû5¨Y¹#l>œ*îTfêG-.½ë M=41N¤S+æ]^ŸQò‚Dé· ?¢ÔÖdŒ ›¥™s¥í3ýDzû âL :mŸ©>VËì“•öÙ–À’©ñøÖ2õ»ë6v-¹È’ÚK€qS.S.$œÜ„ÒÏu¡{�&žu°ì>J‹G߯‘µ° Ðȶέ0Á0iò—m8™ÆÀò¦–}®ùóimXbW �lKଆäw¢püUóûëKPfBÛ8c…y÷\^òìß53½ó pÃŒ»ZzçºZhb¤y Éêå¶ùûQÖZHhd[gÚ(&žíÚ(î›·�Ô¹VêùiE5±…�F¶%ppæÃlØ­Òx2�Z§]-å-þÅðuMZJW à MKàJĸF 9È4í2›c÷n«F¶çà4Ê6²t¾õ>€™å°edï†[SSÄŽÀš–ÀÓÑ Á<ówiÆ3iœ•ÚEž¯í½ïö�*÷N#Ñl%À¸w:d­ÔzÒ{¿Ð³‚@C%J]»÷‰±]�F¶%p¦�:îÁpýÅÉÜ tˆpõ[ÚJ>“÷ë©‘áú€À¸“:¤ËØÓ;×ggb i«JûÁ}_GiQjUAœ‘m |Q;wyÇ…{z4ÚbºŽe’g!"ÛÛO¾gýÜÈ&[D Pã´aÿLï\ïŸAœ‰�¦+»×A£u¬ Îȶ¾´Q�ºa š{j(GgBÛÌ>Ui)™ß~U²¶Ù–ÀYp>I1O:xøEN†¶ø“6Ѭp~TÊ©‡p†¦%pœT2È“N 5ž|*´Å§ºd›ã×w±«lÜ[|ß4ÂŽåÑÙ�Zmz纊hb¤^ý¶—ÿÞ_(ózú`Æ-=3²-ì*8¢d�¶¤ý›…™À"¦î—ûÞz¾çö|37¸ów‘Œpq;�"òæž~ª Í=41nà|uÍ¿s×ßáÜ‘rû+u†ÒXÜúã\_èâéP¦DHG‚Çþ6‰õþ|xŒkcG®ßÖ"Æ ê|pàVß ÓÏ£¶õ ÊĈ³¶žÝÇ<ÿJäR[âŒl û HyyÝök4˜bæžvõ¬Ýö׵̓[Ÿ¬«qF¶…}IƒžÄlÛŠÎs’ ºõÁìó¸&­qF¶…}IƒžÄ¬ý‚$Îs’ŽÌ·ºýLÇ›—¸W)­�gŒ{µC~LM5½÷ mD41Täºdã¬ßyÔX쿃 ,Ö­Êgd ±gQë]Ø¿¿†›³‘¬Õ`R FÃfŸÞ¹ÞÉ„8Ó¥n›WÞóË=B3âŒl û’þàªþJ$ÎsÚK¼mó»Ñ¯yv~}›82Ð÷‰3»Kû‰ú©.4!ÐĸIµÞ²üëû}µ‰wD­­P‚ˆbÜsÔ»¾Ð?„@ãLû‡v'å5ûçß•þ!DÙô$ 9ØÐAýõ:Î8&°Çûßö†èÇ!…Q6ÒÂÉ÷`3ÅÌ»˜º©.t1δ¨�+ÝëWÇKN¨ßIÐoyF¸¸‘9$TÔ4Ó9¿Ð%8Óâú_¦úJ†ûÚ–ÒþÙ–À™6ŠYP Bs/Pª¬ã¥N4n·§_”´ã€F¶%p¦�:þ޹ nª }@€31lbUfeG÷Ö�ÌÍØÀ—Ü�pq36q¯´§›èB7àL ZèÆ©Ë<—~ò—‹(ïÆ ‘m œUï©dã­ð;uj¿kÆJ×®Y‚“håILçüJ MŒ$‘Š(-!óÇ#|?8°J¿(àI?xDQ¹S¥ó~¥€&†Jà3¾Gu�;À�XúuO:À‰¥æ­0ÝTWZahbÜy+Ì­¾�¡<¡Ñ]¶´€F¶%pä‰s¬tÿ¶Ee2´Å–Zc¸½¤Îåkób_ �lKà,`Ì·ýÍ&Ï¿¯‡ø&u`Â~‘Îq'Ýç«æ~ïüJJ�3-ÎmÄ�˜Þê{"VÆÛ^yÅíéÀ�ÛŠ$À“öt"ÔyJ7Õ…>À™vð£ÙÞ±žM÷¿�šÓ�~º:‡Iø¤KÄ»¾ÐÓÃL 2ØhðÝ/ÔTÓ/Ç9.î �X+7�t¾/4žÎ´8ñ…ã+dÚ¾6>¼žúÓ�\¶%ãâþtâ©ãV˜n’ ­0€3-àqßɆ_ÿó{T„•¾@Ù–ÀSÀ‚+Æ}º(hné®Ó¨1Ü“®ŒÎû•šjw‰¦õèù-?ïÇí¸¸e Hj WhûhsÍ_\£¤ïƒ€F¶%p†T€0·ô‹4œK#ªHA±¡£Mõ]��WAghZWÒ &·~I†Î%¢ ú 6t´‰¼À"u‚ÐȶδQÌeý¢ŒÝKĸ¯óǯ¹¶f̳wì[±{"ÙJp™ ûEÀ¹ÞC@#޹cV®ø)äoAöø/`�nU¸¸÷šˆhÖÉí1„3-èQ{L[àïk:ŠçR{ �lKàLElÖÿjÇÞEfŒ=&ÅyyœÞ½jGêMAœ¡i \Iƒ˜À¶EH�Kdxên˜òƒYsýùìú™�/þBÀNº™‰z¦�:ÝLz›ÀL 9mˆÙ¯À÷ûvrÖƒ CÓ‚~�”á·©ª Óqå±›Hc»L P£®a; x×;Rhb¨ã¾”æb^ñëáã÷¥Îȶ¾ˆÞ æ­þ2 'ÓHpG�¦yû.\×»�m¼Ä‰j@)0lÑ�õ�€s¹?†p&ŠÄ©B>¥úí!¿&Z¢#~Q@� vœÀ\z« M |kUy»ßrÅÌïû_ÜÈqü]óëùSÚsœ‘m |aï vŸôóè]+ˆ3-äžÖÄóQéÙûå �°ýVçGØÚê$@#[Ìþ z·{^IÚtˆâØxL´Í…4†�ÇäVð®÷òÐÄP„· /ouùIÎ}4R8¿"œD#ƒz36ÆÀTzG MŒ;k_)N¦ÂŠsyNOo_! ‘m œ0HîÚEK§Rx"'‹i{ÃËñ™xjJF~çÂážä€+r» 8×zhb¤HG+¤¼ÓåÙA~}ÑDñüª €Ñ [\À»ÞÒC@Cíèè´ÒÔoyÁK-R,H4Ý¢D³.J†‹º’ΚöóÀLr?áL‹:mVÙ�¼Êwy¾. ¬Y…pF¶…}Iƒ˜eºk4v®Ö¤S¥ÌóÚ^gòú»’›Ð©B@#Û8#&*`˜b¶J'Óøª'~ÍíüYY†÷úë™FFç£9‡…½ÐLÓš~&½…q¦�6‡4'ßÇt³¤æÙ–À™6Šéœ¿Jc÷7ÌÚAÊT÷ý5ïC¸ÍÛAgd[_Ú(fqmUr÷%L:Bö™6÷ò‹’u„ÐȶÎ�} ¦•n‰Æsi5k iWãû~\Ké !œ‘m |i£˜ÈùÎØ½Ä ÓÖ�i~—7 l–Û!° ½!4²-�3m3¹º.Š{‰¦ý!û\yš'·.Yƒ�lKà ›¦Ó9·Hã¹4n˜vg”¹ÞÛë*Þí›ôZw�lKàLŬ²­Kî^¢¨IwF›ésïV’ÖŒe½a ÜC˜Mú•8–xiÖ€Ñæ™ËÃ~%’þ Äš–À1¼BÔÍ/Îh&‰²ðÓµT”yÊV}¿ÿ½5;ïÄ@˜¡i <‘˜€� » ߆!u@ Îд®òþ‡ÝÇgúí*Jû M {RÆ0wl?”̵ÂBÓ¾‡2Ñ4UÖö=®ŽÐø@@#Û8¶) ˜F¶J§Ò8©/oN·×d|Îé¯Ó–› f€‹Zmcî‡ à[n| œiq’`P!î-ØkK\Í/É9.ìµ xŸ¿<ÐØÐO"÷C Ì´p�ÕMkÿÞ+9ûµ¨õ­¶D×j<)0ìµ ¸ßyƒL¢6hÌÄx1!m�WùÄÌ/mô]®ÄÒÜÚŒ€a—kLù°U¼ëí41ÔTúŸê¿­åÐÞÝ¿GYoX7̧Æã‰&µ‹3žDâ[IïA›¥XnÝ¢$½4²-�3m±¿ ™÷œÙd½e¦ûþ‰Ç!' ½4²-�3m‘¢¶(Š÷œ`e½m¦ùõÚ©œÖk@8#Ûø ØÔ†éH¶mMrK4†}›çÊ:`*½ã€€&Æ�v´¥.ïµxù�²ŽÙ–ÀÙXìŸÖ“÷ܽ­Bû gd[Ø—4ˆJ�@ò�R�TGß'Ú8Á/)¥::ÁŒl ¹êL2˜É‰[—Ñ ËÉôü¶üåÝ¿Î�\Ï'œ‘ma_¹”>Õî¾íE ǯVPÒghZWÒ &IíòΕ¨èm¢yK#ºŠŽ8CÓ¸ ˆ]Îæ×f4�@þ �Ê"t™çñ©–‹¤^ÐȶΈâ¥ænm}Ò©4"˜ê×m®"9f¿F‰~M@#Û8ÓF1}óë’¹¸ Q¬êy~·¯ÉP%‘'Ñ9.j  xØPÔ‡YTQŸ`¦ŒÔêY~LCê8Óom�Z¥@#[LÀˆZ¡0¾ÏµZ^®íAPÔ hd[g$Œ6LyßÀsö˜_ï"1'·J#`Ø»Ó0”ÆÁ»®©ÐÄP‰fm·êÆ—¾'”Ä jH)0ì  èX¦ªÃTºªN@ã¦*Ó»÷ªQÒ& ‘m œ…åÏ^n^Ê—)î�Êž¨É4²-�3mñ:÷ÛI½ç1S�ËL«z‡LI‡@#Û8 xLŠanàh<™F4r�ì»uÃ<�CI ë@ÖöBÔa<œ)Á¾*ã9$j�õ,Ò¹¶6ݶÄvAëPÖ–À�0¨H[‚ÌkÊhRìû)Ÿ[-SÙK/a4²-�3Î×9†q]a2-«g Ý>“¯[i �lKàLÅÙׯJâ^Iå�¤WÇÏ{¯~’8ôÐ@úm%¸¸=†RyPIÍ­Ÿê‚X‡@ãKd»‡ùus·V*‘!ÊȶžöX¾Ý}•`Ž5žŸw×}¯L†¶%p¦¨vu®®ÅGSíhd[gȳr(·Fã©46æHM}}K÷œuü [iÑ$À¸å'¢>¬£õÞ/(‡41T¤1³1’ϧa û¨ã(nQF¨¸õØÎP ëç¸ Ð!ÐÄ€S�¾ükW5…�F¶%p¦�ÆT/�ä;å^Øp´»�ëéÁ¹uGÈ\|<`ÜuÄ4(Såú™.Èr41ì\˜[½¼6:ð:dKM˜C ‘m œ!ãÊL¥ÚEK§ÒxY.Óís}îÏãõ šL‡@#Û8ÓF1uñë’¸Wx0œÝñ\2Zç¸u#!{ñᜡ‚n$&A¹FØÏ¢j„ˆ2%ÞT“[=ÜËQ´}ØT•äghZW̳Ró§v�²©4.† au¼=n÷ðR•ïýA¶à"5Î+„½÷ !M 5WëǨ»$M!D ‘m œuü&ÎÄ¥F#Ì£± *ªmž·×ãøIBÇ2Ò·ü„4ˆÔ»Þû…�&†ÚsŠïVH^©Á¯bH}GHÚª$À¸óˆ™G®Vös]�+hbàHs@sÛ]”÷„~&ÏP©C”‘m ù‹”¸W¸†¯¿Ç\¥³Vˆ§Fä*- 7ú„ć½ÞûÕ�&†JL¢bæ÷«˜©k@)Pã ±ÆØ{¿ "ÐÄP)‰o˜-·À©É³³[—0nóáT?–ûyTíQ&F Å6�ã¾Û ù*¯ÏÜË8©‚‡#Û‚nZ30eiWh<�À|rånŸeþ<þ¾~I2áp†¦%p…Y3ÏÙÐ/Ìh-³BIëYD�®æDM6»�þ} 90n²Ag±ˆØ{¿ ""ÐÄPSqwR¾vþé"JDDÄÙö% "Zà¯Kâ;%¹J·O4?å‚^Péhd[gA¶~Ô…\Ö¥æ#ÈÃ5¢÷QNÏ4º~¢ MŒÚkt|ò��0»Õ5R‹h½÷ B!M óôö­-é6 ßwank2B­FœÊs±°ŸE eJ¼ÈHãª^åµ�ŸÖÚ’+cˆ2²-èIÂ|Ä]”±ãŒÖ@×Ñw;©l i wh¡$¸¸éˆèD®öS]P hbÜ@* YÜs„)Ø/Ѩ�X¸ë½_�áhb¨(í˜Û§JT¿•„dm]`ÜãÒ RÓzïd8šj*ÃíN è#Ê”8Ù–ÀY@dR 3¥†“it'•ÁêT]s�$ƒ!Îȶ¾ˆÈ¤f(n…ÆSit'×å¾÷ú\Òï¡9Q—C ‘m œõÜ*Î|¥F#Ì£‘b÷úøšãÔòƒLÁ…4Æ-?L;†]?Í��&Æœ t«—mM�€&Ïõ0Ë8bº•˜HµK•Ì£q²L£«ó̵Ú}A¢œ¡i \”'ƒ0•q«3œJ£ETÇ"™k�ê>UKëvÔô1Ù–À™6йL[Ž@Œ2‘nŸ©|·¹Õ4‘�F¶%pp°üƯÑp2�$!ý©Žç××ý(¡÷y��hŒÛ˜$ "b7×€&Nôg*/½õ4›’�×Ô€XØ“Ä I�ýDÄfRȹd·¹ØžÑûÝeŠd8#ÛøÒF1©r(u/0´T7œÖ»®Ò†§WÅRÝpF¶%ð´G¥&2m‰ÒÉ4V$H‡Û\›eº»EÊ¥CÙ–À™6 ù”[•ÔyJÍ€èLõ«úE“…(Ì/˜ƒÂ´h\ÜøCtHP1»©®¨˜41nâ:Óþ˜Þ�Q7’¿H`Üj2"–;ïW´Cš*p�©>Oõ¸µr/’˜¶* 0îbFÔKˆÕí¼f�WçÖ7Þ@röñ €'�7Q¦'=²s~AÇœ‰�RâÞ0k~ý}¼ÔØrò?ÎÉnQF8#[˜ßSauÚŸeüUJEa€F¶%pÆšæ­|êo{,ð~ü¡Ð�,¡”áâv¤ˆp°6Ùù¾ iδ8‘Hlè‚~ nE¸¸ß‡Ø† hv3]P4gZԾȵ=‡¼=îö¹·B&¶ý3h‹“OÚ~"šÁ _çýŠŠ @C¥¬½aÖäû.â‡éš} »uOú}(·çšf7ÕY€&Æ�.–æÊ"VËt¨!’¦@#Û8ÓF1?hJq/� jDªžçÏ�²R#dCÑ9NJÈŠÜÙMtAîœiAgÚâgÞˆûÕ¸4m�F¶%p¦�â|¼¡¹W’{®-îs¹/‹Ú"�lKàŒ˜Dá íi8—–î§ÿvÑÊ4?Ÿn�Âî¤êc~¼kð €'ÝIàLÑû¹.èŒ41p¤Ûgxü‡Û‚%à m‘Ƹ“þ$â ™ÎØMtAfœi1;²³�îžËã>%à¿•á4k��ó š"àL‹3WW'�©Ò…÷qyE�F¶%pF<'‡0�iW)�KcCÀsªã­âôšœã®o Œ‹h<鋊ØÈ‚½oYMD˜‰a§X!·’ãkÉ`!¶à–ä` mIàIÇQ�TQì§ÒEÄ™6VÙ>ß’×:MŽú—�ÁÔ5J�qÿRD‡Xì½_Phb¨¹€·{)šÛ|l9Š€‡@#Û8ÓF1�ò'q¯p²TEܧš_S{»¨""ÐȶΘÜäf-~‘†“i¨çÕïÆ ^ç×÷,KpñŒpq1ŽTÔìgÒUMÄ™5*‰+æ¹}{ïÙ¾ƒÍ-TÀÚ %8‰½ÄJbïü‚’ˆ@#Í•»ê¥ëTÒ”;Ù–À¯ÃŒÊ]©ñd=C1qõ˜‘-æ½Ëzæ:ÏsêÕXME ‘m œ±êX!î«ÄÜ=„ ¼-PŒÛ‡B6@ fïý‚ô‰@CͤÏÝÇšÕœv¥HŸ4²-�3¢ÒõQrw�FÀ¸�‰ Iª|öSéÊ'âL {¤5~¶l»=ï÷yµX­qF¶%ð¥�bÆÐ®�à^¡©¶·îTßGßäi{4²-�3¦:9†9L I˜L#D(7nŽ·‡ûæ£/ÚªzÒàâÁâv©€�Øû¾ w"ÐÄ@1‡6â¼åâùí1®‡ ²s[”÷0Q¦OõÏ~¦ ú'M òxEøzuUa‚ö+4ÆýRœísý³Ÿë‚þ‰@Gé‘Å»B§¶Çýޝ‹ª�lKàLŤ¡]*ŽÀ@H諞ççë8±RÒÒw1…„DÃÞûµ�&†J„bÃlÌàþn˜¾w ©‚[–.ì]bÖ‘©Ÿý<ºú‰8ÓböôfÛ™üó|ÔDŽĥƒáÂ>&æ@¹îÙϤ랈3-ê\ß«N|c•¨ï!ÐȶΘ|¥fUîš�çÒ(Z®8®s½?Õr÷‹”jŽ4²-�3mó˜¶.Š{�!»¨Žç*â.Dþ´ÁG4ÆÍLÌAr5´Ÿë‚Š@'~±Q¡WùØàþ\<·6!qh«”ãÖ¦�…�DØ{¿ ƒ"ÐÄP3r÷QÔ¹¹ (S hd[gëJ1L§ü…N¦q³\ÿÛçš_÷ö QÿC ‘m œQûWaZãi8—Æ‘€m<ËUVÖð>–•z›�G´€`ÜÜĤ$W$û¹.H’41pâf{øð~` Ù …[¥0nv é ɉ½÷ :$M Õ½j{î§ã/Ôk…Œ¦“áâV+fG¹ÙMuA€œiQë)�—{©*÷9!›ù-Ð7:…̈DÁÎùp¦Å™©{«‹í²ú‘ž ê�lKà,à;)†‰L»Héd+ÊD¾}¦bhk¤ˆ|3²-�+m“¿&™{�×y”í|ëWjm6Ôè„$¦”ãF'fDD,ªçÂææZ��0øˆÎqq§“�±ÛM£K±3-`Jßdͯöy+îp¼ìgŒ[œ8ÉgZl?“¬Å"ÌÄ Qú܄ۑÓË/ªkqÂ]ãI�MˆµÉÞûý�&†š*�Õ‰oj•FÙ–ÀY@)R ‘w¡ÆsIÄ×â¶Ï²mù}�Ú<ôA–n±$8‰)ÄJcïü‚Òˆ@#Íu½Ý‹kau=Ù–À‘œÁìÅ_§áTJ…ÆuªÇ»ZÚö§�3²-äJÃd¥-Hî:e=}¢¬.KÊû­qß#9ÐGr [„(›æjg?‘®v"δ Smñ¾=¹å m¢¶@#Û8‹e{¼îñôמƒÉ§]°¨¥À ÈÅâ\7×U€&C1?¾Gc,u íÖ¼&GnR`Ü1„Î$™±›ëŠÌ@Gj1•F¹�!ìŸzæ–!ä 5¢÷ 14Çn®+¢#M |¬ómºç E¡€F¶%p¦�bÞà®Rê^ !¹–6ý=¿•6´ލ¥ÐȶΓb˜É´EJ'ÓhºX Ûæz•·yîðS•5Ù–ÀSžÂlÆ-Òx.�Q²_·Ë’³*uao�qq#3‚\|ô3]Ñ{œiASÙkƒxŒ»ˆ€U¸õàNšˆ"†Â*œw~Ehìq¦ÅI\ãV ú}Û8hcQJ�' J#aq®ó~EÕ ‰¡æZuRxÃÇ”*h=Îд®º“A˜Æø«4šJ£D© w«á=?‡2, z4²-�³€ë¤&1n‰Æ“iŒˆ½[}8Ê=tÇ�DÀdZH ð¤“(¢E¬¸uÞ¯¨Š41TêgºÕçì~ïM ú™€Ê¸uOú™ˆ 5Æn– #àLŒ8×ôn¥3ìå^£*jz€3²-�/mÓ¨v…÷'T´:—ïU4Ù–À³›B¼Å¯Ñp*‰½aml½ñž®T…<â\T ‘m œi£ˆº´UQ¼ç4t½Ýí}ö>}†.˜”ÆYœ´åÕÁŸë+š¢G™!š:¾“–x¹K©§*~%¸“&%¤=¹ºÙÍtAÝœ‰Qç’â{.¤g#+m…4I�F¶%p†$+G0{ÚR¦Ò¨X**Ö©ºç)5Q�F¶%pÆ+Ç0oq‹4žL#A¹ ·Îõ|W®ðÜWIôgd[ØWGnÒÑL[Úêd³H ¹Mõ»UÃ?·]¯�Î9,n"ú3T:»9t¡`&E‹äfELŸž£p×°–¶0 ð¤k‰(P¦0ö3]PhbØPnÛ!¥úõxyˆ'7ÀZü €' I"¹°÷~AgD ‰¡&Zãû[~˜«åæ¶AlDœ‘ma_œÕSçëz‘ò©¤Ôß8OΖš÷�[rW&kÏ÷åpæOåÆuª×þ�Ýôm•EnD ‘m œi£8A·eÜ+Ù>÷™ŠØ-J¦/Îд®j4ß©û�!ÇŸ4ߟîEãÂTh[_‚¶XgZ-·£)FÓhd[gÌrr ó·FãÉ42äÒùêtûÅm¯¹Z(Qÿ‚9u‹e ‹[†‚œÏò`çû‚¬8ÓÂìÓwøjX´ìÖc€‹û•8ÅçŠb7ÕAp¦E�jw«�ÛT-�ã~R´;Ù–À™6ŠYB»J‚{…rtdbw;×:·®Ui‚�gŒ{…˜s¤‚f?•.h"ÎİSqúùNRgd[_Š~·{qŸ0õ;Ù–À™6ŠÙJýåHîê“ fûTóš oO¿,‰`†8#ÛøB‚“#ˆºøÎ$Ñ \.«?ú5ã~K÷ç¹ �F¶%pF'‡0yik”Î¥1!*.mž·gÓ^wçÙw,Aºv�peˆõµÞù �&Fй¼övví;Ô°Yº­J‚‹û•(ãçzb?Õ=�&ÆMé`ÕËfi�_h�lKàLÅôÅ]©Ì½Â…Rɬ¼´÷USuëu“$3ÄÙöÅ#…0u¨+”O%±â¤‚í3ù*—¤ž!Îȶ°/i“¿$cçB†Sß~ùr;ææ ¤.- 71JŠý4ª¤ˆ(Fž³cæçû�1°Q Œ_œs\بÄd(•û‰t™q¦�<§B6ºò˜Äw*!�q 4Æ�J̆2U¯Ÿé‚ª‡@Ã&š³.çþÔ\ëÿ¢!$m� Fabñ¯÷~AÈC ‰¡u³ê ë Ò„3Ù–À³œÃôÅ]¥ñd"5o{¨æå_ÛI­JH_jH)0îB ¹ªm½s]SDœ‰�ÇÙ!sýÀ’ƒ¸¶ d/~QÀ¸Q‰©P./ös]�hbàHtŠd2×ZÔíøQB¯R˜¶J 0îBb>” ŒýTFšw®¦í^æ×ã8üir�lKàŒò{áÌí/Ûp.�@:}ý•=êõ:îjÚÁ4ÙâãâžN¹©âØÍtApœiAƒÜÈ‚Ýæc{ÔïÖ Y™Ð8CÓ¸’q¾þ] Ô¹�ûSmo�i*r%ÙÏ+ÚâŒlKà«§Ûð�-LÇ…V!ämu`Ü+Äd$×õú¹.èz41ð‘®·/p±Üž.˜D×C˜‘maWÒ æ îeÎs ’èzïg9ú®M×Cœ‘m |Ì"Å0e¨ “iüÓ8‰cïíó›å6û5ÊT5Ù–À™6ŠIB[ŽÀ8ioŸ¨0„ÏQ T¤=Ù–ÀYÀmR “¿DÃÉ4D•&R£Ö¹î[z´w¥Š2�lKàŒÓw ¡ÄÜÖ(�JJò™ŠµO4?îM6×T,ÄÙöäò ÂYÚ¯Ïh*)áSòÜün9ðáÜú6LŠ.ž.îÒá›jjÝL$5À™´Ïä�Bé·ÇÂÞG5¼o�Á$]CÉpaƒ çû\ÛëgÒµ=Ä™u.«íN|ÓŽ$«!Îȶ°/¢€I„¿^£‰$>‚i}]Èw-»ìõ;îØÁ|ÝâI€q/'ª~‘JÖÏuA^C ‰�÷IþQqq¹šºe0{·%J€q» S�\^ë纠¯!ÐÄÀ©ðD2ÕîÅž4} �F¶%p¦(\ÍËïK¿¢Â…@#Û8ÓF1«ñ¿žÌ½@‘rmk�ë6W"ñLÜB ‘m œÿIÌlÚ¥Si4)×·ê\[î~?gEßB ‘m œ1çH!Ä&Ü�§’˜I.o½·²´DL”·hd[gÚ(&5ͽÀJrA©ÎµR‰W{]Œ((!ÐȶÎèUH9„É�[¤ñ\SÊ%®÷ö9{÷BLQᜡi \Iƒ˜>´5œ T„’úæØ§fêáÁdíàâNü©àÖÍtAoœiAÃØ?aÿSz¸‡©C[ ÷ç„<„ä¦Þû} �&†ÚwÍ4Ä}þ{µhhœAöÒ­Ê90î�a*Dü¢z.4áåå߬‚ÄÁ‡4ÆÝ*ÌBRy­Ÿê‚¼†@ãÎäµÍÅJÞGÖÒä5ÀÙ–ÀWÀwR wÍÆ“i¬ˆøÅD�»Qç ‡R Œ;W˜…`Ù�´³‰ïÓ4·)xxPˆš¨ÆTžAYÃÃ5-@; rˆ¶D 0n§aB2Vݺi®¨n41f_c¥hªOwM·ãÑQb ‘m œ¤'Å�qWk<—D�™i*Ò‡o`Qe&Ù–À“ŽBt¢-Q:•DM°>ÆÂQ�©|,®SSRÁ©Çš–À•4ˆ™„_‘ĹÀJ…©~0¾dÉÖ8,*L4²-�3Nï)„óv[£t.�@zßü®yúù7~¡[·‹g€‹»Uˆ`ÞÚ|{Ðëöú¹íºU¦àÙø7¢DÉ�…³Î÷Á p¦Å)(\ÕÉ|?Rƒ¤oy”õ†%p³Gâ6¼ñøc9çu9O¦³ m <):Û6Ïš™§òÞ :àŒlKà«gép¦ nmÆóhœÃ³‰[}(gòù;f€&´hàI;LÄ9Xýê¼_ûhb¨©˜U}ø6QÍ ‘m œ”&Å0Wñj8™F|�BÜÊ/ìUÞÊØ’ wÎôä ”àNZb¢ÁšWçüŠÊ@#%Q1sIyo�ñ­3@ü² €'­3Ä52•¯›èŠÊ@£&ýŠ í =ÛcK÷C*V”#Àš–À•4ˆóñ�ä\Éí™NT'*ùx~ûÉd"Àš–À“ˆüÀ­Íp�h¤âÐ:Í{Ëoóq²”Ä!ÄÙöÅL"…0Gh«“M%Ñ *&‘ÜSgêžÅÒt"Ù–À™6г[•̽’åSe¨~pËÌÓÓ/K¦ !Ðȶθ_'Ç0Yh‹”N¦1ªÛ ä³OUÞ<¸�F“Šgd[_Ú(NÍ~U÷JžïÒåêöö¨YïѼb ¤ÁÎwÒB)5UϺ™tñ `¦ÅœkU»_µÑ´*Ù–À³‰×·¼ôøå>•ÊÝ0ÀêKqq› qŽL·ê'º [!ÐĨsÝj÷RˆÃ|ŒŠn…@#Û8C¾“#ˆÉøK6œIbE¹JT§ZSñ§|Vç‚J„@#Û8#â“C˜Ò¸5Ï¥ñ#¤«ç'<¥ÖËS’80CÓx’1�©WGq®�¡T Úg*ɹquM B ‘m œ1­È1Ìü 'ÓÈG¦N­3½ÊSÒÏ×q Õä)Ù–À‹ÃŒ¡­Q:™F?RͬNÕ="¦‰f4²-�3m§g·,™{%×�åª}ž")ͺ\…(#ÛxJÔ¡ÕÁ}®,áÕ"QÄ!Àš–À“›¤¥]¨l*� µª:Ë«¼|ðîÖ&•ªghZWÒ ¦'n5ç ÕÉU¡WÿA)QêPÖ–À ñ‡d<Ó‚}]’Y4‚Üáµ+ìõô^Ì8ÁÉ9&ìW ¨ Fί®‡u ¢²ðzÿ}Jê\óÙtˆyÐÉ‚, ®B Œ;Y˜Rä²X?×Y �ö¬½ËîíÎî<4?O±‡0`³.Y·)>Bè¯$Fðø$Ýé¤]åŽ+_ýF{ËŸ”Û«“øRvÑpŸ,TÄóßóî- øO�t{t4’Å)1YØ]Z–𶇠n®í’t¥g$›]”*äÎÚ¥ki EÚ™Ú–Z"ð ;S2’ͨˆ†äxNú�¯"äyKª®R’�ç£Û”´'…@#Ù(s L~8¥&ÝΜ/#¥9]°è¼oO9í› c%� 4SÎañP %D Q·Ë­t¡K8ÓŒÎ;R›’518.¥#…@#Ù(ñ›™JºN×rd¬^¯õÉ�W÷�0ž-q�º“¢„4’Í�2í(ŽÑý™ÊÔ ?ï=-k½¿º±­÷0CÑÌš0±H猡íM²Š”{uí›m™Ž<’º>3Í�&¥Ã²(y®1fºýí›iƒp†¢9PEÁ<p”ng*[H‹øys¥.µÄ ÷͵æ �ds Œƒg á¨ØíÑùZZˆEgªO:�1ñ¼ÅfQŒç%ÂK]¯ýB»�&šŠ¡jªOÉ,çùí ýÌÆ n[΀ñÌ´´Óâ—Ò;-ˆ3Ñìž8Á~ÅÊ¢nÌ´[]ês ÎH6º´£8$W4õB|ÇGUÜ}Ÿ‡G$ ö�àâ‰(´ú~‰×¬vYe¢�*Û§¦Žh@l»q §/¢xê{"^¯ØæA�i¦í–MÇoúìÝl­Ý‚@#Ù( 2‡C9AvN×’ò‹¬Ù²üï±¾—kšÖÏÇ]h¶ ÐH6Ê‚ä!ÅpVж(]LK10TÅ¥âZFýd†¿Î¢3 „ã6‘×~¡çƒ@MM-›’ßãö×5¡²V à Es J:hßÊß„�/hÊi>u%í•úí‹%þ?öÐ,µWg$›YW�¶dNHªAùRRnsÖî©kA£_•vÂŒd3«’ℨۋLyž[átÈ¢w}úe�ýíüÓ‡`&ÐŒ9 YHÞÕqK¨M™`êÿò¯ÿç_�òDÔR#½×g�Ö£Þ¿Rcn‚ÿì‚×ãs¯w\Ã’ÿë_ÿÛŸÿ{Ñv/IПíŸÿ}þó?ýû_ÿãÿú^2éçßéóž¾þýn·ëýÏbÏßÅ ò@ÇïÏ¿çýwÿßÿïÿ¶¿ù½ßåø¿Ÿçw©Sþ‡öŸÿÿúïîë¡ÿó¿—ß°þŠçí;•Q¿×²!õÙ¡÷R®#›ä?»äõ|¿Ö¨ùŸuHêïÀLî±=$uÐú~jÓ¤å US§?ÿïòkÿ[®CHØ”œ_EíÀ!Ê{óvÓ¢âùùÓ°ˆí&Éæ@§�)„óÉv‡§kiÉ)5ÀÚ—·ß�faÁ´ ™”µädÐ¥rÚ¯´áh¢©ÔvÚ>¸½`¶ï˜òÜ d'ý¶œàâÑ•(Óá–S~¥õ@-š_EË"¹­äÄ•æ�ds ÌgVéáœ3u'é|-£Æ×}öèåz0ÇÀæ*Õ¢ Œ„iw¯œî ]/À™f§ÐõªJÖLáöì J»^4’Í�2ÊnR¥.ý9:]IJƒ(jÞë“H?ßóèÆF06{NañÐHZ¹kÕé¾Òìr0“Œô­¥rxyifcq·'¸xf%ŒëÔ¦êu_èny˜iVBç¶IçÉy|{µ&j&n;9åºH€3ÑPŠB³8æïõyàÂK·+gÀÁÀŪ¼‹ä–ºÒE ‰vS$Z2Ox¢†G0À÷MJ€Z˜Q[n©+�-šhwÞSªJÖ˜ó¸ÖS ‘l”Ñ2ÅpìOÛébZLíùîÌÜÖG Šäùì7(méÐH6Ê‚`™b0 µíI—R"ZÞaª uo;L€3’ͬ+É ˜úí9[I qyÃéVøŽ¾ç£uœg$›Y—Ôd©JÖ 5ýšAJ“pF²™uIqœlgHPž‡\¡«r«Â<_GSPjªxœ¡hTq$Í!»í9]I‹¶´¦ßÚÆr�¼ð D£bP BD¡�z0^û…>M4[<Ø(Ùtü–2ð~¥Á‚8#ÙèRšUË£§¿¯{gQÚÕ@ ‘l”Qr‘C8k讜óµ´¤‹ä‹Òi�lÇÙ‚ÑÍš8˜ýˆâ=uM¼ö íšhjÚpY”Ü× ÷™v#õ\g$›]”PäNÚyJ×ÒòŽ´×°-µ¾¢í·3¡ØnP€F²9PF4úô]%sј§7 >×=J�ƒé�(Ø%ïµ_àòh¢©Ê+f ÉÏý5Z<³áƒt·-g¸ÁÈü¼¹°,õ®¼ûoß"¥·8CѨâXž!8<¶ýÉVÒBmÞd¨K­áñhø =€ŠfÖD!=p¬î6çl)êŸÒúe�¢[²£±ú€3Í�*N-R§ ÇΜ/¥¥y“aYê¹=Œò{w;”vh$›e>³HçhÝö']G ý¿¿­´ëí]Ñ¿�8#Ù̺8ÇH!œ=ôt¶””ˆdý†e�Û£ nn{Îû 3’Í�ªŒðß4ôq‰ðGœ‘ltñÔ@Žá€ÝÎVº˜ý³Àr䧸ÓÏ:ð{¡€@#Ù(㸕c($Õ-Ö’Â[ÞX–šÊ‹Š~{·^ë ÐH6Ê\˧ÐÔ¶']F sy/ .U·hï}Óz4’Í�2í(Gݶdê•ØæãD½áÏùÛ§¨1� ”ãÆ4‡“œý÷k]`ÿh¢á9ß¾ié>7#ñí3’E|{~ ¢þ$�ªÎ#š‹Uux¾ÿ’µ†1 US2\Ø怖sý~%�ìGœiV½Nu}d‰AßKä6�d1½ícgŽà ØNYº”a3~»®´¸óÏžïHü6âŒd~BgŽá˜ØmÑùbZ€Å2½|©Ö=ö@}b CÍ¢÷‰Ã˜Fœ¸×~�÷G ‰¦¦|ò¦ä÷{¯_¼À'#ÐHóÉ®r Ç¡þL�.¦µ¾]âü¯Ö…íýNÔ¬Æ T­I�q³:ŒhÄA{íxvšh*†‰ ó{öWŠP�@¿/'À¸IÍÑ$%¹ýRHnšhwJ)OåI€¾/¬1Ê€3Å|2FÒ²�²l)-ÚBØZôNk·é9­o È_HÍžs\Ø%æØ–SÝ~%�êFœiVgÔrUQ>)¶1¹µŒ8#Ù µ|Bæn:VÆõÓ›“�¹3 É\¹^ë–ôlÛɽY IíêI€qo–ã[Êéú¥tNq&šíãÖýQëÔç~z¡+б Ûž3 ‘bÒ×k¿Àâ"ÐDS1HLë+3Н»öaךEï_-J�qo–CINäúµ.0¹4Ñðœ®\´¼¦?}R¤+h$Ó•½E)„‚d;méRRÀEW8­œÏâÔîí$j²�—kæœÃÂ&ùËœ:õ éÔ)âL3š®ÛŸ\ØmcwyÊ›úEtÞq¦Œ¼)3�KÞðÛFŠwš[a,g(ó•ÎÿTÈï{ß³êl¡c©¥À¸µÅ^*£PýJ(Tšh6ò•Ìû­¹^y­na†.†4’��†owÚÊÜìñöunr¡óm§-Æ].öä �éº@d"ÐD«É-nß1\ÜÛ´“2ÐäB‡×¶(ÆM.öžsèWºÀ"ÐD³s¦nÚ¾ ·ø™Ï½™¤0u4’ÅL]ï¬ÓÃÙ ·3–®£ùô”7¬K•1Ög¿?)oˆ@#YÌæÙôø» ¾ß½Oªñc€3Åìxë À^¸Z“/¤yôS²®®²¾,cU¹:ÀŠb¦Î;ÄG­«o�(,ötmg`ÜIa·™“v~­ ¤M4â£Îpu~�z;èéÚ%À¸·Ãn3%ÉüR:I†8ÍNI²ªdñ¼¯6ï(²d4’�x2ˆ)†ƒAwÖÎÓ" ùÄûßßšœü^ÝÆB¼]µ(ÅÅm òœ9;åVºÂNÐD³ÏÉ ö‘©ö• ò8CQÌå$LÕ±ú—íè* @#Ù˜„qž1ŰËkPº˜æ?sÆãþ÷ùþãØz�ñœ‘lÈx¼ý-va—×v([Jòžèïubi9`Ú¯; ëÑá5{`ÌÖ³÷Ì9¡{:;øq�ò0CÑ�úù+úq8‘Û·OËÒ…@4šØÞÖ¤©xµÛ®©qðsÕœ8àÆÉi •[ë G@ G·X.þâÝn¿ þ®mRÁä<nÈ­u… ‰†£[\Bí_90ÓàïÚ�ãÄ4ùN�‡é—ºBÃxœiVƒª/NwÞ„©`ï_Š99n@£¯ÊI¿Ô�&Ú�·~Å,wðQt3% ÷t·IgÀ'Lâ”óðË\à<h¢ÍxÛ/˜÷£Þ½·! ÷sÛ 8``É9$$ƒ_H'g¢Ñx×/˜ç³Þ½¯½²D¶ÓßÏmƒÜ€ìDß�P ~� TM4:«ë·é�#:µº�F²q]ÿõ×t‚aÓNYº˜æ­º›þù]wk¹?ë{‰bÚïæjM ŒiWv yUï׺PÕ#ÐDÃóªþY_ÈúÛÞü¯•ôd^0,æ»+çôhö)í<�.!ù¦¼J]–¹ê |ßk0¥JE ‘l\¥ö;“Ø¡´ÝIWÒ¼S^¥®_Iùþqü�V¦"ÐHªÞæöqu�„¥4‡‰wzռܰÓ>a@”"ÞÂ�IgÀ˜Rd�ó~© Å<M´;­Ÿ%¯5GYŠÜö€®T@#ÎHöKè¦ä·?÷.–Ð4’�KèÞ=çð½í"JW¼xZ­TW×¹Þ•ŸÝ3j•*àŒdq¥Jn(Ű© ‹iÎ*­oµ­öùí<¢X"ÐH6.�J1äaÚ¥kIÞŠÑbß«ú“÷{DN�‡i%À9Eî*«]ÝBWjWšh5Ýôëeîï^b§àvn;tŽ‹Ù)ò i-íÖ¹PKÎ4›{TŽ^|É´¶òcn œK·3'¸˜›"?uZE?~ë‰G™;©U4�dã*ú¸jâûZ¿ 6àÉÀ«ƒrà€*#•W¬~­ +M4<¯X-Ó·ÞÇÛËtÅ’�F²qÑÚŸµÀ~¥�µt%ÍIùÛ}ýRã¯Þ¶�½ìFª näfPpUäòªÕ¯u¡lE ‰†w7þc¹oÝíËTÞÐu2\ÌT±sÈKV·Ô…Šp¦Y�Ö«‹Ž÷zWþíÁ,±^E ‘l\¯ö~(ǰƒiç,]LóVè‡ÍÏ2ˆúú; ˜*ô/Í¢s\ÌT±¯Ê h·�^?Ì4“ÓÒpÑq{Ö;ù¹_BJiˆ@#Ù¸4|ûK(Á°si',]LóTiµºxÐÏô§Ÿ/ÓŠUÀŠÆ¥jï†Rù—º?ùJ’«/ÔÔþö/¤2E…îÅÙ3Æûª¼\õk](Wh¢ápÓ׆ôrûÞÛ Hˆ¤‚û¹mÑ9,ä¨È3䥪_H/UgšÑy©Zs”Å¿¼Ú¦Uª€3�ëÔ·»¤ÏìíÚéÊVÒß÷úÕë2æ¤Ð¥TsR`LJ±ʪf¿Ò…ª�&š}V¢.øi�½5¥•¨ˆ3’�KÔó¬iYn`_3'õà EãêË]=çö&íâÉÒÜ‘�ds Œ+¿¢¸¸’éÞ)îØ0t.�A'8ɽÅåª×­×žˆ3ÍμÚkJ~ßu\èBµ‡@#Ù¸Úëý` açÎÒÙZš·D?ø¬ ÃÏmoÄ9¡‡k%À˜tbw™ ~­ (M4<©ü�¿¯ÕYÔ7«‰•‚ŒdÃʯ·$C°Ç­Æä+IÎ;/Dø½X‡ÎP4®B{/˜!ع´íÉVÒù í¥·×Þ# �KgÑ0&ÁØSÑýu¯ÝºÏgg:‰s§š”cΉï¬u ](Gg¢ÑYõw¯íºú‰L¹ú”‘lPý9Çs`¯ÒNÔù2‚s¢ý^¿‡^w/&xàn¶$¸˜ß!w�Æn¡+…1M´Z¨B OîX'±  ‘,.DᾺÕoFŸ;¯H¤Ü1Õž “Ntó U©[éBU 8Ó¬ö÷ù­|$ùõéÎ0rNp ·Ý9Ç 8'rBØ/u¥ô8Ó¬*®[íÿԾꕊ €F²¸â‚{>EðÍÜNYº”æÎKÀ²Ì"ùµg¿Ô€F²¸TŽjŽã}ûL}�®©w²9PÆnðþ«ßÚ^¼ÙQI#þ­˜”l9Ë´4öK]¨�h¢ÝiØ”ün+Ss¡D ‘l\öÎ9ǰÛu§íl1͇§¥é²TùÎô»¼ôBiŠ@#Ù¸4�üµ�`Èù¶=J×’9úèEqù^r}B|ÀÓ�óm%ÀQGž<-PýR*Tšh÷þ�¹û¾Iå›Àë#ú"©¹àc“Ü6)Ébž•©u¥ãÓ¼è{Fe*âŒd#>-?н]·)™zÅu‚S\ßY»fHÇa˜®CoW-J�1]Ç®3¯ÞýZªwšhx^½/Z¦â6~û¯Uï4’�«÷Þ)¦vÀí¼¥kiÞ|Т¸|�·¾s/-ë'T»ïW‹Å �dãb°»ŽS9Ývå¤+I<¯—¥ÊwU_ïö°©V "ÎH6¬ûí9?ž]\ÛžlÉ[z?xÕ/”Ö‘ú˜8DWÍI�1qÈÞ2¯“ýZêdšhx^•.ZÊG:_÷�€ÖªRÉF,c~û¹vªõŠÓ$wøª_o]¼ÚÍ×i[‡~®3é ³uì4¡ZçŠ×/u¡TF ‰v§¥rSòý¶fœX*#ÐH6.•]ÈH1 Üi;[L ,i]º,U>èúÞƒ˜X—"ÐH6®K'm'Žm“ÒÅ´à’–ÊõÃÅs­ïv»P)ÎP4®“�£Î 쀫=ùRš3¿m÷þ}·§| åÓ’'ï}ÿxßfÏ9ÎH{ò¼j/K-‚g{]®XµÎPWíè3û¼cÎWÒü'ÞôåÐåø¶ë€Ø1¼™›=縘cÇ�ñn%½†˜i6ãÝþ¬-Îú™°˜…‚û¸Z“âbŠ|BÎ(ø¥.0 4ÑnºÁ¶w_Tg“Rpë´=Jp1)݆T|{åªvšhéÆƒ¥û³~àr¹´~{ÒÝ×凔Ï;§õ*dÏ)”§ýRWªS�3Íj¡¬oãX§>— A�3�ËÀØìxöuÕ˜|Ío‚G¼×o”ÖWÄdººfOŒÉ:ö›yYê–ºP–ÎD³Ó²ô^¦GWæ(e)àŒdC‚1=Š�[;KŠzÁS’¼×þîí³~Md@ÔyïÖYt†ðtè)ÓâØ-t¡8œ‰F“Ü0Ç;,ÞÐû7·AcÜ€6D_™Vë·ú‰Ò÷}�ìZµ8#Ù¸Zwn9Å�í kIΛÏ­~x³¾>æçÀ¥4ƒÎq1?GÞ)'ÜBÀ™fô­¥ª÷~Þ·õ½ ;äpqÿ \\·?'8CQì-ñŽ¿mý|t°sp/7sÎq1;GnA 3ÜJÈ À™fµÀ#Üêç¦?¯¿{q*ñg(Šyá v7/’_�ÕëNQ¦ÜÉæ@—R¯ß~냨å[ÄmîQ*Øg$–ì�Lìn‹=ÂJ’ç΄e¥òMÔúÅñ �dc¡³(‡°k[”®¥9K¼ÑÍë¶VxÀÂÜ,:Ç ÃÈPñï”_ gš�ePߌ²x‹ûß}›‘!ôî£nF„�'¢ Þé¾@YÎ43“j¼>˜R>—òè­ÉªqÄÉÆÕxïòr ;³v†ÒÅ4ψ^¦öÚ—›î»’S1/ˆî£™”c^�}ÑyMî×ÑkrÄ™h³¯ÉkM±Ü¤Ïõƒ1K ·mÛ�'¹Ž¸LöÊ/Ð4ÑRä+fÉ?ë‘17p·+g8ɉ0-@¥µ_éBMŽ@ÍÎkòåŸòõûÞ‘jrÄɆ5ùy Ü”ï·Ôj`ÄɆ5pçw2{Ýz å I<¯€ëx­7Þ¾ªUÀˆ3’ +à~wÎ�gÿÖv'[Gr•à?õ;¬õ‡1 ˆ®¥™“5§ð~­ M4|Ðí]?ƒ¼~ægÄM¢s©›”cÚ‘=UNøµ.°4Ñð”'¨JÇUþ½@ ÐH6¦ zG�cØwçí|1ÍŸ#Y°¾Õf�.‹ÿša5Ý´¼oëW[;‹œ‘lf]![àuëlâL´3-Î%å=û×rÄâp†¢qq>ù«æÂq �¢l)-¦¤¥ù²Ò­Lb¿ÚwEÄÒ�F²qiÞ»èþ·íQº˜æÈS¶àöªŸ®­ùœÎ ÎH³àsû¹j�°–æ4{öàU?¶ú~ï Bä(ñnnÆœã$‡Vø^µÌ_ Ì4+ór½*éÞM*Vë€3�kõ§»ZÎäܺÓsº�ä'sæ`Y©|�vº¯{�9@ ‘lÌô¥önm‹Òµ4WIgª_£-d!7ˆ®¤”ÀBj��RÆe¸et*`&œs‹ŽòÝÕ×c�ÊÔ9ÄÉF„bv{’vvå¹SÊ*âÛöò˜Ï}½ð.”Ä4’�‹â§¿z ¹¶¶AéZ’›LŠâÛ³~†öøp´X#ÐH6®‹�L1ìܪIÂbš§„{üY‘õå1Wwo3ç3…‘# ÊÙé¾@Î43Óª|ÑQZ•Ïß:kt¡*G ‘lȦG±k§EQ/xļê­k•²ôÖ—˜iÕ‹@#Ù¨ê­TÅfX»|ï¥�üZŸè jÓæ[Þ÷Û­*Oq†¢9P¥Tâ~%½GœiV{¸½f9­ÏÏ€£DÏÖmÏ0&)ÙM¦u°_J¯ƒg¢ÙyÕ¹>î_Æ®¿�)«NÉÆUggPŠ WWíV’Ü&²‚uvù}[_ë¼—bÀ ¢¯k%À˜dÇ™–Áu©âeö´]©‚g(Šk`rŽ„�^·A§Ki”ÜУ6º×7µïš�ŽCÓ,J€1ÇÞê”'ðË\ h¢Íä†îµ�{¼w–èAt0Õ¢ Òƒì«ÒJÝ­£Wê3Ídò‰%æ.®mÚó&"ÑÙµíI€19Èž3¯ÔÝRW*ušh7ú {ýoíóÄÜ x—¶E .æÉSåÌ�[éu8­îïø{ý ìzÍÝÄÞÊmw`Lͱ_ ú€kp·Ö•â€&.TË÷úùâ÷s}騅jpF²aµì�â9‚LwÒNW’|•P,ßJ'zI Þ×je�3�+åÞœ Á¾¥š“¯¤ù©¬r¿Õ/óÖgÎôÊ`F²°r'÷“Aر´ÝÉ–’|Öñ\ ßþ>ÊK$ÚÙKhɆ¤bz;“¶)ŠzÁ3Eóí÷«ŸßýÝwî Ûí¢}¯—åþšg$›YWXÉ‚r½p' ‰–‚·Y1僻˞߇l¡÷#mWÜ€,DŸt^ºÃ:zéN@�vîfE”�ï®ïÝË4àéÀ“´í9ÇÅ<]ä”°ÀÝraL8Óì„Âx…”ïo¯ï.r…à<Úž$À y",²A»^�ÐDS³rxS²Šýr9L8#Ù?,‡o¿ïJ,’w{;‘VÐH6 ؗիEQ/9ÆÞÃljû·ÈG®£³ç rq�J«rXK/Ë h¢áË=¾e}m“ÖÏ–ËÿãJÕUR¿_Ù<Ççù:®eh$›eBqÞÖúÕïóéÅ9�dãâüÓ_H ‚=n¿G§Kiî;«Ío¿Oýðk$RJs„ŠÂÂü¬®ð¥(|î4“T#ÎP4 ÇòƒØ¥Õs#(—ÜcVc®+•O¿Þ;3)™4’�ËÌÎëv'm�ÒÅ4ß„^çS>CüyÞÖï”vÅà*9,êÌaQ4’Í�²´öm+­ïmýíÕ]^ûÎH6®};/(`ؽõ[tº˜æ+ù¤­_FþL·•9ìŠÔM²Y´~¢ý3=ú"Éæ@™P“·µ~÷Åð×…¢œ€F2­,ÇÂöö{×O8/7ÃãJEL@#Ù "öÄ €!ï[O›°–äÉ¥}]n*�Þ÷üä�pF²°Dßžj�µíÔ9¬¹Ä÷:*ù�º�ʖѨ⮨}}ÚîWóYÒ„FÀ:[F CÑ訃u™ò…àãm¬u@8#Ù�:èíÉì‡Ûæd+I.�OÔªöóüüݵ®îeLÍšÎzk†0CÑhJiŒÛïU¿V\ßÊ¢ó4’ÅLxiÃî·š$,¦ùò”ÙØÖ*ïøxìîG`6h$‹™ 8G„n“Î×Ò ° \—¯k•¯L[!&ô4’ ™Îô(m_õB‹â%ˆ.öDì*x=ú úLßî*É`F²™Uõ Ñ뵫þÝ>P§Ñ„3’ ÙÝô(ößm;õB0H‹u­ò•êý"cA@#™ÆXTÈçùÜR|¢À[µJPF²Øï!ïªu„€&Ú Îm{5ÑþÁ/&i½ãªÖ¤¨�¡E˜r%°�ΕÐD«ñr)ï=+ÔÅ/&3À›”àŒd3ëêÈ‹žOqÊuº†€&Zš2«–Gy¹çëïK'"f(ÊÉ1ìEÛIÉUçþXbn¿ÇÚ¦~¯¼Ê÷}�r  ‘,&”£š‡x¯/ñ}Fhê�l”ñíS/Þç¾}ä‡8 öc�Eg@Í›$RcR@µÈ¿ÊD#3£)9Þ„,24’ý#ÎcÕñþU·áJúsÎa†¢˜ób·Õ®A¹àS–£-õ«�Éê,�d',Gçn·w2íoHa.=iÛ¢RÑ¡WFr”ë¬M´4dŸÛ,Ágïµ!ûLþ´mM éçÀ9ÙÂt…[ë Ï@ Ç;ü^{÷�ßöçÞ·;tø¶jÎ9Jp¬áRWYßuñ¹F¸ÐH.¼7¯guc¿oid9¶¶9ç0CÑÈE_áôª$€L3ê  *þW_+ €2’‰DÃ}%%§±ûv$uÉ‹´ÓrŽÓ\ÙVI!eÑ+¿Buxœiv¦DGQ±s“Èsx”¡(d9òcÚ¾>¯ûß·?‰æ^4³"ϱ0Oq[½`÷µi™à ‘,&8ÈÛ§vãÕ$a1-&à•R—¶à}W¼:ÏÏRä>¶³å|»³è h$›eâV>µ¾º­ß[gYe$‹Y–óCØe¶ Hgž7%Wê¿úaO™\”‘, WnÕ”ãB}®æ~œ]ç©þÞªmJ‚“¼¥B¬”•vêcRy3�X•äò•Ýn$šS§Kt ñ·ú‰ùõ5i—ø ÀÉŒ†shÉáì<ÛÖ¤ëhžx»Rvnåû+sÿ,÷ÃûÛi^$¯íåà¼6“r ‘l”­n+=J–ÒYõ^ŸS¾C6¤Ý£ïûãÞ1>9ÐH6ÊDQ9~½ M4>å€%¯êæÏΠ”œ¡hD¥q ig*W®­EÕ£8…çßLjÃõެYp0¸�ODºÄ©ÖY€I¿M 4¾ßµ_SÞôòû\ 4g$ ôÀ)„}k=?ùR’›Ö¸�eµw™qxv©¥Âm ÐH6"žó£ØO´�Ô+N'e3êRÅQ\â3g(ѾéA䩺ItkNï[¾z¾Þ”ßoÌÙÂmÚ 8‡)~"&¼j�5Aœôë˜/X å³ë‹Çm´7±“è)Ú–$À˜�ŒÜõ^¹NZ ÎDCùFñåwÕQJëïï�\µ#ÌHÖíÂAmÁÔÕ?’r'šU\«/þð³}÷¹õ¯ˆ™EOY J�13¹]®û½ö „M45% –C§í±‹g4Â�F²˜0 Œ?Å�÷n'*]KаEë"ŠWþ®Ï±ÇD-º²fPÔüiLjxíx šhª§¾ïõþ\Šþç^¢ EŠ®¬nJ†“¼éQÄ÷ä„×­“ˆ3ÍN¼N ¢øÎ_OƒtD)zÓnGNp! 9f"(¼j™×@˜iVž ~uMû‹uTp†¢Ÿ›Ä.´��\¹âŽÉ­­Š�v° ì>k† #ÙÐrh¾À ô Ì‹˜“÷ú6ß÷ú-›6mÔFû‹äÓ19ÐH6Êb"Ãk¿@ß ÐDSÑy ÛPu,’÷öáS‘¥@œ‘lÈR¤GqìèÎL¦^ DH',Êok¼žÞûä·B• ÌH6 JÒƒØ=¶MÈ• ž–ȉ×ú<ÌûöznïCøað‘ÕžóÑ¿%žÃ+¿@� ÐDKÉ™¾þNkìYnê׫£š³ÚwesVmKPî*cÞµj~¯Ã“¿¢3é ¨¹«˜DbƯw�¿A ‰Æ£›CdÑq/ljy�Äž ÌH²'ÁetaÚN[¶”äšyw€üøNëù-~íómÛ#p;ˆ3’�èÜì v­ÕIyî¥srgY鵦ïë+è��’;4’ÅäÐ×9„Ý\Û¢t-ÍgÒe\47ö#âCš–Eâ6)Éæ@Yt%‹ã—º@ÿ ÐD»shÑò(ïß}µrQ$€h$‹  ÐG§8v¾íÜ¥ jž<¸œÊ”Çñ$ ‘ìè;‹Np!ºr¢r¼n�Bœiv¦зøÛûöؼÊÿ8”yAÌüð¹9°çßÎL²ŒC2軾Šn|××`^`€g(Š „C@µ'_J ')TVê)x‘œ¡(æƒèÒÉ ìk�ý9_JóÛ?D,Ëw{]ßç±Gu‰�Aœ‘lH–§G±£oû¡¨¢Fp†î�?®ÿGd<:´fRÔ¼*s:^³ÈS!ÈD#º¨À–B绲ŸS¼Ûû¾¤Ù÷ÉïÇÊH6£¦˜Éñª/°U4ÑNºHe@ðóüµwp'ÀÅ™jOŠŠÛ±ØÅóã×¹@!ÐD£!&=ÖÒþ}»¿÷ì™zmÚö$¸¸'@‘+8[uf)}Fœ<¸÷Π3\LÊS¨à34•_é¿…@ÍήEË£¼1ú»÷×$† qF²ÕÄ�¦�%Ay³‚«æQýé: �;ØÎ˜(wí¥ã(2§UåÕd‚y!¯V^Jø^_‹=�xzô«Õ¤¨y÷Íå´_!÷h¢©oU_߸¶kï÷Τœ¸ ‘,¦®”£Ø«w''U¯…ˆûÊÒ·t°µÐ0@GÕŒH€q7€½zXfÂÜRW(4j?˜«û6,ônï2aþ]gÛ£ó÷¡föËi¿B›ÐDSé.ZÒš?�ÄŠh­Ãi½ï}²›áŒds k@dõʯwg²�õ ã=‚Þ›÷›Ð¼y¿ cœN¤ØZ¬žó¶×äܸ_Z­J�šG0zNûf€&š*0sEË«{ºI¥æh$’séQUº““ª×BÔm½Ï§7µ7á­pŸÍˆ8hƒD¾h5§Z&ã¥ýº€þº­Ÿ.(Ü«Yꔀçl;’5ÿÓvNùp&JwLÁ,.ïÕí$6"¼ëì6å '¹ï˜ªsº/ðn€3ÑNì„|~ë;¼–úã³ÇJî„€Ç*å@Íoz*�è4¿Ì�&ÚŒMÅ”Öí»çî\ûüg·AgÀAÿ!rÆD˜yíÈ@šhêö¸í±Ö¶5ï×ÊOMí¥ìŽ3k®k‘|»—£$(ó‚9P#’ƒ~!•D”)&ç¼ÜúáúwõõŸ�©Ly9DÉ^.=„ãL;1™â4\ynÑx+®ü±¾\-àÈØ·7KÎqRx98¨žËóºuq¦Ù¸“[ñÈ�ö¢Bn�kï¶ä'E—˜–óºuq¦ÙÙùûÏwÍ`Þ·÷Ôm ô~Б×íH�q[‡£1�Dãùµ.ð4Ñðœ¬Z^Ý}D�F²˜ű¥;U™z%Pi¬à²Þô«/§{\bh$‹YÁ å04m³Òõ´¨@´ÕµJ¸ÙÞ¸$2t4’�ºü(ŽyݾdêµÊ¬Ù¢ýQ=Ûk§z–p†¢˜#bßÚv!W®øitz‹;ü­>èu´±©í‚Þ¬Z”ã– »Æ”§ôK]à)h¢Ý)EX•$Þ$R„ˆ3’ )B$ÚØÛ¿DS#èg$‹ :å(Ž2íRÔ+!+b «öþ}ܘAß™uŒ3Q´`Ïk¿@U"ÐDSÎx¶EËXÔ:ÉF]~•vrõZ„bmÑ~›ªC?xd…%D ‘lÄæGQTi!h"TÎ~Þk¨ì>«2…4’ÅL!xþÂ.½î‘°–râ°®µH¾{’)‡ˆ3’ ˆÃô +ݦ$ʵµiê–î£Ê‚¨â,â¤À0—ïÕç½×d¸…pjÉ m%@Í—ÇŒ¢×~�>E ‰¦æ„eÕRºç�WgRJX"ÐH6",ó£8žt''S¯§ˆ°|¯ÌÕR%ýv/ ÔbSô¾/Þ~ê¯áh$›e1™èµ_ Nh¢©tÉL‰pïžríÛWóº}9j‘7&-½ö ¼%M4ƒãçµÎ¿¿o�#ý F½jR Œ{XB3BÕ¯t�QE ‰fÓµS0%Æ=?¦oiaÔëöè ÷´ÂJ¬£×~�VE ‰¦ž²š‹‚ךt|n]}¯°š4’Ŭ¦r‡œv^õBü¢K…˜Àe­â´÷Y‘Aœ¡(æ…ƒ8æµ=” ñSâ Ëj‹àµ>5p�*œ¡(& …ƒ8Ò»’*¢VàSnåÙÐýk8Ü>Cß,J€Z¤‰¹J¯ýW‰@Mç?­úJOêù눽¾—…^½”ãf‡:QEsqŸSß&ë{IèP;“΀š[ÙT¯\gSg¢¡9›úÙ^v»TX¯g+ò6�F²˜MUŽâèÒN�¢^UÁÕ2m/H½½;Í} <{gÑ.nPEQ‚HH¯ü{‰@-ÕØËEÓ}�1¸=ö¾ˆÆ^"ÐH³—Qs-ÇQÐi',]O `ÁtßL}ýB¦��mgÑPsù1›éµ_`3hº©Ï:øº­’ÕÇî¬Ú�á$�S™^·Ne"Nú}o¸è¨�¯öÞ‘7D ‘,æ •£Ø§·ó¢¨DPÜX×êûV"uˆ@#Ù�›Cß_…9qf��ds Ld{ýrØ^šh{N´.ZŠàÓž’yVÀІ,kv‡ãv¦åBhÏ9Öe©2·øÍV§h+�d1ǪÅIAÛE½�aÐ¥R4—èûêÉá¾çˆñ¸3é ÷ÃàNħ×~�ÜE ‰¦Ö}Á]颬‹ŒÿáÈè6eŒ“¢³§y™(}”¹¼õ/ŸýÊ•VÉ +†óÃqºíOº˜ôƒë¸vÃԎĀؙtŒ�at%þÖ)¿ÀûÎDC#Þ—ØÓûú%¤ò^ØWÏq¦¬+àŒdÖ5™)Œca5JXO ¬týͯõ5©�gHÖR0ì,:ÃÅ]Á(°2Uë”_¡£h¢¥)|_Í]‚áþ�ÊÐH3ÁÊQ‘Û™QÔ á=¸V^S�:ïw§¹obêL:jÑpÀ;íW8qšh*ÒLéÞW‡T¾nÿÜi3‰  ‘lÄA*=œb;Ké:Zt¥ ç¶Mó$Ô™Ï_-ÊpRð0ÇN÷np¦Ùò¿·m¼ô³v6†–ƒO·-'¸¸ëÅ1f’�î 4àL³3¸RÞÅ5·×ÖMAðñmKÎqZ Ľò+¸Ç™lçm½Œ�ó\_ôÄì»Ú.$@̓b§ý @í72Íîm} Kùvýw'å%ò€F²!ùë=Ša—ÞÎTº˜‚;è¶v3ÞS{6rµMË"ùzg›�ds lÀG;íWøhšnêvÔâ„wT׌oîvb ÔBJL;åHqÀi¿Påß¿¿k6ø[¶ïÞŒRè_ÀŠbòW8ˆ#J±@R®D'¼mŠâ2Ò@ᦣwç‡=g0)¢ÄܳÓ}�zœifjÄó¢èµ¾/mºï„ªF<#ÐHÏÊQm?ÉûïíÙ�A½—Í�²ðbyÝkˆsŒ¹ëÍBÐëL:j¡7¤š½r�jFœ‰†ÕLdí¢å±VÏýý›"Ë‹@#Ù�åí3†©@;OéZZ^\:�G pŸ©Óì:µò:“΀Zà�‰a¯ýù�@MÍxç%›ø•@¶¿Fã�g$ ygá Áõ¼(Ê…hžsÍu¥÷ú0ϫߒ”kF ‘,æš•£(è6%Ó.¤tû|×üÎ�Q›â_3(ÁI18棽ò Œ;M´4 –سÌ:¦º±ƒÛÎ$À¸t¦©½ö ü6M45¸`žåqýïºùÍñ¯Û–œ‚cþÙëÖvÄ™f'�ÛD/*nïJï§H¡•g(’Ê.kH!œ ´”-¥eÁs{×÷í5÷MYŒz�Eg@-öÆ4´×~�jG ‰¦úÝGs¡÷?Aèu›2ÄÉâ0~Êp¿?ëaïö}¶ÍQnÉb†[9ŠoÝI½ÅéÊ-šÝ|õa1ät&�µÀsá^û²�&šªq틦i�÷çú¦Þ d;�ds ,lRç0Ž„íŒ¥ëia5eàëR¯î%ß�8#ÙèÒŽâXØíJ¦^ ¬ï¿å³÷ï� 6#zÖjC†ÓÜ{Ì‘;åÚ€“~³Ý ä]Æ£ß{o”úœèPÛž$À¸Ïygfνö ”;M45§Ü«–‰_bÜg(šU©7Àñ2nu¢gíÎÒPóïã :xj¿Ö&�&Å„÷\ŸÜ¿ÝÖô#â‰ÙÙ·�J€qû“#GÄÎÇí—Ó¹qÄ™h:åã^0€QtöÝ6�àÂŽh7�¿öªeva¦YqãÌ.¿ _¼H>ë/ÐÒ4’ hé¿Ón×ã8W ®ìð}}2ìý蜑² Êæ@YxùÜž5š¡“ ª³è 'ɘÎöÊ/ö4ÑÒ”š~¿Öâç}[®Ã6ݪQÓ4’ÅÔ´rÉj„¤^‰¸t±ÍKt{­ß/ŽlŠ’�Eg¸¸qE\¢¯½ò =M´”jo ˜›Ž%¾Ý.qÓ4’Åì´rgwfÎÕ+‘> –¯µ£ð^¿V· R+Ã`³êv©9¢"mÏÌ·_IgÌgšÕÁ u/¯=x¬OÏœ6GŶAç8).ÇŒ¶×­söˆ3ÍN‰.¯zÊ[ç§Ý&….G ‘lD—çGqnÐ�›T½�hÐÕ2mî÷õ‹`¥Í°š”µ8sÚ^ûÒ�&šJ,õT§^OúÛ1ÐÛÆ8Üö%ƽí0¨#åí•ëT9âL44¸Z^%p=öŠ�úÈ»]9j�8æ²½ö |=M4Âõ†XîÎßÎ/A3ã°Û•10nT‡Ayw¯\çëg¢¡·OÁ|¦6|Ëýl ymW`Ü©æøÙµ˜„÷Ë\`ïh¢ÍtÑ”/Â3bÜUÆð×mÏP‹ÁJ;Á¯u¡�€@ �(óu²ïþÛ'¨ÁŒñxÛ¥STÜ]#;ï�ê t½C™b!;ßé~¿Ð7•1öµ�8Ciá7&é;Õz‡2ÅBßÏ~/[z¯}é÷Þ•òýl wÕ’ 'EÜ�íð¼z]h‘üÚ{|µ¾âŒds K;ŠC]·'©z!n‚s{nSÉGÈêÃLoO 3Ížsœé‚FƳÎÕ/önSrÜ@F·ÞtŒ[ÃaŒ Nƒ×~¡›‚@M¥³Tf‚Ÿû'Ÿ¸s‹Ž¼íJŒ;·aT .ßk¿Ð½@ ‰¦j­‚ªi‘¼žv g(šUÒASº3“i΂SÞX.²ïëOÿ– ±!€@#Ù(ÓŽ‚ØR-ÐtgQ*dÞ‹ê÷ýUœhD�ïAçþþvMŠg$›YWÜ4ðÊ/�ÿ4ÑRºV¶Ïå,Îê»sh¾‡��®íÊ9.ìa‡1“Èy¯[o? Î4;‘ù'î|ÑQæ`×G~Í…tG ‘l”iGqTiçEQ/„(>�:!½Ö½Þ®‡Þ²�u~ãëí9Á…=tT¥ô!üJzq¦Y ÛC$zSñܳ\�|œ¡hTIqÀu'è\¹¼Cöÿ^æo¿g{û1÷Ê!àV£R\Ü+�‚7SòNù•M´T üïu„|q¿©3)çüh$›etõ¦Îºót¾”–VD=fÑïëí¸H~íî*ý@#Ù( ¤8ŽÎm³ÒµP/tÊZ¯õË×�{·SyW€F²9P¦ÅºÛ—T½î1’ßÿN•ïyؾƒ�ºÙs ‹;óë…E·Ò•…ƒ™d2Ýð[|9†úh cT ÷ÌÞ;åWú4ÑRjÌ{ýîÇ´ÓÓØ5‡èØmËP‹ÑÒÞi¿Ò¡ ‰¦¦=�ÛZ“÷swbKÀã Es J:ˆ3„j�¤\È6„@Yê½üyŸ÷P€2’Í�¦8�Haœt›t¾ž–lÀes[ßòê¾S´Ï! 7ƒà }N1=ëU¸…ä^ L49í,ÙôOúg(šUAÔÎ �Û©ÊR";]8�©Æ»ö¹“î"`gËlÐG‡`J w#ÜJWÚ4ÑìxºèÊMuˆˆn‡Æ@-.¼¾ë‰8íWš)4ÑÔ¼�²ìüïU[ -¡ÐÚ)4’Í�2×ÚÏçø\¬QÖÑ‚½¿lª^7%Ç}t ;{Îpƒ6zì©íá•_hí ÐDKî ¶'Eï5ØÝ;š÷4d$›QQ˜X$NÚY:_IÈ=Òºu•×úyŽo;]{pö6e$›QSpñžÎQ¹Û”“E„à¾Ê z½»ô,¬žó“[ ¤iyß—›óxËf3Í�&µçãÓ[>3Él:SÏRߺ£ÝØÁns†¨Á8…Ó¼íÓ-t¡éãP¦ØK›r+ïÎ8ÆÊ]ì÷ÅÕº9P Æ-«æÒ¹};Í}ßÃ`gÒ0îûsLE‹z:~© Í šhwÖ j§c}ØûÓ”vƒh$›eaÃãµdÍ[L»õ­…¬á�8#ÙèÒŽâx\/I½Ü£®KÕþ¾ý~{¢„Ó;«NpáœCÞ¹+âuë}Ä™fgÖßX_£± >û8‘ÖÞœ¡hTIq2ÐNI®\I,´NFYî}Ÿ–̧ە´�áa’9P¤CQ÷Ø‘D³¿! }Wfd SŸöbxžAp¡®™’ â š›©âºÐHA ‰VCZý=j;aêië~$#KÝ¡;Da {^·ÜÍA˜‰fÂS%�ýúþO?~€¡­Û‘3`<ÅIìmxÝra¦›I­„†ëÞö&5Kg$›Y—tÇwwN• ©vJ^¥mû¾}ß­áDÓÒš=ç8-¬Æ� §üB¯p¦ÙI¤œo5T ¯õõ.ßΘ¬C0CÑh’¢ Þ��D·�H ‰Õ¯éËóþwï¥)ýÀŠæ@•t†ô¶%¹ê<9Èš!u™òž›[¿i3�F²9P¦Å¡´Û’L½—Ó¶Ãrè­|Dmo- ]ŠfÒ#Â1´íE¦8�ÅYã.²HŽb¥á�0#ÙLª”c8xv[q®Z‰ÂLö/ ÑçÝ7±Ÿ8CѨ’âÐ]w@Q®¤§�ƒºJáúoýv¤�Éæ@™v…ÍnC2íBÎzËBÓöñ¬ÛΟ ½ ÄÉfÖ%D±»mH®;Ï¢>AÑü¾ß¿û4 Í @äì,:ÃÅSQ¦¦ƒW~¡[�@-…ëäý÷^ºî�ö¹!îñcül›’ã6Œ©ëàµ_hW ÐDSƒ¦ÅkýÛûþ.Ÿ;PGkam÷ï­›*Ê�F²9Pö¼r½u‚8 õ3âöx¬��̘Yt[Ò2‹~Gưpƒr¸r‹Ò%.>½Ò~ÊÃ{gÍ0ž2sßÕðªÕÞ ¢L6²Õ�ìÑLDx·cœ”eôœüÑoñÊ/4j¨ý Q³V¥IqßYO˜jÀ8ßvå5„9µNœò ­"À™f'±˜ÐU(*^ÝÇÙÄnà Es J:ˆóŒã”¤Ê…œ%šbX? ¹öeo¯–zñFÙfUÔb½Ú¥ñë]hÓ ÐDãéòñ½†ª¢¼vg{‚UëQ ÎH6º´£8ôw§*U/äÑÁšÄ¬ÙÕ’G¼¿M»#ÀÀÛ¬:ÇI±?nÞ`į¥vOešÕY÷¤ªX#_û*¹Ò=A”‘lFMÂ!x»ss®8‹ßi›ä5­—ã?h“ ÐH6Ê´£(ØT4íyà‚kcZGJßbzwjûQ�Íû^ÝYr\<)ºâ^†W~¡Wƒ@Ó-ÝŽZ‚W³”Æ êº}ãâA„(‚SËÃ+¿Ð+A ö …nÉ¢d�¦¿ýmòRë– ÎH6º�9ÅqÄmç*]P ßtÕ1vÞ§0âvæŒaá\B»±â4Ë@™dbú¶O.åÉöðÎ-`X«%°h&�ãcÐСƈ_Im§ Ê$›áRi_\nÙ}GavÃl·9gÀxv ŒÙÔñÚ/´Sh¢©ØN¡æÄkû6àñzH­©�8#ÙèâT!…pÐÎSº––PÐ…S¿øÛ}{D?%�1®Û•3 i­ §ýJ7€&šZw¥«Œî>zÑ܆ݶ-ç8-ô3óÄ}ž²Réé<÷-RúC€3’ͬ+ˆÕ„£p·A§KI�.ãÇÖ@ú=­GGéˆ1Ÿ_÷¶Èg(šUƒ~’Ó}¡c8“í¼­d»œ~ýAÝ ßjB†“âÿ ™ät_h—Nú}rc¨(Z$ßöåVµ1@#Ù(ÓŽâ ;9©z!¡ÈºSk¯æO™º|w{’v§<ÌP4š¤ƒ8iû!(Ò™°EU”¿ïÓsŸ4áù ˆ»�Ug@-úšGNû•NM4.•ÛÚŸy­_fº÷7(q·íJÔ¢ÿ }ä´_i‘ÐDS1$/ÎæOÿ.Ñ`lbmÛ•sÜ`$ŠÛÜVê•_iGyœiv¦Í¨UŤž»‹{Qg(šUÒA]�S’*×"uUµ„$PÕMk@lëMã´ø:èCõʯ´¡‚Œd3+’¢ÀÞ��Dwž"äퟩ<‡º„²[{ ¾ÒÿA”‘l4iGq0m;"¨W"³¿:ªÞW÷5¨`âXgÐP‹¦qŸÈk¿Ð C ‰¦rÇgA=ÊS0ßµeuËGK¦ý˜÷}¹÷Ž7Üå@#Ù(‹›U^û…¶M45ïólZÖæL#Q´F�ds L;ŠR�þÜ$Ú…´%ë6Õ…J®ÑÞô¤u›h$›eÚQ”ðt{’i’'ä¶Ö×–×Þvª’ge|䯥8)û�¤£›äºÐ†B ‰Vw}Ÿzøù˜ &Ýî\ŸS‰² î!yíšO4ÑTGß¿o˜8õÓ2˜‰´-9CÃ0QBÃÍ!¯Wm|!Ê µ®SU³H>m¨Jh:ÈP4£žp„çÂ9QwbÆë™]ϸßûûCh`S€fIÔ‘¸ñäµ_h*ö h$›eÚQœ tç%S¯daŠ:9ËñÓZYÞ¦õ^h!ÐH6Êâl&ÇQªÒ6+]OJ{ “(jË[·z­ý çΜœ–!„­)§[ïLÌT+×ì³TpG¢A­d¸A뤸¸•Ýì¯õ„”"ò트ƒÊ÷«52\ÈÒ£*é þu1•)Wv ù•e—â›T‡=íZZßÏÒ]–§(#ÙÌšâ¼²¨^²ÃÛ>3G£D˜/&�áâI"Î=µª[îBp¦Yžu.·ó±üˆ6¢5.g(šUÒAœ®ö×͹r%õ…¦e½òKïûé®ü~Ž3¢Î¹œãA¢(½¢Î¢W®wNg¢¡rÞ«³*³¦ï�ò…©ÌFÚž$@-' ûj^¹Þ7Dœ‰†F)KÅ•Öc4:ƒ¹H·3gÀx(†›¼™è׺ÐLD ‰†ÓÕó,o+{¬³¹3&Çí‰@Û¡s˜’‰Ä­<¯Zïå!ÎT39œNÛ—¾·ö26-aAœ‘,LXˆáÎ ÓêDÊ÷·¾Ïúc«AùRA!„ª"§[6±VJý&.’–bw‰\"c˜‘l&Ua»•Û–u±EòÞgµ~'�ds ,ÎråÝN�¯'åtkß¶—ºÝžM-ÌAbÐÌIpñÈQ”dP�Ô+¿ÐF É–2»5mŸƒüÜ %Òb4’Å´˜r–ÍM=uÛP™vU<ƒ^^¨]©ž(3\.çϳnòw/D„ŒqF²!™šÅ'ºùWE½pÕø‡.÷˸o‚ÖËø·~  ¯Wý¦¤@#Ù(ÓêjïûwÚ?•¢ * ÐH6Ê8•ëë}{/RÃqĄ»ªþ'%õAIM]¿’>-€8Ó¬Î;ãí–<^Š,5Æf(šY“r g÷Žu9S-Ô ”j¿ÖAÇó‘9Ì¡›= 0™ã„ü´1ИG ‰6g=ñª£aÛâ4’Í�2í(Îë»s”ªŠv2÷Õ{ëüôÜ¥"UÒ[äº9ÐH6Ê´6y]í}<Û»Ö)Gœ‘ltiGq2ÝmLª^È̳¦};¯_ PbÓ�F²9P¦Å™«»\õZÌ)â}½˜vVO-=ÎP§~�Í4­÷=œléã"Ùæ¥}â‚æ �F²9P ÝKRrÛÏ9M=˹(ÑU؆¾¯1§<s´•¤þ5�ds L;Šó·Vè*ê…d0Ïó–[ôö«‰ØëóçBž‡@#™–çm¿µËØ ñN9œÛ£1ÎHæƒA L~C9æ·*ù>»—+?es L;jRG�#õ^6Ê”ù w®Ì_ÐÄÓÍ_ð ÃJ-‚ßþ¨¬8ûàq†¢9PÏ@g(̃{vë|5”ÅI_ÈKæ@íLrü¤�™ð2(›U[SèÑ{�Çö ï?wþ�J|;Õþ‰Û g(šUÒÔ‹[éÂÔ àL³S°JJ-é÷ñŽž]†„¼o p0»e÷4‰âµ_½A ‰¦„d!릣(¥ùeŸw»r‹Ç—ƒlšæS¼j}®q¦šÉÔêóµ–E25:_ädh$’¦éQ‹ä½º¯EòYpkFhꉓEe£[¦×¼mÞ"xï=Ý®>�kcˆ3Í�ª¸ë²Gò�•$ šUÒA“8u)÷²9Ð%Œµý^Vš. !ÌH6³*é ®ÊÜuqª\(ðÂ(š#ªS*‹ä·�ÏiH4’Í�²¸ZÊq\u36ç j5Õhê§+'\ÔOýô¼lŽ3’ jªËô¶ŒqF²9ÐçyEùù°;&p‡Q×gÝ9¤é,šorK]˜‹œiV!sEëËÑ˧ú)oe �F²9P¨Ã9n;eébrœ&f<îÔÏ4£CÙ(¦¢Úï=fÎ¥¡(€ŠfÖ¤à ¥;)gª…ÔT™ª©K•I˜gÿÌX6Uƒ8#ÙèÒŽât²Û•L½’›w¤HÏŽÔˆ¹�dãÜêdÄg_蘣–F|g$›]ÚQ”¶ù-9Õ.¤€ùÌJuïõ/·G·)éÌ �ds Œ¼Kᜩówçki X>ÀÒ|ët| Jš`Aœ‘lf]ÒA”¸¹pª;OûYÖxOuÜ£u´µÙÉæ@ç19†2”¶9éZR¶´™Þ%°ï�ÙÑ|7¦(�A'¸xp;JwhÊÄéÖÇifª•œ|<§:õ]n ïè’¬�F²qÖr>EÓúz݉µ)Éæ@YäêåH®y¶””oIS=uµ2ãòØ;:ÂTâŒd3ë’âD©Û–D¹�sÑíœf嘲×�îÛÒJ†‚²™uI4Êùóq‘î^4³&L£¡Ý½×g�1ArDøÎs®œžSû�•?ý UóŸ ¢9ДOïø_­Oï δT¦wªšEòÛ§_µéÉæ@YpƶÞáñ¼Íãb¢TOY†‹çq£¤‹æ]œn}L`¦Z¹\}Ïhë‡à¢Ú¿(ºo¯%?¾©™ã.*3’ÍÝux âàM; 0 §xRSYû ¹÷Ï~# ôØA``带êi€ës 4’Í�²xFÅk¿0’ƒ@Mí Õrøûöî3[Çt¾Û’3`<�εA>‘ã׺0‘ƒ@ χa-SùpÈc0Nš†Aœ‘lf]ÒA”ҷӔ떊ƒ41ŸhÊ¥Z dô(›eÊJûµG)"¢ ÐH6Ê´£¸ªpgæ\½R¢„ó0Eûù¼<æñ�Y×æÃ¢€FT¼ö S94ÑT¤ÅZÔpÙ!L…c†æ"ã�…‡éM)xíÆh¢©á$AÁ•V{‹Í]c¦ØíÍ0ž»ÓNšJðÚ/Œ3 ÐDSuH÷Î~C²Ø—!C”’¬öâ1á4ë³3ÑFγžK|- Åþò 1—D ‘,Î%q’b3{9`ò Ç 1¦Fý)ã´ü,¸BÒQŽ)Oh¼û©å×£l”iGMê|¨ÞÉæ@Yp¢ppÄ�}Þ`¦�KÊJFñ¾½ö·øð”5fŒÝ(í0ž²ÓOšñÚ/Œ¼ ÐDSÿV2­×Þ_áQkÌ[݈ñÏZ‡I0N‹xåú” âL7”3Õûú�¤’(þî—R\ÉF)îxÔ¥ËÑ7?vs>ê‚8#Ùè oŸÃy´c6ÎÓ’òpú¦h/ã'ï~Ø¢Ÿ²Æì±3ë ¨å°áPŒW®�!ÎDCó Ï/]˜pA Ær•£k�ÿZ¿C}D7x"t +å�OÿXKŒ·QYÈ‚{å:�Œ8íj†Nêˆyø �l”qƒ GfZKãy—&mf(šMAQ–A&ªs\æd)”Å5S4î]•—ɘý¦ƒio,0:£NpZ•Î#ñL�[íÂ,àL3<È{“œð8I®-¢$“(›eÔ¢qš›÷km `†¢™5éo‚Ø�LKl]61^Da†Œ7üT_æ2}þÞ;¥ýX3¦“�1'8-§�G†œò ã?€3ÍÎ`˜Fh%Ó«&…�Ñ”Fog$›Y—tдçˆ-�mgEP.eÆiRZ‚\}»Û÷ï± B2‹²™uIMòŽ�ò^4ª|νíë’†8CQœ˜ÓTÑ[F”>¿Co?È� cgÏ NÊYã±-¯[ÁBœivÒ];­]¬þ™>ž&ÇŒµíIŒ§ÉÃô'¥¼r} q&ÊÞý¾M77«qp25·%CX8”M9_�$ùè%󑤉,Êæ@™0�åº>�…8Ó¶1Êå ª ,½?ª.‡,­;ig¸xlœ2¾`FŒ­üj&´h¢éBŠy[gž^ë;§çŸ+)&�dRŠÙô M›Cöèíââ9ò(¥q!¯ü¤M´ttÏ/ÙÆýánÝc’Ó$wÏ��ñ”t˜sဎW®�!ÎtCÙyßÖ¾R™Jq!;O4’ ÃSzTIà¾å²ztO*‹ê™üeÚQ“<©w²9P&Œÿ´sz¼³MÿA ‘l”iG×ör-üèFIÔ;Ù(KÆ–eÖbëó:^}  ÿx˜�d)ÇL”5¶­ÈU h0¾Ã2e¥ò ßûÊŒ À E3kRŽA/ÑoG¦ZÊ<‰Í\"õcÚ  |-�d#63?ªø©ò î£«‰5íAŠéuIMrþ(ïEZöº5‰µßÑó ˜—ºîòh$‹“\êÑð’_ëÂÔM4\›zªšÊW`÷άtê �F²9PgÕ)l¢t¹;çë¡,νÉÓ¥io‰°¯r<º´)ù2Êæ@™vÔ¤>~iw²™u)ÃaͱCþâp�ds Œj�1QïòÙR(‹ËmP¬®W†¨ú–Z:'8CѨ´ë×ÕʄŒd3«’:bC+)Úi”KÕIš^Õ}âUÉ£Q6Ê„)­ök%ŸÉ�•ó)-ÄÉæ@§ÿ)äØZ÷Æde-”ÅE‚0‘ô¨¯ƒY?.ÜO²åI4’Í�2_ ¤‡O�çwÛs¾ Ê¢’�îêÇö�ç>cLC÷�h7{\´4 p†"1 Û~f7Û�#ؘ^¹íâÂì0S£q§ZŸ‚˜iVRð*ámÉœž‹›lœ¿†\ª›x8æ¯)1KGsÜJFsg¢ÕÁ5\2€% q7‹ éŒ µ¤j0ã´_™� ‰¦ž†l­’î-Üâd�ds ,¸�S g6®És¶˜–& ã*e­%«yîÏW‹ó*4’Í�²AN–â8Ùêvê|A-sËù·GI”ɳ½C]äßh$1dùQ%äÜÊ[ßk¸Qí’zΊP™v”œtEê½LL»Úïé GC>åOÍGSf–�öôë\íñ0“,ÖæVŠš0·8#Ù̺ø^J³¢Òzõ�¯WqžM¡ltiGMêó‘z/›eÚQè>ŽÎ™ ^™§I'e*%ñÞIQmNÆ¡ $3ë Òàsg—=ƒ2^FJS…Q™%j•Ôcÿ$¢:*@#Ù(ӎ⼩퉢^J–;ðWF'…ýöåÚü–a�ïß׫»sÏqa3UÉæÎqv“œ0‡ÓMI–²ò¸ïÿÏ~!å“vñ`ŒLŠY9 ¿xåÆ}h¢¥ÒKUTæN¾ŸÎªtˆ�F²9P¦ÅUEwz2õJ‰’ hœ$þçÿ!{GeÍãµf\¯õ]¡ÛK|´rqF²Øl¿CùOÀ?«IÎ'Õ¡V ÝÙÀ’˜>†3â�U»ñÂ1p0$¥è4öáµ_˜A É¦rb¸ÄûgÙ¼cBK}h$‹S_È;›Ýï›3ºΆlÒ�˜j0sMyi�Þ%ö—äd{ãÌÑ·P~7ÊfÖ%4©Sü�r'šUÂüL·õ†gÊ”3x:£R‹Á%9¹u·N>£‚0#ÙLª”c89êJÖsÕy–•�ÈøÒX‘AœTžÇëcZ_\r¬íû$b ‡@#™–Âm�lIƒ^£ÙdLŒ\µôL™˜ñk]˜˜A ‰†GS!·¤f÷ýq—Æd­Û©3`<.e~?{{aZ�F²9Pœ¥4¥_·HÈa¥�„D7ý ãÄ;ýíZÁ“1ÍÃvÉ(ÍEcþè\ó¨e±}oŸ³ñÊõùÄ™h(&™¤楱d—¡¸£â¡dÈuèÎ’0(ËŽþk–»¡lfUʰ�ÿݦ…hâ&æã:UË"9TÑÆuh$›eÊxL#)—¼èÖ�¤ã14’Í�2í(ÎéÚµ#¨Ä49+ÞöS^ë÷è¾@¡du(›eÚQ;+�Ù‡ÈsåJnJ·Ò³’åÝÄ’2�íûòïwWr§¸�”AU1³æuëÌâì¿ÌN1o ž“IyK+ º1`š1Æ„Ä ²��ñ”q”Ýà°ˆ×-Ϙ ÌD3Gíéîk‚4?‹é‡kO��ñül”Ëð°ˆ×~aÊ�&›ÊÏr‰Õ7Œ|–ËèJª„@#ÙIª”U¢íTŒïùSQ=Qu¨L;jRnBõN6Ê”ÁŽå¤¾Ÿn_ÄÁÉæ@Y�¿m˜ï12O³Þ˜u´;'ƳޜœŽ4øe.Œ4 ÐD›ó‘†ªe‘|ºACe¤�F²9Px»ÇJ(¾º%ó<õÙ>Û{ãŽoäÀxR•iG‘#™§Õ;Ù(¦Z°,õÛ›jÂ4âŒd3ë˜U¿ÿ:³Š8Ï%æ·éo ÔÕåR'?]I‚ƒ9 žT¨k½ïÏ[÷úeÄ�F²9Pœ´,#›hV …®,“Ñ¨Ê ÚÅq ó*ó€2ͤ(H<Ϝ͹‹y¸Œ’æƒ ­xÝ;Dl@ ‘l”1ýœB8«s¬ÃÙZZŠð I†‚eÒaRšÚ l”e3ûO?m…™DÉæ@“vçUþ�ªW’´œ«Züúk{sòóí.›„¬B ‘lDWí¹Î®´»W»´ªßŸ–VycF8#Yœ¢áM•š_…:¦úëSxáw£l”)ƒÐˆéRÜóAh^ es ÌŸ0´¨÷î"YööÕÝSé„�ds ,¤Œ’Äm¢Ù‡Æ¥Êæ@™0"Ñ¢îçµ¾?òˆ�ds L;ŠÓN×ÀMÔ 9¬6Q×[$ßö‚q(�F²9PF Ïv6�W�ûÜŽmKqç}nŸ¤A‹Ú+¿ÐÛF ‰–¦½íEÉ{Ë&߯MzÛ4’Í�2í(N¦Ú©QÔ ™Y�«#]tÿ{/[¹ù[å™h$‹‰ Ô¿IY es LIÌ䩬ñH­…²™u™CÝú}º…‡ö0ûs6jYAÀ·a_Ö/¥÷sg¢Ùxm)vci> —›��ñ€Z˜mœ�‰µ[E—„”Í�¦€ÓÚ~Ø¢y{I+�¹à¶cŒâOÜëôª/ôrh¢�|‰$èñ3~�Þ"¡rEÙ(Sš»m­ÖÖšÔæ.�ds l¸IcÈ)&lÒÙZ(›e[y½0ã³÷õÃ…a™úˆ�ãn , › æÈÔ²9Z es Léo6§ðÝ¡û›4’Í�2‰!qgä C@íºv)ýœí¹AŸ³ß¯¥Ž´KYüŸ¨-Öj©,oѨRzg;æ¾>Â¥7Ïg$›Y—t' ¾í{ª<Ï9(xn,k„h Ã’£gÇ@-8†m,¯\ïK!ÎDCÓFУ|Þïu|×DìÎP4ª¤ƒ8¶³"(—bêý÷÷^ÃÕóTùmŸÐ>Þ œââ€�º´£ä©÷²8F# B]¤}ÇßõóœGÔIÚO4’Í�²¨¿âϸÛýB˜tðtTþ:-.Ï~9Êæ@YÄæ% Çtö[ Bi¦‚²9PDêí·.ßc<¤0Oq{4ÄÅóQœóœµ Ý"z·`¦™›' ÷ïz¦_ýëU´Œ�F21gxüqsN4Ž„©ÀQêŽQñ0'HEréXçJ÷©G™b.9�?}%¿ìë÷Þâ°ZþÈPÿÂAÅq½é&’r&G]Ê€=b&à‡ö¼Êæ@±hÛÍpüRœ7Â<ÉÝC#˜”©Ñ¥’›?¿Úòˆôw£,&kÓîdÿÃ/4'=̤-ĉûj[ØY’³ÛNRK 9Éæ@™v%².B&Ú•¤8OÅ&jﵫ$ÍáP6Ê8Ók?î�¢Q'Láü® �ñS˜B£Ê©–ûn€2ÑÈ4‘Z<ê£ÄóÏNái‰�d£DêÞ�žrþ¾Ó´ú”¤?;[J⺴C˜¡(LnÐÇ¥yE¹PŸ…Àé©%!AÙ(SæË3©óå¼Êæ@YÈD\X»ÅÓµPkygw‹]¶)vvh$›eÚQ�¯¹Ž`¢;Ëü 2nÖ…8šñAÏ‘ÑcÜ`f& Üsʯ4h¢¥y¿í¶zHÅ~�ds L;Šã;5Šz)™àP{¯>ÂõÙ´�@#ÙIŒ>oým?¸�‡(}¿b^0£ÎNæØëNJ¬_ˆßy¿o[á÷\Õ•~�ds LiF´‹`ñÏoß]Kš4’Í�2rö9„½¸»zÏÖÒBBZ-·ÀT"Ý}}áÓ…Ê�F²qeÔ“»æßúÌ¡«¹Žið«Þ¤!Póî¼Ié¯XŽù¬ b‰kÇÓEÊÏGÙ(ÓŽš€�îDê½l”E´öƒü)¸ÐHB ‰ç“ÏTâ¿Ë/}oÔ¼ƒâøQ6Ê´£&iv3Òíe3jâèÔ×î‡ñdH|\º;F ÆB|ósn<ÑqÕ”ìO)©—÷ýï½ÐoD ‰›Çn¸Ä²ÛegŠŠýIjQ±ïs�qƒgA¢K�º8呜©v.gúVR´ió!ñPË1¿òŠ¥þÅœ90f˜P™‘,`ЍKÕL8‡… Õ ß•[Iª<Ø?úuÜMk6¾Ö™ÀþÔ#J{nÝ¿·+ÅÉæ@WÜ‘tÊ/ôógš�)‰p_'‚Ë{’>»GU8ÀŠÆ BŸç6÷ùýÝL&aþêšC\<˜Ä¹0áóŸpܱߩ›\~:Êæ@—vÔ”àp¦-Rïes Lh¸ºí×û­3íDR’ÝH?\Ú‡�0%ódáÏqzÇ©A’~r7µ9Þ4oEÙ(K›®î—«=W™¶ƒI'­±ÔÝ»³¤VâŒds +H)S çEíâIÓ’,æ¾Þž²gÐ߯f8YïÛGÎŽF‰–8 ÎH¦·›âc˜…¦„ zƒ†8)$ó9Ê~Â"x­÷�«Còß ¢õäG 98š!cµ‡`´í<¿ÙÚy4ṉ̃ÛMÞ$�rŸE@”Í�²¤ŸÖ~R—YI 5ÄÉfÖdV„±»…NVR;vЍÝÒJã%Þ´m MDÉfÔ$B±Îï'z³ˆ™r‹�˜ ç°�rh4âŒdC2Á]!ÏíEï¦-§â×ÏZ­41/˜Q̳ƒ9¶ËåD¿Mùº-™Àïø.Íz´ðûôÜB Œg=PYØRòÊõ–âL6´EÓ£wÀÉÜâSß”;¤¸8—]ÒA]ÆqÞ2‹”÷¢9P%t‹ÚNXѺEˆ3’Í�® „ß0ÇH&¡;w×êqlà»' ]6†šAiÈCÙ̺„þ‘ÿézÿq&nc^ÄÞÖÎ_ý¸�XÅÐH6,5Ó£É}m½üsÚ¢zŽà L;JO"õN&&‡æßÞ„™ýhÑ�üDivP¼n½w…8íÄëõ±~§Lwü¢·xÒ¢tê¸SX<� ª¢z¾W,—ódÿeNêÀUôÃzѨRšSÍovgCkN!ÐH6Ê´£ t>Ñ�哃¾ËϵiŽ¡L\ß%IéWüP 0^Õ€êu_aP<ÎþËÌœÔ$1øu½HK©£ÕNjwF¤NâŒd3ë’:n<÷,™¦âŒds +g´üÎËŒÂL;‰°9©ýî]›åì‡k¹oO2E�ßÙs6|!æë›ï×ð´Z!6¾¯³ÿ%ù»÷rLƒ²8h:åX Ài¿P3tÒ†Š£Ÿçd3jÊú²ËÉž&B„Ö,¢Œds ‰ìomþ”Ùåß§¿†ºd 6½:Ø '�wÞšôÐBí†I¹”áõùÒ¦óx5¡Ï„ú{wË„œ-cœ‘,̪Ò^z[é÷mb/�F²9P¶ùä÷§¦í dnåËÐLq!“€ªâV”×­Ó)ˆ“~Ÿd§š7F¿ÏË´¼q‹¦‹Þ ˜¢ãÉKŸº(<ÆÅãJ”] ­t·Ô•V:M´›ý\’iMÔnŽ.MÑP6Ê(WÙ.Ç�ãS˜¢¹Ëxˆ ǧ8Ûºµn¥ ÝZÀ™f5F‚­þmáÎOaôs%s †§8‚rå~×'ì„6#Γ'˜YKÀr·ïø¥rƒ°‡Xº[Ikpû‘¿×•Þ  Œds I;Šcš;‰z!@ �Âm­n¢KìÐH6Ê´£ŽËëõè>^/ªç)*PùÙ$zMØèjn6�z(›YWŠ6?||½3˜Y‚ã¦sÆÀÁÐR°¸³ä´_iIÐDSÉß×�[Üö>€“1àÇûÆé6Œ‰B·E:ÝWZ@f’‘ÜE†òö^eqÊmLU«’h$•‘ùQË1KRÃøm·AÓÎq tI©1/ÐíDZÜ»­Ë{u_× tú°ÖNI‚ÌÝP€ä&�S}¥ @íäË´@~÷õ==Õцd º  ¢)™(Pc³ÈiL€1Ñ:‚öìƒ><�8#Ù€Hz\Í #0Z� pF²9Ðä")†“ ï¾NÓ2–ž7¡nͶJ7´¬uyg$›]a �`8¬ºí9[L‹Ñ˜%½×ç|Ü\Í-/þòUMúNOŒ'’QYÜ|ðÚ/”Ä´ÿBS�ì!ž£“Í�2ÎŒÚÏ[2ŒûpÄånWÆ0%ëan;k~½#‡8mÆK7 ãÜÊ©»“FÍ�&NZÙ°„ÚûÞ"Â9¾®Þµ oAù•.´ h¢Ù†ÿøþ% ¦@Xvÿ¦ä}ð>ZY^³ÜC˜IFBèÞƒýƒ‡íŽ>t§¸óvGL©SáuëÄ™fgZ°/ŽûùúóêÇB¤‚qF²°`*ýãûìH I9�Т*é £<8�"Žt{Ù̪\òÔ\^7òKC:�¹�‡!.ž¿‰2,j_yÝzÛ q¦ÙÉ' áÜÉi!'�ý(›e’÷ŽÁ\ÓÁ`ë{`#\8�Åmn€xÝzÃq¦ÙéƒÞxnÑý=šJÁhÖv$Æc)Qhäƒ×~¡£‚@MÍ&ÿšŽîUsÒèâŒds K;Š«;3çê•(]7¥Ôcõb™j£áõkÏq5{­ƒÀ+Óg$)0.çQ™0��.”ŸAðZ(›eœ¦|ׄ÷Õ}n‰‡D0ü·Ó–µ$hyÕjQ&ÉAà<ˆòMÒb@|¥ûÍGèÛö6¶ÛÃY|#Ÿ;7c ~‡}Ê£ÉÕ–ú}÷E­;†@#Ù( )ê/m`k±(éKÎP4ª„âÖ>€±w¥Ä�F2-‡¨¿¡{› H`hîëè1NK”>™[êB› p¦Y„‰úU™}†�'KÏ:•˜Ü7ˆr`<[ŠÊræÃ¯¤Sˆ3ÝjgcŸÓÈÈÅUR Æj[ÇÚCټ皩Y3³Ý¶ËJÏ ÍL„Éæ@eÃ)‚3LçlΖÒÒUº™Òd¢Æe»nÒÜes ,`î¶ÈÜ�íú¡Ì\< „´%n½y½jcQ¦XHçfÛªßþÕ;ž®Á°ìú¾c`<:Ã1>m3ú¥.th¢Ý˜O4L7¯BÓ6�)¸=ãâ1š ëà^™W~¡É†@-Å€”¦åÞžï^ð*é ÊfÖ%4Q8Ž”÷¢9PÅY̯ŽWÒ  ä'¾¯6ÄÅs6”ëà)Ê~ÂD´ió»ÙOGYLÁæ½PÿÓ/ôBhâ>R¿m3º›°…A ŒËŽýÁ¢A 0ÀSÌk–Û}3ÉHŠ‹ï5M|õó£4u‚q§íGÔB_ÜfòÚ/´Õh¢©A˜,˜úÇsL `´qû2Æc(ºÒÆš_êBk �&Ú�v·ZþÖÍ�hí-Éæ@Y¸S ‡C—yž-¦ÅÖÓîJ[fñ¡Ï¯Û ¤½‚@#Ù( "VŠaOë6èl1ÍmsÌÂìÑèÿûçÏ•Óã Eq…™v[ö…ö�|ŠíÉæ@Y±R G¿E'‹i¡…Üãcý$P?©À¬·çö�JßlÈ�ñl**‹™n¯ýB™‰@MåA«ÄîÉó3ÙÚð÷:Ù̺‚ð^»ã”<‚³OÇ8-lNö&⫪AùoŸê+ë$º~¡‘8ÓöpÔ¬úÝÖ÷Ïϼûóå¾U�ãùÎø�ИóK]èè!ÐD»ÓfÕÞ©;Èu­Y…@#Ù(ÓŽâœÆwÏÕ ];·u2ñu¼)ŒKãÇóJGèyìJ‹+cÐ$¢€8‚LRˆÒJ(¢'´æŽy\±ƒ†@#Ù(S˜”þ,\ R<̤óÙoMj;gž®ëqö£Q§±Afqž±•Xp/JºÇ­…De3«&§1©ƒÓ´ˆæ@'§í hïšã9L:ý•3ÂÅs8œÀáüü'àU{„óì§£ltå}N÷Ëõ6'ÀLÛCH.¦íùš#¡ !HÚÉJpñ€P”‚P‹Ç+¿ÐB ‰–)NÁoxã1%ÌܶŒ�ñ§é°‡_ê´M´;ïV-7̆–´†�ds Œ³®ÂéT»ÓÓµ´Ü,ïdµµ~¿ö"|±“…@#Ù( è§­J9fEh¥EÎ×ýìMaá hŠ»:^µÞ·Bœif¢;ÞKXþ¼zÄ1åžÖíÇy�Ïλ5~!½[ƒ8ÓŒöWðó·\Zwð²LÜÖ—û÷Í7  ¼.é ã:Ëêñ@y/×ãçÝ™–*,+}]•´gg(šU9Ñ…›/] 4ñLBV‘ýÕ.ã:ùíZØvè[¢Ùþ­<~šãbÛ¡?ÏÀA–“vxPÃ/uá šh·0…|ÿ;m”ßíé ­l €F²9P¦…—m3BS/°ªyû±ínýÁÚ�4’Í�2í(N£Üœ¨r²‘Ûù½ÿ~vjfb0iqng Œgb ˆZ‚^û…(M4•¬ s¼"†§b0uqû2jùSܘôÚ/4h¢©”I””Ô ¸x¾¡„šw™Œ8xðÿ?kW—,-®Ã¶2+8Õÿ ëð6¾ìÿõ!t,™XTݧ™ñ Ù't·Ed€©§ ©Å}†Ùÿ­Ê—´ýu;ߊprsÿÓ^�}£/¨#Ý’œââÉ—P“’iëÈ/˜½€3­Î`�z,·^sßHœ·š IŒ•€K;ê%zGô.V²@óîûÙ3��šm”Ï‘2¦Ó”þðÅýé„ô�ÇXa.Éwû€&.dС‚Õ£;k#÷B“¢$¦îëCœ£1*TIí¼%ÀxŒ*”\äz:ò Ž3àL,TðTw9;?ÿ¼žYªg*•të#'»Çä‚Ö"µ¿�G¬òà*WÑ9PÓG¼½È¶¨KuÅO ‰u›3IË¡ÿÖ6gR©€±Â\™O·ÿEÝœ±èÓÐ(V²@ݤ î#4Ê% ê{óù½Y4܂׵Î�'ƒ[ÔIR·ÎeºàÖÎĪƒ¾î®ã—ërºõ¹Ÿ#¥l0Ð(v¾0´Èöo�ÛQ,2ÀÅ sIq'rscò¼©ù½ýžßÛoNÛø.ÔŠ�N&m‚vÆ^Õ�ùŠ3×£L)0·›öK€nÈG´›h+™vww¹’Ð ­«ï;éò“8{¨c�wWÍ9ðdŒ…:Ŧ#j=[Ÿ›7ñwÿ ý¨ßOÔû¶Þ¿ýk�C˜a¨L¹ó‰Tç�`&•œ\ç.›ëÇ„Ë\‚†â«Pá íÇú³mü^À(‘c¬\ÚQ/é2bÇØù5ä¹ù;­K¦×ó?·?4ð"g+Ì%Ä�Þ}eä’h …›ök6­jAB£ÇXì€ ½­Ÿ–îæ¹o‹qF±ØÛRŽb­ádÿˆ^.™Á¶åÚúí´¾p[ö×g*•ttü¶ ³ h�,—#ÏÒð?‡›[5„3 �5?�" Xô‹3ʤi™Ì8:¾tS]XÙ8b Q,6Ž|kþ}ë»±0U¨ëº)‡s\4”tðì?"—m#šXiðã;î`l…´ßÞ¬óA(vU\{üý Ýð'ø ÜøÜY:FÃ1QMüL¥ú'Œ3±ìlŸ~[Ö7’/ï_ ±äÊ0È´ qÇaG¼_‡×€›¿[Œs`ä”GJ÷! ±ËÎM,5hˆ›ûùý1Ã5ïöcþÜö–§ÚdZCL€Ñ"“EÛÒÈ._Õ3Ðþ�¥þ®æ†Ã '£‹Å“^À=¾ÂoþÌ%–fÞ�8Fó ‘ΣÏKúglÙ·¬ÛúÌV‘ðçc¬0—tô¾““˜»¥ã%àâºËÖ"M<‰#kñÇÐü¿ŸLy‹Œ3Š�º‹øa«À'Zuí³’‰Ç—`úñV�³ƒŽ“ÝM‹*6á C§6’×»„%dûng©49Jg+ù쳂ìë|e$- ›t` mi›Pþ=_Oñ“h‹ý$å(ÖjmIRzMøÝ—UY>2·ã ­¼óóÞnF«Ri~~:zÕóã{Ìd 8£X ¸Âa¿Þ¬úýåó㘜Í.Ň+=„•£;7§Ä‚»YÛؼ?ïn>>«©›Å8£Xìf)G±dl¿µ)½¦?3ÿê÷»¾ô™vÑ(øWŒ3Š…þ•ï�ÙñÜõ\/ä‘hÖ—Ècý±x¯ïÑz#ãŒbbwtÆf’�,FûAL&íÕÝ×ßņs�íÕÐ(Ž‹”þ$ÎNš0 �±“õSÙû뱞8Y„3 �‡dqûuWcr¡•CÜžL¾´°w}ÛèÁ1¿–5�ûzj/ü•“àŒb…¹roïHõ�æúh‡'ÞãŒbg“*ÙAÜû5IÈóV޽r§]šÞýÞÓ6Ó‹» +ç ¢D •öÁªÃLªÅÇ8Óª^?Á¯õss¿zóý]õtƒÌ÷ù°‘ê_5¯¯g�ß¼s˜a¨0Søv¦Ý‘hªÛ�²ÛÇ@£˜âöý~Ý}ðúö˜~.ƒk çÀh(åD~€i‡ì²ÛÇ@K¥S•ö3Ö µ$¡þß„Çxî—¯¾%å‚B% ’zJ3¼'ä.V.Ö móq¤*¦‘ŠI€Ñ@ΉŠñŸ”ô¯xÒ>j-Iøó1oÊÒN'ø½øçËF1M\Ë`•ê�ËÇ(Ü»ó$÷µ-Ò§YÀ$ööW~/ˆç»mb;ÿ’d\û%¸hŠ*�„™_‹©d¿–�&Ö½öÎûäzçŠYÚ£‡Ì¯×±ƒï¤ž_£sœQ¬\¡çüÏߟ5}ª"A­wbœ2Ð(§ÊQ¨ö࣓РZ5so·oÍÔ?ÝÖ‰{Ë@£X È´£XÔµo¸B/(ÄõÜk¿J¼ ´&*ÉüxêØ =_Ñh+Yî!ÿþúö8?Ôz'&2�b% ÓŽz’¼tg*¡´*©ÐýW~ÑqÏ—û™o†/+;×Î�š¾LnL%;Ü 4±nêê;¦Su`0r»v‹tŒ†ËNz?ØhÈ.›¨ 4±ÔÄúù «E3¼�D9?3 ž�p·d§ÿÆäB{´Ömë!¯îÃå "n€­¢Í/�tSod!¹j€1ÎÄB©Kî˜ö4lÿ‚öçVå�E½4(øZ˜I6ÄhbÙCCì9×Çyl-îyx¨©!Æ8£X ¸¸�§ìÕ¿ëß4ÆJ@ººÎï:r�‹Ã^}b”1Ð(V2í(–ýºdô‚ÖÀn¹/Mïíx›¡Å]ÐtŠ‹±N:*Xo@.[v„3­Nú¤ÐL}™Èûx2Ù¯$›74ŠÅ;,$ ó󯙱0(ÃMÙ—t Ô¤Aý†oÂïæJšo¯Õí˜çõùäϾ¤yuø¡¢Î(V˜+·5÷¿¼Y�¿¿2ó5h+™vÔï\¿æõ5»p–z˜Î�'“{‘Øb3Õ±_q�hb©ù–Ðúëöªòä=»uI¶„hÓ¶„¶§ÜnB§ý¤óL˜L­ '‰¶ºD{-yùÛ÷&RzYù³1V˜K™öÈSö¤T*•dõ»ÓpÅê ‰ç4øDo˜ïw}á¬ÃüšF'3݇甋ܓIQÇ|eÆ€&–I[ÐèÞ/š`Ú$äïf ÉõGœQ¬\¨Ñsˆàú…òrÅòN»ÊÇ÷§§­2øßO$2¸/çgŠ5~vÛŸ9}ë›ìQsvšÓ­Ï9ðd$0°4³àÙ/Le ÐÄRQ.˜÷®ËÚ‚Âkë’OF#¹Hs žýÂ\M,5�;ØIVmæ'E²¹ÅJ@Æú8ǰÌìÏÔ0™¦Yûþ½¯é<¾�1‚ÂtŸ›sàÉ€"ÉÕÀn‡ÑŸëÂLM,<›‰¨�›Ú¼�0�8£X ¸X«çÖ¿í¬¥É41M?Ì™4âá‡ZQ.©0V.eD¢ýñý7Ê„à C% ’bIçNÒ�\‘‡ùˆÆžjZG ^ýš$#ˆ3Šæªuõ¤ˆã�š–ÿñ³6„L*UøN&qXt¶q:£)X?ÄBc -ÑkY�£Ÿ*ó#4Š•€L×h,ÝÝ?Ò¼âŒb…¹¤ƒXˆ»“4$4=Iäi•#‹h��‘ª*gº»k¼þ”�b% ?ÈŸM/óÈ4±‹Â³¯è§©ßxFÑ_˜Ñœiu’@Þ!Ý]'4¢‹¢Ó­É9P“¾ù؈Ïtal�&–�ÏlÔØ75Ù„Ž6´�@£X ÈH¿çæí¬¥¹4•l0ÁìÞ«γ64�@£X ȼ~OgÜ/Ð0�&©A,7âî�Ì8½‹2ØtŠ §w#EÍ#ž["Aœiu¢m÷÷²§1û%éi“ÂŒb¡\EXyWaôp’ûú`}×Õ3ÀÅb­˜Ì·¸<æ[gZÉäƒÐ@Fmk›šº¿û‚²IÅJ@"0°º«§KȤIE��ù7 L#©¨î\E§¸x$••b6êâé“.3­äMvß®ŠXõÚãÝCæ×´î3ü#åçWg4Š•€,›{iRwY>÷‚ £X ˆ´£Hâ¹˘]�‹°»þ]wÁVõ´oã˜,Š©VÌÉF² †U:^uüÆAL©-›7Ù Vô›bPæMh+ëβ?-Ãdš:í%Õöî°í¦©»Ÿfú�æ¢rkÕ$Àxè–e`àØÁH‹Ïua�&žÎÂ4’î±áÚ, �b% ÓŽb çÎÔ˜^уùôËžk^_lÖ/K6ü8ÃP ¨@Z¥Ç“fêWg”F’_´k½{þ‹@j·_Р.J&7,pŒGp#ýÅ# žý˜ M,5çh$Ýû=¤qÄÅ sI‘6rçeÈ�«,Ú½úü}à7)‹Z¤Õ2ñ¤l$hxxÀ³Šƒ2¡¼l á?÷ãÆ aQF±‚LÂ! AÜòXÇ:&ŠyýîH»]lõ}5`<|˺!Íð¹.Œf ÐÄÂ󩈅åö­=¦E’©ÅJ@Æ»c)„Q;oi.M]å {®µ··W‡j 4Š•€ UK qÔ¯Ð0‘$´†ã{–©¾§öÂx�b% S¼ÿú€±w÷ÀnÍúœa¨TÒA,�j ¹"³@@5ÞîÞk±Diä :Æ#–¬³hÇ-|ŸJ·þgbÙ÷öKxsk4­ î=æ°Ã�?kZ?•xÒ@£X Èóß§ºàþ#ÐĺsÿÛDÚn§šžî¬%ö?à C% ò?<ÙÑ,3Ûéʲh’i¥]ÔÛsÿѤYÔš}9ç¸xD–u+mA“™ïR]œiUçC•dÕsWO68ÃP ¨H«fÅÝé&Ò¶ÿ$¯¿çuáûÅüÍÊ¢ÜkµŒqñ¨,KÇt8ÂeÒg#fZÍ$Q+äwÓ�Ì¢ôì—çŎ2–Fù…ÉÀ™VgêùO¯õ˱DnkO¹àù#Ð(V²@"§Ö¾µ$!™&¤‡žÿžfªoNºàù#Ð(V2í(–¼ý’dô‚~NöTÝ lâä�b% ´zŠ!Þ¯Ñ0ÆBEŸN"´L�RV&f+L%Ē׭Ș‹:7ƒ(ëÅ+„ ™ï¯¿cʨüû¥9ÇÅSÊ|‘°¸TæWgZÕÃé•¶Àõñë¦Wh+™vÔ±ªÇ¥‡ûð&ôÂu ^<××C½»[Úx&U­(ÆCÁá%��xö ó*4±TÒ›3Íïöš$š¾)Ù¯Ê9,¾%Q:žVñIäi„™Voÿz®÷Ôm7j}û£»gH€¢m‹2††Î´1=ÃSëÕ@œieæ“;�dQˆû`„8¹ƒ@£X ÈP‚§€ßº6míNÑ(Æb¡Ž�´T�ü•Fhg+Ìèñ ò.~ƒöG'¼» &£ŒìWgŒ“CMJ“AžýÂ,M,ÕæùݦFÃÑ(àܪœâ4Ï&9ò sF€3­Îd¤gaØôØÜžh¤MôÌ0T˜)м âI²�œ$„b1JÚj£íï¿¢ydÔL]9\<Žê/ÌqÜú<ÀL«2�æY8ž›ÚX>³+'™æA Q¬dÚQ,ÔÚYQèÕw¯Ýø÷™]y§é~ì’À€ÍÁ1}§*öû‚@£X È”‘"ŸëÂHM,|40ÓÎDw—™40ƒ8£X ¸´£P­Á‡&¡dg6µ³%xw¯I§vg+—vŠ¶ßš(ô‚ÜÌFcj¢ùñX_×za4pF±p{‡)†•Z¿BÃdšìNëìç¡Þä~aZpF±piG±Ns™„^}ù�Îýï»ë�çñK§ éÎ(V.í(Rjµ�=W}^ÐUÖùö8~6if´Z_Í�Œ“î&t\ª+:4±nï$áŒK%˜n¯cQŽ Q¬d�̼¯ ìÝ߇cã ßÚ Ãýx2>ã¨/ŒÂδ2i†'Jv’N≣(4Š•€Œ•o ùI…&iÝIåÂX¬�IãUæiÁÞß=s7¤�â­/iŒ‡´Y ¦;.Ó…‰À™Xuÿ5¿¯‡mwñµa œG5ÙgŒ çÅCaJ.ŽZŸ‹˜iUúMy-Ù–ÈýÑ“�¤Î(V˜KIÙI~/fGRg+Ì%ô$mí>!cò\¦ƒöÝ®-ø9¤ ©ƒª­Õd¸xH�²0�â2]˜FœiU÷ßåzô·ÞQ~â­ IÛ¯Í9.ž �Ô1Ï‘8î ó'€3­Nae'yÖm® (€3Šæ’:ÄÐ!©ÝY“çêœdæm}0æ¢ú>‡Ãʳé [A ðd6�Äh: ã2]˜…œ‰U{Ù‹Ó•àxíÈîùØ�b% SÆ>*ɪ '·<éØ�b% „xŠy’Äí?BÃd‹õ2IáÛ:æùîÑÀSá q[EcÜÉÄ7Éea*¥¦šÖ‰–W;mÊX àŒb…¹Xtfˆ'ÉÉ~�F™ +ÓñlÊ~¾Ë—çÓ/M6œ8£Xa.é 'éI÷q“çÒ4ÙÓ,Âðë–#›ñ8ÃP ¨¤ƒž$hÝrŒÉqŒº·®”†< Šv«(žLBGò˜æH<û…šX*ÊÍ3?oÇh Ïcƒ�ì×e<™Ç&UšNÅøT¦bhbÝÔ¶ÊÝ­šÚ �b% ÓŽb}ë>¼czE,£ÞÒãt"?ƒÀm�q'ãÏ$–ÁÕ¡—èÂl àL«5q…¬Šðùé!Ýì3HËnuÎañè3‰ÔtZÇåчufRÅÃɘ}içÏR28ÃP ¨H/ˆ×. ¿‡Q†£Ç pÛiJ€'£Ç‘\ƱO®�Å ÎÄBÓI��dZŸøè JFAg+éÌж?KÃ\š3i<qF±p�ÚˤãÚú¤‰$Mˆ[ö4îÑ2uRK›A Q¬d¡úK0¬¨Ü�’iò,]Ù3MëµÈ³_£lt�F±�iGÈ´ŽÏ¿`Uz+Y G·môE‹-ÈÇzwª®+éPuµ¤h‹%¢ïW0ƒ²§én~ÓfWg*•tËÊ~9ÆäŠD™E(-Ñï�zâä �b% ÓŽ"çÖdÌ.(B�Wõ½ò›â¹»ü0} ʩՓàâácRaùôŒOuaz�&ÖÝ}‰öÃ×Ó~~&L"ƒœë—g€‹‘iÈC0žüÂô M¬¥çYdØçé Ç$2ê9·(§8IR¶MÄøLú$ âL«UèYþc•eíx?�â²­ÎF³HMfzºú@�™P)*Îýø^…á82jÉ~EÎqáò°—<<�r­-JŒÇ�Yûј Ízø\†DhbáÙ˜ÈÎ1ß¿‡iªÍ‰ Ð(V2–y9†õ[Ú†É41è¿XŸýí޳’Fíä>C§8MÀÅãŽü¸ àL«“D \,$Ï©yâ à C% ’b½ÖNJN®h?'¦vÖiž:“ æ‘�Rêk âadÐ\ùÔŠOtaj�&VM"ï»¶ùMó´mFñÔ–(j .ßðìF1hb© ôäwc=Í$£‚s«rŠ‹G’Y ¦£!.“>0ÓjFÁ·C¦õWãÞcºé_Trýú €ñø/ËÂt2ħº0‚@ëöCŒ0a±�Q,rè~ Gk“€3 •€ '3p¾a'x}�áhi,`†¡0)C;I{œ€6уÌýw Hò#X³ÕÄ)­"þ¼¬[8ßëèÞãÞ ÙÁ´-êµVLŒÇmYüå>×…‰ šXx/ëh‚`'øÖw]=@ Q¬dÚQ$Ùú“”° ò�¦vâî2šÍæ :Çž‘þáÏ­` ÎÄ:½´û¬ã㛸y¸aÕnäeR[‘ÏܲæJG0|*}q&–�Nì$ýÍ^Ú´�b% gŠaןµa2M¦fÿw{ËöÒÛ_ÝÏ�bö#Ð(V²@_¥–)µ$!™¦y»OÔßR$Ùýˆ3Šæ’"�Ò/Ș;—:¹¹_ŸZÜßN/šû4Š•€L;Ê뤶 u"¸`»•¼ù=Ë´\B|¿ýjd¦>�b% #‰UóÃý…Ý0'ª”~iÎPñ$'ë�|¾ Kta¸À¡L©×;¢ÞœoŸƒßmUš©�8£X ¸9ó®·ÿw‚§'Q%´“4ÆIB…¶£É§÷ytq¦Õœúû;Ç|{·;x4qF±Â\�²É ¬YúÓ5J%ÉŸ¡¹ÿ}ïwÝßÚø¸fî#Î(V˜‹EÖ{fÃñ¦4§DõÔÖ&Æó”¡#»Û³_p÷hb©(«ö…\~~C$0Ô‰z©_–0žêdñ•ü>‘êð#ÊÄ’s{}í‚_'h4{p†¡P¡ÀËŽgåV‹Éóh*�ÖNÜ èDåä*:Æ�,ÃxKìsŸê‚ïŽ@ëÎLî�cúÞÚ»éD“�F±�Õ‚¦ÞL1¬ðú³6L¦ÉER_¯uõ6UÔÆoœ²êJšý§(AÅ�6Øst÷ÓhCˆ3ŠæÊý÷FÑé/ÍG Q¬dÚQ¬§úÓ“Ñ â u×ëoÓ˯÷16SŒ(¨ZAc\<ÄÈâ,7Ü]ª ~;àL«zä¶Wøz¯ øºc³`†¡0×hï�æ’\f€†JÀÄ0C°ªê>6ÃLšBK<ïï³ÞŸ?ßÚn¾ây#Ê(V�)Ð\cë©ZL–F�e¹Õ]´ïDŽfu#Ð(V2í(ÒsmAö\¢ªÙy‘q÷ó]Ý]* W\AçÀxX1Ô>è@{rÝmGœ‰…‚°ªˆiùçûÛ#ºqFTLýš €ñ8#˯Üp÷¹.î4±pÐÏ¿ç³vàù@À° ƒ¶F 0–c•A— ΫõyDƒA&œ¼;Ç|®oÓ¼`ð"Ð(V2–5)„ôA²†©$­ÑË2H—,·­Ù¿ŽÍbÉXEœQ¬0—b¬6’®{KÆ*âŒb…¹¤ƒH§´Ó#p§Š'hÙ+í´>VÿÕÓvcj¨ úzÀxL�…FbôúDŒ^šXuîbÖw²º6®¹˜4Š•€L;Š•J-B£dª‰�xé¬Ï·#>ÆÔ°E»‚Nq’JP|Ô%S½AôSЊòÔGE Q¬d$-R7è¶Bi*­Ûû}?²G÷D«÷¹O,h¶*âŒb…¹¤ƒ~-øõ©OHêW$!Ç5¤ d¤{¦ßûW@F±Dù,PÜJ h•C»�õaÊ[G:­›CiÒJI€ñ<뜱¡ëÒȆ. L,˜Ã}}lÃÖQgsP(j=)0„ u{ŠŽýŠ� @KõMº¦õÉ'íx}ÂæÛ¯É9.}âF.8–}ª+Ž¥Ç™V5nmï|÷w<Ò(J�¶@ 0Å uÛxŽýŠU @KÍ]ÂJ2­#{E¢K@£X ÈÑ�bX ôgj˜L“‰7·,¦ï�š5ça†¡0IqóoË!� BBðkªå‚ü{o+"Yƒg*•t÷ÿ~IrAKÜwÝýûÈ®©E{Þ~þª6ºésë­í w2~\’اºâzœiUƒzØkGo °@tksŠæ¯H^^dŸD¶"=È„baóŽí³ûßmoî·£Éw Q¬d¡¦J0¬SÚiJ“i¢'µo« X"÷uwà‚8£X ¸A“bHªÔ‚„\’ìAESy{ÉÁ#G ú‚@M«Ä^�#¿à¼ÎÄBQϬçlíîÏÎãÅ)#*mQàÉ ©Á�s¹®˜p4±pÚ>c7«²ôšBsÁg+Ì%D‚©?M w*½rî¶^×lϘ¾n=2€F±�"+Å�|j ”æ’¤IŠJ<}>ŸÓq'/ú‚¸“i'©Iè]1 hbÕ$/*f~¼aä´Ão…íЯÐg uHfÖGÏ¿»7¥‰!�b% ÓŽb ³¡Ñ+‚(õâöTk뽎»àÅ!Î(V˜‹uE a Ó¯Ð(•¤†H ’«µdzjvfeæ†!Î(V˜‹tNŠ`ñÐÖ'Ë$é�ÜžÛ3­/dÝëÑÜ9À†J@EŠ'E°lè—g”I“ $.ÈÝZR=|g×\1À†J@%ĺ¥-IN®h ��÷s?eÃ6 \AçÀ“ ›H„�ÇçÙ/˜ƒ4±TßÁwÄ´~Ogj 5÷«2žÌÔD}ž|=Ï~ÁD ‰¥úÍFrÕ>Ó:ܼ9fÏÃÂUì8ÅJ@†*¢!–+÷Ÿ¥ “=(êYJ�ñtk ’Æä·ù\Œ:šX8hŠú*É¥©NÇHM¡Zh‹”ã‰#–¹…ès]°hbá(,vL÷J&ôAÉЯÒñDúƒ�5Ï~Á º•Àâé’©…è]pgZ͹Q¶�ÜW¹¶b[=ŠO8ÃP ¨¨�gî�íde‰´nëúèκ¶µÏÔÓvƒ5Ø ûrÀxh&ê¶äÀyrݹCœ‰…RçDÿëó]¤­³=�³šøfˆ3Š•€‹´EŠà]O’�Jk÷™‘·gšÄ×™U‰‘‡8£X ¸j=s¯,RÌñWMKgú™­J2Œ•€Œ•ÅÎ<ßÇCÒh%C_ÒO±þHìEŸHwgbѹ™¶°¼ŸUÜŽ�@ÅLC Q¬dÚQ¬`Úiè9ä”ÅN;ÍÏãÆ~œÑÐWs Ç�H~äfžO¤›yˆ3­hÜäÚžõ¸uû·3–ºÉ P my\<(vÛ<ù?�&VŠ gÇ,‘ã`4�Ú¥_•.N"”º‹>Ów�&–íUÎg½Fnï¥C·<‡t¨ë“á$õlý‘;ç3é®âL«Oƒt· ã¨J·@§¸p )REìÇynÝÇCœiu‚ÂÙÓrÀ§Gt“A¨]ú9Ç…“A,ƒr[ÑgÒmEÄ™Vuîâ­)>µáßzã5sñg+Ì…â&°liç+K$) ÚÄ©¼«:˜^˜]BÑÒ4ƳK¬€à"‚ŒBŸé‚È@Ëö:ç³ß¼´,ü³í;Ãàj†¶@ 0ž\b’;Œ>׋�&Žrç³ßw;ž0MsC("úE5)[‘žý‚³ˆ@Kͼ¼õ-0ëÒv/瓼<ÄÅJÀ°ÃJ¦�§4™&‹hOMº=ÕªÞ¯~�sqF±piG±€éW%¡WÔ �÷z¥óîoئ &µ¤¨©Áôô©.˜ž4±îÌoÜ9¦Ïcýú\ðh+‹Ÿò¦?kÃdšFµQyWEp›zÞ]Öü dM_Ðh‹5t÷õñIïßÍÓ<„M»•3„Å£Iaÿ'7°ç¾à~z˜IER#ßóív|it t·\<ºÄÍ>õ=]¦ ¶'àL+:w’ǽ6áï%‡�F±�±ÐI!,Ú)KsiJ$µ÷TÓôh¤’݈0£Xa*–<‚ÅL¿>£L’."yñÚoˆúm{àô ‡ZO† “B ‚N §–MO„™Veâêí Ó²þ¯+®âŒb%à ZfŠáöÜŸ a2­×û-¸W½[ìÕžŠÀó:Mª,‡¼]9c\<®ƒ\±èÈ/X�€3­ÎÌÔk¿»³ES�F±�iGaCv'%!O{{îâ홦õgº_’ÌÄœa¨Tܶ·—/�ôÕì ž ‚†Ü–'ÁÅ£AÔÜsKѧº`)"ÐĺIJTL¿…@sB¨úEã9¡Pp�çÙ/xx4±ÔÄÃ[(nëÅôk’‰‡8£Xa®@Ëd–)í$e©$Å“ºx{¢µ½¾îÝúd.âŒb…¹B53†°Lè×g”JR¹¡·nÄo wj·Èh†âŒb…¹HÝdÖ-µœ<‘$�¼’xîw­o~æq!hÐ}1œ$b‡Í“_0hb¥¹ƒWŸÇí¶4 �F±�‘¾I,\ÚyJSi*ˆäEežÖ»XÎÆ–@8ô pñ؉�Ôcô™.˜Œ4±lT<²öû糇t3B¨ú%ã!!–!™­ç3]ðõhbÙ¤x¶û4Ü^M-¡Šhk”5-Ûmžý‚½ˆ@KMܼ�b}y×üèëÉÜ<ÅJ@hžÃòª?OÃdšVCÙ³|¦Ü®Í ¡œ©õ$°xj(TFdµõÜÌD3©H�Ûñë›±ïÐM¡téc€‹„XåžKuÁÁœiU“$%l!ùÜýމfž!Ð(V2”])€ÅL;ci&Måf^ËÕí^hf�b% ÓŽbEåÖ%¡äÊŠJ<-œŽ ¡^è+ãY!¹�çs]0ðhbá´—²=ÒakôÏÀù%” m•`<ÀÄú#ó}¦ ž"M,›¤NÅô»/43„ò¡_£P1©Íéòè6'ÀL,9÷«ŠYDÁBÒÊQlF3 •€ Xv< «v¦²<šHc­s{ú]ò*¢/gSt̉ 鸯8Š4±ÐÜÂÛF7¶E½ž­"ÉàQ¬d�èI1$gjEB.I ¶bMÕo"�b% ÓŽbMÕ/KF/4’:÷õšbÛîøx‡ë7%„¦•”ã)!D‚ÃXsM«V¹æ0Ð(V2>)„åC¿HÃ\š�–^yçû縟ÄõêA¯î �bqãOLØíÙ�KàuÜ&¢™°€3Š•€‹ºùŽXìó@ø™!hÔmq†°pf(êøìb:fÝü˜IE’˜¨ˆiþ´ç©ò��× ýjœÃâ!T¹õéò\°>gZÍ('¶aE·¿ÁKЦkA)P ’óér]q>hbá(0*d}ÒçÑCú‘%Pý" €'CK$CãÑåºâ<ÐÄÂIb,ÿ9ù�íÐV)žŒEB„�CÇ~Åq ‰¥R?¯˜iýrÞ{L?Ã�º_—ðdˆ‰º~ê:ºLWlGšXvf<ÞÖg£o nö¯h<Î(V˜K:ˆ[s;EyÞå¡ï¬Ýõ;�0Aot圵þ|âL:ö+>#M,UðoË®çÿÕד™Œ=È| 0ËZÇý÷eúëÀ¯gwƒrÆ¡ð(Žâšež×¯Ú;±G™”€&ÐWc+•ßšŒÒhšG0o~oDt{”ù@ h„CXŽ ‘ Â&wéê-¹KäþwüÆ+&à C% " •"X‡lå™4Mƒje!~=jß~¼{æ~T @«(j:$u1}"ÙÅD˜‰5£lÙ1ÓþÞÖ`N z¿:g¨“))R‰§ÙeÑ M2¥Öħ«›:N¥h>�b% ÓŽbÔ΋@¯(*/UïoC€§£ û»zNqš 6ôÈýs©.¸†€3­jÔ,;dZ¾h‡ég‘zAÒ/Ïu2ˆä¥Mj`ú< LšX4¨˜2ßžm¼�§�z�Ò/Î9èdÉ+�Ü·ty.Ø–€3­dT2õ©anë„'‘z•R×&E�Œ!‘Þ!ÛÎS_°(hb�cngXߣõþöå$>âŒb%àb�•cH:õgh˜K’a©1¸dz¿ÿs%7f+D¥ÃÒ¤­GJ�kœÜ€«ƒÛK¢öG^kâŒb…¹PÁ¤�'me²,¹ÌqfgÜ�ƒBâä_ NúRÀxö‰•í’µçs]ðhbá¹'ØXºGÌhž �b% ÓŽ"…âÎÔ˜]P;©XŸF½DîǸæ"Ð(V²@Z¥Ö)u�„dšèÉlÉ=Ó|ûÏ ÕlIÅJ@ƪ&Ç�^é—h˜KÒ>™3Y¿+n—Dó&h+Y ³R +˜¶Di2MåŽåžk•·ãs$X–ˆ3Šæå•Ïšª_ŸQIž¥Že½UåÝ?üFs,h+™v먶(½"ÊPñìÌëû¡Úµ;MA¡–éKã)(F©mêS]°MhbݹG¹¾¹é?oó(¥‡DJ@¤Ã¦�¡”Z‘CÐÒ+í~›v¡Vý/hÕ]9\ªð›0BYÐNLŒGŒXc$¡O¤:„ˆ2±dr½ß¶Sx×'uée+i™Â"¥?WÃ\šâÉ|ºúÆäí}Qm¸[òég+W kR «ƒ¶Di2Mj�uX™½K3F^ô `ñ„Q 5ÈÎóܼKšX(¹…ïý¾ ßMÚ4SM¹V”ââ‘¢¨Á{;Ï3«†%¢L¬Ño³½÷{î~Í”š° ÷«1ÆÃJaG'Çϳ_° hb©‰U¸n¬|ê¥ñ}rõŒ­BÄÅJÀ¥ER ��]��bØ9§×ýoþy0Ý0ª�¾’3T0ÍÄ¢"·(}Õ¢D”)õ¢Vh€ù½.æøÍ5¡pËr‚ æšXNdÖ¤Ï!Z“2¥XÚ¢z¯ß±­kÏáPÊ‘¶&#T0±ª2ê<¯jC"Ê” sÏm§è^ò¥ynˆ3Šæbµ”!Xõ§f”I’T('ÉJ«.Ø;Ї@£X È­”bXƒ´%J“i‚&sâöLÝMÜŠ‡(£XA¦P5�,Gú¥9O#¨¯W^ûýDÛj! ÐUz%jJ$vê<ûo�&– zeGüÞÍM“D¨DÜ¢œâÂI"5hK²³ç3éŽ âL«º/õèiYÍ·3~ºI"”ýâ €ñ$k‹Ü ô¹.¸�4±ðÜ|ÛÖrkõ7wÂï `†¡ÂL¬gk•vÂ’<’ê!I³Ñzƒ¦‹P1tå pšf‰ÍBG~Á÷œiu&&[}±]ÿ¦1ÑeC Q¬d�ØJ1,£Ú9J“iš õ ™g{*o (®�b% ÓŽbõÔ/KF/H1P4Ûåævûôôn¼0ê„j¥”ãY'–>¹és]ð"hbá$DÁCÛ9zq¡Xo3Š•€ õV ` ÓŸ±a&M‘¸x®ûŸÎp¡™'” ­¤O3±¡†^™§UÛ·=?8ÂFÝWtŽ‹ç�¸égv©K¤»¥3­äÄ›ÜÖ|wÅ$Þ$âŒb%àbq‘BHÄôçj˜JD‰7Y?�ïî½íš7‰8£X ¸¹“bHE´õIsIŠ$±÷<ë‹°^÷~}2‹�F±�b#۰éWh˜LSI©7WÑ .�âÍ!Ð(V2í(–2mYzA‘ØØnµ[Aòêy»™lÙ}A`<ÓÃý?w}® !M,Ñ'�&V�Ú~ÛCßý䩿úÎ0T*é V5íåäŠBò]¾Ò®wr¿zÖnvºwWÌ9*"�û�}¢ n£‡™T1ê�jݺ6MCL($Úâ$ÀxD)R%lzö v'M,5sövŽiù„µm]ÉÙCœQ¬\�ÈH1¬gúó4L¦‰#¿‡–]íˆKäq<°C²úg+Wnõ¿AÍêC Q¬dÚQ¬`Ú9è9„í{gžž÷öv žm¾ܗ4ƳMÜä‡î£OsÁ}D ‰5çÆ_•hÛ;°ÞÇ7]1þh+ˆ‰À*¡ž0!“&9rãoÏÕÍ™j¾à C% "q“"Hµôë3J$ ìæõ¯[oÂî¶\a É7êVN‹Ç™°ç§~¤OtÁ�D ‰Uçæ_]]×Ü5ó�F±�iG±thçI WtHn¯í¹Ö{�ŸWì5ÄÅ s‘äI,fúe’t‘ßvÚ¤½S8˄¡“áÂ1¥Hƒ°eç¹u«q¦Õ™Y}ÅoúB³úh+™vË'Z†ôŠzi{šuï`šú%ɼ4ÅJ@È­ÃÊ¥_ a2MåvZË5}Ž›Ò4? �F±�¡ÀI¬¤Ü�2i²Œv?Ÿ}6ãv|:aª¤K«(ÁÅSE� b§Î“_°øhb¥©£¶“¬·_¿}E™£†@£X È©•bXµô'j˜L“@´}²�ó8y@sD¨ZZI 0ž#b „ò˜œ;Ÿê‚å‡@ëFaQ!ý]Ø4Ú„¦_£0mb=”š�>•nB"ÎIJQìÜf/h´ ED[ ¨)™ØôìŒ>šXjn¬m¿˜K·û\óÕ<Ì R"'4²ƒY?Ô:ÒšIý½=ÑÒònÇ÷[±÷g* Œ¡_žQ*M„P;ïw%ýš ì`“l%@­UÇ®¤g¿à0"ÐÄR5‡qgš�õÉFÅJ@Æ:c‡üÞmųD( ú³5ƳD¬FrƒÑçº`0"Ðı©£-V›í¶á°;Œš�†8£X ¸´£X0´ó¤Ð êcìéíyºÎOQF±ÂL� È ,úÅ¥’TGnë­[SO×ÍE[�F±�¡ÄI,j=B&Mƒô ½’NÏiß æ "/úRÎQñüŠ�ÜÙs‰.{€3­fjŸõ-õÝÝ<®ƒ-©­OÔ#n}±;æ3]°ÕhbÙ¹­¶³L�W{m«h«!Ð(V²“îžâ¸m÷§n˜PÓ‰™Õ}_Ý~¡bf!Ð(V² ·§nÚn‰FÉ4�ùYõW×Û? aF±ÂTÒA,ÚŠä¹ÉµzìÒï¾í)Q’£†0£X!*RÉñ¬ ÚÚ$i)B]ýµßDök†4'ƒíº/gŒçdÂÞOŽ˜g¿`¥!ÐÄRS窺Ýðûºd]!Ð(V² ©§j×µ"!—Ôú7mÏó]ò|�o”b§!Ð(V2jéäÕ] ww_‚h$!Ð(V2í( í$)ô‚ú›xeŸßöN=’AÑЗ5ÆC2¬@r[Ëçº`k!ÐÄ©Q|§¿ÃP,$À†J@ˆŠ ÂúÅ�±A*M åŽÖ’êá5…dhÌ0T˜‰N`éÒ'É#‰ hçé´¾Äçðâ`<UCWÌOǰÉ=-—ê‚¥8ӪΠ­å7|¾ûî®Z4Š•€L;еC-B£„Hêaí©Ö[monY2 �F±�iG±€é—%£Ô�—�zËv×÷iDõB«'Æ32¡ø cɳ_0Ïhb© mâwwMê hñ«r ŒgpX ¼«=Éô˜ÛCò$ï aF±PJ"ŰDèg˜LÓ©µ¤zn ÷~HQÉ¿BœQ¬\(mR‰–¶>i"I‘”¨ÄÝc·x2TB_ЦDŠƒÌ.O~ÁÐC ‰•æ¦Õc}×ÝÒYŸí5ìªi@£X È!‘bH"´ó”æ’äª>¶}j¦¾9ˆ~�b% ´MŠaÑÒ¯Ñ0™¦€PVl]e{Sâ|AÔ µ¢O¢°øœ,—늕@ Ïœ£J±¶ä×ñå—œ#ÅJ@¦Åê¡?O½ E†öÕÆ¾÷cS2·¯e+ĤÃj¡-EN�ÊêÞ;ëô>¶åqû²«æNÃp‹ܳûßý[Ï>ÇÉ‘Ü3ÅJ@¦Å�°­ŠB/´Õú3·ml­ÿÒÎÕÊ>ݧã&C>i+|ÿô#f)0>A2Ù5sù®¸f4±xÁ¥ÚY>ŸcdRt©h++žÂRÆ�»Q.M¡À¸­ßýhòP (‡ZQ <™w‰d{`ŽýŠy@K¥^1ý­¼<�¹_—ðd8†Ú|j¡¹LWL4šX¶W·uóËõdž�©Ð(žÌÆ�îŒ=—늱@ ¬Ê2=_,ÀÅ syÁ“Íb¦?a£,’.‚ ¶nOßáEÛÈã C%  $Ga)ÑV'K¥ÉÑÅÚÒM�ÛúFÈ+&–džJ@%Äíº[–Œ\hý¹Kt[qÓ¿TIt‰g+·ôÂê¡­PšK“"ÜÒo°}ϳ0Ð&ûŠ@­YÇþ–#¿àWÎÄBÇê9ÿ}×Hw[®äX!Î(V.Ö9†ûôV‘’LkúÁÆØ>{®oýÈ]ð‹h+™v7ç~]z¥ÓãîÙ>Kª×Öë¾íQª¢_„@£X ÈXUäÖ m‘ÒdšøH,¬=Ñ·~ê.XX4Š•€ŒÛù‚¹¿êB{–ÏÆxáÐV(Á� ½ Éì,Ÿè‚�…@«ÎM¤�ez<�+ÍDB Q¬d±äÉq$fú7Ì' £ÄHjy¾ÏöboÍHBœQ¬0ËŸÂÂÆ-Ï •¤‘rck½xûßkÉØBœQ¬0‰ŸÁŠ¢®OžI'^vì¬ë-«SoÌus)((újÎqá\ k“ÜÞò™t{ q¦U�›I Éûã5‡f&!Ð(V2í(V4í4 ôŠ<¢_™×w Îg“2¨&ú’Àx†¥Ij²ùTL6šX·×ä -�o• ïcw^1“h+™v+švšzEa[ß™§Ç{}h[ÇÜ «`¿îKãqnþýžÙU>ÍŸ �&Öœ{]ëƒ`V½ûý®=é‚Ù…@£X È@bäõ„ ™4%BM� ¬=—7jç �F±�q[O!, úEæÒÔˆæÅµ“r›?š‡@£X ȸÅ/˜ÏªáÞsg·ÂP 6ï¶R 0ªa%�š^>ÕÓ �&Ö�š^;‰WŠé…@£X ÈXåV8ýi&ÓäRn�-¹¶Çl<ŽKÍœa¨T$@R ‹¶@Y&M¤8ùQY¿ÛÕcGÚ9M¨*ºbÎañ˜L$PØ�ê¹/¸ofR‘CWi�ßïõû{8Š­„@£X È ”bXM´³“&Ó¤ vø�viÁwÇZ•Ä¿@I¸rNqF±X•ÐæØçoÚo,›f¯ÁÆ]+J�ñàL¤È8óäºá†8 7´­v¢éþ³k%» qF±pÅ*#DZ|èO×0¡¦EHeìÌŸÇqÿ�Ö`³v%�ãÑîü©çS]ðáhbÝ©·�¼_~W\óáh+™vk˜v¢zEåÖמk½·�ihÖ�b% ci‘BHÃôk4L%é!Rƒdf­Ãœûé¸9ƒ'sÁh+ª�€:¢­OšG‘$¹ÿµgšž·ö<Íþœa¨TNþ¤G³¬é—f”E“HÔÛÛ Þ�çj°aÖ‚2œÔ³c3ÊsëÖâL«3ì¡¶^87i‡“4زûe9Ç…C2Üý5«ËgÓ­.Ä™Vyn.=÷šw¯øÑÜ%ÅJ@F]=‡p»nç-Í¥õþÔ`ÚSù®®8L4Š•€L;Š5C¿, ½"@¨«¿ë (¿û^yÄÛu+)Æ36Üû3ïÍgº`¾!ÐIJ©­“_´³tm]4šh+™v‹†þDeô‚ÉÝ®%×më|Ïn]· �F±�ù–žNº¡­OšFÒ ^z‘S´¨�õ4Ô…¾à0Î0T*Å_ª$Ó}é­Å]ò0ƒH ˆNºh‚âîX J“i�–zhåýÌ�‡#þ Œ`oìë9ÇÅ#ÜgsÉå¹à-δ’S繿7ûè�¢‹8ÃP ¨¤ƒ¸-·Ó#� ->÷kjªõNÎý©7¢]8ÃP ¨¨ifn†Ýò i�5÷Ežûë²»ß?ÍA Q¬dÚQÜ�Û²(ôBwÏÌ�=Óú޶¶ý&™!ˆ3Š•€+há)†{s¿DÃdZ£÷móYoÍ© ­Û¤ïÆC !ÖrR\<÷5W°Q<µl!ÌÄ*Ã^YqÓãþ÷zô¸nÃ÷å~Q°x[|nÔøLŒšXöبYêÝ�öÌͨAœQ¬\�˜H1Ô˜Û KsIMû÷s¿�é×i0:s_ÏÏ…P—Ï�,Ÿê‚“…@ëÖ›…é¹ö¾Û´>ä‚cƒ@£X ȶ²î�ZW÷íO`G#¿}ú�9!Æ s).RKõ~uΨâ"!Ð(V2’?)‚d–[¡Q&I²á÷�L˜µÝ}|ÑÜÅJ@²ÃJ«­QšL“m¨…*ñzëéûdNUN_Ð9.œS ù@ž[÷�gZ�^ú<Ö§ - ¶ÉíõøurS'ÛWô_ *j9)Ð(vA¡Üþ^ïÊþè•Fª¿g;Ó_ôçà„Œ¸ ù„L¸d~yfÙ3C˜ò·Z«"Ö½Œï1”s:(¢úõã9Vd#ÛÌgÑm3Ä™X1 ‰Çú>'÷ƒIã(¨Úò$Àx%”ämyö æM,UóÎv¦é¾4ϾªÌ;œa¨T±”ÉP,œú³5ʦ‰°Ô§j™ÞËÏäíQâS!Ð(V²@\¥VMn�FÉ4 †j†Ì§u„nöjFs­h+Y fR +§¶Hi2M†¡š©ÄëÍ·wç½uÓ1¨úŠ@MªHÖžËuÅÚ ‰…{�sÿ›kï{;¥wÑ gÖr2œÖ¶ƒO;c}ª+ŽšÇ™V5õúûªM·×ÅíwÿÓ| öͶ@c\8Ã-xl¦¹$Ì4À™V°dÝÿž,YF3Š•€ê¤Ç¦8êží”¥ù¤NœûX{¦ã•-¢�åa†¡0q{ÍÜ6Ýê 2i-;¹A÷¿Û~pw«“¹H€3Š•€K;Š»d[…^h¹Ô'*ózÇæñQÄ� øýï+:Ç�Ì[P/ɼ¬>Ï+ËÃL«˜z[A·õóæ.ˆE €F±�iGQ ª5hìy;l£šj}=Úçšm@£X È|³Jç6Ô¯Ï0�ÖÓÂÞPw;¦ûûèr8r�¨5„…#ÔÒDÉåÒm$€™T¶à’ìŸ×ñS¨¹$€3Šæân•!¨+ºó5H¤ôWlU·uvÅýÜÓÈ4¡VÍOSDýŒMÇ}Á4œiujVHå™n�ÎV¬ÀÅ så¾Ãc^Ÿj»4”ï_o«e¶À C…™¸�gj‰[1y¥·bÛÜYç÷»=|}ÿ埗?úã>¿óòø�æ@£X ÈbŸdg÷›ÙŠç�@£X È´£Xô+‘Ð+2#5^vo {Çšè¼ Ð(V2Ö9†…B[¤4™¦:ò�÷%×cÕ÷o{$‘¸ñŽ@£X¼ñõðÇí¹­TšPëõØÇóg:n/áù èЮ¤sàɵûÜx̾qiž€C™”€†Úxr<÷Æ}a’,Z— è¶Þ·×1¨Áã Ð�z¨“Ù†¨Ãâ>~Ǭoþ;�)õù¶½þ¾ý=gwøoxÚño ÎAñàõõ|·¿Ësa«ß¡L)—:ö´Þþð^ß‘þýô˜õ}”û ©oÎmaR Q¬d±°³{\Ù×G Q¬dÚQ¬ú•Hèq‘š {ªõÃû%s�F±�;Ű:èi˜L“ø£¿0/=ë=¯cì�žy^[dz/iþÎý8ÁÅ senÇžfýtì?µ’Ù0ÃP ˜ka'Y/Ï?S_Oæ- Ð(V2í(ÖJýJèá¥íá/ùîÏîºï)îá#Î(V˜+îÓ º`[¦,UÞM³-üÇw½ ué$¿ûb¤-|ÄÅJÀÅ3Ç@7¬K#dú*5ÍJ»>ŸzsËþ‹»>Bsïà¾?úz@£X Èx߈l‚=•ûÝQìÀ†J@uºBçîÔý�Ri]ZéÂû^…Pw™âØ#[A 06Źá¦þ‹O¥û/ˆ3±l¼f©�ùó=f$¶¦4>mηL¿Bç8ÃP ¨ �î¤ß: ö#í‘nÄ Î´¢‡®ÇútìU4ý6«ËáÌJ@Ãâ"°dh§hœFQG_ŽŸ¿þb”F°WךR`<,5~6D<û�&–J½sÇü^/AÓئݲœâÂñîø©áâéŽ âL+ø¶‡îoß¿W¿©ÜíASl«3†Å¾Ð_ÙqÜLÀ™V&öÊŠèïÞC+[N¿ ç¸Ð‹çî•>‘ìp Ì´šùÓòœ«ãðq zxØË“�b% S\Ÿë‚ë‚@“ ß�úÖIÓ�ë¹{ï6€Ý¯_—Ð(vÚJ‰‹Ç6Ä"´± ."‘1�×z7Ñ–èáºd¢cg“” »Kþ/¿`K!P[ÅÚYÖ�]3�h+™“Wùá �ú�Ï0‰ Âü[hÒõ6ˆyúžhí€óôn›7;ÁM“ pé«:ÇiêIõÇ\º öàL«$Îã½�ÛߎçîÓŒ Š—ZO Œ‡\X åv�ÏuÁ®C ‰…�M²�¡Ó<‚G ÃP x‡¬‘ÌS·6©C†(£X ˜ų¿øõø›>mKÓ˜ ˜iŸž1.œ0a]4ôÍ|Ñ7C�iÕænÕN2¿?ë¥Ø· �F±�ñ‡8…°¨êÏÕ0—¦ÐN©ó£ö\ßz§Æ# �F±�iG±‚è×%£äHî]=ö—&ÿÞU&zW4Š•€Ì �ôpÖ3m�Ò<š8Ê�´=×<­ _ ÄICœQ¬0—tª¿( y*U°ÇEÔ²|õæŒg{³“è]!Ð(V²¹“âHÈÔª„|’(’¼«õ“¶5ºÛ±g+˜Wˆ2ŠdZëÙ—èÙ¯ÑÃݺ­Ð8“Ðô¡}ÏúR�ƒñ7ë�½ÑÕq‚ f=¸ÅæšÏ¢zhˆ2¥^êR¯¿çÖÙ–�‰s˜\Ü£ÛÊ$@£ØiÃ'?γ_0òhz©èyí0¿G xeˆ3Š•€KðÊv’õ5]Ó%¯ �F±�­;ÅpOî?,ÃdZƒOݲ}7fþ¾Ú£ŽE» �F±�í;Åpcn‹”&Óº|bí‰Öëæç«_¢¡E„(£X ˜Ng‚ãFݯÑ0¡Öõ5çj�f™»‹Dì”§Î�b% ‹;z ãn]«òi­?·²–\ëú.?¨�ÛP¬,À†J@E­=p¯lë“%Òú.5Õ�x~½�1×§þ}ª+h€Óšen­ÕDë.þüéÏÖØY”a¨0‘àjí–Âúf¨ý† ÑÖB Q¬dAWK1ÜAÛéJ“ií˜zHež?“·ç÷‰ÛU_Ñ9Î(·¾Ôms™.˜m€3­hjh�uDl»4š?·Ÿ¾ÀfU«£‚é îyC�Â'P= D™RjæQìóü<öT4��F±�iG-ižçÎ!ÖØ]¬0—h“,Ù>O*Ù$ˆ3Š•€+nè)ŒõC[©4Ÿ&F¨¡ïÌ¿7Eð0´jWÑ9.¡¶Ÿ:7>Óç�&–MMý±þ¼×çµÏfmIër¿ýí ü·D Î(V˜‹;iåín«ã� l‘}A`<’ÁýV0L\®+Ž M,<÷ë ^šËã¸QBôh+™võÅv¢ö¼ÇÒG™7÷kªo}ÚÂW€F±�…}ŬïYòK7~€�²_¤0?à®;v\š+®M¬ü}ݨÚúôt̘¹Msîܵ h‹eiTÞëw¹®˜4±pqO¾2õWËÚž<àŒbg{ò¬B2ë‹þì�ÒIR»ë}}’ûÒì>Ç !l›­ž!p¦Ÿ¤Ê¼Þ,þí‰×;¿šYꩯèg+Wl]TîïüZoLéÈ»y„�è»ÈÒßm[90I@²Ïű_±Phb©©‘r_? Ûí‚G=’•âq†¡P¢#ƒ°˜h')K¥ ÁR©©æ¶%ú)=Ê| 4,~ÆÇ³¤é×å<‹&Žúnz[ï:^/]×i�h_ŸÛd-%ž8þÔs'ÃåºâdÐÄ©ŸVÌÚ¿Îýèmh”ý* €'–~ÔuÙƒpìWÌ šXjØ?—¥ªW´ó±…†ö?të¶4c܉ûO�_41útW< �3­rÍ*XÚúk¾(öV’äxœa¨TqÍPܗک˲i=.ó jžõ†¼KV�‡†JÀô® BM²_›Q&©ßæ¾Åmý°-?ô÷¿K¶…‡†JÀÄÝ+C@‡l+“¥Z­àÔ<ë;‘¾ß~eR‡€F±�iGq/ê×$£¶¬û¼Þë¶ýèÿ~¥Ð}‡6°•”µfÚž\÷Jgb¡QoØqÓýþ÷˜z\oºû_ý~a¸Û;Hî˜øTLšX7ìhЮÿÂñzÕýü6›/¹ˆ3Šæªåì ´�²1d_åÏí¶ö´3–e‚Pa&Ñ&Xæùö—ŸšM€@£X È´£H+´eØÝáÛ÷N»>äþ~¬6 øÎÜWs‹ç°Ç箉O¤»&ˆ3­hlà;dmÅûÓÚÀE ÞÜ/Ï9Ì0tÖåÉëðÔºG‚8ÓÊÄÎ}ŸÖëöí^¯çá…Ḵäº$)ðdÜ€ú{jÛøTlšX7 -²v’ù3·—“iöâŒb…¹Y‘A¸W÷çl”JjûaCŸÖñŸíòËm�w^?öÅVÓ»ýÜcsÃÄ¥ºà—δª}7ßkWÞß•ÀاûõãÑ‚¨é³eàÙ/˜$4±Ô �/°Çä¯Qiûs[šÏ p³×, Ÿï‚'�@‹ÇvÚ0¯éïóv˜Ÿé��Ò­Ô906ý¹ë¦F‰OuÁ(A ‰uS‹ÿ®ÍoéyË×oêw¤/ƒ›g]¤¨uðÎ5ø¹.ž\wkgb¡’[³}§é˜)ÖÜÅJ@&X÷u*ÒÝZ&93 •€‰„GŠ`AÑ>7Y&MœŒÝ‰šfþ<××a¨æ€ C%à‘b-Ó­EB®è"ìæ ñkóp?ín`š7€6ÝêÃâiêøC³Æ%¹àÕδzAWTÀ<}�A-2À^ݯ̨)ŧñ¹.ø44±pÉ"Yˆî�.Y$ˆ3Š•€K;еB;Y½"<‚nyßœÿ7µý ZP_Ñ9Nê‚ë™ú´SõlgjùðO듟æ[{Ê;;úØ�jQ)0vô¹�)>�Ϧû4ˆ3±rlW²Þ ö:΀3€¶Ø¯Ñ9,œ2 ›5>�lÔ Ì´’¡u ö²Ÿ0€¾Ø¯Ì(0º+ù+žU4edJydÊ�­qß߀¹¶Û{ÛÚQüÅJ@æÚf~85ÄvVÒ4Rs…¾¹m,/=ã~LŠ“��ݧՓcŸ[Ynù\Ì"šX¸æÔìLë…ê||Œ§qF±Â\q3Oaܦû³7J'uüܹow|mÆtÅAœQ¬0—tPû;>·û³ÛÚV¸]¨0SØ0+óvù÷z7f?k�­°«h€ g-¸«F[MdºødºYƒ8Ó Ç¶yïóùßc~Ç-°#¶5ãÂy n®™yäóèîâL«ÛxEÌïDZW�óØ)ûÕ9ÇI�Zq�|&Ý>BœiUçîÍê&o�ðxÝ’èÞ Ð(V2ßâÓÃYI´ó•æÑd õÔÊ<ßí×�‡°Yö% €ñôCØyÉvñìüšXªäØÜ÷7‰Þ¾í…’šcƒ8£X ¸´£X5´Ó£Ð $³ij¦¥÷ÝÚ=l¢Mƒ@£X Èi‘bX4tk4N¦)É´¹oïí/Ñ5Ïp†¡PÅz#Cq×®%åÙ4Í´¾Su}Ú³§íF°Kvå pñèwÜÜ=r©.˜G€3­jlî¯:#ÿú®v�nÛd[ ÏBpÏÍ­#Ÿë‚u„@ Ï<‰�c½î¹ÿFKžâŒb%à GŠa)ÑŸµa2M—P�Õ ùï­ÍñòxöÍVRÔº7´Ññ™t÷q&V�º';Ét›ÛÍc’{‚0£Xaªõ‘ÁXWô'm”N’(ÔfŸëàÆÒ_ÇâÓl¶ôZP Œg#XdÎŽÏtÁÙA ‰e‡;/dEìLÝU½faÎ0TªX‹d(ý‰%“ôJn©¬ÃígþÞf"DO�F±�iGq�j«¢Ð O³vö|ßé7ë£Y;4Š•€l+kÿü¼~e¥¸ãüNÏ^ 1V² Ñ.M`ë„ÇM{4�=½U4Æ…Ã,R·É'Òí&Ä™V4uý ™?¯nOÒH`÷ì×çŽ?p#N'ŸH7�gZÑC«e½'î[/„'çm$V âŒb…¹ù‘AXY´s•¥’DJfýìyæåûù˜ûåɬÅJ@¦Åm»_“Œ^К¯²¾®kòÑš±‚@£X ÈâŸÂHMÔ¢„t’2¹ý׫«çs[>i·oÇ{ø!­1|n�[¿Ó�á C%  ·ˆÀÃñ™tïq¦UMèñ÷ZåÁóÓÆþ½¶ù­ÐOÛ´J€F±X(I†Ôžî;}a¦9R4Š•€ìD¥8;ýb jÊ ›}%žÖW£ô¼Ý0vñ¾ s\<ÍÁŠ ·É\ª 6àL«›ýão³e¦ö&gòÀ.ÞÖgŒ‹ç·5óv]¨¹O4Š•€L;ŠÅVƒÆ.¨“ÜæÙSM·÷ñ+­ù<4Š•€,–9ŽuE¿PÄšH‰FΊÝõþ{¼Ú–�âý Ð(V29†Ûy[£4™¦ $ßgO·^óÞ?ýB%¾âŒb…¹B%’¢¸£÷ 5Ê&‰ƒÔŠº­�PûÜ–ë•gï¤Và C% RœŸ�di‹�vSªæûx˜A¤DÔð3+‹v¦’<šH‰š}åþN·ÃÐæñhâ]MÜÉô Í€ré.øO€3­r” ä¶^'=žÝWgM@W´UJ€'Ã&$R2CÌgÒ 1Ä™Xuf@íóçý÷êËIü'€†JÀÄj(…°ÊéO×(•¦˜Rè6­?+Ûµøñ#$@3 •€éDƒd0–- ïíÙ\ÏÃ�SÜ'„Å SI±fig&'ä�f4íÙº-Ígœa¨T±ÎÉP,úeeÓDʉï:ç¿t᩽Dœ¦Z°/·zƸp`…[|nÄùLº‡8Óª–<°Ûçožê¥ôóÕÕ”š`4Š•€,9ŽäB=uB>Iz`S¯¼ë{:/ •`{ì ã©îµ¹7çs]0çhbá©¶“Ìï×10¥ya4Š•€L;Šºu¢v¡ów}ôöùÛo}Þ%Œ•`ƒlµŒqñTIÔlÙ®räl.À™Vg°­>Q%™¿ßî'P°—f*Ì„º";žCwvFi$í5õ…úU/�§c¯fZ [·ŠÆ°x¢…¿ft¹l|.À™V8™J+déi�¿Ñ’`sü-Ñ�‘„}–Ì©žû‚§åa&yGõE´ëj™43‚­¹-IŒ§FÂ>OF”g¿à`!ÐÄRѧÙß>ûš�‡™Ð¨v™ZQ ŒGE–®�ç–Í"„™X¦díDßïû¸«K2‹g+—bÌì,ëK¬æKÆ �b% ó-;=œ:aÿ©¦‘ºjêƒ,™Þ[kyt[¢‚‚8£X ¸´£¨·5QØóÖö¥÷~›Ã}Êy7§•àâ±�¨{¡�â¹uÿq&Ö r†<Œ�cž·ŸÏ æ�b% šuŠÁ6ØŸ£a*¥£FÝòUïoX.ýs7ü� ¨–”á´.(úC.Û{p¦žº0•c3J¦ÃD\ÄÅ sÕzö/|wÎ�¶ÎKd궺„T*+‹º¢óëٞψÓ(دûOÐ)LÑ Š!äóȆÂL*9Tõ¸ßåÚgê@ÝàJ‡¶>CX8÷Á"$ÜMB§Çå’ý!@™T4É�ýÁëSÚ¦>PÆôËsŽ‹§>X¥v•ËtÁ®œiE§îÐÎ1>í5’=„0£Xa*é –Rý JÈsU–»B·màqÏvû†f !Î(V˜ëD}e05m‘²t’>"¡Qyçår°ýŒÓð Šš¾ 0ž+a…bŒ¬Ÿé‚g„@ËŽ”Æöúdw1O# !Ú*%¸xâ#Ò#höxnÝ$Bœ‰u¦&ÑòÙ܆0ÞÇv±fÎ0T*é Rµ‰\e¨oVÞELÝW´ Ýgä ¿zF8£X,��`c®5e8Iˆ®™O&»f3­îÌ¡ªK`{(¾ìP!Ì(V*Ö7)„”KwÂÆ©$vÏÇú¬Œí2ùql¯ÂÔ 4ÆVT‚‹‡N¨ÉJ>šÏvÁGC ‰¥c/­�õÝ$wé&<\Ÿì×h€ŠÇ; ãRûª´ó{9±ïž¶îÀNÙ×3ÆcÜvS‡Ï§ºàð!Ðĺ©§>þžÛ…ê|ÜW‚ÓØŸÚ�qá´·º¡‘å“èFâL+˜>@ì-ÿ¶6œåkù}v¥.àŒb…¹¨Ãgn›íTe‰¤6²Ê½^¬þ&³ü¬ö¨¾¦s\8kÁíNôÙ\¶ >àL«\ð”î+xiBÏÕ<%€Å Qq{MÜÇk5iEHþÖ–i»v|V­âoÎ(V®“vŸâ¸gvË4N¨5`ò”îë~Ðç¶ô¿û«cþù>�ås{¾ÿúŠœQ¬0׉æÈ¯øZ4±ÒÜÙÚH––w;d™èmÐ(V2í(î×Ý©Ié…æ¯¹Z5Ý÷{_·ô/ØZ€3Š•€K1’–_ÚõÆ›îîOÍHœQ¬\^l¤‡³Œhç,Í£ièî•w ó³ñâØ Èˆ¾ ðd"†4 éö‡\®+ÆM,<Ô˧jí·ß¿Ûé 4îZU†;b! ÚK}º+ö’Ç™V¹`/m$óü=LIÑ]ò8ÃP ¨¤ƒXÏt§)#´‘æ&-ù»¿Š×Ü$ÀÅ sÅú'C±²ië”e“DéŒ�wé¹�Càò0 tï® PÓ¬XÉ6r™.ØM€3±jÛwc{]Ýþ,±`‚ÔD[¡x2ÃIò®ùÏ p&JŽŠû.?à_ç¾ts+ &ú…9ÇÅ“+‘.!'ÊQë¶ÀL«²WõèUœŽ©€Žé×â�©�$Ê7—FuÜdZ½$,n·u(ëó]­ÞÒ�Ì€bhk“Oæa"ùÁ.•c¿boÐÄRC!QqßyþûÆÏx‰Ð/Íw2<ƒrCpÝ\ª+®M¬ÄÍ´ûÝž£¶�ÖÓ�ªxÙ²V$àN&UP%Ö$Ò­7šX5ëŠë÷xnTL¿JàÉà I"Å�ƒtºG@kÏ즕äµÞÄtÿt6An7Î(V˜‹Xa!ÓÎ[–JÒD^íì´‹b˜�KÙ^Bü $DWÎ'©˜Pg4îï÷7·E³,ÐÀûšÎq’„BÈ&;„„3­rhø+ä¾µáïú4Åâ»y·DG7oK4BEƒ-$ 2W’ˆ® ¡L)´GÌŸû±ëÀS6ÐÏû…5U:uÀ®[“4±Ô@{L«…±Zbë^UƒáH ´ðº4îd¤…ä@êNúTº;‰8Óª&áQ!óôî~bý€ µð~…ÀpÂ%Љ'™tS�€&–ÍM~…½§ÿÜÓ*p¾…ºw[¦N¸R@2+!ŸîVÐÄâ½öØ!K;¾nŽÞ�ªèj ‡o"‰ÂÎ°ë– M,U²àV¦Ç\¯¶‡S)Xp4Š•€L;ŠÛu;A9½ÔûSpÏõ¹=?Ÿo·.‰H8£Xa® £n[SŸö†Ui¡µ/Ð¥uIÞšCG­Ï£ûpeJ¹Ðº6Àzãëqòý$ 6¤cMÎ1á 7¶‘ÉÕeÐ .2¡ÌÄØšæím¼Kdþ;lkÁ×Bœa¨TÒAÜüêéÈ¥Fª¸X-Ûz¡úû¬æ.áŒb%àŠûv ãÎׯÔ0ŸÖF±A~׫ö¥U¼ŽŸQ�¡¦Ó*J€Zë œ5ð§ •ìkÎIJƒf¹ã¶«Á6݆S4Ô»uÃ1š ¥*Ö¤Ó½-šXûí¿{÷Yº¯²ãy;Fpz…Zb[£N¯ý5õÚ —îµÐÄÂ3ok'YZÝýïÝ”Y[ˆ3 •€*zuw†y„¦/\-×w¹¼oÎ’ÃE@£X ÈÆÓ4þ¦uÓä6­»žºÇD@£X È´£¼‚¨gH¡N¥ˆ�sþ¾€ó7®‚¢¯e€ §UXޤ6¤Òm.šXw z<À®[4±T²l>õ¦¢Çóïóì0݈ 5èn]FÀpF%îöèÿ»nÐÄRÑ:z×ÛO^Ÿn)ý� Ê„ZPŠ ‡TBÉ�.�ëöM¬ôxüÍò/n]¾Ÿéð¼qJ…äA¿0`8§h ÉUƒ|º­F@‹O=¬Æ²Þ;»’‹€F±�õzK8œ…TÞ†y4U’giõ²¤ïƒ×ϰ�th%Àp†%Ð!©¿¹t�€&Z[÷]ÿùêq¿)’ýJ €áK¬CÀqrÙ_#œ‰…’ÊÙßd=o{x…ôK·*‡~i«’ÃÉ•X ¡É캩F@KU<¬FÔï¨H�b% ‹X cQÓŸ°a>M!‘öy×{t–_Úß.½ŸŸ!=ÑJJ€šªÉ]5H¥»j4±nBëý^ë{Û>£“ÿyѭѨ‰œ“†_Ù¿ßÛñûŽ#+ÔÉû²Àpf%�áf&zg�O7ÝhbñÔÕ^õ¬Ïs¿Öæ� jWµ¤lĽÏyP@-m„2±È¡¿µ2¼·VÓ^—û[„1Šæ9éîŒ[f;;Y:©ûR_­¼óô9~"p,ƒzU_ШuLŠ`eA"Ù#œ‰EGöµ^Œ¼ïiåq j�m‘`8Ž÷at®€]·¼hb©™åµ“,íå¾ßM*Z^4Š•€L;Š{cwnRz¡Ñ† ëù7¿ëã«mÃLýäײR`8íôÉ}ƒ|ºûF@‹ï}®íðÏm}`ÝÉ€Èþ‹ÿ¹½^Ýž|Š D�+4ž€\·Úhb¥ÔÁŸõî‹÷wýi*¾1þ–ä×ÛšŒPBWŽ|/ ÕL,™R_¿{�žKCÿnœŒÅ âaxΜæÅÎ(V˜K²Áê_4/ËÚ~D' €F±�QïO¬2ú�Ñ0•&YÂî¿öÜÿÞ¿7ÃE#.ÐÖ[Y ðdÎ…4‚`š¹\WŒ3šX8uþŠ™§oçæà\‰ïéý" p's%¨RGÏ%ºbéÐĪ%Gm‘RÓ\¯ÊßÇo€â¨!Ð(V²P ä0îñ[UJ>M0`ã�V[riŒ�ãî|�ß*ãN&ZH/¤všËtÁMœiEK^ÚÆ³]Šm‚“æQ‘ðÄÝ6Cqý�±a2­w�v¡|®²ê9íoo‹FN ‡¶ZàÉÈIÔ�Éþòì|3šXjî›U–íÍ{·g+I1Îh+™vˉîädôŠ6‰šüÂ~[¯™æïúCÛ±÷1Ð*[Y ðd*†únêTùTºS…8Ë†ŽŠ~ÏN1OÛ5‹î!Î(V.V9†{wʆÉ4! YWÓö<˜íÊwr†Zf]!Ð(V²Pyä0–u±„|š>Éœ¢ši镟nDpŠg+—võënM2v¡÷‡}tZ/´ÝÕ.Ž£ø–ÝJ£ÂaìýšyæséæâL«»ïìÛÑK�{.<�Æ`·ì–gÔzv°ED¶“ÏuÁ¯B ‰…cŸ_ßð°þ侟ûÛÒ‚�làm•`<‘©ö�<ûÓ �&–ªxA;Ïw)ýu%xAˆ3Šæâ¿C¦ÛíxøNÇ`÷îÏÔ9.œŽa!0ô¦|Ý›BœigFÐÒv§íñjŸC?KFâŒb…¹¤ƒXËÔ“£� ²(jã•ú;½ÿœÑÍŸ hèK:ÇÅã',@4Ê¥»`CδÊi+ ½œi{•åÒ‰oÇ¥¨b!Ì(V˜ŠtNŠ`ÓNY–ICQO¯Ü†O°[wE�€ñð ·~É(óé.e4±ö^k|ë}$�÷±½OÓ0رÛ%ÀxÎ…ÛnGù\ì(šXxjGU’%2ý)nà C%  ¤Oa5Ñ�³a*M™°æØ©¿ŸÛ±#AC1¨&úšÀx(&’&ìUyö M,5ózÖKÇí‰e·ã6xÍëA Q¬dÚQ¬ê©‘è)¢NÓöJæï ?–Fñ›g*UÜãS5ï¶PY6I`O­¯¨ž_Ý•Ÿ2ÁÞÝUs çGXäÖ—K¤;_3©ä°¿oŸ/÷¸îÀÙV(ÆÃÜo%ŸÉ§»à3!ÐÄÚSŸ©’,‘y½-Y÷™g+—vwëî\eôJëWìœ%Û}ÕJŸÇú¤7ÙÎA˜Q¬TaMQÜ›Ú:¥é´F·_¹ß»Ÿ¡û£ú>óÙHGmŸÛ{_€®¤0žé@²Äöòi.Ø^4±f’cäÙ,¿èÛ !Ÿ÷__QêõÎ0T*Ô)€µD­&O¤éÍxÚÓõ7ÙjÆ�b% ÓŽ"-ѯLÂ.èòvÞõN�iêl<߀nÙ JpñôFÔyÉ%òäì%šXiÔC+ìxói0@‚½±_˜s\ÿzß+õt<Ì R"åV¿•ȨQBÍô¹^€-½m9òÛ˜aH»d-(ÆCaËEïÅ“ëž âL,Tñlvžïû}´NͳA Q¬dÔ:ÉpX8Þkkù~©ª94Š•€,h�)†Ûtûì¤É´ž/{ºïÒƒ›¨3Цлy†â&Ù¯Ó(›Ôo±q=WËué#÷v;�G`Gjõ$Àx@"lohkxrÝÁAœ‰…†½sÃõW�4~M±[—,>ˆú+9Žû‚k8ÓÊìûäc½\Þçøé¦Qßk%),4ÀnJê�¼Ÿé‚I‚@˦޹a–ö3·ùp}À†Ô-Ñ'õÄ­kÕ–õ»­Ìß÷w½ µcîL~lG}I`lòsoSlŸí‚mƒ@K¯×ÄÇûdÚZ}Vy¿¨€vÀ[iÞçöqB9ÅJ@¦¸I>×7 �&¢cClï�sþS?£�j¢[£0ž¾¥ š/ž\7mgb¡¡Èx¬/ÅØni¼f�ŸÐ@ýÐfŒ '4XŠ„Û=äÅølº‡ƒ8Ó*G�Qóü>~Sq*›w¿Fç8I?(–’Ϥ[Jˆ3­ê[Õ„{9ß…nríø×Ÿçz¡þÝæ†Þîí¡9Î(V®´}¶‹éïñWÀ„H‹vΜ$oDÇË%»àxÎÄÂs{i#Y´Âm}eÎ pF±piG±ÎéNTJ/ˆ¦ Óßÿ¾ë'ó=­?(…Zø¯¨_ ¯E¥Àxj„õ@¸ûĶ‘ËwÅo ‰Å .ÏÆ²´ðåOé*ÊM�3 •€J:ˆ5Dwª2rA�¤.ÓÒëÖ>¼\MÇæ®â2Î(V˜K:ˆD[�<#¡Ì¨Üý]•4‚ͺ/jŒ§>¸ó‹Æ’ËwÅX ‰Å >Îýo•’ó­s)%Çã C% bí“!XD´ó–eÒIÔG7îîM <¤ ²+éÏhP«Õ\®>דËÃLªZð—¶K€¥ ¾Öïê pF±Â\ÒA,j y®>‚–¾1o×ÒMð¨4Å®¤ðd„:¬f(¹t %À™XúÍõroͬ¯Íï¶Úuº£0£X ¨i‘bH4´–æ’ˆ`1m©¶Ê=ßÝ å�b% #­‘"XEtK4N¥Iê^Ëïôöì¨×z¡_¨/ýã¾Ô*Jp'sA�cSÆ‘_qshb¥p}¼½Ã×ÝC¸ÿ6,‘½ ïö×m¾:%ÅJ@¦z9·Õn]`ïöÒUÕÌ Q¬d´LKýÛ-Ïu�ûß´%²ïÑùiË”�b% ‹µFúwP×nèôï—u÷�xéÒÓñ)åi èÛ]E#àÉ´‰€Ü†s©®Øp4±nú$mNâï½ûª.mïöi¤ïyÿäX 3 f2 õ"ò7¹âö¾~_÷1Ì(V˜J4Û.Z·¡¡‚3ЦХO cQS—)O'é£NùTÊE ¼º~èGi@Ôt•œÃÂ1™H‘gç™e‡a&éEÅrük{ìØg}N!ùò[�Ÿ|i«‘O¦XH åþ¤ÏuÁ D ‰…+åÎó}ß½iš9”€3 •€Jµׯ²^­‹ÛÕ”:�€3 •€ŠÕ`…,Šj:¤8Ïú€ÆjŸ¥¨)½Üô™.ø€4±l̈́ۙ¾ îóíËÊ\8ÅJ@*ÄÆÒ¯?{Ã|šŽ¥Q[ÝÒøutã° HˆÎjO¦m"=Bþ˜g¿`"ÐÄRÃvº‹þE™|ÈN«' ›w[š1.œ¸a ™p>›nÂ!δÊû¿½tËo3yîûg·@# ÖÃ)O–ÏuÁûB ‰…+Þ׳.êÒž¯®¦Ôúœa¨TÁ6ú4ÇÒ«^íJš½0ÃP ˜â.›Â¨}¶ÏQ–MêÄÔd·5�¿Ïc?‚ÆJ°Wýêáâ±î{ÐbÉEr‰.¸O€3­f¸|Wó×dš´Z? õóóÝ_|´^Vþ.ÆR Q¬dª¶üe·íY`ÇkÜD; �F±�Å ?…±¾h¥4Ÿ&V2÷iÏ4ÏŸîRpŸg+—v÷ñ~QzEÐv¢ß&ø¾öMý¯¯'Ù]@˜Q,Ü]Ú¾¯ûÑÀ[9!•t�:q’»X ¸4SòXðß3=$WqF±pÅ,DZ´òŸ–ABM§û—`ñÕ}ØE•Ü�;5o�F±�yU˜ÎÚªÛ›çÑ„šâU¶­êÿ±ö=Ï#I“Ø}~E½—×’(QÒÕ€á³�à»»°S߆ ø×›E²¨¬ˆde°1˜COg3¢ê)RÌ #H¾^ÎDQ¼JÕJ@v¢{Þõuꋤú/ÕĬˆ¬¶RcX˜â!¹–Ûƒý@º=ˆ8Ó&�yqÅú…¾ýã⢇@£Z È´­HU¹]”± ¯×·;êßソ£î²,ؘý�øs\˜e៻“ýHº;‰8ÓfMâ4é4˜[?qš¶(¬•€Lt¼ì—çÕ/ÄÕ s�4² Æ}³óÃI-8wá¶‘–öô:róš ‡@£Z È´­¸GºUÉ蕆«;ïýƒÍ¯¹_›ÔÙA Q­dQOÍQÜ,ÛZ¥Ãi�;Ø{ÿ€óó'!(qƒ½ÉMiŒ37Üè†X?Ì �&ÎŒ¨má¿ËÑðqŸ¶ÁNéwØ9.Û„]—œ¡Žü‚8Óæ™û)ËÉvý²Ëú�Û v à K% ’6âÖØ:VN®´Ù´ƒÞë[z»¾ vPÕÎ:¨`œl~íį㗤ø&€3,•€*lê)Š»µÛoÃÑ´Î� tÛKs¹Õ÷Êü˜}h;£Ûs#`á6›šKýPÌ%š8ï°›îGª»¯NÑ l“Ý!~ŒÃaÏ%«¥g¿à.!ÐÄ©R÷|m�fL¯?¯»ÃøÐ6"wgwŒcÜÕ†îR?Ìw �&κçvÿº~=® ÊL@Sò÷½8©1®wšŠ?n{¿÷ù.=ý`—OØîŸ/9Lqa>©D7§LvsfÚ¼©ÅïŸöýÜÚ=9¡ÍÛ-Ñ"!€&KÏ­Jˆ3qžÐãÓ&¼TÖ!¯ÈÝú7ÖJ@fTóúþ÷™‘š,ÝßÑýûf4ª•€L›*³Ÿ$dÿÞߨMõwÖOÒÌáߨÕJ@¦muœÉúÀŒHßÕJ@&úgËÑþZ•QûÞ�hŸΰTª@c­�E`L태TA©ÒN& 0Nª°îa�žX?Ô3 �&ΛN.Óª3n^oÿ^2²œ;ô8ídX*�QÍ]î_Y[�×iu¬^õëHmühT+™Q­»ùõÚ/qÑ(l?¤1. B‡žc:Oâ>‰kÿ­¿O5ÎŽ©ÿŽ Í8C Q­d')n"�Ý{¯ƒ±«u/zŸÛƒx�oû0ç—Pͺٌ€q~)”ÆdÄõì<š8UÍ,ÛZÏ"_í›[š[†8£Za.i£‰D«ë‘y®á‚„<¦eœy~Ï–qÕ¼)ÄÕ sJ;ƒL$`ÛòdCA)ÖÂØ·Õ÷ûqd]°çù3ñÇXÂJVÏ~Á±C ‰SÕÜŸã´þ딚ýƒ@£Z ÈmEÊ&Ÿ—óÂtd¥4ï�Fµ�õgâts>»¹Ë“ñ8Ú©R±\ÚÆë^_D~ÁrA Q­dŠåò®÷+–ÂñÑ\Ñqœa©T'�"ƒq h*0Nk'‰í²Ž³~úmÿ,µæºÌ°T¦à$�A¸üg<”ÖZð,ý¨Êc9_=…D <óµ %@íü,Z+ýPº%ƒ8§Ý_QÍëÇ^îM,ç—m¾ÛUÀãX Ëyà’6šÔkš€¼+�]Ó¤Mõ"ò¶Þ‰¸¹£D"r”ÀeTóZÞEÿÀójW· ð$%héT™ý,+ú·þFÍ ;.¨Û[Œ5/ `†¥0Ñ º–ïn ÐÄ_UnÍmc-•¹=*Zs4ª•€¬—6鿬 Ü�ÇÑä˜hËíÇÿë§ÿD[€Fµ�âfÅ,½~j¯ÍçÈwŸ|„‹‘bŸª#¿bÊÐÄ™¦6ؽv²¥éOí_¢ 8£Za.i#ÒJm¯Ü©êJ‡Ù†ñOxˆ�ÃШV2m«öw/Só+’±wµÂ\²5¹7ßÞÇ9ª7 @£Z ÈXjnw™¿Ë¼?GsëÃ>¨ØüÝés\˜ãañ'8“ÝHœIÀ™6kêSk÷_NÝ÷ƒ˜Ø€œÂãÀFØÍØrèØ¯x,4qªð_ßÖ´>Q9×êuÔŽÓ®'F›MŠ2ªd’ïYï²í÷4ƒzÏ€Fµ¿sÏúV­¡¥õÌÇmHñž5�jñ=kêÛ)†»aÛié`Zk…¦¹ò.Íïs<µÒµÃíÐMh4ªÅ½•Žé÷{ë>÷—çuo"À~ä'4ÕN›[ÇûÏ€&N5l\·úvç¥�o" ,БÚÚ$À“ µ·ð®›ÝxWÜš8yj`+fý„Ýôôç8l�ÖäVjë¶Eè•S¸ton9»¯—Öîí#ΨV.m+>ú•Éè•Ó5žˆæi})ÒëˆW± '·6¥¨�bC3¢'×�Ä™8ÑÔYØïÝ}¿ßã4£9 4ª•€ŒOÃ9†Oùþ^þp0­ oΫÌ\ÎUÏ?ÇoI¹8ÃR|P؈ÎðÛj(ÜB³Èb±Û8ëù´]Vi±XÕJ@¦mÅ'u·&½Ò!ò» õmë;u~úIwAgT ï‚F} …ñ¾-S6œÔ,è ¼ò®ß†š?^ïòâiÍÍg€“άt½I·:ûqô[¤ˆ3mηfõËSo¶'_û{ˆÇßôþ|Ý…BŠ3,•€*ø¥Ã}Ï~ý~)âL›3tªq_àéhùä8c jË“cË9êg|¿°g¿p{�&Nu˜$®Æåj³Ý�׈QbDÕJÀ¤mÅá¶S$zÅmÌïÏnc-•Ï‘¶ÑîÏ"Шߟuò!ßœ„�[Ÿñ0’È€˜ÄzókíÂ÷ãæ&<¹Š}¹Í'ÕΚ<ûç=û…ŒMœj~3tcYúÛñ …v/p†¥“;¡Q÷Î`¬Ü®§éŽìöì¼cu~µï�Š·ghT;¿=Ûé‰ý¹-Q:˜Öè³;ÆûHïÏï%�ÚcÕâ;Æ$*R 7h¿FÃÁ´n¿¯Ð¾ïܬæÛî}{ßsk†KåSÍ¡nV#`ì{"™zW»ïÂ]mš8ùüöñzAÿùTª ÷Ž;”õ…ø®1ê¯ñö,höý•Œ¢I£Ìlœ×ŒÊ÷xÄXp;ˆõ…‚Ùg uüõ#ÊT‡å·¨ç¹~Òm‘�ã>¾v‹�Fµôu¾9k¨m]„q4Aòfå]ð[*?^üCÉà&4jÂ%Laöäz q&N”îÜÏ[Ž~z·É|ÙÒ%ÁÅÞs$�Ðè¹uóq&Î“Ž“5²ÿ¹ïé S°[’06UÃnN@Ï~Á<@ ‰S e'Ý€_˜Ö4ÿrÍõö·ÉÓ;÷4ª•€,nÍ9Ž{nÛeé€ZÏ …m¬¥•=z�#5hT+÷èBÀ­Ðx ARÀOlÿäèr4<Ž¥kÁm*G Þ¦’¢ŒjA3Ï-…m ¥ÎΧS,ÕJ@¦mÅMÙ-JF¯txÚEë'=Ÿ+¢°µùŒqRŒsâ=·þÔâL›§3è—lð¥‰Ü�;#ŠÍ‚0£Zaª igî…nç ‡’Ú**�þaì¶cjÓI€Z+ŒmŸžý‚íƒ@§v¦ç©}µ×{³ÛŽ�p›U†‹}tnªšõÓ wÁúœi3Ï­Ÿ�dýFÑãø¥+Þ�j% Ó¶âNìvUJ/´uº=óÜsãßú³u̇/s°¼¿i™�j% ‹Í˜žý‚ó„@§šš=õåk{»¹³±bö ШV²@C¤mO¥ƒiJƒî僅²�´>Qþ~û5ʼÕJ@¦mŽ٭JJ/4ú¡Û²×îüj_CÐÌ€– 3-Â`šæÁnÐùË0¯µË/SÜ DÕJÀ¤mÅ’¤­‡B/蛡‹±lö¨Ýõþ=z€æb ШV2m+%mEö\àÀ²Òú·pD„€›Î'4"QANGO~ÁËA ‰3Í�”ùQ/x—&ü::€d¤ ΨV˜ëDÂd0VÛ¤òá$‘Aòaå]¿×ó8~£�Á–ì&4j 7{ö‘j/ü¹”ŠÙƒ@£Z È)‘b¸=û5¦õú¨‹?êÉ`iª�z¶ø‘ûô¶ç6«§¸×kÎO?Þç�&N>µY6’¥òm?*6 ¢Œj™„MX·¸�4&Îäü°6ÆjôôaÃ@…àçq† ’¡Ð £¨çUí%D™2C/–Þ_�æûO{Q UA[†2Xb�Ú$»¨ë‚Ï„@'žúL+Çúz¢ÙO(7šhT+™¶ë·£RzAtœtï[m°Ó÷¸³LÉ mZ 0ŽF°òœ§n¬+ÖMœ8õË{=Ö–µüþùzÃÊG%°7oSJ�qT‚}ê‡u#]ñÃhâ´ÃV¹â–Žw¼ìž³ØÝ:�€qv#l¨äuäü0À™8Ñà†º7Ëo²¶º©7èr×§Ç–J@Åê!C°0hû(IÁ¯«ëßã] èýZâ×?Ò—âŒj%à:±ˆ<ù¬Ç™6Oøuo€×«žù é¿ M7ø9ÇiÊEòžîõ=zKå}œnDï €Fµ�i[±`hˢРêv[HëH¯ßGTë©Ç–J@%mÄŠÅ­HF.¨êÝËq³¾ugj×ëb�ž¼M(Ã�¤X¢þNö•ç¾àzõ0ÓfIGxG+ë~ æ8@Ë©‡–JÀœg3‹·s†CiÂ"” ·ú*ý¥ë~ë) öáߤ~}¸MjŒ“¤€ìÊu£]pågÚÌKl%Y?õ|º å–�j% c‘BH­¸Ý6JR>ÁÁ=O['~øUí2$}oöà$}pb^uäW :š8SjÜ·zI¼~踊1hÈmUƸ“KÔÜÙCòäW¼§gÚ<áŒ|«Ï‰uOôrh¥ïÆmAÜI%èìl"uäWÜ'š8Ó mßÖ×½ÝMmÈ­ôíÐ-ʦôãþvÛIÝl(À™6ß̆ZNÚïý›r_7�Ô†BœQ­0—´©ƒuw®3¢Ž½Q/Ýêçpbúž›Óx¡&ªùPýxŒ(š8ylÛ æ¹¾ýèÑÞ¸„H ·•J€'!’¨¹“­Õ³_ðÃhâTsûigy^.� ØO4ª•€LÛŠÛ°ß9 ½ÒÓ%ln¾}nõï �Fµ�±Ò#ߦë¬æ?Þ”KýÀ–J@Å’&…�Ph{-IÒ™µ�SÝšßîR\(ÕJ@¦mÅJÁ¯IB¯È×Âëû‡×WzÝkt¶PsþÍæ×œ·Ù¤À“ JÔéÉ$êÙ/Øb4qªt €‹³q¼ÜwIDû�Fµ�i[±Pq»&£WTOÔ¹özæzß½âT vä6«1.NµDÝ�M¡Žü‚ 8Óæ‰r…,­bù�9„OŒ`ãû­ÈçE¢Ê�ç¾àwõ0“&©YK ÏTõ×"_oÞ%H­%ÕJ@¶ëÆ}¸í©t<­©gîÎ6ÒÒÓ–Ÿœ[¥Ìܘa©LA³Î ¤ Üê G’Fê4íU/hºâ4!ΨV®ÔçY(n�MÜïÝtÆ>âŒj%àÒ¶beÒv‘@¯ÈºgEvÍ6ÖÒ\Ÿ¾—|ÕJ@†r&Ùœ%‚[ ñ8šÞ ƒ¦÷n–µ}¯úìøÈšæù ΨV.m+V)ÛšHôŠä uÄʾ´Õ[ýg¡öüOnÏnV#œ$7¬IwÃgâ¬IV¼·‡)–öü¼·û“év[ ¦H†Ðµê©u q&N3êáï퉤堜>æ#(ܲŒ€qb„õ‡fŒõã]pÆhâäAZÔSý*^Žåíc, Ú* Qaˆ%Pìu̺á0“æü’î«$¸ÅA�àWãF"¹ÁvPÏ­^ˆ3mž}[j€×óøŠ¨W)ÿ TJ· §8ÃR,xRçëµ~Áu)|�7,IÎâŒj%àê5Dº9K•mq„q4Ý“¹`ÛHëƒÎóÓ­Næ‚!ΨV˜KÚˆŠ[’„\Ð:¹¶ŒôZ_âõ{�\òÀgT+Ì%mÄB -IN.h øA“ƒ´�³6áÇÃ-HæZÏ~Á€C ‰Sº] ÁúˆËãÑ⦢ۅ@£Z Èm‘bXÇ´½”¦‰":l¶ç¢¾>/Çë£<(Ü„FÀ8¤*rÒzö MœªfÁÕûºkGþ•’‡8£Za.i#Ömïä¹¼È=·m¤µ ß¿%É<7„Õ Q)Û°pë‘P§j"jÑSÍ,�vYºãv5$y°÷n3J�q’'lädõìL?š8UêË+fýÔÞí$ºƒ-×-Ëfw¸{gn_?Žl÷!Ì´)ç†ÛNRM±Û%Ç �Fµ�i[ý:î÷Sc³ý>Êè)A„dÔ‹¦ª…WgìçœB„eA›PÔĉ÷ ^Ï~ÁûC ‰SõfÝ|ý&átBmâ–dŒãC¡Ð!ã®g¿àø!ÐÄ©Ò�2­Ï€ïqçØ �¶* P“#±ç׳_0ýhâTCѲ▮~¯ç‡ó9”#nmFÀ8¨ÃÚ†D/YzýX¼@š8q:OVúioòáè*”¶Hc\Ý Õ9yùp¦Í33µ«Ï€ò!Ô¿Uá4‘rrO�|½n¸ ~ àL›9)›G•Ëëö^dz�î JØæ“áÂì ŽÌ ìÇ‘Ý@„™6åÀ×?m'©’åõñóÉŒ8ÕJ@¦mźÉ^aаvÞåŸïÞ?ÜÔÂ?µÐMè¨i–^T<þ¼ÖözkûžÒDاÛdÆ8M,?©ÞEëÆ9q 3�ió…ÝD×F៧­1ÕJ@¦mÅ‚Áíž”^P¹#¶ŒõXß2wÄ›4C p†¥P�èœ Æb¡­R6œ&<èÌ·¯_M˜fÇì#FЩ݄F8I-œ8yùW€&Î4ìà÷*ã—žú‹€R®zó6«†¢>Ï&YG~Å ‰3Í=¸•dý&àÍÏ(õàgT+Ì%mĪÀí—Œ<ô Úx«¸{Z$BMàçsŽ‹B¡¾`;Ï“_±{œióÔì¶{}Òr¾}o-!!Ùm€2ªdêUþííyœ8ÿòhÀmÏ 0A€†º8IvÎü²ÝÖƒL˜kj·Ýë–ë“åMçŠv�j% Ó¶b!Òö‹B/¨ÁàZÇZ*_ç'I�j% Ó¶"%â–%eÏUMê±Ýë—•^îûªÇ@£Z ÈÂSm‚a Ж(LÓ¡¨cÛêVß»²~ ñöq+•û]4ª•€ìDÀ¤8–Û´„5�A;pe^Zdz}ø)ÈÌô-ÈÍh„“Úà‰ב_1ãhâL£vy«7“–6u6^™�NØfŒ;IÌPWÕLB?Ú�°Ç™6qj¢+dý<â­sB|j¦ï�n�F¸“DLÐmÙ4ëȯ„4q¦ÁOªbÞËíŽ;Ví/y}nwŸBH�Fµ��˜rûS€&N55åvŽ×ûPå¢)@£Z È´­XFu»&¡4 �e‘ª˜Žs6g‹@À´�q'Ñ"Cc—Ð�rÅ$ìq¦M8uç*Åúü÷ãf“›s=ΰT*i#R¿}“’ ¢,ÏíA�Ûó— ã4ˆ–uV9ð$)D Hó ûñ.ø…4qòx"^¶�×>?n!sÈC[©¨é–ÐAëÉu‡q&NTñç6žE ÌG@òçgT+W¨·r©·¯ÆÃI (÷çöÕ®Ÿt|\2èhT+™¶ë'ôŠ îOƒ·µŒ5Õk²ïñòUÑC Q­dÚV¬[ÚºôŠÊœ¹6Ò«}WZ4ægX*•´ §nE†äŠCe³ßÖ·ÿ½5ÄqŸ^'´ %¸“´jŽ‘UÙ¢[•ˆ3qÂýѲ!ü£øùé5‹[™ì$ðÈòø:î Þ àL›f¤ –Fþ^_8A?Š÷ 4Ø–%ÆñžHg�­×“ëv âLœhnn,ëG%¾s›‘`"ΨV˜KڈʼnÛ/ ¹ sóÜ�¾½oÇ{§0̃ڤMiŒ Ã<,s4{²M·'gÚÌÑ${mãX*ïC‘k¾�j% cM•cX,¹ý6LS^©Y¸õþv+”8…ÈúB X„MXù•+B úÑNZï$u´›,ñ“ÙeI7—S˜Q-T8#wpã¾¾ ðÞf"„3ª¦’6b ÐÖ"'äì˜öÕôßSð”$‚¼Í&ÅI* 6{ò æ Mœ)Ý3#í¹K}z×ÅÓ}9ÄÕ s�È— ÆšÀíªáp’¼È­¹e¤×ú´Úï:M³æhT+™¶ë’¶*½"r"õ°’/­sjÏýPˆ[°›Ôgx¸�kæ`7Üop¦Í¢' ‡µp)Và2ÔúðÍíu\¦HV âŒj…¹: ‘nÍò -N6Ф4rCpiuìîO·6©!ˆ@£Z ÈU±=*öýó<~':Â^íVhÔCìÅõì¼8š8ÕÔ‹{Îu×OY¶|�äÅ!ΨV®]‘âXÆl;KPÓDp«Ý­m õ‡»-˜b3,•€)0y2Ë·:á4)ztûÇÓ—Ctÿdç� K·I%¸8~u|2Ìzò 6!MœiîÇ=ÛԟâÇ!ШV2m+R,n×dì‚ú‘¼¯çþýô¸™÷…8£Za.i#R/mUrî\ùæ½3ÞnÇY‹=(º©œã@ë ºkE^Z?Ö�&N<8ëmK/¦xj·J#`ï …yi=û�&N•l•ÞÊz¾¶‡”~Ÿˆ×,0ÄÕJÀ¥mÅre›ƒD¯hŸÜ‡ÛÆZ¿ðÙ°’‡8£Za.i#–LnQrA}ÑÏçµ=oäžÌÇh¨“6�1, ‘ÎI¼À~Ù D˜iåËk{lm‘?÷ã>%dyP¸5i¢„ýx Bš8y:�ÈâZX«¸U¶ Þ�j% Ó¶bÁÔv—B/¨/É¢Û†[*Ÿfÿ‹�j% ‹¥V cåÖj<ž¦ÈrSì¹é}é�óì�¡ÌC Q­dÚV,^¶Ihô‚¢ßÖþ!÷o»gÉ9#” ~Fç8M»]Ǭ:t2m†Ð#vÀëwÃtJ–n)Nqap(T?hõõÔ²Cˆ0Ófé/Èh[ðkáØ'Š;çAÖý{ HU5ÜžµRÛÃA4Ñ•Y„ë(þ1Í!˜a©0“² +“ßRdÔ¹ÆÑœ¸e°õɨ:è%+�Fµ��¨ªǺ¤-U: &r‚Sìö|ÝrñuÌ>\„ºÄMiŒƒC¡È!«¯g¿à"ÐÄ©*á³>U¿à>µI !âŒj%àÒ¶biÔöŽB/è,Ò*Ïí­õÉî·cö™"!nJ#`œ)bEÃëÓ|ßå7çÿØ#Á ØOç ”÷þСìYE‹A¦LZÀT#`K»¼ Ý÷]¿¯î|—á¤Î/:”Û`ó½ ¾G[Á¡DœQ­\AÃÞ0õ£¢=ä—,òšÀ-Ð'†zm1t&».8“€3m²tؼÖöz?’ ”ìQÐV%ÁÅÁžH`�Kד_p"hâLC±â!°t óù"Tne¸8_ª rï:ò ®àL›'�f§ú_ÖGñÎĉ°ý¶5I€šýÁž\7ûgâD5³ocZ4À"Ùg7«ÌìCœQ­0W¬^2ë·³†£I'ð+À={>ê©l©Ì5« »nˆ3ªæ’6âV¼MA"Ï»zØ$Wî¥kMÇ-GLaûssàÂhwÒè9zý`ºˆ8Ó&îÛå£6óõžÏ³P4¶< .EM•̹žü‚‰@gš{Ë볌õšÝ”Rï�Fµ�i[µå\*Ï?ì›”ž2MHFb†ü³}¤ú4þ£[•ÌxC Q­dÚV¬Süªdô‚è åÌ£¾ãméî�ºv…TÂoZ‡Jh³Jp’R ´8ùzýP Aš8oúU­˜õS÷§Ã¸XŠ·Fœ¤[b³®çÖ]IÄ™6ÏHG<ªøZ4ÊrYõm(H¡jiË’ãK Ñ ìÆ»bPÐÄÉÇÏm}ßñM77¡vq+5Ʊ¥P±¡×±_qhâTC™sÿSŽõ±¬†‚tj…mR ,Î-±ìÐl@7ذƒ™4ëà¦ZhÇÒýæG7›Ìzëq†¥PõŠ+ÛšeŒßU£Q4I”›€u¤åßçö9=Ñìa†¥0I±ˆú-HJ.²Ô¼ÿy­�×½jTõŠ@£Z È´­XCµEQèAªœ•}Ñs{1çœP-¸i�€q†‰¥Gbvã¨&!€Lœ07à¶Ýë›–×GòçÃçQ\:ÀÕJÀü®S ˘¶³ÒÁ4M ‹•}éó?åÈ#P nZ#àIÄ(’ì÷uìWŒBš8UÚ]õ‡ö—ÿI�sŰM)jºåÄÉëØ¯¸•4qª‘”Xa‹&ø:ÇsN�Jp 3‚�¤œ@pD¢�í¿n°+¾!Mœ¹—·zîXTÊëø)r¼©×-m�ÜIn 5�àavC]ñ0h⼃Ÿ×üÜäÊÔa\Ô¨0~‰ÎaqØ(�Bì7vÔlTÀ™6MèV;àõ{U §�@¾t r<ÉEZˆÍÑŽýŠ« @§JrâV?#±tùÛagõÑ'Ð mM  ú ²;RÑ;Œ “£ãbZ_™89“¢N OÜ pqŽ)’:l(vÜ,SÀ™6ÏP´Ôãä¯õ¬M0sÞ „@[—¨ÉÕD톻`¢ÎÄ© æÊ²¾?àëg”[˜4ª•€LÛŠÕ‰ÛY)½ u3}ë»6–þ»³Ãq'Ðë¬ràI’‰„…äböÃ]°1hâ܃Û|àn,Kå{¼ÁH³hT+™¶7b··2z¥«÷'æ…÷Y[×óøÉv=ÐÏçåßš–â´F¬š«Ûpó}ц¯ÃõPÜUÕJ@–x™;Aý:isÀ%/qFµÂ\,&Rwl·Ï†CIÍ?øe�1¸ŸÛTÏSEÕJ@Ô÷õ­…·¶9“ …·å¡4{‰Žú‚‘Ø¡L™¡f!n4Kå[o=é"âŒj…¹bá“ÂX;¸}4N’!¹‡¸€×Ñ£f(/xˆ€3,•€JÚˆ¥Ë¶" ¹"ƒ‚.¾r/½x®×?n�Âîü›ÓÇ£¢Nφ^G~ÁÅœióÄe�ÌU¥}^‡=@q(”mM`uŠ´»y=ûÇ�&N5jÛ nª¬Þ-¹;œ a?nk“ãRÔÜÑÄë¹eÇa&NsäÈ5üíãn¼ ŽâŒj%à tCŠa‰ÒíŸÑ`šÞYNïW?£E�~�G®)…’ÀÍhŒ£N¬/{£·ÿú¡tÛq&Nnœ�ñÖ8êg\ï~>™c‡@£Z È´­@¬tûhÌ�ÊÍ0\[Ÿ¾›~/×Ô CÕJ@¦mÅ’©-Œ@¯è¯Ü›ÛÆê^� ys4ª•€LÛŠT’[–Œ]P\š=8½ë7 —^ÿ‹hiö �j% ‹V #ݲ-•0œ¤�HÞ¬ÄëGH¦»#ö1$” nF# &\b;¯g¿`Y"ÐÄ©†òæ]/³�ð{µ$�P4´•ÂÑ"Ú—ýP²}‰0“f=4 üö8NÇ’Qˆ8£Za.i#–QÝÞ’ Š,ø!ÝçM´×&`ü B›ÏF›"­ÁÞ]Ï­[“ˆ3mžpOf¼~/û¡ü*”nEÎ�q²)’;lÝõììIš8ÕHÎl¸E•¼�Ô*ŽP§¸µãЋžÜ°ìǺ`Z"Ðĉgâ4ï¾þ';ÅAœa©TÁ<ƒ°„ÚvY>”&Ç4?qn}âk9$Û£²šŸˆ@£Z Èb•“ÂXTµµJÇÓZÛKnkýœÉk—ƒš—‡@£Z È´­XÀ¸uÉè5ŠóúX×ç^¿Lÿãö$ mRc\œ@ ÅÙ{ùKp¦ÍÓI›uëE¡ÌÇ5 %ŽP³üVc„‹G¬è¼CFà6Ôûûpî†b ΰT*i#V nIrE}$æ>ÎU`†¥0I±VðËq5kĺ#··×Dÿ²Oš9Ø¡¬/”€FØ„ÅÀ¾)±"+à¸Xß¾\ÙMŽÔ§}@´™Œ@qÔ'½SçhUû±ƒ˜25Íg›^õqÝ¥Óÿ^jªm4ª•€LÛŠåÆ6 ‰^Ñ.t}mO?½Ï3P {›RŒ£B¡J@ë®'×-?Ä™8Ѩû¿¶ÇåÞÇk°9¸MÕ­Ë'5v͆ìÓmHÄ™8ñÜ\Xîû§Iö_•h"ШV2m+jñmO)ì¹\Ð,Àm¸ù~›Ú‡›E �Fµ�)®×ô¬ßí^ZÝ«9(¢ë…@£Z È´­ ßn3и³Î�¦Ûʺz`ûÃ|×©Íæs{× «n.#TœÕé˜b¬§¾àù!ÐÄy‚PØÕ�j×$}\§kÅ~1Î ™ˆ=µžTõÔeÊôB©ð¬äúAÓÉa|L%@[‹1.Ž ±œUÖ wÁbœi3§3ÿ q¯ ˜öb·Fç0I ÄÞZG­[k3i’‘^xÖ/M-MöxQ$ås°ë¶ãÂ|7pÉTëÓM5Ä™6ñÜTÛHÖ‡ï÷WЦ�j% Ó¶b1âöTJ/(›åÒíP ÇΚê¹ôýùH�Q`•À6­GvXVh^_?Þ·�&NžtÌŽ¹ßíCy"(ÝJ�ã@«_Œ|³~˜ †Mœsn¹m,«bxº¥–à K% b™•!X¿¸Ý5IÓB™ÿ¶ 4¯_$yµ÷!ˆþ�j% Ó¶bAÓE¡ÔQ¨2Vöõ­�ãhƒ8è7«.Î EZ„ ±žü‚ˆ@gJ¿§éϪŽñ9K*¢-Ê&é˜Ð•ë¨u‡ `¦MR2²Vž¥÷ßë¸àcΰT*i#-¿�’’ (°AÁŠZ†º¯Jàø‚‰èa!ШV2m+VNmYzA†…"be_´Àq&§|Š7«.è°ÐPܽn0ÝܘiÓkÓ£þ×ϳ>®kˆ3ª•€KÛŠÅÉ6�^P:ÁÏ©÷ȶ¡–Ê«=>¯ykˆ3ª•€KÛŠ’[””=[hã€MÖÆ¹j¯!ΨV.m+ÖDÝ’\M ±À UË£&eÖï¿Þý‚ûˆj�6­¨)’à¥7òú�TûQ&NŽ›±>€?7°û¼è·6˜"L»®çíG™6ÁðîYi Ñ£vûå k¿j̓C Q­d± Ja$•Ú^J‡“d�Wâõ!üéãˆ}.uŠ›Ñ'~BÑCÖ]Ï~ÁœD ‰SÕœÁ{íëK´ ˆÎ àŒj…¹N$V#¥²Í)MÑ<�«ŒÖÚ:PýøGû:»hÉΨV˜KÚˆ¥�[‘ŒnB§¨ ùÂMŒz%›{Ý(²%(Sæ‹÷ª¶ÿÜæö �ζ;ºÎgQ®oØKg ë …YN캎V6#eÊSð^õWuÍêkÃd+PFµ‚LÂ&¬ÚNH‰3Q¡¹�ë@ëU÷÷”ˆn àŒj%àÒ¶b-âÖ$¥„MnÿÝë[;×ë¿ÞíJý?ÀÕJÀ¥mÅ]¿­ŠB/HˆH¬äë×SŒ3:ÐöݬFÀ“�N¤!ØšëØ¯˜‘4qªÁƒæÙ­dëG>ÞÞÊ]7ÕJ@¦mÅ‚c›„F/¨Ñú[Ǜ﷧sÓ%ë€Fµ�IÛíÏÚnßÇs΢ÅÖã K% ’6â†ßv•@.ˆT•wé™�ãÆ1‡u õþæ3ÂiÍ?¶Þ<÷­‡™6KÐìC­ï×»½1Võ¯zœa©TÒF,@ÜÉÈ1ª…[í˜K/}±/Šé€h“ãâ˜I ÑÔëF»`êδ™S/X!Ý“ë”ÝYài€‹Ã;‘ ׫£Ö=€™6ËèúRËõÒ·ÞZŸ¿ßU°³fX*S(dRkƒuFÂhšÎÀ£f#^ŸMÏŽ¹ �4p3ObA‘Î Ÿ¬g¿`°!ÐÄ©F bÁÍë'ÈÞG@ŒS: ÚÚ$À“”é É÷ë‡Ó}?Ä™8uo³‘UÕî÷#ϯy\4ª•€ŒEVŽ!ùÔí´ÑX’ nú‚sµ µT>Çã×’ã…8£Za.Ò\)‚´Œ[Ÿá@Š*êÏB:­ Mõ'ZHÊü&sH™6™w’ d¹h=ùû �&Î4Ò<nÑ s}�Ñ×%v@9¸¥O;$C4W°ï‚+ˆ@'´°Ûú¨Ú|äEÑjŒ“4Mn öãèÎ âL›³äƒm<ë—ZoÏßœR qFµÂ\ÒF$²Ü>J¸s¹–ûp�OÕëÓì_oì¤>�j% Ó¶b9³-ŠD¯h£H^lìK¿¿Õ‹µ»Ëð pp³àÂO¤AØ>ë¹uÛ q¦Í“r¯’g�ßã×¢í…@£Z È´­X ´#Ð+jz÷ÎûZ´ó³ãýeg°#v:j}Ù™0?/¯'×=@Ä™8ѨI.¸ûún½Ûq㇢*ØýÚÊ$À8­µR6ézö n$Mœjjn$Kå[߸­;�ˆ3ªæ Žßûlyüñ€Ñ` v;i€‹s4Q;g{­#¿`Ëδy†7ÛÈÞz¼ëÁ¾È€ß«‡4_ �Fµ�…&‡±8Ùö–0ž¦t‚®Ž×6ÖR™�±­Xe4ª•€LÛŠ%Š[—Œ^Ñ;u]~?ª÷ú Öü¾¯&Øzàü~µ—íó{9™ºé$8£Za®I³’/ þy\ÚS¶¥‚›Õ¨éÑÔ쇻`j"ÐĹ÷�Á‘Û÷KýäÇûZy4ª•€LÛŠe”?†zE“…Mý]ãùK{{¶T&åi°O¶Y�qZ³ÜDô云t+`¦Ío*­ˆ¥û¾Ž4:m°k»åã¬M$ÈoëÉu7q&Nn '¶PÜVõø ¹H^âŒj%àÒ¶"éÐöŠÀ.È�¸•ßÖêÝŽä#…P9¸I�€q®‡eˆf2öã]phâäsKï1×Sw÷BÍÓC Q­dÚV¬_¶Ý%Ñ+bhU³Sîs ·Žy~?[Œºý”@£Z ÈNdÆÊ¾ôå÷Ÿ×ñû€vj7­0qÛW,Ç~4ÝrDœ‰3Ï-Ç…åYÏxî'šåˆ@£Z È´­X´}%Ð+z¨×Ím=Â¦Ž¶…Ÿã¤8Ý7­ûÂù €Fµ�©è6Þ|_Ú`g§(�j% ;ÑbóötÎ}Qn'A*P5m­Æ°0"Eú(wû�tÇq¦MµØŠXtÉýÏÛ!|¤ Ž[žNÒX±)Ùsë#âL›gæ2îÕƒ›g7�ÌeDœQ­0—´«<¿OÆä‚`Ô,ÆÇ« ¹õS©—FÀ–J@%mÄZj›�B®è2êM+ñúœ~{*‘2L(¥ÜŒFÀ8Åê22ùzö Ž&Mœj®¸–+ÁG½ñ²°<�=¥(.ÕNW×.SÀRyÖæ²Í×½§X k% Ó¶šÄ{]!{W‹ïuá^zÕ—×,ÜþܽºT¦fÎ÷;äwô&@£Z Èâë=òp·áÖ¯éþÜÁûEœQ­0W,Š3Ë]·PÃÑ$åLç²t÷]Rß ññþxê#ШV2m+VÜþðÉèùÞÿÈ_õ4 Gå<ááìäïo> ШV2Õ ßÆ[*ßzô_pÈhT+Ù‰TOq¬ÁÝj�Ô= ã�ùþè=eŸDÉÛMé§Y??40Ã÷ƒå½üa»]tÕJ@Æj=…° öGùp,MRg¾þcU—�c—i¦~‡²¾PaÔÃÇJäÄ‚”׬üõ ®Óû¸(×|üe}¡4'Š} jÚîâmuÆ#a-TôôCzÖû«™ü=ˆ!ç†ês›N Ô4pjç÷év>âLœ´äZoD‹68‚C¢k�@£Z Èbñ“ÂXj¹]7OÓmt4‘½ËßúÒˆ�whS�Fµ�i[±ºjë¢Ð R­×?Ù*�~:£+(•€JµÒ—Ñî«0x4—D´ÒhT+Ù‰øIq,¶ÚZ¥jÊ-8¤Á�ÞÆZ?>3IÅÆF Q­d¬4R‹·Hã±4…§ì�wÞëDD7™‹É=P#u"O^ɰQøk ¾ÐHQFµ‚L'­~ªÏH.-ù~ܽ¢ø^'*Úí�g÷@žHù‡~,=ÿ€8ç�&6’5ððJ4ª•€LÛêПûäÞO)ÒS¦Éè'µñ¾çûq …¨oü|Îqa¢0”Jè¹õÈâL›g¤Ã¦ú™‘õSÅwo2ûL# ¬¶, 0Î4†j�=û…ÜMœ*õ¨ã_ÇÁFÔSn]FÀ8œŠ3Ê ôì4qª¡ÒYï/‚åÕÞ›Èñ<”0îóÇóB=DþzÏ~!R€@§JÇ à�å—×HtÎhT+™¶«¦m½ Áû~¨ŠðÛ%û�Fµ�Š&Å ~é—h8ÖJ@¦Z÷Ûx‹@8¼XÍ»GœQ­0—´k·0y.wR»~h^ÛþÓ¬¿�Fµ�i[±Lj‹¢Ð š „ÌÆ[Míýµ?œžD�à'4j*%ví{ö ¶=Mœj¤fÕç_úúýÈ›SRB[š¨é”³›“`Ê÷Ãéf>âLœ:uªã^ZÂéI n™8MµÄ^{G~!N8ÓæÙ7©mûy~—}àß6Eðsçý‚ €Fµ�IŽu7ÖÇ€&N<Ô~�?õ¾¨ÔïYfåT[¨1NÓtªeíG»bY÷8Ó&DeÐô­$ë7š^m:’WÜÁ *% R¶A©ç÷PF-Ǫ̃^‡©ÇÝçã×"õ©{œa©T¡ôCPäu‹3 k±býé{ ÇÎ÷ÛûØe¢? @£Z È$zc¹Ý¿Ç“F¢? @£Z ÈN$rŠkkþ¿Û´„±+éÜ£^‡ZäÛïöºèQШV2m«CQØ-KJ/¨i�¨ï0VвÏOèr®4Ô�à}wÔ²c('‰Ó{m‹š{ý™öYc¨õ][“1.Ì‹²TTlón(Õ6�isló{ý®øú—ÇÓÍ&·ÍhT+™¶Õ!�º7õ‰ì¹víºçrú®mçylOÙÒåŒö®�äÌ/g)æÀ8[ŠdF5w«Òg9—“ô³VfwW+ž„9�L›*³Ÿ¤ZÿÞߨM…˹íý�]­d±pïwö…KšxäÐ¥Êvð÷w× ÿ¤Ñû_ÍhT‹/h¢«‚•|Ñé¿ç18\Ûë}7©î$\\;p*¤#¿' ‰3 βÈØ»ú6¤§O¸äIÕJ@¦m5ÁµÏ6�<½Œê¯PÒ_Ý„×~2Ù¯5¿Ž ¯VòE ßþ¼w—£¥ï&5À�Äh£«Žxò+±‘gÚwßÒ#,4ª•€ŒzIaEçï� ÇÒäaâ^xŸU>çöAƒNÕùù4U׿3Æ–b�˜Gjö‘ü­-Rƒ@£Z È´­XfùUIèÍšŽÙÆ[´Ëôç°L•P à K% ŠEb c æVj8œ¦çP¬QVfß'ŸÛçxfJ ٠ШV2m+–‚þøIè]™%}–‘öLûQiAÀ–J@%mį­HN®ˆÈþ~8ݦ½oÐ�@³´[Ñ4ªÅ·iñÄ—c–mÞ5t²ÞSý�ˆ…±°V˜+½™ÛOâ½,Jñ�,�òÛAPýq$Û^¯íVòûØ[N´wÏgT+—˜[G[ ßúѤ 1À–J@^[¤(Vç¿e�¦)}Ô_»P_<7?üð±sçÞvObç‘ÒÇWO®GÔgâDC¿âÍû®¯rÛq:GìVfŒCç,©¥PV?œÊBœ‰S|—%Z8æõŸã•NJ aFµPi[ñµAÛQ½r¡‘F�ö¡êùª= E�gT+—¶Ëo¿* ½¢åµTÏ2Þ´¾0nß©S=4ª•€ìD#§8Räm±Òñ$u�¡+ï*uoG†4<Š_7¡0ιGJšC=û…¨Mœ*\ oˆ½ù¾<ÂÑAýúEàâz ¤9Ô“_H;!ÐÄ™Jg�ÝÖ÷O‡‘B©sÐ0ma\œ:ô§€zò ‘'š8Ó@ÛÜÖkŽïq—cç(ܪ p’f‰#F=·1Bœióì/©ÞU‡®×!ó1s̉l ’µ´Š'éǺ'A ‰—â$Ñ"ƒn.z*ÄIgT+Ì ¿Æ’Îí¼áp’: .Hhì«]¿':ù Ð$Ø�0£Z!*eÖ”þ`Rçâ”î $WÌ,åÚd’ mIJ¹’m¬¥ðýsXkB¬`†¥0±žÙþÎúEÌoçô»è4j¿@ ¦TâÌEÏ~!W‚@§ zæ½=´? .£Jh«’5­G;zö éš8U>Xî�Є0Æñ—Ô_Åã Ë2ÕJ@¦¤Nú±.OhâĵüÇÆ´¨©ùx»A Q­d±Ma¬ñÜþ�§ Æ<�qŸëY*¯?Ç1®„1gX*•´k¼vó8'Wôb"ïÏ-y;ßÛ‡ÄD)ˆ@£Z,•­–Ê«ž\–ÊÃK�žâÍH¦m5�¥pš»é»Z ÈÜÁáHª°¾õGÇhT‹ÅržÍéǺ�ÍA ö‹Ùœ�h‘®¿[Z6�Fµ��hóÇ—nÿ�Ô®+‚3Ä[vê½`ZŠê;^>÷åjpvÄ>²½ïüºí£ŸÐ'¶�+Îõä2@4q¦”ôë“4;E}«ßmòóI8ˆ3ª•€KÛŠ.�ünIØ…Ë)úy§úP ‡ÀÜf¤)o!-DY—×öö”…yêB ý”:ÍÛ¦”�j§ƒ3=¹¸Aœ‰�Ò-¯íu)óï;É”QGÙífŒ3ꡆǨLO®GlgâDɆzíï#ú½ÿ‘bò(±ýá2ÆøP¯S ¦g¿�óA ‰SÕB6ÛÏvÑ´¯ãt£…lhT+™¶ kwŠI镎Íq;wÕ¯3ïù~NŃ®õç¼NÒÖ¡• Q™~¨ š8ï 1Ü_ÝŽ¡÷’®-Q‹ãå�:¤ LÏ}!aƒ@'ÊÏ·h±g{”‘"è(,Ý pa=Ô¨Šé¹õ0 âL›g¦Ù×ös;¾ $†ihT+™¶«HÀfô‚$ÍÂ4÷gÝr�š4CY Ó Î¨V˜KÚˆ•l»ÿ+�碘N)�?ëC·3»3u÷‹žþÜ×ïÍYa90Μ#ÙÉãŽýŠà ý §:‰Q÷ðOìj…¹ͽíòzËÿýu»|²ÿüi�CÈúCå'iéXí®Ô‹ò»ÿ¹ÝÔ>^ŽÒMi€“T¬˜ëÓs`ˆ3mâyk÷nêÛ9ï>µ’f°hT+™¶Õ¶÷™2zA!‡Ú÷¹½Àe‘FŸ‡c÷QnµnZ#`œåf…¬åŒúñ.�hâäé(¢ÈÎÂò¨òpÁ<Ž$Ÿ’õA Q­dÚViÛ¶»zA(S¿Ú˜ýŸræ(-ý”@Mà†Ï õäzô q&N4�-íæ»j£É�r”¨�j% Ó¶Ba×&¡Ñ ÂÔÞÆû~=�e¹eÔq~B`œ[E!e�zö y'š8Õ4j´“¸ü©5B Q­dÚVNÇì²Å¾«•€,–7ÓŸzž^s>ÎZ�çF‘Ð&5ÆÅqnR²¨íB°p¦Mœ†sVŽõ¥�÷»›N–é˜a©LÒF,›~û(%$X*šþ<Ÿ:;Þÿ˜ -Ô¦“ã0w=¢`IÏ~!Jƒ@§ªª·ˆœÃ âH9Ê%·6#`œ)µ¥Mzö 1š8ÕàA�}…ë²ï¿»²„�j% Ó¶B׸½ BIÚe—Ȭ—ÚŒ²KkIz)±™m¬ù~¿bSÊÍ Î¨V˜+©ìzýÆó§»C‘„TgT+—¶ º~/eô‚ •÷¨o)g¹Q9µX PÓoQ ¤ç–Ã23qšIZe§p6©”VA˜Q­TÚV(äú}’Ñ BT „lÃ-•O}âûB �Fµ�i[‘Ps+“²ç¢/ͤìû ^^Mݱ›dRgT+̤ΠS±P¼VIöóQ¤,âŒj…¹‚f�A&T²mwe#M‚&δæ­Þl{ÍËg‹‰Z€FµXkRËN1S=Bnõ·ùúüùÝ|ÆÂZa.\ lûIÎÖã8P*•šÙ‹êD<ßþ`ÎB34ª•€ ×'à±ÒÍѰ_M„× +û¢´_ÕÏû±û€;jo7­P»ƒ=ýp‚=4qîÁ¹h}wðïÅŒœoÇ+ïÕ €qr=¼¼ ØKÏ~!Úƒ@§: œKY™1=]1Ð@£Z È”@˽F’ýG×Å@ àŒj…¹¤�&ºئ ‘çÐÛwÖEœÌëèFýÛMæ ¦èoÞ9©¿f„5ª_?—SX” f-ÄzºqôXÀLšr$•ï5Á¶èÈ{ûȺQ·J€q¢›µ˜ó鯻ô ‰“çãh�¼ª ùzˆÏS£0v 5ÆyêPes\¦c¿’³ ‰S¥_ú¼ ÙãC¢œêF}îWeŒÛ¡ØçÄLÇ~%j@§J?ôLCýïȯ´eÉ´'ÖJÀ%ELîUµ¬C}ƒWʘШV2T¨)`")ÜV( k±®ÖR/ëpKå'yÄØ �j% ;ÑÍ)n"éék< ÖbK uÛ ïEþ?~7¸È5ª>¿ÿ@M{žd_:ö+Ùš8U1û²þ¬é9O ˆÙÕJ@ì.Žilgš÷÷Ö>µ­æ;hT+YÔOÈO69ìO‘ñ°kk!q²H’¿ºl¢8éq†¥Pñ e–�í–K6’,)9°q«b©ÌÇË.Ĥ�j% Ó¶b5ÓB¡¤Q7ÙFz¿æ#±%ÆMhT+™¶«¿*½ �ðxåÀÆ6Ô®®$=hT+™¶Õñ—Ôñ^,KFßÕJ@Ƨ•úÞ¨Ê\üʵ©&Ûßïí6éýƒ90Î<#YxS³'×)âì_8ÑI  Ga_+Y Š÷�¾üuÓ½ßé¿Cänw´œ�j±vŽTèzÏ|Ñc�ã/á 3ÈKw³}…­A1øwŽ“DKœ˜é¹õü âL›gw{xÙþ6oWŸc{ :C´¥-H< :G9 CôìR4qª'ºê¶~µd:Z�Qǹµã 3‹B-ÜÑ�w!Ü�@'O¿ªí’°¾B¯…�(�:n[©'«#QÈ9‡žýB–�&N•îH¤—ʬãüº ¯±5QˆrïSoÊúÏ–sàõK›QÔTT¢èÙ/¤(hâTAkíˆAÚåK·(ãÆ‘âLFG~!Ë8Óæ'Þý£È3ê'¿$`gŽÄ-zö ¡š8U)ɱ­‘†ïñ Žäœa©TB^båxÕk¯ç¥¸à K%  ~I»a¿—–ÃÆ([Úa3ÆiÒ)Žtä’€3mžÔ^ÛÛ,ê%Íj ©^‰®�-JöþÓœ)0#™¶ÕÔß‚>�Gì}­0WJØÖu~Í~ÿd�²îßK@KÁ~‘/È]š¼ÇÆÓd ë~ £¿MÑž¼½ÿÔ›yï¹¾Î÷GîS¹¨›k2ÆÅ¡ÜHsr|¢#¿»œióÌC+Éúº©Ke™ À–J@%mÄ"õ·S2rEð¦)‚Ý‹ªŸ ŸŽó‡’"@ Q­dÚV,½Á—Ћêò]9Ö_ôóå¹¼¦µÑ&‘5͆zr=²€8í/ŒÓ;®þÂ?ÇÝu%-€@£Z È´­HÖø}‘°  ÔÏ{{Ø}ÙU/ŠõIm: N6q\¡'¿W@ ‰3åx þ;I=œnÝŒ²¤�j% $Y¦WŽSÆa¿oû)×9P*•b�·¿jéyœ]{�Fµ�á]ÁЋ/GÉUœdÓoC-ü÷�ŽfÓ#ШV2Å#ß�úþ®iò;,óÈhT+™¶é'ì‚–ÑÌèm¸¥ò{C¥fF#ШV²ðž?ع ËúLüçã\ŠŒ@£Z ÈøîJ a™Ôv]:–¬¹6.&Â&ª?‡sœ$Pb»ºçÖ½gÄI_ìË.°{}½þí÷êhÍ{F Q­dÚV¬‘Ú®èÁ:fã­.ìËÓºÜ%Š?Ÿsœ¦Pbk¸#¿à~δyÒIdƒø¼….Qžø5ã8%kNn€—ÜuÁ„F ‰óÎuÕmªgó¥ò¨ŸÛ» ¬hT‹¥•²ÕT_y÷\Ï “û¸¶HOL$Ó¶:.º³,jHßÕJ@†Šîµ=I¾ñŸg·7 JÇv2Õb*%¶áé5÷jµÈ�j% ~ç¯ý Ÿãu9”p:;ÓòR¨-Úª$À8/ ô#{rÝoEœ‰¥ó醩ÇÝëí1.³µÿ!pë+Æ™-$‹Èžý‚åŠ@§š5àúDÑ·þОßö^e©Ψ¦4`ò掿éÞrÓ¢©‡@£Z È´­¸Å÷‡Ê˜^Ð ÁÑ[ï÷½*A'w\8 ›¬ÛKœÖèc‹­#¿à"Îäy>ê¿ëë)^‡Ó©'ììm`œz e[Wû{€ÚßȺhƒÔ£çs–9Âë—eÔ:}lXuäì9À™>Ñ{}rýøßt,Ÿ°Ã¶ę̈õùØëÈ/˜`€ÓþBÒb”9Âë—äbæ(ìÕìeuÜ<0À™6OÁÛH¼q+z`4ª•€LÛŠ;¼ß1½ ú³ˆÐª§ztÞ>ÛmŽv¤H-k…¹ÂÛŒcÈ$gžp((•€ uɽï×Î>u.™?h@p´ý•�j±z|Ám¬wý å>%Ñ Q­dÚVÔîý²dì’tØî½½?w£*ÐiýíÅPë÷'þSÇ~Åa ö7*öÖ­~쵊ì-ÀÕ sIq·ß¦ ‘KÂ�|ª�º~:nþº5Èì-€Õ SIq£÷K��çšÔÀ­:q«öûv†�?’ÀÒòk4jÆZî;u]ñžh⬃Ãè¶>ö©OÑ;5è£)ЕÛ%@Mœø!ûÀ&NÏA™FfiàWe¤­e™�®ImˆïõA°×qÓVq[gT+Ì%mÄê`».ÈE¡�^Hãö÷D%¿‡€Fµ�Ñ/FÀpßñ«2Lkbpž«Ìk“yÚƒS ÐvڌƸ“µ0¾+×û6ýHº5…8Ó&�xB;E5L>ÝlKq†¥PIqËsûgL.µÏÔÚ‡òW'’„8ÃR ¨¤�~íÌß’È¡V®à74×~´4Ï÷ŸCïô!™z»çViy}¼n0Ç…â ûwO®«ÄÙ¿nž“–VŠþ>¨æÚŒÇï©a ÄO;2àI…•T>S¶üÚ Áô/TÜÃ^5¢³ªnÉP[ð°VL}›@çâùt 1¿�ÎqšŒ\³ž[6fò,Ѭj»±>§ÿ3JCŽ€Fµ��ÝÅ@X úÛØÃ±D]ÉvUeŸ§íÜð¼bÈШV²à`M1,Ûº¤ƒiJõzYm(÷i&Í­# Q­dÚV$¿üªŒÙ)—¸uu i͵<�G?%»Ž€Fµ�i[‘lk’³+‚’„Z^m¨z¸]±ÊgX*•´i@¿"CnEN’LÃ[ßïöª¿¿çë˜�Ôš hTSš3z\Ç_^oÂÎýšc4ª•€LÛŠ[·—†ô’ŽÜÞäj;à=�»ÿŠ9F8£Za.i#jþþ@r+2‚�«ú4Ðö\Ö|Ü4–Ì9ÕJ@¦mÅúc[…^3(S6b¯71.C­ßÏhÔHhÏ»îÏÐô©¢ÑUqÏ÷ö¤÷ç¸÷*8d4ª•€LÛŠEFÛ9½¤X:!ÐxG¡êð~BWS3‘\`' Øu·�€&N55ê‹7µ%£Ž€Fµ�i[‘ÒðûfÌ®¨<™¤ýzª—'ëG­ŸóïÉZ©Ñc­dÚVSo œÅ‡bö®V˜«W$u©ïŸíFÏïw餆ßEMj´}”�j±n¡+°�ù=¿þ¼<ñ/­C]ÞÏèÆp"ÅÀöaO®»¥ˆ3qží\}(û÷›ïc2ÔçýÆPS¡ìºÝG@íoä_ð¼½!Ëu˜Õ¡Û–%j�>ŠÄ¹l÷ÎÔ‰Ö­¦U7}ŽTæu¨Ë·uH€šÖ ?`×?j£`·5ï™Kv�j% Ó¶â¦êwΘ^êЙçW‡ºíßòø^ðügT+—¶ÕqjüIÛ;Z<)\4t£€\·ÿ¨ý…¹ÙÕùû½Lß‹û±×…0ÃR ˜¤�X‹mÈ%]‡¿™ì‚„e�ŸÏèBFUThXUîçª#Ú‹FE§‹€Fµ�i[±jë Ð ŠŠŽÔ×öèËq;—ÓR$‚Ú”`˜–ŠºfÀ®Ûm4qªlŒöŽU#ù}VDsºgT+Ìœç3«2¿›FCITÓkjl>î˜B>ŠÄˆŸÍ9NÒC¡íܲíF8“çù¬®vw�‰(T@í6Òe�XK–uçžÁ8ªéF0é/ Ž×ò|í!~N P·í–ç¨õ|þIgrf"{o›�$ƒ«°¿å†6üáºÿF@W18‚z«ý ï÷Ã�…s÷‹pFµÂ\ÒF$‰ü�Ù„[Wè`UêÇ*m>GîC²¾hT+Yt·:�° ik’Ž¥©:N6æ*¯n�?óËëPöS51�ûƒ0”îÐôy£¹µàþrð-±e}¡4Â&¬Böý‘ z&ñâÖaªIõĈëQÖJ@#l½þX†ŒXP �ƒñ„¦ùܵùáblzõ ë …Yhw ·æv¬ÈhI6àoôVK[hûKÔ¢Î"ð¶[$�ßõWŠ; áô\ñ �Žû‚œ‰ód‘´ýçǧ[gwÑ­Ýí�ST˜î DBn‹ö+x4ÌÔ VÞ—J@•’þ�ÖÝÈeÊÚe>d=ÞUFÌŸšÎ�}HÂÕJÀ¥mÅŠ«· ½&ß¶ß@}€~z¶;Ù}2‰$�ÿñ €šð ½B`×ýPjã¾Õ}êxÌ‘Šh+‘ÃP I2?†ÒýPj°Ûªº·Ï©mÕ'“ziã×d€¤Uèµî…Pûë¨ñ>ê¥ñ0Ôkœæ$¨0 „j‰Îbè)¶�~nµhFШV2m+P;~E2îL7áO&kHëÀ�yëúÏŸ>ËÖJÀ…í®ý�‡Àè:Ùoa^¿™s�Q-h‰'nÛÏgmã|îßý1fÑ % Q­dÁÁ»9gÕ°|wé‘áæê·s\”à útbÃ8²aL8Óæ,Ïc}ÒèÛŽŒçP³kË3Æi7²›znÙmB˜É³ì~^…:Û?ƒÎæ×` Ó8A›Ì /:ðP±ãœ;äy³kt¯bj}€¾]‹v�j% Ó¶âŽÛNµ ½Ð¾é³1ûd惨Íù) €aò'î™lJuìWŒ7š8UÁcº×Óôúõ†÷aOJ&�j% Ó¶âÎÒvŽB/´)8áo¼ï×wÿ–2çsèTî'4†�¸/°!Õ±_qÜhúT·­ü�!)ÿ¨wŽ‹’ADubDuÜ<7ÀI�æ?Û7 ž·úQ0?é_4éó­—ŽKå^?°¹Ï'ÅÅÑ$äÒ¶šúX§y¤ˆ½¯æ Î"÷šH\o„}çn݉ þÜv˜$À0ޝû_ûû€&N5è:ÓúÁ†×q‹BA¨üªœÃvâ­uÔÌ5À™6ÍÜÙZ/®êÜÛiU4¶zœa©TÒF¬{ÜE`F.h(ÁY»ÕÓöúkû^sÖhT+™¶+Žv§^¡ä �R6æß—%¢4(?¥ð$ŽCò…ÞÞ:ëÆ‘ 7@™8cvx¼}u«�U^6½eT+“¶K޶ozM¿l\ÝmJ¿@Ç÷“5ÙsµìµJûëX˜d}{"k&y¿‡R ¨r§«ýEÞxË�.@ÕJÀ¤mÅ}¾?>Æô‚h s=›3Û*þ>3/»:4ª•€LÛŠ»½we3zM:�í²…ëùéóÞ^eŠMÿÔZB Q­dѯ'��èh¿žt(IÀàÁ²W‰û: ¸@Ç÷3O.‘| ¨g¿`|!ÐÄ©r¤\™…d~mÏŽ·{‚ç„(£ZA&anðm—dÄ©NȬ¦}Œ‹V¢Œj™„MX\øe¸’ø!�Ü ¯h¥jËûo!2‡ QFµ‚L¸O’͹ÑûE9DÐ iîæ³æqú~…”»AœQ­0Wæt-ñ4o‚C6ºcX*HÃ'ø×öÑ´œ‚CÃí¶2\œ WŽ”VG~A¡δy¢B¯ ‹¯6™á² .wûöAÞóüç¶/Œf÷!ШV2m+V]~AzMÂí{º>?{)îÂ.¨würŽÓDWè¾uܺµ0é¯[7úÔ—ƒ®‡Ëo9!Ù‚Z¢Ý`M€š¢‰Í¶žý‚»ˆ@íoŒÒ `�í$5äþíüÎÌSC Q­dÚV,¬ü¾Iè•–{ËXÏï± .{4ª•€ŒT@Š`±ÑÖ(JS.t)‘u쩞¾kåö{ ªÒé¡Tª<ˆƒü�qx$¬•€+èƒmåw@¼þø'ë�~‡�Á K'J†mÌ�º~Ø£½}Mó?hT+Yp ?6#ðÝù-.ï‚�Öy\\œw‰š6Û“ùp&Ï“¬ÁfáýÓ¬OÀ–J@¥˜l�¥xÁcœa©TÁYeû¥Õ¯‘gÿKûE€@lÇHSDHl?õÔº»†8S§™Ÿl¸ÿûEž¥41ž[�OµŒ4¯a™×‘––ü-ÄÕJÀ¥mŤ-Š@¯è dSícykXó·hT+�`SË¿Fá4m“nËXÓÚ%ÚçATà �Fµ�i[q‹kë"Ð+ýcµ�ô~½�«BÍêB Q­dÚVÔåü¢$ìRÇd?j'÷·Ù4· �Fµ�i[Q¯õë�° };‹-×±k’sú´§B´(âŒj%àÚ—äFB/ÐîÛ’$¸8óI‡t¢t¿j›‚öæ÷¾‚3xý_{ÁùC ¶äaïlgù}�^5ÝhT+™¶K!°$ôŠ®JM·ý’Ó?é.™nˆ3ªæ’6b)ä¯�Ç䂪Êm¿Ïþ!÷åð:nC*¶�j% Ó¶b!ÔVE WT]£oÌõKÓÇ3»ê?¥0Îà°ˆáƒL½~¨ n Mœ7ˆÊy{ld BÒ–(Æ©ŸPÑ�Ç׳_0hòT÷­ü­4Jæ  ñ+1jb(v{ö Ž µ¿1ü­ïA(;^·,§¸8pvO´�:nÝu˜i³ ζàÝìê¢ú4sgÉe¦�j% Ó¶â®ï­É„^‘ì•Ö?nùGû¥S:n›Ð‡s¸yû©wŽº‘t[ `&Ï™ › V…ðmöÈ<)À–J@%mÄýÞí’Œ\Ð|ˆLk3šZ΋s8ØÖÚ„`œ³ {$ÙJ=û? �&NZð†Ær°­ùU¹œÌ {äÆUºùí¹Üµ:v?‰Pëk±qÖ³_°Á¨ý�yd9+<+Ç4·ýhÄÕJÀtãW͸­Äó±Ïûd t¹6Ÿ1Li³Á)6ý –ÊTÝé¥ò®:´ù:ÖJ@¦m5©VeHßÕJ@¦˜ƒýÐÝAÄ™¶3kng¨ß·ÿu"ÁšCœQ­\Áq“bXùãx8˜,´È­Ùï.Õo·ŽeÌ(ÄÕ sI‘úðwÁnEÇ½í¬‹”¹‡ÖÌD®R7›S\˜ *òAznÝzBœió$%²©»úôñã¸Ñ�lïmM ¦1b“¥g¿`² Ðô©¦:—š¬_ˆ¡>–6¬�µ+Fs,û[›PÔºlìôô쬚8Õ ˜ vÉÎRÏ�ŸRæ³ Ð¨V2ê:)‚[®ßQá´þ�?‹ þ®­óQ±ŒÕJ@¦mÅ}¿]+ô‚ˆÈ¼ž}¤÷Ë{¹Š×ƒ@£Z È´­X}øUÉè)C=zù³úÛBS-Ð&4†Ijäd'y5ìǹàBδ)ãYøVËoôùçÕ50ŸW¹×;ÀKåå!È�'9 Ó¶šÔ´HÄÞÕ s žØ¾°Óüçp•G¬GTJÀ£Hºná¯h:š¾“Y³Zó? Á« ¿“»’õê±ËÍ Lò7%ÏqšV‹í¹Žü‚;8Óæ™zsKkY¢ú´—uŠÞàŒj%àÒ¶b‰ÔöŠB/è-8Ñn¼þä@¡H~B`‡aµÜß­ê‚_8§Mç¹{M�¬Ï˜'�qqHÛŒR`Waµ•[ˆÝPW,Dš8ïÔ½Û8þ†{@£Z È´­X²ùýt9@ê?¶×6v)Zˆ4ª•€LÛŠ„‘_ˆŒ=Yô›ÎÔÅq>?¼Á6¡L•@©T’�¸ÿéËHï{·—pFµÂ\üƒÎ(“ºÝ5GÐ[‚-µí…ê$͇#ÙR4ª•€LÛŠD�?`2vI`°¿t¯§¼WíaïK¾àŒj…¹¤�X‹´UÈsY'ù[½÷ÐÙÕå�–Û.‚Ƹ8¥CÝ›Tr¶º�tß`¦Í9wÍ6Žúу[祮�j% Ó¶âŽï÷QF/È:fæ÷&÷î_Ïë¯ä¡Ïµ %@­ÛžØZûë€&N5oˆïO=°–ÊtÜÒ:"�jqOT¶Z·ùNÛµïãX�žã-H¦m5©é™ˆ¾¯•€,Pm‡¾ŽÛU\�¾ß´§À“ä ‰º¹Œ¾àvKâ=?ê›t¯Š4ª•€LÛŠ¾¿ –Ñ ê!÷÷;5îž»f,ΨV.m«ßo¶{Q“HßÕJ@&¹y·õXÀ¾ï7D7€Fµ�i[±.jë¢Ðk"kãò—¬�æïçpŽ‹ƒ5‘Ž`_°ã¾à'NúûH¥,«ºÞú=ΩPÛ?Ã�„j"%Cv_G~ÁÑœióÌ|»�ÂÇ&5Ûp†¥PI±êp»$!W µ?rÞ–¡^U÷Ý_ÇÚe‡@£Z È‚›”`zíÕàš¾~B™[†@£Z È´­¸¹¶ý$Ð+�ÛßÎ샲ò�ÆægtŽ‹S>Q�D+­§–MC„™6K>¹=›,�»•ö¹ðwÚ‚$À“`Md�ŸÓsË6ÂLœfjí$¿o„k.À K%`’6b‘áwɘ\,ù%w×v™“^;h­Ô�¸>åü9ˆ!PÍÍOh€“lìDõäœ(š8Ó̉Z8æçö›¸]r¢hT+™¶õù¶cvA3`/Þ‰ë÷ ~÷Ú!ÃMÖÏhŒÓ9QÇf?¨g¿`€!ÐÄ©öÇÊ‚Xmex°Ó·UI€q:'’ ìõìì&š>Urlvœ¿µ%9=ˆ3ªæ 4Iáfï÷Ìh(I7¤É�¥W¬ÌéÑ>¨'&whT+wäÃ÷ô¶%ÃZ|ƒ0uŸŽ½áoFæöÂŒj…¨ba³ü­·õ¯XôG¯dá†@£Z,Ü‚½”`øˆh{)L;¼X4 ’5cÿì.>Oî_;Ÿm?Êê—ÑÛ][ÉŸCœQ­0—´‰VïzÌ�Ë_Ü9¿oŸ_�ÂE¨“¶é¤@M­…»LÀ~¬ î!Mœ8tíýCè.FGÉ”n~�À8Úé@6özö .&Mœ*i¼w•ƒ‹Jz pJó një’5õuMpû¡.؈4qÞ™�¸søK8ÍFD Q­d�ÐI1¬©ü^¦ 4êYS}OÉk~|ÿÌg¦âr{­×¦7]™c»ÉbIÔ³_�7´áTñêþÔÙ ÿÆ®V2ÅT\„Çö÷¶;ïš§8ÃR ¨¢†5F°škGo6’¦ éà}ÿÙí¿¹·.u„RÁMh€‹ãD,;茦e7гp¦Í™¬N² ÷=ñ{ã…æ2ö0ƒJ ˆiAÝþã­Ýnÿ–hî!ШV2m+.þD“Ðk*ˆ¸…}~ô—NšÅˆ@£Z ÈHd¥.mUÒ¡4trÁëÖ{9‰?W÷öxᑸ£hT‹wžüRÈqޝYúß»‰•±"iŒdÚVò%CHßÕâK†û_õň˞ºuO}kÆëå��ªé�UÕËñ{õÇÎ9ΰT*ÞMéŸ0Õw¦Ödz}Tôö;p„¿k% Ó¶šÄ{õ!{W+ÌåΟÛí¸d¥h!êl¿_À84ŠvtÖ{r=9€8í/ øügzt"ƒS}(öÛª$À8ÕÇWpêEC¾H7ògò¤ÙkÞoG½ç[›€âPw(ë % 6!!äï–�xE•ãÇ]¹ßÓáš3Ž@£Z È´­PŒõ÷‡ä¹®£.üÚž [¶»y%H…¡Û&”ã¼W¨ìÐÕíÉu7q&N~±¯ýÝg÷㥳P–ù55qì&òœû±.˜Õ4qâØ…¹E=ê>3†çô¶H ШvÚ ²>©ÏA�ñ ªRzÿtRc}—“;Å«]ö’gs†3,•€*8ŠŸûµõ÷$†ÅÏæ¦ÓÂæDöwÏ­Ûæˆ3mžéÍ„ý¶Ñ{~7×O»™€8£Z|3AÙjÕ©Ÿº¯—ßÀý7�žl $3ª<“þ38“6=ÆI'smžÄ}bÓü­¿/¸<özcÁ}^›¶˜ªHA�Qíì¶O¶oÛøy~èÞ—Uø�Áîõ¬;Üoj�¿o¶î¿ôãïl'�hT+™uÙǪº'%ê‚@£Z Èò”Iûã/§LhT+™¶ÕÔ«õn/] ¾‚î']½ÑÖﻋ ¹¼' f?Ÿ0N|†ê›’"=û…ˆ Mœ*µ›{õÉ_óã]Ÿ+í&~ä–ñ«Žþø¸û¡90Î/ ™¶Õ¤&Bú®V²èþÍç³Ù$/rvYXüs}÷9Çi™‘8}Ò‘_HMδyÒ‘’:GévKkh9a-¾À�”êﵕܟÛsŸ¿¯×‰Â�îì ™¶Õ¤Þá é»Úé®t«u7LÛ{0ÜM��LoàÚ.2æ�»ÌØöy…ì¯ýÙ÷¯_•î’¢?X@£Z Ȩ#®3væGtQÀ·ùŒqÚED°èÈ/dHgÚ<ƒSm˜¿Owñ�ýÌYÏ¿�N¥¸øŽr�ˆ`O~Eä÷8û×ÍóèÙ½¥ðìjñ½¥úÛùNÝogýtËñdÀ¾+ëxÚ¢8)ÛªœQ­\�¼õ¿vGì2Ô([Ý„¸8BJàìÄä'9#:uIó¤“ÉmUŸƒü4êæ¶" 0ÎO³Ï3=ûXQ*bœéA Q­dÚV W¿.½ ‚é$—j¿‰Â:M#¤¢k% ‹¤åú·.|ýßê£N^±uktŽ“Tc˜¹é¹õ âLœ'üœ6kº ½Û§©6BËó–ö'µÝ8­Ð“_È ÐÄ™ž¹ƒÖ1Q¨À¹Ãžƒµ�)&û. ûÜŠâ²#ШV²}J®W¦苽ð…µÂ\Áyx#öw|)î‰'X?£0Ž{†gkr\{ö þ2Mœj~ž¿õZw©ÌǺhçaÕÎÏÿ 利~=ïñÜîqüž"T†ÂZ Ȥ,`&9Kƒa­dÑv½}[‰§“ä'¶Û÷'u!Av-'ƒÇß’]4ª�ÞûL·šÚ½±zwò÷l‚HÏ·?�LÛjÒn­FÜ]-ºµº]­Ô3q=xý�ò~Íõsµ¿^Çšg Ô�pÁ�rŽ3,•€Š”ñŸ0‘âïhžÿá]¡4{;xÐïgúôöÇ/úÚ~ºÝ×22X}E¢0uñŒ~9Õ�0“¦œåö›r^ƒjùÕJ@¦mÅrÎß@Ìèmˆ=`é.·Ï&Lî�q‰Óe›ïšïÝŠ­+%¸8p \ñ=‹žü‚ðD ‰3…6ÔMÒ5.7½×5^ŸÑÿý¢SÜIÚ¸¤•cò“Øm°âÿ¢yNr¤4ú»Z È‚ë�výþçõñ?ƒ#ð1‘ÐïoÀŸ�jñU –ô¯pƒûW4)>ÖJ@&ämº¿ýJà€&.d¹¹×ÿ×Ý374ª•€,hL)f¢ë�¶ÓÒÁ°_Ôdúaþüy¬©€e³ãÖ¸"!hT‹…„²Õq-òž_uÛvÖ“è9™�dÚV‡òÈ‚}_+Ùýøs›©¹íô÷<z(+û£e4ª•€,K£tÃ\I£ÐÄ9 Q‡Ý«w^—u Q­dÚV¬#»\AB/ˆÒÔÒï ,}ÀÕJÀ%ê«cUou<¯ùé=ΰTªàœ7°Ðvnàp M´§æþòKyû'G4s�Fµ�I¦vS ß#"šÚ4ª•€Œ…ñ»Þðéò¿pÆ¿~ë)08GKÉÒ©g¿ ¹hâTAs¥ ÉbªŸÐ`hÊ,�8÷{ÿ›å˜1È)?¥ð$gLÚ,ËCt]ÈCÎÄI¾‰˜ê-´×zûýæ>œ¦h¬•€Ì¨V~gùí“íÞ^‚“ÒÚD™ü,|ý·þÂ^Þì7-ß·ã9ˆ °néîvž�j±ÊãÝPâ€3qÚy�Ã2®s~Nq†¥XÒUJú7°éÕöQúÇc­dBªÿÛõâL[Çà<3ÏýMyN¢‚¬ôÝa<ɘF•"J=û…Mœj¥i$‹,z_ÊÒ Ð¨V2m+–PݾÓ+zl;xïí ñ‡Ìûu¯sìGÂãwž}>ÿ|Ÿ0­ШV²@BVgnߥOÅi!ÕJ@¦¦lú¸³A ‰«™\šØ_.Ã>—".4ª•€L§ó¼=p¿Othê�FµXŸÖ�V/“\»­˜ß-ÌMÆøçƒ;á×§:@£Z Èèø¦üÊ>’7C´à �j% Ó¶bqçW%¡W”bž¾™_õZn}cY“`RúqFµÂ\JÂb¿fqßQ4ª•€ŒôFa%á/¶†ci²$Ï,c½º;*Zz ‡TJ@¤lâ­GJ­¨ˆ5ï_”~<�°eˆ—SØúìÁãµe¶é¤À8CŒdq»g¿�­F ý §ªÞÅ ÿÄ®¦ÜÅÙ÷÷ò§Ý� 'ìüqÒ„�?NÎqFµX$Â�’j� ’$¿+™T¼`­d±ÄÙþÚ û¾ý_{¤/Xº¸UàŒj± Êã&ÝPÒ&€3mÖ ¸Ú=Øåbçóê‡_ˆ•TwóöÇxY–§_Hlôc]ˆz Ðĉ¯‚Ëu¨ ø,Gþ/¤W/«?�©}K­Vý €Fµ�?µõÕî‰Ê:£Œò7 À8Åi2Êiôäz¾q&N4ËôîgÔªX~gg!Ó‹8£Z ¸´­&J$ls�è•xC\h·�ÜÇÕ´à�j% ã½”IV^ÿ¦&2©+íJÔÃùŸÀB·»ÿ6úÛ5ÕœG;öÝì_^£E;hT+™¶ª[JÈs¡œI‹¥ ~ÞGZ ШK e«õ(½Õƒb~ü>_,²SƸ K®—ºìì.eë_þy¸ÏGg‘Kš'“ŸdˆÿÎßÇjªíáùy|„â² “º#ã§eIså±#\Æ ,žÓØQ¸þ]­dIܦÿÃ/Ämhâ*Òé�â;Kï*9ÕJ@Æ8…°�ôÑp,M•¶Ðʼ\‘6S‚ÂÅé¦tŒÓÅQþ„s=û…h Mœ*ô�ì™Å¤—W£kkI—¢–!Õ¶õ�õɨgóäE¹‡@£Z,÷”­¦úó|¾65÷»[%ÒSXÉŒjNæ¸lõræšøÎ²g«‘L›*³Ÿd—ÿÞßÈ©�}Gû<¼QXû#dŒÞ¬ÒÓh .å¤F[Â}ÐÕJ@ø+)f"ã¤Éšt0¬•€LIÛô;äBÚ�&îÝÒ¦ÅmhT+™¶_s´ãY W.`¨S’ ZÔãû¾I—÷qÍÝhüýéШV2M•É“Ð2Ö< 'úöÅö±pJ4£šó{iŒ#Í, i/¥Ë¸6¤×:úËOI[ ,!™¶Õïšä¡Bú®V2%ŽÔïƒ y$š¸Có¸ÍÂr‡°ª·A Q­d¬ÏS_ ´ã9K»®º]ÒÏ�G{Y4ç¾—ßÂ{Õ“‹ÌúH)0ÎS#™rÁÐ�uá‚�ö/œø¤Áù/ÆZ ÈüÖ™y�ýÆË‘îh9jEt´¤Ó>úÀáJ6q¬ü½‚ÅÉ·Ê!|ÕÿíR[ÔöÀšÚÚŽÞu¥üÏüý|ýùxÔªú�ˆëSºø+?ÇÕJÀ¥&ɺá.ÉgÚ̱ü¨«¼T¾u%¯ˆeÕÎÅòkFÚoÖ÷ù(%Œ„@£Z Èvýîf”BX—{—a8–&òéÝp0ÚGªg¼OÊ’I4ª•€,hó)†/ü Ó®:¨‡¥ê8'ÖO5}|[M•ÖJ@¦muì•,�Òwµ�"qûéö!nHd£úó¿ù0Žd³”¤]•þÇ�r$Ö|OþýX+™#ëÿú 12š¸”([7HÿÜDÆQ!ûÝ6Æ‘q–Ûô£‡ˆX?’œ,C˜‰“Nuѽ¾bh©Üކ/ê"Õº¨ße·ic~uOf¹L=*ï° €qZžåSòêGÒC^ˆ3qÖR¦ªw¯Çq^ÊT!ΨV®¥–âHƒuæèh*¶ ci‡í·tauÕ?$«ì¬Åú–~ôãZƺÏÛït ¾”þB˜Q­•²ÍñG€Í¤P§b6¼Ùëó[Õ,üëoä¾gT+Ì¥Džö?ûýúMBŠøE5f‹Ð®ïƺâóÐĉÃÍÏ÷f¡Þ��€p$u¹6ºUÖûÇ�s`IE²øþdÏ~A}!Ðþ…SU[Vô'öµ°eg�ù³Ͻçî’° ì¼�4žDaI&†¹‡Ý¬z=Ý[[0 ªªs¹Î�'aØH¢qˆ¢c¿’¾ ‰SÍóm7üÞP§å/gT+Ì%mÄê®?^†ä¹PìÃÛO³¾ãïy~ÝâÓàIø5AäèØ¯$@hâT)Z…Š5Ÿà¯éÄìE�3,•€*èG„ETÛIÙPš ƒ›æûi²j�G§ì]ÒuÙæ[ÏßG]ëß]ÆgX‘,Yöì“´áT'5ný�}­dÚVíP827moìB~'ÍÁì€Ûq´Š1˜gX*ÕÿÏÚ·¥;‹óÌNåÁzB$‡¦ÑÌÿvû€‰]%Pñï請Õ.YË�J€R,kï%K} ?Ÿ¨.@ ‘̯ ”U|Ö‹$©Wîi*¢£ä¿ó*——@+ÈÍѼOŠÿŸ©«<1Ã>B ‘ls”QºC8Ão­òp/­\ˆF—ö´9ŸÁtgv qF²�u] èìr†übv8 ƒ(#ÙæhâáãÃ9d¥.7ÓR¾wÊàI÷ ÏÙB9L¬œOæl½ŒtÅU«<ˆ2ÑÈxXeι1«8CÑæ¨‡Dv=ïy9½´!É6GY¶j¯Ýæ©»™Ø/8¥Ëô›ÓPöCÙæ(«ÁâÕ‘c;÷÷I…Å�£ï’ïΤ#ùîIà  V�'Ä��}£|¼?í ƒ$ˆ3’mŽ.Ž^1†Ê�þ€.÷’J NÒ!»[–\óÑRVˆ8#™�j¿ù]jC²Iæ<ºxãN¦µ1wŒ‡ZÆ­n µ ÐD»1bTH7ãDÃÚ˜×ôGtŽó§°9G¢„ŒÆT†­nŒ·Î4«ã1Фd-ùÉñ‘neŒQF² 5 ™O°–³šv™®w’#¾cÖåßÀÕŒ³Áº{CÎPBÞàÓ÷£^u8Q¦XíñòlOr¡ë‘ŒÐ`.¶œ[qµÆ·›€ŒÊõeÄ™h¨ó`�ûûøTno·9(m*�F²ÍQF—)DPf×Ϧ]î$e‰NØ&Ê^©¼GÊ~º˜Ù sç@D—ÓDwt‚æÆýn . ÐDã)¿‰¸N¥úžß§"eeá¬À¾Qÿ.-mV�F²ÍQÆEŒáT¡?¢ËÍ´¼#žH®ë½û�ui§¤Ì ÐH¶9Ê´U” 4òRÐ.$á�l*â˃HïT»öwr0# 0CÑæhòGHS:ýΪßkö7&0h$ÛeœZíg�1Ã[øºÙGÌšúktŽóG9 G'†�nLNÎ4£Ã!…¤c;“ÚŒà E›£JZÄ™T»@±r%+‹‰ï}«äèp$×¼7à E›£JZĉK$×Ê•$H#Þëvï×çùÑxwÀŠ6G•ŸM„0κƒºÜNË8ø×TvK¨‡‘…G ‘ls”ñœßN³|RF?Ó]Ýœæ =?sôçü8éˆùq£Ä<M´šÀŠé:¬4ñ‡9BBç8àÏË7ˆÐtë<8ÀL³’Ò¢æ–tèeFðøî•Èé!ÐH¶9Ê(j&Åka•Ï[ÑtÄÃfP€ó‡û(¶†㸓Î1"ÎD«CBoWÒu´4>p†¢ÍQ%-¢¡¿B׺…là YIwýÝzŒ:И£fS€ó§´(°ÅdÞ¸Õ 2�&Ú’y­#Ó½ŽE#óh$ÛeÕ¢rDÐô:Çptš^W›i¡V¢®öíÞó£;(…ºB ‘ls”)ÔÕ®åó|w̃B]!ÐH¶9Ê ´ÇŽÙý…»ÜIKbîj¯!ûd^â®g$ÛX—´ˆ¢vµ@ÑÇÿpÀ-y†µ¤74r®çÛg(ÚUF[Eß½ûGª0@ö§sŽsGª8ÖFTÞ¸�Nå!Î4›#Þl''sê8„LÀ›!ÎH¶9º´U”1´ ¤h�³ ¡;?ûûB(Ïç`lì-ºú#:h/ ³q›œM´ï™%¿Á}é¦^y6#u;Ÿè�ǸaŸh®Qû �&š ÍŽ˜Ö_÷rÐArj8“3˜D�ùœÒ Z'ˆf’‘^:³·sç÷á²h>ó”jRôçƒ8é‘H«q»¤M´�’¬Šù$̼ô�ï={êêÈžúƒºÉüT,&¬ö½ò-p„…°œ¡hsTI‹8_êÏ$P.ä^1CU“‘üê•£aªðS#Ì@²9Š”5œ´ãˆU ¹†€Wn ×§[0!hæ\ãÜéÎ-è~%ºkÜI§ÉgšÕ}À®«;‹m0÷gsŽóGm8¨‡üÔ°“NOÌ4›ùÎy<Çf%�¾`@nǵ´À%„Få:!„8 �R‡é¯xѹÑbê0 E§©C´hÎO.eÍ«{ŸŒ¦œÆoP—¶jVÇ�\õƒls”õWnZÚ·\xê²£áÖ<ÇI šãÖB³çÜê~ÏÇæÍ"íï¥Ç†QYü05"08}˜š·BÙæ(s˜d$Ç«¡3™ˆÓî‘5ܽ_ó‘½H¬!âŒd›£ËÏ|CØ‘=)m{_î‡2??¦û;¼Þ�Ð5‹„ûen2 ƒQ»ÞÏ4åŸO§·ŒÓ·Þœ ˜?…™`L¬Ž;Ý Vh¢Ù!‘¹3mù‡=Œ@d"ÎH¶9º8�!œÒµkî…2??¤tkþ›ò�øýý{�Œß@&Õ º†¹Ó7”“…¬æ¸�Îj"Î4›ñz!·«èû� …‡0#ÙÆª¤EœÔõ—'Pç‡øƒz}ÿæ’¤ˆý:‹¨Å‰—DëHEcÜI@uùÉѨüF–�@ûßY*GçìEn ¤â™ÿ¢¢v:ÐÂt¡�È5Î�½âÌÃÍ)ªîœu?ž�în: ³…Þ¦sœ;ʼn‡F�»éô7âL³œ˜Ýýü^cÌãQížy¾ûFIôÇ£P™OI�ÚoÐË4ÑTJ%êOõóœ:¦ f¢0Gèã@&ŠŽ€È7ºAä"ÐD«)µ!:4iyîõÙc0) Qg$ÛX—´ˆó¦v‘åq s§ûNïÏçïhL+Ü)à E›£JZĉI"�r!Éaî IÇ)û¢¡E ‘•€3’m¬KZÄÙQëÖÊãDK KëN¹œx<�D—ÐH¶9ÊNBSˆã ÓŸÓå†Z‹yÓÚ@K‡½¿/J¥MGœ¡hsT9±2‚pøéÛ~W[i¡L# ËnïùÙÞÑ¡r†#ÎP´9ª¤EGtyç~îs<•H9Í`¡.‡œ²/Z>óô÷λ›ÁÂØ, €þ –P™j´ßá(h¢©¯‰é«Jr9²D‚ÂÎH¶9º´Uœ ô—&R/dDS"á7%ô¯<9¿¿õ\ã f$ÛU4í"(3hÇî$e1mYwêÛW"o @#Ùæ(ÓVqrПJ¤^È4.ÙÊG~έ&”!âŒd›£k?ÅåUu½¦á/û <�„h;�k˜?ðäP«Ì ªo°…€“þ:Ÿã©¨÷üi_±u¦›ÆÄ¨?” ÜÉp““d1[4(¿C3ÐDK)Súœ´C Ú†R2Aºªý<’×Z›Þq�‚ooÍ)Ì¢(^Ã6:á0“,Éœ×÷ï»÷S_GÛU!sh$ÛeÚ*þ­#/¨W2 d”vÍùëg¯¸à�àÛt óx¼0N4Ï Zg´f’‘ b%Z§w ê¶ó€'ã;Âù¾nhÜê©„@í&Z) ¡LÖÔCÒb¯ÀüÄœÊñ‡=Ûg«DR�F²ÍQ†9LŒàÐ<ÞH[iq^ãyöý~ßÝyÀŠ6G•´ˆCs.×Ê•0³:ívû}lGduh$Ûe ¡’´NRìŠó“×Ó@Ýt“§{‹.€þ$ýž"veÜæ-ƒ@m¦œð½?|‘ÒÈoß—ÿMP`Ìnçs�s'(¼ðÏtʨ[§agš�Ôèi�éàÀðá1¤XÆ#9ù†1[´±ã>:)ƒ8Ólv²žõžçöÕs)Á|¦?¡sœ;-©‘DÓŒ›é4 âL3ÿ}2æñiäùŠ×’§ÂÒšo>åfRô,P™nGí7r ÚÿÐÔ_ó# ²Ü¿q�mŽ2b�Ö¿¢6¹Å©]M˜úÀܥݱ×8êÃ̓ˆ”ßà­gš�kEÜOÕó~¥ßþ»7) Œf(ÚMnŽ¢8yê®ÓånZ"F¿éeþ¢?Ùñ 7ÌžªAÎ}ÄÍMÄèI¼Q·þ¬!âL³«e&'g=¢›>ÁÔ¤?’  ?âæ9Ä~�ÚoÐf4ÑÔ�£z-õ©ŒtöwŽ‹�d›£L[EYZ»4Šö8ã£Lª*~¿ßùfìÿ†P0Gê :ǹS(œn\Ù¸�Ê•!Ê4ƒC®,é˜Çgˆ5® qF²ÍÑ¥­âì¨]E½�j¹a©jÏé�x‡) âôF�ÃÜ1 Š]gǴ׸™N—!Î4ÃéæÙS ß;x¸bO †–VŒóg+@—O—�ÊoÐe4ÑR'Z‰!GÁáX®2J-¤jlÙ¾ß;�ç:÷'±e4’m޲�šz½rÛ$¼ïÑ’Õ¨)É6GOæÄŽÔÕ$a3-ìc@¯Šó¥ýôzû-êÞ sœ?ã}¢¯å7ø:À™fgL�%%¯ä>kûì Ä�!ÌH¶‘*æ€u»>Á>JÄçÖ'°Kû6cG_`¥g$ÛX—"§ ýé\m%e 1K–všrˆ[Òqi¤°d4’m޲“¸â8b·s 7Ô¿så¦=ijš„ÁxÙ›tÔ¢¶Ïi�Úo�v4ÑT‰ÚÛQÇÇ0dž²B4’m޲“ðâ8n÷}¿Ë µ$ dbÒVËwì¿iL �d›£L[Eq©�Š¢=Žq@UµïïrÜs4M�q©·çè�S¸AŽø™Qû F �&šJþ&ù¦±ô§¡ŒIíX®qþ´Ç7¼w‘Õ6ÒÉ €™f2Å­y¯¯£Eã�ºÓ¹ÀùÓÛ.© a—LàL3عs¥øiÏ[òT:ÿv6×8-ù4Í ü8ÓìÄtþþ-ù{,Ù³w�¦g_¥Ô\»âƸòeÔ%-š¡Ú='¡å½hsT…ÄK;Ô´Ís¼>—¼ À E›£Éeè®!|îÃ{±Êük¨Pûfïyíž@y ÎH¶9ºüD+„qÕÔå~Z:†Qáù÷~Ö£|4> »`ªR- �þ´ ç=154îuƒB ‰†ãtI¼òã>�×Ñæ éÌÚ)@-{Ø¢q«lM´›ÂÖóoz�Ç�/�;´#º†¹£,”…à}ÍÌË°Ï Æp¦ÙÜçuõûý<‚"ͽ@æÐŸÌΟ{¡,D`�†­îÐG4Ñn§ïŽÄÇ”Ùä%�¥=?½I!c@#Ùæ(ÓVQ>Smдǹ¹Â(-({/9:>ú'=…te›£‹’Žýï¬ÿÃ|¢?ž=ŸŽçæNZPf"2Zu³ o¹²FiÎH¶±.?ñˆPœRôÇtµ›”�”Ö~�»zB£´g$ÛX—Ä&Á�‡±üœM¢;e›£Œ£Eá\¢]³p/-1Áø^¦×á,hwoÑÐÄà,@ ’†½îPI4Ñp¾lÏw½¡Ð75 |·C €'S^.@|Ï üŸ8 Eú¦BÞŸÇñ6 žÆ€¨ÝÊðd ÃK˜ ´ßa‘h¢©ä9÷®&Ï…@êЂi<ùðò¦�íwø#šhªH×$oT?ú=µ,Ò54’m޲“èâ8n·Kn¨%‹T÷ @‰E ‘ls”“º{:XÎA»? Ë}´ À%nJúù~¾ÚÇ(�±Œªè� øöV]ãN¦2@× çÔ+¿C�8ÓìÄHÅÜË#¿ ­dm Lãlg$ÛX—´ˆ#P»(‚ò8˜…¬QÝ'�y:H,‰5 ‘ls”9S!†ƒQB—›i‘-ä�æo~pHK% qF²ÍÑ¥­âPÔZï‚z%®…ÜѾUþ’éïÖ¸#ÄÉ6G—¶Š#a*�z%¬va ±Ý;Áxª¢Í@�œO¦ (t…Ö¸•Îa!ÎD³CŠb¤†tŠqF²ÍÑ%Ò»¢÷<…°F ÐH¶9Ê´Uû{'Ð.ÄÓ�‘H;=÷vÖkèµGŒ�d›£L[Å‘¸�Š ^ ëc¼œ?ٔϿzµý|ÄÁjO„;o ˜S"ÃV7À™fuÌ>ìJú:\¢g$ÛX—´ˆãp�®• !ý’rH›¬9ýXßùÕ)ÄÉ6Ö%-âøÛN#V.„r¼Av½ý`Ž4`¬éí9ǹ# ^Øbš`Ô­Ó ˆ3ÍNð´óþU’Ç|<·‡ óþ-­ôk}ÿr˜çN4 *eÈcÜIò@œýϬž¡å{F¸ð_‹2¿}.é*—G%Òß:Þ0ׄ À Ekr®O€àܨý€‚�¤,ËaZvÍýƒ§4ã�‰QoÒÐòð²,¦mFí7øšhjÈfÌŸúB:ÍeÏè46�F²ÍQ¦­âü¬]A½’쥲+þ¤0ûkçÃÈä"½A8bÂÉk˜ã•ß`uh¢¥!…2ï_ùM7Á|ðL …‚@#Ùæ(suˆá­^(a3-áÃ�‰¹}Èw9«h`¥Þ¤  ?0ÁYWÈòŒ[Ý`yh¢ÝÎu+YÊoL�&80oigt�Ór'Ÿÿ”ß xgš�‰1ï_i]¾Œ&ÐïwÇr�Ó‚�Ï¿ ÊoÐ(€3ÍÎKÆ¢eEÝ»25Æ�F²ÍQÆYp˜•ql(Lç´˜*q(ûvùÙÓñœqF²ÍÑåü¼×ú`H×ã"¢C@+ Ïts<ÁØEÌÄ¸Õ J�&Ú ^9AÊlÿïªL{£»mg}Ú›}wÌjŒ{Ý`5h¢áÎ�´¾Æ~‘ààûCºÀI1Àg5Få7X šh)²Ì $-sv¤Ë«}ÙR¤h$Ûeþh@Œ£¨Ð.V¸Ÿa.yŽ}—nÂX£9g(ÚUÒ"Kýi\+WBœ*öÎÆû¹óUÈucèû8ç8—ëæxâ0LŒ›é¤âL3ƒü’i˜!VÿŽ1 }nÝ (Ä ŒÚo� 4ÑÔ€TØU¼¿¯ãe°©€8#ÙæèÒVqÜé/L ^ bž–:§ý+#™uG§ßL €Zèñ¹„Qû 2�&šJjÙ‡øŸ€éxwŒ<ý¹\}J�ÃXÇp0M0nsƒ_@ ‰6÷‘iÉwáÒ=çÄ|7Äœv4Îç»)~ÅlÇ¸Õ º�&Ú�.xú{gôh3 ÜݟӦŅMÝ7b ßÞGeÚ*¬ëN9Wý ÛeNW}?ʤù9寊Á?x¸wÎ�þh‚{zØ£•ë½}Ä™h¨—CTØ{~å÷4xíwÎúƒ¹úsœjHœÃ¸Ý Î�&ÚŽ?,j˜'ð~ÞËA´*�vÀŠü6»°ˆ–j�¤\H~p8!)^§ÚöÞ¿Oà ˜²4ƒ®qîpg?!ó0n¤3ˆ3ÍhŠÒ;–À´¡?   –¼øÜÀ¨ýFŸ�&š÷ù“–¹CÌh jí�;Ýàh¢Ù½ ¨ËÇPÅúã¹úT1G�¡öºÃPÐDÃ]Ç]Úãïì#¼ö=ûãý˜.Q>wÍž]`+~Ý¡*z”)ö÷Î? zF¶£Âq ç —…v£ ·è‰ÃRøâ¯ó„þöÐпÓß ‘ÌïokÍåª(?©¶ ]÷°¹ @#ÙYsÙ‰¡!ŽƒcO’\n¨EZŒ¡Ô£-Æ^zÂDëíÎHæ÷vÉù…ŽÖíˆÂÍ´Ð/´›ë^ïï)ì7ÐHvÞqî û3ºÜJ‹³BËyÊDj9éihf†-gÉN[Îá*Žˆí\õBx½îïÖmºOPªý]Éüþ®² b`‘î(šö¡2%¥%Åø=ÐÁ„5O;„(!žôžÕwšÉ4ÑNp¼Ïúæþ%ý¿ÏÞWwž7yûù›×|»/ÚÆ@ŸªFe~tµß íhÿCSgµ­îý�£ìÿÜVoW8Góáv‰úê4’ù�ue§Lã¯æZ½�i�ôº]®×§©?š°“@#ÙI'ÝÉ÷B'rýY]î§e…˜X%ï³ÔÃl“•DÛCÊÔ ºÆùŒ¼—}qÿ}Ð}ƒaœiv ÍýGÎ'–žo›û4’mŽ2mg íÂ(ê…tiégyqbé|ï¯rhiÈj(�'´4¥È7PÇ~ÜêF«�&Ú}ÙYO Ö’‰ýP´Ö:�d~s]YÅ©A»H‚z%ÏÐ:üû~ù�9ûGÅÅ?�d›£L[Åξ?›@½90» ƒ>{µfQ˜-h.RkíïûfÍjk�F²ÍQ¦­:þœwJ_çÎ&P?Ê6G™Ò6O{ÕÙöé…ÑÚæ4’ùmseÇ�v.‚z%ˆÅ½û}¯ÜËž‡s‰z÷4’mŽ2Š 1„]~H—{iñã²yŸJŽÏ4^2­y�@#Ùæ(ÓVqÜi•œ ^ b^»~מ?¢÷XÜ®:»üÞ¬  O´zñºé£j•3@”‰Fžwê÷Â4GÛyM¿jÕ#ÊH¶9šÔNpÒôÌQî¹äÞè#ÐHæw‚•UgÚ-"¨W‚F‚ç{âLâ�ÛŸe_M �>§ëÅ n%�Úoô h¢©QÃw×ñþηú½€3ùÝ^ŒK!„ãM‘®¶Òb—Ã@7mµBi©u~h$ó;¿�·‰—s¼iç¾MÍÜ}›ü�ºWsq QF2§Œ¼m`gߟËù6B̸lF§ æw ²]Snu£ Ž@íîãòºÏYÿ u"©1ü×ó �>ý̹%.ÔU÷ºÑŽF ‰†Çí褥å�£¦ÖºÑ€3�õ¢�Ô%\ÍYI»^Ñ.Z†3Þ�ìæÔJ”ßhAÎ4;:0¡Ê�îëñ7÷¨Ž DÛNåç“�쮽¦8·•‡ín´£gšåä——ìžJøß¿ÌLº·jPô©8ö•a|ÜêF�&ÚíõǹükzçH¼z³¢Ö4�dZk:aÖy$ˆ´DÏÛ®]ôéH×�S‡yÔ~£5�@M¥(Q1¹S{´ÿ€!÷ߟÊ9Ìç)’„méa£]iÀ™fs'¨«û,oµ_º± ±Œ@#™ßVVQ h—GÑÇ×-Wåݹ˜«‡Ûu�óIHrÞZ›|ÜîF›�&ÚŽ¾9,Ùé¶sRªLÁƒ{kîùîûåt>C‰5‹h$;i{!#Äq,èOërC-°Ä=ìçëï½E³ØÃF ‘쬇¯âXP�ÐÔ �…ºÆÉ±½/»ä~›EÎ'3=WŽ èQ·Þ¸Fœ‰vö�¢.ï��ÈKŒýy\}ZÒ 'ÔqµßhU#ÐDSãqÒ2e—¹¬{£KŒ@#ÙI¯Ø !Ž#@»\á†Z8)èïÛä ¼†Zl##ÐHvÒLö‚Dí¶æÕû[Þ˜ÖDïßw”/€>aÉ¡ÄérÇmÜîF«�&ÚN1bþ[ÇPM #úþvN×8Ÿ`tã5Ïå7š…€3ÍÎËÆ\ÂÏÓ˜òh�9ÉüÆœ²Š}\»&ŠzÁaö­¯ªô½.Ÿ^gGÚ¡wë�9Çù´�ë)±‹6èÖ›o3ÍÊ|{ì~¸ÈãY£×þŽ&íЕµ €>)Ç~ñª8î¢wg¢ÅäP’ßË÷à«}ˆÏ!°¦<“$Kž”iE¸þ t)Üb¿ÓjqÄ™lt=ÅlâûÕŸbŸ†cØß0@�·ôcQUž)ø®½òŽ»Â Ó[uôY)ŽXJwÜMoã"ÎDËã–éó™?q^N÷17‹”–)�d~ËTYE±¯Ú i—â(µæ’ò׫ÂZÖ©µh$óÛ�½× —sn'î£Eó¸ùÌo¨M‚”ò|Úù}H€ÉÜ>¤°ˆ`;AwJÇ‹3-#=‹ì›Þ’sœË¹q‹»‡ƒî]GÀ™f§çÙ¦ü�ŠÒnûõ’G.}Vµ)¹\»?±:ìv£ 8Ó,'o;Ds¯'Èn´�Rôé öÉq2Þê¬ J©Šf·Øm¬šÞSº_½Ya·€F2¿Û¨¬:ø�Êõß{ûDõÄ’¡²ÑíLùóXåR¶ùtâ¦0ô4k �Û™[˜Ã^wzŸ4Ñpä§*ä’Ÿ‚ÔŸÑ]~Šb™ÐŠvºÑŠœiV_÷A¹Ù>ôBÄ>(�d§}Ðp¥V?)ê…'6ë~ïå™ÿø;MGÉü¦£²ŠQ6‘z!ª¹½ÆRæ¿ôwðÈG��í*Þ Ü åùkîüõÊït;GœivÆ]ÅG>Óç~M#¥«8#™ßUìÖárö®íú„ûÈ®:ÿ–ÆULo€ÓhFÀzÃó@Ü´ßi,Pû™c™¾ùá¤Ònkùs,à0ŠI1ð„c!ïsÕëwÑ{�ˆ3Ñâ¸×¸kéŸBÒz�4’�öû|8A–’ôÌy,¸(^ÿæò˜Ú›Ã QÖ®W€3’¹M7t5!dΜù³dEÏñ¡dÓ:‹4’ù�EeGàz ’z%œwQqWzÅ¿a¼ë�¹IÀqè¤N+u,Ç�ôN'âL³ú²×™ðu&ñ7Q­5;h$óÛ�˜3ÄNÚõ 7Ó2 ©ý¹o—?¼ô~öõ?h$ó; Ê*v«ýÑêw<§ú �Ü^ÏVï+OÉüާ²Š�{;A½)Ü&'µ ÷ýÞÓ³}Ó^ì/"ÐHöè/Nõ3"}'Xë/"ÐHæ÷•UwÚ•Ô+A ÝqÊP?ÿ†7¥ñ…~¶Zá|R‹}vØâvºÑâœiF�­èÉU|OÛj½<ÀŠN:y"G¡îR]n¥E4·µH͹´]ñË�¸éÙê'¥«‡@#ÙYW�¹±Ç‘¨V¸¡Ö¨Ô kAͤ°ˆÔ"ŠÔÿÜ·Ë^þ=÷õoÐÿDœ‘Ìïz±#ÆqPèÏêrC-ÂtŽ -ûBÁJD…Ö¥€>äEîgŽÚo4Bhº©Ô$œêGòªÏQÚ(�PÉüF(yÅCþ·]›p/É—ÇMÑ}«ûMQÉü¦¨ç¨c{àþ ns@ìÎ=÷³7òòSsnÈ} cé€ç8—û`%5šÆÍôFâL3|t=uºëÙ­.Îí| æTœ8Fm›q¯ýšhx@KvØCfL¬ºšjMÔžßñµßèø ÐDSûŽO]~Ń céOä.â:)jà Êo4�gš�qW%)y9±©8CÑYK…½LAånÃ|üÐJF÷Ñ®Ò5Îï$³+rÚ<Ü(v»Ñ`œi†“«¡ÅT>¾µdÞg= R:4’�t6:W.g�V­ö‘Ý#u’öõ9¤�b �F²Ó>x¸ŠY; E½àÃ>FÚj.³BK¾ñõ>âŒd§½çp¹³v(ŠöØ5† ƒ}§nSk ÎHvÚW‘KíÏ$Ò»gÏË•ï(¥ÄtîºRÐÌÿÕl p~—š|¡Ö°·»Ñ°@ ‰¶“÷�sÔJ‡ùh‰?7·Ñ­V“B ß¶v}45?Fí7º&4ÑÔÇßÒ:Ëp2ÝËɹµ½ÿ1ïüÞ£Næè·¶Q™Ú5÷»Ñ5A ‰Æ_vM’‚×Z/ÉópÉJ×�F²Ó¾|¸Šã`»RŠz!¨Æ ‹´×´·îÞ¯ ÄÉΚÏÑ"vùíPåqôÐúûn÷û4’�¶›ÃUì^û“¹ÝÍf_OHåW‚çþ|Û˜¾8"…@#Ùæ(ÓV±{­Fhê_í:¼ª=S·ËIïYoÕ9Îï]³SÔ:ZÃv7:Z€3ÍòÞ?3Zn�£ „–1ºÖv>×8¿cìºijç Êoô¯gš�ä}ŸåN;ë^£Omçqò;×ìœ/»V¿-nt¬z� v^6‰žùñ·þÅb“pF2¿IDmóÃŽ½]œp3-JH]š)§Ë¥i±cŠ]ÀÉNÆá*òÕM{ìu®[ SÎH‡`$¶@h$;m�„«ÈY´Q´KއûS~î�ÛŠ Éü9¶3ú‹v$áF±ãéÝJUØ}%Ž¿à0zCÎq~ã—|µ…¸·2ìt£'8Ó¬¦ËÄ��GŃ֙Òœ‘ìÿ£!RõÜoˆÎHvÖŽ±­&HÊcg,ô>r z�6?"ö>h$ó{½Û —³?mÇî£9g© RwËèït« @#ÙYdjé÷¯‘öÈÏF¦òs=\Zõ¹ßÏ»=&°ÿn¿ßW÷âñh$Ûeã•ã6Bݦo_‰ýÉÄþCˆá ÔÐåfr„£NÂã›É²SÚgÄ�dgMîÂæïf~ÿõ‘:]XðqŬxÒ…%‡éöF¨»0îw£-�@�'I…}Ò’¯òçó÷¼Óa’³¾m´†Ýn»L¡jŃ{͈ª;â¯×Yóü\gÓî¤÷êùLì ºõvÀL³ÒóÆ�úêÒïûM”ï;ÝtíP:¿û;”kœ¡hsT]7Cö=òe]�–Ð Aœ‘쬯b7ßG ^‰{q»®^£òY·õ‘þ¹ƒ±*J’㾩u}ärñˆ˜1ÐH¶9Ê¢.Mݧü]Ÿã6Žº42’�tiÿ»ãò‡Áæ¡»Óõ¦Ñ±v'tô»Îì¥ãvɸ×�v M4Ük—PÏ!߯Ú_Øß¡õ*g$ó{NC6„‘Ãk×.ÚMq�íáÞþöNªŸÅq=ŽÜ¶:™ïûÙª‹Ñþl €F²ÍQ68Æ]iŽŠ'Zôx½-§0·AëùNîË ªõvÀL2²”ÁÇ‹mê�”—Ì&�õh_ /®% ¦œÛþG®¯�H„3mŽ*ö†UoßæšÅèé:[N0Ü+ö¼%7‡¥bC 0ÛÖµ“í}®ë1àAmjt_íÏ€~ŸÚó…Üåµßhj!ÐDS½¦ u>ò[]?µÏѬÒZ&4’�4M8Ä0víí‚…ûiq¢÷lïJϧb½MïR»œF3&ÀI~ËïôŒÊo´nh¢¥Z—ä±fÚþ›ÊöçЈš$€3�´H¯¡ÐÁ¶‹ÍÑå¸Ý¢8äØî’upn�=0É·úÝ�A÷�F àL3³æPù*­ŸîP–)[~/Ãܵ0’äÕîœêÑÖGþød™ ‘ls”©�›ºßð¼ŸÖ¸A ‘ì¬qC>:†±óíëz?Í“cß; �úRÏås|ÐIjœ ÌHöÿÑ8ÙåÖB«d¤Æ âŒd~ãDk\<–ä²ëë­R:4’ù½ eùßjƒ¤]ðå},¥ľK×ñÓZ€3�4.Ð;GòzýÑ\í$9P¯�²äƒõ‘nµÏQí �ô‚?› ‘ls”ý ÷¾'3j¿ÑÌA ‰¦j”¤iÎÎk™[$vPh$;ís‡«Øû· ¤¨B‰ëÿ–ä¡káyœéضEÏÖ¬ºÆ¹}[v’ZÏdÜMoš Î4˵¶Éã•Ùœ$y×ÚÝïiÛ�F²“¶‰*BÇ€j–°¡P®º9û.9,¿×íÄÉü†ŽÔPÉßíÊ^#ýŸ÷�† à E' ÇYG(öíšE»i¾4lòÔ� T=ˆ3’ù ŸË¶Ë®à½>Û�ŠØvA ‘Ìo»`¿;Æpdè.ØõfZ˜‘ÚùƒèßýSœb»�F²Ó¶x¸Š½p;E½àÒ]o�?r¸|×ïñÛ¼ðŽ®VE8#™ïÑ/Au—%¹Ð}ðWëÌPäv�<�8ç#O©ö7ó^?‚|];œg$;ó›Ø7uëýÄ™hgØoÙ•ü ©Ý(C‘ÛlÙó±Òëè®Ñœ½xþ2ûñ7 ½ˆöJ’O÷©Úh$ÛejfÜïF�&/µ:’¢G¡<>�"v:g(:íXG‹ØÇ¶«%(üµëŸ™WNÞlÊ)[×Åý®sl^3*ÄÉ6Öu’°R{ m÷Êî4eûkè´¶âŒd~[ÁqˆŠýL;¨h7Ée…í…}£>�VÚ 3’ý´žy»ü WMj/ÐHæ·\wâØÏ´+n¨9-·áÀ%û”~ùwþÍﵺSëÐHvVë;}êG°Z%ì'9Ó£< }—W×UÊ ‚ï²´i›Ñ�]�d›£Lî‰Ly”óÿÒ ‘ì´w®:þœÜM^ŸÝÙ(ê©5�Êä~CÝïûyµ¯#«ýÉNØá*ŽýÙDê…P#UõS~™Jò}¯£ˆÖªzÀÉN;¤á*ö¿í`õ‚3wýa¾Ó–O{¦É龂—ÛmºD�4UÉ_ Åüo£;•|�2Å^¯†ç*ø‘G×KÅû9n©| ‘ì¬|v:°!Ž][5KØPó“®óyä×b$²MnîÁ‚WifÀ“,¹(­Ù0lw£Ù8M÷œÑ#?"’œÊš_æw=ÁÍ´“ºÆù]OòXZÛaØìFÛp¦.ÕÙkÞæU áßÅêlÉü:[YU¼Ëúx­ùÕM7È6Ôäy¥¬y)Üþš¯âIgÜM3)žô ÉwyU>Ôʰ›\cÎDË¥»iú®Ÿú&øY«± g$skla;–þb]*W|ÿÔ³êÂî§>Nû{ð#n6À“Ÿç°:ízYO@Mu<Îú-ï¾*Žã¤ƒFž¤M„shŽW’ éq;½ŽFœi–óÏ}G¥ŸíräêÐÔ£rwN8¯_çø©‚†Ýä šp¦YVÐYÉ\~±�öš=­‚& ‘쬂&¯(àØßµ‹n¨9O·°ÇÒ¸í×=&§ÕÔ4’ݨ©±*Íš íþM‡z£šEœ¡è¬–e¡Ø'¶ëí¦ùW/¥Åuý¾+Õ�¿qœ“PÜÐHvVÜ’ëpäëQ ûIÖ©¸³ò%;Žôó^ü$y fÔ5Îí?zÞ ÊáQ³Xó#È4 ÁI6Èwyfâm#ï÷ŸãýúÓ¸šèJ¥";ïWÞ§•.ö»eýJ‘M@#ÙY‘MNRÀ±÷k§n¨¹R©ö_¿káQ¿Ÿ'œVPûÐHvÒžV‘®G£hWü9»Å¬»0¤Sìcß‘ü]3*º-EÏyrõ Úõ~M45¿¤¼!ä—i¯éÇ–kÝåhjö¥oû}¯�ôË},ݱ\¡llŽš“¼ËuØI,ò eŠÍ^‘_0)ã}æ6‰Ûz$¿ÒÐÐm=úN ËnЮwh¢©Ž³É¸Gþ%¾_ís|ÔÒ#/ÒÎ&º==Ç%¹i5Vì°Ÿ^êÐDã•bÍ´ççc鬊}Éübßs‹!Œ]MµJØOó[®Xþò ÒüÞ?þÄíFú�7«®qnÑwPŽ�ºåþÂL³R©ô³žÂN¾¦ýÁ ±Ô' ‘ì´®bÓ®Œ¢^ðWîOþ•ßdœ~¹ïü€œÛ_¤ßr5+º½Cß1`UÚõrž€&šêù�WžÊHîã½N–û{äPÚÑ@·¿ç{'(xA¹\(ÎDC¥’4kšóïðùÝ?¡•¤„3’�”¤Žç‹`äQÚÅŠvS|“ÓÍÛU§Rò±?ÜÀÝoöÊYÛs:îl©€' ‘Ì/àÝ â8<´£ 7Ôb�SÒÏé>Ë¥ö¼¿­ŠŠïvS¯�uúUÐH¶9ÊÜj´ë­šh*¹èg~$¹¯iŸ¨·÷;—ŸÛ«&…@Íùj-†¶ÝûùÙßö)¶h$ó[ NãUÀ±3îërCͳ»îòùW.«‹’$xïŠP«jÀŠÎú’á"ò*íÞ‰u J+ŸÓn¯Bª¿ ×•Ï4’�5FãUìÙÚÉê7)ÕðûvßüLö�qF2¿†w¼r #wןÔåv’ëôRUª‹~*ýÀÇþÁ0µ F ‘쬠f§ãØÛµ³ 7Ô\';Åtþ…C_Ú£‡N»Ü]µ)ÄùÝFÇurÙ=*¿Ñj@ ‰–¢kþÔ7}_ߣK:8ÝãT~N·�J€3’¹Ü©éwÝïy>æÒ©ß‰.¯7êè÷;=ÿI ‚Q¹ÞX@œ‰†z~ñ³¿2é“ÿ§ßXD�׿ç6=çÉeþ¨[om Î4;•‚ýóÎUònÓþž±`Gœ‘ì¬ÿ¯b[¯Œ¤^q׎Ç{W:ÿõú{ž´Ñ�4›®qš/;idP7`ØîFp¦Yî´5?ïJ̾æÕu5ñ7ÜŽé&y‘“¶u†Íô†ÀL2Ûõ<õû‰Ó=Ä_tJ@Í­ˆ]Žq;½Ë�8MwÜQþ¬`ö*óþ63îh¢Ÿiu sšì±”~°•ÜN”I6»¥|~SRú%/­OJ�Løi×ó P~‹ÒsTS÷ªoôF˜I6Rþ…f~“w¾ÅÖù(•ÂaF²“”S!Œ-íEÛI?<¯Xærsßí�Š€6+ Õ©4’�Õ©BIø)ôYúÑ,Ï;%!âŒd'Ý´pýn«ŠîØhÅ_Úl-„x7‹´Úp†¢³ÊÏñ8 Ìí�¢Í· ”¢Ÿò�êT->Z/S+Eg$sKQúp j?’$ùt›�hsT9~±èí^:Æ-Cty�=8·èzOªpGÝzeŒ8Óìtý`ÉcS®öØ¿vå4 ÑÁµs €~;�½¥T°�ÛÝ(Øh¢ížw~åß–ocüŽºˆèw«U!Ðo#²×jøq¿E<M4ÞOZ¡MŠ^åÑÀ¾ç¢°4’�°N0 q&Ú% ÷“BŽã)s&™|ðÔˆcîá¡Wn&]ãü{x¡ÐöÒë|€™f5¹î IþïÝA:�ø; ŸGüÐNóÊ~‰_tç¯,½Ý]7=OgÓÎïæ¹^ ëîA·Þe˜iVºžhÎݤî«N/]Lµ)úÍ<×_Q‘=j¿ÑX@ ‰¦*5|Ò³æÂtÐbZ�8#Ùiã1\Å®¶]E½à·O“þ°œ¸¥»ñqÔc÷œH3éæ6ïÈ)Í„q+µ™€(ÓŒvËççþEóG†û=)¼S«M!Pû½ø¥ÿ¨ýF�@Mõ22ª:“¢úañéè’KÕ*âŒdgõ*ýÒ#ÿ†ÛÕŠv“Ü�{O?ówºÓíùÊ/Šõ:Tx¿6“.a^‡Ê½ñ©îËÕ2 L2Q*MˤI)Ÿ}Íצ4’�U§<;ãÊé>r²ô^» meC”mŽ2©h.{¥Ÿóó sŪ€F2¿nv=bˆc/Ó�Ôõ†šËkéiÿüÚ÷SkiÉÎjiö‘Sýðû÷xˆ�{ŠèýÚa@¿_èºR."íwJgšhªë§òÝõçr\hê,‚Ïi's “|ž\Ÿö›Ý(OG˜If;¾²´ØRÎôÍH=é,‚lgOZ‹žG¥šqP~£Bœ‰†Æé£|ƒü»ÌùéÉ)àŒd§ý¾pûÜjƒ¦^pà^ãýxÁiÜ�oë­ºž4îÈQJÅú°Û�bp&Zî¹årsu3ðºvàêÚI@ÍáÊ%ü°ß�€&ïºÅGžºOþíÝ^AètG�×+À�4Ñ{z‰>—ÅÃnwêišhºRO¿¿õëéK¾Ê7 jÄÉNJj !!ˆýr1IØLrñ輫Þä…—¿NmóÊÿ9^¹3çf(òý»Vá¿‹õå_ßï� �F2¿Â÷|AŒãy;ªpCÍc8?»wyÕNJ/¿y⤕¿§fU<é’y?N*ÖGí7ª|šh*ÿöÓA–¯n¿žG”zWø«®'ýö»­ù0îw£ý€@�×Êí|#Örø×USªmÀŠÎjm¥°}*×ö{«˜XØ"ÐHvÖ‹‹W±›i·‘ ^ñYÞϾ¼Ã¥|*tj‘[}øSjV@í-×ãv7Škšh»T×¾÷·ºÌs{ˆ]+lg$;kÌÅ«øç\¯—¤^ñ Þ¯þ]žN¿Þ÷þuL§÷¿çfU€ó[ä”{ÜìF‰�@-§ú–jĪ¥¼ukÇ�X\"ÐHvV\²{Œqì÷º«w½¡æD¥šwß®{e„Xó"ÐHvVó’gJ°çø2ËigýŽ›ç¿¸Üµß(rh¢©ž{|¯•ª|¾Žv!6ÙÐñÕ£‰pn—�}¨VᎻé.âL³\)ÜÞeì8I>G‡B)Üg(:ëÍ…‹Øåµ +WÜ'ÕŽkùäs~áÖãsÒùC�×, €~SÏuŸX‰ŽÊõ q&ê¹›µ~u:×)ëIßÂí` æHÔvÜïF ‹@�÷~ìï¥p”ÓúwÖ8Âq5*€ùm#öRUÝov£¦a&Yí¸ž¥~áùõm9nc�Si'àü69(¥º7»Q]#ÐDËÉLúAÏ�~âÿ9?ñî”.p’—9ùÅ-ÏòjúåH�©—…?¥fTô{Yü»tSGªMÇýnµ4Ñx©¨Íï¶*ï¯oO Š5-à E§�¦hþ¢ëþ’êÐ7¸¹•ïWýºñkÊ�Þ¨h$;«é·¢øGÝ*ÜNóÞÀAÒþÈž=ßu~«Þ—ëãóêO*€¹ ,Ô¤–×Ãfzu 0“ÌÖjƪ'IÖöò#±fD ‘ì´ñ®b·Ò]ªP½à£<ï3×ÿÞ¤ÏÍ+ð+Õ¨ç÷®ÈGIeë¸Û�²�&š®UŒï¹~Å8•å­µ®•Œ4’�6ÞÂUìóÚSÔ ÔýÍÏõKÆé}öEKß¿‚Ÿs³*Àùí+r Núˆõ߸—^7"ÎD»ãº±jI’O›‹ëFÉüºÑuŽ!޽^wí®7Ô\¨TK¾ŸåkÇßGþ>í�Rp†¢ÓÆR´ˆ½Kµ@R.x*¥hL›•¯õ>çü7¹hD˜‘ì¬htÜbˆc×*ÜPsžRíøÌïuJ?ëwxkGÀÉΚ[Ñ"ö,íX屓"÷Sô¦Ÿëã¸å¨e„~¥3è è÷Œ\'ÅUç ýN¹ @M Ö©~Æø3åwkÞ)Xh$;+XÙ†0ònÕ(a;ÉSºhÊW³|Üqõ›Dè\šM—0¯IÄ^ÊK`© v’‹W@™d³ãx¦úMà×ñ�\§C.¥P<é‘’J×a·;¥+M4�¼QÁ¤ßóÔ�m÷ ÿ�ÓïÞ�ÓPó3j5]o©ä�Û\‘XNÎHvVP;€�ú5Úäb÷oa©•#�dg•£ã4C{Ãj–°¡æZ=ð¨Ÿý½ �Ûið[oF]ãüN™ç6¸¾tß(©gš�Žxä|é›ß>sÒMƒŸõ~$—¨“V97iäjô·Ù�¶G™b³÷«_‹›J¿Þס—:Vð{.ö„8¿eE®A«¨ÇÝôŠq¦Y®ÕŠUQr1¯ƒúÔjEÉÎÚmñ*ösÝåŠÔ+NÓKÖ°ì[¿•ÌŸzß(g$;-ÑÆ0ö1í¤Âý4‡åýø“öò}Þù‘gXNiý»Ù Núcä"¨îUß(Xh¢�Þ~Ýß�±.ùþóVøS®ýŽû'�¥btÜíF‹@M�ëØõS¿H»¬ù‹Ø7êXÉü:Ös�1Ž}^»|ᆚu¼Òú©ß¤Íïî8òà±�†þ¦u�s;džëâbtÔ­±ˆ3ÍN­ˆ]ß•~{Nù•É7ÊXÉÎJYÇ1†8v9õr jþ‹]@Ò½æ_ä²�j¥áo»ý6™ç(¸Äµß(«h¢©è‡*¦Ї[Yè`ºs¹ú­,Ï[q5�d›£ì$§¥RyÜïF��@�׊٪©¼ËgZþÝ(fh$;m†«Øw—,T/xu?±…¢4�÷þ^ì×�bqF²“bÖñÖŒýp5*ÞNréŽW|Ö/®¾–£1ˆ]>ôwÍ¢kœÛècשTØã^z‘�8ÓìkÚgýëgºUÐö(§]Àë%ìQÚ  ¾ÉÍ©�êÇ`s¥ptA”:pF²³:Öq…!Ž}\µJØPs˜žšþÊK‚ŽW†p[ÝK3êç÷ë\WÅÅn¯üN�?âL³Óù…Oõ›§¿oùqK»íT ßÕcG V÷Ã~wª{šh¼ëz¦ú¡Ó÷ñfE§Ë×»•vTê¤Å7:(©Ò¶Ò+}€™hµXÇM剧ßM®Ô±€3’�u£Eìîº )�=§ç|õ›¦ßùo9k¢�?éjQ“¼ŠZD÷›Ý©¡Gœiv»?ûGý°é³,'ý4ø=·s €'ý4Ï9pá;h¿S1ÐDS�Ü�êÎå›?Cœ~ÄÏcšJ)Wf$óËUö=ŠÝJ1)ÞLñOX?W­É{Lí©8§©þ¤3ç xÒÔóœã£r½ˆGœ‰†JEüR˜­$ù‘T+âh$;+âÉùTXr"¯¿ÏQŽ`_qt+íj¸“¶"º(7m¥xÜîFñŒ@m÷ Õ„{Ž/âvúŠàhÚa@ÍÝùEö¨ýF¹Œ@M}ü{à=”0Ëúšó�öÃ$ÉûonÇ’.H|òc8– œ¡hsTyNz)=¿¹}3�›šè|w{.Q~³Òsã\Owªot”)º¹òXô.õ½$ùc�ÇÝVÊ2�ÕÉäC{·zmâÝ4O©•Ée»ò„×þi#±Jœ¡è¬©.bOö;–H¹â]÷©ß }|³ò»…èCšUPódZ÷`ÜMï ÎDËÉý̲¦ŠuîKë䢞ùAæß15W7ÓÐH¶9ʼvÂò®ìëñuAîÞ¥�çæWõƒæ­ À™fä~…ÞÃY,ë²1­x·%Ÿä«9�ôŸiÿe<‹+�‘lEjïb)ïL’ï‘r ½ DÉÜæj°„|};�Ho1<Ç[Õ&úîê@èš‚Kí̹Âù]SrÏnß„šãv7º4Ñv¥o‘çÿ‹C;Þ†%õ-f$;éj†‹Ø£¶k+œ3¹Ý¢7yÏùïõS›þ{mSG£Ì9‡Š6G“ëq÷×Á̯öYd;«…8É¥ª}œq»}šh;]·ò^ðä2iP0I’ª°þœšóýT4’mŽ2µ‰R÷K>ïqŒ±jmÉÎZ),b‚î´®7Ô¢Šç#“öú£Þ2:¿fVôûÆìIãÆÓ¸×�ÆM4Üë¯ä²$÷;�lìí¢CnÇt s[»®k§^Ç ZoïÌ$#µ.JþŠ_ö¿÷Û‹]Éü.Šç)c»Àj–°¡æOÉSÍ)ϵ· cï�â`ÒÐH¶9Ê~ ¡¾I3j¿ÑÝA ‰¦†ý�¤dÉ^,û~¹½ C‘ßÜqCGã�Ð.S´�^ÈÅË÷ÕU%ØÿF×Ytôàì0±«Šs+b–vW²¶Ì¨jÈsÕ�Ì9CÙ(Ø5Z*íS>>ý}çw3é=(ÄÉÎzPôÐÖþ¸uz¼»—+û¡ls”�hØ_ªÛ¥Àð$p|][ì•!ÐHvÚ¼Wq̬Fhê…L1¬<[›*§o~#‹×½â¸ÐL €ZtúuõúFÛ¨ýF‡�&šêİWý¼õïã @@€êNåäpæ„^ḋØ+D�)æb˜x•ï:gå¿õG; ÂïL.@6ü÷æ(ù5ûnߨUl"Èó¼õªŸøþ¼[JI¤ †žî$.p.oÃQÌ-D©8î¦wgšåZÿ0)z”È3ÿ}~6…íC€ŠÜæa¼†ã^»N±ê8‚ºqhάîÞÈìÆ—jR„óÙŽUNë’;€Ãn7:‡€3Íð°sXu$Á«}·Kk"ÎHæ7•Ujºëªâ–ÒÁÌŽ:;ì×óàû¤&âŒdnSXÄq¦‹ <Yq³²î”$SýT.†�Óf%�d~³RYÅ‘§;•P½ÆÜˆ0—�›¿?í£gLc¡«oV]ã|–Ê Ôä”ßhŽÎ4;µÖhQÔ?Ð.vFg(òû¢Â"Šw¿ëêŽC§žõcê©ü|mf`¯À·W“BœÏLQœP:³ãfzkq&^}MwDkvÙÏožwú!öpó;¡_¸iGt�3ù‘Kë‰ÖÝÊWXž­ÐVZ¢€3�4D9DE Ž=Ý)]n¦Å1 Ïü�ðTé­GvMTöüÍ¢h$; #ÔDµßh#ÐDSµ¾hQ”ßöD‹Øœ‘ì¬/êD­GÁ »^×ûI�Å�åý«É÷/G´#î ¢A3*ÀùÔE¡ƒÏGûZq ŸI2··ôŽQþgP4’mŽ2•)(Û•×!o1€3’mŽ.m'ÝÉ„ê…,…B=÷×Óáý+ÃÀ�£Õ*õåGœ¡ÈïÊ ‹8‰hg"(§ëÂÝõ¼YŠ”åõµwºò#ÎPtÒ•ç¼#qBñ;¤ëÍ´äĹo°ÕþÈb˜j{ô4’ù=ze‡Êv,Šz!îzµ(O�qm<Ç);£.p'Ä1E]�¼èw»Á]Œ0Óìöbiþ"aùªÜñ2æ²!J“BœOTSÀuûRH Œ›ÉLÂL³[b^å-µåÚëѾ˜ÄÉ6Öå‡ÒÆA²]ºh;)ÞŽùFÕš|üÔÞyèðÛcpꬹÂ�0×N #RbT~ƒÍ@ ‰– ÜÁ«¼æ#…§Çá%îqF²ÍÑ¥­¢Ù.� ]·¶ªâ2l=}:Å¿ ñ¨³è xÂ\{Á�ø…Qû �&šª1IC™ÅÎ_þ>(9�)@œ‘lc]Ò" @õâ(ºãP¦1u³ò¦VˆJLâŒdë’q¼éN%P.„®�˜Ø7Êïž|~»‰ˆ ÄÉ6Ö%-:þŒüµ¶ù'r­|mŽ*7Nç�Æ”/0®GØu ÀͤkœÏ®s0÷:ÔØv»AÎ4Ã!L×—[¯Ïµ½î›öüÚ@-wIÇ.ŒÚoÐ4ÑTÔ•îïÅ8v€!¸;˜ œ;vÀÑ\ã$ÆÝtNq¦YN'uõ_å àåEßà …@ ‘ls”i«8$×K%©Wâ»G¼öw¡ç·$:íýäÆäά+ ?zàxfFí7hšhªÀó«Çsžs/¼kÍwÄ>Fæv4×8Ÿ×ç(³#ÃV7ÈÀ™fuH�TÝC12 $›£HYÃYBwu®U+ ‡D=¤Í^Sæ^�çS¨É6G™¶ªEàuJuñÜß¶‚zr@enBQ•§ÄàݾåÁC�*tF]áüù'í`ÒbT~ƒí@ ‰–FlÇ®c}NíSr"Û�@#Ùæ(ÓVq¾Ò_™@½’üxIDvUå3·ÏüÉä_÷½Ÿ·Àô ™ýy Î5\&ˆØ”q¿4 M4žúïý†÷1ƒC˜¶t'uôg)¼ˆ•Q¹ÎÄ ÎDCÞ#¥FŸýkÀŸã×.ðˆ3’mŽ®“t+Äq S/–°¡–ÑýS4Ï4ÐlÁ ;ƒ®`þdÇzfTFÝ7¨šh¨BÅ$=K.~¾¯¿£�$013mŽ&7¹Qœ4´ í¦% ^T/º‡×%ÒTÆÊΨ+ ±U~hÜïA„@�‡ÆšÏnY3½Þ]ïŽéˆà혮qF2?p©˜¢<…¤ç1®Jc ¤:«®€þÄ‚ñˆ×µß „h¢©%ô*œM’g{ë½F !ÎH¶±.i‡Éj‚¢\ˆ¸N›‰H•W9öþëÙƒ8#ÙÆº¼ð‚8p·CŠ6“r€˜ª;•'?ží„vp†¢ÍQ%-âøØ�H \‰µ3ÄüJÚn./¿\ò«vu^qF²�u¹¡=DQÔnçm¦Ä·ÓD|Kݬ¹§HÔ ÐH¶9ÊNâhˆãÙÕõ†Z´…–Ó®8?æ1¤ÓA±ü‚æ{ÉQp´èh$Ûe>‡4j¿A"!ÐDSÝx¾ä·§ˆ8çš�bäïl~1²�MÔ"µÆn�»éìâL´Â{A¤`òîÆ-0pw‡tôÇ-Ü,€¸žQû > �&šêÄø×_önó§=ÔÀ3¼«MΟæpâvå7Ø,À™f'ÅôWöªåA�wé‡- X·¹†ù£^Ü'îgÐ}ƒ3œifjŒQU”bõr�1B ‘ls”�$!ŽSˆîj]o¨å#‡´ŸúwùþõgQH3mŽ&ig ý=(² àå»~åÁ’½Fá ŠÍ ¨…f�9uËÌÂL4Ókî÷R­Ó4·Ž…HÚ ÐH¶9ÊDÒæ5ççýST~µÏ5h¤ âŒdëòó‰Å™Bµ)ÞMJ: �¨Z×ç³�†ñP†èÞœ  –(øΨý…ƒ@MÕ(œ¤i-oöýƒM…ƒ@#Ùæ(s³œEÉC»^ánR"B9FQ\3i, §@ðî ºÂI „ϯŒÊo0H4ÑR�+Išæò�½¥½ÁDäJh$ÛeÚ*NcÚõQÔ 9‘›Ví)Zã«g$Û]§yM€£„¡»z×ûIÉGL¢Õ�òK͉$�d›£L[EiK(‘ö8òÈ¡ô¯9K}Lùù¾�¢ô¥«M!îdÚĉøÌ3 ÊïT4ÑÒ�¢zd¯P^ƒö鳘¢ ‘ls”i«8N·+£¨‚¾Ä•ÝÊ'y¿·¸ ÀÉ6Ö%-â°ÜK¤<Žð»KN¸ä6Ö‚N (6{®qRX>a‹Ý7ø0À™f§) ,E¼ùè]òÌË»c¹Â�Œ¼`œâÚÔ¾‰C³"éªAÌqb&ó>£j�çBœifJ¬RÕSÞ+~ƒT”¡hcEn,Ž@d»ktµ—®1µDžfß&?*Ô*X‰ßAœ‘lst üÎü©�žL)ûÚ©v‰àAœ‘lsti«8â·K$¨WÒ/1¨Ú×Çô>:40!¿³ê çÏ‹Púà’_H!�»éÔâL´ËO}eN¿»ƒ¬‚LÚ!@:ÅË(˜µßà¿h¢©^®Pq)ì¿þæW‡ë§XúD ;—+�?Á2f 6îtƒ C ‰fc1§»,‡Üî�*šr„z@!ÊŸ¡lƒy¡Qõ Ú �&Ú©ðNUOŠÔÓ1Ï#ñNˆ3’mŽ.?É aœ>t×êz?-ñÒŒyÿ\kŠvÏ£ƒ1ÎŽ@ ÑŒº†¹£#N2ÂdѨZ'™gš™�ZìˆüÜÒçÓ!ºáLú9ǹs)^þÁLѨ[g˜gš�˜Ü4Èã{ŒÅôiËNÚ2É)ÎPäg@^OºË#'�Ï‘´àø ÆæfÓ5Î�Lá0/±pãf: ‡8Ó ‡QHUE‰i7ˆ§e£`sÔK8Cè®Í¥b%×p/¢�ò¿å¸úzu<†Â7!ÐH¶9ʼ\"Fq’P�IØNË8b¬îUYZoñ`4’mŽ2m§ ݹDꕼCãÂÒ~kޏŸ)?éªsaˆ3’m¬ËMsB'0í¤¢Ý¤\ÈãÁ˜Lª»¥H=·�ùˆ,�d›£ì$Í qœ@tgu½¡–�`¢Qçg¨Þ£ÖM³`ï-ºjY„O��ÚoÐc4ÑT��ÊÏ!/ßï÷xYÍ’`ˆl's�óGIÜpKìРü8Óì„Áú7•°÷{× ³ qºG€ògT8â)4ª¾A|!ÐD;ÝÖ27UQ ׯ®¡/0>ˆ3’mŽ./ÓˆQœBt×êz;-!ΈœôoŸýa¢ö¼–Æ!ÐH¶9Ê´Uœ0T#$õJöá…ôª=…æçßãÙiï'I0Xwf]ýIŽünÇkà›Æ½D’ A&íô%�6¤¸üjßÈäÁŒÔí” ?´ÂaŸz^#µo´.G79$¯ˆ�‚ÍÑ!,áØŸÂ¥b!–ÖÄ!_™é3^™uJà³×Þ�‘”H³N¹ñ<�]ÀÜ1Ð$òxã^:‘‡8ÓìVx«¤æ™£ïïüq…8#Ùæèòó›FiC»rávR B¢€ö­Öi9j.�;B ‘ls”i«8}è�%R/ä"�•ctŽÂÏ%Å’v6�…8#ÙÆº¤EœÂT$åq6)EÑZÞª·öœ[?Ù‚¹BgÎПYq¢“Fí7(3šhªÆV%Mk²ëóÇv†l‚Œd(ŠWpVÐ.J¤6H-bFªîÑ=¥R2m¨'^q¿ûû/u^¦^|åŸ[ g�®§ ã$àš-П'q£%±F£ötM4U£›ª¦$IÁüÛ™ñMˆ3’m¬ËO"ÿîr]î&åØªj×÷£MÕñtK yïµo„@¼•ù4Ѩý†@M�i¨¤å‘çtßšE 8CÑæ¨’qúÓ.Œ \H¥4&¬n—2�¥ã* �F²ÍQv’6…8NˆºÃºÞPË® mÙ¥yÎ¥Uy™ßû ¹CN QF²ÍѤ­âL¤Z ©Ò7a)ÚSîñl��ñD f#�YW@¢…S…w»A�!ÐDÓ)©!r)i) Ë«½QB$¥g(ÚUÒ"J™ÚutÇÙ—D?åo‘–Ï|�±5�B ‘ls”ùÙW㌦�T¸Ÿ–iTÝ/¥ùwÙK! h$ÛeÚ*Ϋº³ Õ I&;Uñº¾rÑÙ)î†]0�è-ºjiŒOS�ÚoPq4ÑTJvvÌcmOÇ�iÌœÆ ÇrŽ3’¹)‘›j<ó3Šå+ßƒå„ Ì!ªU!Ðqá„Da ÇÝt¶q&ZquUGyáßòìì¹æêe$ÛP“°„S˜î]+Ž2!'Ž?ó'¼S8~¶·dòÜ èfNôçn8Ú+Ý¸Û Š�&š7LA,9 ùv€~èr†îŒ.`þ0�—~Ë6è¾ÁÎÎ435n.)šsŽöùµ/4n�F²ÍQægGë\ã g$ÛX—Ãë_üûMÛ`pîêæÛ¸až™µ^õ Bn„™d$%S&‚»Wúñ¸ fÕœçOÛ¸™sj½ò;\܈3ÍN'nOù#£)ü>óðÕ�û`@n§ýyŽî'}.䨆ýî�s4ÑxH' ¢7P>rÓ"•ÄŸ£(âq�Õ¤x2ÏBñTc‡íî°‹4Ñv�C+° ×£Ïs6clìŽê '…çòoP~‡Ç ‰–bs«BÖ÷ñ¡0¤Ú~±ðýéûJ!ÐH¶9ÊN¨¶Aû:€&šJù ña»’iB‚3àÑg$Û]Ú*Ê\†+h�³ ‘3ËÏv¥an¯KU)³g(ÚUÒ"ÎRڱʅŒr™\*ü+�{ýx œò“„fN€“•ÞnP~‡· ‰–м]Ñ”‚ý#sYwx;É6G™¶Šó’îú„ê…$‡Ò¢»9¿“X2€É6V%-⥉ <Îu4F¬l¶>¾Ÿö1/• ‘ls”i«8é&T/$7NÚòüæg ýïŽrÀq$HŠU1PKINÈB¢ÛÆýnðt4ÑxHevȺ®ÇT&ÏAzÐÔPKR|"mÔ~ƒ,D ‰¦Æ<]Óò8Þð«ñtˆ3’m¬KZÄyÒpe.• )——É<¿õA¥iþëU3IcŠÒLº†�L$a¶£‘—Ãn7¸KÀ™fø˜ÙT@y«â÷ fp ò…€ZÖâs…£öt!M4•IÄ*O%åw:ü)K;™x2üãå?Äâ�Úo0—4ÑTº_Ú3n�±§ù#HYºC¹Àù£E^öƒDÞ¨Z¦)fš•÷Ü?Wþùäúë‡@#Ùæ(ÓVqÖT¯Œ¤^IÁ¼ âÙ¾Qþ9h7ÂÔ 3ë èqžá2•Äõ�ûÝ h¢ñT1ÙölŸ.U·ÆÒ!ÐH¶9Ê´Uœ²ô—+P¯ä?˜Ù<ëGÁSXÍ4c¯¹æ,½I�þ 1ÐHæ'@^¯ÚËwš« qÐ�UW8܇‚½Â^Ž›éô%âL4ܹvÏýY·G�ég�0b·S €ZÞà²|£r�ÅDœ‰†:¹Å§>ë–Ÿ£?P0ûƒñº;—+ –5hÄæ¸Û b�&š0ˆÏòšÆåè+)ôေQ°±’xgû•‰Ô ˆ“\SþÔZÊ –£÷J“T˜OT‹B –ÕœpŠƒö;œ"M4ÕM3 n}LÉ[Í®dÂü¡;›+ ?ÊÄɈFuÛÝà:g¢éÎ=´–Ìàq ÈÒˆ¦5휠?<åæHDÊoŽ€3ÑP7÷)¸tã-G‘F#V˜Ôt'sôG¬8Crz—Ì$»Ý¡ h¢é!Y>²Ý?W(2�#ÎP´9ª¤EœSµË$(ò3/¿(º“Ÿ|ÏoÐd�MW8ˆ‰²‰6»Á‹ÎDÃEv²t@R21Ù¡ÈNÐH¶9Ê´U”Ñ´«¥h�³#J|ªâü@äÚëíÇ—ÆŒ¦·çv2¼ä$GÌqöºïp£#Î43CftWñxç¡1£€3’mŽ.mç/ÃE Ô É�H…–Ÿ~ÿÉ‘ œ‘lc]Ò"NVª ’ò8ïhϲSy]èþê'‘öœ‘lc]Ò"ÎTº#‰”ÇI�Äy>òÛ RB°äÖÆÎ€F²ÍQ¦­â¬¤�‹¢^Hq y)zËs…ÓÔ馗ƴ¤³ç w2¿ä¤8LGÊï0­4ÑR/Wxä·Æ¤˜ÿ:z=4ÄY@;˜kœ?Èä%ÌWºoðœ€3ÍNŠÉ’¢Öóx8އ–Æ`×ÉN ¸'tä üå @-…ÀœœPº‰R€M§=7È/äögÒBn1(ÄŠüè­±œu·uJ §ƒ˜XNÄÉ6Öåò‰ûßûý~ޱuž‚ÜÔðd:È‹æÄMŽÚo�š4ÑÔ�ÔLJ–ò@á|$Þ©‰@#Ùæ(ãì¡a¦¤¹§µ†‰%È Ú• €'K^’A„ߨý©‰@MUøÄª'åËñ(©Æ'"ÐH¶9Ê´Uœ t—'R¯d;c ‘ôæ*ýmŸã(qR âr³ç§%>w8(¿AÎ4;5†.)*ÏY¥2øñêŒ :É6G™¶Š³ƒvqõJª�YDÕ<<0ÈK›;“®€Z†@)0qãN7HCšh¶ÄSy÷.E™G\?A…ṞSô'¨8ÖK\æ¸�Îe"ÎDÓâ°êI’Ïß2�@qˆ8#Ùæèòó�Æ9Dwù®÷ÓH5vÅù“ÀÏo¯¸]¢·èè�.y 1�£r�ADœ‰†Æ bÓÒ½„Tch$ÛeÚ*Nc†Ks­^ɉ4q*7WùÀJ{ßœÆ "ÐH¶9ʼ$,FqvÕÎ*ÜNKÕb±îUñ›¿Ý9… "�d›£L[EÙMw,‘v!SÒÄ|K”É¢ù \4�F²ÍQæçf1Ž“®vXá†Z9ô»>+Õ=gHÓS˜\TƒB ?åe*DŽÊuq&êå—‡ùxa'Î)a&ÑÌÎ�Sâ¤D¢6ÇÍtjq¦îÒˆÄÄ%EKùâÊçèùK âŒdëró²ÅW»vÑnRò’ŠûFùÅowÝ"RaF²�UI‹8¯éäZ¹�"aïrWû˜ò÷7Jjz{ZR3Øsô—¼ ‰ÙÁQû Z�&šêÒŠÄÍMå ýfDR�F²ÍQæ§d1Žs­vÉ µÄ�ú…Eó’ÿÙÞIN³K˜Öt&]ýá%/GbÞpÔ~ƒpD ‰¦:”#‘vÓš_L™n½ùxJcûh$Ûe~Rã8ÛªLØPKÝ"²î4·5=³úiîg™0b7“ –7øtá¨ý%Š@Må좢R’0çojl”6üç¤ ÝÉ\ýQ%ÎAœî‘Œãn7ØIšhzÀN¦#ýÉï©B‰�Dœ‘lsti«8q©6Hê•,Èm‚ÅW÷K™Ãñme‘D ‘ls”¹YO £|¦;«ëí¤Ü(æ+³³Ú|/Ý1…|%�d›£L[EÙB;A»�yh eÝ.ù±çQ‹j %�d›£Ì­Kv¢)B.­àçŒ™í¬ ?ãã`"ñFí7Ø?šh*²²®ß#»¦A£ú—$ÉÚg!Ð4Be>A7j¿AA"ÐDS)¿ ­iy¼Ñ¤€zC ‘ls”i«8q.N ^ÈB¢mzå§ÁSŒn/%y6ÀŠ6G•´ˆ“„j�¤\H8èf)ŠËcs?—4ÎašÐt�sçŒÜŒƒØºQ·Îò!Î4;5:m*Oú¤Ûr:rt�NC ‘ls”i«8OiGQ/$=�y½ýƒsÄÉ6G—¶Šs¨þºDê…„ÌÍržy5ÁžGÀ£9&L_ªY!Пcâ\HcÇýn0�4ÑxÊ| ¦¼Qôûí0ý$ÝA]ᤤÆ'Gå7ÈNšh©Â3&=kN–éø±k<#�d›£ì$ý q˜Ù´«n§$I�­ýcŠ<Á„™MgÎПNrÓ$¢ Gí7xFšhªDè%Esø>ò ÿtBqF²�uùùO„â̦]­h7)I¢˜N4]Ý©<#øîHÏ�ÞCœ‘lc]Ò"ŽÕÝ‘DÊã°�ý™ØJAñÕéìf†0N7[.@î,Ç{�R,;¥(ôü{÷ÜYL)ÐH¶9ÊNbhˆãàØ�Óõ†Z¤�IÆzIò瑟Ïî b’€F²ÍQ¦­úEÂ÷gôÅŠúA¶9ʜԂiº)}y$ïq„P‰ß ‘ls”i«8k¨Fhê…Ä!‰ª+›•�²´¢O£øg$Û]n¾¢8‘éÎéz;-+xÇ)¿ú5›ž~}ÿî�4’mŽ2mç í\õBâv显+û%É÷ˆ\"ï@#Ùæ(ó³žÆùLwX×ûiÉd¨åAñò´Ý÷`0`Œ “‡fPô”ÜL„éÂAûJ€&šª±‘EQúGÏ[c#g$Û]*ó—LϹÄóhfŠÄ߈3mŽ*ig3ÕI¹� _Ùj]—öþI•âq†¢ÍQ%-â¼¥;’H¹�a–ÌYÝéñ:ªN‘Xq†¢ÍQ%-⌥?‘@¹�ý¸=/&ÇYCÿÝ‘Tœ‘lc]nž�8ƒiçm&%C”Q½åñµ6ÝÍsD�*t]O‰¼¼ƒ¸¸Aù ®p&êæ�üéîõ‘~†¯Óa&HÚÉÀ“1%/ë@nЭÓ�3ÑLH ¢|�Gˆ wr�ÓR‚n¯W~‡Úq¦Ù){�<–þñ=¦`4bpF²�uI‹8%iWFPg7�÷¨�Ð¥\ué%fñFœ¡hsTI‹(%êÎ$ÒgW”µ<öGæ¾G+™‡‚Æ|¤·çw2ää6L¨ ÊïP†4ÑRL\ˆóJ·b~âé÷ÖT‘+œ¡hsTI‹('*Hº…ôÊK[ªîò©’ií”I��tF]OF�¼ì†˜³Qû ¾�&šsIËk<îuô¦bqF²�uI‹8iW&V.¤3Vw+_*i·°B€!ÌH¶‘*e çÝ™\«Ž™1EI:§ý¸Óù£1ð7S®aRîá“cƒîüàL3S"¹ªžô�OûD Èr!ÐH¶9Êü´)ÆqBÔ]¬ë µì Cô£4îS›÷O?;Ó,÷ªEN ¾>ý6(¿A¿Î4;¯é·]Áò]Žóø7DÉ6G“¶ŠAíBá†çO}`(_¾gëÏÀÈ †¼fUԯʎûÝ`h¢ñÈ�V•$É똙Ó8É6G™“B…Õ´¤¿k™“î �F²ÍQ¦­â ¥»�"õJºãåI{¾œ¯Ï1Ó@ã=˜!4«®qþtg 7lvƒ�œiv;·0XEIy.î×÷U˜/ÀŠ6G•´ˆ‡ß5Štk9݃�òݱòTéw½só"ÐHvróŽ1*SÏòê•w{"�Ó¸Uµ(jpYõ®O¤ÿ·÷gGíÿ9Ú«!ÐtSI�ˆFhãžÔÑ•ëLâ´¿°Ü¥íޜڣ\«gæÚ¶.Sú}¶Ýåù£Ä} �d›£ÌMÉ«òô�ÏÑ­¡Y8̵;«®€þ0'îW=nwƒ«F ‰¶G\u»*¯w—Ò(\5�d›£L[E¹öp]kòv�Fj5ý.ÞS–|�2W¢dg$Û]~ã8³lÞ'ÜPKS�žëÈ·î[åoK¿–îœ"žqF²ÍÑEq áT·?¢Ë½´¼Y¡$«—í?$#r’4’mŽ2/ó‹Q”Óu‘ìz7)?ÄÔ/)žrîY¤Ñ+HêšAΟ©rDf2Gå7¸Zšliœ Í9ö=sLžÞÝÛ¢”Ìe›£L[ÅÍÓ“>¬«~�ù�XeŸs5BR¯\´Ç¿ã—3ܤÓçxö~ §Wy¸KÏ�F²ÍQ¦Réé>åƒAïãÙ#�JG ‘ls”¹éN ã<¦]¿p?-)‚æuÑ›2†é˜;¦©8Ìc:ƒ®€þTœ— >*×I~Ä™h(VwÔÊKŽäU_:?[¦,tf(rûñšòG-%ãOIÃoE5rˆ¨IZ•Ó?éêd«ÚKÏ¥|{rjß’å.0œm«®œßá¥ëôø×²ÍþWÒ1¯õêoˆš--ßW÷Αg$Û]'3 4HQÏ6)L¿±O÷³ '0h$Ûen™°_ßï'Ý ýP@7;Š@;ªkœ;ʵ„7‚Óã^òPÂL3;Êh¿‰u:^�. e ÎH¶±.iWýEºV.2èo#ŸÐrì_cf0çÒ—=®OjºT¾Ä´(LqbáÑåYW@Œ“«mJcÜïÆ”M4žj”g¾ú,Ž „Çœ_ƒ”1Ð/P™Ÿ�Úo¤Å´ÿ¡©jµæþ‰ƒÌ­ÖÚoª­%“¥’zWs~ºµBûk[�d›£ì„ò¡Œº_º)Z¶[XÝœ¡hsTùÅBã" ;©Ëí´‚"˜(iWd^Ž·È*%3’m¬JZÄ©öpç\*²ö0>ä·¹ä�Ò/s‰µ h$óC„²j&¥¡©8™Ç¿#(´Ûvýþ>r´ç�©5χôw™œ‘lc]'36EyB¿ó×SÊûÑdÌ7;«®€þر›¼Ò¼Î¨ýÆ M4ÕID÷sÿ¦ò|˜Æù�'cŠÙ_®S˜;xÌÉ*M•¢gÍŸÊo‚ß`.&˜]™y�óçrÝd‡ƒÝúìÀL³R´©=Ä$yÿ=ªY´A ‘ls”i«8ëú�¡z!t#÷ëïS>®´v\= }BLnUy€ó':½øŽó£n}^q&ÚIé/9T%ýsÉÒlÂŒd«’qÐ]”HyœQă)¯)1øÇ}‹ƒ4’mŽ2äâ÷?3ý,}®£!Ï)ÎH¶9ºz2÷ÇêÊoLÎ4;Ý ]eiñztRh>_×a»jáWQ·»1¢€@m‡Dœøô½Ã¸¾¾ùƒa:�8#ÙÆº¤EýúNh ;Œ£üëÆþꔟœH’ù(qµ¾,àŒdç}ÙéÙÿ¼Ÿeų#ýtºÂÅ£°ŠIMw·šÞs˜izCØ·mþð9LM b8ן´s\<�††Ô;wä7zî€3MOñU¯ÿ6ïÿ=”ö=÷z¯ãâËÿŒÓqk§À°›Nda\ìÿì-îL€öTõçÙ®ÿÑoY È´UÝ q*—w‚¦^¯]ñ×§¿¨º1e+Û=s�“"Û_¾ŸcðÜúüâLÓS›؈¦çb¢Ç�¬Ì? ÐHV2mô`ÿußy:ü¢4{€8#Y ¸âL!…—á‘ôWÐåz(‹ó É÷s>ÎGjL³¹l»kú�ÝF�;.xn},q&êŽEð`ÁjWÂ÷±/âD�d% S…Õ¢Ý_ÐÙÄëåP'•»ø4*.¯«û+~ßuÌ�'Í~ ÓÂff?+ŸS¼­©zìÊó8UkÁwxÔë¯taËpÿó‹QZÀí Åç8#Y¼Ó‰Jw#«ó¹‰è8Y Èä›u–‹ñÝ�O(#6€3’æ: Ô3Ø€1xwî.W„hžÎ\ºµ7uÒS‚²0šÆ@9�ßei9°ø s1ÉÄËþû÷qh/€3’•€K;Š#.wŽz!|‡^Öõ–Ÿ<gJz ‘¬dÚQ÷u{“Ò A$=[‘~ŸG1Ç01–è‹ûç8)œ¡Tœ'WÜ:7&^gšÎ|Ïßmèãs fwÓ,ÿüX�i–v'@#Y È‚©—vÄóxbÄ ¦´gLÕV`3æf )Qg’úéǬÝÌ$%Ãøtµ‰ ø}\ö<¶ �gס¿ž äR+ιõîÌÐDåq ‡YvwòÚ ÕÕ ÉJ@&ÄÌK¶ù¯u>£5Ë¥€Ù£Ì Nâ´ì�µDÔ&`�¤F æhƒ˜´£ÄX&bY\ÌZ Ùc}`çÛG/9•‰j³m]ž°ŸÕ®P¹_?Ãë˜Rp9\ç@#Y ȲÂ0ý‚A+ ¿eqaXš[üT¿ú9ê‘ÒÀ�d% ;I]R\Ûí_RÒ�ºëQg8è¹?5\#Ú×Ë�ícFª^Æíå,ÏñwgÀpú‰È‰u`×gÇh¢ªA•(>ˆc[Ñ/Y È‚±­§{ ÍÈC:Ò6éÏÈG™ �U9îƒc€3MOmfkåYÿ=†¦“4³@#Y È´£Ú†þÒ¡îܤôBn&™‡œöÝ] Ûøév%ŸŽ ‘¬dÚQG({äîŠMè…dfÛ•ñgî¦m:§WÇáüj.Æy›àyý™NçYž:ÁRzêD@ûêýËr®gׂŒ²�iGq‡²¹¢œ^jwúùµc‹»Á80Ã\ ÎÍ9PËÃ3`ׇèh¢ªAÚ¶ã–[u¨oµþáÜÓ��u{s}¾{ÕÜšï¸TÍe‰P‡?ÉJ@& î«MõÌ�£Å- ÐHV2í(λ�I襴Ržÿ«WÙs},ç÷Ö ip�€F²�i‰ ÏF¶ÚGšá ¬„ƒ–~zñwÀÓ�Ò¹GG ½ðÛr Ôrœh€ÈåF™¨(gB;lIhÃðì`î9Hqº�¹ž<'Bù’0V «Éc•„3Qólf¯šü×>×5|Ú-ÌìÐHV2;ìýýÍnöñ÷ˆ…nÎQœµ2œäv}T�€&ªÊãOmÓ¿K~á§�~JPäÖŸ­  ?†£[À®Ï`ÐDU!Êl˜izðX„!û=9E�;P(ÊóQ@,ÏÎ4%iÊiw6Ë‘¯#‰Á"(6è¼Ô0| " 4xb ØõQ+š¨*…©�|K¨Õ:òÈ o.Á|ÓÑ yÍÇëŽà±ò†®‹rŠ“r_�>&¥€[ž°"œiz²ÜQ‹£{ï4ƒò|Ý®\à¢ÿÀ‰JÃL°š<ÍD8Ó4GŸ=ý½WçñfÁæPá¿]É Pk?„3èÀ®Ï0ÐDUý ÎU­çõ“;ŸÎÜD4’•€ŒOSûðOoIw4iûH¡Uú+8\i5Åôçk±O8e…sJûzÓó9_Ñ�œh$+™0àtlÁø>¦C¤ 'ÉJ@¦ÅAƒ;]—ôRòø×þd@»~Fx½ ûüƒ%åèÌs 4’•€Ll‚µôÑ&š¨¸4]´3-›þì†T„é"ÉJ@Æ…)Šc­îô]/§n’ ËM÷¯u6ú{\ƒ~œ¥62¦}Àöó»¢R`8ªBd<ÒÔâH¡ì?¨äÏ�^ÔÄ¿ÎÉJ@#5‡¿~˜0óÂ!Ÿ›‚8jqgPwó0Ž]Ÿë! ‰ªÁàŽ›ê·¾Ço‡ëÆí)Ìëöæ ÎÛ1£4Jëé£44Qùl”¦^ˆûk„¦Ogk²IÄŠJ@å£Ãí^í^„óíóýîðsT8·D�éäJ¿�>·âQ¦è_´ìõ«ŽZþ@Ý|;…Tmk®PáØzœE,8Ò¯¥OŽx”)*ÃÌHÚÕÂ`ïl\#n‡9Y È´£8¾ì4®é¥`•fF–à~ã¦c8¢þmX+ªãï¹PŽ=Y8Çìúà MT•Í]¢÷/š½׈°“•€ŒBãã·.Øž Mj1¯Û¤s`8vÐÙ ,¥O�ÐD½¥á�=•^àÏ¿w?-� oÐHV²0‡pœtužëµLÃ? pT¦ïß·ãížh×Àô™ú~†  ® ðïÆ5ü:⌂LÓ&<Ò{ÀÙ�M!6GYa.a´á(c»i a´�€F²�iGqlîJî—ôR ÄÊ;ûò>3�Óðwj]Ãiø ¢¦±œ€Õô‰ š¨:z´,Æ^ÙbΩ·>yl޲pµ‚3ˆÃÁb(+™vÔïòí¿¥Ò Ã*�OÆ`Á<ŽsëçÐ}®àF»ÎQá:fÙ8 ¬£�£ÐD¥£Y�¶dÏ#ÙÇ©xŸ/t;t… ‡ÝƒÌç2€ZE! ‰zò½�„“Ís´«8�CQV2 ÇÚ\xÌíöðs½óµ³”Ã¹Þ €LQ`-}…€&*F«+n�=ƒ�S¾†v;u §|ƒ˜VM�åôÑš¨;‡ûOÃþè cäç.§O‡ñ#Nm­8�B(S„È&xëû0mÞÓÝVד¿„3’�–:Ò£†šq�u—øäwiìXé@.é A,£„ä½è´ˆò7;c·ZÃñy¤^.ìþQh$‹cø ]¹—@òq¸z<¦Ð²Sê Žqª0Ê«é£L4Qu C9�[ïƒÌÇŒŠÐHG€ÊQëý3­7ïj š=Î<™vÔ ÌSÅÜNV�I8d –\³*)qÖÙàw?±¯i0àùgŠfÝq  ƒÐ8�.ƒµôñ2š¨x4ݵ–xöÑ•;üø3E¸ÝF]µ8;¸v}ÆŒ€&ªšO ½ê‰í†�åI!ÉJ@¦µó];JÝGÇTzè"2í¨Am‹é�¬dÂÌÔQ´[Öš�,@˜™" ‘¬dÚQå®À˜Ð E×8cÔrÃiœŽgʤá$ÉJ@¦5PÝç±½‘'RGÆ<Ïc¿)É€â E% ’:ÌÆ¸¤y‚IÈ�¬\aW+‚ÓcñŸï¡«v“àœý*‰W¸p<ôp‚É“ë“Oˆ3MOaîéQŸÛïÞZ#Ï=ÐHV² dØ™‡aÿš*�ƒS,àT:†óàA`‘Œ!ÁJúMT[šÚ™Öϵ:­² ÄŠJ@%Ä‘Iw¢2r!ÊÁø…ÜêbÆÞ0�î‡xZä�àŒd…¹¤ƒÖ{bZ_Ÿ2üHÜÜÐðLÊ1¿«=é•Ô½¨LZd£žé•A¼MãVG�äøô�2nE(#Y ˜´£8k7ˆB/vù¤Õ¾Ø²Öó(Äå“V„2’•€‰ª‚YÉŠƒ2·A¥.-À¦Š¶�¯×+t{�Ò©"ÉJ@&ŒÏüÖ~Õ e|†€F²�»´UDÇùs<»ŠoÇ¡y¦¾”zÔ¦ª‚]J„–xÞ.~>ʰ8œœYÉ—tf>œ¾Ç8®Sê 'Å’áÐ�ëÃ;4QÓdxç°ýÕÓ÷ %Ã;„3’•€+ˆ�Ó u¨Þ:ù2÷¥]!¸EYa.²‰ý÷U¶ö’j�´‚ê%ÌPT&Ia¢>!Âß©(IDû ]ø�P?~OQµ‹(Î�áø}¢ã°ëD4QÕ0XKÈ‹·Ÿ�̇í1¶ïJÏW¸pÖžóiª –Ó§šh¢î˜d�ë@ �v ¯ÐL¡A™½ô¿1´‰ô#äì»�-ät ƒÞÇ‘+N®¯8¤C(S4TFbv›´Äš�_<šŽÄÊHV�)ºP¾Ïí]tÏc_B…ív¥$@#Ùi•œ'[û�‘š¨j>³‡qKŽ>ƒÒH �d% Ð4Žæ_ßÎT€k[‰›”þŠ�Âo_ý|”ű¼8¤³^s‹dþ{ÍíÜIC:4’•€ì$0Nq…›]“çzA”ű+õö{që—Ò~Ì¿)n 8]Ûé rDZ+OÔ8î£B€3MOˆCiìeÉuÖŸ÷<’Iæ‰Ü/¿3O@·1 IWÜôxö•ðL;ÅšÝy»†3íAà*�9¹ÕîŒ9ÐDÕ)¦™œåF¶°¯•P´YÀŠJ@%´–Ê×Aë×Ô=-"‘óÄ riG ê@ODïe% 㱞ŋÕÛ®d§X¼�”+”– œÌØü¨ïŒõ(S4Ô&wV–Eò=¾í+NîÐHV²¨éc'ËŸÆÓ¿·ëhã*€3•€*˜áI‹­èòxfqBÃã E% rªùS�²K´œ �F²³œ*?Šv3+»p&é$eûˆy�/ò]í?Êâ´‹¢ßm·§q5O=s7)Qeš.€Zh{2EãØïLÑÐDUaŠf¿»vŒ™Îoœ_}½$ÉJ@¦´^ö`÷ø‚šÚyœ¡¨T´A4¬ã~ø�!À™¸‰SÈ:¯WÄú�¼÷‘0¸+£/ \�d—Y7ËJˆi¤DÝ“oonÚ¿7l¹€»/�¶€Ûßݧ@#Y½ðZ^]ŒäçïÕŸ^7R‘mW—½žŒÔS˜¬Œˆ¹ÅnŒˆÎDÅ1&ÏãÅ�&¯ÚHIh¢¬dÁ€Ö^w}/œéîƒ=WM?G ÁæÉ¼”£¾3@õŒÓuÛ¦ÇçÓݼ8Í g×E¼žLsSø¶ˆhÔÊ-wcD p&ªîçqx®e·yn:Hˆ ‘¬dž¦6Ï‚µ„3 ÌQV.ÜŸôPTî<ÇÕGYác´‘ÇÚǘK_€» $PV.eÌcÙÒÏþj•V5‘Æ<g$+Ì%ÄÑL3È9¹iƒ&Ûj‹Gšêç¸ôAÄÉ sEž4±�ì¶ér1ÉÝæSK87¯¯-|¦<g$+Ì%´Þ8ëK@0ü¶D!§Ñ ¤JçLp$ É  /„²pá”u3�Ãrþ�NYƒ¿v³³ç@-jPfOüZ7fOh¢â‘Oßp‹W™þæÖÏ}ƒ³îöéOtGnŸF0µ>u0“”̆;CùÜ_²ÒšTÒpâŒd%àR†;Z$þœþŽÎ¦2Þ8CQ ¨8À¡ÉòÅš¼frIéˆ3’æ’âÍof/'Î#ž¡t9ºtÕÅæk‘jeÍc-ÿ¬ã¦Óø/=ÊBœ‘,޲”£ŽòÇø›0Ö¸yæÂ1 ‡ü d˜ƒˆ;A h„C¸îÜ.ÎŒX©`ÃI;£ÝtÍzcàê.…s`<ëEÁ<‘âÙoŒ² ÐDUµ™‘5 [‚×ñHeµ‘ÀŠJ@¥ ŒìIá4#HÚÀà E% ÂhŽG–›ó³•àïÞ†d£€3•€J ùx¤©�ÆŠ(+™0¯±÷‰»÷½hã€3•€*8Cð3ç÷߸"^íÙ0qh$‹÷G9Š.€M�=¿˜0ÆN·‘cç¾ãµýZ® Œ¬Ë-±ëÔµç”yÀŠJ@%DÑóoW2n!§*4ÎW,×ü¿€8ÕÆp¦a¦Wg;`ú·Eç¸xú4z¸AïÉo ! ÐDM³þ»B¿v«ý8CQ ¨(€È¢°�ºÖ-KË£7¥N—LÚçÑ'Oy#==«y§{ßæÚ/ù‡}’N7�d% £ 4‡PxÙÛÂË¥¤PUé¼o‹­Â~|ºMJ;ï4’•€,0ÆúŠ@÷Vz ÖÝÛÅ��d% ‹g3=û�^;MT5ïµ·fx´f“Ðj�¡¨ Op†Ò(�uKÒðNÛBÜœëŸÀÑŒ Ï~·Iíÿm�éQ«˜·Úÿ4’•€Œc°,JZwøIïr¢+•€ÊHÖg_¿×±`Q¹ÝÓ ÐHvZ¡Î4eò¸ÁÿïýBüšáYŽø¸fÞo>C:×<Å…ó¹&~}àq¦©Œý}n’…ÖÇñ K­»Ž@#Y È‚êüVúèÞ5F—XwïK&ç¸pâ’Kø>$Í›¾^}ñË¥À5Ïš™Þ-“ÑòÄÉΊ¥Ãß0cìy’o:¤À8o5¥˜Ö³ß†¨ýÆzjžÝeòÚ¿Îþkwwnw™®kº��dq´¬Œ„l«-Vö}|O› A ‘¬dATC£óúi�E2µW(ˆ34’•€,ƒhqP÷ú m �F²�{´¶Öˆi3>OÎà�ßTJ�ñTL¸“<{ö MTNTº“v;}®Î€ÂK£!ÛjKx9þõ³ÂÙhÀ E%`â”ú÷Ë.¯‚£Ï.öýg(*•tÐz­}ëi~~ºI|�œjÉÈ¥5ˆ•ê�ÝÉN+Õ—Ó{y¨ûF�4ü0CQ ˜ úL�ç°²/h]­£…¨êù¦þ²»�ý5oY]� ÊHV&a …†¿W\ˆ£4’•€,ØžWÝÊõW"lCøËÛ½t 0Âý£AG«N§Èõ(AI÷ cmÐæjÃQ§1PæÎ쳆ë‡_÷7|ˆ]ÀÉ sáBóàâ¿h< –PV² É¼çéïéïyì= rb´ä*çÀx�3 ½°cíÉõN7âLT4êtSÃx#ZB�aé‰Ôf”¡¨0‡ ™/¨{Ü.›Ì‚¨TBK÷€<�v‹ÔÒEœ‘¬0Wà¸3ùd_~=_Iñîä R�6Pó¶�®Ô¢¬dì0w3ðx!3�­¡'t–ð�­…n•:¯žýF§�&ªJš¬„rü’éóü›úmJ/8§†TiswÀ݇ĵ&&âŒd%àÒŽ¨Ó‡2½PÏI{„ͨ�ïcúVê"ÎHV˜‹ÎQæôy÷7uò`A:‘¸;™þì�c¸øÝ’w:aëÅþë;‰m°e^Pá��ŠíĤÄB™$í¿µîõ=JÑR qF²pqñ¨M—Åk}[1�§Ôú=ß”É@'#jtò8 é™ï„/g𒾤ÛÇ�‰‹Â¯ö]‹rðìp³ìY?™éžµÛ�4’•€LéÅ5Sý{A¿ØŒC ‘¬dJ×öQ—poªÛ¶4’•€L;ŠOA»—zá|Ò™J·’&×â¹:ZôEð³¶Æz-|Ž Û�‚C3Æ Nªxtá`ßbtäwz“4QÓ¬;ÙÂý15_¡;‰8#Ya.é ã^©¾û E Ç™=¤ ÂojÜ}¾[óì÷i0±9‰@#Y È’¾àþ»»÷<‰}AÉJ@Æ#{9C9Æ.CY#ç¯ÏþYÉáuXa­ã…@#Y È´£Vƒ»?‹}¨ ‘µ6G¥ó3’Y�©;Éy ïªÙ¶·hº­�zm3f âÞ�A”ï*],4(¡1F Ø«úì_]~íÎZ� qF²pi¡×€-¼æ Ó� e…¹²®R»)OKM%€ŠJÀÄg‡~âg¦8ikg$ ·F8ˆOýfHrá*ò''ÛAޤ�a½Øy”ÅQyÚÓZ~öÖ�ù=÷,µµg$+—Ô`jK½ë—lî4˜h$+™vGh~[®é…pJR‰Ã¨{Õ’ÄÏ ¬TRCi¯¼ßí#jC €F²�iG‘¿sÕ „=÷�B‡bßÉ×ãˆþµàŒd…¹ÈøæÞkÀbK ¡¯—nhƒ²Ÿ@^ÇÕU/~¹â¿Ðôí©CßÑà§ô ˆÐö'ž<¦U$¨äÙoô‘h¢ªyi˃ûmûH4’•€,8S©á_ß|xꀴ­ÄMJ»Ÿ¾úqùó5_&ô¹öµ¦Ï‘$ˆ�.ÉJ@–·Q>k—aí64…´> �d% ÓŽ:®’ãã™Û¥#ÑsK É´£~¡ZÒq‹è½¬dJOi7NÝÔbS €F²�iGqxàê¬ ½kPåÃwŠ–�}®ÙççúKˆ2’•€Iiaìv!™žÍ5H- ÉJ@–7˜–›äñܯÁ�¯‹‚Œd‰„CxÛÛmœ§gÏKºqÀ¹�¸Úq-äó}‡åg¯éóïY7­_8CQ ¨¤ƒ8�o§''WŠBÃdË…~o’Uû%g(*•l~¦ú˜›Ò‚MÉ΂Íü(º6$váj¢³”m$Ç�}^{u´xƒ¨¼�ÀÑQš.ûZ¨•÷ÙöФKÛ»^¤>âŒd…¹¨ÅE}¢v…vêh &ÉJ@¦u\ŽuÝ_AD£÷²�WÎX/òµÏ2»Ÿ×õ¹öû¨vlÆc|>Æ}.$Ãð›£B¿Ò?ÁJ}Òt4QíüîÂ!ß]üëQvuw�ï?´(î‘öÐb¸G®ØŠ/õs¾®öÒ�ÂAÄíŠ6§¸“Q¸(z§Æ¢#¿Ñ�œizbPÎ-½Ïúš±~úyÜíy'aF²BTZðÎ�Îv™¤Q?ÊJ@Æ=¸ãˆ÷ñB!>ƒ¨ßïÊ)ðdú,J!°£çÉõN âLT žÔ²ù¬íúµy¶¿MOìõ ÐHV2èö|¾û3X¯ã}1<_åÃËvŽÜÉxUªbãÈsë 'Ä™¨g^Ë«OTvOQ‰…<‡2/8­†fÁ·±úZÐU�4(1êuQ·èÀ õc•7ÚL4’•€L;Š#5N.é•°œòT¿OîÞZIOtaA°¥) 0~¤+ª.bçÌsË 7„™¨&5ܨgÕLÖûuG¦/tÝg$+Ì%ÄE¸våäB=/ïûµÀ¨{]©ÔøCœ‘¬0Ÿ¢Ô‘óæo$DÚ™Ä-J{`a^üxÉ™“›¾ö¦XúÝÞ©êYi³í³ZjW;Óšm4’•€Œ=wŽa—ÜB‰t1Í¿gNó³fÁcý6ø<Üqš4’�9Íü¨õZÇQ�åÓÈ©!ç©”c0q?íõÔ�¤Dì³÷êçøl¯�ätÆ}Mü¿°cÇžuÍÜJ7ºm€3Mi4ÂÔ™Y®ƒÙ?¡#¶th$+™ÐØ9–·oÆ£K:mì ÐHV2í(ö‚~[.é—Ê'Ê÷h–[áYWZòÌÁ]Æ×­€ŠJÀ$´ šëÞ(µ g$+Wà)—ûm¨>ýíñk¾Á/ß¶'ƒ…mµh©9ã©õ¦âLS¼u¾‡ì†�'ºÚ|ͧSÝ9- ,ÓçÑ_ÃBEe% Ã& ·!ÚÙè\Òú4’•€L¨;¿ýÑÕ…º3âŒdqÝâ™ÄÝÔ”hzâ¥QVª`wÒ@^Ñ_@?\ò°”¯ĵ:Á6<¢ƒåî¶C 0~ø&¬�Sy۳ߨ‹#ÐDUóºø¡øðw´ ”²8à EqQœÎS†ðooAq¿hI[”ý _|íæü×k¡gã×AÀ@Õøv%gÁÊJÀ•Öì›uXÇP°P²˜¡¨0G;‚Ã×S>_H ˆ(ÔY{ýc³<аY`_®Îqqu¸¤ƒ†_ª|]Â�È{Q ¨¤ƒß›èüRÆœ59 ˆhÿy¼+�'10:ðUšS`ùòÔÙXÀh{“:i”…Åjìy9â ù\€Gt®üÏ3„î{ ž\ïI ÎDEÑQ¦®l=#ÓÚ ïçæ¢P =@ j�„VBY ¸´£ªë´+W¡ŠDÔÙ+h�oûƒ OvµÝs „MO®÷hg¢¢ä�R÷ÁaAŸv_ú-ÆG›©ïæÄÆàŒd…¹¤ƒ¬îô.)áNëDiç¦U<Ç4�ع ‘¬dÚQ‡tïªÙi¸Ø3NóßcØlù×ß¿&É´¨ãýؾ{¸ÙÜ7I�,ìxr½€8û*úó¡IÇ*ú…^V2jDì¿íø¼�T ×u[r“üþI7©§¾Ññ0“”DOL}„嬮�”绾ÕïF�F²�a¡}�ŸÓ1‚ó èX\jvŠ“|ÛIoÀqß(õÎ4=)vûÔ·f¹>:U¾—}žè)×µ‘,¬ú{r½ð�8û*zXå¬þýB/+YPo¿nª–0*‘³KóÛr <ˆü#Éù�&àLT”<_j’ª¯·l#µå(+YPˆßƒö÷ÜÞî xsê‚ýsœdÑO*åŽüN/€&j ¶Ùîm¸í�ù~÷ÈØÛyJ€'�,DÕzª {ö¥wš¨ªPènŠǸ®Xè ‘ìªÐý;S©å_ßbÉÔÿj[I›”þ v€¾òsñó5oJŽ2µà\ço»”š~”•€Léì¦Êõ'”~àŒd…¹¤ƒØî»âå5yîB²Bê’e�ófÝowÕ\—Rg$;)�§ñHýæÛçw‘(äT}G*é ÃÏ'퇈ÜËJÀE5åv³we|îƒËq~à¨9¾¸&ïÙoT¶h¢ªht«I|½þžÞ’Uäe§Ÿë!ŸúÍÆã*¹Åíi$ŠýÖ�ù†_îA&¨G¡œS­�lŽ)F¬ ´Ôã''´í"î“C¸Í¹žÐ˜o1êñI� /NßŶ§¸“¶<yÃÃ-u£ß8Ó´Î[ Óú­žÕ›Í£³&I¯�F²�iG­çþ½z¸o_|“è¹€d\hI!ƒÚoàµPV2î7LÛÇfëÃ$/Wùî& ìháÒ5îdP a¨!àÈot<gšžy³¡‘L¯cl[k6 ÐHV² Ù@%û=©_m< ŽP阡¨0“r —túpé’Z(A§�Šõ-tÿ}¤O+ò#ÎHV˜K)òOë{ÿú·õˆE~Éâ8úƒ–ò óÑŸ¤æ3Xz—*žãâæ3y�¤Úî×ÑËíˆ3QgŒê†Z¶ë7Žß“‚÷²íó:�Ý}>ÇÅõnàŠmµ'ÿ' oQU´ÿœ¦rE!ú…½è´4“º,y´0x’ÖC»IÀo,Lé= ÐHV2í(ruΞ\³ nÓçëy6ÉŽ®ï=\¦¡š×ÌÛ!Óúäûúz¡×q÷(íÉJ@¦´޵ÞÇÌ‘Ö@ ‘¬dÚQìõü¾\Ò+.4oLëå0vú4’•€Œ.ç1PaiSHXJ«Rå�‰–“.,í 0©3�8#Ya®à¤¥1Ÿ�m�„`E;µ>‚HÇ®qñÛ¥0ˆÌ· ®êÒ¶Fð‡Iõ&¯À/WÛ¼¾>áøp‡X�G ‘¬dÚQì [~ Ð+®•ÄXKë@ú÷Õv ÀÊB»É`üT@X¦ –‚g¿Ñ‹@ ‰ªb/‚ úÍ8=Gj«uh$+Yp¦R_Ë¿¾ÝO©“Ö¶]yþ3ØG»öÀÕï×>¸,j;,ñýP/·qIqÞ½BY¿�F²�iGç¤Öáû¤Ia§X¸¤ƒä@4"ïE§aèuϤY�qìêÀJÏ�F²�iGqTજ×ôJˆ�ÎñU?Û°¹Z¿\R\\­.nqxb±mƒ 5Ì»' ïÏ�%Ý“èwö¢Pqëbåü=JAC t[sŠŠ'€{ ³Þ6q Sô âƒÏš· GªLÓÛP+ís€ \<˜×]¡Ë0­ïJëß„$¶'h$+™Ð haùãs4æ¥fâŒd%à’¸Ջ¬.¶Õ1Å0€F²Ó0.=ŠÏÀ¦„F/œNãò­äøÌ¥°Wç@ öÈÌe–h âv‹2 †²¸PN%ð=ÝV;©ÁŒ¸í”Û°¸$í‰õò;âLS’=rb ª"7—œ”Å%i25û |íeÏÔôC#â §¸°éÇöÈU}¹pê—Ñ ®ˆ3Me²{uº§oBñ¤5Ö-ÛÝt�‹'­Ã(öî·Þò˜iZRJFõÉCçáH>´Â&�dW…ͱ¿©^ÿú¹¨' ¿½ÝR×0eó±'šë¿ÞÏaãÿ…9ôÅïFYa.©€ø¬O’�¿�©¨õC�3�†³ƒŽSá?w£‘S)¹òª3"~^6©:óR(;¯:_UT›ÑîÒJª4’ÅEUå(v�®›Ð þ]åúYòõ $û ¢Ÿ¹Ã´°]3 ÞýU�xÒ0�N%Æ}ž\�jg¢¢tŠ’}ä`±×çbûQÇ�>B¿{ãøWi¥"ÿþ#ë{þçwwŠ`\¾G²8Žðìÿì}X{´ÿ ªÇn&�†è'zYa.-ž’÷A{H…÷‡Z.>íAPÀHÌ%ñçÀxJ€Ã:ìPÁ/u£õ€@õN[ãw/÷{$´g$+ÌÅÕöÆû+âS{ƒ$¯Ð)0n¼‡—/Ž{jµä�(•Ì ï>!Ö ïˆ3’�%×T–Û^õ�Ãõ\Éâz®rÔz½Më{qú×Êkô\¸C2¡Hˆ ©O‹„¼Ê΋„—eîf]»‰VæF ‘,.s+Ga„æü@Bž{XXImÐz­IoÿuÁt�¨0“¡¨OºYw_±iaö5ìdÒ=(þ$J2õIŸáßømA—¡)ø›,ð M´›¾Æ££}Òp¼r‹P¦hÆ#¿»̾Ûu™Z”…™<õÖ÷ŽÝëÔ¹—‰F¡�›73C ÕÇ~§Ë@UMëÄ-O{‘µV'œ‘ì¢NÜå¥sí�»N9¶0Ùk^ð'å›qÈà¹õ:>âLÓÎP¶‡GR?ÓÝÖùÞƒ¨TA!Ëáãgë]½Ÿû«˜´*:À Eg…íô N4· D!W’V¨šsÝy³D¿·Ú¨õj�3]V«§]Ö¸~5m5ÜûÛ"%wŒ0#Ù‰;N¢SßNOÎ�_Dpr²ýc_×j¯ö]ó›è?Õ4ŒõÓ(íQªé�óÖº_¶_!Æ…}$ ‹×ž\¯^#ÎDE}ýz»ðžß?au}vptýõz Óœ­ÐìÁì"¯ë†O´õ^V²¼ºßýð;µ}3ió’ñ¸>Ò2vKÆ4’�•Œó£Ö‹p�M>Ý“1;ÿ�K:èp£Yg! w¢PqÑúØÞã Á(Dgþ¼œOF!¢PJàž[®œ#ÌD5³Êù8Ö§;Çî…èbå�F²¸¬ŒÅÚ–o�ë US)pyú9î¤mDT>õä7êÅ4QSô‡d— ü®–ë?ƺk‹ö ‘ì´ˆ›eY mDœ•ÀŽ{» ]q;î΢»«÷vÒoç�Ö¬ýB7jÖ4Që K„šç¸^cc}eøç8gJ±�F²Óffª¹Ü‚¹ÌÄ£,.-CutO-;­±¿ŒÖµÏœOaŠu�뢞Y®‹"Ì$%©.:Ö¾€+™a]sœm;2\X Ó%*±zn½4‹8ÓôÌk“Í„ ïön±<‰@#Y\¤D�ZhþñÛi¦]ØI0vù�`+æ¼ÁÕ¯×L"»Ô­áísŸ¸þö—²bƨâŠd|ÚÜAù•“Ä_ã¤üTSš¸OÊËüc%=±¼Ü*]EšZShØ\]ê¨׸þëÙoÔ¸h¢ªÁÅ[cå_…‘G|0l×î5.ñ K*¹:ò%eÀ™¦gVÏmñÀ³6¤nÔsg(Òê¹\x[Âüq-lÍ­/¢ìg$;«ûf­ö~Í$Þ]•CãÆ²/0)Ç`^xVQލ{‘ROnÛÚMwS�¯;çÀ¸�yrªzr½nŠ8Mý͸~Gt5EûSE‡ƒ@#Ù©ËI�Z/Éy—í?Š!ÒSåÉ´£†Q¬ ‡ôN—1]�r\£–µîù8ê½ÐÐDWÒÎLÔZTÊôÜr a&ªI.o¨ÿ3v“žT\ÌÂóµe/Ÿß–d¸0éDª¸Hê¹õ")âì?¦ç &Çáïs²‹äø²JzüÚã�çb•�F²³*i~¹ub.Ù…ꤙw¨þÙ²¯Ì«¡,®¥R•t·×¿Ê*uSÑ¥8;Š“¼Z\ÅôÜz�q¦é‰®/µÈÕ>›5IM9ÊâB*U'[=v³ý®)…–ÔVN`Š%�ë…žY.Ž"Ì$%ÉÚ§¶h c»‰R#†²¸`™ÖÛ�÷êW¥nTh$;«æG±í¿Œ^0ÊyEp¹Y‡5ö=Þ[/–h$‹‹‚i±i·¬ÃÐÞÚ Öšg(ºª4]UãžõC¥c÷}µ@#Ùi]3=Š·SB£Î%ž¥l#Ù”ô^òêhf)09ïudì]½IW ê&Ô TÑJpR¹d?K« šçBå7Ì´ÚIºÆÅå·0kãêfO~§*êqÒï *€ÛîöZSÿíiZ.€q$4ÎT¢óì7Ê�4QU2»\¦yl)Ô{9ìˆ`”òàŒdgU˜Ô4ãr¿Ô=µé(‹KaØ‹iáÙïëpÜ‹£îºs\ÜŠ!‘•�üB7ÊN4QktFT5yï/É{¾�AO­Ü‚@#Y\I*í$?§£1¤U:h$;«täGñ}ën¦„^0yµã½½t´Î9MÏ;åÉN ¯ªðXßCý‚pðMÃRF»X VO‰[ŽüF«pÚ/ JT58ÔžÚË4´jâŒdgÕ†®ó‘ºsÛ¿]XD% Êk«mZ$ŸöŠb±ö8#Ù¿[ûW›º>ÜÚ¼Zñ�F²¸üA®;s®üë7�$§œo$ø¨ô°ói7yúÓ5O>*w"ë^¬Í ÷½ Åû ¬dF²¨„3P:ÖÎR<¢‹r»TUf?+Sý[¿1(Sí±Ûë}mê  'vAß90î „n�êIžýFµ �&ªŠ;÷¨ë~OëôÙ³~ØíwÑ*®˜ËZ@¦5ÈU³ˆÞÉ.ªfOw½<Öwð½þÞaE‰Ý`BœãâÂ?»T,ãq!¬_éNÍãLSãq*¯¼×Kl‘üšZ]�F²³[~Ôz™¾0KÑØ9Û®ÀCf�ŸYHKZ DiåU©jßüßW¾ÄRàŒd§ôô(6eî:Iè»H)ÊXÔ'3磆@r7�®qRÔßÕMúÊ›ã¾Q±œÉzbEk¹'†uvk>ºÒRÅqF²ÓŠ]j•¬Åµ@%µæ( ëzBÉîQÿ6v¯ÁUKv4’Å%;òΟ½ßó³ÞXÕİY¸ ']ñYòÜúYBœiz¢Lw‘<\Ó'Ý}É[¢ÍOÍò@•Ê?eæeqÕ“j‰{tüûz·‘Àž»à·‘"×Àõ=Ç}£š 8Óô¤Û(5H\l‘‚bÉ„#›ý<>Ç£ÓÃ¥y°".›>ž”æÉ$ù‚&—ÝBwj‰4Qëà¬M¯­Šó=n˜[Â"a;k 0\Š*Ž\ióì7j‰4QÕ¬nv¨=Ö÷¬ß(œ!ÐHvU:»* ½§:¾²ì_é+C4’ý{µ¡ÝÚ.ÛÝ 1Zip†¢¸0$Ķ­÷ ×äŠ�ÄÚÔô÷xnwétR�Y6󹾜íÕM½§¸¸ƒ\q�őߨŽÎþszjm,ü�NׯœÍ]Îòúœðøú k"�1m.ž´‡È2çe2¿Ö�2MTœÜÀÚG»'ι¥´œþç—r\ÜQ®ØJ{òž�öŸÓƒîÓB]ô {ÑY-=ˆƒüfDrr%aÀ"ݾ½}*H--trýy¹Æ=­ÈcRñÌ“ë•BÄ™¨(šzªn½ßõÓAc}¹Ý^ÑÕªbˆ3’�•ªRKÈe¿–·¦&eq Ja퀟Ú\yGƒåvåWÞ#ëÇ5-Ï~£†@UÍ‹aïµõ²>#ÖÞA¤UÃh$;«‡åGqðÜ.�^ŒÄ©ñ^?'5v�lеÉâjKZêØoÿ¤¯Tê@œ‘,,u±ÕêOÌ5¹`©Ø’YŸÕ™~VIÿ~5ÍjaE©ŒdQE†“˜Ž$Àx€-̈2MÕšÓ¿÷ ¹æÔ”ü½Š�: h±Zdp�ÓÌf\rä7Ê^€3MO [Ó~ÝêçüöbŠ¥@Y È80pDe*J­Ú•›à¤ôN)Ëáoà¥NÊrüã5½±,÷^_å;v_8áZÓv%'À¸™f.–yöµAš¨*^2 ïW5Ò‹ä{\ÍšÙC ‘,6{¾ÄÓ.®eÿÆ#¹…3ÜÈ® qŽ“ŒIXãñÜz�q&ê™ÕxÞë»_Öé�=\Ðj<ˆ3’�–@Ò£Vû6}· ô÷¬¸HOé’iGÉÙGHïdçÙÇE™§ÝÇgÃÄ*à Eq�G8ˆ …»y/É£C–+ïµw3v/Í×* ˆ3’ý»•„½(Ók¤Uh$‹+ BÝk 6VÌçˆ4•ºàŒdgU¡ì >› y~.é,¥Ûø£}×O'ø-¹Ü~”æb‹›š‚�Š(-ÆKmÊ⊠p—#Æý‰¶é¬€ f¤eH .®ß’IJ /~¥…š¨6ÝXkú³¾c}˜ÂzÞD¿=J€Z±8®yxö5š®jj)*f´ë75±(‹+#PóØõî>œÀÕT4°ý¹¹ÆåÔÐZSõ³ß({ ÐDU…ÂÇsŸZ!F,|xœ¡(. ¤ ³hçL~ÄÉâ„?·ÄÛ«^Ÿ£ b�3�›áÞ꥿€Í™Óçê§k¶1Oþ×aÓ±{·º˜üÎHv–ü'™ö»^~+ÇÑ�Vòl3�Ä96¹„í])ý�Ë•øÝ›:)ð¤m"~û�ŠMT•NR²“làšBÉ Ðl%¤ü{‘à=µ—VQ…­IË-¯qa…/4L””{n½è€8ÓôÄ›šn»åÈçz{ü;Hæ[€ž�dg•�ü¨å˜öêÕçö†ðU �ž+H¦…¶þ´ðÑ{Ùie ³‚òÙP&\x³|Õáõ÷ZU>ÞåÃEDo:Û~$°¸„Xa,xj½è€8Õ$#OYé0ïßñ*61�E ‘ìßNhÛZÇÓWbB 8#™’Ðæ×9HÛ­¬Ýy°Eéìš.)ðû¤v†—G;e×8é =É0÷�„p¦é\Æ�yKä7޳HPði[r�;EŠŠGœ]öäwh�3YOJ@—Kp›:Þ³%f®4’Å™«rGbívè•°.OŸ·Ý¬T<]i#MŸh$‹Óg¼\s³È§ …©=ÕÎ'YÝôg°=ío¡Ë߯g̯µ�||Ú4¨’�ùhùGÔlØIÚíØï$­4QUºxVǰ8õG›tæ¬#×íâI�qÀ…Áœ8yöÉ!MT5ˈïÖÀ}¾Ú‹1¥¼ aF²Ó¼ÌŸ&²gËI^?žخÇ6(†�F²sCØïPþ3ØÄ5•Ò߯ÙË,{mAÓï“ObúŠ@#YœÀb/Çð�콫Å4³€ñ'¥„Ãú¡…ãQ:1‘t(ó‚8ÇKr§Ýõ�K(¹ÂŒdqî”÷nï2/©s�æÃ:w;Ö·mìo)ÖrÄɤœ`¹ž¾ÛÓYb‰ûÞ|Â5.N,£sÈa»#¿‘–Î4=Óœ`XÁc÷"i-'@œ‘ì,'àpmXÊïSY1ÎC ‘ìß�óöŸÒ»%-ÎC ‘LŠóÃ÷Y ÷c—^A2 WĶG)Nº*ã0Ì“ß5h¢¦y”7 Û×t£4w´å!ÐHGy�G-¿â½zŒß½”Gá%ÑNTŒó(¾¾ò€Æ¯u# A ‰ŠçñC³æïwûò“? ÐHv–VäGñ…º)!Ñ+W=�ª±–× ¦ ñ9žƒ¦RŒ#t>¡.œá°À/t#ž@ éZ¯_¼»WsL…ì›)0Ž˜XÕ4�ðKé�â´ß+x‡Åt­ŸaÞmCóˆ3’�ÅÙAüc7$ò|ßЯïsë§ìÁ‡õᦱ¾éåÝë“cŽd±iôì7œMT•,/Ù®áµ}%õ=´íˆF�F²SWŸÅ⦄F/\Õ‚å­et—AІ×ã E§~4;ˆ/‚¶'¹pAyËÏFè¹}£ï5n- ÝèÐHvêÒ£h»74öüÔ¡™e[µ�0Cë¨F€F²s3çm"Y³?ˆ3’�9´ü(¾&¶]‘è• ÌÁ%ÞX?Jðk;“SÀ»©“áB{í[2Ï­[@Ä™¦gno^Óö²÷ß÷°E{ƒ@#Ù™÷È�âß»�‰^Ù<¼ŸÇíu¹¿ë°gÀß»i”cÏnÙÏ~è ÐDUѨð�ùZ?Ù 6‰74à E§þ";hÝËa¡Ø0v'F 'g„\hQÞÛË%¯{`+ ¿tÓ&ÅÅö3Ú5ºé=ù «†@5E£Â·åkØÞñö{ \¼Ÿh$;5†éQüƒ7%4za÷Ш¬Ÿ]ŸÛÆ[‹¿wÓ(ÆV4Ü<ºë=û ˆ@U%£B·æs�â1»*ÞÒ€3’ý{·ôs{=Åï½ùâ- 8#YxKÓödþá›BùRÒâÝýÜkzÃZ>18ðÓW…rà‰Á‰ö‘nRÏ~ãîF ‰ªÂݽ@6çùm¯rg£‡KµmI€ÚŽo?Ï~ÃÄ ÐDUóË÷ùÙrú= .^¿4’]\ÁÇyš¶Ç †µžß߸ÐvžR`|ƒ³Öùå׺qG!ÐDÅÓ‹yÙÍuªz˜[ùW¼˜h$‹/fÚ¤ÿ~SIXLÛÊä:zÛ(ÐoRO¼Žh$¯£×6ù{I4_G¸Ö¦R Œ¯£PqÞnÇ~ç<ÐtUé¨Ç¼ŸßãÅHâN ÐHïD±¼¿µ€õ¯q^n¼Í©½¿ãúY¡y‰F«sxŸë 0çå <*VÐHV2²Ëïù[§qÆyÉu>dý˜À"÷ï©Ââ»F)ÎHV.49•·fés}¥Ï´A†õìs}Ñá·)Tëwsýªö§S(ÉJ@†•Ï÷¼\ˆõG<û[²Þß×úu¡ù1n_´ö›ÑôÉ`†¢ÂLtsWÚúÖ—¹ö„Þ�¶þ¢:øiÚt;ñSçg(*\Ïóço¿Þ¾¯ðzÃu›2ÎHV. ï G~㎜izBQú=Oëëæ©=T15¦š?�ý3dõwTï8ºY\h$+Yp‹OëÛ±æÅB¾Â›�~{Sè&m¿E¶ÂQë&`¦)™˜…£>==×7Ð�w �d±�QŽÂ âwRz/+Yp•ŒëËŽª)ú|"[Dû¿)”Á” @°¹~Ýè"Î4�s³;¿×gqç:?û¾cwh$;·¼½F)„/ÐM#a-íjÇ“ö®~¾‡³÷gãŸàl4…®q&žY:iïõÙyxíßü!Âg£i”M<µ×îÒ¯£»KÄ™¨³{á=ë“…óçµÏ~�/YYk4>ÏÝs,ÐHV2Å{úµnxOš¨8 WL})Âg¹Ü¶t§žŽ÷·^°�Ã}öWðo“œ‘¬0—àÎç×úö‘ùõÒ}¹Ã˜„^Ü_È—óõ¹é�¬ ]çtÁ¼ÖGÆæé±W»ÉÓñ•дI€&^Vh—ÉCû¥n¸vš¨÷£ÿ@LEÔœôó;K^KŸÏ·fÿÐÅúÛ¢h$+Yp ?×'YççsŸ÷åˆÐ] ›:(ŒùBgçïˆo:€3MI¼^žõù›ùýÝŸŠ ÂQ¼Úv\ãâ83¼¦8"èÉïDgšži±êºúþy¼GÎHv!¦GñéßtÐè…k‰‚™ÇžzÎõMÓ'¨ßþ¦Q‚“.�“Ñ߉§h¢¦ióØóã¹úÕ; �dq£µnf­'΋›ô׊Bïd% Sb–Å:×Gˆkœñ9N”³ ÎHÆ,ÂA|{®*HäÂ�îâ•…tX‹Ÿýa±(ò†+²i“µû"ˆ°<µ5!ÊD%1nZ0µõ3OÓßá´1Ά;¢mÈ5î$ÌŽî.Šdù�È p¦é™EI‹®s½G]U ’g(:‘ú[8…ð½¹� |)í>ǘí³^Ê‹‡úìÔ`Þ�—fSç %ÜqTåyÕ€Q¦hH·Î¼~éfǽAøpE¶­HpÒ]‘�~!=€Dœ‰Jûé³V–âqCw‹ü÷ȶ=)δÛ�.ÜO�eX|Ãt¤1ðã…Ñ4J€ÚµÉ.‰~©Ñ%MÔ®¡Zþ¨'õýÞŸjä ¯Ž¶E׸0à -výJz°‹8Ó´® ͽ9žÖgõæ¹½àŽ¢°•¶¶ƒçïÔeõ9ÐHV2 })xô+݈:h¢Úä²(t[Xê÷U>Ë�Ø}–ó!ÐHvõõ·~ á;¨�µt-ívLâÐe¡úäù\íøÞ‰Ch$‹ãP¼Ór ßCm‹ÒÅ´2�Mc_ÿýŽúŒšÌP¦þ6K|ûlÊä i·bVOøÚb¹=�ÐâBÄÉNó¿ô(¾�Û¦(ô‚5ðwÕø÷Öxmÿüc�[áíÒôI€qzÅ÷^,ûµnÄË4QñÍ¡†Ä4’Å!±rÔq¿|}X¤w²�mûòì í:Z8~Kôø6æÎft*6£©”M4@ןðxÇS²‰·ë®Î%*Î4ß‚éŽúFîP¦hHÁ‹ãþ¶é9N+ñÝ”I�q^Þð8{ö7MT•nå×ú>€¹öpß'É$Þ£m_`œLò Ÿ„Ý~!=ìFœ‰JSØÍ¡ëk}?Á§Nd1¦óÐHvš§GÁMÒΑÂ�ÝnYÈý\_ª6¿æý�ÉrÈ @#Ùiº›ÅwȦ„F/ÜnpÕ>×÷3ÌÓ¼?=Å™+^�MŸk\˜ºò¥M!?În¥7àLÓšî¢ÇZ‡üÔZÒÁìn�M£x’˜Ò½Y‡Òn¥;18MT›¢pŽc÷‘æ%fm¶O €h$;€ûs–ønç,]I3�sHÛæ�§ú4ö�X€F²óXØÝi)†ï¡¶IébÚ I>�ÜÇ^Á]ßvy'2 ‘ì<2v7E|ÕÏÑgÜpµ=J€'Ù4Ý‘B¨îÖºªÐDůCõé»W˜?¯#sHCuDÉâPMQŽa³ê£,¦¬<‚_Ö×AõqE¹Á#ÐHGð`�r›™¶IéZšÍÊÃùÅLÔÏóúÒƒá<�dgù{~–m_$zÅJáí¾33ú>v¼»�;•Žû¸Wéh¢Q€Û}š÷Z÷tD,>5Æ[¹©s… Rc¶šQ–àWQs D™¢¯8(:¯N®ÞõµuÓ�°�F²ó°¾·:9†ÍI;SébšmÊ2�åoõíÌs †;©�dgyt~Û�¶+½bŒð*žÖöÇâò)JÓñ ÝTJ�q]îõ{öYMTÕÝP  ¾l~ G“’u¼SÚ¦$À8 �n;Î<û�4�&ªŠAû´>g²Ü ë4\œãݱíK ŒóãèVãÀ³ßÈh¢ª>L_S½˜>Ó1®C)1^–mW vsÄ‘³g¿‘+ ÐDUó`xa©o­ŸŸC}íÂ�`�F²³ì=?Šo�vrzå^Ãðw}×Är>÷��É8^˜M£¨ÝqØîÙoÄà4QUŒÁ9Š­ÏgÕt§¾óáH ”ð�F²óð·7w)ä¸1¾�±?SÂZQAÉ”€|YëýÙbèÁmR�#ÐHv�¿ú=JlPÚ¥KiÖ 3„±¾^q±¯¿á¤$€æ¤)t�‹‹¡i¢ðÝ‘ßHSgšž�¿×W ÎïÇþý– €·ñ¦P ÔŒIœFxö)MTÕ§T/õ¶]\ÚpD¾J08CÑy(î `aÃÖNR¶”f$ÉØ¬ÄŸÅdÏÏžx7"ÿF¤Sèg$‹ Rž¬,KÕwRÖ@~¯¬‹É �d§¹yzݶmWöÜ$©Ê²ÎöN«o+‰© �d§‚ô(¾gÛž(ô‚ÈS•åok¥š…ç�T�F²8Uk“"ÈŽlú+I6)KZê·€¾©£%-4’ÅI ÝÝ)†oÛ¶Eébš ð·Ö«Î6,ž}>ì%àxÏlú¤À8ç�R*JJüZ7²š¨8Ýh¯ýýpsƒàtï ¶K 0NÇùvL,¿Ô� �&ê�& I­|Ïßok䉉�dq"¡µîm}«ñ·6˜ºó¤°;Ya.2@m�ìG—ýt ´,½>À¸`š)JB<û�ì�&ªšf/Ïý…‡sk¸ˆÙ àŒdqöB&'Ű-Ù4Ó “�Î<·×0®oV¹“Íxœ¡(ÎeÐÞd¶#mƒ²•4›”'ÏõeÓs}wÓ·+‰àŒd§Õ–ô(6emSzÁ.æÙ̳>ؾf Í›kÙ àŒd§å•ô(¶#mWzÁ(QÐÅYÉcm|¾Ÿö^E1›œ‘ì4›éÍM†`˶铯$I²5�­ø?sþAÕÂ[‘¦O‚;)Z Eò!)çKn�;‰MT²šö@^ûoPC#Ò¶ç×P"{Äù‘㾑WÎ4=W;óÂùŒ¯ýÛ3Þ€ü�~GÎq†¢ØåYÕø]ßó_¡ïx'«B ‘쬲’ÅöcUB£WŒ‘»�Úí�·ïîBǪ Ü MŸxR‰î6ʶ<û�ü�&ªš'sõ…¸ëS‚Çãb2‡@#ÙYm%?ŠïÕvrzåÆÇü�R e©gÍv¦úº-=s˜¡èßÊ›Æõ2XsŠC%mœ¡è,iJbK±�…\±:˜¢,ÄÛ»ˆ‡¿é¤(‚7HSè§Ý¥qfåÈo$I€3MOHIêmX¯ñf}¨þ�wgÛ�+T\üˆîsÊl:f=r Sô£Dˆ’‰qíÓ/·dû”™š… ÐHvž…t–$‡�‘ØN�°”dp(+¢Ìb_ªf-<ÐRÉÎS’îЂ,W¿C—+IV’…w{�öpD€T‘�{¶é“à$»gQžüFR„@5ÍÓ¢…e}wöûùwh$dE3�Ti²cÀz´3’òfF(Ë~ÆÏövìúF´#9TÒÉâM^Ža[Öv']L3ŒiBTg€êèØ}Þʈh$;ωz£—cØšm›$,¦™F´2ÓþVó×Ñ §2 Þ»M£¨YN9õòkÝÈÙh¢âhuÆi}Ýù°„'Å0'm‹.Qqåƒ S’@ö«ÜH=Ì$u1kã¼g·7œ×!ÍéN„@#ÙyÂÔ)”"Øàm KiÖŒÐNüyŽB›³.ÿÖ¥×èh$‹M„9˜ Õ‰¬Ï¹¾Ú°�–D!ÎHvžD ~‡ ßÇm‡ÒÅ4£àï°q ü·=ÆÅÕó4mX\Áû0Í1ýBzމ8•¾ÎðÆ÷ú-¿îcHJ†‡(#Yœá‘J1lY6}„Å43…yÖ:*´$>ÏÖ ¡ŠÍ~Ý~—3Ó  –l�*N=·žé!Î4=ÁÞl€O}òå—�Ð’ôrŽ +B¡Q¢Ísë‰âLÓ“né÷þM�¹=DF5¼YÛ–\ãš ß÷i¢éÒMÄ™¦4E[˜/�Ãþq�Oõmb’… #ÙIšÕkr}<²M•lÁæéÕ8ì_øþÝÊ®g(:-:e±Áh»!� Æ'O¦ö¥>Ó«¾ºãF2…@#Ùi�)=ŠÍF¿-½`ƒÒŒnYê±v©–‹îÈ1•Œ�F²ÓÒNz[‹¶- ½`zȪ¼¶Ï Óþ¡k®¡ÉØ4ÊpaY(´>�`yf5‹D”i:B¢´œãj>Ÿ£ÞD$0m3\\?ŠŒ¥\žüF®†@5Msµ�¤¦Wûrb®†@#ÙiY)=ŠÍUj2zÁö Úkÿ*Åçès‰�d§e›ô(¶Wm_zÁøù4ñ¹µÂ^ëìSTˆÁuÓ&�)vâ$ssÌz– 0“”¤Dì¹jâøúW‚ð.mû‘5[q’A:ö;Ù MT-ÊsûÆ{Ø¿qç-E·+‡¥h»r�3’ÅV'ÏN·•¾‹ß†[é)�dq‚ Ùáþ0w}!èi9 lƦP <©GEˆS8Ç~'G ‰ª )âcm=�çšÔÑã E§¥¡ì 6íÄä‚ÊS±ÇÖ×—SÝÉÆh$;­Q¥G±éh»¢Ð vïèÇÚò©¯=þcµnÕ¦Q<)÷Ð}O©*%|n©‰"àLT›LÌÖû™I.ÿÀmÛïÐP3AæÊ¹Ÿ[ëNÒ@‡¤ñÝåÚ“ÔA È[’U¡wR ¬e~žüFʈ@5ÍSÆúÙ¡õóC¯ö²e1gD ‘ì,kÌ�b‹ÖÎ�@¯˜Ç,w\VZûbó»½¹IËg$ sG48)„MIÛ l)É*aÐG‰Ø{ÞzPµl1ßÉàh$;Ïàzƒ“cØ’l[$,¦™%J*)-{¯÷ár‡JZ>‡@#Ùy>7¸MJ lYÚ&¥kif м~+fXÀ¸f„–¥©”ã²›©$éõ ÝH{h¢Öyæùž·ïËÔ·Ò„’y"ÐHgžÞ<æ6|휥KiV4ËB÷•>ËŸûdµ,qF²³ÚW~»~SzÅrf‰çâç-'›¿wòNÀŠâ¬Ía a3·íO¾”f2)Å<®–Ö'ò×± =ÿCœ‘ì<ÿë·'°Eiû“®¤™'4<ïÏö!ž:&5œT›Ð¢4•`\mbó„)2%™~©Ù)MÔ²Ó÷´~”§¾h¼Ý½ToÚ®àïsì>Ý•ãârpÅ £'¿‘ #ÐDM½å©#¾ï-û%T›À¦´=Ipq±)°Oœ zò)1MÔÍ͂پô=rV,x¡!i»r� kYl“Ò|Ø/¤çÈ3MiŠ)™[H¶oÍíu’bˆ@#Ùy8¹ë8�°i§,]K³Iy"X_ÁV7öû8šñZ&ˆ@#ÙY…*?Š-ɦ„D¯˜¥<ýÛתÛ÷Nö8CÑYI*=ˆ-I¿'×äŠUJs½e¥í«Jsû2¼˜ë!ÐHvZ’J�bóÑvE¡lQžp.kmßVZ?fw#áD ‘ì´.–ÅF¬í‹B/XDHéÞÛ×’æV"ã‚Ú‹MŸ ¼BÛCÉ¡#¿‘TÎ4=!¥|¯ãÁ‹eÚã8\ã[Ñv$ÁÅ%®ÈîPfèÉo¤”4QSJâÞû'£æöâ®i¡¹hÛ’ãšVh{0#ôäz&‰8õ‰Û{ÿhÔúº¥¸b„–¢mIŒ+F¡Ù¡$гßÈh¢ªyöøö/Gµ,‹É#à E§•­ì 2›wnuРl´µÖôv¼]‘ oÓ^Ÿ  f,6�¾}Œ0l_Éz>Úˆ!½åiðc˜ÿ\ΙfÁg(:­{e±Që7$! dž†ßµ›ø}~ŽôAËÃh$;ÏÄ{ó·c>ópŒ›p�ͶU£wRcC#™¥â~¡¹8MÔ:O…ëSëÍðzÖo…ÞH…h$‹SagsÛ·vÊÒ•4c¹è³'YM£å”.Æám7Žò÷š{…ÛÞ}61ÅÉJÀ¥äÄÛRõSöÓ÷FJ 0CÑIÑ2;† ~·×Ô‚ëÈàe™çúš‹÷Ñ�’`ÄÉÎàÞ æ6omÒÅ4[é�ΰFD‹íŽáª¾¡5ÙJ�qù-2Mœ({ö…š¨*Z¾³~üíù8JßTC“Öö%Æõ7¶�×¥¿ŽZ@”‰£ÕÛ Ëeutö6ûQ Úã¸j~ÎoÎÎHV˜‹róaÆ^¬×…�”&Áœ5u®aqa2°Œœã;îµÀ™¦æv~ºÓóZ÷ëu”æ^cÝÒå‚ŸŽ‹·”%é^Ã��d% SJKf±~Q°>ª}£R0CÑi�¢s €íý¶;é:’çÈ«ûBŸú*ïùNY�F²³Ze~ÛÖ~SzÅPƒ½«™gíÓ¿GHàk‘hËš:W¨ ™D**xZ±� SôÛîä5fhÛP?^8~§ 6@µ Ï~v“úÛ… �¹—€„ ";ã\OÛI9,W¯È9L2žq‰Âqß(ÈÎ45wXMZÛ�Çê¤Æöᩳ\IGàäÌéoK ‘¬dlcwæy~Ô·RÅX0Ÿ½F¸¸K¦8«Éø…neh¢ÖX–ÁâÆ0mßt‡úY5½(‚8#ÙYÕ8?Š­øv’$zÅ%Pdú«Ìߣ¸ŒE`4dM¡K˜dGã„£Ö«03II__˜öÏU~ö§D¹Ê Ö£mÅ5L2`qEÄqߨoÎ45³êÆN±Üc^›¤¸0CÑiiÃ›Ü ‚ÆÕŸž«¥PV.´oø¶s®Í̸ކkÓ'Æ5p¶‚Xü¡*Š_J¯¾ ÎDµÁàî�O-d}â:8šÒ~‡Îqa‰›­2¤Eëmµ÷ìKÚí�ãÈwzu.€F²�)õ úšî:Vñ|¶Åz�d§µóô¨ã§|_ïnÖH¤§Ò<’QQjÜ¿rºÆá¤ƾ×ç'ù›¸fäÉoÔÅh¢¦yIj÷�Ÿ®o=»Q’B ‘,.I)G‘ëi§FaÏÝXZ‰ZVª_<]®®#ž’*Qˆ3’…•(á òmGîÔ“f•°}™¹¾ïÓmGR C˜‘,¬„‘CÊ ìjú͹ZJòZY]lx¯‚­’¯«üdu1É⺘r:œ¦„Fïd% ËËaûJõ;PÃØïJRCœ‘,®ˆ)G±ƒë7%£¼%–帰µ¬µ}w>®]­"†@#ÙyE¬»µSûš¶GéRšãJKtËRÛrÇ# Òªt4’�Õêò£ØßµmQèç™×ìöµªdþöû’Õíh$‹ëwÊQìóú}É蚇aÿ<ð»Û–¼ˆˆ0#YXDDW™!Ø nêä+I•ÒÛ�·æ›ž÷(ù±ÛéºÉN}U'=û�²&MT•ÊšÃöÅäOû6uŽÐï´]¹„…�£ÐƒQ¡ÑQëUU€™¤$fÔTÜ(jÅoá·X>œ¡è¼xè¼daï×��Ë¥4OŠ.iØ?åü®Ó°QÉ‘}MS(Æív\i}Õ/¥Xg¢ÚÕÐü¶§~Âyz<Û3-ÞåtÛs¸œ¶= ÐHû/r ó< íë<ÔØA{ßktŽ ;ì:® À~¹Œ0Ó&—ðZ¿5½˜ƒú€¨(ÉfvS(jÆ>¬Ôzr½ìŠ8…²ë†XlС4µ•ÀÒö[r�“Œ}\ õä7*¿4QSt ¯m ©>ñïj�]k ~Û”7­"çA5[O~£Ø‹@5ÝnŸéWÚ0µ‰º?ô„ÙöKjº<æ\ÀŒd…¨òê³_çFõ�&*MÕg®ß¾öÂï1Æ%~h$û7 ¿¯ý{îïcêN+üÎH~ÉwgöÊíÊ–’|Õç1‘>ÓcjÏ8n$ÓãxàË{j¯Ï9ÎPTª &ÍeÝö¾W{§ŠXœ‘ì¬ÜyïìxvÌ›6ù:’�ÇÚ4Wx·…Æïð÷úÍÉ*À3’…µaá öÊýŽ$乃êÁÏÚ;\\âPów Â4’Å%aå(öËmWzÁÉÓ}½1†o}QnǼ{ůثtÔ|3y+.6o+õÍv±J @#Y\¥VŽb_ØïJF/8Vr™Ïu�±~'s<šذ_ØTJ€'­Xr¬X½ç ¸[êNé€&ê N|C|>ï¿Wè;§à�û:Ç�4N#OÏïžüN¥ÜãLÓ“oïÅ‹>_Gd¶y¿ê�÷—bzÿ|lÈ%ÊHV¦ÀgW/¶œ¼×ÜÓöMdpŇ2¨“Þ09u,×p þ·Î�Ê}�2E]ªÙ?¶�ËïozƒÉà†7eRàI“8òé\zwìwjö4QÕ¼H¾‘Ìõ¹S¯QZ% ‘,®“+Gq8П›Œ^ˆ-¨2³½×´F…[ÉàøšJ ð¤IyQ®¦;ö;š¨j^¬ß_»ä4Ï[ÕzÀÉJÀÅÞ1…°ÛëÏÓåZšÍKæíŧïú �%sÀÉâ’¹ry¾¶) {îEÁ ¼¾õ7-ýÑÞÿ4’{¿j“£NúÃä,¨ˆî©o4 h¢ž—5ú�`z¼ŽGq´=�d% ÓŽbÓŸ”„^ñWØ(X˜·iåï®sû|LS)ž4�#‡EE|Ï~£]�@UEW´c“Ó•¬±e æ½ß—  ædâ:¾g¿Ñ©@ ‰ªfm‚×Zg[|ÌoüAj ÎHV˜‹=c aŸ×ÎR¶”ä>¡c°Ó~Æ÷¯œ}dp/½6§°¸�9*ªç;j½a0“”Ì;;G u>�6I£P†¢BDÂ!ÇÖJÅOÅq/)¼_óßw}ðã(üQ·}ܦM Ôí}ÍXgGÛ¶$Éb¯�·üZ7ú4Qñ¤ð¾SÌ˟ç×'«¼#ÐHV2í(ö¹ýyJèŽ ª¢¿ÖWí,’ÝÄjµw‡2/(�p»Ù¶±â°½+^H«+š+DÍrt±M—KXÜ*goM=ªâ÷+Ý(þ{˜I*ç…ÿ�£–ê‰R÷œ¡¨Tdò·Ý©º\Hrݾ±±öÓ)Ô0Û)s‹Ûå�ëæ6‚ã¾Ñ~œijæÍ‡×ú)¸õÃìãØ+”5h$+™vÔáa¿¯©« kô<4€dØoØy?K”stq`f£€^ŸsœŠ„-Ç­w<fš–I·ag˜žÇKŸ•n¢Œd%`Ҏ⨣?! ½Â$-�Ú¯®¼>‘è*û—-DÉJÀ¤ÅqOÛ�^ ¢°Ý±3�ßùP¡Ùvôú\ â¡ `¸á©ot[h¢žØè VÁBòªÎ{üÔ6ñ��d% ã@%Ç` ÒNRº”ÎP�iªÞ}-û|Ÿ=o7~nÓ'ÅI¾6îHxò]š¨iÚ_ØI¾Kªôp•ô¬¿€@#Y È´£Øá÷§&¡W¢pÉïg¹–Æ©çýõßÁÕõêœÃ_4\¨káÒ»ˆ3Mi ²§¿©z°%Ä9úä‡ïíöæð½ms®Pæ± OÛ.õͧՕ<¦ŸgÌÛ.ˆ2’db�Øÿ¶]¹^Fpã}­‡ºûUò=ŠqJÛ�F²�iG±×ë7#¡W\hÞ{YÖzTÿQ¿[ðî÷%ë½ ÐHV2ò×9„qÛ¤t-Í«ç�˜}­îmmZp†¢PI±ßë÷äš\ñ¡Ôôë;ÓÇyž�'hýÞ¦Q ŒB'JÏ~£õ‚@UÍš/;ÇgüÖËNï¾ ÎHV.v‘9†�_ž.Ó<)¶dvæ~†º‡OôO¢æ@#Y ÈÂÎŒ'×{3ˆ3QѼ?S?v_£�ïØiû34’•€ŒƒˆÂB;OéZZ´qÙ¬Y–Y;óß«ß�¬Uãa’)ÇpXж"§" ×”á¶Æ¶Ì\‡–ƶJ;p†¢P1DáØ ÛœË¥´8º3Ðëx½««ÿ\éwç²C‚(#Y ˜´£(ØÐØó˜âºI³/3Že©Iƒ0#Y ¨´£Øýö’Ñ ¾½ôúRÞµa1;â߈úߦÐ5.œQ]9öU<µÜŽA˜iZB;f,'» ™ÐŒz¹~;Îq’£ [&žZn!Ì4-±à ��äûzÔçotBh$+YÚ Y(†údÂòÓ_Ï^Ÿ¤‚8#Y ¸‚h%ÅpÒ®™t1-¦ÁæÈÎ\‹"Ÿ¾VÞMNx×ßësŽŠÇ&‚ ‚zŽúFop¦iIUê0,$�p½ÖodÜhM ÐHV2 ZR…#í¥ I¡ 5J6âZù�ö~†#€^�3T0 ÔÆð¼j“Q¦h˜w#–½þÔ˜kÉꎆQÞŒ”¡¨‘pÛêqÀ�ÙH?õ�ÁߎµÙ@Û+sŽ“<~PvÚxë@ÎãÓñvS èðz}Îq’Ë�û&ž[ï !Î4=¡)Ãm�j¦*™[µRì‡ ÐHV² VH1´³”.¦E+l¼Ÿ:šôéy3 ôúœã¡…0  Æ‰çÖ»Dˆ3MÏ´-³pÈ4=†£â¥õgh$+Y¥¤Ž6•„Å´�û3íU¯Væy z….pñ8EVP§Ç“ßh!ÐDMÉW¿ªïïæô�m[ æˆÃ.‘'×»Dˆ3QQt×d^’¶qî!Ý úá~S.€ñt;õ¼oå׺ѷB ‰ŠS‹æõ7l-”ïÐCº!ôƒm“®qš/Ž;KŽüF“p¦éI-¢RãÀᨈ»Îñ3ê'TGØ’ œ‘¬\qÇ‘ßhRÎ4=ã«dZ|�=dNþ ‚“nK.pF²8ÐÉ»C¯í9ŠÇ³}RGíÐHV2í(NÚ®(ôB¤Ó‡ØìyíÏÖÌÇVR�`F²PiGq`ÒoGF/D9yoèYŸkXn�G{gŒØœ‘¬\ÚQl:hôBL� ª�x\n�Ï»'þÍ“ î:ÇIAÀI�ÊqßèQÎ4=É/·O¼ýå@‡Ûö$Æ£콡mÆÍ'·Ò�®MT›\@ûÜ/ó¥éð¿ý]à¤@i£¹•îôÑh¢ÚÐÈÚ5 mÙ Mu€7î7è'E'Ý&G~§™@5z5í[y�ã²{54’•€L;Šã€vnz!¨ÈF�õQ‚éù>&S•† Œd…˜”c8ØÖW¨ÓˆÂ·fûc&ßãAeš'ïÛ«rŽ‹çI"GÎMÇ}£98Óô¤²Ëc{<àû=Z´Ft¼ôWì8!ÐHV2í(TÚ®ôJÔƒ]§�y^‚�ÇÜ3wÓ èŸ{•.€Z”·‚<û�ÖMT•Ó§ÉKPð8Š8‚Q¶-.œ‰nþxn½×…8Óôô%«P¿ˆôéÝ4ý†œãÂi�(¾àÎ�çÖ{[ˆ3MOï6À4 Ý,À/ø'ˆú 9ÇI! ùè…vZšþ¿Ã(è{›:׸xÊ„ý85ݨmå–ºÑîœiZcYz‡ÔºQ«ÒÒt Æý]ãÉ“(¸àÞ•g¿ÑôB ‰ªbàP'ƒ«3­ŸŒjEG˜O�ˆ íÊ5,<¡à"éùenôágšÆyl'©_œ¦^¡¬ †@#Y È´£8&éOQB¯8¾ ¶ð>ª÷üüFqi0ýpS(jÑ@Ü™òì7:q4QÕ´Ë´“|ÆG}Wî�.�d% ÓŽâx ?7 ½\PÜðønsO÷çíÆAÐ÷ ]µ  î>yöý6š¨jÖIz.7[LGMQk$ÎPT*vÖ)„¼ð¦N¾’äб¡´ÈŸ[‘æ{T a0Ý_Ó'jN8îúxöm-š¨ªó�;`®½§Wè&DÀëõ{r�‹'DȃR• ;E~%½Ã„8µN;L Ék ~FßMIL3•€I:ˆ£€v†rr%¢ÈûKûRóô›qÕL4’•€L;Š=p¿- ½âÎ)kŽ»8Üg-3rÁ�J‡ ÞTJ�ñ„ ûsluíÌuðèåf_ºñ t=½J@ÍÆ­.Ï~£Õ…@UÅ�ç:θð{ø“f@6/ô­UÁW·- ..¡÷æWºÑ{C ‰jg]¦�£6†¦£W t™h$+™v*ýYÊØó ‡Êwq-—LÏž¸A¯ÜktÔbƒ¸õãÙo4·h¢ªygiajnõº2žÐYBœ‘¬0—tíÌäylÑu’vÊéù8~΃@,Ðkr ÇA¢¨‚šAžZo"!Î45³¦ÍBñ¨1×8´‘_­iƒ8#Y ¸´£8i'E¡èqïe_ª¾eøãv%kÚ ÐHV2í(v¹ý¶dô‚ÿÎ;GÏõc‹äxÝ”Ø9B ‘¬dì›S;ÝM#a-̓“Ú˜?ËÕåÚ_ÝH zÝ^£s\<’zpêô8ò�,À™¦'”ƒÞõÍÜë¸Ó÷Ý#º”ýWø'ôs`<ƒ‚dq¯Ç³ßhf!ÐDU³^ÒÎ1 ïcš@k&!ÐHV2í(ŽCúS“Ñ A ö´6âùñú;;Á0¤WèO�„! 6š·ÞU˜iZRâúþ{~«K[‘–G_0h;’µx$n2yö�4š¨*õ°–˿Ư£ ‡³/‘l %°pô%Œm°µä˜å LR‘ª`ÔõÙ8ê.gלɺE€3•€ŠÃ§ ÁaQwn.WÒB¬¬wµ,4Õ�p>°bï �F²��TŠá©mQº˜naý�zAûRµïóÝÍŒÖDB ‘¬dA •b(>é÷èr-)Ö�0f£­£V££ífQ04èõ¹jJÜvòì7Zk4QUê# õ’ZüÞóÈÂpèëSßÇrÀ§¯`w³è Û¶\ãâÑö¬yë_éN¿ËãLS|æ ø|–{ñÙúAp†Ýî\àN&LȱæÍ·~¥½73Mg(­€>N„¾Ôñƒj‰§ÉpF²p�´¥zò;�7�3MO¸Z¸iT}ÿ’6û¾hÚjêQæ% ái?9±l¥=®êßó‘/i ®d^P– �ºpxtìÉå2Z %ô¹¶�O‹ïšú}IÛ\g(*•t$›¹Ü`�°´ù=×÷TòþÿÞ¿Wèx2vC¡DÞtsKÝèºÎDµ1jy¬Ï\Ô—3O§ƒ: ´-J€Z<7Èù�vàLTTè.m,ó÷×»K4’•€L;ŠB�þÌdìy8C¡Ác{&ezVóÜwC1Þë7}®añLL?p[ÊQßhgÎ45!:Ùuþ«=¢Ã1Þé÷ûq�“�“n“#¿ÓQ ‰š‚g^âܹ–—ËjšzH7ûÑ»ÝU›O~x÷�wÕü2z[ q¦©Œ¥gê íS}nýè~*-%ÉJ@¦EÞ¿?C »I ?|¬óçáÓ¾ÏS àéšB׸x„œ¦¯CQ¯Ê/£÷¸gšÊy—k'©_ð|¼;…².âŒd…¹¤ƒØëö'èš\pàY“kYçµ>Êô=QК\4’•€L;ŠÝ~Û�^‰!Ò¶Ö¾Ôg|þ¹]ɺZ€3•€J:ˆ�n¿%×äŠÇÖN\§œ&ׯìç<Àçõ]5Ï7™<û�FMT5o-.ô»÷QÚ™ÒzF4’•€L;нîvr$zÅ…SpKÝ–e­é»I>S¿/Y›�F²�iG±óoû"Ð+‘DÒ˜Ùšë—Ž£Ò˜A ‘¬dÚQìoûMIèçÝu‡Ò÷VshOÎÒÔúÚ¦Ì5.žúˆü67pù�àLÓ»Cdž>5úë Ý”:ÛnK.pñ�G丹_ãÈoô§gšžPUYkáóñ¥Ù4èmK æVâf�g¿Ñ�B ‰ªb/hÇ|Ÿ¿é8 ØMü÷õîüaŒ'(�,ìÑxr½!…8M:@Ë­>¯OM�:BqF²piG±³ßN‹D¯DIãg_¨Æ5³ëŠ%�ÄÉJÀŧÈ51v‚*ùè­DÉJÀ¤Å1Gzz%€IËBcMPj dw@BãQF²0iGqÀÑvD W¢ê¾`c_jZîûçÜïIÒû@œ‘¬\ÚQäñûMIØ…èÚ/õ‘¬ê&ë{¯Ž3Ìh€»mú$8ÉåÇO~£„@5M.;I}oñ<öe ÉJ@¦Å>¿?5 ½@PË…º�Õ9,’¹kD ÝÄÉ sјHŠ`ÿ¿íP¾’JäÍ—}¥Ï4ål©û‚8#Ya.é ŽAú-¹&Â#ì¬5Ú|ö¬Ýdzÿ^›s\8™ÜñÜzq¦é‰½—u;üœÛ¿ú±t¸m?®PÁ\Dè·©âyÕÆ¢LѪ¡õ»ËŸ­¨ñý´Úœ„@'ÛvâÎ8„þšÚ%ž[o³ Î4=ó6ËN2¿‡c4[ë³ ÐHV2í(ö²ý‰Iè—� –…ù1oå•6F£èf›J 0ž=}6µJ<û� MT½ñŽ™—mp˜nýl¿/Àx´��¶oüpëįt£ç‚@ÕF+ƒ�‹ÇXð\Ó²•M!¡ã�8#Y ¸8BÈ1ìû7�„Å´@‚š0s?þCó èûz•.€šŽ»$žýF'�&ªúÿú¯ÿß½¾Ëµ½ø¯iš†õÌ¿§ï·Þ‘»àŸC0¾–(h�2æ'ùÿþ×ÿû_ÿçÂö\·ú_ûÿŸò¯ÿå¿ÿëÿù¿Mïñ_‹�üLïù_ÿýü×s;æ_Ãb½kÁrX"‡Åêüwù¯ÿéÿúü÷ÿد¿Ïü\2¦ øû ókþ×ÿÜþòßÿûýO¯zèÿúßË�¨?cxÌïúIé¾p ÕÞSuã!ùç�ŒÃÔJ$;ê'Ù~v§¸¿³lï!¼ÚsA_hÓöý¯ÿÿò‹ÿ‡Âb(*±tG,íúÈ…è‡nrjôlKM¯o{1´Ø œ¡¨TÒA´t[’‘ �ëPq�ç±~qs‰Xž-�›C4’•€,ˆµR Qm‡ÒÅ´ˆìª_µ¯2=_íKZ¿ qF²piGqàÒoHF/DAiËjIÅ¿õñžÏÐ&8´–âŒd%à¢è&Epزé#,¥Å@ÝlÄŸúÆ×búM”`ÜÒ+tŽ ‡E8JjûBuvèõîOXÖPC ‘¬dÚQ!ô›’Ñ áFÞP[Öšjméù­øFC �F²�ñ€ÉŽù̯Jó€ ¸ã¶I .ž!×î{7Ü¢ò Ýèm!Ðt­ßÕé�Ó0ý¥j˜-wܶäÏŒDž�:AŽûF pÒ¯ãþ÷av’¹¾š|ìÊ84’•€ ÈÀñAŠ.WÒ‚ l(-Ì�õy—㋲4å�.¹it� §zó5?Ë%6s覛F 0å`ŸO%ꥸ¥nô`g¢ÚtKíŸÝæÃtzé¶G 0ï]>µSù�6 àLTTh{Ô¾\•ÌííjÛ€F²�iG±[Þ”Ðèß÷^¸±-3=ÛvDê{xœ¡¨TÒAì�ûíHÈÏN>û¹> 1Ï�ëÐ:ã¦QŒç8س§­·Ò�Ö MTs… ò_]±&KÐ÷[tŒGKB¿Î}Ç~§@UÅêÖ©CKïÑMq #îwåq„N�û8=ù�þ�Ç™¦§Ðjyî�ÚÌG?Jé´x˜¡¨0“r »ÜvFrêÜyC‹šÛ*U0ÏÝ^d-€É SI±«íw#!ϽvÖϨ·R•LõäßégÐHV2í(võ›½7PSec®‰ï³gîÇ!¼¯í5ºÀ� :~›ûŽüNc€&j*ôUöOs{ ¥ÚX ‘¬dä”S{ÛvžÒ¥4×�Þ‡»ëgOÖ—æÎ÷Ú4’•€L;ŠíxZù`’)ǰ÷m{‘QKŽÜûÃ�öó^ŒÕ«çýµÂÉÏuê\àÂNxà3Ñb9_©b´üUé ÌPT˜I9†Ýl·—ÔŠÃ&/¸ ,¾d8ÆŽ¡ ŽÞeÓ&ƒ)îíºýkh홦loõëñc͘^Ï£D‹í_2çmW`ØØ |CÚ €µôVMTok¬cW’W5“¯ñoœ{�’8�dçðÇä®åæ�·t1Í]¥ð¶Ö< í«sZœ€F²¸®…ž¦ß•krÁiQ ~¬_¿YŸTŽÝöÍ`´­›>).ìò†v+ä@®wh¢¦Y¾‘|¿ð[*ÀÐHV20Æ1UÏú~¨¾K–¶�£+·cƒM)>²a±üM(Sô¥ò÷è>ºâ»Ãí÷¸L:Cqw˜hÂâ4ðŠ¥wB™¢aVõ® C ë«¿Ž„þÿîí[z5IŽëx×ÖÊöÆ»¼ÂêËz?$pC‘¶G€Š9aÌpÑœ¹3så¾Ýt÷SâÆÝù¨¬/3Nä§Ú´ @͉›'2*2^Y_Ñõ šÞõ†ib0ùåÕ1'ã2©Ì‘‰ñ2öÇ/+ð¤’_)Ñ z­dRp&Ù×sñ q:Rp«!˜t!¥Ì}ØZð q: é qf&à¼R {"›ßZà™éíK`x> y§”æ�Ë~j\pç›àt¤¨2GN¡Ìš·tu CæKâÜG©'ÃJ5òåD|7¾F9F^péXƒ)íj�s_©™;@õôYO¤²--¸ó}x:RTHÕ j®®qT ©°ÔË —�eë›Ùb*¾ @GÊ-Óøô0…ß ø�Ë®ö©1?g@õÜXIöV_^LE÷åçH±E,;Ë�Gl"oG»ˆìHKœ“¤v?Zxû}&æ¼`ÖT\’7ÒÇTÛ¸[)²-qN’ôn41+ƒB%s¢Ê€F„ì*�Á(cÔß¶%ÛÑt@ÓÒÌ(LÌIŽ=‘å«®¸ì/çy¶m8Ë<¢- 0´v[ºJà&F$çR9wg"Ò¼Ñ#Ó,áw`óxüú…ë‘ÎMï‘3£03g�0ì‰4�Ù²êxç™–p“ÓV*å~§phz¯œ…™¸TŠÅžHë�½šÇÔºÞÏ�êÐ_–è>N;5Ös¨l§ Þô™à'gݬ?>@8¬gÊ’G´2±d}8õ„VMR²{.˜óçt¤¤��f–ãwx$ ©¥TË zܪç)ÙVÜù~<)*ôãeO{ ¿‘ ù}íŽ�¢…L“¥1€ê­ž¶°I]q¿Òˆ@GŠjôÀ‡½Ž s=p�r@k÷À�Îsúݲ�­:²ñ\ãœ$émg‘°-&âl0ÖD\R‡Lß>GŽÇµ�| �îภØh —̯´Àkœãä´ÛÍ}|%w ×µœòPíft@ÓÛÍÌ(ÌÀy]öD:·›ºýñ¦ò~žpM]�s@Ó›ºÌ(LÀ¥V,öD6‡Î2ôg»ôrò´œÍõuέÝ×-å1!˜Œ“@Ä\\fWöù²W›æZ|‰¶õ¥ŽÌ&¯: 5›¼BAw†c,tw.©B—· wÍù�ïþpžÂT§´"fqCZ-¡b§¸dK·—k�#Ä“86hƒuÞÎß@’�]t@kvvëxgb $(æî\Ty![ÍØ®M3…ßè-•ŠÌ>¯: é}^fdáR)w;£Ëdí×,Þ"6�éObEÎÀÆQ,¤t¢ù]Íu¥û-€Ž\&)ï„[ü ØtÜ«Šô%2qúÉ&d2£^OÃ7Ã%Îq"ËüBT¼ø´l»É“P‘x²z `ãŒSËbÐ(®¹_h†K #Eµ¿žÇ"øºž• ×ú•@4½ýËŒ‚ä“W†àN$2è@C÷˜ªø ×þ8'Izû—„á½TÉ}æLªZèá†ðÂÑ6�ÇÂ\óWКÍß*ÛŒ¬IEÄd\˜¶ûÑÇ\·}Ø~´: éýè*{@üáÌ~-¢µH1¸f ÝÇég�¨¡1 ­Ýjª -a�sœÔ²…–jⱌãÃTJcubk˜½ k�Á_¬Î}ÖLº°›®~¦)DÎåöò×t•@4½éÊŒÂD“µB°g²V±‹<˜Þî>SN"E„/…¹ƒÓ•l��Ùšù…æ³:RÒ:lñ ÑCÁ¥u1Äg�ÜÇ里Zº€6iÅ›ï® ˜ã¤4{«Ûîg�¼K_ŠcôV%έÕ[µGaFI‹B±gғܱAƒr‹oGûÞŸ¯üq�M t@kw6Ëäcc ­d™sQ) ZЮ<¦Z¦î¼Û‡ësJ šÞçdFÉôV*Å`ngJÑ×Üâeó>• ç©.œEÊä’å1€úY¤–©°GZs¿Ð\•@GŠz·“y0¸}¤„ídJ šÞÉdFaz)×Å`Ïä*³�¾ÓÊÏ}9.­';ª瀦÷UíNâÁeõÆusg¢“(qhj'‘9/-ÃÛΞ²“ ÍÀcžp¤Ü•�U«‰(qhj‘„I·TÈ}æDþIѳ]BJ?ß?»õâÌQf»,�ÔOµÔ‰�Åšû…^ª:RTh\.¡içãfw\·¯¯ÉHšõb¹x®·kîÚ§èHQ¡e¹ó‹ŸßžÖS©É˜žõbõ#55A@O±æ~¡o*�޵nYb×ïà±å$ªUX�\Mh5 «t<æ•reš“PùI´1¶ù!œ1ÍS>ƒƒ35™P’(L?QÃÜ$›§Ð‚L•¿õ¡:—æ$Iï[ƒ0¡ú0˜3ÉÉîTú©æx^~y¡S)�hz§’…ñ<«…`Ï$‡û½I?Ï_èÜ�/`�½I‰s@Ó{“Ì( åY% {"/HO­½c¢Å³È»x¦#(ahzG�…Q¼T‰ÅžH ²-‰�=ï{Hœk/zpVGPКÁ2ÿ˜‘\’4Äcx‹ÂïˆöüÓi8ŽQ=«ä>ŒI+Š?C/¯žˆïJœã„]ÀQrÂñ˜Ì1¥~îõ“/5aA?¯æ~¡(�ŽÕlz&±K¶œQ—ë œ“$½™Ñ‚`ÂÉ«dMÅ%/»'¸y¿ „5;׬aNPôn ŒÁCk’Åœ‡‹ÒÐŒ|oß�U„dd+乃ã«޵«˜_hL œãä4zq[þXÇñ^ÔH5ã$Êí³Úq‹uÞOkaÚqæ€ÖlÇÕ ÁÄ`¨ÏæbNÆå è&Îá¸oT{hfK‰Ú8.Ö«MŠ7ß#0ÇI Bè±…O‚†´~ùxÊÃ4ç$Эݜ+«1 �yò™SQY òÁ�^æç3ÑÃñLê³<L?œ‘Y£î]bÿ¯šæJãP)3ÆÙ~ëÓk\žÉtÕ·@4½oÇŒ‚pŸdà¸Û©Côéúã]¿-üpziïKaZ(å HMØí«øÒ=B�rŒ„å~­Oon ]øÍ£Òʃ–•pÆ„P½“Wqæ›”æ8!!Îæ�-Ì9ÉÂAŒŒŸY÷qú Æb«oYÎs¡mYÃ'14 ±ív|O©÷ÃJqÌv]�s’ôÙͺ.½'å+ÑñìRÝ:t@ÓûuuÔ7Γ<ÄL\n€Ú›`i®eêoKF5Ïjœ“$½}F „RêÄ`N$'èàuñ=­mYD©<.Q5Kd¹ÀÞèªUܯ´Б¢–I w U×±8ªñµÔHGEøFS­â}¡m(pŽ“ÓìØuñå¶u>³×±«aN’ÔŽ�="z^›³™ìö\œ&µí{© ³;Wãœ$5{sÖ È'…6,Þvj²a]ø•²Ï&cx�íB#LàÐôF3 3ZÖ ÃžH�F,˜WxÚy<�͘˜„9 é 0fFÊ(Çž »² ç9OÁÇîáÜÂÊc¬²D÷q\ÀTeo¾(`Ž“R#҇سÌùº<å䡘Y!®qò _hYÕÌ/ôº$Б’Ê^×�Y¼·MU¬Þßs»‚kÕH Z«Yc�Âð™5B°gb±h×ÈÆÇº„K=}àêÎC ¦_"ahjÇ„„¡3)„aNDaÙ³‘­�cžpá4½¦;&怦vLˆAçC„MÀí§·s8)�¬d¾YÂoË}q½ŸöÆSų,÷aT"QúGЃ©fºÐ»8Ç -ƒ­‡ !N-]¾œ[Ñ"Œfý8½ !Y´’°!SÏt¡“#�Ž:9 S\‹ÝiNKÝêíi56ˆKÍœo'Iœ#­c®�š{¼dº?7º²E.ÃiÇ©ýoŒÌvs©ž‰o.Iœã¤¶û:“â ï\_GâÐ}s†ør�î3'²…hë`oÄO´„Ú¼ÛÎ׺¸¦Š: µÛ*e0¶1f³†Ì¹¨�-ƒßüÐÅ÷x¶p;¹Ö�Á¨–2€z—C¤ÝyªçºÐ{’@G .Û? >W9��º­-c\©£6Ž ³j›¦fMw $ÌqRB¨™Â•Bå+¹ØÀ•A$ dõ.F¤»] zš m t¤Ìvf oÑzš‡È&ŒÀ9IÒ[02Z py¹¬™¸`y¿~©–·ÀîÜÍý‰s@Óû1qL †’¬s2..Au1†‹—æeóûŸÐ󕾜$²pT4Q[45kºE#aŽ“Òh‰6ïŠÇù3ב84³%‚MÏ`‰÷ƒ¬E?‘éFH Z³3lŽÂ`– „aODFQžCga�7ã{Êrfm®%!�hͦD„M „׬"s.*T‹. 6Ž™Š+ËÈ.…: }NŸ"|¿'Dr¿;^ަúæ€Öj\[ƒ0Äç"˜ÛÙÂîLøÀÞ1Ø–5ßHÂu&$έٙ¨ú n+ÜÎn�è¾Ê’$2�z_U H°U¯¹_hFH #E¡fËî·Âñƒ{zûUÆ�¬¨÷VÕ€ôšû…~„:RT¨Êa}p)ÛäÜö[КíZsF¯rq,öD(´÷Ük¾uÊß åöÜç€Öj“Zƒ0Šf¥Ìí€lïúû =¿¾‰’»~t@kïúïo±ûtÒ=nB"s�-€hÍ]¶9 CX‚cOÄCb§ÝÇÃîðÚÛ4\Úi  Z³÷gŽÂˆ‘õ°'Â�¹¡õÑ4ø@7ýfC+phÍîŸ9 ãEV Þ>Ä>6ßè8æOŒ±ûXt@kö×ÌQ4’{"Áfú¸¿qšŽwЕDm\£}¦ Üñ–̯ìçkœãä,÷¯¸ì°øÒW7_Ú:  Z³©fŽÂ€•ׄaOD?b»Ø¥ƒðð‚s;ÂlέÕÙ³aÀÊJ!˜Û±O”eqúü«h¥U'"EÈ6zuvê+lüê‰.ì%БRÛ[4Ïe¶wû½¹E“@´ÖÍ…¾š×‰`Ï8¾µE[âýpƒ÷¸+û³ åj‚¾3ƒ ¶Ë^wɸÍH…r5�܆@-¿láÝ~o•ÞÄÏÍ<³ �@´ö6àæÜ&½$ 1çrbàOñוûÙ!�Nƒt’,‘Ô; šÇa-_s¿° �@GŠ 6 e´çÒG�œÏCZ®þ–@´Ööß%œ$¯ ÁÛt7YþC ½¬á:hOÙóOXÈÚ[ÐÈÚªWÏeŽ)yÑ÷+e¯: }fÙë™ ñGÖóÙ&£Ê^‰s@k•½ö(ô’d7{ÆåÊÊjÇe õayŽÏÕœç$©µß6¡‡&u0Ìo‡¢*G?ÕÏ5¶ü±²ä”@´Ï-:=—1¶ò·pCÃ…¢SÐÚEgW‹$Ê$Ï%Þíuu®¼8'I­]•9l2Û�Í›0o£pXæP°yÊ’?‰Dè€ÆS8¹-o�À"\h> dâôêZ[EÈë5ó µ‹:RRY6xÌ2§²}¼•ÓEéë5½Åƒ–1•‘Y'÷PJé+ÙèÕBÍ—­$Ê1ÊDˆÉ$Ü  |ZóKwd’@´fágŽÂ•Ï Â°'̨H…˘¾x~ëEcI)uŸ¤1�Üò«Ù°fÎgC‰s¤ ç‡ôâqÉ·!C� §JY8êiÕ8_³¦ã¼„9NJ;®¿•™†Üã&ãªÀ9 µâª5Ÿ5‰@1·ÕFÕ>î Â5për)®  š]!¼a€èâ³oùx“ ,5ÎIR3;YƒÐ’s˜îG¶PòÊÞ+¸ÙЭÙÌQ¸üY# {–ìØ6ïñ 9a÷tüì† nè€Ö oö(Ôz‚cÏ,¡ q'æ-}ÚÃoŽV`$Э™íQ¨ô¤Š=³‚T¤kÎk¼V}™öð…wÞ¥%έ•ìQ¨ó¤Š=³€e\Ïœ—t¥º¯À�ËdH—–@´Vz°Gŧ�Ÿ!)ëŽ;&Á £ úå<§»…}!:mWZÐZ1Ù…:OBPì™QýržâM çi/éÎ5Ì J3cPÙiz†5±n2– ?ÎcºoîBÀ¾àÈè€ÖŒÄæ(©í$ÇÜ\¸"’ 3úIâ­pç»ýœ ˜“$΃Áæ!]—t+ÞHç‘@´fô3GÁÓ&8î¶æ¤ÿJOèS�–ðËÞ�Ì­øÌQ¨î$ÇžX;ðbô„.eP?ç~Å�Ì­ùŒ1¨ï$ÃÚ\8p°<¤Â�/C=1n,VâÐ(‹…u%XÜ7­g ÉŒ: µœÝ…�…àØ3º“Vë+þÂëï88C_–œD2�ºŸjÚC¬¹_°] t¤¨Â\PáÞö—%åÚ£F WJÐ>w¥Â�LÈ]Á;/­”: 5íÜ…œ„àØsÚC^]:Ú;R!+A‰r5AŸûV¥ á .huÛâèa�S‡9u‡Ãßã[»áûÃ9Ø Wž.aȲ§w=“Ô—Ö)ým[B=øNNtLnãО‘×!B|ãiŸÃ�ˆâ 1µJ÷é¸Y}džAßûV` О%'H5�mx“¦|®héž2Ž!žý&�t@{V˜Uv±ÄÍ¡v<¾?ÄßëìÃq£©PD–Æ: =+ÌœfgËúpðî¶ æ)`N’š&j ’�›uÀ0¯iÏ ¯C„°+]»þ8ð ¸àÎkׯV\|¡®›ÒýlYè€ö¬0Ó]uYÒË#7cà\UâÐTW_± °æI{&ÆzJ7�Xàçˆjß÷ã¥s*‚H”šAÌ!Ò nj°„g…�²"súÂvåÐUxÁÅO˜@Î� kîB¨:RÔ»!4\Lk_�/²±!TÐZ!Ô…Æ—×…aOX2˜ÊôphqÝ3ãBûïí'‰,gõÉHí'‰]Ý—ãe]2ÂKœšáå´†¬s2δjõˆ$²Œñ¥Éµ›�WuÙì#�hÍìcŽŠO?MÞm·�гì+ڳŒ1áþa8ü G^΄Î­iÂÅ>/ oFK¸‡š«k^Ô ¾fQ˜—¤fÅb BÈ A0'üI’!¾É[2ޝ�Ämʺd�ЍqÈ: =+Ìcíã÷i½1M[£Â–~‘íä>N/ ÑÇJ_Æ¢¨œåJ1Uã'0Q-tñ5š°¡ëÆKÕ‚: 5 Qsu!‹f WÜ œZ«¸µ�3ä’‰àmº•ô(Ħxáë6ø]¥‚“@´Ï®àúðû¡ÊÈNК›isÚdÖ Ãž0p0]¬ÅºØ‘,솬ájœ“¤fg B¯ÈÑ•`ÎyX]È�¾ÊŽKñè"RÐô"Rx�mâ~̯{=]#JÄø†VåIfÜ(ºˆÔØ×´V]g�òcöø“ÖºõɱÇÂI27RŸ«éMj[{v"²ÁÀƦâ�]6ʇ ËF|zIÓËF»´®žþBi-pŽÔ¤t(ó ‚%+"ž�І°f² WS„Gèã½|•-qhz•� 2 ܲ†Ì¹ØH‰Úžâ§»bu>.VIâК«¤è$þúYšç;0E©’Îq–nnDü­Çs�Wö!ç$Iß…H¿ö]j«Ç®¿Øldý@nË£µ=Dñ^Ouaƒ"�Ž–Û'ž)ZÕr¶PäîUúlNX÷qêöÝ" ÔøõLüÞ@⨧%j›iJ-ÙðyÉ+¥�À9IjV–­ã¾#I`û·‡OòQQmbK+í1«ä>NßÑj¶�[ŒŠù…­‰À9NN°ZYÞOñŠBO 7¬ð»s’¤ï Ðdï#Ð7òúX3Ñ~f¶§Ìñ"ç0dº•Á”C@­,yq£èR\e_јR<Ü7zt&ÆÓ!Ŧ^Xc^Gy„^ŠÖÌ/ì$Б’J[µªð‰Û¬âˆô.¨ÃÝ1ÁÀ‡1ÿàˆ,$%ЭYHš£nº–â¥wŽ=îè%3½Þœ†³ ¾™'±ç€ÖZ Ó§°TN2ÎÈÕÝVI=ÅK´£ÔÃøúBM-�hTU­<é�vÅ>üó%  ZskbŽB#HBpì ‹ëd*VÖŠ¹\ôøV_Ó˜6ÝE¦Š6‰s@#‹6_àEvÇ'€”#±ÑÊ2pú‰Œ¶iƒ IÍüÂL))xS‚Ýñ;nìiÈ�~häˆK*ú^äÆù¶«9B<0 Ó˜`ë’$!Œ�ß­}ò¦ýÜ'Š�°\ñ\.@ÎîÔª¿fÎïj$Ž{B´Í)~¶aí·ðÛj}#\®}Vˆ²-OÝtÔŒù-„Ä9^È.}0ÞoÌ—­U¿‹–d0��ZCˇ°©˜_ØÇ÷„öbŠŸG(ën !qh­Í±5 ‡ ‚¹íKÒK¬ºM0W"D=JYóð¿Î9¬ù·Š²ºŽ³7vÅ ¿ t@{V˜é;ˆšû…„rϨ—…áucÊ>ëx¥,”@´Ï+ óƒT[¦,”@´æ¦Ø…ÞXÙ‡ÁžpmHùC¼ú°x­ Zó²ìÌÝÇ©íJµ‚…Z­æÍW£ç89eéSx˜ò�&± # d9÷T*·Š3[� �#E”â}m’Goî+û—.Þ Ò×í•]ØØÀfú2ÖÜ/Ø©º¿ ¨#[k�XÑZå±5Ë‹\Ì©J¥w¶ÎÅ9lܤfï¸�ãbA£‚.™_Ù"Ô8êù0`téžÐaIIÙ¼ GÌ rd‡€Fñ\qe·ä8ñ b×x^HÊÓt¥&—@4½&«ÊðÅä:Óå¨: Ý)HËä ^7.BEœ· œ“¤–·šƒPû)v3Ì™•kd*|2+ÄT>åßæ–!|?œ…S{™Ç`\ÖoEà °0ÒlGŽr½Î®™_ØCH #%…\$ëšðùª9Å…a»P·IœZ«nÃ*;|vtJ.Ø�Õ+³“�@´V™m�‚l›d ¸™»2¶æpÇ’uB¨œÙþ˜å¬á£xe‹+i%ЭUÚÚ£Ð3r #Ø3n±wŒ_b �·�‚7|‰|?Çd‘L ^ðJfj=W3çë9‰sAAé¤>aEkç Â…–x sé™r;(cVÖÉ}œºÔ–§5o¾¬•8ÇÉ ¶º¤[†‹>ì ¥sf�@}wˆž.“2ÔªõTŠ\ t¤Ü $ÓÒbÔïãÆw<¿BHY¨V• ^J)µÄ€ËM7ì`¥�äU3€œ•j¥Ôý‡ KrxxAjä÷‹ÍúÑ/›èH=‚YO�›ë ëéi㟶`ê>~CÀÞ-?ÙX•UNÝ»IVDý]OÄ×ßG=¬ºD¢t‡‡a©¬˜ªøÌISïã13'YÌiØ?ÅëÙ�ði!×ÙX WâëÛ…šû…¢W¹gD›…²q<úÓYƒ3Åf…r5�,3ïÐ)ŽÕ1¦¡Ý jÀaO÷¼Ýª²Ê•@4½´ª»ñøéÊí8Ž,ï$Э¹¿5G¡%f­0ì ³¶K<#6a*\‰'�hÍÍœ9J¸Df o¹|ZìÓ�Ü€†òäø�ÂP¾§eâôòD°jìV*ÞjH�£ž�©!½¶cm˜æñJ )�hwjÈÂRmŸÇ§�"1Á‚S%hÉ| ŒÙtÍççBøse]úI:jÉê$Õë-›Gæ�bVóNP¬ïúxïêÂt©˜­qN’ÚÅì�r-hk«Ý›ª×$έY±õ‡ŽÆµÑ4ui6‹û0½ª•¸XN•¼¯TŒ5Žz:»BêÒ�¼c~É�*�j�“¤fyd ³Ë ‡àm[pmœ¶ý`–+gxTE§T8]üüFÕŸ%+U  Z³â7G�ñåua¸Û†¬ä¼x/°w§ã3_r?Q`Îw÷@ÚvB1c(®j¶lI&QŽs¶ÿ_ñî6ÿ—ãvc2ÙK Z;ÙNb"ü˜5ÝØèÿr»á—™J+Ñ$3%€™ºnÅÉ$MÏÆvAä»[‹ò€.ˆ$Эµ³GaŒÈ¶C°gŽ]•ù9â�½þ/ã™}™ªLÐZU™= Ý5Çy‚=ãû§Ž=ßãêw,‹‚AìàS&P¯‹$³ÃÌ÷>iøh5ÕÜß)Ü“&ÐýE¥S°úŒ­ÙT�‚þ&©¦Á©©ª¸š5]£JõtJö5# ºcÖˆ:iß^ÓU·ãnxR72f›úpAûM„û0u#8©¥jÍ™.U%Œz6ˆ¦!c¾Oêà<€*°Úóÿk�Ó¨ã6l®J”8´f•Xf]‚‘Kk*ʹìª5ÊU|v-ç1±Gu+v¹RNàœ$é…\m ý–îĺijÝZóQÅ,½¾>ë Ë#pŽ“ÇÒF®,�¥w. ÷í¶èb{0m}o&ÂDÇÄéÛ.9Ý l­fºPî œ#¥úé–5­ð~6ÔDý/&ÊÕË}œ^Úk2cZñ¾Pp œ£å„Ò°K—.Nk¾'ˆ,)Î�+*û5] YH å“p×UL2ô:¯f~¡®•@ÇKÚ¥»uÇówAJ³Z©YØhVk/U÷+…£rÏÇHÛè É8˜lÏ9•,n<ëx½_¸}iäk" s@kÔDæ tŬ›9åÕ�û9]¹x+R™¬/QhZÖ7s®Ÿgb½�rÌIRkÛaBËÏê°™3^Y¼±ï¶€rÿ /KsFY¾ž…+Ö|É!`Žrž�¶ñv¸¢EÂ%u t@k¥u{<_NawBWvNí�W ýTÇ,\N•8´V9½¤«‹ò Z32Y&L —²õ|Ss¿�S%�{Fp×%ÝçUׯ�PÚaÖŠä¼AÛ ×¼éœ*aŽS“ÇÅ{ɦ=¿+Oæ4 t@kf5sTÔ^Ì`î‹_®qì±–Ì·5²!ê< d&QrñdŠòŒã=h•a©MâÐZ¢Z°ŒH"P!É®H⊬å‚Bc`ÈKB<-eDü˜Ó]lÞªŽë7°•.‘2€œcªy¹fÎçxA!sÆR>ÜÄx!Û–Wýw«"¹7Ÿç0M‹©­hî}º—ešÂkWüDКµ;d¿~L›¹pÕÈp%ÃK ZsomŽÂ& Á±' "+Ãû™’ Ü–†Ëð耦gx°S»BÖ�9‘íS ‘9û!}Ûnóo³É”+�hdÊ5M=މ�`?æÖú!}S³`Æ�â3¿Æ¾¢éÙßL|áÆÇ51/%> t@k–׿(ŒIŽ=†s1T‰n›ÍÅ\:ôé&'oÕçÓ‰êYºG–á>N/‹ÑÕÌš¤œèJIRã¨gUÖ¨ ï™ÇÛÒªOê™’<&®QŸH©…zêü_M äHi…Sw{ºŒ1õâ]QDil`£v‡ÚBIM" ×s]HßèhÁý¨xÌ´åïwŠbR¨?ëäH)µ5„[s%³ÙÏD˜F·Šq¶¯(Þ˜’+´’-Ý5Sô4 â—n˜ä1�z-¯ù4&÷šû…ª@)ª´“JozÉ/}4«å>Ž ÔbÒu )§ïOšç°fzq.ÔK0oáç7-@½¸—ÌÔr¡fΗFÇ=áá²ñ'�á»Ù½^IæÙgïã¨çÓKƒš7_Iõ|G(�7sxÅÄÂG2ϱÜrO¨çÀšû…Ü.�Ü3b…L>ê¾WqNâÐZiÇä S*$ç!ÌšE ˜Ë¼#Y)±Ó‚�g’´ÏËpÝ¯Ì _>¾”àÎIR³dµa…•$ ˜Õš™ÜüLñJŽb�¨ä&qhÍbÖ…š•°çÜ¢¿çoYºü¶™ß$ÐMÏoÒX-óF�'�l· –Oqe‘ºãõ’ütê“@´f’6G¡þs€cØs‹ ©!ö,æ5ÿüŠÌ}ÊÕ„fÖ»?u{<½Í˜X%i¡2iôûžî'˜—ð/Ÿmè€ÖÌ�·ïüƒÌWj s’ÔÜüZƒ0›'(æDe~ŠQ±O¿ï÷Š<Ùp*€hz8•vbB„/$qˆ‰8¯Â€Ø=ìk­2’  Z3š£PÝIŽ=±v`(»ôîeÈ¿ádc©: é±´6Âãq ‚Dl¨ Ö•TFÎ0QüñÒçŸñPhL¼% ¸Y=æ\ä²¢ªû}I¿ýñË:oÖ€hMŸÁ³ß·ôû¯óýBМZ;èNåÒ˜ÌqI+Äd\´‚n˜j\^W­t倦]kúDÖ†Á˜p- ™ý¾¦/Ý…@[£\Mh¤Gkê3=·É˜]Ó}Äc¥é9§#$M`ݱ—ù,P©@´f„2GEÉãtËmŸÂqÇ´&y)ÁaN¿ ô75êdˆ…I"ÈEd5ª î|„ #E•éL:{`âµLá�)>JЭ™†ÍQhŠymöœ]WîßïÓQ'MÇ•’LДZ3h˜£PÃIŽ=·\2õûq QXƒ¹å€¦D.ðØûTvÆš†X3é#2&õû�ª´Å[ÖÂÇ2À9 }n,ëC_­ˆðt,@´f,3G¡$!8ö„QÉuÂhÐÇ_³,[z±™"Ì J3€cpù³:lÖœ%a$èÒïZ–õøq2BÐM!`©&Fj; DLE.„ƒmO¿–ðƒrÌÅ t@ke{j< Á±'—ÜnÛâ<óe¿â®ç$©•ÌA¨ã¤†9³^2^ÏóóÄ·à×áxe—sX s@ÓVúŠ�‰Ïò²Ž·O'S“iyF2Ó�|[Ó»ók¼¬Ë9¬„9 ék�A}'¬©…�Û–ôþuñüœ«J ZËUíQ¨ß$Åž\,éuۜޜõêš– Þ*qhmo½9‡ @…'qˆ™¸Õ³ýÕÏÓôºçȬ¿J ZË_Ñî·1]K³.ÇÏ÷Y‡‘@´¦Ó˜£ð“{N_`ûž{qsøñܧ‘@´¦Ó˜£PÏY {bÑ,·éÓûT0—ÜFКAÏ…*OBpì‰õßEÃëÒVþßa»d±è€Ö´XXóuOo7ù÷ýбH a,6Ÿ6ÊÃÌĪnÝÒ›"…êÀ�åÓ&!L §sÝbkî,V¹gÔ×Ïs�¯lS>Î —CÐøåð"ÆÃ^�§+Ë!�hMK6Gá#&!8öœ¾�W®Ïõ”í¸<›BÐt!þñÕÿzÕ{—õÿwüóíóë_~õêç¿í½õ„O)¾þêûW}üË›þõ~ùÜ ¡UþÕó«/þËÓ?}|üÙWÿôj ‡ûæG}õÝ«/æ¿ ´ÞÏr£ýæÝ‡—@&_*žÔßÇ‘žãAxù1ò ?^ü4ÿë‡çÇ?ÇiB¡�hÿ)ü÷›~šƒ0~ª)RÇ@Ýã yà÷?½ÿöåéÃû‡ð'ÿ\}w>×›ðz̾¼¿÷~¡ÂðéaxèÃЩ/Å?Eðöaì!Eœ0ÜSsúußÿ>Í5xÑιf¿�œý ð‘çÍ+7ÊvÈTèÚGó­ë2¯o¾@NSPMŸöÏÈb9µùÍÏŽ…˜o"ÿ"–q¹­ï&íý /7Eü;d¼ùji_××å°é°Ÿ‹aaº¼x…|ú�WÃÇ>b¸ñ¦„¿Ec4·¼Ä½ÅáPÒ¸×Jz3Åçnbt¯ý¦äY/Í4uÃøúÍp0ãþ3ÎíÍy+ýf +îõu_„pøÙßtD¸‘¢¿þ*8ê뾟’#†ë�†m÷>˜ÓÿýöùÕ/¿|õó/ÿûë—�?=¾úùï^÷¯~þßÂÿûåoþÞÿóå¯^ÿÕ«_ùú¢Ç~“fé–ð±¨àô#ÚOv¸7Ü )HþïÅømbe<ÿÊëââ-¨¨sÏû¾ô¯ûz®Úùüºæ¿7ÄÏÇD1kÁ&Íéû® 1Ÿ¡·ýÔÛY]éMs×,YŸâÉÿ'ɤ–K©þ¥òÆ6†E¸.1ÛÓ7ï£:}–¸…—_ù¤»‘¾F]ÔEQÂ~-â(Ï!îŸrŽ(5µÇÔ2(Ú’êY"§rXœð�Ïðñ9ûÕW‹ÝÿòKeE«ôªh()²VQ_%Äo¾‰¨pl~¢¾GQEš*ùùÚ¨Ècù1סœp¸1ÿ-ê+|�>Æ�ð#ÚÀªaè^_ë ÑbØ?…aË�•µóééý‘D a¾9ó^˾þâ?þìÍÔ…÷ fÿô¿ÿê„ðý˜T×·[l’ï…ƒ¼®9†4b/²oCzŨþߤWb]¶Rñ2•ÒþmÎj¦Cxít?(Qb ?xnqŽC~wh­°äÇÃ� óÿéÓãw±°[} }VN/?>}ŠÔ±Tú?~øÃ»ÇçX.e(|÷><Ý?}Ì¿ÜÆý)�¶(ÑÔé»§$Q_–Ÿï�šº/kêÿùþË‘q¿hcù8�Ç÷ïžÞ?¾ýþ4åøo?¼ÿôòñm2(ÿ¨Eyù«ë7cˆ?ë~«Ç÷ããûÇÿ�åôãÇÃ*'!LWj¦¦zÈ{ÂÄ=@[¹ÇºLe zSd±XŸÞ¾<}úëÇïþ&α•Ó·Öl?�õããËOß'3 Ž6Ýüâ ¡ß*;Œ¥ ~q¬[ñ|}Öõ¬íu®îß¾:´8–Ï–7@Çî% øcÒƒ×xaÌoÓCL…S=?½ŠÖ> x³†Ÿž�¬QÄÿ·/JX oçÊ¢kX°èòI/ÕFaÜ¿Ñ6IÛå°_»Ç©Œm�"DU£Øû‰nWx¬åºü�‹Êün–Š˜·=Ë0ž!u½Ù—ß�]7Õ ýJ‰¬G|)‡ýééåÇhK¹ÖokÓnTtó¹Úû½}÷Óc2Öe­öé”RÁ[y~ôïÑLò¾8l˜Î¢G5“-æúrØ/”b¦ …ÿ ‹µ¯}rÜq,cÌ—ï�$QÄà¿>»*cÞù`]�@k™þL¹  �:¼f~ï'ÈÿýmZÝpSX?ü#±¯¸÷› ¼5v²%]�Ûz™SmËÔ±ýË—~fÍOɈ¶˜nVôí»#7xs-ÞË�o³D…¦o�¥2«~xÎ9¤+Utö¥Š®Öù•°•3Le, )êéÓKÄLC¹À÷O)M†Ë¡nâ=~|ûX¬ïž>yÞï¿}IéeYËõøøøƒ''äiŸÝ.sD«Ê›ÂpFHeÃífÒ”â£+ L–BËG;–Ùææ&Ubš�Fß0ÝBâ›ð@ÿßã”DŸzˆ�Œq)K¼¯Ò㔓ÇO/‡ÑâgIãâ.ghüú‹ï?}ûñéGñÜM_ø% Õó:ÔORUÿðáýã§Ã€Š'y|yxûîá0ÎÛä_ñu?ÿì;oó8ñû£:¯«^ï¹Ãözný˜s¯®rí³³ë|Ìê?SÂŒP4ý>m7Š~eñüþ{Ó[½mñâ5�çœ?ýô.9Ƹ–îøý‡�GØ©ÜùñéãQ�—­ã�O?<½Oþ1U®ôôüG_�?&3Ú+«{›Í+Ü_™çÏ»-eÑR¨èW_þöׯ$Ð7c¼<¡t®3lqà½/a“ø§ÿþÛÇ�I¼q--úËþ—l~U,;öÉÉçý ª¹þ›+?ùxZpAÕãM¿Ø,湎8½ÞOA³[vœWêÝ¿1©«j�žIj!–3{ü!:YžþåbÅ,¿zúçci³ç¾}ÿ]‡ÜŸø?‘2”šøpð*Ñ×ëï­çµû)œ¹,T¨óÇ”VóÀ£@ZËàr¬øÍù¾þ"9O8ìúâÑë"¸Ï°•þOOß=&]Ž[i§ç®u«,èñ]Ø‚ÙÞrç‡ç?¾M«UoŸ~x÷áÉ«JùãËÓóÓŸO÷Yª‰ß¾ûÁ¯ñË�‡ªMó×ëßvVd°~ø›# #ûñXˆ¢ÌNËPÓ~Së»p‹Ç§~Dó{IfÚjÏ–1”žý4«ÝVùµ×V2ì½ÚY}üð|¦Ìù¤˜xjæÃñðùï_÷ËaZK#¸¤|lìÛ阌¿/§!w2Ì §è•YWiZKÆÏ>f±ã»Ç—·O)™Ä3Œ|õD–~¦endstream endobj 643 0 obj 265385 endobj 662 0 obj <> stream xœí[[o7öQÿ o³Oë šwtܵ 4h] Ƀ֑¥–äHv›þûò:<ÔP£©W³èC$‚(yÎw.üÎáäs…©°ý>¯–“ÓKU}ØNpõ�ùûaòyBÜ„*|\-«³©™ÔHû­¦×ÿhM*B0jšJj‚pSM—““o/._|3}<ýdžÐ¤}‚33Ûç¦ï''¿R„íÊ‘–˜†ÑŸ¶ó�Uˆ­Ãèw÷‹÷s¿ÁiAÚ$y˜C©�P3*�l*³uÃN …8ÓMœ9ûïÍ<ìܘá0JžÙ1ÂM2þèÞÌ–ó»ùfkJy½v¢eàh—¸ûè÷22'-_œÿâFœ:¿ù×6Ì�¢^Ï–‹›ßí H¥Ö×n'†Øþ~uu·X¯¶(jPˆ@ÕDRdô�Øé ;íÅtòjò¹2@krap£ÂÆ�I9—ëg“Ó‹ª»Íý|rúsE&§çöŸ³¿1ßV�&/.ªW{ý Ó:ø’Œx�×̂܊·S¥ƒ—V5wr‹âJ�¡]˜ÐÚ¹çȺH‰$Ôæª«�@Øy!1îJMå~-+?¥�v`˜Gh6­Ð”)ë’h2Vj2À)¨nìô±d�2‰ÄCš�0TzUþý€_Œ«Žõ šAŒÆ5¡�‰r“nD H:{"Üç¸Øcar•w‡̽ƒ*ÿ~ûqÕ‰Ø'}ͱçNV6xŒõèÀ �MŽw‚6%Œ{Uþýð㪀ú”�ç‡��ã¯$b^PY¸wPåßû�Y�|Òñ�lC1sâŠØ+ÃDF<}<ö’Ø3ÈÊÊJ0«Ò ÛÁ^ Â~\u"öIÄðšjô^p©¹`v¡Èø!—D¢% ëÒ Ý1»döqÕ‰fOú ¹ç€W°ç¦ð{F#K%˜‹ƒ»!Ça?®:û¤b‡CŽ6£r¨r¶ ôGù«S5>¥ fu»äb«Y›hôV¤öÄ›€<1ÛèÈcfsü^zQL€»ô‚‚~\u"ôI$<öŒØ‘–Ø‘Y#ô\z86ô¼i,.VÔ=DBî§*ŸÔýÈêè�>HLu¼áÇb›öûžÆç8ºGÌ—·œ¸^GµÓîRH¥~UÛîbž•îv¼Ì²:Í~{òZ<}­ž¾&øíc×–#°!öF½+µ½‡šñζíuÝm#Ú“ã¦Ý¨»ÏZ€_ºKØæOxÜ ‡âr_‡ÕˆHRc”ÖÛuED"#®4 7eé§H–º¯ÆÎÚµ¿Œsº9ÿ),c]A Ð";½d K­Ó·zM jùÆiUS‚´Ð¾m{DkÛhm=ψ¤œOóD3Z4sÇ8ƒmÍ M�”&<ê®@¢síëL –÷òriYX¿Žs¼käëD)k›­1Úg×Áà”jLAü!‡ë×Xh¥v5V(.û¤°eÆC»¦»ŠKL­íUññÜ5èm7¿uñ/nŒ˜ì‡k ‘´æhµ¤q µŠ0_v70'“S©ŽºÙy/»zúÅ1eœVPëa e*ü»kÌgŠý}�F�H,ù $R.ij!CoÌXM$ÆÆˆf‘wÓïMnB昋;/ŸwÅ­‰¶ÝsRSÓãü¸xA“7tup ]¸a®Áïº^`lÑžû]Ì9 œö¬ Å™Ÿã5–ËR7sw·Åô”Åj{7[]ÍÝÙÎu{¶WV¸s9FÒ¬}7c4Ò½îrÛ”îçâ’`Ÿûíü}ày¼3ˆnкâ\­—·³Íb»^m‘Ke'9ŸoæÖÁ¤; A%ò²^ ®�àÈàÞËâ><1±Â>b`dï÷=Wéd�•Çš¢äœ¼ütú1^£þêuÀõg7÷Þ—¨†W³ëëÂY’Yóa§¶I;†Œ’”ƒ:ùN@¹áÙ7߆‚-ZŸ Ÿ †Í§>¼Ã&Oo=<4ü¶™±¯g6Èö3�FO»Œþ|¶¹[ÎVžÀË”Ç3öžõ9{ê†üÿ\zzÐÖYeO±´×7ŒùŒù7‡Àá³ àŽmAXp·‡ylŒùÖkç_n»:vi͘-¥¿ªDE=—…ÓÊ(º4Q|YD±éGÐóˆÅO]Yà�½(âÅ!ÄñÓ�ÀÎâ³]d»Ã§.²1ÚMúxþmɼG WâqP£„¯ ¯ ]ãYÛÕ.§Ù ÿ,–> stream xœ½YKs7 îyÅÞ’L|3�^œ¸‰ÍÄ©:9«²œºÙµ,w¦ÿ¾às)/µZOÍL&ñ„ ’€ ß÷”@OÝŸøsµéN?ëþëCGû÷ø÷kwß�èã�Õ¦?[ �Qnë×]Øz=%ÆôÊ¡¦_lº×ï.>Ÿ¿]ü¸ø wXÈ;Gêö-®º×ÿ0B�Ä*Êâêïë­_ÕÀÚ¸úþñæjÎ:È %¢ ãNà„sF˜éA"Œÿà�h"¸5IvùÇ·u¼[·°7n îÏ(?…ÍRQPióv¹YïÖÛ÷IŠçõ� ’�ØýîBÔƒž–ÛÝfyû*¢I:üz¹¹ùö¯[ä²<äîÚÌ /n{¼]ínîný' )=¢þã/7Û‡�¿×8ôéÞÕò¡¢ù›`[¦L¶-îÂïiÛDZñ‹NøÙÃc„Wññ¡^%$IøÉëî¬�—6Õ{ ü•{_t­a�œÜ;Þ Þ8¹óEwÙÝ÷‚˜È_�z°Ü‘³—TXÇŒˆ³‹îôâ×~·}\w§_zèN?¸Î>½Åïúºó‹þò`¤”hr¨0¦ð2aÑøÊGÊ2B×" +O(„DŽ¢Æ;À…^kÔùiJØ«1lI¨°9°­¤îÀư‘"H“öß5ØF[e«°™4Ö&çT-U0•/ƒ{�ç9Ÿº¬†·hë|ëpÃqâ"&oÓV˜,zJ”˜¸�:eúÇÀ/ª2sñ°8ÍàÆðƒ9Û3é¨ÈÏÆ 8d“£«±—Àç*š·af÷‹Â§ä¼Î”OsI¿Hýl]"•ÓEù8qº˜K9‡.mác‚ðtà™0jæK[T‘/(|á”óEp£k|Ñ"ðhÄ>ƒ/  eÊ‹|‘¹„|áôÒ~J/üYé¥-¨H—JP #ºÍY�.R ý„.þ»/¹f0F(ýÃV‡-2L[ø)à ðù¬ Ó§ðŪ΀ô…:-û"䇼Æc˜™SDqÆ[Û@Çj\ èTùm½º»½ò�•ÍíVÑ×&L´C)bf·Bb°–z±VH (+÷Ô[!‰†ð��À¦éXqVú !s´ê)Ü-=ÇÚ[�ÿß !I=ÚÆ¨¹Å0,Q?³bT±ÜiÀ(óq�çê—�]<Ý"n쉩8ÖQ$ &?Ii…‰IÇÊSLÖÛµaˆÖRð�ÿ×ù³'x :T,š‰¤ŸØÓXeÇ&`Ogf7& ­fTðÙ=Zšïà¬6U€JhÍÔµ69iÏþñyVcŸàMªØ> stream xœ¬½Ë®,Mo%6?O±‡’må-ò2•-4œüú/_çì Ã÷<ÔÖÿ³.ÒüÕ×–ºVþ£í3f ¸G–_ã8÷ßu«Mó:ê¿û¯º.‹®‰Ò¯Ë÷:Ú,»¶ç¯æªÌw±_�ë¸~OÛ×´öUûÖ×R×W7~•±Ÿ¿ë¦l}¹¶ç¯æ©_¾‡¡ý ×,Ž @ÛŒ|´F£•Ìì’ÚWºïjI¦¥ÎPizmÕ K›nû.‡^®íù«y¨Fo8ôê«>Uëiݪ!œõWEg¡>ϰÔq>fȵ=5�˪$ží߯ßí+ÕG_CØÓnîF5Ç—¾Ž¶g_¥ÛÖïeºö5.£>÷K_ˬ.éÒ•5½ô4”Yíð¥§Rmq_{Úê,Óµ«£í¥¯©¯zº‘ŸëÞØ.cÚ-ÕÂ_Ÿðl{é«,Ý·ëj�ªo+¯] cÝ¦óµ«£í¥«¥z¿rø¹ë†ïq{ík¬ÙÆk_GÛK_ºiºáÚ×a8âeãÛâ ô_“ötSÜöüs=ìkت“®Ûr*cý·ýè]43Oå«.ú2ÏÛ3¢é¿†m¬^ à´Ö¡[ZHóWå] ­Ç­*Rj˼~�6@Êëuul§ºÜ׺Tf÷ &y\—:c5`ÛòÝ•ßYGté¦ÚÅXGqh"ŸOÙÑ©ùˆiæï¡ÿ‘ÓX—Ô<Ô瘫­1‘ýó1ƒ ]«½ÝtBëVZkd‡µûÇ¾Íæ:lndÑ Ó:µ@oQã0ý–Èé.Õ:L³þqq#‹þbèë–«ÿ5­U×í÷ž²›êcÔÉYuYl~d£ UF]8¥S�ö[�ÙÏË÷TŸc«Ìù÷å½È¢wQã9Œ¿%²ÙmÐ.æª|q“‰^ê!R�ìa\~ã)—yÔN뤎6™�̇7{ÈÔ 6ÿæÈÖ¢“3ÖÞ–c6¡Ç÷ªV»Ûþ§„Ö…Ñoå˜Ï@èÃC>„.Õßw¿µnBgu\¶n‡èI¾ô!t­¦²ü–z­;}ÍØÁ“>�î)tîj ±ý–¹=…ÖN«wé›Ð1xÒ§w~íë~Ù†ÿ)¡º!›ÓñåI[®| ¾:üòœ-Í2¯yϳÅreãæ*ëßÿå×4¨‰¨Žq+5\¾ÆËÆMC «]ž6µ»[”ý2Ý´íA×õ5ÔM¤öxÓP³Ü©ÄÚb%l�Êc”rÌ4LƒZÚÉ6wÓ‡‘äÛvß“ø«ÔZ'z'MâvxîŸà¹›:9�}ž¾ê:ê#¨ñaº¢þ¤tõßéP'ɵaÇ^ÂÉtÝ’(aÌ&¦¯ñg·h„Vô_~b(ÐÆMLŽÁGo“ÃãÆñ:H}�ЇgˆºÃÓÿOß4Ê�B¥¤²|kÈ»Õ_.C´Ð¦¾9¿Ú ™×xj”âÄ7íAWáJs}Ó[pBê‰ÞWײèäVø8|°R(Ðv·ãò_á6%¸î™áÊ–k?6>®®°ÕRmv¹P ínçç¿ÂAoJpÝ33x ˺ã2L6põßcÀ¯üÊ œVéê¿KyŒ Õýµm:‹·Qo9ô¶ôç¢%·‘ ´ÝY�üW8ÎM ®{jÒºšùöº´KM.ç«æQ• €Ü@ƒA�-éDñ{€Ü{¹ÓêƒÆ€ãA]±{€mïöò9HŸ¾M#‹Jg]º�%cúñ{ÝÂ�W{)Z8(ÝTWàC£'жc_¡mq�ó¶€Bjj£r,œnYl±×ù_m ^ÄO° Ú˜¤8!—Ÿ¤¥í¸þ²»qðè¦Q ä& 4|®wÞðPXU»yøÖ0xž�õ„:o‘â¸' MѵsÞôzõ|`SJ;ðÚ-^/¨©“㨇 -¡ëœ7kRÓÔ¬©ÁÚ¦ïÏC™5À ´Åf-ÿQ}²úJ)bÓ€êûÒ´cOà »©S²]}Cì aäM™÷(nò3óú*…¶­W�0º¦VµçV)ïºñÈÊH« @�¶;ï”ÿ —`S‚ëžYÏ×Ù¶¶¿‡ÁJŒnäüÈ7]2Œèg§¦HýkŒÞFÝtÉp¡³ gÐãkß´¯ñ0á´tv¾Ÿ¾Mòçš l¡Ûñrš2)ŒyÐØ _»æýŒÇ §¦_ h(û^kÕ¥+Ýéu8ëqm¡‰%~TGrøÖRäú¡p}_švì M¼.Ý6ÒzÜñÆ û±oúä@nVøÚ5ëg`™­¾eŠÃcX�MŸ†ÇÑÚÆðéÚ9vyœpz&A׺´7Üëäúâ tP í&„&~+Ðf…é�YÍi�µÎ«ò£uôg;(ÂYh» ã‰_Áh£BõÎ,'·wêF½�¤"ŽlËǵ�ÚkmX–Ç!>'жc_aàå:ç£( ©éÕÈÏ�­DµÖSœ À¾°AI�a‚n2l\ï|(@!Uu#�UÏœ7þxý.D,'¾é]¼rj“p›6mAÜ–Ïb•µLßݤësü?‰U(Ðv“Ä¿ÂMb£ÂtOí¸ë,Õ¦]´0ë›âaô˳é“â¸="Aìuí›Ù^?’ Xÿ¦O† sŒ`/%ÑãU~5Ú0d8jC¼^dûŒK¯}óñ¬ÇQÏ»fÙVsÝyë,fc~ªB9.Ì´¢õ Ѩ뛎b'œž—­»l¥¹}“Ò΢cþã  H†£öU;ItX 8á´vÃ3hb[úšØDÐ5Ò«�4êÉ¡2Œããª&®e:"Z'‡�h&œÊËÖ.šŸt°Ï¸÷²Q‚�jã‘9k�º&l¥�ËYOÊ’TØ(M¥ÈíVï !Zv’ø0€B«íÑemwÖí1Ÿµ*Ìœ@[fÃ4¥ܰ6M„0n÷_7¶^ôºê¦XÕo†Ù*lS(†éj°çÒTÀÉâS ©xx/u–voÓöPˆ ¼(Ðvx¿Â�Ò&ŠêžÚuiè½,£Ñ©ûf´·–ÉØpmq¦™ÿ·® Ñ9cÒ�{©[Qï|ï§ó8 rP -¹¯û;Gà.±"Dq[Î�Ñ¢_zЫ·õîí›öIS)†Id´é0fv½óI…T5�É—yÐúR+¿ Ÿåh» ˉ_ánµÉaº§¶~˜/EïO×ó€ÃÉr‘9ÚÞÅæÏ‰Ê1¸{›JŒ0Î$ѹ^Ø\ª¤aX¾·Âs�ßô.@  R—ˬQZæñ™¼0¢|Ûô…&âî¥LÍ»émÞó';ÚÞìócˆR#Bg¥Òb©ŽohÕ õH9É€mw‰{þ+´n6.T÷œ©„`{™ój×MDéh»ËÑó_¡EkJpÝ3æ1I–©}?¢Ú�õ{ø Sð8ñMïò„çzM!`ÎlxrI”etZ ”¥î¯n9Š.Îvü¶ÃôI�!å"ùù¸Q"£]€»5&2a @Û]šžÿ �ES‚ëž±<Dz9‡eœõûEïŸ:,#p°iM£È™\È�Œ8Y|@¡¯îtÔÓ€µÏ»¬Ûï[–&Ýh’¼Å âórO‹ADݽ¾QÑ�o}! ;¥©”Ã?Üv�X¸Þùä €Bªê—/DþËPš'é¦ã‹lÊ@�¶w)Ãs¦Rî›)B·íü éW�Ô¹ê%USL ÀB5•R`H „«ò×;Ÿ¸PhU}�¿è§Ò4 /›~ʼnN'Ðö.9x,–R³Ó¤½ 5XÖ—‘åÛö ³<7Xú¥}Žl-Ûñ&™P íŽÁÈ…Ć…êž1G~õ“–3‹ÞëÒÍ1AÄTJ�!õš#Ì3®½� x Ðªbˆ_¯Ÿ#ëë(ÚbÙÜÀÚÞåÏ]”BÐfØÜ²8”æ5ÂÞôl*ªçóh{“<(E Akê’(ÛØ]ßr\º¹ký弯”XS(†”H`ŠÒ ê*êƒ Ê…ÔûƒVK4/–]ôó !â÷° Q ä,IœA]{ÿ ƒò@!UM3(ý’\û:ñh‚¥3(h»ãPò_¡i³¹¡º§ì䬟o ÷Äy¾4¯íkÜ5¡ÎŽË—(Ðö._ÚÆÇ N1u¨Gýzt‡Ç×8Y¾mǾ ’�h^õ«ÚZ�)ßã©“ljoºáqò�í°!úfÌ�³0u�-J˜ŒÓqk2D°k›>9�³D.édñ¹$…T<Ë æeÒ"yÝÂë#á¦2( ´½Ë žû*Ç U±y#„±&jé‡4Ô<øH€€0CbJ¤À�1 ¬R–Ê9Q|.@î�1ÐZºoeSªñ^‡˜1ò¦Ä†(ƒ…LP`•0»ºöÍg“'œšnÏsíW“˜M¿ú²4°oÛˆ¤¸�¤ l@’J^ñ™¤Ç §³ßÙsí·î³q°¯Iüž ÒG�Aò[ÊgeWI|6çqB*�ÙÍ<×¾õœÉ¬_Sås9�ßô.—{™¡ ‚ÆÃf(Å¢4—›K;LQÓ¯þx�žÌå(ÐvCâ¿Òt zgŒ‘O'K;F1éEcà =ã·¬)”âBv&Úþ>ãs}Ó-à„ÔÓ/Ýb‡'ô³lÓ‘ߦ6&).d~pËg ®“Ä'¸VmÌ´æiÕ¢Xúáð�dn @�¶w¹åsžr ³¦#‹2Œ×´IûíŠŠî¸‡Î™ŽŸÀtœ %@!í�jÔÚýºBMòÝ&AÚWñúÿÕÕ×?5É@â›vß‘Þ:1tz 8áTöó4i\3­õwCÌ_�)±ÁÉp”5‹Ò[×5›ÞL8-�}©šMí=�íÈv�»Ãa’Cî*´B�qºÞù€Bªú²yÆê4à«?²ª7ÒV`Æš69�3¦D2ëdñÉ,…Tüu€&uàuoÎÇ—~�EƒÝj”C-Øú0@>ït²øD€B*ž¥µsý¯iÔ’Ýj5S*«õ(ñM7L[ö´6CDׄ%òíØµsïúéÎiˆ+ع¦O äìG”jºÎé´pB*ú²…†Y™´ÒÏýQ?E vjS&†„Y°í³´Ú‰¢ÓjÀ ­¶ÏÿæaTv­ uWŒŸ7N í>o�*t¬ãnÓák¯� »&Àõ¡ºVïëæÙ�o‚’kÃt“¤÷Wl~ïQ¨š&Ô];ôòF4›Q{ @Û]N�ÿ �ªM Õ=c¡ýöîì|Q·ÎgĘUS)†Ä]`£ÓTÿ*êƒTß…Ôûm–]7ݸ*±ß+…óA–í�m·Yöuo§´µ6e„0Îpû˜¢ëZôbÈ®¦í'0m¦R ÒN¾Kü˶ê‡8ËX]ï¡ —øP í6ñ�3ƒfNU¢„q6ÓùѲ-ÚOz'âºÜ0|ÞÔ™J)0æø"»éy×9MNHE¯Æ§Ô?¬-^í+yÃç�Š�I†‹ >4P)%qÅ3'œÖ°�»0öÛùbV@ñyCg#”cŠ­æ;~‰áù ©³ u±ˆ¨+§ÇЬJ R|�‰zG81<=@!uöñ;$Ùemç¶&½$ê(çRÉ9àÚbf2ÿÚ›"¢sÆ4%AYÛ©­©}Ýuý€! @Û 1Hü ,ˆ Ó;c�Þ%áeÙô¤léËræ \@�¶›<œøÚŒ6"T÷œÂô¸,õõ5¤µÿî—Ø ´ÝòßýÓ¼å´6,„,Î줄@Y¦iè-G!Œ#(ÐvCK¿B{eãÂtO¿”(K]u¦î¼¯’¤(ÐvK|÷\�«'ÅÔ¿·º¦qÑC0ç(Â|Ût©KYz]W“~oXc:̪©”C>4°ÑŽª€d߉âY ©÷Ó—ymñW_WÞ‘4; V¶�O éÙÀd§œ…“ÅsRñ4'/ÕÛkX6”ò=Lääh»ÍÉ_ uAŸ`óFÈâÌu]—ÙNµéá »ÇiR0À¦Q iÒÀš§¼…“ÅóRq?m½¾}]F­2Ýp¦`�m�R`H›¦=å.œ,ž» �ЧÜE™ÛyÀi]ÏO²‘ÜÚn¸ âWh€mª˜î)kîØ‹bç»ù¸è™S0xM¡§¡ñô”µoš?ñ0á´t›©Ø)»a(çÛ/@Þ‚¹µI�!yØî”?q²xþ€B*~É>Ki4o³QÝ�¸Ø¶ŸÀ¶Ù¥@! eJ¡”R{ÑòÎ4¨�á) ´ÝR(—À5Ç q³Q"„q–ÒÛÀikq¤^­Ðßp§`ÜšJ90$OCK Œˆë�§R(¤ªŽ1-‘4®¡Ó”)bL½q±QÉ`Œuó› Ø'†fU'œÊ/�<ðE×äøÊÜ’„ÚbBÃoôƒVÎ&‹ƙ̌ިÉd‹�Æþü’IoP í–Þ¸˜žƒf®©Äãl¦7=ÀY”ºà}[°fJÓøÙ@�¶;¦7ÿÚª{Æ@¥ôFÑc,Ú2uúÚOoP í–Þø~.çQkÑ[ÿYžïŒR¢|Ût†|Ë8)á9m5Dš¦˜ícg*¥À�Ç-'p ®wžô �ª¾£XêžÕú[éëR›>¡X(ÐvÇŠç¿B»oóBuÏ8¿�ôå}…r{ø7`¿ÁÊ6•r`È~&;#Uœ(žT �zg¤JÑ3Ú²mú�hžT @ÛEžÿ ½MÕ=ã52¥½~l¾šØí8FIÒ(h»§Qž å´ù6D„(Î�¸•3LºNúz»4if0n¦Q äL,Æ@Œ8Y<£@!O•2t-‚ì4¦ü€Qœ@[̨8î›À °Y#„qÅ›iµ–T—í{+1÷ Ö®©”Cî;0�ïãDñ¼…Ô;!YJ?Û‘¶í¼�$Y(ÐvK²\â°ƒÁf�ƹ—œd©ËPÃɱº¿²|B²x @Û-Éòb´sº#Bçk¼‰ì}ãqZõÊÚ˜øÓge¸�ÑÍ(’2—Î?à�N8==áSKßqìªÇ+CÈ9ƒõmú¤¸ˆt 91×¾yÎÉã„ÓÓÙ¿nÖœõ•˜’ › I IæÀJæTÏUÖT� ©¸³€ÕÙRëÊqņÎuáëOúþɸ0&ö}…†ÛuÎa ©© xêO[d­W�Øp_]ÐOà‚lé¤@!ýYN€ÕD`­³]»;¾Æ`(ÐvK€½¸…�ÈÆˆÅy3ï�ÓêÚÁ²i»Ó‘d˜ ´Ý±õù¯ÀäÛ°P½îCÇd|,œ©.òR‡{Ò—àKHOÕ>tí•j_4X;vxhÛƒÎR:ÎIâé8 ©¶7‚[{¯yÚ–ón¾ Bá�’�Q ä¯ÕLj¶S-û6†¤Ú¹6>90,—F3!éœ$ž¤ �j_glZëÈëµHóñÖ)ÀâÙe8Î솬ٵsž&ô8áôüÏ¿þíW¯gT뾟õ6�ðN:Šu1ž-?�–IIÐv²âD=[þ믿ÿú“ö׆ùëøçö¯¿ùã×_ÿݬï>Õèuž·¯?þùWo¿ùªJU]¦ÚM}¢yýúcÿõÿß_þñ¯¢>ÞPí’"4¸­yé×_µÿ¨{ð�üõ½þôoÿ¨ÏÑžd©«`­O¢>¨]Ý9�}KQΖŸGËTÊd¼ä‰z¶Ø“<½Ö¤uÿç·[°‚¾¨NRSsœ¾þ£>ë¿æ}„e¢ÀÇ¥œå« ž°¼¢„Ñ7¥*k¾ò}\<~èÂ1•'¾éž§|:Ñ€žÈ6w.ˆôjHTi¨¨%Ýêøçƒº¥.�ßtKo½z„�†ÕRò\g¤½¯‹zR¯¦Ÿ.œãŠ„7k¦PŠ£LkĈ¹¾iÆpBê™òmÓ2¶hQù¨ñà ) €m1åv%-ˆ36G„  ]÷ô¼µ8u(óYç†Òƒ·M™VÐeT “ÄS�Rí”w›4ÿ8ÞnÚgÅðn€h cU· §yÕp°v¼ÙMqXœvÍæ,Ãq_ÎÁ]%ñœÇ §´3Ê5ÀÒ¨yÜ5A(ËxëoÓâ(”²oNϾPH­=ûÖ4;¦ZCºãt0E|N -$¾ˆ¡ý·I":g\IF½MúqÎÚ¢þeµH‹£Þ(ÐvO½M¯Ë8ÅÔçªS]æ—£;”,ß¶c_®$<Õv}Q¾«›v ‰1ôަN† KF�§M™À«(žô8á´N9¯©¬ºF«G~T"8Î €m÷œ×Ó—t’M#Fçq=�:»*{ÒˆrÕÕûЇð‘Èçøž^9ÓI�õ©%«aQw�QgôƒÎÈF&Å çØzrÒ“Eß)«–ë`µ)z€m÷ôä‹õÉ!èŽl„YœoËØI?Á$9‰ëÂ5ÅÔ$ñ#t‡6"Dç”kõ¢ô²]c CôF¦Q Ë3�kËR'ŠgH(¤Þ !YûÐ綃>áØÈ+H® 7áÛœ$šoœ�Z§|Û¤U6½œ¢t‹°(ºÍÃÄ7ÝÔ#²ß8ÓÕ„3ýf0#´&»·ÑPå`‘rB Pm1¡õJßg°g6(™”Ü*&ÄÚ¤[O¯ x|Í�#Ö'ÐvK¬�/Ù@ AÃa#“‹¢lÐ5�½˜®[·›“d@—™:)0Ò†ˆÅ9ÜÄw�š~¬–ãe_ÎwP -ö]̯Ʃ›¿õU„º“„5×{À¸¹¾jÏ!Xj¹¦[jï5:Mjê/ʹî}I ¼´-™ •¤‡ÿŽjtBhªpÂ)œ1{S¿ZÚÕ5GÍ3{h»eö..+Ç`ÌÐTb„qˆ�-ú¥�hZÇGåJdà±M¥ÈÅ ãè:§GÀ ©hÎ8öz­zàêVŽØ‚d=P ížq|�.r 26Q„0.*ò•©jËÍžkp2lC‡áƒi”á¢ÊT‰8Ëì8Å«’ˆô áÔu¡Eßµû7úu>¹<(‘AÌ`#“ÃY€¤¬äUÏJzœ�j»Éò®nœ÷T7ew\k ›¹é“âÚn ñ«QÏ ÚRƒ¦‰Ïu�v:c\>9 L±'ÐÒ­Û:[-H©vÎãÅ9ÿÎÙÔI�Bzzo‰»E³â2.ƒÚìˆ^F÷l*¥À°bøú”O¿Šú€O÷@!õÎ ì®Î}íEk×GŒLØ(ÐvO`¿º«ƒ®Ñæ�ÆùYêÜ�šÔ>Æãƒ ‰ìAm�œþ=� FÞqêÀrÚ¸ëZØWKq¤™sìqmwüñc•d¿Fcã’K¡\×uk�úq ½àV?‹°…ô.îYK6S`\›B�²ÙNOgPHÅSºvÔ%¡o3®Ç½w$]ëqâ›îéÚS“CЪ٤å¢8 é ͨG¥Öé¸?‹eÞŠ˜B.¬„E øT×7ÍN8=SntÜôs­eî§³æ@q£&¾é޵´å\1 bÔ“jÜZæÒ?ï’$¹¦=è ¨ÑQ«¯z]rÍ*º»¢¢7µMŸ×#» 4«ë�çg(¤ª :®mLË %Ž  @Û-új‹ Y›(Bg±/-rœ£}»†ø“Ýhnpmï¸Ñ“È!˜¯5…QTê—Ò£cµY–uçaŽ @Û=Cú¾ªÎuA!ôå÷q>Þð©9ÝqRãê�~‡d#’…ônmK=ôé4 *:àãM½L¿é“ÃzMàG2šÙ‰âif ©··Íuz—QËÿÃùZT�ÀXæž9o”ÓºNMëNHµSZWßêµür0 ©{Eɵá†ÐÍ~‚ÆÞ&'í˜r}Ú.bª£9ÏÃIªPü)àÚnTãOÏÕ›bêcMš‡Ô¼mÕ›NÏ"„ù¶=èŒ uÇ2´knº­?¾ðB’ºh‹I]Ç<åô‰6H„,ÎÁ:;8ÙkGÏÛ±¶®i”ÃÚV`-SŠ×Éâ)^ ©¸_IZÆT[ãZ{ƒOá}k£”Ãóµ!ÜkÃô˜Z ™ÇjHÇÁÎÔ=¾ê™¡B’z’ðQ^ºþ`.(⹆ôe)îðA¯mïHî{FÙ=7Ï(0ú˜Q~uSi5ä©ZŒ©�VtÊ6a.ªþ=¥“�$šNœpZ§t2DÕ,�„ã¾í†N&~åb›#ªï4êIY[½f[+ïó°~—ƒñgX[À ´Ý±¶—˜"…`øbã“‹¢"¡”E§ö2P骤í€m1‹|->æ ]l„Q\”Q¸£VãÛ¥g5¾h pm÷îs åŒ,3'Dq!‡_E¹¢iÄø%ŠÓxr9õçöŠßÓýBq<’ O ‹³�{K n'‹'¸(¤â'¹tÒÔòd=j×Ôaqœ’ R ‹³�‡Kùm'‹ç·(¤âÞX�}ËÇô{͇ †2$ø¥–!'“²ÝNÏvPHÅS9´§­®U;3‹%@p ¶ùS`X ý Юwžr �ª^ëlã`oMõuÁ÷cD@£;°QÉpQ2ð,)Ýî$Ñt;à„ÓÚùŒam•Üj÷³Àìî¡f±:ìërŽNŠ˜ëk?a>ä:¦ýà„SÒí¡÷“D;<ækÃoQìãP,»¬“?~B±P ížb ½r ºD›)Bç_ß³þã`o¸iEç(Us¬?Úö 3ô›9¢ !Œó®Þoö›’ÝE?/ißpÄ*1xcvR`X%\YZ‰p²øJ…TÜgëW]»èÔU·Ö$eN¾J -&ß™_¡/<'‰èžq¬�S•çºiw”¥ïé€cÄG½o«zý²L/wx@�¶=茨8Y| €B*îNŸê×"4ëuÿ–�Gm£”Ãbuàð³€Å×(¤ÞW‡šy¾qì–vêw›Ô‡ÁEê.#šÊuÕˆÞ^—\Ê©]}åOà+m®˜�n÷⽪ o/áT›Vn*Äà–L›Vˆ—Öj®¢>¨Õx �zç,s·iPýzžˆ¤™=P ížh~5B9½RS‰ƹ8ï¼.ˈXôK¦Î[¤Cï–nAŽ^†}›«—s¹]Q£]楽’ü™ë�m·tîŃæôC65„0Ωetn7é½d]5Z¶pI2÷ ×rKä^jžÝ��M*ˆódÎöuýwûbÏtÜpÔ„½M3u2\\Fû˜ÑÊA°Ê'œÎ—u3Ô�ª{±LçiT¨‡BêÝ|xŠãÒ\;×’îUY©ö áô}Ëmw�‘u<ª�£¶N|Ó-±} ESˆ«�ÛúÍåEöŒÐ¶öʤÞ÷|¼CÇñÙ'¾éžÍ~l퀱�E ¹ .ÎH™lÝŠ¥Zr½¬è‹ç±L\Ë=‡ýâ¤RºCœTçY=©eõÙ¨Üafï}L�@½#Ëèt'ˆ§Ó(¤Ö“­™Ú§+æsoqT6ÚîÉìZ�À€²9#d‘ Æa=^k{’¥3 @�¶{fò9O̾qê„(Ê…¸LjXÛ™×j[‡Oç+zÞÚšB).,è¡åN©R'ЧJ(¤ÞÞ®c‹Ÿç-ÚuJXÏs6׆(……Õ<0ß)së$ñÌ-…TÛ19k{ÅmÚÊã pÏ®sšRœ�ЦLò0oJú–eXŽÏÀ’L2Ún˜dQäŒ^ÚD1¸PèZøê¢Rº¡«fsìCÖ½³i”ÃÂgàêŽÛIb9n€ ©´óW©_Ákã“û#jí¿šçA�$h§5Âý_Ò�wH¦H‚‘Ü­%´ÿ0Oš¶êq®íÖßÃÄ7íAOpÑE_dÃ’K¢ÜšßOöÚè ~}!Ë3è¦Ë{¾�…<|Æk;¯ a”=Ç㜟^ö2�Z¢�¸^ôƒ6(.¬E>õ=±}•CóÚ&œÆÞ!¨µR¶w+úò~Äö¢óiúäÀ°x²„Ûv’Xn`B*}-¢{ ô¾ø fÞF'�Å×À_¤4»“ÃÒìJåK±sÐB¶^Š8?W›+vzûj#“Á¢Z'Zê”Îv‚h:pÂ)�™á¡.øæ�ϯËs†ØÃÄ7…Æ8ÿMM}Úñûú‹ç7¨ž}¹Õw”•¡ýïÉ*4ŠqM{МájÂà–ûò/ø[¶.*ÿî++88AtÁpÂ)�†ÒÞ¯žçÍPÀ ´íØd»9<¡ÍW.‰ñ©i­a˜ÚõCežÏo½Pµ€ ´íÐzï �^ÐXµTãN�á+šXM[M°ì‹—XvÇcê¤À°ìx±¬ðáDñ… ©wJéëŃu…–µ?¢ô'жc_ªPSç%ßÍQu¨ÛûÐe­ÛêqÒ\Ótõ¾Ê0LCËwz}oÝø ®Ê@�¶=è ,tÁ�ÁF‡�ÅÅW N¯kŸ'­éòzÖa|õ é“âÚö /Êï²*P¯~*øèoêí%$½ûõà�üIp�6I)0Ò⃓Å(¤âΣŽí•Ôi×ãL,ÖíÁUÚ ¥À°nøÝ´öàdñµ ©xàSǶòʲlzÜ;bÂуÛ@¥Àð4A¤Ü¿“ÅsÿRñŒûF{UR?r?Y2ÅýP m:Ú’À`daóF㔼rÞ·ïPLk Æ#âŠç(ж�q¿‡aÔx|ÚºMK‡\÷P¬€Îòº@ØÂH Ë·íAgYid¨vµeÿÕÍçbN‹#€hÛ}O>DÌ£8\ M.ücÖÕµb“=F:¶§²Ç&¦¬Z3 íî’¢·-ÕF¢XãQâ›vìò �ñ–±t© *rëž®a˜¾½buSãl]ú#A˜*)0‹x·d ¥¸ð°º¸´Æt•ôA�É…Tۅ̽Tƒ¥ÖÝͱ _?j1aŠ ëGXŠrL¡?˜âä°çY&œÊy½©.6ƒ¬ú—êM(ж�½;zÍÎZËr|€ ;'Ðvv¼’¨9'Š\5§n{åÉá�íwb¸X)¯UãPô0Ê:ž„ Yÿò@�¶=è ¡ƒ!Ž�!Œ‹—Ò’\¿Õ1Ö¯x¯ÝY±àJrhÛƒÎÂèŒÀaŒcÆ‘ÈL×|µßVuuulëT˜ă..Æ1…R\|Î%ˆ— Næ:ç+ƒRÓ öè5z¬š®Ê[ ŽÛ¸@Ç&ƒÅ§m fb*ƒWa|aÐã„Óûé8ôךËj5êx9OÛø€âžŸ¶Áè$­¿9Y|ý €B*žÔRzÝ—í¥™AsK¾–@�¶=è,¯¥ôÛØ. ]×þa©r Úö 3Œk®„Ö %ÁÓ·…”ÃSIáPBçzçcV ©ª;DŒ%€¦1 \4™Õœôeö¥ÝN˜�Go ¦hjåÀðèM ¼«Ï91|}€Bêì"ŽœÂF?nãCpß\P@ÕÃúµ46`Õ“ïŸÔÃ(ж�ÅQHŽonƒEÈ£"ƒ¬"Ö¯� (]](BUÄ'ж}ùüž€ ?·"dqÁAVpé×á¨í”óìWp @Ûtæ"R€âW!&  iΓ�€†Íñì\´’”�z3¦Eï´ÛÌJ2u € ´íØ5É!èDm|rQ”?NK/ý²Øû¡ëvž”äj/hۃΠÃ'0豌*"„qî�ª¿ôzÖiÔ³ŒËéF¸ú Úö ³Ø�ä8t[6Z„@Î^mÒ2´|®÷ø“ à LŸ �d|�¯ùŠÄÖc&¤Î½.+=Ç3,jªöèà@_šúÓVFå �É�áÁè,:ïà:§ÏsŽ{Â@!õN‹A}݃ƀÃöY1€m{ÐD¯ÃR›7BãRÅ ¾zM¾K:ùbÚö ³æINë‘,¦0ŒLm°y\˜›•¨z= ¥®´†äÇ $T‰ pm;ö…§^S†�6B¹(*¢´WG^Þdëk 9+kSÞãUvüº‘è.:»„LýÌ cëgNïwŪ^Oˆ-¿Q¬ @Ût†®$Ç`¤a3FãÂÇ£å‹M#Æ“r•’k©ï$·›Ý–óæ08)Nˆ(†'e˜eœ,¾(@!Ïj :¬z7ó4wú ¾@�¶=®�¼ÞQF ЯŸõ¼T$`å¼/íÃ@ÕcnÇkøx|¨i•Ãã �C¦JEN_* �Ê{ß–§ÄèFm¤ˆ\šóÉèÞ¦fÆŠž ?(f𼄙¦ |U˜qÒè à„Ó<«ƒôÓÒ²b½Ô^?&ë hÛƒÎ0…Ë1èPmÞaœwöÇ 4/×[¬Ô ۸™Œ^?_³¸RHŽ �dø¾ÂÓ®sþÄ…Ô4)y­ÉêPô°—¦{"jC½~ŒK�ç¶<ÊÃTm€m{ÐVcr ús[Ç„0.8ð£4Mzp¤Œët–'à08tS)†§1‚è ­Y9Y|Ñ €B*žÖˆú©kÉæ<®úÅ@¾F@�¶=è,Nüsús›óÖv ß½UAL!†¶h‰¹çb“¤€Ö×Àm5¥útŸTÐ(ж�ù#2· !‹‹Rb¿×ÿRǽ̧ñãˆ} ´Ýû×�#Ç`,a ›Æ& ©ßs{Gv©ƒ{·àH} ´Ý�úàÚs6T„8.*I™ý:�-¥ìúGÆÊQûh»!÷/ÑFŽ€8†ˆ�DÅ$~„r÷[SÐvåÁõeÊoG,’ïŒûMREÝ_Ûb’Šù.ã¨î™Æg´OÖ”ü¨­]â—Ÿ ~±Õ’ᄌ…ˆÊ”ž¤­¾lÓx:V®4@�¶=茨½ôCß’Û¡ÚàÅXW®ö@�¶=è Ž§tã6s„0.&xw@¥ÛÚ'TÛWv–#碨P m:*‘ÀT 3k¾;­z×3b&„E5,ß™?zÑë¾ùÒ1½€³06e)0½oÛƒÎÒ ž{v¾‚@!ò C£~mF¥ú7�¾wˆ‚HÐlv §aeR.s’ør…T›*—éq �§î1q\¹ÌÚö 3Õjz0Tò>Åaxj³GäbÝGÖh©‘©ÕÜAÙúNä¾ë'ð]¦V Ï:Ž�)™]¥}P3ó@!Uñ(õgz;´zÐã� 8�¾Ô†(†'0Çœ§®²>(Ny �Š;û ¶«vl.Vb±Ë& âc¡u hÛƒÎ8+Ï*Á½ (áO]è�x�*éΚ?œºÿ`*¥ÀðÔEàlòŠÐUÖ!RqÏ`é(½¸~8¿‹'AÀEØ(¥Àð$Hàoò"ÕUÖE*Rñ€ é&M»ª�Z¿§£l ‡.¼×²�J�ñ¡ t�\Qè*� ©¸:µRôdí´Õ^�\Ž_tó¬ãïµm:óÓ”#ÆÎ’½ÒU—"S¢‚tÕôn]ZÚ»Ùñ‰¼æOà5m§Àð”Là‚ý´å�ÁÖØ‚ç÷m{ÐY^csOOר'äH¦µ£n-Íèê÷Ž˜ˆ«P m:s´?�ÀXÇÖ!Š œ\ɯ«îg8�ãD�½*U¦Q† ßnª^Yñè*‰¯yœpJ?/ë־݂]Êxž€34vÙØ¤Àð MÃeE'Š/ÒPH½©êC·´T·,Ût¾ýÍU(ж�µÀì 7’£0âj³Çˆã·«_ËM*Ä\¦aŠÉø ºê4× ñu#ðx˜ø¦ùÙojc'×;5óâ…éÚGŒÐS›„ NQ¾í&<Å£æúû¡]€SÎbÁÅ=þîÑæ(à çi©2^× hÙæEë‚|ÏãÄ7íAW賬_ô5§³îç�©€Ã¶AJ�á1•Àû¿«à91|€Bꜞ 验µ¿”ª¸3!hۃθ_a5ÎÒ-¦{ª´—Ö˺eh^ë…xÇaO®^@�¶=è,�¿ºªµï@ÎÇg¸ðËÃÄ7Ý_§"é¯q-˜qÎ¥pëê*çc žmqb¨hѽ)ÑÙëùeZÆãn@8Ž1•)”áÂÓ(A|––5¯¢øª¦Ç §u vzÏbÝQÃö§c ³Ô=Ã…‡c‚h‘©j^¥ñEM�NñÇ2jËÛ†iR†¢hêjL#œ@ñžÒF)ƒ…çOÐéR…ë4¾nèqÂ)î]˜^£¤WÈ�ÝyBwiƒ”ÃC(�ïÍê†N_7 �zûvl§Ô§­æå¦0ÖMÕ°“ôàž \Xó}…gg\ç|é€Bjz©òèlÚG_ÇGqÁŸ?ßmú¤ÀðüI$¥T?Šd)5üKÓŽ=•K÷Ü|å€Â¢^î¹´ï(wç¥wpúÅû$ S\xøýÛûº “Ã×È=l䵺2«×)³F(Ç«ŠþЋ÷G6F).<ó‚¾�* :q|a€BêN;�šjOk ŽB\a€m{ÐYèäsøJ›ABåw½·È) ôL¦ÁepnîjÁ|uíìÌ´Ù[©-åpU.K92œ@ÛôÅýjìjè»´›yЦ,‡\÷P�ƒÎ¸_±…ɰûkÛtÆøv.ˆ·žƒ¡òÙ–¾Ž¦¯Ͻ~˜nô8 ’g ¼YZt²ø" …Tüz¦›ì:‹*áàÎð„ ¸$›´ž° ü[Rßr’øú…T;¸LL™Z½ÊbîúGá�Ù€?²qJ�á1›À¹½++91|Y €BêLTKº©W^­¬uЗƒÞ ª%hÛƒÎT©3'}x¬†Û&Ž�ǹÿ«6ÌöᓜÄJ Zì`JÿøÔ� ë#¾+ïAµ>§¦µ&­ú^ÌŠiÓÂäϦ1[ÒÁ'õm{ÐçÞÜ*pn•ø¾¨±'V¢ÎÝdÅç5ÒQ �< ‚ ß”ëÆvCwýÍ|8~Ðȉž œ*U_sòø…T>-guzÆOßJ®¡|÷I9 €m{Мœ!0è¡mòaœ»÷„`o¬K]²GékZ]�”:½¶UhÏmžâÂb•ïë}­ä*„¯•xœ� ûÁIÕgKmøØ®iºJk7ºôÞ¡—ÊU»œ@ÛŽ}Ë9ƒ@ýÌs.‰©ÄùDbœ”�/Cw†qpˆ;S'Ã…gx‚ 1+m]%Ñ•-NçˆÑ[H9êk;™?A�iôž% ÂU¦°õ*‹®j]AÂhì9œ<$ª¤4[ÚW[:?táb)dz|gP¹þ ¢}ª™ÛåÊ} µ¯ÅÀ°,�1D— šèÂÇçøÀ¡ý¼èë³¹ÆkHñ„¤¥@¡ã_‰ë†ºFëÿ¿õÇe*TáÑ£Ä7íØQ⃩eK|Ášðm{ÐÙŧç?Çðʦ‡�ÃÅj>×\Û™¾êgç“ïð%²š¥ÍÚË´õóã‹¢ 0ª­ag°Ù](à%ý’lŒ2œÐZ§Ñ§y@ ‚#á†b÷¶W{œq†3EƘB)0“©F'k|tÆÇ2çz‹NÎ`Täk²P!t‚èr(à„S: xz»´d©fýNü©™k4c.=EGf|TÄC�$º 8á´~ðF/ÛÍí¤ÏVƒ†->1ãݤ�QcÜ4Wpt²è‚#à„Ó;/âôvÉÉVs¤Õˆ ²ˆã�m{ÐY@ßfÆ ‹‰FßæF�ªKzK”?Z=[FÄÃs&ôb¬û¡%‹c�åƒ{ðg!ÀȘ:.< ¬´Äu‘ôA…Ëá„Sš+'uíÈ2ëÅ!•“Z„@!U½°½^˨2è5"zW¢Þ”Ý?²åÕQ°³¼þ…CIÖ¿â9`Ç=6(/³ªâ5ù˜ÖN•ø Ëæ.ƧJ0‚KÊr8¸dY.šßvS–Ëk`~è…Í7%Ÿan��Ð�é¹)UòA @ÛmÉçyû ÁˆÇòB>9�F.X˱?�x¨²Ðk$;è'?Jûûr|}ª!^Øø¤ÀèhI«$å/Š.ÿ PH½¯´kÅÌ�˜™jºtX W‚ÀøÂÆ(Ã:¢P%«¶xIl¹qÂiYìº.ÇMïoéåò×2F<6DïQp¤# œ˜j‹—Ä•[%ŒÎ‹ˆf}Øê)�¦Ÿ×šlíxSgÛ= ´ÅvÓçA9fÐ�µó„5ö{Ä Œ,´›ÐWj¢AZè@’kº·Ï7³…N˜œ-îE4‚G•®;ƦWUýEý~û'ðÛ'm–… ˜J]•שœ5í]�n`Juˆh‹‹uIªN|{ynÚÆîtT �mq!ŠùRb–ôÝsüZV «˜Å>KV½Þñ29U C @Ûm5ì2UÕn7Îñ|ÏDà˜ýI�ÑaŠxBýÉß;}�Bªz=´ÀŒ%4f{ˆIࢣw…Ë*§´«êÇê€�ä™)\"N í¾py ƒñŒ !Œ Ž0Ò¨½ÛÍ‹žñ±ÍëëxE˜Z)0:K…$DñÒ‹£‹—Rw¦x9lscOÊ6ÇË^Típâ›âÊ¥r�‡kM�Îɨ˜\ çè¼aÛ�Æç=²XžôýÞ¹±Ï›:`T€Ãβr”—D—£(FµÉÂaô¼¾í¦tx!¥ë ˜Õ %ç¸^„ÞÒ–N ŒNáD®7«�yYt… �B*þ¾BVûhާŒýøPˆ¨�!N í¶Bö:gý”MY.‰ry/IÆl×|+2ÄÕŠ°äeº¤Àèm§¨~–•Ƽ,º6†@!ÇÛQ-Èjª?×ÅyÜsà+Fè�l¤R`t.(ruY�ÌË¢kdRqLÈjŒÛb¸×ó1¾FÓ2��¾ ¼/Q–òÒè²…T=+K ÛеWùõ•ÜòAY �mqIıÁ9¤:J;^üú1'N–_°3îWdY*îþÚvS–"j@uŠ—UÞt*§J@€ßô¶ôÌ\ÓX …–¹AWuŒ�ôIЧۚÎG€‹®Î �º)”su\€�T\êŠlOS[6{…š,¹ P íî]œüWH%XtOuÏðï+?uü‡£�6tå�m·•Ÿ» ¨¸¹Ñ6ú&õÆÇD€ßt½œ^" ¸Ì,碸u›*OŒ½lWÁr>šì¶—¢,òqìÒ•®0È1{˜£ã9QÄ”Uê¼,ºT‡@!"¡©vÞ®Å)vß±0ı�J�ѱ¡(^b*v^]´C �Ê絩úú÷PN‹†¸Ò”ƒ‰o ËEïk/UL»™ öð ó©Ú Únj/Î*å‘– ͉!Ws|¼¹qŒRþ~Ù”�O…ry}¡¦çC{gg³×éú‚ ´ÝÕò_UW1jt7é>ÙÃÂuï FØ÷+²wm»¯G½+rÔQ?®åµÏ¿ÐE ´Ý9^ƒC ¯º¾ñ’ŸÇe(Ðv—]VpŽÁ¥ÙTb„që¼ûzd¶©Ò�Å(Ð61#\Hy-mZU®fªŽó‡¾^ƒ>Ü&.F§`¢€ «PyYt… �B*ÎT¨jOÅ^Ç­ æq¨�)PN|Ó]yêz9"ˆ¦.ÆE'îJ Z·ÕÉj§3™�ÓBGiö .y¹¦ÛÔùå/¤ú�¥]œ<–Vâ>ýX. ÉuìëR“öŽ˜vÜ9––¥À¨*m䮀�@¢gçô~TX�ˆlõ;>¥*yž‹º¤?}�»+ ´ÅÑí}™µJ4ŸœµÞÞÛø0eVÄ ´íA_¾¦ A‹^j±è•‘uBÆ#±wÅJ[A)P m:wO`†ukÿ5iš~~æ“”Y¡3îWlñ9êÞµíAgéDAtÉNõâÍD]È…±³ïó®Å>q‚…YŒJmŒR`t˜* q³R´—E—¢(¤âLá®ÎŠ]m1Ï›öHî(ж�—ž00ˆplEâ¨h‰©ÜUq½³.JÀ뜩Ü!N mǾ0¡O!hŠm”rQ”U‡lhm÷ê1}£‘V¥þµeí (XŒ³ð, ´íAgñ1‘kï”~œ-¿²úñ ®Ýè5Ù§’£’˜§3l”R`\ìBn$«¸8QtÅpBªírB½wãò¾ ¥&›± ˆ ªVyýç"éƒò�à §t^üÑL¦}Úz9.�ÅhÛƒÎðlNŽÁpÂæŒÆÅ&‘‡ïÛ¥šE¯@,æa|y}·©•£s0Q @Õ¤®â>¨Iy �º?Ë¿«e³¥/�cøš”+é˜9Jqñ[RPJ+-N_i �zç•–®m-}ÝÛÓƒP•�hÛ±/ð!yä4h…[ïJÒwŸûǤq!p‚Î`ÖÜ/v˜ŽŸ`:,•N�áA¦`n³ó]ðìù®àñ9½#›”Î6„cHæ‹„ ì|̦\˜¾Swåf–Jvzü¦-5aO_BÃbtVj\ï|Õ€Bªê¸Ånj!ŠŽßQÖ‡:Η›>,>ža�OÄòadkšÑø»¶=èŒ)K]þƒª”à 7ŽyMªôÕéi]ÎÅÉ’”ÉoÚƒ®�±J!|ÙÊEq�\^úYk¾ÕUo°ÖŒê«©ÒàÚö ¯("`äXøAÈã"¦¬î¢‘¸Þw8Ã9sTÝpm{З·E¤ŽFûèR™júȪQA™Ã÷•Õ�üïÙ2ÊqM{ÐQrQg0ësOãYUàJ.hÛƒÎÒŠæZs½¥`(ããQÒ˜@ÛŽ]¹£¦9—©¹÷\µâÏï²wÇvO‡CdÛîĬ6Y$MøL®t•Ö:Ôë�ŸV;|pµ ´íAgà\ ¸q›5B¸ã¹¡7núäö…ŠÌ*™‘^[â¿ ½n‰Ý{ÍŸÀkš‘ÎpÑA�À35'Œ®¹N8Åý**jÙê¸6ŸEhë<·çª^BMØ1D, Р§| ]å°+È£„R8 A}2X Û·½ »ÓN¯íBØ`ŽçƽºËŸÀ]ÚzN�BúÞ´8¦Œò:[ë …¸êÚö 3LžK§êOzìé$%|å~�{�"íäqº‹À……{ßWxêÁuΟ` Ðš^ôj ÞWè þgAF† Koa-1,¶ô 2¡'Þ­?è­fEUíÁÍpÐ65.<8{¢vFÃÙKÃôÂ�Ö©è»E¿{tŒU<œ@Ûô¥k£lœôç¯ØJ%äpÁ�'á¦AùŒÆ²t7ï,AMÈTJ�áKKA�é]±Æ‰á«5Rç39¥ R×ȃYo–³!œñÙÆ(Å…'@йS'ޝØPHÝÓŠÍZlÝ‘í.ƒéP‰ªØP m:{]LËÖ.f.}ý£}F#¨Š¨“Ùô••—{H`\ñ�”·“ÅSÞRñ·…ÿ\¡ŸÛ·í¾'†z_G5½UPy¬�œz÷ ñMï¨÷GzõÞÑ` Ä’«Ì=qÅ8ožê�¾ÉÖLúØ”—ƒØ¦Õ ¦u+vK¾câS\‹n2Xø†I”-CyãÚ7_ñ8áÔLŠ"ëØÏ—áàŠ"'¾iºbz7·ìýñmFÖŸ;œø¦{oþ²•RÌ‚¥-¹ jBM›Ž'Æ ¶•òyàb�´h´›ÞÂZŠÞ†l‹™+P m:ƒ*³„0.úxÞ½T�ªyÑ“6vˆO[@¬pXã ž¶ª~åäñõ+ ©|V6Zjp¤o+ózVg©²àÚö /¸7  \fn"‹ò¢Ûã+Rçu¥•áH+Ý 0ؘ¼ƒÇ/0êÈÊ2¯"ØšÌ#¹žïIãek€LÛ°—Mr¤1àÚbÒ˜ùU5ý�˜ô¸Ó#gáºê¾3xÿrÕ—”ÕOÛ3Ã1ï™mTR\x޽üu’òG k1øì¾m:#¸}÷ì<¹@!Ò�óÏÉet‡f]rRšs­ðóÚ·ÆEíâQªõç,ÀÒ›J ,|€îE€h^Uîº& v@ ©dN°/ÛªW+W�§ãðE°{˜ø&Š`Ï >x›žÔã\�š?Ú[[Àùƒs¶Û��možñô¿~6anœý`ÆÍ‚Œ ÑÿÐUJp;9,Á 0áTΪ3ð\u&xnß¶cW)ß¾Ô„l­‹ó †oœ@Û=ßþÂI¨{Øj&dQ5øÎ}í{h¹ü\7A·„Œ8ºkS*Æ…|ôýi ÀÉâkRñw5€eÝTó¢oD¡!W @Ût†ë(w¼Õ"O-ãºíù™Êc,8tÆýŠäØ£Þ][È´_w{ŽÀÚ‚¹®\U¦pÇQ–º õk´C�ôOòÕ�(ðÛ� �)@ßÿ¾ á¤p… §î%E3¾L-µœô–Ãîˆ�Åo“Úö›zAþ«k P&½Wvy„¡\÷P/€Î¸_±åˆ°ûkÛ %Ÿ{Uv6˜7 ‚Áº¾²³¬£^Å1éeRãA»ó àŒM� �güzZŸq’èú à„Ó:«=,kEè÷SëÊ, ¦j€hÛƒ¾à �A/lSFã\z^Y–UcØ¢'.OÞ-¯†x”ø¦=è(|?‡ap`Î)Çib)›¾§QÆåü:Y� @Ût•>ƒõcsa\1'å×}=I_è·ãæy†_”@[̯¿«>,ÓÚ6ÐØ­zŠŽ¯>P m:[�Cpm˜%dq Í]#š�)†0¶É²™ "¡ŒÝ^ôð¥^êÝ-�…C±Ûh»c·_î<€Â‹í-&Š`Š8‡2g°ž>zL›+âÉY÷›nÑKšyÁ—r¸�·ál[Yj·è«ºeQƒ¿Ì<8%ËëTP5GçF œ ¶0¡t¾®`_¦[jh bw~¸›«îy˜ø¦=è yÀRÍ\×îÌèJ÷|×€°©Ðëׄ´6ŢÀ�ÙÊ)“ OÁ’ÉÁãsŠ|×ÜkÌ_õ~¼" •>0¹¶�R`Xé ì7Ct;q4Ñ 8!UO‰îel¯4–ö¨dqL7Úî8ßüWÈ4%¸îJ!åp—²¶¤V_x^�¬�áp'Ðs¸Ïú^úk$öÍ©çR¨C'ëEÂ} �æíñv.G'P íŽN†Ò5�C'eCEä<ž£+;çW£×³"ôéRÇB/¦b+Ä1\½ÇsõRwç2òЭž�Óp&Ôõ@uÏÛ¬ûxÒ;ö-¢ç(r�ßtK�_—R¯Ÿmùý8…Ä1VlˆR`x*=(/¼£È�ž# �:S|ôb»,ê|ºƒ”¢øh ´ÝðÑþE…ÎÊÂ3BçùÞñ›³º =ZZw÷Á”qü&ÚnùÍW‚œÀÔ´nk}ЕqÎ%, È¡³¼Š¶ŠÈòm1�î\î��ܵ¬‡p]SŒ—»-}+ —¡;ß Çú*¸[L)0,°þ†b¦¯âxjÚã„Tý’ æÖIg Ør/ÁØîV¡¥?Þ+Ú/#öͲM[ «­��ÏØò«¤ØrRmŠ V.I¿x6ͧ7á¸`�h»ã‚!xËaè»Ìò8Gè½Îó¤j–q˜ts†\ã¼´CHc‘õ&R�¾¯ŒvrHbPBjüžöʳ¼0>´kŠY¿”òìš‘¨‚–sl8ÊÓãÚn)ÏKDxBW(h ‡ñŸDÉáq*ï�Tt¶pòç¦|Ë•Vrn^ÕLÛ2©1¥9=ßô[œÞ\-§¦z7Åð §@�¶[Nï5ÖŸkR·ªQËYÚÕ?º�).dTƒaDFÙuÎSÑRÓWkC #úG‹4ˆñçœíóò�yk/\–RFeý¢)“áÂê.ºØŒît‚hºpÂ)Í0‹Ê}mz%d7ŸåŠZœ@E.{; ›/s�6Ïí*ÔîÏ�À�GƒÎBþÏõÎ3œRÕkŸ™K¤1ÍM¥V–"D_¶”ÅÕ#¼óóü•¯d€}5UR`XÉŒu–—ÂŒ²yi¸®mwy)A¼ºà‰W 9œÅ9WXOµ“劀m·ç÷Kè•"ÐÒÙZ"Dqfóº–ææìºîÁeûƒÑžI5mÞƒÂãÎHɦl뫞j½¢„Q—àçº{}¥£ªÔ68þ€m7ü!Vêz%›1B çâR"q®O鸺+í’Gô8ñM·,âë*"¬’¨–f�cda9ÍËbŸP^'¥@"R mž�R «?�e˜D'Žg(¤îî8Nž^£%¶qÊÓrΪ¿5�ó´¶èâñÆa=F|ÓÛøŒ3D�°Úí`µ¡½e~¨’ BÆzʨU�Ôj È·ÝR«—¬4Ç`®g4!ŒKÁ*NþÜÔê®~ÊVqŠ uÞã¥Ô³ÄSÏRk†T�—þ»Ñ ÛɵpœªÇ‰oºaTñÕµ†îÜ&.Ç…ךXîÿê¶ãÍCYŸqÆoŒôåJîïÀî!k»ì= �!4pÊa‚î‡<1¡oÿu\ïlG{¹¬*»žWÃ@å Ü£)0,}¾6%U�,žU �ЧÌá<¶÷š¦­ú¨cõPÌ!àÚnØôGuß”oõ5ŒxòtTßžvð=eì†ÿ=Én ×tÇn¼#0çù¸a©ÑÔAÁS&ÚîÌ×sô‘í(BçÕ~cž»– Í5».SÈ‚+2­R\XšD·öŽçuRx¢€BªœÒ˜suxjH»åQ‘ähL ´ÅÜÕu�¥©JsžùâhÏw$â\Ú ÈQ¿jÏ3ˆW”\Þq‡ç˜tö‚Fן7ó#Í £ßTÉ�!ÍN% ðµs~bõøÁ�aèŒ8N ò8u Ë·íØWÊ)»Éà9e 9³Ž0}ˆ°låÏÍÄj> F¶lílæ´Õé�Ê0¹€h»!YÓ` yj‘<Èã8ïŒ2�‡Ù’ù<ÓMR¦h»¡LÝ,ùG-_k|òø.7D€h»¢—À‡€àzhΔ‘Å-.÷Î1¬›ÛóÁúÑ=WóÖ×xb.ËY¼¦ˆnÀ ´ÅD÷9JÏü"EADj• cbÛ÷„a_ì²ÖéÏ3„¡G ´Å„¡Ûg¹½BžÔbDÆÎ”ë•=ÌŸ-ŒùvâÑ9så¾Á4WU5ä/óò}S*�uje¸°R¬y·z€½âé^NåKÚ^–¡E¸Ýx|® k6Es(ýüéÖNÛ‹'Å…%è+$ì¯�ó �NÏ+IèT y]ÈîÌM¤À�×�REbäX¦2rJÕÀw“ÑÀS»jÈD4i6OïQA -#G›^%±´©G £sJ›vöÖÇTê#ü¢hSh»¥M_>­“CÀzØTå’;ä=T�ðçöñ¤áa#m 1ž™ EâA¸˜0•NÍTN8�߃5%kadÝÈö Y’ô8�¶˜!tU­‚|¨­œ\E­æü`ÙV5QeU°…7?8�¶[~ð='WôÍÀAɤQÿ“rh{CË=5Ê!CÑP»«ñy‘3%* Á|_Mè!,Kˆ¢\Ó Gˆ÷Sè+��~÷P/I\Cž ]�M[ ŒË‘èWRfÎÉâ™9 ©ø{–§l}‹e§î¼.”£y'ÐvGô|¿î´ �þÒf,—D¹ÞŒ@(E—½æüý‘ø‘Ú~“@(zÄUeUû5|B P í†@¸î}ƒÎÊF‰Æy>†>(ë¢÷¬½õá(\PüàÚb#؆NËF*Gù?G‚—eS7\FýÒ{‰IpØÙ¨¥À�ÌDV)p¢øJ…ÔÛ�|—VÕëÉi[ûçU^ÔöHè Ãëë/"’Rã¦QŽ£ÒsNm–„ ž—ÓÔùŽem—ku5”°I"!&ÏÖr ñÀ~&Ę“ÄcRíŒ+ˬoÄÖá^OçAc€h»!ÆNÏñ¿ä8´Á6q„@Π_Jºy¼‰¶Å¶W§rv*#¨ÊÔÒ§ç7@H~ÊãÄ7ÅìC éÒÐ+^{½›oý€ @Û Ct=þSÔý髦åA xÍ?~¤Òg8’ïYÖ«šdõ0áJ<Ä�¢™±UMÌg³ÄùÏJ‹OÊ8_é^ìŒi”á"b<0Y)‡æ$Ñ$à„Ó:¥ÑŠæ0³…¾óáÒ( €mgä1iùÁCv@’Ùœ¥Àð”]À¸¥–“Å3XRñŒ�)ú¥B½–¬î!#Î9vpmwìÌeï§6‰©¦á8’ /eª«^Ï«”úaÑ(Ðvâ½£IOí÷ö–Y70Fh»£ëÙ=ƒËµù F·ö�ŸÈÃ&\¯æ¹òp‹Zúgt¤óf~Ò‰ÆðÆ6?±B¸X)¡=ëL´E‡áØûí @�¶{ÚóÅBç ·lq²¸ØÍñ¹çC>³iĸLŽ}Ýü³.ËúÇî¸ëë0à-m|R`X‡ \oF/:Q<½@!õvtƒ–Œú×ïu#uËÕf,†Ôy°ösfñ*ëfÑ…T<£ñ¦eQ6mKw|¦”¤ñ(ÐvC­¿ª¦~i¯ZujVšêÙ5è È…®fýíó®ë÷’[¸Jméd¸°ž¬x×çÏ@2‹Á³û¶ßá/þµèpÂ�!EãuuÏè…À5‡;v;Iãy @Û �—Tõ Ôx–qêŽ/›�Ún ª×2�AÃbá!Œ³RnaãÒ›êÀκHt±´µ|XS) ´Ý‘kù¯†i¾‹ÅP�k{ÈÞ!–ô}a«‡°a+ŠrM7ak6KpÆŠœ$æ�U0ˆ×ðpÒOÒh·õß#éÇJ‚³,6<)..$€•zGµ:)<Õ @!UN Ä·µÏ•Ïãx\lNˆh»!áFz†¦×f��ÇÙñKEƒ`IÐòÚª&èÎŒSéá´Žv±z÷8:À¥‡h»M_(¼Ü` …ÐÆ‰04 ž7”Í1ÜîÌ’ÖÉ*Ê5 _΢ —´P í.ií«;ý9înBg*®¹Æ¤Gåk7®ÇíÅxpr[F.<7å#˜Œ_;ç“x�NÏw)ü´vöói;>6E¦ðh»Má/^Þô¬OÐ'Çâ�n ƒR5öiÙÉ âËNRkG’£Šõ$ÛTÄtpÅ© u7éân·ªV_·ÅÔK�S`HÝ–)£]œ(žv �zÛ¬•‡á©Qǰß)FŠcªyÔ·yj¼úÈVSXH]@W©¼È¡� CÉŸM_–j Ô·½¡ZžÌ¡^¬Wýë%¢sL‚�³Ép!oË„û¹ ¢©NeGNzvI?SÞ‡¾€0„]b&9�…ta°áRá"‰çL(•³,pÒ ²}ïü~—N í& ¼lì|ñ#GÑbv Gx\�Cú°HmíäOÎ,w&œJ]µA?Y¸}�zœø¦ßÊÿ¦imÎmØÖãD4™ÿP í&ÿs¶0Çø�c ˆÅlÂ$Yß�ó÷öAÚçaâ›n’>{¥�¡*MéÊп|B›T ¡/¢Ü ¶Üóm{ЙOÓÜ®-ë·Nuó‰1ÚnãkbÒDyšF}ÿå:`2Q @Ûm¢üêÌrÒ¶š Yçp=2Ax ,šFŒg࢔„L˜tñë[ÓÕœ�Ÿ� h»'^Bü‚ÛÙ†ˆ�ÅÙ†4È×0³EÂåx)› ò=P í>È—@Oz¬©JÚôŽ":}v(q-·©ó;¦e¬Ftѳ¸�Û{(¦`m7ñ+wU�ëžšDwÚ8E´p¶‚ÓÁçŒå•ž›ô¶ò×�´#;{צ(Ã…ä\`‚ã*ˆå7½8×Ðmš>ÈD=N í&}Ÿjénœ´t§_pîé\ `mQ¶•ÿc¨¶z‰®‰`ÌŸV³ËyZãXkP¨…×üf µA¾œ&{WQ${(¤Þi²§Grõ›ÚÉé�Éž ´Ý'{¯�iŽA�dÓFãÜÛ“àëÝVýTñ|Î2<~óZäžc‚-A–|:Q|ò @!õvùf)£Z*]x˦‡¤ùô€m¿•Þècu*I ‘™No&ÐvŸÞ<·Á}®¢Tg\8FDL¸¥ÍX¡g.YÅX½Z¯W<Õ~�C@óÀ‚5…R`Hó«?IJ�$:)œ�Z_Ýû8/í,i7ÌÓåëtµÊ�\äRA®w> �ªfé߸¯—ÌÝQ¿¥ò?€ ´Ýd€c˜[+|ò6KŒ™ã†ñõ­˜ô ÐÈÙ®Jœ³–ˤí*£^Š7„T lËh2\D¦;-MÐ�$:Eõ´iÂ7N}ë¢×[‚ËÚâœÏÅͦ®Õ¡‘F½^åý0ÄŒ°À@gd8jÁZ[ÊüHL©€mw9àå�ƒFÅ&�ÆY(ç" “kôÖk‹Z—þƒ €m¿™†�Êx¶–ñøÀ™†P í]öØr)`›5B—M_NüŒóØ‘a-ÇE HÔ�±1¿žCª.°\iædñI…Tü]6ÎöQýxЙ_PIÚn“°‹—Ïwæ2f$‰-Ä%FîàÏXÚûiÓ¶®ÇçÍ‘]€d�G Ù…`;fi�ŧ=Rïç« ÎÍ„\,VŸrÁÊO“0ð…l8QNñ$ µˆ§ÙÝ óúA@�¶û$ìi‰njÛh„,ÎBø½¯w;身ةÄ)Ð8ZU¯«äñáx¦@ÐYHЏÞù4€Bªš¥§ 7›ž†|m‹ÓSì�ÓÚ.šèêF°k.‘Ëb‹'†LP`¦ÞçbNŸ�Ph­!GÇUC•2õ�Å¥dh»OÊ^¦§`3›J)0$¨Ë�æ­NŸ·PHÅa¿-:þ5àOÛ‚‰k×J7õ7Ëó% '®¾³¦x;_µ¯ª»Þÿÿò®åG�Û†íÍè±Gé~Õcž rIÑí)©èÁöacoâM×»©púßW”43Éò³�¶@sIÂ%ŠâãG~3š;fö|T"cPŠ*×Xpu�Áí¸¥íÖõQÑÍÒ_™•ZÒýμ«¥Ý‚­¤/è #k;}åónLÁÔ;·Ä7Òd$¹3I$3ê2¸Øb@+é[ „1(ÅÆ–-›E¦I$�Íê`®XAÆæDYÓTVЄ1ÚnÝTˆ25ÚlIŠÅtpTBûhp ʘ? žÖ•Є1Ún Ýœ™ÌCM6cŠÅtö/V¬6¨ï§ò1CmÅŠ¡©*V7¥!Œíʧ$heF0aJ®"[˜qø’”íäúšó�œèéHJ†·�JuKSă³4Ç\lWЉr�Z-tF‘Úp�¼íJ ÈM=7eV×…�¶!e,üOO—N{ )ì%Y ‘‘oHQ—‹Õv©3ŠUÌ”r‹Åª‹Ñ»KïÖmàYU¬Æ@h»ÅªPõ“_/…+zì9Uf „¶Sõ\¬·egSy�e;R¬¤pEäñ.V�3d‘»K½I›0Ø<ò‘‰Œ|†Úš„YÑRzÌJƒRwqè�5�v‰)¤öq£ƒ‡ÓbD3[£JÁÈÖ>d2E™ŠÖÒ—©„1(ǹ½šmã”™$’ùTi[§I-”gŽ@'i›ÇÜO•§Œ;|EH*ô x$>]›@�ãÛ¥ô0ó�Ô"lv±Pò"†ñ ÔŒù&ícæêg™…F•lÅòRº%Af‹}xGÀwð5bÆl“x¼|ŒVá £>M±"Z%\�ÐvÑj£ßïã鹯ü~*�òx×I5"‡ä9ý‘x€¦VG<Âtb6½… ‰ÓfqªW€oýó‘à—ÓÅÿÉÀ©ë"pŒ5ëB¹[)]Á@j,\å壿_ÜÃ|éÐ/Ê¿ž¿ºøúêÑïÿ6Œ65 óÅÕ÷�lsß¾èáƒÈðZTüË«G�þìêÇÂÐÅ4ßû\Üi„d—Ë\½xôØÁÐ?^Åm¤�Œ±8™âFà;éKë�·=|3g¡Ü­”n’Oo[-\%o…a7L§ �±+/ôÑhpV m¬ÞÇÿ¨š…ífÐP)U_h%}õEƒRl¡úrC+ô1¦Àojúê‹0BÛ­¾&#tóÉÝ4UŒN“ba' O¿[;–·—5…á „ÆMp“ ­ñ’zIIW/®ÇU£°š–2„—ö­ÈnõOï.ÆÛÁ§c-˜<[¶Ív#2²e;cðb ˆÖÒ×€„1(G—ëà4S†Ì_ ¡@žäÌ$‘̨KÜl„f×—}„1(EE?t»˜7“”¦¶Ð¡¶��"�[h%5L#|A'5¶iÙè¢cø´-3V7᪬•Ásd2œ<ШÁíÛ>=b Ö·H$3²@�L¦“[ `™ ëDE�0¸E ²3ó\žÂaŠì5Ù–EF¾ê¡.(¢E´–-Æ åyt˜l%F\'ƒ!‘‘­²?,±7-€å U%¶moÓ,ÆxàÕFÂí0î¢! Ÿ!9§3Àæ ˜´Óï”Q$šcŽbrªá�#\ëòZó«ÓJøC¡éà�|®×$%i B’¶§¬m¬‹àÁ(ˆNÎòˆ[CÎ["‹è©e‰P -¥Çb„1(ånјí'hF÷к/ñ“€zbùÀDFÕ3–&â1´–�Æ ›µëágºX_O'Ïgz¸ws!]ùí±,™�Môd.ù·“ë1æ :9%F„Ö"0v·-�Ol"ø±±€ÅŸÌtø!Œ�ÐöÁO%‘ÌBý8;—b-]Phï²ñ€MºÂgi®ÑÚ‚8M’Hfd‹ ÆE4†ÖÒ£1”‚£>°íLzxb»Œö¦ªÉZÙÞ‘ðC ZH =_P �¼_vOzI �_ëNVF6:(ÖYø¾•é?ªMë(c 4>Ö‰ÁÆØ9[^7”+¢4цpBÛ�7Ëi Ãi€M¢ˆ‹(â´gŒMŸ•ë­íO£Õ‡Â� 8ÈnDj¡Y7òJ*cÇú‘ÃÝyHçtj£¡É½ 3¹åÄ”Ñ3BÛ�†•’4ÞHsAIçÆºÄ‚~†Wlƒ:r>7ÅþuQAÒ’…{9,8l´Ë’ÕUZ¢Œ�Ðvµ´F!;OɛޗפH¼ Á7 $3r€�‹ä4¨áÙÕÑ�2¥¨B²py¤‡Û}£!�>QÆ@hš(¤9[;\û×CU=NËIiŒ‚Æ*:™n”2rÓcÚ~(<òr 蘆¦®ü’«órÊmßËm>%y8µÑtJšut� GV*5Ò$’æ4tßv,Ü–ëÓ%Ð.¿mFÃ�oI$™‘C†\°<ƒx%u¤ŒA)6Ö‘‰žhôðŒ · ;;(_a̼ڵ†‘Kt2^ðvö3 3¥¨R¤‚+ã ¿ã–¶¨äQvö¢‡.Q·º¹nzìyt2ü“BÑà ԑ'f’ž Ô6“H2#—D9C?ˆƒxu¤ŒA)³©R•q�; LÓÅAbÿüP–ްÖÇ c 4Þâà£a±M$Ìãún“n)Æúñ\ôÔD­£Ñ¥éÈÍ–›æ) €bÍíä è’~D>]´U¸}»”Þë1_ÐI-ÙÏä‡üéB˜«ÓÛá „v`?KÇ'âi û«Ï˜d0â;I"™‘Í`Œ# &„VR›á J©±Š\ŸnO²£O#…Èi$‰dF6 ±GKG³ëω0µ¨dT¹K.ŸŸ Ñj‚0Bã5ñíî�{ÖØÔÚ®Û»´Τë:ºˆ¾».]·÷§ÛÞ½¾�‹ô O<ÂÝzÃ@³p'L”hßÜ=¼j¿ßF>|ŸFF˜qj¡½}™¦ŒQÕn¿~}}{Ÿ–‚�­Ó~ÿîþùÛÛ‡ûüéîGq1û¸túóÕËÛ7eÕ qzTÛ\/¯ÓØXøÌµ4¯o²<óÉøy™å‡»‡ï®ï’<>¦ìuŽW·÷·¯®“4Q–j§•®úzÑHiKf™û͡$GÃÿþM¡™�÷šòþ´¨Ù×Ò5»ZÒ·‹jìiÚF6úŒ†`Íj—^~uÞåv§¸õ´S[/ö燻oÞÞäÓJW­º¾‘–êñß¼¾}¾(ÆPIà/pƒû&ùÓÇþæég‰£«éOÆgYj7L›ÔðÕA�º‹¾7�yê²¹ÊÊGÐëªÅ§�éDœ†ʈrÓ¤Ÿ·)à6Êy°QŸiˆåæÒ*—˘/ÓîÀOÖµÙ™‡uVGe�F¼Í˜}¯ßlø«r-¦6¯ž³!]F æý57÷œþ\³ÙìúDÈ+|ž�ˆf3ØO©Ãö¤ºÎ8¿íøsºN+‰bF«ü:íÌ6k»�Û›6ÑŒ/Ýí[6†zØÓÇv.Û±ý6ãTG×_Ñ©ì*P÷ ”Á*Ý'�”áéÒ}›–¦º2cE²T)ëùøÿŒVXñÎx{¨•á#´rI*Ÿ??dŒÉD»_à<ñ,\¡œåâUuÀŠ¡£ŸÇ± X¿ÉYžáíu7uNó¦DÊî(ˆ9ÆtŠƒ«â5o¹­ò9Ûµ5HøÐ£8/i´üK¬V„±qfƦ� cžÓºì°Dëç†0ûaëžÃX7ô{uÓGjÂqö‡4qxLûÐŒr…>(ˆ‰Ú�¿à‰î¹Õ‡D±VÄTNE竇}IW»ôðÖß°…¾§÷T_ìï7Òj±DM¦¸ëœs3€q”6"1Ò¶8×=£ŠŸO6[&spö«‡|Á¨ÆštcL¬5ºR ÞÐÂHS ®cÞ½.3-> stream xœ¬½ËÎ$Mr%¶¯§ø–Mü÷Ë–Ah'Ò~�‹Á,„nÞ•= 9#òñåæ‘nÇ"íd©»Ñ¨.¯8æ~±Ë1O�ûê¾û¯Nÿ{üùûÇ�¿úûõëŸÿãG÷õ·åÿüãß~ôõ�¯ã�ß?¾þú·òж(høúíŸ~ô/û¯¾ï¾·íkÙûïnûúíñãwÿÇÿù÷ó¿ÿö¿ý± öþ‰˜Æò@§¸ßþðãwÿïðÝé#Ãô½/Ýp´þßÿñ�ÿ^[×ï¾ß÷£õoÿ׿þáM^ß½[ÿ½LÇ3ìüÍo?þ®j߯ßëþµLk÷=~=мÒ0Ÿÿyþ}î¶õ»›JÉxµüË�øúSy͆ë—}ÿ^Ë›�Ûø=¬_ÿþ�_E™ež¾×ñkžÊÃå}Ï–¥ÛöïqÑNömú^ŠZã^ÞïÚ2¯e¶¡´üÓÿö£ÿ^‡µ¼Ø–ÞÿXþ÷·6á^ÎÏò£_uËSýÖ}/}‘Ý—ÿ|/KyjÛ¾§�”¤Šÿ™Dy9UM'é%{é—î{]?ß?“(|9ùñß¾ÎÙëÇòTßý÷²@ÿPæ´Ÿûu)sª{Œ(î•ËS{Y�{YËøëv(O�Cié¿æy*ëv²§\Ûë©e:ݹúÔ0ôÛ÷Pžöí{Yõ©Òùw¿~ÍK·<{tm¯§–aÝËÆ5YÓ¸|Oå©q.=êCëRÊô¿(+´Z§¬¥+#ÑÈÚÊºÛÆVÖÑv‘U–8ÈZûAÿí"k/ëz›ZYGÛEÖ2ß7¶²¶¢½í³s$º¥?´o»ÈZçÑüÏEÖ^´_竬~AÖÑv‘µ•MÕÍ�¬¥+Ú·²†m.Æ©•u´]díkûvO+t3Û®-ÞBÿíiŸ>�Ú V в¶n¨{¶_ûsW½‹‹–iþ¿§²¨¶WlT„"·/ƒ6_0kÌR‚£¿žq Zî¡+;oܵ¥;ç÷Ã>‹ˆP›TìÂT¦°öÙ?ûD ? ÅÐ.ªE™•iù¥>u­o«ÚÁï±· °{uéÁ0ÍKõEcY‹ÓöK=k¹ôj.ûïÁöòŽ�ñ^ç걦®êþ—z\Š®:5cYÍÅhk——©Ä%´ÎÅ0ë<¬Ó÷¼þJ—¶øÊÌ/Óu¸|¼÷éç}PRúÓïÚe¹2MED‘pÌäeõ —ê' àµe(«hø¥>uõëf+y*»¥]=èÌz}ßqÖÉ|ÆŸv9 %g™›É¼¼%Z µX«®ŸmÐù•.K¬Ô«»�ŠW+³æÖOÐeI¨t£NÅ|îã¯v9”$Jƒ³½LªXô g—K·ÿr—£ª_$÷q‚ïû|yÚ³ÏuÎXèW_³l—qÞï&óå�Ï.·²ˆ‡_Û&Çk–Õ0Û‚í£·|ùí³Ë½ìŸaþÿõ–%Š\—»õsqïG—K7ƒÿ‹K¶¾e‘Y<Š™Ÿ!xÍKpöÙ—ðtø5›w¼fúÝïöš£vYvÍR⬯µøª}\kÎÿ_åq£TÚð=vã\™�b¤ºµ¨^œøØmK}¸-ýJœÚ_ÓYÝÅ+ˆ9[ªUÇkÊ÷l1šÀè”­˜¦¯ÿç‚+ŽpQ›U»½ ;§âFæ¹Ê-üž4l[¢ÌŸ#ÐöDK(«Lo¯Öa9Öd¨h‹•°QZ�1ÊÃÒ+GU¶ïq:õazòm”%~Òæ}ÑÝ<—5yäiîÕ¯®@nN•–í£¹Dºþ¦bÚ¦1z‹òÈjb·É"ÕªQŠßôD¥3æú¡g pÂéœÎؼZH4“4ôÌÚÞÍØ9_9ß½*ÄtÅ ¤£eÕ»¼jWò�Ši_þgðòU¥(äHúU=WCU”®i@´òJï³&#%úé,9­*å@�¶G ,\nN:¿·(¤ªÉÚ™çj)JKI^>X:'¾én¦á«Ú´0™aË×îdy*>oš?Y»(Ðönížs”#`ô«>LOÔLú*¹»®©"l©7oþ3xóªPŠró½]‚àq³ÔiŸ?ÙÛ(ÐïíC¥ç¥�ò^ãwWs­ƒä¶1"úòm�@˜_D°]4ñ­±ÊA»²ÛÌãÚÞm³×œåœŒªÓ7³íiz®ˆyWþ24…þÝMŸ Z¹hqö²ù�îqÂé™nô~VÖ¾´ì–Þ±ÝãÚîÌeþ¾mÕ�Ï �ÛÚýh£¶Á{¸÷Š�NÙúy.±Óò\(9P í‹MR+ýûâ�Bªz,–sûtû÷¨#9•lÜöÛuü AÕ'ƒ ·œ¼uéÖïÑv7Ý8ÿÞ¦N†ã?6Š�ðì›Ã «gg¼þ´Œ§žhô�l„G½_n`ÛŽ>°°Ƚ­ÖE•ÉÒ¶yüž·륫06²¨ª·²`©\_¼‰ ÷ƹ‰›ö^§±nÿá çqâ›nì[þPyd«+~î{­²œ³Dwm�@LÒ´-ß›F\ÓY)G_£_5Ê�¡› ¦21¸®'ÚâNH­3›«Iç6™M7ÞæN -¶¹í*& °>mƈ®¨µÞNØ´uµP6�«±ån*~Saúd8áfÕÍ—R\ƒB–z°,rP0UŸ9¨hRÑd;Ù´ƒœ�z*30j\Sò…~��·QH�Ü:/‰æÚõÄ;(rï ûÈÛTU½,ù�m1àÚÞÙâù©PŽtŽmØ.#ÄôåÛ(ËÏØbGt&=X»o˜ S'Ã…Þ;˜ÕÔWµ]ñ®Êã„Ó:³ÃÓ2è1��í0àÚnbŽô!\œ6EŒpb�gž`ÒS*¾OÝQb!]ÚÞ9ƒ×šÉ1°ªFL_ÔÊr‹fž¿WE¬óù¦MÀr0…R`Nk+õ—®/ÞaPHÅM¥}ðØ(¤ÞÞ5X�õPûÖGnµ¼VoƪÌÿþtÙ)N|Ó#{ÕV64xœpzúU¬'´ÕÙA·¬ÏŸ¸>mHRœpkÝ/›þ8"]ü]°é—CU(ÅÅQ$.­6ªÁÈ é胈Âá„ÓÙ/á~µ í¦“VÆ Ï/ ŸÈ­ÏØÇ·Ò?jÝøÛ ¤¸8¬„¹Ì#š¶«BRoçÀ/+vÐÝóú�?÷8�¶»Ð0 ׃M%žY\~žºåȇwõqÜç' ª”ãÀg3‹sÚžø8Çã„ÔÚ­»zàîÉûC$êW„ P† ƒÌhq¡§oeó‘�Ç §gFtCM�ËLó'a„Éoº #Ò‡Ê#õ'Ô³ž‡yžŽã„·m�@–_´ã®¿½ª~>„ýZTePãšNã™k7t0Ó‚„P6 cô× ËçQŒ‡‰oº �ó‡p7ؤ©�•.ã>kPX¶Ã &ˆ\(Ðv¸OÁž´Qa¤3û»«?O²=3Øꎟ۸UøÓ¯BS$ ³œ“àiÜ;c'æAÒGO€h{<-/k’A`[ØØä=1Ì-ÜqÛŒ«ØëÏEÃ`VdÕ'†Án°¼�K†pÈuÅÇQRï4Ž·Iè_‹ùƒ0ÊãÄ7½ ¢Î”p©ÚŒåqË>‹¡Æ\tó×åð"DP í&Œ"žÂå`£Âˆ§Öl­N/¼˜õ÷Ó‡·ñ‘Fyf1£:Ov利”Ú�°(–rÂéX pB*êb©uÕ¨±Å'~�Ô!Iaaüm·6Ôi“Áœ § 8ŒŒzÿÂôu­ùQA àÚÞ1ÏõšCpƒÚä}q»Ýo!ˆLFý©j]˜ýñSA.¢œ@[œ±äáÖ°A!„3»Ì¥ãÚÕË%4�™ú ð‹Ó”yÊ÷ÅÛØÎ‰çb; £gL�úïáã`ÊÃÄ7Ýd+Ù3¸9kÿŒhb›ûí²,ß5�™Ÿ£ç“ئN† ³‹pOAxÕ çÃI�NO�NäX«:|:Òî§~!þ ¢ I†nM¿ÝÆ¥·å=­Ç=\è8�¶»Œ% 6ƒ %�ØX~ÑÎ%¤RH�NSïûµPÊqÔz7¡ë‰�$(¤Úi$©·Dé DzQáôI$ @�¶›H’xªŒíT «¿÷ìž‹—ß¶=ai,9*v³˜kZéX`ma,é²Ä‚ÛÖÆ'nÏzÇ™Å[˧e°@MŸ&\áj‡ÐÐIçcJ ©*Ø›®Þ'7«=-qJ»ÄÆ%†9Q¸å :tÒù°€Bªê6SIø»êÌÆãêH�`ŸT…R\”[.�sÛžøP×ã„ÓÚm§i±…õüe¦k°Dm€R ·Q0ø…(²íŠ�>=NHµýÖš&Míæzß§k°\mŒR ·i ±ÎÁ'¤¢—LiêuË×(Ò0©’_ž6 )0N—p­çqÛ×± ©¸_ÇjÆ÷Iœ_¡U£fh¸ØÛݶ>@ö8átö»ª˜l½GOès“Qù•j£“À¨½G¬�h>>w0!•gý9ý¬nt âöP¯E˜‹‰Zžž)Å ´=YqìÛÿ ôu8êýpë‰35ÅÃv®µvwþ v§�I r«·›fl—ðÔnå 2[¿L¡'­¸·òp¼íëƒxÜ…T<�È•9PÈ6žƒDFä(Ðv‘çOÁFµ‰¢¤›Þ›7%?ë�Œ]_2NnÝ®© å8jçÆár+üƒ”À…Ô4�Ƈù»V½g½ÇòƒhÜáÄ7½‹Æ_›)…à&±IÊ»â6\�£V©—gå>2÷@�¶»ì3 7ª� %žÙõy^âR=¤<ãyÀ=P í.ÏŸÂ}bãB‰g6�Ï&õg]u!vÇg ‚lÒ픪QŽ‹³IØuo“‚¶—’Rå<ï—~$9nŸ§Cph»Ë8ó§p³Ú$Qâ™�Ÿ†ÞýT÷¤ÞÌÐOÄÞ'Ðv}çOáVµQ¡ÄsûBÔ~¨·«Ì%yé·Bp�h» Áó§^~Q.ùé‚8ñmÛ#ÆDáZ‡Z­e˜>‰Â=P í> ?´ÉG{qPÚg|²œ ïì›ç(Ðö.'xÙ¹ƒÌƈ茳†.�Á°º«79ÏzMƒ�/&Ãq�h£Âñ‚Ƭ*DtEÚE —»¥ã/�Ù}òlBàqm7 AúZ2F8aßmký�~F[N]¨m @�¶ÛmýÝ¿Ì^w\æ:ìçÁÖžý ì™�N Ò8¦é‰~•a²”âðO\zâqmïÒ“ÓÌä4i6BDWœ}tf¦ëÍ2­ë"!õà ˆi”cR!²F˜ö´Ò?È—}×�LÇõ±dªâqâ›Þ%*¯eœ!pÇØ|å=q»öÕP¤1—÷íÖ˜‡€µj¥@nÇ„©““ΧNZUH?†½~ ¨øÿ]+‡|Þ@�¶8oaž*Ϭõ^½¹ÄfýËÌ1â]Û#[š/Ü#ó6 ´ÝåmùS°9l6(éÄF{›"�ÛÁ”¬Ç©6Eò@�¶Ûé}>2”¶Üçä†È|€m·ùÈ…­" ˜®ÚŒ}q¹okcôC›Rlß{L�é0uXHV(MךžødÍÁ„RÙESÓ~ÃöS`¬À~Tmr gÅÂÌÅIçs3 ©jž)é§¾õyi#›y @Û]b”?…vÕ&‡ÏiOÈäªô>ë÷ë/äö§JŒi‹²/ŒÈP<„ÎP°/ßv›¡|¿Ì_üjŸ â [Kû3°´ç¬%@!Ͷ_Íå%´ ¹tÃqF¿"e¨²/Ãð*Ú@�¶G ,Nn[é$·(¤ªÞç“ë�ì9*éš`ìµ·Å£Z£ú=ècf�ûfú¤@ÎÊÆ g+ýƒüÚ…TVoý)òåû:?ä�¬�K Œù¡Èbc^ÚJÿ ¡õ@¡U÷z Û\B c�#Iå÷†YßÈíÐ0ël…óYµÇqoˆ9­^q0[F·­7 Œ_‹6*)�Ûq¢ÙJÿ ±ö@!UõûfœêΚËäUT$‚üZ´qI�ÜŽˆÍVúÉ´ ­*¦‚ã`µ¹ço®ÉÒãÚn¸šô!Ü6ŒpbkùÒcñ]k=–<÷¥GŸ¢šB)0.=b¾›¦�mW¤�(¤ÞmÚX"¬uüzÝQ0S~«V}Rg/¢|®M'®%œŽi¦XÆm­Ç‘׳@fŠ(ÐgŠÞÀå46CDg¬*ë©þôù¼ö> È¼Ñ02g¸â<±þAšèpÔû5Y·äLq�ó AÖ×O>«ÞU•ócNcçÚ®>°s(¤Þž±¦ïmlÞ;oÁlɤÀ˜±Cs˜§õn`é¬&Ä5Ýæôo3èöÍ?È =PÈaSS?‡XrÉójHqË#�~Šd)»ixù‚'Ðö@Yq‚Û ÿ ‰÷@!5Íóça8 ºów¿ðù³‡ ´Å|gö ø>›BrêC�{ºZ–Õë³– Ó»=Ó%ÃÅ fäB1·n„@8œpzæy{ùµl«ñôŸäí(Ðv—·çO�׫:pÒ êèJo û}´…õ¼A 6ƒé“áÚî6Vj�IH¾UÐ/‘ëú-°Ûló9ÖCþ30äç$%@!½äÎÀC”·¯µõ}>ÓV’iñ@�¶;¦% Mù9S„xÆ/8+×Oz¼®¬îî4DÈ:ãa ¥8Ê€1ÜOÛÕÜ� ©·_:ý Ê^.˜BoÏl�R`ÌFÆy‘VúÜ� ­jßÕ;Hçu9á"Uèw‡�D Œ¹Âh«!�ÒJÿ€yñ@îSZ¡[�"í¦—�ó´‚Ç ´Å´‚ßC97‡%mDgÜNË3ûn¶’íóã“lfï�mw™}þnJ<·Ó ýîF«ÚÎ/Š¢{ï÷ú[þË=(\Ö8�¶˜7ÏB—lóBg¼{Ë;äÆs›¹Ñ§È‰†áíK€¾Ö³WÏŸç!Ãë­«�N Œ^4Õ) áúâI ©¸[Åý>é'³–n{²~@øzƒoƒ”áb¾7rÀ$´ÂyÂã„ÓÓ™_‚áBÃjcBQcŒ•ö¸×ËñÊV\¿§�t£fú$0ʬ†E+šfd3�ÛúQÜ×�ÍÖ´ÿ Lû¹x �~âÏ.éªÐ/ÒÍÛ¦%KžA @Û ƒF<Öý\À¹tÆS8ªߊu.æƘóõÆÌôÉ`”9 Y¶V6O˜yœpjúe„S¿�ß]ý5×|–t8¦ €m7LñXT›F:e�‘pê‹§Ô»ÂçenŠ© @Û #L<…›Ñ‚Oíì,Ÿï×zh´$Ýýyx�Jè'ЦôÄCuÝëw#—¥?Æ„Þ6=QhBÖÙ-­>V ï÷¦é“â(û�²®#žæ �Zg¼B_\¯�½;¾öNò h‹y[æ4_6iDg¬-\'³Csrû@ȃí0%R gÁBnÁIçÉrï'Èúò/]ÍfO¦©gˆ_«J90䞃`øM‘ÀõB '¤Æ ÝÑ— jÞŒ�è¶è ´ÝÓ/¶ƒ€@9ÂV1ÑUÚȸŽ~êç—¡?¾šÄq€h‹¹gÿrzC!¢/ε6.‚HhÐö›BD&Ä9’„ù苉šuµê—57žúœ@Û7œ?…îÇòZJ<ãËüB^ê=øÅÄŽŠ ©g0º¦R äLDS8á4 8!ÍRë~Yì+áÏŸ “©5ÚnSë+ßK`ÐØÚ<�q–È3Ÿ0÷Ë\¯Æ_й˜7>Ñœ@Û %›>„Ö…NØjgbJ_­’~‹p ÉM0¦N†‹ØÍÀẽëˆe&œÎ`kºúaË×5H@u¶áÉp” “~'›Nú'œžŽmE¾rê×G_GIY¢ÓÚ8¢3Ç”gv ¯?¤: Ü;K# @°‘DЕo»�$¾_–¸³/™�Û‘ã;«ÿ3°úç2N€Bº°ÄžŠÑ ¿º¸mÐ&<‡@�¶;v6 ý™Râ¯áÌñ¼ÔÏ¡.ó|\!LK¢æ¥J/Ö$Ç ´=PVH$9á<“@!5õN¡`ô[k“þ"b Ù`°÷稼ÇElpè:€ßq²i6 pÂé™R5}ýÒ¾?�èQì?Ëëþ‘’VÐI ¹ÓŠþ€ò@!õÌY¡i6‹9MÇF,+ä�mw¬Pþš{ÛM”xÆw¸t­Ääóúu%ŠñpŒÏêF90>ö‚I]^Èhûú �á�B*žSUe"æ¯×)wš©r8ñM÷<Õ¡ÊPÞUþqxÎ1TVükW]r`\ZÁ1Ì‹¶¯" Rq÷ƒ|L1j°}–Ï�€ùznªÏÎK_O¡~Àëy @ÅìåŒ!lŒˆ¾Ø€)·©³ÏoO0EKŽ_ô@�¶˜adžB7d#A‰g|š_.ãV¯Æœõf¤þ¦~àÝ�™å"Ÿ†ä_+ývÓ…T5õVýø]ÚsZg�•Éozçª^Ìb )Ö«³xöúC~¦«ˆ}ô²¸§hr3ß¶Ý’›×RÓ¸Ö¼F¯!Û^Ðæ(ƒÅu&p¨ ³Ùtó±épÂiìlî¸Ô+õ¨å0‡Œšwœ׎ÐWxKƒTeÛ×§ ©xÊq�¡7 .Å’§]9ŽÓãÚBŽÓÓ‹)¤Œs¯9æ¼ìýë&j¦+×ôDU¥Gs!å§%$!Ñÿ™ )�óÂ1 ÙJÿ€fõ@îƒÅÛr†e#jËÜwǯ¢)¦Ñ£Úî˜Æü)ô|6-”xÆ�¶lMn­Ë3‹Þ”Sfcz]:A™ùˆÓñ¸§hÊ(ß¶Å”Ñs•œ.©«Ÿc�¦á\à­�ÿ‰Þæ)Å ç,`á[|†šÅ¹D‰Ç’£ö@�¶;Ž: mº­J<ã œé/ëzî•�Ü�KKƒÚ’7ê¦Q ŒkK‘‡@’´•þì�Bªê=P¾æÑ¦Ú¸›…3Ð)ÝX’ñ]…ìã“-wt#ƒh Æä4ê6¹àÔ7ø�< zM]Ù�φ:�ß¡¦K†‹Ë<ÑnGr°þ©èpÂéù–�êÊ Ú­e=<"ÇNy @Û=;u¡îÊ£ÝÔ²GPfò¬Ó9A 0®3!…•’SmW<9åqBªí­nW?È¥Ga—»¢“·dgÔ�9{3X­ôè(^U túM#­yZ·s±�L� ´ÅLóšMc(ñŒ Î騾–àçy¬·V@Gy @Û•?̆…’NC_¨È­ðLU!ÆŠQœUF¼Ø¯øçË@(âÅÃÚn‰——ÝMh¾ÎÙÊ:¢,¡³qeìÔkéÑ×9dFÐlœLÝ{g»b*¤þ÷ãpÂé™Ó}_Ó�¥˜†¹ÿ„×ð@�¶;f#ªÚ5½ãuÕϹ?}'¾m{Âbê¡H¯ßx*AÎA‘ôŠ ´ÅôŠ_®)=Ì9,i_œ»œE·×»Çç¡;SV’ìð@�¶˜ì`žBc6—ϸ«¬Ðéwr¦¯�k€h{²¸§Ê3k½kvšº×§o8ñH�03þÓÅU;T*Ÿ¹¿çݽ—±iJ`!íŽþ*aÅ@– ^Ü·Å´UNH5oÎóQ&ÔB |N·Ö+C/çœI"ÈÚ("(‡€´õCtEzTäiº¹ÞºèŽŽ9â¸(h‹¹(ï±s ºb¢3Ö¯w“²³ÅçõzÏxD¡4%R ç‹c¸•þ!æ�Ü;⊪K�»ñ¬Lb5Âû=–—"'ŠW+ýfÌ…Tµ1½h»b*Æzâs9¾´`ž) ´ÝÌ&a Y%È‚*q.•Ó;öö醢÷�4–ý'Zv[+)N8/áo§¿Ì©‡Ç—!äѲ›B)0.4 ›HyÕ¶+žWõ8!Õ~±šÝ¾×œa*[m½;àæéJ[@)0>à†ÜgÆjº®xV€Bê�‘ˆÝ¾U/»LÃS#ŠD @[L":wI`Ð5Û´�q~Þ§už¡ëôÒ-��ç]±$µ@�¶˜ÚcžBëoÈç\I§ŸtÓý6wg 5 ¿qM‡ Ö,Ðxs$¡ë‰&G½í{sÓ­ë‘átgŸ37h»57Wª“À ] Çã6Ï“é+ D½,¨¡tû`>îe3¡ˆ–ÍÆ(†U”ÀL¦t° ’ Æ—wM·\ðöÕ½7O¿PÈALØnïõ&Ó××Û8þÕÃÄ7ݰ¯ùCèwl½Â)æ“9 0;ýi½J)Kí(•rÌ'Úbæ³�ÕsDy­¥.�uè_÷òS]ù¶G ̯™N£C�¬×A Œˆ¦D?h¥À°Ð9UdT�tžŠ �ªzgdf·-õû‰óøÜÝ @�¶w,èk¦R:F›)¢/Î˶GÅÁbvK¯…½ùõ‰O \M¡ 'ÐvGÞfF›Ô€9«ôŸ1²:ôcsá;GÉN í–”½þ¨ŠÀ ó9×LÚçÉ2ÖQç¢öççÞ8Öpm1ë˜?ð\3©l—¦„c· •�XŠqzq}á@�¶‘x =  #žu§ƒ~5eš·§™òB°î§ïqœ‹ IÉV8Ï»zõ~9áÙé/ìÕJ÷Ó™1q„'ÚnOâ)tq6/ŒxÊ_¶AÔ²¿ª™��ˆµ&`2«B90¤2ZÔ(±Èçú⫃RñŒþìÖZˆ.BÖÓ¬Pô'àÚÞП¯!Êý9¾»Í0yýÙRþ è…-ÝÎ_�rè=Ü“ª·ë'ûOèa ´Åô0óº]F<åÃS‚Qwc=T8¯g¼ÀŒh‹ Fæ)t¾6.ŒxÒ“ç…ð:§y‡ñ`.YGó^ÅícHB¢×1…R`X ]ð¥N:O´PHUýŠÕqÖ xêÏÙ„z\7{Ìãë×~0\ ,÷—mOøKRm?FùK�k9xyßv·–¿_L§†€½-þã`jënÐôI�BúT¿¹z=‘Zp öµ9°ó¦Q ‹s¡ÓJÝIç+RÕ®½£[»êXû]ýFÄ#oÃ’áÂ’\Ìí{QÓfd‚~%iú@�h‹U¸”1òÇËn˜Ž²b™!¦Ÿ ´Âˆ2`È2FЗo{ ,¢ŒÑÎ_Åð¸p1ÜÕ0^¶¯,îêíÇ5d±1N1[üÖoƒˆÇ™ϼ_»¡éú$Œ² +Þ-k —×~>*$+@�¶˜gžªá€®¾µ˜íõå%)ñmÛ#–Sóݲؙâ­ÿ>èUŠ™÷8ñM�@õFM6$Œp.[&;.<ÍÇMhX4çb:¤@ÎÅ…l½“ÎSïäÞ¨÷Ô"©^"ì'ÅÏ{#«£µ}]+¬P õæÓf)Å…µP4Å)óíºâ™o ©7þÁÌ`¿?†úlkIm€2PTxõÙÏd»^hpÂiìGXänéìœì>?9 ég ´Åô³K™Rº›.¢+ÎocÔ°Çݼ›ý,Ѓ>£ØqÀ ´Åì¸[D9üŽY ¢+Ò‡ÁÜ•@G?7<‹~T€g¦(Ð3ÓÌShôm (ñŒñTkyv­Æirîm}ÈWX|Oti�BªíK¿®¼QvóöÝ)õ¢«ö  ˜ºÚÞÕE^DŽ©p)&yëêÉÿÓ�ù¶G ,.ÖjKµœqf®Œ�.Á4ÊpQÁ>r/.úóÕ×]µœpJg5›~ŸwýÜgiÙ¾ç§)Êk6h»­ÙÜÖ#Ê;UQ$ÌçóDAamw%‰«_-.¸ŸÍ÷Mkèûðµ«>90:`�¡wÒ^:íÝ(¤ªÝõ:b Ñq›BùP1@V)=Íú˳â—z=IF(ÐF˜§À9Ú Ò)Gû¾6S:µ8/ëóã8Tm�mqmÆÛšƒÎцˆèŒó´à±zó²Kwž¦ôôަR ŒÎ.D®6)ù®èú…Ô|h§Vµø ò¿¢zx#£d<›÷¡® ã{¢Ë7Rm¿´s?×ïš|+O:îσ2œƒÄ²> óÛ¿ý÷èlTŠŒíNqÑ/GêS®4yú"z[NÓ÷5¤"c¯‰Ñ4–]y¤�D qmw5¤Ë¥ 㛤¼+*$ÊjH¥§Mç³8ÈþY’`jHh»;‘?…^ÚF…ϸ|¿»—ÊåÎ˼��”çæÑIšJ)0:dyÜ÷…ß]‰@ �j'Ô2é)Ãy·gù‘¡þ(Ðvw! �¢Í%žñ° Ù_ºõüVý áÉ<1l?Úb¾ßoòƒnщèŒó±íb.Ã9«5;¿üΤxÉÎaØë¸jõü¨ò�ç7'‚ÁKšF�LyÜì<ÅП­q9’Bî@… ´=a8B9y~K ‰Î¸¢ÇÄ�õ»cõîÊîÈÂ8&ÞÚÞ1ñ§BÅXÕ«¤Ëšç0JÀ9© åÀøPA4ÁдÒ?ˆ„k4]öÁñ»r²€ã�m�@÷Æ6S”x&Àp{üG×}×[¤kxX]·+™> L|Ó#�Dù/VB×\`QGºF„CwÒuxª¡qçü$¨øHƒs¤yýªíèƒú• ©5Tùêo,‹OÉx®Á»ÄsÆ`|°ýkV™i{ú 2ã�Bª�WfÊ&ÐÏ=.ûø=eG¢2ãQm/ 7øûçÑAŸÙ÷û^?Ív5ëZ/„z€�ÿØyK2\| }F^)jºú PäpÂií½“~eF�’÷Ûéùñ€ƒw;ç%ÀøðBäà¾Ò çë2'¤¢~¥¤<²ƒ Vâ©çyàÔ�—Å=EjˆÄ·m�@˜»%£¯7 \X«÷¦ÞJ Œkõè7`–Òw@:Ȧ‰xyŽ[Ê‹UíëP¬ò@!ÇÒÑ{õ^Éâk*áõïó3ð>6m)0>Ϲ2¨!µÂùŠ™Ç ©¨sMý\óýtöYD‚ÞÚ ¤ÀøúÓ¼ÓöõA!Æ…Tð�n-¯¼´}}Pyñ@!‡½Å‹¾äËê™Æóf®æá`â›( –Pò�´Ž>÷2å™Í¾u´,¯‹W(÷ÀaÄiÀ°§=‚Î|Û#Ö\¡¨ª³^N;Šg<¼g² Ëpñôrnxý±.d3F¼8Wd¢ÊGÍðÕ#n(a A©£õòµâ¿Ç“›#k$(Ðö„yOŸ#  °eDôD'©³ßŠÑ+mß�×ÔPÎpmwÎþÐ%º,Þ±Zú¦`Âô‚‡-@õwú$’íÚ(ÊŸ®èê-YW€;]áC›˜÷¨à€FFÎ�çªCÍÎ,MþÆLõ/¯ªµïÌVÕ!j3®/¾6@!O‹ÛZc•îüRU�hAÒ6ZÀösùr5�ßôDQa¬dóÃgâ.çõƒN�ÏÅÂ÷¦^¬† ƒ~,÷´m)0¬|ƒ0&¼jûú ¼ò@!ÏNqÀ[°Ç8‚×÷m�@\ð±•\G‹­“ž¨<ë{_—£ÍÙ½Gáщ (ô‘L®}±¼³ý¦½,Ìg1�zí �¸§Ø:a(¾m{Âò:¡|²N(a¦Ñ­ße¶Ø¯[O»ç% Š´õ’ÃóAHš ]_|¡€B*vg´ß>Éýacý� (m”R`x`"ˆN³b¡ëŠ/PH½=m\¢ÈêaõSaÇïmü) ðÕ6H)0[~>[æ¾ì0K@Ô«Å4wŽfL�EózÜ™žéø^‡µüå?Ëþ‘#ÐöDsO!�fé %žaã¨Z•²Yc_~³M«'Ðö@YÞ!o¶©ï{]g‚'‚üT}r`|Ö'4�uÚ¾>ˆu|,tqœ¹îȵÙv'^š#îÒ*£{m¾Ê@!ÇЇ^%”«ÑQ±èÇI08‚⃼“Kpá  ³²§ë‰/{PHµßÖ P¡µä¯ÓAZ5F�h{xI¸Ë†yg=ï}7D´˜•‡É³“i‚¬,:œø¦G *¼Õc+þlª°þIçùS(D˜R)0<†D$\i«íïƒÒ– ©¼ ^}Ifš5Ò-Ni>îd!K9'ÐödL|ŠA7iGtÆù\o¥§é0šsXM@Ûkú¼G…S+ž×L.}P3iPÂèë‹n£®¨b_—S$þ‹k“ÃáùFм•þAQÀ…Tõâ¦2{jæ·ã—ðÁ™oømD2\|ä�H^ hºú àpÂiÝÚšÔ”—P«¯L�^øù¼óƒqѹ/K íH8܉‡q³Ÿ“”n÷§½Ë�ñ‰/ŒS•>ûñk慨éø¶þ�Ý¢ãݲœ²ß� ѺœŸ�˱‘I�Bú¯¼LSút…íeQ¬W¦ñ@�¶G ƒf2ƒâºA¢ ªˆtåš�(ê!¤flHá ͓׆Ƶæ\¯ °µ!h{ˆó:ízøà¼Ž ¹¸ºËÄ+¸xÉv5ñâDä•×ÍÊøk†\LçYíäÊf'¾éˆ‚¹J9Ùèä=qQØ•Á™,øÚÖ篥à(� TL—Ÿ$€ '­Sµ=ñu*�Rë¼N5ö3—â ;‹oÈB• ´=aPãÌ!è�mÒˆ¾8WïwXZ]¤ÊËÿwXÎB{œ@Û½…~Ùç±³°LÝ3€‚ÓÞðÚ¥Àø8Zñœóoûú€ô÷@!Ïiÿ¡–Õ‹Á{'ih{Â0öI!`‚m]QæÜí´’’VºÓa@. }Óæ=*8M€u�œño{a�Fß‹¿V5ÅÌ.§îp¬Á^“ k@žsëmO<·îqÂiíW̬Ki^‹üÃ4àiïl€R`|¢}JÎi·}}@k{ �Š{ËÓ÷v@L¿|g3�õý~û4¦[Šg~ŽRŒkõ^˜OCÛ?˜ ÷+Ǥ›>).þMÀÊçJÓ ðm9M9Ö¨¼÷õÜÉú{ @Û#†«'�üB9Tb‰¨¢ï…å§<‚>õ€]q‹þuÁ1¤Bœ¤`:\<áá`?@Y†Ó’`=߇¦R ŒëùQ<‚ÕŒVúeRÕ‹#íÊÎ×ÝWþ\æ0(?‡ ûË¥,90>Uà…qOÑõûH|Ûö„¥•¡2ªÃnÌñƒ\¦2äQm�@þµƒÿAè�BÎdw½ñƒxŒðÎ}”¾<.úlèì÷Ó|š0>(#9œø¦G * •Ûy #ejFƒÛQÒ7ÀÈÓ4Êßœ‹b!»©÷Í”x¡¨²y �j{·¡�VëW6æÓù:„ Q†ßôDqÁ «ùsbT"©˜ý«;.žÛœ¨˜x”@ÛÃK‚{c’ç1À²�Éz!â4X'“^@YVö¤¿sx€—þxiS&ƧQÐågÕ›¶'¾zãqBjý¶zÓz_QuÒUo�h{ ,Œ0Rzj[ByW”Ó[\+†VŸ.éÏöQqÍáÄ7=QèÍSÆ 64yW\ ’׺±�jjÏc\qÍÚ�0¬Ëæ°þ6DD_”'I‹#kɦÍW¦íÌõ¸âÚ�°¤Qª­^É=é«}P‹ð@�¶G ô:ÛWáËúöЈâ›W �ÃÃ*á0‚µwÒy7@!U}ŽÊ¹’Ó±D` ‡˜Ρ8WÑé/X‹ÅïÎÓùx<ÅûS(ÃŧSПäe¬¦«ªX'œÖ­9\÷½ÖÙ§bn�ðÏ„øºƒ-¢ Á"†óëºÖ÷Oe¹-cˆ)ûa:’þËIVL@X>H®+~�(¤Þïª~ðlÕ/xsßö„¥%÷Þ|E €B®´´¢´î›†%¾™Ÿ„.UQ @Û#v�1âqˆ¶lùÝP‘›‹8Ö½>Zc™³Ø Çy|tc¥Àø8†JiyËõÅ—·(¤âÞËëy^MÔÊð?¹¢ö0�¯?Ô1JaáQš ”�‡6ZÙü '�NM¢P¢jk2¢÷¼ïÇ,1…À ´=YÁ$¥Á$¼½Í„R#ܨB¼Æ¢g92.°M Jz‘m%âæý¼f�+(P íC.*…@ŒccDtEÅKîØˆ ú¯ë�89êÔ(†‡Gowq¹†º•-lÂS5°¬žã^›/éPÈ1L ;úJã.e<«oD]ÇãÄ7=Q­‹ÏžÆ@â$V³^¸ $­¢¨åª¯äÇÕƒ\€m�@DÑ9]÷éPÓ¾¸8 ;4²®£†àóTRäý°@Ì©À ´=YÜSe:3ÁvaÛ™í0â±ÂÚª,_ÌY·zÛ<—ìÿy 5 ‹9 ŒS•­³ýâ;rª²u¶è]Û#F–µÖ­’0eú·óK5TY pm”…;§$«BÖMfñ+`R\t„'Ü^>~u¢Ùè`Âi\#“�#†½¦S>þTí¬|±a,gú«” �Ç^K4Ö×Û¸†ï5Š:Ê›‘ŒêýŸ‹&AEçu¼ ´êd%ûqM�@R^„\Kò®"Ê ÷_p5H�ßôD½�;Ûá§ÃNj"»ö^�\wŒ&M�ü�¹È4-õ­[= V¢Éáù³#ªÖ@�¶G ¬�¬ôqˆmmxˆn¨8ÙÇx£r×38p˜ÂIS(†§‰‚Ø4+@º®è$à„T ˆ¬ó¦‡¾‹½��šÈ` €mq ò¬ÚT‰¦Uµâå¡ådêÛØág;˜V)PÈ@$­‹j_ýðuýÄUœ@Ûe�ÇHÍ:ÒÌ}åî€+Êuí"ëZÏpԳǷLád†÷–:¤¸ð`ú–´þçºâëRoq”n¨Ç'º'äÏŠ€!¶AJ�áa‘Àª'%I×]’œ�Z¿«L¬kÝÆ×ã"Tepm”þ#E ¶ÉÊ{¢,zSØZ×ÉlùÚë0-?Óbê¤Àð¬H`§ÒÊ�닯ÜPHÅÓÃë\Æu·Ý¼;Œ: @�¶G Œ{ªØá2”ÆšwO&‡“Å/‹zˆ,DD²›¦J"Ëúu™õèì¨Öpe ´=îÊ×+L š~[,DgœÑëUó\Lçqž?‘–Ö4ÊpщŒÀhge×]œpJ;“\Ü®òŽ8 ?¬ó\Ó¸n¹ì¬ž}ð²ˆó!ÂÁ®\Ó#…&y­ÕÑ«\8þ¯n ¥ÀðøC0Ži%ËõÅW²(¤âoj#ëRö¤ÃÁ´0¥ßô$áòI!ËXŸwÅÅEYYdÕÛõÿ|Þ¿J–E(Ðö„áŠÎ1=Ø�q¡ð͉D×Jý&Å—šèS}½údú^B>�æÉ€¿Ç…'!L1Ðmw<íqÂi|ïT�˼œæ€—²AÊpᙃÀãe”xÛψ{œpJ_¬bêi€Aµ€5wP›­ú6ýx¡BI¢pm·DkãÃr :§sí¤�qžîѪ#ª¼×2�WæˆVÀ ´Ý­�Ë à/ÏRJÖãyÁctZz­_§8R98mÞé4Ð 0×–¿Ûush”ã¸F„hmW|ŒæqògT›>–€ïËmD¸z…˜]ˆ¶lE«‚ŠÜüK Dݘ>Da‰Œ”Æ]�P¢†M‘PòÅ÷i±/äè÷Žž*¤¸°úîEÇÚŽès F½k^gò/ÀÖ™ðÅ}Û#�EÔ™Ö¹þò¢¾ÔYCaêL€h{ ¬÷aó8ÖÏîé1ÑyäÃfh» ››•“BpQØJλ¢ÖWw¹þ%IŒÎmpò ýë4Õ�.¦°?.™Åc ›.)0<&„Õi%ÐõÅW(¤â>lžëçÖk¬y¤ùp8¢O¥žNBÙ¬çºâ+pR路΃žF™5ƒ;¢f®@�¶G ãøÔ‚b!ËâxÂôrU±´ª¢÷&ÏŠy~gž¬ªP íswFô¶°‰®8Çr1FÓn1I‰‘ŽÃ'Pr‡-m3–Ú{`Ò¢“닯:PHÅó:F[Âù Žá�m�@ÁÕOk�mõ‡ñ$Š«÷8�¶7\ýeŒr Ú=[IDgœõ<™Þ�§öª¤"ë²éhùL¥žÌh^?hûú ~à�B*žÚìa²Øjê�„ƒ4Ù'¾)6ØÄC%º«oÝ^ïÍ ÇS ^¦ë9†=1�}ù¶ʺ^ñ±– ­Úó²Ú�Ø *€c²ùI�áA…ÀËy~%Ói ‹ëó÷¦ªâÔ¾=_qò8!GòêRÍ[ŠZÎüN)€c²K�á1…ÀË¥µ¦¶+¾ÖäqBª�œ–j¸¦nÔ aùƒ'Ðö@Y>�žê¯£*à´šp&ÀûmÓ'Æg0ðî=}LÓÍ&æïNeüyÉ©}÷JN(ä@ú5Ô)‹v�dàì„mlÎ2\xx£¤¼êÔöÄ—�(„9œpZ§u‚~¶ës÷×quh‹ys†/½u*§$ßÏJAˆ;˜ø¦˜‡[-RºÌsŒ’¾(ç œâü½ ꑦ“h‡C ÞE™:.<¤€Þ.­´ñõ�N鮹ˆ@ÝÜR§pTÁ›ßs|`|Vmyº¶}@»z �Z¿%^‹ßÓ@Emog£C¯(ÐvK¼^}XAopräi_œki#¡£kð¿ŽÃi´ðh€3¾glŸàâ“`Ès¸íêØ…Ô;-õŒ}~=š­Á7(i�4† �ŠEˆY7¬yê;ýièõ'¢XÔ_fW6²¸ƒçÔäÀ¸8è…¡GO!tñûòm�@÷0%6*”t‚uÉèæa3·;tgÝŸ¤›=P ížn~_lWÄ•AäÖå᥮éVúè�l7ïϹ³·¤¼ÞL­‡§‡î¸ƒŽ%å=P í–”÷ùh‚A§x&¤igœ‡m=•þZVítÿª,@5Î[ü“5L€q5ÝG΀·}}À€{ �Šç ø0Ô¯æé�j‹H2à(ÐvË€¿?êW„tê“ú^¦Žúy @Û#Æ=åü³­J6áéÁÔ/ûlÜhI›Ö\àÚn]ÄåÇÉëP?¿tùâvP$õÖ߆$ÆERt%o)ï¶›(oRç·tnQZ�Õ¼×Ëø? s=P í–Îm�qŠAÃoÓEtÆy—ÈôûwõfÏ��õQÏÔÚŠÎpqyYߌÐm:ú€Ïu8átN©Ê(=²lÛù[’«ô@�¶{¶òê«r :!›1¢3Σ¥|e¿˜/YŸw[s|¥Ç ´Ýó•2%‡ S´!"úâ<¬ó�9¥ˆNÑ4"¸HÖÖu_oš/ã=?##Wí6“´özvøP"ÆÕQ/,,·Âù’±ÇqoÈ)J×A£7lÛ�0î)$§m2(ñ ÓÍpƽ2¼å�÷'©EqÆ&¾ég|nš<ÂE Ú0aµžž®û4+Ù`Ôb{8s.ºÄ6}ýöA Qæ'ç…a´˜2)0® c”3üm_Pü(¤âIl³¨}žš`‚Šm'ÐvÛ\Â?SÖáX}Ióͪ³¨„ì…qOÑêH|Ûö„Å�~°¸þ5,dñÃÚ�0 ir D˜¶tˆ¾¨h¾^£¯úA„î EjbšF)0®Rc¼š–@Ú®>(�x �z»uT–�~MQOI?x‚2µ�0Í¥f¸°L�ÁjV‘iûá+2'œÎwQ6ã¬ùÎÃyÙ6–;½Ñµ¡I�q½-xRi;bk %¤Êסñöj)Q̤{¸ìeû*�Õ64)P íŽùÎ�&«ù TÂÿv¾+ KÖòd߇Ì7Z[S)Æ`4Ý9×ßöõ×ï�B*îÍr7™Mzj±2í­›�R Œ+Óh*s¿íëÂß…T<#ü»¡†¶ë8)òÂßÚ�0tï9­®MÑgÂCõ²ïúh±vÏjAlJ - ¶�mÎhw-Hͺ¡Ì75©©Ú0Ÿ™!‹Óh{¸§�Á¯c@‰§Ê)Ó¯ã]­ÓóçÅÑïqâ›�(\#¹cà °!¢<"3›Ý×õ¾ñü%ÐìŸë6{yÎ…´²&m»™Ó1äâѾž¹Þ[X\FS�ÖšžøÊƒƒ ¥rÊbëØÔfêï‚u(€m‹M`Ðÿœ|SÚçÌ2{ÙÇú(½òM9€m¿Æc«�®~§d;é[ŽÇ @[Ìcƒ¯J1èmÚˆÎX»Ô ®/¿oźð²vhîl ª90, ƒ°Ði9é¼Ó ÷Ž9ƒ z³nøÂmÛ ‰{èsnòúå´úµÝeiVð�¦PŠ Ôèk3RÙõD“Ê€Rkà(;­{¿œçg jî<€ P kæàLÞqÜ®žã �;·¥˜©^°v~wÊÓÀŸ£ó•§Ú9¥)]O4M 8á´NiJ5.5(†ƒ7¥hJ ´ÝÓ”¯åœ#0‚8�bÚŽd,¥þ2Z#I½Èk9*M @�¶{¢òÂõŒ l�ˆÎ¸pÒ‹¥þœt[Ï;¦á'>Aœ½Ç…¿ð ¢ù@Ùµí‰/×zœpJ¿#s—m²cßzsס EæP í–ÌmœFŽAlÓEtÆt—|éõ­eÇ‧9´¦%~˜Žã?“nâ3"K�aõ„ÎÃõÅ{ ©xZ�„×` ’Áûû¶G Ó°m4S‘ñÂè«l%e¸°ø½×N#ôGÒ¿*ü8WAHiùöÅyVÞã„Cç];ý]ÖÞ0†ü4úq›­Öƒ  eä]_<#@!OÙæ¥øËzþ»„ïǵÈÛ @�¶[¶¹õø)£ ›8¢3.Tq¹âºë5'ó´lg¼§²¼ë´­–âÂãV�ÆãcN8@€Bjš2ñ˺ÖР„*g~È‘ñh‹)ù«=LÇ�Â&‰è‡�OÀ¶.ópØð³0Ie ´ÝåçVZ³‘¯¯ŽCUÒÛZS'Å…EI´Û— Ê•/ÏìV .Ùîó’"ê­ê„uÀ°u‚ 3ßö„¥u7t�pBÎêû:ÁR¢Üi2GtœÀgêh{ÜÖ ®ajŽAÏh šèŒs³)5¿ƒ NWOž®Gi‡¢æ(ÐvOÍ_hŽAgm£DtÆy~ï@S6Ý’iDШœ�K¹ùe­¿~-~U€çæ(ÐsóWï•>ŽNÒˆè‡ó¸~€rë…\¼ÙkÂìqÄ~F�/K½�²™Ž»ê9‚pm1A~ýt@+lY|Þeнq,k]Ï¿¬®«¡‚6mÞ£‚j`ÍS¢¾í†åé=J}[JSSµéJ[Ö ª¹`xm`R`XÍ ¬xÂúºžxÖ€Bª�r¬Ë2i ·iöÿÅ3¬&®åרÕe©¿ú-–j>~†È±«€h‹ÙUæ)4ú¶f(ñŒñ”a½¹n�)$a¯˜>,,6á¶K9Õ¶'žRõ8á”nw”Þë8+»¸ß7ÃJ°’çð$À°ÔPœÞ�Ubyb=szäS§ù,X½ÊÝ9.¦S�¬|„ÚŽ>!Rë”w¯@Sàðê®éžGíº7§©]À ¹ÎòR£*µâ̼N°ä%ÚîÉË‹�È!è�Îp0í‹sn)Q¸Ìk]ˆú%€ÃLsD!Ún‰Âë1pã�¤�Ñão!†_í¬Ê6÷¶Ce¼ä©Ï{\T nÆ£ºŽhpÂ)íŒPõ¹zíî2zà�llÞƒÂ2%º¹wÌåµ ž¶lQÂhêÝzj7‘–¬ºö–£8½Í™*Uÿº£ J`nmŠ2\TP ,÷{.ÕuCs©€Neï²ÊðU“Yvž„lÿ“PM€a5)ð$)?çúâù9 ©xJ†-eÇÔÓ®Åx~‹#Ã(ÐvK†½–Q@od³FôŶŒœÓ®F]²ç·~InÎãÄ7qÌ\ AóPÖçJÀ,nߣÎi¿-tµÆ×ŒbŠ «\ÞŒ¿% Û>> =PH…ýÐ £} ïuL ^úѵdýúJLs\\ïr²Â`¿•Í;-�RÏ·5.§0]â ^´iz¢0�V;RûªSA= ¼‘ N J�kË8Ó¶§HSRí”6�ý)î¬ äz8âÔãÚîÉÓË”¥ô�6eDWœ£müÕToœ›õF‹>ä7Ñ/š:.¬n>6ås›ž> sN8¥½·šFû½Ü´œ1 üŽÀûEŸþŒ ò±øë‡Vø¿ðð@¡5EêsêÍ{ ó÷v(Áq¦(ÐvÏ™6~;Å #´¹!:ã¼jF㎕ƪFdû€Æõ0�¶[÷¥L @“feÞe}¤>®¶×úý4`Xq{ÖôIqq]öÊxµ=}Àxy �j{c3.º ˆí�L?£ò[ØÆ(r†$>ÖÒJÿ 0ì�BªšÓnã\‘­Dg­š¡ÝÑ”I�q�lÊG¶]ñ|¤Ç ©¶óWÃl‡ùŠûz¤ ÁÙð¼å"ði9-ÚvÂÒ¢%ŒºnLRÇ‚ô^Õ†pHSè rÑœšê‹¼?:ç)ÆÕ"tn9Øöõè�B*ž1]e\Õ‚¯ýñI–èr8ñM÷4×uÊ2:¢“ÊÎzâœÚ{Úmèíß²ŸA"i7�h»§Ý®>"…€3²Ñ!º¢ÛÕGô%ÒPÃ:‚bÁÊ›ÚS—÷¸°`…V;§Ûžx Ðã„ÓÚÃý»^fVLíq` ëDÞèš5L�q�-xNŵ}}@Åy �Šûµ„tƒnÉ2úgEˆgXl�R\Lüƒ‘ÊØ¸¶£è8Rkï1úù{ÐóFº>÷˜j÷ÖÅF(Ã…T;ªœ l{â B�N뜎ë‹Ïûªßj?~aL²q'¾)æâ.61}�‹ÍUÞ k¨�.êÛ„ÃtVBHžÉÚîy¦«ÙÉ1hOlXˆÎ8ã”R_½F!º‡ÓrÜ—Ç ´Ý³_�L1hQlŒˆÎXó„ÔHKj}À©x @Û¯r*ݦ¿ý-^n<ó>’Sñ@�¶{Nåj�s š6c‰Î8;ùŽSéj‘´^z̧âqm1§Â<¦Õƃ’N˜éŒI)¢º�­ éq?Ǥxœ@Û/0)Ýü½ª¹*‰ì¹~9&ÅÚn™”Æç4ý6_Dgœiƒ.ýÈÁüuýé °ÿÞÌš>.¬ ÅN™�¶#žÜñ8á”NK³~{k4»i÷Ž’% ´=a论ái¸ ¼ 0•R çˆü¬oÑÏ{Il+;rùø$õúE¸§X,ïÚ~•k§àÌ…œÏŒâQJOO)”—>`xL|Áï¤ÏcÔ`«8@ò“œ]Wª9§·Ùu’ÓãÚ(«q]éÓ3Øàä½PáGÆ}ÍeôW½¡¬´ã%Å}N íŽûz�¡Ì>TsCtDE"¯‰Ò�yn:–ë~² XñÁƒé’ãâH‰Aæ¤ó| …T5#àÔÃÖÐdíí Æ,@�¶{îâÉ  6SDg\âüƒú”Mo[Y§Ó€ÿï ­)”ÁBúLvJºŽh:pÂ)í 2árÑÔž”újÎn§„à¼Õ\¬ós£Q„ Ç‰oº'—ë¢Î hqm„ò®8ëý†€ÓN†z)Íþ½ŒçØäàÚn8â)´pçxäâ)s™p³þÀW�AéÇ|?!à(ÐFp­®�ÑgÂÛ°tÞÊzR ²Ÿ7Èó6Åò‡ ÿ�}J)Á¶+žô8á´öû\Ç«V&sCü{‹b”âBâ­SJĹ®x"€Bê}‰Â¶ÙLùù½X¨B€M±ÑI`Q"²NȦµ¢iÎÄR2%™æ­ ¶š’áäP8ŽÉãÄ7Ý3LWv C e³ÙÉ{⬤76}µOêÿ�ÃjP€ð»ÖôIqa-@ÂÀ¹Žx €Âj=o]uìã>�Ì*T€¿²AI�aõ! ÃRšËõÅÓ\äÞØgÁ%ìѳ³~mꨡ@=ŒY¤ÖCËø–AqýÐ à„Ôùa1¯Ûwý¹â|‚9ÂÂãÄ7Å„ñXW›B6c¨†¢øRýó¦Ÿ*Û? ((ÐvKR4Ù”~ßAß¡ôp¦;¾âí½ PŠ ‹!è;Þ±&®ž5 �*;sS ½. ~^æL˜}åì«�O K�±N ×ÏXPHÅ]Ø§ìÆ¢6 <9!� ÆÄ)ÃE r`—RÅõDS(€NkØe}u"úkëmŒIdoál€R\H"GÖØ'œ§M(¤¦õv�ëæê4V®¿놘?;gÃ’C90šs⺢™À ©öÕzöaVÊE‡t]�Ïj�´Ú(Ú‚À é­*1�qv<¥-Êö5{õä”IÚ€m÷´ÅeŒR^#¢+Ί'<ʼÌJÝÍz�Éö�8�¶{å5>)Í®�ÑgÃ]*ªç…õP íž|º.èƒÆ×fŒèŒ³äùT¿Þí©÷ÜKˆãž°›ëì%×KDL8uSÞ§X)-_#×kEó>€h»ã}Ú½•AÐèÚTå]QöÛsóP­Sø!¦ßÁÊ™: ,$߃™QMO< å`B©ìùÓü¹~鿀cööÄ'Å…3Ú¦”€r]ñ …ÔÛo°âÖ=PÖÜ‘ñzê¶rÕ(ÅE¬vh€’q²iÒ pÂé™ó=ÓöÝëW/ô¹Oè‡ßtOö¼g3J ¦îv_Ÿ‰:Gf8œø¦7TÆeÅd´µ¶bòž8»íâÁ©ÞL1++³Æ<³3&¦M† If0K§Òtó¥âpÂiœÓ¨W«ÌúmÈ~ø„Àð@�¶{ãj�s 6›-¢3ÎJ‚ýª5xÞÜŠt3˜Ó(Ãq¦� yšž>àxN8¥s.cªG‹û�ô öd† ´ÝÓûuç°¼6eD_”÷± t×ùñî,¯é“âbþ¬xÎ÷´]}À÷x �z狆ëõü2˱x @Û=Çr Us ˜áªÓeÒ]Ž<.ÕœëÇI÷á†ÿö†ØJ�1ŽV=¡}ÚŽ>à}&çZÆúE“²?§ãƒ‚,Ùâ�mw4uþšÞs\ñŒo#×q¨·ª™ogowMŸ 3ÎhÃsž¥éêžÅá„ÓÚ§îcýÒ׬·bmó ëìÍœ�P Œig´™õÓöDS?&¤Òn«—üUï½[í³%Èïz‹Ruy É]´L9ísé†ç|�ÊzK3”ô˜ÀøŒ$‘Kõ&ÄF%Æljd��ÿh¥@ðx �ªfüAY‰j­æ¡;�:rü�Ç ´ÝóWS“cÀˆØ4}Q)#4†Q´Y¸Èó$¾éŽÍx Ëû§ÑpØ d}0È'¡eìÔø¬S=üó¦Ív5URTLšº�Ÿ“mG�(¤Ö)‰Q–¤^߯WÚöÛ$†Ç ´Ýñ¬ùSh@l–(ñŒ5Êy‚¾ÚêyÓw-ð'Ðökᜤ¡~+oÓ_—Í7Ô­·l¦P Œ©[4“)Ðvõà�Bêí]'&Ô}o®fOJ‰ÌÄ=P í>¿¬ä‚À¦�è‹ó&. ÕE§¿‰.‚�:.’·ÎÌU…r\ÌÝ‚ÉL¸Š¶ž«ð8!uι�²•Հ錇énÀÚî¹�k�šcÐØœ�q~å=?ÐÍõd«zy‚À£Úî(‚§UÌGãb#CôÃYªœ(è¦zßø¤‡ÈÆOˆh‹‰gƒrš;$¢/ÎvæYº^L¿\ A.Iw0ñM÷)úu€ž´#ÊL¹ð°J½k™‹¥ºa½]1m2\L¢�zÏ4ÝðÄ�ƒ §°K§RëeOëz~¶Ü“�Þ¤¨2*`Ñ2¥$†ë…$1%Œ¾`r|Ö­"ôSÜÓ8ž§–¹t€m÷éúkxZ·s®Ò¾8SÙ„Õ}¨ozÃS:Sbêd°˜¦«”&ëmO|²îqÂ)킞i¯lÔ¬—¿™šÒí`ž •` 2êÀõÃrNe°:ƒí¾i=φGû؆'†a`’„ÝõÄ'ìRmŸæø¬w*!S­v÷ëqo9™.P í†Û$žBûfóĈ§ŒešµO{§÷¡ÎÛ¼ß%³v ´ÝgíÓ3m»•“÷Yø—Þ¨ÔAÊq!q‰*Ë�]O|† @!Õ¾F<Ó¶Öê±ÞÝrüÂËs…`Wl|2\D&*K×]Gtº8á”N“Ñi›Í:”µgŸw%“Q ´1É(A;gSFôÅÍç3ÅL­QKÊÛx|»Ù1ØÒ¦T ¹±À:¼Ë’›NøÙÁ„Ò6KFõæÖº×á¸2œLF(ÐF%£M‹MÑg§\4m]ýÌ›îÞ}Ši1ØÏ¦R y±À8dI²ëŠÎ’'¤ÚIž<­Û÷¤?!*Þ|ø<pm÷yòkÆrÚ»:cLWœñ<÷Ùå«HÓZ�ܼ•á<ª{ÀÕ¹]mJ¥°�¬‘&ð®'>‡ �jg™ªréu¿ÎÝQ§äU�ßtÃèå¡¥³9"„SV³�8ÔN-Íù>OÍÁ6uXDͶà}ÚÞöÂfí%”ºiŽ<é}ÑzYê2œ/PI2àÚnÓäK$–CжÙLå]QfÒ%;Ó²[¡w¾o(1Ø´UŸ’b�H÷¶+>o÷8á´ö¦Æ§™“~�TËwcÿR‡HO=N|Ó“—>VÌ&ˆ‘MÄ4�–¥~{TÓØ­çSQÀ ´Ý¦¢—'‡€)±ñÉ{bŒÒû4tZ¦j –2ÀóüA @�¶ûLôbÿrZ6¢/ÎLvc3¨Ç˜×y>JsÈ�ù]kʤ¸�C �%¡®'>  �jIè´tÕHmkÐÞT 0�¶»$ôêÍ—Î*…eªí¤z`'Û¤¥À�ê ÌBšû¹¾øÜ€B*îãŒâq»JÁL'ÏŒléªR )ŸÀ>¤é¨ë‹OG(¤âÞ·ÏK-®Ãr ¡`#Ù(¥À�† ve’ºžø€BªM%€Z§WñÇc_(¢@€ ´… àé_ëPÙÌ% ´66oi_ŒÙj Ò<~Oº×N�{HFÁ¶6eR`HF6Âň>©s=ÑÉ à„Ô:I§¹¯ß%-ûàôùT68�¶û|ð5_) ŒÍÑg­œÛŸöúže_OÓ4lçªQ y¨À6¤i¡ë‹Ï (¤âifX‚–QËT �d†'Ðv“~F¨žá°™Kahólæˆþ8êƒÝ-Zaœ¶ã°ÀEÁ¶6�2\D3ÂÙ"HûÚ~èlÑÄS9OΦ©Z¯×ÍŽdvæqm·ùÙ5*J!hõlºò®(êÎ$MÓPKw˪¿Ù ù)ØÐ¦O† ù©À8¤ cÓÓù¢Ã §t”M�óô"јò&Ɔ(�…„«·ùkÓŸ¾:˜PÚfyÙXom¸ò0d^æ�m÷yÙekåÜÅU#¦/Î$äiY 3õë.ËqˆÌÉ”´ ÷ÙØÕÁ'Ø.60Y/Ծ˳°Öï´¯Ëx|Q‰ÍÂù¹zÔ±³âÐ>?:È¿¡mœR`L~ uÈò±¶§ò1Rí$ß6Û#Ýz®#2ßð@�¶û|ãb…rˆ³0U¦#ÂV¥¹OÙÍZ4ZÇúõ–rh»É}\¢‘cÐÐØ�qVë#Ú¼™Z“mÅ3”ÆïhÓé=*&`Ð6P¹Ï¥¯Ÿ%ŒÊyÊSDŒº%KÌræÏ\Îã�m÷YÏeƒ¥´-çl¥]q†*Ï3†¡~bK¯íûO h»O5®ÁPŽA‹g£DtÆ™Ï4û)ËTo6× $‡O²�h»Ï~®±QŽA»gcDtÆÑ3¦>âǪV¿Õ/oÅPŒË ÓìëªSŽŠ©g!¨”¬í‹ÏÉwÛyÝâ�xµüË�øúS•õ¥ÿ=þøýãë¯ûñW¿LóWézž‡íë·úÑÛ3_½þÜI3¢~(&gÿúíñãwÿõ¿ýñ@ ßë23 ˆïuX×ñë/ÏÿóÛ~ünÐGÿæ·òõ-z=¾|-ú¥•jú‡E „áÙòóÙ2÷[wœ‡8P¯{“ ¦/YÛZ¿%5í¸ÚÄ �æ×¶}ÞgÊÓœC¯ù©æ£Û�®Èœ€m÷9Ç%"0h�U%ª3ΜˆÚý êªæ 7ÄŒßD¦V Œ‰Ü‘i2äúâ“! ©øs5i´oã4×OnEíyŠh¿±m�Þ£äÿcíMš%irëÐý÷+î’Zð*æá-e¦Ç-%´™²·�ushÚͦ‘"MúùÏለLÇA$N¿UUyå�#|à> } f®&ra(atnÃ�±ÌËAÓ�ë~ÜÙ…”L"kœRÁŒ|¿*sñ«2 ©µshãÞ×[È×þ:Ë „ Uk¢2Á¸ÏÖB®*~1@!õ¶.;fZm¦m¯7ÈnÓuú –÷0bk3åÀp} bEäj£—D€RsçÜÆmùë=1ûÉæÀ"F®5S ùÁ4HE®.~Q@!O"ãV’}yU�\‹P ,^‘8ÇF`p6YÇ•qS“Y ŒÛPçÛôóíb€À ”Ý„ÿkç0œNÖRyuÔÌLÜQ_í„ÆAaS.àÊîÜ— G`p&Õb*ã¦eàŽe¸êC§e|î²æ\ ”ݸ�“# 8·­‘ˆº8Co£¾àllŽ1¬na&™V.\ܳ’Z´ÕñË�Ns"âuŸ[Aíjü§‚n ”Ý„ÞI¤;®�¾É½”¦÷]�_tæ¾Œî €óȆQ^7'Ñ—ŒËV§Äª7—/ñÒÍ��ªSŽ Wn8ÖÒÈÛUÅGÞRo"Η¥¾£µ+{tçP ì.Î=ÌÒøì»†É:�¨�›•Þ¥,uwɬ/¾®}¼”óSÉ4JqáJ§ez»ªøÐ€Bê¤EÇ¥}š•Û§x5Ã×*†«¹`.¤±®«‹�u(¤â×X2'l-ÕÕÛ·yù¾YÌÁ”²†Êpáb.˜žT°ÛVÇ»'œæÎÍÍk};XŸŸ8C¿˜ƒÑ[õÉ�áb.˜ i¸ëêâÃ] ©x[Žó\à²�§ çbK ”ÝÅ–­¯Ë18—¬ßˆÊ¸‰‰QÜ<ê%4ó6ÌJk„«K?jM§®.q0¸«�ŽÀ'¤æI$7mõ)Ò¥ŒÇÓñR‘œÇ ”ÝDrÎxçµU#¦2n PÁ¥îìmGÁº}\zœ@ÙMpé#¹„CÄÚ)¯ŒmT7Mz¤ô8á´æâ·q¯}?ï½Ä†o'¾è&x ld ÃiTu"ªã¦ä9ŒŽ3¥Öú†ÅÞ[ˆ‚…“µ¦S‹—M0¨ˆ²©Œ(L8µÓЭžo/Ãv:¹9œø¢û¸í9×RN"뮼"nBNd¬wÎë0ŸéD\—¸Id:¥¸xY2�ÚÚª>ˆÚiëû >ñ@!•çâ“No¤y9oφ''¾è.8ÙÏ.¼æ\ Ãñb˜WÇ�=´þÖ'Cô áºÜD½¾_T)G½ØÉi€âêâ ©xàt‡}¶žûsO&—n¬XC¥¸8¶„qG(®:>@ �º{O†½¾’3/KÜ…a/ô�5V ÃÞ £ÓÀÀÕÅRq"0¶ÍÚ·¸©Ã$p‘ÊîbO80-µ÷˜úÈ¡÷&:¶¥.å÷e;÷XRáàÊn˜wÃÖëêf^×óg Ÿ G¬‰R`?ÝKÅ®>>F �Ê3ŽoPÚÆe`‡-8Ç8�²› ëôy6¦ Ž–Ú}TeÔÐc0¬S]9¯Óp&? ’‚^1¥R`I]Ì®:>@ �ºSÞxÐ�‡ÚèeÐØ9PÎN ,ŽOÿr© ‚£×:�¨Š™�9ÊhÓ+¹×n>Þ�ÁH :¥*•ÃH*èa*:põñÑ…U¾ªÔ]so™ëµ•[ùsœâ8 еT ã¨`Ô1ŽØUÇ;b ©;åü†²¬×5Ù6lG(E:? ”Ý9?4 9›¡ªÅTH¶iæg†y­-¼oÛN¦EI[ðËîeÐg�4oT¦•Ý÷Fº ”ݹâ9 ‰uQ9â2K>Ì]½·iŸÇãÅtÒ”P ì&ª9Íø¡RŽqcÄšˆ©)mœg™æºÜY‹éØöO<‹ ”Ýy´L9oU‹©�œ ÎLc]íìz)Å*0LL¥F*јK�][×ÎÎ…Tœ³ßãò½ëÉI½þâ#ûí�e÷öûÕäl‚ªUמ®óÆ®4 qçyý·›>ïQ±ÛÅV¤ øK]Xï%”Ê©‘*Iµte=v*CI�( �$c�†QÓõ ¢½RÄZ#(‹­Q4Ïrœë�ªSÓ¯uÈÑcC==ïÅ>¬wžÖ÷†)“cOtmj®Ûº>0×(¬â©êëûºÕewÃ'FÈÊîŒ��ïC£‚__5¢êâšò½YìÖïM9F=£´ÐfÑ£Ênœ‹åÄ�ÖÉØUª*®W� Ý©QPº]}ž�›k½�önê¼G6Û�³?mM¬ýñ(¡t~kz}Ʊ؇±;n9"Í�lj/º7>ãÓøô{ý¶y/žvß_“êCàBÛh�ÌsW?Ï(¬Úï§V¿•Ði5óyÐîÜÔ @ÙýÔšžÖ™ÀàÇ×N£*ãZ²éµ~Ý´ÅŠùt ph áë«F904ˆQS&öÇUÅ› «w6ÕúeÿÞ†2ÊWØÍ4ÜTœ@ÙíT{Ñg¿Ð�ÇvmœiPQÕ'Å…-R:×mUü°ö8!µ¶ý8‡6ó¢�JVÃ`IXœø¾žªMŽ ç} s2Ç\Mü °j'hêÔ†.ݺê�c~yœ@Y<€® õPhœtNòóq’�¯ª*”âÂh�  ¶~yœp:çÍs\Ú—Ç¢D¶}òrü\ó W´ÖËZ̳Įfí¿þþ¯_K't³Þ(»+ÿõ¯÷õ÷E¤:³¾î½×*Ë?—a]ìþÇQçùT‚ÅâÂê£ìgÁ¼ëE+g ZLÉ^üÜq}ë×ßüÇ¥6tŒŒë¤&æq>Î[�ÝqNgYŽc©”¢êï!ÆÉ¨Ú9)O¹‹nDßè¦ü}áGÉoÿóëì¦2f»u[¿þ¿2ÿT:¯_Ça(�וŽ#Ú‡úÚò£½˜f½Fxê;3£¦‡”NÒ»bÍø¢ë7‹ÑÁlÈÔ—†×#ózÓr=Õ[”ÛÔêÏk1 çËž¿ZôNÚƒêœô*³EÏ£•鸪ß×±·9u‡¹ µ¦èù›eö“br#û@ ì�]Œkùïç’~ùjô­ÞÔªŸ4MÊãjïìßóñÙ¯%×/–qž¾�k°ÇI3!z?x‰YU×iاj=ômï#ùèËž¿Z¦QÍÞÑ©Å5lõÝlkΩlÀlÃr&}ÙóWË\œÆñtw0Ô~¹¥Qš¢SÐZ\™ëý­Ó®hYÙ)H/òïçVÐÖ×¼é‹Ú]ñ÷Ç{Y¾ì´N×�ÒOAûq¤ûõ¥_ö¡t”�‚¶~;¦\›ÿ'hè® +|Ù%h¿r —AètM� }2zv‚¬ì´¯ý¹<¹•Å” ¦ 4êö‹¾t”�Ó¤+ãô¸œï)h_ìv¾ ¤Wã�îÓŽ²SP?Œº’ki:ik›Z—v�e— ½ÿª•c63³mQ0ûÿçeÆOœ[”ßÑȃ¤µ oMãŽÓóÕHî¼/T±É/wÞë=‹fꊕžJ¤¢AÞ_÷W¨¸–½´�^5••úÑOŸÖ©¡•^_3sÔ¯VgÕŠ~hJب;¶§¥^ô µê¿%¶Wã­×Žj¥Ý³FðVÓTL«Þ£ÕöK–ù8ªq.}8M?7_é½M1:êVõ4ô±Ìø´ÆEßÝÒSVJ!͵Ɨ¾ÄT¼€¾)¤G¾†á—º²ŒÁIo¹× Þ;kÕ¿~>„sœ5é¡ÿ~uðLkµõc¸ö/­ Þu·ñ(èÏmŸÖ9–%¯^U[_ç�a’€u¸Î»ÝùµþÒpõ¶ ="ôÒ—Í$‰¬ÆÔÛ�ú²ßòKµ–6¶º÷½ü¹¸YV9Ö™º¬×mÿ¿P夨 Þ2ìoj|g�ë´ŸLָ߯ÙÝê§ † g•zè÷GíY¥Þt0š-‚*¯ â¬Rˆuû¬Ês öšÉˆU>Ã�«Êõ?2zj•Åïïƒ�ž ª| TŽ*K¼5�ü÷/V©�X[]«Ä9òÒœUöÅb ¿dׯ*Õ%S¤U.A•WðsV9tË/ú®g•Åœ¬æ¥W¬ò&]UnÃ/ú’«Ê¡˜ÑÕæå†U^ÕYãXlϱpûÕ‹5Ýw›–»ÖXþ©wΕ…P׫ùýÓoõ‹Ð×§yÆIÿ,ÒÔne h¸Ð�}ýñÖ¼Ìséþ驇¸¢Á³ ºÊ:û®ér•œïò¼d›–ÒÃã±Ðê_Âþå²'½C¨¯/d®fI€ÓIeH[ð„J$e.nPmX?éÉÓ]œø¢XƒæV1Í{½> ürþ>¶êPù²ŠR•K¯,¼¼ß-To¿ô¿´j�ã¨ÖnOÑO³>Ö¬¶¹+õDè\~²Ö— 6}¹c>ÕIqâ‹�¨´{\=l÷LX•¡™5PÔXFI¦~ã»peD÷¤üÔªQÕjí�gS}šQ·¡–°ÌV'î¯ å@®õÝ-U“Æß�n³.^nèÃAV*?ÎèùºõÔ( ”=aùŒjkú`Jy Ðjcÿ�•`›×ÒÄ5C({3t^ú)…à÷Z?uq�—æÒ„õÞ_}o{ød0{ @5˜söGÕˆ©‹ëÜ®¹¥zší‰Ãu<Îù�ÿ >¾j”â„lÈt¾ëu‘ Ù¶ïmûd¾{ @Ùý|¶O (¥—k”±¹ZÄÚ‡¨È—=P1Ϻ­’+zPv>™g(Pv?Ï.}rvDÕ‡©‰íÕγ<–ê±9ô_kJ¤ÀØbÓ¥3½­êƒ™î�Üç3}Ú';a­+ÔžŸé€(»Ÿé§6¿\Õ¡jâš±ûzy·§®OüÔ;t×>š‹å'{=m²éæ±KŸ &¾è�’2£ãj¡�à„Ó¸kîTŸ¦m5ÏÒ—­¸QñŒŠÚ8)N¸æºj«üX}ƒõˆÚÀIÀ—›>)0tA3¾7‚®"ÞPH­] ­Ç¥¹ÓtºpPUm¡º‰@ï¶…¼Árñ€Bjí[h0Ï2‡n UY ¥ÀÐBz¿7ˆ®"Þ PH­3ƒ¨Û.öêd¶ÃDspe·6ñò_9 |äR_pX÷YW ‡:DE®èˆ‚ÖYtþu‹=U8SèSæ=*t¥A¦öùµ"Þ:·(aôÍ,óTbÿú`î¼ÛMž¬e @Ù½e~5)‡§õQ7Ö]Í[}¦g)¶{° pÛ?¾ª:9J˜mG· ~Õ÷§º5v[Ð ¦L† ½VУ™×jkâ�–Ç §tÛ:Ón—_kt´Ç>Ë×SµÉq¡ËB�3�åjâ=…T;³ÈS}Ö¸”Lßó'ÙáÄÝ[äþIøä�ÒÆSݨ ä¥Q“/{ (=õeÕúˆñ6ÄþºÁÔI�¡?úô½Çjëa=–G ©qf•§®žÏÒÛ8|b•=P ìÞ*7ƒ'ÅÀ0µî"ꢆ|ê&ÊI“?K±[uGç&q¢(PvïD_Û'ÇàH­*1•qÃÞ� ~U⬅霓†ùÎ0…2\†a¿æž´­‰÷¤'¬Öº-RmÒtŽ3 vüx°&Épq¸ƒc+s ME¸P‡£¾•q£eÁX Åq±ã#´õ@�²{7ú:†SŽë1¢.nhùFêæºYAOwLóM溣j”ãâ º6wímU¸vRo×k]Ýd½öÛ±µ<ˆ~üø°&Êpqôƒc-÷íMUøv‡NkÛahmÓ×ðv펽.à{Ëo6½í­Í @�²G Œˆ4Úª>59NÈAß6и/ƈw�ÝW…ªn\˜>).UaŒ¥±†«Š�5(¤ÞÏ=*ù«~v�SHAh膵O ŒƒCeYäãªâC «·¾‘­[“–m8bŒ ­_›%†1jЕ0n\HઢÃÀqß›{÷Q‰jý†gþ˜óî(»õîç8ÎŽÃÁ:Œ¨‡[Î𔦬çi–c+?ƇЦP†‹âàSÓÐÇÕD‡>€NëîëÚñn ÔÙIðÒ¶K¯ÂÀ°Êpa¸ ²$ði+¢ãNåwQƨ¤½V²övî„�2(Pve¼ÜÁÎ`ÊGV^¸Fçµþ\e¾ìƒéµ.u¢Æ ãMà Õ4J�aàŒú÷��«ˆ|'¤ÒYà3–µt} «ëø¨§I[pï¼Nó÷¿‡éb}”ÔÁ̺wAΨ¹Œ¡ )¸ €e·AN;¡R N^k¢2Î81êim}ö`\ ¤š?ÁЬ¥8áF¹÷Ÿ>$Ñóš€z& �z¿�~F})§qyôã1⋲è'û1Îd르Ê&¤�ϨٱÉÖÖÛüAà@�²ÛÀçu¶çœ3U#¦.nºq<ÕÛ,^#*XKÀ5�R`¸˜F{¶u}z �ŠçÑØd·/zHv££1�(»‰ÆÎÞzÿ[˜ÀÖSY¹ðÃxøžŒQ°ÛÇp�Æ4Épá'˜|y€ÚTõA|êpÂií‡ðXoœ—a9¿¡›?Áج å@!z–ßNý×óú9: ô@�²8 |ÈùÏq²Xõp3Ï�iMVjìÖïÇÖ›`Uá‡)”ââE ´( ”=aq°ÝJÿ pö@!Uõs½Û¿ë•®zŸÃ½5“ø'˜ÄU¥(¤Eðs½[ë Æ¥øÝînÑì§�©”ãE3ÎÁwá|[ Î{œ�çá¼n¨[¹Î}òl8ï�e÷áüËdÏ!8�­Ãˆº8›à§{‘¸è/–:%âU³ŸB¦R ä&rl·Âù•…Ç ©hÊÛÌ¥d?ŽÁ�¡¼Ç ”Ý…ò—áÉ~�3Æ:(¯…š|i ?èmŠÙ–ïíƒÞãÄÝÇðÏ9•#pöª:LMœ%HãøA/rVLñ½ÃÄÇñ€(‹¯ù�p¦X›™I÷½ƒÊÓÛ�íj±`ê'ˆ)ò/?qªe+ˆ×zøåC‹FÝ4Jö¾ž}]Öî &¸(€e÷Qúë4J!0_­§ˆª¨¹ŸÆéƒîêøz¾ÆÄÆé'¾èf�šÿghmF87Û1Pt‡þj;žOcƒq ”ÅÁ¸õË9LrÄõæ’ÞfzÑ&TU¾ì#s­«ãî×sG.˜P ì60 Œ3"g¥5æ(]%èãECÝ‚8çØÈUÊîW /¶&‡ Y³"ê"m$†ÔÃ6Úiíëæ2 @‹0fÖ,D]œaÄ`yØúïzÓÜü½~°p0q%ñBÀ™šä÷hÒ¬1Òj8ëèḬ̀ušd+³³?L“³?�ý0…R �ÆèÝ¢`X·ú´Ó¢—3̬ (PF­  �Ú@Leœ5òJ·ÎÔ} ûI6“×TJ�œ IW+®&zµ8!µnç˜î¬©·$.Ç a¸òv3Ùš'…1¶û Ö®&~á@!Õ†QÝ×ë}zkŒ™˜AÖF)0¤‚éx»šru�«)@ ©m¶bôÝRU}�t'·bœ@³bÈ!8kªBDUÔl§Ö²ÉTZtšc©©“Ã%~0â!¾p W½ œ�j'k‰¡uyº¡eë?XKP ,^K0¿šôA¨²F›·~|î"Å·e�@±z–É®ªè·ƒÒbV€(»Y=z$¿ECbí’Õ@Ø#˜ÙÃ÷X·À®ÇK H—€1eR`H—)[¸ªø% …Ô;]= ºªž Ílþ f³5M†Ò2ø6mõΗEß±Þbz¦NÕ(†ôJ8aMæ¤óKO ©j;jJ·ëÝ/K™³ó³0{­UR`H_¦ _óµu}°èó@!÷Ó\· Õ-Vã±mI ˜6ÖJ)0$1‚9˜­DÛš>X‰z Ðjãr©, 5Ð\�‘ì:ËÊn×YmG¥˜ò›½N¥m^VLe¾ìKV[ejÄ?t§2äzËáĽ[s½˜À ‚VÅ'¯Š³P~ªë¹zÏKwœš ø&?‡«F90&œ"ƒ€ ³Vú+QRÕl™¥ã´`¶g²ée–É/Š—Y~R¥4"ÖIyU¬AÒmpZ¶nÇÓίämˆé�9K¯[é¬ö<�ûF䕯I-Ĭ/®�7´’3Ö*,æ•À ¥‹Ï¦¢Öž'œÎ`^†ïû,:OcBÇÏXkž Ç™ bÝÙÔôÁ²Óá„Sº53ºOPÕÝës½1¹ä ˆµNЋɥÀá¬þÁŠÎ…Ô4_Ñé†A-ØŽ‹ûØ%�É/º#¢Ò¡ù¨PÂS”.况æÚ—n=Í·”ó8�²Û¥Ü«™É!`@¬�ˆª(cä¦õ0×Û­–ⰦᆻqÖôIq1u“?_ê¶U}°Ôõ@!õnM�+¬NÓG1•ä'°5Q äÌH¼ðk¥°Ôõ@!UÍוº«²^ètíG$ו(PvÇíä¿[f}CI'ìb÷zÕäP¢‹}µY:£ëÕŽüvÄÔÉp™$ßGº«S³}Û¹!Ä/ùŠ�:0æ­LÌíjž'PödÅ+áFø‹Z‡NOgïJÀµ×•Þp\ú�XÞnX“¤À˜ÄB#”®lÛªø•­Ç ©vkïtC§ŽÅ¢n7 –7!Ö@޳cÌB»©êƒu¶Ã §5LªÉ.`+ |òWÞ¢Y ¥À˜¿ŠÌ#¬O[áüºÖã„VT7pªZÛ¢®"¦ÐÜœµfHq”݈—�­ð–ÖÈ}!±ª-±XÝ Ý�êLèU­‡ ”Ý­jOMÒ_£Å°þÉk¡ŒOkVtC©úò|ÃT¹ùYµÉq1Qs=]`·5ñ l�RkoWºÕî£ë†“IêÌOVk¡ GÙ‹|…ÝÖï°=N8�}óÀQ7“_/éJneé`â‹î(®ôGhC¬{áŒ=JW’Ýl7ó•{Ð…\Izœ@ÙÝJ²±|)�ÚÙ@YU”}ô¼ë5}‹^å¿ÄŒ•Ÿº¦O† +´éJ»­ˆ_i{œpJgËZÝa«_°Íz\ðƒe­ ”ÅËZ0€)�‰õQg™•Ž!Ôë.[ýÁ4Ÿ42jΜ¨>9,¤ÊÀ0�ô‹VW½ØœpJ;rM!õfÅnÑè0f×¼q9(ÆôZªdýíjâàRm×i½î:Öi‰^�Íœ~•\'¯žzßJ”½\M”âÊ(+Z%;Ù4 8!õÌÖà*¤n´¡Öà(»!‰_¡¡=;&OYm*£íé_öïù†ãó¦Ö4Êp1Ňfû=ÐÖCó&œÆéª»×-ÈzÝdoÇú�[uP ,^u{ç�BÐÐZuqV» ûu¶ë¸Š}ê§8$ì·Á.Å+ñJw†`0Œ Aá"\]¼‹ �Чq*|¨ßïËnCÕ×ÇFuDŒæZ‡ô8¤s(%@!½Ì7Ï}ôÛ^?cÝçsyA±;€(‹Ù�üGè‘j£0ÂçæˆZ•[ïp-kÔƒ¦Ò©P ©ÚÀ»½£w\5<¿@!unüE¯[×U[}ŠoyZï ¬q2XDÓN9'šf˜'œšÎ?¿Zoh-ClîcŽ\‘µH IÚÀ¯¥“«‹ç˜(¤â¾‘F»fs�tKÈà‚±FJ�!ƒX#h$Gظªh¢pBªýœä„3ÁÙkÍCx!Τ´J¯;Úuþtº]›§U…ô¬·µ¦PcŒ}ºòwÕÐKÀ §²óË`çr®Ýȃá·ÖI�!WzX ;éüò€Bªê'Ö¼ÛíÊýE”ˆ£ÞbV¡æ±ü„©¥8ñEñÜsL,áS|ݧB„3 ÖÀ ìýZ~ήµƒz¢F¼[k¿ë0àøØ£8¾›>›Æ'¡¿ô–ñìÇãè�ó�?�o´¹•…t´…ÔëI™J©ŒÇ•I$…@�²;B;ÿxGkJ:ái[‹¬Aêg:ŽÊ  ¶ÖN ÉÐÐp{ŽÅ §¹À ©(¬¢ÃÑëÙ[ûz­3fpe3’CÐö[/u±ŽÄó½ý¨×c ßýÆó#€(»#Eó_áÔ´v Ä3ó†Šç:z= ²±Ñ �$({G“\3:E”ßèÉ�y[‡—%/S“/{ ¬ªtg'¥Ê§í1ó 3ÕTÈp”± x#WÍŽúÚœ¥éõ¬…B¶î¸cŒbi&P²4κ¤´cU¢&Ò$N‹]Ÿ>ÕËâ"挆i�á(»“4­lž¤ñ8êûp?Ä4× _È–a¬÷r,Ý|&,<ýbm’Êb.ÇGá9¦÷�^Áã":¦²(V÷¸_ÑK�H|[v»Hº ¶®°]Em]¹éªw„Z[Ó„š ©vÊ^éA¡Êî\Ž8öÊãÊîØ«üWè‚­›(ñŒ?÷Ži-o8\H €Ë1•R`˜@üWJ`µU}@`y �zçV1£ú"€n¨8‚_ŽÁò8�²�Ã"~„®Øº‰Nxuç°Çz¨l^‡á\ bZû¡ªOä|aÌ+µÒ?àÎ`¬¾þË~ûÏÿ}™æ/¸{q…øûßzûÍWQ©ô–ŠYUþ¿ýÕÿýOø§0”¶*+ñ (ý¸—8ã¯Ï¿üáO¿ýU¯?ý¯(¡Ÿ1vªíöUBèÝ;mú"ü(ø¹ æ±4DM6�˜g‰}†3¶zÖ諾.³¬!yV´tSÕ´tÓÿ)_ûOŒ�8¯æÙOw¤šš> �N8¥SÚHO&UJ¥;Î]‘¬‘É/Š9#Sg~ö]AÃk1y^gÄßòGåoõQ�ç#Ž?ò8�²[þè=YS>»¾øÒmzñØd� ”Ý“5‡6]gÌÁ“òǬ‹ÿðªMŒ³.ØŠy6ª­ëƒl” ©x›uÉ›SqçxNû‚Ëëù •³ûzy"Žå¶N|QÌm?Ââ\vç™x$§³Ê ì+½s¾ŠÄÒY(PöŽÎzZÁæßšˆ¨Šr%`–»šš.òöy}gÿMŸ ³úàJ2r­©‡çÖL8�ý>K0äÝ6Ùe«×‹?ÀY™L�e1ÖRmdêt¯¤¥ýþ|l‡ª+à¿@A¶†%Û‚Ê|Ù-Ùö¾ßpC3×mÔ†æ°ÓšìP‘go;-ßwÉ!ïµMŸ ç†0xÏF6Õðd¤ƒ §°›ðEGu³ë6œv sBÎYÓ¤¸8ݸ6ä[á‘(¤¦©ïmë¨ù? !”´1éçv¨nIýäÞ-¯Ã6«Æ—=IèÌõž•JÅõz)bÄ¢—6}R`œ Š\>2„­ôQRU7ƒ€ÇÓc£ª¶¯C!†þó0�²�þóñD çl}”×ĸùf"¾£üf³—‹†ýÉ}QN'àu@˜@YLYû¡`J¤@n@rª²¤Û/~£ù —]7ÔKô•;}í«ƒùAcã$ƒ åªüvWWv·;=’Áö@�²˜Á†y”bÐÝX •q¾Ë`íå}y=Ã�Ù©Æåœ£ø=(NM�•Ìsé'œ’ Ùí‹ò¥dÕÙ3‘L ,䉡E·þ „3ÎÁ�×®üO}†¨¬ª�Žù?7L¡ç_¢‰æ¹B'œæ'¤¢ïH´®4ù|PJÝ'$ÊîI´'ÉØí£½.öäÝp“¹'Ǭ‹R`¼É™¶„Cs5ñ…TlÜPsïÒeÞ€X¥8ʈ¡�qÔ˜«ˆ¦Ô'´Ò@=uz@´ÒL½ZIš²œ@YHY?BCj¬!œ±ÉiÖé!C½ñG>¸ô)i0�²�4#~„&Ì„ÎXÃŒáè¶åxrl´™© @ÙƒÉT˜ò›MCùÒ±£‚C%¦²€4a)?–Ÿ ªòe1wóšèVÝž£ƒú<ï3àžÍe&°(38ú¶mråKų=ʦg„.çÄ|uÀX�0îW,wŠoËbî.£ÍÚÖ§i3ªS’ª[7ýÛ¼j4}PBI@�²˜¤b~…Ñ��[F<jdLY·.uæWhW­M(ñŒ‘öÆe™j˜¼ûñ¢ ¦4`šJ)�3!Ûè¤ót#…T53.Ý´Ú3$×dæŒ àÊn�Ë©Kþóâç¦:#”�[¯æaê IFП€aéÏ 2_vK¾ò9úU#¦.Ž5h’OÝ2O‡ž·<`òÉz›X).Ì=¡ÓHùaWÏPH½3~¸ÌÀÚÌJ nŸÄ(»¡ˆ‰_�´~¢¤ÞÔÓH@µvKmÒy×W£Ž~¢8Z ”½ãh¯¹•CÊoÖê'w½9þ2@L]¾ìƒ‘£W¨¨™Ëúb 9TôÓ6ÛS`˜ �>нN:ÏPHU½;²µÓÆÊ¬ê¯¾x’ÖãÄÅ$-ñ#ôÑÖ1ŒpÆß第n®ìævÜɲ²(PvËÊÞ“ úå�zéó�{’œ@Ù;ôÙ@ã`Ï€¼cÒý—W�r`̤c3¦¾¼­ê_î�BêíÐDâW<ÇuÚ#œ‹^ÀÓ‹�ž¦ÿ^€eoyÉË*§tÔÖHD]œ×OèÉNOÕ+³8ò“¥Ç‰/zGR>§Z A—mí“WŹßa);†®É"h5ÎÏ¥¤i7wÚ óRB©c/GšP ,&M™_�ƒ´f¡¤ÎÖs9z\³æ{Öcï[7 Çèñœëžþ´%` (‹¹Ô,}ÖÖôAúÌ%Tó[yA2�m#*™·Ñ;&¹›v{wœ�{™8&peo˜ä³}òHûÂü<âpÛ&óOÀ Ç:,ÿt*^J™önÚtQ½ª8eŠh÷8ñEw4{ú#ôÕÖ"ŒpÆïûIl¬Þ„ ¾¨üy,q8×ãÊb—ù¸gkJ:áêý0Ñ[Y*Ï:/Kȳ¢ï1�R`˜E ™óãÈ·U}@,{ �zû�“»”bX:{qO—ùW¬Ãø¢(ñ ‘ÚÄËu=|[WØÝóA/×½0No:âÂþýT¥Ù“èÛ²˜=¹èäÓ õ©çÍ�Î þ^ÐæT Ò¥Â4ïí…äÒâyî3žÞÌ›B,ÌwFó�ìR3'œšoSůÖÇ㺺®šKAx @Ù#†)ˆƒ«30De•àÀSgÏZ?!> Ù k£ %€ƒÄR–hëáó'œÎÞüî•cÑí­LGûÁ¬o† sÍQ¸�Œ}+›gú=N8=SZ]OîW&|³—RXVÝáĽãÔŸ3*…”fÕ“Ñó^þã¹:È+òe�„Ö7w"«˜>„÷a=¯|séÓ#ðÁÄ´³­¦CŠ£ì{ȧ·²y>Ýã¸ïcèbÝÆy°§‰EÒÅ(PvK7™Í±î.«ûH��˜ÙôFìì§g6Ñ"æ|q[×|± ©¸·¿ƒ»«$H¶z»vö[äŒkL*·Ò?`ˆ=PHUSNV�®WuÔ;$yNÖãÊbN–ù˜øsaBH'Ü…7¾Ècê} •³ìÏlÇzœ@YÈ?B‹fÑ#œ0Ž~˜äviêôˆ\¥À†—hœ1hÇæ…á»ýEÌÁz¶·ª”c©ãŒaôA3ŒøõœÚ×8>ìð°ÚU×9 ̶zûz£÷¸8ÛŠ¶:¥<›š> <N8¥ýL×›tà—Õß°…œ ZÚs•9{²ž­pžõô8!m‡±^» ”àÒ_ DŸ5ô¶Þš$Ã…YCt�Ø"³­‰'@=N8­aÐtÇõãÉEaŽÎ~k¡gß"/‚¤d+ýÖ…T5çN[\Û8‘ÿÔ£=•1<Þ•/º0À˜ÿôÂþÓchþ+óe÷üçë¦ùÒðcó­¸iÞýÙaïqñ¦ylÉ”�mjú€�u8á”ö­‚Ï9dS½‹>ö'JÑß§¤l[Õ¬¬ ©÷K–¡,‘ÖÊ^lË–ê«ïÞ÷—‹€R˜¸’G ˆ`CÛjX6Ô£„RØÛâ‚è+]¹jóEt%F1gÛ$@.–Šóz­ô(YZUÿ«bbûú~ܧ-�@�²¸%|Œ•Æø½c� ×x§Õ{¿ýx|I�ƒˆ]~‚ØÅ* Á(êêø]BÓ ¦Q† šQÜ�„w+›'ô=N8=] (÷²È’ÛØ!Ü3G¹çdzA×›ŸÊç<1I¦{ @Ù=™þU¤ðÏ6jˆš(_Ÿé}}ShÞôPÛAMrDº ”Ýéù¯Ð#[«Pâ÷‰!`£õj‹‚ÙKO ŽÅö8�²7,ösnetÎ6µòš(?ï­Ÿ^!a¤ó°†¤3Ó'Ãq†-&Õá�ê'œž©>îz¢^ ³�;é(R�eïHu3 ¢„ãq÷Îz]¿ÎU… 6 ËY~Ä�,T™/»eùß“ê]}¦îý=â@ŽT÷8�²{Rý5ÛšcÐÙ8"*ã<[N¬ë](•v¿?âÕN|Ñ«žþý�µ #œñe«Þuu mëv†^$­î�eïˆõó“bÐ�ìhZçØ2j½LÐÍÂê}ÐÓÔ4µŽ@�²˜Zg~ÀÈ.B:åL{Üõ�_`±(PÓÌ­UfÌ&røÖF„½å�<êÓ�újáRbÜÙ22âÊÞÈ÷mTZº³µlù¬iàÛ�e·môH GHÕˆ©‹nW�ÌrÖ®è%­�òþ nk€ŠÜEW?zíÒ:„¼88$S'ƒÅ©ØÀ·yöÞɦYÀ §fBj{JŸ%µ'dz¦ÕT㺭Ìשi^ô�ÖG)0ÎGîÖ3»^:Me#PHUßÇEÀP9²:q�AÃPÇ(»¥�Ÿ©RÝ¥>¾Üõ³ng'uù²G ,˜Ù)µ‰1ƒ©Dp¢\âÍqêxËÂj²â5Q7\æ˜ðØÈ¯¢0îW$}‰÷e7ô­ë©ƒäµ­B‰Ê8&¼M˜�:Ðô1K}ùs Ù^Œlìd¸(]E Åíª£nÀ §9ôÛ^W…/·�yœ’u[Š£cDA{á4ÇŽ@!5mie²õÍ�†Õç›Ëov{°^/¿LaŒÕ(,eÝB²îQ]¾ìžu¿§¸KCou}ý|Á“¢¸'PvKqßluðý@ou@ ��ê|iª?ÆV6­òï¦Â4çµô"åÆõù·)äÆ1¦1}R YEü¿—NóÿRÕ„n/Bæê ÷±?W{ߎ@�²wŒûÓòäŒ÷¬§ˆÊ¸àÑ» _�sGÝúÞò›ÍÊj]}�bBOdÍ’á‚}±SËÃ.…‡-„žž5ÎM'fY,Ü"l.—²i·”_LõyÛeÎõ™OO }³nJ�ÑF‚ÈXfÙ_�ŽA �Š' ™"¤6輮ÕûÌ2( 2Ä�ОY/åÂ)Ó˜å?JM½ÝáµÔÿ¡ó(‹ómГ#вY Uqf2É>”Y¼×·!´ úý‹Î> P ì6ûðݿ̬S¾kÑëwÝ5ûdM˜Ê|Ù#†ž×øªÉÚí°´.Y[¢ßé{w7q¸hOÊŠRØN8�Žœü~z’)˜øÛ²8GÒîcõÄv`ö#=á²h\m¤¤Àh#Cd©½ Î?™[îßÏÑ*IBÆ=›�Aœ�-™%?Š”²ªgìzMi³ÉÄ ”Ýd÷Ó¡´�Ã'j–ù•*Ü_oi!3(»Í|¼ìf(Ÿ:Û-]ûI[yºY{k¢ ífˆ2 ·ïj¢¹}À §4„É“íÙg�Ë"ö£k íkˆB�$Ýà«¢Ó Rï—ìÐR7Ï{™*§epœ7† Ö>)0ÚiÅËïë¢Y~ ©xÎòëÖ¤ë1ñI–ßÊîÈçüW£ÞÇV ½nQ½”àÄ#·í…q¿¢YþH|[/— ‚½6¼~ò6Ø�¿0ñE1»[rúés¼$•Q|¹ãÌK ³Û½pcwÚŠlG @YL¶3¿ÂPÁ‚.J<w4)NÆá:ÝÖ „›&¸ø×õuݬÿ?�!¡ ñl›í¼kF ûªh�Bêíç¼Ö݊·¯õ /zÄ#G“£yì^=«ë¥Ó,6…TÕ â¹¶à¼kö:ätÑ Z«d¸(K¹ÔŒÄvUÑ6à„Ó{5G1¯zhÖ:Vï¡Qvu°æñ&Íšç=JÚ‚;˘û3_ÓidGˆ¼1 “ðS<ÃM·“ï�["W•äðõÕO›—nx}ÎZs¤ÎÛ�àC‚“HpÂ…9«?õõ1½eØÎV"Y}(û5V¿¶uW9îê_iV�e·¬þK°§§÷ûÿñ0Ô�“öoqp ŒsÒQKºHèuUš!έ7d²ÁáÄ=QÔ�Ð Y›0—ö ™uÜ“k÷Ô?æ0Ne`tj Jˆ¤©Ž¶*>ÕáqBª�çôz(¥Úu,[p¸Ü‚ ”=aܯÐ5Ÿs›Ïøy—*³~©túeÓq³‚÷Ì'O�ãÍ èæß&8Új>Hpx �:{K£·x© [º“åÅíú>M` ”ãíúQÎ3Ù­ôRà(¤ªo>÷VÙîýûè,Š7w0ñEïxó«£òP?¾ªÃÄP\Kê8>çU¦?O6jòïæ1Xã/?®¶û«Ø–c'6Iè{ @Ù#Æý ²µ %�pîiNaXm+åù>8—Sð(�²‡—”çÆ¥¾¸ý²œË)xœ@ÙeafWOÜŽö•§3�ýþ»m>¥Àxÿ6âÛ§­æƒÇ…ÔÙ{άI1v±±œw9ó§—·aÔàþQËOµ˜2ïQñ…(þÁ\È‹è’= J ³ K1Ó{Í9L'‹ÄeX-þ¤¾ À–+íÝŽ?¤œÝ’Êâ(4Këu‡³fy§3b SÆ(Pö„1·a¨£m—sKfÜ´Tib°­êƒÄ  ©wèé.¤jÚúÓŽâF½ÍN�Mq×<ÇÅi¼¬hûF+›Þ¨âaÂi ‘U£á�¹¬ £̽§8Šò 2p¾ é \ÔøŒÚ~¯SYÈ,³ž¦÷:yi]–ã½Nènß%ÛZø¤ Ç ©1°6iÇæã0ôóe”Eý½¡u#œp¬iÚk+&j�¿^�qi/ ”=aD¢©ütÖA¦wð g'1™&({ÂpwOŽÁ4›õQ—³ƒøt¨ÏVæÊ±e ÷÷øðÁTJ�ñÎŒEÞgäÚzØŒœG ©ñKêTo²ª¢ù$ËpS�wÑÖ2)0ÞTƒþ>ωµu}�ó@!Ï’ ›Þ$Wþ½n:b郇‰/z’¨�ú”Mµð%T8¯ôç„c2 dq¿bÓ‚‘xWö„‘yŽn«Ÿ¼­êjù<‡ƒ‰/z ¤xÛS†BÿlC%­Œòô9oÝ-º+Ær=‡.É[{ @Ù-oý’‚'|œOfXœN¸F&/Ò²;¹þè­»ˆç|lJXw³Æ0s \ÏeCX{”@Y@X§?A—c­‘ N=ä~€q.“µnÇ,m~¯!©j({GV_ADA‡cÍCÔÅy¯”>ßÖµµÃ¤–�'Ð=N|QL6S n×o•t]¾�ñ˸'¾è–¾}m"± ƒo‡ðH\:à¢&u;…õ[öà�¬Ûòϧ|[Jßnz„¿R®û÷aöÖÃÄ…ÜmþàD,¸É%äJÊ«!Ù¬šÑº†#Ž=N|Ñ;Úøô–[_�Ù¢ „�”÷�nm“âœ|Ð�~�Í�Zº´wÞ„©ØtΛž‹z¼ n|Ó›b+¾�/×q¤:ÊbR�ù†Ö,Œx*¾Hhôm_êTܶé|@Š£Ñ(PvK£¿FCk#¢2.îðÎ)u±£V:W6mzÌ„kµ ‹û›ŽÄ»²2�øUé…¾†Îë2?W”td½,êG,Õo‹bª‘øž„pÊØô5Déž¡ÓTŸ²SÌ™ål‚´ ÒL¡'\À—&´ªAóBz§ÎzrD" €e�@„N„lËbi‡+OÅ.(»‹^^³`)¢˜Ž¡v޾•ví `jÂ$ˆ¢~DæáBámÙ#�»%¶}ø^µ¥§õ M`³„ÔLŸ n•À˜/Í9µ5ñ)'�Né'õ»éís½qÓ阥°¶I�á©™ 呦\]|ê€B*ž¦¶m¯1ê6OçË�\ê€e�@, R†Lfsˆª¸ø«ÍAm[ýé¬÷_÷(Àn°·¦Q wÆû]FÃUÃg4(¤Îæ¥v«üf¯ÎoYÆg¾‡2xAî„ ”UYOO˜ ,:¤$:-É ¿öu¯¹vU¯Óv]ÇóNzH¶{ûzæS\˜lG[Íd\mtêpBjîLz÷F¥¯§3yç'À¢ÞFLcH…? @�²G ‘^ y$_æ’aÀÏY·¥À0’}�]tÒù´$…Tõ]Nn+?ëU€>ìúE§äå@!õ¢ÏºGvŽ}ĸ™¦ ÎØ3A…;i0ÐhRN,—q��úùáR晚Â}>ŸÆ]*àl¬1R`¸K%ð\i²ËÕÅ'»(¤âÞMêÅ|Ê[÷ÇëëAžgêÍÀ”xv»FpŠ‹38^Vœìj„�ìr8áô¼vÀ¾PwEvÝÖ·«Ç²¦ô[E¼hË�02åZ€ODPÈæt¤kîY0_q†ë©Kâ’ÍVµPº Ô«/¢¶²€õ?ɵne \IšØpuñ‰ ©¸‹ÛE�gÖÑ)œ¹±7 Üqë/&[,Úrõ’lÁ¦—})^Ö8§"L¶pe�@z«ƒnÈú…¨Œói°¨Ö]ï.R6nÓù€­w8ñEw„zn(1a*–Ël@ª[—zú{UVp©d4¯çZ7†ÙîÀV3乫ŽgÏ(¤îY~¨ËÎÏÇPÙ$¼ ”=aܯJвØuŒãðÜ€OŠGÙ ck�¡)k¬Ì—ݓ֯yî2êUðØŸy%Èsƒç9'ú{\˜ç¼˜o£ü#€ˆ°8™øxŠÔHiýæÓyZßÁ„kÄvb9xª—PÌš¬8Óœ:vñEoˆãg~;C o< �¤"ÊËzg•ú“2:†ã"·íeÈP~3¯^÷+:±‰oË�0îWå7{�Y×eÙhĉÇܦÆýŠN�FâÛ²G Œû¤,¬!(éDúÃ'OK$ïAA>⛜¸o+a‰{�F]`…Ááèƒj7·ñˆé8?å`â‹B/å LõÖ³¡ò1Ë÷t�἞ Eï% ”ÅÑØé¹›þ¹½(ÅÑ« JCvóÁ¯}Y®$ÍÍù/{þ;ææÀº¿ý=|‘I%Ü 2ªåPôéÃUÅ “©‰<~‚ÈÃtI�B†1yªkœ*²ë~€+…¤ºzÃÐzúP&×å�e�@Yt“ÝŒòtZ\dáqe7‘Eú£Ò'½9¿²"让M ‡=4^”@ÙâO0m¬¤À8ï�êTSv7Ó¯}a¼G&R­Øø Æ"ú´”fõœgMðlúÔ)H({ˆ|ŸÞ]¨ßP,•×'Ò}&¾èHrͳê¢FôyžÓÄþ»U'€±³°ÏUE‡}€Rm¿ƒ(mTˆèLŸ¼/¨àÐEézõ¦&ç–óˆ n�qNÙ´É`ñÎðïi²©ˆOC:˜p*ÿ·ßþå·A¯J+¾uY–©FÓ²×%äQðsÌÃ<ùpbž%ÿøÛÿøúK‘Ö×ü:þøããë¿üá·ÿüß—R_14ý¾¬_ø{åHjt7–%ÕPÜùRµôÚ¿ýÕßüóÏŸþ÷¿ýÝŸÿòõ¿þò§¯¿ý×?ÿñï¾þþßÿòÇûó?ÿå?ýáŸ~û¯(Z«Þc·ÔË^—yÛëuⓦÄË¢ä(ø¹ æ±|¹m—80ÏÓÛ{i½åLƒ ¥_îr¡z£™ú”¢û1«õeŸ½÷ÿS>ðŸ()qÊÓI÷µ²ùü°ÇÉï§'�™ ¾¯)z¢¨‡lq #› £ó„h±BkMNe,}}�õ@�²G ¢Ëu¯Ç°Ê/úï#—{Þü0o”á¨1®œlz8áô 6—å-‰ñ½)Et·Xðu÷¸Ü¢�d"Z"²”~{PYSi«.Swr9°?ÈÅJÖ:,ÜQWžm+âS¢'œÒYÎOï¯ù°ùHjpY?_ô@IÌoÀõ[ß’óÜ¢³¤ë¶ØI}ÝéNÛ_�_Zßü7Å<Œ•çZKpr݌ψ†üHJ�€ 3�AM¾ìÈâ~UÚ¾«A½ví•!àÄ ?/ 7äôC}»O»|?6@À†ïë¬YR`¼!§O.¥_A%dñÓ}Ùà Ê1jÞnªùÄõ{¸*ÏŶ‰J/$ˆúßSÙP¬Ä—=Ai6´íö²¡(äjGǪ<ˆ.g¯×Œq¿–Îbšö¹˜\nØa¸eȉ&wEJ~G%Ùôkôu®ìÃMk%nª÷!.Ãå¤aךwîÖ()0Þ·†‘DÖég #k#…ø~ŽÞ}›Žm¿üƒ|¬ ÙŒi:M·“Ø-ÀóI+Sé4À ”=PVžÀê6=;TEœv�J`yœ@Ù#�…/r &ïÌ!•q™@X…¤ÂVÓˆ°üd ¢V½£«LM·�¨8�²P…–ÏMe(öæŒtH^1f^Æä^’y˺Ïáp˜Ý\¡ÔëÛŽ%wë Oh­“…t«ïÒ°zÅ¡&&K`ãÒ°'PödËŸ�Z5)£¯ÄüÃ'™, ”=aܯF½ÕIíió3'I Œû›P‹Ä»²G ŒÍf õ£K}Çä&³Y(Pö„…O;8t‹6nˆ 9›æHôê8…è*àØâÀäH‚ÜH|¼/ i:?¬SHu zma±¶ÛÓ]ä5!!è%� jþ?"3G}PF=Ð>M/«áfÐ@VNÜú/ ‰[üpJgk™î ‹E8ßB<£ÉfÁòqà3’…\ý¤)FhS6Çt†/{PYF½€Bi�­;Nþáæ�U»ÖçE´0ÜÖ€ÒIçƒf ­j«Øµ›?V½4V™Nõ{Ï–H�a2„qíÅnƒ ú÷R•Íû†ßØ–=au̹~XŸ++íŵ/~ø˜–~ , ÎA’Ã]0ÁÃOžüK ùn˜h*‘O¤ÇÝçóéq Ù–y(¨d”†FÃxœ&CA�(» _ÆQ ¨�JÝ’=ö/Óœ¨ÓÒ ö,i§Ö§Ã“³ó›– âÓ-/ãf¹­k_»åÅÊ�0îW¥oçú%zÔñÒ�“޹+'‹ú� „7E�@ì×ZõÖÆ .ºÍï×ëm#7†ûµWà­|öHF™•Ï?ž#¶ÞeÝgó™C Ù†yÆnêêû±Ï{sÙŒ� ”=a°1I�ØX32ç‘™v_$+OË÷„Û’‚”g–§kë Ót$„®í:¿Ä/ nË~YkH®è}N•šß”ü8ÍL Œ³+^Xœj¥�ó@!UÍs<^q6É}p[ö@Yy"C¨Óô ‰ ”=a¸(IC0LšíËC7.™è6±�Á› #âë¹H0Ϭ ûqmh¯øAfÅÊ�0îW£>8V7Âwû‹çÄc>Á ã~EgV"ñmÙ#Æåô9ªñ ²—ÃSù ”=aá&)‡>Ú‹¨�sø.Íœ»Zdæm¶>š£ùSÎ|ÕÛã*i;œ&šãÌ(PvË™¿î/!0ಭ‘ˆº(÷ïÝXêhFåÂ4Xßõʽ«×¤ã½¨|³‚G°›°&_öd]¹²Ë­NK\ḻ‚lÝåOà.­Ã2œ�®×; ä5‡Îˆå©; ` Q(‹)QƘ"ãkưÂ}¬ÔMß¶Ìdyå±?#+Hj‚ ¶–I�aR30èYÜV÷Yì�BêÞôä#sQ×=œq“KÜ�õÎâ—ó­9(ÎÚ5‚âg½½1r6£ÛŒÝSÛg\ªçŠMŸ÷(�²;Ö9ÿÕ¸êi:�³/O|‘Ò‘uv²«Éµw¬uçÚÛÿ€k÷@![ñåŠÞõÊiâAÏ[Û$°ø$ RÍ)‰üZÏ"·(¡vƒF/+Vg_ÎɉYÞòú9zÕÎz™¹çy½¬8á×ÿ •épòûéÉæÚ£ïkË( M} ).l®ÏièÍáOMTð§^õ#–œ�„·e÷äì±Ö¶ÜU7¢$ž§1 ïÃ&)0NÀclã{)ÿ Ì'XØB|?—œÈ)ìöó? °=PȶÌ2œ%z¯'×ùxЀÌpzœ@Ù#�Åý Ùqë'JÂ3�R`¼ßÃÅ<…×ÖõA Ï…T¼�ߺKK!J~ G×B¾¬›êw½»#pqºÌÉ ÷88á|6 €òûiJg2ƒ/lŠ�(&V‚ÝW§aÉ™ìåòa(Pö„áHétò×ÓyÇÅŸ°ÓÚ߆J äFàŠ]]¼ �Š[Lò¶Eï|R;i§p®Þ¯#ôttÝ!±è‹Õu¶û*|šÒ"À÷¨ CˆÙÎd³K[¹ÙŃ„Ñ5M'öƒíÖû8�è�e�@˜kšÜÇâwÛìb|3Ñ„uf]®3U� aâ»9oæ†ð¢w¥T“¹_|‘ËZ-Ûf~ß?)‹e­@.«œIwõü`=6¥2˜ün*“‰ÄàS}Ù#�E¹5® ÈS‰Ð~ŸM·ÖG³ô·ã"Ügã}¡)”ã}6èXaЦíX'°Æ¿úæ×uwÙ�~aܯØìf$Þ•=aLr±íƒ’‹(d‡ºèf«�O³^¯…8z·Ù̱ì£lX»çNÈíæQ�Çö»x\MôîÀ §µß_¢W§9œs3ì/ñžÐ4J�ñþt«I Z•Ì ½áË�,"‡Ö~:ŸCó8!›Ño{Q£f&΋º�šZ²ÑeɬÏR @Ù#öšÖ#~^í^ç¯¢ê ²m ŒHí†Mí•ù²G Œè3Ø«Äõ±Y)ì­÷yƶ:ÑèaBiìH®Å^Ü7=e_™´Êöéå‰d\Þ4†™4–%D\EtBpB*�&öàØÄ^ðí¾ì#r4eé¡›6 ÿŽ]¤\ŽÆÊ�0 Êò€ÒeçJ+ t¨Ô›FC/akú äœËóôÛ¹ˆÉ3=Ž9_ÖÕ¶zîÅQ” øN ,fÜ÷ S�pÛTr"Ø@¤?2Õõͯ€–GÇ}6Ë[X¸}C& ÑÖEg!K @!Ue˜\MÉõJ¾*“v¬œ)&€eo™Ü+J­'6€…@ŒÙ¥Z²ÖÄw€…±YF|?e­&uÑ£m wÉ1©'¾è†ŒÎT£»ºE³„ ×°¡„#Ó ²þ0l ¨Ì—=a¿¬F¡;(ácÇ/P ì¿ü\\,³¥ ÎX1�î‡Cí²æÏqdeδ­ˆ÷¥'œÎÕm½8Ò´AÑ�¹¿´'8ß–e#—e«U鉈ý“l$Ê�0îW£Æ˜ú%z%ÂuøŸ™kÆýŠÌà‡Ò۲ʢ~„y³w„p&erÑpµŸ„îXï÷]¯µªO ƒS>Ý&П&(\]|‚€B*î×¹åFù¤TR“ϱÑmbVŽºce¾6T@blþŽ&À018�”úvuñÔ7…T¼�pôBŽéåÐ&t–µ,„uÈ(9<_f'Ã…ù�Eä¹Úªø4—ÇÉï§5Iê_ëËBR§í¡€œŸM«¼"Š>L(¦eÝê3Û¸žûÈ9Š €eo)¦kÄØ^ùY»énò×~,ÔÊqaþ:W�fwÂù-RS—%ZM¿�¢ 8?â⬥D¨jÁ*ó['ŸO²éßÔñ-Ûð|<Ç…,È “•­p>5ëqòûéI²‘á÷µe!IüÙVŒp‚¸eøPåÕÝk±kJ†õ0ñE7|¨·(K�Ë\¯}Œb fQR5Ãu°ÎGSRS—“ÎcÓ(ï.¾y—^ô`h-Wù0Ê�0HXAÛ !ê¢Vã)e­]0TÈõ'GYP ìž²~F¿wØ"êâ¶8Ÿ¤« 5W{œCh¯JMß•¶ì_œdŽ T^VlŽ[áØc”ßOS– ޾°)ºc‚—ð¢՘tÖHã§}FÊ[{‹2X”‘B¿áÆIú ¥âÞ¶ïë™Ð‹Ó#>=H)€,îWlr%ß–=a_ïÚŸæë'\_fìⲬu'H Ö·OÈE�_tK-¾æèrÚVÅyUœ�ö¡ÍXmã¬[ÿ‡ý†ìÔ;”Î+aÉr¹©Ó˜^. `àµUýUY¥@ùõ¦éWü`_vG�æS�n ê JÐý©AÚ¬dà´_«&Šþ @YL^ï=Ùd·q“âШXkr*Müèéu¾úà×1Û™Ä�‡ ”=Põ£ò“Ýn8�^Ù& ½Ñ·ÞIqažHÛ8¹þ¸r³¾">œ[ft¹ûtž. �í˜nÓ\æÎ*ùVÂÙsÁ@mÓ @Ù#pCu±ú$„]H^�B)‡§ÔDZbpž…‚)P ìŽÌý‰¯ï<”#‚d“ðƒààÛÔÑ¥ %ü––To6{ø‹|$ê®KÝê3XJ°ë‹ØsH“¢S´6J�až.ð°~ç#lÔ=ÊIlÊ6œ)(rh"Wí…q¿b9ûHz[ö@Y]îz€§Ë(dwBG-õ 5«ÇW ¨>R×C:Ÿ/•r`Lza¹ËjkúÀey �jçL­ÿ–©Å�÷e!S{´ÏáB‹¸U?ô:Ù]p�¦N† “»�›Í8Û¶&š²õ0átvRôxѸÚòtB‚éXkŸ" ¸ÝŒ‘tUñŒ$…Ô;ÉöjsÖˬ¶sÎsÙ^�_ôDa–B0²²Ë«â¢4 0²99êt˜k®l{:b*<'I|Qý0ÈßyÖl`†ã¸à<«êtf“ª¿ò©º0?æ÷1Ÿ¦úâìéŠsC�KäySb�“Á¢D%ŠEnëâid�Nï—¤ÕP?Wk4…æiÔg¸ëU–ÃôB"§¸8eåe1ö¸©êsìpÂi�§Ðü7°)4üv_ö@Y˜BÓ RƒtSȰ¢Ý·�ÃZàDÜnÞô#�=2û—„£é§`ZÊT"Ú€ËqqÉ‘¶ >HŽx �íéWº¹^¢Õ9wLŽèá�¯—ûºrLœôx•CxЦ–<¨Ã §°o—÷êÓ ›ö›_ÿý„@â\髿-Lœ{m­’áÂÄ9:û$UÓVçjšs\)3«DK¶ùŒ§8fÖãÊ8fV·ß.Í €TŒ½â]oKy.|S\œŠñ²âR#üƒŒ™ÃÉï§'ËOGß×–…´íëžœãhW­ WNÍ'€üTµI`a'½"©þH2؜ο›â+rººùpž®v0¡šÐѱ³nn­÷Ò g:èX=&Ñ[༜6&Ç…t¬õžªö¿f©j¬Å—ÝSÕ/4£ÞÜ1Û'[È”ÂG›>).NÓAæÌp[Õ̰ ©·KÎ}¨7ŒkL§/ä[‚(ÚÑãÊÞÐŽOÿ”BÐóX—åUQN l�§g½«¢rÓ1»8 ÒãÄÝ�˜œ*¢;�çõÒ!$œÀ²œ*%¸89VʵQþeòö*cžÖ'ÿôˆ¥|•“ÿ‚&?½Øç¿ohOŠflüšÑ…ì=ŸËM&ÐQ[¦–¢¶º¯cüÚÀ­¶i;=æ|¼M;–þoQqÆ­cÊ\½ÔóoÕ „Q7c‰úÑ.½.u�;8šÈÊb¢ˆùÚwëJ<ã,R`Ö£¦j1æåT‰#(PvG¼7¸ª7ÛÁÑç:ò°4g\oS)íxFzÞ›Ž3N€1=�vˆã#Úú>à#Øåí�B*Þ´ޏY÷rÔ·�7:ÒÅ&TŠ(‹ bГ*�Û—A…Œ›Ñ;rûŠqù€œñ8�²[zæ…üÍ8sO?™VÅ™7dv»®­¬0Ž#xxÔÆΓI€ñQé0­\JÆUE§œ'¤Ú/âÈ šœpÄRºê×Ù£ëv®S¸U¿Ç‰/"Wýž9œõ& ­ÛzÞÝÇQŽ(‹IGæW@*ÔqLIg †{˜÷ÉÎÖoәѠ¸À ”½áιžðÒ½m½zU‡2üÀ܃¨<™2™TåË�,ß<9ǧ !¢*n°;î<ïbôKfœó¡A¹8ç+ªu��‡ öÖTy ŠRð�Ý‹ã78¼VCïŠhAB(ûdïg½Xÿzås€¾Ÿõ´N¥3^Ð%€!ˆ܆«‹OnPHÅSN >ƒäÔ‚Ï÷esj³Þ?Pñóyy*Á©J ìžS{IoŒ¬»ˆÊ¸ðíƒ=?¥+mmÎmžÏÃÆ±@�²wÄÖåA 1'E�ÖEDž½‡paÖ ýj$Šõ´ãu\˜8�²8ÌhLr (Óv°§íûýéB™Š0ë¢òä@ˆäFP�/{89ê9¯ó¯VûÈ‚Ùç�¢ÃÀÊ:+†9† JsØÛ�(ÿ¿W¬Ï^Ï¿¤_î8TÄ]oϵA%¾ì†¨mÛ#E mmBTÅ‘ÛsìÏPÈÑå"Ó”w±Œ�bеO£¢vk7úÜY7VUŸ{¾–\°©“ÊîˆåÔñ³:0ûË Þ“¤ÚòJ)(µÙüyN’J ,&I_uÙï1x9GÊûZˆ(akµéëmÊJ÷'(¶€eïØÚg(‘c0l9MZ-eîk =-GîÓ À½šÃN�!û¹�?qÒùÄ ¹oLYÑY÷—M_¯Ïp¬(ÊÞ±¢—•ËÍ~»õe¿˜†ìÎÛSÎgúhBÌYŸÏÙ#?¥ôfRMU‹y¼Î ˜¾¦R  �-HØlWÏfPXµ‘.›ç^O Ô‹Å;›ãÏ@�²[¦í% RB Kµ-Û¹C² 0qL£¦A‚YØöSþ å7[½¼§^âs5óñ!¸_±|_(¾-ûE¾ÏõOøPÈî|GùÍz9…¸êþO~"£üïáqÂ)œ­xg=’g‹Õuü`Íëqâ‹n×½ï�„n<^ ²}â#N|ѽ‡xÍ ¥膪QÕ£Mú%oNtCÖ8y7p.-åf½ b|½G†ä(Ps~á™BÐ1Zuq^Ö9ÐÅnǘÇÓZÁÖb°®f{R`¸µ84ÕÀ÷:éjÎyû€Cð8�2ŽCèŠÇÕOØ×s/3¦O¼¡³i ŒÓ'‘ÕÄÜP+ýƒ¤’ ­*®ù»éxÄ}?Гd� ”qdA Ak}CÔÅlOø8­›…·ey¬Í= `e8�²[B!3¤ ä6@TÁ3”öÄͬO´ôà I錇)”âbž QNŸ´U}À x �z§ ón°g'KyNpjaîqeoæ/ã8ƒ …µ>Ë«¢Œ50•~?ä‡�tÜm½bù�({¸_¡}µH‹OëvÜLå?ºz_ÃùŒMÀ){ck¥@Î䔎«‹§t(¤â®‘tƒ.Âæñ“ÀQzj¤¶QŽ É‘€fA’× çim ©iÆ\Lûò=W¶a8ç˜ À ”½c..“Cx7üøÚO¤[$Z²’É/ «ô+ÐØì">Ÿó&Ÿ2é}ISõ°)-JÚ‚[&¥é­€ŽÈ&«†siÞ f$&}Ó†!?IÒénƒb¼†ïãÛ€7sf:¤À�7lcJ-¹ºxj €Üã )qsÍtõÕ��l‡¦Ùá’“~�g´’«‡ç•(¤ÒŽ�œôÜl߬ñ��FÄZ(†ôd@¯¼'N\E4q8!•NWã“ Õw=ûÊ�ð«q ”Å«q\¤œ>ÖgD]Ü\„YÖ�–ng % YS)† e0þ³…º«Š_¨PH½Ÿܤ;AW[îkHÁÁêÛ⌠­¾ƒ…|ÊߺšhþpÂi�.ا­ÄEUH¬=¿`œ@Ùí‚ýªNjj TÖ�ûÊðéµ…r`H(혚jWoª(¤âŽÉÍÛͰi”÷eÑS aª7'—Uþr<MR'¾è-…p-/}ê«z€ã p¨àlÚ§À�C ŒófH ¸ºx>€B*žñ Ó:Õ¥ŒZàá>€e7L0ñ+tÖSŒxʧ¼ó“¦å›U)ç-X©P ìv¥~ÝJÐ7Z 5qŽöuõ±ëRØeocM™²Ëh¯ß“®’<”�;“gf î :×�žYëjÁE 9ãÐT{& § À ¯¨_ÏOêJW³éÓ' ÊîØÝüWèX¬3(ñŒ—J9‹I�x ÆPÙ} g(�²Îâ ‚ßÿ烵KV1­2:}Zªñ¬ÃðÐ…¢Ó'PÓéù�p"Xk0¹9ÕYÒaì�]H®Á40R 7CºÂIç¹rߨ Ðy«.hS¢}Œ 5˜U›jÁŒJ™WÏ„PHÅýÂÑöù¾¬¶‚…£nV=î¿yŽÝ/½0ÇñMójŒ•>µt®¦Ÿ &ë¶(¤Úérß½ÜÇ�÷e÷ËýwM<(ÛDzÓDoû®.~µ@!÷“-ÛÑâ[+ñ>ç>œ§R�õЇñ¸Ùb0|¦Q äÌo¸ wÒyÞ€Bª =ÕÛKV[ טŽ{gí’C:60žžœñ+wW¿ä �z{V67°¢·U7a^(vàý‚r²¶®mC¹  @Ùí‚ò•%&0h[l•q†êÝwÒ“5›1‚GwQk\À ”Qk\Ýú¯Vm_.fÁ“{0¡m¥@ά+ݶªVº(´Þ¸P³÷qê6Ëþ“žÃ‰/â–w)-ŠõR^g�Àî vªÅÿ„ô QÓ(† I0Þß®:Ûj>Xxz �:ûÓ=ä6Ïup%~xZ�áb®‡ºŸV°¨ljú`1êpB+ 5=^;Ùž¸núd1ê�eñb:)ÅÀ¶N"ꢌ�ŸVêh�éã|Cãøj¥À˜ÉÁáþv­ÜVóÁZÙ…Ôzl8Þѽ†#Ò:n€Zû¤¸˜± ;.ZᬠöTÙI^ü$-‡«š¬ËW3—*½ÔÂ$«TÉÁ,—ÄX .”%Û6 ®· úäÝÈ¢øŠ:k�#�Ú6 œlÛGÇà.Üânª0Û–^’Åàf:Ñ\g>¶¦%ÎAÛCa,[/ÌU_dÄOpGRÈ,ïã`DR‹!Ë^ÄЙ¢Ýzv¾ÇÒwË€�¡ÐAÛFunè…ÞÉ‹cÞäêo -½.C©l} ÏV(ÐAÛFanè…žÁSbÞèfÀ’Û¹á˵çváà¶¢€Ú6Ë‚Ì�U:O‹A–ѳ�>·t”‘z�ÝtdçÝtжQ·¾ð¯puaS©¸Á fBÚâBq¯XŒnßø íß&ü-�3Û¥ïdÙ¿Ä9Ù´AøõNxM ƒÛ ð𖿸â}±‹ŸÆ²Õ€sжYs¤«C08ðœdÙ"�ø¥å+q¼§ÊIVòà˜¬’ ´…½î¢ìu�Qo¥îh§†7ÛªøýDcÙ!qN6mÙ’i ¼bº([0J �ö–v¨ûúŽ��íÐA[™í *iÀ@Lãé1È2ÅÇtz$7oéE=Š,Þú{{"aN6mÕ!iôÑæÂ¼èrLSZ1a£5úqq*ox€ÿ²>*°¸áQZY$DÙË":£ÞÒ–éŒ)±u:–³Qуßð$©Àb­^tB(,ÄèöŠ€Î¨êêRÈé[:ñKJ×.ÌgtÐV.`•T 80/’A–)h…AKgÛÈ@Çxu�±.�8'›ÊU�tu‚ô1ˆ²9Ÿ¤a’J·tؘ¢:ņúŒr€Ú¶vô^è.<+¦á-¾—x•$Ýíè™÷–1~}ÞFÖç ­LÖ¥Oéô_žƒ0[0øã»ÿz×ÌþѦy7Э|4ÛÝÜë3l¸?5ôMß󔳶ܽûóîÑ�V‡�Á]üÏíÃî_¯ßýòOÞœvíU_Ïø»þø®æ>;ÿ(^@ßÐíäóîúáÝÅ�_\û7þ!½®¡?ý}w—Ëÿ\xwÑP×ß^ûg §h+RvÚ ½·à!<…ÜgÃØpjèÛ~ùüiĬ-üàÜ ßåëŸy˜Êû"2Œøu ºNíî³ÜïM£7I0@i—�d¯¸èŒj«WKÇ©¡ä;�QqÐAÛ־ЬÚ~æãèÓöBœlÚÚÍP;ah ˜·„iµjhû‘/�=ÝFn«ç m«jH WE`¨å Ò%™¢¶´Z:¯E {)à!¬� ,n¦ÜM)g„$s=8gÔZüØÒÙ-¢óC¿‰„à±µçTè ­\Y€»«t^*ƒ0«"—mçp×çÔ4Wó�7ÀœlÚäí©ƒkt“ �.ÈäpÀ~$ílG¾ó¼_^�6ÒU‰s浫 ÷Bá)1 oñ7•¢z£[Çz¦%Îà¨è ÍÆRu :-O’A˜-d¿µtc7E骉¯9êOá/¬�Š3¹¬…Çç¢ÎàñèŒzë¼¹­ùj¹iZ,ÛÈ›%ÐAÛ¼ù-’JçõèV‹ª¦÷cÏ ©è m›¤¦ë¦cЋ‚Ja6—Ì-» »SãÔ,™Ë/i ¬�†+—_hl:gÎD�Á™ÎÙ´Ö)*4¢g ˆÚ�CQ%ÐAÛ6EMÞ»3`Ð…xÑ Âlþv]‡­ˆ©_ŠZ¬½¤ ±F®\z¡;ª¬9“ti8gS:w²zækáüŒN[u—°Ö �Ž+×]`ù:SÍE�ÁT%Ðõ~¶jäs1mnòמËe—tž" W.»ÐUæšI²3Ws6�å‚Ñ¡F:/=Vñæ¶B&,•§Gŕ믂Õ#Í?ƒ¹J 3kŠ�Nº�±{Ëä“úVf(�Ú,ÌPG ‹ðÊDÙüMz’W/|hy# @a“¬�+€`ÝoÎÅØy³Ä9›Ê:ÿªúpÑØè!1Qù—:h³ð/�–²ˆ²š=Тª ÷2Ñ� ý9$Pâ´m“ÀÄ„uOŠA–ͺtÎE–@_Õgq. tж͹N†ÓÌS¸çh¤Ûúë�âFš()d–‹´w� Qf8gT[a] �¦ G˜|&²“. s²i“r­ö£Ðwx±T9&/¬’«:4Alƒjž­ŠFÚ(+£Ë ¼Bþ„$3ùœ3j­Ò­f®ù&¤é´ßc¢[€sÐV¤[Â×5º /˜.Èä}‚7ÓLÕ²w‘a9• åƒtš �Ž+Vè€ ‚ì €Î¨uæ`4ÝT@{Â;K°SžV* ¯ÑÁ\Ž™J˜3i¬��Æ­�ø �ñ8‡ìÐA[™ì€)«4 ^-ƒ0›…å¶S…KP’Ÿ,�1Ë•`uT\‘1ãªjTLH²S1:£Ú ïiÆ>Ü›>¾©fä=tжÍ{RÒ1h¯A%‹0›ñ+l£Ûp”qªûå¼¹‰nÎA›�pè4žƒ$«¥ hèý*?û3}‹`8ƒõÐAÛ6ëy#©7ÃDpŒ~ˆöœ¤.qN6Ù’º A‡ úDÙœO”\ ý–IYötLø;˜'+¤áJ¾`é*ë’̬pΦ5)4$ FO~CÖ –Êó£álî¢�ž\Œ™ôH˜³),m‡~±§¼;ú¢h(SBX… �,RÂÂ’ªLCȲ3 :£âo3�¦ù2…a¤M#3Óœƒ¶M¦‘˜³ŠÛàÓY¬ ¨åÛN_ÂBª ËÀú¨À"U-¬©J3„,;Í 3*.—¬w LÔa*“C0ž$X$‡K{›hAv¢@gÔZ±n/¸�ôYØ ¶ ‹4Ò�E¶ZXY5Ïç¢ìy^âœQm=ÏÓ/?ä®M¿7mMôè m;Õ÷‰aë´^6ƒ0›¹iÉž~ò3=ÓEÓÉ^â´½‘ì…èW=ÊÁUÅ?È�\� �Š+“!\Y=åg¢ÎÈøçlZ«éŒ~‹¡G˜ç%ZÛò™Ä9hÛÌhSâ÷*mƒLe2³,R·¿ ;NWm³A†Ä2°2*®Ì…`Iõ|Ÿ‹:#ßK 3ê­&×fâwdý q×ט\%ÐAÛvr]§HG ­…,¢l†ŸÙ…‚pãpšSàCr-XXæC¸°j¶ÏE�‘í%ÐõKVÓw¤=ïí—g@B$�ƒ§H– ZšžZsYg¤V tfÅ!œÓ7d|§K+ŒÉKâ´m'¯aýÁÉ€ÁÇ Y„ÙæNÏuØ€ìç¶‹·û[†:hûI)ƒÈ -ƼìOÙ2†€9Ù´™/ÒÓhA]�ÉÈ´ÀL[Æ=Me³ü†a Ìè m;0ÏI$Ô1h9¯˜.É6‹"eÔSNÓ¯çl1¯Ê' é¸b^ÅYÔ¢´�dÓ€sF­Õ¸XÓ&›es·|)Ùè m;.¾‡êq¤üެ㗠lqpÚ¶ãPbD*W#‘A”iaO¯™.úôLKšåm1Ì®°¬� ,f×ÂÂj¡Zˆ²‡j:«ÞDêa gogú9v°À9hÛ>b�t >nÐÈ"Ì6wj<¬‡†�žú37öx8mñp�­7®ÏŽ.Å´¨"Ö>¯„Û:=¿*Gfxæ Ž+æÂô©Q'“d:æL*«!§¦BŸ<�&¸9#äÐAÛFÈá“ q’‚VÝ@‡»f_KÖ}9ꀴ ”Š+�‚æºÇg¢Îpx�s6­ßô®vç˜æzŠ—ãYÝK´m8Ør‚uý<§Ï´²È3ÍãòR^ò…šØÙÿÜÄ»i QQNk¥ËagT F¹$s0’0gTÚâlTˆ’ùÑFóÎ&qÚ¶œ-n�3[ JÕCø¬Ý<,‡¡ÃIqA)Wt8ÔÜfâ¹4»‰Kœ³i¾ìÇÊ#(åù%}–lÝÜ*„).h¥Ëáu·y^.ï Ï“@gTÞdVýª¶*Ï;‡ö ³’8'›¶ÌjˆSÕ-SUM#;Ä8Çë¢YIi¤“W4+ÔÜdVBœÝ¬èŒº›æj¹§²j–k^ls8mŹúãæ¥œuU‡Ã×9/ë�a×û?Ðeœ¿;|z}ÚÓ5›tOg=Ͼ ݼ9ýŠÚêÖÓºSÛÞ_¨µé<Ëå¦ãÇЭ95¼Ü…Áè �øoÇûÏ/ûÃ#ý鲮ʗuG—…ΡÃÍã‡0°�­ç“QÜÓá–5óùamþøúxûr8†±èw£‰‘Gy:¾ò@ô䊈:]w$¹]hþtüîæ>t÷Mk÷‡Ããá!47¬!7¿>\…Qš¡§7ÓZ¿�'Bô§kàçe\û ={¿‚ñ/w7Ï¡{}šµçC¸µžN-A‰›¯"8Ñ.¬@wµŒõ™þ9…ië–5 CU©Ä¸L]:½Ÿï·8éw¡c}U¯à¶�¦JyòÂŒtYïâ\$Sݧ�ù)ôÒý¬µ°Š“àøhï/î�_\63]U;]ÜÞ¼ì?|ñíõ¿“Ãú7/|Álã]÷dû}jB?.VçðŽ^ùiØ]Ò�º•wGê÷ÏÜ/u"ºg6íò5Nì7qxŸ XG«Q/‹û/¥q›d +|‚ÞsͪZdü Ghó¦yÂAš6µè_£ž~š)?ûß×s¬›á›/â0c·j:‘g÷ùz\ãhÞT›q³5‰Ñ}\ ï#Ž4’À 1"_Ä¢õóìÿ­‘�ŸATÚ�'a¾ê%¾ÆÊMퟴªÿvCò„ý*Éa�µœ7Bóu|·þafo¦ŠzZcíà›µkÌÇ¿¬ÊóÝ1¶$±ësÌ0óÚôƒODBçt¼岜õrwxŽ’—'Zsxª¾I3Èo>ÝCÐ¥ V�1ƒøH”ØÐÏŸže:üù)™¶i2-?WЋ®oƒL•Ëù|w¼ßÇIÏ[¯Óúáø°(Üu´®õ s¸_rg²8ëøÉÃ=ïo�1mÒñ`‹Ê‰ Þ<Æ~I¾ß?Þß<}Ú?ìÃßúqeœ­–•Èö˜.ÚfÆÙH×7WÑŽëêdÇ—tƒ†'áMr¢;¾swÕ^ 1i%qý9¦ßD‰ã凃‚go),ÖæEwÃþMß_¼~r“ÏáÃÅþé%d&Oª6(AߤîôÍ…û=G€¶�Mïëá[ô^O?*›ýr‡¸÷÷ fíœeÄ]íía#Œ,1ìré²Iž?Š£rˆ\PM):&£ò¤d3½„šְ8ó_²@�v(Û“€Dz_Ìù°ºõ8Ö僰7•Ðç/˜ž|ÖÙ5dô÷ïQTK’N³ûuaþ–@~IñÊ«“Ž”¯dºN·Çç÷¥ÕLÂ[aŒ)[•/#ÅKBL}JÁ©†Uêf6 É5§�ЬkùeAF¦FAõ>,üÒá[\­%[­+ÿ‹ø|‰ÅüÃþŒAuloaªÿ_ Äó8õù5Jº¤W_-_�Ë’|óˆÓõuä'Iš}�¼-'U:o+0ë\lAá<øÖÕ·%«ß]ÒE ëlŠ�}œé½—¤[�%zS e¼7üaIDkí—L†¨ƒ±N 3ÿ|±qe{\ôµUUùû�X›1%„yµ\(á�q£Í·J¹c*¨%PdÅ0�Ñ“å-ÃUJ„R–\§ü¬® C3º¤›}‡•ãÕ��%·é³Ûw ÏþiÔºG޳°ëEüO¥Ö }úIìzTDIvv Oùu¶ ³òëúJ’÷úª-’ëÙªô”ºDä×c:Çoók¦Ò«Á.»ËŒûøÈÚf4ô´OÔ#¯S§^Éø%]º:'öšðñEëtS'Ôðc˜ËSðÏeÓ§æÛFãLšž_nže�Úri“ròÃÃ+)?>½øÙ FY «’4¯|Üß¼œ<·+zÂð¶ì‹—}´á65÷žŽþiÂÀýicëâõyÏòâ^)}B`Lö,�¯Oh¡+ïÞ.M¯û§Ã-¯P7fS²ÿñ‡¸‡Ö޾N¡'ÌIߤ‘ëå9VTM×%1¿H_€õý<ÅŠª Ö�:ÿqÃúw¥ùêB„žR§Yæ3‹ñ×lÛ)•Zf¸Ïb.¯fºÉCÒs!‹ÑIQïôt·Dèú‡ÇèÉ’¿œ tNͦe…Ò ›BŒÝ£:ŸÿÍѻ˺�>-ë–T—ǰ`t·JŸS2Þö^DûÈóüò´,Ei^ž¿Šá§3Îs[Ѹ yeêíŸ8EW\¢ ¿©JQ¤]óÔº'܉Ì詃½ï" ÅËÕG2Âѧ?„iÏ äÍýë¾�ïx9 )]ܼ%Á��ýtq|ŠaqRödNÁ£9¥—�©÷y˜û°¾}:|ýºñ~Íã}�xå{h×ц²\çgL],„�ø ¶ÿ¤m¿âendstream endobj 688 0 obj 67245 endobj 696 0 obj <> stream xœ¬½ËÒ$Mn%¶¯§ø–M™1÷Ë–MK%ãbl£n6Éž/["Gùør8"2Óq‰“5¿ýÖVÕ(?p¿àràñ¯_Ý­ÿêô¿ãÏßßüÕ߯_ÿô?t_[þ÷O?þõG_|üþþõ×?K£mQÐðõó�? ú—ýWßw·mûZöþÖm_?ï?~÷_þ�¿ÿ›ÿýç_üüSAìý1�¥A§¸Ÿøñ»ÿo¸uÚd˜nûÒ ‡ôÿüŸÿøoUºÞú~ßéßþû¿üáM_ß=[[¦£Í°hƒ¿ùùãïêèûõ6í_KßM·±ÿº…­äû!™Öa¿Mc‘œ¨§äŸüÃןˣþü[¿vevÆuÒgÿ·ü*£Yæ¹LèÜÍ¥aíò¬Ã|[VÕ¿o»}éÆ2ðáE2�Ëxç"ùãÿö£¿•‘õë×”ŽÿTþ÷·¿‘j§åû‡üè×mÕœ¶a¸MSÑÜ÷C·¯¹6ý“R¤ƒþm4y5u�NÑ‹êu_nËüÁÔþFªðÙäÇý:®okÙ_ÿ­lÍ?”åì§iÝÊrêébæ‰{äÒj/#,ÛoÚ–^e¥U™ÐÛ^`Ëz›wkÔŠžm¶q¾•ó¬m†n]tþ§½ëTVMåT¯å‘‡n¹cjE/m¶u¾u«iÊ0‡¡h÷ÛZ[Íe‰‡¹À¦åÖÛÎÉ^Zíýt]cèZ¦j_·Û^‡^Ý­[ n›µÛ­ì¥Õ>�7k4Ìe¨óZ6Z¿Ýj›mšt:æ±ØŸþØgNöÒj߇óÈÀYÄÝ! »»*:}ÁÍÏ~Q´ e%ŠqÚöÍÖo˜¶í6�eÙÇñ¶“àd/­¶®Xãc¿Lód+XVuÖ¡c^]­2‰Ãx¬M+{iµ•Õ:fa(Ï·O:öþ¶¯Ú¨¬ómÙt±–Û~¨r²—V»nŠ«ñëÓþ‹º"ûyª–2�Ó«ª2­žÉfàPÒ«»\Z%ã^{U²ŒÝmYZ=‡ì©J·ëêÆ3/56ãY—Ãï Èžª¦¹ÌÈÚªZ–ñU϶—5uC:dO=s9/�›íÃp]¬‰“…Ûü¿>,êÃA2'è75¹¨këVà´õ¶ŸßÅOË4�%|(ÿ=c¨Bi 3O%¸X‹Ajõ—ã#ž ìü>—ÃVõíõÓË#õ㢣.!Ôh=�Ñ! ]YãN»,÷˜ØûTSQ¶ŠŽº�ÙúìŸ}‚놩¿é´ìºåé9‡¡º¦2êÛ4/µËîÙ#8˜a,6H§e_víùWz,£Ÿ‹E,ƒ.Gi­]¾<¤wDÃ\ž­LÊÜu›ŽåWz,nn_uÐëmØ-YJôŰO*™'ùÓ—­Lg}Š[¿×_v+‘µÌsÝk‹…ÕŸo×µœy�Ô²Pe'úíŠþ¯/.[ r‘Œ·þ×ú,óÖÕƒ]â¤u÷Ûýd?�Ãmý_Ú<ýÔ•¥©;¾l"·]Ñ�–PnÑ(K¹¨ïý•‡¬–){YÊ—gD›Ø•y-G±H†Ó3}Úc±—ý ƒ.k5n»Ff¸ ­›5lY à׺�·ÚJÎöùôâgŸ%I¼MÛ¯>æXbÛ¢´øØÍ¯%úü³Ë©›uÇäXf¨(-áÓT»Œóœ}Îã¦çç§v*¡¨(Swl .èô#Ηõ‘ßýj�ËRÏJí1zÌgÀqvº•Ì¥û_{̵ø¦Ã /�YI‡£cüH¾’jû×Tò)9I‡®DÃÅ#t_ÿöO7ØIŸJȶ´¡ÖÉg,j~ŠQž‹ùY#*�P"^tG½**´•FS±`Ý|1' ‡Pœf_,žÎRù£ÎPŠMXËù(' ÀÏ1½9Ñ=P¥Cšt½tHË1¦¹ºär 7oŵ3ðÌ€ŠrˠÚ—c¦ŽA•˜O­ÄTL¿„SÚl5F(�nó9SP@v”qËçºã×€BŽ�ZÁyUƲHæå6|°€'^tµ|çDUkPÇ”Âp ꘈî¸é¬&ÑÆ²læÇŠ»žjòîžüŸ¼Ž%Ç 7‹Ýí±fÛ9Aó®mžŠÃŸ×p ê>ª3,QÅ2�£Ê�²{ Œ:v®7þØPÈ¡3›IÏîAD‰"jOn&À È®6SYܺ„¶v)Ÿß֎苛̷Û[)ËKŒÝA¬±ÛÛãdñö>7ö1 ‚ QDtE­iW7ô1˜~Õ�¥DÉÃð³3L ­ìÞò°Ž90ž¯Œ™�¡';ó²ë):Ü[Rù—©XÔ¡³Ù4·»ã;xü:¤(äVãŒd±^ÚßTR—õ##é�²+#y˜£:]6Y)¬<ßtd-«Õl²ˆþ¼ì(# ’ÒQÍê‘öÈáÄ‹®¬Q»ÃS®‡MPÞ·¶: #PªÊÏ8p(¤ñŠ»»=�eŠ�ÝQyÜÚÞ>8n(äÐß{”i/*”F)ié4àQ( »ö(�½D åÎt׬‹•ttOmò4—éÓã«wrúŒ2d×fù­œæZ½.}�zû”7„�]šÂ×€u*m7½-0,ÇIŒÈàñë�r`’s™ý¶«޾ 9n·±óyÅ3]GÄ,g ¬ro£YMiÙfãGdþ<Û`R\�¡mȼ©ë‰÷¦rØ~SãÙ´<®H¶Ç¦v}Ù¥@ÙåÀSA‚ŠÃ‚Axû3ÆB,½öpÃòR ÒJ=ËQÓ´Õ眆ǾwQAÁÏ·QËÚˬjOË“áÄ‹î�*ŒÁ ”i;¢# nÌÕ輜«©Þ“�G½/»Æ!¡ïɦ'Ã…Ñ:óîm?´w÷0ᆜû­¡¯a·Þ¼íûOü– È(¿5®FJ>c€èRQŒDôn©ßj»úÀoy �ã~ë·ÆùV/®£ÝKdý–Ç È®üV³…RnV[¯¼+jßÛxå bÏ¡;ªb6+çÛÜ»£ÁrЂxÕï ›¢Ç«¸ÍrÖöõ� ó@!ë–†¸emݸ8‚Øÿ/^u¨÷ÒçiœnKìùŠ‚±*˜×Y*pŽ& Èî�²ØÝµÚ?ðí(äPóUêK°§þ<]ä*y €ìj•Ú½<Œvn586[³I¿ƒMjCJ�Bîxtô»qWSwjÆ È¯HRäöE´Ú?}ްyI�qRŠAIn´]}nx �ãΪþHA1%YúO<ª È®bɼî [)J=³Åœé÷Áò¢ÇÏK1Vwý¥•J:û¹�‰†±*(#ö³ë‹ßÏràiø�Á†?Áó{ÙuøórĺÍlzYá#®ÂøÙŸ�:¢ÇÏxÓ€¬íꃀÌ…·-Û¹�r·‡gÙ¦ˆð—œaxûtSý)ð4ë/>}N¼è*ðI Jaïúë‹mÕ+ûçt0Ê[Ù=Ðu.Ïãb$nûq]oUP¦´ŽÇG3fy˜8ÉEXDœ:v$‡ƒpG¨ëë[†r"†õ"�ðgÖ(Æ ´<lûú ô@!žÆ�£Ý\šÇ’FöÛq dq Ñ ªíF;sè�Ãtúñl×m8éEÀ"y9ÛÌ9AsªRË Öò]yÙ•å}¹º2î“ùüL‘Q»=¿ƒíiË•…Üë.Ê÷NïÎú[cûm &°=mH)0L$¢½Žq¥ÓΤr¨> ]F]·yèjå+ŒþƵ¾¦ ´Ùí­u^r`ý�2\ªm±ýV¬å�iûúúªCÊ�B< Ûá1ذ=x~/£Âv|XLúÈYâ’¾x–ÞÆÈ®+>F �ãö!Onºð$Ù$6�;–®´4nCÕ¬\Þ0„‘[i³U-ú²‡u~ ) Èî�²&LöÁ¦ë…R'äˆýŠåGÁÇŸæX‰Ä„²í–uauƒ�?ùÅ ¶ª 'Ã…)V°í³ˆµí‰X=N¸A»Øë2ÖZìXúó²#•y˜xQœˆ¥mp_Úò䪙žïÝÇèï|uN‡ö®‡ È.öîkˆš†Qã§Ê–ìOÚ�èÂXPÄ´á"äPu+»Œ�_Îh·š«Þe�ó*$l8).L«ðx%²ëˆ�(ä¨�çÜ»zQCϺþ2}г<H- Lqaú†> Ø]W|À@!ÇíT¾í}ž\–¶ëã€3û59@™ßEöš¯×ô­ÝßÁö°EK�Bî5oÛ!‡,‡ )†N¸¶ùL²Q_°ÜPÓ¨oœwEÏÓ²Ÿ»™‹ú( ‹£>¦Uy¸¥ÎçÒ÷/þšSßÊî�2L¬Æé¶MúÚÈ匠1׳]Z$ýów‘0Îõ¼2®�Gê[Ùeü.îËò÷k3 *ì2îl¬qŽÁ°­CtÆeî>öœë›.f5J‡-€ÜΊ )†ÉKxð|$é”Ó(à„¨7ÀùfÃðÒâ>b—r±ªÛËÅŸjäÑ-Ä¥,°Im•X”±Û=‹Û~è0Ðı?UúzC} �%ZQúûÂÖ*ÃQ[“ˆÛŽøÐã„´ ¸JÞ9êÖ*©Ø±ÿ1ŸŠÖÊJ/ý¬Ê�qFå•1Ç«íëƒãå�B¾—Å™û1Ò¨÷ã*o°hÒf7þü؈R\˜ÜàY´)šs”?D (†Pè…ÕÇ/W©§�â{¯ŒÈ%<„Î%°//ûµ\¢]�r riýY³Û©³¾×Z/2@oh,6L�qY- ö[í$4(äP}.1ÖW Ìú‹a ãìò(S}”EKe�iIq²;êŠ3‰Vù™„ 9ÒvûŽËmÓÙÇÛ1�Ͷü¶¥ÍI†r‹çs›±|0{ €ì2`n¬`np�Ú$Ö„Ûð.Ów„ëÏ·JÞ}XÌŠýþ°¥@n—2YEÛ×Y… 9pŸ#ws}=v¿í·e¼ØJcª`~|†ÁÅ;ÉéBÃÜ4ˆÓeÜXX–áâl¥œEpÏ@“ðìÔ¨³ŒgØj¡:ì}XdÊãq²Ë¤§1F9÷†Å?Dg¬ÉÂø˜ê¯]u�·ù“lÇdW)uÞ Ï­Í¥ž1n³èk²õ;FûvrH�‘úm`ÊpaJŠ;*ÞÛžøàÝã„u–h¼„uyœn. ô@ÙU˜·Â]i6�RÏlñ< ìë;Øçi?ˆ�´‚‹èï}‹Ç“–böçD¤jÑ=Ð!�É£Æ/_k‚ä·ë‹õ“)ûÉÜÀ8ùõÊrÎÂuÅsrÜyö럂Î~ññ½ì2û}¬÷“2d•þµ÷Ë�ÁºÇ ÈÞë×ͰwzɼHÖÛq˜¨€p²wÍs[§Ü¶­‰¾¸­æÝB>­hðmŽˆõà¼GžÏè';¿ê×÷Žê'™Î8œxÑUöž6B—csÂ(gÜWšOéÇhŠ`_άœL§N¼è*sO9‡c‰ £9õ\­�éì›Bj•ŽÔïÕx|ÆÃ†’À„3CyÞ&gà( ‹pzr³ çÂfˆ0÷ÔósT²{!r›·‹ÌÛmKPŠ‹ï`‹c�ß*ÿ ;ð@aG:ì»~ª­,æz¼:%Hý&0ãŸãü1ØQ¨kX×[§Ù,çoÿ` '^�Àeø9d¶±~V¿ñ󈞂ÓãUQ�H&ÐÝŠ®˜·9£›w>i ·!„l¬õ Ì‘ØavïÏ„í˜È�Ì0KsÚù, €BÕgimÚ3è×Ë~˜Kè5ÑÉ dqºÄ´ªË­3¹LË3yæÔ;Ù=P†;%ÛíE×凄ŠÇÓ¸vÐo"×3Ò�Å.® €ì2®}9ÜO­-Ñg|¬àãÕÁVaæõ,Pq.àd4 Ñ Ï¬íF=e\°í£V}½ö4uç¶i7óößÑLØó¿W™›šìüêKEæíåÓÏ䜀ìò¿&Ë9dÐ×ÐÕªy ^t;ÕW�Rƒ2®›±‡ê[ÙuÆþÜžúÙøzÌ÷àI0X¶L.$Yã繺üJ¼6×xmè7ûî«­ñð3ʸV,aªoe—„á›<µ�:Oõ0áV2M ‡9—Þ[Çå„&^³.iô ¶gsÕŒ/r©þ¬O?a­äÔ8„tJkÁ-åÈ@MžsE§˜Î†'Ü ›mª€n2~n;¯;ðwà9ïaBíeoJòc;ІCOj7{Ÿ¸Žöný�á°6¢Èm†0=qÚù €BÕe?˜E臧ëwB4ì>H?( »H?ðÓ,®R:Ã˼¼x¦C/»Ê[ÓU'×ë»| 3mzïHFÅCz¥RlD)N@Ò2žqI!ƒ¾¥Z)Ù~ëôûðÇ€ˆ®�—UT#Žó u·²�—ÉWHr…(Î%\¡·y¢ë‰Ï(ä°½]†\kX‹ÝJ ·÷$i�]&iMr�BÐØYÐIôÅYN—/“}S¦ßOËœØ:Q ŸÐp¶I¡SM¦’€r�n/£¥aÛ ýØ 6!)0d`‚ÝîÝyj0y­#"¬ •'©œ{r:•œ�³èϹ~Msµ`zŒù 8¿6?.dzB[àCþV7�)x˜p£L3m«JFÝtª(YH%Mð¨ÚjäŠÓïÌí8è›XÊfõ¼194î•3ÖÒäc(9.&‡œ.ªÍÊÑY“6tkõõ§aýóפœr$C¼.†yñšyÁμ,¦F’lr(�qµœeöÏr“NN@ö&¡|gðÛù�Å÷@!··³ùéC 5·åO90ùƒÝFÖãWWÀ ySjÃÉ`Œ-™5§šNù'Ü0Ó”˜;ýfÞØŸ7]ÈŒßãÄ‹â|¿{}`@ßbë“wÄù©ö€ë;4ê­Þr`÷SïËÑýŽî9ž(¤ˆòþ’›êÛ§”؉óòA½¢O¶,ëóåš9N@vtÅ”E£üæÁá„§?×¹ñÆcsBX}îø¹bšLq1©ö){¤±ü‘±¥¸�ÅŠŽ&­ò²Fr¤ÎLC…èëZ�åG"Ím›”GmÊ8µk•�¸z �#õa÷ÔÛµmi‹Yú”}ZfųÒÐa6-)P@skž6Ë1ƒËêl×Á>ÐPGÄô‘kNÕˆfîå�(f×òUB¢Š\%ލ Wé=åÐvõåà�BŽÛÛáq=¾ü·ž‹Ô™·%–5¤@΢…™o«œÏë=NÈ�ú­ƒ)j Èê�«åüé#›Ûz €ì:Ã=¶MÞM›­Ñg'}šGLHꈈcÌ%7iÚ¢ïÔÞì0.Ÿ¤-'^t™¶¼ô�Ø,ï‰3yUÖV§Tß[?läQ' »È¤ÒFx|mNå„%h—a«/™{~d4`Îüѵœcf,²�µÊùìÉã„hz¬»Q¹Ø"™OÿÄk��]ëט<‡ z3Fk!Jl?)h¦¯ˆñʸV,¹ioe!ÿçl]9‹›©]®H,gÄl�2XÌa�=tK”ŽÐßñ õå]ÓË4â¹jÒ«¢±¼g¤¼•]òžo9ˆfæ?  N¸EŒˆa±/½Žç£zŠ`Ð_Õ+Õšº?¦(Å Èî�®�#htóˆƒ 7JÞʺ‘¬žwt6!.fõ"§‰DF£üÄá„gJ }ձŸ|À~8˜xÑ÷‘µA'g B¨&Üe{„‹R;ôýIT·‡óç9˜'ÜAOY˜«×�OÝ#I£X��]°0i#8™'½�ëÎϸ?¾¹U†SaÃ!¬9yÂúÙ>4¼ì�(¸:wl).¦ê‚c…™m«üƒÜݹ'l²Ô~¬ÍõMêǶFžÎo?›‘ótÑ^ÆŒ·ÕþAªì�BÕs ý`�ÎR‚㺔zÁaTžh®Ÿ:æ¥am^R €,¦YH`�Š´VW’ÍÇ}kª¯€Rôº¨F$]ènE!Ÿ˜®Q@ÌqkDsá½eÚžxÁã„5…�†wÛñYê Eæï( »âòòVhÊ,¤Ô3v1£º¥ö4Ž�}LÒ( »¢òVhÍlV(õŒitDBz‘!0“ž\ŠkÈæn6D9}óÎ'Ì& »J˜_OvŠÀ3k‹•÷D*?,R½=9=¼&—zœ€ì*?Ì[ �é¾[”3x„˜œúVv”¡É+aüªu‚±¿Mýiêm™ )Æ„hd!“k•ó™ªÇ 9P—'ú„Koó¨ýùÊ‘¶R‰àdÌ&Ñ ­©™F=eš3{ׯ“~¶Hj­‰6x€�]š¼—U" ƒ^ðŸ&+³<^RDõЫ ŒkŲ·‘z'‹ùÕÖè�Ïuº×åøRsÞÆÛ*%°�™Coáì ñƒþmì[b™zð€`õºr*×#X*{r¢˜mMH˜vhÆÃ„ZP¿qÖj9¦¹?c  /½ë³�“áBþ2ò¢À¤8Ý48áÆéwï>Õ;^ .kÌ_z—cS’á(¯róN7ÍNÈqöÅ�ÕF׬)ø9›„ Q¢‘ËD–Æé¦y(ÀQÏçN­*Eð|J{ ¿ñ@ž’à„;Üï)%0ê�Rý)Ùvfõ#@Ù#E´Ây’-¹zêxƒßÉL1ó;¹ 'æãý¶TåÃÒ�×Õ¸D€² ‚“h…‡Â&‚QO�°–M€|¼ß&}K±¾¢v�?Èã=N¼è‚àÌáQ°!”SÇÊS•Kµ÷s¯wëÆ˜=í—õ¶«˜RŽ ©ÓVЄLèÌÓñvA×ÑwБMO rÔ)•Û>Éãúo!ËšN –äÔpŒe<5oy×O´PÈqGT Ðz�«œ�y~ú$Šæð8ñ¢˜ä UK¿/¿vÝí²0º�쎪–Eo«NÕÆçåŽe €ì‚e!Z¡£±|™QOy-ŸÁ¯U±¾ �~Ùê+ýG} ç±Y(*€²+¦7o^×6 ¥�ðàÞ¢”¸Bwà`¯,Y\pz6¢Ò¸¡õÔ–SNSb€z %Ý•Y-ç˜È§bó�C&7ôPÀl9í<%@î)ŒÓl>&7ÝÔŠµö½ŒÙ´î†µ1ÞßÞxŸ‹’ „q ?,›2F:ŸúuÞñÁ±äìàdW¤wÞ �ÓIÉêK°*ºôª}^ÎÏ{ÞaPo¡ŠÖþå«§9N¼è¨ŠX§šeU&Ü(½U^B}ª JÒvÜðäø �/ŠÙ ¢š[F9cn\L2ëk^çq˜ÏóÜ:œ N‹Xóð|yÊ£ÕÌò9%Ô=k<–ÕU¢¹;~ ðØcýuB‘¼¼ $ÇÅ4¶×ŵâˆýHw+ ømÏ^—ÍVãÇXcªžÔ6G† ™â`Ö2J§í‰gtgëW &=[1g f˦'ÃQ†3âsœj–Ϙp£ü»ÿú£ïúU_P¸ôJUŸ¾¶’èÚ-8QOÉ?ÿø‡¯?W}_57°?~ÿúëŸ?þêï—²e9Æòß×Ï?þè­Í—¾È¦/ÉÎTžh,¹ÆÏû�ßýç_üüÓ�(~h*ÿUÄ­Œ¡ß¿þòüËÏ?üø]¯MÿægyŽú$ýPÙ²tcÜVZæùUòý�LÛ0è뾨§Äž‚®n/½6|Qàó½O)ke£]¿þ£<òŸ(-!my+ ¯œrž÷ �#My¯b f5ÙÝp|>”佨ÃÃøŽeWÌùn3gX¿Ãj#J�BZéŒÚGý^ð<–U9Ü4Çízœ€ìŠÝÍ[¡iµI¡Ô3v:%5ö–ç4L¼èšÑ| ¤Æ¾>çT6ú‘Œc�Äy› —HÐc¤¬fÛÕ´¦ 9îœ;6�i}%Í|¤¸@�0ñ¢ ª,kƒvÖbLB5a±Ý©.þS¿3ö£~¬>à‘ð¼Úh2\X3‰Ž>²]­nž%ó8áÆéë6úAŒrÊŠ!íûøH÷�^E™Õ<< ‡ i¯‰jÄÖ�"å­ìèBW¦ªf7EóqXð¨¶CTX%�9ó)}>~ÌÕ-�&œKüS±yrž?t0¡æð…=¦ºÕ§~;oYcýÆÛP[©Wp"ƒŒ<`«ýÑ…ª·÷H õ=Žõ=}‡S$Ù;�ÅìÓ ü‰­ ¥�ðM)�ØïZ”š‡}Òß$@ z €,&™VhÔí0Sê‘SQ¥/3˹N$å�²KNª˜ªç�r ØŽs’Ò¾(;Ôr1}ýBä\æì1÷P¤ðG÷¤0 g@b²¤Õþ!ä�B5âb�ÍèçªiÞçããy, â�² äÜ;%¤y,YŠ+³l\‹Ñ{|`‰êÐËî�2†�)}évºõ±€;ã�²+v&o…&ÿœB=ã?Rj¤˜ªú9¤u9Þ;ÍR#( ‹©¦}›J=éA|Á£+ÿºª]*1ÐAkr• Èî�2ô ý`!dI1»+BÜ}R Œ9qô î�Q“^S6k½¬?�1õüQ]Ã+�ÕÈÐW-ŠÙ¬3°mÏ[™),¬Z8MÜ(ÙªÍ/=3L–> ž®ý*yØîÀÈCr;{»\ßW[1N�Ÿ‡�Ì� ÈbæŽi…Ñ€�_J=Zä„]gŸ¿›öå¼Iv( ‹ ;¦†#v‚)õLlãÃtÓ£Û·凅 !Üþí=üó0oçËÒ°†â® (ÆEôÞPªö|`ÛÏ#zœ�ÃöV§›+öøT—³&ß�5±)ÊpBZ&¿fS}†qx\ ÆŠ…7&6 #"Ë„üc«ý‚Õ…jJç5Ì%Mç9”xÑ%�wIW•<]F_ó}n`Ž®ò@Ù]•·BÃj{„RÏXi8מñéôÑZÓ·Ç!†)œ€,dŠˆFh4,¨$”3ö§=È]±ÓªvìæG8l<)�;¢!Wå´ó\…jV¨èЇô-úQ¤Ã¾1• À Èî�®×ÓÜ•ý\ó‰¢ô`‡�wÃV(ƒ…,8˜W% _Úlº¸³Æ®ÛB=uPKe\+¶T©w²{ Œ ÝÐT"à„[Ì„JìöÙŽÁöä_(*€² *‘h…Æö.£žòVg×íöIÂ¥„Ç{k9΀² Îîvœ“CÀÊóÙ÷P×’V?ÞËCõçe÷@Y@�”ì½~HfÓHIJ¡'´!¥À°p¹U$�vžI �Cõ7�=×í�)ÙV ¥y€² �h…ÞÐÖ†QOºÖÜP"Eh΀°°ߘ2‰úÀ½»d@1‰�]2‰¯®�À Ñ?—*íŒó ~{ÖED¿¯6ÎËAªql�ljÅ\ ÑýιqRå”óû—n³OÎýƒéä˜ È.™šÛcÓäô>6CDOœ+óî`[ìÐîÛñê ¨+�…=GôÇ™ùˆ±muÓÜ•‡ 7ÊŒ¹ê¶šÕ¼¾—c®( ‹™+¦z[F=å²ü>Yf-V>¯ay©Ó¯ß(©Ý?³ì—¼*ñ¢êø¢E·î–�”?QËqaÑtQãd‹G¿ô|Ü8ÉÚQø|­ìŽºr³ÛF-øÏzÏhû€Äœ€Œ!11iw »xœp›¹5÷éø1±ÑÎ7ÇÛéÛõÒÏø,ÉR/d/Ñ B›F;μ°ªÀKê!ØÔõO�ßVp„&d1¡É´ÂøÃl£ž f¼¹OM¸Ûs@™a·;ÔëZµê›ŠÏ³¯Ý€³µá¤À°xxnÈ¢=uëúâ9_ ;ppݬ¿%03D“”Kœ€,vÎt% ¨¿¸XÇó H��ÿì¼ (à ç2ü¾™ë€Çô�å_L3fãI�a1)´‰ÀT;í<@!‡êˆðn�lº‡íø–0”´€â¶iÉpQQ+`ËßñசœpnÖ®l@ýä¨þ„ôx_0ÙÀÎÛÔ¤À°|: J�vža �Ce¨Ìnµï³.c~¡…£2( » 2oãy‡ô±`)¬S�ãu›•-=ŒèÏËî�2‚`íÖ®þÌhØÏ”¢WLœä‚ZM۠ñù T3¾Ë™àe«?7ŠkïCÆ­šå�Ž3­!©Ú*ç9U�nœ©õíæÁ\­}ÞŒ7¿�¥xY-§)J÷%$Ñ´Ú ¥À°ÆØi_�ÌŸ ´ÙìÝömÙcHÌ£5KPƵbK¢¡úVv””³[žr � êO÷Rw¿~…yÝCN]�mžÈ9ˆuvÊiÖpBô=ÅÛ-uöæ’M‰ÇðzœxQÌï�ÐÛš0ÊgžQÌÝR?,0mGˆÇQÌ€�]PÌD+ïnmJ(å¹çö$•gi;}×¾:vëôOïP@Ó»L+px6'”vÊyæFh8³ó„ñ¤(=]•göºt‡Úù\G¨2‚á´)I�a•1°ÂïéC×OPÈQ»�;ïuíõ%¾%F0¢¶`޲ã!wètÓÜ!à„§ÎG·<7Í\?Ò;•—�[Cn3’ÁÂú"ú„—HÈÀ¶žDô8áÆëÍ~i[÷×¶Ÿz}] ºMM†‹ {¡o6Òé¦YLÀ 7N|&û%×ãáX[ƒnS’êaè€ZtÚy2€BÕï”qÑ·êÔ |ÛYê¡›Æz3ºa SXX³qš˜6di3Ð܈iƒôlížQM½)…«+Z1�×°“.d‹‹Þ¾]x>Jð8á6Qã”ó@o{žáôÉ9×�±Üšë/ˆžï¤!Yn È®Xî¼zÜ3g'Ô3îÛó,e¯«æ©x„µÉVðt6¢ÖìÐk&Բ눧–(ä¨ÁC§%ô|祵!Î�>îk½lh½X{ÑWÿ!éZ4Í:Ùe±_Âð' »£.Žgv½ñ<3…º_½‚õ}¾S÷ð¾ úœ§ÈÅ ÛÜê¦Ùfz˜à‡þ6Õ±�ç Î}zœ€ì�}’tÓZõ.ë£`ÐøÅïÀ/Úx2œ�>Öy‡©š£yÔ¢{rähöm@)0,?†>XòV9_ð8!zø†ó4Os�ìaÐ ‘ÒH­Ûœd¸°èÐôo ø¦—øw‡nÀ)¥[P Œë�‘#E»ÕþEï�B5eÈÇÁ”¬�â5É�{ €ìŠ!Ï[¡´µ¡Ô“N5µÐÈgÚ ÓΑ£ ïYžÖ:ªvìÞÓd—¼ç‹CÊàjÎEJ{¢Ü–�ò:ý캾GæHà±0éíû¹^ïqqa2òÈ¥6Ê?à`N¸qzv¨_¢Ÿ†ú)Ï€"EãnQ^ ë‘‘›@N´QÍÀ&Ô ½É/ýF_Îýº„t(šÑs> gÌã[ý­ö(_r¨å[|i™ßeë��˜’Œ¯ƒ‰]ð½órð½çZ%˜2¹cÝoÛôò*¢+'ºšÀ²­õçšå˜vCÈÄ¢·;‡“ãŠ-ºÎœ{nûú€{ö@!Žæ×¹½’wÕ¡�wÀùK�Åþ’i5týd?Å|ý©k•^S[÷¶¸Ž}yÙu¹(¢x˜š —ht›BÃÛÊ)0®.c¬á'(}, Ô�NU²úAûä|ýÀㄜEo|&û9eÿ˜R¬.»hÁ,ÅQKLð·Ê?(ax �#õôÌ0è/eæQ¿µ„œ1 6+)ŽŠ[b&½Uþ+î�BŽ"œ´\†QƒM QgãB�”êoœæâ¤µFô5î�²Kjüù‘H1ŒÍÑ�ùÛëÔcYÁõÚÌ_†‹K¸‘·GÒ½QþYïpÂŽÓÛò~ß-ê7º?r�Qn £úïõõÝÛ÷ïÀ¾Ûx˜pž"-`ô«¢bY»“Ë#+( »ʸVhÞmN(õŒ¯pEƒ~±ÅïwÜ¡rëË6  Vn±²ðŽoû )qn¸n¿ô³Íø2ß–)¤‹ÑçØÌ¤@ÎóÅ”x«ýJÜ…ªÿW_Ý÷<íýí`娻›——ŽÑg¥´xÛÕ¼¸ 9npHƒýÈ´ï¯KÇÎÎÛ¥8Ê×ÄÄu«ürÞ…©?Q�A¶áº€ëM«ÍJ Œ+¸‘�Fz»Õþ/î�B5±ÀÅÕ‡¬VR¯þðpâE—¸©y•G¨i|Ñ{ÔÉ Hê-ì¹Jïqa‘�õk™�x€²O{ûÅBù—sv¨�ŠÚ^׊®ôGê[Ù=P–W Ú¹ç«'Ü:fUƒè,Ge�áPU��]U òVèOÒŠPϸӴpÐÕ·ŸÏ“Z„£–BU6?)�ó�»ïµÓì>…j×|P·`¦Š™æM�BDw£q·yI�QÑ9ò ¿ï»¢ù} 9î·ü~Q1V3[üÙyŸ#ç÷% ‹ù}¦:[#B=ç¹V½t7Ô©]‹µ_�ºê#P@³ê½èØÇióê�tëíãó�è\?^v”¡Åémò×J‹Gt8zQ Œ*ô‘+s´½WÍ‘ýˆr�ïT Df DôëÆ:(„ È®ÔK=>”¤xÐýÙ¸'ª#(Ú£*ªw# VÞÊâ’ýûÂG]â¾oü5S÷œxÑuÕã? ÎÓõDÅ.âlª•/ÑÝ?ŽÛƒòOkˆ�ÅÕ¦F'g˜ªç‹w%�ÒϪ¶yêo»Jk �ÅU�ö$ç lnˆ®¸¨Âg±E³n/u¿üZÂÀPàΔãã€Â×.œZ®0 !†÷8½ÇùÕOƒ–Ù]ôåFGéÕ•-ÐïÛ<¤Àè*@D$Eß]¥A �ã†�2ë¤eÈÇ››ÂzÞs‚Þ€¯ÕCœZ® !†×ÆUyÆÚf�ðp ùý–Ø.ÍËÚ©‚’`vƈQÄ6d—Äöíésø[›¢'Êw» ÖÖ¥£QƒÍâåºãê9Ë� YÈr'MÐÁÚTdŠ ? {¶7�ÅüMÀ‰£c³q¼Ãø"|äýR8^Üõ@Qþ€‘| ×^tv4—ã’ɵ#P@vU³Ï[�S³E¡´2£ûKæ°×i-+jaI÷#P@vM÷??ÀÍ`бYÎCtÆyÉŒî/}muA†q´É÷#P@vu� o~Φ…ÒNøLw°ç²'¿ê/zª¡uY¥Á¢¹g}Ê“ëIPXåE=¸>m‹¨Þ�%M ä ÉÝ |êîDôèܘ“ºHy€jYKO«:`º0‚@ÙÛÒÈe8åvMJ˜-ÖÄRùà1H²sE<5qyFÎU^JW‹ÞdžÇ&nG‹¨Ø N@vq• m„Á‘Í £œŠ³|‘ èžL·šùƒðg !�]ÕôóV™Ø4PÚ‰(Ǻ¼&ŠÑ‰�ˆ(¦r¡NV™)} õé§­¾–®Ì P@vY™i8¹ƒÑŠÍÑúÀÂõZÙš‡~´ÞX¼ÀÐÀ†”£z}gø:‹×Nh(ôPÑ}Ó¸ªAœF»[Eûj�]úêWï¨ýöÒ]ëö¾·gk“…õ¡×¢ÚÍPü×Öu§Í¡*D�Q¢y·u-ìGúíJ8èilÅR`tA!v[¾�ãµÓe* 9TW'*v«îÇn:;vK@6+.¸9U“’J„D L¸1cÜ0úEÇZ§xœŽÏ}�¥ ÈâRÓ £[#J=j¼/”žfe¦çIôy,S@ €ì]๋Súe›"¢/ÎÉ'e‰ÒÕd»OKŠ_la`âEWʼn´º?›F9ãJõ§ëÇËŸë4Öé^ô,GÝÐÞÛ¨R`t�!rYéÄ÷E—N(äÀ“BEQ2èÑœ‡LLjˆZâdW‹¼z [(J=ãÎÜןȈ~füPŒža\ÔFÉë¬äÀØ7xe\+Ú]Fê[ç0Ë„¦¸›Ïù~­*àãžëô\$ˆ&®ýý:óŰŒ·qtþ›yòè>ˆÓ•_~’ hRÎÀXc— “ÄU[äøø^vyÈí@�n´·‡�Ž/{øâ;ˆ lH)PÈp„«dŽõ�lõHg}•«dz €ì( N:”ÞÆN9Üyн}P²s8ñ¢{ Šj„�ƒ-£œ BÒâX[ ä«c' »ºðÈoõAÇéx½`tŸÄG väS`|S$ A°vÒjÿ èâ�B5+º KÕ1•?ÏqE�ÝeXÇÌ14ØB�qˆ?ÞC±çú¨mµÏ\7J¼‹¶e¸ð¶Häí¡„Òª¦+/&Ü(½g(Þ]§zéÇóÇÂxsÃÛV›‘ßÜ@C�—ƒÚ¾>(y �‡m3Ö‰ÊtvÃÉv»Û$ÎÞÛ$¥¸øžHà;°†Ò*ÿ øâ�BŽÔ¥ʼnîîü�:†bT4~êô'VÏ`0ÆžÁ+ãZÑ7Z"õ­ì(C©¿Mݳ<* þ†‚Þs³¼Ç…Wpê¼Ο¡•“•�g>ºuâ•q­Ø;-‘öVvG]yq¬�}¾8æq­$´›~ýIÿœOjÌ]$ñqÂÉÐ&@.Z‰«W­ö*t(äP=Ùï†Ùëì;„+ßA¸R‡”ã›Qìƒe®Vûõ1r¨Þ!a‘©h©äêÚÝúõQœò8ÙuQ�0F9W&WN„;Y-ª_ë´jùè¨v“µ(�Ýex‡$Ç`€b3DtÆE;@M@�©ô¥«1ŒÓyÂÉÊ” Èî�2®†(ç¼ê™x§Ý;}Ùe£ù˜ñêê†7ó6 _Ý@Ÿv/shXa±åŽ�*Öäu˜öÙ?¨Ãx �™W=úYV5�Ýp¾Í”¬zx €ì(ãZ¡/´…¢Ô3ŽÕEX¼èG몊ÃrE‡/ºª‚�œAÐ)Úå]qÖ?E§h#"ˆWÎÃê€^Þ¼QVwPw¿mg‚;¼S²¥Àøbz¸¼ÓöõA Æ…8œw¨cè¯ÆõÊ`±ç ®â�²{ Œk…žÑ–ŠRϸÙÔUl{µ)õâý'®ÂãÄ‹bWA4*M¶šò7¯ ¢”ã¥Еßv{Ý%èËËî�2ôŸåk©ßÎ�ozxÇh9x Œoz —m'‰x ¬ˆÙª�Ï•×ò*UûôT©q+»ÊtH�Ÿ9+ ]ýÌv{³^Ïwàxl0NH'–WïJW“–²?© ‹w'^tTËÕ×�¯5£õ°›þö„w„6A.¼ùT¬cµºùJ�Ç 7μÔ–¿>(y €ì(ÃÈo¯1£tyuÁ;E;æ)�sÍa1Àiç r¨Î�oeÂ6½XR®ãµªxƒÂ{f›—ß @7Ÿ–?\_|ù€BÜñ­lÇ]¯LŸ_;�.0x§h³”9×Öœv¾ø@!‡ên-lû\çr.˜aéx0²6-).¾´;-?¸®øò…7ì�©ÎëP\ÜñR9¼ÃàÍ®MR älX~pÚùò…jv‘b[ë;ræ®Äч‹à.RP@v”�×Ò§÷Ö­@}Ü»£s¥`\ GßæÍsþ½~ìfÌ÷õgL=pÙ”q­Ø»‘z'»ÊÒÚ•[¾v@!—NùPOÀ¨¡tòzí5ðÙ'˜¹È!,Ì8í|a€BÕ9ó­Ìᮟ6ÓW!Ɇ¿F^Úæ%†×"—e§œ.ÇNÈ�¦åÕ2j"´LçK¸r d÷@× …sirõTÔ‘Õ„¶ò7�ܹl°îX(ª&@Ù=P/ˆ'0)ÔIb:ãÂØ<¾ª¢}é�†‡ÀÎ�ÊQŽ €ì(ãZa¤pÎK®ž ;¼©ÉýT{lD„ÿ¡*G°wÖCñþPìï€ÿ±¥Àðþ@àÌÒ’Œë‹/ÉPÈ�{Ϲ-¶!Þ\iod³”9ŸÖœv¾Þ@!‡ Ûy²WH,Ëùõ3§Ü‘MK†£yIª&@Ù=PƵÂ`Áö1£žŠ<üÉ*‹¨Õ€é¼`÷À9Û€2\x} tôP£h•óe�nœ- YþT„~5ôà¼áúxb›‘ Þ^¼zZ�i»âË1'ܨ½³.áWµ�Ïï™Â­ïm‚Rå‡Ã„SÎ_(äHÝ9š'ýJf±[ýÉ:A�~[úz‹¹Ÿ_>±HÃ=( o8íüí 9Ô4$‡�³!yøÄ­ìŠüÊ[•6›¹Ü²öÏz §È/P¦¯}ì­/Dþ¤/Ì)°å¼�Ü8¿ïÀù�çè=N8?šVî¶âmf}ërÞñ£ w&^tGMD�l[{gCÙ†³%—\� €²{ Œk…Ñ€­£ž -\B©šuõ»r>ÎÕ÷÷( úu)†÷(‚RZZ$s}ñE2 9pðQ]ý)ûx„óp§Â‡ g²ðDÅ*aQäU3_õiQ ЇÅÕWCtõ3¨w ¾1(0»—âÂk`¤µ×_û �ãö[¥µÕw¾ƒ ᜤÈ…*œ a /�ïá†êxá­¸�ËyéNÚîMxKoÓ’âÂkè5Òº‹ëН»PÈqCtã+ª¥Óod�˃p¤J�Ýe\+t�çJêêíδ×{¾�~7b ½H‰&—MvÛþb‚s`x“”q­Ø‹¡úVv”¡ùË1À—Y’@ôEqoi=j[f…tåúÇþ%ÊQ'^tTÑ�Û|t@!·W[€Îƒ;\ùÃsø«úîŒZ&Z¶“=mot´‘ƒ 'E‘KX·rªùÚ…gZÛ–Á´<~[KÖÅ( »ʸV²ØÊPê™ø§¹µ?¦zŸ?wÅ›àm@)0¼98Õ´òäúâ+Oràþ4Í»½%¡ß¿�ð7'À5›IN�á�ˆÐÏûò�SN—¿'ä@ÿîÇ¿þ(^b½Mû×¢÷êÍìam%ßÉ´»ñ¿¨§äŸüÃן«>�ê¯ã�ßß¿þúç�¿úû¥¬L1mcùïëçôÖæKÉŒ¾À—®~àçýÇïä_þó/ÿùßïÿÏ×ïÿûý¿ÿ¯ÿþûÿñõÇÿóïÿßù¿ÿü?ÿôão~–Q×q÷euK ¼tco·(‡ež_%ßÉ´ Ñ÷¨§ÄÆ�–á¦ê:^^‰Öáne¢ŠÝÿ�ò€b´Èî�f¢è³ég%•7ëÆ³LÇ}( »ʘgœŽ«’ÓÃîP1ŽÇ ȇh„ P‡@)'ÖÒ]A'¦â'›bú©X ¬ÞZß2ðîn xgQ äb„°æ´óÅ0 9TOâÏö�=.tÁ…ˆlZR`x£% 7|ÅÊ)§+r€r I=lÓ/S©3VdQL= p²{  £ˆƒá�­Ñk¤%±mêÑÕ�ÚGÑ�)‰N@vG]T#ŒlRåD áŽÒ´Ú;¼‡I#0… óM«ãtÞàó%&#2œxÑ=PŹSßÛ9ÂGW4¼2 ~JÌÎõSâp&ò¡Ò·g~íá»ÛÜÛ'ÆJaß! ùÛ®)0¼ D7næ{ª„ƒ]_Ÿ_~'ÁíE¬œz]\+º†©oe÷@W¦tkÀ×)(ä‚‚¹õÕµm.-¤MÇ‹ÏɪœÇ‰ÝUT#ŒIl¥åL|ãÍí¦zÇq:> Wh 0+“À¨x$­¾5½�Å7‡j°.r™]æ‚ô�òª»81‰ÍJ†‹.ÎáM^�k{â«q'ܨý:Msý¥jûñóC¼F‰ÍP ¯Ñ„Ñ Ö¦ZíÔßô¯�Š‹C3¯+h£üƒµp8êùÀ¢äÞ¢´ÙõoÅÂoœI4áf¢›5^n׶ŶÀw°lH)�ÛˆÜÀé»DøÄÜP�}Kæ<Ê´ê›uŽë¹­ûýÜï¹} �¾¹¨ç´Êù:�Ç 9P_Å\êË7Æ’"öG� ·G¼s´II�ñõ‘ÈÓB¡¦UÎW£?÷JŽ‹v*¨ªó8Ù Æí`G�îoÔms’â„gkà×’j)¢ßö3þ„;]ýYGq.ËÓ”å¸ðŽ„W:K§›'Ü8a“4˧ úZ Öwª<¦$ÅÅ)ˆÓEm%ÒžG[�g¶vìý�hÍ[ÙQ•·*m¶ê±‡ax)(qꑨòʸV4©oe1Æ´ò✠J=v¼²Ðtáu ÊrQ·-ûš�’-[ýÒÓÉ�GØnÑoi–c3ëïõŽ0ÿ%ÿ†�ïiº €,êó‚g?kcž÷ó;dÁÓãdwԕ߉YwýÁCì�àŒºãqâE÷@•«4æ€r`ê¯ÛRÓQT�ôº�F)›N�g·=®9Áeóæ™À ³µI":ã<7Ä»¾°/¡Æ`(¹é¾œ‘ QH €ì(ãZ•c=ë:ÏC 3öGñ‘R�L?(�…:Íà¤@®ºÉ •­füâ3Tþº�ÕÂêÀ7ó•@Ù=P†Îq0÷±ï—8ØŒ¶]R`X[ w6TO�v¾< @a‡JÄzXúµ=ˉLY©Ã¼¥K ёͱ¨Hë}Ic]}ÅIÍþ�zUÒœ€ìè"J«æ“£U>)ixœxÑ=P?ïÍ!PZ²ùÉ{¢ªTÎx~-nKwÛX&à´}9y(ÙÝk"š`¤d“‘*ή6pY·í¶êíÙ~zd‘þºD$v¨S`x])o’º�뉯PÈa;°lÊè•)=_o�ÁïZÜΨõšy|^R%€aü Ê‚«1~#¸¾ø@áî/9­kWqü„*y‹ €²{ ŒkUÚ¬æQ×éÅ)qêáŽ(ÂÐ-_Èaj¼÷ö½az )†&(Ëó%Øbl¾ìMnÜéå.˜XòrW° ^³Óy£Zg¨!ì^_%z.¡¨oPåˆv# ÚIX&À°€XÇ”ù†�Æ2ßÁåžUL`ZÉŠI°^vtq­0*8«m¹z*Ä8f¤;cá޳ÍÛãÇ/ÙÐw� ��ù{œ�™ÕûÂöº-u«ÍS¡UØ €ì(Ë ¤ëÒkÓ—oÓ“R Èî�²ÀI¤!=V>Íú¹WFíÚ/¦h¾>ÖêãýßpËÇç'%‘àÂ[>˜W¤[×_± �ã~ÝØš™«Á*'øaøý ر's”Ã$ÁöO*�®'¾@!‡íOšçÃ×e½mºýI:r<:àd!�N4Â2�EëŒr¢â�1ù«r µü°ž·Ä(&p²û&ÿ™Î¤Ö 'ß&ˆ0sÜJžèy®Ò‡ÀlçŠxzΤäùªõy=2ÛãSDy@Ù%yþ<êϰÍÑg2bt�Õ|+i¸?EŒP@vEŒæ­J›µîÛa(Ì9N;0þ^WX_\çZ29àdù€²{ ŒkUÚìv~—ùyÁ›Tw @fxéä±e–hÒÑ=PE5*¶iÔá—P¶¾˜�SÕ Ð•ßI�Ydï¤Óïe÷@ת<Él{«¶ãœJ=pý L@V}­ÿ­*Ì¥@®\ •­güâ3j¬°Y^M½›²Ÿ¾ê�dŠ×_ �8ÀNM‹n†…?Äù.gë”Áñð²{ ì}ͧ}lºäãaBM cΗ½®¯¾³óü‘ŸûI Ôrl g¸è'5AY(+°¸ŽØ À„³� ô}ÊK‰(ÊÒW^ü…ˆŒlz2\x"ˆ²²BGÛ_çð8á�¦¥†$ã4Þ>ª)8œxÑk›6*&ÔC8�ëË[Ù9å@ ƒ.϶ÿ’�ê‚Ô\L]ɇád ÉFPFùð,‘<=7pª<÷¼–˜@µ ÅàžC¢Hk È®xÒ¼UMuvÇn~²°¤zàIAYÊ�Ãâ²Üy°+¼ìw>¿RŽÉC°,qðô^³ÄL+¬ÿ�©>¡ž)&fTµ†I�ž•eÒ)¥©jÀ È.©êf¡Æ]µ<ÄvÜOÅJª³°u<),®£ÆçºÑýÁ9œÐÄ(L?·T‹£ÝIüú ­ ! Èî�2®Ui³YÖ¾¼|ÓœT�å^¯ŒkEW“#õ­ì(ãZ¡ñ¶™ Ôsž �Ìé=A½ %X4 Þ–#?Üן)cj¨Á‡óT©ýÄùqa ~ãå"sƒ)P@v”…WÜv¾Ž@!‡šÖ‘tOtÇw\§ÃÆ3u$À ÈHÔJ¾;×Ï-l'ãAfj( {—«=^E`p9ìˆ�qk«ê_Høt^13<Ï{¶T’é-�¹ ;Yª4V£’º÷•?嵟¹Lõp0wT倲{  òÇi®¡/~|9ì•ÿÉ ÐɶƒR GjÇ¥¶Vûµ6r¨Y)i�—cÜÝñ‚²”@Ù=PF”ÛÆM=Jyøþøò2[nó@Ù=PƵ°0—RÏ,瑯ë”O$Z;ßÄ p®¤9às=¤ýÉÔBŽ­ æ=*¬¡ ©ô½v×ùZ”0£õ&f¬�u_B£ƒd+à¹VÍÆãµJP¹3“d÷@ת´ÙôÝõí;øIõXôʸVl•1ÒÞÊî¨+.ð�]…õºŸŽB'Wàó@Ù=PƵ*m³e{?oürê±Âä•q­èV¤¾•Ýe\+ Ι ÔcíÈ+“ðœÁ¯‚ØJý*(Xm’õ@Ù÷�·ª­¯´Âö’‹sê‘Z÷ʰäж8Ü‚û!‹g‰NÏ—dW”S>pºî�OÌ µûzýTó:Õ[˯o(Ä»Ožº·í’ãÛOXÈéô¶¯øtràºyŽÑŒe¼³}£áÌ:ýå'7Û¶Épáå' ÁSr¿íˆ'÷=N¸Aû躺Éú>¤í‚ÆÆJ'éÇ`†‡{Nq1‹íuÅ m£ü‚Öáä·']Qˆ°•Ýe9G¬iŒ‚²ÂÛxzI†#ö@Ù5Gü’¤æ<­gì�öÅ}w’ÆN !óX\Íð ÖÜÍ'FNF.Æ7ŸðÀe×øÚž>¸Æç�Bû±_ö¨â祾ô�%ö=J@v4�™éŠ·Ðƒ²¬×Ìe?ÙQÕûÓ�í“cNÒ+‹9ÜVû®Êo8Tš>�ž±•]Q‹y+,\˜Ù§Ô“U�Ô,"aoA&aO9öÿñ£Û—­:¬5„ô- cÈp¢Qµa¥À¸ŽŠšauÛÞ>`u=PÈ¡û€<%¯ÐŒÙ4å¤g3Jw´£âœÏ•3Œ®‰]ð¹�a¼oŒöÔ¦$é�°Êž�BN¢x 5OC Ü÷éÞÅdW¼KÞªX”N çóؽ|L’T�L¡WƵbÓH{+»`LÓFÈ•›µe”S´;#e³©%Ê8î4’Ô� È®¨Ÿ¼Ò�6”zŠ;ÍÈŸ¡ÓH¾LÞxÜü"ɇ/zGþ€Ç"ˆd��]ÉMÞ–cÐÀÛ�qÞâ=§Üi†P$óöˆ¸)ZÙãd¹ dϲNvËj{Ä5I8ÙM´*¿¯,ç|;½#§ hPV±˜®á|3p ‹ÞIÑïÅ”1=Ç�áB t¥dYÛÍ•yõ¨¸KÚ‹ôÒf³×Å /o$€!©ʸ…dKá †ê.¢ÔÊ"tuðÃüòaòê ŒÛO,mlDz¨é¢±¥�hµ�ì(˜�ÚÊßÎöü¹�“^»¸xbÉØRH´ÖÜH«‹éËQZ=Žóã).&çœ.†8m»ú€8õ@áÇ |É8Øu­©û„eiPÒ ®�¤Ii°×)Ô¯=îb0Š‘úðš¦Ô­M”º;G“æ�@Ó>øì^vŦ歊 œë•íæÃ\¤zäS½2YĨ"goÎ9r•n¨4gükÏHÅ2ȸÚD01CÞžéÅAÎcÕ;ÓmíC¦|›�™ë?™“®'ž˜ �ÃN’÷q9~{ô¸ÏÄ%ï' »LÞ1BËò-so¡«þäâ¨�ä Àd19È´þÕ&ƒÒNp¹]ûéæeîꟺúgD b8d#J�ae7ˆ­RÊÔõÅS¦ràÎ/–Ù«— ¦ã?6¬ú3…Ô¿&í).λ¼®˜l”À :œüvã¤óÃè[Yœ;å4ܤo§®¿<ö.EÃ9”xÑ ÷bär;„|° „ãÈe?9É ;ã…÷ÏÍXC¢Ë`ë/î–ùx!–ਞ»7†5‡àÜç¼`Û×Ä  9𜉛z�ѹ€^né1Tœ ÈÞ‘qϼ¬qýéQ7ŸI’RÃ\î0 Ï_oÀ8–óÊr~°í‰g=NÈQû)ÊŸ�Hñá½,I}üÒ8Õl±/ŽÎ>Ërh( »âÐòV@“š=¤´”+Å ëYdßïǪHÍãd š?_ƒ¾ˆ­>Ç‘òáì÷©¯ Rθå=;“ßvÄ/šÇ ;è< À]i±?p[ü|Õk˜œ/.D63Ħ "ï¿R6ý’ (ga8—s�ÚŦºê�í³\§ È.¹ÎÆ¡æô”6IDgœÛMé×ξ”6ç«2HúÕãdýêxÄ’©}…§} šb=J@vÅÀå­J›Õ¬Ö²=_LªGÎ+�Å´Öp|£]/ ÌM Y4P²N;Ï}PØ¡º�Åä]7ê FJ¸6<ï/À8ŠôʸùbIÖh¢³¡roô€­,x]–œšjä—êhÏqUÔ/µÕPœÍy·Ýך¼™·EÊpaµ)òÈ%µºyÊã„gÊAõsýqŨߊ�ÏÈ›à rI ŸºÕ‚¹Çõ&’´r8ñ¢˜´"!?hÛ…QÎp�)IÕ-õ¤L%¼š#©_+»H—^ÍJ~ð‘"´É Å6:–ªøÞÚ`­b�h$°§ÏNp1ÙØä»Zåe(äHS¢L'Rc‚ix¼Pƒ#Ê( »$Ê^ìACvž¤´/Î*zžl­•ªâÑÇÇâzNd.ÆJÏÇPìøãUF0¤E@YHß8íGÊÌÛ\çX[WÔ(2p²˜ÌaZ!of+Ĩ§H¸”¿™·I'ožõ«ÚÃü d3Oêí_RWä.æ¥ÒAE²?GDÔ…$‹ÓγHr¨`‰Ó�³±søÄ­ì"vnŽw~þ�À²9".džµ¼Î¼nÖ`«{3bŒáðÚ€2\DGvy§›f–'ä8çÕ>>-Ã#ò$1U›…’ÄÁ¹Ïh×Oã�{`&Ä0؆3wK€œ� Y.§�'D(äPSBD݈{Ýéó|ˆÇ‰]²!¯6-E ­:}_Ög÷|î8ŸØ+ñÕ6Åéì\Bw=£¾‹õy¤R`˜Î‚2,ÄùœÜuųrÜi‚ OÁ&ØÁã{Ù»û™µå˜b9ì Îå,¼˜!¦³ ·eDÎö“ÍùCÃÛÊ.r~¢rv6/”zŠÌˆ‡y™µ„Qrâþ¶À;xœxQÌ:¤Tcé@§«+ù€it8ñ¢+Ö-m„'×â(F9eÜ ¥“ˆþȦ$Ÿ|η¥œ ?–“ έ—½ãdžŽ4Ç€‹´9"ú¢Üm–ENëm³+ÝøIépâE—)äéÓ—Ñ»¨­SÈŸ eS“ÃÛO!«T�ÓÎsDr¨ÎÎŒƒ^m.â|Æ»H<ŒÅèjºoú9„cD90ŽÃ½²˜1iµÀ y �Cõn28�@DOÜÊ.ˆæ(¥»É(3Çù)áˆ-GÇÌ‹58_6‚Œ+lQ[² Ç�“�1i•óŒ�Ç ;N`'æy®ÊÜ�ŸÚ#é È.阷äÇP�’ÖOÇ�eŠüð(ÙA�6*{¿«ÇQ¿¨þ´²”r ¼*YàŽk=~C ÖÇIÉ�qèê•Q#e)�_{BÎÄx†Éf�°L YÑ%ÞÙ4ê+gë4Fž@õGÑvgŠ£ÌAÈN8å<@!Gš‘ “}x*‹ù ×à`âE—LëUOh¨l…òž8£—3úJÄÉj¬óĠ ÈÞ1ϰ?Ç”SdŸóÕ]=–Œé,Jý½2®Í,Dê[Ç,ä–‘Nê#“ÚÊâ¤Þ·)Òc³�DW\ª�¥°úa½U¢ÆåqˆHa=N@ö.…}¯¡¯X»å¼*†4ž?7¶—S`Lãá!tkôAÛO;xœ°£vk–O+º‚sDézp~%Ïò'}=Ë<;ºö$ù&^t•â¿ú¯ žÉ&'í†qqmŠ4Ì5†Ô_z_•õ}zh{9Ãq9jÈI4ºù$ÍÁ„å[º£Ìx ìJ@Ò?ˆ †îð@ÙÝ‘·bçÜ„v‚$ò'wkp&Ì!î�:_ÎØõ]ý K¿�·}¸`ô_õàãÃcæ¸8pºbr¤Uþä�BŽÔé¸ÉÄ%xÚF¦-m<;«vD $%ã�²+Ê"o…[Á‹RÏí«äð#ëe¶63 {í”t-ñÀÚºä{€:ûYê?,5TŸöýqk‡Jý=N@ö.õ—gwÇkžÙ™g{ €,N„}ü�cÊ~±Ïãèë¸ï~§:‹Â ¯ #ˆÆ(I(&B¶«3\XŽrªÜP²I6Xnœi¦;4.ëõ|�¯9œxÑ»líMŽ­§@�š¾àáH‘¸€²w9öãh<3:$ª3òºUK'¢MR¾ œsuæ°·OONÓü`wºœö©I†~=ÞBÃE¥€�]D¦YÂ[ž\·ºF·ËúIÂë�²8áÍ8’I^~¼uÏ‘N@²nÉr.Fõ�DWÔºzG•N)’sG§KA%¿¥!¿žŠÝ¬O¾çO¹Ä€2>1Ç´©›«ñÖ‡ %ó-�]f\ÍN*v²V�Š»cf î¤ò#Ñlb~Ý*çór�rœ„‘BâÁbQºq,F´]òõD g3ClÎ\¦Qû´®Æ8ÏÓ­ÿ$j €,ŽÚ]pA`ʶ;¾Q ñôØÁD_AÖìuQ�Ø”öÇ/¸üp²ËüåõÍ‘Ϧ-Ñwнÿ§Ê_¼p¨�SM•ʟǾ{9?).Ì©¼*"Wh;âs�nÐi ã��aðѽ,Ža¼ÍM æm6C¹!¡R@Ÿ»,½9÷}:ÃÇ–LòGùÜÏï@¹ sc§–Ìš%Ì�©IÓ4"¶*y:DÚ#Ô4FMj­ö£!x €,„Ï’òí]Úlv#I/{?ãâ\D¹”WƵ¢SµH}+‹S5ÛæÌ�m^ˆÎÈD\êñQµ©4Õû(JÆ ,Û<)�;©D®æúâs5 9ðÔ›WóPöÁãG0ɽ2"Sj»â3%�“ßpØtä€Ïëe±C’©»VŸöñF[.Sñ0Y˜©@(œž?H-&Î-•pºéIO­í™üÑ)�g/£}˜AMî¾~’½x €ìW³—2½«:¿®?HO6}ñ@•ÀäÇS³=Äùáò¡—tP«øúñ•ãn¤äþÙe¸0+�#FÓ­n>Mð8áÆé·rÍâµ9!Â`nÃ{O®Ÿ—Õ÷¬Ç7N‚0uXêkÇõåBvŽ‹£T¯‹‰Þ›®>ÞN¸QçQ³:jƇ÷²8jvI_Á\ÊÎ:Ñ™˜eq¼~*·þzb?^ÇÉÆñ( ‹ãx¿�r Äö5a{¹ÍÖNQþ heΣŸ>ˆ¡=PÈq§ña7ë§åê–£@Ƈ( »ˆÝ6Ê1×!1�q¡v²öõC ÅПŸHgcV�ÅQk»nùñÄõÐ1Çš[[?Eù3àžµÓO<G¯ömûZº´×Ý<,%{‘|?$ÓV ŽÝò9PO‰=Gžo”€EÏÀ´”ý1]æu¸ë×”'þ¥F@ökÙǸ¯önDÍÁùäÃÃÄ‹.S�—¸:G”ó1Þ¶ÙÞb7M�³–÷ÅÞ^׊í#õ­,í�+Ë!¸ÌJ}‘[+‹¤ËßÔjMåp¯ã'‘´ ÈÞEÒ�m¬œ-Ùœ_k…”ÕoPÛ7 *JXq§§‰OÛ�÷x˜p#n×*ŸLô”¶{ˆUàÜn½Žûp«g·s~¸èÕãÄ‹.£×ÆbÚЭ愋ý?U2ßð@Ù»|㘥�ÿŸµ7išeÉ­÷ïWÜ%µàŨ–2S÷¶)”™²^P%Ý Å6ÒÄŸßGDd:"qò±¬÷•yÜ>`8@x`Äg‹FŒÅ…�‰4ªEÑ’Çr ÎJnÊ œ@ÛƒÔn¢|�!Ö2yòíA…m>*‡Ö~°ßÄÎ~sØŠ¥À8$ŽvF%mï_„a(¤¨~™ò¥íõó7›†Nûx§z¨-Ä!¾/êGl�tÞ6=„8­yÈ! øëŒ#Q6Ä…ã^s,E_ïê-Ä‘²ß v”R ·'øÌõÎÇ4RÔÖëשnÀIY¢-öµp^¯Áš–îu!< ý@è,uŽÝH´s 8!¥ÎüRxÖ/ žÝ·Q~)¸,ã¶ÖC£ÎùØáëP í“¯óì—ê*èE£²�3í˜L íÉ5}ßB)7G‡‰ÛgÍzŠÇÙt!±œnðëµè m•�1m®é¸ê!øÑ~g&…Ež)ôT÷ØlZ~ΗöÛ®a×6!L(!3' D本ðIÛ¶''«YxJL—p³Ã¥KžæçÙMw#ñn:ýðè¦ßÞV6§è›ÍÊׂråS¯x\·³÷_xÅh{ðЉ_áôÛ¬0ÝSké]Àrwõ>¶ýLA�Kª×èL»©ªùÞÈ).rI¡+ÂKw#Ñ^:à„“:ó‘á89xtßûÈÞ*d4Ðfò¡([ß½Üõ�èQÕ7D§1Žñà¬ØZ¥À0Æ ^A¸±ø€B žú9S½–g÷åü ëèx @[ìê¸p"‡”s2Ôs2Íýëòmj¬À}‡Î¸_±1MØ}Ûöà×_çêt—Y}M.}÷Áž°…ÊpaØí¯Ä%mGâ=R�Nh¯§­.ÿ°v Äè\Û7)0dÞž¹íH_ø(¤ØÎË@;=΋=„~‰þ ûîqâ›>Y÷1ÄT«Ë@ûù’Dxœ@Û“s�ÿ §ß¶ Õ=³–~•Ò‰„˜Å\ž|þ©ð'wÁÆÁ¾<¯Nö7.˜Ã‰oú䂽6M )?©æ®§îõ f¨Èñ}q¿¢Ýœ¨û¶-utÊϺÙ2[V�±ƒ?¯¶@). ¢³ž‡ëœ÷µ(¤¤©1è‹úeßÛQ¬Ñ ¤mˆÍ»ó°òÅD×Éö+± H?,s%¦±¥mÞ„ƒ‰ozòSÓá.°Õa:gv”W)úÕ©aïÏP#:§¸ª0Ÿ1q4 0wb^Ã|áÀ¼ƒ„�5µ@cµo‚PÈ¡Ä7}0?¯µA;Ûךˆ"ÿr¾;Çhh{4Ð×Ìä?og¿JÂŒ‘/£_¤l*Ñ+2µ’®å_¥V¹ïŒä¾ßÍ ­²Ç ´Åfó£A,Ê «ï7¥°~a=N -4ˆŸõK7Ö/d�ýzû+©~ñ�¶'ýrQU�‚ó_…!†¢–òm‘ÒiýaÓ’Ï>£‰œ· WOjdÛô•¿‚Зj@®ïG™4�'`ç:E ´>Eê0´ã|á0x DBC6;IDÌÉy�Ë9/à }Õ®ZW¾L_8'Ðöè<¼/W®›pl~¥F.ª›¢ü)P³Ùá"ŸS“í$ ººúƒn½öBë×xõ¦Ò$ ôkPG~2Ü®{ÎpH9ýilÝ»å¼î6`=¼§bÒ¤À˜Ð@·'u%Ú¡x_Âã„[zí–­·˜æ¥ãÁ™Ð¯ðÕoæmã«Ì�†ÞtFN7o9(¤à™Þ�§`õNðø¾-Ö;>½ÑÍö¬K§,G7ø bs”áÂÈ÷ÚGw/%*»~®aÝIpÖcìju“–ëÝ‹–ãbãáúbV­ê‹Uó@!åε{ ZOÃÓ»¦-í¦(…¸³\…!Æ!”Âéx¼%…‡Q•‚Þ‰¸Î´ryܹoÄá´²Ç ´ÅZ98W) ×¢ E G-뙾½ð@Ì-š�*³(¤M¹:�X_殜•a=+ž¼öñ[ÄÄù ”O°ÑÒ£Þ ÂžtBXjóè'I{ÅÏnøf÷P íß±ú}RÆöíZrÿP -Þ?·‡¨½ E ð\«PÔp¤’¸WÛLú•£®/Ýpbþ—6'méúålúÓ¿þãÿåïÿéÞ·þóoþoZ-µº¸La9~»FqgﻡÄ^«­ñ…yµØ �ý�¿…¿õ«~;¶ü«A�úóãO¥K½§I+VõªÄ¹Žz¶ìÝl/ŒûR·ÖRïrzo™K@õú"jÙ´[Qçu‚?þï?[ç¾ÝKå˜Õòýi/O£nçØm“ÝÄ]s$û)bÿy:r½T Û~Þ:Þ×ÕªÔÈ™ý3õ&¿ý÷תéáéæýÇÿ[vèÿ,kÙÏÛ6–µìÊ:æSD=mù‘þ·z*]Q»¦±FMÍÖìÄrß»íÛ^¿Zºq½.Š™ô›-séKÕDµ㬷 «qºëFFßöúÕÒi^Ä„ŸôR–^û*¯~\u\§ÊJÎúѲKz×öúÕÒÏËõYÜô¸mG°‚Á&�NsÊt"ŠѶnÙ,Ç7é0´2@¾Û9MÓÛoö—ѧ³€¤W5§‹8USó‡cYòó}ÛëWK·Ü¥û£ò�õ­º²(&U?öuÛè]ç§TmÓë7K_¼¸áé´ýþYÿ}]…ZêêJoÕ¨7ÝÞ¸¥ØÅ3ìñmo}•ɾ.È¿ûš‹I²cqáÖeºÒ}¾í­/½†s}-zykÓ×VŽèjø¶·¾æåN0Þ}­óp± ·kþÊõu¶½õµlÝõ6ÍÝ×Vüˆî½¯¥ï†Ÿ{Û×ÕöÖ׺CâÐÃb»¶øôü÷[/^6Ž:š>Å ­úßX¶A«À�§ûÛìŠã²)¶÷+ŽõeÀU=Šâñw³:YÙßNI ¯Õ©ÐÏætZ‰jOðå˜ÛkÞ§üSæÊ†,ÿyŠŠ½(œ­é7ñ*MùvÐA/lþQ�ã²Ê:h÷Ôÿ4�õ–®ÒÒ�¯F|;यrÌêiÚhïOhìy­õ oéï¿kÀeù¹h!e¯‘í^}[IÜ@E†qÖ 4_çýÛÍSlÃZFšv=«3l°8£j […û=ïoÇ,Á€~­²üí|Èfó qõN!å û©ÓÐÿ÷ ªßÖjë'pg·{І�Ê«S÷íïÚ>Z©6Ö-ùZÍæ9Qk=V¯¥™߆U«øFZ[^Vsòû'o,ûíGý8ÊöûÖRã‘úéÑ¢ÿK RsÀ!_¶ós2šðß3æ¤<îY´±×˜Å½,Þï˜ÙyÐ.ŠÚ`û )¾†\¦û5Óß;dqºùq1_ûr-.Öþïr�ê‹H:d°˜/Ã~ ¹­ÓÅ‚ÿÞ!7=ë6äˆC¾ìÿ5ä¾Umûï²Ø¨m7ë55Wý_Ã6Eås_nÇÕRµq½úñB½ZΫþ^„ét¦+¦Eë¸ÊfÒ ¤ñWæ½èŸÚ{90ª;沘÷ÍMtžw"¾éú• £¹J“ÃÄ7ÅãC®”@M³¾j £Oóý.85šo;‚¾*Ëýã¦p«H«•œ–Ýv‡ü_øøU¢ÆÌÿÛ»“ö¤.‚jÜ~ Å/¿ÙVe¥oýÝ¢ä@�¶#èŒZ17½b€Ròû•ãsšÆQ“sñ@í}òH¢¢­÷Ýr5× M 0Éw–,šÿ9½h8Žo{X4?A)fÒeÑ{FÊð÷-.Ü`¾í:£NYùyÍcÌ×%ä1œ@[|Ð ·LÀp‹T¡ˆá¨pW‹Ý÷ì—ÉÜ´¦àKÕù)øLA* 9ŸÜTµÇ鋹ò@!Ïf÷ãNtU‘ºI�•yÚ»3. DÒ£µ¥Ûïïl0ÀX$ß™@[|þK¸°ìæ¤n÷råÀøüûÎé§äï{bNpZ áû¶'%Äœ.½¯O3aÝ Ò§ËÚžN×{é<ƒÁýYEbãÎßýÖôuË_™àê²Xwé‰v~3`û: 9�Mi³ä¥“Ii“âpõ÷ Ü^ñmGгt­jùb鬱7æ·¬m¤ zc¸ûoÌ ÆzcNîÌãÐWµ—Zo<],åqN íÁãèïSŸýÚV+…š¿ÏæÞ96¤½”0.’ äõ…Öš.êü<‘à©Âü›3–CO5XÌÌæ»¡x›@!å¦ ì¸ õ¾àµÛÎêIÒÀP íÉÀº{KXùÍ^•îª÷o÷òãù¶#èÌÝ›?�%pœ6»É«ÞHìn½§q:?S0Üš1†:KC @�ÑF0’o{Œ9Æ·×ÕR�Éq�}lxr(†Nv0�©ÕwcñV€B žZ}}»W?7¤×z�ÛV€mÎ8ñ+Ô1u©¨î)…ŸúÅçnP²fÔw y߀mOÞ‡{_�@¡Þ³©"†ã”¨SDéÉ,c÷vuÝuÅFˆ8Ñ@Wyä2ô†òmÏÁÇ»é_G«vèʦ;£ˆæ8ÿ ޳-Y R7´š:<Ì&ñôœfjPÔ ©Øó¾œw= _ ÉvR =ëàT~reÝ0¼/ @!eN}ÈqÑ›êm"Ó7.¤Ç‰ozv ßÄIøä¶\ùHÜ,öuÿt·n\êÕó:Õ»""/ªüf­¥uëÞÙ[µ&Q h;‚Î8×Ñ Ç»ŽRöÌ3r>!ïPHÓ¹!hÈÇy¶Âšm>3¤@�¶ % œ#󯉱¨3Iÿ±ü—^S±èwš†/Œ?ÚŒÿ¥‘lGÙL¥8ܺ6UÄ€Ü9°í«4æúa§Õî ˆv÷8+>뇗ï²|ïnߪyªáX¾� ÕæÎnÙ*úkœã8žÝJ�aLäÛ‚åòOú K-Kë•C—4̃G~¦ïŒpi=„öiq,ßöìÕ~t"ÝZðN$…\ØÄ‰Ô[vVmû4ëDP íÁ‰tžŽAëPEbãL ^É=é'—×E»í:ÅG‚:6±R`Gº�s·Ûñ¾p·=PHá½É�ÆZŸ5nwôÙîÞ_Áîµ™J�B§ ò£ŠÛ×$"Î8w\Åœ~¡ºVevgÁq—øõ0m™áâ°×6 š�ø(ÀÁ„9�ôR6mY»Ûábh‹c€æ£) dÒ/®è»n[¿¾H?j,ßv�¡1ÇZtT/šÛã@Ò­† ”ÁÂ8Ö5w´Û�xGÛã„úÚΧ–´)ª—ΫNâþµù b“”㨠wçj·ã}áj{ �Âg®dëFáJz @Û£+ùÝ*¦t.æz|%ýF1ÿ?Æ¡$îºÜ1iÇúÂ1ñ@!÷_Q((»•jYzûšlLú=bó”ã`7ç-µã}á-y � &í~×ÒÒýü*–t8ñM"É7Í=ôµ ^û—‡0ÀŸ#(ÆaÊzåÝË�LbÒoÏçG‡^añðQ„çûJ"Iÿs:’Äq|Ûs$ùÙ¥mWâ —Ö…\VçÒö{½‹WsƒËü¸y-S%Ê�qà©,t�ÛÞ¿ð«=PHQ£˜¨¯÷â-šRyˆˆ¼N±™I`q<„ê)uõßâý%”Àg"ôôaû¹¾�¹î«}R�Ìò8C½ny›ì[61)N íÀ¾Ÿºé ŸÚ…û½Ôhì'­¯Õ»�çÓoNï¯àôÚüd8!5�)å»D�PUxpL"BÇq§0:ôfäzcß`W¦³Q‡Ç ´=Æoò¤pl~òqˆè£Ön«uýë´^9\ŒZýF5+šã¨w=µã}y �§Î}WMöïpî=P íÙ¹·ð9w¬­1·ýç¾ë«Yöá,Ä$}{‡ßôäÙ_‘kïñ …›Ä¦)�ÛpNGûV?S [ã)ruN»Ê“Ãâ¸üÿÔµoGâ={�NèÌMöúž|ýèìéKsn"Úb7±aži[0b(NA.ã°×ëU—q:_)¢ Ï�‰Dh:½A -ëÓOÄ�›á]Ùý ”�I”á„Ó›Ža¶¾þbîëUy!ÇÇJ�!ÅœÄ48tcñÁ!…<쇵ާ0¯EÍÛmsØÃQ2SŸÃÀ>8—D„èF£#DÀ )yp úÑ!- ™ëÉø€€mGÃ~Ü&¶lÄXÜžªaXíƒË2]¹O5Àz˜L.¢‚¥e‚ 7L8¹Ó¨cX»ªn7e ¿ ;(ÐíçáLùÍZ¿É±Ù¿×²ƒù¶#è -œ~G±è÷r,·1ä? Ê©e°ˆþâ¥Ì½nÇ¡½kJâîÇí®ÙÔ¬š—™õõ¬1æb@ÅØÜd¸�Š ÔÕ'Ϻ…w¬=N8�SGvXìÓKédÝxWpm¡;‹wHå(T-¶^ùh”–ÊÜÙA¿i§-ezûá w€m±;{ÏÏ)RŽA]gSD Æ)NÓ?/£¡~À�ú­ÊKey.f˜§Z¬DØto¤’1С›‘x…è`ÂÉœpC ?KîÛé¡V)޵òqì—“cGJÆkßk%¸�’AMÞÎPþ¥ ý¿K÷"‚©b¸¶'"Zll¨è‡i~g�èæŸ�(äb¶¼bö`—lÓdÏM¸4bfûT±~ö盀ÕãÄ7=‡«o⤴‘¶‰ó‘8{똡a¶�­¥ãm�™!°H&Q ™¡À¼Qá³�Ÿ(¤ð™î)þÒ¤.å¸�÷�RºÇ£ÚbÝÓœø"~§ºZ3cç =Ê¿‚£|-ZR/8F?¶ÝÕ¬1ã��‰óò/x³þ}>~oQÂH”“sgaë¾Å| lO›˜Ï¨�m 6:A%¼Å -J‰óð¸xLz{Ñ6Ïç[6lxì�mqxÌüªža½kÛö�ÁõÞ¶Ø—çæپÍó�k·¥ “¢B2Ìoð4"nÇá#b�Rf*ê›L3-ãí’aŸ ´Å�_D†å8wbl݈ш³×Ô S_u+Zi"Âüy1iR`L„ááËÑv¬/QRðÖ–O�¾—4k˜ßÍ1óä:›¡ 2OæAV;dyœpBûЉâ†L*ò¦[<¦Ÿü‘®¥¸�~Bíð9˜hG!ƒ N\O„�çwKÄ}:#H„y½bS“c& •TO´#ññ„Ç )uOŒöMŵì»~û&žð@�¶8ž¸¯=õOŽAÅb«F Æi©”+‚¾<¡•5Ë7D˜Ç ´}"ÂîUË!¹T�˜±¸0(�qÆÑÞKÔã¹|ãx @ÛcŒó>Iöf¬¡âË[è—£ ”âBºW63bí8¼ó8ád~KX䓉ÆÉN± œ¥k''‰¨Ñ ˜4YNØÏ? »ûVòO^õÚÁÊp!ÿ„Z<‰ÓÛaÈ8݃„“—�‡U__ûí¼LŒŠŽH|ÓSlìïËQh“l­òÑ8ûæÍD7üÔ òÒñé¡ çÔíJ…Îc™íûFš³N¾/ÂL4#}a%N8¡³Cî€>çøä¾íù´¿­a±WCË/Ç{+¼Y£_�5²J�Bš6ϳ ³Š?oË­É Q:ô½ìyÛן¯=�ÁÄ7ØSL±´]ó‹Ç '¦£‡A¿{\´’z­=èµ›MÇgT@¢’̸žv –ëñ(a¤Ebp°o�/ÅÖ®CD :-k³òð‚ «9:¥ˆ¥Sµ9J�1Yˆ›>'1Ú±¾`1ü"d÷@�¶ç ýM¢‚ª×&‰‹Óã÷Çõ¬„×ΰ­— L¯×¾&U†‹‰^ÔäLß ÆGð&œØ¶»ïÛ¤3mapUÑ©Š¡âé·cßMõEt­�¶OÇLª?϶P)0fRQ9äqr;Öq² )¸�“»Q]ÉyÓ<ô³Uç¨/µëOoM�âÄ7AWq,Ûö͇ê'œœž+ìºzg×´wúâ~Lzgs’cÊõe¼·C}¿{ �r¡s_ö]ýäpñ\΃NEÏ€h{ˆ¡á#_9 tœ)Ÿ|4F[zE¸õƒ±¨©“¸òÄa¿îZlVOö}ÑVŽ‹ˆCè 7×1§Š$œ„« ò’¬nøœmÛ#«{¿uß—Ó?W2t¹NF«c:Ö&' ©°SÊ¥×ܪ¶LõÈð” Ú˜EâW¨gm^˜î)¥Ý†ý>êKßõðË_èušÉ“ábÆõcÊú´Cñ¤�Ç 'u@ö{_íü2^×L"uZÖf)†ìa ²)ÚÇ�ÇÓ>Rø–Ðè•/¼uýÅ‹‡Ç„²ˆÑIDrÄõγ*RÔ4 í5”Ö–íú”�P í1 }§2 œ [)b,ê4fáh¿Mõ=ïy]~�zœø¦‡Xôæ.ó_ãy±©ÉGáÎ÷Û ºÎëuÔ©°ØÃÄ7ÅA±+ÈÊ!xvlŠò¡¸sèxËy¯QǰTÇ $ ûò7}ÏG ¨ïzG’…Ð÷+Š< ûnÛÈӧмßê¼ôüóÞ+Ddîqâ›ãò[™pÊm^ò�8®7�Éû­«÷ºlÅÍ�ç/‚r ´ÅayîÝËl¦�ò›µ^w¾wËëCSÔX¾í:ók–ûûhˆ,´"Ϊ9µ×�¯,>ˆÝó‡ª×ü&QŠ ùS´")�á†ây )7¢÷z€Êò¯º v>Fœ@[¥Ã19 Ì’-]>càíçN·Þ¬·HZÙÉŸP -f‰I`ÊoV»'àuÞ˜‘×¤í ¼Î©ö:®çMvNÕýBUwí£Ï0á´fF­¨EÚ´¥ÎÏÚ’Ô ÚžHÎüW ë.ãIôNèÍö¶§¾(½›`Ò0 ä Aµ˜8 ,¢ %•R*í@4£âaB‰ü�Àè—¡ÞC°³ÛM<�8�¶'ØJ‡ªÍV‹�Ó“‹Ñ/Õ´”çïÏï8pmOlbþ+<¯6+T÷Ìáÿ®;†„×'Ðö®Š�û5êmæÛv[).6 @[{×4ÇÔóºÕ–õUHH æÛŽ 3ÿ6ë»% Ée¯QLšÏ �XFÕ”­‘eYoš aS¾ Ÿëõ˜5~¶2Ž/œ@Û#_ð&OŠ@mk«”�D)n,kêõƒ¾ê¹ëEÒ{N›‰”á"R9Б SࣩÀ '¸w’‹שZ[î”rºÓX?tÿÆé樘Ómz"Hîvœ/HnRèœKi�æR܃7 ¿�Kéçáç¢ :Ž4—0�¶'.å=ã—CÐ@ÚRåCQ¶6£Sú¹¯bÓ{žNœ@[L§4¯›4×6?ÄPœíÏØ•¾<ó¢tÃx¬�äŠÇ‰oz¦Vޣς†©ÊC Å9(Ië§¥Þ€²¬Û¥d�Zµk2¥À�[t8Çø´ã}Áøx �Â{µ˜h/$Llš2�ÇQ/)�1ÍzW‹^Ñ»|Ac8”ø¦�Äpñz@õk“ŽC)rǨ )17jÒ–ýò›92ÃãÚHàôG¨omB˜Î ÕÝò¹úý#õí§î¼ ]¯ÜLšº¨(3v§ˆ§w{¯×‰¬«R <@�¶O,àíÐr×¢¥cQ3¸MçqQÿ¿äH@Ã\äd s$�ºúLŹ�H*PBŠœ²O]ñ½—,?¿!ŸgÝÒÿ¬ ëùæ:Á›yŒø¦�5s™Á�öÊæ$ˆ²|Ý�[9š4]½Bc¶7Ú¯Í}�6yR`˜û tzJ+º±xZ€B žqxÝ\ß#šg}mü$pmOÞMÂä?GeZš‡³w-C5U=Ttíõõ² «3-õ­Q/»MkŒÓ:¾3"ÙÕõE²Ë…”;§9ýSÐ<'>¾o{b:Ÿ‰¼N/îÒ-"0i8"€mDžãer ÚpÛÖÄ`œC@q‹]1ë¢oÁ—åà¸E ´ÅÜ"\?@ ÐŽÛ\ÃqNCñuód7ͯâÖ”ã�@[Äòñlsn3”�”;¯×šºy¬wªŽeFû-¤ûÑF™)0LG/Ëo¸¡øü…”û´×õ?uB‹õ=_ƒtM›¡ å£û›Ò±n$š�œpR{J U{9*J”ów^êKaæ5 ´=­kn_h!¨ë;ǽžÔ/¸Oh‹¹OæWe~ûRÊ4¿îB!»oÛŽ 3†€�̯œöýÒÎ$ë�mÏì»'�cÐ6Ù,ƒq†.à:§¡*ô¥Lå©U ¡zƤJ�œ¶‹iÚ¶÷/WRÔ<­8,õRßA•×¹§¹´¢ ´Ag˜4+�¡Uq¯¯OcÒ ôïµT 0ÌšÊÜÏRþSWÖF²¿]‚D=~Ä_»¾ªÜ!h¦FrMÏ<ùGVº]Š/Xir]£àyêì£vifÄТ}º˜¡':ÑØQ´t;Ü´´ ){Ê �[½§¹>ArÂ&¾é�bù†v¼ŠD Çù9Q]†ÒïOåLÙ·¾Y¢ÚÚž‰ê÷LgŽA£~MR:ç!|ä…Ç¥^è«—/¶­I^ØÚxá‹Ç¿&(Å µ "㌲7$©nEÊ×$Êu2G7oøuãl× ë·_Ç�–D�lò¤À8Á‰ê='bÛ±¾ b=PHÁíäï/ÔŒS½Wx-QÓÉä`‚Ó+c›§'8Q³34l;Ú4¬ )z� ‡ú‘ç­¸>g R�ÎLØDe°0Û ‡#bÛÁx.Öã„ÜyKc_?57õãåb‚ÑÛ›£'Ñà|äˆÛa¾àˆ=PH™ÛtÃ^? P¶ûÏ=dMÑB˜³�áâl'Z›Œ!nú‚!v8ádβ�ýªzk§›!³�(Ðv�¥ŸC�ù­1cq42Ç͕ݭŸt=«‰HnÖÚ¸ÙfåúÒ¯^ßßNf…ý’Ø<¥À8+Œë›z#íP¼7âqBŠÝž´|NѦÛÉ'ƒs8:}Xí³Z¹qjŽN÷@�¶˜NîÔ ph×m¶ˆ9'áN]™|&Ö\3Ýmž·`ÖÛQ+Æ©X4ÊÉÞ÷Ëî�BÊþfsó¤S›#*[ÆXfWì\΄®­ÿ^'ÈqÏ¥“®¾½¯ýëÎR(Ðv�!å�¤y;Öl» )øÅ¹]ËVït¨Ÿ(Ýö�zos”ââÜ,ø 9ÕÞõÕî�BÊ�8ã¾Ïõ®‡qÙ.¢”r(Ðöà \çŒùùÔu•šËŸ´P JÃ��Fß÷+ú°GÝ·mña�¬ÚÐ×úìò¬Wf°ñ{~~�I•á„ô¡"§­ì´Y)•¢ÁÎÛS0iìm¨I•ã¤1d*wÔ÷EîÈ…”ݳݾ³Q¶Æ|úV�Éöé;f)0Îdcn'ÏÚ´c}‘µñ@!çrEáσ±Ó/q9h{Êxæ&G¡›aËG Çù,é®—sè�wëpÝ?Æ‘î'Гî̯КÛÌPÝ3®AN³ëW®´eÝïÌ1G³{ @ÛÍÞfýs t›%b0Î;ð\{16ªéÊçe˜ÙöºÏ$Êpqb;Ò£ÈÚ7�Áö;œpr¶åFÅ@®õ»J,wO©uû0dýDøÐßÞG ŒSë¾3Ï@´¯®‚Ïû@¾NPŠ ³ÆÈ äYuÿlVŸœ’:K†ôõ¢ó²ËEd‘Éh;‚ÎR3ï·mæ(ä>óoÇäO�öû:èéãsΓžéûúÁ�·L™žñ@�¶#è,v±s:6WÄ€œ‡B%hºÝ>hRbò3+Êeh;Þ+EÒ?—x«yíë—  æÒíx_¤?³>ÿy)E‹#P -¦Åm­ºszR@y¦¢âJÃÒÝy_n ßv`_9I_†Zëç%JÓE³R,=Úžyú—@9í•M1güÞ¢}ÏCmÓu¥)š�ò›½^„=N5ñ|J“£D=v–YY?ke'F©ÉZ�èq}Ûc­@³�W½FºÈ½_Þ¿Ë0 É´II`Aj>2¾ï&¾DëK½Äù¾¿Ï6 ñÔ˜ûÁÎÒ<BÈä�Ñ2\“ôeâ#+“pæn$š2œpB··=>V’Ôo…¾Ä]ý úÔï÷Ö.ª À¾kÖŒò…1s8áNÊPz®L!zjßV´œY (?Yõêýiîß›Ä8À«AOÌo8Ê.ìºiŠ ;,�*ë>Ö*¦i¸XšÖ�ø8¶aR �ÞH’î)C z5Ð<ï³]•Jæ{(ÐöT\‘ÿ ›ª{Æ y?Ô¾è`ší}ûËL­‚‡ ´=Õ*|Èö”qúZr¦-ÓÙ ´=g{ÞpŽ�:› b,ªæäÒy¯«Ê�:½+âÖ>ë�~Œ‰ô%à#�ˆIô4ƒÑY‡FfÿnhÕVzÉÖͧ•õÙt]Lg¸( ¹AizÇ�Åfw&œÔÎÅIµ9ø.×ôdF€rƒ>fRÊ0³þ×¢¯sìg‚�Ȥ N -̤܇ž¥�ª†‹©\z}5àÞÊÄP®éºòi”¹V-Ís™Îõœt—ç@Ct‰“£ê€Øªù”Œï�Îå PHQÛš-°`bļâÜ Q9–$qQ Å·ÔqV½Ö‡M\L|ÓcââP¥¿GÓh;&‡3³^†í‹�óvW”0D8Úˆð—4ùÏ�²É!!ÌCÈ—Ázû^™ÚñL„<âÚy TRX"›¥|0Ʀ½çþË‘Ýê‹Àû´Û—º�)GÝog=F¹ÿÈ�d¹?�@ �‚;Ö{ª·wE;üBVUï5GŸqœþ�¹ú¦ó/xw‡NNo"ŠRÝTiOË Áìö¸Ô{©ÇââN·!OqqrÛ÷lEûƒÓ³v \G‹Tyr\œ¿ŠåczÛ‹O§·ñ¹9‘¹ ÀT¿J^ÆÛ¯¢.àqmö•”Œ4㋊‡n�9â"|;ßù33^È›ýÄôByýØÌ2löb!�—ð@�¶#è §&… ã`“CŒÅy!Qˆ>M5zËø\Zl+F9íÈüS œv¸/8(¤ìTªd*®”±ë®¯þ|‘*ñ@�¶#è,æ/sp[Bb@Îøœ+™úúÓ¹D*§…¥R%&¾ézÂÜ Kns“�D9i¢dèëK¼S?k¹Ÿ(ñ8�¶#è‹eÀõ /Õ¶ûv9÷$î�mÏ økÑú©’Cú´gÄ)ÿüUž¦pp*S§¨ˆwŠ`5Löa�¨ «1 ³´ìÁ�Ä×=PþŒb³Y£ày}Ût†ë”BŠ%œ«š–áUÌG�¥j|gܯØÜUÔ{Ûv`_Dº¨ïíÑá.8'ÓE(Ðv�=(¿‡ž–mab@ÎmËRF}§_�--ãµ�É”‘ ´AgÈ»ät"lŽˆÁ8�Ä¥ôêEegе=ïòÊŸ“1·5r™¡0ƒÑvÎç#ÁJ§rZÌïW€m“øUñ�Çz…Ö8½ Áu�ÐQ‰¶%Ì·Ag°�»¡–ŽE�_ÉB_tá[¨ Gù,çÆyYqâ0ÇhÑ ñì\Â2O¶Ïg=N؉,QûTé°Ik�p£~n”-S Œk@Ð'ËsoíX_äÞ<�{b"÷¶©K_6ÅZTØb ÅåÞ(Ðv�q¿BgÎ60Ó=å¶v|Û×z=Í®†ö$|¡ÛC“(Æ5h[ÓÜŸ‹ÏýPHÁ]’mÛ—ú}ªY7ÜÍÓ»Âo¢m–R`\óÙ{H˜¹ÞùL…5UÈÛZSº5uj?N!P íY!¿^9¤üfû©ªWYàˆRC©&ßÐÿ›Þ$©$˼Þ5ÏPœáU¿MQ Œ«3ÐŽ$i6ÿ lš ŸÝ5AWdšÍ==Ÿf �SÙº>›^X™ õ '± Å›&[¶´ �Kn$>ñ@!ÅnIžm´ HË2ç‹o‹FÀPÚ%°°d$°¹iž­‰Ï²9˜P"SɬMï‚[G2 €mGÐY}û*a¹î` ph7máˆ9#ü1¯L™Ø ßv}q¿B“iÁ Ó=e½Ëôh{ªÙK_/íCèß ®ú"ŠXñƒù¶#è,¼[I@+ÉJpÓ¾ˆ,µr 0,b Ì‹÷‰òGÁ£‰DÌ—¯¤²Kn øì…œÏ4™³éa^šü—Ì @Ût†Ž~ŽAói‹G ÆÙâ4u±msÍ‹.ó áŸ» @Ût G`¼µ9"†b rPͶ•wëõuˆõª·‚‚°¢&T Z“äx Kâ†ãÓ+Rv—EØô=ÁåýL,”Ø–½^Z^`ú$çDåÀ°P:#4¦‹×˜R𬼞‚-o ß·AgÁº¥˜bý—Ÿƒ^õ]ŒÓôZ7b° Þ: +¢5qT¯ƒ�FÍ2`/~öâJ’%À°–"0>YÉ < [òL�o;‚Îpír $åÌ›#Æ¢|YòέŸ¼ �Kë3 >Ù´mÕ¥žg}güŒ•¨,ÚŽ ³ÀH1èvØÎ&£}˜®V,Že*OšÀv@ì’á3.,ìˆói®«M]ßÑ\à/$ð0ñMñøŽ–IEßMõb™qÞ_ß@`F R{Ð(›¦ƒ±|Ût–çìÚ•àsvGmG1–à@Wm![¶-ký<È\Îæ=9.äÁ|_”œdUÔï|>JN–®‹ž¯iŠÉº¶ò¨h{I­x9çõÉ­Ÿô+ð“l—¦@!�®,«»­“æò–®è‰+ÉCeu(Ðv�¹ƒSC�ÂýʹB%øm6C)0¬q œÀ4¥ëÆâSºRðfŠrS�9R;Ú„�À%\ÓÔåVØX[fM€ð©K ´�©Ë7â)‡€ÛbÛˆŠr�Ú]=è-kó¼OweŒ¯rÁÄI�a•KàmdYK7Ÿµ �r;úrÓÂ@¥óʱémR¡î\›¤VÔþÏç¼¥ˆÍ[LH™Û—Q6½á±ˆ«/¨ž¾T»€¶sŸÃj—@¡SYB7Ÿ% �·ê1³Ê¨†m–rkΩto?´(FÕîÖ_Ï ¥/[QõöÂîõAr–¾@g©ýhúÂ~x �Rg¥8ðd)Nðè¾íÀ¾$úÁ¦�öö«á|ÓÎWš€±²iJ�a¥I`ùšeKcÔËÉ @!WØø¹Æ—Zö>�_�Ô¶Q «qsœ¦.ÝX|ê€B î¼ûDܼÌÓ„»Š°¡6E ,¨È Œqš³tã°9K€ %2•³Ü–¾V «¶½ÞA r–h;‚Îj¥À™²œÆ[E¦8´é¶pÄ€œƒà�jŽq¬d’~Õöô´}êϘ—(Ðv�qê‹‚*� „ˆ–«Øíu±”cÿPØjÏÄJ�aaG C©Ä �O PHáamõëmó´ß\±¯7Õg3•Ãz“@�¦I&7Ÿd �‚· çbŸ.[î¬.‚bP€6E)0,6 ´iš@pcñ  )¸gë�ïÞŠøõ«µË~•pD9ÚˆòÀ·Íqh(lñˆ9«ã/׬ŕÕéÕß½Þ�"U2–vøÎ˜�¡ `p0ßv�±dŠ)¿Yês&Û¯W@ U€øÎ˜r�¡ËMp0ßv�ù8)`ŠÇ¦ˆ‰Ë9⦨=¯W”±ˆ,—�¶Qf0ËC¸¡ø<…”û3ë¿ÍýÏE[Æþü "ÉúP í™õo\€ƒ†Ô�Œ³ÊŽ�6»|öþXÖWŒóý=¡ñöIR\X`á»Ê ,<‚-°À‘|Ûô•3þ[™ÛU[–;m”Óý-HÚ†G¢ÿ�Æþü{˜|›“d ¦HÆñ3zQ`¥ºË�‚ÒðrL ¦À°t!p™>§@Ü@| €BJí6Œ^©X^»ÛJC%8]6C)0¬‘<¸<ÒŽõE Ä…Üm£¡(neÅ‹)Ù×ͬÑxméÞ¸™kfßjæiú©¡Òë™v¨_ÁP¶lNH±½S6L5!¡—Å,Sè…ÖׯÞêW„ö×¥À¸öÄw–z@í@_x@(¤Ô¹5õëL[SÜ ¾íÙš~¨ÏñsJèàbø¶#èŒûUùM-1.-ûÛÙâºÇ ß™@[íËWÈ4ç!ƒ…2®'NJ¶Néw=¡^ ÚƒT/T±Ç“zyÌfº)d“™ÁÌ_<]w+õÊôŽíó�Í6¨sãâ�K±$@�¶8¸HsâúQ¡òXû>_© 2'î�mGЦr×ó¦v¤Ÿ—KÂzJKyëù¬fƒòœÖï½6t‚ ks¼ÍåVÛÁ¾È­z �’{w¹V]Ìs`·Ç€zð;¯$} ëa'6϶c}‘9ô@!è§úôå•K†’ïx^ôSŒ‹bЋM3‡íP_ä=PH¹£œF±;z†¾åuåB (Æ+œË®&À¸(µ—°kÇû"aç�B ïÕe õ3ÌS7ÿìì¬bíǰÔÒ¨©˜ªW]CŒ‹?|g°¥ÚT�¥ >7hî| Œ“ƒ˜hL ?ü#ЕøìœÔ\6q\ëbOZ4}Ö¸sÙDh;‚ΘJ«v“|Qiå�Bî¸({Ÿ? š1SÄp6Ñ¿H«dlq«îðê?¼Å0y>£ââ´=y¶õm /R­ Jy“Œ¦Þ-Z)¤Nó|_d4=P í:§$‡ ÕºrbéXœ Œª¬ôfÁYÓ{Óµá°Å›‡+nM€q5 Ú.©ÙŽ÷ERÓ…þ¯~ûç߆}ßô# ˰íõ# ÓR¢Ïrφ_wÃTKYu5.Ì«åï~ûo?þ±ôÖ—-QþwþóÇãÇþÃoÿñ¿.å7ãÏi]J4õ‡?iP¤¿ùQ\îŸÝ¶ÿÐ"ë±ÌÔŽßþBþþßþòïþõøß?þø×ÇßüúýÇÿõãOÿú�ü—¿ÿ§üø‡ßþËŠÐ*öØmõ&€e(zyé«ÜEÿtóÝòën)át¯‡ï×�zµ˜à`å»z�rqç¶§Lj¿ÖOKLÅ<\®lÿsUºéÇÿ)OøL/qZÕ÷Ì$Ÿ›¡¾È=;œüù¤¦»ø¸¾í:7(‡ =hŽ1Ç5¦yÔQÕ÷<�ËÍÌpiT‡ßt]~¢:L³e´§¯üDh{ö_‡,GÀþ¬ò0#Q{=z= �WtÿìhåëÁ¹’>¡‘RÅΑ°%#fÂ%Ir…m¦–Lz�@Û�¡G¨ËªÁÿ¶]N Oy·Æ¦&ÆÅSè#¥Ìv¨/2˜(¤ÜiÆp8ߨ¿J6(iŽ |á. cK• ÃùBÞzv}½ýuÒ÷voŒK¦t[½ý}Ú‡7V(ÆißYœ•j{ÿ" ç�BŠê^­Æú®Ð´-wŠŠlœ!2�R\\cF­‰nÚ9‹ò%E¡Ï?'¥éíÔk‘R`œhñ�qKIg¼¢=ðç•MyE�ضØÆ¿)SÕæhåCQYï4ËÓîÈ/²<(äöN+ŸºùüDÕ|~{†-}ò@�¶#è S*C¯ó9—Ÿ^î««6òfÙäùŒ Ê�к{S�K_vÊ wÇÔ/zu÷r1�e¥|gL ÌcèæÛŽ 3&Ö®›ó(aVµ¹V[?qTÝÂ¥˜“ ¡¼¿b›'ÃÅuPèû¤©¯f¤/2_'œÐ>îÜj¥Û²Þü8Ö@5”éÂ@9W,Oxµ}‘ðò@!¥N­Åªï±èëuzýÇú…¹ @[l0Ú D@ÊoêóT;tû£ÔXAItÆýŠ-T‹ºwmGЙ;æ¢¨à¥æfý®Ä~Ï 1T‘úÎÚj½­æBóm¦T@­ûnˆ°Û‹Ë…Ý¿ã!Å_Qí¤�’ Ë쥸8±z1IÇøÙäÒ1¸œÄ÷7UNÿ¯_ª_0keRñwoŽÝ¯À±³éI�Bz‰\J½Œ§÷ÇÏëÏs’¸„z ×r!q“» ˜B´9"|.Ée�cl/.Óè�mGÐYt·1C¿Ê&‹�sÒœ6Ò ³Í¾XqÆüX5âíµI”ãª‘Èøc’®íý‹ìž )*—Ý+¾ˆ^³¡qÚÒ_1:“Ýó@�¶#èL¢[é œ?Ùfʈá%‘*€µ8´zÝþT6ßYåÇ) ´=(€&H& å7«}=\£ÊËu¦Æ Š 3¢¶0lmO0˜o;‚ζҪ_ÆÓç=O'®xíg{)ÃÅu+¨IÝf"SD¶tÄ pù&*uÓLŸ¹q0á¦Ò;mE­¬5ŽÝµŠã=ø+Ѓ¶l)�ÓÆLΤ닜‰ )xð�¬Mo§Ó²¸xÃrø¨šm¦R`\�z>ÉW´±ù �Rä&Kº–9Þí«1bõ%�{[ç¸0Ï}ZÒÕ´#=”Fä0ádnÙ'nÕ(ðî�Ï�˜*J�\–†›E¶ô ˜~NÔ4—ÓUkY뮬1•Ëñ8�¶ûB“¡‘A…¬×U¯¾bÅïÛÄ,*XÁ�•Ô¸aèºÀ '²û.h>Ÿ`“®td¶ ŒusÔ³ò9õcÁûr¹ ˜ç÷i‰‹J€q®?ÊqGízçSRÔîÇe¬.§§~¼D#cHT£Q¼|žÏ¸8¹�ö3+ߎC“ò&œÄÎ&¨ŠÒr�e¯K D5ÚÂKB•hR36Þ B²ñ€FÜ–P];»E®«wI„ ﺮõ–Ù¹¨ˆ——œC†:ˉo7O|PH¹Îž�圃‡÷m1ëÜvSTüdŸ=†×g&¨Áî:ÅÓþ ä[W%”£ÜÞNWŽ Wß—W<ù°,}ðèœÔ.Å´ª·¢¶hóíÄø ÈÙ¥À°D"HD}®]qñµ+Rê4…à—™Ì àîpMöDPöë>�/O·ÃLQöh{ ì“8b]‡úyO-áY¶/â ´=ÄįÊoözÙ¾¾G~ÇV\÷X�µr€akå‚Á|ÛtÆý ŠÍ Ó=uêÚ ©ˆ†‘“mbkraX궯æÊVm^¿pÛ(лí¹CàFýnŽæ¯&%±û{툃¢ 茨@ [� æÛŽ 3é^·üçH¹›ñ"Æáø{&¶–Ó1TÆsºÒ\ €mGÐ÷+ŒîlK3ÝS¡¢î�îÝN$¶*“'µ�Ld–%W½(¶ –q×>)@�¶#èŒûÆR¶{™î©ÀÌÞ%««³ôõ‚ÓY¿F<†^κl?k…Æüz[<‡E^Žï)÷ÛÝ8´ß8ád~Ÿ˜wY#¶`ÕËLk˜_“À"¶zÊ‘ŸJîá0'¬HO²:ÁSû¶VÇx”Ë5^·Õê õ&‚3ßø¼¿Ÿ×¶M Ò�¦ÒÙ:žÖ:é×ÐÏÏ”0él€ ´ÐÕg{¹–éݵ¥ìŒ½ÿÂ^P íÉ^Î×ý§—³Í?ë{]ÛϳêXÀ šL.,c L*“7nG£ÓÆ&œÜi>t-¡AÞßrÞÆåC(Ðv�q¿Bch ÅtOYV*ºn]­¨ÒyOß�Ê€P í: ˳žg›-b@N9¼ü¥ìK=‡V?u*÷¶:c]§ZŽ<ÍÝýþ!� ‹3|_D„‡°U8”k:‚®  &E`¾Ê­|$.÷•¦µVýB¦¶Lýõ¢•ל@Û�}Åñh®ßý޹¶a‚â$è,/„[ŒÅmÿ ~5Ÿ_0 ¶›òeaLŒwsW Í‚ÉCø`œ�ñÇmÔbÛyö³ ŠD@›@., ôzšƒk‡â³p'œÔiÊ�·óC¹ÓùIs.ç8�¶û‚Kå¬Ìõ3ºÓº¿îðcFÂÊèÊ—õ´?#Û¶f˜dÓC)0¬ iéTj²¶(xZNÐŒV]×¾V�MåŸßùàhU ´=Ъ/‡£ø%Cýy÷sMîLÛ0., vybàÛ�hûîa‰|²ƒçJåS‰VÛ¤!Ö€s�µÔ[öÙB¼í¡jÈm;T)0¬ ™r ]ï@ùÍ[QjŽ SÕÐWì4�áã8œprfY~ é‚,œ{ßv�ûœCP¡ØcqÚÉÕAäëÊ– „¢m;‚θ_•ßÔ·çJ˨ß.» Õ=T@gÎ^µ®zÕ×ó8µrÉ“Ãzè ê2ˆg`K"‚‡çO2¼çÏ*dê=ÿ…ü±. &–­ V„ü~C©»Ã¾ÄÒaèr©ÄÔDrqPðå:­ö½³qºø(QÝ¡·ÅMãÛëÊ0,�ÎT¬Ó™ßn ªýQÝ…¾Pr8—#”ÃB� !D•´ÀÓ°%-Á4pÂ稵~md˜îL3“~jAÒ6A/dÖî’/¢0rË™ò>géTOc­S7%�ÏEm>Þ˜÷zƒÔÒ-ç%¨Xº‘–mìe„a¤´\ï|. €BŠZo ¾oD^Çú��⯌ú�™*·/ ˜ežæ²ö·³˜¢Â€¶£¤Š¤‚/#ñ8áÄuÓò.jÝî¾DAé›úíc%ä^qE + «Ïe$í,²U$~î9Y[É"Ž7âÅÇ%@î8Y ˜>6+Ì;'ø©ãîH]ïtU̦—Q¦ Á�/ñ¢¹ @[ÏS©äU™EmÑÏœþ*•J @ÛtF:coß’¸¿½Ë:(Ðöä`l—ý¼¥Zô{Ro†Â�ÖN_¡ÆgPT¶áí=•tCщ@À 'vpw¾zZÕª–=O†/˜€}rEˆ 0,˜6]’t#Ñé@À )u4MzOˆN¦Ýü_RËÓ\K,Û\ŒS˾3,SoQu½+šðù 3f,ª™ÀLÇÇr/<[N‚MÉ›$TÖi¯ÅDoïùs  ´Ag¡+Ÿk0¿W® D¨¾¨¦ÂwÆqx]Ä�r»ß»Œ Ðv6±2œ6Mr,*»ºßûxoo*Çâqmö…å )UŸÍO>¥E�SÝ�úýÊúŠÍT!KQ©õ êÙyëv;Zûüöêih;‚Î.‰N�DùÍj_sUšçro©¡|ÛtÆýj\ûê—æíu/®{×v�åë¤ï[ϵ“ëòxr�(Ðö¼Nç&æó+®Ã¥Úa~ÃTir �27»ç=ˆU¹#ƒÕtÁòÅ¡ÌdKÁÉÝæ4–}«7¦j²äL«)øWª°›k-ªÞ÷»�P í:CeX‚¥½ö¼œ–ëW0–í£(¤àYö²8à{MèìW噽ô@�¶#è rc9ÄŸªS"f¬(ƒæ;ã~E'è¢îQ+„ ºgíƒe ¤öáÊBíÓ¤XÚ­^1S½›ð-UTEw¦œ^Å«9P í:ÃÔX~q,›%â s‚»ÔXþX„`*‘x|ßv�½ï"ýì¨Ô×LJ=í�“©Ãïi´tÙQwCñG€BÊÝjÃ|FQÍ™@ÄRp:3I@ã)#ÐÜ)‹Ð·4¦VÉ-Í¥VÃ-�œ{L‰“çžK‰ÇçþM",G@ǃ¬cà�¸Žá£ãÔwpŽYß;ª”Ú�ø*%�RhÇãõÓùÕœíbæ¡dÉ�d'?Ã…%K(´yÓwfž™Š‚›*0—¿Üß&¡b-ßv�å3´ì5eP«Æí‹) @ÛÃÊ¿BÏØŒÓ=çf¯ãb¤Ì¶]5Üí#þÂ]`:0Å ·£rruëÕm¯/›‘ìªÇ ´Åüj@B§°Qi›ºW_ýÄXAÕzÓÏçZþæ§l!¿ë¿i8‚^ˆŸøÝp=Þ1¾—â{‚£‹_øà6,÷ÂG s©é×pðq9I­jæâmcÏ^¼r„º�™¾r°óK¿‘í"K¿9¶ K¿óеöÉ¿¨Xó@!§«�ôÓº¨ãr^¿€¯XøÒ![´ ¿a�eHi�Q3[_ä@ÂIÜÆ.ãZßYŠãu^“ïzxFßÎx†‹_õÀì@^ìÔ õE­“à 'uZdWeD¹Sa�Ñ‹¾Í~_ ¡Ve”áïD£`E�ëçž–;Ïßüà4¸®”EïÖJžµ(‹7Cý²¸®Òš''>YòMÉû®�3Áé’#x`×t]1Õ=ãlь㾑Õ=(Ðv�t?ÞrDÒýÜ5GH÷÷¯ùÉ­�IC<9gÒc¥5Iµ`¼Š=9cåqmOÆê’hºSè9®ÒdZC5çb~)bÀ¨H×w׉µ¿:™jW[íK­.Š;ƵÕX·ÅÕÇûÇ¡ëãq8á©B±²}×Z&0\¯x1•b%ÐvøžTžë¾¡Û„$ðoìäeå^Ò›ÂNu*x&D®Š)‡„«U¶zñà6õ×[ d­š ´AgL±Š^ñ¾ÚÜÎWÛ¹bh;‚ÎT¤þ*¦½ØÛƒûôboÓÁ¸MÿFèÕ�¥SÝjëý6›+çó‹aÒ¤À¸žW6¯ŸiÇú¢€Æ…M[7اšJ¬¶ï¡>­ûÉâïé6m9.®Ÿu}±6¤î â�BÊN•Ò¹‡¡+é`\ÓtÏT «±F=^Ûû+{ÄpQ�ï‹-Zõ8ºhômGЙ/ͺZt¯ÌÓÉ­`i¦WƒWÎ$Æ¥™¨Sƒý”?²¸Wô˜NG 'DZûø_i(ä\úâ„~ªé0å. Ô@z]xe*`\‰Š5áfÚ�xnÆã„úc¨¤—ýkŒXÜ>~*y @ÛC¨ô9é¾l%4üñž»àrî'¾éºú\"±”m×Õ«‹–ëVc®D€mGÐÐ3 Q«HÌ`\Uk[µ‘O)VcXb2_ ®²ãL•^3¤Áy%VüR™e2†3€__q6h;‚Έä­‹OÞPHÁ›lû²ìç êË™ŽÀºÃ¥l”à_#Ù¥À°î:ó))ÌǺ¡øD.…”;©Ã^æÍL�¾scÛˆ«Ã @ÛJ»��Cp{T‰˜±¸½æjmܲV¥âkì–â_¬ó�6“HÃ;è,/ò…­Çù{–“;­�„§`k#ƒÇ÷mGЙø/À°ž¶·‰±(KÌ8²ê¯¬Õwè¯úÊ�õ8ñM±ð}9¬,RW¿Áy f{)-*mp]±eÆ•QÀX®éðý@•ÉR:[õZ¡.—7ÚV½@a�m¢ V½EBÑô|~ˆò÷µF sùÝxs�Ù“C†ï¥%�>ÿ–«ôÀ|Ûô„¥@9çßæ„Œ+ar—{æF~vЉP‚ #κïë›coœdî}ÚÅ„Êpaò>Êà ÞöÍç'œœþV½�YÉðbëΫ– aïãÏkç|Æ… { e?Ñùí4�ïa‰¼¯¦Pƒj- [–k)§b«Y¯&êeC`¸^ÐY” r?Š¶Ú¨b®µj|]ZBÃ,#tÆ.xöt³ÀÉNå>áiØÜg0 ¾í:»/Ø|ÿ^�CBÚÜb@ŽÝγ2Å O'ëvêl2+ã�mGÐY|'EŽÃÃe*Š�Ó¬þ5ÕÞ.^›»‹¥‡B¯ƒL  Š :K«yÚ�èjNæO©´e¯—ìÏzéþöM* €mGЙ9"¯ŠÆ¥ÌZý4å²_f?ýnµs–ãì'ný$ÁàFâ Rì¤, ©4®0�cÒžŠÓÞâ± ‚;ÕV,ŠÚôifaÙ‡Z°±vw*—Y @Ût扽�ÇÇfˆŠ;‹¶fwAì2Îî °ùY4l½¡¶(´ûû„0&?}g‘Öõ‘æ�BÊí6ÒR<‰©òJ×[eÈé^Ñ »5ˆ¿=$rDÐÁí¹±xn€B î�ÿÜ×P=K9áe@¶Ú,¥À𲎀¹uUÍn®«ü¤XC¥ÃÖíeÕr\”­‚®fVšdö‚BI�&¬Übð + ¹²I f•LX«áÛŽ ¯&ØÿS‡¶ˆq¸<$Ækú™Õþ<›ûCåŒNs?Ù)¿Ë `X9�…ñšûUíÝ•Î,[y,#­º÷„ÌgXT9ã{¢ªžà9Ȫ§àù)±S²¯åZy®Ïã„£mám˜v�ß‚ÏÖÛ’e°°‚‰¦ØÉ¯4Yë„„;#C—¢€·šñ¾> O’¡h{"C Â�lž‚ �jâÞGW´–> F=&1\ÕÔ©,zAå¬,ᮟHŠ(Ltêms§À°Œ'ˆRÆÖ�ÅS¶RpЦq(OÓP í÷Ñ4K±£ZÌ´v·â¦h�ßô‰¦¹/2Ì!¸ foó¡¸ÅÅKqµoõ0ô›³Ì2YÞL\2%¸0—…&‡Iï¹Ñè à„”Ü…’ÃfÊ¥(‰Å:.§s>R«žƒ±ÎRh‹Noç˜q)Oh×R ÷…¦ÔXQpëú¢~DGüAçMïã\c)¹H\)O¸HM˜6vö6ú¶>ÄhãjÚU*õ–'AÅšï‰ «Ûÿ"¬ö@!g1«ýcÐq5>¿o{Ž¬ßŒ+�)[q²¯ê” _»š, è|gIàèNŽ8Žo{›J@0‚¯1cqt€{¿i)ÞdUÅß`s”âBžsy´ÖõE´æ�BÊÍEkÓX?§8÷Ýyµ­y @[­EY‡‡Û–��R^€W¬•zGê¬wUy†Å®C]×7Ÿ;ʼno:‚®8¿œ�TC(Dä¨MýO�¸qÔkÖï?k?óU*ë´-Tßô¤ÒÕêK$ezo¨ÎQïø¾XŠØãhŠômO1±V@¤‘‹E1iÁŒ2,H3Ø,ˆÃ 'wæO5g2ëvÓ†ù$Ðöæ¿è˜´¦ãwÛÙy-Ëø®æ¢í÷:íýU£C‰8�¶X„Ûï9—§¸²Ã_Çû¡þÍÅ…90vì}gLðÓŽõEðã�B ž»õþ1h·Ÿß·Ån}ÍÙŸTWsÖÏ_\%$ƽï`”ãÄ8:"þ”çOàê9Ì�ÏMT†äå íƒQÎà�BÎbPÎ0NV :Îw²Ø`§rmÑR\LƒúŽìjnø�=´¥#,&GERüY; _h(äŒfü�¾5_¦w™ÖóîXŽò0�¶G~è]Cf4˜¶•ò‘(ÛëjPÆÎ®o¿?nT4ùƒtUz&À¸¢ OeZùÕÅW~yœ�bG1ذYÕÈ8�ßÉ(X¿_¯ Ýs°¸ù)­Ž'Ñ WS`œïÅ’KŠûÇ¡“â8œðé;ôõ¢ûyìï°•"}=N -&}©�£Ý2_„(äþ{‹¥Ó‡@·Æ„Éžò�¼.Øí+ÛËýn¾¤ä_¡3e�ã—”ð}¼ü� ~¶ÏJ¿D"ßò@�¶#è,3'îÙis8!çÑ»‡ù#€¥0�D<:eu>rC}¥žÊöŸ/ÓOrC(ÐsC.:Ì!¨^lzˆ±8]°1ýP¯tÕ þ~‰ir—@1™2XÈ’©ä Ú®y6Èã„3¥Š[¡9=½â¼tˆäÀ wÔ|¦2_ZôïLë{‚ss®ÛO-MvÛµ=ÒÝoï­ät9mŽˆ¡8ÿÕßp�Âèã™<�L¸Š-ÓÜUîí•EÌr5ÞÂ%ÆgPœârn‡«� "äÖí¼žGÔg,|óà_°ð'Ü~☔e¨îÑ+ÖãH& ´Å4“Ë�´EϔƶŒùRE¢ ¼L×;Xñåqâ›i¯Ç4ïC½Û{ZÆËeô)`�Lš ¥"*¥˜ÜH4Å8ᤆBÃy�~VK²\>иóÖ×O{ÍÓðªíËq!‹ }‘i À±i‹`@ßÓõý¥³­×e¾ôrôÚžè/pß�;Ü. éC{�p‹ëÂ>â Pí]g-}tN‡úüzª.0mm[;W3\ <£Âæ­Þ úN0sTÚ©°›íIŽZÆØbNeáë²ÄÑD¦Â¤"Î4G{4ˆ>íÔ7Ñ$0ñp¢¯iJ€!¨‡Ï ‹ˆdX%¤È.öÑ]_o�\–ëÞ`À!̺ªX`H�G1ÆQ®w> �¢&ÑŽîOMpèý$gøÅE;h{Œv>jòÃêñ÷{_œ2ô0ñM±*$~4ê’ê+¶Í7s¹Î¡Ôúâ~ÅV\…Ý·mGЙÛ&sQèãYqsÛ>ªÞV%†ùˆÀn¤A±‹�‹(¤à­?T6fH¦¥~ÄuÖÏÜ!Æ)ßÄ8¸ÎíP¿‚¡ŒUN�ÂË�n6Zê%”@ˆ „¦ÌšÝ^r˜s Gª%:íñ:æ)0LH@gœWá†ã½ )û§<<›g žÞ·Agðî¼nvCÿë•ì6«î‚i¡Ï(Ìj^Çg*Ì ÁQaFÖ¡¤mx r“Ÿ”lvUP‰4oœé£gßÃüx ËüàX¾-¤EÒ…�„»6TÂ-œH \ï<§@!EÍ8µÒš@Õë8úé N€m�œBã5CúlT;•�û•& Òn'Ðv}ù7”4þ©_™-F×^!ÂüX (†ù¥Àœ¥‡‹ç8(¤àÞRM«½î]öÞ°Çœ"ìYóžS wrP¥JÉÓˆ¹r¡x‡ŒRhŸü JÁ…œF÷†-Áèã©¶5#RœŠp‰ÊüxbÒÖŒ8×\:3%9¦ñ¼°vøùÇápâ›ކqM!x¤mÉò¡8õà)—~«Ÿ¯Qrï´|@¹ Å©¬ o%b9.ä\|WÞ#œzûjÕÒ]Ení8¿p›ž'œÌ)䟀$�ðÁ}Ûèyv�ùåf‡#~fç+ÕŽô+å�BŠý)¼ÑZ|��ô&‡³J‚ o(Ї7¹ ëg»€c[ô¨~aí¨jlåËÁ©­üôwcýÑë:Zöø{ @Û³x�ÿaUçïugc�añçÚäÉpq‚uDʤ5#}A¤9œpB¿|ýi[ëÝÞº÷öÐC@^EÉqaÞ ˆ¼{Ö õ}o­_1P�ˆzUô¾¾…‰ *È øn€(O~Ïepß3û~V†©Þ�6ïãå­ aÞ<±íß³å0wHªµ]Ajz �ræœ��"iÎÃOßFqv¹^§Øö.¡Ï(Û³ãå/õÖ�áŠú‘wúÃvM‹©qPE)c× Äv&œÈît燙‚+ðJO/G;¸oúê}ÜõÅ�½»öãþôXôž¹3œsíH<ÇáqBJý1ìÇzC›>ÆÅQÑ Ç ´ÅÑ`ˇ§ب¶Vù@Ì–OÉçi_ê÷UßèUŽ} @Û'þùõFߟ_ŒþÀiznÙDJ�1§‰Du)·c}){ �‚S¬�U×ïLmóyÁÇÚN -äÑ’§<× LÜ6ؽ-dˆã`â›âçÙ5ÕyÕËy´0ß®ùá\SÀ ´=»¦o¯‹¨�^ª[´ÿ|à aL  RÐÁbf6¬‰7a'œÐ7›ÑÝ'þãꢸÎ{²)(‹ò™WmwM«z˜p¡OÄvk}Ïû�’æÐ›&“)ÆÌ!Ú9Š=h‡ãÙ�RôÖ‹&L ²õ”16Š£|¨ÑÍõ{éColåR`L¢qIøŒv žÏð8!…ÎÃÓ6 gÃS�h ÂSŠZí:»¿lYuijÕÃÚ¨U_Áž‚ðÙÊ£Îb«ê õCy×­û\¨êaâ›~W ªu)C½Ííúv¨L í)Pý¨�4Õ°­öØýø… @Û£zWÒV¢JÄŒE­jK`擊ªÅf(_ JK5ezÿÄ^5ÄvÕÄYç=›�Òuè-¥¦Ч1(¤Ü)¹0íúy¹:Ô´|Á-xœø¦’/ÿªÛ3Dç”)Áw-óØ-€É”ÇT”1q™’{vèÛsd ãLž ‘d�ºl|èT‘ƒwlÑNªþ7;c[Ü#Ót à„›>73{õ@ôzÆó­¨®Å&'†åu)“Ò-n,žn �‚gñà´mµìTÕÔ©©€pm$#ñ+Ph¶NLïŒr¼#‰‹Ô˜ì‹D¯—Ÿ€Æ„-j¥À�Ç ö;œºñøàôÿgímšnéuë°ùýgè tÒß½;ÃT%™Æ�ª2pe Ë–,§[J\vÅ??$AöÞÄB?Xû\ÝÉ=/Ÿ½4’ ‚’ù`„-9};·ìSþ ?Â(ÐööŒ….^a‚ëžñýè’FI+g©où‘{Q ´=îE?£ª§UAŒ›Ÿ~^·–u/·žsIûí .€ ´=.]*‹!¡,ü¤¨`'±ͯܔGœ¶!Žò»Q ´=ìG1EàpvQGž ÈMU]œeÙ×ߥüšCÛnœ‘òáÜ8‹3 £mWO‰ßvYœpL›MÅ’ÓJrAÍ}öc>°{©›ÒQnÌÇÝÙ�ÁgÏôv¢ Ãßí³«rTƒ>q“'‘Ý�8ÁXQi„@7æä ‚OËöÒ7:†¥ºz}²ÃE×ø熟pè…›@CŠßPH¾ã%l^Kù§üª”Ö’b×0 hóW1;÷¬ƒ&èd|õc,™z~J"׎~sâÜ‹í êõ?pÂDå£J!¡¶�iúæ�ÅAOaD̲OÄ𫆣sS`Ÿ<7u>Û¶]N_°1ÅÝ]vØóE„üQË»BÀ ´¹»ÂŸRc£äB (!­ÝJ'ä߬™mÇ}t¼öš[_„nq]Rn£à9f‰Ü6è0�&jÒÇÅò…Â\Ëå]Þãb°¨„B sV”0Âahñ Éx»rYÕäß5y04AUZtCcNÄ!Ü3Züž€B2[öô*·XÒÿÚ4Dš¶ ´=7Ô^ÒÏËë!i"«Ó¦ÀL”«è¦›£¶ª†¿U �Ì[ý¥¿lEç¯Z&Љ˜-K-_ñÊY•¥èÇÂlg6 #èè’²mÏѳçíü²Î¥zà«\†¦wó&¶éq/ÿó¤Ôëá‹IÉ…T*xùÑGàd£ÅÏM\ýµ=bÊÀíDaˆ™k¸½ ÄΖ奕„’±ésF;ƒ!]˜Š�nìÌ™¨øƒ¡ÇÇ($óýèÇá™örÅ)KÞÍ¡‹®ÝÁ«œB @ÛS8 ž#h&¨T‡‰8Ü�ã‘¥ËÖœ.Ü`qm�á†�˜bˆ€ùNbfÎÏÌãeË�ÿüä¾ù}­å¼[–㓘%\Qïý�h“aözþ&C™]~ýéƒÿ3Õ‹p»ÈÐÉŸóØÒ2æy•öò'Ðæúù&öCì4£ûç˜1_uÖx©Á½„ò/QÔ¶$öîç}ÑbHÛÔvˆ”w8�¶ïCCç=•A�›D£̼nzof8êØå‚0€h{ Ãè.±14iõ‹|»oõC0ž•£è†>œÉÁˆ(ütN CÄÇS~n´2_Îïƒ(¤£±¿ì¥ŠË;øÁ~ h{þ�ú>o»V¾k­CÀ†¶:úÎ 88³µY4ÔèÍ"à„ãÜlóçmÕš™Ùß;üm>X‰J)ºÛ|ÇäB‡ßÐâ~ ɸÙRÏÛ TÇú^î¨A*¤çn¨Ýþìø÷tX¿ß¢„c¸ûó¢…æµVAtö÷iíy•Z4{ž+31ÐßàÛΈ ¾…Ð|¤eÛ6øÑd^_zÅxêÕir@�6.i½>¾XÓ,PHåö‘â#p8+GÄ×ssCè]Ïë¬�³�K=ò Ük€ ´y¶Il0 UÆÁ· ´=÷òiJ“^@ïõ¶G`µÊRt·Gΰã-þ \F KÌ÷skrì÷÷Ÿÿ…ßo�BÊ2œÒW¯¥ØÓZ�cÙ)ÀÚž¦[)-MøùÍ©4’�ücÃfƶº·!Îß°Á<nEzJüVÄâ„äÚn׿­ÔÁËe­�éa»fMDEýíÚ[èJö¤¾p%-PH¾‹Öª|Æœ–�$¿ÖHlÖ¬&T:ÌÝ­¡Nc'²#Ä{‘&Ëv®ÎSfxN²ß¶!c) ‘FÄú¾µCýmˆí,ÞÎZ½�ER¶ía;K9µS™ë?R÷X§ÖÚž�ڟ״^'_¬i(¤‚߯_€cY¹!>�›Ê Ûø‰�«TᇱnÉ#|ÇÄ|!–>¯.œïhqm¾c³ »C“UÅô8û·“Ò4hyÁVmÍÙY_U9ŠpþÞÈó{Ñ}ê:ÿÂ…58áøtžNšóán¶¹|÷·BÖ,Ô ˜»B£\³Žï™˜P\GV3/½~0½Ú:OY àÚ¬†øε™®{jâŽ�ñä ~f[‘Ρ ´=;‡ŸƒFí˜ E ÀŸ×‰œ ’ïcæç&ÇoÖ ´ùëÄO®jÚQùsî§xH_ÕâÚ|oÕy•ÀÁV‘ GÍfwQ²zçú¯³³°vªÌüòwhð?:ëkà—Ö$}ƒ¿¨âiK€Á¤â Q#14æi{•›Ÿïê¤5P íÙž?¬gÉ©©9ÆàFƒ�ªt"œëE;6o%® …#æÛ¹%æ'¿¬ÿpÎ-³áä÷vʦ}¯�Xù1ipÊ,u„~Ä€O†LRk¨!í¡‚ߨP–­ÆNµœk((Ðö`(PýlÚ‡œÖœ~4µIÜ1øzUWtÝ1G”v�ˆ¿džÒ¿ÆR_az' Q"pÜ1èŒðîÃz÷1ÛöàÝ3Þ�Ñ ïýPHCpuÚæ’ã¿nÛïm÷E ¦v]OÑa=^S 1rQ”�l[߯’ëœ+ì¾OË¥Š(¹>™³ôþ¼¨ötè5Õ„ã8t§õ(y©Û2Ô—ÂH€mâ¯;ÌZXJ)‡¿ó«Þ�C ÍúÄü²æÃ™ÊPs%dz"¬Ç XãB¦éÙt>˜Y×’Ñ”O£ªù[�Ã~ta&„yNŠÏŠ&äOÕTüÝÜBü“d>šv„'œ­ÇË ŽU±>qÃÏ$OË«>99ç_ºþ|½®õ!ÐõÑQ2N‘!Ç;E’÷аÇíw9ø|åb²¼]˜Ø¦«†8Þ´Œ¿×R.qùýàzÀ·«â"œëy8rd<�ŽØއÁ Çw83öë?5ZœpkK<þç¡äël¹ßþÍø·@�¶‡ñß‹h˜õÐa™ò ì‹hô±óÏ“xèËÈvÆ,õîõH˶ù«}8EN«S'heˆœ"-P íaŠüuGÌ K1õQXbˆq Þ4Ns¹°³åW÷o6�(Ðö¼iì¤bp©”bÜ ´Æš,…!Âj™¥†YEÆ—ž¿âV‹h{ZE ÉŒÀáPR9¹q Š‹Öh4[å(^Û¹!Oý”üÅ`�BÏï8P†QߢΕ¤¿`'¶éaxõSõxÔ÷Xï;1ÎTm¿63Dý©EGÙ³¡ÇÛ3…d$¥¯õmÃVŸ!q¦k£Tˆ£ì"`†=À'4×0Ë&MÖ³¬zM››œ-Ll“?9÷/°�c} g˜žPa&FßnC‡Ý€šgãÚ ÂoõafnüN -?á¯ñC /Rfëø{¯çDÛÃß©,„@NØî 2½óÓ¹odGN¢S^cÈåñ#Ç¢Ú¼‘ÑÁqÖ‚¦[><–Tá(ÄùƒÙþÑr;*_X®Á ǰ�ö§Z3?l¹<ŒjC©ðãüQ \Êì­§òŘ²@!Yf¬'ýcÉA²m¯{KÒz,N íÁz`>Z'¿è¨ar´"K­ðâ\+BÆc+ê)ñVdqÂqÍȨòûœ…8!P ÍÓ¿},w8šËö®uø7ã¯y8~åçìsóõ—ó¿þÓ?þ·ÿòs ÃŽM?É% ÇáÊ-Srºæ4ãiãÿ~þË-­i«]›þårCrÜÓ"Þ°ÿõ?•ÞÒVf©-òOÿýorÓߌ9t÷kÌR¹ý?åÆí÷8Gÿ·ëÿÉ�s>R»{üû¿»þãùïÿîï “­ÿ»Pš~¯ü¥¥éþÛ?ÿýý§ùg%˜¤•6ç7Å¿û/ÿòßþù? išèžs„»ó<ÿåßÿÝY~œðo9\ÿôÏÿtýÝï»êc–þ¸f­ä\½==ícÑXk9ï–äÉj*PÝ Zñqüõ�öOã>äóŒ_c¹esüú/ÿñ×?$ÝÌ¥ŽÊ4½êK9wË‘þ¿ØÆx$ûI–:OjÊï–iÍÇruo{j¯õ!Ç_ÿÛ¿Zç¶Ÿl®ãþ*ϳMÃZK�Ù.Ò¾wš×I«(1=eÆÿ•º²ý6MOï¾ç!�ÝiüB¾ÿJ]áÇÉ_þݯ¦½<1̯ý×ÿ•Ìô?$�¦aõ:’N‡¤OFPÜ'§_Çñ{}ýšÆ´]˯æå•‹O¹ÖëXïU›¶÷¯æ!¬©�§ÔÉïÜUšÍÊ®iÌï¢Ï µÝ©D¦éþMšŠÇ¼·+ý”êäSRé´ê)Ó¸ïSúSÎ(9šåõmï_%ÿî~±m5!Ðv9ôlÝÌhK}åò¨Kâ~œvå~Ê©ÏY]ûïÊ{×rÿb²kVÏ�.{"6LúîÏ”£ìÑL‹SKG¦íý«´&mMìcÎCM«Ø”OªK@b—=gO¹^ôZ™2mï_%×qli¢Žñý¹Øÿ°/wºj}-É´JØðÆå�}}ÓÞ¶}ô5§–u3}»–�½qûTöƒ]_µí£¯üÔEÍ»ûZ÷6 î5”r>]_µí£¯\RóeøÚ–9ÑϾÒi�w›¶Ï¾ö¹]:¿ûÚÇîýèëXÖvж}ôµås£Ç=¿.ø©ìa|µ³cÛöÑÕ>Þ£úîê•&�cìú:†v4nÛ>û:F˜'�yþýiÉžç[×¦í£«Wj9úU¦M°ölÚü âßÝSÿ½œSÓÏ¿êâ€}½Ò¨Ï‡d[÷Kâÿ”èž×cëJt�¯4ƒ%7qÊV{h�î¿‡Û ÃUir-»ÄJò¦Ú�ÿ’hž"_yʲ#¼(Ñõ¦ «×”&ÉlpÓ¸íVÕ·$óB–}šåÓB¦$ß_‰ëܔߠLskŽž×Œ´o)æcœ¬Ø4X’J Å�otÖ¦uË›‡4éÏuÙù–bÚͬCS>îX•â§*цö¼ÿ9² íõzù·æ“&ÉaÈM¶°�h>°¸Ž¥´QÄô‡æ3æ™ÿ•Í'ßóÁ•x\–ò¸Ê4åÕ…?¡¹$§¨tQ^_ìÍ×ë1ÿ+© µLY©B1;S¥Ó·6?>Ò™6Æ÷�æ4Ñ¿þÈ€tóœHæ‹Õ¹ ¿1 �暇hš?Kç�hfs(¾U6΢Ë4!Ñ·ŸÐˆægñÖ?›7ÑB›Ù®ÕÛ£hT³·õgsЛê‘õ:V¢o×ã&º­‚á×D×ßiÆÎ]$âS,Ñ·�Òˆnë}¸ó5Ñ|ƒ3»mËïù˜ípAW¦‘ܓѿþlRȧIS©Ó´NëwzŸy»<7Éãöÿ@´I§¹ÏßÇ´ÔáâÐ|ûF�èk¿wtJ4o†:É{z;Q�æ‘‹Düuz¤½ðªê�Ño«�KÄeûkˆæ[0{u¦�-¢F¸wàòÎóvóZKZö¦¬…�ýþÝR�j³S®W±�:"ËÕí×|Q1ýæUÖíRËáðB?L7m—ÓuþÕ¸—µ¬è»?J-Cîe½ŸM @m—íHÜéz~�£¾¬ü¨T šrúð\…Ôõ}bß*�G}Ÿw5lÚr Ì=3:Ü�JnÊg8¯< ç`Kã(Ißpa/^�dGŠ=Ò>,H8†QÊCyâw*—ú¿ÑŽÅ ´ñÚó¶˜Q�GANÙ)Ýó§ïNNlÓåtåK®ï›7‹ŽO8b!„‰F <ÅJ ìÉÑÔz”õcÊå®vßzÖäj'»ç)ƹÖ}qr+(‡žm{óaÉ!¾$á5§Ã\0†NG ÊVäòƒÃÏAVrà%­ÞdxaYœ�Ö—‹V”`í6éÀ¶ïûV¹„8¡ùœs uÊfÖÅÍÎUé_i2ÏŽûP’Qß<@�¶Ë錜ž =~~ ÷ÕùW9‹ ‹Y+@ä¾^{í}ÑxnÙ„•žt{VeÚ.§3oîY_yóö«DÒ‡Ua¹Ó!W¸Š�ÜG‹Û—Õ+Í„mó™p†4êÕÐã­€ÜW㥸ô›AýÇ4ú†Õ_èÁH•©è®ôŽÅS³²¡ÇÏÊ–y˜&×—eæ†6û0‹;àÚžw«®|ÇxÿU–•Rå‡eé1By’ðž•c @Ûåtæ« ÇeOï‹ÉÈ…dÞq¯Rg<ýêUãòy§Z–ãíÈ‹Óé %�B @›?.!Å‹�áä§Â"èq3)',XÕXaQ«š+¬pz2Ôøé €B²îÊ*¼8館ˆQÏNbØWÇþá"²<œØ&Ÿo"Èo˜^¼C¯æÂ¶ðþ£fãÇU·wG{b´kaB²­w÷‹£[7U¸Šùë`q” �jê©ñz²8î‹Õœ-«lBÖÛWøP‰JP¦Bœ»�ñZ=N#ª¬x´ÐS|MâïȳA~ÕwúB 'Ðö$…èG¨÷¶>Å�s&4©²r�N€ýç�Îç) !�“1¹po[ñ³÷Xg}rá¶@�6~áNF÷ZuµØ¶‡5Òº/ÊVô×Hײ# ïœ9'$£Þ4·ÍuÝý?« õ–C ïÿ¡Z9…õô¾P˜ ɼ³ußJ™«)¿ý6Ü;þÞ�°ºQYE8Ê<$KIO�_<-N8Î)9¥éªÜs'( h{•cëåÁ;€í,éVÊU„ó—t”§«?X:r_¬$'çÎ:œdq ÚäÎζÍßÏzÚK+QY·Ò'Ôpºµ–ÂV ô-Ý5=+оsÞ„,NHF½Ñ¶ä$ã)ßt®–€î�± å)ÄùžØ™kÖàeôä¾pO,PHÞ]#šõWÛôÌÖZ’jËAÛ~/w1ÐgËvFjÐÂX "9ÛFkp›ª87X¯šÓ‘�r}ÿêNâáä�K¾²E¬œÿàJkPÿáXn�„‹`òÌ·m/½ l…@�¶ËéŒ …öÔ¾…Z �¬s²Z' -Ì¢œ¬,P íIVöy†2ýæ¸Ö6MíÐ#´V m� €~„eÊ,Æ=µ/c ’uw�æ\áTTñ\D-–Î$º,–<–ö)뢟²Œz÷$ýf+Ç=÷©xá) ´]Ng^é Ï{z§COE…g>48–l›Ï„£±4Ñkt{ù=?ÌNv|+SΟœp®à6ÄkÍKäÖý› ± ´=mˆ™É©“Âs“Á 'Po�¿'eŠ;ƒ¡·Ñ»j_¸)(¤ßwWºÏÓw‘LNTÍë`®$ª�v"Ëœ'�ÌÔü*· 2…;BãÚ.ì‹úÑTž -«õñ±ÆR�wM—Ó•¸cgLV8ÓÚ6—Oj‘è©}±HX ÷Éþ"1Ï5V·¶Í'.–žÊ*ú‹2ß8J˜QÇh~àJ{îi�-•Tžqè =E’ ÎSD&¼5b®kÇ{½³“qÏ@ÓV„s'cÛ•oØ»Êó57Ëë‰�HLâä_�qv9ÇfŠ_ƒÞ2'ÎY)pËdOî‹eÒ¹oööë¬ç�¹öíø`·þK „@?ÀŽÎ·»ïé}±»·@!™wU8–å-ÿÿt»ÁÞÃéx*­Èù0O‹™†â·v¸‚®ªµ˜¶˜@ßUEóc «§ö…aY �¬»ê™êÔì�$¬Å´Ù)úGh~\P»§÷EPÛ…dž“Ö2éÁÁ;‡Ž”– ´=IËZV®‰RCsïý€ ¾[!¨¹‡@?úŽåB!=½/b!(<ó°MYV ¢¼oY�qm h{ŠkC6@~I2_CÍ�9«Û�–¤©D ¶z¯m—L8í7Ê0®\Å@�¶ËéÌ·î´I)Á‰ih3MOïtè)[!Phæ±/»‡¢™p7_]›ÏD}Àª®,E4¹VB¹&¼×š 먉ۛ^~/\™-©nC @›¿¿me‹ë>I5â¬\š°‚Þž×væmòc½ÅFrœž) â—Ô ·Ãõ4Èìp{z_ìp-PHæ¹�ܬYî¹’á±³•³@�¶ÇÍÌP©w�•_íNºvaml@ß-ÀU×ßøcp«¯LRà✬==?¸€¤¬,P íIVhYiº-%†£�ØaüÄZ²ŽÃèÇOpX0*ì©}¡B ’uGVK.bó«Ü•¯…zŽRY¦ ÞòZKúIñWÓ×½Þg\1N írú*¿*ÏŒ¦_½ZæéPrPÓ'¯5r½b @›ÏªgÜ쬦)ÿ¥Ì÷ôN‡^QX ä¾Z¼¾ÀÏb™p4Ûæ3A9—=¹/œK ä>šuUÒh—ί#] h{rUp:Šqè̪ ‚œgŒ•ÉSïc©Ñõ‘9‹®¸Õ޲}WUÍI«§÷…´,PHæ�xO2À«:æ¶ ËÅÖFm©^�õºÕ´B @›ïÂs+]Oï‹•ÎÅeÞ[éa¡ÃI ‹s8=aÙ-Ø.%Û½)3˯�òáüÕʼnï:OùýùmÔE m£?É�9U_„šsè ½p’Î G&Ü8A½“óš›ë7é­³�ó힃¦®(Ðv9�y.ÜTïO½Óg{j§CMe…gúJ>XÉ›{',’LX @›Ï„ãÄ0<Ýj'Î!=O_xTæî1Mâ}mm^í¥p:RP¶B § RXx*E ‹;•ò„Ei a‘GœayGŒ ñPƒT!w¨á©„oM-ïÝ\¸§õ¢ô¶3îWøÍª1ª{R€á�ÍwlˆL0ç}Äá‹ó hóC=ÞªÇòñ BÙ"èS èKŸ„Ÿrþþþ '¶ÉçÀäˬ‰]ï믘IfG”©ÈѰgÏ=½/Ξ-PhæçUµº.ÍØð|ÉhBgšGY«°žÜ ³@î›Ø ¥ˆÒÒÒRU:MœŽ&”­(´ZÃ1€“Š*,;ì…Ÿ3Oš —fÏj3¤,P íQá¯Pù*ª{Ê’–üÐ}Þ,&)µä¨�·œ@T¶Xõ5Š-¿ŸÓBBN í¾<çaÉåaJ߃–wµÔN‡š2¹O&CÁ=9>lqⲎ¡`JTF‹Ê =÷mO¢2ÞÅòZTÀiNÒÐí’|‘Cš·fS�Pš Bœ@Û…}ùÚ a¨TLŽR1#& “b¢â眘B{Ö@‰É=i°6~Ô+ÃëÖ@'�Ó‘€ò…§;Ly‘›ò“à1ôN‡žê/ Íü1h¬oÚkËô~:½«lB �¬R±s” ;çdãÆÎcCÂcÒ�¸cÒ�@Ñ'uÈEô]‚¯¸¯§ûk:r§CN¹Šp®Ýz¬çùBc¡¯š�Òw~:�·÷gœp|öOW}–çî‹ø†Ò‰”ÚäਯåôäêQz"ÏôPO¡”ð,ˆ“wäIÉ™‘�“lGÝâr§CNg¤($ïN˜, ³¼ÀñšëóYKúùž>�-§­gà=O@�¶ËéÌ9 "P(U Aލõެ’Ší… ”Q9Ç‹œQ‘Ç‹žQÅ’r%9Q‘‰’ž°bSÇ£<ÎÒ©£<ÂÎc{âIY¹{âi&ÎR½¶ìÜkÍŒ$YÛï±ÍäÒhã.‰mºœ®üäÈúhÉ5Jµž!Õ:AicÖæ�îûOü~e)Ä 'Ko^—ºQÚÖf[kJΡO¦ß”˜Q¹Šþ^ôb @Ûåtæ»–Û¤›×˜Sÿ½§w:ô [1Pxæ¡/¢y€à‘iò9ðô…1 žö²8ꋽy{Ù^uÿ°çs%?ÀdãY*¨èG˜08ÆNzz_DN,Phæq#º/ºèÜ9bìfÛÚüÍ6¥±m¨;¾¹úÞ¬Æ,P íIchÜù™ÅI72õk0þfU¡l…@?çéEÚ÷~:½«Ù„@¡YÍ�Ê—Y²Ý.Ï!çdÀ4KÔQž #?8º½æ� dˆÛt9]ùãiÔ¼·­æ”j'R+<Å8ê‹Åíj²Sò¹Zq,Xœ@›Ë‚gµó«L‘ëv£:j§CM™ŠpÜ‹×ÕòÒøä6Ô¼’‹hóYp‚VóZ‡üÖºl:-,{›c:ú�§'Ðva_¾®BŠ 0E�c¥ =Y�ˆf])ÛöÄú?¨Òëã”Ãy}ú–ð§³NŸ%§¢‰pÜ7{gùmOÕéZ�ñ“ÖéÐR90á¸vMø¨ãcoî®Ýù&¤ç/ݦ/_sI¿‡ŽÙì©�5•S„’sBsè(sªãeNy¡x‘œ:8±Z(Î)Ý¡›ÌéŽó’=Ý1‚£tRRÜQº«eðÕºoþÂ58áÄ笪Û\ wÁCg;a½Ne)Âq®¯7ÐòKÂå7ǽ™þ$v:ÄÔ_ŽpÂñín“Ã}íÄsG¯èÄ3‚Â3ORRÜ™§'+(ƒ—·­%ú�Ö£–ÐÑ;z-# ɼ·EM›é.úÝS;jjèNHÎ]³J+PþÕý[OîtÈ©¤"œpœsêƒóNV}Ô�§«>FTxäHÊŠ;sôôÿŠ>ˆåÌÈ;еåò°Ôwã‡Öùk-ÁÛ�»¹½Þ“Sh»œÎ|CŠq¨ A�Ó+q¦çÈŠ;Ó#eå�é1²‚SYVVÔ©¬++˜3�Vˆh¨åv–|åèW ߎõ¾µ9mUYE8±M—Ó•x=á± Éwðâ0NZüé¹/öÌúõ*�¥qÊ5. v:ÄÔ|"œ{ä0îæól%¬“ßÍÒk=¹Ó!§‚ŠpBsn{2‡_< ò$ÍV¹a¹…Ñ4\ßE¸/wú�©'Ðv9}ù‡‰“æ”ß÷ÔN‡š&F8áçîvÂ10yµ“9ö.vÇÀF#5ê².s ì\6¥Ž�É»¦ž,­¬c}šlï“hÊz(Ðöç†�ƒ¸å „#†žl_ë¨Åå——õ &(Ðæ3áäw„(Ô½$‚gHîðÕŠBP¶þ̉â…Àq(A“�·Ez=U¦B 7Rê7Œzc壌°iÎ+b®’z�ñæ�¯¾+ΦðÂ4iSÜ…é?µ©þSh‹²è[þÜšz�|aM(¤zÝŠEå`)¿ °ßV+ ¿Z hÏ@›¤"œ@Ûåô囸¸Õ¡q�׎Üé�SQE8¡9‡žÒ¶[‹þí�[’ h{buŠ¥Ò¨‘ÎJÑN\a·cмÀ�)¼]î™ïtè…¾´û¨“Ž*ûõ*¤ÈiÀS¬^Ë@㊲ V¶³‡•CϑޗE{c=cU®"7bX âµ{RƒÜµû?Ô \x'È\x÷ÔçTN„ Î8'q—º¹)‰ºÔ ¶�wº9›â®t»6Ê›ô:ÆGiJ¸ÉÜÑo<…8ÿвéëA{ƒ>U‘�æëøèÈ�9U_žwè«¿¼ý(ÐöÈDdþì]w6ܬàÚqX-‹U©Ñe†¸ú³®ÕDÆF_‡#¥Æ +ª`¥F7^.ðt ¥°­+.öâT)[¦U@ß&}vYÉ£ÜëÁÿô®gIÚ.§323ÎÂØÌ8$gÛ.ìë!‹±^]¦¼ò^ ƒÓ‘�r9MˆÛ¤[‘<0ùVÈ•”†&Ä%¥qä%¥¡�wZF=ŒYÆ;ÿ žkö2i‚ �m—ÓÙCjZˆŨ¨z¬’!W %ÃeÇq‚qҰ±B`R¼@˜v’-)wœUºõÞÛ‡›´;å( ´]Ngéä!u 6L¤ºÔãÃ;gf­EH“¯ÖRN;14Ù„@�¶ËéŒS¤�‘úbÒÎHv#ÕGåºý©ú ¯ŒÔ“WÆè.±éwœæ¼ô;'czÕH߇tK†Æ´¾Ž¼>ž ’&§(Ðv9�¹5—MÓGn_Oít¨©¨B ð¬C_6Ù�å�Hvs8 r]Q9�¤ª¼œ@'�s,[¹ü2Ôцç‡N@˽ýFé@œž0‡b€KÅAœ=b-š_¶¾ÓNs ¹;4ßo† Ä6]ØóüÒ–ywMÈ :‚Ô’'%„Ë b²Y@%\2 £�ï\»³XrúQ=Dµ‰+¶k•IóòV�IL:V=�ûÈgìH�HJ⨯¯+'ë€b�Ì:Þi›ÊñØÚìkœ«0×Vfºg qÚ.§³‡¼§r.UÎß¶šÍØÑ;zšu…dþáÞòèÆ2µ¤ížÞéœI+[!P\æñ€›“ž¨“ÒâNÔ]iÅÉhZ\ògYTò*¢?ÐÿBƒè§� ™0-«¥õ‡PtŽW�ÌIgs9ÚÞqv¨SœúZ¦jd lîV˜§Ië�[ÍQ«y¹íô1$:s<� ¥­çPÈÙɵÚpv§†Ë·ðQkZ¾ê7.*†ã‹%ÍâÄ6=-hà} ZÝ1‰sxZ7ì:¥,…@ÝÀE�3«žÞfe�B2ïV·Q÷aë뾤 á1Ô Oôãc[ôB懹Ö�îÆ]ŠÖ±�¥æˆñøÑRØŠ�m—ÓYúÕœ7Mù(j?î_¥�s>®~µ8Ï|¨ö¡Ež”@Ûe{rç€9¹¾{f2©Šíb§C¬ð¹ï¯¯,»rø]›‹c€m>®Å¬ZÂ+[Ü¡íè�=µ˜È}µx}-yÝîž ´ùL8!ƒAK^æT •hÎ(ËGf[{÷ÌÐoLE8�¶ËéË×WŒC®‚¬@±FІ,KÈÉ 2¿¢%áuß·ù’À0éXß›É'™óMëÉ2+µša«*S!P ír:{°š‡šP¶‚´ZÃÕÊ¡1Á,;¦ír:󃥹¬už¾×ùž9»ÅðtCe+ ¹²º*›~Oy;r'¶f)ÚPsC{WNlÓåtå‹jªUM²OUqµ©é°qÂqî jÒÒ÷Ó~[hG­¤@vÙŽ�©'.ç¶/VRÇJ éyÙ›ž¤âdQ°(2W”±(.S”€)‰œò¸ŒDNy1ŽÎHä´‡‰žú6MŽ_mºé„p:BP¦"œpòts¢!ݪ§öEÚ¤ŠËº—6IH sIQqIŠœ°òáxþä¹¹V˜ùf… \E8?ñ êd˜NšEôÎ ëˆ�1U_„šoè ïH¸Ì;d± \¼³¤f w ߎÜé�ÓÌ©È}´¸}aöÉ—~‡LP9e=9>©Ìâ¸o~H”.»–ijÎ3$•Yb-Qúgœ›U†|»ù¿[MÐê¥.CíDj*¦'4çÐ&%r,p9‰À‚-Áµjþ~]×Iµëi7†"œŸigûbCy¹/"y'ÿzœ£”â“iu†‰Š4n†#‘çÊäÖõRÿ"·ÎÅU¡—[Øð²–ïX�½U&ãlØâÚžlØõXK>ÚÚüNœ“í:ÔÖŸqþœŒk3'wľ˜“ N8¾Ý{i¡xq¶U¦½pS7Úx²ˆò²ÃxšÐÆÍÌ¢â|‡YÊóÍË8êÙ—!v:Ä”§'4ãЦúr,p™¾È‚»VìåRæº-m¯#w:ät:ŠpÔ‹Û“ÍÞ¤YÀ´O.QšËYíé}‘³j�ÜWûÖßå »õžÞ!gÕRkKÚÏ8?e9ÇѾϚkqÜç4±Ó!¦rŠpBó =av(É—ŠLxïÀk!þœÄYûõû}žÚÓoLE8�¶ËéË-Óþ*ÒL.A“æ'­Ó¡Õ²Õ„ Ë5tÔe£òô Ll“OŸÉ¡EQI´œŠ ×Õ}Ã\cékš;·{bxþ‰Ÿ¯,E0Fþâv9›$TÎ&²à>¨ÁÈÄVÊrœÄV4œ%GsÅ’¡¦±›d#�&¤æåº@OÔ�Pü*¦sR•QNÉ—…ä°àÊTB„ë2Þ9N6…ÕÊ\™ qn+ê�HC2Äø4$ ÉùÃå%0Ùb}2¸K/:�ô"•T„6U YïÇ­+ v¤™OÉo”ÿn['N&¶Éÿ~gV QhÊQL�3'çEí¼,«Ö¼Õ+è׿…Ü~†ù^0ì"'¸£ÅûÀ&×T´bk(h»�רh…Å ´=E+@J“¾´°�C»¬‡'YæÜL"Cœ�gpÔ‰QO�?1²8!9÷O‘ùÂaP;EõB,áž*ך+ǧcû µ› ’²âüP;¤¸XSOî‹X“ É;kZæº�^›•s±&‹h{ˆ5á*! c¥*¨˜v¥fƒ±¾»’ì°¦*q³�Å ´=ÌN®Ä¬*OvWŸ-†ÃZ;Ε©çÖâ”AM=1~2°8áÇ]û¤/yä×óZ&Š�;ÛeC¥áܸ3®@ÌôÔÓâ§'‹Žo·ÌßRÂzy´©^-¾k1üÓÖ–(Ðö0‰ÍùÆnÎ.Ì9ÜùGsööœÌ�v—eäÏÙÃICc_›íÄ �¶ËväΜžµ$’תŸ=¥Ó¡Tø qÔ—ŠÛS�å´ªm®Ç8, (Ðæ3á¥ÏçXY6¨×Ñzïé�½ÂV ä¾Zܾ^ó�Z®)Ç,(Ðæ3á £Ü{I:ÝÆš_2ç­TÉ|m´ÏûVsh×wò(h»œÎ¼¢sŽ´Ö¬Ý­~óX4½¥¯jëäÒ¸ �m—ÓÙƒ°^š¼·YßÐ;zÊV’y\ȯA“Ñ+„8ûó„·J·hHÂ-BL†–‘¡Ô5ðÒA‹€+=¬)QWz\S²+HŽæßäƒ^ê©�5•R’u×’ÂIÄrÐØ"fÛv9�ùËJ¾—Tp¯�áó1'žÎœ¨l…@!'Xײ’LË5‚¹^ž�¡–,^îé ã YVh»œÎ¤µëÞ|]ï)°£w:ôšm@!™÷¤ulÊ|Ϊܛò?è¶^š×ÿ™LÅeÞvÆJËâhi!AÛö¨êú’ø=|ú›a…‡D¦ àá�oãÄ6]NWÔ•6@‘WÚj¶írúz¸‚8Ô»'{ÝU œ(e*ÄQZpW»XÖ~Sgv€ÎHQ9×Ë(Q‘·Ëà Dß$#¬Ú¹GÆ(˹XÆ)‹¼XF*ËÞüÂIˆ¼ŒÍMBîel˜gñv9As·ÛÜ 5¦µgsثޜ«/ÔÏk�‡ ýÆT„h»œ¾ôâPª/‚ +P¼¢aïýQ²qnþ1¿b%ávÏ\œôŽC†#P1­…jÁà÷m1{±PÙ �m—Ó÷+”¼2AuOª±Vÿ}_kÁøtÿÑ�‰è¨mgâJo^’êà®^¢¼Ü‹³!óH¯]3þWùj*ÄOóÀ\ÖCÜ‹ÎõÉù'ZkP¦B žˆ¦Åkôô¾8×°@!™÷N€†æn›Lç�ÚžY´¼Ð?¥Ææl£§öÅᆠɺS5ŽõãÉ…rÅPÇ Ü ÞÔ O8¸«ȼWyžô]Ÿyþýª·pÛsÐØ �þ¬íŒ=„µ8ú r2uL+ù%�m[ÜEË“}deØ+ÊUh»œÎ„âP9ÊA�;m§r�z)йG&®@�Ü#Bp_‚Ts_ÂSžóÊR®o¯¯{;·lêa�-Þos�TL!N í¾üY!„¡VTP19JÁœ àª''概#%çêq-T9Ù‹-]OZ­mÙ릆|ã) ´]Ng®‘Ç0�fØäXqBWö‚Ë^Œ îž07:PWÜ�NU㛆ÙröÏÓÛ¹Š%¹w8�Oôàr�¿Ü/½/ô´N¤¥…8ê{Åí ®Lp0W&€¾ûøR)±™Wî�ØV‹0–|ÒÈ7žB @ÛåtæÞþ™5){-÷ß. v:ÔÚ5©(<ëÐä|“<0IßÈs—uÅ]æàT…7.Ük@åî¹™>$p¢”©GiAÜ®àâÉuoYð¦àCo³O{32›³oÈ7ó‰p^Ò>tEýˆÌÑw;gDçÍ7ɦÊÖcžš7Ð]R8ñ{Û�­ŸaÌ-‰û ú€7o”%â�Ûva_þ.Þ�:æZ:glï—¾jp%ïMïýsˆh»œ¾GúÏ÷ñVjfÑýBêΞúĔŠ79“‹âœIq÷Ä“«(àŸôŽù™ ´=¹dŒÿ±îui¥ËYÿÃÚXÿ#çN¿Þµà�ÍúÊS„óW4ôQ<£ÚG­õr¿Tß“;rº D8¡9‡žpE!Yà–d‚Zh{r_¬´È}´[<çUKZ¬-B‰Ó’¥Ö\ýèÏKȺkC›†Ó¬·¶ÑðAîtÈ©¨"œð¬Û®ú™˜gÁ℟ÕCO6X�…ÐC¦î·S+>–€âV|®ÔŸ®øÛ —|.¸áUµˆ÷�¬ºpî§öÖnò]-�—�–C—–˜š|Ñ’ï>3&ZEˆh»°¯Ç´ÎŸaé'Iï‡þä#S8&‡ùЕm(2ÛÄ¡fÛ.6Û•€É œò¸\Jy1ŒÍm`”çd6¸‚:~�åÒW»iDp:"PI…@!åéŠÊfRz| ÅcÞIF ¤åd?pÒ"³–M&šô-ä›!2•¨‡‰i¹œŽ|SŽPx[\%ã.ž{Ic hnG àM÷^jF!L(Õ2RêiÑR²0!Ù¶%�§ö^†ôê äQvB˜P¶æ¥2åõ¦ ¬öÄN‡XKtü'4ãЦžq,p™gÈ‚SIâ¥/‡¼ wÄN‡˜Ž÷G}oùÑ®™Æù¢N]×÷‰}«PBœp|–õ©Ì�÷¬<¯-º¥ÒvÄN‡˜J%Âq̦â˜"S¹Q奯öƒ‚¤q9‚hBŒþ0�Ó—�çê�HÈCC'3ò8K÷rò°Þά�Â;ç(i½œ-½†v(ÔI¥I*‚ ´]Ø•gQK}-õ5·Y££u:´TJNh¶¡'§¦Yà9� ÷!�µd;,ë]ªòð¬Ð•«ç§á¡‰³ùŽ4o`Âqí'VäMÇt´ÊÍxülÜ[ZÅÏ0ÿðÎçŽÖGÏ'ÛÞÜWœÉy3Ó�rù>Ï=�|ã)¹GÊx:Mw?£ðÆmqBÎNkWùàq¾•`³<Œå¶•ëg˜›äc€1ïžmÞ&×NÍ—î²ó”—«n0\Qˆó“`pöÝ“ûÂÀ-PhÞ!Ü?‹VÊÅ@tº¦4'Ðæ†¬±,Óqh ‰w´C™ö䢉@îüÄ=”NB;Ê‹©÷!|^�ó¹q¾G¨u†òc4ùÄ(ï)îSé(Ðv9�ùç‡ý¯ nÐc«LWOŶ¡Îç‡1P ír:óëb\úͤŸœ8yŸá3mÛåtæÖÙ[ªês.¶Âò¾«Yõ[Ú~®³—Ó±U`ä¬ÖßPäÚ"â±UˆFkß&%]ñè[»íŒµ+|œ‚³+îmŠ?´+û1´]¡lÛŸÛU¯™/ìÊ…T³»úïµüyKë›ó!EÁ ÍÓî9hl…@�¶Ëéì!à¸þËØïÈDGïtèµðlžyè+Ÿ–Ò©w-z’ h{b‹¯v�Ÿ{µÃøÄ'8ÄÈ'N¸!Æ=q²½ÔÙL¿®•Òq�Y)¨°B § ×'ˆmh\Q‚cÌvö ¬Yë¹nc-"`ìötìVÙ �Üèñ…žXÞö"ضËé̾g�sùÒ7xo} •â '¤ys/œü¡yã'¤ysœü©yã'¤ysœü¡yçì‰Z|„4o hãÍ�óÙÍÞ³Å�;Z @ÛåtÆý ?º™7Ó=%Áøä?Q™ Ž|YyÅjD£ÔÙ†Ð?máð( š*ùgªøó+Z^÷ÌcFèËï»Ê/ïFƇÑbŸùQ¦B ?ðÍ ï'ÀÑã‡{¤ˆ?ýG1~,Ph æše¨·âõNv‡í]¹oôw5ûTÂzïëÛy‡[Nó>Øê8hl…@�¶ËéìÁnBŠAUF¤ez¨Ë?í÷ó�C‰9Þ ðV �‰(Ðv9�=¨lWh:n/¶£w:ôÚP€ÜWû*{­57j½GlG¯°õºïþGY —yÛ+-‹£¥…mÛ£´àíƵ)TX=Ï´¼Bج`™  V8Lp†Å!XC¢ªC�†ãØê¤!¡L½J66ÿÑHát¤ \…@áE%a²<0õˆ Ïö¨è6Ž÷{ET†'Ú®‡ OdžBf¹*[A.eÖ{PK7æ‚Wš]l¤p:y®š¢Å©“4Ë]ÓîéÑ×´-L<Ö�kÚ± à¶?'&â¶¿'"§|Å»0Y­;³êõÊin…�ì•p•Q„h»œ¾ü‹®1U¢r"rú¥de #p’Šë"8Rz߬k ºik·‡ñ{G³ñâÚ.ì ¯úç[©ùÉñ­©þ=©Ó!¥…@ù×ã›,7_K)¿.Ñ“`.Ñã÷ãm¼cÞÓâ/Õ[õ½NAˆEkž¦5·^2W�ñ®|+Pñ3NlÓåtÅÝ|îiÑ7Ÿ-L8¶�»ôƒÞË{�­º$^¥5wš•£'Ðva_þ œ‘Y.‘/­ÜdOîtȵ þPhÞ±/¸ÉJòÀÜdE¨û½=1þ~¯ÅQüp{Ѳ°ëØ.VΛÞcÜ÷öºƒ½Ö§\…@�¶ËéÌ5ë…2Píä8�r²‚+·¤¨˜;·ž °FMÎ Î_< unÁ[‰=ùwá�ŸqþµDÛ{wÓâØË›H�'sYrÔ…›æ¶¼q—%-N íÂ¾Ü !D¡V”§˜uïôá.p±‹ijµ¤ú‹™'Èä}8 ´]Ng¤¤:ûýBR'ÜPð^•ÛõÞiò6Û½f¸èjMEG^ô/º¢Ýqúëé}¡? ’y'4¢ùêÛpÜ·Sí¶¶ñƒ�îÆÚ‰ P»FC�ß5PHæÝ'Àk1ð×Ú†.ìLìÞY¹ŠpîÞ·á?n{"üÖÑâ„cØUÛK‹ýŽÓ]¢v*v_Ø‚"Ðߪà&Ó™’©í}Ñ—žÜé�kÁ£(<ïЖ!#™àê�!ñ6®§õÅ>ι/æöMS}´)Íý­†µo²8�¶‡}–«�P¸oT9ÅÔ¨-(Diôm¯ñ~‚7»V!jJÎßí¢r)uÔ¾�‘Á Éøœwx%–s´tz(-§zRÝc 爄Šòz|”€ÜWûGŽú8îë¨Óùá¨CeáÜ¿slB¸"=1Þ±8áøö®$Yõø»Uæ¶1up0ÚaVtƒêŽ·Bù!†ïˆPHæ�B�ÃÐp˜Ö‡Ø±õ5”©燎Ñoá\’ŽÜ‰Á ǹWÚe¨¦÷ºSìÆzˆ9ßw�ærß7ð|gÙÄ@�¶Ëéì¡$À®I/ûÔŒ1WIZÛ;(ÓPs¦?ï«Å@�¶Ëé,ÿ*Mñå¦Jž¼ôGp“ÙÞÚV"œ@ÛåôÅ]dîˆ}q�Ùà¨ïuu5¥Yßòû±^OšMuzW–™ò¹'“yµÍ�h»lOå'cþwêhÈ5&2ÛC&S¾a4jqè¹0âÄ6ùL:ƒj2d¨ ¥)iu�ŸAÔ§ ô%8âNÝÛæ§*�|�ú¢ÒH‡">Ó ƒNyEËNÿ¾´I K�t”ÔRB”0<ãhÎ+Ù¡ÆT‡@Gét(©x"œ�\sH:r|‡q¯üH$$¬=BɈ*=âIFwjýú¼ ?´ëV÷íà^MBN írú¯+,;±ÀUAÜ5Û.5~µ40ê{�Ý{VæVÊ”$­4¤ÚÜó3Ì]*�i§PwvN²róü½Ü÷AìDbÍ© pB3]aÉŽ®â°àåUæ-u¹æ:´Wi/­—�–SÝ3и �m—Ó™ëjMzSð˜ê 9†ÚéPS_+ Ï:ô…õFH&¸z#ÈUœõEgáôågÁ (»E—ó£«KÝIát¤ l…@Nîrï5,M…Ô&¥o»œÎü1—ß^ȸ´C«µû­Ó 4¶B @›¿ãtˆ%Hr%þP‡ó«Þ|šÛ=R‡(Ðö×è0g6dܶÜe­8Z @ÛÓ^:þ~´jŒêž‘ §±¹^XIêÝ›¢Í­³^ M4!P ír:{¨ø5êõ‡|J«sHOïtè©°B ðÌC_Ù�*wÓî«o$(Ðæ3áh,)Zi[TB]Ð&ŽDœW” bs“Wxç²ð7ÿx…GPc!ŒÒãj9¥c½x™ö*ËÓœh«œ¨¨B ?ÛaÉwà‡8z–äj´P³$�^ _Œ9 R¤Uö‚驉©‡cÞõMêƒÂëvWÂì&ÄÓ™UZ!�›–Lk¿ïfV0§ßìº 4··ã ±Ú.§3_Z9Í®Üd]šØÓ;zªÄ(<óÐW_’þ &,P Íg­ Ñ‚\@ïtèé©Kä¾Ú? ¿†.óÏYæ¾/‚“Ââ.‚{šŽE_ûæ ɽöž¦á'*Ä1-/¸…�'†äÝsîÄïž3¿¢%áuÏ”p+±½}_¨Å ðö£ÕTC 'úò«]Ã'Óq�³®÷Óé]e…gúÂ;÷$Ü�{d­LµênœZ “žÞéÐÓ;÷!�ûjqû›Ñ$ÜÍhdÂËÂ�ä�žÜ)KÈ}´[<¦‡äx¿WLX²ÔTT!ÐOXBÖÝB£êy˜îY¤£w:ôTV!Pxæ¡/¸IÎ2AÝ$w˜`’¹zj|2—ÅqŸL¦NÍiSYvâÃ]–K� @ÛåtæÙvŒ‚ì1•A�ÊDs3§²A[_[»5©Ü�¦¥’ �n.·“óEdsjt6à„äÜ5ª]k†|T>€Tn“§ÕrœŸÉ 9_Nzù°é Ãäk·ÜÂŽÚéPSI…@!Ywsk0b«Éæ�Ñú{]ñrºš–.œÞVEÚ.§3NXNÎ9',2çÜV�Mݓ⳩-NH¶ï|™áÎîÌW[ÚŽ 5­Ð¦R[R-¹ógœ›J�\cR~Rm¹ðøšnTGëDZí²I€šoè ïp,p÷€…¡i©šMžä×Ëëu?F?”»Ž9¡eiÃëƒvÓR„Ût9]9·9"~¹&àǤ8):£=Ï›åqåå®w`edï‘+OΕ^Ie„×ß9q·ß=a†r>%ùõy•?Wiu·9zy4¦"œ@ÛåôE*/Ä“šãnÄ{º#D…7â9Qqâ=QÅâ-о�ä8yz«ÿ4ëÝÏÜ\_c-e×N+•&©'Ðva_®¤Æâ ¿¯Íö´N‡– * Ϸí î*s0W•‘¾[‘#’$Új+\i€5{è +�,p%� ªzÚ/W=�³_¯z‚£­#�¹®<ŧiœh*©ÆØ¦¸a©Ž®T°ðqyÞˈË�«�z‡¯³÷t3!P ír:#ïþ[}÷éq‚ô¦ã|:”;ßîÚ Ý�þÓ‚ráÚ|�B(dÉOw• ÷Ð\Þ\~Ó5Xã3¹ÐI¾Î´�/d@�¶Ë錔To.¼¤,NHÓc$å®HA1å®<1á |†·§ožŠÂÓ¯sþñ´'»<Ê4�LT/ŠlïG�"�@Û…å¥9jœôâ‡&&Où$ _ÊAx½ÿc;WB @›Ï©c:Ó¶ÿž–îzSOïtè¶b ÷Õâö•Oò ¢\5hû† hó™Àñ”CìåGË­üŽÜé�+\Å@î£Ùkl==ö›E‰Ë¹¹ÆF‰©ÃÐ2‚ s ¼töY n.#ð‚/?�/W†B �b„ÉpÊóyQõVïAõÄN‡˜*- ϸí .û‘,P÷ý߯4(ò3Êßçc„‚Û]ûbkÝ¡„áÙóBöô¶d÷ÀݧÙý²²ÀÜmî¼¹mZGŒß¥˜PlÄ4íÛïÂôš7¾÷o÷bÊP„ã6„¤KÛQû£58áwÎȳ(óæ.çd/¾ŸN}‹ŽüŒsÝ4gƒ@¸i=1ÞK³8áøŽ§£u+™ËÛMôld@b›žæ"'r=•]Á>¿_AµnšQn"�Qƒù c×1?õ˜p,=9 CUq�ÍpÝâÚžº5àÓœªˆ FM™ Ø–;¿ ¿8»|3­´%,Àù›|˜¢¨Ù§§ÆÏ>'$玗6½ö‚˹ªzEÚõžóÇÚawZÊUh{ܶA_à*²LP®¢ÃDäRR´K 8î{éõíçüØ{Uòú{ÌÃaXjm ë•*S!N ÍõpqF A(Õ\LŒ&%&ã¼Óbœp/ðÑ0?Úš¡>À|¿ nè7¦B @ÛåtæW† a(Ý ô8�R[G¨�Ån�ÒZ\ý2®.ì³Ùº`ÔFÛ¯ f‚É]rNDšA^¾­C½/å)¹¶îÔ£6ÙN±2n—M+såy”쌜;ÿ:ü!×K¡ñâÜgûâœE±ã ©Q*u£ü¯ræ•/§Ô’F½NG-Æ95¸e67½�ž ¿ƒ@ÔN‡Z› �¬s… QVd!hNVXc�˜°Î7peæÈ) üvôqeæœÑÚ”Sc޳)²ÆœgSޤ­s�6ÈõZà¸êíþ|·}m“å�­(Ðv9�=˜úT‡ÈxtôN‡^3«(<óÐ(#™à ”!T57ÔYÍ�ÓWÍ-o²ŽÎUì¥p:RP¶B § qûªD$\U"dÂ+’üºk‰ÔëþS}4~~ÝÕS;š…@�¶ËéìAc!¥ Â"²"žlE%š ,ÅDW›‚úI¨ ²j§ ®jÔ¼h�eiG™Ó¦%Nrº{­HfÊA)[!P ír:{°›‡bP•Y™ÎS­.òºËæMwa�ºyìÅÐdÚ.§³‡B_ƒ–ÌÈqÔZ¯«£w:ô [1�ûjqûê(ù‚ hó™p+Ù½t›”gµZ½¯£w:ô”­È}µ_è+üúÑÎ�¼G_aaá"RX\á"OXLQ'4-²¨gZXÔÉÓᦛ‚ávÈ{)œŽ”«(¤H=aåÂŽùW¹²@µÈŽ^–©œTØŠ�â2�e˜(aaÙ'RX\Ù'NXëR‹ ­ ×Kát¤ l…@!EŠ›¶­YN÷þ³§v:ÔTƒ!PHÖ9ÃÂòT¤aqå©<Êe…u HYqu <5Ç¿¢kdqVÄÕÈÚ5­j=^·D»�>��V¶B ð„¾°ÉW� ™p¦£]£ßù2t}‰¸'w:䔫È}´kË/-!œCó:ã÷ÔN‡šÚr’uOT[‰;å{‹›¾ãÓ“;r*ª(ïð$©.æ5HÏÐðk°€)®€Š�)`†Ã0û#¡ûGY¯¥�­¹¶¬Ê³Áéˆ@¹ �œ"Äí ÞÄd™ ÞÄt˜ Š»z§C¯°¹¯®sæ^$¸hQ¬å�«h"œ�Œb}¹lY¥4ñ»P\Gít¨)OŽú`ñz‚§AI˜§A†vx>V‰ìå¾ørŒy=+[HÎÐn …@�¶Ë錬¹8²æžC�¦c›rEH�ª‡G‰ ê&‘’bê&ý©œ°''®˜#'¦X/‚EP˜Šq‰óž ô’q«Ã·mŸ!¬£d‹|)SN¼BJX/ìÇ2F9øPJA¥aòë‹*F'¶éz¨a„:KŒæÏÌÅljÓ®ºÍéT·Qž"œp…r°v[ø!  ÕWüýTu,×°wµ…Ô÷V;ý.yÿíä>_º¨Ý!Å8±M—Ó•_5±È½”˪%ý°x‘±e)Ä gqœ1õä¾°& ’÷‡}QQö޵²kÊ�¶œên”]ù>|D‰b @Ûåtæî®5q;†vµ6¹\å8î5·›»ù†bé§ÛC†@�¶ËéÌëÅc9xomC)ضËéÌWar°ô¬;æÕëætt£l…@!íI+3�“¤r²Šëè�=µ¬($ó^�$_^(³Ú’­°Ñ�2€~ C)®íN¹'LJ,NHÖ‡_mÓ©b:ʱü’/NíþnÓnøUJ!ÎÝmbð Þ•÷¤¾Ø•[ �|»s ù%wá¸l¾ewø~)™ª¾þ4j½9e+ ´]NgEœ«&¹æGë³›ŽŽ÷›ZU ù1Ñ&B @Ûåtö°¶„ÎÏmc΄ÜdOMLX‘Ÿœ˜¸ŠüÎÄt34T–j^Ùñ5/ožÚ‰¶ (K!P Í�*èY¶oãq·ivä‚@”]-ù‰õr¥iº}Ê®(ÐæÛU¨@¬ÌO*�+Íï*Šjäû&\ '©$ùòûX *Sä1”kyç›@�¶ËéŒ Dõô¾ˆDY �Ì{†ŽÔŒ +W”’=Q�¥äÿçÓR½ NG-D…¨;'t£áz§CO5…dÞ{ídÊ�È7·‡hgkV„óG ÎüœYuä¾0+ƒšs˜ˆók–Ù·ûn78±MOÓ·£ª†kX;ŽŠÈqë¡«ª¥nçæuÙiíU¹ �B?µÔõäø¥Îâ„d�òëz7ò ¿Î…ôI±êL~ %×Jz¯¥±>‡­G¢^B �ÅM˜Z=µ/ŠaX �¬sÅp¶5W\J{ç½ÞY&‹áXœ@ÛåÙ¦4(ËC É…©%ºó…¢üÉù©p0�úuùFï­­'¶érº*?Úô™„ÔS-�Û÷}bß…ƒG}ŸÏB¾g•%œ¯.N_°`qm. Þåÿ|§*ÿhyµêB=¹Ó!W¸Š�Ü7»Åãæé. V ¦J_˜¸EÕ3и �m—Ó+¬eý]>ooo{�²28±M…¤–©> 0¶ò[¤¤,P �—TŒ®z¤<“ùïuªUØòõ´[Ûˆï…ÐÆ[h»œÎüÙ8Æ¡&T4AN­®i¿jõ¹!OˆátÄ v9eøÒ2Ïò moùpv oùpfm`¬U{/}6¹6�nP¾÷Ò�PË«¡�H£±¢|ïzb­»ѦmH:区ÿô/ŒÚ…”£+¤í£mQìè�=•S’yÇ”æ:B—6§¦±š¿%Í([Õ]G¾ñáÄ6]NW¾ B @Õ“c…¹”ÚÛõ'×Q+ÍŽs›‚z 4±D8�¶ËéËgJ²’ÖÂTeý3[É×(K?G{Š4 hãÍ%Æ�t½ èQâôæ XÇ(„ºŠQÆAH”Y7ð98fÝàÞ‚#Ö�D¿™­îkyÖ§Ç~¸²�%ZˆQ±d–îI:d�*ÅŒ£ž(ÅÌ�xSŠ™î¦J=7Ö£"õÞ(‹)æôÀÁeÂÔ€nàüeêIs3T¯&'¦|µ7í8®ÏQêÜfXo'‚Ó�Î=!PHyzêÛ³ÙOÛQž�º€Üé�SQ…@ù+x‡G8bp4Šß‚ÅÅI!pÕÅQLuq´®ºø‰Ü-å‹Ï^§#e*rzp“hóî˯¡ Ñ"”-Bœy1�08¦Ã=Â@Z�÷#,x…�õ ƒ?_š&~×Ý6r:¢L„@ÎN}& ê;ËUõÝa‚ª��ƒŒ¬�Ï 2·B>¾°¶Ör¨k{pìØôùã\ñšM'—wºIh»œÎ¸_¡*T4T÷Œ^©šê(²¦:'·¦:h,†±ÂrèqO8Uñ§*âVÖ;¿`«õÇçûELSÀ]EÚ.§³‡1âP5*+‚ §gBVN…uNVd…uRVGÐ÷•ÁQ"·eo×z{š¬B @Ûåtæß v-¼›CÞuöëè�=•VšyèË”tç™ @›Ï„û–Ъevçæúz§C¯°¹¯vËÆ_C—Éç ‰+“�ߌUØIaqUØ=MÇ¿¢k®s†„5×½§(–»Àg­®ßóé|³r… §1¬’ÞÓËl‘µá-P\æ½Úð„°,ŒÒãjþãš’Ô¼½‹‘Ô¨µº>Se Ñ+S!P ír:ó5ãP5ÊA�Ó3#+¬_OÊŠ«_ÏÉjÞ5³þ]Dº§w:ôÔÚC �Ì;ÖžÜûRí2m&jmО\áÊÔZ/\Å@qyÇÂ휰°R<),®R¼',ç¥�µšípסïÄp:bP¶B �2u!˜U÷ÃÜ*öôN‡ž*1 ÉgZøÍX+žW+ÞSWM‹¬«Ï™–WW!‹ý}\Üï¥p:RP®B �"}xÞB¿æ�ëèe¶lve+ŠËÕï€úcùHºô±¼+”@�¶ËéÌwCú_] €Ó€ê. /Mè jÈ“<05䑃°v�•%[»u@1ÍÕÒÚ5„¾leÞ*Lqµ´,P ír:C1…4U•A‹«»ÇÔ¬Êïr`cÙ—&'®fÚ.§3§ô`ˆÁ²kª:‚WÃí–Q­7özÕJfs½…�…¢ 6–²Ú.§³¸PT.˜‡é1i]l¶N”ʼnmºœ®üä呦ôëÃrL¶L€òá„,9@•é¨ñÕD L8¾Ñ%Z äæËS}(S$D¥â„+8BUòè©ñ•<,NHÎÝJ³¾²0Þ�ôÅLN,f¢L…8á £¸FþRGø]Öë�£nòr~—‚‰�âÖ=²�ù>ešÕTÆ¥ª¾7<`¤ë4â„›5˜ ÁP£'À É93üæã(Õv–äŠ#?ü'Ðö0üu¹ !0÷¨âbJÌ,æ$'抜}Qe,5d‡¹Š( 7cpsAO�Ÿ ,N8εî`æé¸+kîz„Ÿçû}q] ôÕ¥ �Bº¢±óÔÓúÂy²@!ÇðȾkü'Ió]`¸«h\¼Õµæv¼™Š�m—Ó™¿™ÃrÌ=½Ó¡×öPHæcG3mÛóÙÙ’s_–oM h{r4ï©)þ9zýÊ A‡ÛBPk]VHyÁ/ß�øµpmk�µðCOF×eº§5ãf¦,E8ÏÏt–ÃpQ1”èUpÂqM­+¹ÒóXj¼Íyá ´=--®—Râ ãP«:ökÆé¬ÍKù'äúã9äñ_XºZ¹"^³m—Ó™-EŒn‘Ú¡ÎÇòžÅ‹¶«¸ëV¦âm.Wêùá™��‡êzª¹ÀCKèב÷BÚ.§³‡fˆÃŬ¹,!Anet4˜³ÜËYÂ~?šØ­g§³ž5! ¹8ÂÅ!g!è©�µæ@áY�V#š"Îãpà=a:—mVž;^Û:XX•§èîëœUšX€ 5~ �¬:NG9ʡ׉´›LXXUD!ÐÝe:«´ûÇRüÏuœîý ÝDÁʪB �î.Ê[¦aÙ4�ÓË-à„d”Zn1æL.·\ÌÙ[n£°´é+{¯íh9òÌÚ.§3o”-‹î«ò6°ž¯åtñüš—½¾µf„@�¶ËéÌ·ë\P:ÿ*鸾˜ÓÓ;zzþ…f>±ªëö|'z¼·lí²Å:Ô ëG*P h»œÎÄý ­^k÷�hIX @›/‰< ·^æúÇãÎ�1§¥ë¢_Ÿå÷;ú§¥¶3?Ãm¬â{�H0 Éf=©ž"œŸ„„T\nMGî‹ÔƒŽsoŸ�L­Ì¸wø³7lz‘òáÜô ÌTB—¬×ï´N¤Õ²íœÐ|CW�¼ÁqÀän}.uÃ6u‡Ÿ7%ãúÒ�éÓÓÊU~‚9š .5™p¶)ó¹ÜÜ=áOuö­Ób¿Š7¶B @ÛåtV'i�éÀ 1èF¨]Ä8Ÿ„“fq�’â²8�y.îßÓû"îo�B2?üRïLÅ4—+aù±ìºÀ ¿%¤b �~й“]ОÈdΞœd—_C1–@N¾’­åáÌןÎ×·´©(¼(¡/L·!™àÒm� '¬—aÙÝNKKdÄS‡ž�f?!Ð?u°�‘A¡žÜA! ’w7{s-[’5­ÉËæÆ'0Þ£l…@?àƒÁ#*(Ó“û"(c�Bòþcü#É6g?¬ËpŸÐpñ hãã¯M=—ü¦ƒŸ° 4®"œ{ü}¹оs>cqBó9©×2¬IïÈÊ ÄŽ îpÇ :öXÁ•9T#Žœ˜4u¬@†¤¹c…½ä¶”Y«Æ›PTvÈèì}Qáø£FVOŽY'4ë`Ÿyj+¾D®4²aØh£M;†ÁHnÓrHŽšÜxÙ®!‰|…cn›ïr­,Á닾É+ú?ò1b @Ûåtöp?¬ hÕX†î§æ;Œ×Å©[!P ír:{¸zâ0lØF!A:9iÕ‡éhÞÜ«¹‡¼ªWÞW&B @ÛåtöpµöÐSÁ|-qv£’¨ ½Z…T¬«2©öô¾ˆÅZ �ÌÿÍe²RrÙàû†!µ@�6: :ÎõÞíÖvîiÔÛÔc{CÛÖ�ÐÊ!P ír:·/,&A2Á“@&ܪ$ºèe\½#€…z[!P ír:ã~E—iðºg$è™Íq_q«6Ùóé|³Š& )@o"šv=‡H_SgÑž^-áÒ`Pa…@q™Çj”°°z),®z'¬ü­y—[È�NG ÊVZ¤ÉÚŠ¦“§Rwé}ï§Ó{«Øå¯` i�fÃÒpÕ„… HIp… ±Åì JhJô³/0.A͘=9~Æ´8!Y§*ìNù0)�Õyi« Wa€m—Ó™“h9{~g&WSÕ’êXBêæ*ON írk𺕷mH§'w:äŠúBœÐœ‡A%–²$ªÇ†(ò©WÑqšÁöo‚C(ÐæGoÜ’Ì!u*‚ õs\í\ ©xxë]â26¤\…@?.ƒA%.ÒÓû"b�B2ïåNw=‹¯[,ÜìÚX‡r¹ˆËClmÒ,Ä$ÚzVÙÓ;zŸ�Â3}áž›d‚Ût#Î�ƬײyxO¸•ì9xGø ¿—´�±›n‹£wÝH�“©W¤y/‡7Óz)œŽZ´- )RÎ¥ìé}áRZ ¸Ì{.%!,ÜŒ“Ââ6ãž°lö´ê9á»X º¹VÊTôÝ\¨3oæò¿ùGù­[EuÔN‡Z |ýŒžsÛñq,p'|ÈÂ�ÞGå çßà¨}8(†êö€¹D„KOùŒ÷œ �m—ÓÙÃA1œŽcÙxòX�+ï«oî³ë,àWÚàÕís.1_ȹ 1ŸiG×N í!Öƒ]a‚:Ç—Ÿ,ı‘žÔ± 侃mI‘å°4c÷‡ðˆ¥¥B �~xÇûy¡vqëܲ1b« vá“P~£§Ü�Ûýžî»Oç»UcNHšŒô´Ûλ•e)WŸ.K©D³LZ·F³"œxLc†øO¢ÁDtN4\:Šæö‡;.“·+{~Ó¢^dé¾úįnq™'œ=Ï:çC••¿"í©�µÍþ'4çÐ& s,pùçÈBhÃ6‘ž6bÌÀç.:P·ÐzÈÛœù8·~ݤ¶³•-å’Vé:¶2kNËZ"ó§URS\ˆh»°/,ËBÐFÚ=¦ˆenî½I�Óh%½§ÚQ;˜Ý–2L–ãõ‘IâÄ6]NWŒŒ°Þ)$®Þ†'&æ¾Úy߃3&ï¾Ç«íï<ðH¾x�C™ŠõbÛ.§¯‡â2ƒFr>tg+'ÚŠ2ℳ;FPX„WäO…÷c8Aq×cA1W zr_\-°@!y÷BY¹ôC¹ÚsÔŠ¶ÎÝKO§…è_.@橼þ¤ù×ÞqÅåõ[œ@Û…}=ÜÂÕ�–vÿ§»ÚpýÆT„ãîWx;’øªŽ,剸ãÅUïqàV‹ê®mš†FÙRh¾Á©–QNƒò ïI= ´]NgC0Ò;Úp[j"{¡îÚxÑÑx1À…MDZŠp«¤«Á¹Rrý¥ÙµFY*ªç_öñF) ›®o~´˜p\2c :r¨1�7Ћžî0ܦ+d_ß®^x.×)Z}»¶þ@�¶Ëéìa¦4 —ÓRçöÉôN‡^“U’ùë¬â¾Ž¬³Êíë¼:«®—ò*Có}»òÓtO4Ýæ¤ü cÆŽ¸s-&i‘“4—¤õ§“tïi|1K[ �n 5!æ¯Ïz§�1!Zœ@›?!æýÜÇvnK¿ù:ìò”ícÎ4âül8«`£=±/â£($ç¡�¦Ië�ÇïiûBH'Ðö $ØñN9èýÒà·ÞßœÒP9rvNž×4ûhK¿Ï#lyß pmö%nW9ú\˜žÚñ 'Ðæ²à üñudonÚ×Ò󘓦r 1Wd+ãkLÞ趤–mü=5Û‰Pm—Ó“;äÇW)8íù¢¨Â¶|t›¦ü�™¥Wy�mÚ�üT–"œ@ÛåôåK)¯E[ÆmùEðË’;r…©'4ç¶§)­2¯¬‚¥FŽI,Nl“Ï�—e˜“þ²ì’…él¨�H­tŒ£¾ØË0 ÌÎÒo‚"ìÕ¶]Ng¾UçLÀ¬ãµ¹+ŸCèt†�òô3J¨‘ˆâžÒŠ—§«};~/^M€hûc5Mcwµýž¾P’�‰i¡¢ð㋌bb¤Q×SÎÓ,‚<òüÏ Ú|Sqf>gu ¶C�cÔé™NÚ eáÍëï½Î kž!R7å/'Èä=@�¶ËéìAPi3´(nYÚ¤öAïtèµa…dÞ�£ÃÏA{Q¶9pÆGIkʹ¸·¬õ )- ´=©:�tîl¿²“Ð4þ]ƒŽ›…æMB¶#n²(rBb¶ÍŸ„¨ño>ŸÿcàÝ"(>AÃùs$ÐQ ýrçG‡aWe¡¥}RoìPæ #°ë(þ;°¡ÛHZž�äõM§òíÕ–Â�‘z:#µozد:Iο«ýÖy¨{C®‰$ ´]N_¬…L‹úlËü{¦-Ä‚ÚP•œ¢ÒÔ°i'ÍÓáôdpb›ž´þ?¶p@uÎÎÕR¨]ø` a”ð<]ÁÏSÞv$jc›î8IYœ@/©é¸=‘åÁ€,9e*¹¶�œ£K8åìî¬ô„^ž~O¾ñý‘o;cmÊâX›Bz”<Ýñ¿éLšæººƒí…p:B¨kh^¢ÐW7ÁƒÁQ«Àƒ]/:F§¡md{j§óÅjD!ÐÿdeÚóKGéצm�m¼iã7§ßO÷lÉÉÊàÄ6=I -;„¡ O9NœŽúò¢ KÎö=Ç~àD(KL8YzbZÆ|)õõI,s”&5�%»*KL<¶mOœŒ,Š”³m2²[Œ|�Èè:ÿ9Ó:šˆ>¥ÑŠ`b›.ìéÁ´hC i1jeä³Ùc(”êLÉ ÈâÚh…°iZG�‚Çùƒ)‚œ#%Û•—O5%o/À¼ŽšÐop:P–"œ�ÂtÂ{TÕ‘+rÚó&kÚŽC£ñz áÄãÜvÅÉÉ¢X9!5Ûö$'kâùrSkÛYõßâ÷+K!N8Yz‹î:ý^4«–8è©�5U]„žsÛÕ6k\)9]Ãò 'Ðæ³`…��= íÆO|Zjš.ìÉ` ¿½pc¥h;ÊOºôYŽ‹hóY€¶©Óßõ'Í´º#íÂÒ˱šç«ã ½»¦nú)ùÙØÍŸí¼««X„s'BœÂ™I§§ÅO:'ߎs–“P³Í½Zm4g;›(Oεgœ˜âñÞSâ¼Å Ç5Z÷²ë™ðО´wÌÛfl¨ŒB —6â.ªk9(ú„õäN‡œJ* Ï;ôÕ é/x08áfw~.á‘$½µUîé©�HM'£G}±¿´çMÊ–æ­:[ô´2Gû¢§­P\a)@‰Ëµí‰•’űRBz¶íAJ°Še žg]zÆ×ÉKÖV¥ôHã' ´]¶#_eÕ¡üD¤­¢y•$ýÔ0Õ*VŒh,H �ÍV"ïG¦}ÿ]¿Zë#õÄßËýÏ0±Möä-¬ûZ…¾ÕÒ.†Ô‰¤t|…8¡Ù†®^k­£°Ö¼_’‹hsYðôôÒÃ’mj•,CîtÈ®b ÷Í®Ë~LúI-e�z¾Sþ!8æc»b%•ÓÓFÕº>„ËJÊÚž´ÿ*ýfS™¯Ã‡qÝ£ülg¾ºôlk›Ú;ÐXkÐH¡‰& ´]Ng;ôºRr¼ë×ôôN‡ž²…dÞVü5h ªBB ´µ…åY&œº�¶Íg‚Ó˜-áHk k?r¥-㢕†ØéSQE8!wË{.e3¹ÍC­ 4å{på ÏÒFS޲ÍN í¾Äë _ZáXàZAUMº-ꬳ¯aiÈ7žB @ÛåtæÞ5œÖrà—~5µÉ½{»“ÐMPô|Ü–pîkOï Ö…g\§Ät¬ç«nÓñ…§hqm¾"nœ#î!Ú5�ˆµAÃÞ4÷³º(¾›fSSôÝ4ôrý=kýàýÞªtôN‡^ݶF@!™§Ü‘žÜË;çŽÄ8ZXÜÂï öEC9 ÉzÞŸ|$+e*ú>JÔ•ÕK�lrÌT ²§w:ô”­(4óØ®ü$ÜÒ�L8Ö�´ZBÛÓP/á:+ÏÀ{ý¥ßvÆý ¿Y‡Õ=)ÀÈK¡y w;þÇ”fùNÎ?¿ñ?(Ðöä8nuˆC[PI9Ÿ’*í�l‘¥½9¶üÒÞpãxÐB)¹Brõ,z휎w¨l…@á]MÛ—óÇù2A•=ïÉ�9å*ríE>�—iNðѪXôÜRÓA…dÝ5£MŸ–z¹ÚÐ;z*«(<ó¶/ç5:Ž ò5:d‚*ß“;r…«È}´_š m�£VÝHfX‹j‘EÏ-P ír:ó.÷Ç(,?¯Lä¸ZöîK»–W8î²WX\Ü3W¶B @ÛåtæÌNMëžÚéP+LÅ@!YÚÆ¿VBk`unå(®q@úv>xi%“ìŠkÕ ,Ål A(S!PȪ÷|PKµ¦U§”(y�5V`h�-­…gúÂrÌ$\9fdbøu+Lå²”’/K2½ý®´mê ÷ÔK!P ír:s*DOêÛÝACëth–b ðŒC_Pö˜ä�){üg¢£ e£Ì9“Šë÷Ÿ{âçŽb%r¦^m.ì¿j¹­ZM�«WkqmöÅÖ‡]­Õ–Mï~º�)k�m—ÓYùÕ¡ÏTŒi®…‡ (¥-ª¢ �m—Ó[”²§w:ôT6!�ûê•…eš°æ”²EÔwâ XyëhÉZ`n¼ËËw†{:†Û¦€(ô(@{ë{?�ÞÕ’B ð¬†FO3ÁîE&Üç0ÁÞÖ±‹\޵yä(³@�¶§Q†¥—cN-ÊA�›§-•PÇ»†2Ô³ƒZ¹ŠpBO8^»Î¿ç'Ÿ¸ýªïµæê¢{­£k«aÚÂrm±ø'¶érºb öÔN¤VxŠqÂqνˆ›`ÅÑyÝO‘/âZ @Ûåtæ�µô×beûØF2>òfc �m~@‚ÙÓ÷Ô¾ØÓ[ �¬S²šÒD““4ל“ð…¨,NlÓ“ 0à8ê˜}Ý�ê`HÆŠ@y �~Håéįò¦<ÿ(O :Dzr§CN¹ �BòÎÅdzz_Äd,P\潘 !,|�÷:ž',œDÓ_ËáhÚVÕ eJ0gËËAekÒ|…Ï÷q  @Ûåt–Ù:_Ÿ¡ÑòWZ¬æ{œ”ùqXÛ*lcS-4Úü@ÆÕbZL‹"‡ä8óãd…䑲â^Èód…Óè¨Uˆ×´QŸ¦x5ÅO{[!P ír:Ó�øÇ><×i-~c *\@êtHiÀ/ Éwµ_AFñó9 ‡BÂ*º¤�¸*ºŽ�¨`mOï‹`­ É|”Ì[�ÔKöÒöZÝ— JZ @› ãftÈiegt*§Õ�Ññ’aòXÛƒ»õPÎL᜸å´@÷ÌÔ9t&ÎL 5þÌ€B²îfµFN"ž…*W±sÉ�«zA±ôûÉž�™™Ê.µºøE8¢Âe›KéèÓ{¾Hé°@as…ÆuÖ²¦ÉQÕû¤ã6çk©eÏY^gþÍš Döã (Ðv9�9›«qµpñ±i~¥!v:Ä O!ŽûbñºJsp©ïœµ<}Á‚Å ´ù,xõ‡·ã÷Z~54iväN‡œ2á¨/ö‹j¯[^ŒKÝë&Î]ÜêoŽ9§67쯻4^ ÛtaOÞf%Yq4…´LÓåôô ¶E äªgl>ýÄOW~~ -CÐýK/ïi)Þ¾2 h{2›XI{½‰|³&µdqm�z²%‰cŠ 0ÅÐãäIXOšÖµ¨ûÜêIÖcAm®õxã=„¡NTH19J½Žâ¶I˧%e¸m° ÔZ–ýCM>?C¤o¸l¾¦ö’¶ÝMë™Ó’QÁ„(!†ŽòB›+¾Vãehwé\ªðîŽdî¥n${/=#ÙÂ葌ôlÛÓHf†¼?Aæý oèXGë5×9in/[àôbh©òBœ?ÃßîÛ!?Xœ%Ýø ŒÔŒeÛǃº^Z,09FuÄu£å´£Eu�ˆ‘Ze§µfïñþ*W@>uéh½m%À ´]ØWùQ©!Tºz+ù£óÓé\µ¹/ôÍ#í�K-Àí~M£#—¹²¥÷ W!Îÿf,ãï>ÀâhYQïø² YpŒˆ{d�´"ï‘…XƒXdœÓ WcÜè4 ÊútTO¾ëûtú.;ï&—n‰~[ï¶£•9⊞˜÷±dÉóF ‰¬¥MŠiû]+�¶áòÒô.YkŠ +OL í®¨� Ôv‰¾9eš/qê3 «“n…쥖b\Úû9ŸÄN‡Xa)‚Q_+^GXž—c€«Ï‹,xŸ§rým–¦ïŽÚéP+<…8êƒІ�åI§|®Ya±‰©˜"˜p|?W/Ï— {ý’ŽØéS–˜plSzƒÂʤޘÊÊžÞ!A!cNHL!cOHD%c´$ª”1gIN1c§–ù«V°>JÖ¿¿ÿÄïW½E0¡$É•¦ì‰–¸Ú”(.ç^uJFPXИ“WÐØ‘•½s;­µ�ÜÚJÆbÉL+å) )O<_KVWöÏÓÜ«é©�5U_žuè «“Lpå‚‘ ªœhOîtÈ®b ÷Ñ\ÏùPç›§…'²~§Á‰mºœ®ÜsdžLU{19®ªWrYµ`ÚrÖãC,�i‹…ª¤B @ÛåtÆVØéé}QaÇ…dޛœ”µ€ÉÑ®õcÁJ[:GÙ �m—ÓYÞ¦'÷E} ’wwɵÎîÖ:Dz¾vÀ«½G8!'jvÔþÖ®$Ý•œUÎÿUÔ Î—}³¶‘¹ÿé“„d[iÂUot«t@"„:ü40áäæF`9^õvÉáס¤oxxnšûqÞPuñ¡Ü*7Ü’JË„ÔîàØÑfpb›žÆš{TüÇi³]ÄŽó^ІŽšò†ùœ[vd«PNH/kl%/çR®:oËíÜ´ó˜Ðr[B>C,'—!Ö‹À¤ýê˜]€Y)ÄQßû�5nÒÄ8Ë+ùRvXÛ¼Ö¸i—ËKeŠpâÚn@K)Ÿß‹�KïåEð=•_3•ì[ã‹¶KXÕ±oÆâĵݞõ#:“ N¨Ëþ×wgÿ½ø^í©'¤î¨Z·"—?Ëà îÓ[Qzòé´8=qÙ´�ž\BñUSé¿W >ÂÐ(@E q8ÀÐ)慛˚镶Èp»7í»'¼ä–”OñʼnÀeøò"€ý1Öø×WþÆŽÛ¸i0h„£>˜Œ{6Üø¸g(:Š{&4å’{±ª¢’{‘ÊÚO5½qkå \<¶Ó‚ZU„ñØ@¥h÷“š—¤`g[8õü.ÀOµ…ÞÑr‰´X!¨DZ@hß‹Fÿû+ý·y-ix`ǡגŽ?ï`dü<`Ç©¤Dœ{»ë¾þò_¯ò| ­ÆŽŽeK0ç^ØzæÌcÖOVüKÖE|&t„g9½N›€³e^poX{Fª›°Z‘™g¹ô@~ò½žãß oÔ¨g'®íÆÏ,º÷`ٸ˫¶WNóñøøöD& «IO <éå„ Ÿôz!�ï‹Õi%hbýž�:bÔ+U‡b_©vœF¹ç �ÅþðÔà„{cŸÊ­µÃY3àf”÷ÊûRw«ù±kö"¹„Þþ*Šk»1Ÿ.}‚&xØeÿÎÑ>>m¯÷ ~çè_²—�\VIqµn5CGÏíÜT¨'´äŽ”ÏŒÇ‰À%Æó"$¿ØÙóZ’ñä|`zÅ^v¼ß¦àðãOCKýt­¨/d#ˆÿt} ³bµ¾X¥EàrÁy!^×a-¡â¨k؜ۭÚÖ\’£ÍçüÊehÒïéÝ(®íÄ^3¯E�9�ËPq«:¬WÉÍœT3SÊWçû5s×vbª©·ÛY†’)�êMºQ@ÈfÃ+Å@�Úô©õâ®óiüÈ®ãòø¡®ósƼ—äSk.z¯ª=Ë~ g•ªyÆz�4©"œ¸¶Њ;®OcøCÇY ¸6¬KJK>ã!§%.ã¡×—¨®cwvªª'œäe>-·b¯Üi¤jF¢¤_ퟶÎ0S=…8á÷ëÇeVÌ¡Ks1Ì.ÀLÕ…—ÜÑòÙ)I!¸ì”^.e]ÏïüŠX1�ûj2e]>º-‹ô4Mü’²Îâĵ݀÷+Ÿ/JŠnšðûÁiÍXΊŽvÎÂéÉÀÄ6=iÉolê~ç×€°þκ׶‹øŽƒÏ{jÎÁôÜxcqÂIŽ1CõzO¢2ÅÝÂy%ÎÄín–¶q¿ æöùp?ÖÏÙó �f>ÏåØnÒŒó.á �[R\÷YÛ}ž›m{ê> §³œÈ-çÜ®rº�~y¨š"tÉN•Є«&¿T™ˆå»œŒÕé¶ Aôç%PÄo+9¶sM³°&ªö—cîš²Q@x9î<©‹DÃ�¿Ht@!…]&´{ß¹6®Óút_çn˜kØ@€C÷uಹÊaÔ€´Ö­ñ¼=·Ësk±NhÉ-)�C–�L!ëDˆ/ {V?\Z ÷½8Æc/§Äkšë…¬½‹²7�ª¥¯¢ü�bxU×ñáoê L(‰aŠòY§îõlS·¿–êÙ7™B ¾–²Äð\–có(L¿jyª;~à§×R!Pxá-E Á]Ey!†ZdN»ýNš–©Ô)+wçÓ3ß=@|éc‰Á3…iWmޝúr=» °S=…@!e?þß-*¡®�)]¹›RUÌÍÏ¿T”_ö“Šâ–ýHQÄ}T¯þ>Êâ„S'wü:OZ²&¿AÿéøÕŵ=¿Æ¿ò÷]ªŠTa΢6¾6é£>Ï›¦œ÷­Æxw;T•'ŠkÃÛ]jÄ结MaóÌ�x ×ö0âÁ+É£¤ØràõMÏ�e}’âðk$ç¨ÑÖsûa´Y �¢ƒ7®I±%·ÄÜ)ùìQ&UU‘)„‰k»=).KSÇ뼊D!N8±AÏM³*2—7T#ÌÑíÙ,�—5ÙäK*S×vbiùlH¤\6$/•‹¥gÇçb±8î›Ë¯õçúÊbS¯X⪘'œœhT…]êÌS‡g ±©û�k6õ£äL;[ÊØ^—W€ª)ÄQ� �”KžÅIÀäÎrüÑÜ5mµ¢ÓQ‹Ú9=ï&Ðw”üÏå®±d`ŽœE“c'_´ëŒØó¹,H!JH‰!Ÿ‹aÏ¥Å2ì©„8=/>!ŽÅq_‹ &_e³Úæ–HÁ;<ëäuh‡@ìñüŒ�ܰ~=¿œ  )¼½KëXM94¶O±ƒÀ{ÕTľĻ%nÄ÷ü~ô(¤ðÀ9Ï£¦hÍw#SSpÉÿ;´ú=ÎŒÛ<ŵá1�žõÇ8ïnÚ¢#dÈù®0—˜·*"—gQ —Ñs.•ÙqL*1Ôm ùê©y\Öµ¹ÛeÐtIÛÞ6ö=ÿÖm!P\Û ˆa'ãœÔ¡üX…:R>£!'—ÐЉ@%Yó½Å%Yã: %YócL“6í{sø.ÇšeV‡Y€Nnh>kÍ:¶5Ú=·ËsS5…8¡%w¤\š5N&Ëšã�räÎ5cÓ;a�K²Öso"…@qm7 ÆýÊ}p‘�£Î)/LÇŠÓÈÅYò`žÂ±ä¤Þ–ñ•ºÊæY³JW¡"œØ&ÜLò¹ž×åy©D!N8¹¡šv]á¾SY¹4k6©› áÄ6Ý€—Ѭçuy^z|â„“û!�â÷£PŸ«L…Š�P©´g òÏZ²®¦õÑ’;þþ_©0ªHÆVØk-)RË‘£2@qm7 'ŠqÙò£îiO£³ÙÜóÞ)Áö<޳TéO…ôçÓÚ'®í´`÷ÑoËîìTUN8É}Y¶´ÞÍÇ8æ{ÚŒšO%³O­BR>DÉ•on›D1N\Ûíi¡£ÖqÞ_¥Ûj±ÑžÛ¸¡b ð¢;Z9Íð™Ë /5Ã+„ŠkÃB ¯}ô˜–ü¥ŒÜ»ªP>©È?ßöVÚµgܤ �âÚn@ vT 󯃌àÇiýI‹Õ{-½. + ©Rf Mƒ–§žç|ÉÎ4‹×ö0м¦ò‘NÖç¸Õ¨ãTŽr² ŠDãZ\ȱ”ËÃ*R€’¾ádàAøˆžÓe9©‚B”�2G:ä¸;Å›&ÀÛœš�Ó¦Õ,—µÍy£Ö=¦µ9@ëÙTš(® »É¯¾§góƒï±@�2#ß)È;RAœã ò#|ÖÊŸçÙJmz·c B…@ìv¼6Ñš#mî†ü«c¬ÕZ{v`§½á„Ý’ê-/‚Å é´ÁÜ5�Zd9?4­K¸!…¤^ZÍŽë¬'®íö´àR:Dy è¼s£” —¬³V >Ž×$ìVëªNpùÈ5@ñÊÃ#WF¯< LžtªE<ó¡KÛX3Ä}²o…(qm·¥ô`Ü£äÝÊÝÿí˜]€™R^rGk›´îö»0;)„ŠkÃB€™#†¥ß,ºN{¥"¡˜¡¾ê(=,’Μº6- 纶ê?ÿŸ¯ZŠp\àsÙðŒÒðo2g›¶íö´HEåÚ"e9½·Í§(‹×ö•�â ìU$žS”ʼnkãåN|S÷—3ƒWItö¨Øŵ={§ã¼tð 9•"mÅ—^ *q»@ë4êioµ*Cl!Ô@ýµë½é‡Ïó¶� þêñ^z‰qø‹ ­‡ÞŠ`´¢;ÓÄ+ÊÛg¯‚ Û…Öç>ë9áÛ©úAo©kw…@<轨Üèêùý0º,�ûêò«±º†%G!ÞŽú¨«nB ¾fô¢B»9ªkXÚ2jôgžÚR¶— é&Šk»1îWþ£UŠ<©ÁM�"¦©FÎ�{Þ¤”X¬j»ý77"œØ¦�–ë%?Fv½Ã�Škû/F³—óÓÏ“bÒh,P\Ûc¯†¿ò­ºáÈ„]õ´ÿf•*¶Z–Ô±×H…¹­æ9,N\,R�¥\@ä B}ƒâG—åVd qÔ?,.={˜¦ºñï™]ž™ª)‚ -·¥ÔûZ £Ü6ßcÒša¯ÑÌ=· |®öS„ƒßë5G™N.?U"R·¶f'mÇŵý`=Î�äJj[§)ÎýœØ&ÞùăÓqSMƒš’u_ô)© J„Ý>oï— ŒÐfH!]NàÓùÇó·(±M�;×I¹²Ü©ŸÑ|!ÕI'®í¡“¼5‡0§€"Á�Q%RS<.½T&b@³Úôn-§’(�7ëc?֜ئ'wº*‚y?§z‰Ùq> òsÐG&©gõͧÑÀå5 2…8ªp¬}ν|è�굌›8¦aû³ë ç K‹4k c­Ú³3Mئ}<õ ïþßžÖš¸QHÓRCî(qî`¤…v\ï2Þ+€6p J•.»<#Ηë˜]žYóÙNHÁÇòÔìcTv”/@Y�ãw”ð2Ú_Mƒ¦‹¨IBh 8œ¸¶§®³Ö4�‹®’Æåïcab›L4˜§q,«þi¨»On0[˜Ø&z0Ç0÷íú€6æF©½B{Ö}¿*‰2ˆP“pªÒô(ŸönÇ’³Q•)r¥üªÆã G{;ÚS¿uO!PHQÁë°¡ªMÛ~¾FÇîìT5!�ûhö }Ïï‡7ô(Hxø†ž1m“®†5m—åÆ4=˜vœ›Ç»h*7ç¡Anb°ùì<ÜX£²óxÁ#Ùy8#'³ó #·/ȆIEíc]2k¸*Ñw”�C 'ç=µëT˜½¶dFkú|£… hA¥ŠpBjù¦¥,4?“±vì.À®%>ùŽZrGÉç Eà’ !â_Ñ9¸ÞAY@˜³ZmÃZóR›�¾ÀG«nB §z�´l®ZŸd�Ë!Á¥‡èùý�¹¯.¿Út‘=--«Ïa©«nB �¢"W³.º°\ç¶Ôìù]€_Ë{¹¯HË&� …ðY'¸¤hvÈ9&tñRq>-q/@“*‰k»-6‰‡ÅÑY<u>ÉžK�ï…ð»—ÔWe™KéhL[û­SIØÉdr Ž—½†8±M7 …ý]³*izŠÙÙ¶ÐBŽ%FùNQ=ì¸fúΧô';�Ëê�º�¨zà»�,|Àõ*÷ŸEÑýçÙqÅ-Ànt?µ á1ü½²ïtÌ:F…ŠpBv2W6³c—…"«fœ ÉQÍÌXOÅêÉsãJ\€l©û®›ÕœÇT‰û2žF*SˆN™@OyÂͶ²;QPÇìÌ´ë"œð‚[R¶Ú'+‚¯ÊU@ k›ö¬.Àª⨯…¦—'ñEKU&¢® Wõµ@|*Èâ*m²Y@‰N®þ(Z¹&uæ:vU$m5O#@“*‰mº)¸:™‡R« õyÚÏN­Ó?¸]ž[–‰À '9Q‚Õ} Yƒ¨€ëbJQ®2)©(PÑ”¬Øê«�öÄ/@¼È…”4¬/šËýιîÞY3ò±õE-P\Û +k¾·CÄÏ}uW•†àÕŠåª Ž[­ù*çGV´@qm7]e0Æùòªª-‚!W«�r2¸RÞ»'t3mQCUV²B"Qû°gvѵ-NHÁa�Á]gë„S?Ö5¼|QCÕS®>",ÇØU²¿-· pS=E8á‹8ÃÛgOõðdk“}Uhë Õi‡@Îî©góƒ{²@aežŽ9_4®ãÒNÕ]z»2Ômn‘ɬ{füòÑâ¨Ï…ç®g¹Œý8y±[F»CÕ›wŒ~¯KíÎ:^üæÌÀ„’ma×r{¶nic°ámˆÝt©DnCüþíã Ôõpσ6h N\´Î?†rQµæ°¢ju¶¤µU•)Ä m÷G¾ù]Óž¿m-;Ú ­"D8¡åt¤Ü*ž�ZÅcUÙíGOœßpYõ}º/-'Šm_ºhåÕ}hµ$rôbµ°zÊb·Q*P׆÷dè„:Æ9hOü(e†ó¶Q?o;  m‚y;ì:¿÷"»ŽÛ{Á®ó‹ÀaÈk²óomc Ü®ËÙ¶;v¡ Zú ׆WÈ’bœï‘6™‡ ¹î µ¶¨±–Èí)ÒR;’ßç@{YßoÃPÏ×çá(Ÿ‘7!Cí¸÷¦¡$®í6„ÐÞ&2ͧ½~uæ§ pjPH±a—}ýß*Rðõq§ú»wN?äîýßêÇn¯iù}9}> O!pÆŒŽÜ�OÞ÷œ ·dº6—ûÑè‹vN…ìXêd£g÷ÃɆ ”�l0ʲ8ZYž!w†…ŽÆ1÷pÚ§Íí0ÒŸ¹X5¨X!ºx�ÂC³ä:²I¾O*z~à§b…@¡…÷´Ìé -ƒ;ÕaϬìYLOš>{²0êë�—NÛù1ƒ^GæLéògJ*Qˆ×ϧàqØœS•Okòc§žõì.ÀNÏÃB �²ÿÔLíª¥9gÿ�æsÎkË‚XÊžeË÷-m…÷¼ÏïÖP\Û ˆáA5�åfÉk…³Ù\¾O[ÓªAWû½Fšš"œØ¦�*6·ëEç°¿Ž…íÁ¥5UQŽ,œA÷¼xƒ¶8ê{Žœ#]zCm3X܌уrÔùZæ(™ Çú¬:ŸŸ/5OÔüº1˜KR�ã];”Šk»±‡û¹„]¬ùiÒñ0ÝÛÕ….ÐB žîÑRÅÏ'=õfQ RT8‹N¥«—äNÖ‡?.zý™XŒ¯ù#ÄÁoI ¨^‘öÙ7³ï«žRø�¸.LRC:Cއ3—TØ`Ï‹´8!åFOÖ’ÉçSŠsªCtÊSó¡Þùõ2«{ç Oh"œ¸¶ÐDÊ¿:àDàx^<•ˆ¹éx‰uñþ�ïO‡ûZO‹"ý4±£Ô FYy„3,-¾ÿü |¾ ô%¤"£ç×c>À-ïÏö<‚z~ípâÚn@ ¦äÉ—/ù<ë\êCXŸÇ¥“*ù*b �¹©P^“Þ¦gÆ&ű(!ÅF øÖ’ÿ;–zªäh|roò„(AÙ3zJ`±–sµßÔ4d§ pÒ$#Nx© )Ÿºƒ�ËÜD€éœ¾«’M½b;€H·e~è¿›Lü`A”Þqæ­Ð;˜ ª§¹ЃµAo:·ÄBSƒ„�ßk qâÚnOë!ÍügP· pÓlNHɹæ[èNTfJQö¥?«(Ÿ!€KÁ¥7èØý�ÝÀà„“-‰Òλtú:µkcŸZÀ¦xPM…@qm7 F¥\è™ñ),NHÁA€G>¶­kñdà3 ˜4*Sˆ×v{Zäþžÿ€ßâ„”™T¼kqOóU(j·C<ó÷•~¬Nã÷“¯U ê/´ŒúÖ2k¼÷H!P\Û ˆ1kÿ¾–Yûs�kÁÚŸyˆüÁ‹…Ü�„‘¼2‹UêÞð¶þaWضÛÓÂú aæãU¢˜W¬D¸›ÝõÓû`£·Ö X«J…4}ªãücd®ã¸ÇÈ ãU™gÁ¤ž¢gÁHCÄÁZψ=X³(aDçÅÉÖ4YÌÛñú“5ˬº¢ˆ�Ö¼ä`Â]'}úu¼ž‹öì.À®9¤(¼ìŽ–{>MÊÀ<Ÿö ed޽,ÑbC;iê¹]ž›žƒ†8ê‹’ò/[9¸—­N"D¹çÅÇ([÷½ê 4KL¢5=%[â5 B€ƒQÉ^Nà�·M3C%gÞfߎÙ噵”Žú`�¤ü«UNîÕª¦Ì(ÍÒH[þöÚ¡.Hº Iq˜´%†iÞÈ ]÷¹z÷ì.ÀN£È#œ�¢S‘íö[èÐv¯®›)U¹7œ¦˜'POD�{ÇŒ�q70¡Äþi�•ªž£ähYr©‡Š°�Þ6�]õá¨Xz6ªºçÆGU[œp’‡:Ú :N¦§!2¬’,P\Û“šüÙUŒs&¢Rü(sCÆ�†@Þ´­iÓ¦£ÔÇéÛNiNà;‡éû¶ïþ�±lO–3mûk|¸�õ΃d¯ÙÞ�)B ÷¶´,üóG·ýü |~{zó&´"-!÷J€€z$E5ÇÆ»{�Sr¢c²ãTÝåÄUudtVp+P½„@!MŠŠz7ü¸¨w$¸‹z'´Ô˜“ú`5òB¬ß8­m©rì�‘Ooëk-[¯Ú �âÚn@ŒŒ`2üø&$<ˆ`¢´å£»ImqÑÝP[ÞžÎIèòŽ²š† µrjP±B µ:õ§/9„>C}†‰ ú¼3Ÿ?×PxˆÜž @qm7Œj†`.þ°ç÷CÀ¥ …\Êòaͤ²¸ÀfNYÃVÂjs`äò jµ b…@ ŠTÚÑÝŽú¨k�…@áEu´|@5)P�„ã Ù X—È sŒ UóëMJ+yùXI*Ä wéHõñÙ¼'® Š#–�¢Ï¼XôSÏîìTªÈ}ócwåÌ ù¾S/Šó‡½,íZšýü}9ùÎv~<Ž&€âÚn@ìÑ-ç7§KZéÖW˜½. †æ– �:…ÚÒ!°åìƒãç¸ÜÓ‡.¯ÇúøzËÅû`ø/@qm7 ¿£ð¹ Èw\2(îE.‰3æ«Æ–35+ ,]¶±^Få�Íﱺ«(®íÄØý<æ¯}yi‹ з@qm7 ÆŽÁäæJë™OR~‚'¶‰€ÃYìc9Þ/hœ»²Z§úˆÝôön0÷Ôð(´¨9ž.ûÑcþ{ÙÚñ WED8î ñ¬7ä |éGGæñÃ+ƒÛô°˜’õÌeçÖ^ùU²]•ë–"ÂáE2\áÛ…YOœ_{Zõ}8=`¤:¿ÄT‘•³ËUC*oÆýM;É`$°0±M˜?ôc9èÌškOqÜИ¡Š⨡€vOüçe�BJ žï‡;T¿ß®éâ­-÷N &ʘ_fÖR‡ßbmCvcŒ“4 ÃŒ6 ‡Nppwžz.žÖ±Ûô0YSQ=…@Î`TeæÃŽž›NHÑáaüQb…²Bשòqä°X]Å@(–#Æõ ƒ±=øÙ6ºsr�|Ž»ãkØ~öÍ” RE8´tú„.!rün m§šÑ|AÍÆ„ë4G•¼ët@!Ï=r }î]P»s �…ógФÌZ&gbïnè¹¥š…‰m 5{_¸ý�¶�õÒÚÙx(�Î �8BÈWù %@Ósû!dÈ…=ÖÓ2i‡Ó«P§' ׆õT^ì”Ðó¼ï¯ê®>¥y¡�Bœ¸¶ÛÓbŸJôì~x*a�Ü7ûÎÊ™c¶î2ÐU`´O T¢'¶é¤Èw=3þ�„Å '8ŠpÍ[2l?šn]MAûB…Špb›n@Š}&ÑsãŸIXœp’Ãw7%TýýnÀ½�¶ÏÔÛ»›ï8ø>Ú¿xç’÷Üø‡ä'œä™UçY/»·ùÉÜ?�°±U’ï(ðB¿çæ^#ôœØç%ŒÌ_µ’ofê½ãüE1(®íI=ñ‹Ÿ„/¯@“­k"òÅ�Šk»±kq¾?T,‚!ݹ›Æ.ëßZß-¸öEˆ ñÿ¼„{†Ðóûá‚r_ ç³xÁâߨTÔJ‡y¬_´eœ£ùj-P×mW„*U„ÃqÝpu¹é¾ã‰;â ® Å'´œŽ’M&EàB“‘>¬º§þC(¹r߈£o¶rE”&²³-ßÒW—œ«lÚ ñöDã;NlÓ H=¼/Œ`^Ú]1;N�œ¢\Ø6©(&n) T>Ë"ä� Ú&÷웢"ŽK¶´Ø¸d‹cã’=?J�ð!Ç^ÎêÞa±>¤Üê@{/Âá�r¨O™ÛÑæ#£ LX)Ý�:+à5``ÂÙ“Í!”{kÒ£½ª³-}”Ñìc›UßAÒ7ÜžŠ@".ò˜ãÍ;þq|zψ�O·8ê[¢øKÜÔY« §Î<êaP=NµÑͪ ¯ qm7 ôð†'Äù¯o.%dÈ©2Ö’‹Éf´DÅd#-ÙÑ´•¡Kž6*eýæÜD A8ú“\ '¯“Ml_È:Nà¤6áäÿIj¯xå|*Õ{ö\è7ùíTä÷¿ [§¿ŸJLô@Åy÷ß̇y[¥ö‡»‡è‚ÀßÀ¨LñÅ}›coÆÌ½"¥æ€âÚn@¬üjÒóþ\@þ€¢:­«Å„8xa…zЪÔЦ»Âá¸ïC×.i<”7pÓØžl�½tjÃè; Eðøë+æªÓðb¯:L8±ásÖbKg o1Vy«¬o5¿¢¸�Óf”QÿqzìÎ:íá¡MGá³N É�å}0ûá ¯C %ó�ÂKÒô1Ÿuý7¬9|jjܰœ™Àt¤áØÔãÄ6Ý€TùÑš¥I¿Úó ¼ü«mˇ"iH.¹œÁåi bœ¸6('°Ù!©hϨ¹IÞs»·"Tˆã¾X©½”®Nžq®qL¤'®íI„½ ¬´ºÁºÈ uÓVç¦<Wyb Ö‡%†ûÇ[dZ…e=Ç/fü ’îÿÿ‹ùÚO í×»mã-ØÙCß!¼Yœ��‹V稩—ÓJ»}Ì'» °ScŠppØxÉý)Ìp %ýõžÖÏš~Ö0»<3ÕSˆNpsÔ™»7§,ß—¥>3¬.Àª™wRn¿_ÎòBuÚ·–ÎØ°+R•¥¤ï�lÛP ì–ì¼xpôc\%"FTì,(g9ælÝYÛç’£sxgé€âÚžœe¬¤1?7>u}w̤’H\ð¨„Ìžr€úXNLÊ�C ,Hý½¶µ+ç‰P\Û“/2Q6ÊÛ…êŠ`ÇYìŒì¸¤�‘жíÉÙ5þQB§S§/Ú�“¹€“Q¡B � yÈ%'UO°ù¯z•ŽÛ¸©EE8á%ÕéÍUe ú�³}T¦!­Ÿ¶<$s‰€»Åq\u罜ïÍ„.ÆCn‘€±ž ð³mOžÉ¥1sy…ìA÷ò z&£—¦¬=“#Fy&‡b=`Çõ3qÖj�xsw@!ŠìjÏ!Ái�µÖò"Þe:vª«Ç8��ðNã°æÈ�¤ó3KN{'‡×FûUóÅüÒ…T¸p#„÷ü´¿þŸ¾õW6µ2å¬[�ºŽ¸@G´ñö&\—úD£V :†±9=×yc.&rêðØÞ><ÂÎsÄXo9e-æs¼YO×ioi�âÚž¼eìÜ×°.¨Á¶=¹ÂÒMçð–î€Bö4ˆTós¡âU‡öÑÎ79~Ú‡!:' <1 7z:œ�’ƒmË8Ž9ÑLòh{Žî¸-» °SME8á$G«»œéÈ´Ë5ßí¸]ž›**Ä '9X®êáÎ’%åvÌ.ÀLe �BJÎxЩ"[Ö×*˜ó (®íɃ2£/ç(J8ky[vôY ¸¶§Ñgu£¼ŠP ;N£Üð›FõpûþÛð38±MOÃ/¶ô±DüŸÛz�³t ×F[zˆr P5Ü(e¢¾J9ª´ê™ò3•B|ËïSS˦iœ¬RÞ“_×vb{ã¥l 3nzÍü.ÀO•…ÞÑš–\ˆ!�‡£^ò°BX ¸6,격¼ Iž~®GՆ߸©�ÜWSÃÒû=•!䵤æI‡À1þ-?H``b›0°6šN½CXK-Jè /(‚1û`*{QdÞe5;w~°gßd �ØZbœ´(Özn”6ÁÖ$‹V'MQÄ FnÐcûoÞÕÓ–¦M\ÿY ¸¶'�Æ¿šÆeоù¼ Éû³ÄÈË… ¡ýeÚ\�Y ¸6Üc̯¼âU5y¦¹"¿Ë/”†zWÊÎ(® ÏhR�q¾/T[C®c�!%·’�.ö¤Úzr˜c� ¡%?潜^Þþ(Šk»1܇1ÎwŽ*‹`Èöô2×3±éy�-[�ˆ†&AŒÂc§£û*ÀЃÍpꞆ™�Æ–¡®!÷š ²^M=!2KŒdG2Ï�ë[hÎG¹‘΃s~e½bšX!�2KŒû=¦y¦ca—­z½œíz*¤Ë¾».>z5¼ ;Šk»±ÇÅG€ó}Ñ!C®c¡¶fëvÓï n^ÚÅD¯˜¦­(®íÄʯFýĹösGú¤uäG )$7¾’¸e·ºÑ¦Ç—ŠkÃuV. ¼«î¦²ìTS[Ý’ŽøƒËà„“õVldŽ›ª…2NBr0·æ·Yòäÿ4®rUåb�%EE*âqe‰±ª²8VUžŸm{P0ë~ ÷`‡¿E ©K¨% 2ß§W ʳ 0S�¾£€£C2{*›FïóÔB${ ׆…@}ãÒofõóç >Ãõ”%†{j=J°Ä>îùâvj¸€t˜…@®3ÒÚŽ:–¶H$…°@qmXØe[¹¯ÝÓæ¤žûõü.ÀO»,r_]~µæ„_‰Öð¾£~ꪛ(¤¨Ènr-àŒæšY*Û[9ךÆ6eìK¹ÚÊ´_=ãĵݞ–@Rù9MöÃ^Sz‘"Xœ¸6(˜µö³ìÔ¶sÉ'l·ãvn*Tä>m suàÒ£K;øê¹]€›ÚqRthB{y㙋aœ Ñó»?ÕU^xG+'Ùø´ N‚%}æ ¬çÐÏíXj6Ã貌Š01ŠøPd7‡Þ{ìÃÑVÙçü×Pê•{ÞM '¶é¤ptÌ9–üuÙ«éûÃíòÜŠL1N8ÉÑDqš¾.¿:×pž%±Ç–ŒPS÷š¦B ¸¶#u5•·µñŠêAÒ7<¨ÈYvü †�ÊB|8!q£„S¼îÆNÍ'——KõV±ïŠ t…Š…ìW4{¬úNþ•ÀÖ ?¶Õ…@!ãzn?¸ Rtð oÌ/¤æÏ,¶Þ¢ÜW±B 4*à/8WÐóûÁX �Âs?4+àÇî ·ã Ø±J…ÐA•Ôº¥>V½këù]€ŸŽÂ(¬ðÓ …î·óúët3åÉœ¿b˧Í5©EŒƒª±´8÷dQ¬wòÜLÓ“o":Ëh€ï,äºgh4cbγ«9 ¿ ðÓþ �B �Bž“G-¦·½`» °SeE8!EÏ�ƪ¢AÇÁºhºžÉ˜¨‚˜pâºüý.ç¿S Yç€R ªs@X‘…±FäÙ™&lB_z T\ º‹,¸€:ÌçýÉarÙŸoSËÞ±»;* '¹_–œ{IíÿA¸cuyV:¾"˜pRÛ¤…9„/§—:†šâ¨çtNmùŽNh®Ól5 º×| ®ÄG¨&P)ƒÓY*i*ª'â-‰,(ÂÙ*):oÎih·ålÄs dn™Î—ètÒáĵ݀Ì…Ã|·¨ª~\ƒ$iãX2©mÉÍVÜéà:P¡"œpêDŠZµɱµdòÃVRÕîC{]˜v>…rÚ=¿BCœ¸¶ÛÓÂ9+M6º­ëË5Gæ>L-s|¾1ÈŸv¾§•%®í¶”Hk²EdhkòÕg¸â:\Ý?òÈÂ9ÜÐãJ猚—t›çZÅÚØïå$hÚ �ƒ¯°C�=_Ї|\E4üΦ­·XßÍÑ*¥Éq×p2¸ë�ïx+®kÑÜ’ór–b2s«VÒ�ò Œò6ò �.ƒ3q[.‰6q_g‰+"Å“¯ÆDÚWŽ YU\¶Ê›Y·Š³,®r•7_‰´,®.²,ç¥LrÑž×x©¦¾£„”MÅã¤UxÖáeŠ}UËLuô%ŒÌhÜMƒŽ×¼-Õ]|Ï鲜T=!JH™!_¶ŠaÏÕ¬2ìA‚¨i:JBçmijìy]€—Šḯ}ȼëJ9uìŠP\ý*ƒ$9ª^E(ÊÂXEyv\Q2¤¨iÓíUZ¹×T¾¤–Q� â„VgX¾ÍO*Q÷�+ó‡V¶ó¢çPgù¸Ý'_à“Õ„"œð곤lå/V_1Œ«‰«Rj±ßõ8[¥_þµ  âĵݞÖÃx?Kšóã•ä½çvn*T„Rrª.œùº,œSÕÅ”ž|5aNO\1a¨'gQ®’[ÇíÜTOL8¹Ñ÷²j�§_­OÛLI:)ĉk»=-Üw®ÆYÏíÜŠP!NHÉ9MÍ»åÊáyÓš²8qmš5—�ÊÌU¶³:P¡"œ°ê\Ki¢´¶ =íËÓÖ¾ qBËéHùblœ\16$‚-ÖÓ¾m!Âqß.B²ý”"X5m-4ˬ9›ï8ê{ñJ#�´R«*—×™›•p»<7USˆZrGÊ•¨ã$`JÔ9þ°ÀáR¶Bk¬U-×>«Äõ¼›@ßQò?W&Î’AF³MµrÚÞ–à=ŸËò)²Ä(!%v„|¡8†=W&ΰ‡%¿«ÐY�Êé�5§žŽ)³GñF¥ÃZ‹\yº^ëÐz(rïï }‘´íP Æš”©gAâÚîÿùzp~}ðã‹jwŒâŠƒ°\‘«µÏZZ9'©‹¨JW'®íö´¨ùÂwÚ? q¢†Ø¥äù:�Ž!m(”´)GåËj©HNlÓ H!oë«Qõ¼.ÏKû)Ä '74žU÷ ë4cWYërü›PNlÓ HaïsÎõSæf˜=·Ës+2Å8á$wÁ»šiòãuèNÝì!_;úÿŽƒ§nþ¼�;àê¹ñ\'œä0©þ¤Ñ±ù³fÖ29m’Ó,S Ût£t©TÆCÃìòÌJ„PŒNp�ä?­çKq—üꢖøšsyÊéȯT4É¿©?UÔãĵݞ–@R¾'Wʉ€ý¯G.\Xj¸ìš¤·/ôt9ªT1P\Û ˆ¯M è"Už§PXïm×ôÖÃQÓ%\@ *V^£Ž–«EÊÀTƒòÕ zV—gU @Ô·BãYJVë�b~¦<”å¤êùŽF`wW<ìS>ZêÚñ¹,ÕLˆRbGÈ•b¸3µ„ oª�PÏéòœŠ<1ŽúTx<ìGM0˜ˆë‡ø²=¶J�j)Šk»1dÁ¾˜EÏíÜTU!PHÑ©…Æ�v cN ¿¬ü2£Iß—Ñ/|EUFH–¨,‚¦�ãÔôbïdl.{²[¸¨D!PÈUªb´ç-ÇGö<Ãîì´‡B �²Sie ¿"•VÖ ÓÊÆÊr0VY€—&V]Z5ÅÇz>&»uZP±B �*õáþìù-¶ãe�· pÓ �‹ni�T·œdª[/ÄÃN§$ÙXÇêpsöå’ßbZZ¼^‚÷V'Šk»1<èbœWC‹aÈé”ʯè•EæWä”ÅåWŒq´²¸üŠÐwM²Œ¯*(§&i¯|Œš NlÓ H=wóý ¶³ãúö–û`Ÿ"�Ô—" ÿŠNˆÇé%Äóãk©ööpzZ_ÉvjB¡^ M5!P\Û ˆ=d q¾+TYCº_-Ÿg�‚K´æ…àRú.#Sr]…Uƒ‰ÖòJr^Fð;”ÍP¨B„@qm7 ÆýÊ¢vEžÓ—ÿ “<�TC”<ÍK39ž5ëÑ+SÏ鲜TšE|)ô/Ë® �Æ©Mû=¯"�ÉDVDŠ�÷iÍ85ù—'uÖTáÃøÊ&þVÁT "}G ©IGÅ'$ÙsY½0o㨒&kJÃŽÝØ©B÷ÍåWƒž½Œ­bKGû´U/L8)ýñÉZÏVßÉð:V—g¥òD0æ[ÉNò‰¹Nâò$úNb”ärZâò¢Î�~Dgjd,æi´&ß0%óÚŽ£†°™ï½À÷ªL!Phåù,a=õ¢.3š ¥PŒEk‚ËÐè5’{Öëƒax¥štéÙì'«P!�S<Îd7• C™ûzv`§ý…—ÝÑò¹"I!¸d‘^.s]ÏïüŠX1�ûj2E\¾¡+½Öl lŠ8 ×vbxšˆq>Qžö!Á�˺gâQ³:�É_jnG›pÌe£SEE8qm7 Ååë¹]€[‘)‚ '7ÌYVjùþ{k¨üÄcß·v˜¾¬¬o÷å]}.Ɖk»=-¼¥({æõl§žg9¬›ö4/Öå{Ͻ‰ô%®í”²Ežúz}­úætN*͈pÒîõæä]=㨗ï2É••ä{©å�£2Šk»±§ÞÑê4ïD÷=¿ 𫹯Æîzʯ¶¥$gG.ÂûaÕVÒ©sޱç÷ƒc´@!…þyŵôµù@q]—¿º.?5´5Úwœ�ÓLè©;N¼£60ádæl¼zàykÉüI78±MØÀKžA�qnòhy‘­-ÚÜ�vFhâ|‡‰m‚s˃]çèì°êG¼Þe^3è/ }&ì§Z!óý�—Ëri+¡ï ¡¤�'?)êdNÌBì ë¿å¬Õ×WE]F%® è î$†×$™Ÿ|ZíÍïòæ×fÊ'œ)#qºÎ‰4ËÉï¶4ýp�ä€âÚp'Zr:9%1 :9»fWZÆW–Z“Ópo"E8±M7 ¦ŽçZôšçŒ¹nŽ:n—禽â„“­0Î’²¨8ƽu�¾þ:ê+®¬ð’=ÙÃ{›âĵ݀“]Õ©—Ë® z…29ªë|òI®ë¸Ü“¨ëâ,�†Û¸•·8!NHɇÚn°%zÛe¹Ty+±m·§õà+õñã6í¯añi¹°\í¹'Ü pññ‡øiÛåHTßÿ¼ÎÌôo-»×uœêjÒ-TóãÝÌy?*¿D0¸Pµ”S %nùZ½:3î#à5$= NÏEÊ÷ü~ˆ”·@!…GAé&Ê;érß*@;î+Äå{5ú1^þŽÍeÙ¨j"�p↺ã˜S¯-{ŸqH‹–ºÌu$Öª¥É»ìõeƒ ÅW‰"œ¸¶û)¬ß’rÑù¤Tp>¡å¯‚îmä¹€óžÿ{P‡ÁpsKŠú†�ˆªC/¦O¸¼ºóós/ð¹íýÍwœpš£¢ß 7>úÝ‰Ž£ßCMùàwRU\ð;§¬!¯–ʉP+Ü+áJP©"œ� õ³BZåí{ËžÕX©@ßQÂÉ Ÿ¿l¯ ²¤™g�¶«Ç˜÷&P×v;R&^+O¾¢‹ · pS�‹ni™ˆm^׆…€¡øµæ´¶“Ñžßøi¼y侚Œ‚wFÄFÁSfDFÁûoöAÖ¤²¸ k¤,oß1Ž»æLˇ]ƒ>œ=(ÍÕLô4£×´ R…@áUêhùðkR.Û {̾öü~íµ@î«Ñ¡Õ´i|Ó[£ã¡¡qÓôzÚe¢xU¨(®íİ®bœW‚:‚!§QFW.™T‡Œbè—§Ò*vn—禡Ú!NhÉ)MËñ�‚ig–=åÓ¢ikÂvL.ËDƒŸ¿Cˆ|xK0ê†iœ_ÌoNàÔ^¤|C #0 JG~Ô›î9]–“ê&D #sÜQ>Ø8ì(.ÎØu£æËh† òuzó_1ltd4(üÙ÷‘ÿ}=ô_}ù¯VÝ„8á4õ³Õye3èÙÕ]Ȭê( ”ÝÇßRªòñ¾œª¸p_JU‹êmçÞni{\@*UZ¡þW>™ì/.õWÿë5CÆÿršAñ¿öP1‡šŸå¢d˧u˜5h°ÆŒ›¸ÞÝÿ'¶é¤`pòßßžªDÌ8]ÂGá —ô›º;O«Àש8õ4=<²ÄØ�·¾_~y³@��ŒBÞ›òqÓ¤QqqÓȬ|ämÎýœ»b™ê1“�óJPÊp8 Ï+©ª»ã»-· pk¾ã„ÜSòáä¤\8¹" O´7¡lx¢¿AåÄŽƒïjŒjÎl>ý}gqâÚnO‹¸†N^,Ÿœä€–í—{h‹׆õH¸í~Bçݶй8@¥Ð“Àå¬}ÜÚ�©÷�fÞR¡Bv�n¤üPÏ�÷C'¤äh&‰;ݹ˜¶b �…rWà¥ËV/%ÆW¤v�E7+qxØZyØ�/Ÿ¤WÛ0Õ‚¯†Ë¸´™6 /²£å,I!¸K/ÄðOí(ÕJäº\¤Ëçó„o� îÚTÚ¤ÑLBë>Ö<Íæ»/ðÝ*Oä´Ï†Wöü~ˆ¯´@�ƒËPS.l�Õ84e‚b ¶MtÛ½­,‰sEÄÖu&�Suŵ݀\�Å0ß%ª&‚׿‘š\#«&*Žª)Ž‹�IßW.[-7ÆÅÅ:œ¸¶ÐzveÍ0-µDŸ S¼¬ïQàĵݞ–ØõãYl?un’¶)÷ƒÓ8©–"œ�RG!¨ P5‚JÖ©!¨DísßkLís®Ï@íó8&ÖV¨æ"bà Õ(ö»ýøZМýp¥ ‘ý ’Ù‹ÂÇ×èüdwvÚcNHÉÇsÖã€a¯a¼†öåi«ZBœpr¢ºZèõ,Ó† Á:v`§z �Ü7?ôÖw›ã œS� OpÊž9k!‹<{{¡: ”Uæ:‹¬¬Œ:‹©=í ›-?MY6W„z<ÏRþ3ÁkѰáÔ§ùù^G+­ôziã-‰k»­‡ç{y˜’׿5”ÿ“Û¸i0¡å6„@¥J²Ò‹!®‡ã»‰,ˆÃõ*‰ãÐX+ûœ[+mÓiàP©"Õ )ùâʤ\ue/(|Ÿ�ò¤ò®(™a©?š–•‹ÖÂêx�õ(®íÄpwÅ8¯…"Ã�V©£åŠ“20ÅŒ‘¾ ³ï®î4×9 î´y1¥éxYtPkÁNek—ÈŒuÝeëI«R"œØ¦�ÂN8„ùïW™bvœ.5¹Ϥš˜ ÏHM`Pm:d÷µ}‰¯[ÜóoB…@qm7 V~µªÎ_Këžøˆ«IG8!õcÉ]7¨LÔ]ŠzË}°/}Í)Š+}ý/ejS³zr%­™ÒæHK¾,t÷ýøþ"Rˆƒ¶êU ¦ÔeвªéGµ¤/m+\«L!P\Û ˆ�[2P¹çvn*TRtÔ}¾ð²•ÝA¦Tëus5� NlÓ HAQ¾ä´**æÆ•¯WwÓZÏ"Óò·î0}Ñ][iYŵ݀º'KTõ“�£U¹î¸]€[*Ä /¹%eëâ²"øzº\Åb´IÍ[Çunû_ޏãßú*‚‰k»=)xRÃè²ÄŽ¥L¤¦­ÔHß;4OÖiàP™"œpÊDÉWî¹EqåŠ-P è¨`1£*‹£uårµ°ÁL·—grÓr.­\î6—�pf7é¤bëF«²B ¸¶ƒÜW;îÙe©ÈòÎ(PvTà™Ð•…Ѻòü¸‚Ýа]1·ÀPwÚ*¡ù…ï8! á®ë®§óÉîìTUNhÉ%[žšÁ×µfËvûjÔ=õ P/BÄ@îÑBò¨ç>ù ®ÖïJk_Ž*Šk»1lǧnå—s{á:~àWÄŠ�B ”t§iIwä¿Z¥mjiõ€ ¿¦›(®íĆS~9Ü}¡+™níCm9ÂqFÊYQÇì#28áäFjŠÕëmC…"ú…34tS=Ã;D{:Î\ý¹¼‡ÐØ«)'ü§<_}½&pâÚnO‹ÕÕ>•ý^5áte�âÚžtå½À^2C$�µ¸¸YYÍm@n|?h+ÍÃKî�³ �f`¦ªúŽRì=mÇR¯VÓϧűm5"$YÙ~%Å뇚¾ãĵ݀ÖÒVj}%ÑÓÆo|ðžÖXt-±÷ô–ÇÙTÏ@!…‡N}- ô%ÿ[µü¶— Ø‹Êô%¤Ù…ÃÓùeåN kÊÇs~2-6KBÌeËËÞOZœ¸¶?I ´ÔÝå¶ò¨)7Éqf`b›~e{Ù«g ¨öæÝ‘µSe!{$dôÞ {ê?د )*Ü fUî6ŽvŸÚ“¾ãð¾îyíÍoÇ L8)Ánz+Ÿºïl÷›³ËR‰BÞƒ¸µ¢í¹ñ+Z‹Zò­$,J6–6Þ*yo›°MULäFÙ[ë¡çðãÖNd¸Þ²8qmtomš˜x9÷vHÿ`)Šø.8¢“È–Fÿù´H¶]ßüÞw^#{3zð{fùÒ±ûaÙcpÂIN\äK¿œ8´K 2àÂŵ݀ØCÏ¡ñúëØâ~ì]¿�¥Ðp™(®íĸð†žÞ`qBJÎ…7”óÚeoaidlC‡’¾ád° @.ÖDõq¢‚V`ˆÓ™ÅšóÛ5¯Ù_ÜÛè •ç; ^Ûû0 *ºá“ÛЃ„‘D ¬ë_}S°¿­7±*MÃwõ.Ì€[ÛwÜ~XÚœ°‚/ZLm9†¶©v.zÑCK~žùv‡ºhKŠ›Ê,Š�Ê<7ÛÆOei<æ;óe®Ÿ¤.¯�|àð�Ó&]Ñ*×mT¦xqÌl>àÛ-­4´&e¾Þ}„þ×GJ%ªm|ûÃ%®ív”È' =ˆ~°`yõ-7 ôð¶d¨Ñ×s‹£ï>þ¯E8¡õè(¹ |R&(ßK@å{³á‚ò9ÃAAùÎ G]¸�u2cü _î5Òl9€‰mº%¬¥¼aÊ¿ÊEߪU~2»<3í¸&¬ØŽ��Ççàâñ�p@Eºtvª2Å]@š¼£äßPpÏИ‹G¿Ô`LÕ‹é#6¦\6·D㟕pg°•(ÂqV(ˆ” õç$`"ý=ø¢fÔ8×´vkÏ(Üγcÿöqo< -ìRæ!c¦óþàu^ºéüŽ^êž�fÀ°çÞxöÜ>üƒÙ›ðE|©›¬lÓÕV=‚šö²r]ÓêÓ9³©n/z¾ÂÄ6=nÏ-!÷Ø‚ãϼµðüaßÌuK<¾´Øoü;ÞMžï °ï7T¨m¿ÁP»~LJQÜó�µ;çéî£/ûÑ*MˆR}Ž�ÙÁ°çÞuxöæ$ 'LyX÷eè5ç²ktõ:ÔE¸{¨Ðg¨8¾R°Ç"Ì™GLj>ò0(¡$†ÛèIWTãü·?½0Gíø.ÀáGîX„ åè¹ñ¡'¤ä `ö‰å€å\Ú‹=:³&Û¦¢¯0fÈPVÝ3bÍÚ¢„™³¤eÑ]Ýû5gI'®íÁ’¬ŽÒW–=Ô¼¼ºÚäX Q‘"ŒÈñÆÆÝÑõÜøK:‹NrØw‡&Àh>ýÔ”.ûôz 8h^žyþt PâÚn@éa:OÍ5]{îž%~ÌÙÃ0Ô=ÇÞŽh¨³ÛôtööV]°¾ß@û=�9VP‘BÞÓ�#Šlè›®¢[’›ŽøˆëV; /©£eöY´ nFîýΪ§Íï#-Žú>´ßO]%î-euÝšÏµÛ H·ET�0±Mx³ �Ê"˜ÿz)fÇiUmzÿ²-ªÓíé:•¼�ϾÃàžÎP¢ºÍìu¹N‹¶º¨ÃÜ9}$¾a£~r,-<Œ^ë¦ëuõÚ÷Àå{@å qÂõ&£O(ˆ»†ÿW*r;`NCÌ&è‡9è™ñç'¬àÓT7@[[ìºm¸¥­Z‰px#îåtGHC1µ¼òh˜OV`UÏ×õµ)ùí9)·A÷Bp{«žß»+ ä¾'ÌÙô1yˆvØèN1ÁëRÝîŸTª(® oÆÀQ~ˆò:P«&Øq ¥TåÎ5HM1'HOf¤•o]ì�ÛŒö¼ßî'âݨ%†cÝB˜ûþzP³cuí£Y ˜øÇŸÙ¢/S kx½H'÷è(®íi—îãìB˜· ÕÁ�;ò€Ë{}\÷zpãˆØS�vìñ Ä@…ø÷ìø‹Rt.>¨��âãƒ,ŽŠÒ‚šsìN"[ëx0`N²L1  ¸³êÁ0£�N8Á�›Lƒ§¬€ó X6ÔöÀ@… �ܱ¹…íÙñ[X‹RtFU㹪vkø§§%}Ó†€1 %ÁxNZ;ãcûé*NƒÇP‰‡.�ÓÖ©E‰}’¾<évJ÷&¬�n+Ù“æ,Ø_‡?bUÀìÝ� ürµæRÏ)Þ×ךٻÛ�U‰B §qüÞ|\þê—ÔåLÏîì´§"œð¢[R~̉Àí�½ðD¬f¢zm"ݵcÿŽÎüŠ‚ÛSCˆù »_¤ ­�½ÖP´oãê>ôòªâ(a5féø=1ÅžÛ#ÜŽ±£ýÃNÓਯc6u©�î�"¹§38±MO;:Ÿš1„ù½;y‹Øqç0ˆl,7¹2Ãö°§êuÒáð–ÊÒÂ'š8M£-üì“Ù˜©HLþÿĦ·tþ{Ùs÷5þî—Ów÷ëõÀí*;v?l* Žúb˜ïxÕj<„{�m7ŠíÌ7”Ø&¼ãäžu|òâ_uô(ad~H›]§ä4Ÿõ5l·i½þç7­ª¡(® –úW²Ë¤Y[>Þù¯-J\Û (a�³ë«÷\øíé\ÂX¬¶‡Ï%œõdžݳ¢-Û„”S¨\k·Í+†} �0þÁ½¬i›Æ(l½�tÜZlh8޶idÖ¼%¶ /LsY²YÈ�Ê'|¬ÐïÎõD(DÁC·ÏwÛZC™Þ³;÷mhàær¹x؇jÝ.ÚlÐU'Œ:" 6±=/~kq‰�’Óò;ÓvòY$³Ç@=´±æŸýx¢wê èãáO¿Ð�âĵÁ=ˆ¶ Qns¦ZŠ™1Û¼½‡úŽ^‰–”Ÿ!8¸‹€2_E¶fØ¿Ÿ÷D& œž¡„­&ù¯o[½€©ÇÈS³ü™²çÏÌ�ùa08Ê�>¾¢ÑÞŸÿ¶úµ�o¿€oo1Pø‰"Ì¡:Ù´áÆZ‚Ԕʼnk{Дݰ SšyÒo¦­ ï,3•)Âawà‡îàHkmU°ž$÷ì.ÀNÇ^„NrØy[~}—pG½3Ü.ÏMâ„•<ìao®EÂ2XËw”Ò•¹0áæõ,P\‚±á4I•Ù1-0Çõ¶8qmO6ìí%Æy¨ª†¬B½ñÍ[Ž#-¸cÿÁh-N\4Z4ºC˜ïULÌŽêSdAsŽÃ™Ž¼Ç®Ž*9ƒLg~M�JÞÓÅwœØ¦�z0 æ;EÕ³ã:öݤ~ê�ëUpy¨P!N8uB×|æhÿéözô4LcNz™Õãÿõ^„ÛtRØIä½A]MU›&»ŠkÃõVZŽ”ÅSârŽžÑò+bÅ@î«ÑÂzYt'± 5Œø¤ž*b§d‰±^Éâh·är¥¼@¯Þ Xœ�…v5é˜HËÞóÁ]ZvÚƒºK$¹÷'=mÞYœ°r曇C§š¦<ã| ÃM†\˜Æ ö:P¡ˆžá U5è4‘7�ãƒûµö¢b…@Îj¡²Âaù7³¢F’s|–ÖÃ\¹æwIò±œÏc†¶Jô{^1䘳²9L¼P]sØ[YÜVõœ›8!P\Û ˆ‘&¾Íº‡{-&H 78±MÿžsP㡎}ÿɾ-P\Û£}»¹=yŒ³×°µAÏOÅ �B �:pÓÑ: ¯ØNq=ÿ&T„ƒ³œ%Eýˆøˆ8£;nà÷Ì�}‹Ny”H†—o¸Ï¡ÆÄ±ÀàÄ6= ¹0äø†#G9ðõvÜ.ÏMÍ'Ä '9žIòöz?†6ìK?ø;æosú†×vJpÁ¢üÇ·­FÈŽÓ$vÜßûÛ[nsÜ‘�p£€³¦m*‹øý˜þ~1&ÛÄš’¨Û^FŽáÐ@QÚ=Z ¸6ìüAm‹nS¦¥yßd¹¡b vN^tÆ zn¼AYœÐ’G]ìi«ZBË ¥4.d=Ë=õp¶Ù�ñ;$¶‰õ:!È í�˜5ÞLNÅaÙÊë>/M�ùNøø (ûÔDÓMˆ×v[J®æ;ÈuDÕß9Å݉û kïáõ™Îíí“n¦ýãÆ4ÄÁAaIÁѢرä¹Ù6<š‹î?Ÿ¶h N“>J2ûÅ­?~ËMñø÷¢ƒåôZ2C&XɃu;v`§ª �BÊB¸³á•Ë¡÷‘hÏïüÚÐ €B ïÇÞ<©BßKQ¿Ì·§ íÈ>âu>:¢ðëážú i RT`ÜóQîò÷}¬Qêv"±; ÕËw˜Iü†$žc{.ìkQÂÈ ŠG]2�Óƒ÷¼ßçÄßqØŒ--rÌ[=æ=?z½2©.“‡£�î¾?ùŸ¬2D8¡µç(õÎã,PHO„æ®m(—ªû2´…xÇîìÔóE8ïsžÞöso�U~ŽØõeΑ‹_.'Äá)ÂÒ*k“]OAß‹¥³ž‚í¾e?Ë�|¼ýŽe qâÚn@‹\ùìúfê˜Æ6J.},P\ÛÓâ‡XgX}Òë Ø]ÛÓ:ƒ™Ñ;ëøaB78a m¯�"Ò~ÚÆ»¡Ý6w''5Ú{nüh·8î‹ñ!ýVR+$íÕ…ä'¯ ðR‰¾‚„“ÙÕ,Ë=™Ï‚òòc®¾|/g×û6¿–ÍoÖo[PâÚnKéáã;È}¹N'Jý/öú20}k]I0ýbQâÚþ}Ïä7ÌùÅmú·ÍTDÏX”¸6Ø3n’úñ_®ƒ;bD(¡¹œÌåg›¶”ãÃ}]Û�R¯‰¦ž'®í´ ‚J�Û$øP÷Ì.ÀLUá„“©©Î³{š;ê—ôܲPG©É•Ö“Ÿ§¸1P è–§(‹¢5åÙÙ¶']ùÔ{ó£¾ò=·¿iþaþ²8qmóìÀÀuxv­CŸÃÊîiõAôv¶ÑF a�âÚ°Œ?:öò|4§åøÉ#œØ&Þ+¹vX²³½­Ý¼Ç6ÌŠH! »l'7X­ÆƒÁ°o"ƒ9JC �dz>àNÛÈ:³r"Xœ¸6(çO}½/çßO~ÑàÄ6=yEB¼ŠL;N›È~íáio[ý^—×€v^ˆN›¨óÎòŠ<}Ëk/г+BjË{‘ÃJÞ“"ÕÔƒX%YV} ­ cÕ‰ò}DÔû¾]% �B*Ò;ì3¹©U;»9°ŽÛ¸i¿…@áE·´ÆœðÔ–Ÿ„p@qmX”½dÿöü«ij«öžßø•Ä 1�ûjA´Æü´6»ˆ©äÒä…p@qmX�/h8ÿŽü£±þíØ]€�J¹�~pÖg9=Ú§³áz~৆…Òž3®]�öì.ÀN•á„�êÁüž¶$¬Y5­݃(®í©cU�ù…íØÙ¥*‡×ö¤*Ÿ†*Æy%©†œFA¦?–|cúŽ´×À4 } §I¤£iÖÝÁXÞ=«¢ ­düê�)@‰—Ø’aTc1œn<'ÛÆk''*J”t÷Ù—ýl•æ;D8íùŸ¤©¸ø‹ak‰ÝÈž±@qmOZ›GÝKŽs]RXêEˆÈ}#ö5Écfemç˜]¨�ÕöÇš�¬ ©&‰mº©‡aÁ¼ T¦˜§N*9`¯�,™Ðª%dºÏâèþó mÛSšóálþ:j�–Ñg,´JP¡B �E=Øe캻 °Ó �ÂËîhÙ̆´>%"—ò‘Kæhó›ÑÙ}b4Nx�†/Y_Ia—3ÔT•vÙÚ.'@“*Šk»1�´lRCZŸ ‘K=fpìY]€•Já¸ïÍ9[ÔÍ8e¹¥?.¹-µç'œÀ çíVönÛ1·åIÏëò¼T;!N8¹ÑFc©‰BÛ »]š5¨.翃ÀºÐ­d‰eXÏ…Z†Yˆ0Â"­Lê›Î©9�F`¤jùŽF^�¿9m<ŠGÚ÷¼í¸£Ë2RÍ„(!Ev„Ü:ŒáÎ, ojf:†[~Eý‚^v4çûŸQ‰n¯­ØQÖµg[Kôjhfŵ݀Î4œ†ÿ\Wøu¢íù]€ŸvYRx¯«øcœ�´z¨ÊØ8Mùe©)nÙõï4åW󜦸Å<ÐT¼hö†N.š9CG‹fçsµ‚ì:óí¢®‘ún¹@·¨T!PÈ>æÒýöüÊ2šK÷k�…Gé~ eùU4©,n�”åìjÔüÉg»Ã‹h«ƒæÎ ^D{…¢Ç<”{™-ßñímŒ|ð»?íÁ(¼ðŽ–_I“BpKi/Ä×¥tÏæ‡µ´rû2Ÿ¡%_ôý\·¿±Ùe¹MWG¿lnké'®í´ð™GNÐ5ë‚{}áÊù£>9ÈIÌË¥Ò¾|ˆ ¤o¸n³a3¨³› Ÿy�ÊptèYú~üUÚC¹¡9ò®2%üRãXÞU"˜¸¶Û“¨ëmÑ;"�Èc{¨CIßðØCß Ø'òç ˜Käï X=qËå?•�úÎÃÒó¹ÕL„Ndõ¿Y¤ñ}ô3ê5KrÛG-!Ñq»<7ÕPˆNrpð{¿9o§d¡Kávú_+0xiÈ œ4°Cí:í³³ØýšFj-QÔ÷ÆzC;- ݵž–¯A ÁU‚ðBtƒ+ç¯Îï^YÆu/ÞbÍó\�¬:ÖMž(®íÄÐü°®ZKg]ÚµfÏíÜÔvB �¢¿Ö¨UOó¬þú_kîõe�uʲӵ®(® Ïý`C6—ym;KáI¼ ·Ý‘…@¼ ÷»féÜsûaél�BŠÞ—aÏÒkÚ‚Ûà Ѯ†UK!¯ýÒzøçµšW•Ó€R²–xëy]€—ê( -¸§å�|I!¸3_/°žp XþM(b¡©Î#§V £§VÏ�Shì�ܪˆôG̪x£^�×¶¦y¼ÎÛóìÚó~ï  ž]-1v¡fqìBÍó£”Ùöï­ÛNÝ-½Þ<˜ï¿À÷«šB ÐÊô´ì¬L á§sn½,BzF?,B,�û\5çkŽ×-~ý¥+bÁÃ-憶;_Û |’¼&›Û^¶V.HÖ9ÿårëŸ÷>(Šk»±p[Örûa_f�âÚvffZ�W¿žW‰Y6Ó‚‡ÅØh!|7Û†…`VÔiµ”=Å–‹�¿¬¨-P\^Qƒ«ÌæËºªª~h,ú±ñ(Ûær ±¦1ûÓ 38±Mxˆ mšo&A|‡¨†bV\磲A/AÒºe›û*—ÅÑÛåÒ´ŵ݀¼Hˆa®SÚ¸ ÙQ ŽùEU‡íÇ]_ʸ ñ¸³ÄÈqgaô¸óü¸Ų́ô¨Æ‘ƒäv<ôz­4UE88ô,)bèY;ô<+®)￞·q‹N“Ȥå+¶uÝÚv3!ϰ­mE¶Ž^ª“Ïˇ¢¾ãÄ6Ý€ŽÅaezÈ_›²}§GìlÛ h=(j(�¾î¥O�áËBp[ò{ðº4ȃg=†©b ¸¶úª÷ë9¶~Ø×z€°å·üE¬½,NÖsÎϲšX!P\Û ˆ=hëÔ“ž¡$_θôù¤gMÛ-�dö©œGm¹TÏÛIE8±M7 …Uµ× ¨qσµÐ^ó9T²…ó¯^ÓìO¶MÓGÛì–l·®TH!,P\™ö±kTPÞ×¥þ©Û¯ýµ€:‹ûOƒäü{�¼Å8qm·§…�(BY¥4陦�êîôãa`UÑôCŒÛvb½6廦4†Ç¶EîGõFu3¦(¤‹K‚ГYþM¨ØÚ¶ЪÚKvêïãµ³è¼òå½²SˆÎÃUo<YþM(b³m7 ö ª¹œ*¬És¬uÑÕM«˜VU¬(® ÏÑHYáZ Ф"!¶íÄÖG9ð[÷ñE½[]`i¤‹‚(ä: ï§‚õ ཟ ’¶íÄï™­OùçCÝG‘ÎÓàÄ6ý×yjó6ì-t”t�(®íß»Î4HJ°à°ª²®Óâĵý×yÿ6̯Y†r�'®íÁuúuoó:PMÅì(uB›š«9ó• Þ¶[¹ŽYÏõ­¨‡w-†9Ç=Å8n¦é¿L0½~˜`,PHuRLêþ2�¦…dÝ “ŒŠkû/L¢P&ÐÁÿÓc�âÚž&°ï q^ ª-‚!§SjÞK]^Öùiª:—_æ= ×ö0ïQçQû¬‡·ÛÚzä�”Škã�¤bœWC‡!CN§Ð=ŒåÕL>â«Ý«ájhç®Px�†]íÇ“ AØ78¹.KÞ£ˆ¾‡Ùe(®�ï²Ø¹yW­SáY¿¯¹Ü²ÈÀ¬Õ¨Å(ç'� uädÐ?øI ×öè'‰¥Ê¹ägÁiê~[ªXœ¸¶‡ÅC¼õKkí/bË­Ó¹…eÎJ”–¶Ÿ#–'¶‰_Xº/žr²¦Li�ÛãNU(®íqKÉ ñ7s‚úؼ4·CÏÍÚ‘«Û™˜^P‘BÞ™¸…�¿åß„b�[q[Rèàû_«òazXoÛaÜÌ'âõ¶÷ ܤÑóûaÒ°@á…¨§®Bž—ÜTl4w¬-*Á¯ùíl B…@¼æ÷S \˜¹¥MÏï‡5‘ -|¼DñÔU7ÄÚ†tØXNÊór®ƒ_àÛõV3åˆø~ñ;¬äÑKk–)WS(Ô»%òå$x_¡@qm7 ÆýŠ^Î#òŒ}‡%‹ÒMÀÑìÓŠ¼Ü³ç˜:•©ÓÁûLë;NlÓ H=ÜzG0ß m£±£{´,°SÛ˜+ÝÔ¥pùÕ´·ea¯‚÷½m×vbSê¤kïml¡N~×s®úƒ÷æ9FaÒQÂ]uîùmc9PjŸkWõÓ0ä ×â¼Þs|ˆƒs’¥µ4 “Î5IË;^ÒO9…Ê?åꥉ£à‚ÞP¢gSÎkSÖOS[1k3 ÛôïWfæ+Ø…™ûø¾å_/Ëú¾àWe'\·Â5YdzìjÈ›¬iú÷k¡~ý°²@!G$TÔw·A¯AŒ³éþýê£w}?¬>,PH?Ê­>’jóž|]‡�£fõa�âÚðò€™øë}áÏ¿Á‰mâ'þæð|óëÄï• NÒã©Úi ÝÙ†S<¥M¨¨©<¸X—¹½Ré×Xw´KÛÈ­~p›sVçÙèiÕ”6ìGö}óùñD0âU“%Fö …±=èÙÙ¶‡SðPæÉœ´hjGw=s9¥4ME8�½li±feq´Yy†\/Ã)fÐ;?$­“ŧ. … ð'œBMeÖ|Vž¥a2Õs׎Óå9µ“Ñ'œÔÔØ›†YÝÛt´ 5ô,NlÓÓÀ#üy^ßÔG�ûîÜÀÄ6=:s?ì¢Ñ꘩’âAΈ œSøeµ¨×‡ÛÇþ)þ|°0°¤HMÃV¯|Žæ(%9œ¸6RM±zfº©‹ —œñáù¨¾„ËÌk;œ¤|¸Ã‰k£}8�s#\5Eð£¼Eì-S‡—ÝÎøŠW伥ʼnkã½åVö6K¾«W�» °k»ò(¤ìÈ̹’–™ ËÁïü¾sëx;ñ(®íÄà¦*Dy´õSÈŽS(ö›ßûÝ�ªæ8#{¡(eTùx¦lô·sùÁ¨P\Û“QÙ×Óp¦ÎL?:æ×©�uSÓ8årE�;'pÐMYZ¤—²0ÒIyn¦éÁEÅöd¾Ÿ7(^™a{êªÂ4HQ½/Égzåhè½]âœ�Šk{tBý*�òcF5C°ã �×ÎRKkZòáü<}\ÒBð½…ûPÉûØ2Šk»18MÀ|·|åÇõ1]g™ –|‚¶µÏ%\@ -f" ©Ñ‡7ƒæœcÛê¨Üÿ¦Ÿny,P\>B±›ƒgŠñ—•6ž¯½E €øÒR·r=;þVÎâ„”†*v“*Ñ5Ô%'J¾O›²½ŒÖîØc75«ˆOwüwŒÒóûáÅ…žY]&¥çÁœQû/‹KƒÛô´´´×u!ÈÛ´ƒñˆwD¹„d€Å€×á•ôˆs (®íÉ%Àļù â‡%ºà;Øõ)„ƒÁÐo¸qÜÓæÇ¿Å ''¨¾Úב͕µts-P;š'h_Ó ðUî8@‰mº!ì·CØ4Ž£V¼Nýÿ®œG°³m7 …-gØ43Ò|äèíËøZ¨HJE‚¢Âû^ËXNõý�+¤FYWQ¹ôØw�tÿ?•ev4|}e’9WaÙ kv/š9;m€�§½M¬(°€°%ÆýŠ.­ŒÈ3Dõ§ç|C?íù)ø«\ûÇ7_à›Uª(¤ÁÑðœÅêÓW33ÉYζ µ,vòXSæ¿Z­¸ÁÄ6Ý€¶¡\>ÿ*Í$•vÇìòÌŠD!L(±ýÎhXW�K«m½­ykWòÃkZüIáĵ݀ÖRúë2©·Ô/é¸]€[‘)‚ '·Ÿ¼¶Q‹×¿2i^ìï•ï±gÞ qâÚnOëAI�íY]€•Jô$´Ìß�8Åzþ® 3ݳýíYäe«¹Õ�Oüœ…T˜„ýa?�qóDÏë‡yÂ…Íæ%À#yÚ¥æ¡6¾÷¾W¥ �B:rTÇüÈÝ™~4çç·cwv:qD8¡E?ÇZÇw«)€flU{]�†@¬KŒœR-ŒžR=?Ûö4¥‚þ:´š[Z4ÜgO\N-Mª'¨S-)êG¬Å âL—‚Yt/jµÀÌ÷^þ{Û‚5À §;ØU¥$t©èÙÆHÇîìTS!PxÙ­sÓÚÂi R †Âŵ= ázuÌÏÇöÞµÌÙî€âÚžFœïÅ•¼ª‡œ:(®íѾÃ_ùOTMpä }¡)3îFÿÑ*ÕÿŒÝ‘WùÇ–b2ðŠZ´`ãÇ î¬ôí� ¸¶ã~å†j†"ÏŒ209åÈìüö1Áµ†„ùæ |sPPH¢rs9‚l˜7‰B ¸¶ƒzÚNõnZÙ¯ŸíN¦í�¿€àºØïˆ¨•ë'~ÙÚ�„�—™n÷Uh+IOO·(® χhãüòX•D0d×ÚǨ'yɉmžØÜDªº �pb³2á… 7Þ 9 ÷ÍøÐ7•Þ¿´G8œ9g…¡£÷Ó–®ˆ‚›©(&έ˜ÈjâÌŠÉëÔ]çf²î:˜IˆõnÒekÔS“.ªQLoã°–Ø‚m›~›ÞP\ÛÓôæ’TÆ0ß+ª'‚×Åàú¹Df§ÚPš4j×Z´Ûh¥©*Šk»1ã|ר®†\?3U�Y±U)³‚Uc³5ê9³"kÔ#³"®ìÇq×®Yƺká.íN\Û�/î}¹QÓÊìËô7acw¥*µ#´uPö’²uPg“³u²Î&´uÖ4h"É=ý[Q�. ƒ6ý}Ç §N0?hZ›-o–÷6_|p»<·6Ï8a%÷¤|½ON®Ü§¡-R†×(+õøÒšúø,™Ð{ÖïQö'®í´p?�¥ˆÂgZþŽÝØé(‹pÂInÊEÇŸá{Cå!¾ŸëZÊÙj³¬/òUj¹¼Qq]7àÉں̀•u)CòµšIKâj5ÿ [òõcI[âêÇ"[ŠKíz/@–ÚåÜ(µûÏÐT4i)•eM°J´ë� ô†J…ìÚ¸¤mÏ+‹D–´µ@�‚ƒ’¶ßä+Ù’ âJÙzÕ=e�DòC§<ûîË Q«¼ä®W혵*O„ÛtR)ùº±¤\ÝX/Š…M /õŽ×;©¤Ü’x;ÛˤÜRi"G¯O=ŵ݀^ZÏõYvNïÛŒòƒÝØ5kþŽZôêÞ‰›æ]ºŸ/�sÖz%g†7ÅD8qm7 …»kÖW<9ûjÅ-“>aËïzªb�Ç!okšbB ¸¶Ó�5÷.e¿§#‡Õé÷{‹U‘B 7n,hÖÃwùÇdyåT,QÔ#A+Šk»1FS}Mè4e�âÚþ‹¦|±fRS\±f¯)dêˤ‡bóÒöî=¿ ð+bÅ@!…•ÇæQæŽ×±JÏîìTY!PHÙ9eùz²¤²¸‚²HYLñ]¯-²ø.§-$|òµZlmi®ÒH)oV>|æ©Ãy^>#1P\Û ˆáã÷gÕкŒ`hÛn@ wÙ²–�\Wu|Í_j¸€T¬Èu<Œ'&+ÀÛ¾ÃͶ݀؃²†²ÍÅÝÚ,Ðͳ˜gU¬(ä¤ î›âÅ…àmðáªÄ¶Ý€ØÃ<³já–c3›¬w’M»TR©"µZÚ —§–ý{ê ×µ¶íÄ_ç:–1ŒÆ®/FÞž@�ÎÕW6ç~¶íÄ3$•“¸ñh'q~cµÐR¤@®/°Ùlƹ-åßÌÆŵñ[›þð"(¤¾P´P,¼ç§ôÿôÕvúß*Ö¿t$¾c}ÀÞz–›ëmœZÅC¿•²ÎM»0r.öá#òßV€·aÅ~ßO¤–÷+zžFäý�îZ^³{ÍŸæ6sf6TµD0f:~è©pÑcÙ¿'Qfµä6R–ØÃ…Æ©uDÞGgnc—pÚyîcüj�Z¡÷Ìè%º… -w´hö´ÛŠ+ZlSbz{N®©äÛ‡æÚúåÿå¸7‘B ¸6¼—xØ&äóü\_z¨×e‡ë%xï ¸¶ÃF�~_>'¹úéÕÉü.À¯]‡@á…w´|ÚJR.o¥‚Ëœ×ó»¿¶„ €ÜWkLÕGHÕº«ëZ†6$·£¸®ùL�³I¤YU“›{o/B ¸¶ƒ§)ëª�üN=é3´ÚÌ}*U×vbÈ l³ž¯¦}c³¼ŽÛ¸éÒ( ):—v´çW6 \ÚQ (u-6µ¢Æ=» °k;Èï8¡Ew¤|iN®´�D¡l»^,æä›Š²)b;îM¢%¶éö„Ê@k7ƒï�¶j½ûwfÒOV—g¥£,@ %3‘¯Ö|›®Ö}:Õ©”~| JA\  "w3X ^/ÇÖÖ_³ 0+"…8¡åv”\^vV*/;"L`ox]€W)r_Œ—�Ç©êÌøk­¥Q.ï*ä]xUÓw”ô 7 ƒ'Õä?]¥‰XqJäÔÓçÈÿAC(®íIO>Z" �Ϻ–<Ñ½ŠŒæÝ’|Æ^‡X'A+Šk»18ÏŸKÎ50-¹ê|ÍIÞ±»;5ñ(ÿ�²û®P!ˆ�¦ûÕ~Ð4¬ù¥N1·jÊœ&P\Öª3®uBÙj�W_2'9ØRB8o‹_ç1PP]G ™ cë°~¶í†uXˆ(F]Å…T(¨.4N:ûæBEÙb1Ž›ö_„Rr¦JÏí¢K Xœp‚£šäI‰5Œ¯R|¶XŒe¦jŠ`ÂÉ Ìi×Éx_Ó³�Gzîopp±´°»ŽPl•Ï�R%,&z6«“¦(Â%ïˆaM…0vNü¸Nv{ý¬ÐRG1ÿ[g¢nò¸ÀäÑ^䦰‡9¦<�-�÷O}Sq*i$¿�AŒ‚ó^O‰s™ÓœS%2Ô#-ÒeZœ¸¶'—Iø§Ôõêý�œ„™öO&®íÁ?�~;Ô±¦×ÉyËMeŠpÐxÁ ŸixÑ>Óá„“›rP½ ²ÞÉn×ðä—B`†ïPÈ1 UTj‘$ϱÿÍkÓìYqÃÔ&– šX!P\Û ˆaŽ\4%á–zrnø]€ŸŠ…ÞÓÏR?qÉùñÇ_„°@qmX°„‹aeÄn:}¿GÃu˜¡õà�¶Ò«¹xÓZ«v:¸€TªÈõ„@ZSšÒó�ÒbüEƒÛ„%Û¥qQCË·MZqsZTÁ9|b¯ì'û&S×vbxÔç‡ÏùWù¢©â:~àWÄŠ� ïhå§�‡è+XV ׆…@¦ì§äy,sMú*]>ºÕ…JáÄ6=.TÖ¿)§›Ç”·Åù c¦šd.›ãž¾%?»|e¾#€âÚn@ìÁhBcsG¥"Œ”„~RÍóð¾-U—[Y:íiétÔ‡®rË+Åc×vB�*š]æšýƒ×x5õ| !0vÈÝ ¥‚ò¬[‡·]f½Tó%®íiÁ®kéAÄœ3øAD¹âa+¶ÏõŸõÄ'¶‰÷Ããøwtެwmð¯*S„ÃþÕûjh:ÑÀ¯@Û†'Z:˜&¼˜…ËÔbìÓ–ÖûúZ85\?¬‹žlÅ‹ ïä_P\Û ˆQ£Ì4P£Œ:e€£,´:¿šR¥ÄÖÊ­Ì`W-¥B| >Ì›ìŒZÏ­Fæ�Ëf¸åË®—HJ\Ûí)QÉýL6Ï|Äe÷s@!Sƒyìr]F-Ýt´lƒL; ÛtJ(ö-—mÛ¶£¦�q ý‹Y‡8±M÷Cm€m/ÙË·ch z}ñ¥.i~ᣄI¿Ïå±ï™]|{ ä¾7ÿj^óÜ?¥‘•×fùWS¹ŸM-[=Væ=Gõ¦–—1J\Ûm)埤9>×6<’×Ò‘0ŒZôìH“­ÞZ i^ɵ�ùÔ3£"A ×vbåWs6Ÿ#mØÎú£ŽøˆB÷…0ázN5ža ^5œó´gÝ¥5ÿ®ÖÚño2…8qm·§%�T’¸(o¬‰9I LlÓÿ\6íç«öbOùò”•£¾ Ùœ�ºØïü"þÉíÜÔZ#õ½ÐÝ9Oö¡¸Z¬çvynª§'œäÈzí§L§Ú|~µpÕu&®í¡ë5yGÇ©‰su@MÞžB˜WAŠ`Gi)*-Jò‚ð\ÿf�p{ \@*S„R›¾VÀ\ÞºÁ«ï˜]nFjÓT„$·%EªÉÂX5yvÜüêëõÌiᥓky¶;ë^MEß0b›n@uXr=¡º‰yQ�©frhù§4„n,H\Û“vœ{œ­L¾�­†ñ›ÕX©4_ABÈ‹<�·´eÕYç•ý’ZÿY”¸6°þó†³,ùösÈ¥íëèP“X[áße+îKì†8qm7 ck œí�·šB†¶íÄà¦ÜW—_Æ¿õÿX{—Xr]Kl~¾¢†íx;Þ�©€Í ølŒFDöÄþ|K¢”™âb$WÖmÔ`ïÒÎE2(J¢(ŠÊ“kÒò¢R­“Jû ÷;x!N ívhùû¼g:« Eð³m7Òòçê\ƒ5_÷6tì«÷F+M¨'Ðv#-ï䟽ï™]³"SˆRpgÖÞuÏz.Í\­!ösNsE�“7ìz^? ; RpÎÂç’ ›(Í͹å,ÜâÚ,V·„ó¡**fFM­Îåš!W9ÎSýðzÐŒ œwT¦'ÜÆÍ=7~°8á$÷¶Jõ]¿ãÈ6®oké|øŽs}[ôÉ ç­gE;o&œÔŽŽ¦¹º ïíD‰¦­�½¨L!Ð�YbåWõõÃ}k¬:éÝöggÜþ£W äºâa÷¸”ù+¿jZ๔.N›‹¹MMvGß"\P í1<´º¨Â2œØ&_wo6•õ`ÏѰ£€røpOøº¬õü›P!P ívˆq¿‚OÖ  E�PŸ³ùYíÒéudÒñå|± …T.f9Ï>ÿæõ°™Ó[Û¬”“¯ÎŠq~7Z¾ …0¶ó€›izè:t¬seÍÜãËPÓÄú>¹@#M¤'nÿZZ¤=YmOÈ�ëa´§u+ ûROŽrÚµÏÕ¼?ÕѤù‚�¾áF~w}Ç`/èü0b{Óþh;ÕÀŽÌä#Ýÿ?™Gй롳C›þâ¾° �¶E…?ê¿Pg†p (o2Ée^Ëd½·uìã+/ç+Ušï(a”åŒÙ}Ұݸ´ôמQI[JµÌlTïì…(®Ô–«#‹£Õ„ mÛ“²¬?º•kå…ö¶ê•p9JhkSR£N~äÞÀërx©HßQBJí9¢˜¸žºÏ–æV0é�%Ðv[JÆ´æPÃvuˆöYŽ0o0�¶Û!åîB÷Y+=¿^)î˜]3sLX©�ÎQƒÂóë´‚ÀÚ|!¼Eò¨aáwçöü.‡Ÿ¦ò†@î«Ý´ùý¨ûçõõ5C9|�fÍ=ÿ¦«'¶évHyóPÂïW‰bfœ.)-g)C™¦Þ¥£Õd�mOŠÂÕ-Jß¶ü›PLÚwßv;´ü슇:P3'r åòèÏU œ�c}€M¤·@�6_§è4½Ãír¸é¥•(¤è¦hàpÅ+ߦ¥.TpÓ¯©H!PÈûHÄåÃ�¾Ü8!%¯Ãn¨â¬ê`ed5B-’œ·µÕ/1›Tœ'Ðv#­‡=ó¬éPÓöçÉÕí|jÝ�D ßÍ5Î9ãLvœ~ð% N8¡½ýûwç ½DUPä’Φã" gIћ؅gQöhYâ#œ…ÇÔÌ9KÇì‡cƒNn´éñœÏ?gˆGÎÂÊóÜxæ@~m;Gò<7ž9—†Ë‘Ü÷³Ú5h»bžËÍàÒoæ|Ð6¹0úÞÄbÚ¶Û!–•ìlʧ±y�¾»¿J¿Ñ£‚#ñ=æ&D h»b¾{ê?h¹ot†zúÑ‘ȧ#+òÉl,;•*rí[sŽxíú«r¢où]¿"V Rxך·|O2áV­ cù]?ÕVZxìé}LÞ[CÓ iÍ(Ðæ[³×e1.ýf©&9åßV±†¶ívˆ‘ö½•ô™`ß(Ðödߌ!m[ñÖ�4j‡ýC²@�6ß�¼>Œq¨5-‚!§SO[ÉiÉ*��öͽ.G *U„^£aGãhR ᆦ×a‡f«™Ë莊ô›%�†éÈÕ‘_Ún‡ºG uêéyr¡†ùa‚êù·™ ú”%ÆNPGOPÈ�Ó¨gÜû^'¶Eïà{3T¯˜&Vô ×ã~E›·GžéXn>ê?ú‡ùÈ…Ö`êFu�——{sµ¥®ý¹E¥&Åž?)Z÷Íc¬Ììe†?«F?Ù];UU„Vò¼§<»5¦§}!íæ8¡å¬WЦS 1%˜àæ £¶^�91´Úß2„@�¶Û!æKz̯Dݶ`q]a�mO�qè)ô‘—·ΰÔuy �Ü7>L¹¡­M7”êû¶Û!Æi0ýf}íJ¦×”Ë©G°%öàQt¿Ê¸sÓ…môöpúÍ¡ Û:~Äb @Ûíó»ìÌOÚ$ØÜ¼û5È®Hâ„õÞÿ¡¿ N89�ÝÍ©éGΡ¹a¦Z qÔ?XŒÝžÝƒÞ…”�ôÇñšn×õ—Ao�mþ wzðØt Ë¡Áùa­°ìTY!Ð_+Pvw_u5œöæÌöü.‡Ÿ*+ /<ÐêÈ„°@n™ö é˜uzo ç–ßå|t› ÿÕ¨AÊ�NÍd9ò}†ýC²@�¶'Cr” å*1ž¸)ƒÛ7ŸS9šÈ›µºß!÷Í(Ðö´ovV¹C *¬[shÎA‹=䪸zÊ9 º—Z¥÷2Ún‡˜¯­‡jP±†¶Íש·ø…®„ÕK“ŠðAlÛíóü™ô5›Êž¾¦z¸”hó… Ü¥DhÑ;ëúu„»„8�6ß]rK[…8T‚å 9�>T‚�ºÕÍcŸ´…8�¶Š™6ÏS÷™§Þ1¤gMƒÛÄÏ™! 5 ŠŠÙqÚt =\—@mø…ë©N\ÖÏ¥Þ>=^áNΰ@�¶'À鮇+½ª†`ȹ n‡MµÊÔÐD¯†ËQƒŠ¹Îx˜›L Eü²J$ç>y7¼½ŒÕpúÀZ¥Š§v²‡Ëðv`NÃ8Õ€åö9i‡@o~DbܯH=øäû6_ÄŒè•!`fD¶ Á?›ÑÔ¸‘+Bà̈Ìd„…LÉɈ«€úO'#,eJNF\ Tz2jí³M‹ªX~—ÃOÍ= )|šIÏ\5%“j¹JñË!®«Z„^Ð’Â~äÁ¸µ¾/ cí²púÉ®;Œ�­Ph»-!OD¯8,Õ lyXׂ 6ªÕ&]–醇‚°6?0Жym+åw�w ·Cæa´Ìê÷Õ»üìÿËéæ+ˆ2¾:”Ja˜œþª÷Ù?_H¸Mß@BˆçåIjRÚjoKQl.˦Ùêwñ‘nÒbG˜ÏÑ40Aý ÍÐD½³”•²Ef½ÊÆXŠÊÚ]y‹™ÄüÚ[Á€ñjoÅ#†-½…bǖ땘 -—­/e,צc—øJñ³£37ç¬Ïí5FÚpßaÌ(ñ-yÓ¢ÛXR¸-« Y©~"˜°RJ¤k’}Ÿä|‹2_áUÙ!>ž­±o¯|Œ‹VÛ›óó»·et9ŒTŒúR®ŠMÇŠ/bc`â í•° ÔƒeZ8ýpUZ< a•–i(û“4MmX®¨/c»ëaj娆”@Û�”üûU! ºC•sc:Ö+Ðtèž®‘ýøôZé««M£úù†G�Xá†é,,¨ÃtWMÇë,¸£—_¬)7�÷6g|ù_Þ®y|ÃH¬>·�ÿZjí¯këþžÍeÙüýo$¤¼––"˜så„ óØ`±Â*c²\}UÏl1L|2+…ŸNÈŒ÷ÉjùºìTÔ�K. “ ý]b¹ë™¦ž'Ðv#-êGh ª†8aUn�µ®ÃkCÜðå|° …×^X;‹6®&·gäXŽ „,ƒÅYªrJ¼…(Úf¸ºX®ÕÀ+ g±µTg (¥ áÄ5,,žÅY2Vë"-™«Ö…½ìÕ.Ìi4e,�z§…ËÑ‚Î;N8…ºªÚu?¾ú²_­ÒD aÔG]]ïX‘7× F<‰áÞ:¡S¾ŠÐKTºŠÐHNþ.j\š÷ ÷çÍ÷¶Åì;̽>šÃ•lK!�·¥ ÀF2Ò> PB‹la(†=W Ø? çµî.j}^¬õÉþ= ˜_ª'E–7èAt}ˋѣ[ï„yàãÛ/çÛÿþ7^‘@ _ %…à^ E!˜Š]=7ºb—…q_ìFÜò}Š-ÿhy½Ãj*vYfª¦æUìB©‡w¬mÓC™-y¶SÕhÇ⪙&¬´@ ‹tQp%º¬ÞT³ e·³§ÝN{�ÖVèêÙ7™"œ[¡Ë’¢*tY[¡ ™qªdja¥¿•mã»@W ËâÚn‡–ÑI‚ïýÒ†å�Ì«Ìÿ›ÂùÕ�à…gg¤c)A”ËRUì¹]·¿ÿM…hÁsö¬ÔsöŽaÝ+˯{@î‹KÝ«jBã»lYT KZ©¢âRTu¬ î•}pž,{…ïÔ›&W`or<ç²ÝØÒַܾ×í{ö†}“)Š÷ž=s|Ÿq(O¼'Úgþí Ü.‡[Š )ºõ'>:F¥"”@u2¡©1%Ð’LPÏ�IMP íIS`UãpfûOÔ —ø]?+ -<ÒšÊ|>­Éé‘ÁàÄ6ù µ€XÑɸ–UxMñªrÏsé´nåÀ²ˆ³—:¨[žtZýÄ'Ðv;´T� µ�BˆUEÓÁ˶Ý1×·wpùÃóTœ g¨žL¨šBœ@›Û·Q·Mi4æÝ~žV׺ÍâÚºÍSÒ”ÿ5áö:£ŒSšÓ2një/@*Ä ´ÝHËs cª ÈDp£´éÍCI›¹´é‡©¦ßã]K RÑÓYt²n¥ ÞÛš @Ûíó»/ ¿æ_¥ùK#“†ßåðS]…@!…÷:0üšiœË&xZ“›úyŒlÛ�´XUÍ›šÂVsûAU(ÐÆ«Jmv]æ—,ÄËz˜`S>¾@€ÞØ¿Ún‡˜¯¬‡Z(b1 i•­´-�¶¯Çö‹(Ðö$Ä’¶ ¹-¹xÃöÐA–z"rßèÏGó¨#óM½çw9üT7!�ûjχœÏW·nÕq»n*TRtט÷Rjy]ÊÀ‚Ûõcærÿî šX!P ívˆù]¸¬Æü«¥ÜL¸�ßåðSË �B ïik�ÿLùWÓ–£•7ðËb¥)­è=�ã©í-  ¸Â[b¬¶,ŽÖ2´m�Ú²Ów K¿9^3õùš¾~žiYblns©�¾&Šu ’}h�mO}ÊÚÆFXÓŽ¯.ï=»ËaW¤Š�BÊŽ¡Á1ù6C™ô�?gSñQèÌ9°X„:Ëö9ÝËÙ am7’òm=„Y•´Þ‹Ù™¦Û!åÆŽëPÂXË9·adqØ+*T²‹9Uõü~Е )¼àY·²;\Ž¡…;:{¹{Q©"œp¦çõà¶è·kó›{nrSKqÂIŽÃ>½¯NsÏ,‹´¯yƒ]�×F!Ɖ+¸¡ÅêÉÀX57Óô $ûä¸EµImml¤¿•Pü6ï5ÒÔÚn‡˜›�Eà°[TSC®�‹:æ2ß-ÇÖö œEYœ@ÛƒEýWÖÊ´ÛX~ê¼%}ßm?¼H²âTè9+iäÌr´KBã~äÇ>Ò;4ªWÆ{ €m·C̵£’Æ5­ÃšSPnàv9Ü´ÛB ð¢­¤ÉéX¶¹¾ Ï a�m¾ÞãÒoN9ÄûZ݆^‡Yb¾+p,%Þ²œÓÇü¡†ËQƒŠ¹Î—Ö¹ä«1Ó²mE#…°@�6_Çó>Ʋ!]¶Zˆ8ÊoÖ':‹Ö«³ü_£>À‰mºRþ°O�ºWk[nrS™Bœ°’©ir®fjÙµ$)àÚ\œ® µ‰†Qd"z�62Cj¦œÚ•Lj;"JÀ ´ù"8ækÙe¡˜^ $Ç%âÔøî’g§±ÍSvq9v¡z �œqŠGkŽ|‹>µ,uÒ#… @›/„7¸Ï5'�LËZKî%ܦ*žk=#@“*‰mºRîúÃPjA1;N�`BÓ0×>>µŽ£UÀ… P‘BœÐÊ´¤¦qÑÎð�pm®Þ`ó%å4y/TÇír¸¡B÷žý$$;Ù›&^œÆ¹ø.˹¿oC@wbbãYpÛ0Ö³”)ý-O¨[~ I;pœò­±’t5¿”Ún‡ØÃhsE†¤Ó£M_]ç\Nç¨TN¸~vUµdØzŽõè÷,wV¦mšêå†)y˜Ù¶Ô ëK¢%Ðv#%�yÓ1Öèä”ÉE·þÕ;=ËóòÓºo»œ%Ðv;”¼ÄñÐÓÝ%_ëýV&õB ;%:˵v~üâ@!…÷öÍ9¸è¯ÎÕŸ”`V±B ;+9S:5Î ?~ PHáܵŒ[³› ÄG�ÅŸG Yå ¯x�õÏ{NŠ`m7’ò�¿¦Caó¦G'ô¡Ÿ ´Ý1÷€tÑØû²ÕØ;­Ù£<•)Âù'kx,ø‘à¿9§m\_IËc¹o¸-SKð·ù³šÚn7×»þ0–ûð[~z£&æCF»½QÐn@?¥¯'p™ÿ=¿Rÿ-PHá½êë®™Ëi.ÓüS'×¾— i+úÉö–˜w'a[õ.ôÐÒ‡{f—ì]ªùŽ^pKÊäã³@ÿ?¾¥`W@TBáäu’ø¢+÷ö7ˆ@ÝÂè4Î_Â00¦Ëý+¦ñ,…—+T&bzãnj|�’áqmvJ¦^×v§dææCÏ(¤ðÞݽ´Øçc¤m9sîÁí%ÑãÞ*Vt³è�©{†€B ÿZRÛe‘A+Ÿíí©wL¢‡ë íFMt“è�»ž]%ÿí,sÆüºÓñ»~*VVx¤Ùå¬NZ:w Á3î´¡Ì»”mžê¶“ü�M¬èfù±8Ë l–¿Ã‹S§·[Љ¥¹bË'j7hàr4ÐîÒ@!ÕéÍÉ�Ìwk×cÊ.x¦š¤<æ„Ý:9eïüxß= `m7�z0©Yß—¼ÝÀír¸µ‰) )º;_êd¿&M×+89Ä\(�ªT5a _ÎÝ>æ¦ï8±M·CêAUši° [Nö)´WMûÉ!Œ:úö²çÜ’Çó.…Ún‡XY÷Rªb[·×ÝI³ázªÞ@zqÆå¦§þÃ"k�Ü7«Ù�L®\uyïÅ¸Õ €mO«™ÝôÄ(\ÎUO;Î7 –‘á8´Ar\k÷qËÚ–ov q¸¤«¶†œ€y:yð–ÛíùU©:£tkÄå¬mÔ@!j…ÃëPÜG]‡ò¼¼ìŠ!/‰Qzñ.‰9ëF1ü[ÛÊœ¶¬å~ÀkއIo„Í%�³õVh»bm7ØÂå|³vNÞ°,-£x^r½ï§ ÅD~j6ÿLõŽðîpÚKäv·ì âr ¢ù±PHërÎbb—À Ф¢|‰¾ívˆ=(Ksúò¡æbçr<œfZPHwÉÉ‘ ½:Ë¿ {ƒ¶ívh=,µG¹¶�%oþoç¡^è¡¶}d€hs½]§K´Q°ÜßU"‚ýEßr;„ü½i,«Ëç\S•½H¬×C ?Uá­d÷ô¡Ú8>¯%½mª �þZb‰±3¨ÅÑ3(2ätJÍ F ü @!uÊÌ cb“�¿¶Ävúe @ÛbGÍŠÞÒ*Ú&vj @ÛÓ†3þ~´EžÑ 1��©ÇËeˆs«Ñnnœ@=��ÃQ–¤OçÄ#€� á¼p„'9.†6½�N89™…$—”)ËdBM¿,%h{ZNˆ�Ö8Ìe;½î¥v.Ò @ÛC4Žø~´š CžÒ ×cCMGØÿì-î<Õ›FÃÖ‚$JxI¾ãÚn‡Ö£�T.^¬5Å­çv9Üše… )7Ê1ær�ö¥NÀ ´=ªÎvú˜³÷Ï‘DZ ÚþùxÃÉC… ê?Ÿ‰ÆSqçR�Ù©ÖÚ—‰pYG'EWF =Xe§¥äò|¸.äòl�môò—ÂÊH­`JX‹ˆ.³´ò%´3?º´¬;R hó…àö1¹`|þœ£üùÃ>ÆÚ÷1qá¤yV‡>ý©‰/lå$ h»bîûøc�]+Uj�“�Ûóåzû%t3¼Ì›ÛóY @Ûã,üˆöGž²6œÊÒïs݉˜®[r´@�6ÄTÉ…zWÍì¸Nt«H…s)*AÅ"&aN£Ž®ÒŽ&£Ò’7�{L»0´Ù(rËÓà W`+A³+n醞%öPÊmÓ{ÊçþÚÓÂþÊ:ÍÜ çÖ|ËZý¯ÍæN\Ñ--VWGë zå ]]ÅåѰÈò‰œaqå¡'°׃\<®c]2�ëA¯d £+¸IÓiár´ ºŠpÂ*4¾ËC‹€—€¸â†îsÓ¨ú2´zfXÐ^Mjpä.HQ7˜zfü &‹RpgX¦âö­ãÖ ÏtܲLö¾T‘)ĉ'8^½âÊ¥õܲPd¹4 Wt¯\¡)¬ÀGªŠ«Àç) §€å0%Г�9ß~ªÕ Mq6•* ´Ý-'Ÿ�@aǨL;®—)Ma±BNS\µBGSíþYÍ OÃ"o–<%¸Æ£žÌóû²uŒh»ZÞò™´Tî ¤ii{™].§µïcîÁj¯åúDú¸Wý4(Ðv;ÄÈyp+5JÝ¥j®Üä¡·s·*—šÉ¥Nû›p!λ\¤*ôºkW7ønrkU^œp’÷âàSÈ{qŽ lÛMߋö9›¤žˆ”MJKGùõ;o*—ª)‰ë\krõ¼›@LlÓíPz¬dôßêEÜ8=b6'è„Lae”â$°?âTàÑf²Š]j‚äüºGk3híç¶û·ŽR¹—¡6LÚ™ëQ'}Ãìr˜µ ÷PxÉ--'‡—‚LâE!Ü;ƒªo>_Âwü.‡_+(¹¯výXtÆ{vüÄâÄÝÙ€0ª‚´TRSLZª§''µ×`IòK*mÜY´ÂÐß¡>]U­z‡cë×ôì.‡�ª* /º%…i©œ\Z*Šàœ޳º{Ãë^ n…:þïK½Îß Zä–Ñ è-#p£”éÞ]›«‰ÕkqÝç_Îç·«kßq«Ғ˜''òD¸=kÇî‡-«ÁQ_ü�ª¿× ÌR=î<JÖÌù:æ°{Q* ´ùœ…0ÐA[>Bv”>nó7GÊ ør  «ÚÈ\9±m·CL\µC šì.&Ríu¼…›¶µå²Ýv¼Rüa/ß³ߟ €þ^ÞóG[²ÿr„³¯QÚñ»~-n…ž ÆØÏaƒ1¨ª›9]ái©+î´ÁÓfÃ.åÞö´ìßao“Ú¿Ëá׎® �Â;×eàîÏ:èµÎ|W¢^#Õì®Å@�¶Û!öp�`Wws>^W’àÆ“å§º �þ�'þëÙLß%?œÍX ¸ýë�Í0…éÕ¤AqéÕžA�­óÞå4�èó ŠÕáÌȪAM*úgF¨S´ó)Í=>lmÕê¹]·v(…haz5)—^�B˜7–¥lˆ—ql.F—%ó&íüê;¨=ó&Qh»b—QBj ]þÒêZ6Ù™³¤¹”y*Ã{ŒÌðæzÌËðÆ5w«1Û´T×¢´k©^òcfݸÙäm+ ´Ý1qiaÚ2)—¶ŒBx‹ÙªÑÛ%i²ÖpÂT¹^‚fH!ÐÏ•³Ä¼ qÓ@ådzÓ=·Ëᦺ �‹´ +�”�ÉJC ¸žŸBhqÔwŽÇ>êÉÚ�,¯¾P Éi6'P… �~r&z½——�.ùåõòAÇïrøµÌü(´ðH«ÏÈûA hó…ÀQ•ŸˆÏyuãÐËüfk>qÊÏèšQÜß\×í55Ç(�¶ÛRò» ò’÷ýõ6餫—Ïlqm·CË�‡ìõ�©qn¥Á’jó§mËÖ*g%CÌñží¬éÓͪ @Ûís«Àíõ5§Ô5[ºgw9ìš=@!ewÇÚ^ö–9g¼–š:j]´g¯UÛ{ šX!P ívˆ=Ì’áÍ"¼×¦bW’lÛí{Ж–PÞëÀ>´0Øžþœ_2åA¼'1¦—3 Ún‡Òƒžê#ãô"Sù�\ØmÍà¥HḠÀ(Ðv;ĸY ¯Ä2³wf)|&v.ŽÊ”ú1t KžwÒˆ=ë­‹aÞKè}Úò¼\OiCœØ¦Û!åŸ/Sy.ìãQÏžÛ…ÜŠL1N8É9EMåòJb—,`ûES(Ðö¤+Ì}˜§òêÑž�NO¦{-\ŽT¬(¤J�§š—A_NNËÓªY=»Ëa§]…”Ý5¬£¼œü‰ëøe±Ö|B5íiixåAÅ0qEïI‘ŠêA´š,¯¾åIEfzæ#ÇàÒoÒŸ ê>ýr>]�) ©Fçé­eÓÎÞæ×Èøäv9ÜTGNhÁ�ÒºU]nÍlH,P ÍÂÉÃZJ�¤¼±=3lß+·4©B @Ûís Ÿ+ïÙ]»"U RvoöN²gp>Û“u©ãócË[Ú¶åÌëd`|»r1N ívhÁE‘aXêC݇V(ÏäïgìëÚ^(65ƒmüóÊ5Œqm7Òr,j<÷ÚÁi»S q<�jšÉe,†˜~sèkyù-«*h»båWcYöŽô¡gýÀR j:’÷³ŸEˆä ¦K-ëk°1@�¶Û!æ-éWùD7ý¨Ü#½�Ýå°S©"÷ÍnÅ 5ü›LTGôm7ÒzP”ŽÇ#íC«-ôÖq9Ö¡R…@!M�RÕ¹çÝLîöôÔ�¤o 5tæÌ®ÒÙe?ã�²ŽO‘%ù# F-w”èƒNH¯o&]ƒ�¡™þZCÒ�j£çÝúŽh»Jâàëµ�~”&­c–~RÒ¤Êo¶Júýý—óý*Ðw”�j4TÒb2äüß};sÍpb›| ì­�ô›£ª°Ö ²¼.䥅8ê{LJXr-û÷ÀŽ–jÓt;¤bcÆ¥|Ŕܷ‰ö/&¶éÁ»°¯ c>¹N†¶êr’¨Lù 0íPÆ—ÃÓ1o…@�¶Û!æžä8Ð@‘ŠáGiÓóV}mûcGÐ+ár” º �BkiMi`d›[ë¶‹¡‡‰iyìн8ÕyT#=å (k¿„0æÛÊoôýñ= WÓÓ¾Úª�È}ŸÃÈ ç_­S~ÞÀïrø©fB ÷ÕÞàNæ\DO3¤Æh ·ÒYëŸóc›RdŠqâJnh±š20ZQÀÎ4=© ÃuÓ¨ê�÷6uŽ¥~jÚÑ.¹ÊÊJiš �m·C Ê}ìÕÁŒëbNSù}š2KÌm$5e�mOš‚l‹a<ŠC�kö4Ü©Ÿ³-/±: š¶B @Ûís³A ªAµE0ätꄨ0¨Ýkár´ R…@áUFÖi!0$oÛ|!œ sQ·{©qïˆÃ¨P!Ð?ãÀ3î4¡ç÷Ãi‚ )ü;#+²ûÖ£>ãî„ëíñ@3êèìñ¬�‘÷Ìø¹Å )8ÿ´‹Û î#ªe7¸ÕÑ]trßäm¤·©FöWHgι6…_ÝHok™ZŽiÏ9!U¬(Ðv;Ä<+gpé7kVHi™Ç&ÃжÝ1? A@Tøä”å>eY­,dhÛž”…¦µÅ\É1ó²V *Vô#²¨SW[4íù]?+ -|¹¥e€x&Ðæf¨ýÌ;ácØÔ}¥'(ƒÛô4=EqÇ]�–ö|�ôv4 ±MOAÀðGýnƒ*&ÎDÒ1¨*ÑDUžXóD’§YK ãirÝsCÃ_ãý%RXæþÔ2¿V³è�Òqòæݹœ2ùMC7…‡ƒ*O„óBWÞAcå3Ìè à„“Û�¦™�F"t–�ëGæÈA @›Èa~…±:í,‚<øóþ^…Špþ>cÌF»cöÃ>Ûà„“û!´•ÏÆñµ †ä8»{n‘­ï8?7wâ_÷Ø—¶Ø'œÀØcóª'$ÛŸj {M†ZêbÒ¸twý$¶ÉMóL:Bá>^Õ2£"NøaÖ£’ü¼ò_~zÕ§.šz"”Ÿ[ÕSb:Ëæˆq½…™eTú•×�g?�Ú Ì.c>WÚ“=Ô³ä®+.§+T &t§ZB}ž/€Å ´ù"89‚q¾œáÿ¡…yv¶íFZÔ�ðƒU-qJwa~%f‹j¢$‘˜É¥žR‰’ë^üÈmÙóý">QÒâÚüô’¤AéÛPÿ±�Ñ“½e�m~yªŠ¿ùijà„÷¼‹e)ñ˜mŸ_Ÿ³ê"íÒ«mw½Õ”âÚn¤åOƒ! FU³£lÏSTrúu:9^ÝЩàrT B…@!õéûxÖáý>º�ãj©âüpÛ(/¨çÆ»A'¤ä^¶ò˜ÃëÉû_òE,'%ÎÄæ4^õädÄy> ’fÙü û~æ§~xæ'ÐæŠàE¦ÖrÚ0áå“¡ä'åu(§Ö³–!? 2ãò0‹�m·CÌ�O÷'9?Då-PÈc!ÇRbÙ1Ú®ÇPÔG÷m~èÞ=Kå¨ÁÓóê»ârºBÅ �Bö+¥,L*'•Åe•»ç�å�ÆLÞDàŒEåz sÛÉãrÛ¹‹& Ë¿ O4Î�ƒ%Eýˆ=Íðˆ3º#N3úÉ—<Ͱ ö‡Ó ›fš@{Íp<Û¹ œf˜s-(‚ùgpD† åù…±,òñŸ¬.‡•0¡…¶„ìé+sýÉÁ9OIýXNž³C¢‹�9„0ìßG‚ßaÎÙPb~Ã縤 µ9iöC —¿Ï»½ðC[ÚÿW”p*Þ…ôÌè# �Ú?>ù®Ä0úá2´]ý ›>Låè˜j�¶[ ¡c:êóÃPЇ¾[ô8' ´Ý±ô«"Ñð>0ÝÊÉæR«G¥®?4] G¯ê1®9TS-E8�6ÿ€ëä18k":Ð vŒµ…ËI±G9˜:ÆW®k|²Œ(�¶§³åðdÐô{00Á¾õŽ3BgF\λkFözÍTw÷‹–ÿ(££œ%ÎG;Ä1'�m¤8�¶§ÓLCÊË%gD`SÉA׎Ou¤çíuÆjÏJ{þï9ú;Î=+µ¤È³R cÏJ‘§M'Ì“l®Dc“�vÎÍæ>4p¡ZNB€N›^öZhv0œµï(k%&†ä9–œuilvX²óŸ#²ks“³Ž´ ^ÖÚn‡ØÃ•æUwÒ9K`n^ï¿ËáלÕÈ}uùÕ’ÿ^~U]¦žúåPWÝ„@!EÅ]D¯¿ºÖ•i;[&mÝå–�äÐ(Ðv;Ä&¡Wî™æ!rlÓ‡1 mÛíó‡Wl¨†æx„†Kê´MBÃë^|ñÒ/†W·—pL>.z™vçyµ»ñP Íwãœä¿L4¥×ó•l“EíÎ\#ÎMÅM>µƒï™Ñ;x Nn7ujîô2åIÑî ú2¾òا왗ߜ燞 @Ûíó5µ•§ñÒ'/š=äĬTªçPŸÎ4µhv\6Úxïx]È«M�Nh¹�lî9 ˜Í=ð§‚=/>ÚaqÔçªG]wÔÚIS™Q¶eÕc /Þ`Y©ŽB r@¹ûdÄ2òéÂ>œ¯žíx]/UR^p Õï'i¢ ‡Ë¾m{†×,Lè–ó{ Wo‡m‰±z‹#7ôÈŽÑ$·ØŸåyˆÏ••\ì-P íŸ.öƧ×úxSï¯ôñ–Ãrc÷ˆNrf›ZFMìÌ¥YùM,àÄ6=mbm2ÃH‚ʳã¢Ýû%ô”a¶uÖ¬‹r‰¡ƒÌ{+Üc·¦-fÚ÷¹†–ÝÓB PÈͶk?‹žkå+l[ ”–³¶ùüóªðô!ÀÛ¨¿ãÄ6Ý©z­®¤F§¥e:ÜÅ£c=zñ)oôFlÙ±FŒ8î›K»¦ãøïó&Ï ^ÂT‘å|f9^…‘:ã¸Ð8Zp/À gh˜z"‰1Xf@2z*á·’sÔjŽqzBœ@Ûƒžˆ{ö[Ø{̤ä߃Ž^-&àÈ–bpŽð`Q¬_¸vÑ.ûDÝfç\àMܹ,ÂX8wWijo'v=jÎçûEo¹—c¹ª£(ä0 ’{v|’¢Å‰+º“¤È¯à¬‰«]áØÓp¿†ì>æ~�×yΜyèìŸÃ?õ&¤sÚ~Q;�~>'v²su#©³$]§}ÌRÏê:v—î͚PxÙ�\?"e`n ¡^žù´ímÛ�ßo¸�Û…Ü4ù6ÄQ_,.){­† ¾Ủ+P=ö ”E1ßéß� $¥?ÇzpÒü�4·zÉÆÜßQ‘Bœ@›{u‚ðûµËbf”*95Á�NKÌ•GGÎEÌCpiçPmË‚÷웚B _Ü#¯GY{= ÙQêän•¤ ÍT&¯¡>†CÞ*±8�¶‡[%èg‡0ìÕTÌŽ*ýî]jP7ýºöB]ä¥4M…@�6ÿî Nù�ÕúÁC½3Öq»nzÕ% ):w+h[Õ:“G­ë y+ÈàÄ6=Ý 2Ç" 5k.PáíÞÜž2ÌŠH1ο=‚s7•zv?ÜT²@¡eßJÐ;“:Ö»¶ÄU3Î7k”1ëŽÙVmpÔ÷z÷¡W zoÇ™ß=»�×…¼T¢'œÜ®ù¬Zdo�^÷f÷‚Úòñuôw¼ÇYh»bܯð›u^¤È“ „ÚÊy@~³«Ýøãapb›žä«ÚG3Í¡õþ>7Š,N íq…6»iúã‡Ä٬Š´=Ø,.í! 5 zŠÙQÊô6ba£T&Æ0mz^õ:kàô8?fÎXÊ뜾3iÌ·u_h»bþœã` µu4äG�G'°�ºÝN®o-WÐëàrt B…@!JyÉ“+µuß/¸q‡Å ´=xèÅÆ3 ²+R1S';7+ìZøj×¶Ó&§ h{šÐØwM ßÖ-?UéÏ –Ÿj+úS( ß¿.?äÜ–Y�ñÏê¯s=ë&Os—9K‰œ<-Œ�<‘§Gn–ê4ÀOR&¤.s�Ò9Ö‡¹ÛPÖnŠ`þÌ BRsdÇì‡)Òà¨Ï;ÎÉ,G~ÓtoJìø\ȧ ÷ï0áDvç ½¼Ïü1Ã¥¥»„P?V¶OþM¦'Ðv#-w�P̓‹˜Qºô²@�-N·|o­Æ›S_ÌûhÉFßqÞi±—CÂ$fvtbà„“ÜÍ€ÒL®-ÍéÕ ‡S]Áä¦Öë)C]†rZð[¨(Ðv;ÄÜKå¹�SÍ@®É¿kZ™K™ƒ±=¶” dï Eª(Ðv;Ä|eåsæL=ýzÐŽÏçÌ%±ð̳X¹za¦´ÌÕ b @Ûí—ÖTn$ÜÞŠ<“BX @›/„gÜ1n<çñÏ1kráû!ÃжÝ1¿Ëò�ÒŒËáS5ˆ^ —£+r�ákk>뵘=„÷9É&§œ;i]x_ê‰�m·CÌïêžú]f�BŠŠÙòó®YþiÆØæó¶ÜT3!�ûfߎæ¥^ZxÙ_o HÐÄ �âZ›%ÆýŠ6f�<£Awè/Zç}U£ÿèËùh+ ­Á|¢”»qžÚH\�åÓ¯k.z¾nž´ �m·CŒµ›üÞ{ŸöLÚ� ´ùëuY¾YïÒÔªAØe–_[` ße(¼§­XËV‚&Ñ=¶ívˆù]�3/&2¶»Ž¤(Ðæ á¹DG}ªâhoB }[v*Uä>úa!;t§QTï ôü.‡ŸÚwRx×�:î~—ÃOµ…žêÃäêBÓúg^éC h{êCTVl‘é7³:::KV±Sö¦ KŒ�£,Žž£�¡m{œ£lưô›­:««:÷ª,‚Ÿ7¡[b¾ìÛR^�L†¹þ$ƒÁ‰mò%à¬(mÕ÷óŸX‘ ´ñVã@ z”àG)ÔÕU8RQ ª+bˆ³Å©.¹yeà䣟æH h{š#ÝR’g¿¿ÿM2ä¦R·Ë˜ªAÅ"‚ œN]m�ù^)§3¾\š�ȼG]hóã)ÞBW®p–Ê�µJ]žÏ²IæÚR¯…îC€fZ!P ívˆ±Ã®¿‹þð³@�6عSÔ^ë_�Í[F·ÀòÓ9*ún�'<ŽžžúÃÎ…•vøZ9ì¸×ò¸a‡µ`1@I¾-È(=áqc½[rìsõnÿáØÇz·äØçêÝzcŸ©PÜóû¡B± -|Îê,×Þf,ºk©·%7úEw=QשDár[ b霂ÕDb _AÚ#ëÈZ]HùÙ¶Û!ö0ÐË/}óÔp½.G *Väú¢üj(a¸ýZEÑžúåP× �BŠêÔÉYKÙÅRij^öìÙ];•*rí…�±Ÿû¡s9CG… �Ü~ˆG„ ú_:ð W‡sæœ1—o&—nk œ­ûÕb7ßqþŒˆ®œ»íwì~˜" N8ɽ%m)SE+Ê?oj™ïJ«ÖTT ï(�6ßèÜÅ ¦�f?ÌßJPfjæ0œv¸9›ÓN¾�+¤œókE€9»ûr(Dù6è'®žô³µ -gì&¡Ó×֭пâàÄ6=�|§ |Ã>P›ŽÙqýILG‰ÛZgÛåõ3!P íiFr†ˆƒŽQUüÈN´ŒH>d¨‹ÎT'üµ•™êuÐáÚn‡Öƒ …8ìU Á�ëÔ‡·Y§Š›^[Ë·.G ÿ›ÁQÁªjšëy•º$Ue�m¼ªpŠÃºÀäÜÈv@¨|Œ‹Y2™[5¼’ÉÄÙ³ã'H‹ã¾Ù+«˜Ö`=ß:_k·]G,³¿ÿÍàÜuåæ&Çž?9Zœ°’ÇÖ�ÄU/İá$u´A§õwaUœ²íPnC+ús6Î ®Uµ€Ðþz{¥›ö.� õWwµÄØ9ÛâèIr:Å.L”‚okÛêånnH‹ÀëÍ�­¼Mû;NlÓí�zØjG0ì—¿ÿͱãúØí½¹ìÊ—4uÕ�ÊZâ<ù@½ÖìuÒáÚn‡V>ˆ~?°YÞ8L/ê‘CdƒôíXì;Î Z{ñþ‡Ç£?C»–ÇF˜°rciƒ¾@Ê,�+ÓR Ýì¹xI¡5¾rùMùK]+Ê„@îй¬šF�ºQöü.‡Ÿê&r_�5µºA«pœõ:gÎÃP!lu±"D h»bî9aNﯜ÷ìŠT¦€V‘*ºíTãòz,ƱÊ"ËyÊÂQ>¬jóËÑ2Tz5\ŽT¬(¤NÝúvs5À9÷ë ü.‡ŸvbRxÊ´°ôiZ\é-δð›ûrV?(ËÚž”ÅãBÓ"‹qq¦…:õúpÔòÓØn•ä×ÃV�öëËͽ^š²B @Ûí{¨â°sTYC®§½>O(iÚ¯—Œz5\ŽT[!PH�úã°Üùζjæã°ü5ïëæ½ïqÚn‡ØƒÁ¯õÂÒÙ”Üó»œÕVû0Š+¼·t£[ƒöMVŸã웫>ãhûæê©ýSûF“´oÎÇü‡ö�ÞißœwÇÙw>_)ãâx}Mg¸—c¸*Vzà¯z—ö‡Af�m�ƒlÎkN¡5=(Â×1á¸/ô¯Pzûó|e�å¸e½~WóÓ:þïqàÚn¤åÞiîió·¸-N\9½[ÜÌV Ë%‘[%®\n•¨ºÒhÆd]iÎŒ½ºÒNEk XÉ3l®„Ó?4l,áÄ6WÁ Û]ë­D÷¾ µ¬ë,á¨qäë ®ð÷Ì.d¦z qB ¾Ô<Ú­¥lšj¶ôÀßÿŽQN5¬`Àݾï9±·ï-ŠøR÷òË|–Ýܾn-ëyõb\>™« Ì=û¿ÿMÚn‡÷+ü`‚"Ïh�+Kb†!]•Ä[—âÙ‰OXÀ…O\ýO” a¥Ò„¸J7ØÇÎ5îymÅk¡N¬[РФ �~ÝKìa1 ‹,cÍh‹«ÎL fªÊ/‡–”X�Wä–«*o�m·Cìa® qÅ:Š˜€|@‚¡m»bÓBXUÕ båÈi�†•pi!ܺ]›/Ä뮩ÞçnºÑîññ‰Ãér†S+ 96¹j!v´ÒÕBp˜s§-¬W@j‹«Wài+*5Ñóú¡Ô„ +xVR•fÐ5Qdþ9\4·õ#Z­ ï8÷¢9–¢àJôÜø’'œäÃ_ÃgeÀ¥ÖáÌÉu<ç ÌšfüZòÂÜ•nu¾ãÄ6Ý©&Í»�CÁªž˜WÄ RÜ&ÕÃÜvÔã—GÍþá¾ êEC¸‘Û³o2E8ÿB®¥å_ðœN­£‘|Àåa†´¾n#œ?AâfÁñv‡±Î¢K»î5Žõ2ýÞ6Kì¯æä$Ç×ø��m·CÌuŽ}Ó`XrÉt…>¶ãsøù²o=ÙxEg#”ô ·CF\*‡œ¼TëËÞÚ|!“&pé7µ¤ñç¹ÅжÝ1Ï~Žœ˜aÓTË*-\ŽTªÈõ…¯¬s¯®üV� øL>(bÅ@�¶û!“ßSÿ¡Ç,PHQa#rœ:UË^ÃÌŽu[nª™È}óC‡MÕü¦×Çtr�M¬(®µYb¤u[mÝÈ�S©«¬Z"ñu¬{µâ+;Éè¥)+ ´Ý1îWتŠ<ׯð«3ßú­Ôu[Mš Ú»ÑjõíÆy©ás²;(Ðö /âWø‰º�3ä)}y y¾õ[bpsõ•ÌG_ÎG«nB §zñh9‰œdâ á¹^[�a.ÍÂ{v—ÃN{,rý0¹Ô"¦ÓØjeõü.‡Ÿ*+ )¼›H×ù�7ð»~ª­(¤ðL:¹\’¹^Ê2gñ¼²(Ðö¤,&“L‹Í$ LËÑ©ŸìQP -5,ÜÜp*uS4O RkÛÐõ[®ËÙri†@!÷o”²0Ý€T—oÀ)+ßH*';O{XËL7ÖßQþÖUþAú‡ŽêPÂHè »žÝìs«™—'‹20R‹ŽýŽs'‰mºR#?‚™oW“‰yJij˜qÕGe«Rûï¾ð»U˜ï ¡ØÓ™VíÑcze0ÆÌ-H ÍeN ÌÜa—·ãŽwH/0‡Ì¦ˆ•IªS$ZŠY¤zǘ1Û‚8˜ÜA .³Nw§3ý`®cí|e¾ ór SÕóE ÿœR1p,‘y'ÜxòÞψEÛ ÷<‡g5q7a ÙS\Œ×_Nø»„Ʀ}[-[̃é%xÏ6ÐÏp±ÄJ‡ÙXzOœ�Á[œ�‚zÙ¡ätnŽûÉD¯RÙ�~Hî08·¼Ô[­¤¥ì«žùÖRxéSr\bÏnb̓1g¢-»+ ´Ý1<Í�1xÎÞ¦¡�whÏi _ 5Å=àiªLLC;iÖ{–ó°îZÑÈ;Õí¹7‘B ¬k‰‰©J»Ô#�}½×ÚqºN-ù% +ö·ƒx+?}ï|8ׯ�z°>©®>ª'<ùîYñ'ß'¤ØÃ_¯™òÿ©o…åøã–©§å65À²RE875¥öÞÕÕM‹r­˜þy¦]T¤�ômI»ÉÏG°¿ÂÄ6Ý%ò0ÞÂØÃxdgÛn‡öZ®&_0³Ö0_á×·ô’ï0¡ôHU~‡N# ¿3½æ•}Çâ¶«S—¯.mm8||ÿü[·…@q•‰¥Æã~âæ\ÇqeÍ�®sÞÕGOÛÚöâF§€ËQ€J…Ô¦ã½m«¾x”\¼ºýîÙ];í½(¤ìLÝ~;VÙºý8Æ©|"ÎÎMÝuÒÈ£ÂëŽy3ÝÕÎÉ^cÊ�{}†sS„¢ŠÁs¦�åà±»f ²%¯¥F öYwAìåq¬6šŠB @Ûíó׸ô¡Å™oåOzn—ÃMõÀ„Üñâ/#Q‘ PǨ ‹ËPjâŠËüC5a=}NM\=}TÓ·z@hÛdA ζ½’@8äv ±ïù«àG\N¨†˜�»mÅ ßÎåõºOI%zÄJ¿)O¥ÊÙ{���m·CÌ ÚÄ0«�÷Ôò³m·C졯M�=§–¾Ûkár´ b…@®/Äíyó†m1ñÛžÍPÝu쥼ã«0Ý](ÐÆwWŒè€'ø‘úĎϩչÈü0i•\Úb,P Í·÷Õ©‡=¡ª!rÝê­cñ1·=ۖ¦âc UÝÅN-ïì;NlÓí�zXSÏâçŒøš#ßs»�[mNXÉ‘Ô9hÙÉcn�ßr"Xœ@›+7¶ì3ìØbž‡ðç*óö…7ëP�f°³Ž÷l†=ÊѬ\×v¬E ½ßóoB…@À[b쀷8zÀ#CN£î³'‘ñY½4eÅFëŒxKÊÛE‡Æ3‡×Üÿ1Œ.g©¢B 7–†ÛZkƒOZ!ÞY°¼»ï;NlÓí�z(f9ë·lg öÜ.äÖ,=À -¹!…õÃ9¸ºãŽî }epË�-ÑŽ8î‹]- Ã5ÃæóõàTû5EÎUQ!Î/ö Ó‰¶–[ÂqBJîö^XeªøªPDuZ²"0TÃ�f}œdšÚkk\]‹h{¨¢KŸ7-†}$3«ogpÇ-P í©æ8ZPŒK¿9ôy¡´»š_½Å0ôг[b¾ a9ñœ`jksuÈ-P íŸ×!χÜ•úÀµ<;Y†ÜàÄ6=!GE…0T€v_ÌŽS&W=ÙA™t—S]wº2º ´=UF�K�çŠÊµ®ºHÓ5È-P �¯BãP jUCN£ÎëCñ‡Zhã/œ9•zÖ§ëäQp£¾®´Œ¯>üœÃ[†8�¶i=ô`ÃeDU³£V$çõŸñÔ¥4ý¨UŸï4p9PE…@áÕS˜ÿþ79¼ÙI5œçq5Õé‘X è¥h¥Þ,óê>·šþ¤(Ðæ �ùŽ 7éÒœäÚ‰¸ÄZ~E¬È}õÂvªN“;×<»Èö4eE8w‘µ¤¨±KªGœQž3 qLôßË�%‹NwΑ3ýôKªÝá"o™©ž"œ?y àÜrÚ±ûa558á$wMzÑ�Ô2·5=í�ÿç; 9µÀ÷Ü~Xà-PHѵ Òø‘A—pSYYÖóµ9Ç�›å§º �þÖ …w·#§ú+é×í�)ð;z š¶B ïxXb¬çaq´ë� 9�RÎG¯…œ R¥¯Cëô�{v Ö\©CŸIî¹\UQ„Rbg¹èxž5®ZÞN-Ñß´D¶G?Ù7‘Bœ@Û�´¨á÷j1Ä Õ¹¡ìè‘[|¯W#lñã¸ÜÛ¿DÔ/µŒu{¿ÈLDý'Ðöõsµ«ûý^M ãy*T„sÓòBƒª³´Ùâ„““:ûÜJÕ…ÏC>òðÓÚžŽ?�„°³$ifÃ[_™æ8ÄljzHô�CÜSÒ]…OÿVÓ5zê—C]u…hÙSZ<^a��ðP¤§þÃ9�rßøpH¾jšx{Ñ; ²üT7!�ûj÷$oÖØQúm=·Ëᦺ �BŠîžä ºÄ®Çë\ËÌ­V‚&Vô&e$ÆéÊž=Ѻb­teçÄø[��.„hÙ£UŽ”�yDØ“€YBË8Õ4­õ§5�mOlñ¯ÐBÛI9AžñA<›Y4ï`ÛÁŽ}JWmUMä\ÏeNÝ\üÎ�ƒäŽÛåpkGÂPxÑ -'ÐKÉÀzQ."Þsã#âG}±»Ý�%wޢϖ›**úÑgÝ=,?j'¿¶O=¿Ëá§b…@¡…GZ¸%…à6¤(Üë(»#}1ûý¨/ìH{šT!ÐßmZbƽh°t�õžßåðSë�B ïœ#†Cï�Q \?sºêÃ?èÊ…Œ=x§ ¹bŽ!S›Y{~—ÃOƒ!PHá¹S†uxšT±Èc hóϘˆz.ãX>ï|�’oqÂÉí ¸\7‘Jú¸ïXfmøŽóÝœs:v?x'œä}YœJ.ºÍÙ¼�Ó…œTI!N8©¿òÔ~šÛ°gv9ÌÚ±YRrwªÜ5Δœååå�~ð»~m*€Â Î87Ï(œj¸Y�›�ò“èù£ók©û/3’ ´=ÍIö}šä@Õ°Üq¶´Mt–Ö>LŽóÛ5‰�¾·d‰qî’EÑþ²³mOÖþð ¬ÇÔk¥©*¹“%ÅyLÅzLÈ�ëbÆ5鿟wM,N8]ê ËB�ï�ÉQ.g§9uzpá,3•)€ùÊíî•ÂÛóo"Ý›ËzRÌoèiIÇzcœ‘¤¿ÞH¨égÄâÚžœ •Ä8œ�µŸ†Üäû#ËX‚SëùÎã§ü‹h{ðG ¢°WTK17ªƒ9o$m‘óQÈðN¥åœƒÛä»"^&ÝZfÔu/ÉÀÕ(òT6€v-¤cÿ¾ØÚn‡ØC„k.Ëßš&úv?§ãw9üÔ¤B �Â{óAø5Ð3Ía µ@õ²«ª¨ßqT©P±½°#•¾,9´žÛ+Užë,ƒÛôÔUŒk´ÕóÃôMËO¾‘ ´=yGŽw»ß`ŸÌ®pë¡‹YïÚ~Gy œ¥Ãy!Ez!È̶ýg¼�îëi'Ä „Q#úŽñW }h—ŸÏ›kÝK=UÙ^Ž0ìÝŒTªçoÝ@™œgÒ³ûÁ3±@!ew‡Ü¨G=-)Ðsã,?UVôý8žòOzv?8((¤ìîè;õ¤g8_c\9ËOÅ �¾/ç KSOœ_Ò,NHA�À¦=Óû²”uÝ,³6/}ÇQßKz#=3Þ±8áwí'Z­‘›ê)^å9É�íÿXýªåïüŽ ýŽ6Ðåû‡Z„sjKŠtEŽZ#.ÍïõÆç‹Xœ@ï�„Žz«ê³Å"ëø¥SKŒíy;~ÁÚ…Õ‡ÔUB”gvÔ~í>7ë™Yœ@›ï™9qª†ªšŠÙQ¶{‹GyÈ$-:ó�Þ¢ ´=y‹Œÿ‘v.Å�K”ÞÛ3Ʊ@�¶î‚ìõÚÛø*†Ë¹ 'ÐÆ» {½8Œ�î£e§šŠp®ûèIŽÎLO›w‚,N89)'(?Ô£ƒ£^X%} ƒÛôŸñ€öQ“ÙÏòÛ.� ´=E“â_Á'«¹PÔ õ1~˜u X? ] ÛöŸñÃz÷†÷Ã,Žr±|EÍzj+%Í í¹Lùé#kv\Ïþ�"ÿ'¶évH=XõXÎBr�d¯þyÇíBnjÔ!NhÉ�T.'4õ+%‚Å ´ýS塨±ÒY“Š5\£Õ· VCvÁG»Þ·×”ÐÆ2·w°@�¶§!�sUúÄ­œ¯¼ê@ssœÅ ´ýÓ%;!^Z¸…Ó™=bg ]]5‹ãüfÎ�9ê%ýáh©v¤c�mÿÜûBOR… Ü6Î-u*\œ‹î|Zu0o snùÌ´ÍÓG�Å@c‰±›‹£w1Èж=ìcC:Ç’Tña°•éõÒ”áü�Œ¥EŽ9 £ÇòãúÙs`µG­×±ì-FHš» ´=™;f’Æ8Ó[MY?o�3´|]…0zYv¬í…SvƒŠðç>ìSL�8j“qmKîúì|¬B…@Û‡“ûCo}_�­ïÞú«º%Eýˆ]ú=âŒò°¯ö³: ók‘‚�§uuT¦Èù[�+àÍY Þ+?áâÎÏ󣺹DjÁ%á6~Ö7mÙßqœƒü°Í²…Ž¿¿00aåwA@º¹Ôÿ`óB¢Içê­™n©í]èv›¹ x¿8¾ã¸ åC'é™óº–.­QÚ%«2Wï|¥'¼èÓ¾àÚn¤õ`ÎZ’o]Ï�Ú»Ëa×áPxÙ�VuTÖeý3þ"ƒÁ‰mò%p—ŠRp]J%ǘ]ȬyfßaÔ÷úÞbô!Å.êN&úd ðÌÇÒ"Õ”‹•æ–un#�R“… ´=¨ M:„•MĸëO^4ÁÍÑ¥¡äv\®Qšu;¿nwŸ9Ÿß¶ßqBkÒR‡©Ì£]|æD @›/„ÛSgñ-×en®AÏïrø©X!�ûêz>Y –¹.p=ñË!ÞŽ'¿ã„—¯\>6[Y¾ƒp´Áøfv9ÌT-Žú^²¯Æ´#(¦?Ÿu¤“}@�6¿¯E�ÞýÿÄmkÓ§) ´Ñº"p¨„,Å�ÔhÞý/¹Ÿçáeý¥¶ò´NÛkÚéÔð@�¶Û!æ.ûBuC0ä:oÇ´¡Î¯ëpÖå•5Že»’ô2¾Ö1çêÊÒ"Uea¬¦��izÒ“cÚ“îÝæ¹ú� .G*TRŸ¸ÂfûÏy'ëØN »Ëa§ý…—hMc®›\†åú‹ '¶É—À3ë#§MKÚiO{›)>˜]ÈLE qÔû&”«ìŽ ;µë§ŒK= 3ü›PN ívhy±ô1—×ËŸ²¯þäv9ÜŠL!N8ÁMæÍ8•'¦e^ó3$3Oå3Ö¥Ä-.àÝ �m·CÌ�í�¹òGþÕ¼Õø„áw9üŠX1Pxá�Ö2ä ê´äý÷þ‹(Ðæ ñê,MFTÝå`â<0ü.‡ŸŠ¹¯¶·XÆe)Ô2ŽmÏ«ºåã®1�ô›rI1M#µ<  @ÛíóǾ9–{9í\vk9Ë™–5Mº®õ4±B @Ûís—�œ‘;gؑߺ�Ýå°S©B Ð²#­mP•¦©B£1¬(Ðæ á9"«†–mý3Ìú‰¿ËáWÄŠ�ÜW»ujÆœù0wËò¦»ñeßÛlÔKÐÄ �m·Cì³¾ð¸�Å¡Z†4,Õî¶R¿%H«¡оü™ÎL ¹Ø/³Ž�m·CÌï»í,kÍ’�vÁ^Š”–&V'A+ ´Ý1w½­ÄóÓcãÔˆçErÛÛ±~&”÷!Ý#h»b¾²rW—·©^c6ü.‡ŸöaRxoÆÌ±ïSû¾�|V1å–#O`E¬AQÚ.¯ñÚn‡ØƒiíÅ×snÅ}×%á<ò¿\úÉyÞÛ†A¯¨X!P ívˆÕQZRΓ›·Ï�ÖG_\N_¨!PÈŽõº, ÎcÕœŽãlSÌ¿Ëá§–¹¯.ÂÏųXòŽ^•“ƒÊš] :!Öüø_Z³×wȘ ´Ý±‡QVª3O{�0Òü•'Œ]3Ü3� Û“ ÓË#ù‘¾ávh¸ ¤WÚEFù—£|5�(dOº¦S*�¤_M/»ïø]¿¦¤(´ðu¹ÙÓŽnß>—›=?”ÛT“×ÇÜp¼:*ĉmºRÎhbÄeüS¤¯+§mó}wœÔ—8†?Íøf ÆKM–iÖ¹žã‡oÚn‡˜üëý×ÿý¯qÈ£ðøkž‡ýÏX>sOûÎayµ\¯–ñL¼óðl WÃÿõ¯ÿý¯ÿV¨ý•ÿ«ü÷_ÿóüëúß¶4'$�i=·ã¯ÿøû_£þæ¯$äŸd<‰JŽÔÎýÇý¯ÿòÿýÿñ_+bÊÊJÚʈô×a8þúÛ_þãÿü×óOÿ—ÿH_Q¾#o+ÒwÍS®”\¾8×L^§WËõj)7ûŠ�ÑPïý·ÃÊ“Ê%?²:Áý¸¹œq“:,¡öóXþúÓwÿWŠŒðC²[×n ~9Ô›7…Õ©Ÿq9ô¶Li Ž®o‡®ªŠ…ô{9�¶ç÷ƒGk�B Ï9i¸w#�4nïæ9iæ€d\Ï2}äŽnÓ‡ñ¡Ðdt‹9Ãe=Çžßž£ -üªa{ö½Û�òŒ¼çGU—¦šâGœÛŸ× ÂÚn$å­pó¬GƒÃؼ.¹À@ŒF�B @›Õáâ5=¿â5(¤ð&°5ŸÅ æ´àlûC<ÂaTQ!Ð�G`DÇ‹ i Å’à-pر»vª§(¼ì@Ë-h!0ÚÁt¸PMÏï‡P�r_í¯p+ÌwÔ2¥ìüÕÒ¢Óó’ËË�b @Ûíóœµ<ò“p{öä2k�mOË,ûµ<Ô–DÝó›ð;ߺ~^ÎúÙ&È(Ðæ/Æn,r×ÓémknsZ?Ë añÔm(ŸÜ=PEÚn‡XÑé¦g¥çô§ª´[—.g]R"œ�kœë€tƒÛ²»vm7ûG}1·eë‡ó[6 wnð¶là•‘:ŸÅì¨@Úw!N8er»ÈžÝ»H RvGSáÌ�ý¢ª"¦®“Ý`Òó²uhé/ù!‚l‹¯”ÕüÁ箃ý=/…8�¶i Ì åG£fUí¯,ˆ¾gZw…@�¶Û!Æý �AA‘g,Ë©Å2G™g—}ù³ÖTs�Ùš!Ún‡™uгã³,NHч¿^ç *P©W�¼Ü½9ö ’ T 'Ðv#-&ç gõCÎ� )·×qÓ¤ëv²ÃzÌœ(•,“£UêOZÕauLAì(Ðv;ÄüY(Æ•—�vîï7Í(†¶ívˆÕl—2FÓ,®>T~X»4´ÂêãtÖ‰þ|׎qm·C«lKöJjeÈò¯J„kê­¼¼u)æyy_¬$€m·CŒûUj5ø~Œ‘|Ž|ßv;ļåsÚ42Oõ•?óÉ—óÉ*Täïî´¨39ìõVá˜>«GÆ¡–ï3¼s� @Ûíó‡ù\B‘Ïg~—ÃOí( )¼Ó…cqQ¶ñláÛžÛåpS]…@!EwçžpdZ ÚÜC é¾ívˆ=.±3Ômç™Ë™gÚûGMuÖΣÀM;�š ɇ¿^û"UÒXâ¸s>ù¯§zØ:/óŸ©.ûfùT-…@�6-öî ÚåÓ«Fâ>• µë2µk`æò‰^‚qm÷ÃE —AH¨» (ÂÃUø’©9O­±½ˆÑ³_„ÿ sïaXJU#{]Ùqºô¬gÓá²ÇU­àS* ]@ÿV•@î�PW P÷ÂŒ½FaØñ÷/È}³{afÔ½ì|Ôûki”ûÅyÎÿëîïk`_ab›n‡Òƒ=G0üüvƒ0bÇ©2V^&à´ÄÝ%àôDàØ‹œ¦¸‹C} 21i7ÿ>•p9JP¡"œpúä=·(žèn"Ö”sƒSyÃS–{Ǩè8ù ur;õÅÑu[[àÑF<Ú%£(Ðæ‡OŠŽÊ5ƒW-͆}Óîõ…ü¸Ž¦”…·D8]Q·DMýõ2,•'tö,ï&á%zKŒ‰jY ÕB^”"c¯¬�þ6weÅó·ñ¶HÚ½lõ4ª}IÇïrøµ-\RxÜî&T¹èr¬-BÞÇЪ®ºZÓUhórÛ] À—D—ø]¿¦«(´ðH+-•ÅôrŠÞ/2œØ&_74nÔ1îÐÂ^០bp{îdtå ,y_-jBí¹-N í!ZG¡0¨¦Ñ$"|ÅEèZO U)»ž�ZoÈŒäë_xï«Åj ¸Ó^"ãæ!¼µFÎCÜ­5og)YBIÆÝ§v4˜gÓ|²›³`öfAzy›Ph»bYªAW‘¶Ž„ìUÁŒëen X†×)] ›rS€ ´ñS@Þï}T×r¦€e«S@Œó§C‹}ý­ËFŸ ´=�>ÂÌñ‚&iæÜMÏÌã,ÄžÛYˆ(¤è¯Kì­÷f-òz ÚÉ@´¼TO!ÐÏ@DÁq“’Ï€Jj~¨µÌBÏîrØ©¢B ð²-¼¶J Á][E!ÂäÌžÕÉ™È}°;ÔÒ8,9Üù~€~& Ú¬K•*ú ˆ˜Âé]¨_½>™fáz¿çw9üÚí(¼ð@ Ó´H!¸4-ÂK§�ÊÞ`IsU•Ó"{šT!ÐO‹´Ä¸”(‹¢S¢�§Pï&Û:ÔPÁQïþ%\ŽT¬(¼F�ÞË …àîe \kÏï‡ßÕÆV}%+×㛦± @Ûí{wŸi“ÕG/qµ™ ¬è�gû'Ðv;´tâÐ’UWCnX࢒ì±ÈÅç6ë—;æëÒÂ8©¯ò¤r$›ÝÞ»¥(Ðv;Äê (ݼy¯ØM†ï8áú”Ëôí¹ñ™¾G}qùlH11›ÛÈryÙ°‘õN¸¦C3§Ó6¥ž_àM#ë;ë~(ú7�Ч\ìžÝ.¶ -;º*ó¢Mr¬yýÅk´@�¶'¯{,Æ¡ßâ‘!Cn7àÖó:k–ršÑçßÈ:„m¯}ß½Kn¡íùý°ÐZ �Âã,�I µM{}A$ÞpêoÞéœ1P ívˆ¹þ†³ÞsÛÚcXÙé`ôÃÊxÚGJ{^?DJ-PHÁÃÒáÔÚ%˹×gÈȃR ´Ý17mj94í•·š'÷ÎZZ-õºMï©*Æ ´Ý-?ã­ÿUÆ-%U&­“K{±Í¾ÅV¤Š�m·CÌOŠqé7‹>B¶”²¡z/ÉYbnÆ0úÍ=ägÛn‡Û‡øþÙ‡Ü^z9‰ìT*”9Ù¹gprÏ2pÃÐy–�P•AÑšnÔ#΋‹Õnúî2°òÞ¹¾¢h€P5…@�¶Û!ö`é!»E5E0dû8}ZI¼\––̆ÉÓ½šnB Ÿ=m‰ùSfÚ׌¥LøV3g{v—ÃN“—#÷Íâ‘ÂdeN.YE rº;n|N·�Qßëùpù9�–»W+›c¦°ÉŒV‰BœŸ( YÖT^nÏ�Ï˵8!%wUŽÊeéÞ¯)tÙ¦61YEŠ`^²)¦8ÃQi~ ­|ÆÜ +V²R�Bœ°b)LvåDàr]Q&{Ópã³7È}²»¦ÆN:¦°ªT„wÏåÃRû·AË:åÂü¿íß,P íiÿæ\^tz?·×«ðHî9é4r3w h»bþÔ}jÕ‚mØÚ»—øì©…)r‘Å×ÝE(Ðv;ÄêL‘I½^eÌ™Ö%÷k^ªa^œ@ÛíÐzè°ZàjZ_�§šw(�� á¨/vO%�‡7{nrksS€Nr÷Áª°�éç2]ãèÚn‡˜ç]ãÃ�½Á^ŽÁªP!PHëçžË´Ã”~/Ç·m»bž®ðÕÉ~ιœ9GÝ¥(äæêj/t¦?ê#kæ5I䦚 `B ~Lå…í\¹h|=ÂUJ™ìËë)¶âJ˜—)c @ÛíçsÎZNé8Û“�”,L íA ã0êÙäv|¼‡Ök!õŠÑ´Ç@W @L³×JäxYF™À‡’|çyèç4­@÷Š�ã41î�aÇ»CRv/“–_Ô­ öÞs»&Ún‡˜ïц0 «²~\”™R–s‰„Sy‰ÄQÖ_Ãçì<¦%&ç+MÓ{A:Êç¼ µn´ ê«DNl“>P¤©aÿø÷è4k¯Å|8<ÔŽ“×Ω‡ÌkwäTgLÛð’ÓÙî†�C-†�ÏkŦ¥ž¾Î5#Cœ@ÛíÐz¨&±ë!þöÞv�z`¯St=Fú¸\ó>F €m·Cìá`ˆÃ[FmÃ2ä®,¹×ƒ7�h^‹¸QÃ娡YVR§U’ôе%¦õü.‡_»…ž2xÌÜæ žKÜv þ㸴ûÇûå ö¦¢(üÌ´0韂KúG!⤫F:éõÏ îå&õÁ›|ª_/ EÃËù>pÿ4“÷ðpm7Òòó8Òn³¤U¦õyÛðü`w9ì´ûB Ð²#-Ìÿ!…àòP.Y ;ŒL–âzÌK–r.nmš%œ‹ßÕ!Ñ©árÔ b…@®3Ä¥…×H!¸ë(T!œËn{>Ç&8&põÜßÃ>ú \–›Àeqt2äôÉ%pÕÊtË<¼Ê}s \(Ðv;ÄüeÞõèâ�L×gf] A+ ´Ý1.Í6é8ç\ó« 5™fk�m·CÌßÄÅÏ(â�CÕñþ¢m»b]¡“¶3.?¡VkÌ‘7¨-P ívˆ¹Ç%±Aâ°o×ÝBKæ’@™Ì@[’Πĺ’¶ívˆ=^ .7­sJñîŽôíjpô³(qáæ†žßsƒ )<7 ñ~79 ¹ûÝÎ0 —Âü\SvÄÒî°Þí$—B h{Z �ò£8ÉùóãÚÓKÐÄ �þšc‰±æÞóûÁÜ-PHá]mmºVå |g›è>ìør츹XPÈAAÍ£VÉô<нÃùbxó›ôÜ.‡›ê) )ºg:û¨Ý;�ícz~—ÃOu…žêÁCƒ G~4eÿ¥-P í©e£nø’Ïw®¿(ËÚž”å,n!Õ ‹Á�өׇguù&=–4J¸%¨®"œÐ ÝŽŽáϰèoÚÇtJ¸%¨P!PH�bÆFsQ¡ˆ®¡mhÁfˆ‚Ú 9BpVd·v´áž�ÛöRZg"à6´äDàmhcãÎe¬jL¬¤ˆÒÆm�m¬qÇ(4ÕÁ޳>g"?illµ:\ŽTU!PH…ª‚\2VUNµ T©j¬ª¨T5ßölØÂPçc~RTgÞ^u¶Oêk‘Bªnmn €Ü7û �‹æm{ ;v—ÃNU…—=ìU6ë’›Š<ƒÇ BR\¡£ /õs*ÇJûz¾†aÇîrØi€/rí/´ç^“p·–™ö(™RN¸�«²Níûmx‹EÚn‡˜;#jFDZìu<‡U�é–£eþï €m·CÌ?ÉŠq¨íB‚!§Q/‹d˜^;»qlò¡†ËQC³¬(¤N�({2»¹:T-#·cWŽ“çzDû±•$€âÉÄHeŽU–Ãж=)Ë1­ACªóÒ²Ü{5\ŽT¬(¤N]mÚ÷còŽë¬Òñ»~*VRx&�£Ÿ"Hà°@ñæ['�ƒ™ß�¼aÇ;ÿRöÐùÏ¡—|�½»í•kG8ÿh{rþí)NŒÂ-X Ä…ìÈý\3¨¡�•äÝóƒ7Û«ÄÄJž�¾7k‰1Þ¬ÅÐÞ,2£ww£^|9J]¨>ør>¸…¶ ðÚZ˜ÅN Áe±£±_ßóúÁ¯·@î‹ÿuÜÊ잯Àmë/þ« ´ù.¥·z¤1WpGâ¢kÀ¢°}~)jÓ»�Ç©¯Ì· $ßqm·C‹X;ŽcÖ oÞ#ü²vP íií€ —]c^ï3'<ý³Ç°šáýÓ?÷L¾zê?œöY �¢šõ‹Ð&žá©HD7p‚NB)ŽWb6“h„õ»ǹDß°+aOœ_A-N89_CJËS´£¬âÞæ‚»¿`�ÑŽ² »`yI´¬^ü²@!þj/´Ó�¼7Úö5Ôö»R¶Ó�È­×m-ûˆÃæox½�i9]§‡ €BŠíÖ®e�KªÝ´Füx”-å{„ÙkÅ’”ô ·C¦ü¤\+g5õ$·§{Yº…wŒFB\’hÛ§‘N—ÃI•á¸oeû¯‡�]Ä]ÁŽ"4…×08Mq·0¼þ�EßPá̇»¡’FI®{§šuß|9߬RE8¡Õ”ð*)w—…ðÒã!Õ¿g÷Ãí ä>Ú5ããÏô×»ò»w¹Á2S3Žpþ场GÐqûá�Á '¸S/,÷ð‘½Ç­ùãitä‹m{Ú·Õ ö&Ejßqm·Cëab,Á®R\u^,ÊŒ!í¼çŒGžz^¼=Yœ�r;ö«,¥-a·PVGf©sÅ%©{…¯d®~;ùüÿ&SˆóÓù -î:†Ñ·1€¥KOK§šÅ~´í^ÿý—óýª¦(¤2™M}Ïí‡M½Š+:nê)Uab8©*.1ÜSÃ<ò|ë\s >X-¨X!Ð> J��~Ú¶”’¬¯B„†Ýå°Ó. �ÂË´0ß™‚ËwF!â¸LÏ뇸Œr_ì_^«×íÏSdÏrS=E8?°‡’{‹Jùæï¾ì-ß»cw9ìÚ••ï8¡%Jp.ÅŠ@�K9BA´žD³8î‹ÝªGZc–rb¹ý©]\|˜iÏWÚ_×>ãe*Sh{½…?ÂïU fˆsª³ß†œ ¨ãBGÊÒ#ÃûJ½%¿lͽ„^Ï»ÉâÜž¥%æÉ1Þç#‡|¡¿MM«Ëa¥QÎ(¤ÜTðÕ~ {u4@un¤&<8$ÕÄzj "¯†y �r»éð›&e,ïªG{I]Ùsµ«zBß…Z›X!P ívˆÅaÌ$Â\~ ÆÏuŽ79=‘Ç›Žžœ«‹–šö×5­ŽÝå°Ósà(¤ì6¿s˜K>Í–+eë—ô¼.‡—** )¸MkÊOÈä4�­flÏërxµü(¤àTßaí7²ï¸Úo~ß}WÔ4é­¿iz™§( h£ÃPz†OðãÔéÞ 85û)ï4_óÍ^ýΦ¬N/ÍÐC @Ûíó'ª‡�ÓRCB†\O{ÚJ»ïrÔ�>~½pRÒó’þ«²öš‰7|ZV„Ût;¤TÕýꆮ¹œ®Q¡B �ýÌå7ã($ó›¹Qèå7£fÉQÈ%Ìz£�éÃüõ™ß+s…íC h{êC¸ÇÃ0É»Ý/ùyC3ƹ¹SÔɹ�KQçæ†pøbߨ²âaÏõ3Þ|ÌÉ›µ¾ú¡›ˆ.œˆZÚX€nRs'†Y{ahPœCç­–«?óí´6/D8wµ¤HCÇälÒйälÏÐ ‹²ÃZ*Á¶ýs‹ê»…·(‹®‹]= Z¡x[¾Î<– âv¾�…N€&Uh»b…¬ +&êCMöìø]?+ -<ÒšÏW|=gM a�m¾Ü$°è Õ–ßB™,P íiÀdzbœ½�Ñni ½1g‰=\Ñß=m«⨳jhWl ?ìP§Î ö¸ï­­ £ñ†�%ö`Z›fà'�kªéÌ�)_Ž)«X!�P®ã'Y[šTDv¶m»bÊõ�—ýÌ/¯Ö¹í�2~�Mª'¶évH Œ€ü«þ±š.FY @Ûícg‚uÑQ’ï5l¿Ì(ÐÆÏ1ÕPÄb²:ÅYeÕòj{¾ýòÓtd�mOÓ®·1ûBuC0üÿYû–tÙq”ÛþE¶«±?¿ã`Õ²çß½’°,+²þÖÉÔŽ!„�„¸Ž¥¼äÜ]qó¤¯Ó^Òŵñ^rZËVÞ²¯çãËOû0⸠ï=nKýWm�BŠJ¹êÔõ¥hÁ¶Þçª-P\Ûÿ⪧A÷T¥í~7—ñÕ(® {k4êbœWƒÁ�Ó)ÊóìeßaÉçWï÷Ë ¹ÎóZÃÞ‡^jØŵ�€ØËíúUgÄô55²oø€ŸöaZxOkÚn%w? a�âÚ°Ð#…ãÂ�ò:ã†êß»Œy+k½†vû/nÑŵ½út7W/óuÇk©±9É[ ¸¶·I~Ñ¢Ÿ�«­>²Ô‹1�ûFxÂm_´¤ã:–C_8öh%¨b…@{Xblìaqtìár:…ábhoV1U,ÎP]ða‰¡R>}\Póµ,ð“¾;*S„ã0ë}v?8ƒVòy¼wð«ßta‡¡­j q8êpr‚žêt>I>ó5ähÙW™B 9,16ä°8:äð 9…B '>«˜*1c¢˜Ã{ÑÖ|E&ŸX¥™Ç0�«X!�‹&^´5–9gYú{95–ͳ%ÍF5{ÔHPÅ �âÚN@ìÅ‘÷ºÊû”sjù€Ÿš|^xGk)�KKÒíõ*4)„ŠkÃBÀÙd¿Žˆ¤ïW‹üÀOÅ �ÜW—_é1º%Ÿ<×1¼¬÷»²ëZ§�2^ó=±�!P\Û ˆ•_-Wnrª;‰>L\´Du›U��8L´ÄØà( �£„þ*ÄD†F-LLË[XÄÄöCèøÃkÀ¶ýëø£í>þ°8Î2^4å&�¥”N-c­™ÉÍþ'®íeö÷Î0ߨ))¯ùŽÝDkÙ©E…@<ÑBÙ­d‹e)·æ<Û/BX ¸6,ê°äFt–[«Okù€ŸŠ¹¯†y�Ø}YªT”ßkÛN@ìEYÓ•˜˜îÄoã�à�U¬ÈÍ XYáXz�Ò]Çí¸V¡ZªT!P\Û ˆ½8�çµ #Ž`È©”òìb‹ÉÕ�?'®í-â’%ôSþ¸œl½3[ CXb”Wõ߬2ÄÞ˜RXžå[Í“šÿµíã§‘Ôý]™%÷Ç<ñ[b/ÝâhUy†¶íMYÌTҪᇩÄ…Ô)ÒVèi=;íÃØCs¢3~|èò=÷oCõ1­ UTR�Þ ].Âp�βÅi¿%ýbÒÜ<<¬<‚yïä £Îƒ¨Q‡xÙ¶·Qg߇L¿JKØJ‚c\¡f­:ªL¸§Å¸ÇQŽØ1½K¸Qmß'œ.}tY:¸ŒÔO^¡åvxnuZ pÂIn«¦ŸLºÃñÈ ¥ÿtèN}5ñû*S×vb/ë•çu ÝG0äʹ§ô_Ã…Ûö_”Šk{sR„KÈU-2lk¸Â¹‹×öæÚdƒò*PMì8}2#0QZ‹Ád_R Üô8qmÿr–N/Îä!3=P\Ûۦ⼴ †œBaö%áø"ƒŽÜ}Ì9œbª¶B ¸¶ÃÚJý¼—xçÚ6µüÀ¯Á(´ðžVZΩ/浯Ñ'ƒÁ‰mzUŸëû\½>Ó^ç<`0 ×öf4&``é7k±ÇÜ2Ý6ÃðC£ÞÃ6“+†dýMÕ…ùqo• RE8®'`¼ö²a_E¢ŒÃ�-C �ø~+9ëyÝ.Ú­¹Þ\Õ¢"5bÈžËÕ22�m¯ƒ�ë9‹×öï{.×ʸ|ƵT¡zÎÂĵýûžËu22™¤m¾ßZ�˜–7oõý'þ3UáX_Àå ý¹穆æÃ’ߺæ¥üå°^•âĵ�ž6˜eU¯*Šy}ˆ¬%42?\ŠD„q²#o×q¶%m¿ ¡©¿<û”ÕP%ˆpx YZܯh- òmÖƒ�åó5é¡õ’f 7¨(4L l(ˆÛŽÕ�Ô8j¿œH&”áPÊ�†_—óIØÛXfÚe{$x~x#»€%ýZô¤}Úu†ü NJ`ÃÉ_¿½fÿ}ZV‡gU‡Õwó­8ˆÈO³ÖÖ)TQ¾cꂈudIqã|Z¯¬ÈR£?n¤[œ¸6z´‡_ÂÚ²×€mÃ¶ÌØRÛ'¼1Yœpý ½â~… ÛC½ygwÞ«}7ìë€ `bZN@Û÷¸^£¢¯ºmyŽ—*)„ +¶£4•£BóT6Lhþ%¶ qóD€º|u;Ó2ä)¹Žöˆ“ïKÛË4k'æ£@åæËÿå*Pˆ£t/�T¾´•m?Å»?‰`qâÚ^D”~²é§Ìƒ¾µPD ˆ»¾³¤°�ŒšÈL£lT/‘/�å†=öáPµáÄ6�€6–æ»@Õ³£»Ó’Z¦ÖÌY,N\ÁÏùúŽÊ}¹ó¹¨þi<ùâQ&3M� 'ĉk;-ìvcœ3 ŠàgÛ ‘!ûÉ÷ 2lXëu£ƒ,S¾¬‘»`Z>1r¤MC .Èóáõ<6ë“*–W‘¨ƒLŸ6|$Šqå6´X-«%ÇÍ4½hÉîLä+­f›¯?À׫@NHM"%­e_(áæz² awvÚsNhÉ¥mÔÍŒ•¬¿H`pb›°Àœ·Rïy˜ö©’n™žY)ÆQŒw%×RÜ ¹ÐrâªÀvý–q®þ± **Šk;1ì ×R¢„Óµ“¯Ý•ÏÂk»RÕé/ýô+Šk;±»qé7Óµ`š?]Èð³m§§õ¢«ç� mÝVxdÄÖk#¯I¶„8qm' …5~‹g§Æ뀒;=¼�ÖS€×öfóŽ”�îX|TH-‚XÖ0âcYä¾VÚG´K�£ï©ïsýŠË®Ê…ÕnÖ'}| Z‘P\Žz»ê`RÍe…0ŽÃ'·œŠ@ÏPºj(‚ Ú�"ôc´z'jIPƒž:¤ô`Öµ†;íwà»Uœ'œ Ñœ½óIF¿ÔÃ=-·ÃsÓ qBKnIõÝT49MS®TI‹àpâÚ � ÷]¹ý= é+ö‘¶a׆mØÇ;ñGxnY&æã)ÁÛ—±¤Ï„“Ðc©â› ½[ZðŽ×0oz§ê(‰k;-;Ð ˆ7UÁ‹³4˜%*Uކ)äó•Xó�Ž4ïåí÷+I”/Ó0~¤Šqb›N@Š4¥¾ŸÊ×Ý8Ö–P\Ûë0(‡iÜs)uh@}?h`5�Ÿî qЀ,­Ø~,‚5ÏÉ4½�½Mw¯ÕF)6 ÛvZ0HÎ’o—7¸/Ò˜êáMµÚN€Îì Eõù q¯q\ßóŠr8qm¼¢RŸï«vñØ×N¨ øœ‹¥Ï-Õ4.©b  }:bܯÈÞ‚ÔÛ¶—ÞrGÎ!—üúº]ÙóÉød•* ©?àªû´™Ê¯†+1`ø€ŸvX^xGkèKÞá¡R ׆…ðûÄy öË kØ€�J¹�~b‹ª4…-ƒZé°è׌c~œïpT±B ¸¶© 0(†r—*µl¡?£B…@qmØi¹ÜfŸ¯ŸŒšÎÒ]?» £®ÇS4zŸ†�qpv³¤^z¯W¹sŠíîõ9,ýõmúÍXøç‹÷V(®íİwJêÌSó6”W .“MK—aËG_40JÝüaËË[€âÚN@ìÕÖóÎȺ,Û8oÅ^Ö}øë&ÕÖ^lcMk®qxØz×vbx{!#|€¦.pÑŒRJ]Á„ë«G±C×{"�bB ðnÍy™–úîÉ…•qOvAÂz'bA}è­9—¢*_r�‰VЀöVäúA Wqç¬;¢6Î�;*Ö]vd–í:Ý–©ç>ÍKök;ê1ŽuÏéæÏ2$Šk;1lXi°ét<ÜK3nðX ¸6jáwó‘–Ü6hËî‡Í_ RvnO3çNËý«®^w%÷4-P\Û ˆá»DC¯g£Sÿ_�¹«S'¶é¤� «ž²_¦zÉÜ]ͱ—¢T¢‡¯æø Vð"Þü80~Znà¦÷©˜prSe^?\”18AbseB«%î¢ Ò“»­8è ˜·zeÃO·F*RˆÃÓ­S&¼}Öéøï�-»°ÓÎ �ÂËîhù <¤Ü /Š´ì~ˆE,�ûhrâŸõù‰`w_#f~‹×ö6÷[ËŽQ>ôQMì¸8 ÆmƒV îYÇŸÔ3Á†j*Äáƒz.pa‚’–ÙA‰ )yWÓ ×¾c>¾2hF@sàÜ— 5TM!Ÿûòq ì¼²J–~­<Ö«`p¿Ö+‹Ö&}§¶Þé pâÚNO vž»œ¸ÎZð`Þ«_VÍÔÍ˳óB ¸¶{9e¥ÕŸÝ�LËO9…@|%Ó ë©»ïД3 SÉIÊ£^ãÌ«ö눣9ÂT/Ñ@qm' ¦fÞ?¶×ÓŠ!WsŒ¥˜Ö~`¿õ4j~08ZþD3)w¤Ù �ÆZ¬O+A‹èt0ÍãŽ~Z}öÓ³ã4›µ?­Fš5wZ ›õµQÏ}æˆ}\®£¢î¬ZËúsêó T³”ÊÎñeJ½?ó9Ý×I?ÌÀ¬=ñ‰QBÊì¨ø£r${î°œ"<žÖ²úá|šrŸ3ÊwHË¢¯ß«DÔ9#‡×vZ䩞nÛôâJr¬Ó}÷‹8Öã€âÚN@ìåîפùש¼:}‚�oêBÅ �ð08ÂAí÷~ü~¿ )<Úï�óÐ~#_Å"ØÜ©��ØòÔ’Ps5�Æ�`È:˜pCÞ›uÖØ0;<3•(‚ )v<X¨sP^týd[ÔlÞáXðC[¥ �ðð”0üxà€B ýe®z™dﮞð'kÜÈ®Nü;¬A^ÂÚ–8?Ø-N89}ĸ¯ÀMë}°ÌmÛý³z�8r»xäf¬áÇoÆ: �ÂS×­ófs¾@sWØf¯[; ¸¶ó¡I¾móO9‰Ð­/¿]{éš?Âá€ß¯ã¸ÅQÃ‘Á 'yñ/Ý_9h>þõ ð�ئ—pÿŸ{z­É¬ï¿z¯¹¬ˆ— ° –EóòŸÊ†>ÚnÖ*NˆÂ¡¶Y¡0¡ÇZê�%/6Ô¹ƒ‹=,N\Û[ôaïä¦ÏÐíÀÛ·û@Û„u…àpdáBnîoÙý0÷[ �²Ã8m¼<ëRs:.Ìv“ºŠa˜ "fî7ìè¹ßá„êj×àüË;Ï«ªBkPá€aƇ(¤ä0¢,Ϙ¦N^òƒ¯§›ç0Ï×ËPPÈ �:wèÖIä±Cf¡„š|íU¢qìö|—¶LŸ]Ù´æ’Q8ü4¦±@ˆ×§D¸[–©õ%wu£‹¨oËÖï�ÊŒúj¶º�V'µm' %ðc²{ž¥ µ`�âÚ°ÐÆè¸k±ûϹ¥i×ÝåH^‘ªWÒ©——§b¾ãÄ6�€žÙÆ­lÈåüû~•;ïÊÉ¥a­Û}voXeŠpb›N@ Íýž"«.GæÉÚ–·÷í×1§Ë{Iõ¶ÄÜ[bøÁù–úÇ[ �¢‚W+×E_³êûû½y÷Pl+@•*â—b-1ùþÆoËæ‡7~-PH™‰—=Lw�óÞér=dϼìé�âÚÞ^ölçzåVUì¸×‰ó†¢ªÚ{[žn?O†ø§íü‹�*RD� ¢ç?™ý,?úA?Rx`T)×ñÚ×nXôDÕ2�Õäc±³®çÛ'Å@qm' †]å¢G¨–i«¶åw~E¬(¤ð¨Óô¼÷ŠGèb­U¬(®íÄØ‰¥å÷ÃÄb�B ïwKn+o”Îe9]?…¨²"7�‘MÃí‡yÆà„œñ )ä닾·jꤵ@qmo´ÍV0(?µ©žvÜ<‰Æ_¾ÈP4¼ÞdÊ+öaÉ”ÔÐsÝò<—.ûcüÅ@qm' FúÐ4\ˈI±ê¾þâC-P\ۛʚòý¦fpoâ�£Š…ö´Þw´Ôð˜(¤¨m²»ßS ºöÍœ”ù±XÇ^½e¾j™/Mó}l‹Šk;1èÄ·´F›¶|yòºÐÜo飯%_ÃìôvcúM¾o™Û¹Ò8 J\Ûi)¡%TúIŸOà ëž4:(é1_¼¶>1U †}•)Šk;1¬§4çt›^N-))Ë/‹5çê/‰ÐúÐTŒ(»¡ÅêÊÀhU9v¦éMQƃo¹Ún‹Ê/sg…“Ö=°*©"…@qm' †{/Æù~)b1 ¹Nft• à©‚»ñUœØ¦7EÙ9e›çä³ôó8\#öÉìðÌÔÊCœ°‚/ýß�I¥•E9—~TrtiÈnù^xaIƒXëîíwOÅ8qm§§b¥dPµ33M' å–š[òñÉŸkš.mç@¡PÙ´\¡UG(Šk;1xoi1S>Wýûéø€Ÿv]RxŸéNC¸Ï¿OÂ�š!FžÛÎ:öC vÝ~Úá\RËï—d�B @<=ú©^¥"æU:np´’ÓZ³£ÈWCö_„°@qmXÎ�’ÁfBÝZÒŽ NlÓ›¹î Q^E$‚§M°؆-{´L¼_^Bk±*T„À·~d׎&ã3ü´ÜÀMû. '8 ½çâж~®Fø`u€9Tgÿï(�BûÙ˜Ò‘ŸüI%q³?R“ŸV’¯˜îê.g«�h@Eú F�î�„JGçkW×°y²9,í¯#„´„õب�³kp±£¶Êáb6§ž8b3FCÆk‘Õ XÍ�«©»¢§òï‹c[–ÜrXETå„8qm§§.»¦ßlÙâÖ%Åß׈m˜€™Êá„-gÃOñöQר‘ (ScôäCZNO\D‹ôÅþÞ˜ÈØŸ³&û3]gqtßy†Üâx�%ªL£s¯ ™¦[Ð-*S„º‡¥v­óƒ(® {«üd© –eú[²Së4¾oyW�¾@¤m8 ”ÿ þ“u±1â”°Cþ¼È­õÏWö«Ušïa4çH¬CÙ§XÓwð| Hlà üÝwH¶¤rd Ýó-LÄÇuš¥BX‡…pÖáÙ¶Wë0ç�ú\p0çÓ“®êW6}pø>PåD0ÊQJóë–½bŠÏ.wF `aâÚ hI¼y‡5Eð³úåu+Ké5WÑQÜðÿd|œ¸¶ÓÓºº3¯R×<܃ýAüÄU/!Pþï$õZW¨/Œ;-Ã×rª8ýj¯°Iéä*sÍT™"œ¸¶ÐÂ㕾é^ç:,Û/�epb›^ºªÈÓÝ!BüŽS‘‡ù~JjÔs[¯6—&ñkþjúä}¢BE8¡»×QÚË!ç¡Àû_D°@qmX´æÝJÓ"ûªƒ±åw~*Vä¾Zï Ô( ±æ<æ�½D5ƒ¬Ö’ŒZÔ%·¬«<NlÓ H½ÌS̼±˜§H´ŒšÕcÍëßòì™»f+¾Ãp´ç¢u"nX±Q° '2ê´¹×Äx·ë`]4‘¥Š¢ppabT�ÍI눲ºšµæ±euVu•ù'´ØŽ”›R9 ˜Õóç¢�†ìóµä¿ÌEµk"w%¸9Þâĵ½ÍñÞKÇ8j©¢†\ÜÖ½J˜>_¸–9-ýËÄaæJÕSˆÃó†›w)GÝrãµÅ )9œbõhÓ:–¾(ÔÍqæ«!W@ÔÌ^Ÿˆ(Šk;18Ëì]§'âRç_+Qnžw@qmxž>qŸó>XRü^×HVöô›µœø[óE£»Ãb À˜À‹£‹ ÃÀÊ´½ 6é£|§¨–v\#O¹ëÁ¾u¸·é[ƒ=\?U±B @ë·ÄØáfqôpó 9Ësï%X—߯ÖäiÖë›Ké÷ÏS—V/UY!P\Û ˆÁñÃ|ߨ®~\Gæ¾w[ñýsš¸»_ÌÝŵýæ¾w×áùöMóæî€âÚÞÌ=ö {·”iê±�ÂyP׆ÝZ÷ÏmïåXnü%žW9–˨€œ€{§× Ö|Wkúa: ¸¶·èÏvÇ8o.ª,‚!i{[¾r”û´ÿ(~ÓqÚÏw QCu!P\Û ˆaO¾/êd¹ž†ßøi—…@î«_ºlWÜÐß󥵤½ïsÞ{X†ýqI'BKrĸ_±vÉ·mØn¨.˃³ÿϱõþC—9 ¸¶·.s™ g{§j‹` Ü{±¤I‡AWïØ5@ *VZ§IèbÝÇ¿Ù.Ûûµt~6šñÖM „]我]æpl—†¶íè2£¾Ë�ë QZåÔ6×û+ W.<¥XtÓ.ëV j’«�ú‡P\Û ˆ¡Œdö,Ûª’^×[ûR�-}M—kUN —ŵ�€î±ç»Bí›`Èökö¶¥í¾ æu3Œ—Ο0�bÝXbܯhM òmÖºôšs–»~âeníGà£ë|9գ˜½ÞÂ^óo‡êÜÀMu…s84­gŽiÛvb¸ ûQ¯ÊíwY†ÖÓÀÓ¨X!�ów/ÚêJf#/ìæËnûk©7ÖNl%¨b…@qm' ö¢­M?g�êä–ßøUÛ €B ïiå‚yåÒì¨5äh!,P\uY~?§ÜÓ�««iù€Ÿ:ÊÈ}5¼M¿�ý¥öýá¢5 C²ÄXe�š·Ï”ºŸ”e�âÚxeMwM�îúš9ŸÂ.7i«ël¨R…@qm' †•㼊X CV¥9E‘Û–þÊ“ÝäýÎç˜.BÄ@¬KŒû­ D¾mÚ@n1)Yõ‡‹zóÑøh+rª/¿êôúR^Â<õP× �B‹škWå_å]÷·:-¿ª‰(®íİ&ò&óøÏóv=© ׆5œK,»g§Rý}4V -ä@ á+@Ø6,@ù¤OþΟ‚Z;ÖT¬(® W¾¢å÷Cù RxTëc¸+u]CÅ—Ú±…*Tª(®íÄЪcé®o™ëŒÛr;7-²…ÝÑò…åH!¸Âr^ªQËŽ/BdqÜ7¿Œ)™‹ü6Ø¥P[„Èr«õb¾ã„ü¥âV®Õ» C~øútÜÏMõâ„–Ü‘òe÷8¸ª{N¿Q¶/¥ð\‰Ïj™)W�©å_… �âÚN@Œ«ÎdQtu&ÏŽÓ'ʽ®Zª3…kãVC‰û…¬LáA•*‰k;-¦`Ã* D48AR£2€„’,ŒU’gÇUzDƒÓ¼H~ø½~°V~]†­F&¶è j*Šk;1ì»cœëÕÁ�êeNWm�Æte�âÚÞtåí*_ºÏÕó)×Ë@Æú5»ªª JáÄ6�€Ìì‡(¯�"Á�ÖfKj躢ÄgÅ]F�׆E@ŬsövМ×zبܳûïõÅåG½>$¹–g§OGûð´U-!N89} »ïùAŽy¿j*[^à¥"E8î{Å“J?Úµlö§Æ8#‚ljkÃ"¼”�Õ×Òï×Lr¶}ÐbÞWO=ùW™"˜Ø¦ÓSB°TxùQ‡¡Zýƒ×áy©õF0¡Ån) ]?_Ï·OõyhB×/V‡¨ô“Mýlb¿Á@0s�ä(aÓ_O’,K}Ó¶ùü|¾Šá¨H)ßê\þ¹Ÿi¦%08±Mo„?J?YÔ1,³>�^$ ˆû¾³´ÀÒ/ÁºëûúÌýÐëcñóT ¥ùþª”&¶é”°¥„0ת¤˜Û—–R~Ø£}Ô€ÀÂĵAüû%ÃzI=ý­uÄíwˆTäÙ¯Îß�,D0±M' ô2š#˜3µš˜›m{³­)/•³ù ×+ZfU ò°__5 Ä6�žê œTäù{ON‡çTÄ aÌ—ÂQ>a™W‰â‡$lÛ h‘FÓ8Úf J(oäC.»Ò`CL�zÕb‚‰²”ÒÁ¿þÍtèä`b›^B'âNåí›;.vs«�‰T æd^Á`N3Ë£­ân‡ç¦ÁTˆZrC Í@ŒìäD`¦é–?O[÷ÁÈéu�ޱdá=Ζ—j)€Áñ쥆ëØM{w.,NËìðÌT¢&¤Øž�›¨9þÌDíø£eÀ¢jö+hYž•M£>V%3™’üÝÌ70¶´“iÊ ŠùRìíÒ8+ÏÉLÓkà`xÕ%Éw œÔàEñ¢Æ+Êâĵ½)Êyžµçp°ß¯ÅaËìÌTQ †—L¹Üû”´ÝaüƒÙ˜©–˜PRsOäM›º‹~®ÓùFžŠk{{%�yM0uxI�Ã-÷œ Šk{yPðRÓõ"æ¨[¹ùyÑ]ƒ‘¶S×)*OªóžÝø›ºúÜ2eÞ&®íͼmt£¼•‘vœÉ…½–fÁì8º¥>mLušA‰mzé2뺌ï‹ÿþ‡áÄô)H „ƒÀjâ3‘„£Ç¶�€˜?ÕÀ \g¨ŽnTÇ2½6O:oß9l®Û LlÓ[ÇùÙvÖ ýyè5kìH ];±ïb.Z•Gu½Ðj¹W%Å/»¢Îµ´8S²(Ö”<7J—è¡ç©,ôLõÙñvÆ:¬NªP!NàìçÓmÂ*ïýŽútw?züàT:n-{”S¢>ÜË¡'PjK‹´¦å:Ó2,u®å¬Éâĵ½YÓuöcØ®óJ°m¸ë@ �Dωi›+ñd†%)¹ÏWF¨é©�'øÛtzJWýÆÛI~ý±7�ê$”©µ¦mzÓP½Ä½@Y×Uùx`¶»îÞ3çúÊâĵAM&%=fµðv˹Š?ÞnšN@J»l¼KÿÝE‚§Ã,PÿôŒî-ûe/é¥qÙ«=¿[µó$mÔÞíu®‘µ\9|}ýtLËDÕ¢„·=M™V*ƒ�µ¿ƒQŸÙŽ.aC Ðür‰‰d[n?D²(¤èhÂÊæBrSý�µps½]�ª®B žìýR®­ÝëKߟŽßø©¶B ðÂ;Z>î …à/\RïšÐÞ¯pÜŸBÈ¥òÊIœé‘�`ø‚%õ}>m?œŸP-ŽÓ~<[LÅÈÒ¨(÷:˜.,P\ÛË„�B‹âÒ¯®¡9mÅå™4î°~OÅ �âÚ°E ÆfõR;�à‡œ¶%Æ*«�$~P– 9〔hò9!8¥ïå/æ²ðÆüî²Înºƒ<íý#ÓâÄ6�€Ôµ ú„!!ª£ê(ædÛN@‹TѪ{³Sú÷|¤Ž,P\–½&�/ï”ÆiîÙ¥›õ.jjé‹KÉußÛP\ʺ¬÷»7 P\Û ˆ©DYCU¢)Ÿ.–ýzw¾p¢ÿ¤ib 6nK �¹X·V‚*Ñ)È ,1/劾% ¹WT)꫉ÔëdCk:ÕÈC ¸¶·¬˜7_µr‚7PæÒœ—¾}Òå^«…hAÅ �Bª4|{—ÿëÓéôà³@qmÿrðmz2vÉÅ×_ŸŠkû_ßv�±é÷ºEB> ×ö6ø;ßòM†2k¹cÚÌ NlÓ›‘ÛLiÒæ^~³Ýó»ó†—ª)ÄawàäF¡ø:_k¬ù¯¿–ìÍ€:œUª(ptZb¬;°8Úx†œJ½COÓ@Y¡¦YªÒn”p%¨P!PH�¾Œ¿½¸ÜM_‡µüÀ¯Ž¿(¤ðœe¥Y½KãvÆN‘–e�âÚxËò�̼斥æ—ImY ¸6^[1Ϋ¡ˆÅ0ät Bâ­W†ºÀoµp-¨T!Px•:Z)Ë?š»ºø$e08±MXØ]{¾�=Lc¯Ï‹Xn‡ç¦2…8ê‹‹ò¶+‰>ÕI¨%~âjÈ!PxI—\}6ý*‡NÚÏ õPWE„@î±ûzuâšïóþ „Šk{b/%’vîc-õP/BÄ@î˯¦°= §¡~ꪉÈ}# Å|·— JÙŽ¶ˆm@Z}[׆£[?™§ÙbÍÏ–§ ¨¤¾Ëƒˆ—ͬ¥´rjY#8ĉk;­—9³+Ã|Ün/í¼Šõ£*T„Ã^úd7äâ?xƒNN�è[—²ÅÖOúpYÖy¨HŽó`/3€1 »FšÁ '9X_Ìy§tØÒ8ضŠÊ«’-?Ÿ0U= ùÍ—|õc=!P\Û ˆ‘ƒß.ßèÁï×}ÜÒuß2—Ez®qìºoÙ4Y?–¡^Cù»Ï’âÌÜ¢X3÷Üloæë¨C_'­^*TˆÃó•Ó&\†ã¼�v¡Ê“1ƒ/-Þrªz›ú‡“bŸŠk{| û¦2c¯ù”µÐ�‹Ï_ó3¡Cí¾HܯÕÔ”Q×vbm¡E¼ Yœp#.僌®OP×¥|˜ æ²ÝÐ+�ºO‘|Þx-j@*Vä:NÒËPŽêå}øK.±8qm8 QÝú�Òg^(»ç7<[Æ_pâÚN@‹Ül¸ý°ýhp Þ}΋LsIõõë�7^~ãUE‰pâÚN@+ÞÞkñ»{&œÈÌVÌÜçc¤Ó¼Ö¹cpb›N@êå Zs[­*RÌ�Úµ�þ¶*èò!>l÷VêÆõwÎû}&åÚ0û!ãjpÂÉ �tèÂ|"U…"|—•Eç ºY¯üôýë P{ÙUïèF8xÔß›å.�¶Üø[ 'œäð.uPåÇ•R=…Å�LÓ (q]×ï»Æ{sòvõZ>Ów(®í­÷€¢F=°�gtýbw_Öv‹Jáð}YßŨZ@žkŸ7ÜÀM-* '8w�¶åöà Z (º¿RJiÊß`%UÅ]aEÊr•tm•/Þ\ƒÈ]ôµ*¨…¾ãðE_¯N÷î`qeŒ>*g<¹€[½Ëÿ'´àŽ’¿CKŠÀÝ¢õB šÊü4,¯ü‹¿ŠÙò¯BE8|ÓÒ"oöZ}·×óãôék/»¾)“†ÄUqÙÕ¾µevK±™kßúн\=×–_ÏÕâ„“¾†2hÅîy¨%דÏ(…Å—î~:¦ybä’*Šk;1\f6Æ¥ß,Zß?ýf½Ë©3 Ñ£)–~ Œ~¤Åó³mü#-¾+üódrÏop}ãè§I¸>ôO“À'mºòâZ~ú j¹QÃÔ b…@áuêhù9H!¸9¼°ËÜS(-¿ÞP±@G�–±í؆ú¨ÿ÷?¿ãEõÕËÆåîÖú¬SÃíÜT3!�ûæ—Ë«|ùÁ… —/ã–y`¯µð[ ªX!P\Û ˆqºòo—�ºâÞ.átãè—^8»â^z‰uìÕ b�Ãé”zéÅùÒ gXè¥FYG+Ë3äÏ�¦Õëð§ú"£‚ƪAÅ �ø ¯SôìÓžÿsXúûùÊ–ÝØ©T!PhÙ=-ÿ )÷ T {€¥¥þÛ3È}#؇G�¤ä­½Ò­Ó-÷ºŠŠk{{]ÅsŒó¯Ü¨²†Ü“9艇iýr�Ñm­#ø'zlç¨!…@ÎDXmµü~Ж )Ÿáu^Ú{Lh©-!_Éœ€«dîEàÞ{òE>øÄõzò ¼ŽÕiy�‡W}jáZP©"Õ)Ù�h˜§„�`†]õtÊœb—ËÒ\-ú–µ¡‹Ñ[Rpq¢¼þûŽ«Ì¨Š>+�+¾O½ WèO¬–«yWm‡*Ñï�âÚN@ ûäçÌBõDð#ß;؇Ë—¼ŸZöM�xÿ€j&Šk;1¸qÛ‰·ÌØšøÇ}1î¬ø`ƒ+x¯Š"DPÅóQ¿·n„·‹Î%Q0Å#99˜]D9#G{@ ×öê]o­åä^–ü:«â¼Õ�Já¸~€ªÚtï.‰k¸€[�Ù¿ã„Zµ –=þ=P èhüš²0ZUÌó%¬²ò¢ì(æ¾zTë`¼T¬ˆ<R)ZŒm{éú-Ǽ§ãvn*TZð–’s]æµÄýe^-Ç…¦UÏæø“j-÷�› `耛%ã�¹Ô‘M‹¡¹šÛƒÓ8é `B ÍLgö3¸ÉÌ<ѯ‘~üéO<tÌ‘`Ïrt 7]ºEÅžç‹ìzÇkKe»ÃŸÊS™Bœ¸6xÂ-ÌC˜ÑI5–˜8Oh(Q‡. †=séXQ}Ët:ÆÇt{Št[|ܱeÆw´8!�‹À6¬~¨kpÂÒ:ºr³n¿xëµfÕó™WSÚUEŠpâÚN@ WZ�qNÚq?J›Œ¢üÃ*œ¢¸wU€¢êVØeLýªWÿ’7½.Äør´ 󪤇«ÑZlé^£+÷:v”*ÁaðaÖ³·M´ 8€êùâï8!•Yg’«æÛ8•è:ëéÇ:P÷fÄÙÒ³zñ1 ÚW±eTäkær*âjæzÁ’Â}¹˜‹(jÔURŠ"j±åF#UML\Û H¡I7F¹.Q-ܨîEZšv]™lkùBy)V8ÕJ,óPÖ ûö¸¨ãĵ�žaÝî]Òº™‡�uÇ–ä+0S–ÄÕ_F–_~~òâ¯>·(¡d.¥²5.QQÖ+/;ß/XÙw=wèn3«0!N\Ûéi]E:51Cˆýnd1#B�èNxØÃÎTu€–Áš}Xä›�{âÁ‰ÛŒ¯ÎÙ W<Üu%zÝq*®jÊÏ-^oyÙê-û�ãùŽƒWÔ-©ïw÷í¯Ù»ûž §Cêrz~ƒáº»|½?A]N·0qm§'Å]NORnS“@a/§[œ¸¶ÐzQÓt—U¼ŠäùÒ›æâ¹ âpåMp‰Ý_*o‰ÿpÝ…”\Û/Éñdc>I—Q®ˆ˜-òßÿ08ª> [4¨åÆ ²8á$/9vªÜu¼ÍΖ¥°H‡~„ƒe)üXDO•ú¡Ðr;<·ZÕ$À +y<Y¸RàN:/ÚÁÓ^Ël¹JÖ³¨PV¢@NÊÅ–6ïl,Nh9{­M1Îw!WÈz‘:1@ΗqΦåöƒ·±@î›_憵¬6¦kÖJ-®ž›õ$ª«ˆ ºA·äŠcµÔ¨sg�BŠÊßòåŠÈâ[\½"T|ËóÛ/ýík-¼bÞnãDÓö äÉÁ ³‘`™±; 'œàŒšÊŽt9À8–U¬žÜ°ìT5Žûf4¼ÆY{üŒÉ'¯ðR=0¡¥¶„ü>3'·ÏìE@û¨zû� ·pÓ¨0ÂQ,�’?hCŠÀ´ñB¼œÔ2ÛÓ-¿¶ä-�ûêëä﨤–·xK\Uáð<t)§þ†þ&å6º“"ËIòqz¼Zâð>·¥…ó(í¯NûÅøâzÞú;ŽRº@JþÔ)wìÉ Áް ¥Gøžà„Gý5Ïz8rìïÕáÓ<`*U„£,T %ÿV)÷Xš‚{˜¬å÷ÃÃdÈ}õKM%ž\º9?¯rárì˜[®7.ÒæØqéçÇ.E ×vb/Ö=h¶e¾OÅ4Z8€Tª'¤F¡®ö’µÏ&¯7éÒPÍ:^Òÿ:šžþkÔòjãgÄ…8qm§§Å^HY:]ªíÝoR,N\Ûéi±V•†n&”+àvû/Ve�âÚx«š¦b�9‰·¿�AãvTW!Aàœ�¶´yö8¡å¼.M}Ÿ+òŸ–øˆ×Pã;Žú¾—i¾ØWyÜùÚ¤›»¡<“ž†2%myÿå™ã€âÚN@ìõÈj;ጛnÜõ¥L7Yœ¸¶·‰xïã€Û[tjr]J„8œ‚àÞ…I-m>6µ8îûðR¨<ñ©Z(¥SÑ£'5v:åŽË=�(,N\î@,šbN–>¿Ä_ÖU¨ã/dÖÞ µ´y'kqBËéklqBJ=À|% çz3ÎåHMJ¸öÞwL‘‚䲆ZÒ|°gqB‹iGhãÝø�m`ÂùIp‡cK *שּׂך°ßöázg-Eˆå¬ù¶•³Oé7Ûç½4(®íÄàá-W„Ë¿ZÖ«h°áw~*VRx_'9¯pò²¦»î4÷[Z‰uy�”«Ï«®’¬ù7y(ܺ qâÚN@ «*y§M‰÷‹Âò_SËx½ÚÜoÉ~ÆDhÍõ©·[¨'®í´À{ Ê褊Dp³m§§ekUõy;$Âk¾3¨Ûoù³‡5õû8¨@O}T�Bœ¸¶ÓÓÂC¯O«ù%m§ëf÷ÞNŠP!N8“cú­åÅ÷›Å '·/ì+×®j)îj Ħ”‡=Ûc¾Ä2ý`J'®íÅ”L-Ì-Å5]òôYÁ“z³´´Î yæRÐr¯"E8±M' +ÌÆ0ÿýE&‚§KྦྷNa[ù·À†b$ÙXFjŠºóÃY·yÇ8qm§§õ¢¨5C‚­³Úi~4/q[¶¿AÍ©å_áÄ6�€r)„ÙŠz׿K» ¯ÃóR5E0aÅN¾jÉmÛPä­Ç:bô!›�÷êÌ(k¹ý0Ì,�ûfT¤.ýªÏ¿/Z¿üœ7êV‚*VÄVm‰A]íåc¶®¼y:nà¦B…@¡E÷´¬õÓBøaÃynÀ·ü~ñÈ}5¼ ¼¥ÕÊ�í/W›¸Ü×s<`<«TN8×€l{³"‡5?'z©¸ávxnê‰Bœp’£x;©s+kÉáL†%S™£w½#bøL#P\Û ˆ±ºÊûæë´¤ßþ ¨$mËŠÜÃhÄ7FEæË ‘aŸm{åMߥŠGg 3TA!PÈžE+€¤Ä“gêû=>ø±ÒxÎeÎ,ª¦Bœ@Ù -VWF«Ê±3MoŠ²Ë’üuv÷ëžÿ=� ) ­ÍyÒ>^׿ëG ñ×¾ŠpB ÊPÎ{ô©%¿ÿ‹Yœ¸¶²�å¾w™K¯¹°Ñöƒž,N\¯§ç5P¤brê´ëÈüÛlc]_c˜FЀJá ±ze¢¡?šYÉ×±´Ã[n‡ç¦}â„•|éò.‘êkr§%~⪗(¤¤íUó)õšLñ“¾ê´²–MƒDwÿh%Æa­ZŒém:Ž•iz30¶’w]Óš÷‚5ýq8}T™"6 K ÛsŒ£�É3ä:,¯“·(¹Š~¼½ÅS PBuÚßqÂé³¹¨—~°”õÜ’úw«‹{0:<#ÕQˆNhÊœÖlŽ%ç»L?X“�‰mz³%¿>Ê/¹æCp{ÎÇ�îû‹HKIfîÓÝk!N .--¢Û,„í6ÏʶñÝ6êÂ|ëµùü|¾ á„Ó$Hú¥Þ-y•þÞ-h™žYõÞN8Á¹Ô7•aº%ÏqÙdîßŵ½eÿí µô«NS;Û¤{˜h/ÉföU¬ˆ7“ü6µвûa À…”Ýe¸Ö½/I•m¸êöYÙÙÓåÅC9œÓçdt™8»¼dV™œ¸¶ÓÓ‚©¥5_ý˨îJ4nà¦BE8ù¿“Ü[lé+â‹MÓ‹ñ»�ÖB)�4¯nd9saG¥u8²|.2ƱÝEîøù.»[Õ©î»f Û®9@רLŒ2ì�\n¾áõÃv„Á nF„:Ú”’È m¤&`N³ºˆ4¾n‘ ¨P!ï�8m¢¾ËöR h®i¼evfÚwNxÁ-)»…Šà·^¸Ý%nߨa÷ö‘ÁQ_Œ2GñV“Û Öb‹ŠÚìF&�f»>;º~¿Õ»7[5vF•ô%mÃ È ¿W¦V1bwÝ n¶{ܾ¸iú:ÇïT“ýÃíU£^b¶ÒZ~?ì¥Y �£lH.z[’ÌÓ½™ãveì>YíÁˆ7fЦ›ß*i©ÿ°{f�BŠ »lÓ¼à8×õ®ß‰±;?ª›ˆ·bü6³ïÑrûaßÃ…�ËOSI©Ìýç@%‰ LlÓKŠ8ú�ßbQ¥¤‰Í´ß9íe]òQ·O~Úd´ŠḌ8™el¸ý�e48áçÒCs9œüܦ&óC(®í-CdϪÄ(ŸÙTMì¸4©KðëR{Y“œcÍQ>²Q‡SIÕS׆S[ÝCšr“ûù-›°QiB �2S Ù­Ü'|:G.!kqâÚ^²L²1á)RxFÕ\²Ñâĵ½$«oºAˆòГô17J™_-iÓuåšVrëú‹%Y ¸¶7Kr�Ã|w¨†~\ßÂÍ«EOÚô�’¾Öºý\óh­R>éýo(qm' „½wŒóÝ¢ÖM0äúéi-òi‚åz‚¥?h¾oÍ9õt§ÕB�¸¶Ó*?)Ïg¥O[êO¼Eï�ÎM4±E[b¤E[mÑžŸm{³h¿\ÛÊõ¾äB»KéÞ¦[µT©"¶jK‹µj‹£­Ú3äú^€ún{F)UQ±Á>NOÅGIÞr  Û뢴<<Õ–¾ã„‡H;y/"‹Ý¥À·ôûø§»<®‡Å@<ð-1ÒÀ÷EÇE.ðù‹�[œ¸¶7g,É~ kL^ ¶í_›TÛ/?Ø” ÙÉp&Ùô @òouxlå×’o®Õ<$¨® Šk;±—+šK^¸>ˆ·ìÀN•á„Ý’JƸ](‡ý,N\�r{ÞU*'9ƪÎ 8 ¸¶7'`×Ý,ýfÒ ´Û>gW(~`¼9b/Ê*USWLÛŽ‡œÓ‚*+Â!T •¸ë­U*ÂfЈ³Ä^”5•q¹lý}‰øiÈ0d•*ÂQc k*¼HmÙW™ˆضíÄ ¦²ñ\vú3ö {W.ý(A­=B×àˆ 2Ñ=Ÿ&/c¢×nfmÛŵ½Ù¶1Æõ{_Ê×—qsG–Cà/1nÈ9•²Cõ…iû†œ±~Ì9 �æÆŒº=EÅ¥¬“ vÔ9 ¸6zÔù"{êò¼Ï÷˜�¹ê(®íÄ^ >Äy5¨Á 9�¢Åðz%`û{M»þ-…PGu�^ª²B ¸¶ÃQÝ^ê„\�Á~০…ŽÃðs¼Í¨X„8¤´µwsI4ÞU>Ym9 ¸6Z[ÄöîH-žù´o³´ö~¼\n’uÿA×ö&DßÝîT»ß{JG½¹oëÌ=…ÄcAíwTjý¤á_5¡ŸtÄH?ép¬Ÿ 9�RCߨ�ú(¼NÑ詫nˆ!̉ »l,É—<÷Ôø¸q,p,*VÞK•I-ùô÷½æÌ§šª4ü>vŵ�€ØÕ�%윶Û4Ô@½Ž©È}£Þ„X>W!ö~QóžÆ+¸Ë¼²ãœSDÜé3Òý^¨óô)ˆÌŵ�€Ø‹Í¸N¸ /c ’Ò”Šk{ј³úU;õƒkù€Ÿj+bûðÂû(�øš~†|Ø8ÙÆðÙð¢Ô€lÛÃ*Í'—gÅ]“)„ŠkÃBp=6¬%Çúr\�Y ¸¶·óö㼊X CN§H[ƒËXÆþ¯Ó®nÕp5¨X!Px�:Zãrwu7ÿ"„ŠkÃB .Ëç;ŠN—ªù–ßø±b ÷Õ¢F_<Äx§0[ê ®º �BŠêCÅd[{ùÍvÝå4ÜÀM5¹oHkêµ[Ç©ºfR ׆…@VãÒo&›Ãž†d‹aˆ:̃‰öq/{:÷kV Ђ*+r}!�Ö´k“üÄ•z$…°@qmXp6jŸV P¶òvÕéø€ŸöXä¾»æiÒxë¡ùEW¸É›^+ŒV‚*V×vbà”-�òJÐ.$Øqåt•Ï–Q1Ý–ÅéÊŵ½èª-„°OCY¯Í¹”󠔇²Ôœ×>¿wr8îU¤(®íÄàM–}Ö]Ô9/•.\ÃïüŠX1Pþ…÷ý B_Mwªû ¥+©šyküJjÂŵaM€ãÑû|mÃ�õT‘áw~*Vä¾�°´ª-ö>뫚‰Ð¢=�Vᣎû|š.oÖÍãcyâĵ�€6}=¯_®s†k¡™Bœî1�Ä@qm' †{p[ô Üiͯo�.>+aÜ^:b˃§†–!L`¨×’"ËD‡•–WÛòR"ƒjyº¯?À׫H!PHU^S«Jw¸g§]GX ';´§^QŠB‡¥®9ö{û­‹•(ä` ”•ÏräÏÿæ_TÕÂÄ´ü/jÚ‡¿9ãRÌÜÿ¢%ƒÛô¦#à¡vͧ¤H¢Ò¾Þ»ß׫® á_í<Šk;±U­Úåý|åÃZv`§ªŠpBŠn“%iÈ�Ö-‹¾SXL ­œ‡)ýa½¬éÉ»ÊÁĵ�žZbæçtíﺂò:¯"QˆNl˜9™Êƒ’s·Õ„¹“)Í›ùž9Å=óÇgF8(“%õ²0X¯#BŸÐk+»)SÒ„N-K©�—ìaÏbÔÀ.‰m:©çû=)¦?Þ‹—Ö¶‹]:…@¼úð+jyвã×'¤èLþdètO¥>tOçO,P\Û[þÄ„št'5Áwõ.þˆ†=—¢‡}B >¢á¹ÀÃ>îCËï‡C(¤ð@Y±Žýq •ŠèîlÚðÊïÞϺ†îßö¹mv«žþ €xŸÛ§Ê¨$XËî‡$˜ ); ’Ìå¸r.G5Â<•OšªX!oßú ,“›k¹ý�›³@!EÿêÓÇõŠ.æ;SÈùt ×öæÓýÆ{Œó9@UÁ�K(ÂãJc9s6§5Ùåâ\ÞÇN"ª¬?~>‚gúr¢iÎ~}qÃíðÜtú qBKîHù}\Nn׉@eÄZn?dÄ,�ûä— Ëu𩻇çVŽ]Íé/³Še“]5ÅŵáÌPV óZ¨Iñ�§RNY~Ï™T·é •åΩœ*|f»ÝÆs+A+â�gK …œËP^¢$Znà¦iÍ(¼èŽ–ßõ%…àv}½\Æ×j”Nùú®`­Ío·ýö¼rªoæýpåçw¸U#ñŠÑ¶�€ÖËy ¹lÍÓ”WÄEÝÍ*ö°|º)À‰kƒ+bn>•ê¸%}V÷ ¸¸Šk{Yƒ#'4k“‚ƒ½…‡ •* ©P‹,£†š]—ÝØiF8á$‡F£P*aÅÜèü6îüÎ7 4î˜moLä6gMh›‡q~·€sÜfH�¥ÿy.rZK=œªb"œ@«÷»Ü(óÛä0ã¶+è�¦™ñþ/O-@ uœ}ÇQAu)½çÅäJÑŽ“SÎu¹ó÷öKÝ “Ê(®í-­\ëû(β_ à.Ãézáð½P�½8ázîYÚ>¶{-ì`ó{4ÜV¥(¿“Ã)ŠÛÉŠb6½ÜH#÷¼˜‘Æíxņh•R5EX°m;1¼/Â|Ǩª~t/;ZfŒ–Áí«Q;†á^ ï)j/�ë'°öK‡’<™û¾FÁ­û;,ÿ*SˆèJÑþœ#Õn5ò"Xœ¸6(Z|l]YÃMkÙT(Ä“oUn×®mþÊÀÄ´œ€öÑÛ¦§OºµZ|Ëëp¼T &¤ØžÒ¾ëM� \ 4J ×öïôæû_÷­CuÓ¦ÔPº®×K&ëp-ˆð0qmX4|#½yn*ÒÏêFb£r_Ê¡©aý[¯ÑÖôÿú_%Špœ Š'•$/7YR9ÔŒ'® ‹;j,}¦diû¥Ï©¬V§¥Tø;¬ŸSN\Ûéi�9:¡†¢ÎiÙoTÃíÜ’P PHѽë%>Æ÷ŒJ+�êdBSC×™À0¥Ç�×”Šk{Ó”5ª„ËÙè¢àí[v`W¤ qBŠ~çWÒ—|²mê÷ûVíþn®ÊU®ËHîÕ�×vZì,ž¼—v÷RW[ä Ä=Ìë Í;jÖAÛc{_Â<\§ºýòQ5ÑÈCîõ%(Ÿ¼^£Äò;¿@!…÷´Œ·¡ep8áWó¤º÷–Ñá©ãqÔÇr΋9=ÛE€SÇXNýNˤqLbW2Õ©eÍçXëš«»qâÚNO‹ú‘Ÿ T/ qjZñ3LÙo«‹×ål臘ôå8ñ˜†Zy"Iƒ.sêõfË» áÄ6�€ }’°9¯0�û­í†ÙᙩH!N8Á‘õ†Ÿâ{¤E¨€î]Kj4—=ìšÕdE°8qmX?Y+§­ç^ŸðN¸µ$;¶ëΊí—Oö'¶é¤^újÖ#òÓ¬¯�[n‡ç¦Š qÂIn�l¤Ÿ_™@¥Xié„ñú”5Ÿ=û*S×vb¸÷Æ®d˦|^ðÂ5üÀ¯ˆ…v`§“\ö —Éöe†éö[Y£:¶éŽU ˜Ø¦ÓS*roe§Çk<–­§$wW ¨Õ@• Šk;±2Ó¯eDNk_�¹�P|„ qMD1 7üÌg©ÓS¦rßø²`t &=ïoîØF uu±?ö!G<‘¶¼~˜I-PHÁ9ÿœ Ñæ–iÏçù~pÐ(®�wÑ1ÎÏÞÚ�C.@‘G9û•`}>±�ܨŸTY!PÈù…™:Zn?L(¤è/>:pb~N¨^:ô~ÜS6åJÒêÞ¨÷;6‹R·l¿ãð…ÏÈp¹–†Ý©ƒ£¾–ãȵÑGýÑÞ¿äYZöU¦ˆ-–›i±8:Õâr¹+ºv¯åí¨ñ²U” B…@á5êhÙ„ -“(GB0i(Ë�NCy ÷Õ/[Ê».U’nÝßÊb'µìù,ãòKª­(®í-Y•æá|©kÚ–û€€³›>JÉçg%ÀˆíÆ#G¾…Ñ#ßó³mo#•®~3—ÓiáZP±B ×iyk&…à¬Ù á ÝugŽå)\lÉ-÷ÏÉñˆ-Ù{™Òôñ‚²ÓtꢖoùŽãìáeÓÂ,:‘Q kÖŽP?þ=e1Û¨[©³«v¶Ã˜Õ>î0w.3?ùWN•­õJYÃíÜ´»"œp‚ÃÈuÒæ²Ý½Ðp;<·Z±%À '94ì¡ä!çé ·pSEE8!%':ϧRÈÞã¶}pÿ…ªò9NU\®†TU ëuÌýJ¸tº4ŸÖ;¶~²ÿ8„ï0qm§'…Í<q¥ÓçM³¥†Û¸©š"œp‚3¹?¯]2÷Ç�=˜û#T…m”®ØDÒ“h³8:ÑÆØN´™UI‚-Åø†^i[%@ *T„R¡Tò¯áöCîÏàÄ Ž3‘šÐ>£&v ªÉ[Ôø·–ÜêV¿×ç#�T¨‡Ó‘@›ÉÆv].Ì—nh€vMµÇ /§%å7Î8¸}3$‚O¤6ÄHÀõ}(U�|欚[Õ´ûa‡c^•á¸M9¼2Ìš1¦J½awvu7ø;NXÉûR!tX’%÷÷ŽqÏsËtùངçË0Þ%s ¸¶{Éà?7>/#+KÍä>[ÒTÅD8qm' UÆÚ®‡©RÛ4Â>uÆ©¾$ÄQ„²á–oÃÇ}ïËÙ©P›Î:ëÜDôeézŠdíï]ÊkÿqÍSsúd�–Gâĵ�€>$F>@Wû!ÂngÎ�“.AúîÞçs#«[t�ž†êrˆ�xhYbܯX“AÔÛ6h2p7ú:Ï�¬~½��?>ùŸ¬R…@áõçh™# ´ èèHì¹/-7þÈ‹ÅQ_üÚ[Z–u¬ç¯v×:¹¿îš¡>ŠúŽÛtR¯JÆ(Gi}õ @õBRŸPUn¦N®>—»Ÿ;}|�žá NlžßËÁ™ìÒ¶q¿-¯ìÀ¤–{¡—e÷•óˆËC ¸¶{ñ…‘£ðe]ÂD†šs9»¾Ç’/&÷¿¶Škæ]¦’|Àa–zÆ(¿EŸæjÇ])l—Z¶§b"œØ¦�bWâ–ýÄãF 7¶ NlÓ›§ äÕJLœ™D�½\+Âe¿nuÌ¥–}Ë+öÏrwÉ×|?sùw�¸¶ÓÂAOŸoC–§æ×õÕ.9™~©èûJ�Ä6�–•F$ã-�~¤r«0ñ¦ZœrŘ1ðY"Í»E8�·A '&Gb¹±9�Nòw»yv.]`Ó!OÓyÇQ™=¹õPË�_ÿYœp’—�²rŒ2—¹~Ôx³Ã{³z{(À ç¡Ç1sra7jÃþÃ\îpb›~˜É•v.¤º?HÏûª5`o:sZ/Í«é&¶é”˜ƒËPŠ1O˘;䇃(®íí (�²–*Ï3ƒnÇÛž€øï( ÞòöÇ)P©u,…W²ƒß¶×¥8™Öéq6)â½AKìåXIó«Ó©ájøï( �:E…dÂ;¶¾ôH=^Îåê˜pÊrÛम˜mpd}q7³›ÞÞ<(9}…í­×©ðq†¦±ØXl=÷…4ÿx'×r#wr=L à`'7V“ÑZŠã6¬#ønŠî6Mš�½ËMÓ¨[ n×ø¿ÿ¡pâÚÞv )Þ±"0û�@&žµìè€Ö¹o†4kšz™ª:m`ê¹Õ“ÚE´HtxŒ£»2×û}QÇÄ�åqQzè*¢Ò£"m#CmÄ϶±Ávég]þN÷ÖªÛÚ°Z¨' ÞÛ€*5yK�Ny ð¢š»†Y;Ÿ}Šk;1îW~d?¯ä97M»+‡J§4ý]—8̨)*ÔÑ>“U!Œ6OŠ1 �â,q³m¼ ¥™36ã¾=.7<üÍá5ðßÿP8”êÚ×AÕI,Ù@š`á²×Øk•)ŠkÃÆG[©#¶,ëß:>�ÙÅîìj„ô'¤è/cƒÀÊǪO]}�ÈèÀ×L›v JÏ·(®í‡ù6zô¶7�÷ÖûÑS¹¶ít”^:+£~ªWŒÃÁÍÍ~/å¡gÝ„ìzèaï.XÓDµ~\e„Cœ§…–N•x>};Ý®1N*8œØ&2¥P’£ù¹û|L°Ú¦K Ù4XÍþ@œò95&)Ôrû!)d�BŠþnA_4ìö¾ö ç$àhÓ›nk~´pªÉÝìó¶üºÅ\g¶ìßÖ5Íb·P!N\Ûéi±ÓmpðÓ­Å ¼P–¾l%k:îŸ�=ÎÒ-P\Û›¥»´-­·|BuJŸ^âžmèÿæÜ3óú7–nË&e•/]Ý"pâÚNO ¿-¿‰²uuÙ`8€“ ô%¤Ì.PZóC¨ùˆQ.9X|ëÖ­ŠJóRÉäÿÈûÌSw—Ì"`b›NO VßÒ fȤÇQkÈXf‡gVTã„Ü×cØò<³äŽíþ`G[îU¤&¶é”XËn˜ñ†m`B‰ ÜR¶Î1£²C¾`£=€ÑªŠ¾£„´ýåoÚÔov“~VC÷°tU!J8 Sh[ôµfz§£\Fõš:1ÛÝþ°�‡¿ÍÒâ~ÅiÑnÛ€œ[ɳ¥mÝç§àSUžF)yÝaȦ›ïw'>Yž•vPJh4\’2·<¨–þO?#¿Þ“ÍzÊ!Ãá˜ßÁw˜Ø¦P‚j“ßÉ”ó˯Ë6kqâÚ°]1�4&O”?e�2šï%‹×F÷Só(Bì(e‚Ù(ì_¯‰² N™–TšÓÕ.—Ô­?ˆ`qâÚ° Šÿ–ß*.Q÷|«ÓŽ)ËN…ŠpÔcóIv_œCŠÁ¶‹vÃíðÜÔ¦CœÐ’/Ú£órMç-íÐVµD8áå´¤¦åêÐ=ÿË‹`qâÚ°~É’ã«yit7MEwóp›ð“})‚‰m:=%l+Ê~‘(fF)ÅâS¹C—~5ê ?ûù‡ÿ|)Ä ­JG*ýµôî4×~âD°8qmPPQo›Ò,ÜX\ËíÜT¨Ç}1LVlÓZë¸_qHú�¾è·»Ýß“•)‚‰k;=)<Ä"”W€Ž±˜¥KJKÉsíY¹9Œx-Y˜¸¶-íU¤{>O&—×[yݵè8˜Ë.^¹G{Å= ÿÏÀpâÚNO ýdse™•àËTGƃÝØ©b �²ûeEø-¾_T¦XTsŠZFÍ(Œc ÇHEY ¸¶7E5Çì·´8È_²¤ü×ï¾\åùŽ‚™~ CÛçj&K¹W7_Ï(?™€™öØw”02ƒ9s݇’7ËÿÖµÉóÖUž‡ýŽ©!·gÁ* lvp9Ä�ûr“(�“œÛé:Íðå-b�ÄÈ} ×vb8ðq8c/‡·•*Ä m{¡è¤äf¨™Ð¬)½yÉ¿-Ÿ·jšdÙj(o·ˆêÞc×vb‚h�Ý$Nr;É -yÔÄÚWœÛAi¨RE8¸…bIQ{LÄn2yfœ2á¶NŸS©�×J¼ùþÿÊÁ„V¥¥ä7(¸½$€Ý¡jHó[F}4“õÖšvd·— _¾÷{YÉ“u'@‰m:=!æ7î;uД)…Ù¯ð©êã¹Ì¿’ÛqáöC•¸Ý4ö“®º†<¡—¯�U‘¹ÖÂe!O…T%E0qm§'ó¦!Ê÷ˆ*)æFv®OÍ{¥p»#œVÀ–Eø#Z Ì~ˆW2•äoJF0'_ÞöCì×-êÈiýe�ºLéWË}Œ£áw~Ú]!Pxá-¿)B ÁíŠx!¨-ˆ–Ý{È}4>¾5”0ß@»¿ÆmÖX~jH!o×xáýù‹ô·’ãÈ æË54ÜÀ­nÓ@áEw´\ŠŸ”�Iñ{ ¸ š–¿AcqÔ¿ìk¦ní?5&]w Ý-”ÙyQ©B ¸¶HËï4�Bp; ^˜ØwéÞ–ß)m ä¾úe;½û§dwßÜ–—jê+'·½Ðp{Ó.þ„0^àU÷¾€„ØÓð{A$sn;È GÔ\NcåÌεY²h®A['@•*‰k;­S.5Èn«�oÃîìÔ’#œp’#EÅßâ;F…"”Àõ2§ªe*©�%_jØÑ•Škû_´õØÒüAU Jþ±3 R\ñGFºK|:!2ÜîËšmÙ×ëœé�ôFÝ«€Bv-Ã�SË¿öµáúl:©;ZËšeÙ†J»Ù>û*S„£v¡ó�Ö¡¤Àr)‡·ñ•„MÊž* Axl5„HSn0œ6Mÿ¶àæ“0`ƒ£TNšïR� ¶ýMó/ök�âÚþ ιªQ/€Îë/&l�âÚ°£y#Æy5h 9�¢>,õ†eI ÉËç¿‹NÕU£–ª«'¶é¤^L}P/‘Ïa_¸†Ûṩ¢BœÐ’;Rëxéw¹>%‚ʼnk{!47”Ubذna+eó]ÿ*§àÉCä›Ûk·?Ž Å@ü…–÷+VˆzÛõÀ æö“ÌÈ)íA¬óݧ×ùCïø,7í®ˆŸ çÐÚ­U*j”XcIáþ[»¿2Lw-Ãoî®Êá8çñâ÷ÊU·ä™¦¿e® Î÷–—D±Žø§Õ¦Bœ¸¶ÓÓzÑ —ë1ËîìTU!PHÙ‘®¶IÓ|É›w××4üŠkZK6rI‘ð]Qˆ Þcµeq´¶”ÒØ¯H7àVzz»ru{~VªPê?×m ¸¶C¥§b”UKíA‚�m;1؃i�™SÄKWJB!˜ïs!PÈ~fTÕrûAU(¤èÐôפ¹\K÷lŽ]æ—ï¨^cp¼‚Î&€âÚN@,Ÿ£Í µ5ï¯Wf`]ó–c~KOÄçJ®P’¯æß‡Ï”´ ' ïã˦r²m'¼¯Ó}nv¬uÓ¬Qнբr|G¥øË1±RüMF)Ü5 p�"çr¿^ˆìó)ɵ˜Ã¤o,Y]T™B ¸¶ƒÓ=ÀµVzØ)2Å(b”`=-¥ b9Ï«ù¦|Ž©œ¿Ï/¯KÙÞ«¿©2…@qm' ÆêÉê—Ó“ïb û¿ÃZN5'B¶íÄ^¬ü*I²Í×f§é–tË5ò" �}üÕ#ùËo¤Sân¿!×ĸs¿‹ôÑý.ä‚ËoÞ¨™ËoœQ£Ëo„]³Ø‡k'ž5ê%moÎÈt�ª&âCõ¤[1©äJú_Qƒ’¶áeøxù1ºV%D\ˆ.óqr¾¶TŽ/óu¨4[Ùþ¼9duPýp×vbxnXKD9䯾ü@Ëïü´¿B ðÂ;Z›n¨æÚ^Ã/2œØ&,uuÔfîâh8˜Ñ}Éà'ÄÐ¥naÚ¡wÍ1>Ô G?|Ì‚._Q*çV——bÙ¨(_AÀ£xa¡c� Êp®ÒÄvˆ†±!{iÒ£üùô�RnÆÅáÇÅe2ŒšØ­lWÍ¥´ü¶ªÛr²Þª[iøW™Bœ¸¶ÓÓbLÈß%欈»JüomÉ]™ål‰º0û¯liŸõ2ÝÈÛÑ"Íÿ¿Øð¾ß þsÕ÷~gCi LÜ¡±µ\§�È@½EèmQ¹ÇÏ™5qçš�,ì…­Ã_\&̃»µŒ†•¿GÜò÷÷Aop»í﮿®á ØÃºkÐ*Êwô¯èB5ñ+fdpwµ�ºÐ”³w×Þñº”øøÐ|¨Šó$Œº �n:´ç©ŽÀ†Ña©,H�C3ñÊ +¡®“ûޤTão”ª¡.”;ÕØƒeßäåòÀb¼ê`}ˆå2«î6øæ“ÿÉ*MˆZ}–”¿6MI@Ýšvü©«å-/új¹…Q_ íeÒûŽó^I7¼ÀKuá„»ônã}óº%}xÒª’&œ”°ή©±q»ï5“˜¯‡^éÉÿ3�œ¸¶ÓÓÂ1ÛrÝ×�ë÷ZËqãDýL„ƒ¦Æa;-3Þv,N8¹¡×‰”ë ¥NQ§P6Ç™ÓЕ÷3ú®^nä¬ÉÀÄ6½Ø’+€b?àFW€q!Œ.£À¸!TDÁW��Të "…=B©Ò߯ïÖë)€õï®åQ×ãt×ÇjL¦ÚQ„×vZ/Zˆsf[+Ê„ü¨!î�õ³®Á>Wü@*S„N›\}çÈòŒ@Å÷•08 ç a å€räú�o6n+I¨HßQØÂ}M ÎÂ} ιÿΠøÁ¾”0zülçnÃXç’ïèIØ–ÁahO…(aD…ÕßJvrܪY¶¬ÀJÕ…”Îl½ú‹Œ¿K¤=ø€Ÿ** )<MæD¢Îþg\4épâÚÞ¢I°Ž¾Š†Oã]‰Ð.l¤¨B…8¸Q§ q>~t@!%�'þ\WW7ó§Z2”šøN\ÛËDLüʯu´oòÔ FÖygØë±½ÞÍÖÛ;föV�|AHÛj|éò5­ò:Ñ^Ï"QÛà(®íÄ^NnÍúÒDwŒs[hv{[¥Špx m•¯c>‘œ·¾ô'OÊ \�| -aKÆmp0¼™Ï›Û<|°âwPü•h7lÕH–ýZ0•äPÛ--ߪš'®í´^Žl„8óí*Á�Ð"<VîòÜ)r?;6ê¨ò|á©Ñ¢ºÌfÞÉ#rïd…0ro‚ì0¸CaÝp¨Z§€ºïõ§Ê8êa òÝ^*¤Ê“FFÝ©.¢²0±M/Y¼è7~”¨NÒD(Šß<•¦eÄ•-ry]¶©>¾£¸È�àpáÑ“Tµ(a$Æ‹‚/±�ëŠàkÀD…¡qlÖ–qxG.-A�·UÝ<Ðbß5 ˸ó*NˆÂk¸†·Øm ôJ×0"ßžÞÊ™‚%W¾¸ßd.ñ|½´`V³Už'¶é¤¨<’¯ÏÉä‘¸êœ �ô-Kâ«r2Y®$§Ë’¸ÔÑØ—ñºìo9˨È p‚Ä‹Ì%HÌ~ÈŽ4(ad¶¯¤ ‹Ö#I+®Ë›µZ„ÙµÚVòaŸKÛ1P µ[bìè²8zxy†¶ím€9´”Ýîä–þ²¼§ •) ©O8æ'­Ý²¯·»}²;;í¿'œä¨r{¨]c¹*Ñ'Ä€¥Á¿û ïótüGž†p�±3ò5ygÄäEΈюä’T÷È%RaDm]^Æ€¾åu†Õ*6>š(TùgT¢8òÏãzµ.íŸ-P\Û›öåCX«|5‚WÜ‹œ'=€ßÝU÷I'h�âÚÞÜ Ÿåcœï”:°B†\ÿ3ô¥¬VšU®jHãPÕI�÷„Ѩå}|ljk;-lO!Ì÷ŒjŠàGw³³O_Й0j®˜slÔ®,µø\!nnÜs…¸½eºBܤE3…¸‘=Û�¢œiÈËÍ\GâeèVª¥†¾“š2æ†Ù¶lpÂÉ �©ì¬—Rˆu¸Qo¸]ÓY„ãHž{NUå]·Ä@¼ÎëPHI}H?n·g¸‚“–Û¸ig…@î›)“öÅÀ)“æJ�#“&ìÇ•ç̇©îŒ>aoku{k¢^Œælɉ͘’«LNZS™ÙígS4WžÉc"—F½R û*S„×vZ/=7^ƒ¢«ƒ¢awvÕ¾¿ã„–ÜQòœI¸Î^ªÖµï-²Ø5×]\¹ëyЪ”ŸŒJ«…hAÅ �\_¤å+â’Bp%q½ Ç¦ÝVÏ̱xI¸Ý…K[ª…@qm' †{,Æy-±†´J]å\¯®Z0§W-˜ø­@œ(µ +sÏZN/?©p�ÂeRKÓr¡®± ŵ�€÷+¯uMy² G-÷(Þ;jrä.œj>ºj"Šk;±ò+Ý#̵֮ȵ¥~êEˆÈ}#ÁÉªŠ¨yëòÂ5ü²XùðÍ~ÿ¦ŠñW[bØxc­-Ïж½jË•�a¾öq‘Šá‡ Rv´\-bVª1‚3$W�˜5$ª:1iH1Ž­WL’×)¬ø­G¿síÌËL[5@ Ú‰!PH�BmÍ÷çÔ§"~E,SšXµ ïësÚr…•YmQ…•Immº}¿äÒ¥åF PƒŠ…Ô©_î£VeÍ›!J»åvnÚ…!PHÑ)Ëò IËâ @CË uåë,“ºâê,sº"plUjήpUjW··/Ä䊵ûE¼Ñ´ R…@áUji�òÏœdùg(„«æÛR?ø ÆÈ}ãËÛõša¹–z †±å§Ö¹¯Æf³þõùGÝp�̆ÝØ©²B ð²[Z <7'YžÛ á÷Çö|ü+ýhÞöÖ°;»"U ä>Z ­¶$ùBX �õÍ‘F}c)ª»AÃïüŠX1�ûj0_äêØÅØò)•«ªvÃíÜTW!PHÑa•ðEqií{ÕóVå—¢Wnúyëô¬ŵ�€X9Óy‰Õßb ½Ú_.¯«C³UÃÔ ]…Ô)gYãT(Íûò£eY ¸¶7Ëb´•Op\¥ëç´e�âÚÞ´åÎ¥8¯†"Ã�Óéç¸g6¼%ÿ1EŸ—n÷2@–q¼^Ž4ꨆáĵ�€VVÑÕqãíÅÓ̳–µB__‹i¸€›ö[„NpøEø)ÞJT(BœÉQšõ%½yžÓHøEU(®íMYî(�K¿Ùu ÷ûç�KŠ!R©%Æö¡ÅÑ}èÚ¶·>Ü«û¼;qœ®"jbÖôÎzGµ…ïjGkšË.Êœ>º[~Âŵa!ÐÔ’·“G�®»¹z³¿ð+bÅ@³¬“‹JÔ•UðœbÀMƒöq(©�y﫵̫D!P\Û ˆ ¤•뤹·úâ )„ŠkÃB ÞJ}š×Áó:þéÏ=ï}—^^þæK¬F‚ϸ€âÚN@ ®—b˜×‚*‹àÇ©ŘÓP\þœ&슊íM[Ö­*kÒA’P?Ýb…@qm' †âñØüü@Òäì–•iŠÎ‚µ¯5IóÃHkyÖ¼¯B ]é›Ü²<ƒ’(®íÄ^³.ÎsÎp¯î¶dr©Ô½. |ÖuP\Û ˆ]á]YoÓßV4â ^Cíï8!Eã>Åšå饽«SLÃîìê"î;ŽúbÜ[)¢*Ù¯¼´×%σÛá¹Õà?À '¹\¹Önþɽïì–}©¥Ó�áùô7×vbìb·å÷Ãb×…‘ݤ�ú²ÿ­ÓK¾Â&ijÎ6â|…Ïø0ùŠ–Ûù RôîŸk! u¯ts]θe‰]ê«<¯J|ÚàÛZ²aÂ/% LHqsWÝ]ž Ýú; ã"j³4¬àp@í–™Ð!…þÝOWu­FL äÜç¼[]£ä Îõ¯hqâÚ^üyúQ9a²ï5Ÿ~Ô—k¼óueiOÑwVqs˜Šk;±l*WÇ\ö2L…ò:L×=cc °UKÒ¬8‹}:ó¾FÀZŒŠk{³˜dÓÃgÁ“"ÒbÍä±ÉXbLwùE!Ù]Ü¢�쮾hoÎúM/+ÃV‚Ïà €xeh‰�óè9u±•äß�jn¹€[Íy@¡E÷´ü Œ‚[�y!¸åjËï‡åªr_í’ £s›ÒÀíuHN‹~IZSVE5Ì«D!P\Û ˆátóëuu?nñ�Òyi4æ|Þ§š¥˜¯³CÉ�éIð¼à,}0'±B ¸¶#••�(yÁzäšU–Šk{S–wNùLt6½%}ûôbY–_+bËB· <õP¯Ù¼(¤¨(÷´ç§º!L„æ>÷2ÎsšŸU§­áÀpU[!PÈQÀi+Ÿžòî5±DkËŵý/ÚÊ—3nÞ«“"µe�âÚÞ´ÆÝ¬›o)Ý«Iîíô›ì"ç3æ´¶šn‡âĵ�€Þ‚ŒqV-2´m' æîÊéJ£“ª'"ÍiÛNOë¥ó:]|§kŸjpúȽN€*U׆¹/é¶Ç“â%—0k€šO=4Ñäf>Iˆ(®íݶbœOi†`Èe›À››ÞGì×»¼½«‘cŠ8•\1N\Ûéi•ÙB,-m¾ôŒÅ )'*´—÷&ÊÓÒ]}‰r,ç©…CÖ®.¥’ë㥹'®íô´’Jn¢ëËc˜×õoR‹×Eð•+CPŸ$ÖO{X ÃÌ4�€:Ò–ËnyM¾.W¡–5_ÌùŒÏ3­FªšB ¸¶Ã5óÕ¿¼öLÑÃUô²åw~ªª(¼ðŽVŠŠŽ÷á*,Ç a�âÚ°hlù‡ëmO÷k f¶Di[–Ü\bÅ@qm' gý\.0W‰Èåßöýe¼µT±B p–7â,Šrž§QØ…a×[µT]6ƒF�%†t•/oÔv9�ÖŒ`Æ*S„ãÆÖÔTN»”zÒWQ_M¼àÓN\Ûéi±¦¾¬9 3äúõµû8S·@qmo¦ÎXÕR*7 ùqû«ž+iU(® [UúÕ�ã§æWÎiZêEˆˆ�¦•0í–oÚÇ}1,/Úžç¦zŠm–<,¥O‹àkðÛ6,U©?_-γn¿ê70±M' „£‘æ½Kî;îÙd>£:¸´æ½bàyÖ·3’–»­Ž³gIzUSˆ×vzZI™*þÿ¨Š¿ã �¦ì)•šè×Lì ù·¬«_)Áyàoù–�öNˆFb8†�àsFùz×c¸Þáêë¢e_e �âÚN@ŒÓ’{I€QóŽ€S‘Õß1ì«‘õP/ Äêt_­ÒÝÀjБr¯V‘"P�V!Ú÷€Áï*�ÖŠÞU/îtZ¹~\¯âÈæeÇL5òE|)¶‘Mßȇi®�Ù0:,#&D '²'ä^£ØSï‡�5ODº «¶ñÅ}W9 i¾\·¥ÎÎ'uô$�y9Ì1S}|G_ŠüjÞ.¼ž>»ì»åsX>ªœ%¤Ä–�yH‚á½"a¹2Ïk.‡å¢› !ŠøD˜%Þ{­'œ$¿jÌ´¼ÀëòhPHÁÑ-ûUßt¸¶lþ?kï²CË®k‡õÏWìfÒÈJ½Ýù€„H;qlØFÕ5’ØðïG¥ªÉšµÏÅn¬½´æ YÔ‹¤(J±;v"U$PvàDHqƒO„ Ž<É퉢(û ¦'èAOK6†¶¯×£Óå…qsne4 B…@÷àÊQ§“õ“æ‚<,5uåA»–Ýá°“î‹p„‹®HÙW  G,÷ùQÊú] '?�³lÏE¹e_E qdÚNK˯žÑ÷R8n¯¾–bw8ìäà3(»§«ðkLLjP±�.ÆÕÔkÿ '…#ÝôÏhÉVuÇÔ„uwW¿·ƒ«~� r·ú½UÔ.Å|·«OÛ-‡íQTˆ#´‹-)[«ƒí�²èGp}pd{ÕÁMiÁ´bJ©ÓzyeÖRås®e»Z Tµ„@2m§CÌ/1Îvƒ¨ `÷©¡¥Ë?ÃBغÑh�uSîÙöVàë¯Àµ©>òáç}×p$̾¬k­-­êV‹DŒLÛiIù›C³ß/=³ƒT (ÉÖ”†”„U”v”äÔJïÊ[i×”�ú?y/Õ$kØW‘"é¦ÓRò»mܤ° —i˜–™ˆâÜ} €ïÕÌS)b¡xe‰v§Êi€"WjM Õ’Æ¡Z²ü¼JÝž–âÂàf,�uÁ‘Á„UW]`ËN#‡ÕœÆ:.ÆÁU¨±ž³U¨½*üsަ-ÓR‹´>Tp8*‘~£Ô¤¡¢kVÃì½b×H q·f¹©bÝò;~Y¬ˆ}5É ÏÓuîªQb+ukꢛH ¨vã�%ýpÙëD|°:V¢–ß(ìk_æ”D_Õi—½”Ê«Aô`_U¢È´�š [ÄÑVÁÜÓ�ó4Âïo°ÌD èË™�¥†OÞšº¦Ngé:ÒYžè÷—-J�éÈVÁÕ„UÁö”å¬B‹”ì¸i«†ÃQƒˆ Ô©[a}’ÛéÃt�Ćßáð“N �  -[2ZXÉplhÙo¶e°Aeae°=e!%ÃíÐK†cCË+nß5äZ{¿\�G4Z8-ˆT!�p•Z¦¾4*T_Úâå�\þå*0¬ø¿,V ľ:ÿJnh1­bÔµÔ‡ºè&(ªÝrùü5¶ýl ·Ãá&B…@ì›Á³Õ¹Áês;†èÊTÁFuUÁFuâÐ’áØ¸rK†›Èù¾Hùœ—™J ‡£‘*®RMËç…ÀŠs;B@u¦¿Ãá'×C öÕ^e×�Ï׳Yº–ßl¡)ÃN” ”½û«Œ¤:°9Qf6V*Ó5Õ�ø\9W÷›îzï1ŽtÓé�Òe¯øX4ýû”¾VîÔ+>‡å#}â“Ù)>ßÊ|š¾8œ¾¡B á«i9%Â1!ÀáVˆ @™îZ´@™¨Ð¦Óm=ih¬@å¤íèþU—¬åqX¢‹}¦½uχž¬¿ñz�Bײ­êMòH¦ítˆ¡•”Z~‡ÃOê…@B…¯S»vÝ.~ó)E¡L­ ] I4É´�1 VÞðwíC­˜Ö Ò@2m§CÌï»Qb9\×¹0ÅTZ ªX!�LÛéÃ~šñÈcÕ–8áŠ{0­åGk®s0%óv+µw™ i�,ÏêR¿qdÚN‡–»GÅ0]¼¢*à§ÛN‡ØK-ä9Ï¿¹jåžF ‡£‘*ÂAýàÛ…|€Ê’÷k­�cÇ�ž8²…@ ÙYˆÍ¯–߇ù¥�„ ?ȯ’óqí«?Ú¯*ÑùkÒ>x— qdÚN‡–_x+„éñRÀO·�±—¡-e§}»*ß?•p8J©"ÔH¡�e”24]W÷V¬ÐŽÆ‘i;--´ÐÎ"ŽîÌQ¶R¼ +´£�dÚN‡¸XÎ[©#TV3x±Ô@2mÿÌbÉ—múf WK $Óö¶^ÓoeOLìö/³OáH7½Í=[(iîd7ï–ZNÙ®SŠ[UÎ_§Œä؂вû°"h �²»º »ÝŽbQ0^°)áLÁbsNÉ ¾ªrÕ:vrê �Znê7ŽLÛéÐz)5·äUwÚ³bOÍîpØIF8Â$wGUø-v¸ˆP€°±ç©*^yí>’ÅB–ltS²z/Å)§�ãÊúKáH7½�4;)—¾”‚­F¶)馷õÓÌÑ¥„û8ïúÓäÖ@2m¿³»·l”¨)`i-%ž¹ÆòE $Óæ áMßXƒ–ŸÌ“¿©z+¼­½LòZ §`./††"TÄå‹®‚¯ùW¡�y¢í MÉ9‰båæ¸È£ ̆®æmQZ:^,êhYÒü«PÈrf÷ M û¼%yäõ9�5‰|× oWùîò¢—í4/#zÊ‚OÛrͽA-«PÞ6ž"÷<û�s7(Mª¬[\u—ͳÑߟÖ•H¿X‹bs÷'M [zÖ‰�Èl5Š.=H¦íŸXzô· k�Õ�nûû«OÓ)øâ£`Ȩ—=àХǨM›¿6 ³¾�:ø¬×8¦¡«§>'ñLëÌ›N&>È·Œõ ³ JÉ´�±¼:ì9-eâ"WB«¥~8ÔEˆH°¨–ÖšO¡‡iØÏÿ „’ió…p|ÏX�v8ÈlÇ4��-C+-iÍJ¿ÊñÜBh ™6_w!\³U;%ÕŽe6]q8]!b…@l@ØÀ&—gcL?Ô€:1âÁ—>i½vÑ÷*R$Óv:ÄÈ¥µ.ÙОҖ3BÉ´ùBxgë(~òÐW­·ü‡_+b_ý$Ï"m+K£ ¿ÃáWw$Pxop¯½¤O{)ï©ø?ÑV$\xCkËdÒéÎ_„Ð@2m¾�§ÝÒDäðݸ߫É.ªœrÀå0ŒkO…@2m§C쥧BœýzQÀU¥¥µíù£95~‘AáH7½J0e·uâ3è[NmÈ«Uí�EFݘ�¤*B$Óv:Äò¯†?<|ƾ:m-ñÃ!žeqØzf_ÒQÞÝÆZÍwç÷:5ìuKhØß=àÈ´�––¿èmòPßı˜½Îˆ»Ãa'Š �ÊîN¥´Õò<]JQ}fÇ;˸ouÍÛ:¶T†©[Ä€]E82m§C ‹þyÐ磌bd`Ñ�#Óæ¾Ýø9''OÛ�§b"*®_ÓnœA0g/ï¤ËÇŒÅwj¹·šïòG ä˜ƒÓ°ûàß(y’[R”µé1Ea&½§(ç=ž½ZŒW>Q/öÓ¶^�ß(ïJ¤ �dÚ|WÍ.ž1Êô‹ÈpƒúÓ”õ;@Ma~‡§)çômÉyO¼Më‹ïÑJp1@ß÷ÐÄ^Ît'9t]–º´ü‡_�{@…w×…ðslïˆX€°®Æ´e�$P[˜“ôwµ¥}>X[®Ç 8ä˜ïÖªáƒï¦�êÔ)•ÉÇmyL9‘Ó÷´SVœ ïXï§ÛÔ²ùà6i �2¿œ6röÌ4u—ª z-Á}ÚÉ´�1ߤo©pZ4�@Q�4¦¤ÀþòS­ŽQoý“êuÿÆA.æÄ´¼p'Fã“ÛõV Çõ[ ©¶ÞÉa¨R…@2m¾«ãúV³Ø7õ–ßáðß*(¼ë2„¹£&qY\ çL‚V oKq‰LÊ’ö‘$—9€¹Kž·e}ˆ†4î4)òmîDÙ÷nãÅ8'Úª)Ì¿q®sbÝ*Äànyá·Æ&·;t7‰ .cÝ𬭦}ÑSôm5×�1†fKýƒy­�Šjk@ó£¢2Ë®ËgÖÒf³H} ÈÚàÞ³Øó ß>_NhÃïpøÕ ïH¸ð†– ¡ƒB`!t+ÄKBp5�ꉀ±ÇZ îL¼èÛcšj´jl´Z†˜N]mm¹«§i½œ5ŽjrA$X§––6&a!<+1´1ºå÷Á„Ö@ì«ý#ëQòºëT‡Ë�B¨L;m,‹T!�L›oyC6uËîƒQ­�äÊî™Õ€®ì�¨+ìÄÂÓ•ãW÷„¶:+¬¹¯µPsŒ oï[•ºã}«ß¯®oø¿š" ÞÒ²G' ØÑ‰«Aã´Ô?¸>ˆ}£ë$ÎEËã|ìáц*’ióÝ#×Ù%I¿ºÒKZ~‡ÃOü±H ðÞ`wÙöZD¥LÖej¡†r¼Ø¼lãÈ´�­žÈç_ýPE·žªuÿ€Ø ÅFQËíÃ(Ò@ì›_‚ ƒÄà“5^æe;<gxˆX!�À±æîæó4ü‡Ÿ £H ð˜¶’¿�'EjYû/ÚÒ@2moÚ2#«ËÕ£ëõ°U‚ Ô(tèݲý5Ž`Ñ‹]Çþ÷±®÷è^¹²ÊV÷4nè¹xp þ#ÓvRÅ—b‡{Ü×km7ÃX„È€þ0¶£ /-·ãE±o~M{ää›1­íuœ=GÂጄšõøGè ²ùÏi •\ã랟Êä®82m§¥å¯„ü�Ç’è]³ü/óXêhÖ¥~IÞ|Ï£H¦ítˆ•ó5NŸçöÕ,Ÿóá–±ÎÒüÁ#%5’i;b¯w;‚õÒn–õ&C¸Ðb;¯ç’…w zsq¢ná%Ýv:Ä^”%¾È’vºýÂ)ˬ¸QË>Ý/«@ß4ÓÄ^|2©¶MCíŠä¯äÑ0 ש�”¢â–{5Š�dÚN‡Ø‹¶ÌPb÷³aØÖ¡adÚ¼­ãå¾//3[]ÝZó K-ó#“Ÿ—~ge~Þ÷ €dÚN‡X¹x–CÈÃpå%leuŸ¯àc'³klÂÅ!�LÛé+W 󂛦@�n™ ‡Ž±HÜ*úA/`cÝê–ú‡`‚bßè.>±m� †ôÍ7m~ÄáåÞR>£éó©ÛiÆÃጇzq)b£Ò SÍ£¤N¦�»»Îs~†°;Œ÷8 €dÚN‡ØËÚc,¨–ß«QÉÞõEŒCi':èDcÝs¢�ámDàðÆDwx[çÞ˜sÿ7‡·õVÁá�y«Øðž{I6êú:Y­ÿ¡ÇmÍ] €¾ÿáN‚=ŸK²×0—£¶†úáP¯×â Á¢ZZÖG…ÀœdW_Æj©p¼4ûFßõ²÷Ù1× »Îî\È-?ZØkV~ækŸK ¿×í�¥%’i;b%•�{ªãðô„Š–GË5!1b}ýbz7®ðÛ†|˜öÁÿÓ@2mÿŒÿ§W Øÿ³K¼8÷¨X‹k7ÿ¹nÓ#n•‘nzsªÌ�ìð(ь֊4á¤n;b/GÞQ�Þ”2©»QT8Ä󊽲(ÅšÓ¨¯•�z™¼ièmW+/ sšÎwÆM $Óv:ÄÜî›ú~Õ¬ —7Ào\Ë탧�Š'É Ì¹áÝ f(lœh ™6Ü8)/D<,ÀÖ =Œ÷†ˆ™Õ/v¯˜¡åÁ÷G”¡C‡c ‰X!�L›oY¹¦œ˜¡üØQ9£lù¿gXø�@áhëÇi‰=ûyjëç1‹Ìñ’ÂbèhŒ»Lfc˜¡ÐKåšižêZ H¦ 7†Y²°ÓÊQ²6ì–ÜJPÅ �þ–¬‰¡[²ÆÁ[²eˆ_/o‹d-ß·›[5ŽD¬H¸N -{ »¿ä a·é–úãD±oôТ޻èoÙÇßê>޶9D3!п�c È4iÙ}0M4�@ÙÝýv’; c…ÏÍUmuTc<úWa¬ ó`V)-¿i!H ðv`Åo}ÙWËêâ>¦ÛN‡˜“qÊ•èÒ¯¦ë-¢æ £r!¶y#¬NÂH¦ítˆ½:Ÿ¼—ó«zõVöž÷í9õÑ0Ôiø�àv> ™¶Ó!öRg‘\Êûí»–ßáð«f$Pø—y(¥ç÷«Pû"�àž†¿q¤›N‡”o¬¤Ù‘]®nç•Ä÷ñô²-=±Í[Ý[nVw $PtlMû¥\ŠZ>®£H¦ímÕºš1”“ïÜ¿åµéåQ„ �~^›]k±sŸ–߇s $PxìܧtýÚ-åýnôÜGÉ´�±g*ô¤í¡…t"à‚c' ?Þgzú†æL±ôŸNnûC¬èŸ)jb/Ú2éƒã.Ü~½Æ–Ôª�dÚN‡EBo»ä1ÏËZ h`Bké¦Ó!å…~¶´êó=~ÿ!Þqóû¥¾/¾N9'm’‡}½/ÁÈ´�)·Û¶M^¥á7È7yýÉíp¸e‘"Ab;/Á¯ò×¼÷R+Åy¾å]uáÈ}^ÓrM—m“Ã’ Å¡—¯}²;v¢¥G°ä†’yzÞy^±;àGà ûh·\E<9íæ"U<©±Çн1´¯r·£Ï«h¦®ßÖ6o½‹T!�LÛé>ï•öèfy1#íÔkÁ5ü‡_^¶c áÂkZænTçoìyò´w4»l—o¶ #TåipóÄw˽ŠÉ´�12Äø1tË Ó¥“ Ý÷%««¯çX­G"U$P�æä'õâŸmb#&Y 2I·%oF¼pȺ´ŠÙqµÈ.áH7�)×nÛ¶ùç_Ëš×r;,7YÁC¡’¯rä²,C}“T–%-ykÙÈÄ,½Ž#D/!�LÛé#÷{vÉ$½';¨�#Óæë�;æê“e­•ïÒ‹¹Ý™ª0�ÀmÙÀ;x38Ewöúm—¤ÙäiÖÍXm0ÆPM…8ÂŒnhSUìðMÕ ”=Ü8X½9„�–ÓrF�mH¦ímãpV¹ìµA浚¾q�—¬-9|_8u{h+’i;b¾¶øEN–}¯sB/òV "U„#P£®®ÌÕ°û°±)�’ÿÚSøg÷™ÿ‡=EÉ´½í)¶Ûø‰UþŠq/E 6~�–‹Œ£ø¾ý¶ä]`¾Ó™¶SSò,4>µg礣ù…ÃýbuæU¢H¦ítˆ¹êçÕPá–þ/ZšKr·a˱°4iîØCŒ"ÓvjJäJ_ÛóèçwV˜½F‘isØ{Ójþ S£ìy�µeîêXnÙW™B ™¶Ó!ö2–CœÕ� €!¦PO[v´j85ˆX!�p�þž‹°j7 >o¯§¦U6à4ëʨÓóЮ(2€B �˲ö´Ü>¬=H èž®â5+ýf—kGéóîM Yì<]ibî’ÈÆÀÚXÊ­g©B Á˹%·´áÀ¹†‘+¦ œ#¿‚µà‘oÛ|-˜SÆ�_»�EwÕ`P±{ýÁ"RCî•�«x%Ôt�°†ÕaX‰Ÿá ë>—Š8ë�OcÓþ·Ën¿òE)Þ!“Q7VÕÄ8ÒM§CÊ뮕¿-�†-)ú2Ynºíthy~ÙÊ%nx9X— 3j7®`�ètw~nŒsÕ¤IajÒ(TM–›n{S“Ù`×aæ= ‹´~ê�«*ĦMo¢¥‰9æ-å°Q±;vÒ{!�@Ù�þ‹ç§ JMì¶ítˆ½¬J‰jÆ�õkÚåæp–éÂHøÚe?�ïû=¦�dÚþ‰ãàøþô¥Ç4�LÞc1Îj!‹…0DUj{ŸŸwɸô«/£FáH7ùcÆ[ŒB˜í鮘Ö§Þª�+Ã'»rýS¶Ÿ|N�èì:Ø­Jªž"™¶Ó¡õ¢¨I&eú)PÔ²;v¢¨G°ä†Rr D¿Ë5µ04�L›/„;µrè)ui_²äœ?ÅÚþ\ZŒó'¼¢ýžÜñ¦ÉŸÚæ8l�VéÐ{A0S½ýþ*Q„s§º&Nu C§ºe‡õ¦;zÂQ§•R5 Wo¶kb¾®ø\xoV®vÎ$±B 6•ó¯v¾Ô‘V…¹šrs'ŸÃ×0‹n~µÇB ™¶Ó!†vå/Ü2|ì2 $ÓöÏtYš¹yà.ãŸO=¦p¤›üþòT¬ ²L;X�a/›€Ññw•·Œ²XÌcyíÔ‚Æ‘i{ÓÂÒ— v«ëªšx!ÄAßçZ9s~Çfàíämr·Ü«V"œßëšÖË€ qèh±ü mº3;®þq±ŽêfúG¨:-¥v‰ý ‚b ýKoñ0¿Žn³Ã~¯tÕo�ÿ¹FqÈ€^v™ˆóTl@k™¶ºýÚ´V.Ó_ÙÐ.~: " "Óö¢";”C˜ýzY‡bv�"=-SNÄã¾% òøþÃù~‘è7Š@5*œ¶SæÂ>|a¯�dÚ|!¼nâ,[\…£¨²áw8ü²X1ûê²Z.y ˜å' éÃ!]w¬_(‚…Ü$ëï)¤‘`“„ÅuìU ô…ÐÄÜ 3zÍïªÎüoe�¯ƒ*¦ öL$Óv:ÄÈ¥µI"à:Œu—…Ð@2m¾Î)ÛÇ9™õ*3 ø?鱈}õËdšeDŽÝõ9 ¿Ãá'Ú � ï-{Û(]Ý÷õt¦åw8üD[!�@á»ë"*ûÍÃ_�[m�êöçé¶â[…‰pdÚN‡ÖËnµJÿ¦9//JÏ"Y„B ? ¼)iÙRÿ0|4�@Q½u(T©"ÐØÃ5_DÌKÇV=NpPk ™¶ïƒzïËݱ…ÝF|Pk™¶·Am:nÛåî_Õöäv8ÜD¦G˜àî ¹IV?U[©åvXnu; p„IîéiÉ´8/f¯ÓâÁìp˜Õ½ä7Ž`Áã¶£4Ë€ tÈ›ïá‰Ë$_E>èAãÈ´áÈWfYÐúº<&H ìŽu+.ýVÍy[ A›"S„#Ðt�Œ’†Û›DáÚdùl7G¥†«%´Éj™6“mêäõ—ßb™ªVóæÔïW1SµŠ,¿QdÚüÅ ,7Ñõqe…ƒüî(’Ú‡©›ËÉAÙÀ—¹>[¢ƒ²"Ðo™¶×ðnKÈÆhöX„Ö²wÏHw `pI½ý%ôø`_IB”wl(?�c±†0 ²žoýåÕ£­æ«ç«êaÌoÁ2¤lЋZ°°oÃîCÔWá /Î?š%,Ä…9÷ÜÐ>,mQKˆ#LN'ì<–þ¼|Ö–Ùá0­„@ì‹É¥ec¬ XŒÕ �ÅXmw�1V¬¿Ü« É÷¹Wïê}­G "U„ú ü6Ü>Ä}Ž<Á½¨/ '[êÓVé×Ó“™m»˜>wqcˆV �qâü8´Q¦×uk¶ÙRÇ×aÑ0;f¢¦G¸àš”-ö‹‰€Õúµ"@Ñù†Û‡à¼ÂAì Ó�ÛþúÖ!÷zõ營møs>v|O…#Lr÷¸GÒAù»b£Øà³ö)ES!Ð>[p=[f¸ë©q ÞÆ{æ\m`˜»­:«6æ¬üI'Äù!gã›¶UÌ’å– MëÅZÎ…F‡ÃH¼¼H¸Ô†–-U �•*´Bx/èÄ^ª–àŽ¤„î­+ÔÄÀã ƒ�,?P¥?‚¶D($À „:A‚fn%W™m¨i›êKI6–ú`|ÇN”Im(Ñ󙓤±\ |Ù¯HzÃãpxÔð¤+�­ÎkÔ=øL¨ëÌwØŠ‘ °Š‘+ö «©6ì¨! ¬·_û!°®�˜Îeº,÷â¿­òLpÚÝç«p®™ })aùŒ W�B™¶ÓÒBýª.%è78k\†*âlaÖêÞË{ð¨Š4ŽL›¯¢r`]«ŽFû墟˜¤D÷ý´9çKÌóðg)j�óˆ½ßUú¨J �dÚN‡˜ëGÄ0Û'¢*€ÖÁ®²öüÒ3ÿjžJž¶¼ó–žŸýÞ§û!†G¦í´´°¢±êÒ.k€¾fZyIÓ±¶\(÷~•Å.†ŸˆÝÕÀ>š}Š>ý �@¹½î[ò"6³ã¸ùk”a'z �î"åÈŽÌ?ÅŸH ìî#òêÜõÅCâJË‚®=o•qÀ÷îW"B ™¶Ó!–UºË;½Ém,3"9ûœW2wÓŸ¹Î7Θ‡þÏ|ËáH7�)¯»œIš~Î&μæI&öV±’i;_Þ*6ݵó±GþÕzQïdA»,I–€ŸŒœ¹ØÎ½„@2m§CÌ�tìÝx¥Éa!޼–Ø] Áœ«ôóáÈuÐÉ´�1_[Iøœ4-®áw8üj'@…Çòäó4Yx®_�ˆ,äH¦íeªƒ½+š 1v‹¦fФ0Æ/?*ÎÛâÌ• ¦—íE+@„ �þöâjÓÐâkL£„´úé‹H¦ÍÂIlÝù6k´_Ëz¯ø¿,V ľڟqà »@+Ÿ3É–½o¥6‚’ ŠÉ´�17: ତ†˜N»Ú}}ÑT¸Ôj¥TMk´n;b/Kæš³—f®ŽZ¦N³sÎÎ!š �oCi«æWKf.¯^öõ´+2.ዥ˯S±Î'Þ†®2’i;b~<O^qÖà"¯áðÀNÈÒÏõ„J;lb¦D82m¾óWÖì^BÖuç `Ö^¬;oÈ3>];¥ÏO+Í\ã´¸²O%ŽDªG˜>·ÀY11·\1=· î?gÁÄú\0½þCLã­  &ä­x &dþ¶æƒù«�ä�>wi�…npåö†·=žIϯ`%‹ª~¢Y¹õGWg<ú+·Õ ë4Këiø¿:í áÂkZj»Â…0@÷>ÏÇ ÷!ËN&°�a²»&À *^ˆ7»êáìª"U„övwñ�xžŠûþºí´¤^Ö¢U<˜þŽç7áˆCó¯C*ÄA!� Ã-š ‹Ó4m§CìEUƒX]÷çzÑì<:ŒUªG` ê=ÈûVìÛ﯈²j:-¥—PÜšþi[®@{ä> ûº€‡@‚#æÖ³ažZæ?ÓòÅ�Ó@2m/\è)�]Qçòg�¾xJH¦íÍS²xŒ³*Èb! 1}bܰ‰¹|; §�dÚ|Î3R7çuŸsÞ¶—Xó«ñŠèïÀ®ðcÙ•‡w¿²åW…�¾_©‰�f€†Áf€å‡)2Z%àf€Æa=‘ºå0,¯ ½,�_¶qRo?BðÌ=Д03D£@3Ä2Ómß i?¶B4 Ñ?fƒp×n«tm99Ál$Óö÷mŽÕg4±ÝqDÃH7½ vI aV2šbv˜2«ˆ»\̆üÈ2l™¶ÃÈq!7É-Ø“¼¸–‹eWÏK ›$àÈÙkŠn¯ �Â;iôûœWÖi™JÂ"û�²Aw5¡¶à>g€dÚN‡Øë á< nºÂ�~‡Ã¯Æ¹ áÂkZ®b+aZwV6.„’ió…p—¦P§v„ÔèDØØpæ]9šzø#à´Ó@2m¯ÓN¯P±jÍ|±áËó Åöw,õš$:J˜¨N‡õyÝŸ¶•›i7ÎÛaøß9Ÿs!_3ø�qZržCéè5ߘ˜Ø=;ŒwæB$Óv:ÄÊ™ï€Óº–›rŽÿ;L2MÖl“܇;КjÍM‹ä@ܹ֠5§�dÚ^­9À@ájÄŒKë~I  $ÓöæOLƒ˜†i ÝÞŒ7M= }ãÍŠŠ˜#-·æˆbß š#ÉöË6`šËsDãÈ´½šw«äôݛǭi‹^˜ëq[)s¨a…›C †|+j�“¤:¤–ñ“9¤�dÚ|s(ýj(‰ }9 ·ÑM\ú)ÂùÑ+(b‘5Ì>Xd }/j‘ »˜üŠÕ'‹LÉ´ùYωçc _Ž/QHM\áü ¤1 flB…ƒ¾÷¥¯ÂÍ6Æì®­Ûþ¾1ÖZŒ1 Äìÿ74–,»:¬+ ‘Ý !¯ùpuZòIøil¿Ã±ýjæF$Ð�„”5vrÖ²vµ Aei ™¶7e9ÛÈ,u9æ­TÃPZ(÷_8‚Àµ;¦l$W¥šÚ‡÷¡e¨Û^úð¯úP)¯òÜåcš¢s_#¼Eó5í¡ô]£�{¯ €dÚN‡ØKP¹—oíöë[~óqšöû*,$WxM,P’þ9¬$ËG·½)Éà[Îj˜ÆùÂuÙŠ`uocµfú¸ƒÉ�LÛé{ �8Û)5<2ÄzÓÖ¸‹–—�WãÚÒ@2m/Úz ©%ïØã6Ô ¹v¥›Ò¿,×Óƒñmw@2m§CÌ]É“š ‹~¿` »Ãa'Ó..»¡•N6E§±ÿ(„’iûû ´Ã BÍÃcÊКÖì©°é¹Ï_„Ð@2m¾Ö³çטöœsâO£÷ÃÑ{ 7@¬÷_B1»¤0ôk¥>wb¦_Eø•UW!�LÛéó#ü¼Rv-§šÂªÃUˆH¦Í�� ù>\ŠE ¨º ƒù>H¦í|É÷q’£±TÖ±*Þ„aM"�ˆÝ0¬—Ä7”²�²l�dýõá^oj@ÂEÕ´oô6\!ŒñßRÿ~Ö@ìÝ;kâ_J–âT®{n²l­s]µ/S�1 ™6ß1rjn…(«„z‘.d‡iÒ•ãñ`º=OWÎÁÆT¬ÙË °>F+Á}W;ú>†&æÆ鉥+Õ¨·ÃáV“× �¢»1šðclß<3ýjëhDWÖu…ycWWÚo‚ue., €ù?­>ø?H N�§Û85�¼S—¥ÇZ´Ú ¬¹~зh­OùÓÿiÙ|ð4�@™_¡rÄrªr­q«=›êé@߸µn’ç–õYí§K· »ÃaW£!�@Ù½CÙ´úgÃ|ï~и ¿q~ôÁNl˜7ì>Œr…#LrlT¥Hj!5áUH¦íuTyøÏ;¨ö2m5¿ƒ««Ðµ\ÇQYË1ü´•祮›šEŠ�aŪu¶ü¼Z§.ü$AÂu»ÌY};Âxg"DtoG¸®žqguÜe3@ì}ÿ¶+õµ%ÏÅ8g"UÄ\DÈEPÜpÁ ÝSÕ"̴׳c^7I¤ �®yéø\�‡ øá‚(¼Wx§/y“ýUxÍrÚö¯nyô 9ëH@ÛnËßv5Ž@ÑÝ›@«DæùÝžSj½dà|sÎlÎ6Pi·Å–Ùá0«îA$\òpo†…À"êVÏJú7÷N@£léã^ 7m'ÖD’_(2m¾ÅéÝ‹Øe³éæË0¾yÆ’½³²~¡ÈЬÉ@ÚÑ L;–f�»gÆ[‰Qo—ÃÚ|ú¡?½š´Š%º‡i«ts·\.{Ãìp˜Õ”›H äÐ(jƒû’’iÃûXŸÀΚwÄ€œ¢`ç#vXƒç#ï«Éíýq½Æÿ·a£�dÚÞ†�ŽnÅ(;jJfÈ[î›$Fße3ãfÉ\%F-UW!�LÛéÃ~e{Bt‘GºÕé°Aú;)°ùäÃùäš› ןéüä¿å�òÀÿ0j4�L>j¬Þ“}RgfÕ ÖaH¦í­Ãì6�elõò½ÌšŸ‡@˜Zá‘qÔrû0Ž4�@ÑÝ.ì$œ»íú’p߉_Ü üJÖa$¸/Ô@2m§CÌÕÕV’YnTÃíp¸ÕËÇ�`Ñ-­4MØ×+ BÉ´ùBx6-Ùm·�Ÿý: ¿Ãá'ƒ;b_ý2ç¹j— ˜äØ:æj+¼ÔbïèˆXÐmäÂ�§­‚[ùº¡âxZ¬\ï¡Ìº-ï ë°ñsbí £@2m§C¬¬ckžüèæiFÈáŒ�ºxÿÆ<ÚâåÁ®vÒ=Àº‚-�/ækp·άÁî\{·ŽJF߲ﵠò”_NV.¤Z6WIæ\¹´óÝ?!�LÛéó¯D$ÍKöÿV «ûÕÇ pdÚNK �=%y]'~ïóÃìÑ@2mþìÁ¶Ò´6u9`Òó“±¶R $Óö¶•šj~1̦õŽeȳr½ì‘ò|Ãg·1½wWç,úÛ˜5Ü¡¥×¶–¾&j�¢»+¼CÖëûp5E¸{Ü­s£Dåúzú¨R˜HÑtÀN¢D¿QNÍ�û™ˆMK�Pi!bî3¿8 �«ÔÒ2Iš¨P’¦#„s‹ˆÏßeuß®'õ±¢’à>¸€î±¢!†�ÁzëðÃTúòtMîéëÀIiáp´ b…@UŠœÁ*vø¬’'»{ (Ëf�‚ʲG]eÙ$›åõ4Z8-ˆT!Ð=öU®ú–ºl˜¨îÛ'‹Ë\î0«Mìp6±:ë �;bûôúœ_rÍņd>$GxáWã§©¾Û<§ÿÛþÊ�)\ïÔÄ82m§CË=ùÜÆì` sêØò’7¿¿Ã/È'#¬“E`dƒzXÒw —’b™¶ÓÒrŽñ·äˆoüÎb_ény¯,Rˆ#Pnoþså±…©'=—/Iã‘_rZåKÒOÆüæü’Öáë}ŸGºétHyùF\Y#ÿ¦«�uµ¼ËK$ q„ÉíìtìÇð�øÍËÕëo;ÊáH7�)t„·Üð®q„IîqcYdÐm²Æ4£÷pF¯á›Nßq ˆaœV&¤[f‡e&Ó.Ä&¸7í¦-K¾°7T` »¼h¦îg�Ï©+®É•]U¥a¨ª,;Ýö¢*»ß�9Ê›~•~,ÝÞêàpt c*¨Po¤³ÐüúíògâÉtÈ얽ξ´ÆäÞþîÀG¦íthe³ÕßB-2—íÏVV·F ‡£‘*®QC+õxþÑö§_¿È p¤›| q�ØzÐl«,€Ù¡ÛN‡˜±•B„ùj±•N¨µÙµ b£{M¿ÆÌ5�#Óöf®ÙI>ïÙ×[8z.ýÚ°;v"T„ƒ¾5�ú�mâ´NÕ„m# $Óöf™XÀº‰B—ôU²`­û$kú–Ezݤۓ ¿ÔéàÈ´�––««udò• !Þ²;vYªH ìÎ"ÍïJo|Ü’œšìˤá¯Ö},‘®eßxAÖµ0²T1ŽLÛéÐ"‡ŠM|à“Ü*9 ÅD082m¾^wŸž�êv>èݧ;5b¨ÛN‡˜g~,lƱBÓ®·ØÈ3!)!ï~‡VKUUˆ#ÓvZZ/ªÊÆIúQ_†BËíp¸‰¦"á’+RkZ:ºYäHÁàÈ´ù"8SkíWž°©Gg^ì¼>îù,49ÃÆÅ¤ë!$Óv:Äßqís®Ä°ñ‹@þdSì«LÎ�l†8Ù �lCLŸn†¯ôRu g¶iZ/ºÚy9ϰ±|ÌsÎ UE8hå­×”¬‚¯¼�§–ùÏT&|íŠÉ´�±ü«Y$]ÖKÇ õá.�±oô…ÑW2P–/2(é&_oÐ&)+kÞþ¬Eò†Ûa¹e™bôÅÞ¶JÏÉYáëÈvL•)V�7^4-TQãÄ>@¢´q‚ ®(�#ÓöÒÅXËMã¥Í†øáÏ2Ä@Â%5´’ó*ƒ?éqú"„’ió…ðÖ9~©ƒ5Ïu½jù?+b_�5¸ÿéGé³²¿´Ô‡º ’H¸¨ÓŸ•i%Wù®7uwäÐã,”–[!�LÛésçt K¿Y9ä—Z†Ç¤Føé¶Ó!æËÎ!Yþàiû"Aƒ¢¶á�÷,¾(Ïëí¥W²™u¾ÊŸ/qb…q¤�nx/QF„ƒ¾Õ_bgqóy6H›âvXn¢¥G˜äθ5Ÿ²¤åh`2k]r�nÓ 2mn·!*ZúlÅ'ÐO¢¶áE3výÆØ�βDŒ 幚Ùeˆ s±EÛ¯>ôW‹f"aê3t’!¸²Ìœ¸ 3× 2ms·gVQ!ç.—áÉëpxIçD8è[±ûudÁæGÜ®Å%üX3~4瘘ÇOî?æÖ‰&K�ìt‡ùò*N$Óv:İ_eË �¨Cg?g�E™œnûIH¦Í—Ôf¦°ÕÍÞö²¯åR±;vYªˆ}´?…V9a'»lêk—ÝmÞÃÊ^”¼ÜA¢Ë×€#ÓvZZÞ8AZ'U¤˜™j:Rhì|­G&[“xì\ãÈ´¹±sàGºSªZâMÓé�ò7£­7rj›,TmXþ0*¨z �dÚN‡˜kËì]ùâõúâ†Ýá°“3…H ìž²öMdOª•<Å��…ºŽû�C;÷þãÈ“]ÓÂT¥Q¨¦,7Õô¦'‰Ýç|æ¶$e¹ããÖwZІr Ôh¤ŠÉ´�±—‘âl·ÈHb} èjãȯ Í4ŽtÓ›¢œ½‘ãù(Y¾wëF9j]fvëÿ É´�1?ë"Æ%ä#Y„ªPMjãÈv>‹ìj$‚Á‘isEðΪ»lP&X9ó ôÆ�šÃéé7ŠÚ¿/Ý^ÚËAöVsjZN‡æ$Ò„(Bdvòšøb>�ïj–‡U%{®b^%Šp¤›N‡”ßcý,ß15q¬åvXnY¦G˜äNÚuœ’ ùW¡€\Ýv:Äüä�~ãØwt}MkÑ’6×SÄ �dÚN‡˜Ú²û�ª�Êîf­LbÖ$/¦¦&›4c�ð)b…@?ÏØf�b‰¡-¿™¡H ð]uú+јSHæäŒ—r•6S§|ÖLãèç`ÚüQ,ß±å÷!ßQ Þ»‚Ä/³±>¹*ãô"ÖÐçÍkæ‡Ó®Û1ÐK#—Vßg�Î{õßP!4�L›/„—ŠÝ ÙM‹nÙ&m¢X7åXч"÷Žáü<1Më%ª6HöÀu!ÝøÈ6!ñ“H`< ´Ü>D4�@ѽ¸€u®™Lë0É™ì•k ™¶7¿ÜC”�ÖHì°Ð�³>±FsfGÒñæ:ó68R`¿q~¢Ÿ ´`Œ†Ý‡†Â&¹³*¬ë.¦|Ú¯k€A L`B4ÝH�åÀ\à–ßX r8×ôÙ´OP @§’i{s8�gÞÉJ›auµ#£øß�•èú2†èíêð9 1þ%2–wªy.û™RÃᨡ†Æ �:Eœ?Å÷þ �<Ù]ÿP–Á¡Êrbδ3Þ—ì$.ËejhŸÔè@dŠp®OêèÓ�&4æÎ©Ù;é¿G°äš’q\Q�sé!o]†°·n-JLv7°ÑɽÓi¾¨?ÍÜÃ1sEªG˜ÅŒèœ›}i®öºãºÁ‘i{3Ð�`—0ú�Ï>O£‚ê@&[ˆ#L�Þb¹þ)×iê.Ù0;f¢¨G à؈²7‚Á!…] ö–²ý†¥°„ÂRº'œ¨Ôƒ`P ìÁYnëÜ=ß°;v5ØùG˜äö2>g¡3jZÊ©–âuX^¢¦G˜ÜåV`éAÑÒ˜#ýœ$R웆Ùá0-E8ǺÎ^3û»gîõ^¬*MÄT…1UÅ88ôŠ */ôjÍ„0¨¥ÔRUÃtÛiiùÑÄf{F4³C;ÙP²e@°ºVˆ8 m{ Hc]å¤õB9¬ÊVX¾£ ¥†}•)Âùñ\76¬IÙKí˜Ø�v+‚;‚§ìÏKšrr#{œ%òÁËîÿàžëŽLÛiie“D¿¨ìäè f©ÓY©ù"(o:åº~ûù‡óù"ÐoáŠl ÙÒD{¬0‘eÕ�GÙ˜·I•`Ù#Ýt:”ÐAck€£+JàŒ›_%ì¼K6`Ë‘™õsõV^é3Ï¡q8C£vÖ/0.}7vÚs`nž—òaË(—nhˈ8Œ\™m%…_z1õ@Í õ<ít²Oõס)Û*ü‡ô}ó͇óÍõÈô'Œ0í¥�¼�ãKöÿDZÀ´Œ˨@ù #Hdhä´…3à‘£adÚÜ>�4¯9¶Ä�‚”ZŸ˜†4ŽLÛ‹Žlñ£|–÷“µÐžr`ókއá_… �dÚN‡˜„Ã]+&ú ÛR%þ|¨gmi6~þ“_$è뇶Ÿ~8Ÿ.E8ÕèÝÔÛä`¿Ô<~syDß’‘›aν,iáÁÒ- /æ+fxñt?Ø)>àvTˆ5å;j7¸ºšŠ†û?eÌ-r»85Ô6ªö�¨*‘i;Zدl?ˆbòP§z ]¹e–”’ÙÑí _¥…ª™G¦í´´üîâ@q¾ ~]IoÙ;)' ”Ý­‚’ÏGù‚^ýš–_®“�z)_â›7Cc ¹Âkb¨¶4Ö–e¨Û^µe*]„0[ªA ü¼‘åÖ}0´léP¬t‚Hm•„IÉ´á)ÆÁ5°�duê–'Yʽخ¤TµZ8-Ôš)¿q„kT“²0°V·.ˆ)jѰûP Cá /Î?š¤œ¿�vU4yÐ>,mQKˆ#LN›•2æ@~dÅäm™3ÑJľøujå2[cWÇ~ú†ü-Cw•Oi$¸§V$Óv:Ä0]Ù¢ ®°ª˜®b\ÀVn ã;†*¶Z©€¾�Uj:;Œ@F^шøW°&°šVîr¸ÉÔÖJݺÒú£e4‡@Lõþ°Y¤_ï±-»Ãa'Ê �„ËnhÙ2 X™OˆyÊÙl}Z-õá.±Žˆ}#zõ¡å÷áêƒú_í]}°µyB¬,¬t„§,ý. G�rrûÒ]°>ß÷Ns©�¦oZÔr0¿q¤›N‡”·…… Û+"QÌ ëaHK¶¾¨&¬À†§(;¢ò¥–aÙ†r´æ\[i¨R…@ÿÚŠ&æ^[‘¶û¶DËìp˜ÉÜ‹p„ ®IÙ*˜X•+to¦á†_›Q0è{Ñ *k_ÔÛ¼ ¢�dÚN‡˜ïr,iY§ dêFèk'"Óo™¶Ó¡äÎ2{uäÁëpxÉm™ß(E¯­Àì¡‚ŽÀ­îØ’E¿•›:Ð¥�#Ýt:¤ü-?„ÙkAõXÄ»bä^µÚ¤JÑôzóÄ\t¡"œ{ñĹ4ßðhyÁ<4Œ0©½Ò5aö¼¹·!Y÷Ðoeœr¥\H©Ö¨4¤6XŸ�˜Ù ÙE-3Ü.Ò8‡,�)g8'Oõ‚h�h ™¶7 ÄÞç�qÆ\•îøA¦¯M„ã ïÉìñ”1´Å#šŠp®àOK9½}º–öai‹Y⓹ãl; ¼ãŒõ”wÇÙt•ý`s›Ór™ØÑ’ÝI9N~Lkªµì«L!Ð7Õ41ìWæ‹Å4ƒ¨cÚ mJT¬$œ'BkµqÚ`.†V_„ÌS�"Óöfžê]!FÙ.¯3(d‡™ú^™Ì©\?­5uœÛÜ�=,J Q¾M¬,kÈ>lyáö¡Æ(·“”“öZ9§ª›%5rHT� –m‘¶4�¯´ŠG¦í´´\EñƒJ[)¿ j+ÇŸ{ )p:±<“°ß×G¦íthù (�ä§æv8ÜDQŒ0¹]5%+—÷N}K¨J¤ùM¾xy>ÐϨÒÄò¯9kÝÆÚÅ-õá.Š �ŠêöV(¼}PKÄ‚¾ºm;Ý×¹¼.³mžrBµ½åô·µ¥’ç`e™¤;ð!3�«¦>NÄ38ŒZåykc¸R˜´;Ñ °Âè¶ÓO᳤L2(”‹gE€VB“õ.…PÖ¸Æ84Ü5 <¸x´Z©â�U¨¦¤såP lŽ–Èhóâ¬��åb6” ¸ì¥*þ�[dr ;ÑKľ¹LÀ|ž™~µý5Ô‡zÍj €„ŠÊeÉjŠ@}l-ã×´y0«üFQÛp:d^GƒlŠcÍ=þÍÊQ™›,ÙrRÂö`B˜eï·øÂu‰”èAÛ9†—äóýFú’ï<Ë£šS_çZËéМD;!Š™ÝŒÇQŽ(‡|sä4̇™h((9Ôi&ƒì6$ƒÎë:DS6� Ô–ÀæiÊI` qhª6¦œT?'3´—�7ÌÖ*áp”PÓ{ á5´lb(–f…À2[~25ûê¬Á]æåý~WKýp¨Ë`�‹js¤¬`b&„—f¢^|¹˜CQ{½"ÏlÔØÕ_"U$Óv:Ä^†Mˆ³Z�a0ÄT )ËæŽ�ÊÂrÇÔ͉%mj[Ù^> «ÃaUó XiåvÓ2{©>9Ï¥RŸâw8üêÙ{$\xCˤ‚2 ©‡Vgôl]IDÓïÁì°Ìäd9ÄAL.)Sxª»mE€’[nxò£Æa_ì'ao³¨3ýª¨“ÏóS+9ëÔÆšNàÈ´�––0«ƒ’S²ƒÔ‰)JÝõÔÜÆ´ÄY¹jØXÊ_Ú"Ί}•)’i;bXúª��é«;H�î[ ½Ôe[³ä£4:8ˆT!�@…B¯?®¼68òd÷ ^º2åÊAU!åÊ]EÙe—4´þ2èLn£é!�@uzõ®»A. \„ùk²u>Ž×«ªò0‹É´�±g�Àu_¥<í:–Bhêëçë¥ãB áªÔ´L]kP¤®µ#�“ßjQs¿¤PýNiC *¶mP`±m‡¤Lh8ÛÄØh†J;c)ÕÜ2;,³,RŒ#Lp¯xW�B ™¶Ó!–k Ôåç~ ·„º%ç~‡ÃOº.(¼³£Æ_cºE„´uqXÓÙN8¬¨36ßœ²ÎPßÙ¸`ßaEpÿfßéâÂhßÙ¢ÄP]j¨ž²�|`=elòy¢'?{Ìo9l×kÇP�’¿3�e‰|öLÕL$Óv:Äô1±#CÔð‚‡™¡Õ”hþ ƒÂ‘nò%èþª™Ô•–�ä”úrî_zI1ÊâÄ8ècýÍlZsPdæ{ÐeÅÚsÜkW¾sª’B ™¶Ó!–uÙçÒ>—D±�_Eâþ½ÞpÞæ|“#-÷›d ‰f"™¶Ó¡—$ÏOó;¸E!XAòEmÃé��Š‘óÉp¾«9üùR‹\ÁH7�%ÑË=©—9�ði›þt¥¾©gß|s%F¤=e†ÒkÎUœø«½2öš–»Ì9Â?O©?7w°':]{s¢s…B¹«€"¬7 �.7†‘jú'›æÓ?¬5 G˜½çÌí!wlZK®áÉïÉL+ÿJv ¾�~’‡Î-S€#ÓvZZ¾¢’Èãΰ©oÙ;é¼H¸ìC6¦}üÓ‰ìË {L~®kÏ<ËÍÚóGºétH3~MØœè´×]›ñG¦íuÆÛžZÅ@ë.‹ŸïùC–?û\· ½}÷°Ic™¶ÓÒ*ªd“~î“ë-ú^^’ñµN«EâÞ3DZ.b ™¶Ó!V$ÍáL.Œ,{ñºÊClœ!_„Øóàl�óH¦ítˆy›g´J™mQ$ ×6dE¶‡EJÍ \û Ù4ŒL›¿jW¯Ì§UžÊæöuñm =S²˜H¸>;ÉQã ÓKœ–_å驪±ý8­&æ�ì4ûl€^/Ê[N´ˆ}ëÌj2ŸZvÌ' $Pvw Íb &»a{ sk~¢¬臹=á­)ÖRÿ`Ãi �¢B6œ° g®nûgl¸v:}°á4›Ô  ·nyšû´e±áŽtní³Äž¸$ÕÛQ–âVGU€ó�²É�9ØÒÆÍH�#PNÄŒ\Çbf-uç‡ÌH #ÓöO˜‘\ qӯƺ!3RãÈ´½˜‘v aV5¤±ƒ´ ™¶\Js~Šš¶ GºéÅ´…Žöù–cÆ ü/Žö5�LÛé{ ߆8£„èùA õºoÈkë4�üÛaå�hJ辜|5Z¹3 ™¶Ó!ö2ûBœíšêÂý�>;·ë!N4j±uDë’ÏÍi+Ø Ò82m/³Ò®&åœì‘d .CH¦íu!öÖm‘ó§d&Œ¶V#Ýô²±Z3…oÃf+¯«6Ð÷Ð@2m¯&œ1,“Ò² Ç>ûôÅxÖ@2moƳñÕö´×ŽL}Zÿt î3™¶ŸñÁö�£ܬÉh}0 $ÓöæƒÙË£1ÎjA”0ÄTê†=ÂŽ¶j± ‚èÔž^ñ�w¶±§®ÝÖ'ÓƒVdŠpØÌyÑT8/•U(l>—LÑòô”´»gÐþî�é%¦õˆ-t/Ž}°ˆjþU(`í5ô²&Œr0Ø÷õ‚¥u†Ôn "…8ß2;‹«¦pÿÓT©€�Óó‡41÷àxÿ“Aûuºc¼!½—Ëîá0ƒâeÇ�¬ÅÿNg‰�cÄ)JÈoPûÐ! èÍ=Ýï±)«MnümõÕƒõèû=Ö„ÄŒù–ßc^ ~ÍÅ¿3­"¼ut4õj´@ßѱ¢:Ù3;ÿ:ù!s Øpi`&RcA óû`ÿŠÚ†Ó!óâZüÙ/™<+T…iÈsPoJ½W®§X R�ò–Ì¿YûÇ}!4±—å8Ÿu%mo×T4—šË=²ÿéîM"ú—&†ý ]ê<êm›»"!‹MûÁ $P{/y{A7ÃóÜŽÝö÷çy;f?Lu ÄfŽš GSò Ö²Ž4ì‡Ýóüç�pÙ ­4%²´²W÷A $Óæ á?ᇓ•=õ× mù¿êG@ì«_£Qt:ÍWOço™Ø®< ûÛ\ý…¢¶átȸ Àoˆýðn a*Tw¡ùé²´ZŒË^’à#¢œ„ÀnÒ\mæ‡îØK$Óv:Ä^ƒuÒ©ûµZ˜Q¤§N�Ö@Ùyö[Ë í7�"Phwɵ«l=Ò ûú�"Cig§cÜÆ:ÚÑQÜf>曆žÇèí6@r‡š&†Îù}”%lj¸œöH¦íeòG³M <Û¬ tÛÛl3ÛYr®A•¬£d:d—iZ9v˜Žºã ¿qdÚN‡–;ÕB”*2¸vظsò>býÚ‘RCVaÇ`Ãé>.sÄÜøYëýC÷i™¶—îûë*ñUç‡NÇ´#S ½e;¹Û®íöÉüžvŽLÛii¹JÚÝ|© ·Ãá&] ÝPÑ·ØN©qÙHPÿ"ŠÚ»<øžö ¦($Óö¦(cìÝš€<7Ê™\¬‘çÆ02>Gû÷º|žÞ82m§¥å÷^„ÊgÛ*)w\চN‡”[i漣œøÕÙÁ_ ”Nª¢B »b/‡5!ÎvL= b½ŒL?¥|þ �*uì`ŽX~Ò‡Àä„wúpïº|XÈ[k‰ÔµSþp¦¼ˆ \?¼•¡ïD§ÃZҸ킵÷£Ðwþm+º –!NĽÏ�þ0>Á‰h€dÚÞ&"0¶Ìç cËуnû'Æ–ê|l �]íí…«ìêûv ÉMæÎ0ñ1ìa¨ëC$Óv:ÄÓxOó#Ç÷†|õë4܇›¨*.º¦µ÷KVè¸wuÒaB ™6_»ž°ô›MÆcÿÈ©ƒøyý¥‰½¬Pc> ®l�G "VÄú‚\ZC¹&”�¸ž¨H¦ÍBU—Üû>Ñ�sÏ x™ò��èÇ-—þ; ÷*R$Óv:ļI¿sÁ3öo’'YÖŠ–Ýá°©B �²;C;þÛ/Y*D X'Cº»œŸ2n{y¤Õ•’i{Ó•ÝMÒ2/q˜½~MËïpø‰²B �Â{{/¿žš=ç®D÷qÎþý¸¥}I”ÕP¥Šp¤›N‡T™¥yL’KPŸaÙjØjAPÆeËy»óË™¶ÓÒò¶³q�<΄YëÈã“"~�w‘Æ)�Î…?/™b ™¶Ó!öÒW»ØWÛ5ÒòšSPú©\†d ¸_Ø#»v’G¦í´´È>áP;tN†²äñ@ä°ט”·[˜}v÷òÜásTÿ’i;b¾¦ú|”Þe‰ê‘ggQÝt ÁSÒN‘–ú‡¹¥�„‹jfI¿”lœ½¤�‚³KãÈ´¹³+»$ØKIÓ}XJ†ÙRò²ØhɧOFæÕ!ŽLÛii½Än:YšÒ8*ñ»£v£?CJÐßQ51ÄôÐØô°ÌtÛ«éa½³-wï#Õ«kTp8*M…@‚õiiÙÝÛ=ÝN53®¥þaUÑ@ìí˜é–<ÝÆ±/•¯œ5Fó½„@ì‹_ÖßI:uËÆß²;v¢¨G¸èšT»ªâ"h¶´{f… D RXy‡+*¤â*ÕÝ €dÚü �ÛY½dŒÎi�¼¬ÿ9§àåiÖJ6’><×�H¦ítˆ=£!W}ǶIjgIÁ½eq¾m£h¹A�е¶��ºæ„>¹nó£Dnw™m±[åm_ËÑ�Û©Æ‘is·Ó+¬·$7zêë�xBpƹlžrV°v�×ñ ™¶Ó!†Í.8Gg8wgW˜‡ÙÞ´Có05ŠLÛéPrÏâó¶\~ ¬LÔÞ‡n.ò[ [Öª(ðæ¢’i;b/wO;)u¯$•T™6¥WwŒÈôå¤ôºý»‰Ìw*GK÷Ðt…wˆ"LBKÈæ"ì±dBÅK¿j™}H¿Ò@ì{s\Ǽƒ·L¢ÊäÈ–ÔÖyÉ}=F‰Î¯±B ™¶Ó!楪Ä(«é?€¦QLW*áTT”ðè©È¹É ï\LÓpå ™4Ö÷µ8G@?ÍP{I.Ϋåœ�ÜÓp;n5¹8,º¥esç@!°Ü9+–Z¨5Š¥Ú~’Ö~þ‡|0 Ä:ÉrJ‹×œÝëéJt†²œ4ŽLÛii±–ꜿ Ž´çæSÍäÝuLT*ŸþþZº%ú¹|V™îÓQ¡5[2.KhóêØòsÞ—ü&¾/õ~hr4…Ð\+K%3|,·9îN!ŽLÛéÐò5ÅQ¾Ž™Üšr�tìäBÉVnzò H¾C:³#Xe `¤ZN‡P{•JâÝX35Zʇ¡œÙÇ0‚„tŒÕX‘š}• èÝv:Äü~JÊË5C¶½Î—fXΰ©"¡#l³6W?íøg!´=*µÄ8ü*ZùGS.Ç9 WÎòìjr!‡ëiÇ\EtX£%‚‘i;-)Ðáj‘ûàpi ™¶W‡ËŽ–]J¼2¾¼ÇÖI%ì4þꫜ½Ü ç'ôîáÉ´�1·âšv”\9-íÃRâÀ¾ nfg± �¯¼¯§+nüzº(ºs­iMÝ:ˆè•ºxß̯¼u¿Ê`X’¿»_ïÌÇ@2m§CÌÝÄøÙ‚ü~;µB½åw8ü²X1�@áí¢½&ã%W3§?ý(°Y¾† Н¢¬F€*U$Óv:Ä|e%;‚'ù2�iŽ ®áw8üd¼‡@…·Ï8°FyK¸ãt+Ÿh/òÒïZ¤j¨R…@2m§CÌ[IÕT= »Ãa'R…@eǦá"kò’lÅáÓ4Ô@2moÓÐ,ðë²æ·oëi§—HᜪÐ$l¸}˜ƒ G˜àíÕ§•kÁ'‡f¶ªÚdýÍœp°ÕV.ošCÖÓŸîZ©b ™¶Ó!æ*‰+wäð÷R2ŒÖä_¥q;¬|ì”ÙkŸæË,ï_¯{@2m§CÌ_©8«€_Z‡ò|Žâw8üD¬H ðÞ0çZðוdš•‹Ö??GKPÅ �dÚN‡˜g0$srçß k9‘W܇[*.º¡• ع ¿²€Bh ™¶7!ÒžÜÍϵõá.S,bßèî$ñÌÔT©€)­ÛN‡˜7hÆ…÷�üÊnùb^ʘÎR’�ôÂS… �dÚN‡˜«ªi’/æY�5ì‡]–*(»ç'Ä_“~³óV”%X.e!jðxM TÖœŸZN«Å^—nPYH¦ W×zÏáÊoØŸ†ßáðËbÅ@…7©ƒëœU›z^6ë¹Ë®ô²å¹“­“N¾m{ºyŠLÛéPò7¸§Reê¶Ó!æopsÎ}LÚ]xßÉÔ—«^8²-ËøC+U¦E¦íÔ”¼n[ÊKò\ff¬�ý`u8¬Ä® �ÊíØL±‘¬¨RÖµn;bÏÚ+Ÿ®p:ïØÕ5Fwµ�H² „@g%6À[~¸,|lPõüo;'H3¥k-B,1ÏØÔÄÜY¶Ì£Œ{>ãÈKë2åÚï;̲Íqïó ^¹:|‘ À‘i;--rIñ Û&–,(‚Æ‘isEpÆL ëyªæ-œ«)UC a§šN‡”7×—¹ç#”�—*ñ–%?ž5°º”®jtRÉ´�1Å8Û1¢*€!ÖË^®G�ŸCO+9ýfÍÖéÖ ÷ÞÉ´�1ðµÔ? # $PTco󆒇ÞÇþ|ÓÜD3!ûftµü>Œ# $\øýš™ëÛÓÔEˆèÏ1+ª7˜ç]ÖQ>â-“ áw8üdê‡@ì«ó¯Ö2ûkik¨uÑM$\Ô)ÛI« X8@¶ñ_Dz‡*fU‚ß(2m§CéeØÝm�ÌA~yqù2b4�L>b8ȃ›ß ~0š�Ìñç�OtÛí ñÃEá“Óë­¸— 7Q 0: É�}�Ïø7ɧïÖÕÛ’mLv¦®¹ãüq­h¡ŠR0TO†›jzÑ’3¢>$O¤×ºÙµ 8Ôm+¨MOQ|z² nÙê}ð;~Ò}!�pá ­½ç@ÝßBÉ´ùBx]ãzŽöyižÛÂÐë2Mì¥ËvvËWŽ×òõPÃá¨A´±ÎxÑÖ*'É©�ÊG7ü²X{ÙÈ–Ç‚É^Cµ¥q°¶,C݆k‹“²–gN¸8�G "V$T§+ß ¥­ØsFˆµ[å8çz*@¹´”ÜpP7ŠŒœO6Õ±d©Ç?ch™W‰"é¦Ó!ågµ´?âi y‚:‡xȯP=¸äÛ6_^ªëdä�ßBÜ$êo©"¦x?ÌÚmÒ«|9­|Ì“Ýá°¡"¡’[J62Š€EÆ\õ™£Å–ú‡ãT ľы9§_óÙË*ùfÎ ¢>$‰~£üãC{Üêóà¡”Íük xð:^Àü "PbMDŸ,¢Ìí‰$væ �¦6Ü>¦*ôÁØQ*¿yÚ7S úGƒöøçÁIËæÃÁ‰(³·7p&î.GPƒ T{Z©ODDI!Ð?°´Ç+^â_yÈ¿x> ¿Ãá'Ú � �X¶üÐK�"Wrs`‰è©ÁJR¬€ÃhO=ÉÞîr"A�›Týé"PôP­�»yìÝgc YKs„ ¿Ãá' ÞÐÒ笰ö€;‚~98•ãß•ØLÝdx¶Ü§ÐÏðÔļ=nÞ‹F§J»åv8ÜD¨H èÐA¼þø Þ*ëg(¶Už «qä*ÔK†�ûϦɃý‡¥É»ýgWo ,SÇ[Щup8:©"œ›¢kÕù°¸‘oŒðc<òë†ÇayHŸE0‚ÅÕ”ln>$–™o°cfr^ç”ÄBŽ‹þÕd¹<™W�"é¦ÓRòMZ>ºÏ8ÖiÛ2;,3Éèq„ n•}ˆí‘(ü~¨g1%Ù‹ ˜’°{ GIúª%{s»›Ý:1£¼t‚ oïʉ½°°ýÉGÖkü5]r8]"jŠpv/vG®a÷ኜ‘'¹wA.Ö“F¡z²Ü°ë;î´Ë ©Ï»š'g¯í) ÔÛ&οµg´é(*Û*Ýp/N‡ÃI:î'ˆp‘:íåD�¹‘ió™{ã˜k-ðb:\�±:Vr£ò&þFrHp¦ÒZ®yMX™6_àÜ8>Ìã™ïÖÔ“Ùá0ËwqCô½þìÙvRãZÜÅí°Üêe»G˜äα3ádÇÖaÖ°:VÒq¿Q tÛÖ÷rq7-Lb,ƒýf€dÚÞz.PÒÆ!÷¼ÏM%ÇQ’A‘i{S’-ûãì÷‹š†˜2=OgŸsa˜{ߺE®óóC›Kh¥ê)D‘i;5%w=Œ@¶SDI+¬o5•­ÏÑiBv¥$ÈÞÉ´ùB<ïãƒ�\c`¯O²›®1lj!”ˆ}ìKy–>ûÔóžOE2õ1×�ؤ6¢æ_… `¤ZN‡�_Ä!BÙÏ—> ™ašÄt4 r�ƒ³šæ/ZÒ@2m/šjnùn]~þ˜K¼” ÛçúI‰ÓR®A*ÞUKŽLÛéÐòJGÅ(ûõµ¨NÈS¥ÝÍJÝ™%­§åi¨F‡£‘)¬LC‰Ïs!Œ¥–JEÐ@2m/BÔ“Íîªõêäüb´¼‡W­õ±/v+Ù¢/Øõ›¬§E„K\tø@»–”‰p¤›N‡”7¢C�ÖHUSÌL·�--—ì&ÎóviwËQ.û$¶P[d§ª)‘n:Ržq£l•ÑSÌ «„éiZ¥.Ö<ÕíT”’i{S•ÝÝÆ){ÉØ-•]󽉦@Qÿ ÀÈ´�)ßD‹qVY(„!¦O·˜Ý þö4ÔZO%ŽD¨F�6�šWqõ'ͼJ”�Òm§Cìe@­bå%OA&Q[Ëê0ÔáÈ´�-)�ŠŠ)öU¤¸™j:-¥- b=p*TYýžÕÑýŠáH7�)_IA�@ͼJ„”lÚN‡Ô‹–6YY»4AK5:U1u6.’5vÙoŠ©·Þï,çËU@Ï.àœ¬À3dgÎEœç¯ßŠºV¶ì>¬•H ìnMïQ‚·cc÷ÍO”ý�ÅÞ®¼-õK¶(*´lÏ]YÔöº�`«¶Â‘nÂ×ì)Õçq¨(S¥Pñ‰¡R›¥ÿIß0Z¡ŽÙkã¶ý­šå$‘ÿ9ˆ—çãÈÝB-p¿R(t¿2ÌTÓ?±_µßÿaÃÒ@¬ -K­âàŽeÖ~Õ„ïW¶n»f/¿#„´­AetU=W¸Š®S¶i:Rh ݶ6íaøW¡B ™¶Ó!ækŠ/Ó:ÔiÑçÅ|Ú¦Z¾e_e `dÚN‡”ï2¦)šßÙ†:.žÜ‡[ucÂÛÒó3—µ0÷4�L›/„»™þ�&™×ÛíXýc#Ýô6êÍ7‹„pƒTçŽÕ¨;­DOÐ0ˆ• Íæ¹¤˜$§o‡g³‘nòg³ñ¶CìíDŒ�¹ævׯµÑ|³Èò{9E4çuRVùlœ£óÛ‹%þ\ÙE–o+¯®ãïýJ3¿—<`ŸÓf¸&å�ÎÛÈ é ¸#\ï¼"RĶÿE¦…æ_…B,m‡kJ/Ó½ÏË÷ý°°c‡+ID q¾nì-׺ ­B-@5¯sÒ3Å51oH�K^O§m­oqµ&îaøßg73´_Ž”¦zžÖ¾¼í<è×JpŸÞ@2m§C¬ØEù5³DkºÎ7Ô‡z�²@ÂE]óþ6m}} Ⱥ*Í£BU†ç{*Š:” Ɇ]oŸHú{ã¸UÀ‡q¬�X/¼.�Á@³üêâŒPDxw}4Ô>, ŽlìmQ;²1méw6amÙ:uÛ[WÛÇ-Û�>œ�®v~ô«A/¶¾Éb‘z¼,öùJýTgµF ™¶Ó!öbɪç[n‡Ã­³�@ѽÇ`ëCÖWÌѾó§ßʬ®b$Óv:Ä$…ìñ®Þ<ɳ‰iÅ_÷jÆpÐuL-CqW!ËêÃÐŽ€dÚN‡˜?ÝìkŽ­GÕ} €«3}âœF®/poË,¹^ý5®W9cíž R!ŽtÓé�ÊI6E1ýííÅžª“i^fÔ¯cŠLŽLÛéÐb¡jô�wn‡ÃMú*Â&¸wDk_tl¹±PúÑÅ,T $Wt÷ÇèYIXó¥jò%p²´ÖQžàÛºš¦Ð¾�yöU¦H¦ítˆy‹õÖ‹69îX´Ùp;nY¨H¸è†Ö>ˆB»¼9BÉ´ùB¨ôÞÔ¡{Ï‹çR #oÛ.ÊܦRÅN1¯}É´�1jÅ8«QÀS§·e$ªìÏ�ûR Îäóö¼'l“Ù¶å‚sØt›Ù1�LÛé{ÑVó«ÓôÎáôŽˆ ïjCk_eðíÛ5¶1!4�L›/„c Ű~ï:6°ò¢vŸ“"üœáfˆ�ãÛàÐñí0ÔmoãÛÞ5Š íÑ0r±žö¦]~ùWIxùœv>Î|±B �“ÒÖž´»î²aîým ™¶7mï–;�›�nÕ�‡üÈnMÛýÖ7$O§†؉‡v¢ÃP·½u¢5v÷ާH2õÖ²(5ŽD¬H Níe’=O�ô1iÅ-¨†Ûáp¡B ¡¢[Z{ÒíÆã/-B⛀B ™6_Uomï²=žv¢¾”yU¼‡— íˆ}±;´÷ä7°>ǵ/äÞOò)ë(Ï|(ªTŽtÓé�Ê?êÙGæ¹+y¸<6®ÍÔÏåJJ3c˜ù+ëRÉ´�±—¥HOʽ³-qÛ»féÍ„@2mþ:êõWßåϹ�ç�¯÷ìvŠ²Æ¬ä9¼uÁH7�–Rù ¯Ls’RNšö~Èr_Yë<4x©çó°ë(=Æ‘n:RŽwÄã|dMspí‘ëó‡õ6l k�b/kÍ£ì®M²í{ÖæýãÞíäÖ®¿¯´@2m§C¬¬ k®ºZŸ"á_õ¹ˆf™�©%yȹÒgw×€dÚN‡X1û<¬ê@þD^æ4¾Êãðésxgis"c ™¶Ó!–…Xò¬œ97Õµˆgàâ XMÉ´½ÅÑì¹pŒ³2ÑÀ‹¶9!¬¤Ò¼Æ®k)_mýyÖ¨AãèúóNŒÄSÖ²ÉJœìÍòÍ6è¨FŒL¿çǽÑgÔÞÿÐ_H ¤]5úkþóiö8vå¹'T¥‡l�ÿÐUÙñ ¡–݇!¤�ÊÅ^?<öb€ŽȔ㙛?ðŽdc¦œ’i{3åì„KÛ)û4ã:]îDc£Ž�V÷áH ÁçÆõz:™ ]IP¦ÇaM‘*Ĺ®²kÆ4¾Êiˆq‘!*©õöx”fËfÝåí\ÔM4@2m¾›èœzn¹ ù¶E±*´_g?Y&~Äÿ2f´SªøáÞ¬(¼£«p^Úhj=À '4šum¥U",©ã»ëЄcv¿€wîIdªÜ‹Š�dÚN‡Xqæ]RIªÞ vëŸë\èÑ5·kôGºétHA?²CA´€G†”•6ubœoŸRÒµ §Cæ%}pæâìóv×­ƒ&1˦™Õ{¿qdÚN‡˜ŒÖpû�‹¦p„ þrÏ‚åžú:u’ÍçªW-~ãÈ´�-0çªá†§\)ar«sV$/h[WÍ«)»âØ4;•›(mUÍkü #ÓvZR~¯u»ä>nS= ÕWf¹Vÿ&+Ù³ ÝOýÃÞ˜Ut ;Å ^)6œTÓéòç~/[дÎuzÚ{ í—g�b˜‹ÁQâ"ó®„Z‡CXòE ˆØŠ³÷'”ó¥6/ݽÿ„©K�ÇÔ3Œù¾Õ㞸¹ÛÑ|¹È�ü{J…Îí…>/ä�ñõdt8Œ¤³Á"kB6åËx·"¸Cf—M^k¤[ ÷ÚC¿AŽm¡¨¼L¦U´x“mšQ­ã Ù²‰ö{,Ë^±‡L­–njiöµvÞƜØ=&C¶ÚŒ&—]YPµv@€óSÙ�5Z-7ÜÐÒ8%×Á¹Ðô0öS5Ø#‹±ÄÜÛÇMB~ékUr"QÎww»G‰¤G¦í´´ Á÷|âMÓé�*‰îrѾ¿~eŠ+,{ÌüJã}#’i;bدà{ûù¶ítˆAwåÛ/ÆoËk¦väÆü"4ÌÃú¸\\™×2m§¥“4HIÆ;ÞÔ–GÑ„e”ü v[¿åÞÖ× ø+_:%šh–Uu ã Š‰=r‚¹�5’dÊ÷´·–ªŽtÓé� è PpÁ{s [„¡‚ú[ЊVÞÅ0§fÀ_WÊiÕ¯c7”‡œ[Oþ0{à­¦ß8ÒM~PàÚ¥å4¦^¬ß1×Ïx0;,3}/·&·¿ðEª…/ëÙ>Á�{­œvù¯yñŠ ì$aðÈÞŠƒ‚GØ�8'x„䊘¦Š ÜKVl~Ð,ŸQÌõ[±5ŽLÛËŠ]W�R¬?ý"}⋽¾ÌumRRêþúGºétH�«€Í¦�V,—Æ[LD{�:#ÝX.í÷öûë.àÓ¥{•¹“j wV\ËîpØIß…@eÇRDZ~xŠˆÆ‘+»“"b¹u–´;~~ø²:j ™¶·õÑvXÍöÚ—ËÐ×¾ùQ:€;®�$Ä‘n:RÈÜ··cÁÉ�ÝŽõ¦?2®Mî8¬‘Ü5oPÛ[_I»k{Õ�yÎC¥&˜l"*’i;bÒ{,Wwˆ�@5Šó‚f#¦(›ä* Kò³ÂÇÙY-¯ÙYH àžyfQÚY%RÅÙ—Øýu§àºçsó‰)Éo}ÔŽœOpå�6IW"T$Óv:ÄÜÝ7†Ù 5‘ à‡¥»Aº2×õP]A×õ@]å«5éGlO ̤±µT©B ŸÆ¦‰y7·Yúaßkp·åv8Ü$�#.º¡e.E B@—"! ?ÅOð3@ì«ó¯F¹Ø÷×=…&‡'ë¦ÍáÕ„8(�èõîp¾½ÎIî‚j¸·zuø7ûâò«À¦ú@�¾‡Á Î…øµ©å¡—ß8ï†!å˜ä`n£ôûX$oFÂáŒ*8¬ÜŒµAöáå¾O?ˆµ—VÓ¾,‡“ÜÇáWŸ—‡X�LÛéËýÕd±•E3Ÿ%e»w�…G¦í´´ ÙñX“®câÀÐFRõš §8ÚÅÝÎʯæí¾k(¿â÷CûºY²V¾�¬7Ëwé¦Ó!U$ÈNÔ^Í^�òh;½Jð‡ <4ϳa÷!ÍSá /~¹³•ºÁC]—LšnRt®uÜïO75ÂùYºšýãûÇÿó�¾ëó«ÁÉ[åŒ>õæÂ‰Úr\-ýžœ¸Üƒt5üÇüýk¦öÿWþøwç_ÿË¿üãþß—iþ‹ïiïÉü—ÿÀÖ_ùAÝed¥ŽÃ’<Âõ¯9ÿñ?üËÿ/ÿÓÿýŸÎÿ¯ÿßú/ÿúÑüoÿ׿ÿÿë_ÿá¿ýë¿û¯©éü—ÿü�ÿõ_’àYôž+ø.‰À¸ˆÝ9,rw¤¶WËÐÍC©RPw‹ï޳½Øø†·/%�aO{þOŸúŸ!2~´ÃÛ§Úhð2ŠE6åxŠgR[_J¼Àè_=±ŽäG´ì>øH ì^Y e—;s_&ìú¬½)QVô×gëšAŽDËîƒ#¡�Êî9]“¬ªCWÍYk-kA¤ �¾µlý Ì&kù}°É4�@á1›,Q’ ¾[�¤ƒ6™’i{³ÉlôÒÚñ`Ø3ä�À§“PÚ& é²F¦í4¤ÜùÕÏ%n®÷B»µä vU"�+2…@2m§CŒ\Z*_” Ê—µ¼Ý|æARÔ—þÊúÕ)¡-ë*O„ssB5)0eVà”YË Ð¢›ÚK·ÎÓ¥Úæãûñ"Qˆ#X‘&u³%Žg©j¹‚š\UàG¨Úq~±ó’÷Rôv9Jý–ËOóV/kë,Ø’ëÉ´�1ìÆ8Û2¡†X‡:ºšdU¿i�“ÔÝMæäRgÔS-UW!�LÛé#Wï6—ì0,™×ë0s³,–ݲ«þM>Ú?Òyo/h…xÓ‡Ó"U„#°Wã¼g;„°¼gl9yÏ@ß™;o`×!wÞ¼ŽsRÎ:y³…GºÞ½¼»ä0*©zŠpäõ®Í׆“MÇ–î &{¯k—ÛVÃ|=bÐhà°¨;Z€#L›Ý_eD‰Š¶œx1,É—�ëêñ`t8ŒDG!�@©ã\Á–ׇdA $Wp/]àæ%8À‘”ÎúÍ^ û »Bé÷Ûï»vdc—°‘ ]Hz̰¿ÒùÊ‹WcW�ãuþf]¾ãH7�)×TZÙÍχ?] r­ÛZ®`ÖÛz\„!çeŽ·+àÈ´�––«¨59ù¼Lì}yC^q;nY¨G äž¦¶¡¼ŠžþÌ^ùºå©¢’0¸r˜Eò§á*‘n:R/Š*)³ÉT íUxN®ùV4%”| o»d qdÚNKËX(ëÖË�Š4£ûÒ£dÝð9ÖV´ô×°t÷Ó‹ˆLÛ©ù}¶¤/à˜üˆÛ*”ó³‰KòË;é3ÎMÃaá æ%Qˆ#Ýt:¤Üô—u•ç—9é.[£ŠÛa¹ÉŒ q„In�¸@·šw(è�çßO‡ˆ^“ Õq•Ò.m6²d,“$ªq´-KÃYÚü�iâH7�)Çq[9—xáß̵£[^‡å%ƒ(Ä*w¿s�Ö|¬'uð×´ÎÏ\£xëJQÂu¸øë°¦Ý¢†3™¶ÓÒò2Ÿ‹ð�Ò.(éCŠÝá°ËRÅ@ì›íò“F=c–´÷£|ÉœçÃÊ�¸IDZäÛºl|‘b ™¶Ó!æ™Ù\²_¥ÌnÑ/§¥çcÚlH°T\2íÄN‘*’i;bNjÿ/V«€)V‡ÃJÔo�B;KPêæ¼p¥=¼,oj6Ì«8ˆtÓ©éx3Þ½–>Ý4Ž0¡½½žc”L|ÊÃ_kÚ½y>¬óV*nqQ­L(íË­¤H¦ítˆ¹¥\x.,\ötéê7·Óûp¦·ˆ \+ìà¶µåv8Üdi �„‹®°v™Ñmÿ?kß’.;®2Û¿£¨¬ÏïÇ8˜†=ÿî5ÂÊLA8‰Üçoí*­ À!$!„…@6^ѱR×kŽS5‡A?皨noÔºÃê#S „¶C•d Xtɦ,‚çß9ei¡^¬Nñ?(Ë%´=)+ú‚qÿ›ôWš»o>¶åw~&V Rø¶î®Zã^^HXït%µÆM›eù­ÿZæU¢(¡íÄÒÒdñ"÷åaç_„ð@ mXØ[“þ¾¬ f~*®ÿjéïM$'A+Jh;1•\]j¡ïüRiÃîìŠT9PHÙ‘²ò¯‰�cbj`{:7·8pjhËØ)1 Áò:–5Â9¬•ú´-kULKMY¯•̨A²ÞÌzû(¡íÄHCšGý®kjz-hICò@ mO†×þ×2SwÀ—¹LÖgàw~¶’L�B �f”\É^‚ª-¢w|Û ˆ¡€7GE%˜P;N£¾`Wêúüö==6†|C®¾  9*¸-Š–ß{(Px´KÁXÖ¼ßeª�HZ–Jh{²,¦ýçÐ�õàÛž:1î^\k- Ÿ½>Ú?ìêøÞ1±R ÞÖ‰] |éåÿˇV9¶µaËîìÌ´R ð²ZíVÖBx „6,vû½ß8Ýl8~àgb¥@î«Ù=æ–ß›Ì(Px´ÍÌhËãhmE†¾íI[1„QË››(íòZªaç—Xn_Û´•%´áMò8ý卨7¦+‚×Ñœ®ü:­«¸÷Î( ‡®¥Å­}[G8àiÙW™¾£ð �§T~Õ›Îõé9Óæé�¶ÃŠï(a$¤N¼Èôá úV¦#á©î^òÑ–n¾‹ë¸ï/ÇpÍ©[+â.ðİåä8º÷"Cî¹Êu±sN]´Ý}Q^gæmú»mªÑK•*Éo:)æõ’_?C�’ëIó٪Èo:ÿs‚ BïR©^Ñó��–ä�Úž,)Fo9.(ÀÔDð£”ÉÙ‘®,tN즿õ'Cò@ mO¦R\웚%�2d;z-ÕÜæý.\ãÁ¬oûmÚhµPU“á$´�€šõsTìÓ ÁŽëÔ‡<“Râë2¹êÅ>upÔ<“ï8ª°¡í›MBÃþ‹µ4(i°� IcŸ­ãGšAU §"MŽ"¾”³š–ÕVã�BÊ�â>ØZ¼_ë©k`žŸ)*â…ËY}�Vý¦šÝ�AÔXé¨R¥@�&CÌãè1r*Eñþ¶éà\ú­îwX²ÜGÌÖª¥ •ÀÄ7�€:EMA±WêÔŸ1ãzØFÓ^N¡æËµÞ›÷q©í—ö¶g“ñR;î0‹Ç–Û‹GRtð¬›>°\öÅúþµZNjE�r :ÚèµÌ˜^ºÊ�ÚN@ 9„åRh7X–A_‚…eÒKóú욑xèOî]}ê³ÚxŽßtRp‚Y&ͳtÿÂn//s¹¢_Ù¡ŠcË”â$´�€tQ®×ijYì7¯÷Õ(†HŸžÖÕ¼”ÕŒîºñF P‚ •À„V§'´¬w÷w R�“ІE@}µ”™ù"¾è“×x‰¾ƒ¨o-?šÊ®¼:Kîù$|D¦�ï ¡Ä[Ì(K¼pdOÖ>;E_u,=0�–;/hYí(j�úêIZ^ïññ'¡í´°ôåvDóz'øPð( mPÉO®Ìm z0ùJ.b»¾÷d°gÈU?Ôú?Ò5œoÖû,HÓj¬dëJF€ZÄ+9-Ça+ñ´XUy­ªÈз=© ¸1;}gRµZ8€Ì 3œp …ªZ¬ÛÇþånGäfšJqÂIÎØÔf'£ú)Vâ…´)�“ÐöƒM…Þì`T?îöÆœ¢ÞãØ€�õW ^vO«½[ÃJàoä÷Œ¨D-#ö ‘GŠvOõU$íÅ~û»o’„Ûqþv�i'ÃáËqñ¦w[§a÷Ãe‡Nrp×j*CpëfÛåЋ%‚º¦—áVÓj.T 8ÞDûŽ“ÐvZxŽÈq×oV[%ë)VŠáçÛÎHëñXq ۫ϯ9¥8´u]ûÔÊûþW‚“ÐvFZåG��C­xzÿ¨!~⦘(¤¤pJßÍYi]Ï[¡ ¿ð«c-r_ýÐauÐÌõMËïüÚÑö^ø¬_ãȱcì�„ñk†Í|ç:Ö!NªÁ%´=¨Á&ÎîÝ]mZ*Ð*Nk.­ÏñWÛª'@ m' ö`Å“ÝH[ûzOÕ]À¼~bµ+š½í'¡í´Ø[§ ».�:œp’££­®Ü�û¼d¯çúIÜ4•ñýÜÓ}ËŒŸî=NHÁ»ÿî²±&Îjdžû¢ýp†)üˆS¸‰“âðØ ŽÓ÷Ùô3¦µ&¶ìÀά) /{ k�Bp5€ÿ}¾hD8 Ïü=ÈROƒnÈzbä�\£oäF~œ6‘CŠóÒ8ÚͶܛ/ì„æ�Ú𔆜÷xŸÍÍs]øk¡÷rŠRÏ‚ôÚ_ùÀy~ïu@ m' –OrñŠ09ÉqW„¹IîòªÍårùwŽE¼'ÜJPm=â‹›žØƒU¥8úÂgdÈéT1Xìrݶ׫Mñ*¬W‚ •ñUبQî:sËï‡ëÌ(¤ðþòyšŒï(›DD‹o;±‡Uä^<ŽÞ�«&ÛäÖA‚Ú)PBÛ ˆ™¢ú·¦–kjT³›/;¾ÂÀvÖí§íóòŸíe¥@8bx‹m,ošžj¥ó—aze^ÜÛúãTòCöîcŸ8ÇIh;#­ò£ò4È'©–øˆr �’Æýs}ÅN³®š�~nàfB¥@î›qw «æì•ˆæÖçú:`¾³pZªTNBÛ h•_•÷hKüÄÍb2œÐrJzÃS%¦­ž“"x „6,Ìfõ‚Ï—–ßøY:[ 侚á!ñ�àLÞ_ÞPQ ª|Y¡ºÆzI”3sM' De+²Ä,Gßö(‚O¹ÓëüÚ—ëX“+¸ÌG�“ÐvZØRr\0ŠàG%’‚ó¹|0†”F“‰ÄÈã¡ôÈ@*är0™†�?çib éi¸@ÎÓä86)’sËAŸ0o¶¿sº×xl”p%ÔÄç(¤F²ŒÛdÈ–ŸDéqE�‰}œ®b&!©+.“éÊGbózkx½³�4/¶†á•ù¼~ô‹‰”Á$´�‘Ôƒ£Ì`±[løåì¨&”“õ(%q¹z”’R�ÔÈ( &5úÉäZFMÓ‹ô§ )à «ËkŠ,m[ ªZÒE).·Í’3œ@1Qž\þ+Z \^Ô4—ÑÆÆwÞŸØ|ó¾Ù¤Êp”ÚR;{]Í—7­ìœãvDnÖ[)N8ÉQ¬ÿ”˜­ÈY—­»˜STÌËãÅ¥åEåùŠÁžÈtEÆž¢2Q×ívî×÷÷â¶ýü|¾i)à ­Ê@*d»‘"PÙn@˜¬¼ÚÙ£¾ådß÷Éíܬ§õ½Ètôþxqã½ÃÞ²:"«šÐý&”Д†B† ©"*AvnHK‹JáRñ(­ D¼PöAO…KmÔµ–ŽÑqX¿‡úækH±3¡R „¶ƒŽ'EÔÔ픥N˜I™¥|_?YÍÓOÓû�…IG—<-²ûbÚ Ù}\æ ì>"ÉÁñã“PHáã3´‹ÞÚÞÿû¸[Ó;SV „y@v؇Í)Ãø€_MN€Â iÅÜJN*·2J�$€„£2áp2gIÝdUpû¡¦�I(¡í|Hr.i¿ï:.÷A‰¾R`'³ãËr†ûˆ~y3(¡íÄG¿y~Ô+�)j^ uô'@œ¢†tÚwVñS—k5ºê n]–…•K!hùý�Bà�ø«Q HnJq´¶¸¤-Ÿ]Ý­vF|¹Ï;—­U”PÝ@R£\qŠ~¼OÔ»WrÅ)X‚ôZ’ÇÎÀïüê¸K€B ÏÔÙ�E™È:û\Q&Tg$¯Ç‚ö¤Ásí‘Á3]‹¡“]ÈCG]ÈTŽ�OVŽç VŽ�i™�Õ ¦×k�-ÒÞ ¬V1U[)PBÛ ˆá·²Þù(}×R?u" -j¤+²‘BpÙ¢àzj®Àh¦uì3š'l>¯§M†¬§Ç™ ª§G(*Öù'ÅÕùGŠïXØÆúÒïµ~ik.0+rF+�V,ŸO Á•Ï�B ›Ê°ÔK×»FátwÅVßÝj¨R¥@ m' †§µy¸UúÆ5üÀ¯ˆ•…>ÐråêI ²rõÿ¦¸hÆžÐ8mS�V,‘O Á•È�B¯Dƒe^1à”ÅŽëiM5Ö¢©Wp{{¥Öo&NŠ"LP ¡ø`Þ{-À±GÝ£kŽÅŠœÖÇ)|Mþ–{5š '¾é¤Ê�Ê¡ßõ£×�‡–öi›RRœÐrR±B9'W <ˆ|}ª»h&¥sÊ Ò'X¸röQøP‚¯¬ÞvÂ:¡•â8C€}µöö’øõ£å.ÍÊo»"ñ&SŠ“ÐvFZTMé–×x™HNH¹‘³Ùæ·×pv]5#ë {Æ×KŸU¶o¡rœ„¶3Ò¢~Êz›ZÚy�pª¢ü¦'Äf„írõäL\Ë Á^JQ×/–2Rçk �Õrf ê~ Å•·ßº’ø9ÌÓü*ºO•·@ m' FÖ‘ß7³Ý¾¥¢ É{œ„¶ЪJaQ¦*‚§Pnäï‹yŒyûÛ†F¾ÇIhƒ£óÞà-UšªÛÖí;íåq©‡ë»Ö¸,ïÑÔ&þU¨ '¾é¤p÷e_�Åz/×ewÈÌ÷’ Zö�«ïkpD˜L)N8eÂ×J2õFK1¡ònᬜŽÄ{ióœ„ÿ!¾§´iý’á¿�‡(LB =’Û4Uåú³.@6ìµ'ÃqŸ ãG�pÊ‚@çæ{íV€*TŠƒ^ÛÓ✶G±>;r£´éû­äñ Ó5[+vÖNUG)zë@Œs�ÆúFÀ�ë_Ê;ª~÷Ò”[ß´w 8 mÿì]ÏÐÞ1à„íå\òH¼ú¢ì‹99uº+¯ËM«†–…Ò^^—ëõ&êúà�}…‰k9!|°œ¡¢ X§¤Ì8kÂcj+® ¯]ûõGøú:¢£r)½”GR¯�¹ý¶”ö8 mKi°‡¹—TÝœ_'´²‹ËdÛÉpâ›WÜaýÙÒæ×­'œœñŒ}-Ü?f Áü2ÝdJ�8‹k~.¨oùýÕ{ �ÂçÐ:{LêŽÝ‚G�M¬Ç?ˆµáº,ŒÑ–ß^Ò…®¬ËŪkXöõ„±u9p9&V Ò…-µ­Ÿ-nÚ×{{? ›–í){˜ÝGX”aˆ‘mÀ‘-àçÛÚ¸Ò£a%> Ó€#§–ª«C�@,j„ j/®�áf›wœø8)…V§&O¿ Žauë­CA */9nl¼`Ü›Ýó‹uÕª7ò‡I·QVONÖQ Ä“@dh;:gëéø‚]¤c]åùŽ‚þ1Pâ¢Éã¢IÀ�Q#šv÷Á¶—Çíæéµ¤ò½O4•‡_u=¼¿&’(¡íÄ$´�aš:@7˜)Pø9ÏÓú4^‚%Œ=Å(ŸÐ›cd–ûoÚö"áԙ5³s¨[pp0™R �Ö„Ôj;ZÝ;ØÜËŽÛ8½†xÿöZ†ßtR[ s™þõâÀMzµ™Oë’Þ–Ô°¯2e8 m' …õ4”|º~üzm»Ì/ZçúÞ‚ùdÿãßaÚÎHêAM] ¿çn~Åǃùt­iëé“ÿûÄ*ÁIh;#-¨¦K»{q¡—Nû�eÞÜ�û½�ß°¯Au†ßtRzZÊ—L׿}_íâƒÛÇ®Þtýû9i$8�’;Zlôªy5\z¯á¼:œø¦‡Ð•X{hg-°¦£¶ÿeíá�ÚžÖn ÿ’ȬÈDh€yòÙ ¥„âÇf Ëz „¶§X6¬h \0ÓÁ�2¼4šÝúÍì<½ŒœŠgPBÛSLW³ýh3å5]×õf¦¨]”-…iЃµï¾£b˜È0vQ6`åÛžbÞKe%–ö×êÍG¯îÓß¶œaôˆqÁ[€QÁ`Ft$¼¹ï烷äzÁìK«L\¿êï ¡Ëõ›ÍBÓa±©ü¶– ((¤ ĸ2ÀØðómÿD:%ÐAdÀq=A‘zº]Nµúו1&ˆ 0 ml©Ê,1Õëö‡‹ò"³jÖ_aBŠƒÑ–4Ãz˜PBR¬‹çè6Ä�®‰�`·ù¯¢ý딫 MšÖÔ¦ï8!Ã\¤§¡¸¬iÙÿÖû[Æ{zÍrZöU¤ &¾éŒ”F|¯�á#_ôƒÓ9Ýgä_AB‹ÜÐÑ­>�|§ki·÷$ó’Ðö�úŠ_�â5ÿ« éÎtiUùÌ +à$´á‘ED;1ˆ¬«"Lâ"Rïp4_¨ä2^óû²ðÞ4à$´=N~fÚúÅbõ‘‚B�ßôïvŒ�Lb¦§ªtm×^fÄ¢‚]ÈEÓÒjŽ*êÜÕ ‘´I”Іm’['ê 6%$Þîƒ~r�èqÚð:1¼PµiI»~fûË`Eí™™L/¨£à(6Êì¨Bƒ,ÍÑ¢~D›1 N(�[?_=\+¯;ÙìÚ%´=-¤Ã%‡QÝ+Jrcòa³È-í´TнSßÿ²¾v8ñMO ÞôG±L/ q®O£kï÷�57=!4(iðT·HгõFƇê0hÙœê¾ÚÄù·‰Ø©èf´„­@°áU³� êÈNpTlò ¡4ðñT©¸ˆÉ/œ±‡¤˜ÍNóß»M~å¸jÕßqT$ù°šÏBeÏþ�¨“†ØañH!‹ê¦{�;ÖÕeX»† ¿æÄ$@nåñ˜ó}Yåx§Äü¾ ¤¨‘‹6DœR^L·Ü÷âË'=J¾7LÞ Ô#|ý;æŠX?Œ¯½Ì#oUÇEµJè™><ü×Þ%Kax—Ì“â~Ånõ êmÜ�áv4>?ø‡ýŒÆ(üaCÌïŒý�‰¹ÜE¸È��“Ðö¸;´Û6Ìøº…¶Sø#FÒwT‡IwD×:_Y�výä3ˆøŽßtR8ÍP>²{;ÄŒ›o;-Ö¢´FÚö¹õÃZ”Jh{ßÝyœ‘¬§’9€˜×8[V»+£by_”-{œ„¶[޽t‰ÜÝ ån}ðÓãxVt΂Òˆ=µ'&ÿï•1޽¯Œt5ç©m×c몃lÇÒ;üúŽ“ÐvZÜ*¯ÊD¬kž:›Q«<�“Ðö´Êû<[1Œišï\¬02Ãú­Î$ NB\ 2®¨eÆ»"�Rp” �wzpÆ5FK�…rìpäͲl¯£ëàõ’“ŽiMËyy§‡½£§%p Oý½Á¸× rð{ „¶‡Á¿M�êîjëZ¤QCUÂ4ÜáØ½WSøßt:„ã¹|j¹á»î÷¶)çwL|Ó“×�{&%»jZ—M‡:¼.7ìß[& NBÛiÁðg-™r—˜ëäøÉë¼ê¤ú'¤Ü1I3ÿ�Ð'u±œ}?Ó»„Ž®Á§ãeX¦»~4©#�“Ðö¤£~Ü~cì^ÛvŸÜÀíÓÝ<„–Ûš–rp0v%Fàð8 mX„î¿®\ú\ÅC¿¬kuNj|Ã>ßo nÓhŠÕ‹Ñ/y2˜„¶�²kD÷å4ëŸãtQõCðòmg¤…�ó³sg;âKW½ã�=JBÛƒR_1Ò<ÿ÷‘·ï­ÁÈpâ›°ae&3ÛíÑéšfïà†2“Ðö`2Ñõå°ðíE$†§Ç"N÷r3WÄSRêïrb×0Ôm’q)yeEC{ÙÞç·z¾C$´�ž öx1þ˜‡{i9Ö4Ÿ©T­Òïýö'¡íŒ´FT¹Ý«y ÷áW ¹<7*ÃሠHþ½ÃæÕÖ²CWÏÔÒó m¨Ãþ«�º|þåt£å£¥ªã#ä˜sD»¥2]ËŒ‰gíQÚØÿ÷ùÚl¦°Èdžq¦fB\°ŠÓ÷§u¸­Óý"ý6Ïvv]§‹ÆªbR”„¶ÓSÂgD—úTè+»·d[^àUÝÜwœðr{RKŠÃxÁoׯ‰àqÚ°î-$sýfÖ™âZ1O1ÌP?ybØë^vYø0îÓ‡í¿5p ˜TŽê�”®˜B£�ñŠÙ»õºw×€`î œ„¶óáÎ@¸]au:߇‹!/Þ_0‰2ÌŠ�· `j‚Oih¹€›¥&d8¡O“*X@6}§À',hîËg×p'¡íŒ´®â|Å•z'cF¥»ø]¬n.)ãE~H§ó© µ’ÇwL§‹Y%\¾HË�Ïñ8á$çr®exÙÊ^WL¹\�“ÐvFZ¸*´Æ½ÌmË}ô êéïÞáýx3 ¬I䉑E›<Œ­ÚÙù¶“­Û´Ý'žúbÊM¼ÑÁt`R¥@áhµw_Y ’»¯€7è¦Õ‚ÛéŠÿ×ùa.mYWãI�x2õÄ:*Źï7Ü(Mæ1Ç>FÄ%æ<¸Pcog0*¸0 mÁx&ƒE{0åìÈ8íé6û�ã 'º¸˜VR ]bDÌëŽ?± ÷ÅOU3K²ÔZ/#œ�chcR¥@.¾"Ç‹�8PHÁÞ .Ä×¢ñ>à�iÏ>š0±R Î{Ž¡ Øu‰aAËîìêU¢(¼ìYlBËÀä÷E À­ÿÍ®—�—o¸åY�>ʪ�}Äi�1d{°¡¤ÆK¬XSm(-ƒ®Ë ò7i�òâUð#^üªIÝëŠZØ¢GW¯áøÑè‚z % ÛŸé&KË‹ßeñ8�rÇ}–LE!3”Ô“õÓýwŸ×[2ªÑqÕkÞ]\îƒjªà}KÆmçÔk2 PBÛãÞP “CI!¸ôÐ(„j¥ÿØ ëÊfÞpé³»³~V`e›a)�ûà�°4t¶yuè}¡euV¦£(¤Üñu‡a³$RݽQ ·p3¡R �¢§çóÛÈnËSÜb—1 Š𤂏?áì&¾éa¹žÏYö‡^2¹znÊr0ñMô„NÛ#ëŽ(=PÈóot²} ¿ôúðÅõvH¬WVõYÀ oCl½rý¨¿¹x¼Êðæ@ m' †zvýf)9ZIòµÙJñóm' †ûp*ÛÚ7˜’[-@ &V R¥à@õš‡^4Õ'ʵ‹–£ºbA{BÆ P»0Jh;1VYzñ¸(y»_°e•å�Úþeé-êYÙ£øAY(¡íIY`.KQr¯Up nýÇÆ²Z ªX)PBÛ ˆ=ôaŠ‹j°>$r:EÚÒ{·Þ¯Ð;5@ Õ=$@!uÊiëòÆåxôZwû/Úò@ m¼¶r\¿^†N‹‰zi‹aˆLÞC¹)×ú}*¨í®ñ Þ+Á„J�Øà£F¡®†¿}4‹¼Ÿ7mMæT±R @ûóĸ_Ñæ�È3Ö݃bz¡ÊÁäÕRËB8%Tͤ@ m' ö0æR\ì ÓÁ�ëVè¡¶¿^¯Ój…Lë‰kIR^[^—»¦‡SL+Jh;1næŽqˆM*Ä”Ï5W´>¯Fkè¦v!r žB` uùäu^ÖmßQˆüΕ!ú׳¬z! ÷�€2Ÿµ¼ë:¬×o»×7êH\·ñÎÿZÖIGÄ ›‘]ePBÛ ˆAç³\c·XÙ²¿¬³áw~¦«(¤ðqÿh¹\hùQ7ÜǬËZ¶ Kœ[W½fL_ ‹íV¡Rœø¦�‚ÝÆgË눼¬÷RœprÇ`M{¸˜ë¶ë`@c4ú* 鸟Ô2c}’G )6gã—9–Y§ÛšHw8ñM£³-ü¨tuæþ«Þ�8X¥IP¸ү~²åñƒŸô@!y²êÙ·2Æ;9i¹˜®€uµgG¶nš¯“H ”Ðvbp^Ëa1Ô0Uü¸¸d®ÝµBÐíù©¿w�4t릢tÍp¯¸s  •bTÛƒ€�o{èÁû·¿Õ”B®ß¬)_yoÑ0¼@ïbµ ñÛwï{Ùœ®(~½ƒˆ¾lNëz—Jt�T•”%´�€˜‰TîôçÑ@L‚gmY—­ZxN7¦µnhq]€Úþ±ËÖ¾+›`Ë8è‡ï²”ÐöÐeqB­Ow –µÓEêý)ºQvgÉA‚÷b)Jh;±;_â}ÑjÑZÉ—.õ¦êíôÖ¹|Ü~Ù‰ÝwÎÙ¼e ”І==Š. ïç-C F/>Û¢“÷f1òõ}özXçò¤Ñ-UŽ“ÐvFZI]Ë»e°øážÝ89ÕRU•â$´�‘î¿{Æ4•³£:vßTÆÇ8W'Ú(à 0‘˜�ºäÔ¤GHKã 859œø&^MZðf4õ>Ú“ãVdÊqØž€ä^å-iº§i€vêßq‰‰L8“;v�‰Ä|/Ñ›¨ŸâçÆ£JROÜi%Òq¨͇<Ôå êý“_Èä²_PÖì_]¸Zrìªo�¾üGß oLY)$ØÑ�–Ëy!%Èr^ïô`¹åÂ,{ñ•0gb-ê{lËng3�ÑÎý¹±©&ÃIh;­‡QŸââ÷›% 9ešŠùnœ¦¸t7¤©"L-MG±8æU âhŠ;Zä¼CÑGð�§Éô”+¾³§\Ôá;:åúr„ëØðG¸(¤Ìî 5³’:<×ê ñŒ;ðª)Â3n 8LZJj•F2õ4º9 ½ ©¤¶jµ„wŠR ”Ðvbä9nÀ±ç¸€¡o;1¿ì“uƒ~·- Z @&Q R�`Ò×!êV¤¡ÿÂI¶¥¤@ØàX7Ûý,¼O%´�€ØíXK‘“ËI¬·¨½mºuã}Æ¤Û ¥"Ѱ}” Ê�ÚN@ Þ‰Ïa¾+jÿü|Û ˆ=Ì&»mP Ñ´`ÊJ�\_à1–v´ JÅXˆk;±eM6í(—º‚þ0Û˜m½MðÇ�ÆCê˲j]ÿZ*pÒ%´=zH å–ë 9`5à|‘Jhþˆ�Ã`ÇJúòÂþËô@ mÿËÔZ�½ùÚnþez „¶§‚§ÕPÔ”!§SÆ1¬z]j5-ÔÍ(Ê1 „¶'Ç”5ÝnnÔÎ{�_5øç= <ã¯;Ú_œ�¢£ì_kw9’Ë ×ŠV·¹7üßw œ„¶3ÒÂýwõr å¯ì�j¸€[‚ßqBKž;µè£­~á Y‡¾G °ÏÚ¥{­>ÇéÁã$´a=ÀÙ$ëÓhŸ6¶r[ L�ðÃ|ßìên&9à=PBÛ“·Êgœ8šÉS;Gw?v·ËœjPDÎ(¡�Ÿ{õ‘»²Ë¹èíÇ4á�Ú°&`Á©TøÈÏJý}5¸X­ÐJ·Nã]“ľ'LW)�³¬«Üä½U,j¬Ä™ÝC'<—†ËÝÙþ½ófP?~«]%@<…FgÀyÄ–ß.Ñ…>w瑺醘8Qc‡i5øÑÜùÔ×î=5`j2Åd8jv|è­¹ìûh}Á:õ†jx-ÿ÷îh”Ðvb›•ï*[-ñ·ÎÊp */Æè‚¬.É…°ºd¨Û'n²†:7q£ê¹K·»böZ×Z¤Kö@ mÿ‹KŽ•ÝI—ÌUvÿ7—뺓.™«ëιäÜúhoÈvÿ7oK©’î�+¥ ¢_æ+²3UQžŽ”=­!J Á•%�Bp%J\W¡Ôáà€ê“ÆîÚ͹Ïû�Œ Ê#ûº£¦©(¡íĸ"œ-·p3E¥@!E‡Ý—ÊŒ…HM*¦À&UÓ4–�·òBúÜÕ2 d-k‡ßtRd×Ùrö®îÔË9G`_eÊpÚN@ wUŽ *(B1üHu†Ú«úÂÛj?ºßk`*¶:”ø&hN` g ¨SHÊ‹êIh8›m(n}}!æ†vrÓÕ¸hîí%}ÑðÓš „¶ƒ¹=9ÌuRŠ`çÛÎH oH¥°`'Öy97Æâ˜7#;ßÒÊáw±4òÍ”Ðvb£>¼°Œ6/¯[-(M¾á�ÚN@ ê*Ç^z›m®™ºêŠ{®Á%´�€ÖUŽ‹J(b1 9�‚S¼tŠJ0]ås§PNUk_Þ �/C½ÃRU(¡íIUÁ¡çÖ—IE˜1=R-½�¦:ë¶)ƒÃ‰oÂÀî²Ìê�˜38ß&T Ä.vê}á®VQUÁËhÖ×'>nk™W‰2ŒÛ<)n¤y;Ò"7N“°ë&‹Ì¯÷í!˜luR•q4é‰q¿bcGD�èR&zk?˜ßq-ÕúËÊmC¤Oô@ mØkÅ 6GE%¡vœFÁÅíuí4Ô˜"¶u¸ßñý܉HPx¨yJ‰‹ô?§}däãÛž¼$0¥ÕÞYž­h‰½ä‡2ªL) û™†Òƒü¢=“cEtiüsñcÓv­‚û:~8š#(¢j' ôZžë&=Žv“‘!×µÐ�s¯zžrϨÐGËc(3]w/tèãQÚBàŒó %¤&ÝÐÑm µ�E›ZôÔžùb…ð@ mOBäŒÔ‹Œê9Q¹hPwã”ÒÇ> z”„6 ÆE|Šæi=•±"¬<�¯~-³Ò¥ÒÛvÉhÐ%´=EƒLØ¥Ë!]�ýk#š »è¢´¾a.Æó@ mO‘^,Ž¡UÀôW{_¯BÅ@Øó³ø<âX8 �¼lì‹–ß�è�B _Lr|åÄ0Ø“6Å|GaEBÆA±õf{ê@§_F“Jhããâ�ïûašiP„rÑe‚\bÇÇúãÿâ;¬4õŠQõuLÿ“;�ýާ;Y»¼dÝBq·wñ&T ä&š]e³˜àmJÄìçCoO *ª·]”+<§i¹°×ÏÇ&R ä‚‚¯W�IËÆ…> ¾"õšGôOQ[5v˜æµÁXI�ÿû�:rñìã!µN“Þ‚ßï yûßÚ[ X¥$(iN@æqëÑb÷Ý–S鹩¤JLÛú±¹•Ší‰ÝçýfRÝKø°4Ð]BýÉ5(^›~9§£Uæ—Á6#¯ÁV÷CL¾Mv°®·ü^Æ’qPî‰acqÓÞ>Ù´3ÍÕ531…GIhÃ1²—}°ÀçMÝMðžY(A� >ÊÌLð-v‚÷(a$æ&økI\„©NZäüîp⛣´UŸæ¹(�õH$®ëmSJŠÃ˺ '`´Ì~0<�ûb6Àð#’Ž0âPömÿc´îå‡Ã9'÷˜&ü݃ҳ;ð¼MÓ¿Ïíí\ðÃÜî�Ü„ÄÎí~º£§w8O6mO“|ÐU_ÖJ¨Ü‹×fê>ÀÔ]Äï8!À“ZõW×'Ís üÞìÀ®šÔwœp’ƒÍþµ+¦y­eÆ[f÷–‹NK“®ÿ_2å@�’{b¬¦<ŽVUdèÛž”ljý+}Ü¿rï@õHô;NH}~Ùš–áoîëŽÜ›ÝØ}n=ã„–¹Ù€�E)�ûè‡P²7Ù¯åxÛgÃï#šœ®Iâuº–ãÊîh‘ªr(ZS�›kzÒØsÝËÊ´/õxå2BmÐG½ÌU¶*©2e8ñM' …F Š]RCïŒ×½œšöÝ�=RO(¡íIS`·hx3]ë˜é6ŒUe¦ñ6c È?xo˜ÇIh;­‡¡7é¸õé¯ëêïÍîìlèe8á$#/ÿ”Ø/&¡®“)MmÝ\"ûñÂß¾“SUJh{T–·ªM‹A•_Mþæƒßø©XPHá} Þ]Ÿ‹ƵSµž�ÕXÕ½�ï8!Åîþ»ÓLCå)õaX–Z¶atF¦  '´ÌžÒ¦5ßÕä†jѤ(¡ -úò¢:>Çá 7}µà¶{ð; jG¥@ m' f•`º"Øq}fvzñ:)Ъ5Ú°Ý»):0ìÔåcá›ãÄ7�€”ø'àÔ‹mWŒ×/íaϨ&o®uŠKpPKÑô)ƒrìxƒ @!eGïE}¾Wì{µÖ½(|ºÏõ•Ðf‹ç÷NX “ÐvFRåGkÙP�T{¯)§,�÷zCwëör¼=m“þ¦ZO ”ÐvbRÞ'ßï“lZ ʪÞ%¶Ú.8À˜6‰2œ�þ¡ûï~‰²¯ÒµƒÞ^¿G‰~ÁpM‚ã=¼>9¿G×w˜„¶3’Š£+…Äï6“ÉYq*Lzkë×âà—­¿_$àz+à$´ýKomjý%›º{9C¢·LBî­P€f+ö¿Ì÷ÎSË霊<ßABJ|ß'¨=ÕÛi…–}³€àƒË¹˜b¾ƒ„�5æAný\öÃÇe¯j,QîåS–{]uË~šöw°š�$´�‘�D:Ã\nöأä o‡ß9‡³¡K¶8»Ä¶€qÓ�ËvsŽ ã—i$ ñM§§ƒÖ6 $|s‘%c“+\}Ù†2“ã<¨Ë:Ã7ñ›Mš'œþíŒå Ü‹Y§ó ­ “Ðö ¦÷ »©vî·p�T&MýÑÑö>�&p•éh±}ç`l×n®é¡ã|Ì~…ÎeI¸Õ•·+”�J¼X^§?‚BªD)PBÛ ˆá¾Ëq±Wlô é.¿m {¼‚³eûÁ€dz»Çi+Ÿ§¯ý½Æ}Ž“ÐvFZåG%ô�šPiëš~»gø;wU ~»ž '¡í´àV Ñ¥ÁûšP„)ø6èÉì¥lKõýß\GëZv?–ûXu›îtèšù[íå;NBÛ h=hª/K¡ùÒôºU3+‹45·¥öÉ~òX9LBÛH=�K‰5ËVùFÌ]�óœpN“³(?Û°g)*6¥Zò¨üúÉR¬`œÊ6*�æÁjÑ“"¶Uõ¤r],R-Å‚ÚV 8 mÛª±žÍ†juŠI‹•Ûii<÷Çñ5A-âóñx¶Oœü¶Ìø“_�Rp˜÷Ò¢¶Y<]î¾–jrI^¦¨ '¾é¤ØÞÓê ºkq óßzÏ%´=õPUWª‹Lóõ9¹¾gê¡ï8˜K;Ù¦b=îï|¿†öi×Ù'´œþ€º¥ÍÉ{þ>t�ÿŠÕwØ ´ò.÷®Ì'óåÍêC—Cj"d8 m' U6toûì?òÝË,§aÒý\ĺØAÝOnwºD›rpg¼g8 mg¤õ�¿üí ¦/gÌ(“âÔŽÿI5Q§ÿHMm�tŽó¼ßóB67ÆÓö@*OF2°â´¨õGKc9Ò»¢’úü³¾UqAúµ«ÐøS,(Jh;á‘:ºÕ -6õQ'+T'˜†{¾û¼y“%´�€YÊÁÃèR‘Ÿo;1‚¥Ptø¥½]VxÓ�áè”p%˜T)PH�RºZµ2šRÚj¾-§«€“ÐFë*…]?YïÀsy{t†]´õ@ %›èuÇ2†—Çõ–`"¥@hé@›PQÝm‹c-wÜZË$¨b¥@A¦ˆq¿b-’g4-û ÂˈXk?7ß|€o6©2œ�ú‹VÔmV–Az§4ÌÀÌDÊpÂÉ ýÒ]±ûý@S¿Ø{¸ÓXë-¶üß Jh;1n¸iªb×rû—Ñæpâ›þ—±6ô÷ÓZ’à‡¡æpâ›ðH`Ì©ß,WEÓ-·_ìÉ%´ñ•ã‚ LQ?J� u)7èа_N¡ÈG]½\¶}ß5oÛQu€QU = 9D¹v"óþ[zœ„¶‡ +ªÕ¯£mFµnŠà†Ÿ'…õ4,ö&¯f* ÐkÀ„J�xFu¢÷a²põßíÁ¥·T±R véž9=Œ‚‘§R؇½½º:¿rÛ±u½Te¥@�Õc=ƒÇÑž!2äzúã1ð~·í½«×úÞži·Zñ¼ÕG•&Jh;12vÑ«…åQÝ¥Vò!c—”ÐöàûãÊËmnñ‹àä¶ØðvÁý\¸>†½á•AXGÖ]±c~°(e‚rÇŽÊNHÑá6FÚÏ!à6U1öÁïè¡©Îîè|¬e£_òs¾©*b¿0 Ǒڲ;;s)PxÙSwA ý çØ¡Ë^Mø÷Ó ]9Ý(/Ñß „ÆV©2œø¦�zX |Ew\×3εsAÓ¸¾viïLl2hò@ mÿKÐ4Î6LçõÇ É%´=MQ[9.ªÁn‚ Y�Æ¡¹¥7× ÞdŒä�Úžb$oÜ9*ö„i†`Çuë×é2»2ˆ>bn.Bò@ mOR|R}XÍsu{ýÖèí¯ .gÃŽ²é#A!¢!¥7·Ê,2Õí�–ÕXÕm³Æ|kô|SWLÿ"k)>ŽÑÕ]Žï8!…æv9®°U?cê) ¹Éápâ›¶82%ÅÒ†œ’¸Ê† g‹‚º×(W;ÍZ_Á�¾t£‰#ú ùZ5ôfþVP‚“ÐvFZŸ™ÅZ§GËõ¨³··LÀÄ”“ᄸym:>ö‚‰“4Õ¡ÀÿÅQës>ˆ+ýPZ2ú ² $ç…PÈgŠ¥ 9â*bê?ÆFÖäFX¬ƒ˜™u,¹HÚ5WrXö¯s ÓÑXvõ9 k›9@‡˜†˜p]›\lø¨4d½E‡$2¨¶˜)'Zä´ÃÕYÄúùòZMf˜—ú(³è>ÜÄÉ`Bêð³\çlžô­Àñv£ŸlÀÆ„ÉpÂIŒB޹¤`ºM}×ÚS úZ�&?µÃ4 R)íãG‡%@ m' –ê(V€$•ÄU€$ÕT¼ÈGJ¸–fµÊn/;Ò šZ¤°_?"�(¡íÄʯÆbìº-Õ›{¸B7M×ݼõ.<‡¦ëÜwiÁ(¡íĬ¯ÊlQ+ЮŠ¶y¾_ßsýp€~0‘R ��Šºk™ïz‘“¦“êk1Äe½‹Iy ªX)PBÛ ˆ1šŠµÔIMqµÔÿUS±ž(©)®žhÔØbÐ'åËÎD¹'~v`W¤Ê�BÊ‚£k餅+ô6ôüFìÀÎt•…”�ÒU,8JêŠ+8ŠtÅc�Ê"‹±rÊBÂ/›Õ<ûZ9ð 뺾ñ˜×8Ñ«¶Êï£ÇR „¶ÛUí¯Î`!øhë²(¼¹Z­æÂ…ìF”_•ë4ò3±ˆÎà„G欮^qW y_iMä&bb¥@ÎPáqX>e{Þc?Ÿë]Û ˆ=(ËÞ¨Y†þåɚ䈉•¹8:Ê<ÈòTgÀEgMÛ ˆ=ÌÀKYóim‡±®S?BÆ„Œ&U†2üDªJÃvÇ¿ÊÄ„û®íŒ´U$.÷³ÞË­�5Èx¯u „6¼ �ÎÜžÇÔ¯©<¬ Öé.-üQ•â”'V¼í^j•gÏúgîkšÛl›±3�Ò9gÞòûÁ™{ ÷Õ¬3×'Í nª�¬‘ÎÜ%´ýÎ|›ìÆï¸¾‚Ι{ „6Þ™ëCÔ»yÛu|Xuz~fZ)¯:‘ðqbh©ÿ0£x �¢R3Š>ö=Û$PƒnFñ@ mÿÃŒ¢­¦µä~™Qú¼ÖW¼Uç¥�ã^oª;Þ;s PBÛ ˆa»º÷>ŠÃ·üÀïs_å Pxá­ÕÞž·ícÈ1Bx „6,4¤T§ÑBªJ;ƒ37.bºü¯mÂvõe2bò@ m�S:Iǘæ5bvg˜èÛ.êeÞé§×ú�sŠ(¡íÑ)SþîÙij¼ÖàÜ”ï�Úð”�ì&„{Z±Q BÏWïô9.È @ m8ÈEÝ¿¡ÍSºµI»ñ@ mØnje&¸øÑE,†!§A”õ³Ïå\wê0‘¶Wƒ‰•¹ÎxÐVj�^‚*aº(ÔöÄPò÷ål-Ÿê£©1ÆõÃÉ„J�8Æ�c:ƒÔ‰x ÞŸzäzbHWÛ\N‚õ2r÷š7]Œë=¢ •9¿üè8“©ÇKðvœÄœãIOìÁqv¶óÚMu:�¥ŸIM¬ˆÊ8-sáIËï‡ðÄ…>�­"õ:§A'j4ïu¶RÒ:ݧùM x€@Ñ„J�\¸ú°or—kÓ×-ïÊØ£}Þ²×gåZ Þ; PBÛ ˆÝ{Q¥ úÚ¿^•l¨€z=XJ€Â‹ªÇ€Ÿ|`� øÑ+jù¯hÓåiû7Ó�e×IÓåÊ®CÓõ‹×Ü´";ë/Ê&ÙI�I†ºë¬-S…×�-SÊ O¢±Ê¢žDƒ�ËÎÊ'} *”zl·òÃËò¢ÞtꢮA vn¨_­ð^)ó^�ÙÌb…§õo¯�xûâƒãþö‡ßqÚN@ëqQ”àÈ?J› ÈŸ¬¬çÊ C5þ· )à ­LO)¾mDŠÀ½m„ ÞUpüÀOÅ"€ÜWãÒÓW—nmú‹¾üUZ†×;ŒîÅ+Jh;18ÚrXÔB]¿¦ü8•Âw_²çJû«¦ªü•Sê WªÿÀ 9\ÿ‘/ä þÖ¾X?¼êÜ.ûfd÷õ^ëû×&Lª'¡íŒ´Pñéå•Rm*çž®ð¤Píéľ“™qLu¨‘OuY"tQú½åvnE¨'¤ä\mã~¸sôæ»t8YÚØáÄ7�…�ƒA�ö|Üåþî§Q|Ñ~ÿýuŠù V“Aè†ò)['%(aEÌTF²�š¦Þ5€îyµˆi¨ç¨jZº”š¶áõìnëÐáãP‘Jh;±‡á”âbakÓÁз�°J6|c¶½‰¾{Eœ� + ©SN[mð´å�BÖç´5̶è릿uÿE[(¡íI[>˧\NÔ�r-@ëÓ,c±†i¯ëZ'À{&@ m' öà«ûÒ÷:Z들 ¿ð3g�…>Ui´‚è ÖÜò’ùñ€"SkŸ}N juìm‹©ë_CŠë”Ðöï¶G† A!7ÌâÚ‡xi!¾eaýC<ÑÀ=Œ�¼ÍdÉtú^Çj°ðžÌi–«¥[ÿñ‚bŠ“ÐvZxTç8ú�’Èз�€ºG£¯¾”ˆvëïígðhI£–ªª'¡íŒ´pXŸÂèK;ª“)Ko5ðƒ¥{ �êDFuÉ\ÛaÑëîȃE~Ö)Phᣳm©ÿà¥=PHQCÅ4íU —¿Ûµ‡·\<³:Ú¾ã¸/~ð‹íkk¯é!:k¨B¥8œ9ZвSý¼LàFiF@aÒºº¼l|¿-Šœív¥ô©¯M•<ýí¶ÔôZ0±R „6¬R ¬¹TÒ&-h°×ñüÁîìŠT9PHÙ‘²â×,å5‹«åš,žûß·Yå( m§§$mC¡²hAÇËO,5è�·;rý´Ÿ%¡í”Ð`×[@½ýf}°ÿ¡E ‡ '*�2œ†Ûvãp ­f/ñ”Zü~÷lÃíˆÜL¦'œäh×k¶Œ!]äÔht+1Ö´VŸÇ ð2§ (¡íÄ¢¥µ`îˆ`È©”ëBMTk\¯Pgþ¡ =NBÛÿÐ…Ë5 ¨9öõ©e²N|ÓSÿ���â÷›GÈ™qº„}7i%Õ«‡»¿a­ž¤ôù<×®V%UO)PBÛ ˆaK_,!kº<íøZÊ~ð;?SV Rxà?ó¯ ÖbBZ ,�SÕj¹V“^ÿIU(¡íPÕj‰…êKæþUyœ„¶UEc_;˽Т�7¬ÑÁtP¤Ê�B*}_CWÊÓ°Ö�iÙ€]õŸ PHÙÁ&Ô%ºF=Ó¶ÞEE×eÖúýl¨îj]ô’cFÛˬr „¶ó5]×¥<¬5Œk}jÊ)à 0›J�Bk3ÒºÂäEÃÍšÂ%´a!ÀÌ’*Óó¯B½àÛN@ìa¸Meñ®–pï;Ä |½“\5Güår ŽË=1¤«ücbϘP„¸n¦FÛ5Z|¢«åØÑæ�ÚF[û*‹È\¯_ŒvÜ«7ûàu^E¤(¤à¯²ûÝß[S{1YíãûS¶òú×0vóýz�“ j*Jh;1lë×g”Ïé_›/-¿ð3m¥@á…´ö­èt‡ˆ“Bx „6,Äå³[½”«C¹±ûLbŸ‹>‡}½ßpÜ«H)PBÛ ˆ‰/wO`âç‘fœ.‘iEv‘¯LY½«uD.åÚNø¦½oï}ö›Â$´�‘:Ÿ@e1l÷&æ¯J-vb|G»ûø7\; ›¥Ù›H)PBÛ ˆY×õ=×ü ͇É^ô Fbe8ñMöv$V»˜ø‚ÀHÅ¡¾œºÐ-�æ«—ÐeÍ`�åO‹÷õ£Õ ¸~²–ùIoÔ½:,ljo:)“§L"UA{ÙÒçš­,D´ ­ìZi²¿Ô“¢ ù´”ÀÔ¯_PÖ׳Œudn:Vç‹ÈjýÕ0¯¥@ m' Æô˜VïÔâ¢ýp?ÐÄv™Jhû×NÓåÕï÷‰*Õi%¡íß:M?A¦]ø>ó8ñM¸Çb°¶u“Îvløë¬£/_ßéÈ\¬ÇZÞU ï(iN@8éM3ˆ•êõÛáþ„†Ïáù˜õ¤(a$Žëþ­/OŒ^¿ØîjAÚçúã\ŸÇtÜ«H)PBÛ ˆÁÉuë·ò)ãZö¤ÏÀïüL¬(¼ð“­ –ú «êsWܵ¸³‡¬6}ã¤D›£~Ö-D”ÐvbpiÓª‰Ex#=–'Ë æÖKýŠô$¾étàfȾܚÜUd4 ¢óµ9> éÉ™ïØñƒ>…”�k�¾8Œ{ÿ×÷¿ 5‡ßô4Т1éâM;}©_Ò  ST†r0F›£ávn¦§ '´àéФEˆcÚ·a! WÿÊ€ìïµn¢ÑјTŽóv”;jx±îÈ�„“©hØËjnœçûÍÂOVGô|&Íw�Pþ³ßMU�YzKóð4­_¾C„ x¿%iv¬º‚Ëî,ï({&N†“ІGh»í·^Ž ¬�.G»“êñ mP=ñ¨qíKú–î§w#Ü3Š[`¶%•…ÜOãvÊZ~?ì”y �Âç»AeŸWoX®¿l5(i6�òí�U/À}F„äî†Ç‰ozÚÛxmµ^£^W£ÈÜ»{Í'þ“ë.y‚Fyu‡å6!ë'/~Ë뼬§2œðrgdE öV€í‹y«ÖѺ×?æ>Ö­³µÐ´ÖmçÖ2ª<NBÛ hqÁrË��•=N�à RNT¶WHQ»+PEa�OE±Ÿ®a.Ç1£žß*r¹©(JhÃá=8Ïa¡Gª#LÙQ½K(*î#�Šâ¶8E]«�Øjû ®pÿ*T†C+œ@ î»uÁåAnïßò:"/“(Å )w$ö2(È­Œ ³îsÜèu_Àq_ŒcÄ®Î^¦+nž ¦ÂÜÚ☱Ï™)1o�”Øìãz_jçõõ:ok 0�z= imмÓÛ…ñr«uq-Ñ·�€ØãåEw¡w|ú­¿Ÿ\Ã¥(¡íÄØN¼+%íUw…ìC‡ßôÔƒÌ-˜è7É[0œßD÷?ò_ѳ?w½Íþ¾üm®ÑxÃÆ4“÷r¥ñ¶ã¹ãå Òss—ƒ�çn`³:zúbî«|ƒ¤iìê=ŽÖˆßñH”Ðvbp�8‡…�Tëc¤ì¨A‰NÌ.…–SˆËòîë¼­ ƒjê PH…2¦oq¦Î]B¦Nt_¼ôÂuwç%vß;Ľézâ7î݃u{¦�ï(lÚQXÎŒ>˜ý`C J™ÑåêɦéKäûæZËèðŒê’ „YÎdÁE?ד–×xÕÒ* PHÁ»ÿ^çÒ¦" ÆEwÏÀê¬LINH±©Ûw!!/ß1á¸z÷8¾â½$f|q—’Ðø",:^d,š»ÿ,:¿åæF;yÅ-íàr[fÇ˨ð½n´qFÜ€¤mx2ßXe:Eí›V2V\?ÆNšm;{º–¿µ2Ew_æ›kÛhâ]b"ÁIh;#-8¯§(צ¡œUÞ§D‡ÅKuL‡q7êP‡1éKΜÉܥ̞QÖÑW1i‰é,.c)tW\†Ó‹õ~À@+ŸNÕï§'¡í´ì~Æü¾Ÿ¡¿Ðƒ¸y}­»ãó__o '@<Ä¢*a½�ͦ_Mxïë§|ð;?ù)PHáa÷-åšÐÔ¯½Œ†ßø™¶R �ÂMôjÙ°‰^%Pà�è®hï ¼vzîÎþx9AÈ�¬8Ýûu©'¡í´ëŽ÷hIëæîÑ"ëfÌÈ%.’6”%.ÓÿïuA«zër’ô^q/%ëûó ŸuWv”Ðvbþ$‰{Ïi/ÊúAðš(6š‡))íÖо'¤rì¹ëÅ€}j3!Õ•4&Õ5v":5_WKuzÝäÒ‚E:Ž×_[ïøTÉ[GPBÛ ˆÁÕ`óZ©¶LðCyžžX3]ä?=by‚ªw¹Ž I§d¿1I§ ×¾éÇ焲ú‰¹¤T¢7•ÛÙ~8ŸÛéqÂ*1d®Ûh×�æé•«L¥M „¶ÃûãÛ~¯«_C$䆤HSM „I‚ ÃÖ]Xï«7Ý�Øæø€Ÿi+ /¼§®¨‘20WÔ�1—ÐѦs%Žú>˜k;Ùêúó}#Ú'Of5'9r_ü�‹×•¼ÂqÚuËâ„—�ºÁ®Â\«À×tJñ$Oì!·ùÕÔp5˜X)Px�zZñþ'u…/J@e»z}² ¯±(Áò9g ïËi°ŒšÌù n F#’p¯oÒN¹ý¥" ×ã$´�I¸Ðš¿_?Ž÷ ª!e×–¹ò\®•ÑÑ— 'K &“pN|Ó‰Sp�´NåÓñ@!=¨^–W>‰5\ÌQ3%S¨‚0¸¢ÒgŒçTpÜ2}Eq½ÀuœH£w‡šÎÖ}(#Tpõ’5� „¶§é,Té›ílüêè{•ïmùøØV)ßÛŠÁ6Ú»�¡oËïü,„M� ŸÆß´”!¸ðþZf•Ë(ëüºPË…÷(¡�ïs\\åÔEbÊ�^2-÷͘zNbë°v02Œ­Á:„®[f|líqÔ÷>8ìÔWÄØÔ„"œ è2³[Üe g7n›Înq¼Í³åíöëëè!œ%ø# ;pI�ø8œdÁ-«6‚=PH¹©-½+4ï³æÛ]’[z(¡íaKœs.–€1¿‹:„m"¿¯YÏ Þ'Š›¤Ì¬ÛrûaÖõ@!E‡‡TƒmÜ…¤Àn–ŸLM¨†çR4/Ç©à“ö3H JHôZÎ`ÏÝ]v_~}BƒÏ�ª‰Ýßq0§!&[¡mákì–Îí·šs¯Sø‹-ve âëñ– wõ¤å÷ÃÕRøRöÞ²^¶ÍÝÔÔÿÒ㺼+ß¡¯ïyuJtýØ›%€ÚN@,zÖKŸ}Sm{ÙgãÕï¥ã–í¾žÙOï*Ý9N|Ó HÁ@{ÙîWö^¯ƒ-»eÎÍz�e1¡&{zöZ¼NР„¶îqÑw�uz©r+&±\¶§‡ÇÛ8Ý)°‹–iײœo 8 mg¤…\�¢z�:×ZÙ[Q�nÛý”õ¢ï¥h<±OïëBPBÛ ˆA—½èeí ¬ ¶êU•«a×?A€*U†“ÐvZåW³‰~µ�ö£OÚ ]$È`BKé é£jt¬N?àqÚžDXG{”îúµ=‹Ú?ñ"BŠ£¾ ¡ÕB?Qº¨U*›=@åxW�˜¸–‚óCŠ Ÿn}”ò¢”ˆFÎr?�®7…­g×û9ùy­vÓª£Ê”%´�€ÖÓjW`Þõ†¿ð³®K�B ÏX“þWé™+ß~±'”ÐödS± sG~&Ñ9¬ð‘Öå´šÁ¬«¦í!¨»f�’°1évæé¹€›O†NpÆ|ÊR|3õÚAg>'¡ ›O`³z,E-û�|3¯{ño{ò†b"¥8 mÐè�žRXÔ@Š`Ç*s2ÿ0÷i°§�ª– ‡¬'�â:ʶ£âð¡¼3ð×�h€“<êé2úâüçí>q}rÄ>1‘Re‚H9§B‹pÂ9¨(ÎWܦmë� œ~=ÿ*T ”ÐvbdÄáøñ!G )<š;Ò¯‰]c“¡®Ÿáh[Ê~ñ:twÏF:ˆtLSßQÂLHG“žè\ª_ÑJÃèðŒLA)J‘Ñ­t·äÍwb—c¦]k†ýcD‘rœ Á=-NIEé(²rMPC>#D#Üm1³[‡:Ö;j1à”QJ�ÚN@ ^Á%p±Gê`KrÝK)kй¦Ôå½=©+‡ßô¤©x¼Ø­%×¹ÁVuzßZÏèæ]WÀGà_…J�ÚN@,žÂ映t/J™È¢ôÝr… %Ÿ«|î\LeÑÇ—m'ûúÛµ<×åôòx9NBÛiáÎz냥×l†²p/[΃žÆÛµ'@•*Jh;1¬«wýf*JŸ»×[A;¤Ð–TÙÿ»Õ¿5UJ½ßv¯®Z@¦©(¬>͇w·@KYÜij»­¬–~³@tëë¾HË» ”%´�€»JÒ<ÅÉ"Á;Ò%—I(¡ /”@ ¹.ré#%ËÚÀ/MªˆqÝ —Þ!poùý°¢ó@!…wXæm°°oYïž�qfX…˜P)Æ™`IÃ,;~©€BÊ{p+çÐZFt›�a `ºÊpp?,'¨�¼eÇå'œän>ž÷Qëñ_3ý eF ÝY=®îG×E‚ ¸Mž '¾ Çî1Ö�óÒß7F®»þïµßSäùßôäÙ¸µÅ0ç6¶"{Ê9~ðúÁ36(âC&�ÉìkëHŒ[%ÞÙ™@)ï•DÏÉøÄ–Û>Ñ…ýa²Ým(öÞ§ήεßqp›;NïÚ¼ÿs0á¤D»7©CnÍ$Êýå!SçwHïÇm@ÿçíY¯¿©ÐÃDZW»èvì«L®¹-rÍpìš0äôI-pç}·#ŒqÑ»Aü7%´=-p�¶fëŠñy9Ù P¥Êpx9éiÁÌuWù¶ô&r[¨ ¯VRÿÔ´`Re8¡(Å-)·¦�Bpýå¶ èî Û ®‰ï¬¸nuðÞ„r=!VôéÖPºŽ zS±€ævPNÛ0•©XS•{sf1S£]èW%¥@œªá‰åÛãj óµ¿�ÛÙí”Ðö´ÁlÛL]±J½÷Ó®�ÉozÚ³iʇß8ÙÖñý”Ôݯì6(íéØ!&c"lïf™A´ !£È5a ÀVûØÕÌ›{ƒþÒ¤Fä‹>¯fãk,O† z'ezwT†“ÐvZ0¯®ýÑFóF³ •…w �V›ýõƒ(¡ δr�Fv–ºFt'{Y¶ú�µVïmúŸ¶qÛ0=e8áÌ,Íí»V›:CÍ]½ÀÂ¥ö9˜ø&8 ™`q„q7À¸ÆÜKQ´n®é_M¨ýúlÈ…TåëÑù[¤ÉvK>.´¼ÀËt”…yÆY· ´ªÍùµÜÀ­N ßqBJŽb´Évu}°p¬®ìÍîìLSN8Éó®›í8@ï0TÉu�Jh{ê:FMóä©'”Ðö )�¹‘ã¢ìÞ%Á�Õ©Þ=žìÊÄ}gT/üoæFî[YSy"¬üæí�Rœ„¶3Òz¸�Ú—õÒ|Å ÷u“–ÝØ™fR ÷;kÞŠ˯ÜÅÕx ÷sþø”ÐvbðòjKœ¿šëqÜâ[ÌY§†k¸Õj3[pMg¤„�*\”åø3÷dÎ^ýEYÒZó‹²ÑR™‹²qL3e¹M]”Õ'l ¬¿¯“´ß~„o¯×Þ¿£„Õb¸±Ú�þᚮà ’ÝMÄ)€»bêgŸµ¬äg}vä¾”î»�5‘R¥p°/V�C{²úå†Ù˜Õ[ø PxÉ­x—“‚»Ì…áç*m]%ÖA÷ÁìÌjm€¯0îƒÙªŸÜ~¨ùш�ê}¤*ŠwM)q7M‘ŠÀÝòÝT;.Í\o·ÕïK¹î © •%´�€¼‡Ÿ¢|—˜H3¦w9=…»¯¬ž¨»¯HOÿÕÍ]“hµ‚BZçÅ�x—³e^%J�ø2§'ÆTþiyýPúÇ…œº‰ë¿„¾‰UÀu0ª\0Xu{º¦À>ï³A+oçô'¾é¤ ¢öîõ ôö?̎ȬޣNp N\X^»û‰«eÝíf.,œ„¶ÐBUíô‘¢âj‡;÷å­/•(… '5¨ý×Ýï"]‹¤ûDØ›R˼ ”Á�%yJÜ�n�â.tG^ŒÃvßNvÀ §G4£h5ÏÛ»Ì[õìÀ®VSH€ÂÊ®UàJ‘•n}Ñj¨€º¹¡(¤¨(¯c_¬ÎÊÔר¼åw~¦›È}57ÎVõe¥„¦?ÐãÌÃÄ7=Œ3†´Üû¬°÷ã]œ  „6lC¨H¢–znj‹Vø™ªR ´* žÓ&«r{ „¶{èÄÁÝÕ”sÕm¹í#HPÅJ�ÚN@ î?¯cWÂRMnYîÏiø€_+ )<ÒVn“qˆ™X„1sã–V_­.üµz¾ŸwŽ^~Ü_ËÇ÷D�±—÷ÄJWoe—jšÇWö¦/Tˆ+n.›iÍë9P`Çzb¬%ymI‘¡o{²¤�Y¬÷5ŠN»ñåt7›9—ò¶ÔSÅJ�ÚN@ Üë!P±oÌ츎æt5-öâü:Üï)²ºò@ mOºÎ`´úš-ïG4üû ^‚*V ”ÐvbhÛ¼,Ѳ;»"URv‡æûƤ"´Àut\©Ï]y«HŒ¹ß©mu B¹g9ŠL9N >Ãí¹Ô:­%ìÒþîgnôZànïÍÝïß¶¼«’R „¶HË¿6D ž)rmXî�¥–ßøYg¥@î«Ë¯æ2?O}_X|VÉS7ݤ@!EEëƒ\§ýºØî±†ôï¥'ÓÈÜ=1x”¡×‘KÌ£øÛU4j8€L¬Èu†@ZíW?á�Ú°~[E ÅìöZãã3X-÷·ßI€ÚN@ìÑŠ¶Æ±·ìÀ®ÑwœÐ¢Rþ©,V„øÄ÷ˆõÐ @!…K‚ÁF‚V'¸Ó'ó,ÛZÝ”�gk"L”Ðö{Z` æ„ §à( äºÛ£Ž¯aæàV‚*V Äs°'ÆýŠžqyJƒD7F‹¬‰dLÿæMµ­âù Öã„ìDh5‹�x-Ý+† Ù.Ê0¡R>Ç 3¿¶Ì~˜_=PHÉÁILßÛ.鸾æ¿p†íçM“*â3ì8 �^[6?L¯(¤Ì0IªÚKDb\° ׫­�5‡x®{TîxÖO覭ˆ�gQtp-�Ëöü{ã=å ³mpLÛÇÑuÄGyž:4ks†O>À'›P)PxýZñ8‘‚;NŒBp'Â^£ô‰pì Nx´³?ö¦Óyz-Ñ9€�˜X)�3S�´âa+)wÚ…>:ßeö¼ãût{¹zbü).jÁ”E0dUšŸÓBpÇŠQäšã¹_{ ðÃ!¬âc p[3ûêÁýPB©q¬õ3Ñ[<¬9 ŸaÆóÐü�±åõÃ!£ )8ì¼Íη®õäíÂÂiš?>4Ee8xš†N"—Iÿûêßí.…¸Î‹—ímhµgwõ@/Jh;1,ĵ)g‘ZŒø'!fhÔ4�ÛÇÉ\Š“ÐvZ½jeéKôkµh°· “è+HH5–*ß%Ùbº%¾–Ú°Uu\|ºÍr!†å=¶œø¦�ÊG\ôf É0Í�cuèÍ›;¥„²�€“Ðöh~oà Õl_£{e…³?¿Z] >û‹ûªÜÖdËIRx´eq'9}¬ÐôõÖr”yÙ¢%¹ù ¿šÚ•%´áÝCx0lNµü~ØCõ@�£=TF[q§�Ô·SÈi«ìâçpÅâûÃN¡WC½ ŸñNaÔ)Øqî¬ë/×^�_nàf]˜…=Њ;r¤ÜŽ\‚Ú¾lÙý°}é�ÜG?ìƒOv6Ó½ŽuO¦ì?¼î�ø½7Û9L�ÚðF:NÍq1¹^ÑOryÍœ¶â= R[Ü=  ­tC³åõƦ )8·{8u%7ô£ÉíC”І7Á Ôg[Ô‡mŸ»én«Õk¡žl$@¼ÕŠTeo©€º©& /jª@ZˆÿÏÚÕ¥K�²Ú©|#è§òŸÓHæ{‚hª„•ͪîsõv»kADTDîI"Xòb‚�C]íO¥š|‰__U¢Î8>‡ã$´�€– RqÙ�ÛoŽ"›Õ‹ú£uo;{·p³Ó� G}0öƒ×jJ¾v{nGäfzJqÂIï%ïÛð;v`gšJ�BÊNu_ܪ'û�Û¬G=È(+nדÊâ6쑲˜-ûhXä¦=gYhã>^Ô~—ÓNݨ=ÿ¶•òe uó¡WK3÷ '¡í´à…èÍÖöÛ~Ÿ}~3;3ë¾ '´Ü�R,ðƒ(¡ � {]J0>]ÛŽ;;~àg”¹¯fOZ¢ ‘g-œ¡óF[qÜÔ·kÎi+Ç‘‡ œeÅc…à¶©î#Îm/­×À4`2¥@áÕhõ»€¤ïFÆÜéBχ<]ð ü+Ë/†º±ùú§ÛJü:Jð„MŸ$@!ßu}×-ÞÓ?q!ÃQ߇%ç¬ÔÑV–ß^ï‰óÛòÇ}a=G}ëS˜û½9k;Íûµ”ß»žØï7[s�ø¦ÓÓÁ[­e=M­by2à�ÚN@ +àòý:d¶}ùE%¡ èN*o}ÎzÔ‚KïªÜWén]…mÕUÙýUýÍýd-”ÐvbЃW»íí%Åæé¶÷v—Þ°©aÍ_Û‚9PBÛ ˆ=cÙ¸ûJ^~ÔO-àý‡])š|‚»éhóÞÔÁ„“.BaŒ­<®ü] Ì×ø0­¤@ m' ö°hJ£¬¸²�—ϸ\(ʰk�º�×ÿbØ(¡íɰÃú$M® y�¦).)/¯ØûÏÞºPß·¶µ�rS§Ö‚]{ÖbÛæ¯3ÅIh;-ì–²Ÿ0j_×�©«_Ô“\æ0×jIßü›LL|Ó)Õ5ñZwƪÓ�‘­_ µ Šˆ#[´¬ ~¢'Î{A�ã¾�õB1W˜ôB\®0é…ê£9º·¼~;^�Ö±mÝ”·È´æá½µž%´�€·kA»Â¸ÝÁî2é;PW7®¯r·¢9�NÖ±Øùa­Ç`ë°^¨&€ÚN@ìaD›Ó7v_Ã÷F¯žÒUk¾Ô }±êþÓgË/Jh;1Î!ûÝgÖ!Ã�s&é{¶§�4}­í öî(:Vë­ 'œ�æ¼oÏ�w¿G}ñÃá™Á½—7~ô Íô­¨e|žMÊqâ›N@ gØÌ–¦0¬w®IHÎðÉ ­îNÄÉ1³„Ë‚èùý�á�B �J¹¿ìˆôõjþ?žõûü†vQ:â³þ˜,€&˜ –-TÓH{nàfB¥@¡E�´b%2R®Y‚K7èùý�nà�ÜW?ܸ�ìîòÇ÷^æW®Ä[;�ôY-#*Jh;±‡A—â¢ZFTÊ�Ó)§­˜ Aj‹Ë„@Ú"Rzv?¤x �²£BÍ—÷/ÐõÕÑZI9$!x~¦¬ˆ“¢ðEGeÞŽ³ÝøþT…ëÙ€�I•…–=ÒŠ©+¤\êJå�m¥²�^ϨˢÑ ð¹}Ÿq~„'gºk…S¶,î=·p3ãÎpBJ¯ä¦ß{Ƥ"”Àu3£ª�ÆÁiŠÉâø·zŠKROÜšé‰I.étÀç–8˜PÚdŽÿ¯ï(iÖK¹ÉÀÿ{œ„6¼†ZZíæöõ%ë½·ãιÝѾ •âð17Hˆû*=ñvŽÍÜqŠÃùkÁ?R�Õsû¡³<�ûdÖûéý ’Õ±Ø ëý´‰p+ô­cóøtÃ:”Ú&¡ „¶{]£=í¬ÏóÖE¥UèYô¹9 ë¯è·”ˆÖ¯´†(¡íÄö&+î¦Ôïë?n)í÷9lß!â¥4Ü4 ´^KM*Z")„JhÃB< /«~- ø´»÷¬ä´–Äkû³ïîyb–Ïo‡hE¢E÷—Çe�u‚»ëåÙ‡r$0Ôâcë2éûØ]íÁ&¡íŒ¤Ðh[/÷5éñÚµ0±+¨ëòÖêé·Áž�Wî»æå¬›]Ð-"¥8ñM' …ËÃ^ñå\~Õ*»;nGäfjJqÂIŽŒi™ûheU.›}ËVeêø7¡2œ„¶КZ'û=y©¸¹�Ï»"TŠZò@I rÚMöŸèaâZ0{°m½j•K5úkбº·Û` cªQ{ê»gÞ$ÊpÚN@ œ2(ÿùE"†£I0ê×z�³=:ßý¾Þt”À„ÓcÿnغY˜ ¥0k©âŽO‘¦® 4Iq‚Dö¤8ýx« ÈÍ·=¨(Ñ¬Ž Üù·¢ŽëjAØr…¿ïjD�FššR „¶•k TèÓÁ�ê`ÐwûX^?ÔGMì©p§•i_,îØ·Ï¢• T§'ÆõžGѽÙù¶‡Þ믮û«„Ëš/6Tcõ9—R@y®zêTÒô”%´�€ØÃ<[N¹¢øWÝ@Yç’|µ”—IËD»–�[_å� M´)PBÛ ˆ•_•˜{\TûíG%<×2 E„+zØ4fвC·e0ñM' D†isÙåúª0ÂÆi(¡í)R‹�u}pqöú4ä ã–ƒ5M%@¡º§ôÄùÈÌã„EfÃ`¦°—ê#ŠÓ'”’fð›T×êGÇÃûõyÓ�ÀIh;#-Ü]׺ä5š©×�ËÃÌnüg3™ö:ŠŠ‡nBe8ñM' U~T–0×�Êíg }DÚE‚'œœ`l¥Êôì›Ly'¸¦�zè©·Vö¹Ì`lfÐÆ ú*Ê/Vv9êqÕÕ¶��iÐÐòËë3W»ÛˆÉqâ›N@ žÏéwéZmÝKuá–wÉÉuÂÙŠ /×l¨ý½|vï œ„¶3ÒHJßôÑÄ7M�~Áã$´A´ò°©åÝ–=ê�tðµ×›IËV¦“Q³j¶bÄË<Íå&É-Q ’ÐvzBÐýéWèHÔ|Þw}ó:¯"QŠNlJEKÉ 5;d¢UäAÚ Šü!B†¹þ÷¥›>zákk³yΨk8#èm–µÔ_¿ÈîÍ,¿:áˆ�`šù$\oF¼\«! ˆ´7-Cÿ›ÕX™åü�Râ@eMŸW T•A²÷@ mX8œÞEmS«¡èØ€�I•á¸oFyI˵˜v3­¡vn™;FÍ_kO}óo2¥8 mg¤¯'ä°¨3朥MJOûn}®…æP“ƒ‰ozPRð<é ã™|s63¹¦�z˜Ö3Xø|›Rsn”&ÃÎÆòþÑ®ilµŸ½@‰RŽ b0µ´[ˆ´• î­Ë³QϾê´Ú ÐÔ”â$´�‘ÔÓZ>E~³³ÇìÌLQ)PxÉ=-=Ôu¢nƒXN)DJhÃBg´¾SßToy9v`WâçÇ}3Œ‚Ö×hÕt–¡­ZôctSnµíÖN€&TŠ“ÐvFZâŸzX‡WYÌ“žÂž�Ó8ÙJ'à /µ'5¦Êuøçõ‹'¡íAí¤ªŽ½l8è�w]U~s9“%ÃQŠW£úú\¸$ŸÖÕ÷ôí u¡ýž5 âëîzŽßtRh?5y…|v22f¾í´´ÇÊTÿº·jîˆ�¯zø¢zÕ|Ï¡m!|éâ³Rþ'¡í´PܱNùí"sÏìÌŠHL8±cÜ¡W5ZZ§w�­×ÉÖ*ËÖ^½ê¹7%¥8 mg¤U~T–ëåŒêPìi€¶)%à )']K1.íÕº£'CeehR]f§Óò5Oä@ m' †w0_e‹õ ®^Íìü(.Æ&Š'œ»"F}Ï‹õ'¤ÜèÀYß ×‰xhECÂð nÏ„JqBºÐ¿]QχwE'¤Ì ÛÞeÝ­Á­%æú¡œLÛÊü&”»¢^Kô;ª^kdD†û(¡ ü`¹¶Ù´¼Ý‹¼š®Ç·M¨w¹%±O_¥k „¶{¸z×-êÊ'Û…xýË^—F�Ÿdê(¡íÄ8]­[Y"ï—QîÛ/ºò@ mXWh­¹Ú=ýíòõ”\_{ „¶§õu8äËa±#ìÁ�ëU4êó1µÐn᥃‰S)4£Ršã½m †5·àÍŒ çf.¼dŽÕ ФÊ2p£žõ#ÖG#âŒòànVñìZ¹ezX÷ûYª�¶ˆ×ýqʃ}•NÍ^‚&1§£U¶'ö0óo%aAC½6[†5®�4Z&@¼È�a œû³ðÊ Ð¤ÊÃ2°Ðõ¤�Y] VçuWˆ«\'šDŽ‹UÔ”FÂN€&A‡E¥£õýïuåy¯�Ã’ÒGõmƒòo^QƵNê¸ñË$Zî¥.9·z·9,å–<ò' .ƒˆ¨“ÆÙ l{ëÛŽ×yµM›¿aÌ·¢áuÍz‹p/�yNGäÔÎjÿ† 'ôÃ*V=½^<ØÇ¶î.Nvü?‹Ø‡ïM:Z H¯Ûîâ(mG/®Rv4Oÿl³¡jù‰`GŽ—9  í(HMØQω¶#Nhtÿ6ëèȬceÂÊ�^Ñ¥Eˆw{}‚»|Y\©Ò1W—LÞÿíaâZN@èqâúr›·f¾ ûp®VƒÍEKÚÎm©Õiñ7�¿÷ežqÔågT¶A‹3ëÇî-pèY‘U‹­ÿ† '5U¶¥cÆWmq0AbÚ-™ŠbÉJE\É "°7³—*PZ®loQ¸nohͰw[½~—c1‰”ø¦3‚.1…¾h ¡„Ó©pm6Ô€moŽ}êÏ|×èjD4‘R „¶#{-·¡z�)mzíÝä¹½Ñet¥þ�•»(°PG¦ãþÙnHpÚÎHëaô×êwëz;�ŽÝØÙøO�BÊηqßÂÖ¶ *`ú—SS,mCª‰+mƒÔ¯ÅR/=¿ð³â6)PHáÑ¥Ù¹Ãù¾}/|Ï–«»]£z¹ï|ç@|éÛ#ï}{{õ;²óm'¾îÂm�‡ÆR+t«‰¸NЀɔ…Wg *�20¢Ľøžy/Þƒ¨oÅ–3Ù­Õû�+/Þ³2ýü�FbweO %–ý÷}­Û§ŽËṘbR”�òBñ:<Þ» ïØƒáSÂ’OÅ…p ¾çÜúåo”ÀKéž{ Þãè[ð‘!§È¨¥u®Wfï[­±jÊåá·oïaB¥@�—Ó=1ò.¼‡Ñ—á#?ßv>\‡÷wª7;ÐúÖõ‹{@&T ^¡�V¼O Á]��B +ðk=‹øÜÅÞëYÄþ®ÔN‚�m'@ m' †kËèë åÔ¤E›ÏÀïüL[)PHá‘¶µ©r*ºÏŽÀû`sNû�èÏSoÙqb�¥ '1#Nå-ÍR¢ºo2Fô@ mO1bx‰j™Ë+Âã>Üc(Æ>Ô2±R Ž?bÜF =»bRv°*ÒWAʯÚ+—º·0”šùïfTÓjáÞ¶|ÈqÚN@ yŽº~³ë+ —�Ÿ[˜;ßvb80ÈqÑŒMUC߆ÇÕ�Ѭ¸ä¬ u 3c’C�ëB4™.Œk5² ¹µêÂP²K”ø¸Ô:D]× kLU LèNö„âz„€[‘D¨É·ãÆÏ½F}/ +5�£xÓkFÄs¯ãdv“ àäD³‰ækh$üÚZ­ÅŽÕYµ‰÷o˜�BGB_QϽ «@SYµ”ò¸¾‡öŒÏÈ,%Eß)�P\1ì¹%�cÏ,{V?,=�ûÚ‡eõß_×ð&SöýÄVš4×rÏh[êcHê–²£µ×÷„ÂÚ¯í‚ü “І—‘Ñ½ä¨Ø-:LÙq}‹öð4—·,+‡š•VfßJiB¥0¼.ëI•ßl–køn/v:Ú m]•…”±¿Î%í'.�¹mnmßk“^ÙƒNHņû¿¡úåú]ç�ÚžºT]ÊǼ^÷eÇîìl¯!Ãas�¢ƒÙ|]ìý¥ØZ¨¯ãvn¦© 'œàÈž6{é[¿·#r3=¥8á$zÊ7˜â~YŠÙ™â6߸ý«XƑܿâÊ8¢ý+BY®"%­«PÉ’ªÔÉÕàŒ�\ NnÿÔà$<¾V;håðH�àqÚžL \•yfþ@5æ³éC³¶Ëò}o»¸ù#à$´a'�RÖs\´\SÁ�>µ/©QfJù§”ÉyË÷RËüí÷æå-=NBë-STt„¦§œåS‘»ÜkY„uÔ×Ñ n´Ùhê5p§“¦¨(¡íÄà&N‹ýbª"øq�Ì•7�,oNyTÞœpññÎP�?ü o*®sî€,¹Âÿî[,¦¢Å–Èš*ýÆqJàe:J�0R‚Csšl]±W5ÖࣜM¬�T Æy©cÝàÇ©”ñN ¼G@!5êž ¿Ì®¼É»ÖËÞÑqNmÜý�ƒ~H £ßW ã¿ûà›ÝØ™–2œÐ’ïV\/*ÚŠ«§}DÚ&AŠN·5oy®yi‰ÃWTaW܇¦¶äµg`×O–&¾é”æÝzpXïùz6Ÿq—Ño*Žmœ¾7»R „¶‹Ž[+�”é©VØ)>YÄ\R N¡ˆ™'L†@Ïí‡ RtdPZ±UStæ±& …<-—–fyQ ¦i…ü6"K«cDgi9”P£ã­³SÞØ[ÛÀ‰©I.Ë$Jq89)dså¦Ý³úÁ´=PH¹a&ùøÏ[µ«E’j¶FÈÈñVÛr ÎÉAC@¯2«ò´rtëâ/â n,à )(—�Ó±£p ~¯Ïü@=•€XåI&H=>×m®o éð”ä>ܬ&Åáä  Dà¦×ÚÏíMÇìÌZB`^ò@+&¹�BpY.QhËóePÿ+·Jêò=¦”ô4±R Î)ñÄÈ䣳o"?N¥0}ª¾ wEQ[=ó '¸^ &V ÄG¸Q¥0€ ‡¬=¿Žº=PHáÁRmÝëÌý5ñèÄ›²R ><‰çÏÜéIÏï‡ãRxdZõÙl-PPçò¸©ä�Fڽ͈7•Ð9KÜ6ë©ÿ°ßæ�BŠ *|hAô’N<�m¸†U›“ é&Âe[ †-ißÊA†vlMÓìù€Ÿi+ )<µÊŸÃ.³�Ø­Õ}±\¦+ø­>ã½X=®wyªújhºI�ÚN@Œí²~eÿC—y ·½v$ÓO‰¼ÚŽVªNphE“{ÌõÌzÆÄJ�œ}¥ñÑ^nŸ”z´÷_î’‚×)¹]RòyJ°Kú÷Ο>ºS¦ï÷ÐŽ»˜�?ßô´íǼ'ölÉ÷D©-ÛØ»è¯×Ûæ¢qm…Ûý^¤×€©)ƒ¡­È¨K8â¼ópÌè½É€Zðµl)^Kª¶{ç½c mZÉpÐ99SçØ³â}£ÇQ_«cë~Õý²õR®õÒ×2ãÍ3i=ÁÁ - LyiÇŽ÷Ò(¤ì0Ù®æ.NC ô®ß—“ûW«4¦3cÉ›¦O x(¡íÄ#Û`Ò*[5£SÃÔ`}˜…Ô):ÜÍÅ!ÜÃÝ ñU"Ó(/†ª®åÑ!özRî tV‚ðt:õ*<óÞ{ª¹÷Þ™ ¼÷¦2»è#Ä¥ÎÅk®)ö\¤pÚž"5Ÿ³IÀ¢•šž~œÉÿ¯­ÃlÏ´hµë‰�×NB¯Å@b½ÌNtç©U…å�ßôïÃU´MÎWËôCø€ÚèðCó°—cÖûÞ !?SU „!$>Ä2Ž8œ�‚21Ðz {Íæ.cGÅ@'¡íßÇ@:Wê"üÚ-X¤B �ßô�­™ 5Ð2¶3vœ6™¨ÌG lT£ ßö_¢².àá£2c".¬¥¹¾�3TÐ¥íòrC{Çñî³£aâ›N@ /hßcy*æ~r¨çuD^-»ïO”PBÃñ–}FèŒæ²¯§ú•Q‘þÚ¶ †ú–¥£“І»6ŸþâLnÑG>mrQì(gÿêõË[Uó}IƒYqx˜ø¦§Gîõûí™±æª9·pÚÝbœí³i'N¡&T>]ýÛÙX¿AaÓОRä �ß„ƒ ØUiìâÀ¶8Lc.*¦„osg‘o\SØ0Ë#fjyRcWªééêY;Ên‡Û`54n68¦÷'©Ÿâå�'F.‡<Œ^E~¾ía9Dõ_¯…:Ð…Vé8Ú©ä<ß+ã°8óÔ­ÇR ^�EQ¹7¾jMŽw» 8�“ÐÆ.âú/æg1�ãÔ�ÍsÉ#;ë­ÿ—/~°ã̧ÆNh£+óÅ\‡‚m¢šÀ:µÜ߸^ô³ƒ‰”⨊œZ;~n @¡eÏã‚H½™uPp¢‚îzÙc¦— õ­X¿h 1ŽÉ”áТ„KÛužý' É‚A°@ ´Üâbç¢÷k±a�èãÓ–wñ7 -c¤ Õ”-<÷O›.$Â*)�¢~Ä­ÀmFqÑš_¯ºl[«cë—VGøúOâÇß8áVi) úØÒVêØ^Ÿ`l¯pöÜ?;‹ÂÄ7�€Òƒ)¯Å�ëiÑ<¶M·³#2kÛæÄû!+oç}^Øë™Õì{Ërýzk* ’<#p¤¦?ßö¤+ÿ@_Š*1°m§Œß;ç Ê“b»/>Lv÷H0×}9Ž}I™ë>ð–2xíz,“²&”××Ñz%@ -êO€Bj”{Q¹ç§bq/*{œ@Ù©•S­*æ}^¤(?ÁŒ{I�Ð,îú î5BÞEáï[M�JšH)PBÛ ˆáÞËq±_ÚélÊ�îäå~£Ö"ÂiµWA¯UMõá½>ã$´�€×]þc²³òwŒ¹ŽÊPä;Æ\'¡wŒÃ|’+Ö½IDô©È@É?vL ßHf^¤¦žvŽ–L¾íÌ™2zÝØÎdcuyݸðÀ³çgªJ�B ß 5Ö¼pK]N8~àgÚJ� h…—¦I˜§¦£ÌKÊ=¯#ò*¥0êsá"ðbî¼ÙûÇóÒ&Tî•`�“ÐvFZÈC§ ð´µõ[΋y$Õ8[&õã¼_ÿÖg…û·þ9bÓR ”ÐvbøÁ:X$¾¬-9ºçw~E¬(¼ð�VÿØïBx „6,8úXKuØQï>ÖÑг;;“*r� )~͵ŠZuØ£N‹E,îe”ÐvbxÙ6S©îÖ×ì;5¨XWP<\Cg^f-µÑÄJ�uꉑ}èatF~¾í¡û;D›m@ÍÃXÔµ–÷.÷ñj¶Þ«¤é)Jh;±xù+~ÅûU|Ç¢[QfèÞTŠH9PB¶;΢öÝ>îUn”ÿ`Q(¡íÉ¢b`’ã¢L[CN§©IíeÏù²ÂRŸä“ò@ m&µÙ>æ¬WlJÚKöÿ5”Ý„#HðqT PBÛ ˆUu¾7¥õjPOýÔ›m'@!EE¶­ë "^%FÂÇám~) é+¸.ëùýÐe(¤ðhÊ›ÞešßÓkô!W gm…’áÄ7áȘ‰/{^|€éqÂÉí}øEP3f]”¿aü£k“(Jhá:õöü~ˆz=PHááâr±³¹×ÔNª—r´á´e‡Šï¯³À(¡íÄjÈn‡¹wò”>a«çõŸâ”«Ý Ô�û?”ÐvbEˆz/ó¾-¶®%zuì5@zw¯ñ9ÂÎ�ÚN@ŒûÕ 5¶ò0Éô•8Ç‘ïÛN@ ñe+Îj½&âz¹¯ÿä|²™n ä�M7ïV/ÁgµÍØC×vbPWõ5¤yhIA½�ÀFM¨È�”]Õ’†»¦õµèz½-S &ùõ|vK „¶«Û‹z¤áuÿª£~ê&D RT�ôé üÀ¯Ma �ûê‡.K]gägÚ¢|.'üüªÇ“ï¶5·Ø­L½\»í-àxûˆ'¡íŒ´ŠVÙè+)º'~â&C ä¾ÐBŒõk™qI©Y󥻺2™f=™œæ·Uæ StÛ ý&®Ïõð ÖŸð\¯³³V�ÛL"îdÈã$´�€<šÊÞàò¾7»Ã¦uǽI”Áð–µ#…öûÍünפWöt‡¶þñ¾íÂçß8ñM' %�R<&Eà�£0Ïém:ŸÛˆG®½Ÿ„Ô¿qøÄÕÓbO\=Ž>q� 9�>$„ºÁÐiáZh ¡ã„Vh:i¸Å(1Ú¯¹mè7ˆ©ÑîaÚF;0  ½]Ë“ÍØ‘Ž3uSôq"#:L '¯WŒ]ļ>ò]“2¾»à×DÊpÂùnnO£çöæ† mkšŠÇ‹¤ª¸F¤¬xJu ϲ?4Óˆ»-^ -ãâoÞm‰ E›LÃ]Šªãvn¦© '´à�R»ã¥òŽó8Ügù«°²3ùÈ}°@Z}~ÄBx —¥ñàƒJøV&šš™²ëÕÆ«a­—–zþ­¯˜ø¦P¢~?×´B'TCù<,z·¦”4sŒËÖ¶E¸ká?¶ýµ®ŽØ-Aéo˜P½ ¢�<{(&CY^•vÄdV¡š•y®ULf3±ˆ$-.3Žê½½I®žt7­ÕªêÍVûØöJZ_ÏÍ4’â$´�¨6|#-ƒ…0-åܘ®|xLîU«zµ71\¶ÓHSS†CYØ�ÔCºÁR'[ùÇìˆÌ,ÿ9ƒ '7aK±\gK\µ>dK M@šÐŠ+ÖÅv[µ&gMÖî>öˆÛ®$8á3Á_vÿJg˜šäU×%ÃÒ ¢¯“mQk‰“ÏE‡(¡íÄX]ÅÓ{NWÜá=Г~ѳû!ýÂ…”øç^¡g`wv­æOÄùQv”ß—v|dgº",†“f÷î¥L Þ\Ûë(éìøvÜj%@!è­<_4ÚˆwìŠTîüÆ”•ʃ¨.ŒgÑdrgÑÿ¶ ã™Ù…Ü™êÂpÑ`µÌ‘ ýªçm]× kL¨(d?C�5Û­)½CZq¿ð³.L�B O™{M(¹~€†µ½›�µÁðÃà @ mxð^Y+b–ÒÜú‚ñ/^9%´=ye˰ØfÙ?®WÁ\A¨8jÁÄ"ú†S)ÌÙ .å]^�.yaífç‹ç÷‹(¡ ¡×ŸJŸ U/K‰‰§õr£³a»62luêuÜ›H)PBÛ ˆáîÊqQfECNŸà~Ø66;®Ë­áÉfÇk:ªV4N¶'{µ Í@ m' =÷eù ›¶ëßш¿m¥sïnãÛô2Ï_Ž Jh;1๠”×JëA‚�o;1=�³mùêã½›ì$fºæÆÙ„ê”Ò4•áÄ7�€¶õÉ^=˜ö¶[[‘)Ç '9šá&{õ`Z¯P¾ f{­aZ®?˜¢zþM¨ '¡í´Š:÷2OW‡NF«#~â&B†VÎi-»‚Ûz™änÞ‹î¶múgÜM ¥Þ¸íWà|K�â$´�‘ì“�|J$*]¡®W´`7Pšºw  „¶{°«¦©ÓV«kÓœ³íû�€mšÊL­¹Åw±?(¡íĈ©Mƒ;Õ珞�÷¦¶”Ðö4µ¹%‰ÎÈår˜–z©QÎXö=¦+HÛ|맆%@ mxž�mŠójiº"¢‰ÍÃK¿’Ù4íh³V[’¸…YÛKM€Úð*�éA?óÐ=§,.R׋uV}Žú¯å)è%hºJ�8ðÄ ®VÛÓ{m·†;nàfºJ�‹hùy™"Nè\Å„G^Ÿtx;‚³5*<êuðC|ä�\O�ÁÈ5è\6ms ¸XÄÁÄ7=E"é�bèeZaˆ“aœuŸ^µ1¯0 –×tßçkk…EŸªtëŽg˜„¶3’zX£™ûÔR ãò‰\ÖZfi�åïÅPÄ‘ˆ'&I5¡j~/C·ýŠsªbÖ’ZXŠm|4“%´�€XÝ4UQ§ýêïõ!‚÷ãÁ4‘q6Áüzv¼Ùz÷ÍÐlëd¦™öóÀ›­‡Ihûf[gýO�\Öl=PB6[�möÉW89µˆå]âõµiJ3˜KÈ;ÞÉš9LBÛIÁ#½ƒSz¸ÛA[ Œmï5JhÃQ6ª:~|¨€B ÏÅ_Z²^W”óÐÖŠdüå�Úžâ/·J1qÑj¨¤Ì¸ ÜŠ]l¥­yÂËC�᣽¶.K€8È@¡ct_=õ\¶ )*4î©î\ÿŽÍ÷ê¢r¿(Z¨ªƒø2Çí}M@ÛÎpâ›N@ .Âò£·x’hš"Îì¸cÉM™7n�´žÑ·k–­¹�òÂèåy§ïsÐ(¡íÄŒû]ºyÑɰšÇP¬O¯’�Õ®ês;z}K•â$´�‘·ŒŽ©ä2šKE€Ëhp j8½u;¾&âËéIØ:ì*I:ûOÄžX¹ò[®—ç.ê}®k€j7ëa—e\?·'HêŒjœ3œø¦�*7l‡r3ûë¥Ða¬¯aníAÛ+°Ñ‚ýC¤9PBÛ ˆ!ì¯uœÛ¯†­<ñÑ‚–rŶÔù×íãû˜5ʼno:©r·ïe�~̯öœ‡fö靿Y�fÊåÜÉøh-v›1Jh;1îWå“õ>©Î*ÓçÞ2E¾o;±r¿»ßùs¿ûUª*”šÞ•z÷Ñøèvé<rªÇ8íW/@;Œ=ôm' …ò4ÑO¹æœúdDo¡G´ÐVD!ÁQ£äAOéô|ª(0c·k;1¨©—=ö4®íÉÝÞŸÀŸ˜P)�ójõJ2—éøÔæÈ]mßvZÅkïV=ì®Êt-àìzúx›Ð`wÊ÷÷—bRœ„¶Ð*"Ø3 ºª«Å^†Éj>ÝO“¼¬”}ÿÒqŠßtRJ:9ÏÀíˆÜÌ^RõÅȆCi¬ ÌÈÌô”…”Ú°7„P Œ4 ªÖ&ê:ù !ÌC*ÅQaÔƒgÌL1r3›ÊM˜–<õ ÑÁ™ ”3á¼eøžk†±‚ë=APzð8 m¼Æw¹³§ŸÐB@N(¡íAmC¥)МœòÜûžC^ö)º9Óâ‹ïŠ5M ¿aâ›ÎH ¼V¤VïjnÅ·¡Ö»ª¯<Ć*”Ðv>DŒ´|±CV¢Ú!�ÕÑÛV+»¥×<+íPn°çß„J�+zblÁA�c+F~”Ba±Î¹¾`=ךͅ´&$~öhs ŽÐ=1&8ïÜsÁ1óÌ=ŽaÓ²|½TY)‡²ö=÷ÏÞÛß8 m' …6ÆÉ¢WÍp¹KŒ~˜€™í›f8áäæJcú/aKcF Pý˨©¯]IkÉ—¼dÞ,à*uö¼ŽÀËF[ Jì×ÿîYÃôó.==-“ž“*"Öïóå7MC)PBÛ ˆå•{NàdJ�BŠ æÕËÍë‚èS÷-ÖôUM¨ '¡í´ÄW·$+»8Y¼¿г:«"PŠZê@)>žLŠÀ=ž…@å(_eÁ¡ïÖz„±àb/@“*Jh;1|Ì5[jëWYßžßø™X)Phá#­Pô�”�©z%àê@öÜŽÈ­È”ã¨/6‡ø6¹ZùÐ’úóÚÛûAóZ«¶í÷Ûé®À¢I”%´�€˜@Z±” )WJ0 ;k¬ØÖVm Víë%hb¥@ m' FV8ô0ºÂaäÇ©)+?»Œ'±-öH=écÝô¨9ž››Ä5{?èŠJ îúËošð@ mšhAa]bŒC9jRÁßwñwWœÜX-3% ­å‘XÏë‡HÌ…½í÷Ë�ÊünÛgàU¿@n¶ �[¦sëèž¿�ö8!%G{/›_ïÞ‹wZÓö§þ†áµO8ø¡Ö­3~Ùê`‰]TóºWõS¦Ûþ®ÉÀ`áã–¢í 0Áá•O\Ö¦> gõƒð@!å~5‘ªÐrøšdüzXøø�m ú„=ÑCø‡üÆ­ˆ?]ر*ôæs>¦™?AB‹¬xœËƒ=¯¥=Ø–:=ß&Lƒ+O‰QL|€T÷RR¾@õÂ.P£8É¿jÞOc™~µ]-«ØuÅ»¢m(þ ¶S!¿Hcˆ‹;jM­K{n?¬K=�ûdx¤¢YÌ×R¸qUê¹µÄÔ¿qxQ%G/UO{}½i»ûø›ÝØ™PN8ÉQïÍ¥«$›ì´â€®—¶¥½í{ÖyNBÛãÂÑ“Š‹Nn�E@žyÊæù¬å¦ë¾C·Ò;¼M¨'¡íŒ´ØUªƒÑ‹ÔÀŽR'z;æmÕnõ1žJºÓÀ4ж^ �êä^wˆÝG¾îÀõzÝ�PV,ÂO*‹+ÂÏ)kÙmUpá?;N_üÀÏì* )<|:j³S‡ei•{{~àgÚJ�B µµ”ç}ôªÝvìÀΔ•áä?ˆŸM ;Œ{6Y[øžXaŸÓW`?ê�yŒ Z ùÁ¿SûÃà VõfÖGͪûÖÁtÐvñþÆQÝ€_"ì’˜î0MÍ�}1S™|Áú"S(y¬~Ïi*–Û'UÅ•ÛGÊò­«;ú~` S”`B¥@!5 uõ®Åï¦ûc:~àgb¥@!…§ +Öµ' ‹«kOVøæXdžTWd)+Î%9Ž.ÀÏ™VÔ)êÃÍìoØ[×÷Z8€Lª(¤JaqîåþšöôQǯ(ËU’.bå@�ÂDzԔ²blRY\l¤,ð¦ËbÃ÷.?â´p-˜X)PH•Â>œ¬ïÇõîûŽßøY¦@!…‡îa5-_Ôk•‰hZÞ”[à�±i¡q…ï©ÿÐe(¤¨`Ͳ�VOóXë!á\Ëæníýß&U ”Ðöد�Vo?á�Bd/[ô ó?kÂ/«púy€²— ‰•%´�€ØÃ KqQ 6Ȇ´N­÷`�E~ì†Â%´= ÜT(�ÎNTyt8e¤åÑ�kæÊ£“®™*�Nh4Ö=7±¸®c,Q�ºÚw+¥|WÇ#Ì›‡u` äŒëJKyÔݵã·Ýê=Þ•®�M¬(¡íÄÂÉÕ`þˆ`Hë4íhzЧÊìã)>­‹åº¢:¢.V ìWª.V,A½d¨¨ob¥@è%Qy~âWìÈçªÿÿË‘jÿ³#Ÿªýÿ¯G~¨OÌŽ|ª>1ù1 sŸj٦׭c__-Ømt PÈAÍ{´J¡z+lkSÿð3ËJ�B BÚ\ÉÑfL*¢whL+Q³Bp�%!¨‹¥®ÉãJ]ÃK*â9^]/…œªˆ·¾·Zv¨Y-dE¼”ÐvŠx°S\¬UhH0ä BmÍ…ú2Œí»F¥‹ñUmm¥|Û¢ÑÄG[)PBÛ ˆ‘¥ûôE;½Ûe�U*ªtŸÇ‰o:J÷E_þ^¬Úz×÷UìîÎZ§÷WÕ�(¡íÄÈÚ}ŽßA×î @!…‡RÎVì÷Š%îÊŽ:�o—)¬sS––Û< ‹æ8 m' õ0'»!ðnÙÃjÆã`7¶lÚ-�×GU9N|Ó HU¯¦A±^ÝÚk}¿®Ð Í�'@aûÔÕî;õPož;rßX#½²q[,GêC»W”Ў5 ð ´âö/)·ý…à¶íz~?lÛy ÷Õp¨ w.yØq ûq&V „;.xsχHŽ: �¢>®Îeõ5knûé]î\n;ÖüGyý‡þÚ­ý¾´K™=·#rk[å NXÉkVÊWÕã°rÐ�)QÁ¸|­r \9bUˆbÝËzÛûÛüûú±ÛÁvguÆ{ ‘%´�€çlkýœµ…_dœã�Úãœ�¸´˜iÍ{»ëW�ƒ¦”Ö«^l»:ú~6ŒJh;±‡œŠ¹>r³>ǪÛfÏ9 ë—²r ŽU=1ì¶Éö=¯©ååqÐ%´aç÷çÓ Á�›T`—…!\?oB°cß%´ñc«•÷´|ÙüËØ÷@ mOcŸd5^Ù¯q±o¿ 2”Ðö_Ùº–𸝽>ÇŽ1‡ßô4ÂÖŪ)|6£O\w«= _•r ö‰ž×/o»As}ñòS\ï�Úžâz�ž¸ØÅƒÏR)†‰>6nÊJ€8LŒ�6çŽz~?¸#Rx¨­4¥0&Hš¶¸\D*Û2ïê¸ µë1„�p«[p“a³�éñ.=~qÓZ zµ¥n¸hÁ“RzîõUñ"Jh;±Çk�¥üÕ¼´¹xÅÝ|i×¾‹nÑ0w>zf?Üùð@!%‡šÚ‹óÓ´áahv™ùþ2G»ø•qf>¼‰{ê?$K{ Ð¢^³u¹«÷õµ*¼«à]°i"â]äÏ£‡ê©ÿà—=�ûF¬¯¥ŒÒË–^?Ú„JhÃ6ÇÏ%z) çñoè$cç·îI€œ ²SCÏÁ…>ì9ª&Õ¾.pûª(¡ ï«‚j¢›]´¾,Ë@}Í�R/¡¯9Ð*ü “ÐvFRõ{Cõ€ŽÛ¸Yµ„ 'œà\‡XÔ�,áÀUõƒEUÅÒ~¤®¸Ò~H[q{S¶Vêx½ZA‘P¯À—�0©2œø¦�b ;ôÜøÂ'œä¨ÄÍ»˜š¯î¯Ñ\¼€ï«#˜¢R „¶c/à÷ü~¸€ï�B {p¿Ã�ÇøÃÏd&V äæSnÂë¹ý0áy �¢Ã€1� âLfb³7-]…R³: Vr­Ö¸ó…sM¨(¡íÄX]]áy½7óþIU'¾éE©ïøZi†³O4=ý�ãÂ�5…jÇ­Ã '9¬É‘©qfBÑ-·¨ƒª ü5Ž‹ã}m?.R ]“Š,”€&:b~ÛÓ»|vŠíA”ÐöhlaDÌõIÕm²�xz(y „6< Ð$zùÆb~C«™ü�çWÄÊ�ÜW“ÖݳûÁº=PHÙÁ¢'ïèÈÎtÅY!;Œ�w«¯¡>[ëìövkÊJ�ØÿÅAºP&ÔüöµÞ;qìÀÎ|w ^öE3ˆF½-ýZÌ­tÔ@ÝT“…9$¿ðw›Oe§Ãí¬Øê9à ¿‘•í=�"�›w@„ùꨩmwدŒç÷»ŽÊõ½§0´2”¨M�€"757߯oj¼J¶É®WÀ`2e0¦ŠëŠ?µ‚ü�c¹%bZ§­M¦ªÚ¹E>=÷&R ”Ðvb«Ñ¡êòUKf9~àg«Ñ(¼ð�VŒUI!¸X5 ×X)ŽŽã¹.‹!-ؘ{×nZ0Ù+áJ0]¥@®+ÒŠs7)7wG!à¶w¹v?jõ+± æÍ^‚ÏþSÄó¦'F†F‡‘§R¸¼˜Ê§V±˜êÚe)gŒZ›¤Î¥}<Ñ‚Œ(¡íĸ_Å®0ÝPä™xÅñ/Û×\Çš¢´Œc9‡¹“[¼>+¯(¡íÄÈ8~l"ºº~þ%Œw8ñMÿ%ˆŸ÷’á ÓÎ6þÄ{ „¶§ Þ»ÈT`Š"¸QêD&,q^K>›~¾‰èN|ÓS<Ñ,vŠé)gÇu0ç–æIs·G­jÚvˆ8·ä�Ú°ß•¢B¿˜¦nTSNj.™÷%qf›~qR(¡íÉIÅþËq±cLWC¶—ǽyènM[fïeS]ËY}Vñ_jhÓJ ”ÐvbȈrTì‰æ+Sv\·Â·úÙ¨W”`b¥@®+¸åÒü^ÌËÚ{ÀäZ©GIßð´J;åJW±±qxºýòÇJ�8è†k©½ú×F[OýÔMˆ(´¨‘V fI!¸`ê+„ë=õâ|ä¾.ÌfK[ü,Z^«�¿OÊDǾɔáÄ7�€ÔÃ.L‹ °ÎÊÙqÊ„«´¡lªiy±?ÄèºWÊgµŸqtí‰q½WCd÷q«!Ô�` "ÅÑë#® ©õQ®â¨“ŠèZ¥é*Š‚ 4¢кßuùs¢fyo¶mk$âYŽ�0éöÔˆÝù2·pkë�(¤èÌzc™Ë ¤ãr~ÿ°Þð8 mOë�`Ù)ìúÉZ7 ö¯I—`Ö”ž¹„õ0v Ùù¶§%¬ï»e¨>õ]kV‚¬ïÓS Ä ØØÅp]ö6§ºµÛ8`¹ØKÐT•ñrÑã~E/yFƒ`°­6D÷¹;q­ØëàcCãðRÑÓâ~E/ y¦ ¡ÍÌõJßpo²‡Ýi¡i&ÅaíhQ?¢§€8ӯÑî† ©;PK÷kË\÷ñ²=¿ðk1 PHááîÂPN‹õÆsþ¿ðk9Ò PHáá¾õ»$¥jñŽÙ¶Üz~àgb¥@!…çÜ7”�zYægŸ‘p'¡ Ž f:»b<½Lÿ=opÓ™Jhã§³wýf)÷=õ–�X C³xbد®¥VÛ¨¢«+ çT”І'=b:[6½Ýÿùs³™ƒ‰o“ 3Xü|³ œ§J”ò™† “)CŒ.9¾Œ6išèò‹÷@ m¼ÏqÑÛ˜ª†œëâ<øò*dZ»q]~ñà(¡íɃ‡3Ú;Ç”EðãzºŠ£rݺÚêž÷RíqÞì órs-¼ÓÊ'½ùoœ„¶ÐBQ”–‚Ñ߬ë},ðÍìÌÌÖ3œprÃÅdú%ÑVL(Bœá�]“|ˆ3«ÍtÄôAOÓ»•c_§vègºíUJ èK@Ÿ+9Ïtž÷+Zˆ|߆5AMoý7óÓ›ÇqŠ Nн>¡å$øIß7Åd88ëG9Ñ}Íë¯å‘Œq®L‚X¶çß„J�8˜õÄØyßãØ‰?ò£Êͱ½~˜c=PH�"‡¸¾ì}”åݺ>F$ž_p G$Qø¯Ë^jù-ï¹yª8ã÷Œ›’R žñ=1rÆ÷0zÆ�ü8M2³«¾ê£†y…¦uÑFN¯(¡í¿L°}×ü0Áz ðýœ ©7�~5'*r—ËTŠæ½×Z›Èuź¤ÊpBv+\ew¶­¥Ð¶>L^ï�‹Jhû/SË6×Iq½ç;njñ@ mOSKÔVŽ‹j(b1 9�r^|Êœ´Oí°–tâ'¾éÁ…÷”‚b¿˜žrf\?~ý±\ð§{i|Óe�¥²Ü5¥@ì›<±d®ó?§çºÈÇ·=ÍuÀLvÑeZÚŒç•^Ÿ�—±köİ…ç8Ú¥G†\S.½×ïÒ=NH�^+yÕªÖ¡ìj.ûZßêîY€•õ^†NjØw–<­¯±ÖòžÛ¹µíå'œä0—b~Z}´Mâ»°3©R �²Ãø©V¶|½Û…�ÅŠn.ﱉ5OÅGã÷aŠ“ÐvFZuª,’ïgd£ ù¤íQþ�ƒ&„b™¨¼ž6o0G}®ß¶ovF·¿k§òµü¡vJ2¿_–?ô~}޹ „¶+¿Kî–^’jWhý]¾>Ö.¦¦(x‘/dÖÆRGšO’ @îëÐö¡º˜kzátÞµ�€ØCÁ¿Å¦îÍ&g °+ iVŒ²@b-§,2±ö_*+¤Ö’ºbRk¡¦òÔÚ8à¹ÔZn¼ãÔÚÐ}SÍwÚ–Â5D,¡aþçÿ_*izÊpâ›N@ê!u>ƒ…Ni™ü7ªa× ¶+°/5Fv 8¢L¦'´2=)—ÜL‹pÚ LW�¬^¦«Èœ^0S¹éÄpÂ~©´ð+bš*¨FÙ} L))�3ƒ‡žÚÌÆÖ­%é«YeWðÞtì%øÔ|H€ÚN@ŒÓUL:&uÅ%sºÊqtB67ÖbB68ÕËUµ`R}ê4&'G3"²93BÄò_ÑšàîŸEM@³Ylhê!µ’sÈ ÷mb¥@NõåW“uãõ«v_¢£~êÖA)PxQ­˜YH Áe"!bF]Oý‡Ào‰cªJ�œypý×sû¡ÿ5N&áŒÙù&Z¤>Ù»zÎ�L|Óƒƒ@$¸¸Ë0ËûÉCË& ]£ÇIh{˜YòI89u³71íK±ÿuz·}¹àï[yA¹?Kq0À÷¤ÈÈÕÃØÈ5²ómO‘kܳº‚F \{�4Ee8·zZlÜêqlÜùQ} “ºƒyv:øÁ¬NXuî/ Ñ®m¿ ѳ£m}•âð¸ rrޏg÷ƒ#ö@î›ájzûç­£á ¶§€Þskc-â€>ŠM(óŸ^€&ãwCDïI¡ƒ�K™ï~ýÂy?4£þ‡ãô8©<”t臎o8˜°rgSo l*I'lFÄØEW¿–„üáöì1Šwñƒ©#ÅQ! ˜öì~L=PhÙë=˜å=Ý¿ A»§þ})é Ú‘¨W«[Fú«zq #~âmAü7ŽûBh1ÓÖ¿ïÈûÃìÌÚfÔß8ê{Æô««£|ÏmK°|É妖½íü|ñÿ\>J€ÚN@ìaöÚÿ)«·âÐÏÀîìÚmö¿qB‹H]ÿUeiÄ‹àqÚ°p¦ZË §¿®¸ŽÝØ™ÌpÔÖ+"ÒÙr…³6åÎezSлÎTóOLø'LBÛ Haë¹$�Îôƒêâÿ›Û¸µØùO˜Pb£üèeÑÔÇí5×�÷y­%åßkK&_¶š>¿½Ÿ%´�€˜þJ]õÛª%ÚÎþ¼Ù1¨R· k^ÇZÌù«>$”Ðvb°³æ­¾c1UP}1o\êQƬÁIM=¸}b†’ÐvJhˉøŽŽ{“‡øzßvzJØxV;'Þ42Pß!è�"Sä̦²ç6çhRqÆÚµ�€Øƒ²¬*p­ïÆÏÆ�Éô7JÈ‘H˜÷>ÙcË÷ûÖ”y{”„¶'óv1�º~³Ö÷¨§/Oİóm' F޹½>Ù2 ô€ë Ò7À¡:Ëò6=àð�“$aïèÄåF~Çë‡�ïp‰M ûkJ6ŸVß8bG½Ã‰oú×c~«%e‡±¾ŒN�y�’ÐöØOqáóÍ’~”*QÇÕàûRsWæ­–˜½«T}«¤))EIh;=%¬¤µ–r½>c¯½Ý1;3“) -y¤µÕr…ײÉÒ`X!„)ÿDyçýmOXé¶ÕÌzg’нs>‘†ÇvÙ‰”zmN¤à&fŠ»~³ÛÝ´¸ú-Ãз�€<9˜ßC)º³]aÝúy-˜TGBQ£ðNøß½î¸·îËL%ÄŽ 4¦ÕnÙê~ãÃDïÍÖ„Épp¢�#j'óž}“)÷7ÀMxRÔ�H„hšÝ4T¿Õ„±†wÁ¦“ÈÍ®:�e¼MSÜôfwOìÁ]×"»÷er7i`Òl˜¹©ûA[s½y×2fUËïZ¡Ø²º�M¬(¡íÄʯF»gr]‹N:ê n–”…õýª7#Çš(è¨è.P›WN�øÑmìüW´&¨ËÞ@ÌE}`$ÜM}ÒH¨»úQññ¶3ÙcÜmg¬ÒÝ„¿`ž=õPo5( ´J *è±Kqv�l¾‰wìÀÎì(r��à5èÍJÛíVÇïüLY)PHá©ûéQ[äýtN[è4ñ+Ö�È+ÖÈ�Â%ùÙnKÞEü\OA M3)PP·b¤kG€!×­Ð!Õ¬¯ÏµÜ^ PCó“ PH�Â"£]D»¨·#ûâw~Ö‰)Pxá=­å ìJéÑilÉnœ(¡ A˜7¸°Î™7ya™7s™?˜7{™Ÿ2op™dç*ŽZ0©ˆ¾áT Óo»·-ÿìõk^vv[¾YoCmÐ¥@ m' †]Ž‹†lÚ"r£ôáÕõe·tœÛ<ÚkáZh3]R¥ÜuûèÈëöœs@×í ƒ�EHƒçŠ8 ƒg,+– -‹+€, 8­Ýî\ÏÓ](ŒCÏÏÄJ�xFáƒwìxƒ@!eÿª“{uðVrmÆvk§gs6ͱ'@!e†5Õú÷�ý×bÝæ½Ýëì%hb¥@ m' çæ•`=G°ã4J-¬öZ´}}}UÎdV(¡íia¶' ×Þܳ�ÓÊÉÄJ�0N‡Ë¯:ê|ø€BŠJºÝ TÀ(¡í)@p¹ß*Ûí eÇEîpaµÙ�þÛŸiG—º Ózo©¸‰ßÄJ�ÚpA�Ö.eSø»R,sZëQÚNOé!ƒ­VéúT5�›¹þÖ’ÇR ÞÌ…gºk]¿·»éŽú¨›bR ð¢Z~ƒ—í s›ßqƒ·§þÃ&¶rßø˜ìdl[.jZ%’ú:ÓwûÕ-ß)Jh{ÚüÎ?ºe„ä Â,•Z†ëêÎê[ã<Ú«¡‰•ñ<ꉱ]È.ã¢NQБ~Mdg³;¡Zö44¡… 6º�ð«>`³.­wÜRöb=–ñ–24·šôÔ¿(¤è0€N#“ýµ¸> iØP2?‹åÓ[–Az‚ÆÕb§‚¸j%ƒBnÕ ƒB_7R³Z¬Äøx÷‹V'À'·'ÂEk †®t^qw±†¯¨ŽÛ¸µ]î(¤èÄJ:| »’:àz™Ð”ÛLà5€BîL Gp†¡|Œ^¿®—lz~àg[!)PHá¹ÍµX%•Ü\ãʤ‚͵¿¶±bÅOr‹+ù‰¶±ÂVß8™n5ÓiyØ0òìl9â £(;¸6u,¼î�ú`ç½MªˆíÜc·ü<ŽÞò‹ 9•ú²[û P½Õ6Ô’÷ݘ:‚RšH)PàõÄX�àq´Gˆ ¹n†aµÉ|˜ÛqÙk·ÉüÂ�wò/Å4±R „¶ƒ3MŠŠ}cN�`Çu4ÒUîP¢[´1Hx"ÎÇRþ*Ö&ýWú+BYá©sRWÌSçHS„�Õ‚IÊU F>”©¤}(YI™ó¡±›s:¾ïÒͦ8ê�Úž|hì¿;Æú�àÇõ2çBÇÍ’{¿R9ê�Úž\hœšs\ìÓÁ�ëitF}l)U°•‚š7×jƒÖ"<‚bš¶R „¶æ•Âb瘲~tO3õ%µiû޵¸¹šç\!ñè ÈBâœ3à ‰G3�…ÄIûæ ‰#ûöËÑi±lùO¹­è <7ÓU ľ ŠNYwÏîëö@!e‡†5Ú^íµÎ¯u£+ðüÚÄ—±+@Â�£íþîTΞú¨›nR �¢ÆxzÙ¾ìg*ê¹€›i&rߌ‡\,@uŽÄÊ©*Tfg\,NO8®8=p„i‡êô¤e3Õé£]3&kÓ“&ÅÕ¦G&– {­\´Ü¸½TÚÖKÕ¤z ÚðK�ÚN@ [úd§�Z¹¥‰uüÀÏ´•…>Ðê ðþ „JhÃBPÕƒc�‘Õƒ¹ãªÏvªElk¡¥^ Ђ‰•¹¾H+##e`Š‘! Ò±Ú8‹AÚBø1V_j-?.°Ñ:ùS`«×@SK ”ÐvbeýR\èSÁ�ìÒX4-j†,Çi&Šc~ÅêQ'êìÁPã]6t–]Î8Ãà‹Íd2§v4ƒ.{ÙtÒêÃ5žì˜€™é)à +w¤ Õ‘0…ꢰÖaYÿ—“빑›YpŠ£¾˜ªž×óR‰¨êy&PlT=�Q“DZjŠü¨J„°rfyûáúì­’vý¼L¢&”&aÆA)^°©��ŽÕXY¯e(a…ö„úÒ…,{�’ІØ#+~k¹\}ím¯˜oV`e%0êSz¿4$+VV‡'€ÇIhÃ"À*”»éí}WýævnE¦ F}/Þ¾ßÓå×ë [5¶W+öÚ±o"¥8 mg¤…Å)(|¿u\΋Ñ$§$Mº/Ý=µŽã”äqÚ”ýÍ>ý3ê÷ê²Ù¾W“¼®†¡¼&pþM¨ '¾é¤àâ*EE‘nœ2‘ž4�êúѸþcû³¸)=e-]·ê=�‹ŽÞoþø� &¡í¤°Èq¡SL&‚Ÿoƒüúßí±M µµÓ5Óm•ðf¥¢õám“çKMœ %¾é „TAm¸5;Z5KÉFòÔ:ú‹Ñ©8)J8‘©s£ˆî°€nD¾þw'ÿµ‰DË›Ï×s€Z£½¶‰äO˜P†ŸZ�ãÚO€ %2ô¯úìÃT "ê†uyoÚÛô¥d-eÝ¿^—%´�€XÕäVËó×Åã{°·o‡ö‰Ör´¶}]`ÏqÚÎH Ÿ`êÕ ÆW;ù 1ˆ ¹,nÎ`0 Á3Û÷¬øéÞã„û!–w5ꯕ­š¡÷®Ïhi.%ÝÕåÏ�ÚN@ »¡e©!]sqqiè—¡¶‚Îpxm—´Ì2¬cöÃ:Ìá„“¬<Úƒ`óÐŽÚÃÒÃ/²L¤ ×q½Æ�ºž?ìöÖ19[§f(⫹Ü+°±˜ü´—,Ã309"ÓIŠNàW v†ª˜—õãTŠ.Ÿ�Ó8™nR �b7yj4fbÕÓùË—W¥vìTª¡f‚ŒÛçì?Ç =ÐJÍGŸÖÕÛöw­LÙO€Ih{² ¿ú,ÈÏöúp×ö`ju±óªV½ÙZ|Þê}Ѿ#ÐfÕN¸>�;œºØÖv¾"îw%=•MH½•8WšË«—Z1ê¾1D%´�€˜@ZãXÖEÓ¶Öù“Â%´a!ÂBPS§l×±T:/¨w‰qõâ¶íG;þÍ|R „¶ƒk•`º"rëAÝ£)=—û˜gPÃÔ`b¥@!uÊiKÎôûÆæ Ie9œø¦Gã³%¿–c¨ ûà"ÁV–-z§ýö‰)L î)¶¯ŒîªÀÎ5ýÐQ:ñŽ¥ˆM€� )�Q=€Fÿ8™Á}�–oVGdeÝ–Á„i(|Æd{GúÕôæ ÉÃ$´=R®¢©n]3�í)’:ò8 mZ Ñ|‹ (Bì(]žSÝ�ó²jªr�•¼�Q‹ñLÕt:iŠÊpÚN@‹ûUìÓ EžéR`@{Ù¹ÐâO«9õî‹ðŦ— 'œòP_Åï�mç±rûAQ(¡íIQ~X3ÉDz’}ëÅ%lBž�I•±uDÙ™îë¹ýÐ(¤è°ײ5¡¸Úó=¿ð3]¥@á…´®Ø]÷Gô�Å:�Bx „6,0£y¶ ‘Ëæª›ïÙ€]‘*r�{lm¡ro9i™U][é ]× ½M¬(¡íÄàáÔº¼Ê‚jž_­§{~àWÄÊ�B _¥÷[öîW:D‡[7‹¶\ñè88Ýü”Ðvb]¶›xm-×�Õ�Ö%•E#ËPÂãqû6¤'¡íŒ´¨ zu¿LÏã`Fj"0Ä»¦�*ö>Û¾¬:Ë74¬8Nl�§@¡]4£žúƒÇ¹oÄžæ¥[3ó5 WT?&0&Zçü�r|¡}ß8˜äumÛ±;»f´ã„“¤µ†”{=éÔŒ’¦¾s6M½õ’˨זïLd(¡íÄà®Pº²´l¸îIÍSy¯6µ"Û1žgRÓ`îrÚþ™†LÊã$´=™6JZÄE}¿§¼ÎXŽh,¦¨'œáA;_4Ùü‹vÏíÜLSNHÉ4Uî¸.m�÷2I}U^÷^w@T¶9‡ésµ&ÇIh;­Mu^½àÊ]ªkvxiqÆÃk¥i*ÅIh;#­‡åâÛÇ×äãÝ”7a «3tSp4„>îióVíqÂɉ–@™2£¹šLy'P–Í'ÄXuºÔñ¶ýœy „¶Çà,×”fª/Óeúô‹ª•<Ü/6™¨/&î*£”¦Å¶ã?ÕâÍM—œl]•Á$´�‘™ÂÜ1û!…Ùá„“]‚Û^–>rÈj“›VQ°kö>¿ÓÒ˜ø¦fŠ‚2›¯Z6澃+¥úêÃE¢(¡íÄôW±dgOýÔMˆ(¤¨ði–×ÿ¾Ÿðö§ÄG`T¦ %¡í”¾šòEú¤�ýß(a$èx+eáï7Ô™hœ±·À)<ýbò¤@ m' &�V|œ…‚{œ% ídúgÒøJK¢Ô‡KÂã,½M¬(ðõO ×ÚÏqôs-‘!§Sø\ËPßâj­?§†¨ÁÄJ�Âë4<ýÒS?Àû&&D (*z,%ÿ­ î-–¨ d7K­£{M6õÉâþ£ðÑÍõ$@Nõ`žšW«ö«ï³}Ä·p3]¥@!E‡c¬–ÑÕˆª>º²Ø£�WÐ_ß^ë%hb¥@ m' Æé*>!CêŠ{BéŠy^'Úù¼gWñy0±å*ŽZ0©ˆ¾¡UhÅçI!¸ç‘ñ½›hËä?œ-£7~à;Z¥$óåØëÐŒ¯üx~¦›È}5¶æýe•`ç±½“Óó;?ÓV ^ø@+¼GÉ A½G‰…ÏõÔ@Ý„H�Ü7¢Kdñ}›Y¯ÅhËçÅ*îMŸ”ÐvbÈ3ç¨øØ¥©Š`ǽœ rsõ8·”ê½ w‚§:}רK�œ�pºê¹ý +Rt0]襅 ë ›í1 «3p jf•%´�€::'`ÑŠMW?nH[ NüÖB R(ØZ`:0¾ÊDv ÷*ìÀè­¶údá½jÙßV"ú^�„­ “*JhÃû$±‚ ‹]cfEðãú™Ñx®†Óù\ ÒU Þ‹®?Þª•§ô>þª— ‰•%´�€ÞB×ËPE¥ó×{~_üÀÏFa RxT5!ÿœØ;&¡®«)m¹''xm „¶ÿ -ð4§-òi ¤-æ�`òì;”Éãw<‚¶ô:YÁ�õè¥ïœtŽI•á„ïhO*ÖîçDàJ÷#ò_Ñ�p¦Œ5Åí®¾,%‘·­íÞe)zíqJh†œâ$´�‘ÖƒÁd°ØÖ[9;¶KC1ø¨²>§—XŸù­Džy—¾/¸•§ŸøT†ß³I•á8Å£Ðv¬{ßWØ\Aß¼ÀË:+� -µ'ëÜspeî£ð‡©ž�­ådûÍZ_¥=6õ-@*ÅIh;#-êGñ‹‹qNy�R,(OŠÀU”�BPÕ÷c×�Õ÷¹¾AÕ÷Ãk$CÙg[®ÅÂ^} ©ž›©*âÜŠ(:|¶å]ÊÆ®ï6¯õìÀΤÊpB‹H…"óœL�ùÈŸJ8éxñù&Æ|ìÃÛsYgkÉ¿š¤*æùœ)Éo:)2¦gFgÀx˜prÃ÷-l£MKÌÔ—†cÅ<—Üb2¥8 mg¤U~jÇ-¶Ñ¶,ÃýbWÏ%´�€ØCjYŠ‹ßlª!r%}‘1=ÔË5SM’Ss+å­^åBÍtÒ•á$´�€«§Þ6~Г ihè)åüs¢¹˜X„8ÛK»/äº�«;ˆºÏ—…MSÂ÷O\–I†J:RlÉA£+v”*©¤¼X¶ŽËÊãªÖ�¼¼´Ü`Çê¬L  'œÔ·46ôL¦r]E=»mlƒ’u¾Ž É”á$´�€ÜMÐã‹ÿ•=ÕytÌÀ¬ˆ”Á„Ûò•ëHþDé:Àÿ²š. Ö€é¶—ok2‡zq=ë&NŠ“ÐvFZµ¤ùÇŠõà\w¨tŒÀÈäÉpB ýwu?/?YÜ/~6Ó¡‰jb =N5\ =ÔŸI‘¸žÓ8™v2œpBûÇÇ—Éî{ïíÂÀ¢·åÊ⹆÷>Èi±ôß8ñM8^B!‡^ÞÐPåZFÖ!âm·¾±eYŠÃ·ÂZ‰[õì~Xy �²sºË¥›òËú‹®½†E9½2‹04½¦+Õž½Rõ0á¤FÆ´Ô«ï{9,ÂÜ-,ÓQƒk°pŸ ­SW»U{é®­�{fGdÖvÒœ°‚GR±ê<'Wt>ˆ@-M{nüÒÔã¸/fVbjjªÜu¶j3ìJÌã$´á•°çímWn¯ ©. |ŒZ¦¥ ‡b|°fóN(ýŒ°.7qò¯gVøhoêråaœñÝö½ºO?â§[¯e0á´ß'\ LËqÌw-Í?»’V^°úÃ×ëW)N|Ó H‘jêW�´š ‘Ž9ð 5æÈ÷ þå˜ïAPcŽ|"hFÓl±Ý¾eª�XÇíÜLS)PHÑcêÕø•¢Öû~£:nàfšJ�BŠŽªµ½f«'­/E -hýâw~¦«(¤ðL‚×4¸$ßÓ@=H(+>ÁéŠz-usú#öý ʆà ñi¡ÑŠkÁàÚÇÝ÷ñ{M¦'œî¨·zn*÷ƒÇ ”<>–@)*>ÎÀ)Š{›�RÔeùe§nYîªjþq¯‚6Ñý�N›("¸Ì®Tü”½ï¹‘›)*Å +y$_àDà"@£öÅíznàfF�á¸/†�CLVupÙZ¬Ë’»2}&RŠ“ÐvFZ%HCõÊžÝØ©r Ð²K­ ¾Ý}ìËún0 ÊpÂõ(ÓW=/¾¯<ŽúÞ›jbÂÒB¼XïÛw‚I•…ïÑPª¸§~ê&D ZT­Ëø¿R^»é/ÈPxó<}cOqXO‹û݈|߆;Î{­¿×Tµþ›ðͦ™ G©] ¥X)›�+•…x˜\eØžßøµ!r_]„•F¯…uyUclΖ,¦êpâ›N@ŠúQü<ë†8£ªèk㮃ÞÕÔí£¥íiø-”¨ÿ�ß„wcà0J‡_ôì&1n¹i> è{áµ×ZÚkÛ×àzÏã$´=zþ«à:,¦¨Snè5X�âOTW,~}d2¤@¼d�‹­÷ÔX x ÷�8�xmÕ®·™r‘“Jh{Š�â–D ‹« S Á�[º0^ÆïmÒn&nŠrÛ¾Œª–÷Ûȯª @ mOª‚»7{õbóöþzƒiÛ7 �3[Ö+÷ü~ðÊ(¤ðèܪgMM›ð �Ó¶+ÿÆÁ1ˆ::ŠÞçûËã„“™öX‹ì/÷Ó!@ö½`2¥@ Ç.…S¨�a{vüÒÁã„�QUËÐÿšS9U „6^UúþfÁ½îpί%¼Ú)Êß8¸–€ú ACO›6´{ c9ÏõF…�yóÉ•áÄ7�€Y¬/§2qåÁ;øëËltnï¨ùt¨¶ û&¾é”̈öáËŠ2Hüx‡`E)2¯¡Ý!WD�ó‡ ŒÑg±Œ×i\µ¨K´·³.vÿ|©W/A²[Çÿ3þÿ†á\7GŠÈus:×-p¢ôÈ¥•m³å;éÆk-Ç¥•y „¶Ã)V—ðÚóÖJØ“Ye'¾é¤vJ«z¿rª’„l1“)ÃIh;-2§¬gǧ”yœp’ƒä»¡Ü°¾\DË7÷×µB~oË/ûÇ%“©ä=;>“Üã„”¼îê‹Ùuo>æ�úáÒ–ãp izéÈýH踀[KFþF}/5Y¨âh@¸2Üìþßå&«�ÅìQçUÚŽZ‚£<é|zn¼óñ8!%˜*ÊAÝŸàh n¥Í füG•{Ç‹ö>'¤ÜPO{½…<´ð!\>ô~å{‹ý¼{}”»ZæhÓWçNH9‰›41ÑŸºHCåù£k4±FûXªL}ŸHû3ŸtaY ùÇô "+¢ãD'E8”P"ƒùBóÛ×é{‰;ë“2Û÷ú¬5—k^Ó»Y2”Ðvbp|ÍšŽ§{¶—e ÅËia„A»û²{w.d4e ™6�’ÐvzJå'—,ú‹w­éê(€r Å -å°iuÍq{½ï_íú_A »—Þ-{íŸ7›  „¶Ó_M×ÄeÅv÷Ù~tõç®-×�Jˆ£ùïÂnýldä8 m' …vWÉÿÖ7Ô÷mg¤…íu¼s�µ“>× è“*rÆ€Uõ·¥{îM¤|||5œ€ xôÊséïë#¶ñÁ¢§ýŸbׄ0ÞÆ”â°A;Z¸ã‚¥^“P1€ñŠ Ö,Üã$´=YxÔTŽôæ¦&›nzðw«ŠaèÛN@ŒxNÃì¸ ãšþèëmå‡Qç�B5êôZP�éWþ0îN|ÓÓØšòÓ4ü3êàÖ­óšÇIhÃt).¨ÀÆÁ�R'è®2âÉã~EÛ5"ß·ý»î¿™7l�R°Ã2ã‹ì¬¿r£ý×’/õÊö6ÖœjÖd<ðÿX{›žÙvÞ:p~ÅÚŸTíϪH7УNôtÇvœ`oI;Hÿü–D©ªÄµöÃU¯=8ïÕS‹ä¦(‰’H*AÛUŸ®síÁm_û¨ÀÎñÔÍ5 �Ú7Ò}Øz³.|¥d�yg KùÄ㉩6ãq²Ñ CM¥Ò„8jAŸ=.‰¥ºzW3ÿêÖ^!Ù„� á’&¹dUÛ½–D(³};X­Ê´}aUðÅå¥ßrƺ/- TU•&h»RZUŒC5˜¶†šNéNr«¥¶<�<›} j8ˆL¬˜D�2m•§‡Ë¯2—G3É�_ÕÖ^Ë9”³–÷ Œ�‰ Úò8Y[ÈзéÚZí®tË]ÞNG5D }Õ €IÖé6Õmú–En·“#õƒP·. �Ihå…±”gØ2~ùJLÐv%Dü«{ >(Å,¶<@^)B"yìOŒÇYÊÑ6ݯ¶�¿ù ßlR…@MóüÎ|·tõRn´ã~õÎÜžµßòR¹¾•Þ•åa²²�Ÿo»R¬¸ûVƒÞ©veƨ£"OÿmÅÕÒ¥ � ÚNBŒJÄ(ìr;­›%U=¶zê󱀈ªòÀmª‚™—<©×°“µ!Bô†gÞ% � ÚNBL�Yù}³â�IžŒ¿øk°_L*A Z'cDÖRÙ^—tTB‘Êî˜T!0Q�b3õgÍ¥+¯Zù2Çî ḭ̀B`Òeß­¸Æso9ÜŽúA¨›jB`ÒEZ%®­zT¯ ¥(„&hãB0¯±Dä•_ÝóÛš0ð;¿*V Ô¾š¦ã*…ÿÊKhÏW8YÝŠæ9¬˜Œt±B`‚¶“ãÎlŒC5ô¡2Ôt*ik½Í¶Áº/Ý#дÀmWÚ"¶u«ç?™€PCÓIÐÅ � ÚNBLû~t ŔȫŒê}ª2`�P×t)�¯¤YRÒÆ%Ö`‚¶“cîYŒÂž7ØiµX}:Þm)qÐÓ:?ZÀå¹Yi¿‘\¥RÓSLÐvb‰Ñ"õK5!Ħ(-?{·²}ûúªè •9G ºX!0AÛIˆ©uL=N®cŠ 5�Rm=-H¼df´ƒPƒÒ«Á´´]êԗω„¸©&Â%QP’;p¯‰Sy8hkñôPnÒU5™B\‚¶i‰Å&Gnáfû!0‰¢k64¥/lÈ“8.1³¡¼lTk�νìÔ{õÖb2E8É`E“™é&åqIœ˜TyÕ¨V~˜{V õ¶bB…À$ž”'3²Óe<.‰¢3U=êž ÔƒmE~}Mz—Óç¨QIʧ!¥ºË‹Hõ7{«Ù1p:�“)(@%Idò¶ÁjåhÖ¹—&8ÕL"W|³Êâëx* ª¡’†´¢¡DG¤jøbÏ?Š ßà÷›L!.iºlú)R½znjÛ˜©/Ñ#·ƒp³® �I]1'WþT6'(›*•…•ô„µUE=iµU™ž”2´hRZZͤXZðÊë)ûçZnu+´”½ò«Øò‡Vºª"\‚¶“к¨"â°gLUC¹›�–~…Ðj¿¢?ÖÇÅŽëãj=Åêãú±¿l¦ÈyéŽLÞÔ,5Ѿ–;:€*&h; 1ºúÇ0Ô�Ù´ÀOS¨¢*¬è&ªJ«èFT5œY–:‚K ^+3âk”�¬»<,ý�5Êã`I›V'|¶çê¯*2¾Ä“++cJŠ`É7�H©þŠžŒ¤õ2/—41¥Ulp¹¾XÄ.iÞÛëgóY«®,½è N‰~!ïÎ~ä“"zá"6²úbóÀ$Ê͆Ør¯ç–å*¥m:qjô딉ù܈‹9ÕZžö²Hþ†¾EØ„�I“,;Ò‚ú�¢ JG”€ÙuˆµH×ÔŸð€EcdßeŠptÙð¤ªóUï×ÕŽ¾¦g?ú¹ÈÍû—dÉ�”[_T `YR\âþDš›0yâÍ+òDþJ�Fà®ø£æeßÂ便XÉïfWy…{ì}–SˆzSÙJ�~ƒÉâ´]ù @ *Ùi(•ìXîGÒº7ãqÒ×]levnv›û¥#z8ž�oÔ¾™¯“å}âeX_G~ágÊ �IhaA=Q­¢ AÎÄ Ñò£2!µic`wv攆@í£Õ:#¿"–VçÏã•�ÔùT…OEM)…O5=íS=>+I íuj¬>è5`B…À¤«sou�×^Ký=nV÷¹¼È÷ÖLLÐvb,‡_�ðÑùh3¢˜t -_V•A(K$ЊCz…ªÅ!±#$ÉioÙ;%)¥Wºü,yã0¡"\òM—v”FûüBÔFÉE½åá5ûøøÉUªÇ?š©Ï¿n_b ê!Ù¼÷‘4²ë2„Àm'!¦ý ¿ÐºG"¯©+|1 Ÿÿ2EÄ/m‰/‰á KYÉeO±Ý_"ø×¢L !0AÛIˆ}Xͯaáã^ŸCåÇg´ØKì¥0|±#S·wx¯Wš¤—><.AÛ‰´¸MÚ;eô´gD“t¸ä›® 2üNF] 1qebcqÅ}|Π»JJ©þ¡í$Ä.Ö½èq2yäÀ£fwåÉ6MUpø!jJ9ýÐô´-­”òÖ��oïìÛN%rï›íн©áÙz`EeOç<_·í‹ÑuòÎbßv@î;¡çyQ@Þù#¿/é4‹Ýb2E8îw².†õ` ­/#–4)ÙYR›öuneÎú–xß{Éâ~ıo·wI>˜ í$Ä.�îbœoúÁ_dêÜÕ)þ¸lÄÑîŒÓÙBìÌÐ}ŸŽ´u‹õ8íûø ¾ÖóÚú„ĺ~³Jy`‚¶«Uj½Ù±Í­¤ìðCXÂl]áø!,žVk§°»/aNúb¾ÄêijUJêå 6L/~ÒóןH÷ÀmçEò8)<ò¬¥ÔK ¿Åö“â ¾X„ �‰SÀÊJA‚‘Û <0‰¢“ŒöXÅX”Á¤úF«ðÀz°< W·Ï^[ SÚ}^/t“X$@JiÙ}‘Òî�I”ýgZt[ãò„6·�¿í“Ö{-‰˜Ä x-Qzä÷E¢´&QxÒuÙO*Þð2wÕbá&_(ª â´�„–Z i`wv6ME¸¤I~QùŽëåÞö ¤�/„dB…Àm'!¦Né#¿/¦tL¢ð$ôcYw«„ñ®‚†¥oülmb…À$NýÒ¤>²ûbR÷À$Ê®Mê%N´éÚË”‰“º&h»šÔ]¤Š€BßÄt%°Ó—ˆ^.›-»gn1c¤h‰_?L¤˜ÄÅèÇefdóÅ2ã�I”™ÍS»…Ñ•Wû:eBüúab…À$.F´nÑÔ²üûó…ŽßAøÙê“(¼T�ÃñÓëq0Qá±`†¦-¨Ð¡jKªÐAµ…³zyG±hùuÓTl²æý?^E1GÅt±B`‚¶“»0ù‡½ÓÝÏ�¡ÖÕš¶ ¾ˆª-©¾ÕVX_u%ÖÑtEë‹`–•Úó«(’¯1âÔÒu´�„_™Ëƒ˜eξ5ÜÀï üL[!0‰ÂŸ=þ´“JPƒf~’²°èˆ¨,­èÈŸTTvQ•ÅëÒµ€¤Â1N zá&Q¥Þ½z>-^öþìþO ®q%v\É ÓTLÐvbKtˆC˜XCMŸ¡¦H MSb¦)˜Ù7Ë•~W.�‚ŽÿÛÐ`‚¶“ãI·Õz!ÿúþšã>ø„ŸzL¢ðB½øµ` Ñ‚ÖÍ’®HÉMWbɦ+¡jËÈ-˜tÙ}™�û­uü½¤ÈQ<,AÛ‰¤X&GÂr0&QÌLª,ã«´Ý·ZÙ­Ô¸|¾ê)�5Q\õ'‚%ßt"%µþÈÈL¯?âqIŠ:ß>^U q ÚNBK4ì‘�n×—4Éqa(ÛÝú›þn=Ξ—©)ÄÑ å¦}ö¹ K% k@ŒŸ‡d}>Æ1:šðALØÄ �Ú@¢ÚšóR[¯`ßï3–ÍI¸=ÈßIЭ*&h; ± mí¿—2Ë>æqéø„Ÿi+&]xO‹¼6­ !>7�BHïrc�iïrkFÞåÆA—7gõ«½®ã{�^&T„K¾éJ›Ól‚ç�T»ÁiH»Jã’,'�‚g5 ”W |¯s$} é*@Œ“¾Ž�äRœ²œø¿Ÿ^ÌÛÙ::ÞƒÈ?>jj � ÚNBLû~³ !‘¯ŠŠP^D9É\RªOÖÛùg�Ñ™ÈÌ,&ÄILpFÚzÈ‘Ç%*'{ç.þ•ªí=Ð}(v­�’oëÞ‡D=ù/6¡"œ¤ô‹·�;}sŒÜäf}â’,9�‡ê4´wêˆ5ÿ"ö˵/¬B¬5ðªlðîü½ø�TÆ_i¹½Îdb`‚¶“kš(V³OÓoÛ4lS½V*®°%Ý,ëRl}ÏôÞŽvKÐv"©λ?íGmÛ2Ð>íîö3Nú:¶%Zj’GÞÊÍí½ú‘Õ�¬Ì<#˜ôµ£6ìKǿˤÙÀÐv"->½�gi'æA Ó¤ �Úð¸ˆë ý�ŸY”tZ¨ÏÂrí–`›¯7­ý`…×¢MG~_D›z`¢Â³hSE[˜Ù jKËl`Ú"!Ëi¹8óÏ>Rê ç; ć·š¶B`‚¶“ã°sú¤òÓzšN¥Ã«ñ•úÃÂ0Ë�k û~Ÿíw™BT‚¶ÓSâWÛ\¯oöÛüÍÔ4 ÒØp5))–ƒiM¢åhiMÌrž]¬WXwþÜróVè[ ÆO�¼õyü´'¦ÅO{”?�ì4�²9©åÛÌíï¯CªŽW‚‰yªj4ëy}Öí�I\ ¤Þ¬”jÙ×µ I ¤öÀm'!Æ   0 'ï) !?-6Ýç:Þ-.{¤K»ò…j²mz �<„㿵 à‘ßAÁ˜Dáµëþ¼FØ[.Û+HR»î÷Àm'!Fßöœny1azÅVŽAZp‘oR…@¤E¢Xüs±¯™_ïMŽüÂÏÂB`Ò…÷´0üIB "B°¤çÛdÌ^`©#¿ƒð³X±¨}5­Ï|»Ù.ÏéÙq·¨œméqZ£]ª˜ í$Äh4KˆBôÒ��¦P©É»cZŠ�ý¹$‘vZбv´Ã`;èA5ÚNêAoGB“w_íÊFµtà �<¢Ì£ñš¹›Kz‰£ëkÀÀî ìziL¢ì¤Âiü1h0&• Íú]‘EMWb�âŸÔ<·'ªJyp�)Š<);›Ã3?úUpô(à˜D}²·Rîµ¾åTžßž^�MW?ì>uU t©"\òM'!¥ª ¹U¥=r÷gU5ÝÍÕ-çE�otå� ÚtmÝžö�Ç4¿ô~š-ÌÛkb$èÖ´�„KˆQ¨Ó•ÀNÕ(Ò‚÷SD”÷SPé±=´!í±=Í„Øc{Þ9˜v3³×ch?îû-Ì<‚I]@W•i}uo·ÌÝf’R±½(ûɾ‹â´�HëbVŠ`¨³¦˜�¤L¡ãðé=©ã´‡÷þ\Çá[‡¥ BòÖpîºæ?”b%,p~öî£cÒ1¦¨˜Ä^Ö¢ùU±´—¨<0QáÉ[T‘¢ðÑ%QQÚ³KLQÄ¢–ZDðÃÌkåZU^_²;@']Q!0AÛIˆñðQÏD—}ïù´Ø}Þ\l± �¼û¨í�ì#õƒP· �I5T ,„ö| AW’¹žI~”Åíá öÐçǘDãºýzÝš%O¦Ïûã…x„—YrL¢àÚÃÇÅĦ=/Fì  È騅"•VÖÕãÕ()ëv>x&vŸöâë>²Ó¬Ka}¶èÞêùúJ³^}Öþ—4eR“Úí œýÙk(�ÜäÖ×¶—TÉ‘¾7¦‰ =7"°¾Êž§•lßûƒâX/y K´�„ï®'F†šJñhi�ë‘ÆRêqéAÑ�Éá’®OO Ÿ?ÐDÐ^?@¤âç·ƒp«2E0é{i?E/5â²`J’^xŒ°¤kT/_ï¶M(¯Ä¾Êo ÕÙ=.AÛ‰´¤A˜ m¥/—‡¥˜L÷ÎÓ?î㥕ƬG½O c`‚¶“Ól�2ÑX4§L3—e®oVܧ–"´®KõP¶ûÜÂõʮŠQO…[B\‚¶“Ð7Ó­~K¹5ïnµ¶ÁðÀm|ƒÁ²b·­%©Þ[Ôݼ·ÎWa‡y{ÖH²ýþ´,Üš´�„ÏßË*{>,KÀ±;»*UˆKºèžT Ð$P  ¥°ö”VXAë(VXíç1[òݳG!� 8P&SSz QB�l. 嚣¬£ÊY¢w×–[5g.5…uk©†Ž}—)Â%ßtRÙï `Éï1;Y™>Ô"æß+j!Ù÷Â�D%0âRõZìb7ååñfyèeäÕÅæ•ÜìhHÛŠ „8éûëSWaA7&hãÝE+�DêCv¦Aí¢èX—4£^�4CK/øï!•$=ˆ•PPV%cnY×÷ž4åÇ p3½D8éƒ/Ššøá¸É# pI“œVî¸ÕçÔÀí ÜLQŽÎDr©ó°�…Ø{Z% Ö‚ª°’…¦*­�S©¯âäÒšU¡F©®¿Ÿ5qëyxƒ¢…^¥æg\RŠ”°¶…(‚VÜ… ýµÛ‹)ïÌ›‘ßAøY…@í«YLü´XŠà¶ö’„÷íwe¶ýž›Lû.S„K¾é$¤¤áçZg)ÄÕi}…ÅIľҪ“ü¹¾Â"bgiU8P£Z½ìA±`‰Ö…´d ¸™,ø]½~ÔÂA´`R…À¤«haÁQ­`³éGê_Ôð@í/ÌæVÇoþñíª„€ggª‰pÚ7s£yX¯f›k™Ç·ƒp3™"\RGJXÂ@A+a@µ©ô#õ/rð=PûF–H½,–%ÿž31‘Ú×!èuC`‚¶“S“ÎG~_$�{`…g)“K‹»}l­¤%I¦%xל€ ÚNBì²BG}q(ÿÛÁÀï üz…Ž˜Dáµlxÿ9r6<êA«/ i Ÿµ¥=-Æ´å3IùÈî‹ÔsL¢ìaêùfq”åý¡–Ø)¦ž{`‚¶“ã;¡rµSsÑîý™|&Ëç”›¢B`‚¶“«¿ÚMø÷ÛB#õƒP7Ý„À$ŠJlh·0›-»QMörf>ÛˆhûŽrÝqÿè “*&h; ±‹bðÍø¢’¨,íE%Ö¯øÔHý Ô- ?rƒ`o`õ¹èþ~š+Ô)>neb �áÛNBŒm‰b*¡çÙi¥Ï˜Aù…Ñnb·¦«˜ÄA u!<6¥v¡ôØíBE[ðà”ª-éÁ)ª-¡FîûZ ÿe]ú0Tjax`‚¶“cNpŒÂz }‚ ÙiÅE|Ùž¬ÌšGœ×ÂçE ¨ºÑ�*&h; 1©Ôƒã¦—z`E÷z*Ño«é¶¿t»YnÓ}í]·ÚõášGÒ» | LÐvbLOs‹>y×´J�á%¶×ü•Ɔ“�Q‹¬�œÏÉv,!*)2³*=ñá_a}<¿½5õüŒÒvØÚøƒÕûß•‰]¬xéO«u{Yl˜üvÖ„ �|Ä{cm×;òûb×ë�I¾Wp¸½lºD MõR—o–üN¶[õÏ8¾WÂ]1-v•nÅ2´}_•|Õ*Úviš’VK§Ü³‚Ûן�Ï7y"\Ò4©é¨½â¾ç)vž¾Q’&hû³jÂRt¢ž´Rt¢¦f˨.q=ûÅö{” ‹ùöÛãÌ[�©)UŽZÉ�ÛA¸Ùæ;€%]pG ÏIheçPz$êMÄ:A¶³ðnñ–%· IŠRGQ$£1èQ$§Y¤ͶÔp‡ª×þÖ¢Íæ� ÚNBì2¡0–ÖÛÓÍÃýÖ¼C`‚¶“ã‹g)h¶7G#¿ƒðë±0‰ÂKAø¨,1_S Â'W™VþrÝžíõ§…$xßÍÀDUŠ!ÖZbL·Ø‡ZL·Ô‡Û^»~»í}º_ŸvKùŽ�õÒ¥ � ÚNBŒ÷aŒÃαq(0”{~…o,І¤½±È Iè1Œ+{L‹+g=Ç•c‰qåZ±¸r®Þ¥{µ¼SÍÂKxßvbÔWŠaØ5¦,�ŸÖÏRX†¼‹a ZÈ; kt…OwŠºÒžîdºŠШĄͨXÂN™�{}¼«¼#в1ÇŽ9HǘX!0é½ ´àÝNUéÝN"3¢‡ÐÝ÷>Óf¿°¦„®SŸÈGº…Àm'!vÑc[{¦ª¿øàø„_Ï €IhÁ+�ªÒ+�DéILì2ñIL­Ë蓘~•{®¶ÑY×íA Q‚ µ®HŒ> ( ¡= H„ 6µÇJž½¬®@Ñ Ð¥ŠpÉ7�„-œ»´êó~{}ÊÀì@fE$—þj‚c'˜ñË꿆&¼>æßÎ2±B`‚¶“£·jä­§‘ßAøU±b`…×:ñ>Ùùo^&úä u¢&h»êD2»‡8´e›†ÚÀÐlë¾ÛÞx›[æŽj[˜ íʶ  †€Ã'%úZ2ÔÞ§`ïaØ~9ýi/|âãiÞ”MY!0‰ã‚™Ödç±åøàÙꃗ®f;{}=@db…Àm'!ÆbŒ“_C†¾í$ÄØ9E¹@«ï¯/s'>já Z0©B`Uª½Ê5ò«ÊÒ^åòÀD…g¯r ÊÂG¹Dei�riÊšëó¯S¹ˆhá»\^ &VL²J³µ=›ý-íAÄ�úA¨[�…À¤‹ ´à%.Qå).&>5Ò>�v• ÆIßW¯E-·šcø7WŸ™òÀm'!Vû«½ãüœû\j,ÔÓ®g«³_(=kTÁó''´�„Xý• j^í¶«t7¤G¤<.AÛIhñ9$œ§q54żö.)�C@ís}61ÍíËþòÀmýU¶#õ²ý¶¶ Ü]/χåËæ¿ìïØHw×@L;˜z>Bøù6ý|ä¶Tk+Žð½Ÿ×}(á J0©"œÖ‰�"ÛVIq׊"°}ØínÛ¢u+N&ßð t¡Bßï8ZìØ!wh v¹e·is`vfýÜ/&Yr¤…¯×‰Bh¯×¡ÚFÐ)TÞBGH†¦m·F|±Ýò@­'ÄíÖ}µŽÖ[œ/¶[˜ íj»åM;FáNØT%°Ó¶Õt7ÿ /ƒûãb³5ªå}ÐùfËS·¦#¿/¶¦˜Dá%—Ä�ì’ ´Ý>=¹Úêy|‰“jŒâÐï9MY!�ïÙ÷#õ/öV˜DQ¥E®T2µ3œgÛèHkœ‡%ßt±ÂA¼CB7÷�—ä°àõÃmoCáz˜Í½oüÔlŠp Úø4Ï¢/b.ð¦&�¡æ-Äš"'ž’¦ÄO¦©xQ˜}±¦8\Òä&9*õBø9.Ú0Iúeµ;*�O’¸Fk ÝÈΓ(¼6wg>õ ¢¿¤.Ïݘ íj˨u™D^Y“©Çk÷©{öE—×}j¹ºÜçµUMZïõu÷iÏ<^.Æ%h;‘ /“l=i,g9WÎ¥L}+à¸o Ss#»/Æœ&QvÚ�·z©[Â&ç+/Î&+r/G&shµ#¿/ÌÝ“(¼fîyÝ^jËVŠèæîq Ú.Ì�·G‹xün5ò! r¿½¢A>J)F8éi•_ÝæßS-XüxÕ€$oŸÓnB`‚¶“£¹Ä�2=rû"×Úµoæžõó�ÊÓ˜Çë3ËMU!�'òbš:fæÞ­ßò® 1r;7SULºè@ “yE!´|^BËçù}‘Òë�ÚW—ÉWðü4Õúxoan¤Ïm)û�çFbBi˜f<²ú"ÍØ“(7{IÎŽW×çÞ#†ó8­–òÜZ].fË �€ ÚNBì¢ÜBˆÃÔfë>�¡–'-) Ê‹ºRÊMýº}¸oËlÅK-­G«r¾Ô¯x—{Ö]ž˜ í$Ĩ’b|¾¥ ì$U2{ÊKM½¿Ìë¡ù†NÑ�I“¨PZ0èY*7ìyéyñéVó‰KMö>“Û²´gÝßï’G¸m'¡ÕæÕµVè|6_j$~â}1ù—49ѹmu^/õå·G_>xÈË”â¤ï½¨YT.2ßÏ<Œ¼ÂË”ô3*ÉRçÿ]Ÿ´~Ü{5”¬ÉÚð|=?Ùtÿ\?qÉ7�„TÂOÉË]5¥Û«Ž¢�JÐv¡€Ò­#+sû~� @xÿÁD �ItF~t3F6_¸˜D™µå3÷q­È™ñ½(�¶|z`‚¶«åÓ�ë…ž� %°Óܤ²|¶$K©–ZÎVÚ"kÈR当(Âñ¥ =¤pE8}± ;\Ò„¦Å�¬~òíöªÓ2,‰YM¦—ÔåµÊsû| ªÜ¼‹Ëެªץù—4©%ŸŸ«Ð|íµ tCåÍ›½öò´µ_V’&h»T¬¢ø z¬â ,šÇª½À‚Vˆo°ˆÞ¡ö ÞÒ‰5Œ¼LSB×h‚³,•å,löè&,§3šP·«˜ í$Ä.:0Ä¡[ ÅAv ·Eì¾øÝÖuŠŽðíQGÚÛ-¨#vl´¬V,®„ô´‡Ãáío*&VLÐÆíN+Ð4ò;¿>SÀ$ ïË}­íäý6½Ê_FYñÓk>J.™há Z0±B`ÒU Ö€UiD3ÒªÒPCŠ{ì±Ø×ä‘zÿ¦Ã.ù&½»“ ‰ùþÍ`ÛŽ›•: qÜ´‰äØñ#ñ/,Æ“()™·šäøÒXb@눸?[ñž‘ó.ù¦“�º[{Ë)È»'!³™™ž"X’åö”{Såí5å(xX‚¶ °3¡~‘h®Rý"4W©ÎŽk­Î“4®Y�'~ý¼µ±¿^)¯)j½Àv± ÷žb0¦<)¦¨Çja§×1Ü`«±U“(ÂI£åBK“e-<_;+;ïØ¿müg žRtåzÞ,ññ.ç70;�Y7§—dÁ=)ÌQÓDÐRÔPa”a¹,q”iå²þô(ƒ|Pu˜Iù d ‘M²Th©²âbÁReãÑ9©êp—’Ré€SS`Hй)d(k’K© n é© ÔFópwýÜl†˜§WI=—py0&L„c $¥FŠHwÜäˆtÀ%Mršt=YvÖ»R¦[øPs“*òt ·Ž‘Ø#õ/âÏ=0‰¢²5ìÙâµß‘ØÆ®ÜM>["‘‘Þ§õ÷{B q ÚN¤E§NR2Я}P…9øbÆî?î-¥‚ÝKqÓz™µê ¥^�h¤»'¤z;ûârÎTwÇ´]9m믗D9ÉVt³Nž¶]A¼%dfZ‰pÒ÷ò±=øxŽ“æ(i"S»Ùª½•{ŒýÉ÷W°2u@ºÁ¢ËLÜŽº¾\0‰¢Ò¡ 㽕©&>Löm'¡õã1x›¥>޳÷ì ·‡Š?Ìe<ÿ• íô”„Ÿ m~jä'‚‰ç9§zï﨓ÇlSýûñêçlnyñÖÞÎVLÐvbtŠ¹×ƒžw‚2¬#¨kÓILbÇñ£äq tìôÅ€I”]Zö׬w"~}ì§P[¤¥cd¦/—DÁ/¶®¥¡žS«ðIþÝŠÙý°ÇÏýaõÕV±‘Ý«˜&Yö8~B¤{’@÷+†[ãü‘»ù¾¾wäâ¬3 ÒØÀç6¦¦væôèž¾›�7+ˆZN›ß…™“=nÝëZ³gÊIX Gdz&h»Ï$®ýn×íÏåÒ)õcÕ¤ŠpÔ)Åa¯ è‘›> =.i’3Ó ·c«nB û8-ð�æHµ·Ûò"Ó×<—ƒ >¶¤†Àm'!¦å�ܾÈòÀ$ŠNMýæ«(a¶‹Ïðé]y¶ ¦ )eþFnáfBE¸$JNËÇ U î¶X!�ç£g½}ÔJé%KBT‚¶ÓS~‚•i¬xLL8,pÃÆØ­^†Ö»¸æÜú‚3ø¡&PL¢Ö.Š1¹Z9#¿/Šìx`R…ÿ©ÎMVîf¿n\Ä27—|ÓIH±‘•5VkcäiÂÿæ’ÃXZòб½ò¼?¬TËgîŒKÐvZ‰‘Ê{ÄZR%O ·oDð¸m\b8sI ¬¢Ï­ìf)^ò¬¸µ•$èB…¸m'Ò¢ƒ,†¡ªP;I�LQy€,lÔÀA4`2E¸¤kӓʾÍm±.~î_ˆàq Ú¸´¯žV ¯.6GvagBE8é‹“z­¥™í¹I>Ð>�¶™pˆKšœ°5žë U)Ý4÷¡øÁé œL%?£´oMH(¯qVv·g¾4ö• �³gFãò¼~++IþÍô.”!1$}ÄèšPÖ®›×þÍ*8ˆ L¤ŸQ‚þ£åŽUö¤N²o»Ë;ê¡n^CÔ¾‘��<Ä«‰çMl÷Ì|Igàfš �Ú7ó’Îå„yÚÚûzŽ×Ax5§ïGTÒ¥A½g‰=©-×Á†âΤBºû–?¡„ï*]¯]Å V¨6ybÏQ«vÍ6Ù!®?ºµå“THöUû>ég\‚¶“ÐҊ̬Šâ’&7ۨą]+¥ 6tbEØ¡í$ÄT»Ê=^~ÐbõÊs/ù?Ï[Ù¯ ŽÞm?‚´�„M#šK`j-FÕ_ %uÚ‡qd“_ˆÆqb„æ[ÆMÞ‰î2{@%h#ì‰'µØ>ó5q‰×_seB]Ÿp%‡ÙÙ‘Ö#&QNj#?+W“)R¿°`)ó±³y>µG:“‘¥TMœ¶ûÜ'(¬nëNúÁQ€KÚI…´HŒÜôEÂã’(yÓЭÏ}ñ$“_ÚÃÉMZHèñ¨Ç’Ûcí>P0z¾Û*�­b{�‡¸ä›NB*Z ð�a�ÐÞ į—µRÞynü5•³Ü¤ Evߌ»$&ù¦Ó‘Šþ\-<<²ˆUFmå^7zkžI[8Ô-€•Û°<¥¾³’C\òM'!%Vö0µê0²óm'¡5ù~V÷§¼gÝû¾üÀ/7ý„¸¤i‘¸¥KpëcëåTËÓ“õQ�[�[*¯ªÂ婲÷ø� ÚNBL-;ê jJ+ë�‰*””‡ý©ß°*¬ÖoZQXÒo¸ÐǪõÚè*úÄ·�„ØÅâ°KúŒ2Tûwžªsµn¯€£Ñ\b®¦›˜DÛ׺ kÁŠ]¦Õ‚e]¦TÎÅ.+çj]¦UΞpejÅŒÊÔ²¾ÃÂì7«@ºÞzlÂÈèðŒLA!Š[«™uÚ\câkÂ_¯G<0;3SPL¢ä´ÓìT6Q 7ð;?+&QxÖ{?÷8'ë½ÈNä� ÊÄz¹ŠñhÅr¿-ˬ}=-æ,”¨ÖŒ«-‹F¢U[¦þJ®­¬ V[rW–ÍFYmmG4|òA>Ù„ŠpIWŸ'…Œ5´úÅ(‚N5°û"šÊá¤/¶QdGª¹û�€Ø)G»�£ÇC§@N-r*³©±îyl¶œ"-pÊá’o: )¶¡Xw‹—Ëâï4ö㡬£"\òM'!uY“ÛEÍŽÜôh[�Kªäq(ƨ›^„ðQ-à�¾åð´XÆåÞ /`�›³ 3êǃÜÀÊ™}aA˜DÉé;«ù¬å<öª ³·ŽÞ��„3SÃúÊ#õƒPï¡Ê0‰¢JÁÛy6+G�Yôö¨�¾ípÉ7�„Ôå³eö,û÷ú >ZÛº+j1ã< y¤þE ·&YTìÔ¬Ëø<Ï-Ž\´[‡K¾‰[-á“Õ]ÌÎss °¹7O)jƒDŒ#Ù}Gî�I”�:>Ñ"Œþ„é*^¼å°îðEž»{\¨ç†…ù(ï±÷sW‹•ξÕrá zÿ×öŽzƒèJÓ¥ü¼‘›îz\Ò$§;­›õA¹Álkâ½P¯ÓÞ Èç±[–ÛGå‹— íDZ|3¡¼Nº¢bn®é$¤.w¤ísûë�ƒ¢€¾!ý—DejÎvžæœi�Gœ3¡ó`Ã!vž²áø“�‡£Öyš¿È:�½ð]O¥ïkÏÏ�Uw`ßEŠ`tÑu”.¬iiVx{ZÌdf=â’,8�B÷UAó^AÅ™}á‹x öÅîëÍJ�Þï¯]”0ñ^†‰“î²@~ôHý‹¬pL²¨ø«e²{Îw©WQ˜ �k­fÙípoº½žWƒÄtÿÉfÉ!PSüåÕ�Œü¾8dðÀ$ Ogžh“€3o?PŒ6Ú®_Û .«¹y·[;§÷‡—|ßÒX…õRß)ꯀóFlËFÔ†’fë#·/lÝ“(:}1R1Úp¿³ŒºFÒfÍ;0êf õ 9žÐp¥2Å3¡¶ìýÛ?þû÷[ -züšçR¿ ßZq3/}½åxµÜŸ[‰D;^ WÃ?ýñïýs¥V£äÚ?ÿéüõ¯ÿòÇ¿úwÛ²þÊ£q}fþùÇ)ö«mä�_r¥JøD–õ/çóÿýí_þkLņr¿ÀïmnÏ_×ÿÇ_þþ�¿™ÊOÿÍ_òGÔϸ›S5OÙÁ¹•¨ši›kiÁÞr¼Z¦[VŽU j¨w‹}ˆ49:gŽÏ�Eàl ÿ+ô•d¥„=Dzyê¯q¤Ïû«XA!ëA ÚÎ? FV OÍ¢× ÖrDiÇñb|ª&h; 1‹f®Oq÷hæãÒµ¤0#ñ©ž˜uÚG0qK)wwï5yé£OM¢È#/1”U +ù}Vè�I^:å™Í‹ÚûÑ“vÌãq Ú䃞ìšÙ ÃüŠ·ƒ# „Ó£  ?Ò`çAèMŽÔ¿pC=0‰¢Ò£ÂèxOßM5ñ±²z’_î-ëñá½{&p ç�Á 9Âñc84,Ífv_˜ŒÃI_ÌÇÖ½:Õ‡ xðãM£Gî@Í@Õ=úÈï‹=º&Yxð·³Õ§¬�¯oÁMw°ä›.Ýô¸³²ë×.¿çoºj„%×rÕMd½¨ÇR�Wð*Yxå·€ýQü¼‚v£÷þ?(ë[†”4ù0ï*ÿjÞ†âCb–&h; 1i勲.C´âIwnÒ•ñT ®çÙzyßÇ(7Æ#,¹–“ÒRiw»ÏÝ2úÖ ƒ©´• íÄTZVR§DîîæP7ÒkM{ïeæ¶_j?¶�Â-!.ù¦“�â•JBXþÉò*»�V™v¾í$´¸¢Vó©·Ü¶Q5p L¦–Ten–ôÈ3´UHþ›%¡íySû| ÁÒS’~$*€ÑÛ¨p,­Ïº§ÙžS¯Ã“=°rÔ·=­$Çøõ]¢— íDZ¶Á L¦˜›Ø•{+δö¢3XdmT@— &h; 1­§¶§Õµ*u¿ž_ô”Ç%h»è)(< r³%¨@=,Z' A«Ý m\­ ݶZ-§ü—Û7é<.AÛ‰´øÈ ah±¦ª˜�Tb�4¼ù OPwÍWš3=E¸ä›NBŠ« «“�Üäf2…¸¤IÎôô³g‚eÖL¢ÈŸªµ‘ºù1™çšû¼•ØØ«f±ß_ÅÙ\¡sÃB`‚¶“S=±¼1XÞ…¹U?l@¥±áÊóùHóÒÎó|Ñf޼ÿz–Gys«¶žŒÉ´]ºE@ \QÅçA h/ÝêD±?ûZƒ>ÇȾËá¸Ïái©N‡Ç©^ò“ÔI5õ°>ÎÓÖÖúøSÑ�i*Â%M�TQàäŒÜ¾ðŽ<0QÑ™w¤¨ }QWš/´NÛb9��[Ÿ~—­ŒÖÌíÑkåŽjéº � ÚNBŒwaŒÃ¾1] µŽVt…“¨+ÍcÒtãdŸIÓ•ä5mS+0¸¾æ“A Ñ‚I“®R …µ„E!´bÂLô¦Fê_8�¨}#³åÍrí·Ü—÷+Òs3Í„@훹Ñ<Ì÷Z–×&o`wv&UL²ìH « ‹Bh……©Á-©áO{ ö�Ü«ŽÝ^<µ4±Y=EŠÄª®½T'–ºöB©@Çï ü,ˆ%j_ÍÝÀ™õú'ë´?™.F0AÛIˆ]T3qXÙÒ:Q`¨•É,Áù9ר“ò.M�Üñ5!Âɵ0+!æÇñÒƒ~˜DÁ©Iù¨«ùQ³|sËby»j¸´�„˜ÅÚܯX›9÷sñR÷­=ú]úÛŠêï=Éb™H!0AÛIˆÅæ4?VË-ÊÊ]¶/Ì € Ú¸9Ñ“£šŠ™‡ÏÜ_n€ª³0ýØ “>—Á©1ø=0‰¢Ž‘Q‚:qú3‰„~ÐæRRTL°;Ù}M Vœ&¢‘F 9k#M,æÌFÚý5ʶz_l�Ö_û DÇ÷=ýŒ£qˆ@‹LÙK;{Ÿ_“×'«ƒ°êÑ´?ã’,µ§q�ª$ P á #!G^_DBz öÅB$äýf‘å á©¥EBz`‚¶“ã‘-Ù®j”ÈþŽ™�º�>ÄÑÄ � ÚNBL+#:r;7‹ø�I�kM4½Âñ dŸ¯îh2ýŒJÐvJjÕ¾faÖ³ñB%Ef$®` >ÓOïÂJ�a9?Rþ¬x–kެ؈(si­ ö¸·Ür?�lRú”|ÓÕ€É�øb�¹\Œìéóv«mPö†cêƒ{—'ññ4R'ž$Ï:Ž• B²•.Ó~1Âlgmš>ü ÞW‹aIS¡0Ù œÔ¹Æ�“˜Í4‚~°®¦ ­.S‘_$²gkz½÷�Ûûý5MõÒÀŸ› ¢´‘)’¾ð3ºÃä‰8Å�ª¨˦*ªÑj¦‚jâ¥ad%/ –D©‰‡±Öc‡u»÷|,¯3†fö¨ù– íRb2ÁÈLO&ð¸$ ^Ö�gÂbôðØ€©H(bïÛN¤uaGAô6$ t‘‚˜o1õKïLSuûKÖkOß”êy\‚¶iµµöYMiî |à±$}ÝüÆ�q´)ãhä$�#S¾õÂF"5âik§ ~m°ÝÌ?|WFÀ¤Ž13Áa<¥ƒ$9Œ�ý#a5]Á£´/ã†\ŽQ‹ŒËó÷í«.ðÀm¼è‹iu€¿Ÿ8Ç¢\~Tön €ÚÔpa­�£0òû"¹Á“,<>À@âÃmJ y¶ “º,ÿö#ñQËbs°ä›NB �f§Š¸õ£”r—h:ËÈ_9ï—}?Â’oâ'í4À¨^"o=¯ó}Ä‚E�üŒâwùû Üå°úâ"@%EbS¸Ö5áãÑO¼·öWó=öêg¿¶Æk~v5›Ýùz!pÕ²;»!ó3.É’%L Eв‚Pv“WÊ”–û¾yݧ@”ì(A+ò(YOL 3ð89Ìj:¥ó÷ÚÓÙëh7𣢓*Â%]£žÆh"h!(‚v§8°ûâJÑá¤/.25‰æ×4´=í";wl»ÿÇFÇÌì:Äñ F&ø^kj|ÄÍ ´BÛ´á’(ç­OÌ÷רúyµs¼ßc*Z$Ù5¨#E{ >CS4i‘)\E?Þ»¯�/�áëU¡½×¢·#Å{PG¸…Ùé—Ð'}ñ�÷½%X¤pd+�ZŒŽrß ¸m'¡Åç¿rbZ’-ò÷¶ˆ1Ì£˜6KÏŸŠ?ׄŠq<�ÂÑ¢¡”!Êå�T�V®éôt´Ä�¹–EëØ³š§â±Ö·H{¼7¤NxÕ›L!�çN`?Ji&#;=ÍÄã’(ºfÌåø¿¨<ÏWöŽ�hÌ— í˜ý'oQo%‘¡ŒÆ+E�ì»L!�kÊS­Êãd«B†ÚìÀ¬ª¸·ô®âA Qƒ‰“®S yA¢ J^JÀfćé³ä Ûj42;�™‰â¤¦†½ÛŽ:¯�-,ldvffØ!0‰’S ZKÒ`ÆÝÊÌz¿ƒð3U…À$ /õ¦uiý§eu‘þST…ùS¢ª´ü)¦*% KÌŸÒ ‹åOA–Z5`ýÞ³�G-D =×3&Q¥ÂqÞÈL=Îó¨DÅfÇy‚š0uJT“–:ÅÔ䧪ÅnÆK÷£°ñ�Ñ+À$úEQ�MŠ*N“ٶÇýÕÑŸÃó1YBTÒ$FB˜¥¤°×R”{åÈud¥¹zœö±¾mÝóM[žš÷G®ž�©)ÂÑ#W”œôÕú6ï!ºåÜäfŠ qI“\;‚Ù}që�‰ÊÎŽ`]ᬦ+í–èêfÃþÞgi+Àøìå”Éé«W@›¨# ?~Em~œC”×,jˆj¿÷ul¦_»À¤Ë ´àÜU”A9wE ØÑýú°`ðòÐ×Õ±çÈ¿wSäçžž˜xìaêq0²“ôžÅ–G> d}öU:‹õ°mg±Øs! {Ät³“µÙÉã>µýÊk«'�îZ×ÔÁèÁ#\—…Î$z¾ëÊܬ¼iþêgƒ Ìdf´!.É‚)ÈuE�RÝP„úRÇoXüÆL–… YGZÞbß=uk±PK8¯Ÿ·U{+oŠÞ›^Ƭ#;<q ÚN¤E’¥Â+L³@x%3KË8³0Ë^õªÑ1ϹDcžðé-ßvH@2y"\bjdÉLQ—aæ”ÖeZâvÍÿusî†ZÁ`¾·ÅkTÈ;ðgX‚¶I V4< Z�{càó¿ÿŒå�ç$Ë_ÀÞT:Š$¹)%¦¸AGGì¹·@‹ÛëK §Wž‰Oð1y~aš ¦ ))8Ž�–‚ ¤LjßfK»xüú—Íbâ(šdi1ZþÄÀKÏ p°¤Jm=­ËÒS-0ºÛÇ£v  «…­ŽÜ¾[õ@í›/²·¢ J G5UÅÁ˜Zhk”¬€ÈZ²‚–€L’ÈhßÛg<{µæ9¾|VÙà¾ççFƒZ%±×Jí4`æš.ºŒ�ùµ½‹2}$˜|þ�Ÿo"…¸$«HÁcšÊ[À_ÉrY©Y.%}ëE/…÷˜ÀaJBõµlª'ÈF¸O–Ç]fÓ”’gáa ÚN ¥ü;Á´"�Ž{“¬èqôöL"¡z€oã®#�£¹×&› ã9E[ç.ò�]rÑíaG Ù'ØZ¦–Jå� ÚNBì"c=‚aÂjK�ùiÙ¯,œ½¤=•›†<‘¶(g¼³ô¤véùµ%Þ¶*„#·/î=0‰¢³{ŒRɪ\L—ôÓÔA:>P©Šy�F=)M#·/š<0‰¢S]=ËåK½n8Œ�ñ!A¦«ÈCd0¾H‰‘¹}#ã�I�ܹæE²^‚–—©g:F0öŤ �<”i´™aä÷ÅÌà�Iþ"$m/JΓt/A ö~Ð÷p°Èïìé bsòÇýìHý Ô{QL²¨H /ëE!´Ûzª/¸©©q9ï�Ú7ò ¨¹9|Þ<àõ¼çgº �ÚWW±ú˜z‰•—zW�ý¬F}äw~¦­˜tá�F ˆBhQ(» [ê»±U6ñ| Káø%¸§E¢n–ÐðØZí¦‘ÕAXÙís„K=©å8ü\¹?ásð¾[Ôƒvá�šÐ‚F~_x öÕ<~ªmºŸÛïÙŽ�ñ2~àëùu¼'¦ÞÇ{œ|!� µx I±´$‚íU4~ÐÂA´`R…À¤«hAN¸(ƒ’Žh¡ #7=VÁã¤/VnåÛ»PåtÉJ,¨·ò˜ í$Ä0ê%Æ`XD�à ™i1düçÉÁŽ[níÑIr->ê¤+*ò{qOŒû�Ù<þ·K>ò;? �IhÁ�¸*„t%N„¸ýziÇôr¯›�åñxÅGøëgǽ‹é4»(hþleÓòŽÈ`»ƒ°3©"\’ER¾Ä¢(�Pd‘ðÇ8íòøT�Ì—v †7¬#ó.Pˆ£—¬ž–víQâ42SI/és�JIÄ©���ï?È÷÷�˜tezZPrQ”A©¹H$.Ä/õF`Ò粓¨çT/©_Qþ>8™†~F±ëp"2;3¿Ý¬g_eX^ò2ý¨$ÊìÉ�z�{±â#ˆ ×�ܾ8®÷@í“/úi³mÉÇ�Teó—&VLâ ˆv�8òûâÑ“(<½ ‚ë¸Ûb/¡O·W±^íÏ´�7³ñ¯ðŠÛºL"/Ý——W/&Sózu%æÍÔfœÇoĨÉûN‰ë–ëqÒ÷]- SÔóªš�7Ǿ.üŒK¢i_K¹À��ݱJ—4É¥ÛgŸ'_>c¦µèK«DÑÁûÝ}Á0ªX©î!XRy¥£n©—õr§Xà´]YY,îmjh§$ÀÌ™ˆÉÁxxX›000Óã,©bCÜPì^ïÏï"…n.AÛ‰´.¼öÙˆÏÛkµq#ÌÂ&çÇF<³0Ð�#­Z À’&%I\U 6ÐÃ�£�¬ •œˆº—�Æ.Aáⱬ:ŸNsMbêÀ.Mª¨ êÏ8êº?À¤Š*L‰à&˜"„©Tr9Ø)[˜o€W&”�§ ¤…P“‰, ­É[¨4þµØ�Í¿Ú_ż Š‹�ˆ1±B`‚¶“gFv_Îx`egC®/”©}m_3åY§t}yvìn‡pÞdªX10AÛ¥ýyZ$,LB C!$óÙ}aÞ¨}´jÞeûøü3æí� Ú®Ìçɇ õ¡ÀP›M™}ßkàaª�À0?žL[!�†±Á‰!Ryn«Á/¥¦H‹[ÕÂÀ<0AÛIˆ]T¼ qøÑ=3d¨…Öù0–Éž¯Ýòàh×à%°ºôô¼æ\š‰´�„˜ª©Ñ<¾Ð”&ÑÖXÔcü9h0&– ÍúâÄ;±µ;Ö�þ>nj¯�në+°"ÙFþïµ7òH6OL�ûó89îj•bÛÊ£4u¥º½Âþ¤Ø6�KÐvZ¬gKB.�ܦYŒŸrqk¦¨Çç Ž8tKÍ¡Úò¶b¶³Š‘ÙA˜õXÒŸqIHa ”&‚'EuqKñ/BÈNú¾ä_\�×ÙžùXËY@�`0’¿2y"F"¡\Ýýhmö2;ԷäNÏê ¬,ò'Â%Mjòl†=zµß¶îJí‹MsÏhÉò½eUN-:�áSo‚#¿ƒðë›õ˜tá�–K?QEóO{i§çx©;=€)_ËvÃ�ÝŠ7n�ž×ã‚çaKg `Ò¦òBE>”nd&GàyX’ľx;¶Æ²¯�³†Ûcèa!�î�Iç 72Ó{Îã’(8�·WÛÓ.sÏ.ôáê¾WL¦FC3YCPðH[yö¸¤‰)…o’T-~S&ýù¢)ÆDù�îA›PS=ÝÀ–<špº¼¾f`wv=h3&]v …ñ~¢Z¼ AŽdnO‹”šr÷6â[7 Ð;,òØ:OŒïJ-â¢ÒüëvN8ò;¿ÏÓ_Qx9’¿ZíWü Œ5¡Åƒ¡&”ع‘Û±s¨}3³e\Ú¦R x®ÏVÿí ñè¶D…Àm' ng+gž1oÃ+¢¸ ¿*V ¤ :^Q²‹ÊÒÙ©²À)›JÉ´Ùp�ºwÊ@ &V¤NQ©äý8~º÷À$ ïn<Š>ëvßÚPšòúS§�õÖNÓÁÉ1‘B`‚6î1IèÌXï@&qLk�¿;ÆÆ  ­—ÃþC7Rì?Í�¤ýç&öÉ2Ö?ƒˆÁSrü»P!�zJ@ì­¼—ß×'ÍíýEÇï üÌK �é¯(¼êÛ’¯–»ÕñI4Mˆ> jBò"Gv_x‘¨}4sRn»õjö{5rpR¼shB…@§ÉÈVû–iê‡(#»ƒ°3.&]v 5:f_á�IôòX6ä\ "çÍ}w7²;;ó*C öщÒÂLQ-Õ…P>Fn_D|x öÍü¼qºµwî_)Ââùõ Räa (ï=¦]+µåq ÚN¤Õ­ú<ؼ¾’“`X»i¬¯ÔŽ�j2%¢É�ĿԨ}a¢v·=ë.j/ån'ÙZ=*AÛŸµÖa¹×­ÕÁ’æ8P?åÖ²¡ž½šºO£¿hnJãÎq=½Ü#iÝQò¸$ŠINa·­Ùàý¥LX0‘"õ^ /é¤â=Œ‘—ìÌyXÒÄ–t” ­®íï´AMI— MVS¶«úT×ûМ<¯�¾‰üG½<¦Lœ˜FÚúÔëqI•3ÔŽ;^ˆu.»¼á¯ÞÍrëGh®¾×û GäËLu5Rÿžý0ãÏ|È�Å †@†ñ{ZüÙÈï‹ø3L¢ðD[SÙÅÔ šµEa 0„Ü[°y¤�Â$~_ˆìvÜôÈn&Qt-9¦œ <�_‹‚“c<0AÛy‘ï—OVÀ3Ã×ß“}�O÷€ì„*Uˆ£Ù$ÓAÊa¸}‘ÂàpI\3õ² ×`º{{ÔX5uLЦšzq—v«.lã–¤ xc±Þ �<-O²©‘�nS—DÑÑ! Öb2 #Zž%O[qn/r;`Æé3@¤¹dúbéq7ûÀ}°w}~°;»žÆµ�&Wä“=z”õ¹·Ý¶ãV3\þ„ �$c(ªÂäQUZòU8Ós3ç½y[½·ýµà zéb…Àm'!Ʀ¦…]cÆ.°Óú™¦7.‚üš�ç[Í;¬á#mnÕÒu´�„˜dí$\³v1œY»`W˜À#Ú•–À£Ø•€Rs�4»¢¹NBw<*ÁÄ,FÓ¨¶�sW·3’¹Ó팠-’ÿ¤iKÌbÚ‚3“Ûd¯þ•3Ãýb“åµ`R…@¾ÉB•Ò'o–`>¿3~ág}“.<МQ-§… †´×hÀõùN|Xé¡y~¥c¼gƒ˜ í$ÄX|_ŒB%˜®všFqÞÌc¢zîÙí‹À ‚ƒ¨ 'BÀ¤ëhaü¬(„@‹BH™ahDbj˜fD,9,6"ÌÄ�HKÅRŒhZšéÍýQ¤±cÒ1¦©¨™G¢´0LBËC!XJïÝÀëy Äùw¡"�Ãö´”8l�‘ã°‘™¦Ì0ôyª“{�ooG¾Jè³G%h; %¾€Ä8쑞‚2ÔÂìcºÏVúã¾õ€l͘<.AÛ•1?$ÄᨶI`¨MôAاûÈæ×_�«ôÒ¥ qÜ®-Õ¬L¶*`'M̦öznVÂL[äɨ�ƒhÀd �IW'Ðri¢Qò¾ýê'•6­šWË©)z`rx&6…(á#%„‰ {-‹À±—R@F^z ˆÇi_Ë][¼öö{oA>±Á³ë+ØÏ8𨀒ãú•å-ÇëóöJ©xÈËÔâ’,7�ÂÔ M-µDøxèm®–²Ê¶¼çóF®¯õügK`ð„ø•íªGø7Ê#¯xõœ¡–T±�$4Hü•tÏ]KfyéÉ '}íEÖËd¡{ë³{E>TÞç)˜LŒ…ʳ„ ;)ËAU–$!ÙÚ¼Ô¢A�FÝëË×î‚_húŽæg\òM|ÍRÃÜ ¸~À$§K>åĶz—ï÷�´&h»:ðÁ‹¡†goý?ä§äѺ߫m\ó¯Z±EÜ®ûÃSVäÛuv2„ÞÿHý‹mƒ&QTrv·;ÿéÙky€î·N&S„£þ9î´�ÌÈMßÈx\Ò$gSu8yànÀ„Š'mg!͖謊ӥæ­Ò SðVG~_¸«˜Dáá èVïR×ü­Œ�w£Ð5‘B wEÑ«ýÑ[Ù|á/z`e¦>ãb¸ço3'fÛ»ë|sÚ"\òMÜ�¢¶ÁÐC5MÅì4oWSf¡ŠšÒòP5]¡Ç5òûŸôÀ$ �ÅT³#×Wœ÷î£ 5öBWD<òû"úØ“(<ÙT¹ê¸S5«RRÜ…zTO>¼ì-�eý2DÚ´�„X›^Ë�Ìšiö7 aŸâ-¶oõ ß© ù+†=rû°=PûfÞa±FÑbMWRW(æ6.¾’akK/3lt2§ÉB#Þµ|ñË{æ;…@~‚…®L줌¼¾pR<0‰‚cøÚv³¨Ÿ¼“é�ÃZ6ö«�¬¾c�c bõÄX “©¤w¬VKÐ^¯rìÂΤ �I”] Böß"!£|Ûy„,¨ bÈEM)1äLOBòÈLAö¸¤ NúÎfü�oÌ•ðáê&Sä¹ûN…1Ã#»/¥=0‰²û7 ·:‹”w¹Ÿ¯wÆ€d6‘B H&±ÔJŒíÈí‹[L²è8i¬íqŸü«é«™Ò´]Í”`Bk{Û§øóÅLéÙU©b öÑôør*Ù¾÷OÔñ;?+&Qxö”Iy`µü*Ï!MÉ#¿ƒÌ9Ö‡!0QáqÓ´…¦¨-mÆdÚ¸èl€%4±<g/�OÅë¯+ÒÜŸÓµ´�„‹!�QØ7¦+��ÖÑšeaÚ”hYZÚ³,¥ q…»P[ah†‹1v¡¸k]HcH™ØZÑø¼åh/I•ýa�ëæ�äÔÒu´�„Ÿbö�iK`(w4ÐÂä)Q-y …ˆ=ì.ÑSѺ‹y*°oO›eæùåà€«âÙ™…@ìlzÚwëåe}M~¿ƒð³þ �Iiaþ–(„–¿…B�;ÍÝêû— ðvaj¥o:»èR…Àm'!ÆV¹ÇlÁÍËÒ­oävnfÜ!0é¢-¸W…�®Æ‰Rjé0-µMì0šÚæ“ñïv=»¼|¬Q Q‚ µ®HŒfЈBh4D¶Ë}ZÚr¹™m0Êàèfi(ÓB¦†2~šF‰®Ê*\Cðû#›˜½J0©B Í^!•,?=À€Iž…îÔÌ�ú£~­áã>”¤ �Z@‡q1rû"ä“(ºßp{Ø>þ�K¢Å7x\‚¶“ÐÒŒÝ�xÝØ˜ÔéZ&µSýÜ^ó€dDLÐveDdÄÝì©ïÛÒOó1HÆÛ‡‰y” 56èבúA¨›!0É¢ÆÆ% ¡Åó£$;{³¨üÛö2ú�b2E8Ȉcîõ:†%CÛ_l'°>^óÕÀí@n6ÄC\’%R¤‰ E�ÚUàÈî‹«@Ô¾™.^eø·\–vM|¯Çùcö~éí¯ùz\LÐvÒ;CšüâP }ù j*•”…U¢²´ˆ*¦,¬Vvßmcp{¶S¹òªýTùMý2~” ‹´�„_ë';éü(½?ò;?3ø˜tá�D›‰2(ÑfL‚ðGjl™Ö7,¶ B:ç¹Ö-Ì,Zuùñsü\)‚I¿ˆ(�H”�ÛÁ7—˜à,ô&ÖºIZÒÂÜ$-Íw{2o�_©]ä¾ßd q<ˆéòÙ²oýû0¦Í7B �i£’BÑHý‹ø#Ô¾‘¯ñøÎoyį„ =–þƳø@°&h; ± «�Ïíá‹.óÀ$‹+ç.\&mn&=5Š9^Üd!pUÔ~ºvÎõ”f]—Vm&C?õšPŒÎ…lÇ.HëÓŒƒ%IHéBc¼îúâBÓ|w†÷ýÅÐÇ(51ÊÁ´�„Xò/NK÷‚úÄAB |èB)òPŒƒP.ÇGn_\Ž{`Eg'öS„Yô­×lµÇç2îÑã²Ïåùàp»é%èb…Àm'!Æ]ÛÅ®ƒ¦©×ÖÙ„�™QLEÙ±+Lá£å~…ÂpQZ¸ jBŠÌA«#s4ͳÈ´š&wòÓ®h„×û½ð>i }s�¾ézP³�DiaŒ(„ƒB°|”›]ñÝz ÈÉ"yjÙòÚÂ~Ð¥ � ÚNBŒ­ïû£fÒ”rËÍÛ¹„› “,:ÒÂxQí…�†°¿Ä€!­¿XÀDämÖ§åø¨…¨:8ˆL¨¨õD¢´ GBŠÃ!BÐ'_–flý¦c(œ]¬Hc(€/ a¨…'ò“UƨBhUaˆRxÉôœ¬öÇóù*ä#…—0AÛIˆ]„v†8´Ó–ÀP Ùaoâd�>÷_ïÇòʰ¨7üÛÖo}|K�Sú— í$´D]¹Ñ¤ë €IšìD&þ4™>y‡zÐìOéBÿ&u¡ÿƺ}¶çjWïbâ±3 Ð… q4bÇÓ¢�Ms;0YÚM¤cvf=.¦¿žäjt~±Ú£þkHÌ�¦1fÕ EçŒü¾ˆÎñ@í«ùíë­�IÞö^Iïò|�’i+ò»<ŒxÒÂsF~_„çx`…—®ïv¸n·#]1:XòMçÅcø# û1­(Ä•"r%Ýê)—ºwÚÃh°f@ŽÇ¡ñkf=°ûª.i’SÇÍÎÙËkà—±]ÞXûÜylZ> /÷¶1²ÓmÊã’*z9éªÓø}é÷m¸¡Þ&sŽËÃ9¯hòÈ7Ôž˜xöàaòÙòómWg$]ùÑöuÛë>eÐÂA´Ðˆ@­/¥…[jQmK�B°ó½µºnëóÞ7ÁûÖ”<Ôø K´�„ØÅù^ˆC-ôª*!CM¥äkný¼¾ŒtPÂA”`B…À¤kháFHBÛ¡Z‡áñƒØaÚñë0å¬Í[<«ÑÌ›�ÕÀáÚ½½,<½:z蛃ô� 5 ás÷Ó"Íò�í©uÜ÷;z†@ºñbšªàäFU•trCU%lûácÔm?Ñ‚&<;IÞÍÉÚ÷ß3ÝGBǘLŒm#IK[þ‘™¼ã÷°$‰-xÞE±ÕÛš–¯CQŠgˆr²Åk_ìȹÄ$mkêÈ¿ ùšê‰Õ_YÙ­’MÝdˆ„¸MÊ.é‚zRà#‹"H>2AZ«¼òÔµŠ)]°*ÉÛU {;'õŸ÷âp 63M qBrý¦° ˜ìïhAƒ´@Z¨&kO™µ>ÜÊ%¼�+ëðz" ];¸� Ú®ü i/!!5X·…WÏ{;·šzôv äÝÊÞ?¢)b`‚¶“ãY7Sñ<ò�ö®xL˜—ß»éøUY_ÀñGKÍæšnfu¸¿Hær¸ä›NBŠ^ÕMSy´±æçÚй->EËD `<³³½X×}ªòt¼ÂË:îgTReöd|ƉÊ3U´„ )ËÆY›œdV* N“¢ÚƒsyŽhSÖ8r2rL¨˜ÄaÈL'œ,¼½û„YÆ·�„÷¥¼þj3] 羃Ì}&VÔf`µ1ïFìC-ïæOöáòh‹áöÊ)Óúд]õ!Í´•üQ†_æ<¿ž€ù2‡Âk¦5òû´<0‰ÂóÕ×¶´·[æßõ�é÷ Þ(À{ù € ÚNBìÒàeüæ…àñš{>ø„_7ø˜tá�Öz·�Çû³„…ðÀm—B@¿b—hÍZ—fÍ1NÎvÓÆ>Ëvƒ|ÒÅŽõò'77‡˜WB÷² Öº ;ÚKÐÅÒ,Ƙ'Ætµ´š€ÙFo¯òÃjbµfW!P;\WñNÆKÐÅ’¶@xì‰iv…yg¢]iygÖ®0îJ´+-î 튅Aá$)†¤i“$ I‹�C¿DãÖB¿¨qûµ66>dgª¬V“];›À'ñlB pÂ�)) cÁDei±`LYÊ�Ш…/î„<0‰*eh­îÓO×1þöǤ �Ú»÷À›ƒ‘ÛW˜DÑ/^±©á¸åÔñqq¨ìïYL¬ÈO•ñÒF»‡ù}qá�IžV{‹KZ7÷0hWΈž^­tiyVsºcݘ íʺÑ�òDS�æÏî⽞7Ü>C@~cGGôëHý köÀ$Š*™�wd³¡>‡àVÑ ‹žÜ¡æŽõ˜P-Å·�„_éBûõ¤ W[xèx‰dùì Ü�OK ¸Ê-��}gˆãpOK<­ð0ù´ùù6ý´b.k^†íÝD&TK²6=!ÜÊih;9�tUÞ�>¿>_qš¯X‰ö*ÛÀÿ}×à´�H뢣zâÜÏÙGvagš �I—há] („vˆBh;oì0qç­õ˜²ó^Znæ}êÎü¨„ƒ(Á„ �ZW$J }~QÍçG!h‡Ý×}ÎÜ�rôŠFºTŽ;Ež–¸–y˜¼–!?M¡TU-iµD×^mE¼úy@ÔTÕƒù}áAz`’…��ZñÒÈt#œÑú¶“KÔÁÂÛ\Ñ3Ó®sYiÅø Ï…M ¬vȬï0‚¿°]‡KÚd@ïg»9ÙhðRO½¶Œ—ôhl!Ö"ù ;¼á’��MíòOZ¬²Ú°dI‹ƒÇ%h»š¬ã_á¢lÝ#‘WVxêF®£l4àrJ5ó•ÃhŒ½0gYsP9Ðy-¥ õÛÚƒP5‡Ýã´]8ìdº–Bö6õ ôÿ¼'nR…@îÿ1·íq¤þ…!{`’E�÷¦rbš6µZüм7µç2?,W Þó¸m'Òb[†ü�•´ÕدöXžUþõY´ÞåU‘b\‚¶i%J «®k"hE×A%|pd&‡z˜ö½£;ê_Ø :² !È�- ·Ý¤Þ^WU¨$oU¤ÈÕ„¦©)¯AÏ26·¥ïÌ%=yX‚6®)?Ħ{ñrï.¯¥B ýx6‘B )ÄÉAZEGv_¬¢˜DÙYï…+œûÙ\/˜Ê "3óRH¶ÎÛ+„&mo*&Sä³6Ú�bS#·/lÊ“(úEïݦq¾‡8Uo-½ÿ �S¥¦a£#õ/÷=0É¢f#+AêU ñìÔ{~¦‰¨¹ŸÜW©áz ö�\_y¯öÔ/�E“p¸ä›¸AŸg«óÀ¢–}Ç›DN³¾ËeË9ž»/V‡KšäDMÁZ‡Ë¶i)\"7Ir8îe«PZìðAw8˜ Mv8îÏņ9¢°Ïc°|^ÞÐØBz/wœ7Ǹä›NBŠ-îîGVÎ> 3‹8ˆ L¦˜ íRŸž–ë]&±SIÒI¨Päf6w„&9üež­¸^ÆÞÇ�ÆaB…¸¤šæøx»VýÁ®©×vqí¥Î}û?ÙyÄ“:OtÅHç�w_^7ªiK÷”`ÑÙw™"]t=©‹éûaG¸Ë­oûFnr3™B\R%GRèj"hž!ˆ 8##/Ýñ8í{/üø¹úqÛt{ÅAäˆs3úÐpüpޏ,Ê1ÒÖj<.‰rRžÍã�–¾…D©Ìw¯cÄ@.–'¦v—ǩ݅ü|í.º|ÜKæþ瀕p%˜T!0éZl$Ê D¡ÚÇÈM?ãð8é‹/z+ÚHáêdBÅ0íÐ�j 6˜¥¼oÁ剭�â‹›hLÐvµ‰Ž…ac^"¯ôª²7ßZÝ�I¾µºC‹¦ \¦ºM1âŠú&ª£O£ylÔCK¸ÝmLί³ Í‚.ù¦«Y!üN²&�B\™°õn¯°d3Ø^Þ¼ä¤0A›ì¦–=\ýšw”=zdÞíÛÖÈ]2êÍúá¨ë# €IÕ/±÷çjù¶[ÍÛ`‚6ÙÛ)§ÕUË¿jC°�ƒ¨éF‚X—d7ŽŸn7L¢ðì$(T2ZˆI%ôŽlnžÖý±×y%;�û2x\òM\zj7™¯vß{pOÁjM¨¨�6-;âò´ ¸¤ *L“x¨Ôõίê U؇8&lDÇ}/�¯Í|Ô×é/ ÂY¨ÉéÉ =X…“:G]?K ö�õW‹�é× r8íûqhŠqÒ\@M××'µ/äÚÚÍÛë/>©á� Ú¸E€ã·XäáÔÛŸC×÷Þ €š^Φãdàøé³“,<,‘÷ǽn2ñ¦Í/ð¸ä›t¯`_ë¾b]Û Ë½”ß«aK‹Èã¨2…¸m—†æIᜢ‰ M)(‚bų/ŒØá¤ï½p+£FÓ4™bÃ�ÍÜ“Ú[Ô³¥¸è"x\‚6.µà‡M©ygp»s¿Ö�3Ÿ'�Ù*z ~•’Á�í¿ØDˆp’Òý˜‘¶®�“¾ïÂb½÷3rÓ½&�ã_̺oß,Pdš[ zöž¸é%ÂQ¯�ɉkùH[÷V¡½xë¬RÅ@mˆp…ŽÔ¿°L¢¨¬Ã¬öqþÕÞ¯÷aAò °©&Âщ­åØõ#mÝd<.©râ�Ö&”½,+ž¦jÁ´]êæÂmjÇ‹ÛËJµÉÞ´ñ鞣Ä0Ô»©Fà'w"ÐZÛ­¥•[ýBLÐÆ… óÊÍöN%Àw¿X}W˜X!P3>ðGê_Ln˜dQc âȨB(ª—‡™]÷å1Õg?¾÷M†§™ ×Ö@ü ƒp8éûxO,v{ôÞº‹ápÉ7Éݰ´ËáWv¬Ø — íªâ_ÁçU4ꚪ€ÔÜNŒß§‹š— �ŠðoÿøïÜo¿Êÿ·þÓùë_ÿå�õïî·2�ݧ_ùÇ?îõ/wÿu/…z¿îûý÷žÿrþñ7ÿûùÏÿóüÃßþå¿þ1?ï÷ç3ÿð/ÿÇßÜïÿ[iœò2únü¿Žÿö/µ5óŸóXëûÇÒVj§µ†ù§J0»2·÷¯*pyýæ•ÿ|Ô,�Îß•¶¿»/ëïu}þºç¯®íÿ_Îøçÿ÷¿ü·þ¿�òƒmùdžþ©2Ÿ~oÖðþæþ?ûwÓóY"ÿæþÇ¿üíüËÿùÇ|/$;æÿç?ÿ§Éô~è¿ùKUbFìE5óò¼Ûs�Ëö¬w×½åxµL÷¾Gè¨wË?ýñïýsVø†¿å)µ>#uŸ³c{Ÿý�øõ�™d6�< –òÈõ½r­ s÷ÖÇó3»x{,»ò5¡·L{˜{·©ßû¯ÿ•ùf]üú?þJd•boó¾ç…dþ5•°‹:Kg’ÅpÊ««Õe�ÿJ”<™*¤#ô&=—Ã’}ÓÕú×"…ß–þø¿J§•´Î_ÿ1[æßÿQÌ"ÿ_îÇ[îCEAÚ·æ_=Ÿóï,OyØ¢ód6y•\†Ç+ÿß·½5—<óO·”»Ô5‚9÷ÄRB:æµ'Ç/÷ß›ýÊ·½5—W Û{Y¦ZqašŸ[ã¸o­0³~„ÙÜØöþÕ\†Rët0yì„m'é�jmoR[™ô·‘ÔnU>Iå§Ù‘²¶RyOÛ¤}‘zä§O]Í·õÞ)ßö&µ/èÂG¹\Z?Iå]b!>�jmoR�RQÞéê¹mv?õ†åŽx®Ž”µ}�z®åŸ¤òdÑÇ|‡•:‘ó¨«Þö&õÜžýÆï=Þç6ùuØœ;âétÕÚÞãùVž?˜)›Z/ ٵѩá?¼æü²nK3Î_uA@Z{ž]‹›?ݧÞU·ìÆ\ù—[Vï\<´î^fyuÙKa–{šyf)þåßM/' ¡åVî#³¨µX«©ø vË­ˆ^æå*Oh•ÝýŪ¥d¢—9m.yaϯùÕ³¹µÌæåغ°»½¹ÁR¶,‹•#š{YD¿å¶”" Y9ypÏÖTØ}|®>VÎh*¸¶²|Ã-�Ø=�ëRä™]ÜÂí£çˆµäé·¨"[t›“¾1”=s)KнLq  ,›syCt+ SŸ‘¾a—•´”!‘GÄczxCÁÅu^Z¦ç¼í}Gø ¿¾çƒÛÓ¢]×ü—õþ5»Ûž}¯Â.¯õîM…±{–¾[çW-í¯¸åµ¹|Üš `nƒ|ºÝÃ×Zß–¸ÒéÏó«9¾f*+a÷ö:»r©õ½mv~[ éØCö}o¯¡1Ü×Üã—½Š ó'ùexž0¬ó˜u~ø:�ß}šºÇ÷gøÝ³•NÖylð}8D�_ÖÈýOt_çW<(ë¾éãûÊIÍ‹çè^ÍŸNXo© Vµ¢WÏ¿Zì¤.C–’ÞRJåíåÀõsW°ç­ì¼UêÓb{�å#5ëu#PH¾é$D¥t³K¥½Ì¦—Â(ÀmWBÄ¿Z¶$¿Ú®l½w!4òcÛIˆ‘dÙ¥ÖC-_x_»Ç<~óA¾Ù¤ �šæÙuѲ>—z‘»/Yö'ýš¥¬TKž÷²)ïÊ€ ÚNBŒ\ð‘žpìô.`eÇ.\ŸµbÍž à9sãn¦ªG­–IŽÆ0×�Èã’(çú°ç}ö¬±¶…iH»*!ÆIß'Zñš½3³Å¶jª0AÛ•û8·”7 òÞnÚË&|{)K`èÛNBL2ãòú†)áf§:¢.A7cð {¦ ¥ðÓº™h*o°êS£ƒ T`206Ö¨2aÌŒ¤å¡æaI’tÓf§ä{qךмäU%ŠqÒ窣l{gnÚËYðöÍ(óÀmW£lŒ©UPù릺�Ξã«f¡ÆÎ·�„×UþÔrh¶çíâþ¸˜(½L¬È'JÔ¨4úGv_Œ~L²ìÛ­ž2ìóú{¿˜=qÓL„ãÓ" ªL@3}r0ésiO­õ¦&“nQ dFr¼ª@!ŒÎHLj˜HFÒúäqISéëjC±ÜÿÍߌtLÐv5ÒÇ÷ËTþ�U·¯é¯q®°óm'!Æý´u²nÈú¼›‚ÇŽ9HǘX!P³uV\ï­oîåˆõ‹YÑ´]ÍŠÐ…! Æt%°Ó¬�y~ÚX¶cò:ÝSgI�KÐv5KbÿÅ8ì˜*•ÂPëefíå&®,Òyû4]Lß^ &U„£ó7*Tš¿GfúîqI«;gؽ81Óã¾´‹/˜MòoÖú¬Ìã¶}Ì 10AÛIˆi3èÈí‹Ô“(:³©¹Ÿ¨ç<Ï«ÐwM+ò�õ3ÎÆ#õ/¦qL¢¨Ê|9ïåþöq›-\Už..ù¦«É²öR‘èeÙÓà mªù‘Ìô2é©Tû~”§ ºH1,AÛ ¤ÔÁ6rûb°y`’EÕ‰ƒÆŒ8îm²U$W5»y.›nÕÓÚFÃú*þ¦¹U{bõWK‰¿É¿zX½ Oý ÔM5!0颭qà~!„jÓw²ÐåfnÏ;•ÛöÍ¢î� Ú®uïìÇ(˜>L17i*ÒüŒÉ÷åiô²£á� Ú®\ 2žBöŒ�'�¡ÖÍL[ã¨ã.�Wƒ‰¹ÄtOò2ÎfETm½º×Œ´÷eº¸^yX‚6u½ŠPËj·¨uvß_¦3Bˆ®Tåú¯FÜì�ju¥ò¸mW+馇‹³u”ÀP[éYWeª%l>úéx`^ &U„“:B›®G^útíqI“[ó3nö<×>oÜ.û˜ �Ïè=ß÷jø1cŒkùA h!PskÔ5¤Ô,Îö[ì·¼†x`‚¶«5Ä[UŒB{1] ì4ãÓ¶<³­5TaiS¥¸®9\òM|Ucý°_LS1;­�ëÑG�<_‡ê%8¨„\åé¿ [ÜùõË„ �|„‹¡6©�ü¾˜Ô=0‰Â³Œ§°—*•2 I¶ÇVšÛd+õ´õëS¿vçßl¿çòÁYûï;옠í$ĸ?3RÿÂ7ñÀ$‹ŠkЭ†oWQç¯]LÐvµìÆCl)1¼ÅØÊAàý‹!Àmþ¦ð+T|B#/õ"ç±Jq›í }¡ÍÒ8_ž«�ļåX¿ç€KÐv1Îý:{ËÓ2€ð,Ä{@&Säg!èN)ŽÒÈí GÉ“,zv0ëà}Ì}åC¿ÖgÓLÔ&Í-¹}áy öÍÔ-ZöÇ諭©ÁЮ—ÇTK9ìóóUà]ÀQ»ZDS5C»ÒÞKÇ附™ML.Ér{J¸EÐö L´uG]ßÔ¾‘�ïÛ­ Ój¸¸&TLâ, 8ÒËóiƒf�-ÝOt¤— íb³$ü ®ÙŒB^𨸗üf“*^’$õ¡ûƒÄòXkÆè|·¼GÕñð¸ä›d·#†åŸXÅÓâ:¼vÄWZ\OK¹ê¬°má[ðÿLQ!�nyˆ3)í.àkÔÝQƒoã» ÉqtjÐG&Q§t}]kèüãÞŠŽgJs;|ï@–ÇÍí�T‚¶ÓSbk+h×±:+3ô˜d¹ã.V… ;ϱ� A {yÞJ冟öŠ`6Ü"Ý*+#Ë­÷êFfº#ëqI“[ZQÀ©S—â ú¶«EÅ)jyì%ñª¢Ú±ì;À 2“ �š/–˜�ã¨ëΓ(*qŽ–ÇV¢÷mî°óðæaª qtãAMÍû8ޏî0‰’J›Ÿm©™âåþЊD‰›�KÐvµùñ1h,ÿ¦ÖÚ¨ÁÈûË’~lxyblÙØ—fík;6Á½ˆßl™¢BÝŠàÆMñŽ™>â˜dɳ%ÌÕ>a(d(›!P›P¸]Çs(Ž#K˜|µAIüÙǽ¹—·ß·…{z�Þ„ qô<“î€TÞO=ê9åÚj’‰"xÜÿÏÚ¿íL¬#Íbà}?źô 0m•T%©n ÌØùó66ÆGs5~|ó ªŠ¡ÊPo£�^kå§Hf‘™‡ e £&°Ø#„åÙøhw}}÷OjP%=$F?Tù(ûÏ£7zô@>Xô£øóåJÏÒ åGoÙŸ÷(õçq»ø�y–»`ÖéûlíaKƒ 5lIŽG£†Ö=ÂÑBæ×o[›Ù½=|ˆ aŠ4³B � é|óζS.€3ÑP²©×›ê¶rõÉ“ÆÐVë•&ýZÑS“U3ÉlÉ{=š·”'᱿‹Î˜È®œ1îM€åg^õ2®í¹|hR{^–ˆ26›^[#è/�ãââ�­�zõã6wh5£B ÷Ǽ2º"M‡»ÔóÉ®µ?ÒZ›ä!ÐDÓgÚÿÕ™Æ.ð2љƟ ‘«ÚORäJ‡|b§]w¦h¢©l €·BW¿Ü´ ÄÑÈ—.ÍÁÇ@tðµ€ÙÎ4Œ‹[ÏÄ3T ±q—{ Þm}{7Ô85þÈÔh&…@m‚£ÝÁ?Gëùn¸rí÷¦òR²ÔTÎþØZ{Õ¬h KD™è9ŽÍÝp=ÐDÛµhèÕ®úJÊá�ÈxÌ‚+FågöæŒN¯ÏÉj©9æÿzeܳÍoc½­s´IˆäãÔÖUN‹•ùÚ4šÎÜtŒ~Z_…@^bÀPJ M|Ë¡ �fºš Cs#2q8ÓF¹|S Ùô>mZæãòŒí8CAÖ…ò­¯²îå�ì³ãÅ@¾.xeê"êqò"Š zÙÕ" ®øóÕ®ÊxOç~ éß ÍªÈ3Ø¥Ú;8¶wãô@�'»~A¡\?»\ÅÀn7›B��É+Aà¨[�y=ÎD;%Ó‡[ªƒ‰aš—]ÄÆáCøƒÛÈ(Ê…¾c/V»³w+—l·Î\ÚWT·i=.œ��º½X!Ð@Æãs¶ ŸüL¥¼f ¶ÏÉ4©A {ebBÀÃä„¶çeW3 ;«iâˆiå46b¸>ŸG´1÷�6`´=ZÐÍ �<òÊ´dÉØÚ�d‰šlú«ÝS]î4[Ö‹xÛg=š!�ÇÛ˜Ba÷¨WâPh³M‰,ÇN¸Yz 6¾Zèµä<ÕTKù´Ãã –wÇËQ¦KÏúIŽê‰1Xò@Ù¥GÞn|-þ÷¶ÓèãÃfDä¥> 6¥ˆmlN�Ø”rýòþ¾5:œyÑUÌQˆÂTG른5-m¢ùŽåC·Eðî{‰è::œyÑ•ãˆc7×/“çß²·ËIpí¥ÍðÆCk_e{Úº±»9œif³� ûw±fS<&ÚŽè¦ü‚VÌö8g$øýV-Š�<Á�»!Û~ãýñY>06Õ0ëý•ªQ6V/KDÙÅ?î쯧óAö||a_¿1�Ù^™äŒ�é^�Ç™h¸VÏ'Ì�z–š8û´8Ò÷°GâÐxÙUI–…¥}e`ß{ü‰ çµÎ qç1!âÚöJ…@žÁI‹~ÆönD?h¢ñÌ —r kšU ÇHá(ãzÛŒ¦‡¶x‡ìñl/Ízž¸_£?|�šQ!Nz“ÅÌÅj¡„]¥#‡ð=n�¢(ׄÐ)ªnz)÷ìËûkW¼)/KDYr|8·ä½m>σ*…�€3�É�`~¼\àõùš2Ve|Œ×ŒŠp´*ƒá¢ Ž­é‘ Ç™fù¯�bÉÎx}úso�RÐ@vR`M[ûhÚ».èÌ‘E§¼™y™�yøèÉŽÚo¸êh¢©î[òºX.9[óÇ1@HöÀÛSL€4‘󟽊ù‘ã3”ÏLJ³§¼Â¸F‚*ñ=_ò/mïâÉxÐ^tÈ.2CÂS¹½Z€¨N÷ÉüÔÔ“´‹W&„Vn&è¡MœVÄ«í¦y35£"�™0ü’Ra¾sÕ\Šd8�Õ¯zY_éÌýy‘}ò{@ë¨ÈÓOlC��hT®Ç{g¢¡ŸíjÙ÷öÇmê>u`ªoX ¤E²©…‘–kK�´h¢áJH³¼·öM•}ê3G ih ã! I©8 ìÚ )4¨E‰¬³ ‚š–¶ƒo¯s£×B/4�]…^n£§ºkÔ�w­šªäp‘ À뽲彴ïϼëOÔ½2ȸWFVI‡“¸u–РøFƒŒ^`ëavh.¥¾ç!/—f®¥¹õFøîq²‹ŒZøn ­_åÂC—¡Á§ä ;ÿ&·y*—š‹|_1¯@|fÍô‹%»\¹¾ý"Èqrü‘ÉÑ—ìhêL—'–ލ.Vq¨ö×ô½F8Y"º.†+ZEÕ ®¾’å~ÏØêÄŸBÆì˲?ŽOЭŸï E(ð�&í)5.¤êGÙå,÷É÷ïÓ£ãeJ7±�)ïÂ56x÷ô0ÄË^?q÷a`5o5ÂјtјtT®‡¤gš�Ä�(NJ‹2Îz=$À ïÞM¤0Ò+A)ô§•Ò�e—qiº^Ðc@𨥡sºlïºZ•`ö¡û¦f^Ä=ÓáಽŽ6¦#á"†ƒ4�Iá €�ŸÝ–a¡-© é:45‡µ¬Z<\ög­snû™˜�Q4tš¨c?ªÖýs�3ÍJ)uv«q(ù¹ß’Ëßs,û»}rßú}ÞZ@ÙU�kuŒÃ`®Í¡A-2d輦°lf ˰–ýd[ˆ�YÊBSá5÷Æv'Ø �ì2ÜñŽê²=«í[~º�˜ž¶"…(Áá2ªh�êMR[öi÷]nÞ£ d´ùà‘üÀ³ÝÀ?ç9xú?‚bçz5¡ƒîšƒŽÍx÷ ¥·Èõºþ�<{‹|:N˜æèÊô]=|?4¿ˆuÖkoO�GHˆ³±ÎÍÑÌÛÄg‹�ÜÙðÊ.^îGû9yÄÛAj×Þi¯Í«h¢ñ±äŠêaxÙ…¤ôäéÕ~’òô´ŸÈ+8: ®µ?ÒZ›êÌtÃoE3@£cØûÿjŸ{ÍKðq†Òñàâ4›B ÍÔIJºöô¤!M5“je æš@›ûé-@ÏÆ¡ß#ÀСé³(lOóŽØP[aµxÚ5§ÇÓ4Ùöukë|ïg02æ[!„ioY# ‰…¤œøØ”š÷(å·jQϲÍÇ~°ô¢˜õÐ@võà¶Ñv¹⟯�b”U¥}óûù½p"ž�Ô: YHbGi4$©£ ?9¶v#…í�&šÎòŒ¯z{Êš7çcÐG§ð�8…=ë5×´óÔ>zóœû[Šõ=Ÿ[m¯[äõ=–¨Å|ä¨ýFÆÕµßX'Íø]×x#ÆÜjë˜x—Ò´Zö3¯®uÇÌ›Ä1eÄì§È®²Ÿ¾£bnãmô„æ4Ÿ@É3>³ã¼¿§³Â¨%”�‚«ô"vÐOH�Ž…oµ¿¿ èaC^–ˆ&Ðçi_ÓlåÚñ«Ú™KdV“b/�AR”­†�2[»‘kô@M'k@´ bvµ­ñæ©ejµÌc^Øê/Ùº'+&μè*í<á¾Ù†.nLÛƒY7=§cÉëŸX!E¿6«B ¯ÊàŠ*¥BÇænäB=ÐDÛq±Ì¨RŒÛK2÷Ì¡ºJѰö~ P¼Lä–T-ã86v#ãè�&ZΦTœX�wª-BBFz?Y\»ób¹Îcû™ÒŒ �<‘�ÓŽG–.³86w#%é�&ÚÎæU“â„é�³Úì㩉Â-]Ë¥—ËEÙ÷BÏ @žf]ŠAŨýF4â�&šÊFì±µpá5—VX�™ÙjV ÔòÃ|%ˆ¿ù™W{{—Ïwܤ„1[/œ®bTÏ›œïÜ<·O5œ‡Î0-™wÌúÙŸ×þ5€!ާ%½.1§<´¦§”Ì4»•¨Îÿ9¬Ãð2رÀgy´O!eÜq›ˆ1y �ì*b"câ ‰ÞºFhOJÈ“ášj<óžÎì#œú—û{ÿ|ïDÈQFB¾Qµ¿y”‰FÒEÒÍÓ«ÎÎýu+ß,(’Ü»Ÿâu 4�%¢LËyËFhéc4‚Mâà•½m/÷g¬<):?[˜•ÇúC€q4)êUñdî¨[O`{œivj!ÿãÙ¾ëžqó�ˆßÁÌ‹h¼?ƒu•6*‚j¡Bƒ!Ï8p,øÆ×OÓeØRÖCy�3�]…òøNÇ8,«´ÁÔj4’۞ǶÔüмD·Ý dÜm§®iù¤ZV¾u¿wtÐÿÀ€Ï«þ§E ª?=Û'cÖg?Ø(ºñh »rãq¡006w£øá�FmÇW¦ÇÒ>S’»ÝspµßXë©ÇK!ÌpôbåDy›BÎT;c?Z6A#À£¸<Ï[û f~SÖ«ê‹÷Ç›Q!P‹ ÔDçØÞ�D§šh¼â¸—¯‹=‹dï9aÑq÷@Ù•ã?UŠ’u+í}޽hêGY"ÊŽ©\æÚWŒá*Q>2èóøJK´DïØŽšèõ(áwªU—éPª� q¢«t*îTÞã,'Å‹7¹¼ïyªg S}Õ쟕÷mÏûÿq;0–Æœ[ÞL q¼2F\|tGå7Üe4ÑR²ŒNh3)œ’;+åâç¥|ß¹ÜÙ~0^ÅT¼Ã™]%â‰;ÁpÕo½7§í $öy–&Ǧg* ¯îàr¥|ÆA.°|‰f|ìõÃäèé‹0Z�&›Cà^ç]¦]$½½zÒ4o•å RÃw  �,eÚSù™gû UùúØaƒ¦ÝÉêÒ µD69³4~J-=HýÀJ=@œïÎô:¿™Ñ'–ÏóOïã›…�/ÂMˆ£‰~¯J+‡x”ZÁÖ¼,]jŠ=;eflïîªkv3/ºÈ¯ï}Ëš?©äŸ �žÂ šRJ8lŽ=$ÌY·™$¸VZ\Ë*OkÝúö×óà׋Ye‡3/âé;6rõätFÍý“}HIö äfSÔ²Øj®nlïF®ÎM4žmaWÓTå`ðIJsåmŸ…ë½yy›¥ô Å6*×Ssg²¡ÙSkß?èÙÌxù[{½"Oxa²NHx méù.“~­–æy<�åw=kŽZšÇ dWi|±â-Òmmä„­JJÝ‘=6þ-°Sõ`9ìi×ÃÑË3®¦`rH9ó¤Lur ¥ð=}=Šq²„ºxÚiT~#íä�&ZÊŽf<ê�ÕÒ#ðÅJ¶Ïµõ7-òb6&îÈËY£±µ 24Ñt²]Ìå›zEû²[2TK}z§ÅŒVB1Q$¤€Æ¦ä �‡™d´�zyÎP`©2÷B¡À– x?Ç c OZxeÜAµßpÁ<ÐDSq"ç~ßÚµ G‡¾Öñµúpý„IÞž˜°{LÍ­x¼ûe ZÂÎã d— ;ßI! ]�¾þ„Í©~Söcê‚¿¯ýB¬]ø- ;@�—/p?QR™ck7R™¨ýf)gƒËlë˜8×#­ØtÅš ÷ó³¯Å¿q4ŽS�–vÂeJÍ­²åM°œvTH¶Ã©ÑSgKO™gJZhLÔÉy!3�ý癡¹\_óîïN!Ñ2C4�]e†ÐSŒqÙê›ó¼— túŠJƒd”A™ö”:‰˜z'“'QÞ‘kÂh�ûUìH„té°ît8N„$©5L�Êo$É<ÐDKéKïòséÇš—xwò¡”…œ�Œga”§°XÓæ­¢^ªü� u~¯-ë°mg�zê‘Ëó´À+‚QædŒ¤¼‹kLλÎ4Ã¥¼K^äÚ‡9{¹EK»8˜yÑEÒ…̾ʖÿµ¸¿[™.ÿȵ9‡2'I¬.'Õ£ÊV‡ãüòŒV�ò8ó¢DT±Õ0Fái}·&N¶phq¿îh0#¤�Ÿå¤òXò±ïÇùN¤‰ùX_  –‰ã³y«1[Æ­GÜ2¿ëåt_fe¸ÖŠg XÈQÆÇ}«%Üw™úžXÌÿZüõ¢ú<;,àh^Ñë2ÖïN¹>`4ÑRˆÂF; ÆöjE8Ó‡Ô©òyaÑ–ND¼}! îSÌ‚“9 ­¥ŸÇ)q#ýì�tbÒô³à¿çí±y»¯ý(8‹þ; dÜÁ&›E"‹îì=ÌR_nžßK y‹£yB«6ƒ&êØŽªeÏÝÃL2RIî‚Ùbr—ý\'ãÉ]¶¥ï-H(× =h:ÆöÚ‡@-xÑŠ¹�¿¾KRí¡ÌIÑ£<ƒÑw›¹±j)�§1E8ºPi="Ì ©ÆB%>áï&…^) ‰3Lª”׵嵿~ðB«Ð@ÆSiq’¾üºrßñZn�¾‘¥œ�ì*O.GˆÂ*EõÃæ´’‡�§/Sq.~ù×Ù!)O@ÏÓÓ-Ög æmiqßk;SdRª€²«T$œG›‹/4§D¶0|%¨Ùˆí|7Ò=­—#Â�Ä‘”�“³1f’ÙdÙæ $5úîÎ])AB\m_¤)¿¿&ÛßçýwZa €²D”]Ž]€CGº�^Ø æ•c½,¤Y«¥*BÏE‰¨ºè¨†;l맸9m·¦kf¸QVÿd®§/žß±¾°Ã’b(»ì«gÅm=¡2ì±d�í}õgÚvM6âÁî›ÙÙ̺wiÁœìŒRý:X-€’‘ÑŒ'}Öqp ê9Ȱ¤­gBb4ï‘íËÞy²¼žÝ¨81 8™š-�EË^>:•ZÊŒÎ@v•…¶€ƒìtOL„íI™n!/‘wë#FÚ�ÝWKLÎ@v«ï¯ö5ìó),éù¬C3!ÄI‰\9åzÜ@í^8´s=O¶nëqÆnsqúŽU¸û³!Šn£&¶ÚäŸQ#–½h]S¤©>RÐt»½.$�‰Fh¤3jÄ|N»,Pû�ìŽÆ9;¹õ;WÏéX'HX¶Ní£—å’¾þ]ÈÃ2¯ŒÏâõ}D&ÏžåÛû#íU³b ýßh¼âoö2²µ$Žé…8@u�É*à´_,F„s~[ÞK $�¿¤ˆp²‹ˆÐ×ç¯Bâ6oE ¯#ÃÑYicÿ`Éö³nïråöÚ êžù™½nuW£ @Y"ÊÔjïØÞ�j¯šh<îžå©�V½zñT+›MŽUðHáSª?»Öäú3àLµ|_Z’áìr¬"Ba¹Ï먕·iJÆi×S+Ô~#ŸÇåCmµîðêñ—+üäè°¾¦û²͘Fª: èÂ!ž:Ö‰‘² EÓ6‰C ¥l’ ,Í­?F+Q‘>Ð 'ûêTÓŽå‰c7ÇäƤÂL^¶«Æ±˜o¿�ÄAi ”iýäOAiÝ$‚b�áWˆ…Eòë%»ÙÈíõh{Þc¶î×@a¢ÎÖO!P‹}µ,«kNβÎDÓ¥,ëÕª)V ‚ÿŽäjù]-þÛ{СeWh ãùUå) BûôÔ+­�äÍžf=ÆYÒ�ûÒ_4!É @ÙU’ׯF1 CжD Íiñ‰�â-­UŸ#GS�3›*¤xh »Jñ’ž Pèõž ›Ó¼*â`ÿæãBÓ]þßldiÅÂ»ÃæìÌëZgY‡J⯞%z|¹´¿ dò:Ô$âW3jq€Xh*�5`9ÉÁÜ´ÉLqò@ÙUf-�v¹…nÍëoê°Ôþ‘¥¶O“hâºMÇè÷î‚‹Üá™{’¶\Ò:d9ârÒlè‘ÚÚ¿àký8z†®Ç·z´7Üà dWï8–trˆ»—ÞÌ?ñc PÄêAýo;–@ëaPrºå¢àL³“Íç<úå¡ý9õɉܼz=j dýÜÃ,9×+SgµÇɳô²«Y %¸¼ÚÖØá<±ç™¹P[ë‹ôOcæÒ*T§FÕrùÍÃL2’ìœQ:_á–ö²ðÒZzÊíÞå©2üÏ;x �Œ¡-5åCšu9xõ¤¦¸Öx �Œ¯6$1Ãò3¯šÌ.©”óEWšcés§KzHMÍ݃ˆ&æÙ =•ï¨gÔÒç°`±m&…@mÅg.{ôK°†ÓÆ)ì©DfÔ%ÜÏ× 4±/ÙÖõÜÚ¾ŸãÚýMKy—zÔ¥¯HÎs �×¼2í)¹®ÂÔ�²D”1÷ëµéüå8½@Šy le‡åk÷Œ�¼Zà•]$ɇ§ŒÄ‰¾\@Ó‡tá‰5ÑíÈ¡Tœ|�Ê%' ÍtújHyW§W“¹­â@Y"ÊhF#Dá¬íkvØœV0£Žô³•æ½ïÝXÛ}æþÎ…@^ÝðÊ´§äªS¯ùüøTùjÅ‘N?H )<Ð@vR`rþõn_ì~-§ºu©‰¿ý¹–ïCŸ¹žÈt^™RŒ­é1…Ç™h¹VÍ'é�z¦š8ã‰[4tg}}¡âã‹pͨÈK>XÑÓªu~ÜåjNÕøuoÞ²'�éc¾Ö5!N ;yhT~£öå�Ú/dûjœjô)ÔOÇ9J…-™Ãc¿Ï9ó\Zø9¿�[´ÅͤÍs �ZX,’Çæn�=ÐDÛéÆ:—™Ÿµ¿{Å©ožmØÌ �œû†ÔE!FÓƒ4�3ÝðµWË|V²=ù­fC¤$6»A=mÔ~£ç�Úo<ž*§×ÊÅ|ËùÔÈ ÿ³÷D¤œ îÌB½lÔ~£Ðæ�Úo¤ë_˜,ÇÕ¶G§a–][º…"НŽiE¬©yY"šx “n-­½J†Õ_ÉêÝôÇËú¬*†e«Aù�r—Ùf'%�†Ý‰¯mëa´5€º§aöß¡nV˜ö×^ȸŠü|ÕCšå ÏW�yÂB²GÈøÔ'Ûy Ëϼë=-kyÍÏ÷Li� ±W&¾j¯©^-±ænß÷¯šÇÈø«FÒe!ªÆ,[=Öñør]•æ˜/é•iOÉ®*S?Ê®\U2\S[^¶åë0ýׂó‡ NÏ–8iÑã3;¬ËÔÄiq͇ï0I¶÷yeb}å¹rHÜKõ�3�%ÔUy«—A•Ó =°† ³¯(õ¼oä%f,OIE–±¹EÔ~´–Esß7²ˆh »Ê"âÌžªåû¼tæï|N¬Íì¨eæÔÜæØÞ�ܦšh<Žàs=2#�³Ò‰—¼@·ÎüE&��<ñâ•©iƱ½iF4Ùø×«ÒdËuMï311|¾°Ùá(SS�JöÎw§œ½Ãqð2={‡i¥± ôÄ™ÇIÃpùº{µ£ùõw-Üá½,yMÅ © Ý£3¯u‹Þ¦ì?/²BËôï*X¾z(Æñ¤�Ó¥&ÐLΟAsNt•=SòTyØk")‡Ç}=ÒòTh »ÊS¡:˜ƒj]¥8Z:k©[nÏó`ÒüÆÞ:&rúz ;§n¶½câÅ)[ÍRFBKŠ’e^c'ÜHêy 6<×”qÅéÙ³Gõ1Bɧy �ŒçÓ4¾Çòl«ðûó‚i|4�%¢Œg#ò°nÿ|}‰ž”î=[¡¯E¿q¼r�Ì…ÿ14vƒþáp¦Ù�ó:sô£ûNÍ)§kvH¯©›xI³–$Õgeh9^–P—–²õѧœ²Å°ÕË.S¶>¹UnØ,9±yê°â¬—yxžÙðž}[+#œyH¬¢ò#[‹næçWÒFh�…$^—ö”®1õ£ì2\‹Ç «÷â`iÕ{6\¸N¢‹>¶÷GÚëY¶hºñaœ ¡øE#Èr¾“^ôe(|™µX…î·C>—¥çÑÉh³;òÚóXâ4³\‚Àü´fªV‚Èþrç_½nU μ(UÒCè|u¿>V®8rRÉ¡|¹ôoöŽÄ¬Xrð@Rê釸º|Ô¹7=Š“ÞD¡A6‡¼2öÒ/ËQ;89X)‡ÍKHŸ‡ãsâ8òJˆW¦=%W>˜úQ–ˆ²‹Ä^9j_R3« àîi½Ÿ0ZŮӊ Ccz ÄÁL2›lñ1–ÖGwRZ¤¤ªÌRóïó–ßêÇž)U4�q÷–eøòO}½†Æñ—ÞW�ÆÁê )aÑblîF¥ÆM´� á£Þ"º¾Ö~1ev[J-|}Î=ÂöêÖW!Ð@–ˆ2ží‹q¸_4W_hPÛ|¤Îr§µÅžŠl³>Bg-^j}Û};Öh–\öÊ´§´Ä5Óvn±yØËç!Ö×|¾Êü‡+r£gÚê®­ò\{× ï$d‰E+4�%¢ì"I<ÿóý ä ûRÔÑO?Qœ�ŽE-ZEƒÊÉWc7ÊWÊ›}ý#¬àvÕÞ«¸Š m}ôm/Gºs ôI,ýÔךQŽÓO±¡U†ænTÎdË!½]²ïõ©õtA´JƒÈQ&LŸÇÖx~õ÷]›>g »òœâ§òNù¨eÁ­”NÇLS�Ž™W¦:fË£ÞÍXÞ†ãFJÑ1ó@Ù•cæ×ç³³ —К4Óé‹Î;ô{š1œ°šKI¡é¨D<Ïß Ç9}¡¥ÏíÈ�sbÕFªÇŒÍéõ�3Ñtë¿ë¿_($¹JK¯48Î5‚ª�R�»Q�ñ@-× 2Ë^K&ŸƒËZ=ÆÁÌ‹jâÉôT½ÅrŽë=¯_y¾¸-'JDŸß±�‡ òžÍ �C-ÛNfø^—ü½|ðñŠG3øb½—gÑ€W‡‰ðQõ� ºšhçÔCÖcãÌ-x¿{å(*~Ko›n„£ô$·qžË÷^2ìÑÙ…šÛèq²+·1"�?_'yœi]ÉÒÅññt«„`ô¯L{Jf§0õ ;‹Î !³}?Żν¶5^K¸Ë…)ÌÔk¦RÇÃWVJ°¸Ù±êÉ©"ãq²DtiOávÝßpA½²÷³=4dÖÀ~ÝŒ9ÒÞO²wq:·‚nT˜‡Öö¡ò1ÖzôÒ‡ÇÈÑ%–r¬SS&çgÇ´Jƒƒ™%Ô¤<ƒ¯KÈBÕ‹7}öªÇ«ž·\—¥/ XÜ̾\¹ÆÐkgZo²Ž ùl°K´~xpÒŽƒ;nîÊÂÚ—ÃNëøBK_= ?­ƒU¡36¦Öc<ÊD³}�†iàìÕ”|ËûåûVþØ dWùã8QûØ[�z’÷µ<­ƒ™ýwdióÏëP|³´h »ÊÒÂüQ˜=ïï\Øœ–Šg¡Ò¼¶å|¾ÐžŸî“¯=ìÿ £ôtLã* Ú¡)=?ë`&ýÓÉœæs­yáØo9™h »r2Ýëÿh»ÍG3’B¼çØL �œ‚n¨´éŽÍÝØt=ÐDÛI°”Wºº{ÎËI:öÓ?²Ÿ6«B é›ó«Ö´ß¹×S×�X®¸²ê¿K4»| d‰(£ÉöQ¹ž8÷8íj'ʇ›ËÞ—ÿy\ §�ð8Y"ºx ãò3ÏZ7ðüonÃá8?ûO©�ݨ:œiv“Í>ÌnàæÐz)ΊHû vRÖ\“òÏù«4æ¨ö®Ò- pœi5¥016v£0á�&Z.&K=¡³¿Ë ñ�^™ð8Y"º.¶ÿ‡[U?¡Amßs;Úã]{q^ç¹~CÖ‰/@“ g�`5#¬S¸¶ô:M4\ª<æúýŽ5Oȃá*V<Ð@–ˆ2ºDÅ–EÚ'ìZ�…9”á��Uºg¨ÂNW|¬,”db)nä¿ôàQ«�x �,e+@ˆ«¿¦÷ßeÉ{~uMØ —%¢Œ&Ìå›Åeå˜^ÝÁ‚ŠÊ#{ÅuWËÏ2�¤%PÆ'÷Zs:û´*×Üi®Mîh¢íR¡~�Zè!Ýàe‰(Ó: /öÒúJºØ‹õqÀç#ÿÿ<·x¨fŒíB•È«^™ZéÛ»Qéñ@Ó�ÔÛö¼µOWä _Þê»\äü ¬•I•ߥj¥‡Bška¥güùj±Ç£´hîÒþå-…ŤFµuR¨ªxY"ÊÐ�Û×[mec^(&·>Uæáöš¿LŠ�”ÔÊÐ�‹1Õÿ¨’ýñµ÷*�yY"Ê46šj„˜©E#”ømšêÕ’_ <-~ó8�ß‚ùìf…>Ÿhâc tøCò#ÏrÔ!¿*ßõ¡H=Ë«âÛëðБZuGî\±°™âø‘;(<^¤“ÿµ¤‡] Zž€Åç…:/ÀtdI×wg(r²$K@…pT®W=Nû…(ÎMïz2oߟý²#­¨çq²„º¤‡0½Ñ&­¢\È”°Lq)¸åÎ{ܱëòÁä΀2m¿§”»JÔW¦ÂÞ•;š›�»UP‹Fy½sÔ~£àé�&šÊdáN§Ué&=È’×ćê7}½žïøÝ’à2ºÍsŸkÖ¡L÷ lŠÍñŠp”†C7Ø÷ë ÃœºåDyÛ¾#œÉvzMxð[4A;ùMŒ «Ìãý8¶Ï³ê@΀nU„c P¥y®1Ùƒœi†ÿ`mÁ/Y[ä—k#Kw†¨Ê‡ûsÏ`DÕAi«§ŒWی׵_�Šô ¿=7£B 'þ°½‹ÿ£ö¬4ÑT¶?ÛÍå þÚã$GòÛPŸÐPÛ yÔ~ƒºà�&š*ÕW‡’²^^u0ó¢D4ñÅçÑfÂçƒaH‡ñs£ VÔf(g‹�ÚoT=ÐDSµªÜ4Õ<ÌžÕ£T Vå<Ð@–ˆ2í)œ¡=æÔ+Óý³? 䱽г¿–�5{zM¾Ìk^§úN¢Ì‹*’8(Zó• P¨$% U>lWÞÕƒæ,QIg KD—öT~æY/|^—ýsÇŽ¦ ‚ Œä_­–;?:Y¹yŽQ©'ñœh5×)×ë×4ÑRê}w„ã©6(N7³B =ÕF*ÝJµÆX­“ɡٮT‹‹�?ã|0Ó¥j1à d uÑ>†ÁæÜó¢QkÚ6õÞ2Âå„Ï»|ýã,¡ …bÈQ¦=U߇rzç]î ù~¹bõN–ˆ2^­Þ§š,±úzüD_€}äÕ¼£™÷ÏñGë¯^­;åzÁ€&ZÊfm^®–¥•áW*›e]ZåöLÆ 8ZØôº¨3\&C-<~Á†æþHs}@SmG]äСf„xè��*ä¾KÕ9…%¢ê"xñuQ×ze€ÚH\pTB^†mB…c„µ×ÇV/E­ÚOUª½Ð@–.j¯Bù,wæ‘Czþ»X? �,el›`˜Ùj�%´§¥ÉhôçË;�½ ®”ŽèO*`Ð@–ˆ2í)¬ø¶¹­¨×ÊÇEWÍ<í�ˆ”Yßv~ã8ece:—})jlN/ayœô‹ÅVIy§k�Îïàj%,ÈQ&Db�íQOý}Ø©Z$8�ÄäQR‡{ƒl$^¸šE!P ûĸ̵§Çe4Ñxº·…CŽÁM¯¢„sE‹””¢hé…B�*W]OwŠ¢4�%¢ì"4 qóô1 Ô(Œ­cg I¨=k9i^–ˆ®Ë®*ÙöþTÃ=}|´ÞU�2èˆÃ§Tp]sz€&Ú•r×wsЦ~9©XÊõ8Y"º†Üë¶·—õSù…✯ÖV[bœT1ë©®9½  @m§ëæwî6�SöGœ²fU„£ÄâàIuLŸbVë˜,7.X.Õ1‹¢rkž­'¥NªcÐ@–ˆ2í)ðÒúhÅÚ�ïë-+_“ÍýøZ_Ý÷�³?âœõ Môô”šê£~wüóq­ :¢l$¢Fx÷ð£;"Å’7@ל�ç‹ë/x(aa3aaì^I�{ùôñ›}1^‘¶W„@ZŒ'ï›RßuÍéõ]šh;]v|q²óõ~‰ü:7µiUMÈQv•‰`î êiˆ°1á]ô‘[[AµíöqH¦d©Óèë…�<õö¥Iz÷H…FÈQÆÓÈ{eÛ~ûó¤ (®ö\ÛocU�:­T%r­Ée"À™f9í¨W+¢<÷^ƒòe•:3ʹ›wù^á'+ d‰(»è+_ríéÅ$šh¼”Vöå5«ÌÊDƒˆç”…‡pMnÃ%(—Ö÷/·(Oµ2í·ùÙó*˜Ñ.ßK-ç:}б�g´½2Í0z›ú#MU‹b ‰vûÜVü+ò3[­|oÛók�T~¾—%¢Lè$8Ç£v’tŽç?ê$8¦v’tŒuY·éßõèF?ú‚¥‘GVðZ¿¦I³*ÂÑÊèªO-Gî½náÉ+ÿ#ÊÛûáL³S©Í€ájm†þâQ–ˆ²‹�Ìÿb<.'v•v^Žwîd¾èâÚÓ«5¤óƒVkòSÍCžû-;ÀZŸ¹÷M¤|Dê€ûŠS.—Œ§ýB\uÊ'Èë…Óq‚–ÔA²›Rœà~wÛ¾B¯ƒ8]Ã^ºnõ6¶¯bÀØÊi¥-Ê!ÐD“ã`Ãý5Ø€ßíD<ØøÕ7@ÛSûF¢í±¾ +Vc[7*Vh¢áRi¨$lkð0¿ŽËùÄÒ d‰(£FÄa�¬M%!úÓªm¬þ ´z?ì-j“ Vå×´�fîÞ™V° �,eÚSWõé-¨W‚42bå+Ck+mW¼A®Ï£¨ÑôOÊ)—Kw€3ÑP©tWb©¸µ‡…Z進D”‰ãµÖ5>Røâxy �ìj¼â§ò3ku™öìj}ÜM=’/½2•–êq�#¸ ¥b{^Fó lms›£û‘¡~!LÚ6\Lzm(;sT-R=ÌT#Ãyîû,{á âe‰(ã¯Qa�´�‹IiEW¥œúØÞõFÁmzžÄ ¥œ 8Y"º¸§Â0Šj]%´§…d4�ðnÌëLR8Z„4ݨŸ0)¨ºØ0|•tlL.®z˜Ifÿ*­–ÙW\Ñ×>�d&©´ @Y"ÊH2*Ä wÜIacš«M¦öX;- ¬²q¿óZò”+®€2�%¢éb³qè�¶nÔÜY¶X‰½.ÎqqºU�Ò…ˆ¿$•§!©–§IêR3Þ‡÷ùÅ©Ëþt˜ó·Ax~Rs‹˜yQ"šÓІNar0“¬…·?8sŠûU³F8ª*ì| ‡ ´UWáõsi†Ä! �,e¯ˆƒÍ¡wTØž´Ñ¸ªFžúu?xnÅéI°Cü‘¢{IÐÄíFa”ŠÅVå¹°4Eö  dÉkÁ ¡U"Åá¾ò]&œkÞ£„Ö]°ÚÖò¬!�3&±t®}cSúâçq&šÍêµ&ª«wy,âH›tK\3*ÄqÖ$,—Rì1¶v#öð@MèµzºuMŸö+´ÇÈ®ÖhwSc‰- §¡| àpéàÄ?°[zä d‰(I0®=�@“�ªEÁ~ú»ðRîLh KDÙÅ€¨ÚÇåÖâ÷:¸øBs^–ˆ2½Nµ X¾e~,ûÀ˃-¼×› å倦ªuÄ5'SNg¢éÌýÈ&oõŽ’½sf�,›f'1@J¤;0�v½¬ @M…šfPXÃe¯mµa=NZ@¥âϺü{ÿ&≥ŸfN’ˆ"º£E ,ȵi¶¥Öö°|´îu¥[óŒ?ÿˆu'4�%¢L˜4ÏW=Ú¸æ&{§H³Æã dWó&ÞRs×בÎQë·T4�]m©îó5ÊOÓÖMBcÊŒg{|<ܸy· -ÌÍ wK@0·W.!x?_ç¹$­€è�²D”]öV€C/£÷VØ æ²°% *MÏ÷Q¿Y;¡J,Qy �,eb5¨ÜASöêyþò‘„r�ÇÈÑÅ 2y –Cû‡f¡d<Ð@–ˆ²Ëià ÕgQØžT΢ácTóC¬× %_î'1ø¹4šjYmšs&ƒ=Ð@–ˆ2‘ÎùÚjRg+ïëá^KtN�3�%¢K{ åÖ3’z%ê–ÊfyR¬¶�T­læ�²D”]¼f!îéY­}F‡íyYB]Gþ¸\ \¾’¶œªFÒ"¸î=Sµ‚ÔFåzýÐã´_È+Ïú�Ýꮬç2?²½7X� q”ˆŽeLæ[ÒÉœgšÕdcMõ<ÅZ¾ã¼Ò€ÙšÍ¨ÈY‚Œúé#—Q·ðx˜‰fÒ­ª.Oóú˜N"Ð}lÓŒ �Z„¥}Ƕn}=ÐDõ"kÖTH$ïy;ùÿZ‘Õ d‰(ÓžB/½— ^qù¥JïZ?e9oyí\nUz=Ð@–ˆ2>b±c‹l¶L ±H� �G‡¸�Xø«5ïÚ¿`Ë»¹v…SÝÖ <šå�½jR äG³ÐsüY“›¹Q“ò@mÖJ@Ùß+ËDñeúÂ(•€<Î@–P—ô½Ú¾®(êg<>Š2èwöø8¬æhN,uOõÖ‘=ûKˇÊ;\}°~ã$ŸO­Ê�­éUy�3Íò°*_B´µÒk¨r£*ï�²D”‘ÚoˆÁ-¼�›Ð˜æЂÆtlØóÉ�Š—ß»Y�³¼Ð`‘!PÆænp<ÐDÛé:žzÅM½wVx\Vó0e�]åVãÛº�ç«~Õ«.ÁßÛ÷1¥h KD¯‡ŽÚoT6=ÐDS¥ÊfùÊB½dîÁ™XÙô@Y"Ê.|µ‡ë`ÏÆ„ j‹ª[/_[Yó–3ñ7¬‚d<Ìù‰2q=Õê¬Ù“ioöóøf¸Zgõ@Y"Ê´§pyéùDA½²V·d~ÔJÈWJ}Èò…¹âIdCΛs ÷!½2¾6.Ïë~TÛû#í5G;šn<èB†•h„F±B#âÄ÷§€à@xÙEB† ýæ± n8ܨ „V£­e¤s(Å]æ‡{e܈’(O•¨òŽ g^Ä-Pê½ÏÊGyJ½×à d T©õÞ׫d÷­Göb½× d‰(+fõnzžÙà‡uøÖWBƒZQŸ8d¯Ã¥Ù:3©gÞÉéF@ÍÕR‹Ðc{7ŠÐh¢ñd7‹«ÄYõÒ¼±åý5‚Jy™U½²‹œ*êÝ×88è‹Ë}ãè‰@¬SkÅß±5½øëq¦Y®}÷ÊÕ_/KDuûcúómü„ö´à€n¹aý8?³ßã««žYŒé•ñ‰…%ÞüÃJ.¡ø1L¬ { �,et ¬‘JFåóî#ñ]%ÅjxÁß8ó¢DT©uá±5½.ìq¦ZŽUÓìV•xç]îPkû�Xö@Y"Ê´§0èêIlA½Ái•áy/YÂrîé`1‹•a‡3/JD•Xˆ]¶z%éº�׿‰…X4�%¢L­ƒ¾‡—ö(îÍ�:¨ÈQÆÞøÈ/ÅRp½Ð�UjÊt] ú²mð„߯9Æÿó¿þÿšßïzá×òÌËxcA•›Ÿì’¿S2?–ãZ�ŽúHþ¿ÿúÿüód}�éŸò¿ãÿkúçú¯ý�ÿËš'Òòïç?ÿõßþõhÿ'›˜5dyªçYõ_é_ÿÃÿùÿø¯ÿýx:Ïû¹>ž›ÿWù¿ÿúßþõ?<Êßÿßÿ• /¦/�G•å™ÿÙ~d¹-gÙOÉß)™Ë}ë)ÜŽúHšé4M•ÞW½þ/;«Ó×Lö%âbîÿ?ÿÐÿ]Ra KDíå$ pèM÷I6¨¹æ¬ß–ê¨dGgí *¤~æ¿•bëp¡hŒãÌO§ë»kýx>—ÝQùQÞãîh¢¥R8âL—£ò“ÑU,‚ƒ…?ï³{J»Ï†�)ÒFí7øÈgƒÆ/ȯÉTqSOZ‰ü4�%¢L Ÿe}É£ºÎÄ�`ÑáÌ‹x°(<„}Þ=ŸX¹6~q×aÜÙ×¹°Ïµ –-¿qð�”…Ö5BÔ"ó†”ß‘©p4WôE%rš+†»Á§&evͪ ¶ã»T°¦¼za9§>péY騅O*åblïçÂM4>¦äh¿8ç¯÷»¼Y¤x �,etRÅ ò\›c!„2^–ˆ²‹ÌKøk0’iÓJè-,Ò¸ÏzVvF—¾uˆÜ 4�%¢L{ =âÞ7‚zͽ3U vì?²cw# æ7¨|ŸR“ù˜‹ÓŒ'käZ¯â{oç'ç=!£F¸s|ßã d uq:ƨüåÄM´TãU<+·nÞ·wO°Š¼ 4�%¢ìÒ p¸-t'$lPÛc~Ó=ò¿•åä•gëë<%Ò=<Ê@–ˆ¦�?Ž»Sψ‡íh[ ¸–ÊÃz—Rõ³kwì3¿àv³ gŸ±Õ9$£öä4ÑÔcg/�sÎå¹¾À¥žÝëúp>ÚW�[ׄ@Y"ÊÔ:ðØÞ�:°šh¼R.ß8*ãœ]áž'×êÀh KD™ö®Á}ÀõÊ‚N_±©žÜË©ó+fž_ƒ›Y!�3ópA— ‡cs7 ‡h¢íZá0G½ÅMȳoë«‘R6aæ$ÜMa¯[É`•§ /bí?ÄiõµÀ>z�ŸVÅ¢R2[»Q3ô@MÿÚÚ––Ã~½^=TùÚ>ÿÈöÙ9_¿P¦ìÂÌÉzË÷jÊç �“�H§ô»D7(j{¯ŽÚoÔ =ÐDS�2ªì¯«‘)ã‚ —%T¥–¥Ö«¶iï1´X ó@Y"Êø;ã°HÙ¦�РVñÔªtË^wÏÒ �«£Ué<Ð@–ˆ2º‘”O«–a.žç±ôé3ûYué]¾ØË1Žs>�.‘7<¶vƒ7ì�&šÎð±5¦èºw'‰¨ž\ÍŠ�œˆŠìbe§L•·«|ŠõXÁ¥œ�ìb±«ÊI±º-}Ü‘b퇦Y9Åš�3vû¨ýÆxy ‰¦²É½Þùi3;~‘œè‹ IØbóÚµ#ÞºãO5ÒÝÖú�ÉýÿGÞ—¶\‡@> è˺ð\©h„v°”�¥œQû��j¿‘òÀËýâuì_�庬‡º}‘ÌCœ�,]]5A+÷  R:!Ïíº4–ο“Mp8ó¢«\»¿9Ÿ¥$‚¡_ÕÞæ¸9ÍG«»P1iùÔUB7mðÿEË‚hì–Bæ)™‹¹Dr‹Ã™%¢Šå\BæRz?E�iy�m“ߨµ1ˆ‡^#Û8˜yQBMÊ3yî.Gfâõ•ÍTT¥ÅkbƒTˆë@ F.‰çôô +jÌ"êò…?“:m˜â.ð²«QHRMÐÈôh©6yŽÈ8:·ÄãLO¤ˆäÐp[ÚO9¼+‘[â�²D”±(=F==Ÿ§ºÃÖ$n[hW5?°Ö{’öì¾}>Ö¢8¸.MèõÔ”AÏ[ž)ƒ¹&Ç3l?ïÓ‚“Þ¥jïyÔ;5{9¶w#{é�&?ºGÇ;ëø4d× ?M€9MZ« ý8™«D}PÁx²©¿êw ʇ:û N=øŒ`뫨å%9IgÔ~ƒšä�&šªQ[r T8ÁëósVM£¶x �,eZRõñª—ûm�3ÿ-%U=Ì@v‘TUò—y[xŠŽô—˜¿ô@ÙUþ’,Ù�ú“ßÏ^eƒC+¾ÚšÀè™ìMâÍõñ ›zhhëÛjCÁLµá…ŠšÚ…Š`›<ñèzºU´`ì7¯LdÛyvÂÛÛÓz”¦žÂ5síý†p±Ñ÷´ä |µÜ^ C—3ÿ-Ý<Ð@–ˆ²ËÞ p÷Î Û“"틾rÌ´¼ V�/Oè­w•BÇs8ó¢DTQ ¡sßWï¨1-P c·tjÜzV¶¾¹rUOyÿßû÷‡c#˜yQ"š4jàДΠt0�^ÿ®'7¿éðŽ&í}ŸÖ!NsÀTúÝÐÜ ö�ÃI¿8à»-õƒ€Ù {õªÈwó@Y"Ê.®î qèö4}Ø æij4¼Ü^]‰ïÏïÞ[ Ï d‰(»¬¬8Ü zo… j» ë­ˆÉKqOZüiQ'KÐDz£UR;…Ã{Ä%"ïÌ d‰(Óž‚¥®Ç!‚vaÙÔ¨o…_WšWÏŠˆÔ74�%¢ŒOë `ë+¡=i1ýIžš×c|÷k}Dþ”ÈQ†×xÅ\“{.+lL[à5bWn¯/~Ç�)‘Øå�²D”iOá ÜûFP/-çS¹µäþÊ×°ê;‹Œ�©\~þO=]1õ=LÀQƆ×Uz´¢Ù¶ŸRrÊÿˆòjC Ô~!]pbÛó#5Ï<ïÓûsxMû̓(UtÞâ/F2’ØUé?í* ‘ˆ]¥IhWAîaڷƈy¯�`„×+‡Q1�n@OîOSõáöüÏæÍ¸öþH{�ŒM4^âHÁÏQ9R¤´é'õ¡ãh½%ÒqXoùÖô¨æcI)Ó«}>Ç'!â8)ÅëºàBzwhî�4×2¢Î4Ë•º¼¹be�¼ñ^–ˆ.J É¿³ÖºÞ[ÿ.æ8UþÈTiF…@ÓçèBn•h„Æ­B#´ÂãØÞ�£j¿šg‘ãW¢Ú4ŒðEò²ä5©ï\}*¾kÊÕ§ì]S: +�J'iåGè$�–_Ïâò”ë¤îÐÁ̼(Mö¯G5fú„i¯¶Ý<_ý«5xÒÍqá:×4ÀñƒnÀ«“Øick7Øih¢é„dô¬÷–¼×Gk<}ç3 ½�ù¹:–¦ZÙ¨\§£yœ‰†ÒbÖ³RIÊ…Ì‹ÍßWã¹:½_~ÂÌ‹ѤQi†¦t&�ƒ™d4Í¥…l-̽´>’h^J"‡–°/_2aÄ-zƒ 5ô¥0È�9:(hIcÙÄÙ™¼5•Á+¦óÉ4R²3h »ÊÎ`b}ž[:*‡…�%?$¨þÀ‚nV4�ñlYë»0¿ó³Ÿ—Ø»cx>Ô� €üK,!ÝeÔ~ƒÒã�&šª•®çGY‰¿¾ø$V®μ(U¸Û‡’Qš;;±…pöß�»x?Fý|Í#Ъ蹹B¡|—Ìó£�œPE÷8YB]ÒC¸‹÷~‰•  \=…{ª è¼õ,=ë Q¿=Î@–ˆ.�ü]î-¥€òòå3�üí�²D”iOÙ¾>‚v‰¸Ä„yjþLñ´� +<Î@–ˆ.>_â!Í¿¥.õóBŸP™ Ì=òÊ.bÂG=G]¦õŠ…î'C§É@NCg3 \ÉQ¹î7{œé††Ã Npg¡…ÓAr¨iá]ϼË×ËNòÌ@U©_î¹xïÏïÁ �²D”Qvʨ\§âxœ‰†âB—ƒÓòÁ›â©[†½ïÒú%jå§ŒÊuFŽÇ™h(-þl•#óåx =Ø%o[•%Äq~0$‚"®kMfâÎDË5Þiñ_—¾IË"ïÔ d‰(£eƒäß¶G­1Ö)‰/®(ŽÜZ éWÊ—«'˜ð²D”]¼è!àÖYBƒÚjÞ/á=–ÇæM×ãø•þ1�I|wÙ“š; d‰(Sª;c[juÇ£L´šu›jN"¯î�~ Á¾rÓ{)rF0–�´ÏØÞ��šh¼RàÉzÊRï<“�Ý_,ðx �,e̼‡›W°Am'Œ)pÓ¾7M¹i¼½|p²DtqÆÉ´´àýs{<Uöá|³*ò£Ê˜ QcSz!ÊãL4[)DMµ¨Ÿ[Û;ë\+Dyœ�,]<·|èü¦>j�õ8:jÊ1Y•줡‡8Y"º$J¶j‚ÄV$&�mnÚ—Æ'Ì�ßwOWp³*Rº"!³áBNýúª½°?�[8ÄCf^”}^¢{OÛ³MŽ=Z¤{Ð@–.èÞn™Pxd¡u”Мvþö9a*Ö¥åY 9��Ÿ)Ía/KD]½§Üÿ%=ÓeÒø‘Ô–6~bvë??–ÆO¤³ñ¢„±9=Hð8Ó,'Ûo<è4›„Ùâe<œ8î-™Ž�ÛÛg §óÓ5ÀÔõÞG¸G©ºèÈ(}ä{Z…Œ=Þ5¿Ò9îWËùÀ™ÖƒÅžú®MçË�…¹šÖ9‚c¦%~0rÊ~pMÍüâëúdM/m@NØÅÌM0ChlïµÈM4^"‹”w¶NÃu>¾K,’Eh ãÙ Z]qµÛR3�O}Rj�dƒ@=“2½Ÿ�á±®ý3MÀ)ïQ¥�¼ÞŸ¢›¤P&Rk§RkHƒ^–ˆ²‹ór[½i¨à6ÊEÁ^è/âoœÄä¹,Æ;ÍØšÎ¾ñ8Ó,ר7ùí*YÔwv¡_·Ø7h KDÙåÚàê›T>\öÞ¿¿Ô«4èe‰(Ó²ˆÅõ)i¾µì*Ý‹’ˆg^t•Bô׭Ũê!Ö:Ö²}ûÀqk¬ræu©¥:�“KuØ —%¢ŒnίÊà^§×3&Qÿ` >îT4�]fd_GŠt;'oÝ'M»�óÖYyW£öÌ2Ô~ãEêk:HNËÁD Õ”_Øš7�¿ á�r¨@ 2—º.l¹[áZû#­µ,šnº×w*Š6(—* $t§HÂ#Ãàe uIÄ2×2± pÒ ¨Ä²éYòÇåˆÂá‰h¼23/J¨‰Mè°g±Ñ^²xD¤²†T°˜öwÝ ·ç»~E+XÐ@–ˆ2| 0œ(­«„öÄY1VúmÁÌ�ê7dÔ °ðá]·;*ãÃÄnSäÇ`X̉ô¼Qû ¢šlê4ד‘ûëqd§r·@q¸z¶?õÒºá7ÊFA"j„G0$>ff¤X ®ñGà')´/}“íÄC)úÖ?é»0Äô²D”Q]ˆ‚¸8'„­I�ÉâÐ1�]'7òf_m ?d‚áªÂœõÙv™:‹izÍtºØÍÿ^¿YŸx,ÄG½}šÿ„ñS!@Ó5òP¿›ÒÙ«#ÊT“�ÞY2¶åÍÌ/ÑÁYy¡h KD™ö†%�s!¨Wb:S \¸f•ÌŠî Ð4K¥k;hš}µ‘¨¨4�%¢ìâR´‡›p¯Ó… j;:‰ëêäó»\tžÙièã;Ò÷Šß(Ê0Ç— ø“N³Ì»œiVJGÈL«G’Òö²D”Ñq Q¸–ô83lN[˜$2Z¹Âooô±ƒá¨qÑ<μ(UÒCø·~”K ‚ÄÒ™¶©,S{©žý£stÌœ$E|í‰84È“ªÅÔ‰qE˜ÑÏ@ÖMãÁ„¿^%ð#c*Œãr'Ú»×(E* d‰烲û´¿Ú—ÆòÖØƒ©î@Y"ÊšAëþeÒ³}E,cö£<à� @»×Ú =/@Šâa½Ûµ¥×»h¢áB½»è)§Î߯÷\ªwÐ@–ˆ2í)Ü%û`Åê¥-Wª@ºB¬^‚ ‰U]êŒ-õ˜A9yÞï*p•¯ºu–_ÜÒQŸTr€3�%ÔEk‚N¹^Û ‰–RÞVHòS/û‡D#/K¨Kªî•�²8»ë2� 7¥º8Y"º¨C6WfÍ{uÏÏù# ¾ºÙ»)ÀÑ ¤RŠ9§\¯äÐtK}•«°PËç¸K•«§f¥J d‰(Óž³ †¢]sV¡.0µã^ó–gÑzTí¤‚ d颤€å©F=ÊO½OgîRwœëæù…8YB] zlì ÚM´_ç¸ÑÏkF £9�'Çâð¾b� Ëé!èú#AWO/@-ô£ûÍVü¨ZÓ;è0@x„ ¬Ÿ‰ €Z(Hë–N»^· ‰¦JuKg±nI懗%ÔEÓëV¯\ßÛqr !XlÑ[ÔBV• :¶wƒ ê�&¯ÐÔ¦mm<²y;Š.KÍãÌ‹QÅ÷¼†lØæ·ÄÍ"&aÖ²/œ‹ õ5 šÂJT%UÆË¡áÂJùú¨V �,eÚS µ~Q´+�ušÂÃÓèiw«ÂSךÛNW€Wu3Öý¼td߀ßÑ—_(¾!þ‹@aR) e’ÅÅ‹¨�U±ôx-<ö©î~@m·¤œ§]gPû�’«±—Zq{_ûM5Zmp²Dt]¸±!W‘~¯GØ ¶$áÆI²ÿW¶¥}žÏôc}Æ[± �,eFuÁEªÒEÄV�*�Ryj^ŽÃ\[:ë€&N}ŽÇ±a&ªç ú-¼wT€£\Atˆçá™®1�r@-§;\½M¿žê}œ‰ÃoöA�¨rŒµLy¨>iÉg^”ˆ*Ê=pºevàL³“ÞQæSÑûé R˜ˆU]©­òæ5ïĽÈåŽNG¡Ûðg^”ˆ*‰ÈàÚ’‰ €“~ïå}b•|¾žWÛ8Z)¸„­—#Œç’t’' ŒMÉü3Éhö’¿ê'²¿‹áËÞeqi&yW°Ú d—~%èÂkúD#´{úÐÍc|-5üÞ ¡÷©{Œf c£DÀ{@gàzœ6 ÔgŒ~I~bmÙ›÷úu¿aÜÈÓõŠhºó¹U?àóÅB¼DÐÿújPˆ3­#5þÌØšÎŸñ8Ó,gY¡±7ëÀ݆žÓ†.ÈQ&Qºý˜‹”nœ*šÝ §'û[5Øyž‘¾Èéñ@Y"ÊÄY¾<ÛL\·îñ‹ÓÜ dW]™SÏ¥ºóå6Éc)ç”È®æ¾1߬Ö[BƒÚkŠd’x䳿¹Å‚9¨ù¬ Ê”a!¹W&¦ŽŽ–ö˜‡%€o©Ñ¥Ç&ó€²D”iOA~¶Ÿ;´ ¹^¼JuÊ�]‰œïù,,±1Ÿ|h¡däÇÆ0“!Çæn=ÐDÛk5ù˜Ñ¿’wyüyòHg¯�[ˆ3�%ÔEß²U}£òú–;\? €¸1Âþsš.V£ï‡Ž�È]ÐéÙ–Ý…û�3�%¢K$@ºŸ¢ò¡$»Î!¸ZQœCÒÍŠl LÌ©9ö:n Ó¨˜€3�%ÔÅ‹'! cúÖSqsRz€ÆnKõœßó~R¯Üq6ˆW»M¿qì8 }�åétËìPÀ™f'õ‹æê¯cÎ�·.Âá¹c>_C„c{Ò)¶ïFÄ#l#ÄBC%®,ðËT®,eÇ�²D”]j÷Fznçyd8 é =YùqHÌNsglL�>e¢Ù˜R�cq7GzF6Œà…ÙÆÖæx¸!|ïKN8M¤T]çzè7KÉŸ ƒP¹oc�ž #q·BwÍÉ„pÀ™h:¹|zM•¢¼Ü“º,蜶÷.òS*èéJnÚØœî¦yœ‰¦“  Yð*Ÿ»Ÿ×mïd-ï_ôÊíoœyÑ¥«¦+d¤ÓWĈo_ñÑ’ù%í¡!½q¬ŽCz£×� �ŒçJH1»潤¿Ÿý—ŽÇæ 4î]é±9gÃA§]?ì@MÕ(ýå Æ²nŽÊù©N…Òï�²D”iO¡ï×Ùó‚zÅ‘¤–½ÞðÎëÇ|ž‹þ&¶âªÛ·Öß8v>†.àHcuëÄ]�3ÍNº oízÛ¶W˜ã±ö×9Kr,wÎäh KD'²ŽÚo0u=ÐDS5¢¬¯"ÉDY,?yY"Ê´§p é,>A½² ]ä|Ÿ5©÷ê.žiòkHÏù@~¨ $‰/;6§f=ÎDÓ%záò>¨BÏ“ª =Ð@–ˆ2•�RR¡µÖ¾ô—Nä£x �,e|b!á¶|{qù盕òœkRi/+þ9ßc �,eëW6B;††F�\ë²ÖùPÆõ˜Hçõ3¤Y9¡§™Þ8Ðcs¤¹ÆL �&ÚNê 1ýùÞ­¯Þ Fg¹™øeEÚ`3KxË5")s,Sõ0¶õ¼eɽžcÙ¬ �œÝ‹„M�ó8¶wƒóè�&�AâóU«|[îêã;•È.ôëa3*rv!.®ÒKˆ‡1Å—P;Œ‰/¡#æ7¤ï_ç�ˆž¦–WÁZR^¿FYj^“ÆUäWÕM݈~醯º\Ñ/ñç{Y"º*ßZÑy8jÐuƒÊç�²D”!Û1ÆÀ i}$´%q"i(ù¬Wl•kþ''Ñwô!Z·*jq"gŽÚo° =ÐDSþÕHŒÓùWg KD/â/-Hl¥È ƒC˜>lì©Æ¨¯9làU�íÝ dy ÉÆ#§Ô–Jööñ>³ûuÇ d‰(Óž‚Œj[™%íBv–”a%\³S×S“pÔ3¨úq§ß8~ÙX¡ihíŸÉáL3œäb�´V6T–Ì�× ‰<Î@–P×åIµß0 îûÐEÍIy‚^|é~P¸#§Ína׸=»a�ê¾°eü|R zƒÈQ†G-b úm䄯4'Eã\äö øÝ¢˜¤ 4�%¢L{ ·ñÞ7‚zÅ'`Gø^­Âžã¦¾mÃQ‚绥!Ë~ô 8~FÀéRycs7xhÿ÷ÙŽ)á‹ã ð›�ˆg—µÃ ¯:”C;Üà�²D”Ѱ,DÕ‚r¹4~Ï¿ûsˆ@iŽ#¼2í)�tÁt�²ä5ñ¡Ê+YM~.­†“ÞAî´Êß8z²}m¶¯?I0�žûûç \�–2þv�–âq¦õ#]zÞÍ3oµŠ ƒƒÞWïãùæø#OdÔ~ƒã�&š:ýsº-¿¸µJÿsé++Ò¨Ã/K_`b §Q{e*3flï3ÆM4^bÂû_#3á±¼,e|ng×`~4íý¹§0{&NÛë#å0#©Gâž��éäs�3ÍpºtG<t˜ûõ?Hp¾™·ÿÚjÀUˆ?B«;Ïä‚ÂfTˆãÇ™ ÀüÉ*[¹Á*ò@MVXE…‘Xü‹rsÝyk‡Â*ò@Y"Ê.ö܇¡s¸°A-'nžª5°)_Ú=yÂŽîC�>Ç '�cÜD) ÀÛ»A<ò@�'þmxã(z =ü®*UÜê©¼Ž½þ;¹à¨ª~÷ïf@ÍQIZc{7XZh¢ñ´·–ƾkצs-ú°˜úº³L�ï ac �,eœÅ4j¿ÁÔò@M�þ9K�µ_J9°¬µóé ¢«2ou+x¿¾·1Ž{*N÷ꆇŽ(ÞÕù–¹=Kå÷ÌI„0^åsª$»Qwó”âß«šúx² Ú…Ohc=çºl9²;V…ùÝ|¬}ï^ˆ÷ÄšY!Ð@véÖ�.Р�ŒwÔc–sn¯|ö~/×Fœl…í�²D”iOaXØûFP¯Ä˜G»}˜ò› -r´=Ð@–ˆ2=†0Œ¿z¹?lO æb–Ñ@CÓIFf^”P“J1zÕ�öfÉz>Fg^”ˆ*é! ±:�/V®„k¬ÞXo§œßûÉPÆs">¶é,ǨEXœX3j¿A'ò@M¥ùÙ¨(ˆ \˜¨-–-Ýxõ›_ôª/ã«8<G/Ê.Py=Ë'ü>¯V äÄ!¯ì¢¯öF·y,=€Ûû#íµÎ �&�ºð2'Ñí2§ÿ¬Ÿ"õ {ÞËê’¨WãïÕ©W§uúåŒi;âÔÝ8X�Ÿ, Wã:�íÝ ;y ‰Æ“ -Ž¢ðlN ;„ðK>èºÊ‡j¸²ôdƒh„ȸÒž¹Ü3oû9¹Å<g^”ˆ*¼†0 J[GÅÍi.®a‡g…Z7ÅáŸvî(:Ì�ç`qW¶}?/'“N3xœ�,]´ÆŒFûù´°--´õñaþK ý¿î‡ÃÎ=n dˆãgÀÕŽé„cS7è„h¢Ý4(B^a’UòÝçC “Ï d‰(Óž‚À¡– ]Bˆsߪhó¾lGà€´½üz×cH%ixöKˆã¬=¯K{Jå32í£,¡.�·Ô})7ö:£e�ç�²D”©µF­¿îxÛE†šÈQÆ·²ç;æÃR Ôˆ�/,÷w¹!àÝèÛ7xah KDÙ{7€a„Ú§{ØžîÆD±±Txƒ(æ�²D”ññ‹+KÙ‚¥1–Jnõã"i%)`ye¥§g' kìúš»7©‘±̼(¡&¾œG( ¦ÛÈ…�Ia9=û]£ƒyŸ7ŸÂÉ"±v“~ãøÉ"ý"‡jP~ƒ{åp¦ÙIÂǸpƒÎj?V|4Ï—m$Ë¿+ j9/[ƒ2ÞUíFýÆñ“/ÌíErÖ ü#ÍáL³“.ˆ�ƒÈþèËÁUýÇñCÂø�3/ºôzA^o)š Ýp‰F°w;v:½Ÿ]>ôV½,eÚSø£/N40õJ’Úøp LúÒùÐ_îä”È�50ç;¾�F¦,²»uS/^§r{ê{]O:=œkðÞqŸÌ�Ÿk`®62Gí7x“h²©Ï©±Kò˜[Ž/xlÍKÉÑ}x91Î@–Pg ŽÊo0"=Pû…-v8‡v w~m¯ëÀá1UOdÞ¿¢äÇã§K¡F:ˆÊŒ„–œ(¡&5ˆyÔ��SW b<Ð@vÄœÎg#½½ëdX§Gw Çñø#ãÑXo!ÐäÁE]x H4B;„Fø08îKßz7IJyeA¼é—ãMlGëF‰ç›—†X”ït«ž¯‡Èª¢ ÆéÙ’ëÏó¸�FÙô8Y"ºTÊ_޳ª _v #9 Qþ<Ð@–ˆ2!Ä0àˆ¶®𓸦”r r~d¯eîm�¿ÖCir@%Ê«¢×x•s]¯Æ |_‘=õ¹�^ädDäQ³zîÚ‚ÇÇÖo½@2bùf@Q=½¿Ê_1�³½21³36w#µã�&ÚÎ(/ñ‹‹åæŠo¼V�–м¥oEÛ�"¯ÇÈÑÅ«‡«Pë+¡AmIjÏþÍUkÏøÆ{Y"º„Zïø²ß¨õz ‰+‡”‰ò/­œ‰Â·ÝËx&Ê|[Ð�1�“DK]Æô+,ú…ãçJ!ûS¦Ç¦nP¦=ÐD»é¡R gMå#ò{¹eþ[Ù d‰(Óž‚´i,A»�‚•˜Éy«xÔ²{÷�Df²ÈQ¦=9ʾ« Ú…|'¿”ùŸïûñP¦Of ÐO”–O¹˜ÃžeüÕ–NM@¦X,‘’ó’Þr�¤d4�%¢ìbÈB¦^:Õ,lPËã½4�•Õc+n×ú­÷Xæ>}–¹nP4�ñ5ó¢ŸÊº°¾ûxr§ž–Tܬ²?æUç«¶á(-É«’ò{ÇÓŸ)e‰èº(œMÍU)§Ëê¼ägžõ⛽D¤«B 'Ú{ešÃ6¶vÃaó@M§T‚Áô“ã'GëªgòDUHßÒLÐØ[`‚Flóƒ,Ûpvh¶ãÕ†óûßõ}xœ$e8©á½æNûø�ã5ÐWhnCc7XngšÝtN×=»Âõ²�Šƒ3Þ…î«RÔyÎÿµßà¸y ‰¦Òµq+&.µzõìéôoJXwÍ–ÒûÆzˆ3/JDÕ(bck: ÎãL³|ú§›•íYÞï¥ò·_¹oßÔ1·ò#[s_Ÿ�ó5p„ñ…ª:œoF¥Ã!Î4“GFÓRÒÄ�˜t^ø�ä³i®ñoi¼ìJrò™WÖLú¢XE=ŠÄ æÅ#áe‰èRh|š„ý'‘œØ;õ¨ÉÆyÍÁýn­ïþ?ÒýÝ7 €&ŽeL…ó#+SápJxY"ÊDžÎØ7x:h¤;9O'?ĉãÇÔˆ }¨ÝÍ”aS¹@î}È d‰(S¨mÁŸ×u:ãE‰*àq²„ºøœŠP˜„ùÚd¶&ås.6þ–Ûxœg8ý(—íè&ý†ÑP$o‚ÕþQµÎð8ÓÌä¼3WhÏó´ÖÔ_=-¬Õç̼(¡&åÌaô—)T-dC¨ë~Sõ¾ ßbÖœþg „ŠÿÛœËðq� æ—öÀ¨ZeIx”öë8S  䫸ºóyO«ø{ �,eÚSèp÷“‚zÅ{�b(ÞXö5C¼=Ö“¨-»q@öÊ8ýxšZ^³Ðí×Ãß®ë‰áÍG�p7]¤i��é4m�3Íp�¦íûWæiãÀxY"Ê(ÿqÚê ¸ÍK¯œ!+Ó»vmøB ge¢ŸH\­Øª�^’Ä…(³}�`èD±¾W¬€öZgÈóÜc�é}¨¯õà�s Ñ! X〨,�2qh¥ŠŠïU¹¢‚Ãáe¼¢1µÆÁ¸ÁÔò@GVbj•8²xy¥Vt‡©åq²DtiO¡§Ùg³ ^q[ÙÍI�zî¶|Æe;obs¼UçlS:ÂqB*q\‘s5*¿AÖò@- éH_oð 2Ò€2\þS"R^iË1òwÖô8úG`"y”�,yM—å®_ ôC{­ëwS‚;+Qmʽ¢–ß„ãë‚"ÕÆ d‰(»H§„8ô”ûÉаAÍíö¤¿Csñiú kîǤϚûmÒ ‰ 8óßu…-¬ûóPËH`õKn·é'ŒXÙâ�L£AµNPr0“ŒÄ’[|Êçéïïl"œò²„ºrRvŠ ‡ÐíOä&9œyQ"ªTPþõ•¥óÜOz¯Fò@Y"ÊH®9Äø.ùŒ[ؘÆ=£ËÐV?]²¿ß=›�ôl¿iöƒÆPÛº)ƒiT®S‘<ÎDC‰ã{¶nûî½úÂ#@Gj­¼Ò÷s9¹|@ùõ;x³)rÎ/s�<4j¿Á:ò@MXGµÔˆ:ÏÎù“hG4�%¢Œ�XÙÊý{¹ªàбá9*=Œ€œ±�„�Œ4¶wƒŒä�&/IJÊdm’ãüŽF$ñ8Y"º´§||^0A½ÂšÒ¸#�ZOÌ’­×ÝDîˆÈQ¦=…Þq¯” êW›e¤B:x]ݨ�Æ'ypìõ*—U2ÇùåvÏ9é{úR½ôOW…@Y"Ê8ÅdÔ~ƒUã�&š:ýsr³ÚjVÃñ¢�¶ et/KD^z—Xî7D^©V`–*µ¹³³—ózŸw)ˆ•Z‡3/JDß^#zÉ}BG­i7u‡–Âá®§°V#0ê½7ؓѿq’CªV´ÇÖô’¶Ç™f9ËßùÒlqMËÊÚ ¤zI×ã d‰èÒžBo°�•¤^q-µÊrn¯l ÙƒYNš�PXv0󢄚”gЗé�ª–¼",üfÿ±y �^ûËÚh KD™öº-ÝuÔk>–‡Ó± >¿>5¬Ô•=Ð@–ˆ² O"ÄáîÜY|aƒÚV?ýs¸]µØ½¿k¾îU®YiáÒ¶6¶f©ë–†œÎZìŽ�2N-=Î-\ÁäÖ§ºÅ¼²/ù1Ii Ù¨¨,äê"D$ë²¶¼ìš®{=j艣¦]„x5j_0k~UïþµÍ}‚zþ¤o½›ñ•Å$bß–L"F ‰†G3þ Ñcf¿_ÞéŸ~¦ºuRu=æWv¦+¶eÞKÆæ›û­9ÛÒ+ }xß”êÃ#ÎD³¿¸ñÊÛ™ŸyVÿv-Ÿ^<_~åµFÒ*‹JˆJ¬1/KDó¾²öú½ÙyÝÞg×: ò¼›Y!�±œi\`Þøædæ M´]bÞø÷BfÞà åe‰(ãò©F-_'òœ] Ú½“ÇyÎφl ±¥l 4Ñlš~×™ïûÉCš±÷ú 9ϘŎHµßà–x ‰¦JÜ’i¯|Üwó`un‰ÇÈê’ÂÀ· Ž¢\ˆ¡ÉÛýBÎnR€3-|Õ(ùùÖoœÞ`ux �,eÚSŠöÕYP¯Äµô _ëúQv˜N"n´� û‰¸¨E§œ‡2j¿Á'ñ@Mes9ÜZ {¸¬½ëW.SÙ�X­uЄsò_ÊZV¾Çµí_¿á›zèWþ>N�Sq‰)7c[7(7h¢á åfzÕ­îëÞ¿�¤qn<Î@–ˆ®‹·,ÄáÞÔFOhPÛè”+™—B¹ªëðk•®dF �,eÚíÇ5–©„Þ׳s¥Û�h KD+òæ‘(T¢ócø<±¿ÿ¹�ß/”yQ"ŠÖŽ#@}kÖiS#Ê ÇóÓõRÀù™ƒ�>á~)G…êýà d u)Ô¤±©Ô$4Ñn²•êpòŽc&Èúõn_± gý¢©¦Æön¦<ÐDã%¶Ò°jT%·}‚äuð+Á~!ð\Ã1\¿yÆg#4²Të¾ì‡>Ï+é5²”ÈQv±*‡8t�[' j¾6¼i5+ÑhCÓY`wD"äEõTL4�q’•BŸòíÉô)šhüÅ–È܇(ç®Mò¼¨>†Ð@–ˆ2J  ÒØÚ î’šh:} �ý“£…BçÛÏk[EÖ�Ù%¢JzÃ�žB�•+¡S�.iÓš¡{6€œö@ÙEzXÈÅfÜ£ÀšçÜö�œŠœyÑU"6 ³žµ.nëò>½ý0pD”�ì?k‰«Fv¯G?/Ž4�]Ž�Óš:5×rF`ýžšG,øíSúÎ@ÆãJæ¬ÍõØ@ùþ䇣5’ð±`·é7Žž’À°R"Ž�éä@�3ÍðãXèã|ù·ð-[nCÀöò‡@�'•£â¾=ù¬8M4žù$a€é øTÃÈÔËQÆW¥ð<·[O ÇÀ•H“º#�²æWöç‹óA{¶ÔÛ.–/£ �,eœ:j¿Áyõ@Mýb×w¡wÏ2àr„ 0ó¢Ëøú›£!°öÜfrØÐS©b�W“µ®ÌïWbãÁ(ÃÍ–8~. ó ¿thL§—:˜ifÓÐcª±ú×±%<‘ä£÷¾&@~$‰¥�ï9j¿Aqõ@MÍóéÝâá²|_øñr›½!�øÁp›ÍG õÍÉŒRj?ú"Ü©™UQùHé^–¹µ[R:g KD—öFx}¼Bõj¸è¹™Õç/g)J@·Þ u"Ð@–ˆ2í)ˆ*;Ÿ+Ô.E¨à?('ÉÐÛìF…GÐ4×U!šVîÏ\¶å×Þ(*Æq¦«Ó%=$3[‰òAôƒ×úE$Ûæ¾žS+¢#«l3(2:"빈GêÛ’y¤4Ñð€!™!sÝ:^˧J©0$h KD™DÕ:^œì<�a‹ÂÔ˜yQBM<¼ @àÌ}ÞöŸM)^!®€µ÷›Ëô:¯ƒ“;Þ‰êÃ5WNãŽùödîM4ž Þ«¸+ïVmHàUý¯ªõU„c‡…˜‡ækuÉ+—i[€3ÍN�¶UõÔâÕ¾œ'YÚâ d uI¡gÙ&R.9©4?á¨W5k\¾vPV×ýg �²D”iO¡§Ù3Ü¡zÙm­iÞ¥¾›kOó<.ðŸú¹�Ç_Lá®ùædîµßLò¤QÁOX´==.4h§5Æã3¡§„µ˜jŽàaiu�ïNþû^ÂŒ×ûÕ¾p�ö£+Ó̉pì” s‹ÂáZÒGËÁL³Ù¹_±„%¡fŽàXiõ%p¿”xV_oþïÂ�ä¥)|º «tœì4<:™VâÓ!Ð@–ˆ2í)ô\Z×ê57I} ëwéž³ ézÚ–O½Ô¹^)°½ÞÝ_ó<7dëõÞ €2Ný‹H}¾-‘Õ‡0Ífþé£RÜßmôµ ܾ>xNr=�Ë+—Ék4ÑRÀ1>¨•ŸÙ+1o[æ3õ¯�ðÂ*3øXSþ!SuòÖwÏÏ{zž£jCá düLVHbsmi46™f³Â«ŠÊ}JåËñïœ1È8gLy Ýó>P¡zÍ×§Ä•é F�[ß¶þû p½Þݪ�úÕ­ú�3/ºb‘…Uo[G2˜¨ÜSÔP—ÄçC˜O(_ðùX{^¦òù°ÓŸÀlG �ìÞ1Ö¥ ŸÏ·'óùh¢ñ¬·öwu¼ë’u¤Œ· #®~j?²ó<,|{zœW®²çg¢¡ãio…á¶”(¼Ôœ¿oרq¸Õ¡²x_EŒ¸¯²Æ¼ìj_ÅùS2u«{�ì6?`ëµ…)ıƒÌ„ùnö¾-u³Gœ‰v“Š\À„�¼�\D ŒÝ�sµðãû•_×ó ŸçÞù�p|åÙa0Tö‹fè[Qi†ˆ3Ñb�fX_†­Ä¢Sqdš!àÌ‹8ÍPx£á6D±r-²öé—CV'ò¹ô[<í¯¾ïÊ,{�ß;U€ìü*Ó"hĉ4kÐËþó:kz׺[9a2�d¬8‚F �ì*‚þM õ##ÓBhâ0Óý#ü)Ù‚åàL¾¾fºÒ^–ˆ2ÆVõO1â&ÒP[o…@ç´ lUü5Øe«²nÐl÷~òG1ÇÒW¦Ÿ0<àÈ’5Y=ß%Ë2‡G±Z!ËV=›õ©‘eh ãdYå©ÚÁ¥HòÜÇ� µ{YB]!?u)×ð–zçó9µÊÞ"Tg KDÜW¶ÕØ3¯OŸ½r`‘.ž—Û×ÃÇN£‚®€1ëÛQ³ˆ3ÑfÖohÌïæ10)&{'@-}ɤ^»Ì’E ‰¦²=¾%ûçwù$û±Z:N)fº[ÙÙO–V£éG*õíÉLZšh¼¯Ù%µrWÜ>Ÿ_�‘è¡4�qz¨ò¦R:k+T¯æe²®š¢xžì‘¿‰9‹nÂO˜”5aôT§Ze§LùmÈíËžE)‹�·®aùÃÞ˜UJOˆ£\C¯*,¹{€Zrdž¼ì?*¹—ÊÒ¾_ÞSKîg »(¹ÿ.rç–ÞõU­ÇËÄ"7 dEîïS­q�.e*ÛÚº=¿<e(XêÎ+Sò„#ç ±1/»Èb²)oKÍ·¬í6rÎÖ± šMŒ³>…–%Ó³„gšáþ¶ÊxòÕ�¶&Ó^ß ³2k1s‡Ê¤,!´D!kÎËþãtaVT‰Òµw�Ì�”.D �Œ§ ±zªàjŽ n9¤Y>%1¡AäÄ 2‰‚ƒ0�‚Ú󲄺Èe£u›.YÉužÏ4òwîô†êãƒüÆ™ñ4¬p@¥V)ʩԽ|eöõ�|@�2~@Ey ò·½ j—rÁžäRU·øÿÙ�{û#$˜è6@vÀ•¥h:s<þâ›S�Í ÎDÓËò=}¹&q´ï½�þò i/KD™÷ÝJ:¸¸�Ç™'Ï`\ÞÓ…¿qät) ñã³¾-ñðÂL3›†ÌË¿×W?Oòãp<#ôÞK¿qZš€�EpÊå€3ÍNše™ëiÇw©ÔŸœ÷á,ÆâÝÑ€ì˜) ìãã¾5õøâL¶<»q…E½•S6ÏþÔpó�õµ,ß¼Ü1ßœ|þ�Ú�¾X¤Ý‚ª©ñï³æ¤>@ �,eÚS�Iè&h²d"ÇD"ô"þÛÿS²Ï62—„�Wsæ–z›Úòqæ>')p»ì…¯ß8rЕï¼þÔ„×­žAœivÆÛúúªëij„v�;ۺȮ·õßtÇ\”~@×ã d4¯åϢƉßx·Hȱ³¨^™rb×c仨˜vÖyú§³ZxŽ4æ¤Zx/L-ÁE¢0|Cgëë�ÿöI~-¸µµrgÑÞh�òÉÈQv¹88pÀzW…íIΜÀ÷¯ËNqYï¾�(t€™%Ôt‘V Pè{õÕ2hLòâo"&Ì ÓÓ3}!ÓFó ¨oäèáµ½æô|rX ¯�²D”iO¡çÕûFP¯¸q ¸gÈ–R}}Ó0 d‰(»XBº_ù½ß j> ó%G~]m­.ƒÛçËt/q²Dt],!çÞUaƒÚJÓש½à¯­Ÿ¸é‚h KD™Ê6[×v=õëLÏŠl34�%¢ìbÕœÚ/ž'h=ú`ï^¸gÜ5›~£ d‰hâ´Ê‡ãÒœL¡Am�ÉËwïÐ)Ý¥ÅË’×tùâUÌû‹G;Ö�¾Ùß»ß8v*‘QA…É䉅ÚdR®Øäct$ª¦´Iè~ÁB¾\ô=×õ2Yp¦�"M‚îž9·Õ�¤dÉvzÜ/q²„º¤‡zD½L¯ùÛIS”¢DTÕhm˜±ÏÆŒ›ê óªväÊ!åïËœ8ó¢DTE¼@ßŽÊ Dœi6Ó•æÙ‚ˆÇIöL9+z8vΗ†(ž'ç•Ë\@šh)‹©£¢¶'|üŒ¨¾('‚f`m­0ÃÞëÜÙ3�²D”iOa,Ó{FP¯F4Úpܺš*_ƒÝçw§�+œ<À™%¢ê"Ôˆ`‹?·Û³WQk^–PÕe7}Së–Bü)gvêKq„Šoq²DtiOaÀ×úER¯D�ý«ÜÊü8D"ýË d‰(¹V¯GeD|>Ä«q­̼(¡& »"r›×6$± c’Uþ¹eÕXÿkÿ³<»Î+‹�óï)ö°{Ч«JU*ÕÔ~€nœ�ý7lÇ�×a·oÜ×o�U"2UH�¸{²öª)Š"A Nݳ ’¬"Ð@Vˆ2ôžO�m.<;' 9ŸqvÔ.å@NúÄ©–sbǶ.�b#ÐÄŽß¾3ÈÍéåÈïCj k­oçÝJ¶ñÉpœ„u SzhIŸÒfZŸóèK|9ú‚�e…(k]zÃs ÆžÚüSYžä翺M}=C®pü†Û¸¤@ÎÆÁý6/§¢Ý¯~öÝbŽÌÅÕÊi±•y¯•¨9s1*S™‹C>§ÌEl0Ê Q&±÷}|^M®-I]¢ "Ð@Vˆ²“ÁJqørŽVÈÏ5Ž*#ê `mμëγݵ 0fQTP?% t8÷AJÚ’\×Ì…˜”§JïRZˆBrÐäìJ÷)ùî<Ýž·=£°+h +D™ö+tìl:E½â%JÝ/óÝOÿÓºnôiî—€³(:u¿ gŸ‚ìŽf5æMEY!º�ÒFþñ\—„í³�Lôõ^Ù/ KÎdŽ£ßlÓØ’L7E ‰Ýè�UQõü|ëá)ôNÄÈ Ñ¥ý ½OýU êW–Æð\-Ïü<ç�Π1<#Ð@Vˆ2þÂrz ú-mPsg±ÑZ­¼êëYm»-y™àýé‰p Ž¥…O‹$+slí5Mì:ýä€7¹jrsl§Dª|ˈ3�Ô%ý�PýmåÊVJý�¨_¨tNætj•×He[�ŸÇLAÁœ�²B”�¬í%xç—½NõÁœ?¼½Ýœ?¾½@?°@ï{³“o»ò@©˹gU&8–÷C­päþŽÊ/�†#ÐÄžj¤áöžWÉg?¥i¬á4�¢ŒÙÕ9 æšO›Ó¬o‰m? ™n‰ßR”¢ ò»Sšc‡aúÝ”fÛiT˵=Æj©�i`E5�̦Ÿ4û %MI†¦D³\· OÈøø¼ÝöX‰gq²Bti¿B˰ïj‚zÅÌÔèžó³™;Ë^E¤{F �¬eg1™†FX�ʤíiýЀƹ¶ç©#õ[ºÄÿŒ@Y!Ê´_¡)ØÇFP¯Ø•Ô<š¶]sÞ�PK8GÔvójDÅbÉ£ò?¢¼½Ÿ gbG©…öh÷ýy �…$�¸• Ç_@ž¥ÃìäÔŽÚ/�q#ÐÄ®jÄW¿ÔØ“±©æñ5 d…(;}e 6ËþÆÒö¤�—ùcsÊ,®Á­W×V[ÐOƪrç=®Œ•2#Õ¶V4�¢LdvŽÍéÌΈ3±ëtúÝ|oԺ秓 DÞ^È Q¦rÓ¼8â½Y>Ý®•¸ig +¨KúÚ^Ýeœ+Ì8:³kÀä1¯‡ËNp�:Ô±šMÿà �¬e"_nlîa.Mì;1ùoµ‚~u|:*¤çD“§Uä‰7h?Ñï ˜pc{(thzç#Ëìõ©É�nH<6÷šBN‹0YAUÒ�ÐÞé°¹rÉtZWEÉz¦uçB†R4+z?jÆÍɺ<·±½ ¹ÔžZ�˜�t† ó4�¢Œ�Ö«ÞŠ¼š\{\S§¢Ö_bä¹ShÑ)qó±5=pq&öœ_[Å ÇÛWγCµ×‰rÕ«É÷åå@~¨ŽÊTrlï‚�&v^3 =÷È+;»Qõ¼b@F �ìÌ€DÏȳƵ¬1ÿ-ŽB{‡ާ¿áˆâ.›?J ox0Ûîë•2QVˆ25×lƒ ©fgÚp’Uaìxs9L1×®SÙ~¡HKÙˇq’’Üpð…ž,Ü•i³z …*žqú²ýF3¨ð´¤Q‹†ÆtfQ€™Ôm¶­³©°ž�Ÿˆ9]ñÈÕF)ò|-<¿á÷Ž„¡±µ L£4±ë�ÚsX‚ž•¢óÚ#9À4Z?÷DOŸå`d0J4Šš¢Q„L"Ñ›Š²Bt)D#_¦&oë½ûÑ( d…(ëcôþÎëï¢Oë´¥(£ï•Ë€ª³6÷¨GôyghŸ4�¢Lûº3úÐêßH'ñuæ~šÀ²NÊêí~¼Ë!µJÉ|aµˆ£²!� ÿ9,¿mx„f¢ìl)O«'«]Ð.Lƒ.h^¡uµ¬n›eÙëIi^¡4��y…À2LQ�ŸÔikQVPIúHS{ÐýÔ�Â4'Hóei|¹µ½êéñÍp/Õ ðå"Ð@Vˆ2íWènêc#¨×|W¯W½Bqy¼{XÒ8£Ã©§ÁüÆI./•68¶¦Ó#Nz⟫ƒ­ù •W¿WˆWèqh +D™ö+tAõ¥PP¯ø³òD¼ucóÝy^)[¡ 1/ d…(û�õöxn>­çn˜JYog +DWd Ý_ÎS™ïK¿­ 3ãC×î¤8žˆßÖcÙ(QS„¡©?ÒTíPŠ3µ×¨ ë0Š]Ð 1b'â�¬ù{�­÷. ‚¥çEeJ.`Äȹ€Ø˜:–H‘�>uOy½çžÀ!æF �¬eZ.àÚu�£¿–—›Úr#Ð@Vˆ2¾g帚¯;{æ‘9©´euI?šTb2Q>ˆ Q¥Ò’ýv)éÏ^ãTd%œEQ!ª¤at¤ï˜¹r%Ò"Ñ¢×Ö< niŽ=�q²‚º¤a$¤K®\ª(äã×äÛY½>à¶FòqÈ Q¦ý }hm\$õŠCntÜäÞ'Loè¾þÔme…(‹U•Úƒ>žîk>’¸�)kÑgu¡_@ž²†°Œ�=¶t���&v'óŠò¢fH¿q<7޹¿€G=èÖé×fZ/©sý±žoÝêÀä¹xœîöDäÉsx6§ÇM`V�í] dG ‰�—¸Ï1º¼§Üg GY!ÊN‚H)OݽŽGÚ v„§v�š_•pú¨ ÷ò= : d…(Ó~…gÿ66’zÅ‘�mÓ«N½çúE<÷@±²yD �ì|ó8$õå<+´ºÐ–vðˆ§¿Ô²Å}¡�Qnk{ øLÛlx­Çée˜ ›5¼M££5|œE?p2jYk¼þµ9¿w{y~³15^È Q¦ý -â>4‚zżf‹O� «ýùè—c*_´H¿3èŽgò1ë‰÷ƒò ¹gZ?I(â³Û�«³Ñ‚eÑÇä7L1mT6ÿØ˜Îæ�8Ó:NýËfCÌ;Ý rÒ¢UÑ—èÈÓ͘‰‚ìéQûÚušØU2�æºpÔ„„ YVq¯n#“yþÛø‘Ú;j¿@hŽ@»JWœÙ½ ëJõè‹f8Åe¶�Mä)NtÍ^ð¨ý¡8MîjóŸM7/ä±S�BBSXÒ~·_8iYåüÞQùVsjO¨òtWMu!kÅO.ðt#Ð@Vˆ²“©›âp}ío,mP[¬%šçj×y°ûý^¶Ó²Æò 0‹¢B4Ñó_ŠZòÜŽT·ƒY*´Æ8ºQs½¯6xez­µgßL£qµ·="ÿ^m©oŠy䤯¨LdYÇgÁð Ë!ÊøqZ¡èŽcp�¢�&(ñ;�ã¹yH �{ÛÞ_Š3�Ô¥½dT~BÊÅÙ¡õTâÆ>Ÿµ¼Øû½;55rlÄÈ Ñž¶…D÷N²L›‹²B”© ÙJê\¯�Уd΢¨U9¯q ˜ê´Æ³(*¨ét|-pý œ©îWpuk@ãF �¬eÚ¯ÐRïû™ ^1û©1çqLŸÇTßÊûqoñØF… Œú•i¿’™•Lý(+DÝUëu£�÷mÿ0 ðx(yܺ”Á,Š jÒ8„cS:‡0âLë6µ§zœšçw)b¶k¤Qö � d…(S¨�c[¨�hbÇÉË{x¦{²î;($ºÆsh¦ §†O–Dà+Í]à9œi=§ÃÔN û¥q˜ŒϤ}œ v2>( &Ží]`cF ‰�§>ª:á~!PÇA~l<¹v2RÔÎÏ'£œÆ±½ dÈ4±ó Ûïöh{×¼g7kl¿ˆ3�¢K!¶Ýë*»®¶¯Î?‰mh +DÙÀÍ̬Â6¾n5EœiCsvÒ§À]¾­ÓÇ�2n2¤‘Öñ}\ˆ´F ‰/7#¼EF#í2FdY÷˜H(�Õ‡øò²>û9;rBiTvØl^Ë­ÇØFíDûq‹ý4±««5v^eµ²‡eu�œà‘±.†8VZ] öZ�:*×i¥ÇgƒD+En檨ºò[Àö©3 d…(;5FúûJÔÂd°ÒÌCôåµNI‹¹[�Îì›O°é¶.xÝ{ ‰ÞÁkÖû”à dÔG‰Œ�×:6v��&ö<Í=ŸîÕù4½Ÿ»[J>�8Y!ºöôó=R“B�>Õö5¡­(+DYNÑmüê¸íë€FÑ�@Y!Êú-ïabÿ‚€ö0±7%ysqb·Cpõa¾vÕ!ù<:`»5’ dgÞ\ ÒŽÊušpÄ™ØQ�¦ëë˜wýuïD|‘¦�²B”i¿oP{;’vɳ´ªjN•W¯j€i¨ÑÍÒû�y*úl4îØÞnjO}2k€Ãºž™Þ.xõêr"÷5à,Š Q%ýý<=÷3W®øŒX‰›ÔÆ­Áÿ˜ŸëòõM¡lã )¨Q•Àv��¸ œ±]±©(+D—ÂvmïãµX½CÙ5À,Š j:ye möÃ4úÕ˜dýÓOè«kc^´â�/&ò^#Ð@Vˆ2íWxlè#¨WÎ lÝYç\µ3KÏ^Ä´±hyö˜^ä aÔŒ� ÙQ¹ÎŽ8;:\°œ†hØõ!I¿_ÍJ$»jмö´Ž˜Œ-˜­C¿@’¥q“ éÌädBwéü}ÖŒ—Ê3Ú¶È>ŠfTwe&@ž}„6™ÆKÛ»ÀKŽ@“;Ÿs¯Ð†éc“’¶4ƒˆ¾²i3Yî{ý?H6 FLëUŠãYD`)dé±± dé4±ç~äë‘•¥P§�Yw«á…Õ~˜»‰�Ê-²’ dgjÔ…ÉOb'´ä'ì„f:‹fñǹï~yÍ"Œ@Ù©MøÛ1ŽÀÿEjï­Ôü)j4íQÓp�Ü7åñÙ>•mÁ‹c<¥}O§Ü�ŸÀf‚~?úÝ=~ô?p2jΞ¬DwgÄ7Q‹ï�X|½W �ç[1ó‰ú£ö ÉhrW‘%¿~/n#Ý÷\- À,Š jR~ƒ¦]ÿ¨SÕ‚‘HÜ[�ZGös»ï¾EHvì—Þ�ÅS�‚%¤ñþÇÆ.ðþ#ÐÄž+,ûûÛÙh~%ÔæÔHöfQTˆ&nx¥°u±º×»Î—ög_ùòæ˜]u-E¿.§N ^n_æÔæŽ<õ¾E$@Y!Ê4‚ôØÚ‚tšØõªb ÐºÓäã’g¯&%ro#Ð@Vˆ2íWh—÷™-¨WŒü�µ…Þú׿Émïu·íËÔÌŒ¤ÑÞ«h +D™J.Û»@.�@;/09=W²ZêûM*“3â d…èÒ~…§…ÆŒ�ÔkG�Z”ñ¸ûc’a´z~ã4Ó…ó&åÈ¢'=ß&Ö½ß9 Ÿu½n“ ’ƒ)ÓI+ N²¦8ArT~��¦÷8+Î[–vƒárAÈ QvJ*JphÆô÷“6¨ÙDÔ¸˜šÝ²Ì�+iŽÁ’i¶E£iŽŠMt›jXeqÛqº`ÜDœ�ì̸�Mi=ŸzÍ�eÝvïûù4¤ê­¶÷To }B9�§êEeªÉ5¶wÁäŠ@;OX3ë†ï¶þÛï½ÙŽüÃÜøÃ¹Ñ¦uŠ3už¡*¸fDë�rË´�fèø:7tÈhÿòc ÏhŒÊ´Y†ÚORsqzj]¥\æw³´—Û¾»A^e´½Ûؤ@žX‰†¼”‡&ÇI,{ÚDÙøÄèghâði´UÓ£Ò±¾T=‰€q²‚ºbvçºøadZ'çöHõŠ.Ǿa%@ÎõBÿe¼j¤=ʹuvèØÖi«ÏèhrÇQd½Š}PÒ^±)»klHgwEœô°»Ë�ªõt}ï¼ ‘Ý�²B”i¿Â#~ß«õŠ¿€¬~y^ÊTë8úòñ8\Ž­ä³°Ø ‹¦Í!µn0s_ÖÀM¾Ö© 'Y�Üöuë¶qÄ™ÖOŲ¸}ÚÞòYz V´,"Ð@Æ·3ü²rÚvíU Íi†"³K³i‡ûd©|ºÑé–›&Ë]Ð.ÊÁN8§ê¶íœsõ¤¼ß�nÖawÌ|jÓ9È Q&úÿÆæ.øÿ"ÐľÓÃzš]…޽¾N§iY²—ˆ«�Wõä½öS¨Æw 0‹¢‚š”ß #± � ZpIâ:Ó(�e5oŸ®9äBwZïP‚“\z'ñV ÇŽÍ] G ‰}§ÎÀgõe}–÷ÎÈ‚Lèèbëy¾ Psô�ŒV$ÖŽÍé„܈3±ë¤ÐײjõØÿ¼�[L²´? ¿Úb¶‡Š �¬e@�]Ö±B^[€74õGšª=Jq&vû�¤�÷³�Ûö.÷S5f¹Äd£bJ€<Ë3—ò,g¶¹9rŸ:ILÌr‰@ß>B‰®mXŸŸÝΆdìhÛ§Í9΢ˆ›‰yÒÍØ’žtq¦õš~à·Í†ÛïtÂlì`ÕõAJp¦Zˆ˜3*¿�÷�&÷´ÍÂé¶Ný÷YÖs´âÓ÷Ðd“hFåzâMÄiOÈ옻‡à×óòÔËUÿsL-ŽÊ6"çSŒ%èЈšý3@,íèI>Ë«¦ ,;‰£aÒ9Ÿ ÐD+‡šU�ç0¶w!A"Mîü}®‰lŸ÷¼›G�µw¿¥M€ÚLo@Þ[»Àú�@í™sظ%_`�E ‰ûûXç7ßX+ÛÁ�ûçãx…½²#³3VTŽÒmP%Æð0‘öð8‘~ d|;¥iÌlð Œo>­.‚ž¹q²Bti¿Â °�‹ ^ÙMµä�æ²›n“¹’¼q²‚º¤áŽxpŒ&Ê…ÍUKš¸?�÷³ça‰Ih +D›Å9*l“m˜„¶„ —�RžæP½üî¿_¦c]%?‚�B£2šk±¬+AýUÛôNÐ@Æ;!¥r´Ò«ä{Ɉ–Ê�²B”y¯:ãàþ5�žµ‚ãÒ@u2@¢jÌÑè³(È Q¦’óÇö.�ó#ÐÄγù½nŽ~-W� íI !6š\}»O€&Úod/FîØÚ*ošØu2VË2m´ÒÅWåÍÂI«Ë2·/ný‚öã�¤¬UP&²y§ÒyIƒQVˆ²“ÑJq¸µÑÔ–6\´–Ï£F2—ÆÝ̽‘廬ãQ ƒ^öK%I�”å Êè;\æ�»B¾_á²ú<[š¹õ*ÅÑ7ºÄù>6§O÷ˆ³ÿz=Wçyä(;›Cȶy/íjÔ{/o9ÂÖ­h +D™6µCsúÔ ‰}‡¥\x\ [§„AWÖ¥Ý9Yy�ÓöU>ëý%߃‰[³ss¹íqRg +¨‹ÚXAùQÞÆ!jOÈ?ñ÷£Æ—×}ãT;‡o©•!_ÿöz¶…gv^Õ.h#“â du±³¼êíoK­ÞY ­?ÒVgŒþÆ™Þï ÊÉ{ËÖïǬwp2ÞzIq•:×$ŸcHEh�¼+PF?ïúuº�cðGÆ 3ã¤×@üÁù×ÿ2!ó¯x¢ŠŽQz¼R?}~8düÓ¯¹*�RÛ¾±ê};<Ý®Ðgx ¤G7PV�n�µÏð†FW÷ô¥íiœ°�‘|m“ðéÑ 5+Õ40Íà i`P5!çà®?©i(Á:¸»˜ª´9DRóµ9$¦æ³9„õ%Ò‡ÁS};eçƒe§‚,¯N삘�]ø™0wó«¾V{}/pE…¨ò®lSç¶{ù~C�=ÜýkYS9,Ðwæú/Ö­¯Ë…"Y1)¯�P 4�¢LÍÝÛ»�»�&w’àVس¦¼½zþ»–<q²Bti¿Âp\=‚z%¶G"á�Éq^×½«ëfÅÐNïÒO˜EQ!š´œÂ¡)=¥0ÀLê4�Žß+Ûø³|zœ khÅOO¸H€²B”ñTºQû…ôÁ4±«YâÇò¹×€Wýjå¼�³(*¨IÍ$¸=ü¯¯o HJ#P6 Qsâ#¿ï$õž ×ÆÌ€ã´ù4�¢Läê�Í]àêG ‰}§ƒu«–€ûÖ¶5KÄÅxa·3 �¬e§I»#lN'ðGœ‰]§Û)PàWM•Ü>½ö€¹Æ��@Y!Ê®z¤CL*WyQVˆ²Ö¥ÛqyJ1‘|ò=ü¤�EY!ÊN sx•©C9,ycO½S Ð@Vˆ²“&�?¶v�T�&v�z®²t2´ÛPåihªe¹ªòÌ~/SÝY}±ÞC´{~ã$ƒ”“úGÝ:©?â¤ç£s8zŽH}…`{õ¬Ægš§úÁ[¦ú%oé; ²¾7ãëKÊ‚ò Ñ냕5£ð”˜ùc{R"ÐÄÎÓÑúmf!ƒ~sT'ÆY”¢I`Ù¯OåÖÕzdè)�Ë>à,Š QÅs?SÚd}2eÍiö�Æ´�€IdÚcä Ê ê’~„öW/�+—L¹USµ¬Ï~ôÆœÊhkõ.$@ž-I 7`Â�Ú/pý#P{Ff\¬š×㬮ˆý ž�3­†îYM€{Öêæm–rãh +DYʰ÷P™Ûõ¯ÛžÖ£1ìh ã'Ôa¿Ž³o2O/gr‰a�²B”Á¥0úLN[’L ‰@òÒ4F€˜—&0—Èj€Äž“VÛrºù²u¬rÌ[‹e·H¡´½š'T_ ÿ(Sz¨pì�ïK–ÏÖÞ�RŽ}DÈJÔ$ü·çö&rÅÊ.Ÿr%įFÃoŒó­�åÉO‹_1±=Ü;}< �¬e*‡~lï‡>Mìü Ó¹ÙL;qÓ£ÕwÎÈÓÑ$Ó8ôc{8ôhbçDßD”~#<¨t¦.‘>Óh"1i¯Ð̱6L)w§p'�t!|ûê|Ûºô©¡ø¥•‘*ÿÂàüi­G)Î@VP—@FMédšØoúÙÅXºkª&ûüée¨µ < d…(Ó~…ç†þ¶rõÒ!d<^,�7¶šÀ½¾‹“¤}¹x.5Òñ'‰/a-È QÖzôü–Þ0x”é™icÚ¹($r±„6HâÅ|�ý„cRlýKßOÏWQVˆ2!ò5òFÓÆr<úW㇄çôØcåÉïÎ\ßÏ-ÈøñQ A“Ük�-&_ <è|‹ÆÆ(ˆlíZÇYšÓŠ«)¸ßÚÖ˜Š=qú0%(áˆE¹1AµÎÿ ‰ý¤Å{nvréw,P90YŽ£òe +Q“Hx �鄚ÞóHªp“«A—G?´kDÈ Q¦ý ÏÁÝ<ÌÕK‡j�{à+i=H¬Çÿ‹”¸4�¢Œçå8<ßô=5mP;,±5gH9*�}^çÇüìYq�µü¨9‰ß\½ g +D×Ije–…Í5ƒ(Ϩ’zNçôYðKêtþt¢ìì³ÌµþæÙœî.ÝíiM=|– Œ�¥Ó´H_j]ʳ…¤L(-qÏ�²õàþî¹èZâ^ÄÈè4C3h^jíúcn]ȃ”¼–ÜáX.ÉîÞÛØ”üÞ"Ì´^³�,ÙUóÔfòkþÞÒ¡¼òáGUÒ�Ôõ�)egë!Ü8‘ÃÖß¼Û‡ú~RÍ•öØÚ•±ùŒ9µëW M[åy1i8À,Š jâ“ǰuÔ{jøGÿœ›_ª]l½õ)ò¯>*Ó~%Oa¦~”ñy¦¬=¾ž¾Zk·ç•Å' dgË®Ò9ßD+¡Am1'c•Ì=\ïÚH¥SVZ9w"Ôæí|ßjpz™;IýÂËûùouJ<›ª}f)Žº…£.k&@uÉz½þmm”ÿåm£H�&ö”nñiu ¬ІF(k¡Hó†ãpªiÃì5 ¢BTáä�€q*ñÍiq*úæ„ BhO*�ÎWÒyéÐ�?ñÔ¡1üȹ#�uxå÷o×?·3£ëœ�¬°X§ùÖ¾ƒÇsÿ¬¡VGØÓÛ ™âLµð•_øö#ÐÄž’¸pþ‰bé˜Ö«üÓ&ùù¤ ûÚü6‘exH®†Ï¨ ‰ß¤”ÚÓ³ãhbç·Äø¾Xf_CÝêM$-ͽSþM� ªÄºW«‘Wço«‚ð3ºjÎ@Vˆ.µ¼ÓüjËͪ©ŸµòNh +DµÚR”Ùj#%´&•ì¢#5·©ê ü½/ùão0yûa2šø%(÷†æþHs}ŸK€&ö}ëNßå†o¡~Añ3¸M®W€I€²B”åà{ŦhÅò�kݾoY}ˆ^�*°îƒ* y  Q 4‘‰ ¤®…æäÔ5À™ÚuÿÕùž{½ÑXîè }`~ãL¥B`vÙ¨\Ïž‹8éùN¼ÕÏšaûY;ÿ&¦ÑC�®œ *¤ùQA»ž@»Š™áÕ†[ZÉ–ÍÄ]u56]ÑâwuïC“ù¶•�¸>S«Í"4eg–onÈ�Ð*Jb'HéÆùÞ ‡vd}Â¥~†^½·;e‚)Ñv÷h ãv }c�jù½×Sïæ]gÈ™!m°R éÓ tAR±JRìšbùpÆÖ»VxÌb‹Ê´_©ö Ó. Þzþq–Ï{=Öm›ÚYó£2z–Ûã»ú @ngEe'ß{ÍJyûÅm”ÇöþH{Í(M�ÚS‹gçñÛÕÏÎgt`ggaÝÁ’±âº£•ŒeëŽr¬ˆo^>Và”‰²Óc…0±à¶vubI·µ“‰ÌxwÛÔMÏó=îÝ™äfÊÛ#Ý›ô^É5ãÉ"È Qv,ë&üÜ#þ×ùàôT‰²5�Ä_žmà=:¼Š?ò�·*š¸`°XÕÞïMý‘¦¶@ÕO”É�ŠœªåG§^=åæ#Ê@ƛߋʹ²üMpø½´ãºÐ öñQêÀ¯é†#Й¿'©0�ù'7Ö«Ÿ¸tc=ùú(i1ÅMñVú~üJÛc 7Ü+ï,€ä·�s4ˆ÷¬GàùÕ«’@m5ß%ý¼ûn~wýß8‹¢BT!˲ƒCKØR£gj¯óe± $±9Êh˜uæÌ�ùµôz´c¹¹¥™Á�Ùãlßä„…è¹ÀÇfD"ð±´«yè|Ìý¦\È#GY!šNØ¥ÍòòàËP!ç[îÈÆGÏ �¬eZ%—М\Ép&v]brbµ;‘É©•»#TKêLMÄØ/ï¢qqµ/[þÌ*Ù«Üh^h +D™T[ÅõTªöýÝm´Ú*4�¢Œ¦µ¤(ä�÷„¤´9�Œž„Q‚‰£‡Qh¢½DW¦¤Ä):ÿ[§ÒʨR�.Þ±¬‹7æEÎüfáΪ�êÁÐ@Vˆ2íWèã’kWB RIŸÇtÊèš?«HqE…¨:Y­3ú¬ÎšÓ iº¦Sتéõúž8¤tMÈ Qk¸ ´G;K0mK3nÙ›[Æùľ¨Í·=ü+ât>\4�¢LûÕú›O]Y_ëZûµ§5õ�] Ê„TVÀLb*+i,Ê Q&¾.0=Õ×ElÖ(ãã™TÚ¾é×ýÑãªRQ¡³(*¨É‡hËõ½סsÚ¨‡eèWC’µ{þ¦Û}¯uðÀ;¼°_@ÍÜŽq‡ ;AµX9P&v’\�µÔ²¾öбØ€}L ©%Vã Úõ2>4±«t¾¼k ØZÎð¤4ݵ�MµŽ°\KЮ© ‰]=¹ŽÓ�Ïû~`ñ�uð¢MÓÙ Îdû(–¼ÊõZ4±§Ãú+l$Ѧé[§°EY!ÊÝ~zÊGïõXê..ïÇ÷r3m§È ,Œ éõ"NzÔ“ÏÚßýgÙ½~Cå4XZwßÜDXÔ7‡ï˜ÍT**!–vŒ/Ó”U5�äºFY!Ê´_áJÞ-rõÒ¶@gÆôoÓq³ÂÂ[°†öƒÊoœ¶�‹yðcsz|Ä™ØóJLw‡sŸýxá·”U§ËÆ yÔ›•\r 9¥@Y!ʶ¸[­¿å—˵_�Úÿˆö-O€Ú3Rnpž^¸ª¾5~ÿ| )y‰,5*Ó~%§»2õ£¬eRZ Ÿ}—‡tW-/0â d…èR(ÇTÖ ”h +D©üa0‹´uJ-%5Ï¢|½+mè5m·‘ˆI”fQTPSíó\Ë[9oì¾ï5cÆäF¶Ù“µ M>}ÖóÈ®§Äô�6¦pÇÙÚ>ö gêÄÇL«Q·žKq¦õ3¦pfoùemê “@`ªiù[㤸�¿�ÚÔó­¯Pr\3½[ Ps±„¡ \Nˆœ‰NUÃ<ŸõSØ0oÈaTº7ä8(?p2êY‘ò£œæV½~ãÎÏò£h +DOÍLaÁgÒ zic‚÷…–Ô¹Wïö{=to¾ Lx¾êÁü=YW9�' De*qylïq9Mì<9÷¤#ç{à(DY!ÊèþöÚ0ÛŠhº‘'½�ÃÎ!„£‹\럜÷ƒv•ð>@,í¡F4]­ïGKX.M΢¨U ©Ò-*�y]¿æ¥›g¯P²B4‰$B7_ÜI:¯'©Ç°(&$BÈ Qv2N).p:»‰Ÿ¶&°Câ—Ç;¦êv|ö‚ñ €²B”�ÌðÓ¬IÛ“¼¯ÀÌ>‚æà1{�ˆh¢m©ðÑàc iä#׺Ns§–j|=§Ý¬ ä`�õ‘ú “ìAÊFUËd´3µ“�¬µ´ZU²eÿI$/ÀÈ Ñ¥ý M½žH"¨WìÆŒrâoÎØ}-ýe�s8Y!ºNl¯w}çój�ôÝR$ÂÙ]d ާHÀ~›’߯–.�ß"ÐÄnG'b¾ÿ"£­ûÒ�[£Ç‘z�éûÆ]»g�¦E3$Óö0ÓíñØiÔ‰ €²B”ѱ‚Îaïî¤ÁH çÔÈÝ|*•I SbW%ÑÒ¶¶‡ß5Þ÷ ‰E@Y!ÊèÉ9‡ÁÞÔíû´9iŸ“HEÕ4©ÖÔð©p²‚ºNL� †›h©¼9i?Ë÷<×ýëùM®ó£Þv°¹©#Mº‡Æ �¬e4qIÀávѶ9¡AmïI ..RJº¸ˆ‰UZÝc¾Oý˜…dæ±_ÿyäd樌“¼GíHÞhbW3ê\ì¶L�cÏ«¼ÒÛ׎Ü>Ý—ÓD�Ÿî—H âñ“?Ç1&516DZ‰4·ÐŒÊè˜i=>)]1û½ NÄ>æfxÌ`] ¶_@Je¦¦ÊÈ} ªE* Lì$ÛRom¿¾¿:Ÿ˜º°ƒwÃ:R¦.1R[hN&µÎÄ®“¡rÂÑ«YN›m¢õ¸í7G¤fÈm¢¨Œ÷}Ô~á}E ýWìªj‡±Ge'þ†ôGÕÅì·Š|^·C‹¤œQÕIÍä�È}†ë¢~«.¶û�W—¹Ï0*ÓN9‘¨(ŸrÃQéºæÈŒ£:2q¢Œ:2©™“Áp=éÆWÖœ´4í®ÕWù4îþó¶“´cep`I´¥@Y!Êò�üØÒ…�|šØmúá-õÖ¯–ùè°1§ÎV[AŸGS*è9 cæƒò ¤€€3­Ÿy<~Sòœï;¡LŠÇGœ�¬ ®í`s¸m4… ­w|G¿š’ÌFvãλ1î׃ŸnCvØY�Úö %yœ;0êUIeJcg¼ýŠ÷i| ®@üñ8g(…¨Q#�cKj$0¢Lé3³û~oõ£±˜NŒÑhK5»/j�ºY�í]Ø­"Ðäοží.¿ôfŸì�3:G#jùœÁ9j¿ÀR�@íy–ÅÔ,M¿Êáyb$;ÃÞùy?0!s 7€£2nÏ�Ú/œY"ÐÄ®RNúk³ûÇ FéóÓ¦©—Mÿ^╹Q•ñì™Qû… ¡4±«lSJß«|²ab”��mG,ÅUîÝh^Ëq6 FY!Ê Þ"?4ĵ¬u"òS.ŒÚ¹/N7ùÜÇæ©ÒyZ¹zAj’®öRµdçÏ�Õ—â¨IUiotwr˜0„~nñ¨ÖU­öqÙCr@NŸ«KÿQkWÃß8ÎM�º”ÞÐÔ…^À™Ökfs¸M¶ARî´=7fvyÆ�c^Ÿž¢†—Ó…¤­¦Ip²‚ºxͨüBrWšØÓ4ƒ N·IÍ Àye…(«¿zµ+ï=�¤Ñb0i žôÛ°¤@ž4€ní’ÐV¾l•ÜznŽxIhÈ QÆ7ŠiÙrï�D„7tÆÍÚ­h +D™–É9¶v!“3Mì:{…í–œzÛ¶ëaÖk|7µ[9Ðô ºÖ-·þj•Ü/u" d¼d…Îaëo^mÙ¦‘Ò›ÝQ™ö«ÉSkšäs ®hêGY!Ê´Qî„v/vBûÎÇùpá;�@>+ÙwŽŸÔt«Þ#ŸÛióp§gû¨§épÓ\4�¢L¬FY®FÀ¦È(+DÙÉ;ú^`½û#ë]¬hò♩œ¼�ïBëj¤=úÆ[§ÚÒÄ�eßR\¾“£õ(ÃY¢J± Ç–tÛ0âLë5µ?Ò{˜ðê¾á'11t�ßñ…ND ‰‹IUßh}B¸&ÞßÔz• d…(ÊÄY‡Mñz8[µn³ŠëzU×­Ç«ÏO¬OÝבµóŒ˜H=6w!‘:Mìû‘Ì�)ÜêÒÝeÂùF¹"&O‰;Rb"P;r�Ä À©‚9Ú3FË&N£”W¡fÀh.Dìgd[6ˆÇÇ´™-üy’=üy“@Y!ÊNˆj�k2O5¸åŒ{Q-I% d…(ãŽé†ÑÈ6XB{ZhSK^~,-‡výf?—’—#Ð@Vˆ2v¦žª«öñ~¼;Ko8Š9ÉÍxL�²B”)YÂc[j¢pD™Øk-ËÈëæ¬°Õ0}]I2 0‹¢‚šø=L^AÎTwG¹“ln°mŽ?æ&Y¦CúLŠ3�¢‹ÓÔsÜä×˵mé~0”£¬eÆnXÍah7¶±Ú‹2n„Jo¯ëÔÞ v['{ƒ0T9L¾ŒV{�ìnØüWòûÒ®žeï+^W5Ý7ã|¿Q¶]Q¶AS?(ù¥!þj–mkm#“ d…(ã¶æK÷¯ ÍEYA]Ò�p‚¶qQ”Ks=ßùªsåU-ÖÏ!EÙ2Y¥‹¨L<>Ž3áÂñ1�N+<>*³¯.g±vu±4‹q*àí¸âÒ®ÇÅY¤ÜŒŸ–xo°öma×Ù•cùlÄk'¤¤Ó8ÊøéWóØÞߺõlÑ]; lœ9“ŸLþonã-~ËÜ>£ÅèuŒš¸µ8þйLÑ]Þ¤ÈUÌ÷žw^v ãSk]Í=²«ÞÖº¯³QsÉF �Œ»¹ˆÍ“ÛoaZ¶é#X}Â'×<ç��;B›=ÂókÛËÎÐnŸzûÂÓ•aòÉà9šõ·û.«,)Ì¡•qƒ5 šTE� ð>.=B´…1E¢2ñÞŸÕÃòþ<;e[|…h ;{…qïÏQhš¶©.4§Ù¹Ú¼º*}÷ÝR*.Ì«4��Í+eŸÅ[ÍÅ}V»Õ?ŠCݲu-®lðÏ^k1Ô-‹ÎŽ6B¿Qö/Ág¢yüã˜Ê|QÆ=þʯ0PÖFER¯DÝvƒñ¶SOëjïôÚÎ9¾�¿øz4A™ò.%‚\\½d‚.{QVˆ2μ^7E÷ýNSgĉäò€³(*D•ô£jóx÷�35¿EQެá¨ëÄ`¾×¢®õ> ¹/�Š»žÞ‘Wžã87èRÙîcsØîhbß5Jwc™Ò�/'Ê Qfq·óZHb™jê*yJ(¤8žÃuIoU&•Ãl�úÉŽîéP]þ5 a9ÖÛÐÌh‰Ê´Ñ“óžØ°�²B”i¿ŠkÚ×u*¨WÒ\N¢N‡ñªÚáb—˜Ò£N PKMÑ^£œ|ÅÞ¿ÒÕÈg_G¯F ×)ÐÍ4 %�;ów_J€œ”•åü€ˆ�ùس28?à·=1š=ƒ-E±gÀy�„ɪã­ò æéË ÈƒkÖË Šp`Öiéiuï×~ÿ­$QÈ Q†µàs Îàã(ýlLûèË{nóõæ‹î÷˜r¬[gp?˜%@ÿ¤òMcs¤¹ãÙìÐľStê÷¬Aý—»lçùЦXõ *Ó~…Ÿ÷Iñ¦~”ñµ"­½0º|ôÚ g ;s½­lÚë½gWAùºPG¡;4œ�¬ .HáÇTޱ¥ Ùó¨=n[·PdÏ÷Iø|zëÆÅÕ®OœhâÒ™&iŒM]HÒˆ@û-eCxÞ‰�í2ïÓYˆˆ@Y!Ê´_áÒÖ#‘‚ze�d+àj“ϕ괯œÈ‘jž“Ê­úîõ9�s¤¢2B_U«ôµˆ2±“„˜þö;‚^ÿ¯2¾¼‡¡}Ä—õcØk @Ê—eÆt9Y³EÀ'·ôNÐ@Æ;¡pÅ&qÅø²5qöŒG®óÞòkÞŸ¹®%ïVh²ö'0ˆZ—2œ�¬]`ú3º�ö~í§8HL ¯¨¿·H3S@™˜™853…4¨Í|8P ã;9�Ê×øw»g¾�•ðbo+*ãe-½¶ø–´½¹»†ÙR—¤@¿läµ gdâ&§2Ï sTšç"q”Ísäˆù—: ¯a‚?‚6§Rœié�üâ;—I~8Y¢¬e'¯Xxãü‘1hÝJ�&(ÙÿýaçJéZwƒíÅǪ9ïÕ,wP­\ò]¬R �¬e6AíD{›F)ÐÄ®*¥{ ïjéöÐAVˆ²‹->3)X£ –X°† –Âø�–žÌøg&¢ÒyZšêÝ 8|žÝcïÕè+ë¾gF¢Vç!'@Y!ʸ•VLªß}£_·w¨•ZBfwT¦n{XŸEÜ÷´-âΗ˜å¥S#ÛÒ¥–‡aH7å�Zº*òÇsõçЩÇ™¥A—˜ _¼œ €3Fë:cKç#,•53gŸDÜ C,óöàÕQ!ªN–« ¦ï˜5ÇHbQ—ö+™.ÇÔãºÊèrù¯äe[«÷ŒËöÈM{|š+èvÛ?�¹G}ìî›HZoJ�²B”±)œ˜Ñ)ÒL·ì˜-øVâ¡×ï`]{ÛèÆ³nF¾—vBœ‡¾¤8ccÐ¥ýJ=wSõ£ì¹ûU¸›ï”Ž ó›¹–áè3—sp-ïêÉ}7�j‰Íý‘æêP¥8ÓzN–c8X…Æþ°±6N)δŽ+/3û¥w'%ö³7—�) �’Xƒ�¼ÞôGjÁaê°�óEÛÇi]êÝT Ùrñ„܆ Ãñd9vÚökú\Ó½/ ƒî?¢»[ï?aÒÓÕ¹eÕÊ=}8–%ŸþH-!²ó´5knßt?DQ•­—%ŸEeI¶bü¹œ°ˆíDY!Êrû¹õ¢ý¢që™ý‚^ƒüü\Ž--g:úêÒs7˶ º¸>ü¨êŽ9F­TVÈ1Ê`4Å(j’º­æÅÁÓþWꤚçÅn”¢‹î{9¬?òR«Ÿûrœ¿B{,)*Ó~%'81õ£¬eÚ¯ O´ „¤]È9ÍóˆÆ5ãBQš¸¥™2ëCx¸È}™ÛíÁRªL„È ªR’e<³îgßB:Z²LÈ QvR~íÙÒ3>S'¼û39#Ôi›·!ÔYlS)È Q6G󟃵ҽíi3’å£ Q¬Þ(–}Œ²“!‚W¾ûÇö¿®öÔlˆ²B”ie4# ‡ ­�BsÚx²2$s]Îæõº-¼Pµ2~ã}±ü�3m¹Ð’ÆÖô䃈3­ç{·/àéú�¼þîñK-I .à˜1õºU3ýݼ¯²Ä"Ð@Vˆ²6JÇ5<…`Ú`ço¥mi9ˆ£E?ì:U-T®ŽDÃöÒ2œ�¬]–fi…m‘&i)©§R—snäÆƒ}ùÑ០ÔÈ€³(*Dw&­v‹«þ<ú£Ž¬Ç?hþ›Nüg +D× _ò¿žõÖëUòñïöBâXÈ Q¦ý ©—mh$õ �ógFÖTÓóòÙ#CRFVÄÈ êÒ�¶'÷…n㈋‰Gh +D±±S ®½Çwö³1m!×’Wž°7¨ÖG À”gÛÝM»wwU»l/²Ÿã­Ç1ɯwç7΢¨U$5寖ô¼Àˆ3­×ìd—a-?¾²_çHi[ –Õð¹XÊÿÈRÞýq ÐÄ}�×ãL–9 ×­ïyàx=¿UÏ˺ÒmY”bà8 d…(ûíwž¸ |CÝ9ç¹<Â,Џ |HçL@`htª´… A³MÒ±¬Dñ©Úg!Y1} Ì=•iÞøˆ’½ñØ\”�yãÇ÷}jSÍʾàùŽ@Ù™ï;ç+¾[I±ÊÝÝîµÓ(‹4�¢LdÃ�´D� q¦1É–"Ð 1­³1*ž¢š#ŠºüŠûʆzn—¥¨�ˆ@ï1+/¨òƒ¦�m‚9Ÿ~R#¼8h�&}‚2)•Pj*#i.Ê QF¿¸†|É6·…ödòe ÔW È}{uÝy·»{'R Í}eŒX”Ë´AÀiOH¶ŽÐÍô�LÐ6eR é³=ê‚\W±J®+é�”V oTL+e3Aéùö Ýöm«Yzs/�äÿhûõm+rò?’,w3ßîÖÔúõw9î� iŸ$Å@_q>-÷fÞ ˆõ­4É{#I½›éR‹ß¾»i 4�¢ŒfF­_qÍ$z~zûØÜi®þ Ðľ³�lÑͳ&!¥µÍ¬H³&I~¬T^½Z„̱óá½nŸi“¼ûÖõy·+WÖ3Çò›h +D'à§ó›ëkS:qµ¾Ó‰4ô½â ÏÕ¯có3ô­ºú`¥@Y!ÊN¨´é c{½jAúv´Î³cHšz¿ûïÑ6ÍÙfIºQ™J†Žƒ¬’¡ñåDYA]Ò�jІñýÜïí’¨6¹åÀ=ŽªÄ\é8šr®4¾²¾ÓÌ×üWêö!&Ö²íC`ªÇU©êø&¢¬]Ú¯jf“ß7û¹Ï>²¦éÛQ™¶Jcn¯¶HK¹½t{I_©š.YA,=\H/†UL/–6Tšÿ›ÿJÝÄôbÜBe¿û£Å`î=¦Ìö?b¶·¥@ÓÏQ!Ñk�Iô؉HðÉ}|ž'\ÏÿÎ>ûFÖç ãÑGe‘ñ¸y÷«ïjg ×”óÇë�±?ðã�!�@Y!ÊZ‡nVhŽ©”î[uµ¯TPcÛ¨LaóFŒÌæÅÆ¢¬eùkÃ{9ÄצÝËÁ_ÛO.ïØÔ.ošØoÊѺoÜ©"±lˆé¶¹”⤰²Z"wlî�4×Þ^ 4±ïyHÚ¿¢¥Åõ·°“Ž@Y!Êx=˜Éù�ÏcÙÉñ–¿u�ó{…?ëóÝ[SœEQ!ªxfب[Ï ‹8ÓúIMÔ¡£&Æ™m\R ‰³ŒÕ~ÉÆ[k3HyJÏ#­!Ÿt¸±wÚI:[µT»˜×·vº–—žî½Æ<<ŽŠþáÿÆÈ Ñ•æ; íèéfZ�YrØöV½D{§•Cµã�=p\à du‰Ickz’AÄ™ØóßèÓ:µ�$ß+¤f†Æ¸�ɘíÝjDØÕÄ·}W?ß~yjš9•~lë•>Mì8ŒR–å R_³äXå“Ô¾6g�8ê1÷�DûÚ"Î@vòµ�o*EÕõùáô-ÏÏ9ZlYk„U�lu‹z­?Þ¬øáËþƒv¶s˜ikDòõß_õó|ûÕHŸ+_Èø×ÉÙ9�“™›gHàáh™Ñ·6¾N/Àê�:?znLÂŽ\®æŠNq²Âxaé…¦ô ‰ýf‡£Û§©ós_Y0k62•Z·R O›e´'Ì'µ_È¢‰@»:D¦…O :{kZÅü8²Ê·ÃRI¢25u%âäÜl0Ê QÆëP®6ïÝå$¶ÜhÈ¢‹hO@H€<‹wcZß4}Ìnênüt´T)!­f=­&âLOê!vÀ›û#ÍõCÒoM­ÁžKÜï¸M‹ÜoÜÝ¥~kÜïænœn7Ø\€÷; d…(ã1™!pS¨¹öÂqÑñÐWðh ã^ Z=ÅUš[;Ñß¿ñE©Aæ6‰ÊDoR„Éî$l/ʸ#ƒCRÜú›g5n?¯Ï—f 5È<'Q™ö+Ù¥ÄÔ�2Ù¥”G*£§ík¤!NòÐRù¯ÔoL¬Pž±Ñ�ä”ó©sÍÐY;ưz�2÷ÕF]Š«-bdW6¦äRWÛ:ãª3ÌÍôýh+¸Ú"Î@Æ]m0F)ßG?Ù¦�iŽxº±Aî¡×(vMë�«¾Ô’#Ð@Vˆ2íW¸mö„A½²‡<�å¹Ù�ÓæÝ}»}àÞòØiú�µÜ(—)Ð@V(ú›Â$ü|ýÍ«Qp[)·ÎÎÚ!TkP&T§žïõ#}¿ú/V§Ž8Y!º4fþû}«ÛÌûõÜ\£"3€²B™ù,&ÇA–K*¡=)c† UúÊÕü2W¢¬PÖ8:ÿ„ Ô0K©õJ¸yMKyÊÖ¨K,.Jabòq&¬ùJË÷Ÿn�¸§±æh +D™Bi¹ÝªóÝêo] ´D �¬e ƒÄQŽùVñ$h +DÙÆ‡:TòÚö©úÆ—ã>u GDÍqƒûäôÆÆÉ;ŽNáž ›>±æaÎ#Gã_ˆE ‰£7†DÇÙU¢AøG Â~ú�£AQ´-ó QœÿjÔ¿©×ôÈÚŽs//¶sïâFëY£úY^óáâ¼ÈGQÙáÈúZ{Ú×�AûÑ~<²þšÜUÔ…±a±Zp;!ÅÐâÊA46ò£Œ;Ú¤0Ú8z-â´7±yIC5™õt¾îlõÓ½èZ½œ4�¢Lûž¥zyA½r0»ý³§N63çÞ‚·{75c�„`Ñt3'ÃY¢*­’­LiH²Ì¤B žrå[ìüú&,J…h +DYå /CŽrδ{8Ÿæ½ÇÈeϹK[ ƒJNw0»¢ç²›¦R|3â,Š QEç‘`cã馩q®Í6šì–= šçÝcŸ�‚fêgAXÏ5#ÓZ 6à,Š Q¥†:·õøPM] uF �¬eéúp¬È1hw’Ÿ�iF6¹-¸ù¯_¯Gw3ø!̲oàÇ0Ë9΢ˆÛ'QÎ//{s3û;ñúµóîŸ*�Eœ�¬]گЦèé(‚zÅ@aEQ>�ºÖ½œ�´}1‘W¿^« ÁQú®¤ô€ñªñ›ÙC ÷î>:4÷Gšëp Ðô¾G]¤�ªÖ ±�*v‚AÒÕ+và›Oš­zŒþu©|‹ˆ“ùØ 6¢Ûh;Î÷4´ºð®?¾-ýË Œ‹¸?¹@N¹Àu]£\Œí]à\D ‰�σSC¬ðBl*à,Š Q¥æîlÏ�W_Ù;%äîDœ�¬ .éG¸!ô@k®\Ú[ò³6N‚c~ÒµE³^!î¶Úè-¢¶¯BbÀ. d…(3VØ¡¦§ÕTÕ×F««YÐ@VÎê% Õ?¶ã”»Ú=üòé§°áªú~ û�³(*D•ô£õ'¯=eþv<»çÊ¡<èâá¥áGÛ!{¬0E_Z§R �¬eZßQ;¯IAZëêà\v§ó³Î¨[_-�&ùέC)�Ò$Hòt¸a$¯TO¨¯§ž%þ=@(qæ_ŽÊj�öÞ¼[ÐÂϯÃgÌFŽ™Î“N€<Ã;yàflëBà&Mì8;®/Ï–M壥ŸsǺ&Lt�‰¿N„g +¨Ë`1, \/�@S{:ök³Çjnì7Ö1´žâ d…è’ •óú.l�…~RæÐÏíl1ç€ðÙOu �Râ{T>Ô΢°q—ºšçÂÂ*çgâ"�ãò(Gq]�²B”AáŽ~ì¥MI§êÆMÙ£hâÃ�?i§Úy�¦aC4æ6mÆíc¿ÕV ãD �¬eÚ¯ÐÂîa A½b®3¯RNàÂòµuR˜_Z-\¶.Îónµ|¶­'”æWëV 4�¢L-¾;¶÷GÚk ±hbçÙhå$.,’Úº%°¿´Š«G¬……îKêÌL�#�²B”A½{×ì´¯÷jw#ݪ÷è7Î@Vˆ®“¹ž>Èäí�µ±¦2¤à)(«£¹ÔЪWkÙªÇú—P·®ÇÆ�x¿ë)ëá×îì1h +DïœÕNHç@Ú 8m�ÊõSzÄiOx²ð¼kž¨'¯o4W‹¢ Þ[úPôJ´ï;ƒY�ø7²ßàÓ¶÷"¨Æ Ž�S¸~‘±Hkxø>")Ð@Vˆ2±*1|kjUbú‘*�×fO,…«N,¡+:ÈòU‹ý’W¡õ4qñŒ‹¼îá‰8Óö‹Ì¿ãtq·‰ën¸'— þÈNý;ƒGȤîðr‚nÕõr €²B”mì§Î]ñ't¢Ë¼YÿÈ5‚ ޶e8J6"Ù 9khê+àLëµÄZñE£ÒJž÷�Q(²Vh +D™ÆZqÃöQa{Ú�ÄZœ�¬]íÝÍâšß�4ƒº$m¨1¨ïû±R{äiCQY6¹ÇvôÉq&öùgS켜ĄOe…(ãS{5wë u*Ù‡Ú×8g»�œiNùXÒÐjÜøÊúš¶è ÞŸ§Ú Yße×ÖÇkÅláLÙ >Û6H)Î@Fý¿ÑÕì{Ûk_˜ 4õGšê!œhb¿oÿì¹v=—¸‚cëß\êC& § L%(߫ޒT¾—ŽÒy®-<�škK]ësÈÖ^ÛuµŸ¿9§!Íüë�½ògQÄ]õµ$Í΋]güû¶ßªÓF�QÙR‰‡è[³(*DSv&[‘�¤fR¥T¿ðäT?À™ö6•t6V1��¼Ž(+DW{iŸïeONþ÷;çû=l€‡4ßx&ïY Ð@ÆøJ*[hNOe ‰}§ÔÌÔÖUÓ“ˆ‘e…(ónõdÄÝ�·N¼[Ýw–PFv3Hÿ¢AÚƒ‚ ÊÓ–\cßžâã†Á||Šoö1˜b=G(jáÏw÷MR íéÙm4±ó”ì’~³qEúrúÓ��¤’’ afßæS¿¬ãKü9‡µÏ40MŽî‰Ž—?âxiýÉp2îÄ¡Fwš3‡ÙíåiÉvBêÈïQ‚¼Vm�”´V2D»>ú˜Dr=º¦”KÔúî&øxÐýsô9$ÔzÈ QF×Ë…+ÎÑ?ó³9mù:¹Á}dÌ»«××3/+¹•�˜ögQTˆ*þ½y¦¡GJ<Ä׌.dŽÇ a‹’§@ÎLj# qÆÝ؜ۋ8»~8¬=­†ŒÛ§{hndäÅÐXéýÆQFFÙ(s2uTN„OÓÊüR'¯ñxƒ2ÅÝ?€îî�8Ó3u÷ÃCˆî~òðQös÷û¦õ¬MM[5 ÑÝ@Ù©»ÿÈ¥ÜV _aÞÔÿ�®üÏû £™©$*�úû‡–to€™ÔejŽÌî@Yw©ç¾!Äk `ßê´Åhâ&(]ùÚû#íuVn4±ó·öñê+¶k¾‘ßÀºÌV·ùóåéñß%;rç@T†^¥WÍæü´BS¤©NQI€¦÷tA!"µR!"Ò‰Û?Q¥1šnîöxùz:1/25¡)�Qj0r>s‡öÐ�îÏ0“ºœ»Ž_Õœz¼Þ¯ýei®ã4��»Ž�ŸUŽAÏy{aBcš>uÖÆ/QöÖâ'eÜ_+�úäŸú¨}Ç Ý“B^Ï{·R ëC^�óN¢œ(Ò,(c§¡m5­ßôˆ­ý‘ÖŽ{Ø öÌbF ¢“Qˆ2îÆ kB‹c¥Õ„¦cCèc@:4%†±eb§¥0¶³«Üó#êvƒ°Æ �¬ð0¶ð+8'w"X®]9sïî½ÛîºJìoÅtÏUj·Ka�À!ìOú~|_oäCù8@?`”A6w -éqšØmºqødXŸÏ�Ú¯t y‹ñÿD™lkÃ�uGÕDu5üB™ÒCR†±‚^îé×Ô"¸†ì#qAY‡”øË±1ø2B,í)Ù îuÞ}üR•툉2°~õDºH‰2t1„(HЮÇ~hbWÜ�ŒIƒ†o3FSŽfCÇl¹ÜXDîMÏ„H­L�ÈC©¸÷Zh¾¿»ƒbÒ`döDµHƒÒÄbýAi­ÈœÀ™Øc)Ög¢³Dž{ÙC!@Y!ÊX�\€áÞsüâ¶§mdt>UÎz]í»›(ÞÒ:®ÿý¼• „ýgs2Œ…²‚ê?¢ºó> ‰ý<©�Xø87:«*=h�L¡íi^Îõ¿÷§9ìLý]í;Óñ]ý@™²Ç ¡°þôD©ÊI( €²B”i¿ÂÍéø¦õÊN7–5Ƚ÷ÕnʽþR€|Œ1¿çš]Qˆ~¨«=þ=w#Ræ= $��Ð’˜‰�¦ß{½†g]n»©ËÂúÒ]© P[å¶½×W¦½žbPþG”w/Óoœ‰¥5gê—º® ·“<|»Ýé”iž,Rè$´§‡Nhrçá°ï9Xõÿý°A„YQAô/»‹Ì­G?Ãonk(`ð¬—.=ÞÏépåN4�¢Œ&õ­_]M#w#rËê†$õé¾åtß¿ Jȳԣ2^¿ ÇÉùûØ`”¢ŒOëiޢ÷ýU@òõóÖv‰¡dHäÉ×Qg0ŒÚ/°6"ÐÄ®Jü±ïj?}æAVP—ô#œ£m\åZQ†á“ó_A^|䤴d8šòŽô­ŠA\Ô*¸ H=ÿɦyÝÛèþèY5"�& d…(SjîŒëí…š;hââ NáAb¦Së’ðüJÒ”F:ròõä’·—¢¾@:Š@Y!ʨ¯ðYýT�÷ôèîsäřҾ¸ȉG8íØ`åO³ê¾UCªÖUÙ·/eØA$*C†Ö<5«ý.7'ò�Z«�÷íȈÊ�œ•)1“ˆQc&ØV”Ô%ÄLÜÌ{mËÛv›•3˜�¬€*¸;¼Ô³ö�ÌÚöÊR éŸèB¦¸Ø �*Ž�H�ïqöËçwül´~g'øñ›¹p‚�@?@àc&“ ç½FE2G•S¾tå„;�ïÃñ]ºq"Â,Š j¢çæƒgôî£Oš’Nûy(Òwéz~”�¬Mü•å8<œ÷¬ì´Aí¤ûg?¶í~nü¤çÔÏm˜qÈ`m·Oq<áˆe9CklêC+Mï7�×uâñ\­º� ®1/� þ^ˆ’íå|Ù|¿¾>ñ£Å~ûómGÒßm°`]T¤L'ú:ýì¹×zѦIÄÈè4~´þä]£g/�¹î]�”¹1ªJyŸ ?±¡(+D&Å?mú/w?Âø þÈÑ^Q ädKüº†J§ù3àñ®½/ááµ³â�@ûøÐr =ÂL¿<Ð?A9ÐŽßn”¢L ´¯Gkßhý~ß÷¥@{È QfáNõ�dòîjI›Ò˜étœ€£¹š¸^†üõøtÏœÈK�@Y!Êx±Ä6y¥~¿IÏcœ_¡Ò óFej\9âä¸26e…(S¨Ynayeþ×k¿©R`gÊ@Vˆ&æŸÊQHî¦aÚœÆ=V[«!éeÿŽœP�±�²B”�˜Ñ)Lm¨„ö¤`ÕíŸÎÁi«TºÜ¢‡®­RÂ:­¹ûFãÄkELÜ@kÍ]+>o–cè rK,*C2ÇÈæ6eçÜo‹éQï?^ÿÞ©%¢Å�²ÿ�Åäׄø›_��ÛçŠÅ�²‹©ùÊv³iZª÷âP¢(‹QëP3É´RœøcK²?ÂLêtúÙ;Í¿~>ïî5?û4�ñÏþç¬_¬ã6Ù7ƒ9Û¢˜á,Š Q%¹‡å–Hvr@;D·ŠÙ'Ïã’ÿ%Ƀkù¸WüR’<ñSK¼È±¹ ¼È4±ïZ±�õÕ4gá—k§ ‰@Y!ʘ ’£ÀƒÙgUÚšä å%ãÝGøÜ/»R Àe¸�ÜÎ!˜_@ÝŽÈì<(UI«ÄÒŽI”ÌùU먿ÜR™öžd”̈2�•¨‰F, Zé=þý»%ÁØ'Np`Xnç7…ûeˆ53 d…(Ó~…öxI½bܳ�&ÝDÐkÐiùæ£x èY"=>â{«ŸçNyÁž¶õó¾Ýê åÀqEí‘ähâò,•@›û#Íõ ÜoœöÌ'/ì^¯šýøkÛñ ØóÃ×*E ,甎ª/°f#ÐÄ~’=²9p>«!¿­eÈJ�ËÉÑóóÈùælmBé¨ýo6Mì*%¾·+Iß{ nö«âÅ`ñLÕÃÞ¿qEüxF²Qð²­±±?l¬¿ºgZÇqU\-¨·ŸBÖ•w«‚Ùƒñ�Õ†)jG=J••ë¼Çˆ3±£'ûªw?ó}¯´É‚ñ�Õ÷Õ¨õ8KrÔ~�í�&v5ÖÇËcrñl›»ÌÓØn?9~Ó«>ùó9ﲜãA²BÕžìq¾ôç£jö…ÐŽð’<†¾Úº¢ûëšÇ0â d'Ãn‡%pºW—ñôÙ]Â#+4¾ˆ6B?AÈ Å·ÉcyÇëIÅÍ̧Û*ÇcOúÄŒ:•‰ì£õçþŠýŠW?D+䣀³(*D•F©Ù–Œ×j/ûú£Pj"Ð@Vˆ²“I�â�v\›6(S̆{n·Glžƒºˆncsð%|Ç&È QF÷ó…îŒ>2isšoD£µF«ä¹;c$ºQÄÈ êÚv±ï÷Ÿs]�Ò61�$£±IržÈºz¸åëÕa·�ȉ@Y!Ê"q4G i§�‘ДƊËvÎç@'F#�¢yDb:\~j6Hw §=�YòÚ\Ï^µ ãY¯S³ vâTy#c{x#¨=õ©A¢ x]s<^u‹(ÈøYMah¼&ÿ¿õp³¨GC#â duI?ÂãU/•�+NjGäUw�zÿK7‡šHDÈ Ñtr(LqxÐê|µ´AíÔÆª)¤¶]u/{çõž�uIr›�Eé£.•q2-Œ²B”‰L—íÕxÝÍÏN>RÈ.h +D%e¦(´Ÿ�Óêgsš1N—ÊG»ŒÚï‡ÛµL×?°¿ÝJ€šÍOI/ÿùÃygÏýEšû#Íõ7˜Mì;YÀ�öãæX5]o{BºÆŠ@Y!Ê´_¡ýÜÙ½‚zÅØØ^±úŸZ®pÛ0‘¯î†ÍÜÂ_�HŠãtõ¨+§ô ]`ôœi}NÏ ñä3>y”�œAƒßoð«6ú«“•Dƒ? dÿQƒßýÆ>ÐËÜÏ�¢Á�²ÿ¨Á¿žöÜõ;Ø.˜û#Ê‚„šú?½�­¸íã9¿ûÀˆÞÆ4��xC.Hþ~ã§Ô¿/ab0÷qT¦øª#FöUccZªOðUç‹3µõHx#Ú´g;}2õÐûÛé]¿'¬äF&N¬Ô´Ã#aßÇR›P=_ú¿únw;^Ö˜üñ°µE2 gòãÉ�ZÕÀùÛ»Às�@í©ë¯êõ×ë!ëÑ«‰}]-{¢÷gÛuû¢Tý¸­ð6CÀèÙíKRãÑIœgIŒ-]È’ˆ@»ýãµÔË ™¥üB~B<�õŠ@¿q<=��í�2(¿À‡ 8ÓúIü1·Ý<îËPÜ£ÁÜF%rŽ;³¾‘©1j¿@ñˆ@»J³‹?Õºú¼v1rÜ£ÁÜc< �sÜ™õ�üŒQûbGšØÕ4Rpû4«÷þìe1R�²B”i‘¿¯Áƒ‘�c&x*ˆ0Y!ª:›|Ÿ;ëŒôÑŸÖ“Ûvï$Òÿc|«ÅœR OÀ`Yˆ¡¦ÏP/)òoó¹®®‡·&<<£ŸGe"A¨Õ|]%�ƒ;X Eœ�¬]çeûHü ÷¾¸Œó�²B”å© ã$¹�ž�&θóyæ¾&@0¥¼Œ¾ ‘òA²�|U÷Êeüx�~éßl nF3´ì �³7™M‹”QûÞMšÜÕ¼,וëº×B©ç%”Á#A ` 4Égm¬ß� Ñn΢¨UÒ�д;ør劙Èn¹Y•׈{6€CÖ½W �3#1þ­E¶Çö.D¶#ÐÄÎK�äêòÌ-Nw!ŽpE…¨B >…`®R‹¶çMiyOiXÛ—®d=èoe†Å°vÈ Qy;s+R±jî+Öì–¸¿ŒÕ„ÛœEf½¦åÊñhÞ;•Ö9×Îù·ö…ºu)�Ñãù¼ûÓà¾vØÇ“âªû9·£pO¡€4‘x8î�J€Ú�óÍFí8uhbW5:ÛºÌûfðñ…Íç¢ÑÙ"Ð@Vˆ2íWpHï§ A»pà©5·ê7{<×mqÙ½¢¡ZA$©µ}4È Q&ÇÆ¦.Ç"ÐÄ~gıû­}ÀÏ¥»êDâXÈ Q&kVƒÉþ —˜5g +DW:‰* Ù[š?ÝÇ«M"ÈN'ÑÁ½*@ÖßÌ•B´êVKM2êìÕQÍUl*ˆNŒÕ0ƒüªIŸ›Ï{'? ]4ÎÖÖ¡È £8õãÝù¼«v<È%ßÈŽ2aYà7*ãd4êÆ!ø#Cк•MÏ̲”»�×¶ÁæóØ{I9öޝ Ê Q¦rû¶=óé®õgßÞn_È QÆ ¾9nŠlËã†ÿ³=‰¹©e6ÞïÍx¿ï v)±1À,Š j:ùÌT=eÖsÂrôÂä�‘sIÔtr–ŸýRÞÅ/9ÜÏ“!mîQ�±*¹—£ß8ž5u©!�¡¹ �€3­çäÄ1ô{[cÂío1õ´M¦¨%Àjªqx±µ“ U|/Z×ÙÛóÊ Ž[Ïí�yÎ1äÓÆ*È Q¦Ñ�ÇÖ.Ð�#ÐÄ®“YU-—uÉ_ö WL‹.�¾BýÆÑD1æ=A ì¨['ùFœ©ý\·âzªÝëpcVX<÷ƒÇoœvHçìÚAùrmÀIÏwrŽrêj«ÔºÏ¬í+ÒX­h +DßÁrú :)(mPsBàÇ½Ž­¢ë¿»æ@á�ßlúþ„q?~þû÷ØÚîï3©Û ÃvÕR)°ËÜ_›È°�@Y!Êü$´ÛÖ¹ñ‹ëIßMS«Y[œ^ëz°xù3Üö*Ö"¯5 d…(Ó~kL? Ú…õŠÚˆõ4ûxÞ;‹1�â�fØ�U Ð@Vˆ2�8¶v��&v]㘭šÚz|ÿÞ1¤PÌ΢¨U'§Ž †[D}Ysêv“³qãJ×z ‘xÓE“½)M{(ÑDŽ@7‘éöžâ€¾ß¾w¡½(+¨ c…9íÍó¾·§|yÍÖ§ñ/`Ó¬í¹§ü3ÏG¼À‰8YA]Ò�Ð>ï“+Lý”0ûÆç‹ù²ôü�@Y!Ê`¯ðÙè»ÉôY·¾Ý_�0ÒÈâ)�R�ûä˜q <Ãú›zØ_•>¾ïLzxÂe iâVíƒU2mÞT‘3pE…¨‚$šmrúnU¡þP¤'õ9΢¨Uj~lMÀGœi=WÂÝîuxÔÀã^‡HŠwÎ@vržÅ_yšŽûñ1wŸx.ù<¿®fh +D™ÖUµâ™;Aµž’à·-ëK|Ÿ„ÙoÕÞª¡ÕÝ>Ìq4ÌU‰|„SùØ\”¢ëä øÞƒñ÷-ÃãY=ÝÝJ¹ŽHÏžIp²‚ºèÇ•Ãð³io/oNú¥�"…¼¥�ëx“�бÁü�Çæ¿téda$‰¨L£“D”L'Áæ´áÔ˜íâ¬ú]õy�¹�²B”»25‡ÁÔó²Òæ$ÎPš ZË8»…¾ZÌmá3Dh +§9¢Ç$HïìkÌÓ‹Ék�Ûº”iò͵…¬» ]ÏÄ ‰]M31ç÷\íO?Ô5‰ @Yᙘlí¾×åj1?Ø “Û0ýFYš‡(åUWç²GöËê[or>6;àF]'GüG�{Ì·½ f°E¢q[µS gSÖrô o@ö2”)o2÷0Äq”= ø¢ìÌàd‚Žã!4M|™ «n5<ïå7oáK�V�²B”�øóR\–ïi(m0Ê QƋ鎙ÚUû•kÝ:DåzŸ”�¬DM[BËñd�¦ ¡ã·õGÈ/Ò¼È$ØQ‹w=>�éPÌ8$úEÇoïTä‰~Ì‹ ,ÂQ¹Î’Œ8;JWéOå¸~¼ÄÐ6ê�k]‡=@–y!óC"±pÔ~�‘�&v5g$Þ–Í@¾÷€¸ÄHŒ0Y!ª¸qŸãÐjïÒµ#Ô€x·w}ì|öq\‚ûy1rú1®ç?Y‰c3X‰hbŸÉâľ[]=Ÿûž®#Î@VP—ô#\TºËkÀâWÖvF†³(*D•ÔqµÊ*Cz°»+*ï°ÇL½šÁâλ�“3Ææ¶Ç�UÌ %Œ�2‘L8$aq2i0Ê QFý§ë´tÕâÎòí£¦|…Î�J€y�OìÏ\=ïϼ»9§êsx>=¥22»ã)È Q¦ý ?æ6‘õâÊDêsk#!ÖçÆ®’Ù,L·Øƒo}‰tžFY!ÊDV&àp8+“4¨�iJˆ¿•Q&~ƒt/»×œˆÏz,{í¸1%Z�ý›ÿ�“ _•Ñ6¶¦3Ú"δžZvîùŒÝ烈ºL£¬e'‹ã§Ù¤ï{ϪÁô‡h¥öØ|ÔleJÞ ÚuöMìj ½m÷óMçëP(p|ŽÃòg +¨+§…–t.Mì¶1 ” 9b 8ÓèY¡¢ùý©�ÿz=¶ÓºV¨p²Âª}½<ó¼´B»:¹�P&Fekgr ‰!ÞH) mæ¾PfÍiö7±i…‹l‚ÉÚ»”^#¿dAšš­ãÁ¢ÖX?=3RÚ3¥�Æ´ëüšØUºÍ>še3}»‘ö¶Nw*&@Jûc†’t‚v�†@S»êŸXËë½ß?³ÓFc¢ûÇÍM‹f‰°‹†¦ô]€ÚÓžD3^A��è�ìDÝI–)+“lk9a Ø"eŠò6”އóÚYŸ_Ï×s×/9|›N)Ð@vêÐ]ó£ýê»�Š�ˆ@­ÏíÞôUÑ´ñgµmp²“m=«@¯@þxå€c(#Œµõ[Ýdü®Þ}A”ž?Ê Q–3ºYx1ÒR”qŸÍ@ ôEέëçzjëe$G#«/Ž ŽrŒ‰Áü [æ%ÎÄ~RVGdöùgSÍ÷�l;©D  �¬eگІéŸx®^2ˆþV`±éü-È QÆý.ï«FÚ³'ÜùLšÎ ü�Óì*‘õ26§³^"δž£·~™ëGã_A¿k'–P ù�Ýû’À”E�ñÓ/4±çãÅ5y®ûg]J: Nb¼Ð@Vˆ2�lÒµ<=8|�l8YA]yN¸$÷É”µ$­îì–@Á¹‡UóÊ)ÒêŽåH纠=?Ý”ØùÝÖÅÕüÆÈ~Aˆ÷5ê8e/„ÃÊ¡õ\6@,íjî#�}×|äøÄQvæ#�'Ä÷T/^æ×väG—&ýÚØ¤@êÒäçÈŒú¾þdi'¸ãÑK£ÌÃÑ ti´v·Á+•v•t§˜Dk �¬e'³øVp§ ?÷ÝqÌ‹ˆÉm¨RM/ÀDJçˆìМÎÜ ‰}G[MâzÚt†ñâŽöïùGx7QVˆ2>¯êM#ëˆÞ¼^FÓð�˜†m¬R å(;S"˜ÃÓL"Áœ C”¢Œl9 ó :¿+m.Ê Q†,ˆðDš L|¡Ãµ—ލÁüuU½íˆ±”-p'úÜI€²B”Ó5¯ÖžÛÞÏûs+â$v€2Þ‰@ªÈ!èTiÓDhKõÐA#<¯Îì uÊì 6áTÓK>�['vÏ?ž¯úÊœà(ÏÏj³#4§3;hbßYÄ +­¸¿›÷üî1çåV6^{>:Ì �¬eFuÅ2Fr'°þ‰�‘N°½tªŽ£z¿-¿|Õn$þ„Y�¢H:ɇ–Ô“<ÀLê49åäLX<¢·> Zí¼O?ÿ‡g|æûVϳFà„Þ{õG“FèiG£r�©q¦õ“œÁò£RݪãÍÿå›w œ±Èq”‰çwÀ©çwÒ`”��ß‘´<Ñâ«2X€øÓ'Q¤),”E,‘ ]§—ÐÄ®PºZój÷s:&¯1/–¢•‘ˆ¤¼>5tR ­[ÄPˉ@Y!ÊÔ¼¿ˆ³â¾Ì@-o$ d…(ãÛýëõo5pî_¬G¡ö*ÅñÑŸ™PC+¡δ³×–�+æ8mî»ü…DY!Ê„tŸøMÄýô4ß?¦(+D™˜Íâì ë«ñBålÀÈ ê:ùè2ƾûR�57)atf#Ýïk5„?;ovLá€\šž[—µŒ�ýš“Ùo€3±ëlNÍs5ø~Ud_YûøR �Œ;ÞÌØÚLšÞõá¼ÒFô˜ë¾–6…~£G�ÈR„ó”ÄR¤GÁ´Ï·¶¯¬}^)] }lRæ„æ§h“>¼„Ãçþm€²B”ñÏ+Ç¡k¡Ïä´AÍOAí¥²œ?랸íœ�[OA­W)N:‰QžcP®s9hbO¥Ü‰€Òs'h +D™JRy‹$e…(O³¯gsùÏýòTõ4�²³Ó,¾1ÏYø§VÇÿÞǬx­WŽ&•�·ª�e‡æ.eδž³�Ê_;žYûWŸÎí'ç×ÒÜï½²#�³��R F*UØŒ«Iå‹ìë±láªlÆ4�¢,eúqÕ »Õ‚ê¿BŒ0‹¢‚šbí“€Æi?`'íHf.=Ež¿u¯ùô¹½ö;Q$þ d…(Ó~…fE ê…,ØþêýG{•iÌT€½³ó ¶ƒ3]P.sgbGÓ Þ¸–\âE ‰ Óø}ç+BÝA=®äì²ýú#i)aFwT–Û÷!Û÷ØT”�Ø÷ ÎwáiÔXp4�¢Lû,±=6%h–kjȧ¾v\ÖúlN�ôÚ™Sñ^·vÂ}¾;¡IaãE”�¬M÷l¾mä°ûEîYÈ Qvâ÷Lq�ØFIh-ÊJÔDG)’ÜæúÒË´ì5²$r\ÄÈøÁd·Ãšó¬ÏïÖñû�*2òà�öÖçw¤ÍMLC�®FV›»@V‹@û.ñç=šWý sçÍjüùˆ3�¢ëäį~¯ð¸âñþŽ@‘o�Jq²‚ºx>¨üo>Mì)‹ý¥ävô|¶^ ¬xÍ�ª1×öÜÇøº÷e@#<˜EQAMÊoÐÅÙ%U-8Kéþ1À›î�éÈg½K Ž':"[n•ËŒ4z¦zJ¿íÔe:·«hR_«FcùëgûXšz¯Ë¢S³ï �g ‡4cƒ�-ét°ˆ3±×dý™>-0ñÞ‹¸‚+4ž7š‡/ÃIGÑ|ÓÍLj3­ãl³~6{n§¥`ŽE4¡Û2ò ´Ç%«vlN·j#ÎÄ®£U›çÓ£¹Ú ZB"¾bûRk ¨ƒëT3ìöéÁ,‘s�²B”i¿B[°¿/A½bX2¦ú½n‡R‚˜[öñîKJp<µ€ØÈL•_à^F ‰=ÍÉÖÏšs¼.±KgÊŠdë4�¢,g>®¨¿Ý×cöeõó1 d…(3¸ÅÌM[ÿ…,7ob$[ǽª»­ã(Û·½˜ˆ ÜÁ±!�sq¦uZã®ÄW”e5ú£q#Ð@Vˆ2íW¸¬õÉ,¨WÖH¶Ó¿kþÍçqï!yd;ÇϹûD ¶¨PªÖ¨\§]Eœ‰e‡øöV+eËDDo±ß€æVý}=ëî{äîâ¨L4Çæ.X‹hbßÙ`­›[5¦G_¹0z¾^-Ê=ò·}å@=�Ê´_ɱr¦~”¢L Á>>-8½ú)H ÁF �¬et"å0|mz íi¬-N? 9N„ßS”¢Œ³ÕüBXœuÙÎQÓ½ºuÞŸ[ßA¢ýÞº• dü0ÀƒWs$½ï=Ðûx´¯üµóUã¬Møh ã§¹p‰�€Á…§M+¡1m“ ƒ4â@iA6Px Ê_{ìAï–0_Øá1*Ó~%«™zeµ/B�â§„ Ùç©9M¹’yêvæ®ø}j+üfvöŽÊì_÷Ú¥Û‘�á98ï÷ë¼Ú[ 7w2F‚3�Ô¥2{Çæ.0{#Ðľ£Käõª\M_f:ý*ÑD2j�É$@Y!ÊTÎêØÞÎjšØyv(HÛñ ÔKȈ×NUÌ6xT¯xݪ7š<ÒÆ¢…Ôö–ÈicÌÜÊ-ˆõ75LµJž‡U@1=÷(*ã´g�¼v²Â6¦�ö3.�}qJ�œö•‘Åé¹ÛËÛ£Œmý‘¶ú,J€&v\ãÛÄGQù68Òö“�æf‰ã¤åfiã„Ü…±½ |›4±óc–ïj78MaÞ X]9æ7÷ Äoœ�¬] SchêQ#àLëµFÓðÃé}pok4�ˆ3�Ô%ýý4ý=åÊ—ÙÐrÎf¦õ#xJ¶ˆ²B”©.¦{õ$¬¶ñÜÙG¢‹) dgGâüWëoÞ•Y±<¦ƒß_S�Û^TV;n [õ²TòärÉ�2îàÑ,Žû£¾ØÅ«5<¯Xh ã9Íæ°8.}°„ö˜ƒ'*Ó~%û�˜zÅ/ÈÞX>ÝdóŒÎÓAvfžŸ¶…}ŽäR´9¢_¨ V äF:™4£qlï‚Ñ�&vž –Gü8ç÷8Îô \=¯íƒ~VÅh +D™vø[»pø�@»žþ×ÕÆ�Û¼‡Œ¥³€YÑ“ßÈn»ßö' žlêvá¡ç¯‹;mgÂä訉ۯ㯪n¨­Y„­O)Pã2jâña°5ž!Žƒ öüõ¨d»·/Ä;Ñ-$„GÇK›9)Ð@ƽ8 slî 3µ‡>±§#�ñUþøÌ»ß_£AFœ�¬]Ô•õ¨´Dç*Ìtä)bºW{?aE…hR‰™Cc:/3ÀLê6ó«­ö—{ßÞ�gw|­_¥GÃßÓ½_¶Nçd¼}SÚG)È Q™‡î¨sê‚OÀíaoŸöIwú¼glÿÿ[û–^é‘ãÊ}ÿŠo)-Ô.’ÅGÍÒ€g1«±£�Y fa[–-ãR‚=ï+QöD/Û‰2æ}Å(t«ÙçeÜGÓ¬ <è%ZÚI/be0¤\ªœpëIótå}‘òê€�&V^â`q`‰¬6°,¼ÙLXÚÍfl`!ò,ÁÝ5ª<ԎɃc´w]Õú/ÂÈv¢‹ù1‡Km*¡@mì±Ìž¡œ�*ËÝÁføû±ÒŸªë·}ÌÀg^´U¯±cNy_Ò–Tyˆ3¹ÖaZ»ZL‡÷2Z%û"ÁsÄ?ƒß'b•ì 4�íDÙEŽQˆ+”eÞÖ–úòü›ÿ d‡ë¼2õ4ŸÇɧù°@/Û‰2¾ÛåXrÊÉvrPx“™OBi'ˆ �l'ÊÔC†}y7z ‰•'<²Ìx±€‹×Æ �²�(ÓÎ…!³.ž Ó˜ur.ìGÝ„ëü+ñÒq†�D w³¹?¸Sç_4�íDY˜bФ§xœ‰•î�Åç� u ef†çˆ¤4š²çàRqù-ª×0�/`hè<Ð@¶e‰ã!SZc…ªùhÄÀc…¢á­¸ÐE‹$*ÉÅaw‹Á¸–!0×”0¶±¡ûP]±ÈôE‚}¼/èÆ>î�&ÖšLñœ:2e;÷uºèpX7gÂd=�÷Sè1ŒÕíUqC»×ýEt·3 ÐôІ־\ íu(¬„�2<×üç×yi\Ááíðc2}‹2�q‹>²°únTí+ìüO ·­ÂƒÜ_|ãw‡2¥á¨ ‡ŽÓxȬ½c6âie4�íD™ö+´!ÛØÔ+)3žuþ%7‚%jv?ÕÜk¿qnÛM®jå€>¯LÂsõ¾÷MJxæ¤×~ã°Šjßx1� ›ùù¨-?¼ZÈBLƒö@ÙN”ñ±Âp<´�:,O\4©Ä�GM´|_W)æ { �l'Ê´$áô›µ�Èžûé½)ÙÅìø¸W¦ý*ýæY%Ù�›v’ú^¶e¼xß»X í¾w¬›Rù‘š¢}lÑ”>ͺŒ—f];(Èv¢ì" 8üý¼lQÃÉ«‹ôh Û‰²8=|z/dKíþðëÛ‘£0[DkJ×Hñw¸ÿûèJøý,9ÜéRÓèL΢‡âH‚”C�¹ÜÓ«f§½–Æ«ˆ ìh Û‰2ì¹2ùSµç„¢¤Rfİ:³÷ã™ö¦¤Fx �l'ÊÔ˜û¸U¢)ûa·bîh Û‰²ÃÍ7ä¶3 pí‚O4¨m d;Q¦FØûònDØ=Pûjî�Åï3¡ëÜZ+|ØIóÃ¥»ß…ä;n_^¶eüL]ŒÃ­¾5VX —q»¡§8"cÕµ6})½ivâròí;ᄺg� o¯ýF´ØM¬ª’÷‡×ãkyÚíø,ï¦Y¿ªï°‹~‘]´V*òsY¸%+!e¿ù¨!eÜ´´šK!å¤( Òœ]‡V'%¤ìpæE;QE}ppGá\–wøÛxúGf1î ¾ÎF�œjîöýÈi6š‡n‡#§h Û‰21R™ï·È°ìk_‰Tz˜�lUZ½ÑlÇ4ÂÖ,J²ôĶF›Ç/�J”•ÞÚ7•§çú’Îæ×1¿šwyÂ!ÚrADµ/H�¨z”‰U¦ÙX€Km›oØ{åíç°;´È�Èv¢ì¢ëBîçmª…jÆ�PL&§„¼¦ót‹Pô@ÙN”i¿‚}©y‹‚vi�ÃP[šÈ™L|M?¯çfJ4ÑáÌ‹v¢ê☆´-AQqÚ`—‚xc‰›¤�0·®ƒxh Û‰2íW8ÛN*¨W†6Û2BjÒS¯ïÈUÈi2Í+S�B�“�B,P#“Û:ø8¯žÊy#[2¡šÓí/ñTkm§g^ÄYÛ�@ë Ò 4�3­Ò¬×òÁ£l¶ä§_”ÆAª‘û�ŸZAB‹Ì~4¹C^J—×ë •k¦šÃ™]jJK¥,/mëãÕÞ“[Ê d¼¥ÎC!�ók€I¿™Ë~�K¿ç¬ÆLL¯L4i=L6i±½&ƒä¸³‹úþi�áxr‘×¥%ót…ÝÈåq8Óê­ì­sjÕ{ž/ói{+ d{«ð«TÞ£r9žû^®õ˜ù Ê.îô qjª5)ÐËv¢Œ‰ók.‡™>’máºg01j—…@ÍС¿N»žå @Ó«,j–,ì”N´£&å7˜,]›@P-¤]+að¤�J$ðÈF%��~©”ÉN\cµª;V1Ù%…ç{.ÌóÌLRV’-–÷fy¢§WÆÙ¾^û nÓM¬j˜Øéë­&v²ïíe;ê:ê3|°¿cym5F—”žH­My%²²å6ë3'ÿû˜à"«¶ÚDNrcðN,)ë¥ÿòY/hb3*é°*Šéʲˆé¤�b“jß L¥–á …èÇrÀ,óÝ Ñ{ �l'Êø††ôi[¯Ãò4.6¦óž�;&y&¯“S¨C4�]P‡äN§‡ù7Íé Ô’yXä%ȤAƲÖIHÀ‰©O-�!••ßV|åã!Ç*¥¥3x �l'Ê´_aÙšEÐ.�Ÿî¢íœ%_²Ûíx»õœ&DaY¦×ûT¿4v½5(Ó~¥^÷MÕ÷²�_ø-Ü¥œ³xÊF”fÄñ ’t—2à d;Ñë�€Á^¨þ©P˜vc¹t n~/q;4µ|8é\Èv¢ [*îr$zë°ÆŠÆ+\YÙ9‹¢Gãî² `² º y Ãá[‡T\œ4h3…=ÌSm'a¤H,Ö·æö£}å®è¶çkö¶È®,nB¾<ëÔyß-O6ÀdªmMœ™ÄÀ�¿¦�K9˜½æ]õ“© ›ÁËv¢Œ9ýovhƒ/ÒµR!Ðä]ä–i­â-ÓX íšbߢX^; v…VybúǧåÐQ¬sN8f§y�,ïr7Sq%Mód͵”O3/ÚQ“˜n™üÄb©&°¥çKé–g Û‰® k Ä¡ýܜܰ@Í'�‡y”ùeÐÒ/Ïfw‹ ˜h Û‰²‹ B —–ž–§½¡ †miޤûÑÑl·oa4‹Ç™”ÈÔ•¥ç19˜ò±b:Lª~‹å•ÑwÒa<Î@¶]Ú¯p`ÖýCR¯ŒrœUó²ý\H¯áÈÈÆ Ý¼Ž•Ï+Y³AB ÆyU4Ž¢Ô–æDûEüikØ*?~p¸>c Ö)ҌҚRøÎ•§‡ïhråÃd‘ŠÅÐ…®”$Œo�ª ï£ûUÑí¯(‚Xam˜¨E,/îsоFŒò‘VЪ~ZÕ�–µS»÷Èû…°Qîðò›¼ ž-@јhŠCiQCi¤,/Û‰2%j”yù:^[fŒ5ò@ÙN”A� ì�¶‰„…iÁ�~\ÆÊ7Õ«!Uî±CY/¸¢ƒŸ¤”˜åR–ÓS#‡ä5ñlÁåY£<Û|,jó6Iή¯ÜyëÌ ï)©u �²�(Sx4ÿ)2�†màeW<lòÙÄˬҔ­IJ£å`rV!Žòh  ›)ÇGÖéqçüÎiû…[Þg•¾…�ÑéuÀL ~¯�f,ÅË®FsÜGÉhz,?>©j­�<Î@vÝGí“s™2Ô½Ä ùè�/ߥ*Ä„^DýÚ¥ìQ¦¬‚l�‰[Îßê$4¹—íD™}¼­*ü?½./B9r;‚.ˆó¨•�=¤1OzJcæÅžb•ïwˆò«¹JžÏ#:9EÏ£¸á½#E8ó¢�¨"`d>i0qJ±:�áÎ ß_+%ìÈj[‚*ˆÁ‰U�BpX–@¿N%£bÍù§Cs˜+!¼w-Ìëz œ?6Çh Û‰2îàmå}¥rCÜr4ûç¦óE ƒÚVÎ4C:kàJ“ÎhÍÉq¥¡|.½ÚPB6=7Æ¢%"ýäU%Ûø¾ SYZ¼l'ºð¨Jl ¥mg,Á¬|ºäÝ&ŠÅ b¯LûUúÍ«JÚ“cuY–Ô÷²�(Ólw¹Ò‘+R 6fóyBdŽñy1‘Ü´­µ q|"ÁÇ-æu) TkZ�^G{v…}‘Âê2M¬¹t8 ZX=œÆÇG'Û‰2­­àˆ“ÚVÒ'ÚV8ªâ¥Â× UKXc¼l'Êø®ã°j jm*åo€Õ¨¥o(F#9‚þFÜ4”ÓMtË€+2%_òÒ÷:L•ÎÄù"&N‹K@í%™èÍ¥2‘;&é Ä6ªC �슖B]�ž¡VBJÏ •�l§%؈dK°ñ«clñb#ÔJ ¦²Ö¢ÊG\µ#ŽÚÚÈŽß¿RWBítY ]ƒn2G»”°v¤1[H~™´aB›¸i mt) 6æ!‰[ËC¢;NgCÿULgÓüWR÷pP‘ÃQÚ OG±A…‡®ýMH™o)ta¾šô¨Õ\%Ûãã}­g Û‰.#ªÈîRÄûÛ± á�Jy‰KâÙ;åOºS €²�(»ØØÖâ.”›`NÇ»œ{Y[n�»êªå 3/ÚQ›úÇDc9ƒ¢¤Ñ%µ¹öVj"ñÖ[¨y Rè鲕æ$¸e{|Dw”!—ye]BtZ£Ê1©m»¾ýÊ_KÖ2Y �l'ÊÄCP®;ôCP4±o¥¾måØ)^¶eâѺ¾on­ó@;š]K¾¶)}m\)¯´Åé�Ò!¶d f{±|R5mÅclh Û‰²‹\ ‡' Ûû°@í¸"Ký}”´ž’kxœ„;»|d­U„3/Ú‰*~¼®×­¯ó8Óêé�€ÞL(8íÓ{Z›@~4s…¤{oÎÈ öÔêÎÌíp5ÃYÔüÈpÔ¦¤–Ðþ(÷ĦnŸÎɦ%´{ �l'Êè¡–…C¸™»aqÚ|ÐòÙ�rœþ•SþÎûV‡8ŸÝã d;êb)ÞyëÎoÓ½òõµS³ºã„vÀÈv¢ëòà_€ÃÁÑlʰ@m¤Ñ}Ä'‡ç“�ù)‰×4Ÿæ‰”U@ÙN”i¿ÂÑp¤’ ꥡ&J~¦­êY’=ÊzÁNÔ¨y�ùY�ΈTó=Ð@¶e�1é7sÞs.ÅiÖJe±Œ§+ÿ(gr¶~h¡8—Ð5¥?”ÐËò¾+B‘œ.¯¦K`z–͵6•/q|ùj,8D f!úŠk‰ˆø¹^¶MA£`V—Ò(ZJ—o)é­/ìFÒ›šXs–ás9¹ŠL�N´UjÊÎòÈûâ’Û#%[ËØq8ó¢�!X&i„ÂèSm¦¸4-’sVóZh�¤f9^sÐH+ÀÈ8m1D9–9–8¶wÐ5†€²û QfÛürúñAäqæEœÎ<‚ ÁÚ"yQQY«�¹´òVñújÄ‚DvÎ@&’1 mâÖNQi’yM¹Ø©L,“�—ÒöW._×ã �ì‚üCÖÄi×éšXU‰nÉÙªÅ,Oš¦;| dŒ‹ð+ô ÚÝ=±zÉÑ`SÃ䣲eå`[†OÉZ"ÇA?Ù|½qîÓáÌ‹v¢ŠÏ§¸æê‰Kúɽl'ÊêòüÞºÒÇfÛrç¶ÛÁÉ=·V €ô䉥ӄ¯­žÉœ‡3bìï•…c¯Õ �²�(£§2�vý$*M¬ê÷‡>]'ˆ‡>ebw†äj^TŠ žŽ=@�\ �Œ“«çìjíb+ÐÖ°$�_`÷j‡—;£Ñ+Â[¡5sDazsΘ-ã©EÆ5¢×ãÌ‹®h^²2>Ž�ÿyŽ @ô!ï–ìàhü�…ÏÁpÊuc€&Ö”$wÄ ŠfMK­Š:B3‘ú»¼°9ôœ¡DÐ@ÆéoåWhXµÃH±zÉJ£ ^aº .w­ZJž�°vº…Zp a&·ŒÜÐñ”V‰“ÏS²Žù|ÄFâäh »âä ³ pÄ6j!,NþÔ óT{>�/¯å·�‹Ý$Ž€2ÎÑ“ÍmZ*SòÝ!cOØ•ZÅ@~ÊÙ?OŒÇTiúM9j0®ÉÚz¾«$p¬ì‘W¦ýJ>¤ÄÔ÷²�(£>Y&”;3ǃjîzá‹ôB%a#œé=êUÁÁ?­ʹ?,ŸŒ``i“å=ÔóHZœS©E2Ïï—!Âí�z¤ Ñ$–…\Qrhp&V[¡á³ãV Ω¥Dk<< dWL<= àÐnrX jTçÒœè2�«)$¬€�YÇt¤©(ÔZæÚi×)ojßÈM‰ðÔvYÎ=;¾s2´ãÞ@Œ{e"ïa2�åyg¥]¬t™+Ñx¾·NHÌ~a~Ÿ[€œÇôÊ�4\·’é±�Ï�»>Êú"e5²9šXñˆ”÷!“òøõÚ¾·QŸ’¥6P�’EûèY§W$ueJ R7Nå´u¾GêÐ@vEêâiâ†R;º–§ín¯»”y0.ÙC{µ}Kàu=Î@Fy]…RÍ7å­aY†vË�D©Î@vI©ú›B²Êµû„â4Ššâ`7̧Ê–<žñAmÇ÷@ßñ�~ΟœU?绚>ð;{kªïqšyAÉç^¹Î={œiõ”˜gp Tæ™ø^¦1Ï1—åÚUBaگܛ�Üâr¾<37îÍö0ÙŽªø2Š_×éñÃ銛ðâl¯J Â/ÏrIBŽ7û®„÷@ÙN”i¿‚üŒ–|-h—r=⬠ð·¬Ì0CË VHx:Z��ŠnQ×,•0Ê”/9|•LÙÓ,’¢L€3�í¨ë‚6Œ L­Ã'6,¤|R¶N‡Ÿ‚vEí¹¸ $E{å²òcd¯éuÃ^4�íDÛå—±n»i^ºŸ¯r=Âë9´ð’·)jß…@Ù¥�º�l+¡‘ ¬`ôÊu{Çã´/¤æjØ¥`Ù´1ÉJÒ(×y­fÄ›á)W4�ýe”ë²– “ƒBÛ-ÊÕ dåcpý­Z(L[Ì5z3•—Ÿ‰zeKî¼T¡7=Ð@ÆéMä1 ×»ÖVaqÚây [ÓNüÚÎ{›€ ömÐbaßã8?�í)±]i7ȇ3­â´�ÆÂÛ.ϥݲ‡ù\žThkwäù\ÈP(~~_Ú ?ßM¬zÈÈÎcv&Ê¥CmŸÕY4�]3²Ÿ¦ä2Ô³wÛt¼œE?OµÖ*…@Nú!oËÔs9¢¡C˼˜Ê¦™$ë¬ïÃË5¯#ÄÈvÔ%ýó3j~‹¢\JõÀ�ÁëTµFÐnS…z’Õ'Nµðå·Ji9=÷Êøx‰qr¸ ÔZ”ùñŒ„`|‹T…3Y ìÇ,Q?�o°Dh⢠q2i¸ä‰Ì›´„%�”ñ@§e”_•��ïBÚòmùŸC[PßËv¢ŒmbϵÒÜRû´-2CóPˆ”ü‡sc�qœòqº.¶û¦EPšQšˆX��rÇá¶ m9Åã#þóÛÉÙÈ��`[ÒE)ø¤5ÛÕA ˆ)’bý÷Þ`Ó<ÐÄÆSØ4œe›¦M2dÓèâÀ\nÛGXždzkVõóU(‹eš¦Z4ªμèʤÆí?B¥&™ò3|Ë2~¤+ …1"Щ"�¬Åy_–×¹O½Îþ&�¶<@ÙN”içøûÒôsügbÍ5zÖµ®LÏB¯8Ñ=u]¯¢åÑüX±ë<Ð@vÑuîZ‘“~³Ò÷5|pZJYìF§K¹|ÆAÔ»g $'ÚQÙÏ©ŽÐsŇ;3ü�­]ÀLüp!øL¯Ý~¹”v.esw_.'s;”IMH-�h^"ýZkÏg�ÊÅ+ùò•1…]Y×fß`Jˆç[j¥B Ï AòF õå݈y ‰•§#j«l|»“|¤¡µÕ·0)Ö¡E#º¢ô`„ƒ™Ti[mªÈs¸ÐD×.üˆjÕ·€“âýç߈ x ‰mÉVÏäTäy½­ÓyÕdº�¯êÂmÏ?!ò6¯ìˆý>KŠÑù^d¯ý‹hov\4±ªl �+/'౯îeÜ]§|4b[K;ÆÊZ æÛ³<�±m�æ¤ú ¼¾ôV¥F3ð¼&εtªõ´D3©’ŒÄM‹ÂÜ·6f»yÖ¨…N ÏvC JJô­©f²^PF˜�ì›àFtÒMlÏÏ8\µCo±.ˆq´Or< !0.åŽü>Ç‘¨ y>¼V«áh&Fê”íµ/Kß_=δzSŠ2ŒÜáÞYgœòÓ6bf 9¸²lg².æqx†­V*Âñ4dë¾� v¥Ü :œiÆ�T£hiH>v½¬ËGY1†ç•©ÔŸÇÉÔèe9õ—¶èj£M÷¨?�3�qê­Ë…vcKK‹ÓŒPB†6 òĵR‚1¤‘ÎÔ {ÍŽ–Õ†ÁàeZn†’æ{ž™´h Û‰²‹¥WÖ˜bæ,¡+å1;ÊéâÒ°–ƒÆÛkj:Çœ´æ.ga4è4©–¤ûÙ�„p¢ÿŒÙ7€nFzœi�)D�]ãªÑcè'Ú‰&éG˜XP»IQ®$)°~J‹T1�ó…®%WÑdn&RäaQ´¿B¹/í¡ì�&V= " Ï#®±´ –Dò(ÙN4©Tr2Šó}å9²ÒZI£’=Ð@Æ©dåW.JÕ¸Awï’˜ìüŠS©y�ëãD&Û d*“£p 6Ó#,NõH,��r/ÿÇÛ£"�î�²+:&UˆÂÁټư8m¤“AçTã訛¼�Œ­ 56á‡òTp1D�§â0]Ô³y­Z�§‹"5(‘~}q7H?4±îÌ( íÆ�‰ìmJhǃ? Oð@ÙN”±áþ|­_9_PòÅåZ @~@ ëŽ+C¦zòO†së„„ûü¸xÉ7Þ>Ü¢Çóí½.¶ŒsM~_Ïí¼+ì‹V;/™Voí‡ÿ’I=Æ�Màe;Q¦5^d+¶”v“­ÖVxp /ïÆi 4±òq¤2µx¦°òÓ³uŸ«ô@ÙN”ut`üór0«Ðãöq¾T)‡±s^ÙÅY·¹$ -�W;¹‹ÁJ8nÃ)jÁk­ò2'‰_íeWœdL´õŸ|ƒhó@Û�lsÏ4 ²òd߬O x¾žGØóã``c�Ð$ýH $3åN¶]ªõöx–´åõqž?­74�]XoQ «ï9„åa&u&çøÒo^„¢U>ž¹^™Æ{”Ìcq^vÅû†1«ÚTByZŒZÝÏbÓç¨Â|£u±voå77òX;s�ïµß Ô=ÐĪJlöóUž_ùd %6p2NæÆ?*“»82�9÷w[™åè9yU´Ïm.¶[f¡‡_« d¼$†öx>ù•“†luZc2 »}^:ã8[ít©�S Pš]‘Ú@“å0rRýl)Ø"5ì�²+jº*†a'ÔvÊÓâÊ} Î7–ïcœ‰~6[qbïmòw/4s>ôú¼lG]Z~:Sµa„Ä8Í3Ã-=/Ö™\ѳž£?ªs !/�çg&!ÒàŨÌy±°ªowï¹-‡·¶£�?ä-»²Ç8š>„V¢b×<óÏóž<œ÷wHf�Ç™]5½‰ü|½Ê=hËÜž8ÙNtQÏLÀ¥4U9JÎþ $´5(irÀ‰49)ÏË(MÝ—©’œg±&Os»JUrId-Jàx¦$¤Ñm%úŒ^ÔJÅ- B0(à>X�&ÐÄÖ“¾g~¡.ï¤Éß{œþ´@ðÐ@vEðuTès+Ǿ ±]&úgâ€#“N˜`¦ÕJ ³I2ù¨…âóžëX6‰-5ôp ¦W‰›¾†ñ�Ï) d;QÆ,”gúˆB¼çÛz7JÅc6E­UÔr:ÄÆBÆDl,�2¡�lmžJ¯BÈŒy¾D—w‘gͶUÚw>¦à÷8–xª´üW˜œŸ8Ó*.Å�ÜpÑãG4qì)ô?´°Èÿ“žñ²¿<�—ÆqüH¥‘"€3�]Eü `èS¶e=,OsP/†U�_‹Æ[Vab®f {|*÷œ¿ýçö¨qŽ|QëÖlß.Òlßh Û‰2cº\ºˆXƒ(c„•�! §W ØJø.’”2›hH×¶(QÍ*Â7¹´GYÁžù/røp²uq#)ý<�íí9Ÿ[3¬ÑËöóü£¿ôZÀñ%Úéâ3<_Õ›•/<­£¢/î‹WjM®;ê‚4µRš©„d©¹• 5è 'º2ÓܰÆÏ5Ài€vš#jÝ m»j%´ÜR f)†“÷ë¶ E“YÚú…Ð(ؼjh”Ë^¶eÚ¯ph4_¬^ÜTbÚÚê ùVmÕ¦kß³¢þJ�dÁeìÞ„Ìå”˜ÆØ²n1Dó\—b‰n�µî˜µV!�Æh@™£œ£!zÙN”Iá�lºäœ�üòr ±)áÀÈv!È®(¾>Pc`�¨#](KÚoȆR:G¬ËeL©1Éy®²eil)†<çr¯b’¬ï‹Q yzeŽvˆ+kP–¼†ùÃÿW ô²�(Óâµr%$:†TB1@r’ÂR¾fhlšf€Ð@Æ e(÷ãCʧ RnãÇßR’*¶ãÎë3_%lyeÚ¯Ôˆ4UßËv¢ŒŽ¢ä3Cpkï›`LLÃæl@Í@eluü-HC×J � qÚQìAgŠhb‹^bòéð5¿3tqQlè-M´”ë£\q_¤¸Fö�3±êd\uë*ãœ1°ÛÌÜH# Â[«ylÃÅÊÒ—vc ñ@«Î\ÇžSÞaoø"{Cå�æ��Û*¦¾Õ á̵ª³�¦¹âÖÐz0J�•v‰-v<¾NÐ@&ÆóX¾�9L~ž—o]3ƒ÷^¦B O~öÊÔ4q�“Óı@/Û‰2‘]_æÊ€'ùH^éu4�]ìñ¯°+jÓH굤vÏ{?×Gy~â}¡‰FóÎ@vEô+¡õü:UéÕõ´´ÐºÈv¢Lûv~íI½6’âÄ0}m ¡éµ˜?#÷ç©àòŠtä˜`x8�#¯â=«c {eœkïµßˆ0x ýVUŽH³oìe|w•"ÒÉ$ɶï6ÎÇ-ˆjDÚ d;Q¦ý*uÅX ð¼%žùÛ¢z ;xeZ”ãä(çe;Q¦ý £KuäJê•P•ÓH¦±X†é [b­U„“ve%¦Ñ—¤Ç4<δZb1íhKaf‡F²Ahxçfá@š&$6³”�A~Žunçã¿Ç楅9<Ð@¶eÜ­Hvx©ûV XÎå's·d·Ïóm¿8Nå;]bö¥Ýè@4±ê—ï>F¦ò¡œˆ3í‡Þ7Á ÝMœÌP{¾~.žããTÙÞö)µ qšÆv`ÜúÂnì}gZ½Ùη<ë–:c¤ô6îh�Pûǃæ¸;jœ~WÜ JßáL«¹Â�/SI–x Ë™ªqçh ãܹ£­‘øÍÎõ ¢ÃIc4�]0Æï=8þ9î®ml‡åh[5ηp=Cv³î+ñ:¨1¥trâ–&Âc %.ƒÍ·þǃh¸¤jÄlWÜ ^ÖáL«9[–GžÉãÃìâgnn¤ú· <ƒEBãc?ʺÁÆv(SªÌ'NÝÀ…¦Žm-çCXµ¼>=ëÒž¯‰<h™™¶ê_<ç�̾GC3^ï´çZzv›Î;‘ûÒ¾°´j„8Ój.Õü·¨Q5l/Û‰.µ¥ð<£ÖRÚqFÒRZ{Ne*dTã4!ŠÕ—ß*yË+ãý71ºGu¤ }£ùZÂ^×·�¾×yœ‰í)…F}Ë¡Qìmè¡%󊰉ՆøHiC”"XÓëˆî¬- IŒ`y �l'Êø&óÜò¥®ùµ«m¢<½¯@›~ŽÇ€¼.Šè”߈D8œiõd9~aÅåàûb%(I}&{ÌëÐHÛÓáhñ4�íDÙE¼$Äa¤ªÍ·°@-ìÅ&\Uý®˜Î⃀uÒ…@žÎ‚E)êÓw#êã�&Ö�Œ«´ÎŒ9¥b99È–ðÛF[Ÿ¾ÇñX?nAZ$ª+îF$ÊáL«9é=Œà¦ UØÛa=ù-ôë�²�(ãÖÁTê\ŽÁ=®2üÆQ«È3p’Hú¾8�¤÷8«ÎȰ¸��€¯•úF$ó�£žÇÎ:œF“ÄÊ{œ�슕W6¼~¿¿±áy ‰Æƒ¶µŒåþÐ$Yò¶ o-g ûOl-Ï¡ÎïôQÇ2 n-h »ÚZ TÃpÕ©m%”§.añðÃ�«6�0nµ]ðÛÀųd„�ËxÆ ÅÀ…Èv¢ŒÏµ{V[ÃòÄýÙªq®ÔR§Xä$?‹Û@|¢W®Ç_<ÎÄŠ*¢�šz\»½2q£ð0m£À¼Œn`¥eh&°9M>œçÇj­O“f _-;Õúá`¦V2á¸Ê7¶"œÚ–ñmœç1±�G;‡§Åy<Î@¶£.NêæwÌ ‹p«Å†ç�j­B �` õÑDáG¤Ÿ¬•öx®·J O"O^FÂBzÛu‘‰‹ò²KÏ=Š—©UÐò—° d™KKPõGdzW»ÑðEFC­T4qh).y_Ú ŸÜ�V�yåBSaª�ØTZ®k*4“‘hÍç”°Ôñ8EZ`§¢úõ‘âÌ‹v¢J¢zå(^'Ö€ñÈã³>Œ>M§Ï<ò¸&òüàZ©Èyd¯Lä‘=L摱üsŒÆû¤Ö)jû˜ÇèK»Èð@“«5*/Î̱^vÅŒ+Ëø8Öuv^Ú]®â2î�²«eÜë…6~]„â4‡ÇPܸe4:&ìmÿ˜éôoù$äšvóãÎ9…œö(ÙE�ŒÄc)ͺmÆMexTž%IÞqÌÈ7¯ŒîÀë®]Û³­x}q_¤¸Ê“„@û/¬»làG{7Øa™ØZ¶„²‘õ¥ÝØÉò_%<]c€RxÏ•§‡÷hbåIþRlhB\¡VJ2Pµ…W5¥Áš—à|Kï¢×ÀÃÌ‹hù„¢�òÁÓÜr¹úeÉ�¶%û—éC^G´|Z§ceÛÞárh Û‰2 ˜ô±�*ù¼§@*ÌËv¢ŒŽ1l6Ç m]~¥¶„¼'-A¦÷”mXú®« �ÆZe_`ÞÖ¶ �2¾°¡ã°/jk jû]R4®šUÀÇg'Û‰2±ï0ˆ.ö�D§}‡ìãõù-®°/RXmªïQ&V÷Šp1Me—÷¯’d{{…ÂLâÔ^%¨‡!?¯]FÅq±†c‡ùd>²Èñ^™Òo$÷Aè71ñ�õ[LÁ~uƒíP¦Ô˜¥;„=�~²UI—l Œ/Û‰.))B­‚ÆÞc´„‡~�ÞHxð@G¼Àós@àáäñ²�(#Sé»Ú¶sœ#Sh Û‰2šÃÐIn bayšÇ­Ä:üx”ct.u²«X‡_’bÆ êŠÓZÌXzMÕ¥Èï'<9©ï�ŒºÃ…8Éσ0®8=@ëN:æícÌ,Çšïê9VqGÞ×þ‹pæE<@è™…ážÚLqiZèHi%L3›IË3` ‡B’wžÅu›ÎL-â�²«Pn41×ê–“¨-üÌ\‰ƒÅ+ “o_{Ï>!ÊÁØf¯ŒÇú‡)ÏÍ‚;²…!�ßÇ9jcE8šÏ�!%З¥‡<δzk!ß¼rûÅË®b°*„(œY� ‹Ó¦© H6cÉvÚæö  ð@ÙU€"Ž<^Çx9SÅH€Èx$ ýêY.¦ÌÿÞ0½†úÐxZCŽû”} ³®!Ð@¶etipÅÓ//›çƒÁÍÜ” $ (Ó~¥®�L½“]­�~Ô@»“cqZ‡‰ÇâX‡á¢�Óïjäp½ a÷hµŠp<8íuñu´S~cßp8ÓêIVðÞrP�}°Ò£´¯Â•7ªƒÆQ–e×cÉãñA%\}kµ´NÂRNߤ¼D=†vcÈž“h•úÇCÈŒß@ºS~Ãõv8ÓêImǹ&ý¸ü2;R­6JˆâÙ˜ŽžSœî¾¨N·šXo�Tž’•²–dåõ\Vp²+^œ‘éõ¬#,¹ÂG6�qÓk+2ºK %ã@™4Í\iò4œ‰5«ßÕ›ÓƒÎïíâ8;l�€ÖU£¤[Ôª?¦ ^Ó¯Û6 ¥[iZ +ÀI«�êc÷ÅÝð±=Pûfq�Ìj¶§¶éuÚ×ñ: (]'ÁmŒ@Tkfõ÷E ±9ÚÖ:lÇ=s"M@çQØãJPyI/g…�­¥HˆP¦q$Ó¶üÜl\‰#œ�ì‚2˜^åYØŽû&Û±µ¿BœÄÀ�ÝV¨8R‹uQR¾Xâ)%’ĵ�N’P눋’†ht´t®�mÔ,‰»É>WÉ‘H«á´Üành » á…9Ô^ÛFÈ­S«ŠÖÁ²T2ï ÙµÚ‡!Ð@Æ©:‰„ó]/“p8f´ºSóîQíìqjÞ°Þ`y×j…@Íþçô�çü\q:Y@ëN–õGyûâã,DýÁrkMiØŸ˜� ƒéŠ“)LÀ™Xõ˜­K¸%�–J&²uh »¢Óâ_�eTê i¬,æv‚i:?.¤ÕpÞ×äÈ®º.E8ó"ΛÑ]8‚ùni}Çh:¯Kå4=Næ4±@�–ºÜÔþ“2Ühâ&œ´>rÝó“<%Ñ)iÆ]¤¡0êá ?Úk¿A¬z ‰Ue£;αÀ ¢¶�”œ¡ì6l E¬6B³O"¶DkPÅ�J àrd¡6»Wó£<Ð@ö—ûQó«:;i™m¡ É‘ò8Ù…+åÛ)¡s[—˸0ÉO&ænZŠõù “Ÿ,'šÆÖuÎk«U q2ê’¢Ò†9–�Ý–�7U•ÒˆèU‰þ¦‡©þ&çeWþ¦Ðw˜/ õ�–.Àú\‚çV]‰´Î'së<•¾Ív �ÜSñʸï×k¿áˆ{ ‰U•\K_wÙµd­t«æÄÍk}X÷#¥9qh »râÐ2‰qè÷×á-¨‘¤sÒgZSS;oñŒ4(Öââ|ž[J;cuÝŸ-e™OÕå;rf(‰Eé‹ÓY�3±ê¬÷ 'R­”°j³’q;aì‡píÀ8f©MRÀøMcž«e�;’A4¦Ðã dL!.–Ï¥<ΕO6Ûb­ÞÑ®µ �<ØŠ^»âüö¥Ýð~=ÐĪK¾æ8ÎØ�M4�]¹›Þ0˜†bs|øƒè¾ä—tòú—V½·™¹û╱þK H1�ç¹ûÒ¾HiuP…@«®ù›þcd[Á˸르†6ŶÒB›¬­—ª/ï†Kå�&Vž¸TÓ#{ËëÙŽÓ�3=ëžòøxg2„QÆk’~¤útLy/»òê'*m×ù¤ãšO—ßr¢<Ð@&;Q1 º¡6•Pœä“úíwÜÊóóy=2Z0Zè7ÖR£È〸Kk.Ô´V[miD�æA9˜yÑ…ÿ™½ý×ß0{=ÐĦdÓ>ø4gë´?_2Œéœ/-mÖk-l¹åÝ9œyÑUT�˜i*×|¯ùuóíŽáæ�²+à ‡sŒƒ‘ZûJ(OõÔÈ�íÄÚTJG(6'm©Ð\À@Im*ÁÎТ.´­õÎÃü”ðI9Š×ïèµ±B §xÑ<�‚¾¸ �š^wðW§­Nç|p¸ãèz �ìÒÑN`|–‡F>ròÍme™ÝrfÖYŒëÆ dW+{ü«ô›ùÜß9 šzÜ8¼2eÃ÷yÃǼìjÃWº 9±»4ÛSÙbûÒô=ÖãL¬9s¸Ã Ûg­“0‘Ä­xZ }¾=æ–ƒ‰|©_PjB çKqu’¸­¾8�Ûò8í›ùÀŽý\÷j[ Ž�¶ˆ²¶ ‰1l…Z«˜P“Tò�:Uw�̼èÂ1R̶ñQn«]—éx«G4Û<Î@&›mcyõó”+Ò€Þv­+eÔ,hjŒ÷ÊuÛÑãL¬(ë®úöë¸-϶ndG8 ÖG[=ÅX&™]²•  “�Ä*hÙ@X … Í·y–ãÓ9`42Ô dW4`ü+ßÍ’Ô£õï••îYëcËxÒ~@ßyjµvOäôò´šÏã+/û<ô«…±¥ù<}3Üðy¦rIfv¼Û> H÷¹µ‹Bç? ápµêUßX£=ÐäzÆm‡Km­„ÐèÚº--}�GÙ·mi�{méó8Ù•ëÿ*ýæYŒ¼TýCVS�®¿WÆÖß%3 Xœ—qŸÝ£¤Sm(¡4‰ÀbG×óëYù2·+2ÑÁw{P­Tˆãþ=ìgŠÙvÃ�ô@k.9l©}˪û¾z@tØ<Ð@vå–ǿ¥¿v—¤^ÙGȸžëUîɈ<2YÑÁöQ+¹ƒ�½*9g}q7œ34±îš#ôxÖk3ãÏó-GÈ dWnxü+¤m)Ô+#žôØ£ü<5üÒ8 tò}WÔZ…@îäc¿j^O_Þ ¯ÇM¬<.Gã«lPÉly¯q{ÏΠDZ'0Ós­ �ìÒæ÷º0¿B¬„–_A*!¬ãëñã3ª)X«=Äz³S¿ý»ÿâÖ ß«t>è*ÀH)Ië3ʱx xL;_žËÛî˜Î4�]™ÎÀ±8ôj§ jΛ֡�«H­•à~kKó3ÀV·Â5$ÉyÈR3òh »2ò[¥Þ�µ[r›[ÉâÝšÚTŒr,è kZø�T|¹Ï­Üëv&VI-@<P&ù€ýRš—ýå~Gß-²Ûáa&u0Y§Æ×\^âyN­Ë�|�õ§§Gù²–±ÅÜ›í}iº¹ïq¦Uœ�ñ×xtÁéÓ�{æ;¥¶Sˆ£Þv°à�¸Ât€&Öœ­åC}D2YîÛé‘÷£ï–ÚP!Žº‚ØÅÌš Þ§›þ4±îЩsk7$GüH_ :¦.›!�új¤—ħû#4±îl�JöbyUn�ˆÚx`Ò—ÆŠ�ÔÌ£þAo¹:Õ¢½ (+IÐrØVç¡àˆ{ƒ¾ŽžE bïHÖ¥+L·.hbÍqD�Û³ dW>g1§pí%¡@u=@CoÙÊígëú:.ãR-D4�]Zˆ°Üà„�Ç;·K«–8Ó=Ð@v5Óýœš_u¬§sZ.<|¿¸•JÅ@î䳕'@¯ýÆÜö@“«w+ÎÞÚ=ÂxЖ:jÂ¥gp­–°Æj˱à—å0g�*LóZ«HVnçƒ)Ùk¿aÂ{ ‰Uek`ò˽xó–}6î6ûu¥¶MÔV7Õ‚îË»aB{ ‰•×<Ô¹¤Õ|<Ǫz¨h »tŒÀ‚L• nj#I´š=Ð@ve5 “l.|q�L‡8É<Ð@Æ'  8슺eªý7)NêÚ6B_h+„fÿ¤ùP®¦ÇqAÕþñ@· GV@á°­&§Í4:\¦C3«VIjsÅfcS+ ¯<¦†ádÀáñS¦Ö*Âq§Ÿf�uÅÝ0Îδš“Þê“aùµñç…óã'Lm§È­dœ}šQÔ—wÃ(ò@+Ïú/vš gjc ΖÔËÌ$šæòÕG:îûùèqa¸>• @¾ï{eê¾ïqò¾�zÙÕ¾ÿL WVõh Xüþ“ë‚À¸½ÏZí‡OÝ7ÌŽ¦|-ϹjN­ul3h»öeÕ aÊ×jæF_Ö sÃM¬8[�¦©Þ¡þ1�~I.NVô˜>FoŒãì‹ÓÅl Øžû²tóÃãL¬7vÞs,·r¬¯õx©’P1ÎШU q’±ÃM·^ù ûÃM¬©d¤aZ†ë¸´†Ñì�3�]Ù0~BN¡Ú[BqÚ|T �i;úåq<¨ h Ó œ㣾òžlÚô÷8ÙÕôçÚøª¯ç$É‘_©Í5�3�ѹ†#*áZSª$&-[ØHqã4¯' mÍÐ G×áªÝãĉ.¬F2À.<µ™Â¤%ŒŒÞžéÍSÙVó0·Õ4ÓzËk´Û2´ø”hZ{ �ìÊÒ�J;~àÒr­Bc&$k;4 zͲÁèaÊ·ÑEg-/�äó”녽苪‹N„Ó¾–ï¿�ò©Ã™VO6¡‡åXŸ-b„æ¡ß‹J¥b ·qcS6ˆ¾´;„šXuÜ#ƹ¾„ðNGE‹Ño‘µR!�[Œl¿Åý¦×~c£ò@«ÊFÑ8Õ;#‡GKo@»Õ�ÙÚ4!Nš7t?ëuë[“Ç™XO¶�‡WÛ%¶ô¤šã(¶ºV§Íã8ç�¦ßtê|�|ËÄŒn™°¢÷åÝØ¯<ÐÄÊ [ÆPtϯí±LmËð8ß2”î{Ìå‚ï|ñæëV÷y �ìʉ«Ž½P+!|³Ö¥l²=Æz÷ß¶—­çë±”k';¢#ÆqçËé’~$Ïw¢¼]Íwe‡ï?øÆï�&¶ÇÇ›övx¥~뮕 �Ü-evîv½ö;ºšXUÚa�º| ëñ>š‰~A©MᨙÈÖ&ÜîzÝúvîq¦Õ“NïhøciuzÇÓF«9Űž=†Ÿ ™5·|qqt8ó¢«UÐoY!×ýÚHqaÚ"-ÌÃö*}²ÍÇ%êÚºìaæEtá$Slxmõ‚Ïd ¤#:~±Ëu€ÜÁÀ•SX]iúš@«.-GCZ¾òãPï7ƒÅõ€²‹IøÌ¡Ú_Šve>bvôðšê ¯W; «$|q­T¤Ë$i>e�tÅÉë$àL¬:iªh–ba¥¡âÉ-U;^&‡­¾¿œGÀqÑ�´LÎ@v¹Lú6ZÇz²}Ý*­‹ä°.õB…m~ßÍÂØ" šèH¶ãážm:îî ûÂÂj¯E0“ª- #øq‘ï÷²«‘$´Ú×Z3iæ5k(aƒsÅéM­û°=Ëͧ۸5Jß›G0jËD8fѩ˿Ó-o€“¾�âG¹Êé};î§PZm–¨}2]Ç�v}ï ‰UÅÃŽÂÄâê"(Ì]­îl2A?kyÊ,9,Ïã¯8�h ãCYGËZ‹Ë÷½îŒ#4�ñqĖÇ­Pª¥¨5©4²–ãŽú×�Ã$7F–È®fEü+ìŠÚ4’z¥_»c>n�^×¶Jk†‡ÇÈ®L讆ýP*¥”§uª6¶ç|Eëø<._Pv‡²^ ió£œþÚò³uÛ�Ñä�2y4Å0÷ùµÛ„„†”FÒs©'†ò©‹áÎHò@ÙÕòÿ û TBS¯t¨ÔUÓZ¹j JýÔA¬h=„ß8—µl µmμHn™å¾»ÔG(Jk@¯gx•³ ï¥p2�‘Âÿö§ûixüÈÿ=þñ�û�¿þå§¿ú»á‘Ûgüò»Ÿ†ò—ß ?¦ÇëG±U’xÿéWÿý÷ÿüçÿ§_ÿò¯?Mù>»×–~õËoúÕ0þ·,Ìï Éý­ÂÿùõÇ?é–šÿ”þñwY6,é#ªàOÿRŽùóN…ø<óùÿnåϦç7Yö›!?z?§J>žs!ùO¿ýýþOø¿¿ÿãþþ+ÿfY>«jÿRÊ“_ÿûWþ‡_ÿf|%‹q\õOÿþ§_ÿŸ_þÇOyYÞrƒÌïþü‡üSÒWKLkSjŽTà³üñïÿý�þÃo�6Yßú÷YT%í3þùë�ÿPë”ô?ßuÚÿ‡ßïE<Ö¯¨â?ï?gáßü’zíoúÿìÆÜ"endstream endobj 697 0 obj 391125 endobj 701 0 obj <> stream xœÝZKoÜF6ö80°�À^F@H³»ÙÝd‚ÖŽWV�5b[‹$(‰1!92‡c¯÷×oõ‹¬öH–%y0â‰9ý¨úêõUq>DiB¢Tý±ŸçíâÙ[­6‹4:„ÿV‹ ¢Döã¼�žâ\¨M4:¾\˜­1‰I“<�DA’4�ŽÛÅò§£·/_ÿ; 2îÈ,HÕ¾ã‹Åò#MRµ„fI!RjŸþcSõú©L) ûôp[_Tæ<’NÒœ$"³k¨T bÆI"iwQýX‹!“Œ¹[Yž5•½YNw°ïÕ3’%t’ñݶmËþ³ú‚ƒðp†ýb}©³„M WæT�nÔçdY·×1-Š<b¹î‡²;xüó"“ø¸AmÌÕÍ©{tY•ö¯6êP¦˜îùÒ»—CµÑSšŒ§n»ó¡^w›DƒE ©Àrg©±;Ä„Âë²µàS‘�àßõzn^$bRñ´Ó:¦‰œ66ë³²QÏ™Elë®nK-ž ÆaÀ(œ¦L­�Ú9Ü1ÛV‘�,Ï&ÔÁ£ä4O8/v‘Ðøò$Ÿ$ý¨Í�ptCÙl5/�o"&µ™Àû3Dÿ‚ \™PEÓó£Å³£¿GC¿­Ï~‹ÈâÙ+õ×ó__ÀÇÑOÑ“ÅË£èÍÞ(Ã(Naòƒ³‹Tá®ÃŒX“#D_€i•‹)¥DåhCíœc³R½ D·ÿ>IFö€þ!`dÏiÉ{³‚¡¨wGV&Ç»á*§“lÄãed~!d $MMÔ3 =8 :߇旺«J�[À\|zþía`ú ø$‘&Tù"^¦aUAl{ƒÕš§IšMZ³¹Öo¶åE_õù>Å3íè¨{PÌ|›Þ`þ°ÞE†�–¤·Æ!—Á£Ç!‡ä”™r—Ía?\·Õ¿tb+pÓ‚,‘MÙÆX�âJt2¦Áq.ú$Þ27#WÙ`´Ò׺0dar»)mš™™RåG{~œ&ENhÆn7'ØÎ{lsf"1Y•Ï­ù¼/»Z'UH3(©ž.Ÿ¿==°šífVí„ã£ûÛ”ßߦ.4±Dâð§ùÄ¡ðÉ�¿·|†í…,0€iŠ›G UîÆ'æÖywUý¡Ÿ2l›ª‰¹¥2è®Óå;n-F6�‘ýçrav‡\( Ì•c Þ„3ƒ)’ •yœd'ù…S–îâÄãÍï•)?tÊcI RÀ"³iñÿ,Rœ‰ Gs˜^•ýЖ]lÊZ�u=]¾bH™¨ÓaߌmÍK»Û’^Kƒë@ÚøØ¬O0Üí8dDBF|sd&ž-nBf‡ŽÏ�a”úÈØÅdËẹ¸îësÝLAG��˜þjƒ(Ã]å£�#:ÇõŽ…”Þƒßï%G~dIšÞNu3 GêóѸ‡p�2Èlv²Cèܨïê^Ù ‚Æ;ÛöZ?8aœ._XßÏrlTs*Áùóþvf÷¶3 ñ%‚ ñ%¯ïþïqWÈ6r'²vB™@: ‡2 X]Ûœ5�ìÄekF.EÂä²ê=sa;5ËW–U0LŽõ¥L`a  äOßx�ÖËB/±SR4ÇHLr¥1¹=È©`äêù¾ñ-ˉþFõ³ ·A!úzÛV�¹Í¸Næ˜öÕfÛ ›91!:s@f¸ã0VS˜bò­¾º>ˆYšUCÔ�™¡¦ÏiŠŠ*�É‘´]®{#,gKìx‚íYÖa—ÝÅìtjΉ›`@S€í¦îVZÊÔ)Vh¨ú¶îJ7¹Ô‘*Ðà뼯aI­ç§Á;/ûukÉ+ºøçugfÌŒzTWÏ ‰G_ËF�‰7¹>!Ü®D»ß'ö*åÇWµ¾‡JœåwÔPí×e»1BSo ùG·Ö÷æxäò©©.VHfòƒ}n¦è1ƒ²›æŸ›pG*­¦Qµ7÷ÖÓj‹ÂÊŒ¤áô솹2õœa0jp¬†Ê0'<ëÎP)ÅcH�“å5ˆŸWæ5cnOi@‚z�sÕ÷&T  ww3BâGfÜ´ec¼#fAëy÷ã鿏2¶ iD¡}) Wþ}®%ô>Zú¸ò£}ãÝØÕ˜I'±»gìsˆ—Nöå:5jÿâ„›3ÇÄ\ �”RìÜ`'”¡½Ú­MnL€ŠÑ,""ÙurŒˆôêЭzcïF§ØŒêý`SôcVtЯAíûjTr)D½ïÚCК&Dl‹ „×=|7/¿û¨Ô¶—Óz}�­ŸSvÕ Œ­‚?@rDx‡tI¼&�týš72[D0 ¹‡jH;WQ$¦áæ‡êw'Èf 4±¶a@ŽydÛ9)•× zÒ4¶éB'÷ÛÎõRH¿@GUlb§@…ÎøqÞŸ|�+ú�º{ ’Ŷêê]D˜H­‡+C¤ €òÑ'ž“ôõ üÍÐS6:qÝ^7U[¯òøð0zã!*šá`\o{kB¢ ëµ”·]a['ê£åÿÚ WëíJ�Ù8Ö#¬¾ôV´lÖ0\±¼Ø¸�¡–ëܺ'«òfÝ|´hãVgÞt¡n Ùêº_Ÿ�šßÙðDùÀb³Ó‘¶N $¬Ÿž´• BšvÆ ºî6õ&¶í%°› ¤Á`J¼AæÐ|¶ZLªÛÚý˜ŽãœrY}²Õq¤ŒÆáxˆ’KÜÄUçÑœ\ka’"÷~Ú¸©W�ÒÒ…»ßQb4]Ú/¼)@ÐVk‰��,£ºL"¤Vr> stream xœµYÛrÛÈÍ3“�@U^èŠ8Â`·}³hE–³Šm‰?¨ö!.4z×ûõé¹aÂP–kãrÙ,çrºûô™îágÏ'ÔóÅý™×‹ÓëØ{è¾wŸTNðôG^{g˜”DbQàmîjéŠz”ú$I¼(¥ÄO¼M½X¾¹¼>_o^mþ +R:®à &øbÝf»X~ ˆ/¦œ¤‘èÑ_ú¢“£1¡4MõèÅ¡Üj?êÛ ƒ„’ˆë9A"&¬ÄXypV ‡%Œ˜p–&ffvWúäØžÁc”“Àb¼.úC5ôâ Nñ÷­DIc°|vj[€g Š~�£IÌâC“eÛôD!†¯n$>÷è¿ë‘ÝüC×ìZžÊRøF�[_§)IÀÊÉøª’GPqDâ�q\! Å�?´È*¢|ˆÝMÐ"bLÙÏ#H� ÿĶç›ÅÇÅg�…iL"Å,£A(¼àE4‘즞].N/¯¼¡;‹ÓO]œ¾ÿœ}XÃÇåï/‹óKïãQcô–ÂŒC̼Èà‘¤0Õ‘Œm$×±!k4pÜÅP³C©\žâå>ñýóø’ó1ƒsÆob=m‰'¥aá Ÿ)¶Ïñý\6E¦h0cx‡bŒ%˜¿báùÊ—»D!æ+�ÙóÓNK-›ØËÇC¶í²¡Ìgp€¼®ýƒt„“ßÒ8RàCÂS¿Aš0æ"›0iˆ Á¤ásG\´uñ‡4!Å‚&]–p bêr ÁZ6�SÌ�aµÓ¿åœ0 ET~°sx*=Î=sÖeMÙÌù‘:íJ·h褓�Žé*EI²jçfW<ÊQ†ó°¨V¡ÖÖh<Ñ 0áGò‰ÇÏOŸçSüèâ§èÜ´H�¢s’.}]òè¨ÿBxñxn±°Ó�ÑMçßfÝPg.¶9HÂ#x¨Ó]v:àI ¶È]ÊpfdEíšÐ-IêF¸SÅN×h&‡²`Šç¢­¶€gõ¡+óÂá#·0ùÇ|ä&ÿ…ªÍÃÄÿ¡ª- 9�sq_««>˜{ä¦ü}§k0T²jY«žšgu!«,%§¾Ër] !ß<ê²É>Øå.~LïÜÁàXïÆ˜›„ ÌaáNÚ¤æíòp÷j¤�¬,^Ýðê×Í;p¬¨pG¾Eñ¼öIh™LøésöüüoQ!�UÕ£B�@’2P]ômvE/ù—ªÏ:ÙÌCÜïZéÃOþMUè˜6Ã.TŒÚ' ‘ï®Ö§hÃPö.öÈCµ•PbÓOÜ.UàEËB… …ã¢C_luO…ˆgZ˜dçJš“ ÷lŽªÈL¦´i£´-ë¢é¡§ÉTÃÁà¬4šÏ^50²™ '-Òo;U'A‘K?}lýÖøÛ¬lÚAk=ºwv™b¶þ¯ìHBqPc¨Œq*CÉ�‡öÕŠù>Þɲ•N„]�ÉZ¬Š;¬¯ �ô­pá¸K¾�ûÄ£‡³fû¤|¨Ú;å3à2µ.›²ÎˆáC8òò›‹”„z’‰«6õ¾èŠ&/zt8�o2^bþ-ýU‡•¤×ò0b/ˆv8³óÖpyщ�n�/ÚKˆfÙ n”[—·µìd™�§š2ÏPcL#‘Fž¸‹ìÀ [�d&�y"A†xú;r¥¦Sœ¡Ù]Ç>Ê�† “SîA'ýÞk¢--—=�P�‘bÙÐ�¤ÆÀÉÜ‚5ÙHfÚ¿Šª*¾êAä{C©·ÜïÉ;åBÆ}(ž÷}U6:~áä‘åuõÐvå°S)Qû^1*êõ›¶ì'Yn0ê2Ÿc¶�¨¢=eâ%{T°ÿ(È—È¥ˆŒ§¤FØ’ôc–`ÙÖ–¦«€)VD“7Òç„m¢aÆk=/lê­yªmàt)�ª­,�&$ÒÀèµãcÜ^&u ûýj‡Þ†ÿÏ‚÷îPÉIAˆ}NE#§ gj»ùñË|(++ãFè3ñk†û§“;¥pmñTu³Fñwjô׺=È2€EØèûa¯U¹í¾ke͈Êé:v¤Éû)¶镉nk†0ì€ýáîôq^JÝ;-ANdo~™I@ˆT€rÇípCô)ˆÇ禖F¶®Ûù¼ßOôÒåk]‚�ÈÅo³ûA½$X–2³Á¥ŸTñ£T�O¯Ù£ÎR„E_Ó{æÌl‡ \tmßCG$§‡8ŸLeŒî”·ætä×ùÅ}Œar XÖýì0j¼¾ÌÀ'�ßèF̆^€Óß©.lÓ5©Új¥2õ¿Ðø—Û²Ï˽HðNÒZü꨿ƕ¦LûÔÙÞÏ‹ÞlŽqW>ìt¸íEt»ì÷¶‘,àJ,_K>.þäϾjendstream endobj 722 0 obj 2186 endobj 728 0 obj <> stream xœ½YKsÛ8¾{çGè¶J•Äà{nŠíuâ‰�¥LjÊ“-Á7|hHÊ'‡ýëÛdC¤½Ùª­-—Ëe�F÷×_?ðçÄuØÄ•?øw]œ¼¾�&ÛæÄ�\ÀïöäϦ&LðϺ˜¼YÁ¤8”‹ødõp¢—ÎÙ„1׉ãI˜0Ç�'«âdzöîöütõjõOX‘°n…ïÁW®[mN¦�Üqåî;Ièrý؈Z�FcI‚£‡l#ô~Ìí7ä1sBçðDN˜{wâ‰:±›Êëì1ËÕž¡t{ÞMÛ:-›ý«¹çº®&Óªn�WŸW—'¡ëDýÙïJ}0—'™»‡ô&7JbÆî%1ŽUr(pŒpkGMñ»�…ü?v\Xa†ôÅu¶QGÊ…¡cFÒµ•›eøÒ‹\ Qgj¢ÏÖk7Í�ÄXfÅ!OÛ¬R—„‹ûýµ–OÅMA/Öd‡BkÚó�OÔnòËß“dh"8!®œÉ¯‘Tœk6Û§[ÑÈa�+USzßy¬¦ƒ½^ü•ÞÁ'J«¾<©+ENÔÏ«ÔZæuJ»L÷i©7Œ:Å]J¥;wóX8g±šÆú±$I”õæÜ÷a1àU!S~» >«“b Ö¥ƒ§‹œë±€Þæ´Îûj$úy·ÎÊA;X¾MÚ/(¾×§ÇW?5'ǽ~Ψޤj+–PYD=CÕ½1ÛQ.êªi Tp`‰óÉÁ}ýþô·ætâBWiSéõ¾…ä´Üh¬ùGÔÞ;C5­Œ‹ |RCŒb+má$5U—\"¯îµ{æ!Uû6+²o½�DtUõ€®Oü&Õ® b0ý]¶Ý)[FåwÓŽzÜx*ÄF1ÀŽlÞ—OðuD\¾".µ:�<܉±®ÊŸ¶sôT`4å©�Aî¡V7RŠ^6Ú%;KÍ?Nvœ:…W#M‘ûm4ß1ÂwŸª:ß qÌî§U¹U«=‹—EÓhß;6™³lëú=ÔÈ„F@¤AN½‘Æ]uÈÛl“5ëlŸgeZ?iˆ€1â�Ž b3`RpŒ�à›ÃßÒ\SX"ìç^ÿ>Cë‘z:¯”×â£p„�γrH—#.tZ§84&bjà�MVn• •ÀR¯;®ÞãX©Ÿ×mh¥üÏév6ä±ÉÚªÖ¶yŽ;Lš’ŽT¥õ ¯˜n¼µOL…‚t~œkmÒÄx† ¢óç¶Ã¡¹û£&^š:U93¨_ºçqžûL)Á¾Íaò`¶¼†„i7[å9*²‚ÝÍá>Ïš› ¯N«ÂäS¡c“$”è‘„³žôm¹ÍlèK,‰4ÌІ¸Vê]<âå—&·"nH¦öÆ„àÿ|� #•ä—"-±ÿΨš^¬0Iîò^ËֱG}1Ó†%AEÍ0']WmW¿±‘”—Xé*ü`ñµZöYOâŽ=A™ó0{�Zß³›á×U¹Æ">¦Œ‡@¨ÒÃÙp#ZáZ÷üïÀóHú˽엊Úäû‘|*í€ö›¨ótk^\¬4:æ›!Ü6ƒq›ÁFxOV‹ÑÖ·ža:­�ÁÁ»Ôµ8i†-iûeé¹>Ò€bŠç{�Súä ß--t`¡ÍFù�kv° bø–pTÖgeU½�@Ò%x{"—öV(1"CBI¶ìRûi|7R~+ ›{<ÛÄaÖk¼Â°3t(QuŒ¼^0ÿ�©ÿÇ«Ÿ=�}÷‚@ϰÊ,ò€*_ÖÃ#@y6 Î�!X.Óò ¢…?5ÁÓøæoZºÎ2õ6úLFÜs7‚;HŽHt[ëÜÄbÒ]Ú´Y³Æ„«³‰0¤fFÀ±Ò]­¼Àê�|ë�ì«qŒm«}¤iEÔ‡®DIBúît7=ËöyU¤õ=yIÌÚ™ÎýMö…üδ»¾e‹º'Êú”‰rvtë΢竓_áçßÁ" endstream endobj 729 0 obj 2670 endobj 750 0 obj <> stream xœ•UÉnÛ0½ë+t”�˜á&‘ì-‹$h‘ÖQ…“ƒ,+ŽZKt,¹…óõå&‘©�CaØ‚†3Ùyï�_cP õÇ=Ë&:Ÿ³xÝE0¾Qßuô!ã»GÙÄ—¹râ™ÂqþÙÐ)Š‚€ó8@çM”\ßÎgWù$ÿ©"#(QPÇå«(ù�Ô.˜‘Aì¬ß»jg¬ $„³ÞìëUeó!èbŽ@F�1Ù¦„e€ÇDýP•T,}²9Ïk _ƒa> ÜÙîd[uÆN! Þž¿˜Bp ˆ¯Ï7œ"À½óz#—ÅFÛI ˜ïRnûº©ßо–­>ÍÈÜQ±YË]Ý¿4g&G¦.à8›¹˜™"‡Ž¤�… ÏxŒ¨êTYI±ÝN¦Xg<©ŠÝä)¿‹“Õ¦ DTàxïг˾Hfmy(7rHFYR­êÂdc°t€|vÙ‚aÝÍ›n¦ˆ§ űbe‚9ÐÒ“ ¥!Yæƒ�ùì·37$ä}¯_êû:•ó«fšA4@Ríú~ßV­E†Ó*Ú•©‡ãºÒbÏ„™³¹×‡~_ºÀ`2¿š¢µ#QR®ø\o;ë›�Ôû¾Ôý[]°€Üß®¹5µðkæR4⟄”£,œÎÅ8¹ï͹Ø[Ü‘‹ÙŒÅ`="ã¬�TJÙvýXbæz`µŒµx‡u‚Âîîä~×Zå¨z‚Mà…CÈî?VS~Ô�ÜÜp¼0‡/¶ÛMm:%8\ æ’îxêÞ0%Ó5Ž$bâJ™%¦»HîË^.'S!D‘ÍȈ*öбCåM¬T°rÊŒR4âV)Ù{¥ü° %خݚ èø�O!�cX€Òõ¡-;µÕ‰�Ø7û¶­6µ½‰ŠP Ã>së, û³´«†¾ñ+S|ò ú¨EDtñÓÛÙlæð;Þ•¡¼MÔæeÝåˆtÊÂB,Ç�B×wòpèúª±k‡ò� _ »6 ùÀ7v~uXšÌïâ«][õuyŠqïÆsvŒ �Iú8±×ÓQÕVÕê6„b¼jZÍÌhÏÐqi–ºÒk6pQHó\GZãÿ¢0·ÿ]³<ú¦>«ýBendstream endobj 751 0 obj 836 endobj 4 0 obj <> /Contents 5 0 R >> endobj 77 0 obj <> /Contents 78 0 R >> endobj 202 0 obj <> /Contents 203 0 R >> endobj 224 0 obj <> /Contents 225 0 R >> endobj 323 0 obj <> /Contents 324 0 R >> endobj 350 0 obj <> /Contents 351 0 R >> endobj 373 0 obj <> /Contents 374 0 R >> endobj 385 0 obj <> /Contents 386 0 R >> endobj 409 0 obj <> /Contents 410 0 R >> endobj 423 0 obj <> /Contents 424 0 R >> endobj 468 0 obj <> /Contents 469 0 R >> endobj 477 0 obj <> /Contents 478 0 R >> endobj 494 0 obj <> /Contents 495 0 R >> endobj 512 0 obj <> /Contents 513 0 R >> endobj 525 0 obj <> /Contents 526 0 R >> endobj 540 0 obj <> /Contents 541 0 R >> endobj 547 0 obj <> /Contents 548 0 R >> endobj 565 0 obj <> /Contents 566 0 R >> endobj 592 0 obj <> /Contents 593 0 R >> endobj 606 0 obj <> /Contents 607 0 R >> endobj 612 0 obj <> /Contents 613 0 R >> endobj 623 0 obj <> /Contents 624 0 R >> endobj 628 0 obj <> /Contents 629 0 R >> endobj 641 0 obj <> /Contents 642 0 R >> endobj 661 0 obj <> /Contents 662 0 R >> endobj 674 0 obj <> /Contents 675 0 R >> endobj 679 0 obj <> /Contents 680 0 R >> endobj 686 0 obj <> /Contents 687 0 R >> endobj 695 0 obj <> /Contents 696 0 R >> endobj 700 0 obj <> /Contents 701 0 R >> endobj 720 0 obj <> /Contents 721 0 R >> endobj 727 0 obj <> /Contents 728 0 R >> endobj 749 0 obj <> /Contents 750 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 77 0 R 202 0 R 224 0 R 323 0 R 350 0 R 373 0 R 385 0 R 409 0 R 423 0 R 468 0 R 477 0 R 494 0 R 512 0 R 525 0 R 540 0 R 547 0 R 565 0 R 592 0 R 606 0 R 612 0 R 623 0 R 628 0 R 641 0 R 661 0 R 674 0 R 679 0 R 686 0 R 695 0 R 700 0 R 720 0 R 727 0 R 749 0 R ] /Count 33 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 75 0 obj <> endobj 76 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 222 0 obj <> endobj 223 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 407 0 obj <> endobj 408 0 obj <> endobj 421 0 obj <> endobj 422 0 obj <> endobj 466 0 obj <> endobj 467 0 obj <> endobj 475 0 obj <> endobj 476 0 obj <> endobj 492 0 obj <> endobj 493 0 obj <> endobj 510 0 obj <> endobj 511 0 obj <> endobj 523 0 obj <> endobj 524 0 obj <> endobj 538 0 obj <> endobj 539 0 obj <> endobj 545 0 obj <> endobj 546 0 obj <> endobj 563 0 obj <> endobj 564 0 obj <> endobj 590 0 obj <> endobj 591 0 obj <> endobj 604 0 obj <> endobj 605 0 obj <> endobj 610 0 obj <> endobj 611 0 obj <> endobj 621 0 obj <> endobj 622 0 obj <> endobj 626 0 obj <> endobj 627 0 obj <> endobj 639 0 obj <> endobj 640 0 obj <> endobj 644 0 obj [/Indexed /DeviceRGB 63 (\000\000\217\000\000\237\000\000\257\000\000\277\000\000\317\000\000\337\000\000\357\000\000\377\000\017\377\000\037\377\000/\377\000?\377\000O\377\000_\377\000o\377\000\177\377\000\217\377\000\237\377\000\257\377\000\277\377\000\317\377\000\337\377\000\357\377\000\377\377\017\377\377\037\377\357/\377\337?\377\317O\377\277_\377\257o\377\237\177\377\217\217\377\177\237\377o\257\377_\277\377O\317\377?\337\377/\357\377\037\377\377\017\377\377\000\377\357\000\377\337\000\377\317\000\377\277\000\377\257\000\377\237\000\377\217\000\377\177\000\377o\000\377_\000\377O\000\377?\000\377/\000\377\037\000\377\017\000\377\000\000\357\000\000\337\000\000\317\000\000\277\000\000\257\000\000\237\000\000\217\000\000)]endobj 658 0 obj <> endobj 659 0 obj <> endobj 660 0 obj <> endobj 672 0 obj <> endobj 673 0 obj <> endobj 677 0 obj <> endobj 678 0 obj <> endobj 684 0 obj <> endobj 685 0 obj <> endobj 693 0 obj <> endobj 694 0 obj <> endobj 698 0 obj <> endobj 699 0 obj <> endobj 718 0 obj <> endobj 719 0 obj <> endobj 725 0 obj <> endobj 726 0 obj <> endobj 747 0 obj <> endobj 748 0 obj <> endobj 752 0 obj <> endobj 753 0 obj <> endobj 724 0 obj <>stream xœ37S0P0bsC3 …C®B3s ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠r8éÿäÀIŒ ÚÊf讈ç~ýúÒ—½úÞ—>L_¢¾ ˆ¿öñþ—¿$ÖªýUû«)ÿªýXö#Þ÷wýïºûÿîoÿ¿ýíÿ·PÎý{s_.xäÆÌê�ÿƒ¡�ƒËÕS!� ³fYÝ endstream endobj 472 0 obj <>stream xœ=Š»@@DûùŠùw/6Y­Gb •BT(„ÚŸc5æœä4“X:jÆ$fœrVl_MÀÒEJuQÆiEî!¾á±Ÿ ¤HM ÉÛ‚ )…áK^Ï¿;ˆÊ³Ã Ü P endstream endobj 418 0 obj <>stream xœ33R0P0SÐ5T05U0³TH1ä*T0± (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[°ÓA�›%¸õAsŒÂuÇu]Lü†ë&Ôª_â¿üêoÝ¿�¿ÿþϯýf”5_óàb…ÃZ' nN0H:ø¡ºš??Ÿ÷áóæ'&*'Ä9'œ•œ�}½Æ¼z6¯îßßÿÖÿŽ^½:"Ó±eÉŽPû®‡€01�‰£�ƒ¡�ËÕS!� Å*Rì endstream endobj 368 0 obj <>stream xœ3µT0P0QÐ5´T0µP01UH1ä*T05Š(˜™(˜è‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶Àq�^NÐC¶þ‡{L/8n½Tï¹õRò˯µú÷×Çÿ´ÿ?LùÿskË®—ÞŽmëÓ»¡ú&¼M¼™û`ÓG°‚ÿŸ$WýÿÃàÀÂåê©ÈrÃLŠ endstream endobj 365 0 obj <>stream xœ35T0P0VÐ5´T05P01QH1ä*T01Š(˜+ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶àà Ńl;ÜOØs(Üz¡öWí:§ù«×Wªü×__ýéÿ?áÿA@måÿÿûïï¿õþÛîßÙÛzônÅI{æúpDŸ�û8XÅÿ¿6m�õX¸\=¹rM endstream endobj 361 0 obj <>stream xœ33R0P0bS sc…C®BSS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶BüèŸYëŸDN8;ÿ?lýß$²Yÿ÷ÿÿÿ1�ù,aÿÿÿßöI*\½ÿ«¬ìÏ¢8›YK?02p¹z*r\ìM[ endstream endobj 358 0 obj <>stream xœ33R0P0bS3sc…C®BSßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶¢·­Ç¢�ïÉU»O–ÔI¸¿ýýÛß¿ë×ý¯ûÿ÷÷ÿïïÿÿÿûý?|ýúÿÿ¯¿õ¯¿¾þ¿ôÿÒ×/«~ÅMoÙ£ȵÊ7 F„Á�…ËÕS!� ãõT endstream endobj 355 0 obj <>stream xœ37T0P0SÐ5R0³T0³PH1ä*T03 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-Ø)Ä~bƒ�MSó„â·ÌUÛß~¹¿ÿÞþðÿׯÿ¿ª·ÿ¯nÝêK_¶®›ôe�ÂVïMŸøý¶ˆ³óæ¿}ußìÿïã—ÿ¿¿þlHéþÿ×Y¯ÿ_«ÿzmɯÎ5™y»3=WhsD$:°08p¹z*r­áU& endstream endobj 345 0 obj <>stream xœ33R0P0VÐ5´T05W01UH1ä*T05Š(˜™(ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶HŠÅ„�Ík�‡æ‹cœò|=î]®�÷ýú»þwýÿÿÛÿCÀÒÿÿãöÿнž}+vé­˜…ÌœÕ{ €Pr�àq°‚ªiÿ8¸\=¹çãI¸ endstream endobj 342 0 obj <>stream xœ37V0P0bs3 …C®Bm æé*èèX�…©Br.—“'—¾§¯BIQi*—~8P —¾˜t pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@Åvv\ž. j;ø'½ÿÿ$ªÙŠ“Gá`®Óݵ;âß.Ý7íÖÛëK·í.}™»înUt6T`ãÛÒíÛ×þë^¾þr•ïë/÷&Wý5_ro¿ïKs�}“«¶¯_^}�M �G0Lúƒ—«§B y"Y> endstream endobj 339 0 obj <>stream xœ³0T0P0SÐ5T07Q0³TH1ä*T0³ (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[pŃw&Ï¦× âMhŽpI(Û’Åó6‘‰§Dø‚¿çK[õ%_æí›7ýÞô{ûö_ýÿWÀÂTþÿÿÿj«ïOHÝÿßïõk÷_ÏÛûw˶K·c·l“ŠÎÌ1˜&a0íDÃÂÄ®ƒ­mbÎ:rŽ+,8¸\=¹�HQ‚ endstream endobj 336 0 obj <>stream xœ³0S0P0bsK3 …C®BsS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠˜8-ÔÑÁ¢àÉEö'ܯþpûÛßuÿîoÿ‚÷ÿý¯ÿÿŒAà5_ÿ¿>½¯¿¾ôaúÒ‡ú,{E¹¸¸œë08°p¹z*rOO‘ endstream endobj 327 0 obj <>stream xœ342Q0P0SÐ5R044W°´PH1ä*² � †@I=C 4�HÎåròäÒ÷ôU()*MåÒ)ãÒ÷©âÒw pVò\¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1H“�—§‹‚–Còÿ?³Ú8[µ>áüO"øzoÿû¯÷½-ÿ«»¿dwìë\Ý­_¶ŠH\ºMèF¢ŽABÓM6ÙÄŽˆl �¦E>MS¸\=¹ßl6 endstream endobj 220 0 obj <>stream xœ37S0P0UÐ5T07¡C®B3S  �k¨`ªg”ɹ\Nž\úž¾ %E¥©\úá@E\ú@5\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[8-@²ˆ‹-QŽKNpÃ99Çö�Ä ÷„@Ää*ß—æ—_W¹ŸÝ×Äû•ã#{•#‹Dî—&Þ} ÕÞ/Íýºìý’™3æÇ_›÷+öÿïÿ?þ]ŠþÿnpµÿÿïþÿØýÑ·þý¿�ý>kï.ƒ­;rÕ®o“ðöÎ18Äa6ía‡Oxb �îFÙß·oß¾‘böKš;±‰›ÇÀaÃa…˜é�'v~HrÖ�`hààrõTä;Tu endstream endobj 210 0 obj <>stream xœ3±T0P0QÐ5R01Q03SH1ä*T01PA3 =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j vÎÐgáç°Q6ÜË”ï¹WíËì«{õo_ú÷µný�ÿïëÿÿûÿäjøÿí_÷ï{�+»õíÒÙeÞmŠa<úòqûÿ{ÿ:}ôòZÓ__ö¿Ô›tódÚaº‰ X¸\=¹®VNB endstream endobj 207 0 obj <>stream xœ3±T0P0b3CC…C®BS3 „o¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-\âÁ©8K™åƒãC[©ÎBYæM¿T²ëËþKÿo]ʾõm�Ážúÿ`ðO%Cþ¿ÚB¿ÿãŸZ÷ÿÿÇ ÀÄåê©ÈT–XC endstream endobj 715 0 obj <>stream xœ32W0P0VÐ5T02Q06UH1ä*T02 …ÍŒõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô–¨|þ3õßôÿ/ëÿM¬|È~¤/ÙñïË_{ÿÿ§©ÿWoÉÕð×¹z‡¸“6jà`hàrõTä&Ð5� endstream endobj 683 0 obj <>stream xœ31R0P0RÐ544U02T0QH1ä*T0´Š(i#=C°,�JÎåròäÒ÷ôU()*MåÒªãÒ÷)ãÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�pé;çç”ææõØÙqyº(|Ê’øO,xü€‰A�ËÕS!� ïçG' endstream endobj 537 0 obj <>stream xœ36U0P0aC…C®B# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²µ…ŸãÆá ŽíKîM®Š÷=úáí÷?³–lü·õuÜ–-».�À…¨¨(ÇÒK/U—¾Ôk_7¥†Á�…ËÕS!� â‘< endstream endobj 534 0 obj <>stream xœ35U0P0Q0W05P02SH1ä*T01Š(Z*˜è*˜éY*$çr9yré{ú*”•¦ré‡Õpé{•pé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.O…'WD÷ÿÿB#¿�ƒ¡�ËÕS!� ‡æ ± endstream endobj 508 0 obj <>stream xœ35T0P0QÐ5T01S03RH1ä*T01 (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶âA§¦ÿÊ[¶,¹ª²Ñ{mÉ–]××êV]_ Bõ¯¯¿¾þ¯þÿëëÿÿ­ú×®`hààrõTä¨q>stream xœ35T0P0B a¦�bÈU¨`b ‚¦† ¦z† &z– ɹ\Nž\úž¾ %E¥©\úá@5\ú@%\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\¶aWÁÖ– »¸93tTlhºtˆÛ›CWGa ˜¹¢5\m…݇÷óçóØî1øf&>ÜÛÞöMNž÷žÜ59&.WO…@.ÿl:h endstream endobj 502 0 obj <>stream xœ35T0P0UÐ5T01U03RH1ä*T01PA3cS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ôn¸ "`£Þ"'îïÒø…s¯¾cU|ÜäXÓ_×G}ýõÅ‘ý“Á…Çœ—ø9�ž[hÐ\r×Üß÷¯}ùŸYëÿÿ¯ý·{íÿØ-»cw½Qݶ›Guct4w6�Ž„C—«§B FDa endstream endobj 499 0 obj <>stream xœ35T0P0UÐ5T01U03RH1ä*T01PA3cS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô´!ç¸o&ϒĽ߾ß߯-ÿÿmiÝÔ5& ×H¨Šß:ÌÕ”µDK�‰A�ËÕS!� &J� endstream endobj 405 0 obj <>stream xœ32P0P0bC33…C®BC�(�k¤g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmYÎË—ÿÿ]»fÿÿÉ';ßøúÿpð×¢¹�ƒ¡�ËÕS!� : 2÷ endstream endobj 402 0 obj <>stream xœ33P0P0UÐ5R03R07PH1ä*T05W ›)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[p%ƒ¿‰mƒã‡ž#Ù�[[„33 _¨_ªÕú~éËþlïÿñ«þÿ­_÷ÿOõí÷íjäNL‘HßðMNú0¿âc¶O¼U ?j÷~ÿû_íÿÿÿk믿^ÿ+>*ûeÙô¥Ë¦gÏÈ,9ÌéÊÆ#"ÑÚ&ÊÌÊ ÀÈåê©ÈÔbTÝ endstream endobj 396 0 obj <>stream xœ31W0P0QÐ5T01U01QH1ä*T01 €Eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔÜ9£Ó(•(¯ð¡ÑàËìC¾/Ô¯}Yïùeo~lUüËÚì×ÿ¯Ö¯}YõuéšYk«¢3«¢3t·l;ÄÍÛ²MaCÂ&.WO…@.io= endstream endobj 393 0 obj <>stream xœ36V0P0VÐ5T0²P03SH1ä*T02 (˜™+ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pŽ®méÿ[7"þÿÿÿ“s†ã‹ÃžûD_¿¬ÕÛÿk}èŸìPΪ¿@x}ýõõ¬kK_Ù·?Vÿúú¥»b—¶ióh04pp¹z*rø ?ÿ endstream endobj 389 0 obj <>stream xœ36U0P0b#K…C®B#c ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ðt'÷:n™¯“íÿ£�_•?8¸\=¹JP3S endstream endobj 73 0 obj <>stream xœ³°P0P0b c S…C®BsK ßÄ5Ñ3TÐ5Ð3° 79—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\“`ºòÿKü7ßðÿµ_õ_÷Íÿ«ýý¿×ßÿ—ö×™ý?ú%ÑÇ—ÿ_Ü�Qkÿë¾ÿ¿©¿ÿ/­ûÿÒüßöËÿ×þ~ýòž°?‹„ŸJBª€Áý L\®ž �\ÒÏa endstream endobj 70 0 obj <>stream xœ3µT0P0UÐ5R05V0·TH1ä*T0± (X*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j §dp*Ü[£ð¡—µŠEú‡ù’{Ó—ˆ{¨/Ù7ýßôõ—£ÚÄû¦¿¾þúÿú8'Á‡ì/,YزH_Ê_öe½çþºuf¯ß¿úþÿmýäÐÿÿÿûÿÿÚÿ»Kÿ}½õ>véþmÓ3s—n›&aà�$&‘˜pÐ�…Á�ËÕS!� .KX endstream endobj 67 0 obj <>stream xœ3µT0P0VÐ52U05S05VH1ä*Ñ@hn¡`¬g’’ɹ\Nž\úž¾ %E¥©\úá@U\ú@E\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmá6nWFƒyŸ zŽI±^pìðö\¾äë’‰ÙÉ—_×ùuÿ?ì-Ûÿ>vÝ×mÓnÅ.]p(Ê�#N"Êá`Åÿÿßÿ~¿w²AYÉaš4)ÎèUøå¸o¾÷·Ç/ÿÿ›r5{ëmï\Ý-Û.ÝHÔ18ÄÍ3Ç""IŒGÌÙn#ƒ—«§B ¨š`ê endstream endobj 64 0 obj <>stream xœ3µT0P0bS#sK…C®BßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶à Ez“i›"{‹œàŒ…/Ì̾ÄûÒürUøåW÷ãÖ~ý/üpÆáûÿÿÌZzëaëQý[ÿêm}íýeË®K—.½öƒµº@ Žô’÷zïK_öª^ú²Ú³ÄþzlÒþ†.WO…@.l†Pc endstream endobj 61 0 obj <>stream xœ³0V0P0bs3 #…C®BsrÍô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº((:,�‘±4˜Àzøï;éo÷çßþ‚ïÿÿýÿÿúÿõëöÙ[·WßûP\Ó‡énÈ Ä~¨¹`tø~ûcþýíïºûÿîÿ¯)‚¸ý«~ÅÿŠ›¾~éCÖÞ>B­\"+Û¸\=¹‰R^¦ endstream endobj 58 0 obj <>stream xœ³0S0P0UÐ5R°0U°0RH1ä*T°0PA S=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. ª‰kœ×ÈXš ´±°oqt”n®“¨»¿ýíï¿¿ëÿþþÿý?Äÿú[ÿ²¶*núÒ‡úŽªOŒÛ�ˆ³ÞWgbþ�ø#ñw�ôïo÷ƒ Xñõ!¾¾þÿõ½™÷—½±º»ašÄJSÖ¥lý˜¸\=¹¡ž` endstream endobj 55 0 obj <>stream xœ³´T0P0bK3S#…C®BK# ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶hf“pSSÁƒÆ~ƒæC6@ô…ì‘íÉ•êŽv²j—òKf{î÷öþÿß³+ÿÕ>ûWûÿÿ[ý/8Ä£pˆO%á¤á¤Äýÿ?02p¹z*r;[ endstream endobj 52 0 obj <>stream xœ33R0P0RÐ5T0µT05TH1ä*T05 (˜)éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠ŸÿS–»Ã �‚C‰y‡~ÝÿuûßîØ×ÿ®W½¿«ÿ;öõþ’ýoË×ý½ôë½ý·½�Âÿsõ|ÛŸý?ûÛþo ˜¸\=¹™TDW endstream endobj 712 0 obj <>stream xœ36P0P0RÐ54T02W02RH1ä*T02U‰+é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶ ��å ®´Ù…/Ã÷M_)êÿÿ%Óÿ¿ÿ·;{›`ë�%}üïýùøªÀ¥kf-ˆ “Ð`hààrõTäƒl7� endstream endobj 709 0 obj <>stream xœ35Q0P0VÐ5T05P02RH1ä*T01 ¹Æ Æz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨­¹ÑÞb£jÐÌa+>Ë WÂ|i"ë‚ù¿’ÖiiíÛ¿ê¡–géÿÿK—LÿÿËQÿ÷’iÓ_Ö¿¬ÿåiáýcí²f.&.WO…@.‰G8ß endstream endobj 706 0 obj <>stream xœ36W0P0VÐ5T06Q06PH1ä*T06 €(c=C �HÎåròäÒ÷ôU()*MåÒÊré{€I§g åmÈeË¥ï¦ïìì䨨è{usé;çç”ææÛÙqyº(¨-ho>ÄÏñpó±Éë¦Tù/}ý2üWüº­×ÿ¯)�µ+~ýªÉ!×öí½Íq«t[Sé�eÚ< ‡8¸\=¹Àñ8Ð endstream endobj 703 0 obj <>stream xœ340U0P0bC #…C®BK3 ˜k¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEA!qiõï“+”n¸',ÿþÿþyõßõÛÿ1ýG¡`âÿa‡Pÿÿ÷ƒÀ? øÿ q�‡Á­÷û~02p¹z*rÇènX endstream endobj 532 0 obj <>stream xœ31V0P0QÐ5T01V07TH1ä*T0¶ (˜)˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ á†'ï¬Dæ‹;/¸8¿|%ïØúøïÿïßþ¯þ~ïþÛïû+Ô[YÜ›Þ"\7¹*nýÒ—ñþë—þ_úûõ×ÿ2Ãÿ_­úõõÛ”Yë_æ.ýw+:3wé6�ˆ$1 †.WO…@.�YPÖ endstream endobj 529 0 obj <>stream xœ37T0P0VÐ5T03W05VH1ä*T03 (˜š(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇåé¢ ÆØÿrà\fƒ9o7Ä¿�]÷õˆ¸ÿzoÙîëÙ ¢~ÝÝ*¨øúߥ¯÷¾­»þ¶DÔ]»ÂàÀÂåê©È’˜C› endstream endobj 465 0 obj <>stream xœ32W0P°PÐ5´T0´P01VH1ä*T04PA3# =C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�Zìì¸<]Ô6è(üÓŸ²ŸG§þ?˜>´Ø÷Ó4"¡éøÿ_¯ÿÇm}·õÒ¥W L\®ž �\ñÉ2ê endstream endobj 399 0 obj <>stream xœ3±T0PÐ5VÐ5´T01W01QH1ä*T05PA3 „‘ž%HVÏP!9—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷jçÒwÎÏ)ÍÍ+j±³ãòtQP[ðœ™ýH‹„ã‹#‡Ì_š5å{ ¿¼`ö_ý¸Ù¯ì/}]}µþÕ¾ý×åWý�µo×ÿ«u»þm�_7ýuè¯/û¶\ú²Ci¡~ÉÖ-{ÛbÙ+¶Ê¿þúoü믓JÙzX¸\=¹îƒR endstream endobj 320 0 obj <>stream xœ3±T0P0V0Æ f– )†\… Æ hd©`¬g¨`l©g©�œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô6n8¸�à¹7ïßûOYëyîóÜï³ÿÿkÝêÿ_ãV‡¾Ú $.y{êªìZÁÐÀÁåê©È^R2« endstream endobj 318 0 obj <>stream xœ35V0P0bS#S…C®B ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶�CbG%ëŸæÿm¿òo_ÿ}ý׿]ñ_½_/Ù«ë'ËÄÝu¡æ‡ž¼ãþ½ñï×ß�ÿ7ýoöõU_¯ê{/Ù£°•ÓÅi‚�ƒ —«§B ÿí?Ü endstream endobj 315 0 obj <>stream xœ37Q0P0QÐ5R07V0³PH1ä*T0³ (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-Ø)ÊfÄÙ|BÜ’õâÞWÒîûþý]õ·¾þõ×ÿÿV–þ™«}éªXÕúÞM/â8ô¶ˆ³þ�£jûÕß_ùÿ ¨öõúëÿ—ñ¯‡¥ÿ_{ÿzu�sW 2³­î¥Ûœž+4¹65p04p¹z*rØzX¼ endstream endobj 312 0 obj <>stream xœ³0T0P0bsss…C®BsS ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ æ‚„ ë“9Á�Î,i™™Ø>LÎ4_Ò¢}‰“é¥VUèËðÿë¿úV”í—ÿŸ$ÿ)ÙOôok~püûßÿ„À—Ëþ;•žœþÿ�A�‰ËÕS!� àîfì endstream endobj 309 0 obj <>stream xœ31U0P°PÐ5T01W01QH1ä*T0¶ (˜˜*Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶H†—1‘MøâÎåŽæ×þÖêþÚ«ÿûú—õ¯_÷­ÚÇY7ýuüúëQ¯ÿñ×_ÿ=õÿêÿÕýï½e{Ü¥»ºmI:°08p¹z*rÙÒ@ endstream endobj 306 0 obj <>stream xœ3¶T0P0QÐ5T06S01VH1ä*T06 …MLô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸1EâšÐ!cn]Ö¥@°nzÔëë/Vëþ7fe^ÿo§iÜÿú÷µ{OüN,;Ä�ØÄÍãt°©�ƒ¡�ËÕS!� >ù4œ endstream endobj 303 0 obj <>stream xœ32U0P0RÐ5T02V01RH1ä*T02 (˜+éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-<#jý×ßúõ×9ó>¹’Þú·nÿõ× â•Ð××_}}©ï½e»wÒ†C  \®ž �\ ê75 endstream endobj 300 0 obj <>stream xœ33Q0P0bsC3 …C®B3S ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`ÿOVvÅ…Ò¿Úÿ/ÿÿ7êõÿ¿uÓ_ÿ­Û¯p¤nßÛú_¯cõÿíZz!ÎþÒ³„ùüÿÖ–þ Æ%ö¿¾þ_ÿëë¯ÿ¯… L÷08°p¹z*rÏ(JÒ endstream endobj 297 0 obj <>stream xœ33U0P°PÐ5T03W01QH1ä*T0µ (˜˜*Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶H†íÀ†fÅELUæ³J„ë½þ¿¾ôò×{ïÿ«¯¯÷þ·ýÕŽW«ö7Å¿ µõßþ«¥¯Wýÿ·kýÿ/û¿LúïýÿËöÿ!»ÿûê^Ü÷êÒmÏK‡Õ¤¢E$Z›9$¸\=¹  PÀ endstream endobj 294 0 obj <>stream xœ31P0P0UÐ5T01U01QH1ä*T0 €DLõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[pðÀ1�l¿ «—M/]|äº#›„÷‚£%Ý×vÅ]B G_†M_²+nR”«ÕG¶iý‰ëš[¶ÌX7ëRöªÞVÇVF.WO…@.x_Gj endstream endobj 291 0 obj <>stream xœ31P0P0SÐ5T01P01QH1ä*T06Q ›˜*˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÁ�͇, ¾Wù¾´›úu‰øWïõûsß÷ÓÁ®”3ñ�íÞ=òŠ %ì~W?=Þrëòÿ¯]ë[¦ÌZ°ß{˶K·9s š lHXÀÄ Àåê©ÈajB endstream endobj 288 0 obj <>stream xœ31U0P04PÐ5T01V0³TH1ä*T06Š(˜ƒ¤ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[x¾ùäËÿöïÛýßÞú×bÒ{['³Ä/“ëšò»¾Ì~ýõÒÿñ¯_ÿ�úõÿÚÖëÿ×_ ÿ¿ôSÖÖ—U«¢—ÞŠ^ºmÚ-î$1‰F.WO…@.•™NJ endstream endobj 285 0 obj <>stream xœ35P0P04PÐ5T05Q0³TH1ä*T01Q‰›ƒ¤ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸zBÆåŸ¼þ÷ã_ý·J(Îߣp�ãá~µ×žû½lÕ¯mÙ«þßkë¯Øúµú×ãWýã«þz<¾¾êŸohýõKëãKã_çJü_ºt›PémÎØÄǮà ˜¸\=¹ÛhRH endstream endobj 197 0 obj <>stream xœ³°T0P0b c3 …C®Bs ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇåé¢`Ú´t½ÚâSì<»2vqÿÿÿwËþÿ·½ÿÿÿŸ«O%Î�õÿÿßúòÿ¿ïz~‹YÍm¢ÿ01(p¹z*r˜Co endstream endobj 194 0 obj <>stream xœ37R0P0QÐ5R07T0³PH1ä*T03 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº((5\ñrÖ±4•tÐãç¸iÏcŸûÛßýùÿ÷×ïÿ¿þ_}éÿ¥/{Yês賈 Äè¥q7Hü]wøÛß÷ÿ«ú "þúýûÿ¿½»ñ^SIH¿&»eɑքC  \®ž �\uUX endstream endobj 191 0 obj <>stream xœ3¶P0P0UÐ52U02W07UH1ä*T02Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(èIÉnß¾ýÞ½ûoßþ»_ý}ýöÿ xÿýßÿÿþÿý_ÿ¯ÿÿõ×ÿø_`xmoöµé/3ë¦M�ŠŠ e`ärõTäL­ endstream endobj 188 0 obj <>stream xœ32W0P°P01P0´T0³TH1ä*T04 (Y*Xè*[êY*$çr9yré{ú*”•¦ré‡qé{Õpé;8+9.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmãv‹÷{f­1®³ÿ·ëÿõµU××–lÙ²«�ƒ¡�ËÕS!� ï)¦ endstream endobj 185 0 obj <>stream xœ32W0P04PÐ52U02Q07UH1ä*T04 ƒ$@XÏ$ $“s¹œ<¹ô=}JŠJS¹ôÃ�ê¸ô=@ʸô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P��—§‹ÂçDûÿX�Û.WO…@.N4 endstream endobj 182 0 obj <>stream xœ37W0P0UÐ5R07T07PH1ä*T03 (˜)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[8#€E\¦±äu‹|‹ŸBvK÷~…Ã1 ÍÙKî/9¾ä—?-ýòë—ÿ¿Éÿ—üýÿòëÿÿ{Âÿÿÿç¸PÑÔÿ¿âºþìò÷ÿë÷×ÿÝÿwþÿüÛß®çߎݒüÆd�Ùä‡ÍœvFÂ÷yœj Úgt04pp¹z*rr»XB endstream endobj 179 0 obj <>stream xœ3±T0P0QÐ5R01Q03SH1ä*T01PA3 =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j vÎÐgáçøÈ¾ ¹Â³}É}ÿ%÷&׿®µÛþoûÿ¿vÛÿÿÿ/û ÔVÇÿÿÿwÝ×ÿ¿¯ÿάÿw+úzö¶i·"rY7ŠHãap`árõTälIÕ endstream endobj 176 0 obj <>stream xœ37W0P0bs3 …C®B3�˜k¬g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEA1qΪ6ÆÃíj =þ0¸?ÿö·ÿ¿¿ÿÿ®ÿ›þ?nßô¥õYv´zXÀ“bpû?Z µÿ ƒ—«§B ŸJM endstream endobj 173 0 obj <>stream xœ35T0PaKc…C®B ßÄ5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ÄÂýÏ×Cá—Tb>wÕ;±û»¢3Ë£3óö.ݽtã×}¿k_Ÿ^¾´jû’¿æK«öM®�› $«îmoÝ#ì§ØâÂö¿�ƒ¡�ËÕS!� öo=¦ endstream endobj 170 0 obj <>stream xœ3±T0P0QÐ5R01Q03SH1ä*T01PA3 =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j 7\P¨p|(Ùõ…ü¥¹Š“IóK“øª/»â¦ÿ›µõñÒÿKÿ¯ÿâ2¿…ÿ�™ÁcG¶/3ª|_š_—.­þwÿoüŸYëÿÿÿýþÿµÿëK÷¿Ìý7ínîÒmÓnEó¨¶)&¶¶‰08°p¹z*rf5Px endstream endobj 167 0 obj <>stream xœ37P0P0b333 …C®B3ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶#þÏ?þ³Ø&~ÙöëþÿµÿÿÉÿÿÿiçÿÿèð,`y‹œ3SýF.WO…@.Ý(Ir endstream endobj 49 0 obj <>stream xœ33U0P0SÐ5R0µP°0QH1ä*T05 (X˜)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[àh!{Pê …ãÇu‚½%Mÿ_(ÜziþÒð%û¥_µñ˯ý½ÿïÿ÷÷þïó ©~Ÿø}ÃO?^3ï¶Ø© ‹Õ˜m›oؘoøpO¢Â¼ù wˉ4ަáÍ÷Øý®ßwŸíÿýïÿWÝ¿:½®Uóê¶M58‘ÊÈ´àh@bb«‹™ƒ—«§B ¶n]q endstream endobj 46 0 obj <>stream xœ33U0P0b3# c…C®BS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²9ãÿä ‡ßÿ#Å—8þ²Ð¨kÊ¿àûËÿ¥ùËúxéÚú¯ÿÿÇÿÇ ² *sLæýÿ€‰A�ËÕS!� ñsV÷ endstream endobj 43 0 obj <>stream xœ³°P0P0b #J1ä*T07òÁ"¦z† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<].¾÷)KÈq}솄½ëÍönÛÿwÿûï˜øÿmþ÷¿ÿÿ»„Ñ5<þþýÿýûÿëÿþýò×ür�€�ŠCVùßL \®ž �\-¹t• endstream endobj 40 0 obj <>stream xœ31S0P0QÐ5T01T05VH1ä*T06 (˜š(˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ åÓ‰©zÙ-i _8ä=¿Ì_~õ×ãú¿ï¿Ÿr¼ýÜÂM'Ä�0ø&wøFE>ïƒ{]ŸxÜc#ýöÛ¿÷¯ßº›�|Âdeg°À ƒ \®ž �\„öH˜ endstream endobj 37 0 obj <>stream xœ36V0P0bc c…C®B#3 Ì5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²ÃþÉ•µÿ ƒÍ�Ò¸\=¹�çEà endstream endobj 34 0 obj <>stream xœ³4R0P0SÐ5R°0U°0QH1ä*T0· (X˜)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[¸,€‹»[á‚a�Ãu{Ž‚ë8ø±HDzÜz¨pÁìXµ¿j¶ê—jõ=ÕÖª_úûeÿ—ùë€hmýÿ�¯ìÿÿÿç¾I*¹þÿ;Çè¸ÃÜ÷ëÿýýÿ ÿî¯ßŸ;„Ûz×Ýú‘¸ä7�Ê�„Cþm¥\Â;üÛ„’i›)ÀÈ Àåê©È/òaí endstream endobj 30 0 obj <>stream xœ33P0P0UÐ5R05R°0RH1ä*T01W [˜(˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ØÿÏY;Æ`ûÜàÏì uóÅÿÿ›~]muŒê³ƒ»nÇ]º½vË6 ÇÄfï$1‰c&.WO…@.LDL/ endstream endobj 27 0 obj <>stream xœ342U0P°PÐ5V044W042TH1ä*T04°ŠL,ô �ò@"9—ËÉ“KßÓW¡¤¨4•K?¤ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææƒ4ÙÙqyº(¨-8å̶™1E”ñ'ÛÕCüÙv¸$üQÈÉná0øËÄ»NÀq¿£Ùƒ¿,·^Ú/¹õBí¯š­ú¥¯µê—êöª_ùeoüúð××_~ý©þë/ úõÿëÿñÇÿÿêÿ“CþÿiTLÿ__¯P¥ÿ„ß¶<ûþþúÿÂï¿�äß÷×ïÏ¿ Â[o“²Ø�õ;ÓN"³šGåGâ’ßlú<žN48Ìçqª‘ðox"*’"YÒÀÁÐÀåê©È¹„€ endstream endobj 24 0 obj <>stream xœ31V0P04F :Å�«Â šè*è‰ä\.'O.}O_…’¢ÒT.ýp —¾˜t pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@Åvv\ž. jËr²/_.þ)kÚµkŒ \®ž �\[�!¼ endstream endobj 21 0 obj <>stream xœ3·T0P0UÐ5T07V07SH1ä*T0³ (˜›+˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶p–Ÿä&6á�…»ägèÉ5ñ>T/Í—Ü›\åûºÊ÷˯{“ë_×Úmÿ¤êÿ_â?õõÿÿÿÿç¶ÿmý½ýÿÿnÙoÿmï¿[¶¯»^uÛ;WÿۥúmB·½[6æÐ1Hh:,°!a“äò†.WO…@.)ŒZ' endstream endobj 18 0 obj <>stream xœ33T0P0bSssS…C®BS�˜ˆk¦g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ @ŽK´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ðœ±Ø0õ‡L¢­œˆ�BSgÉdµÅ×ù¦—ì�½þÒôw¼oUÿuùøÿ×ÿÿ�ÿ� îípxäÙ,ÿ€‰A�ËÕS!� CG½ endstream endobj 13 0 obj <>stream xœ³°T0P0b CS…C®B ñMô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨–Kߤ”Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨mÐe_ÿ”!f�Hý0ø3kéÖÿmb�ÿ4[ä_þÿwýa+ƒ#—«§B hTÕ endstream endobj 10 0 obj <>stream xœ³°T0P0QÐ5R°°P040UH1ä*T°0Šùæ &z†@Y ‘œËåäÉ¥ïé«PRTšÊ¥TÅ¥ïRÄ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�zìì¸<]Ô6j²ÝRh\íð£�OfÖò÷oŸ8p?û‡ûÛß?Ü_¿¿>ÿý¿¿ÿAàúëÿñõã×ÇsVýŠúϲcÝ®‡¥‡Þïûý”Áùï«÷÷·ýý÷÷ï¿ÿßÿ#À‰š? ÿÿûYÿ^ÿÿÚÈ;Ö캟ö=½í“CVߺ•�aÚÍÍ&ÂàÀÂåê©ÈûtŸ endstream endobj 744 0 obj <>stream xœ33S0Pas#3 …C®B3ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`ÿOVvÅ�Ò¿öï÷ÿÿkëõÿ¿þê_ÿõW Éþ|”Üþ¿¥ë¦_¿0]þ_/£¸ÿû@ë¶8 ^ÿ·ÿÚâ/ûãv]÷þúzý¥¸ýQë½_fíz¡·ÄŒ]ð+ƒ#—«§B �IO endstream endobj 741 0 obj <>stream xœ37R0P0b C3 …C®BsS ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`çéÿûvžH•¿»um1÷ßë¯Wÿ�­ÿ½nû—¯ÿ¿íÚ=¾~×뿱ÕÿQê�Ùë¿|ýþo×þ«×ÿ#>þ_ý5þ÷ë/×öÿÚ77ÑN=àôÿF.WO…@.ƒ‰bB endstream endobj 738 0 obj <>stream xœ35P0P04QÐ5R03P03SH1ä*T01S‰›Y¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-äáù`¸Bý…ÚÖ�]\Óå9^z0WWízkË–Ùq‹¶4[ìåÍT½þ2S?tÕ×Àµa<릿¾¶7ûÚþ¥¿¾®�úõoú¿é¯ÿfÿÍþmÿßÒ­ Œ\®ž �\8JH! endstream endobj 735 0 obj <>stream xœ³4W0P02PÐ5R04°P0³PH1ä*T°° (˜ƒäô �²@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº((2MH˜õ_mIï)FGçË>z+×þú·ýõ_ëׇìÿôõ¿÷õŸ­Þ—þÙ«[ÿúÒÖÿë½½¿ÿÕÕÿ¿eËÞú×Þ¥ÿ×ê{ÿ¿ô$ÿëË–ýÿ½½¯ÿK!iñÒþþhõ? ¬_õú¾ZÀÄ Àåê©Èû*j¡ endstream endobj 732 0 obj <>stream xœ35P0P04PÐ5R05V03SH1ä*T01V‰›Y¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-œ’¦¢ð¡ù��?‡Ú—ùŽqë—VÅMÿ7}ýÕëõ×¿Ž­ÿõúëÿ×_/ýÿ¿tÿë×{Ëv/æ~©wÃkÛ!îâ Óå×V]_«éÏ…i¥RQQ/C�8´¼½|šn¬mmfe`ärõTä£aN endstream endobj 664 0 obj <>stream xœ36T0P°P06U02U0³TH1ä*T04 (›(Xè)=K…ä\.'O.}O_…’¢ÒT.ýp ".} $—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[VPÐ|ùr÷þ=³Ö¾¹˜Øz|ýõ××ö/]õ2³tÃ&.WO…@.}².N endstream endobj 649 0 obj <>stream xœ-K±NÃ@ eDþ Olé5MD;TEjJE!•‰¡j€�íÒ!0ó|@¶ ªJÕýC¥*C‡[Ø2tÊE" ƧðìçgûÙm›Ø²Ñj9.žvÐÅ;žÐmóš §Ãf£¶YngÐ÷Aø—8^܃¸æCæDä¡ b0¶¡91ž7äqÔíŠ-v¼ða1{|áŸ^üž||Å–Á>stream xœ³4V0P0SÐ5´T°0S0³TH1ä*T°0PA 3=C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�Zìì¸<]Ô®É1“fY6ÿÿ«½á¿Ö‡þ⫯֯úÿˆ!‚ÿ¾t?¹ɳNqþþÿ¡¯ øoøªÿ~óéOÙ$eÑV»ZµþkÜêÿ@ ’„* þ¿•Å ÀÄåê©ÈÚó^„ endstream endobj 617 0 obj <>stream xœ32U0PÐ5"C#Cc…C®B## °�‚‰©‚®�ž%HVÏP!9—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷jçÒwÎÏ)ÍÍ+j±³ãòtQP[87óú­ãÿ?qV8¾8z!|éÿ¥ÿ»â�Ä/1Ï6¨oëä�I�Ä$¸\=¹†Ý5ù endstream endobj 603 0 obj <>stream xœ36U0P0VÐ5T06T01QH1ä*T0² (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶àùqå9Ç/MUÞK_Ö¿4}¼ô×ÿ8ïÅ@á4¹&Þ£æáÛÃ_ýrÕÿÿïí-ÿ½öÒmï\Ý-Žè,`bPàrõTä°<¬ endstream endobj 600 0 obj <>stream xœ37T0P0b3 Sc…C®B33 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶b ëÿÿÿ'š°ypæ6Ý^»e»÷–m¯su·l»~é¶w®î®k×ߺuûöß}_¾|½øåW¾ç^µ¯µÚ—@ô¯|ïKùa_f_Êg‘H÷üÿ€‰A�ËÕS!� ¹fI endstream endobj 597 0 obj <>stream xœ37U0P0b3K …C®B33 ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àJ ¯�dÂ'.žDåî-æ ÷*ÌkŠUù2ý¯þå«ëöÿÿ¶w=�¾ü P8ÐÑÿÏ×IˆÑýþ¼àÏ3Žeöÿÿ08°p¹z*rFmYï endstream endobj 581 0 obj <>stream xœ31R0P0VÐ5R0¶P05SH1ä*T06 (˜Z(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ðüàƒÆ‡ì‹WxîUû2ûåÞZµÿ×~ýïÝÿÿÿûÿ'W­ÿ~׿[·Ýľގ;ÌYpDë`ëã××ÿG=½›ù+³þeU¬ê–霺͜9N‡¹ÙDX¸\=¹˜^Iá endstream endobj 578 0 obj <>stream xœ31R0P0UÐ5R0Òæ )†\… Ʀ@A ×RÁTÏ($’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú΂Ìûüîÿ;s@"VéW©KQ±N±z[/½ŽÕ¿ô·düëøëÿ½ÿÇÿÿ[ÿÿÿÿoÛ01(p¹z*r^å9Y endstream endobj 575 0 obj <>stream xœ3P0P04QÐ52T03R07TH1ä*T0± (Xåô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-Xµåõ˺锠£¥j+X¸\=¹€ÂJ endstream endobj 572 0 obj <>stream xœ31R0P0VÐ5R0¶P05SH1ä*T06 (˜Z(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ЖðÁዜàÃö¾/ÍÌß}ÁüÝÿÿÿ¿í]/uý×¥¿z[Ä8tZÝÙ'\ü]‘ø}ûö¿ÿþþ\ß"§ÿÿÕ4ß°ñ,ÓnEóßÈÐmæLìˆHL8èÀÂàÀåê©ÈÝFé endstream endobj 568 0 obj <>stream xœ31R0P0bcSS3…C®B# ßÄ5×3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶°™Q{�8kÿÌ›¦Üÿ±�¿6Kæ7p04p¹z*rÊ’8" endstream endobj 561 0 obj <>stream xœ36U0P0RÐ5T06R03RH1ä*T06PA3c#=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔÎ9°aþ¿½õ¯¯ƒ‰§Œ¼ž+Š"ÀÄO–Þìõ×_‡¾Ú[«ûúú¥ÛÞÓŽè,`bPàrõTä–ÄB endstream endobj 558 0 obj <>stream xœ35T0P0QÐ5T05P0³TH1ä*T01 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸~BÖ埼ù÷ã_ý·J(.Þ#�ÝRq¿E¸t ��[¿4*ÞHüÕÛmúëõWë_ˇþúþÊ¥>nõßð×Þ“C㯖»Ù–MÛ½ôÚ-ßu7>stream xœ3±T0P°P05W01P03SH1ä*T06 (X*Xè*˜šéY*$çr9yré{ú*”•¦ré‡Õpé{(Xré;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.OµEsØÄ2/df˜l)⺠p4“mQs€+ŸD#ƒ—«§B ªJ#> endstream endobj 552 0 obj <>stream xœ31V0P0RÐ5T0¶T06PH1ä*T06 (*éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô–h>˜0Cág…IÎ᫇8]_~ýWLéõ¯—Ö–^ÿ·úëõ×kõ¯{ÿz½Þk×õ/[«þèû8Ýâu`apàrõTä²÷>stream xœ35T0P0UÐ5T01U03TH1ä*T01PA3#S=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô–¹Íµ­ÿõüàâÿðSù‡B�ð#ùÚÏ î³ð~˜ýòW~æ·õâÿÞÿŸùÃñ¿Ø®_Ñ+MCßê]ÏÕÝ0��3'ìšÔ�ˆÄ™Œ \®ž �\›&E endstream endobj 486 0 obj <>stream xœ35T0P0WÐ5T01S03TH1ä*T0¶ (˜)˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°aËï_·NHüÇþ|ù±þõµMY3¼›9sª£¹y[›Y¹\=¹Ñ¢? endstream endobj 483 0 obj <>stream xœ35T0P0TÐ5T0±T03TH1ä*T0± (˜)ê�ä€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶SÁ„uÙœ¨šYK®]ŽHo6ÐÿoË׃¨ÿ¹ú:ï/ÿUÿÿßß²Yžƒ„¾îÿÿõÿ_õûã£�¼—ÿí‰þU÷_w%ƒÄ¾¯]¶€‰A�ËÕS!� ÙA\Ä endstream endobj 480 0 obj <>stream xœ³°P0P0SÐ5T°0R0³TH1ä*T07 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[pŃ·�uÂi½�¬lâ¦Ùv¸$”í2e+ÛáÐ,×TËòË ­¿ü²îWü¾ýñ¿öÿÿbøÿÿÿ'FG9Wýþÿ{Bÿ¿¿ÿ¿ýÿöïïßýù·¿]Oü�½á:�DìDFÏ˶Èó(üäÙÐø‰7ЇÁ�…ËÕS!� ÁW endstream endobj 462 0 obj <>stream xœ37V0P0bsC3 …C®Bsr õ t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(hÖÿi*yAê$Ÿ„cÓ¯{bwËßGgV½½ž™·»ôõv0sÝÝÜ¥¯·Çí.Ý6}Ýݪèº[@æËœêø­ÿà‡ãéÉÿ8¸\=¹pïM endstream endobj 459 0 obj <>stream xœ35T0P0QÐ5T01S03RH1ä*T01 (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°©!ŽCN ÂñåË´/(ä·Ü›ü»þ÷ÿ­o+~}ýõ2{éÒ ynŽÇ2Kïóç+$J˜·}ûöý}ýíÕ/ý�ÍV[»>3wÝaΜ6­k×¶¶mHL8ÅXÀÈ Àåê©È’ØJD endstream endobj 456 0 obj <>stream xœ35T0P0Q0´T01S01RH1ä*Ñ@hd¬`¢g¨`h¡g©�œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔVÖÄùÝ:þÿ¿Å¾9@Ö†.WO…@.ªP$ endstream endobj 453 0 obj <>stream xœ35T0P0W°T01V05RH1ä*T06Š€DÌõ ,ô,’s¹œ<¹ô=}JŠJS¹ôÃ�j¸ô=€J¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú‚�âæÿÿÿÿ©›Ó‘¸á+*>,¹^ÅÍã¢c°áЭÃÜ<: š/âç°Qêù&v˜›OL6OLfÖÒ­}ö@}[¹\=¹Ï9ÿ endstream endobj 450 0 obj <>stream xœ35T0P0QÐ5T01W03RH1ä*T01 (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ààŒ¶sÖ‡x æ/|½¨é…ú »¦¯uó½_~ýõõWý×_×Ë÷íÿÿ‰%|ùï“«¶>áþÿÿÛîÿßßÛý÷wö¿[o×ó–IÄö×Näno›u˜Å€‘A€ËÕS!� ä�L1 endstream endobj 447 0 obj <>stream xœ35T0P°PеP06V0³TH1ä*T02 (˜›+Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[q#CàÝ“«¶{Ì·ƒÀþê·ß÷Wß‚ÿ¿×ÿ‚uûÿÇí­¯ã¶l}« :ªKECÕVh04pp¹z*rç@Ø endstream endobj 444 0 obj <>stream xœ35T0P0VÐ5T0±T03TH1ä*T01 (˜)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ a‚ªm}í'^ûÿ 0á¨�Â…?ê/ª^,ØÅ!ïhï¿ä¯Ý~ÿõ×ÿÔÖ¥¿Ÿ\õoïï¿ëgßz»îÖ —ý݇.o½Ú&aÐÆ ÀÄåê©Èc¾H· endstream endobj 441 0 obj <>stream xœ35T0P0´PÐ54Q06V04TH1ä*T04 (™åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷jçÒwÎÏ)ÍÍ+j±³ãòtQP[VðÂÖ¶úßß÷•«¿®›¶+BUÖi¥©£ ƒ—«§B SÏ'j endstream endobj 438 0 obj <>stream xœ35T0P0WÐ5T01Q01UH1ä*T06 (˜˜)˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`§‚‡B…ãË—m…X>ø/}Yå[rmÂ×__?^ÿÿ÷äªÿÕòç.Ï¿u{íÖ‡K7$–igóæè˜6³20r¹z*rx@9µ endstream endobj 435 0 obj <>stream xœ35T0CS…C®B�\=C]=K °0UHÎåròäÒ÷ôU()*MåÒ*åÒ÷ªäÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j v>XÞtj�c‹L„�ºØ¼�EY}kÚ~oùúåòÿ¯ñÿÿÿý�<ÍT8É•ùÿ¿ÚJ“+ ,\®ž �\ TM[ endstream endobj 432 0 obj <>stream xœ35T0P°b3#…C®Bc3 ßĵÐ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`gC’@ýòÿ[$&ÿÿÿ\rùÿßO ÿ£‚ŸN�åAYSX¸\=¹'â;k endstream endobj 429 0 obj <>stream xœ35T0P0bs…C®Bm1Q0Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp .}0éà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Šíì¸<]Ô\È(ZÅ"áø°ä•o¨ˆœÓ/ÖG±¦¾^�¿þõÿõÿPð”ñ赕, \®ž �\èì7^ endstream endobj 426 0 obj <>stream xœ35T0P0WÐ5T01V01UH1ä*T06 (˜˜)˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶Ð“-÷ {…ó¡×ëÕ…8þªX¾¾þ÷“«f;’7Ô\a‰Ô“;ø°½íCâñõŠl»÷¬©Øöþþýð°mBͬ]+Ÿle™µÂ €‘A€ËÕS!� >­ endstream endobj 382 0 obj <>stream xœ³0W0P0bK33 …C®BKrÍô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-عFÚú× ' ±¯«þŸÑ2˜þ²þõêÌÚں鿼×ÿÍ ÿÿË{Ýôë×_ÖÝÛõMô2�û( æ‚D±kÝSôÑ{ý×еõ붾ܛhå§àâ(R�A€‘ËÕS!� 4qj` endstream endobj 379 0 obj <>stream xœ3µP0P0VÐ5T05U01QH1ä*T05 (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶hÏÁ‡l¶3Ü9lÕ.¨ýÊQùõBûµç×Kûvýå¿¶oõÿ¾iÓv=¬_·õú ~ýuý¥¿uÜ¡ëVý7=n×õWûc«^Ç_úîí½àhâ‚C  \®ž �\CÓK endstream endobj 376 0 obj <>stream xœ³0U0P0b C3 …C®Bs ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶¢“]“ÿÿÿίœ�·{o½½vË^] yé-�\ï� #ïíX»ö×ýüºoß¾¾÷�µ«®ò}Yµýr•ÿR7H¾Œ›\woú’{k¿ü ’G^Iž¸‘ÿÿƒ—«§B ÚKWI endstream endobj 282 0 obj <>stream xœ36P0P0SÐ5´T02T04PH1ä*T04U‰Y*˜é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶¨éüåÿ·nîï_¿>êëºéQ/3�À5„Á�…ËÕS!� ’°)Å endstream endobj 279 0 obj <>stream xœ32Q0P0RÐ5T02P01UH1ä*T0´ ¹f Fz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-hÌ|ù;:âÿÿ'å-r=þ^_öí­›fµ>jÕ××qû㦯­­Í _¿toElGDƒ—«§B ë3| endstream endobj 276 0 obj <>stream xœ37S0P0U04V07P06WH1ä*T03 (™(˜ê*éY*$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµ•®'WEü‚)™âj+X¸\=¹�‰#` endstream endobj 271 0 obj <>stream xœ33T0P0bs3 …C®Bm æé*èèX�…©Br.—“'—¾§¯BIQi*—~8P —¾˜t pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@Åvv\ž. j+¦²LpÈãó ¨çØçºþ!3UúößmÿsÌÿÝwÿÛÿ÷¿ïÿÿ÷ ^ÿÿ·õßþKÿ—þZú«e¿‡Ð�õñÜö91Ö›�“ÿ»ÿöþï·ýÿ;ÿßÿÜÿ·ÿîÿ�ÿ}ÿíúoÿóÿç{ÿ÷îþß@éûßnÿ{ÿ=ÿÛíÿµ¹Ûþ?|Ê»‘Oï�oPƒ—«§B ­Àz endstream endobj 265 0 obj <>stream xœ31U0P04TÐ5T01U01QH1ä*T06Š€D õ@’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸àǃæC6‰™xª}Ù«½äË.ï¨×WKV_÷Ôç¬Pتl/s�ûùa�Òÿñ¦Í4 ÙÿV÷Ò‡i·¸ ¦ÝpÌmâNãap`árõTär:<Á endstream endobj 260 0 obj <>stream xœ3´T0P0R0V04W06WH1ä*T04Š(›(é±¥Br.—“'—¾§¯BIQi*—~8P —¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ĺàõßÒÿKÿ_Yÿu}ü¯ø¿Ù×ÿ„_ap`árõTäͶ*Y endstream endobj 257 0 obj <>stream xœ35R0P0RÐ5T01Q07SH1ä*T0 (˜›+éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ÀñÀùÿÿ¿þÿ[ÿ·ôoéuîu]�ÿù: ¶ÿ� ~Bè»zÿ¿{ïÏÕmº±Æ´mC¢ ƒ—«§B u�H endstream endobj 254 0 obj <>stream xœ33P0P0QÐ5T05¡C®BSC�°©™‚‰ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+9.ц\±\únúÎÎn@n€��¾7P7—¾s~Nin^1P‹�—§‹‚Ú‚/øçÈqÈ T¸;ô;4îQ™×›ïYõõËþ¯ÙëÃö®u_ÿãÿÿÿO®VÿýÂ$uÿÚ]÷ß–{çênÙ&�¨c�0Mb�Á†C'4”˜¸\=¹a@¹ endstream endobj 251 0 obj <>stream xœ344R0P0bC S…C®B Û(bâ›ê*èèX�…©Br.—“'—¾§¯BIQi*—~8H-—¾P)—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+é±³ãòtQP[Èy˜•qJ€Çrž§ú͇m%'»¥|á0kd{re…¶cœ,Ë õ/kµ¿lÙïy©þñ>­}«ÿ¿Úÿÿÿ¿Õÿñ�N=M&‘F6 :&.WO…@.nôZû endstream endobj 248 0 obj <>stream xœ37U0P0UÐ5T07P°0VH1ä*T0 ¹& ¦z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-ä<Rÿ)+Æþ?üäroRfè°ç°ç˜“A!ñ#‡ù¡üe¿òW¿Üÿwÿ¿ÿ¿¿ÿÿ¿¢ô�öþÿooÝnï—Þê]zòÛ{™„cÉÁ¦X6Å’C/ "šU˜¸\=¹¯ XI endstream endobj 245 0 obj <>stream xœ³4R0P0b  #…C®B rMô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(h+ÄÌd+((W[Ð ?áôúÃu÷Ûþýý»ÿßýÿÿ¿ÿ¿þÿ_ÿo¯¾÷õK_Ä[ö45ÎqzXÓÔvæ WýðO…Ãtÿ.WO…@.åÑS¢ endstream endobj 241 0 obj <>stream xœ35Q0P0bSs…C®B Ì5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Á9ÉÀ&c� ‡½ »¸ÅÿŠ›þ~õ×ÿpðÇýS–æ‡óÿq‚/—OéùìÿÇ ÀÄåê©È¼ÕSà endstream endobj 237 0 obj <>stream xœ37Q0Pa3K …C®B3S ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶#ª°~r#˃ãÿÁ@mennnrÿÜàŸcã^ûËÿoý]ÁÐÀÁåê©È^K­ endstream endobj 234 0 obj <>stream xœ37Q0P0VÐ5R07V°°PH1ä*T07PAK Œž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµ�¼Zª ·<¹j»§£HÂÿÁ?é÷÷oÿöÿûïïÿƒÀ¯¿Uÿ_VýŠÛ'ôazÓÇØÒC¯¿ßç'QÇÿöGýþz úJå/ÿÍÿÿÿïßÿk^ém¹±ã×ý앦žk—mäM8ÔÀÁÐÀåê©È”ñe‚ endstream endobj 231 0 obj <>stream xœ31Q0P0bcKCC…C®Bc� ˜oªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-<ߦȾ¼Eþå¿ùÿÿÿ»þ¶N":"1ùÿÿÿ?Y”5ÝÿÿõýþàQÛF.WO…@./àLT endstream endobj 164 0 obj <>stream xœ36P0P0bcSs…C®Bcc�(�k¤g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAm႟Žì-Í—ü9Õ=K¯/ý¿u‰Dœý0øhÚýäJð÷ÿèàB¥£ý&.WO…@.†WDc endstream endobj 161 0 obj <>stream xœ ‹»‚@D-É|ÅüܽP¬› ‰c‚•…±R;Àø çÏõ6“œ93•§£R·¬KÏ»âÅ2X騅)_Þ&´ ’Žü¾—älÈží©�î¢pWH/1ö†C]Ë�¹™ø—iþØ£i�:þÖl³b—xÂoõÅ endstream endobj 158 0 obj <>stream xœ36R0P0b#K3K…C®B#S ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶HЧþSVì<àQpÛ?&.WO…@.¡Ú= endstream endobj 155 0 obj <>stream xœ³0T0P0bs …C®Bs3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠(É&üÿÿ“+© ;˜[ĽÞ[ž·ûzÙëÿ[cßí½÷úÿ–üu¯g¯ûr·üßK«øû·^ï5�]ÿÞoú÷�¯·Ü­©ö­ÿw9þ­éÿ½õ[®û30r¹z*r–$L endstream endobj 152 0 obj <>stream xœ33R0P0bSK3K…C®BSS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶HŠmÅÿ'Wvÿ‡‚Ÿ\õ,ò-ò þ(?ùËTï¹}ׯüõÿöÿýtú¥FäÿÀÄ Àåê©ÈŸÔL• endstream endobj 149 0 obj <>stream xœ3±T0P0UÐ5R01W03WH1ä*T01 (˜Y*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQPÛØpå�¼*ãþ/û×ílÈŒÕ[Y·oú• —™NkKv]÷^[²ß;nëߪë__ý[ÿeÿÿøÿÿ¯ÿ‚o5p04p¹z*rB‡ endstream endobj 146 0 obj <>stream xœ37P0P0UÐ5R03Q07PH1ä*T0µT ›)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[8#€%…{y„ã‡Î#¼‰’Mï[×(4g{î›,«¾ä˼ɗ¾|}i‚¯ÿûÇÿØõÿÿÿ'Wí?ìß¿ÿ{ì÷õß®¿Î-ÿí�·íz®î0±á0‡ŽÁ¡ˆ”‡L‡6:‘¦Ä ÀÄåê©È‘²RI endstream endobj 143 0 obj <>stream xœ35Q0P0VÐ5T05P01QH1ä*T01 ¹¦ Æz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-¶“<ß“b7ÿSVOpùÝÿ˜àëÿÿñßÇ^lùíõÝ«„÷a›Ðîý{X¸\=¹OßCÐ endstream endobj 140 0 obj <>stream xœ340P0P0RÐ5R°4W0³PH1ä*T°4U ›eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(h1r5ÿ¯¶Ä™é‰�w¢A3÷²Ñïÿænÿÿ»lúÿÿ»²÷_ÿëÖ{ÿøÿÙu_^Öÿ¿¿mòÒÿÿgšeß.¹ÿYöï÷w²¾ëþe³÷ÚÖÿ)kÿËõÿoMÿÿö­b.WO…@.@o endstream endobj 137 0 obj <>stream xœ31Q0P0QÐ5T0¶T01SH1ä*T06 …ÍLô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[èÅÊÍÂ[ÐÞzq�_ÿ…Zõ×½ÿ«ÿýH¶jkÊê8p̉uÃ�jþ|Þ·?ä+¸F²=<<›íß½¿¯®¿p©�ÓÕ?K 1À¨àƒ—«§B ƒB=ô endstream endobj 134 0 obj <>stream xœ35Q0P0bS…C®Bs Ì5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ØNq†žAãCi…/y¾~SßM~7õoMî×ÿ×ÿÿ­ÿ�^.^9éáþL \®ž �\Ä8C endstream endobj 131 0 obj <>stream xœ31V0P0VÐ5T0¶T01UH1ä*T06 (˜˜)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ààŒ… ÷69‡Ã‡8Ì—Ü[°ËóË®_ñ¿â·®H¬øøÿÿŸYëë÷·Þ/Ý·»tÛî¥Û¦I$ê¶ D$mHXÀÄ Àåê©È¡‚;é endstream endobj 128 0 obj <>stream xœ³0R0P0bs …C®BsS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ØNàŒñ̦Ç,<¶Ò 7ñs¨âÜijŹE¸zÉK»—Qá_¯;v?ôÿ×øÿÿCÿã/—Íñ[â=QOúÿ&.WO…@.Œ„P� endstream endobj 125 0 obj <>stream xœ35Q0P0VÐ5T05P0³TH1ä*T01 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[lÇ›üÓÔî÷ø)V'`Ïqãð�Äÿ„kr¿Öš_þûÿíÿïÿ÷߇¨y}ýÿú¿ú¿½_o}ÐU²k‹¸ïÒ7&»x š^vD4³20r¹z*rC Oî endstream endobj 122 0 obj <>stream xœ33S0P0b3 ²PH1ä*T0‰�¹&z† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]”8j³³«-Ö`’“b“oûcð÷ïþýùÿ÷×ÿû_ÿ¯¿þoúõ¥/+¼qÔS,ˆ9cúü(Tf\|€…Á�ËÕS!� ó Fö endstream endobj 119 0 obj <>stream xœ36R0P0b# s…C®B#ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H†“ÃÖÖþòÿÿ·þ®]c°ñÿÿOªF«ÿÿ?)¸ÿ?*øã›¸¿�ƒ¡�ËÕS!� Å[=� endstream endobj 691 0 obj <>stream xœ34²P0P0bC#c #…C®BCCK ˆˆo¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá µ\ú@¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¤ÇÎŽËÓEA!!2ûÖ§,Î)f»]ÿ?ÏWÿÿ·KÿÿçB¨ÿ·½ÿÿݲ‰‚K‘«âÆúÿÿoýÿ»B°ð®S‘HŸp!øwüÛ&.WO…@.½÷ƒ· endstream endobj 670 0 obj <>stream xœ³0P0P0bsc3 …C®B3K�(�k¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEA1qêf†‡‡'´4ü1¸?ÿöÿÛÿÿçÿ‚¿ú è}éËÕ'ë;ôÄ̰ó`fü‘¸îþöïoÿ¿ýÿÿ>PÝ¿ý_}ý²·VŸ³BU�k¡£×&.WO…@.ãÇPG endstream endobj 667 0 obj <>stream xœ³°P0P0b c3 …C®BsK ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ä0ÿ¿ÚBŽ„kΜÿ1@ÿÿÿ®ÇÿÿÿH ‹’ãþÿ  \®ž �\E»N� endstream endobj 655 0 obj <>stream xœ36W0P04QÐ56P06Q°4PH1ä*T02PAC#�¤ž!HH&çr9yré{ú*”•¦ré‡Õqé{€”qé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.O…5Âÿq%æú, \®ž �\6š8% endstream endobj 652 0 obj <>stream xœ33S0P0UÐ5R0Ò– )†\… ¦¦@A3CS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pVR.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmá†6i ý&ö9A�*ž÷_òپ̾”¿üR~ôË_ï—ÿGO®ª-`bPàrõTäX8>stream xœ31T0PaKS…C®B ßÄ5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶þÅ�âst?¬\[¿´nTü¿i‹­ÿ[ñõ×ÿøõHĺ�Sÿ08°p¹z*rF‚;- endstream endobj 633 0 obj <>stream xœ³4P0P0UÐ5T°0Q040PH1ä*T0·T‰*˜êe�Dr.—“'—¾§¯BIQi*—~8P—¾H—¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�zìì¸<]Ô´4XÈÿW[ôýþ$ð§�ù“Èþ&ö‡@øb‚F� EâGóCù îsýÊ_ökýþ¿ûÿýÿûÿÿ0-ÿöÿÿï $¿ìÿ²{½÷þ-»½'\HÔ›í½L±DÂHãÜŒÖ ‰%‡^Hè8N8lÀàÀÂåê©Èó h endstream endobj 587 0 obj <>stream xœ36P0P0b#cc…C®BC �(�k¦g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmÑ Ù‚�ç*Måÿ#?•†{ L\®ž �\úU-8 endstream endobj 584 0 obj <>stream xœ31V0Pa 3 …C®BS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àøk…Diîø×ÿãöÅKÄ¿æ|ªÒßÀÁÐÀåê©ÈyØ=• endstream endobj 522 0 obj <>stream xœ³4P0P0b CC…C®B C�0ˆo¬g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-¸•ÅôI*ë¯r„z?GÇ—l&9…{MÜ &_ŠUù2Ýû¿÷—¯Ùëÿÿ]Ÿ}ëÛžúÿ@ð§­µPþ¿ÚÂs g~ÿO øó¨ÅÑÿÿÿ \®ž �\vƒjv endstream endobj 519 0 obj <>stream xœ344W0P0VÐ5T044V03QH1ä*² @ÐÌTÁXÏ( $’s¹œ<¹ô=}JŠJS¹ôÃAª¸ô=€Š¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o v.}çüœÒܼb�;;.O%·ÆúÿÿÿÌêÈbew8«Â_Æ£{oß¿»å¯wÇBè-×ëöÚï…Ò;ßíþ[¶m÷åëkÿ^^÷?víº/__×—¼Þ=;{¯mÕý»Vï¿ÞºõÞ?¦üËëýñr—ã¿ü¾þÛ·þòûø·¦ÿý÷Öo¹v9€‘A€ËÕS!� ®ndh endstream endobj 516 0 obj <>stream xœ342R0P0bCC3C…C®B Ç(d0Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp�b.}�Z.}§g Ï%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææƒ4ÙÙqyº(¨-ð¨áÔü7ÿßü—ÿ_B‰ó_œµÿU›¿>ìÿ˯ûöFÿ_~í××üó£__Ý�]xŸýå¿öÏǯýúê~ü¾í—_×Öýºï¿öëï×µvÛ¯/»Ç!/´ÀØ# ÿÿ.WO…@.ÈBiØ endstream endobj 416 0 obj <>stream xœ35S0P0UÐ5T05P03UH1ä*T01 ¹f ¦z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-X0Ǧ­êCó!~Ž Ú~8ÆMˆUù2=~½÷õÿžë³sþÛú_éò!v Ƕ2Òw,û½ìõí_ûÿ]ÿ¯¶úÿÿ¿ÿ½¿ÿ¿dÿíu—n¯Ý²íP´hÛ†C‡¹Ùüx8¸\=¹i/O¡ endstream endobj 228 0 obj <>stream xœ33P0P0bSSK …C®BSC�(�k¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ @ŽK´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQø3«éI‚þ¢Á#Wæú†.WO…@. —KF endstream endobj 116 0 obj <>stream xœ33R0P0QÐ5T0µP0³TH1ä*T05 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸&Ã’çÊÿÿ?y�ÌÿCÁ A…¯Ô •kd¿Ä¿ä—ÿå×/ëÿ¯¿þ§¬âäªÿÿïïÿwëÿ¶ÝënUó(-0ßpPrmGŒÁŽÄ"ž  †.WO…@.>(Pj endstream endobj 113 0 obj <>stream xœ31Q0P0RÐ5T06W03VH1ä*T06 (˜™(éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°9aÿÿ¿õÿã¯ý[z�»ÅaãµES˜þÃÁŸöý êßîµÿc·l»t㛘ÔÁVF.WO…@.I]A¼ endstream endobj 109 0 obj <>stream xœ35S0P°bs3S…C®Bc ßĵÔ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àÎ�ª‡;ôœBå?•O¨ÿ�üñj¸€…Á�ËÕS!� ‘ð> endstream endobj 106 0 obj <>stream xœ33V0P0VÐ5T05V°4TH1ä*T05PAK#c=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ônø ñÿÿ¯ÿÿ_ÿ_ÿú®Û£Ç1Íùÿä€e ÿ£�†÷!Œ_·×ÿ-_w=oÛ¥‰eÚÙ<:¦N)1(0q¹z*rÉ}Rž endstream endobj 102 0 obj <>stream xœ344W0P°TÐ5R040b…C®BK  °�o¤`©g”ɹ\Nž\úž¾ %E¥©\úá@U\ú E\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÇÎŽËÓEAmÁºl¶žæ,× W…#Ù6-m‘:ȶ¡Ëám¢(ãÓE1F·q˜mHn¨â|iËòeÞäKUþá×=__ªÁë—¯ÿiÿÿ×Ëõ¯ÿÙÿÿÿÿÉÕúßÿŸ�‹ý]ÿ¿>»êþ×Ûë¿]/ÙöïÒýÛÞ¹º[¶]O\ºMèFfb›Ð�DÖ6Õ Ó$=8Ä$Z›¹ytÚV¬sÜrÌ1nC—«§B � kÝ endstream endobj 98 0 obj <>stream xœ3²P0P0b#s3s…C®B# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶À!ÂßÿúïØÄ5õÿÿâÿ)7ÿ'¿ï¯ÿÿ¯¯ÿÿ· ‰ú[ò¨tƒ —«§B Né;$ endstream endobj 95 0 obj <>stream xœ3¶P0P0bC…C®Bc�˜ˆk¬g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmÁóÖ‰m¶�Û~qè´Ïн«úe¿oá†]²Uÿ_}ýÿÜþÿêëåN?þ \®ž �\r£8î endstream endobj 92 0 obj <>stream xœ37V0P04UÐ5R°0P0³PH1ä*T03Š(˜ƒ¤ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(h2v­Ÿ8‰ÙdÁ…Cßve¿þÿ·ô×úÿÿ¯Ç¯ú�“¹nÿßòõñëã^—~Ù«»ÿÒmïÕ]Ñ<ªÛ¢Ù8;"S8–08°p¹z*r; Pû endstream endobj 88 0 obj <>stream xœ3±T0P0aC33…C®B3 ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ 悇œ€­ŒèCé ¾/Ծ̾´Wý¿×—/ü‡_þÿÿúk›Ðã¯ë£¾.]›™™¡ ¬K—.]°eKGF­Ê–½úŽªK_êMÍÔ›Þ¢[²øƒ—«§B øE endstream endobj 84 0 obj <>stream xœ35T0P0QÐ5T01S03RH1ä*T01 (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÎ¥ƒÌ;ר_xíÒtAá˼¦Z[ý½úþñ±ññ¯_®—ïÛÿÿÿ;ßðÿ›$+wÕ߯¯½^ºý×Û¥÷7ŠÎÌ‘ðNÚ¶máÃÜl\ L\®ž �\p1A‡ endstream endobj 81 0 obj <>stream xœ35T0P°bc3C…C®BcS ßĵÐ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔvDeM»æø°¸6'fÖÒ­ Œ\®ž �\Ëù>stream xœ37P0P0b33 …C®B3�˜ˆk¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓE�õïÉN?™^|øÿëþÿÿÿŸcõÿüÿÿÿ+\ÿÿë×qöÿÿ9s~¨¯¯ÿÿ(üÿø0ø§2Cü?ƒ#—«§B 6Ki endstream endobj 413 0 obj <>stream xœ31P0P0TÐ52U06S07UH1ä*T06U‹±XH&çr9yré{ú*”•¦r釕qé{€Tqé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµ ;öïÝû}Ýÿºÿßþÿÿýýÿÿ×ÿÿÿ�_ÿÿú¯¿õëAÄZ¬ú[u}ý¥¿ú—^Ç‚°Þ–­—^{C€—bƒ —«§B øÈJ÷ endstream endobj 369 0 obj <>stream xœ35S0B#SSS#K…C®B$h¢` g¨`d¢g©�œËåäÉ¥ïé«PRTšÊ¥TÃ¥ï¡`Â¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�:ìì¸<]>02p¹z*rK¢¶ endstream endobj 366 0 obj <>stream xœ35T0P0bs3C…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôv]–™µöI�£û øw½HNðùdÚÿÿÿü0�—}ü?XœµØçt«�ƒ¡�ËÕS!� �3BÎ endstream endobj 362 0 obj <>stream xœ33R0P0UÐ5T05S07QH1ä*T05 (˜›*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-XpA6¡×ÉÂq�ú…lÎ/VVü�/Ô/_ªò÷üz©þRmé—ÿë×Í^øÿÇëÿÿÿ=¹Zÿï‰Ìòåûþ¿ëöúo×wݎݲíÒÛ2 º]·GsóèlHXÀÄ Àåê©ÈöuOb endstream endobj 359 0 obj <>stream xœ33R0P04¦F æÆ )†\… & A×Ð@ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚ÚŽ¨ÂJSïl…#ÿñ�ÏÝ/�>¹ª»‚¡�ƒËÕS!� ›·BŽ endstream endobj 356 0 obj <>stream xœ36P0PÐ5VÐ52P01V07PH1ä*T01SIXåŒô,A²z† ɹ\Nž\úž¾ %E¥©\úá@e\ú@U\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmኂ‡ì-…{Õ¾4½š7mõß°µÕqV_ÿÿ£ ‡úÿ4õý¿¾ý­‚2.ýsñ!{à¯ø«:ZK–\5Ùp4±•A€‘ËÕS!� oSé endstream endobj 353 0 obj <>stream xœ37Q0P0bsS3 …C®B3K ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§ë‡›¦æ ¿÷:×I¿Üÿwoôëoÿ¯¿úûÿúëßkë_Çǯÿú+þÿµ]`¼þkÜêÿÞñKöí-]7é믫z“¾ìÕ z©ï0½EÜQבU�‹‹‹A�‰ËÕS!� V N· endstream endobj 334 0 obj <>stream xœ37T0P0b3  c…C®B3ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶�ó`@ý§¬ûÿ0á?�<8áÈñ{õ½Å5}Ù«ÏYÅ}éËÕúþ—?웿üè÷³õË~í®µßþöïïº÷ïoûûw}ÝýýÛ_XLdä4¸ÿÿ ƒ—«§B ÅX� endstream endobj 331 0 obj <>stream xœ37U0PasC c…C®B33 ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶�ó`Dý§¬ûÿpð“Gù Èƒýöœ¿ŒÕ_ä_¡þeý¥¿êÿ~¬_ÿoÿÿÿëÿc?&=š pÿÿ.WO…@.¤]X¬ endstream endobj 328 0 obj <>stream xœ³0T0P0QÐ56P0·P03SH1ä*T07Š(Xš)˜è‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[°%­ˆÍ„EÎÙ©ÁŸ…×FáÐËE-¥Z…Ÿ/p8ôÒ`Úä|Ï}“KGÝÈþx)ÿÿ×ýÿAàïëÿß.ý¯úŸ«»eÛ¥ÛÞÍ,[KOˆjf}¢7Ïêÿÿúû5òª ÉŠ‰ó~ø&ÏŸ,vø»;œy!Èë8Ëá—ã—Ùßû××ÿÿiõ¶|Ýõ\Ý6¡ÛÞ‰-6q§8XØpè`Ó‰ é©  \®ž �\Â*p} endstream endobj 218 0 obj <>stream xœ3±T0P0UÐ52U01V07UH1ä*T0¶Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-\¶åõ×õ0ø²>ê?þ›ŽEY!øUm¥ ƒ—«§B CNU endstream endobj 214 0 obj <>stream xœ35P0P0BJ1ä*T0¶T‰)S=C=K…ä\.'O.}O_…’¢ÒT.ýp $—¾˜t pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@Åvv\ž. j ›ŽØ(|ùÐ|þÚ_þßý_meýÛºëosss[·¶‰ñˆ08°p¹z*rDE/* endstream endobj 211 0 obj <>stream xœ3±T0P0QÐ5R01Q03SH1ä*T01PA3 =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j vÎÐgáç°Q~Ô¾ ¹Šs¯Ú¯ü°/óÿ­ÿÿÿ÷ÿ·u»¿]zø;³àÒmïÄ¥·¸yL¶)æ·}“›'¸ÇFEúR¾#Û—ÙWÌ—Ü›P«öÇnòßï"ÿþÿ{åZÿn{ì–ÝÞ¹º[¶IxóH¨¶)&¶6³20r¹z*rÍÐQÙ endstream endobj 208 0 obj <>stream xœ3·P0P0QÐ5T07W03SH1ä*T07 (˜™+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶àÎ5© •ƒÌ‡ø_´É¾˜ÃQÅc¾ìþöe÷ïoÿ¿ýÿoßÿ[ßV$Vüÿÿÿ'Û›ÆÆ˜¶CsšYw¸F~p‘ˆÐwØ£°—õe÷õ×—¾þúßõÿüµŸ¦¡ïïÊøo˜¾mŠÜaN¯­ ÕvUd>l‘ãQÈVœcØÀÁÐÀåê©È:ßXV endstream endobj 205 0 obj <>stream xœ344P0P0bCK …C®BK�0�k¦g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEÁZÆØï÷Ü9&Ìí|¾Î¬©ö â×Iû»?ÿöÿÛÿßÿÏÿÿÿ÷øúÿÿ¯ø¿õ/k«~ÅM_úPŸC_qŠpGŒž8ëI…Ô”±úÿèàÇDƒÐÿX¸\=¹uYâ endstream endobj 509 0 obj <>stream xœ35T0P0QÐ5T01S03RH1ä*T01 (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`§…> ?‡�—/_´/8îe‘~ùeö˯ûæÿÿÿÿï–ý·½·ÞöNlÙ&á�´áÐaî͇ø]íQp8|)ß‘íW­Pá�eÿÿ[r5{ë½Ý±[v$–]ºaà�´má[›65p04p¹z*rYÔS— endstream endobj 506 0 obj <>stream xœ35T0P0bs3C…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô>stream xœ35T0P0UеT0’F )†\… & h®`ªg”ɹ\Nž\úž¾ %E¥©\úá@5\ú æ\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÃÎŽËÓEAmeMœoІ.WO…@.ø` endstream endobj 500 0 obj <>stream xœ35T0P0b c…C®B3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶s…BTæÑå'WùæšNüÈ+{ë}ü·Ý×ÿ®ûú?{o=�óÛôÿ�ã[ÿoýÀÈ Àåê©È-/?" endstream endobj 497 0 obj <>stream xœ35T0P0bs3C…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔVt°2½_iê­ü Pˆ·µÑ?]›Ÿ\Õ`hààrõTä)D;À endstream endobj 473 0 obj <>stream xœ35W0P0b3#s…C®B3r�ô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-ˆ™#ðÓ#c�@…ûå#r ¹*&‰ÌU˜tÉ{é—ÕKÿg‡5s/—ÿ³Ž~ÊÒüp¡†ã?NðrÁ§îIœÿ?02p¹z*rÉÝ[Ê endstream endobj 394 0 obj <>stream xœ31W0P0RÐ52P01S01QH1ä*Ñ@hf¢`¤g’’ɹ\Nž\úž¾ %E¥©\úá@U\ú@E\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmAÂ� ÷£Â͉ž¿/U]›ü²þeØ~ïõW³½þÆÿ¯Ö¿þýß¾Ý××½¾õ®Gu›Ð·CœGôy´Ž_ÿõ·~ýYÎD¶�צm™ÖÔ2eÖ2Cn6.&.WO…@.V¾O' endstream endobj 390 0 obj <>stream xœ36U0P0VÐ5T06T01QH1ä*T0² (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶�ç�?ÇCö%÷&×ÚM®]ÿÒüÿÿÿ²ÿAàϬµõÿ³÷Öÿ»}={۴܉‰, \®ž �\Ml8r endstream endobj 346 0 obj <>stream xœ3µT0P0RÐ52P05S01QH1ä*T05Š(˜™(é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQÐbüÿÏ×̓•�½êý]½ÿ±¯·ÞÛ %ö_ÏÛ[¾îzÕ[ñøÖÿ[׃QÕõ57v•.ÛXº>êePPÖB=ï¤mæbP`ârõTäš)I endstream endobj 343 0 obj <>stream xœ3µT0P0bS3…C®BS ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ÈÔúÿ¿Ú¢&·Ü¥»¢3Ëvgæ^»½ôVtfNØïØÜ·oÿÍ›_e¹WýÒ^µ/³¯îUõeö¥|Ͻq*Z$òÿ?`bPàrõTäÄm>À endstream endobj 340 0 obj <>stream xœ36T0P°b#cCS…C®Bm„@ÊBÏPA×H$çr9yré{ú*”•¦ré‡e¹ô=À¤S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+*¶³ãòtQP[Vð�}ùrñŸ¦ÞÙÙ< \®ž �\n X endstream endobj 337 0 obj <>stream xœ³0Q0P0VÐ5T°0V0³PH1ä*T°0PA3Kc=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]—…\ cQ”%ÒÆÂþDúåÃýù·¿ýÿýýÿûÿ@ðoÿ—ý_öí­QØ£ú éÑ=qþ ˶ƒýAØ"¾¿ÿÿÛÞWªz×[¶ió&®4e]°€‰A�ËÕS!� GX endstream endobj 221 0 obj <>stream xœ37V0Pa3KsC…C®B33 ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô\‰‘Zùÿ%¾Ø÷ÿ¿çþ¯ûæÿÍ_þ?úåÿKû뿬¿ÿW $úÿR>Xôñ_»£ý/ã÷ÿ ÿorýÿ%÷ÿ¿4ÿ7÷õË{s'ä­ÿÀÈ Àåê©ÈL7UÐ endstream endobj 74 0 obj <>stream xœ3µT0P04¦ æ– )†\… Æ A0×ÐPÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú ’v=,=X³QðD÷lîÉÇÿãþS÷30r¹z*rF‘ endstream endobj 71 0 obj <>stream xœ3µT0P0UÐ5R05V0·TH1ä*T0± (X*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j çÌ1>È|ˆŸãLø‚f~Nó³¯îUûõ5ßëkÝúøûѯÿ¿³ÿþþÿÿßÿ–\­ÿ_{ýû·íÓ£×ïz»¾dwömï ‡BÛ+²s¿¾þßþ¸ý1S¯ ÔÍŠ�Û7}½gŽÊÏÜ¥‡½²nŒHLlmfe`ärõTä̸WÐ endstream endobj 68 0 obj <>stream xœ36V0P04PÐ52V"C#…C®BC�°�‚±)PNÏ$ $“s¹œ<¹ô=}JŠJS¹ôÃ�ʸô=€ª¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Úš›‡øý¬ß«­®HûSÿÝþ¯¯¿¾ŽÛzéÒ_]Ý \®ž �\3 -2 endstream endobj 716 0 obj <>stream xœ36Q0P0RÐ5T0²T02RH1ä*T02 …�Œô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[èÇÚ”V+m6¯)ùÒÚxïë/uëÿwyÿQýî©iÿõ{ȶC†[¶iö',`bPàrõTäòü/- endstream endobj 713 0 obj <>stream xœ32P0P0VÐ5T04U06UH1ä*T04R ›)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ø¬ý‰÷_öÿ÷þ'þÄzÖ¿ô\õ[t+ƒ#—«§B „î.¾ endstream endobj 710 0 obj <>stream xœ32R0P0VÐ5T0´P06QH1ä*T04 …MŒõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[Ètùß®ãÿ?•·|Iª­ ™þGeÿ—ýÞ‡âK&ý¿ôú�êÆh.&.WO…@.Å/Q endstream endobj 707 0 obj <>stream xœ³0P0P04QÐ5²4Q03U0QH1ä*T05TIYZ%õ ÁÒ@*9—ËÉ“KßÓW¡¤¨4•K?¨�KߤŽKß)ÀYÈs‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@=vv\ž. j Ö¶¶®Ñe]Ú"6 ¦GE½,]ú+~鯯¿¾þ_ÿŸXð+ˆ@ú€(*6{),Ø0­©«õðä�orÒ7ª¡àûöí¿ëAèÿöÿ D,¸÷ÿïû¿ïAZkß¾ß~ $ª«ùä>|xÀÄ Àåê©Èº endstream endobj 704 0 obj <>stream xœ36Q0P0RÐ54Q06R06PH1ä*Ñ hb¢`¤g’’ɹ\Nž\úž¾ %E¥©\úá@U\ú@E\úNÎ †\ú.ц\±\únúÎÎn@n€��¾7P;—¾s~Nin^1P‹�—§‹‚Ú‚�Ù[ nèªG^ªŠ­Š_«=~Õ0þ¿þ{|쥷e‡vÖ·‰&¿þ[·óÑ¢ëkµ8ƒ¸|ZÛDX¸\=¹¸];Å endstream endobj 535 0 obj <>stream xœ32P0P0SÐ54V04U°PH1ä*T°T‰*˜é‚¤€dr.—“'—¾§¯BIQi*—~¸‚%—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ,íì¸<]ÔvèZì{r5G âÿõøõQ/33K¹\=¹§r#¦ endstream endobj 530 0 obj <>stream xœ3·P0P0b S3 …C®B C ßÄ5Ñ3TÐ5Ð3° ‚ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g Ç%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-Øé'û‚A/ûƒ½k%üvý¯ú[¿ìõÿÛ±õË×ïÿzuÿº½ÿ·^ÿ•·ÿ/�¬úý?6ú×ëûx•ü³�_õýü²­¿~¹uˆ¿óŠTõWF.WO…@. Åb� endstream endobj 406 0 obj <>stream xœ3¶T0P0bc3c…C®Bc ßÄ5Ò3TÐ5ɹ\Nž\úž¾ %E¥©\úá@E\ú@5\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmYA«„㋃ìjë„ò“Ä/×ýý?ø7«P#=à~C—«§B  ë4Å endstream endobj 403 0 obj <>stream xœ31R0P0QÐ5T0"…C®Bcs  PØTÁDÏ($’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o n.}çüœÒܼb ;;.Oµ…ÎD(T¸·É 8Ü›\áh7é%SiT¬ÊÖ__3ù_Öí­?ýŸØ–%Wƒ¾l»ôeÛ¡èÛê¶qè²6³20r¹z*rì„8d endstream endobj 400 0 obj <>stream xœ31U0P0QÐ5T0"…C®Bcs  PØTÁDÏ($’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o n.}çüœÒܼb ;;.Oµ…ÎD(|p?&הϡöe>g•ïË*ïµ¥¯v…¾^2½e�@ÔDÍ#âÊŒ=gŒÙã¿þ™µêËnï’½º—ns–5ÝfÙpCaÃ1 †.WO…@.Mw<É endstream endobj 397 0 obj <>stream xœ3²P0P04RÐ52U04S07UH1ä*T0ŠÅ @rz† Y ™œËåäÉ¥ïé«PRTšÊ¥®`Â¥ïRÅ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠLìì¸<]ÔVºþG'W02p¹z*rj½)_ endstream endobj 316 0 obj <>stream xœ31P0P0RÐ5T06S06PH1ä*T06Q *éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔòsâQø’pË ßs˺鎙î—ÖÇǶ^åÿ«gú}ü¯&îëëm²—m•Ûu]o5g®¦iÈÕ�>N‡9 01(p¹z*r‹ý5³ endstream endobj 313 0 obj <>stream xœ37Q0Pasc3 …C®B3K ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§óÃ'ÜsÚšß²}åýûåßý_÷æÿ_¿~ýëXýëë¶^Š›¾tU¬êC}Ç,½ƒ>Å‚*VÆ/Òßä·¯®­»ÿë~üÿ×_ÿÿÛzéÿËì/Ó—þ[Y2½e«c…÷‚i"� –¬1:ÀÂàÀåê©Èn TT endstream endobj 310 0 obj <>stream xœ³0P0P°PÐ5T°0T01QH1ä*T07V ›˜*Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶Ø‚{>S@B3‹\��r‹„;‡­¶£YS~Ø…°¦}[æª_÷ö~íuiŸ}ÈêW«ÿÿ[Ý7)*n×:îÿ¡××­þÿ5¶êÕþë×¶þ[Y¿>¦ïõÚÒÐÿÿVíúþýÚ°}{Ãã_Víz}+6X`Ã… ƒL \®ž �\86Tö endstream endobj 307 0 obj <>stream xœ31T0P°PÐ5T01S01QH1ä*T0¶ (˜˜*Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶Ø‚¯æ…�פŒ›¶j‡8wÝr,½þeÚ”ðÿK£¶^åÿxU? þõõ{둈kR  \®ž �\YÚ< endstream endobj 304 0 obj <>stream xœ36U0P0Q0R06P06TH1ä*T02Š(Y*˜è*êY*$çr9yré{ú*”•¦ré‡Õpé{•pé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµ…§Û—ÿÿ?å‡êáCG·Ì4u|¨»WGú‚Ž¡À†C‡¹9l>ô¥~øà�ðeÛ#1iµ•j×¹ùûìÿÿ`dàrõTäâ@6R endstream endobj 301 0 obj <>stream xœ36Q0P0VÐ5T06R06PH1ä*T0² …�‚z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïତ\¢ ¹ b¹ôÝô��Ý€Ü}o n.}çüœÒܼb ;;.Oµ…͇2²Éw4oYï¹WßëË×—µÙ¯ÿ^­_ú+^mÕôëK·M»á�ËÚ¦˜ØÔÀÁÐÀåê©Èác2ø endstream endobj 198 0 obj <>stream xœ33Q0PaSK3 …C®BSS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇåé¢Àú)˨!ð°Ãýöï@ðÿöÿÿõÿÿ¿ß¯8÷ÿþÿÿÿ¯ÿ·oŸxÿÿ™Íì÷ïÿ÷ÿ‡€¿-&$N}ÀÄ Àåê©ÈZ LÉ endstream endobj 195 0 obj <>stream xœ36V0P0T0´P02W02QH1ä*T02 (˜)ê¥Ìõ,’s¹œ<¹ô=}JŠJS¹ôÃ�j¸ô=€„S€³‚!—¾K´!—A,—§‹Âÿÿÿ`Ã\®ž �\Jw(G endstream endobj 192 0 obj <>stream xœ37V0P0b3 J1ä*T0ñÁ"&z† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]TÿW[¬Â¨PpˆGÿ?&xüÿYÂE,â@ÀaÐÜ)!3™÷?ƒ#—«§B ˜yOî endstream endobj 189 0 obj <>stream xœ3¶P0P04PÐ52U06R07UH1ä*T02 ƒ$@XÏ$ $“s¹œ<¹ô=}JŠJS¹ôÃ�ê¸ô=@ʸô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P��—§‹‚ÚÂÅQ ð2³nÚô—Ù×öfÿŠÃÿñëÿý/ÿ>eíÿûÿßÿûïÿoÁßß÷W¿ýwïþÛ·ï·A#ƒ—«§B l¡L§ endstream endobj 186 0 obj <>stream xœ32W0P0RÐ52U04S07UH1ä*T04Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(|ÊþOÈ30r¹z*ren>0 endstream endobj 183 0 obj <>stream xœ31V0Pc c…C®BcS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ÿYÂ~®ž%Óÿª®Šÿ«úéËú®¨¨¯K×GE}›îýWeËþ/{õ¯{_Šÿ2é·„N ƒ —«§B ßß7$ endstream endobj 65 0 obj <>stream xœ3µT0P0UÐ5R05V0·TH1ä*T0± (X*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j çÌ1>È|ˆŸãBó…|Ͻ,Ò—ò£_~™}íWmþÿ/³ÿGÿ‘@ðãý(P[ÿÿÿßõ¿¯ÿÿ¿·þÖûø·KÿÝۦ݊ÎÌ]º!ašDk›�ƒ —«§B  {VŒ endstream endobj 62 0 obj <>stream xœ33R0P0b3SC…C®BSK Ì5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔV¬àÿÿb Ï ‹Ì¦{b¶¯ÝõVw×ݲKou·l_»Lö¯ý~û½\rÕ½ÉUþK’÷¦þ‘ÛWWDºÇÙ"ã̱‚÷ÿ&.WO…@.«ÐHÓ endstream endobj 59 0 obj <>stream xœ33U0P0b3C …C®BSK ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶à‚Ÿä£ÕÙ[ü´óØ*Üð}ÉôR}É®¿Uñÿ®MŽ“ˆ³ÿÿö<²rEqFÎ�úúÿø‡Aó)5�ùÿ?02p¹z*r d[] endstream endobj 56 0 obj <>stream xœ36S0P0b# …C®BcK ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ áǃƇ6ÊFUœ6*sU¯ÇMÿå[gÿ >ªý3«Å˜wþLðûP¥›ý?&.WO…@.ƘIã endstream endobj 53 0 obj <>stream xœ³°T0P0b #J1ä*T07òÁ"¦z† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<].„2kÈXš ´ñ¾Åö�M¾íï~Þßu÷·¿ýý÷w=�ñ¿îÿßßÿÿÿwÿÿÿÿ ×ÿÿYÿÿÜþø_7}éË* ñPŸ3K *Eú¥ —ˆH+³C—«§B Å XQ endstream endobj 50 0 obj <>stream xœ35R0P0VÐ5T0±P05VH1ä*T01 (˜š(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÁñ qk>ô²É5²É å{îUû2Ù—½Ñ¯¯ýý²ÿëþ×ïl*dÕÿó ßÿ7ëþkwóö^»õvéöèIJK‡yY7$L“hmsNU`bPàrõTä!yBø endstream endobj 47 0 obj <>stream xœ³0U0P0SÐ5R0·P°0QH1ä*T07 (X˜)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[¸,€õ¯²‡iK —Ô!FÆ/¹‰,ÒQœû·.¹ïÙ7ùÒK[õëáK~½ú²ÿRýõËÿöùúÿàÿÿÿ?eíýÿC÷ïÿý×¾þ»ÿzÞö¸¿[¶ÿöÎÕÝŸ«»eÛ¥ÛÞ<Óƒ ÎĹL­mŠ ‡¶N¸¬Ä ÀÄåê©È±èZÖ endstream endobj 44 0 obj <>stream xœ31S0P0b#S#…C®BcK ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶hf«�3‡œðÅc_„R®¬Ô±Š}ý²nßÚZ6ñÇǯÿÿúü}h1éa=ƒ#—«§B $<Ý endstream endobj 41 0 obj <>stream xœ33R0P0bSK c…C®BS3 ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶hÛŽÿ“ƒ~ÿ�>Ièÿÿÿ#=ð÷ÃýÖ—UqÓ—¾¬â¾ôe¯>÷ë—¿êöõ.i~Ô>ür-×Ýÿwûûïoÿý]÷¿îþý{S $îÿÃàÀÂåê©È÷ Y| endstream endobj 38 0 obj <>stream xœ3µT0P0QÐ5T05Q05VH1ä*T05PA ˆ‰ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ@Ý\úÎù9¥¹yÅ@-vv\ž. j Ì1qd>ÄÏq&àC�-‹ôǽj_f_û2û¿ç~  ¤þÿ³þÿÿÿŸYkëoýß[¿·l÷õì½¹K·Mÿ‘Ø"v+šGµMÂ1'ŒGŒG„Á�…ËÕS!� øïCÿ endstream endobj 35 0 obj <>stream xœ3µT0P0UÐ5T05W05VH1ä*T05 …MLõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[°Ó"Õ£êCó!c[v~G¶/·n_ûíßýÿ¿«ã$âìÿÿb´õD†þ„xg–uŽ Â-â-â öê{_úúëËþƒî¯ÿÇÿ_÷ôºÚªý[öÝÚ6íVü¶É™9Žîmšk fD²,Ht`apàrõTäN endstream endobj 31 0 obj <>stream xœ36V0P04FF †F )†\… $¤ ô tADr.—“'—¾§¯BIQi*—~8PšKßL:8+ré»DrÄryº(ð3بðÿÖ?°?ÀÏÀåê©È "© endstream endobj 28 0 obj <>stream xœ³°P0P0SÐ5T°0V07UH1ä*T07 (˜›)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`ç�ërÞA’»Ž9:Öÿÿi*æ¸ÄÆ¢öþßûÿñƒøÿÿ¯ÿÿ[þ·zFìõ/û.í}};ú�*®¦žôáDÖ›ÝmЉE’+&·20r¹z*rø¨]r endstream endobj 25 0 obj <>stream xœ3·T0P0SÐ5V07R044QH1ä*T03Šùæ fz†@Y ‘œËåäÉ¥ïé«PRTšÊ¥TÅ¥ïRÄ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�zìì¸<]ÔÎð“œÄzù!{K†F…Ccû‚æ O QåûÒ|ɽí—_šÿ›\uÿ—ïÿ“ë_×ÿ_rÿÿÿµÿÿÿiþ dÿ#€Úêøÿÿÿ®ÿÿHý¾þwýïëÿß.²²÷Öo›þ;3?vÝ­èÌÜ¥Û¦©Ä6�ˆ„ƒ¬mЉ­ÎØ08°p¹z*rëÊsY endstream endobj 22 0 obj <>stream xœ³°P0P0b csS…C®Bss ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶°¹ÁÑ!ÍóÇr¦Ç6Ê�Ú8>Äa¾`öäÀÌŠ’ÙwÕþí½þeö¯¿õËïÛÿÿõÿÿ¿þM>4sXLeô˜�ÿÿƒ—«§B ¥V_l endstream endobj 19 0 obj <>stream xœ33R0P0QÐ5T05W07SH1ä*T05 (˜›+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pN_â‰÷&Þ‚^æ¶î‡²4× øTù_~i·þòëß_�¿ÿÿíí§¬ù÷o¼±“;ø¦ƒç¶"ÃÑ)�‹NHè'>lo““>\ÉËiÄÆ”"%üÄdëÁ=æl¿ßÞ~¿ýÝïïÿþƯ½~ëVxð«Ý¼Z¹ºš–Ix5³9_æqZpèà$f†.WO…@.ZÎ\0 endstream endobj 745 0 obj <>stream xœ35P0P04TÐ5R05V03SH1ä*T01R‰›Y¥ô@’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-œRã¡ð¡O ÂÑ|ÁìKµÚ—jó½__¿´ÿúÒûömýõÿË®ÿ3õÿÿ_2ŽÿV}ýë¶·V?~éµMY[_}™7½ôen˶K·9t ¹yDX¸\=¹¢©O- endstream endobj 665 0 obj <>stream xœ36T0P°PÐ5´T02Q04UH1ä*T04Š(›(Xè‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶¬`!ûòå²ßO®º÷á\Å¿]ë×–ì÷ŽÛ²azl® ƒ—«§B .˜,> endstream endobj 650 0 obj <>stream xœ36U0P0bc#S…C®Bcr�ô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\pàß. ì^·?núúëK_}Yõ·*Î)ü¨Âö)‹EFþÿÿÿmZ%°08p¹z*rg#;x endstream endobj 647 0 obj <>stream xœ36T0P04TÐ52U0²P07UH1ä*T04 % @’z`i ™œËåäÉ¥ïé«PRTšÊ¥TÇ¥ïRÆ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�zìì¸<]þ|ˆÿ� œMÜ€…Á�ËÕS!� $I5A endstream endobj 601 0 obj <>stream xœ32T0P0VÐ5T04W01SH1ä*T04 (˜˜+ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶(uþ‰½_ý�_�JHxGý�[}í•oh™6�C—«§B z3 endstream endobj 598 0 obj <>stream xœ33W0P0WÐ5T0µT0·PH1ä*T05 …�"z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-I09#ËÆ}ò û\G›ðØÒë@ÄÝzèÁÎg’sêÿÁŸ÷&eÆ:ù?fvýP¸Ïrøå¾ù«_î]}ü}ÝÿÿûŸþ÷_~ùèÿ¿õ×ÕVª^¿šó õ÷Ú-»×nÙ&Í£º!aÚÑÄÖ 6¤40(0q¹z*rÍGX: endstream endobj 595 0 obj <>stream xœ33W0P0b3#sK…C®BS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àV�­ýõØÒ¿¥×¿^�¿+«¿Þûú¥__öÖ"Þ¯/}ý²o¯~<˜±$Ñõ(„ퟯãšâÿÁàŸ³Ãþÿ  \®ž �\8-M¬ endstream endobj 582 0 obj <>stream xœ35P0P0UÐ52U01Q07UH1ä*T0¶T‰åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨­Ø‘ŽÏ7|ÿ} ¼ý÷7‚9h\|r÷÷W02p¹z*r}æVÅ endstream endobj 579 0 obj <>stream xœ31R0P0VÐ5R0¶P05SH1ä*T06 (˜Z(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ðüàƒÆ‡ì‹ó;4Wù¾´÷}õ7nýÿ¿ÿ¿ÿúð:·¢ôV4¯Þ¥™9N·WóïQø’»Gå^ïKóµj¿øW‘–^÷ïÿ®É¡«×nÙv=W·MèFBÓaÑ61.WO…@.(-Kî endstream endobj 576 0 obj <>stream xœ35P0P0QеP01U07WH1ä*T01T [˜*˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô\Љª_ÿuB\w‹|KAÒ†&þ%¿Â—Vy~}m6?úÕöÿK}ýúþõ?�¸j¿þÿ×ÿǶÿ-ý¿þëÿuû¿þ£ë?M£Öÿ�ÿ¿+>¾nßþÿñu»—ÞÍþ¿+ö×�Kÿ3u/ÝÕ»ô°E¬O‘û0÷Âë¿þ®`hààrõTäœàf endstream endobj 573 0 obj <>stream xœ31R0PacKSs…C®Bcs ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶pJBüºýëvýÛõéõÒ×__Vý­ŠÛ7}ýu0çW|ܾé`fáG«¶Ÿ¦lÏ�þ�å æ7p04p¹z*rTFE. endstream endobj 569 0 obj <>stream xœ32V0P0bC3c3…C®BK ×Ä3×3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýpK.} B.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W¬`igÇå颠¶AGáÑŸYKÛÄìÿÿÿÿ/ãŸþÉU‰, \®ž �\ w'à endstream endobj 463 0 obj <>stream xœ33W0P0SÐ5T03T0·PH1ä*T05 (˜[*˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÁ iqö&ö¹.Ö ·†‡/î5対�¿àý~¿ÿÿÿýÛÿÿÞ¶½Ko„ö/½þ233CW§±¶ˆ{úÂ9gsƒ‡oß¾ý>ÿ÷ßýïO¦sØÍ÷_Þýÿúë«EY[/½ çÔ]²M*šmÚ¹&Cîl �¶Z&.WO…@.zÝUú endstream endobj 460 0 obj <>stream xœ35W0PÐ5VÐ52P03T07PH1ä*T03 (XåŒô,A²z† ɹ\Nž\úž¾ %E¥©\úá@e\ú@U\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmÁ ?~žùN65 �[LÛ2ák¬ê¯KçÅg–´íÿ=ê5ÿ_ýõßš¦§µuûnÞZúÿß®ëñÿöGý­ÛÿúËþøÿ«¾Æÿå.uéëõÿÿW½½þoÿõýë¦ûí/}ØõáÐ%ùÿ—þŸm‘:mkÀ¤u¾ÁÞ>stream xœ35T0P04&Æ fF )†\… ÆÆ  ×Ð@ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚ÚÂæ„/ÿ㯽[°óòk¡Öuâj+ôåÿc€Ï�™ß¿ne`ärõTä†>H endstream endobj 454 0 obj <>stream xœ35T0P0bs3#…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ 挭méßÒç×½ÿ{_ú„_öÙ«ÿ�×_CöÙ±NmÉOSoÅé÷ÿƒÀ„süþþß¶-`bPàrõTä8™F' endstream endobj 451 0 obj <>stream xœ35T0P0b33C…C®B ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôvð;<’±4õÏWþÄçÞöÇ~ûû·¿ÿ¿ÿÿÿÿë×ÿ훾~éÃÕ£¥×¹[?¸øl« kf-ÝÊ ÀÈåê©ÈQ,D( endstream endobj 448 0 obj <>stream xœ35T0P0TÐ52R01W01QH1ä*T01Š(˜™)ê�%�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[°àŒ¡%CãË�9_Xš:}óž®ÔÆûaöË}óo¿þþêïÿßïÿƒÀõë×_ÏþzëWìzÕÜ…1¿â®oØc„õ`ùÿŸ{.w?¹ª»‚¡�ƒËÕS!� Œ·P— endstream endobj 445 0 obj <>stream xœ35T0P0bSc…C®B# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶6óúßâ «â¦/}™«Ú…\LÒ&•ìŠÕ›î½°rÈ&.WO…@.á�1h endstream endobj 442 0 obj <>stream xœ35T0P0UÐ5T05P01UH1ä*Ñ@hb¦`ªg”ɹ\Nž\úž¾ %E¥©\úá@E\ú@5\úNÎ †\ú.ц\±\únúÎÎn@n€��¾7P7—¾s~Nin^1P‹�—§‹‚ÚB/F…/_äæ›~‘¿ýáwø–÷þÿÿÉ+õÄ@Y1$±`‡Kò‹‹êš¾ˆ_½þÿ¶Úêoâ‰Ë³8i‹W+Ú¶|8Ķ!­!�Á�…ËÕS!� hö? endstream endobj 439 0 obj <>stream xœ35T0P04WеP01R0³TH1ä*T02Š(˜›¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\˜humÚ´¦K ð:nËÖ×q[_Âÿ�×ÿÿÿ{rèÿßAð}Ý÷Ûïë¾��ܽ»ïyX¸\=¹ ìG• endstream endobj 436 0 obj <>stream xœ35T0P0VÐ52V0±P01VH1ä*T01Š(˜™)ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[qE@cË[»Y“Cf�¬äù»ëoù»½×þÿ]ºÿfþÿmÓÿþ^ú¿îÿÒíÿ¿îúþ7ÿ×›ð×ÿ] „ÿ¦¿ž¿úºßÞZ}¥[7l8ÔÀÁÐÀåê©È¬O› endstream endobj 433 0 obj <>stream xœ35T0PaK…C®B ßÄ5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Áñ9 Í—9,U�\%¾‰çž+�½ÿÕ/ë¿þÿÿü<&¸ü²Ÿ®�oPvæ †.WO…@.m!A– endstream endobj 380 0 obj <>stream xœ31U0P0QÐ5T0±T01QH1ä*T0 €(=C �HÎåròäÒ÷ôU()*MåÒÊré{€I§gC.}—hC.ƒX.}7}gg7 7ÀÆFߨ›Kß9?§47¯¨ØÎŽËÓEAmÁÎÎÇY$¾ä¶ nªâܲnò±©×½4³­Û[Ú&¶Å¶n×õ8»½õ¯¯ÿÛ[ÿÊñýëõƒÎÖ/_7+ôÛ”¬­+ƒveM ›öÒlÚ…#:Í\ L\®ž �\â/Eá endstream endobj 377 0 obj <>stream xœ³°P0P0b c3 …C®BsK ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠Ÿìû÷É=mk¿Îü_¿ÿí¿û g}ÿ @°°+:þþï�ÿ>Z±m¯ýþƒ¡�ƒËÕS!� ˜¯h endstream endobj 298 0 obj <>stream xœ35T0P0RÐ52T05V01QH1ä*T0‰(˜™*é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³�ãmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô6?œÍaáøaVTé²]&ºf{ÔײÜzi[rõúØL«¿×ýö_©:›ÿëoÕßò_ïãöÇüúÿÚÞú¯ÿ×]ÿÿeýëë@âßô? ,\®ž �\—@I¥ endstream endobj 295 0 obj <>stream xœ35P0P04TÐ5T0±P01QH1ä*T06W‰›˜¥ô@’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸à‡‡B…{ïC‰*νúœæKë_ÚM½¾ôßô_ñQ¿þ_)�}µ*þÚÞìkSf­Š]º·*:Qw‹Ø o§ƒM  \®ž �\°k;T endstream endobj 292 0 obj <>stream xœ31U0P04TÐ5T01U01QH1ä*T06Š€D õ@’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[¸àǃæC6ŽYî5å{~˜z‰uÕë%ÓöM£«øWÿúú¯ý?¨k¯¶jzfžÐ±Þ9 Û²¶)&65p04p¹z*r§S;? endstream endobj 289 0 obj <>stream xœ36P0P°PÐ5T06T03SH1ä*T02V ›™+Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ÀéòÚú­6þÿÿÿ“Z"ûââ ¾¯k«â×Mÿ·ßûëkÙp–½u@˜}ýõõ‰w³×ÿ _õÿúª¯¿¾l�»t£µM„Á�…ËÕS!� ¬±A÷ endstream endobj 286 0 obj <>stream xœ3±P0P0UÐ5’Æ æ )†\… & QK  ž!HH&çr9yré{ú*”•¦ré‡Uqé{qé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµ…«*²·Ü›\åX2ùuèõ×a{×Ëêÿ¿¾„Nè­ÿ¯¿ÿëëÿpô?n?yÿÿuýן ;¯ÔG}õtzr•e:¯Ž!7�C—«§B åPÁ endstream endobj 283 0 obj <>stream xœ35P0P04PÐ5T05T01QH1ä*T01T‰›˜¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔÎù Ïa£Üvò˜€oË—Ù__ÊŽ÷¾T¿V?~éµý—þ–®ÛÆu‹ö_÷~ýÓ4ô¼×ÞÚ«õk·$ÿ›6í†çõÕÒ6E6m…C  \®ž �\ðDþ endstream endobj 280 0 obj <>stream xœ37W0P°PÐ54U0³P03VH1ä*T03PAs  =C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�Zìì¸<]Ôl˜££Ú"&á˜ÈŠD)lh:ÄÍ¡£€&ìè¢çP‘ø°½MN™âç±1øpø º°œt{ÛÆÿ@ ™§çÔÀÁÐÀåê©È´wD endstream endobj 277 0 obj <>stream xœ35P0P0WÐ52U01R07UH1ä*T06U‰åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-œ9A¯Ã-�CLèÒ¥×Þ_öÿG_ö{Çêê²6q)e%>8|£ººúí¿û¨jþÝû}ûö¶Naû$9�A�‰ËÕS!� ÄÖT» endstream endobj 273 0 obj <>stream xœ35S0P0b3 eª�bÈU¨` sMô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-äH8þ‰ûLÛ¹_o×ÅfGÇW½ú_ÿzù¿¿±u0òÿ×­ß×­ÿ%¯¿ÛUÿþj?P8ü×ëË5êG˜é7p04p¹z*r¯’L— endstream endobj 269 0 obj <>stream xœ31T0P0QÐ5T0¶T0³TH1ä*T06 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[x¾éSUýý÷ë¿þ_ÿ B<©}ȾÂíŒ]ç~Gó£q“¿ÖÖ—ì­ÿ[[ÿ:>þ×µ]ÿ¿þêúuýË’«Ùÿ½/ýº[í]²Û1oÚaÇÄŽˆD.WO…@.°2M£ endstream endobj 266 0 obj <>stream xœ36R0P°PÐ5T06U03RH1ä*T02 (˜+Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶à`ã¡ú__ÿ¯�S|²|�丿¾þ·Aœˆ¾¶ëoÝÖ¸Õ×__º[«{é­nGD¢ ƒ—«§B ;û@÷ endstream endobj 262 0 obj <>stream xœ31Q0P0SÐ52U06V07UH1ä*T02Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(˜qÉÌZð ~ß¾}ï¾ïïó¿ýÏÿ}ÿþþÿwÿÿÿïïÿ‚¿u@¦÷ÿ_×ý­BýKõ¶¾ö^[²e×% èe`ärõT䮦R5 endstream endobj 258 0 obj <>stream xœ37U0PasCS…C®B33 ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶�ó0+ã‚„®‚8� ·”/æjKãdYþMý¿äÿ}ѯÿ¯ÿÿÿõ?V Ä"ýÿC—«§B fýGí endstream endobj 255 0 obj <>stream xœ36W0P0bc# …C®B#�˜ˆkªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAm‘<·?‡­ýåÿÿÿßú»Æ`ÛF ã„óñÿj‹ßÿÇ>*3×30r¹z*r#ÙA÷ endstream endobj 252 0 obj <>stream xœ37U0P0QÐ5T0³T°0VH1ä*T0 (X˜(˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`�ŸNÛŠþÿÚîͨÿ'4”O¤K>hþÐü¡oq]#s�€c¿ç—æ—vÓß/}ýõõÿÓÿÿ?VùgÖúÿ¿ëÿ¿ÿ¿ý×Ûuÿn½m½íøÆ QŒy�Лp==Ç�B L \®ž �\èF^Ý endstream endobj 249 0 obj <>stream xœ36W0P0bcc c…C®B# ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶�ó¨üŸYýûÿ<î`apàrõTä =EM endstream endobj 180 0 obj <>stream xœ33T0P0bS33 …C®BS# ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇåé¢ à°øäŠ“ ×yKÿc€‡õÿ¿~Ò¯ÿÿ›þoßþ_?âã¹[N.qÿÀÈ Àåê©È^E endstream endobj 177 0 obj <>stream xœ33R0P0VÐ5T05W0³TH1ä*T05 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[$Ŷàÿ“+»ÿCÁONÕøùùÅ�ö)²ýpÜ7ûÕ¯üõ·ÿ¿¿ÿÿTɯÿ×_ÿÿ«÷zë[½ŒY±fÓ}$T/ ìâÑkæHkp`hààrõTä)N) endstream endobj 174 0 obj <>stream xœ35S0P0bS#3S…C®BK ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶pI…ÿº]¯½^·Ý.‹]qûã¦/}Yõ· H½þúDý_ ¢Ö_R15 ÷O®Hbù?ÙØþÿap`árõTä’E¥ endstream endobj 171 0 obj <>stream xœ3±T0P0UÐ5R01V03SH1ä*T0¶ (˜Y(˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[Ã#^a—!Z[z�»õô�=õÿÁàÄäŽ?ÜÙäøØsšQû•ÿ~ù«�ùÿ÷þßÿ¾UÅþÿ«¢ž\çYú?{oÙ´û·¢3s—n›v°ELb�ADÂ&.WO…@.¿LJÉ endstream endobj 168 0 obj <>stream xœ37S0P0UÐ5R07¡C®B3S  �k¤`ªg”ɹ\Nž\úž¾ %E¥©\úá@E\ú@5\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmá´É".¶Dy‡Ã‡8 >4ñت}™})ßs/�ºbýUûíW-ˆúýùÿïÿÁÉU™õÿ_Ïþ÷õß­ø·Kÿ}½õvéÞÜ¥·ÞGg&n»Í£Úv!"±ELÂÀ1±#’g‹ ƒ—«§B �^WŒ endstream endobj 165 0 obj <>stream xœ35T0P0RÐ52P0±P01VH1ä*T01Š(˜+é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQPbú¯¶,€‡é�îë[÷vǾþw½ê®þïØ×·ì[¾þÛ¥ÿ[ïí¿í NÚÿmöÿì/û¿ì÷þ|Ù”ø¥¿B6eMŠQÙ&áÍ&ÀÈ Àåê©È¯KH„ endstream endobj 162 0 obj <>stream xœ37U0P0b3K3 …C®B3�˜ˆk¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAU!aZÛ�'WRçØ.b}¹#ÿpÝáo÷×çßþöÿÛ¿¿ÿþÿýÿÿþúÿ@âÿ¿þúÿÜ~0œ¾þúÒ—Þ—>4]Q]æl¥¤è4i‚ƒ—«§B Ó…S® endstream endobj 159 0 obj <>stream xœ³4Q0PaKCS…C®B s ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²]�·åÁ�ƒÌ,üÍ—ý9~Üp?öE8Cíɕڎq_¾ü›6ý¨¡ïÿ¯ñ¡ÿ�Äìà�W‘Ö‰Õ¼@ƒ —«§B ´×R/ endstream endobj 156 0 obj <>stream xœ36Q0P0b#s…C®BcK ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ æÂ“ì¦ WáC\/õv}ÙÿmË~}}ùÿ@ðcÒCû“+–2.þ�ž ÿÿßÀÁÐÀåê©ÈÂ-D• endstream endobj 153 0 obj <>stream xœ3µT0P0bS3…C®BS ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ŸÿŸ¯›+;{Õû»zÿc_o½·J쿞··|Ýõª· âñ­ÿ·þ®¡†.WO…@.)T>stream xœ35S0P0UÐ5T05P03UH1ä*T01 ¹f ¦z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-Ø© Ѥ̨ÈÞ"×s¤ÂaFçþZ¶ûü×~ÿ‚[ßVg®­ºY'¸üÑãoŸ ç&Q‘ß¾ï~ýö¿ÿõw8~ùßýoÜ’«úKv}Šf›v°)Z`Ã5‰ˆ„MJ L\®ž �\ׇJ¤ endstream endobj 147 0 obj <>stream xœ3±T0P0QÐ5R01Q03SH1ä*T01PA3 =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j ›â8äl”íeâ±e¹×”ïýíç‡äåõ¿¿ý¿eGö±ý_ö{¯ÕÕÕemâV<ñlÁ'.{Û½{÷}û}ÿýýÏö Tìÿ¿*~rˆh�÷޲ݥۦöN\ºÙÐé°À†Ä„ƒ, \®ž �\¯Lp endstream endobj 144 0 obj <>stream xœ35T0P0b 3K…C®BS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ØŽWù§©Ýïÿp0Ákÿÿú ûį__°WßûÒñõÃüå¯_û±úå¯üÕß¿ýûûwÿþúü÷÷ßßþýû²Ÿz�æáú, \®ž �\GZP? endstream endobj 141 0 obj <>stream xœ35Q0P0bS3K…C®Bs Ì5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ØŽ7ù§©Ýïÿ0ðS¨NÀžã&û …ûKë&ÿ ÿúqûõÿñÿ¿þÇËæø-ónûßÀÁÐÀåê©È/(N} endstream endobj 138 0 obj <>stream xœ35S0P0VÐ52T05V01UH1ä*T05PA33c=C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j v:Xè´KpØ(zȽ¨qn-‹„ÞäZµ[×n½<þ7ÿ?ÜÛÿ¶|í–m—n$êr≠#>qqàÿ¿ßO0ˆWJ|#ÏŸŸø¾åü^ætG�Ónòïißÿÿ6åjöÖÛÞ¹ºÍ,Ûx„ l8t°é„á.WO…@.áñU5 endstream endobj 135 0 obj <>stream xœ35S0P0a3S…C®BÌ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§ƒ â±Dö9�*[&¶/ÂUŽ{ãÛkÌ{wÿÞÿgÖÒ[o ¿®ÿº>**~Á–]—.]ˆŠŠâövÌHzY²ËÛ1lúÒ—Uœ%Ó�/]�-½fõ�A�‰ËÕS!� *ÇB‰ endstream endobj 15 0 obj <>stream xœ34´T0P0RÐ5V044b …C®B Ã(n `hd¨`¤g”ɹ\Nž\úž¾ %E¥©\úá e\ú U\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææƒ4ÙÙqyº((-XúÿS–&k‹s3‹„î2ñ Û×g×ïºÿëmùºÿ±¯÷—ì§ãñ­ÿ·þ®A £�ƒ¡�ËÕS!� xÜ endstream endobj 11 0 obj <>stream xœ³°T0P0b CS…C®B ñMô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨–Kߤ”Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨m¼?•}}᧬ýû~ò5Igü‡�oû?úf}’Œ|Èþ9ˆ)æ7‚¨[ÿs+øÓ¬Wáøÿ%\«ÙáµO®–î;ÔÀÁÐÀåê©È™Íd¡ endstream endobj 8 0 obj <>stream xœ³°T0P0b CCS…C®Bss €˜o¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÇÎŽËÓEAm£Û W£#ïdO®ªÈWpÜÑÏöǾíïþüû·¿û»ÿïþzñ÷ßÿï¿ÿßÿÿïïÿÿÿÿýþ_öÿÿÿ·þ×ÿëÿ×ÇÿÕÿÿeoÖêÇ{_¿ôe¯>÷C}–ͪ‰«Zz®âæap`árõTäìâg¤ endstream endobj 742 0 obj <>stream xœ37U0P04QÐ5R07W07PH1ä*T03Š(˜¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\‘ÁýDjk„Â5A‹…k” Ê#Ù®;šíð¼î¥íh7½e¾×®¯µú^[öÖíÍö~}ý×¥ÿ—þ”¾þúúÜþÚ ‰ñÿœ=þÖý”µúëÿ»¯×ý__ºëíúº[щ2¿3+[„ßxm8¢~˜Å €‘A€ËÕS!� CvUH endstream endobj 739 0 obj <>stream xœ35P0P0TÐ52U0µT07UH1ä*T0µP‹±XH&çr9yré{ú*”•¦r釕qé{€Tqé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.Oµþkkõ/ýÕ­ºôN]_«§H‘èzrUƒ¡�ƒËÕS!� ‡¥Mx endstream endobj 736 0 obj <>stream xœ37P0P04QÐ5R0·P07PH1ä*T03Q‰›¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\‘Á“"µ*Báš Eo"�Õßu~;Ívù„M~¡ïùeu¼ç—½Z—¾þúºVÿ¯þkïÿÞ¯¯¿¾þoÕÿë?ñnüõõ×ÉU@�u__ߊ¾¾îVìÒ]Ñ™eB·½y[ÄsæH(l8¢c°Iò%ƒ#—«§B B–SÍ endstream endobj 733 0 obj <>stream xœ3±T0B#3 # …C®B,¨` g¨`dªg©�œËåäÉ¥ïé«PRTšÊ¥TÃ¥ï¡`Ä¥ïà¬`È¥ïmÈeËåé¢ð p¹z*ryf× endstream endobj 730 0 obj <>stream xœ33S0Pas e¡�bÈU¨`f䃹fz† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôìåo~øDD¦éù-ÞWÒß_ýÝ[ÿkÿõû¯¿,ý¿¶êkÜ®ëK¯VE-}Y"ô¡éŠ@ŒÓƒ�3ÌÂý­_‰¸Ü¹Æôƒ —«§B x¥LÓ endstream endobj 692 0 obj <>stream xœ³0U0P0bs  C…C®BsßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Xÿ«-h[ ÷§-mŸüáß ð÷ÿûÿÿþÿÿ_q¾<�RÜpýÿ¯ÿÿׯ_ßôñÿÿÏõÍ@5ÿÿïJýÿñŽô¶åÿ`hààrõTäUýX% endstream endobj 668 0 obj <>stream xœ5K1KÃPv”÷+nr‹¯))5P*4µB¡NJí nÖ ¶KÁÆŸâx8Dˆï?dÉ�!»²4É^Î{ïî»ï¾ûîú6t k�ѵ-è÷À‚{“=CϤ5ö™çfkÝ­ÙÈeÜ�ÂæeûÀøœ¿ÖwŒ�f�/LÖY2>áŽ3!9 ¸9Žÿ¸]?½ÒÏpÈÜ1œ}a»(Š=al¾cÏ;2�ÛC¶ä‘âR‹?c±S”1Š@G‰™®U# $ÂF®1+°�ßKü�f:—í PsZP*¬‰BÔåc‰U^帯Ê<ȃDI%©%iX§a‰¾†¿/«$÷ߟ*I¾NÞOÙ• 7ì°õ endstream endobj 656 0 obj <>stream xœ36W0P0RÐ5’Æ – )†\… F†@QC# ¨ž!HH&çr9yré{ú*”•¦r釕qé{€Tqé;8+y.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÇÎŽËÓE៯ãâÀŸú†.WO…@.q0E� endstream endobj 653 0 obj <>stream xœ35U0P0RÐ5T05Q01VH1ä*T05 (˜˜(éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ðšðÕ¥‹r·êq?Ô_ú+dWü¥kÓ¿zK}påÿñoúËúõ×׿¾¾þÿ¯ø{ûÅÿ][õÿeü¯ýñ¿}48¸\=¹‚s?e endstream endobj 619 0 obj <>stream xœ3µP0P0bSSS…C®BSC ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g Ç%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-䨑s¬Wøÿp_3ÿí«ÿ~Õï�ÿú?yÿú·+þëú¸Õƒþ/Ù·5Þ{É^Ý€¸éŽúºŽ¬‚\\ L\®ž �\«:� endstream endobj 615 0 obj <>stream xœ³0T0P0bsK3 …C®BsS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§“A�Mcñ„s½‹X_®È¿ýrþý°_÷Í_ÿoÝþÿ×_ýÿõkýÿë/ëÿG�qÝþ«Uëã×½þ²okÜêK_¶z/ý²—uU¬êCÝ€8Î�ˆ )AA../g.WO…@.H/QŒ endstream endobj 585 0 obj <>stream xœ36U0P0VÐ5T06T01QH1ä*T0² (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶�ç�#{KAóµ/³¿}‘ýûëÿ6¡Ç_Åff&êtÕÉ9ÖæÏßûûï~›’�õ_e5­»ž·M*"±EL¢µM„Á�…ËÕS!� ,E< endstream endobj 562 0 obj <>stream xœ35S0P0VÐ5T05R01QH1ä*T0± (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶��mŠÂ �åÜ–/¢Í_¯›þeëú¯ëÿ­Ž ÿulo¨SüÒÿQ¯¿^µŒ¹¿. ýÿë×õë»þ­¾³ëÚëõK¯ÝðÜz›CÝ›'X´�Ã`ƒ—«§B seJÍ endstream endobj 559 0 obj <>stream xœ35U0B]#S3K…C®B$hn¨` g”ɹ\Nž\úž¾ %E¥©\úá@E\ú@5\úNÎ @Ê%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨­Øa¤±åÖ§¬­·þï-Ûÿv鿯ȌÂ×ßÜHÕ»þ÷õÖÿUoëo{ãdÜXë?Þjà`hàrõTäìW� endstream endobj 556 0 obj <>stream xœ³0V0P0b 33 …C®B # ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§‡”ýŸÆf kÎÖ5âK/q_ú"¶²dz‹øÒU±ªY_fMwd}Yµô‚cUÜ´…zÓ/½¢ïùË`Ÿ€ï«é—|Å·ˆ¯òý2ýˆÚ¯/ûfÿ¿}ýÕßÿW÷íÏÿ[â¼þöõ߯=js<$´ð„?`bPàrõTäGY? endstream endobj 553 0 obj <>stream xœ37R0P0b33sC…C®B3C ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô¬I°­÷ÿú·ôo}üÅÖ믯¿¾ôïËþZýøõÞÿÁ!z|ýK‚ô×__öYÿW,÷õÿ¥¯_¿ús®ñkp �þëÀÂàÀåê©ÈdˆOî endstream endobj 550 0 obj <>stream xœ37T0P0VÐ52Q03W05VH1ä*T03Š(˜›+ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQPcìÿ?9Ð#q†_uÂþÛëc_o½·Lü-{}=ooùºëUo�Äß]_!’;¾íÏþŸ $@ôÚªëk‹k3×Íu]õuÝ”YK¦{æ²ìâÌ ;t8"aƒ—«§B êS- endstream endobj 520 0 obj <>stream xœ31Q0P0bC…C®Bc�„oªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÇÎŽËÓEAmAKCóÿ'Wâ~ÿ'YÍû�A�‰ËÕS!� '3Ng endstream endobj 517 0 obj <>stream xœ³4P0P0b 3C…C®B C�0ˆoªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ @žK´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+ê±³ãòtQP[ÐÒ !ÿ_mÑ÷ûÿ‘ÀŸFÆJ fŽ?Õužüá–xÁì/ó/„ù7õWüå�÷ãÿÖýÿÿoý\à�§!ÇŠüÿX¸\=¹$±eå endstream endobj 490 0 obj <>stream xœ35T0P0bS3#…C®BrMõ t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-xò`�€�B…¿ãË ò÷5Wù_È�_ö¸êÝûŸ¦Þ[�½þúÚÞì¥K×GEEExC�c¢.(I~ö´â^záøäЭ Œ\®ž �\UT?� endstream endobj 487 0 obj <>stream xœ35T0P0b 3C…C®B3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔVLàMú?9ôÄÞÿ ðÏEòå¯úßq×'TþŠ›¾ôeœøUSûÉí×¾ùË~å¯_öwÿþúüÛ¿¿ûÔ"xUl~}PÖäF.WO…@.-IK endstream endobj 484 0 obj <>stream xœ35T0P0b c…C®B3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶âЬë²ëËÕVš6ÛH:ìŽ}ýÿÿÿ­÷öÿ?±÷Wý¿[™õÿÕŸ«ÿÿõÖ­@‰åÿÿþÛ›ÿ«þÿãþ¿Ëöÿ_~ØGƒ¡�ƒËÕS!� €5Hæ endstream endobj 481 0 obj <>stream xœ35P0P0&& ff )†\… Æ&  ×Ð@ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú‚«ë×ff¯Ûá£Ç=ÁKþ‹øf¦�qû¿¾þ��ˆ¿1‘?€‘A€ËÕS!� '´<Ò endstream endobj 430 0 obj <>stream xœ35T0P0SÐ5T01Q01UH1ä*T0¶ (˜˜)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°Ùàˆ€� ðówdû2û%ý�~ùÿŸæþÿÿÿ]™µ¶þÖûØõ¿3Ëvgæ.Ýp(ZtëÖ­mb<" ,\®ž �\Ü3>� endstream endobj 427 0 obj <>stream xœ35T0P0TÐ5T0±T01VH1ä*T0± (˜˜(ê�ä€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶SA`‚ªÉãøÉ¡µ÷•~2ÙÿÇ×ÿÇÿŽÝ°Ç £ïè÷”]·ÖÌ:ÌbÀÈ Àåê©ÈE?? endstream endobj 246 0 obj <>stream xœ35U0P0bSCS…C®Bs ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H¸ÕD$‘½En^ÿö“'-X'7}é׿u{rKÇ]wþÿÿúdp¤™Íþ ƒ—«§B �=Z endstream endobj 242 0 obj <>stream xœ33W0P04¦æ æ )†\… & A×Ð@ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú‚„‚þÜëÄYO”ü4-üt’}ÿä€äÿøÀO‡ýÿ˜¸\=¹n¬E¯ endstream endobj 239 0 obj <>stream xœ35T0P0U02W01U06QH1ä*T01PAsS=C#3=K…ä\.'O.}O_…’¢ÒT.ýp .}s.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔagÇå颠¶²&Î7èC—«§B u endstream endobj 235 0 obj <>stream xœ37Q0P0bs …C®B3s Ì5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ÓÛªöø§¬ýûœdÚ&þ‡‚[ßöÔ©ïý/ƒøý br£<�ü»>û8ˆw"ûûò—På~Ëí©4�Íu`apàrõTäæOVŽ endstream endobj 232 0 obj <>stream xœ37Q0P0b3  …C®B33 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶Sœg•jÃ}>Å»'WÕØîé(b p¿íïþúüÛß¿ýý÷÷ïþ¿ÿþÿýýÿÿýõÿÿ¿ßÿ þÖÖÿÿ·?þÿ믯ÿ/ý¿þúú¥¯¿¾¬úá}éÃ>ÎôÐK¯´D=Wq·nÒ“t`bPàrõTäÔ&_î endstream endobj 229 0 obj <>stream xœ³4P0P0UÐ5T°0Q040PH1ä*T0·T‰*˜êe�Dr.—“'—¾§¯BIQi*—~8P—¾H—¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�zìì¸<]ÔlðàTX±þÿÿO,Sßïÿ�ž3âbü¡ð• Â_\‘¨pì÷°kªU¿T¿üú¥ÿ—þ_ÿÿWÿÿÿ~ˆŽŸ¦ñÿÿßþÿ¿þïþ¿×÷—ÞŽÝz·LÂ?×¶Mp‘Êáj6Wå6Å‚C[¶žHeWlbà`hàrõTä!Äg) endstream endobj 132 0 obj <>stream xœ35Q0P0VÐ5´T05P01QH1ä*T01Š(˜+ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶ØNs†�AãCi‰*ƒ'WªÉ}˜}ãöË}ë—ÿþ„ÿÿçÿƒ—õÿ—þ¿¾¾ôeÙþØ;”ê'¶ì18Ä}£õÁÁ ˆŠsüN}ÀÄ Àåê©Èy¤P= endstream endobj 129 0 obj <>stream xœ35Q0P0VÐ5T05P0³TH1ä*T01 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[p­¦H2ªþ‰Tæ¾ÿ0ð“MýAã÷6ùó—æ/ ª_ªÛïýßûü¿¦ñûÿþÿöÿ{Üß­wË.¶|»´ÇàÒ\æŠÄ¦CîfV;F.WO…@.€8P4 endstream endobj 126 0 obj <>stream xœ3²P0P0b#3K…C®B#C ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g Ç%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-¶3ü3k~í|àË£RÞŒ \®ž �\I¹?I endstream endobj 123 0 obj <>stream xœ3¶P0P0aS…C®Bc# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶¤ÆùLBóÅm_„R®¼Ô½ô>>þrüÖc¶õÿãÿ#À/>µ�6 ,\®ž �\}J7Ä endstream endobj 120 0 obj <>stream xœ3±T0P°b33…C®Bc# ̵Ð3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶À±àî×M6ž²W[0ÿ?.pùò)©? ,\®ž �\ø|@} endstream endobj 117 0 obj <>stream xœ33R0P0QÐ5T0µT01UH1ä*T05 …ÍLô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[$Åvر§Ýÿÿµ¥ ŽÒûÿc€ûý½ÿVuK¡ÈÃ}Þc vd7³š08°p¹z*r^@ endstream endobj 114 0 obj <>stream xœ31S0P0b#S…C®BcK ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²«&™Cnžðsõ%3Mµb_­¿~ëåz}ùûÿÃÁ#öÿ Œ\®ž �\ô5 endstream endobj 111 0 obj <>stream xœ31R0P0a 3 …C®BcS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇåé¢ðӔ˙û?ð(„탗«§B y:ö endstream endobj 107 0 obj <>stream xœ37Q0P0QÐ5T0³T03SH1ä*T03 (˜™+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pF «SBãCö9Á5ù�í-ùž{վ̾T›¿üÚ—ýùñëÃþÿ�_ûÇÿãW–³Öÿ™µþýþ÷7ÙNy·íß´ûÛ¦½Þ6íV4¯î†i ÓNd:,Ú&&aÉs7�‰A�ËÕS!� ¥þLæ endstream endobj 103 0 obj <>stream xœ³0T0P0QÐ5T07S03SH1ä*T07 (˜™+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pV ÏM¦Wšñs\°Qp8|Áq¯Ú—Ù—ò=÷ª}Ý7?úRþßüÿ_fÿ’ÿûþÁŸYkëÿÿάÿ÷õß­ø÷Ñ™õۦ݊ÎÌ]ºmšD"놄i­mb<@èlîÁÐÀÁåê©È÷iO¸ endstream endobj 99 0 obj <>stream xœ35Q0P0SÐ5T05Q0³TH1ä*T0± (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[p{Â¥Ëלã¦ÿúÿ·~ýÿë Jáþk·y‚ŸêhâÛøÒ´e¾÷˯±úQ¯¯¿¾Zm×ÿÿ×ìVÿÿúÓ4êÿÿïq/½-�Ý’XvÉñmËò(‰DÖ‡q<š01(p¹z*rQÁSŽ endstream endobj 96 0 obj <>stream xœ37W0P04PÐ5R07S07PH1ä*T03Š(˜¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\æÇ’"•ý Ù›cŽBv ïºFó‡,Ò±,·ªi{_ªU¿ôe¾×–ùÞ×_~Ù›½>~}ü_­ÿ�¯ÿ{ÿÿgõ_á‚ü‰ìÅÙ•¦¡ÿ_ï¯ÿ»ÿuþÿÜòß±»nÇnI~»ôa›Pm›P�AŠú5‰–‰|ŽN L \®ž �\ß÷Sý endstream endobj 93 0 obj <>stream xœ3¶P0P0VÐ5T0¶T01UH1ä*T06 (˜˜)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ÀqÁ'þU‡l²šeT¾Ì��ºôÿÿߺ×ÿŽ'~’0œuPGîðí5Ò'2øÙ?+ÿ~ý;PZ×þߥ_oõ.uîmYÙ&´L1ÀØ †Á�…ËÕS!� òqCb endstream endobj 89 0 obj <>stream xœ32W0P°bCKC…C®B ‚@ÊRÏPA×H$çr9yré{ú*”•¦ré‡e¹ô=À¤S€³‚!—¾K´!—A,—§‹‚ƒ}Cý�ÿ0ØPÏ`ÃÀåê©È,ÿ6 endstream endobj 85 0 obj <>stream xœ35T0P0b 3C…C®B3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôv]–·ã¨±ÿ“C¶m<þ|âˆ÷÷ÿ¶mƒ—«§B =t>stream xœ35T0P0RÐ5T05P03TH1ä*T0± ¹F Fz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨­XÁÊäÃVðîÉU›éV|¸ßö÷ïþú¿ûÿÁ—ý_¿ì­Q}¨§½n×û}5ÚþÝß,“Î_’ûw�Z¿b›Ýö[“Cf1XÀÄ Àåê©Èç’PÐ endstream endobj 689 0 obj <>stream xœ37W0P0UÐ54S07T05PH1ä*T03Š€(S=C�$�LÎåròäÒ÷ôU()*MåÒJsé{€I§gC.}—hC.ƒX.}7}gg7 7ÀÆFߨ�Kß9?§47¯¨ØÎŽËÓEAm¥ëÉU‘l³ÿ#ƒS7×ÄÌZ:!s?Šèÿ[  \®ž �\¤ï@m endstream endobj 638 0 obj <>stream xœ³0Q0P0SÐ5´T0·P0³TH1ä*T07Š(XEô A’@29—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷jçÒwÎÏ)ÍÍ+j±³ãòtQP[8Ë™­“é¡�ÇæCVr ‰Y$ª8Ì—Ü›\åûDÕ¿4ÿ·ýòk õÿ×ý¿öÿ�×ÿ�OY[ÿÿ]÷õÿïëÙÿ¾Þä©z'PºmVÜümýÒÞy¹º[suwåêî½tûÑ6½ ¶I¨¶)&âL¸U$¹pö�û¹e;v¼­ýmé¾k׿bP`ârõTäÜiD endstream endobj 634 0 obj <>stream xœ31T0P0bS …C®B3 Ì5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶pЇ˜ã®…óyæ5ª/ÙåyéeýÒÿ[—þŽ“ˆ³ÿB>ú?M&°A¹¨à)ãÿÿX¸\=¹u8JÇ endstream endobj 631 0 obj <>stream xœ³0T0P0bs3K…C®Bs# ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Y…¡l}léõ¯×ã¯Ç–þ-½øõÒÿK_öê{ÿ÷¾ôeßÞZ}o þ¯¯(ü®G‡ë'äš6ÿ‡‚\ÿÿ1(0q¹z*r¯eV1 endstream endobj 589 0 obj <>stream xœ36P0P0b#3cc…C®B##�(�k¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAm±�ŽB…ç …{“ëî8¿û{rUìÒþõ—.½ööövÌÌÌd]zÁ3³*®}M8ƒ#—«§B º0a endstream endobj 417 0 obj <>stream xœ37P0P04æ f )†\… f† a ×Ð\ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ€—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶øú“m Ý+ì9ã×~Yýºþ¯êúõë¯ÿŠYúz}oÕúÿ¦Tý¿¾þ/âú×˧„þ-`bPàrõTä‚TJ€ endstream endobj 414 0 obj <>stream xœ35U0P0WÐ5R03T07PH1ä*T05 …�Ìõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-¸�ÁÙ"u�mKMâ‡FælÏ-[f|™ï})Ûûû¥[öýµþÿõ_ÿ÷ÿý>.³>û†jöÃ7*òy~’ }ðüý~ýýÿêòû×ÿºþ·n×õ¿Kÿ­,�Û»tUìÒs¹z3YE¶lS H äñcP`ârõTäõU˜ endstream endobj 370 0 obj <>stream xœ³0Q0P0SÐ5T07W0³TH1ä*T07 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔÎræ¹ÉôÐÀáCó!+9…ćLlr“«8Ì—Ü›\D¾ÿ—Üÿåûí—_÷ÿ¿®µÿÿ_ö?ü4�z[ÿ¿êÿÖ{ûß–¯ÿvéÞîØ-Û.ÝöÎÕݲMÂ;±eÃÁ&î¤ ‡6l:‘ÖÎ ÀÈåê©È“ŠU‡ endstream endobj 335 0 obj <>stream xœ33W0P0QÐ52U03Q05QH1ä*T03PAsK=C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j /ˆññT8¶|hæ^$É9ï…€ñ—»|÷ª½ŽÎþ¶e¶ü×ýÿAàïë¿[ößÛvé¶w®�Ð…µ2Ž%QK>þ­ÿýOžbÀÅ”%†ÍßÁ÷–»4XùÎ^÷�÷Ü_±¾þÿïHÓ¨·åk·l“ðNli ^ó8l:Øt"ßA€‘ËÕS!� }•a` endstream endobj 332 0 obj <>stream xœ33U0P0QÐ5T03Q05UH1ä*T03PAS3=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô¼b¬" Æ!'P¥Âñ%ƒ»}ÙýĽùÛûÿ?sÿ·½ëåÿÿÿÄ&úÄ„ñ‰¸ðAAþ&Í#/Ä[¸/ÄM_ú²*nüÇøÿ¯¿mÊÚÌýúíÒêLçÛœ­ ÕÞv|pˆ7ÅÀá ƒ—«§B ÀŒKá endstream endobj 329 0 obj <>stream xœ33W0PaSKs …C®BS# ßÄ5×3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶À‘ÇÌòF¡Âñ!û¢Æ½LlrM¼/Ծ̾TÇ÷åöûî¼ÿ·ÿÊšþ;Æ`GbáÚúµUõ¶lÙuéµ··÷Z]Ö¥K9Šó5KĽ—L›¾ôeU\S¬þÒ _¶^�-½ñúC—«§B +éN endstream endobj 326 0 obj <>stream xœ³0T0P°bs#K…C®B3 ßĵÐ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Á É"ÉC �™ñs¾hS¨bá}!�ï¹—åÞä*ß—æ'§}¹¿ûí£÷Õÿ÷ן\ÿ¶lG¢ŽÁŽëÿ¦]¿ôÚ´éQQ±º@Àz­éÒ¥ QQQ.Ü_õš^–Lºôe/ë×—zÓ—¾T]Ðô¢êõº]Q@|üúF.WO…@.L[š endstream endobj 216 0 obj <>stream xœ36U0P0aC3 …C®B# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇåé¢ðäJ�ömûÿãþ~*ù  \®ž �\1¬> endstream endobj 212 0 obj <>stream xœ37V0P0RÐ5R07P0³PH1ä*Ñ@1Ò3ʉä\.'O.}O_…’¢ÒT.ýp ".} .}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ŬýÓTI"SÄ"Ã`×Ú[ï¶ÿÛûúï–ýïïêÿFbì/A0Þ–¯ÿvé?*cÝß®ÿ·þßú»þï †.WO…@.qRA endstream endobj 209 0 obj <>stream xœ37R0P0UÐ5T03W03SH1ä*T0 €DLõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[8#‹IEDø ó!~·R‡÷²84¿P˜×äÏYåùé˪¿Uÿ®M›u½M¼oúÿãÿÿÿ?¹êýþï;yýþnýºÛÞ¥{s×ÝŠæQÝ6M"Qw"ÓCnÞÄÖfÖ g.1(0q¹z*rqI˜ endstream endobj 206 0 obj <>stream xœ33S0P0b3C3S…C®BS�˜ˆkªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmáIÆ“‡x*_¾|q©ŠeάnÇê%s_¿þõ1þë·ý/×gæ^øÿÿëÿhàQ[ý.WO…@.[³G endstream endobj 723 0 obj <>stream xœ342P0P0SÐ5R04´T°´PH1ä*²�@†@I=C 4�HÎåròäÒ÷ôU()*MåÒ)ãÒ÷©âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ Mvv\ž. jå kÊná“‘™ÕÆU ÷§-±žM~ûÃýù·¿ýÿöïÿÿÛÿÿïÿ¯ÿÿÕÿ·ÿ˾½úÞ—>LoÙ£°§©aŽÓƒz;j–ó6þ0ØþöwÝýíßßáÿí ÷AD=ÿ�p±~ùÿÿù¿¾ÿ½¾ëw¶� —lîÒ ‡vææõ\!ÇÂ:Á†û%ƒ#—«§B ÛÉuV endstream endobj 507 0 obj <>stream xœ35T0P0UÐ5T01U03RH1ä*T01PA3cS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô6¨p|ak£¾ÈÑŽÃnB¾ç^ýe_毿ݿ~ïÿÿûïù†ßúwëmîÚ­=Þ䛣'͵áÐ'þǯ¯¿¾¶7õÖË¥ËöÇ }Ù«ÛÆ}DwíÚÖ61 †.WO…@.%I endstream endobj 474 0 obj <>stream xœ35V0P0bSs…C®B Ì5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Á�åÿ—ÿªÿ¥7ÿ/ßÿk¿üiþ™±°þt£¬Úÿÿžû¿î›ÿ7úúµ/R…>stream xœ35S0P0SÐ52U0±T07UH1ä*T01Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-\·åõëµU«®¯¿¢à T ‹0œ±âõJÓ†.WO…@.G“Ne endstream endobj 420 0 obj <>stream xœ31W0P°PÐ52P0±T01QH1ä*T01Š(˜™(Xè‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³�ãmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔÉðìpœpSÊÜ`.Ëýè¯kõöÖêÿ-}½ôßþоUû8릿Ž_=êõ8~ý?ö¿÷Ö»e×s”3s›Yí­Û›vžséÿ¥"ÓC6xz®Zz‹»d›„cŽÓÁVF.WO…@.]’N¬ endstream endobj 395 0 obj <>stream xœ3²T0P0QÐ5T02U0³TH1ä*T02 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ôü”›Býýú¯¿þÇã$V þ­Zÿ7yÕÿHÓ¨¯¿nÇ^º±Æ`ƒ—«§B moCx endstream endobj 392 0 obj <>stream xœ³0U0P0VÐ5T°0R01QH1ä*T0· (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶hÏaË6 Ù8l%f¸sô Tù.—ž‡ü//XËZ¿ä¥Ý®°©_¯Ç/<þ:ôkèÿ�—¼½¯‡úµôõªÿÃãv­ÿúumýªø××Y×m½þëß–]K£þ‡¾^·?6lÿ˪]Qߦ‡H¬1‘âÑ`hààrõTäüíWò endstream endobj 388 0 obj <>stream xœ37W0P°P02V0’æ )†\… f h¢`¡g¨`d¤g©�œËåäÉ¥ïé«PRTšÊ¥TÃ¥ï¡`Â¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�:ìì¸<]ÔVºž\ÀÈ Àåê©Èäê¢ endstream endobj 367 0 obj <>stream xœ35T0P0UÐ5T01U03RH1ä*T01PA3cS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]ÔzlpøÐ|ˆÿ˾ uó=÷ÿªÿÿÿDzÿ°UmuüÿÿÙÿgúpèMØõ‡­mb<" ,\®ž �\?©BC endstream endobj 363 0 obj <>stream xœ33R0P0bS sc…C®BSS ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ëšþ™ƒÅÇÿÁŸYK·þï³ÿ�L8hkÿÿï †.WO…@.O¦D¤ endstream endobj 360 0 obj <>stream xœ33R0P0VÐ5T03T07VH1ä*T0µ (˜›(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶¢‘-¡¹¹½\må“b…Yæ÷×çß¿ýýÿûûÿ� ~ýßZýxïë‡â8 cK¯¿oÌ^'ýýÛß¿ûÿþ‡‚OvíÿÿÿýoïO']�mvÛ_gùñ&Ih04pp¹z*rï‰R§ endstream endobj 357 0 obj <>stream xœ³4W0P0WÐ5T°°T°0VH1ä*T°0 (X˜(˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶p])³$ÛÖlÅYf[[¤©ÚÚÜÖpM@áÖÇ>ÇêK¾Ì›|©Êßó¿çËÚ—¥õ—êÿM¿ÿõÿ 9éY¯ÿÿÿÿÉÕúýŸX+ëÿoÿ¿v×ÿÒÛÿ¶]ÏÕÿvé¶wn�H\ºMè0¯ngâÄÆ:F1V‡6:Ø:![}Âõk L\®ž �\ `v endstream endobj 354 0 obj <>stream xœ3¶P0P0b 3 …C®Bc ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àØ>‡]fbû¯ÿÛ[ÿQ·ÿšp§÷+&.WO…@.¤ž=Þ endstream endobj 347 0 obj <>stream xœ3µT0P0bS33K…C®BSßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶HŠmÆÿ'Wvÿ‡� ‡ê�$[�º÷…¸éKê;VÅMoÙ«ï}ùë‡ùâ÷?/û~¹Ö~û÷·¿××Ýßb¹æ¢�ÿÿƒ—«§B „M¿ endstream endobj 344 0 obj <>stream xœ37S0P°PÐ5V03W05VH1ä*T0µ (˜š)Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[q@¸£àÉUö69‰ŠÄ‡í@ÊÆàÃáÃülP>?ˆ°./ýaš@„c"k‹˜@„†¦CÜ: >�æ‹Áä¹Df-XÀÄ Àåê©ÈèÄ=¨ endstream endobj 341 0 obj <>stream xœ35P0P0bJ1ä*T01T0€ˆë*èèX�…©Br.—“'—¾§¯BIQi*—~8P)—¾P%—¾S€³�ãmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô¶ÿŸÂ¤Ç©·oÒKÝ ×_öêMúéË^�Z]]ýK—ßMÿ«º4þe•÷ÒÿKvy/Ù'î!Ôñ¿�ƒ¡�ËÕS!� '×7× endstream endobj 338 0 obj <>stream xœ37Q0P0bs3 …C®B3s Ì5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠æú{rÀƒÀõüÿþýÿíïÿÿ÷ÿ+ýÿûÿÿÿ_ÙÿýúÁžúÿÚÄüû÷ÿŸC÷ûÿ¿âÿÿÿg¿þü¯ÿ¯ÿ¯_úúõÃý �1îñX¸\=¹õþRÐ endstream endobj 219 0 obj <>stream xœ37V0P0QÐ5R0³¡C®B3  �‚9PFÏ($’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ê�þ'WRΪX$2³¾­[ÿ?Xw·þõþ»yû£³_æ®»›Û²íÒmïÄ– ›¸yÂ$"yn9°08p¹z*r÷DS� endstream endobj 714 0 obj <>stream xœ36T0P0RÐ5T02W02RH1ä*T02 …�Œô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[x~Š@…;ç µ/³/}Y·ÿeý�%ûצ\;tWïÒ�DÝŽƒF.WO…@.ú(.V endstream endobj 711 0 obj <>stream xœ3¶P0P0VÐ5T06Q02RH1ä*T06 (+ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨­¹±¼eÁ!~×Wù^ü?†‹Æÿ-˜äýÿ¯®þÕ¿—.}ÙéoÉ\ý®[< \®ž �\ƒ£2² endstream endobj 708 0 obj <>stream xœ36Q0P0QÐ54Q06W01WH1ä*T06Š(˜*˜è‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�Zìì¸<]Ô$ˆ T¸K/Ùµþ¿gëãÿëãÿ¯sâùÓôÄ‚ __Á(þç£Eõ/µ^ p æÑ`hààrõTä(Ú=ï endstream endobj 705 0 obj <>stream xœ36P0P0VÐ5T0²P01SH1ä*T02U ›˜+ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶h¿áå÷¯¿þÛÿúëçrGö÷rå¯~ýrWü׫ÿÖ¿²ZÿeÿڪɡÞ×/ÝvÌ]º‘›Gƒ¡�ƒËÕS!� Uú; endstream endobj 682 0 obj <>stream xœuL; Â@íæÖúö­±„Ù\Dˆ•…¤µ3ŠŸ´^ÁÃz}Ú;Í0ßÄÓÑ;ŽT§œ¤L¸W\¨©ÙŽjìÝX±Ñ®E!qÉûµ;@ÖV„Ì¿=HQ*¤Ü(\©$„Êd�e²°H8»öt³Mž#–|mŸïÿ=ö1‹\áu^8î endstream endobj 671 0 obj <>stream xœ37W0P04Q0T03R0±TH1ä*T0± €(C=C=K 0RHÎåròäÒ÷ôU()*MåÒ*áÒ÷“NÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ØÎŽËÓEAmÅŽ\�¶ÙAY³n{çênÙv •´mÛ~÷É—ò=÷ª}™��Ê ^®¶Bmƒ—«§B zìH© endstream endobj 536 0 obj <>stream xœ32P0P0bC …C®B ³P0Ó3TÐ5Ð3°…ä\.'O.}O_…’¢ÒT.ýp .}áà¬`È¥ïmÈeËåé¢`S÷êl¸\=¹ÿ1Ê endstream endobj 533 0 obj <>stream xœ37P0P0VÐ5T03S01QH1ä*T03V ›˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶��íF„ã„|FåÜ–Ë Ö¹=nzÜôªß¯Ã×ÇM¯�ÿzlkhô¡ø—᯶þÛµôõªÿÃãv­ÿúoÿ/Ïúõ×ý­Žú{Uïéß¼m»3Í„n$*ÜâæqJÚ�ÈÌÅ ÀÄåê©È“`N& endstream endobj 531 0 obj <>stream xœ37W0P0bsC33…C®Bm„@ÊTÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¸ô=À¤S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+*¶³ãòtQP[p%Fjåð/ìlÒ“«:;(¢Os®éù5p04p¹z*r ÷B endstream endobj 528 0 obj <>stream xœ340V0P0bKS #…C®BKC ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g Ç%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(h;.ñ9l"#ciÊbÕXð§-©ží�Áó·¿ëîoÿöw}Ýÿºÿõ¿ëÿÿÿþÿÿ@ "ÿÿ_ÿÿ5�|ý?~ýÿ/û}ýõeoÝ^}ïK¦/}¨ÏY¡°§±PP”• hòZ¶ \®ž �\¶K[9 endstream endobj 504 0 obj <>stream xœ35T0P0b33C…C®BßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔVÌ`(x÷äªÍô ÿ˜¿ûûÿÛÿ °ôÿú¥ÿ[ö¨-=ô~Ÿ¼�Dïïºûûïïÿw(ù·¶þõ˪_qÜSôEVùh04pp¹z*rP—I endstream endobj 501 0 obj <>stream xœ35T0PaK3C…C®B ßÄ5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôv:˜sûZlùiuÛ›½éù´ÜºëÿÿÿÏÕÿÿÿßõÿ_CÈßñÿ¿¯ÿ&¿þûoÿ ãñÿ¿ëÿÿ¿õwýñÿpÀÂ#`kòèò“«jÛf5p04p¹z*rùý^¿ endstream endobj 498 0 obj <>stream xœ35T0P0RÐ5T0±P03TH1ä*T01 (˜)éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶âߢËÿ'‡Ì:ù“íÿ­÷ñ`üïVüÿÿÙ{ëáøw&_Ïâ¿ë_ÿÿÿßÑú×ßæ:°08p¹z*rÎMK; endstream endobj 404 0 obj <>stream xœ33P0P0bSsc…C®BSS�(�k¤g¨ k$’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú²‚ôƒü­ Ù§I™%ž\½`¶£ù.¿ÉÃ/û_­ÿþ,›U¨a¼r®s}C—«§B lF?¦ endstream endobj 401 0 obj <>stream xœ31Q0P0VÐ5T0"…C®Bc   �‚‰©‚±ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ@Ý\úÎù9¥¹yÅ@-vv\ž. j‹æðÈ4³Èõ˜õN¾´¡ÉßwAÓuïk“®¯ü«u­™{MÝâ—U­ÿöÖ¿¾ŽL$®`hààrõTä[‹<, endstream endobj 398 0 obj <>stream xœ37S0P°PÐ5V03W05VH1ä*T0µ (˜š)Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[à·aŽŽj‹˜@„c"k‹‡ŽÂ†¦CÜ~7„Ï “qzr•½MN¢"ña;�²1øpø0?”ÏÏâl‡ËK··-`bPàrõTä«>stream xœ3±T0P04U01P01U0³TH1ä*T06PA#K ”ž¡‚±¥ž¥Br.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[4�Mlõ’i“¢>stream xœ31W0P0SÐ5U01P0¶PH1ä*T06 (˜+˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[°�››ãŒÄ‚(nÇÌÌÒuÓ£¾~¼~bFþ ¶ùEYûïý}ûþÞ½{‡oT³·9±}øPÀÈ Àåê©È÷~3º endstream endobj 199 0 obj <>stream xœ37V0P0b3 J1ä*T0ñÁ"&z† ºz–@`aª�œËåäÉ¥ïé«PRTšÊ¥TÊ¥ïTÉ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]LÛbß«-:‘6q�¸Þìø·ãîÿû�\|üÿþýÿþý¹ßü&¶�¦Ìáß8¸\=¹%Uj endstream endobj 72 0 obj <>stream xœ ‹;Â0Dåœb.@Ök‘¥(…",„”T)¤# >¹>b»yófB¤£Ò{OyS¼ÔJÇšZ™Ò*òº H9ñû^gÈdÈ�5$ ™–»³Â] ½äÜM#GîÌäç}]{´-JÇ߆[ì GüFàÁ endstream endobj 69 0 obj <>stream xœ3µT0P0SÐ5R05S°0TH1ä*T05PA c3=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j7ÜþûÙáÚ‰€üÿKÿ–þ¹‘¥7éÚÞ*ï××/ýêŠÕÕкd×uï/[_Çmý«ý×õ¯ÿ¶þ¿þ?nÿÿøÿ@¾m8ÔÀÁÐÀåê©ÈëïM, endstream endobj 66 0 obj <>stream xœ3µT0P0SÐ5R05R0·TH1ä*T01 (X*˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. jKb¤º÷ì‘ÐWa� �-=ô°`g�¾J½üø$Vç¾¾E~ñcþCòKî Ì~¹oöëo¿öÄïÿ÷ýÿûÿO�sØÍ³ýú:Fkr÷[ýo¯¯çê½ÎÕÝzÛ1Ç`ÚÁ–mЉ­mb<" ,\®ž �\àïR endstream endobj 63 0 obj <>stream xœ3µT0P0UÐ5R05V0·TH1ä*T0± (X*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j çÌ1>È|ˆ½%M£Š…÷!˽ ‰/Ô¯î[ïùwoÝúûñÿÿÿ¿õÝîo—Þ?\ºm�ɶ׉Kox'.Øvé°À61éÛ‡ùý9l”/rÜËrøÿ’{ò=÷*üÚ~¡Víï—ù·ßÙÚïÿ¿krèßêµ×wݎݲÛ;WwÃ4‰DÝf1‰5¦ÏcP`ârõTäãàaX endstream endobj 60 0 obj <>stream xœ33U0P0QÐ5T03R05RH1ä*T0µ (˜+˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶H²±Ø�ÍYôÿŸYSÚŽ$~÷+øõÿÿúÿïö.æþ¿+|Û»CÁù<Ó“v$Ik 08°p¹z*r 1Hà endstream endobj 57 0 obj <>stream xœ35R0P0QÐ5T0±P05VH1ä*T01 (˜š(˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÁ!ŽåBn‰Ì‡8š~.h®ò|Ézio¸÷¥ÿ—þ®uæ^ø·þWÿÿÿO®Vÿ¿¿!úwôõìýÛ¦—nÛ�™¸eÛ¡ˆ„ƒ¬# 6¤5602p¹z*rªVC endstream endobj 54 0 obj <>stream xœ33U0P0VÐ52V03P05RH1ä*T05Š(˜›*ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[$ÙnÂóXéj‹œàGç wfMe9|xɽ£æ—kÍ/ÿýrÿßýÿ¿ëÿÿßþ ¾ìÿÿß×]¿ôn·÷–�³2«3«õqØc°GB_¢îÿ…GnÌþ˜¸\=¹WV¡ endstream endobj 51 0 obj <>stream xœ³°P0P0UÐ5R°£C®Bss  �‚…‰‚©ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb ;;.OåÄÅÿÕÉ2{¼*klº•}ëÛþÿÄ€¿×_ïâ­÷¿lûï�«»¿dÛ¥ÛÞ9z‡s ¼y$TÛ[ÛÄœ}>02p¹z*r×/^W endstream endobj 48 0 obj <>stream xœ36V0P0b#K …C®B#S ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶HšŸÃÖÖþÿÿ[·sËÿÿÿÿ“Êã¾Þí÷ÿc‚Í�~Ò¸\=¹—Ð?´ endstream endobj 45 0 obj <>stream xœ31S0P0RÐ5T0¶T07QH1ä*T06 (˜›*éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°™qþÿÿÿöÿ_ÿoÿú×ëv½nR®øçë$ÙVÿþqCÙUÿsë¶]ÏÕݲM›GG"€‘A€ËÕS!� ”E endstream endobj 42 0 obj <>stream xœ33R0P0RÐ52Q0µT05TH1ä*T05Š(˜›*é‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQÐbüÿ)ËÝá†GÁ¡Ä¼C¿î¿Ûþowìëý%ûß–¯û{éÿÖ{»¿{ÿ»^õþ®þo¸p×ÿ[×ÿ]ëoÕõõ××Výù1m¾Øô—Ùžž«–òNl٦͛ØÔÀÁÐÀåê©ÈíÃUA endstream endobj 39 0 obj <>stream xœ33U0P0b3#S#…C®BS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶hf“[c{‹\—\Sž¯WS>ßäw“ë¦ýµýëÇ¿õÿ¯ÿÇ ~8¶ÈxR9\ÿƒ¡�ƒËÕS!� |cHÓ endstream endobj 36 0 obj <>stream xœ33U0P0VÐ5T03P°0VH1ä*T05 ¹& Æz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-’lNø?9èá÷ÿH@ñ哨= ”µ¿0¡&¿ä¾È}ß/÷ý¿_®ÿûûÿ÷ÿûÿ×C®�ÿÿëÿ¥ÿ—ÞÙ½îÒómÓ·M÷mÙ»eWÂAÖ‡±lb X¸\=¹q®]“ endstream endobj 717 0 obj <>stream xœ-‹½ Â@ÃÅ1O‘ÐÜßCÛ¡tèÕâ!B�Ä©ºYÅ�¾¯o¢W0C ¿$ GÇœ3ËhÆ¥ãÙð çˆWó¹�]ò®G¡¸ãû9\ =´I¨j ª�w‚…ФØ…¶é …ûuèo/ú²D¬ùýë3�ëÈ=~‘š"Ê endstream endobj 666 0 obj <>stream xœ35S0P0SÐ5T05V03WH1ä*T01 …-Ìô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQPÛ¸!ç¾Ûžimÿ½^·ëõ—�NǪ¾,�Û7%3(6[má”-[ö{Çm½ô·êú××ñ×ÿÇíÿúÿÿõÿ@ðmÛ¶L \®ž �\ê¾Dµ endstream endobj 602 0 obj <>stream xœ36T0P0VÐ5T06¡C®B#s  � Ô3ʉä\.'O.}O_…’¢ÒT.ýp ".} .}§g åmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-l>Ê"'xˆßÃNh¯Â.ï¥_£~9ÿúú_¶þ¡çªõÞ—nsæ5ÝHÙ�$Æó£€‘A€ËÕS!� a/™ endstream endobj 599 0 obj <>stream xœ³°P0P0b c C…C®BsK ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]¬ÖOpHµW¸¸¾ýÃ? øÿ»þ÷ÿÿûÿÿäùù¿~ÿÿÿÿ¿þÿoß¾}ÜÇÿÿ?ëø�ÿýû÷ÿÿýŸpsþÿ¿úÿÿËÿ�ÿ·ÿëÿÿñëããÿÖÖês?¬ÑŸ`§üúƒ—«§B ±øYÿ endstream endobj 596 0 obj <>stream xœ340T0P0WÐ5T°4V°0VH1ä*T°0 (X˜(˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pE ¯'[S…º-h|(ËÐð¡‰Ç–Eú��¸”ï¹Wíë^µ/³ÿ{îÍ_~íWmþßüåÿ£ÿÿUûÿÿÿãý@âÿŸYkËöÿÿ÷õöÞú·âß.ý÷uÛôì½¹K·M»� ¡xTÛx"²¶)&¶6³6³N¸¼ŠA�‰ËÕS!� å¥^£ endstream endobj 464 0 obj <>stream xœ37U0P0WÐ5T03W°0VH1ä*T03PA s=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô.h“â±d=½ŽCê!Û.Þ‚¾F©‚l|»8$¾Ôª¿°[ùõ—_ûÿ}üý÷þ÷ûÉ|¾5-¼>3Øf+;NŸ�Ÿ²€ãð�jþÄ·@ðp��ôÁ=�…:m rŽkãœCäøÛ—gþïïÿð¿K¿ß Ûp©mŠÉ‚CÁ¯dƒE[-H dûu€…Á�ËÕS!� &A]Š endstream endobj 461 0 obj <>stream xœ35U0PÐ5VÐ52P05W07PH1ä*T03PAK œ‘ž%HVÏP!9—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-¸å!Ó¶âŒòCæ ùœæž™¬×Cÿê_[Øzáÿëë`4!fù¯â�$‡¾Úÿÿúëøõ×_ÿ­›þúÿ׸Õÿÿ–®Ûÿ×ãñËÒ×ëÿ�_uý×õ_ßÿ{‡Ç­Ûc'gÿ7ûç¢ Í�ãö{­:¹*ôVD’˜D#ƒ—«§B =rbX endstream endobj 458 0 obj <>stream xœ35T0P02Ɔ †† )†\… $¤Œ ô tADr.—“'—¾§¯BIQi*—~8PšKßL:8+)—hC.ƒX.Oyû†úÿÀ`ýûy.WO…@.£æÇ endstream endobj 455 0 obj <>stream xœ35T0P0UÐ5T01U03RH1ä*T01PA3cS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô육Ïa£ð2üÙ¾Ì~ùeöÏý`âÿ¥üÿÿ_>ÞÿÞz®ºþÿÿ­÷ñßv_ÿ�Y¿mzö¶é¿yT·M;š›››ØÚ&ÂàÀÂåê©ÈIxJk endstream endobj 452 0 obj <>stream xœ35T0PaK3C…C®B ßÄ5Ô3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôv*˜¬<~rÕû‰õÿAàÄ–Í@8½øY· íÃ/ýýÿ_ˆ$<—p›ïk±å§©çÚe ˜¸\=¹ ßL] endstream endobj 449 0 obj <>stream xœ35T0P0bs3C…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔV´q,º\ÿäªÙ&žçÓÿÿûÿÿÿ·ÿÿÿ÷¿þÿûÿßÿýÿ_¡`4ˆË‚T�TßÿñiÕ£ûÿ+M=W04pp¹z*rÃ[ò endstream endobj 314 0 obj <>stream xœ37W0P°PÐ5Q0³P05QH1ä*T03PAS  =C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j SÌDu”2dè(lÙ"6mÚô¨¨¯Kÿfÿu¿þÿûÉUßÿ]û~û=8|£"á?Ï4�<~¶L \®ž �\bš;â endstream endobj 311 0 obj <>stream xœ32U0P°PÐ5T0²T0³TH1ä*T02 (˜eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ôü”›Býýú¯¿þÇã$VÊT}�ÿu<ôß^ÏU믽¾-Ú&ÂàÀÂåê©È#B/ endstream endobj 308 0 obj <>stream xœ31U0P0UÐ52P01W01QH1ä*T01Š(˜™(˜ê‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ó¡Âñ¡Œ™ŸASŽºç¾)%ó¶.ù·?tý¥×3ëvý ÿÂû¿Æÿúÿõÿúõ×^¿Þ¶¯GuÛômB1†Ü‡¹6~ý·?þõg§Ç�K×M ˜49ä7�ÓÁ¦†.WO…@.ð¬Oa endstream endobj 305 0 obj <>stream xœ37S0P0UÐ5W0Òæ )†\… f¦@A3S=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j ®ÄHeþGO¥\O®Šd›�*z«�ƒ¡�ËÕS!� à,> endstream endobj 302 0 obj <>stream xœ36S0PÐ5RÐ54V0"…C®BcS °�‚‰1PBÏ$«g¨�œËåäÉ¥ïé«PRTšÊ¥TÆ¥ïTÅ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{µsé;çç”ææµØÙqyº(¨-’øÌa+qØ�÷¥•ï×¥UGkƒkõ¶¾þÿ2Ì~ý×øØúWÓÿ†¯Ûú²êÛ´YÜMZB/;â]©_ý×ß:•‡›¹\=¹T=V endstream endobj 299 0 obj <>stream xœ36P0P0F`:Å�«Âs ô tADr.—“'—¾§¯BIQi*—~8PŽKßL:8+ré»DrÄryº(ð3بÂÿØPÏ`ÃÀåê©ÈE%) endstream endobj 296 0 obj <>stream xœ35R0P°PÐ5T05V01QH1ä*T01 €( =C �HÎåròäÒ÷ôU()*MåÒÊré{€I§gC.}—hC.ƒX.}7}gg7 7ÀÆFߨ›Kß9?§47¯¨ØÎŽËÓEAm‘ Û Ç 7¥Ì æ5å_û·õÒÿ¨Kÿ¯Ç¿Ì~ý5âõºÓ_Ö_Ûõ·ô×z0vÌ^·jÿÿ¿á¯öÖ~ýºîbkìõµ[æ–âz�Ô,ÚÌ"ÀÈ Àåê©ÈÁJ endstream endobj 293 0 obj <>stream xœ35P0P0SÐ5T05T0³TH1ä*T01U ›eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[°óC¾Ræÿ Ç߯ÿúë<”xE NðÿẦ½AuÚ¯þ_úõÿõ¥øuû¿Bqlö¿é¯cú~]ýÿjõרú×kÃ__�_*½>3X`ÉuÇVF.WO…@.R^ endstream endobj 290 0 obj <>stream xœ35P0P0TÐ5´T0±P01QH1ä*T01W‰›+ê�%�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶à9ãynǹå4¹É™ækÌ~í}Ýsߢýÿ½^†ÿ¿úõߎ¿á¿þ‡~½þo5¯¬¿ÿ:núúk³â¦/=(Ê™u+>C¯Y`�ÁVù×_ÿí�ýõoR)Ï^.WO…@.�NŠ endstream endobj 287 0 obj <>stream xœ340P0P0UÐ5T°4Q05TH1ä*T°°T )˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ "/Ǭþ=Ö}ûŸŸ¿ ÚÛä±4uLágÿ£°ElL�ŠŠ_zmoÖ`apàrõTäkâ8ä endstream endobj 284 0 obj <>stream xœ35U0P°PÐ5T05S01QH1ä*T0± (˜˜*Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶Ø‚{>Ë‚ƒì‹…9²/¹Å¹7—µ6ÓnW|TøÇ_K¿Æÿ¿.««[z°~ÝÖëÿ�øõ×õ—þÖ¹—F½Úÿ?ôÚêõëVÇV½þ²÷z´÷2Åć8¸\=¹;nGš endstream endobj 281 0 obj <>stream xœ35P0P0WÐ52U01R07UH1ä*T06U‰åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(ØI¶2ÄÌšQaðMîÞ½ßõÛÿ£‚í¿kß¾}¸Ç "•qKZAc¢®®Þ–ýÞhª¼¿l½téB„Â"‘i  \®ž �\ŠT' endstream endobj 278 0 obj <>stream xœ35U0P0RÐ5T05P01QH1ä*T0± ¹¦ Fz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-Øùààã… ·³-9óšrYKf{誯›ºêR×רª×<ºUK×í©­ú}ýߪÿWš>~½þzmÚþË×}ƒ~–®¸åíµrË’«ª%Û9Í„n´Ñ‘ple`ärõTä%HI endstream endobj 275 0 obj <>stream xœ37P0P0b3Ss…C®B3C�(�k¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ @ŽK´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[�°€Ç#C¿%M¡Â¡±½E ñ!‹D•ïC5¹ÉU¾/Í×~ùåûHÜÿÿÒü?ü»ÿÿß×[ïãß.QÑ׳÷–í¾e9ØvéKð^Õoû÷ÖÿÏ÷Þ½lõqùÿïãÿ30r¹z*r2å]— endstream endobj 270 0 obj <>stream xœ33S0P°PÐ5Q05W05QH1ä*T0± (˜Z(Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[›0GLè�Ón±¦ Q@›™}mú×õ_åcZ—'¬Þç¾ÿþþÛïk÷}¹Ã‡Ù7T¤ä:T˜20r¹z*r'ä: endstream endobj 267 0 obj <>stream xœ35T0P0QÐ5T0±P01QH1ä*Ñ aS=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô.ø È"'ø8e1‡Ú¡*ßކ¯®M_úå×µéë/½ŽY·ëzü¿�Wëׇþ[X²oÿÕº-;MCÿ†—$_ÏÌÞ›»äÖÛ–¹:†œ]‡9 01(p¹z*r›1D• endstream endobj 196 0 obj <>stream xœ37P0P0RÐ5T03W01VH1ä*T03U ›˜(éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠ÌÓ#ÿ_mG»CÂ6�D¶ý‰ùÿ¾ÞýýõÿÝu/v]ÿ?{—ü¿û™Uþÿ×.}iÿÿí·éKþÿß~+nòÿ·nÅûÿ¯;¾ôò¹¯—ÿï-ùÿ>Öþ#ƒ—«§B ¡²Nµ endstream endobj 193 0 obj <>stream xœ3³T0P0b3c3 …C®BS�˜ˆk¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAUqŽŒÌ¬ž&ìmÍuÒßþîÏÿÁ¿ý_}ýõe¯>g÷¡8Çæ�1òƬ ¤¿Éoû»îþýý÷ÿý¯)\úÿúú¥ÿ—>Ô÷>ÄÍÙ(°Ð3€A�‰ËÕS!� ¶Py endstream endobj 190 0 obj <>stream xœ32W0P°PÐ5´T!…C®BCC ¨�‚‘¥‚…ž!HH&çr9yré{ú*”•¦ré‡Uqé{qé;8+9.ц\±\únúÎÎn@n€��¾7P;—¾s~Nin^1P‹�—§‹‚ÚÆíï÷ÌZc\gÿo×ÿëk«®¯-Ù²eWC—«§B ?)î endstream endobj 187 0 obj <>stream xœ35P0P0UÐ5R01Q0³PH1ä*T0¶T ›eô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-üÂÜíÚìàçïË�þÿ¿´n§©ëÏòèìíÑ™¹ ¶ñ¨¶)&t`apàrõTä?UED endstream endobj 184 0 obj <>stream xœ³0T0P0UÐ5´T07U0³TH1ä*T07PA S=C�$�LÎåròäÒ÷ôU()*MåÒªâÒ÷*âÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�Ú¹ô�ósJsóŠ�Zìì¸<]Ô.‰1ç÷µÿÿk=N³öN̬¥[$έþùÿ?ôÿªÿõËÅÕV¦pâIý·ú?n|9€‘A€ËÕS!� ùŠ^t endstream endobj 181 0 obj <>stream xœ37S0P0UÐ5´T07T07PH1ä*T0‰(XX*˜ê‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔΥSš›W ÔbgÇå颠¶pZ€ä$.¶Dy‡Ã‡8 >Læwdû2ûR¾ç^µ¯{վ̾ö«6ùµÿ—òÿæ/ÿýÿßüïÿƒÀ?ß°Ýñÿïí[¾þûºëUošev·È–õÇ^ÊÛör˶«—~åßþ²í·7ﻦÛouÛ #r&¶gè&LˆHúɳE¼¦>»>ûõÖ·eqÚß_gÛpè0ƒ—«§B cm1 endstream endobj 178 0 obj <>stream xœ35S0P0QÐ5T05T03UH1ä*T01 (˜™)˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ÀÑA�…Ÿ…ŸÃV„÷…½&Þ—æk¿üºï¿öÿÚÿ—_×ÿÿÿÿ8ˆ‚¾aûÿÿÿvéÿß×_o½·;v˶K·½[¶ióèlbQbP`ârõTäwžGQ endstream endobj 175 0 obj <>stream xœ3·P0P0bsc3s…C®B3K ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶#þÿŸ6g–s$&$üÍ?tøÿ×ýÑÿ�Äÿÿj׉Ym)m‰ëÿc€Šéÿÿ08°p¹z*ru÷KK endstream endobj 172 0 obj <>stream xœ33S0P0b3#3 …C®BS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠ÒþäJ*Ãâ¶Ž´àÿ�àÿÛÿÿ÷ÿÿÿý‰‰õÿÿÿìÿÿ_ÿoß>ñþÿ3Ûìäïßÿ_ÿÿ�þÿÿÞÇÿÿÿ[ÿëÿõÿñõÿÖÖè·JÉŒg`ärõTäÝ4O± endstream endobj 169 0 obj <>stream xœ35Q0P0bSs…C®B Ì5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`Áñ&ö&c‰ ‡Æ½j_D_2½š7}éÿõ—ã®÷ÿ�Ÿ<ÿÿÌꪑøýû?.°l^`QêÿŒ \®ž �\{Rë endstream endobj 166 0 obj <>stream xœ3±T0P0bS3s…C®B# ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àB‚ÿºý`Ø£·?núúëK_}Yõ· Îyý²Á=~äŠô“+Fý�ÿÁ€Ã¦™ë?ƒ#—«§B |2H endstream endobj 163 0 obj <>stream xœ35T0P0RÐ5T0±P01VH1ä*T01 (˜˜(éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠Äô_mYÓ-Ý×·îÿºíýïï¥ÿ[ïíþîýïzÕÿ\ýß±¯ÿnÙÿþ.ˆÑŸý?ûÛþo ˜¸\=¹Î><- endstream endobj 160 0 obj <>stream xœ33R0PaS s…C®BS3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶p†ëžƒìMîŽr�lš¸—Ì›ôõeݼµ¥ÿÿo}ØúøÿÿÿO¬*úÿùºjðüÇ>M�þÿÿ&.WO…@.þRl endstream endobj 157 0 obj <>stream xœ35Q0P0VÐ5T05V01SH1ä*T05PAsc=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô69hLXdÐ|ˆß­‘ùï·{³ë×ÿû¶:N"ÎþÿéŽzþ¬E¾s¼Pço_°W}ü:»ýë®ùÇ;¾1)y¸·M¨"i7‡�„ッgL¹\=¹E @î endstream endobj 154 0 obj <>stream xœ35T0P0VÐ5T01W01SH1ä*T01 €DŒõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[àè�äx,‘½å‹‡ù‡{“«|_š/}u?níÿõ׿ߩ—Waÿiÿþû'Éòü×yÛ®çênÙ&á�pPÇ0"1±uÂ9.WO…@.Vj;í endstream endobj 151 0 obj <>stream xœ³0U0P0b 3K…C®Bs3 Ì5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶pY…É¿ù/ÿ¿ü7L}žýúûµ_µùëïG¿üºomþòk¿þ~Ý7?úå�pÿ—ÿþsxÎÿºï¿öËÿ—ñû¶_~][µÇoá‚Þ¶ÿÿ˜¸\=¹”ùSY endstream endobj 33 0 obj <>stream xœ340W0P0bC #…C®BK ˜k¦g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAá ÷ï ,µ¡³ËzT÷_ÿÿvéÿÿÿ·Mÿÿÿß­xTÎÿß™õ¨�>stream xœ³°P0P0SÐ5T°0R042PH1ä*T07Šù† fz†@Y ‘œËåäÉ¥ïé«PRTšÊ¥TÅ¥ïRÄ¥ïତ\¢ ¹ b¹ôÝô��Ý€Ü}o v.}çüœÒܼb ;;.Oµa6Íz;y7ýÿÿ“ÕàÃïÿÑÁ„³ö ã›ø© Øs²~>ÄaþÒà/Ëý%Ò&×Mþë¾ä׾髿¾ú[õ·êÿë¯ÿ×ÿÿ[¢óϬõÿëÿ¿ÿÿïþÿßõ¿××½Þþëíº[f»¯oÛ¾mú6¡½mMím‡‚bÌ7Š1HhzØc°“góÉC  \®ž �\rË~Ð endstream endobj 26 0 obj <>stream xœ34´T0P°PÐ5V044b …C®BC# 8PÀÈPÁBÏ($’s¹œ<¹ô=}JŠJS¹ôÃAʸô=@ª¸ô�œ€”K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+i²³ãòtQPU¸øÿS–@k’‚ƒÌ¬[·\ÿ„ÿÉë¾Þÿÿo÷õ¿¿×__wÿë¶}ÓþÝŠý½tÛôìmÓ^æ.Ýpé6gâ–mÞ‰Mé�‰]‡¹yt$tšv)01(p¹z*r6Ci endstream endobj 23 0 obj <>stream xœ3·T0P0aCCC…C®B3 €˜o®g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú ¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÇÎŽËÓEAmAÂc3ŽƒÌ‡ø ·ð»l_ÐØ¾ä^ïKó%÷&Wù¿}¶jûõk¿þ?˸]àvõýÿÿ'‡ìŽ]'á™üÿeýËú¨¯ë£â—^Û›™Yº®M›6mzA€éÒ×KÞÞ—¾ìÕ÷¾·Șî})Va—è¯×kjkX¸\=¹&Zcô endstream endobj 20 0 obj <>stream xœ31R0P0bc3CC…C®BcñÍô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨–Kߤ”Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-ômSd_¾|ùÿÿ¿££#“ÿƒÁ„c)_ûÿùº~ÿû?ðò!»�ùF.WO…@.å�P¡ endstream endobj 17 0 obj <>stream xœ37P0P0UÐ5T03S07SH1ä*T03T ››+˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-œÀ¥"ÂsˆŸãBÀ‡Ff~…×ò=÷ª}™ ¤¾îUû)ÿ¯~دÿ×þ~ÙÿÿÚÿ¿öÇû5XõÿÿW[}ÿßÿßõ¶ýÛ¾îïõ¼½e—n¯½ž«»eÛ¥ÛÞ‰-nEóD¤2±¶)&:‘6�A�‰ËÕS!� ºSõ endstream endobj 12 0 obj <>stream xœ³°T0P0WÐ5R°0T040WH1ä*T07Šù– æz†@Y ‘œËåäÉ¥ïé«PRTšÊ¥TÅ¥ïRÄ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�zìì¸<]Ô. �f:aÒÃù y‡Ã5ávÂQü-Võôº âÙÌ÷÷|i7oò¥Ú’ùþñþÞÕÿêÿªúõ?Þ·:Îêëÿÿ²õÿÿÿ¿3kýÿÿÕÿëý¿û_¾__ÿöÿ¶}Ûþ]¯ß²íߥ۱»Þ–]ºÍ}+šGuáhÕ#oÂŽŽHÌMlmãfãV\ÖÁÐÀÁåê©È]Ya€ endstream endobj 9 0 obj <>stream xœ³°T0P04æ& †¦ )†\… ¦ Q0ßÐTÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�йô=@j¹ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P��—§‹‚Ú…Gÿ|ƒs+ÄÊÿ'üì4hîþiêÍ£ÁÐÀÁåê©È)O endstream endobj 746 0 obj <>stream xœ35T0P0WÐ5R0µT0³PH1ä*T05 …�HÏ($’s¹œ<¹ô=}JŠJS¹ôÃ�Џô=€j¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚ÚÂéë'\±�ÿ[·ÿúkĵ¸ Çõ×öÿ›¾”{rˆPŒÊ^Ý]ou74ÝÈÐ1äæap`árõTä=ÌB endstream endobj 743 0 obj <>stream xœ35P0P°PÐ5R05V03SH1ä*T01U ›Y(Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[8%MŒÃF¹™ßÑ|ÁŒ Ï/³/í›ïõõ˾Nûµ÷æ¯ýú׿ÕQëö_ÿ¶kýÕZ­ÛžúžeZÛ„"–Á‚-š.]ˆðæÐem›Öt(*Ê…ûØôK/æ/Ù«º~ÉtïE;W/nñ3½�´«âpȡÉ, \®ž �\S¨UË endstream endobj 740 0 obj <>stream xœ37R0P0´TÐ5R°0T0³PH1ä*T0‰(˜ƒ¤ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨m ãÿÿDñDêüÌÖÕñ±õq»®ÇÿÃÀÃQðÆ«õ룮f_Û”µõ֯襷@(QwCÓ�„i­mb<" ,\®ž �\vOã endstream endobj 737 0 obj <>stream xœ37U0P04QÐ5R07S07PH1ä*T03Š(˜¥ô �’@"9—ËÉ“KßÓW¡¤¨4•K?¨ŠKߨˆKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-\æÇãar½¥&ñ!›œ€ïC–{MùœæKîM}iB¯_V…¯þúúemlÕ¯×/³ÿÇÖÇêíÿÿRõÿ¿ý�ñQÿ¦]¯¶júÒÿK÷VÅ.Ýõ+ºô…î–휹K·5ÝæÐm:Ì# cÈÍæ'•ÀÄ Àåê©ÈæíQ} endstream endobj 734 0 obj <>stream xœ35P0P°TÐ5R05Q03SH1ä*T01U ›Y(Xêå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[8-MˆCNð`{ ‡yËì ¾/«€(><ÞåþÚ_õ¯ãvýÿúk}|ŽÊ´#ª·Ö]‚C‘L¦btûWW×¾¿ÿÿûÿ¥³mÔÿ¿�÷tz¨ú+ÀÕ)>v鮨±[‰MÜIÜl\ L\®ž �\kŽMR endstream endobj 731 0 obj <>stream xœ36P0P02T01P06U0³TH1ä*T04Q‹[¥ô Œ-õ,’s¹œ<¹ô=}JŠJS¹ôÃ�ª¸ô=€Š¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚Ú¢Ö–/¯ÿÿ“Ü/zýõõ×K¯íÍ^ ¢Œ \®ž �\•ó*ç endstream endobj 669 0 obj <>stream xœU‹½JÃ`†Åñ\Ź�öKÚ(šZ ¡Pqp�vQ7kð§‹`s/ŽBÉÒ,BÌ8dÉ�!�!KM áËñ|:yÎûž‡ówb¢†}ìôLx£ÃtžjØ3‡Øïê¿[Æõ&6{ŽÏ�›[—|âL��˜,,änz¥ƒ¶1–5ãv1 ;¼±Ü»Íúþ‰Æc°§8„¯ùEZ¼†Ÿe•î¶,É •›,lR±¸´U[ç–ª¢*È¥’(Tj(£H2(c“¤ˆTȆþG�üÑW¬¥G5%äK�á+Å$E´嫈3È¿óCä�Ãåð‘ì^’�ˆ•ã|ÙÝqî8«ýÛûé�çðuÖ·? endstream endobj 648 0 obj <>stream xœ36T0P0RÐ52U0´T07UH1ä*T04Š(åô A²@29—ËÉ“KßÓW¡¤¨4•K?¨ŒKߤŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(ü™ÕúŸøSÏ ÀÈåê©ÈB>A endstream endobj 620 0 obj <>stream xœ340P0P0UÐ5T°4Q01QH1ä*T°°T ›˜*˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°Ùá–1�#³âòuÍ¥¸>̲á“ëï�pdû"`6¹Fí‚ÿ’[¾/Ù.å/»T«viÿ–ùžûþnÙ7WýÛë>k_Ûu÷×þ®ûUíë(ò9;níߥÙ/Íßo›ži¿Ëwé-ßu·|L¶]ÊÕ;äÛzÛ³™3Ç ‰'L"%Ê`›"Û†Clb>stream xœ33V0P0bsc3 …C®B3K ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`ÿO¦ç ±b�kãï/ÿ?~ýÿ¯ëöÿ¿þú“äý¯_¾þ=êeý׫z�ÿ½g¶ÙÉÿ� �ð‹ú¯¯ÿÇíÿúúëÿCG¦³�g`ärõTä`µMÚ endstream endobj 609 0 obj <>stream xœ33V0P0bsc3 …C®B3K ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§ûÉ›Æâ ŠÒ÷îÏ_öÿêþ_ÿ^ÿ�ýe×ÿ«ú¿ÖÇf_z©ï²W¯‰ûw€c!wÓ³„•ñ¯¿þÛ�Lpéá]Ï ÀÈåê©È†œIŒ endstream endobj 583 0 obj <>stream xœ31R0P0VÐ5R0¶P05SH1ä*T06 (˜Z(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ðüàƒÆ‡r_òپ̾öeöÏý_÷ÿ¿”ÿÿÿÿïÿƒÁ§¬­ÿÿÛ}ýÿûØu_ÿÝŠÎÌ]ºmÚaÎÄŽƒF.WO…@.a¶G® endstream endobj 580 0 obj <>stream xœ³0T0P0bs3sC…C®Bs# ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ô.‹1yùo>½ØUÿÒüßd±öë«ûqxˆß/ã÷M…¿|ÿ/¹#Ö/ÿU/Æ ÀÄåê©È+X· endstream endobj 577 0 obj <>stream xœ31R0P0VÐ5R0¶P05SH1ä*T06 (˜Z(ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[à8c‚ãCöÅ�+™«8ô&Uy/ý¿ôÕuß,û¥ÿ×ǹÿ°8dæøBáÞäÚ˜ÜËõá÷þ‡ÿrµþÿÿí¿þ×_zoÛõK·×nÙ&áÍãt#Â`ƒ—«§B "÷Fç endstream endobj 574 0 obj <>stream xœ31R0P0QÐ5R06W05SH1ä*T06 (˜Z(˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[cÆô°õÁ ÿǯ׉Çèų>þO–?hþ’“ø‘³ýPþ²_÷äÿ¾ÿûÿù¹6ñÿC½ ¤ \mËßM/ݶwé†K7YÛ´yt ¸\=¹ÂQD† endstream endobj 571 0 obj <>stream xœ31R0P0bcsS3…C®Bcc ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶ðÌA…Ƈ싛ù9ò—}™})}دGüm·ÿÿ™µô0w¿÷ïµU—^Çêêm›Ó£3Kvy{mÙ«ï¨/·ë¥ûF.WO…@.�Ý=ã endstream endobj 560 0 obj <>stream xœ³4Q0P0b  C…C®B c ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔvÄÿÿs…{V³·âœ^Ö¶Ñ_÷Ñÿèÿÿ�äÿÿj×É'WL–H�­ÿ�üs,�ÿÿƒ¡�ƒËÕS!� ƒcS endstream endobj 557 0 obj <>stream xœ3²T0PÐ5"#sS…C®B#  °�‚©¥‚®�ž%HVÏP!9—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷jçÒwÎÏ)ÍÍ+j±³ãòtQP[›yý7·üÿ?Í’MUæì æ{_Ú·7|Õõ×/ ý­_AØ„D}]êàè¹J´�‹A�‰ËÕS!� ';1 endstream endobj 554 0 obj <>stream xœ31P0PÐ5TÐ52P0¶P03SH1ä*T0¶TIX˜)èèY‚dõ ’s¹œ<¹ô=}JŠJS¹ôÃ�ʸô=€ª¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o ù\úÎù9¥¹yÅ@-vv\ž. j —l˜¿þ×anùÿÿÿ+Äoh>d–ï7¹*núõõ—^}ýe×ß0»ý×_ÿ­C#öÖí\´¡ù±·÷K]VNMÓ€iGt$48¸\=¹×ýJ‘ endstream endobj 551 0 obj <>stream xœ33R0P0RÐ5T0µT06PH1ä*T05 (*éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�r‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô–åX~p>¨È&�Ðüô™à&^iƒ¯¹,YþfFq}ízýjñ_­Ç¯Wý[½4týºÕÿ¯†ÿzµÿzèÒ»–þ� ÿ¶ÿeÖúø‡UËsM¤8¸\=¹�Ek endstream endobj 521 0 obj <>stream xœ346U0PaCcC3S…C®BC#3 ˆˆoªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá µ\ú@¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¤ÇÎŽËÓEAmAKƒB¯‹���‹ƒ„sŠ@Bó!…/—/Zšøùsœ±¢É�j|ßM^ò{ÁZÖzÿ—Qá/3�ôqÙ¯ñÿCÿ‰ÿ@Š082Y «ÃÕ¹þÿÿ \®ž �\µ„ge endstream endobj 491 0 obj <>stream xœ35T0P02Ɔ &Æ )†\… † A×È@ÏPA×@ÏÀ,L’s¹œ<¹ô=}JŠJS¹ôÃ�j¹ô=€J¹ô�œ€—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶A×Öb¿ÚÊÜÜäÿ 0ÛäË£?³–nÝÊ ÀÈåê©ÈÌ*ù endstream endobj 488 0 obj <>stream xœ35T0P0bs3#…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶p·ôåËÿ/ÿ®6ÿÿÿÿÑ@Vôÿÿ¿@œK Ïý@Á—ÿÿµÿq†õËÿÿÿæ/áSWÚ¯éšíµ4õ\ÁÐÀÁåê©È=FL endstream endobj 485 0 obj <>stream xœ35T0P0SеP01Q0³TH1ä*T0¶ (˜›+˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[pmëå¯_ö{Ù¿¶HxÿºŽÎÁy´ëÉUý†.WO…@.fsC� endstream endobj 482 0 obj <>stream xœ35T0P02RеP0²T0³TH1ä*T0 (˜›eô �r@"9—ËÉ“KßÓW¡¤¨4•K?\ÁœKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææ+˜ÛÙqyº(¨­¬‰ÿ?M½01(p¹z*rœG& endstream endobj 446 0 obj <>stream xœ35T0P0Q°T01S05RH1ä*T01ŠE�Lô ,ô,’s¹œ<¹ô=}JŠJS¹ôÃ�j¸ô=€J¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚ÚÂ9¿ü‡�å�>eMÂãßúÁÐÀÁåê©È´þ3Ô endstream endobj 443 0 obj <>stream xœ35T0P0VÐ52Q0±T01QH1ä*T01Š(˜Y(ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[Ølð`ƒÃA…CUâQ-î5ñ¨í*›œ|ùÿÚ/ÿ�àÛîë×ÝŠ]w˜³0*¶tñ�XfÖÇÿݯYÍúfâCö_~μ¤°hŽÂ½õ—�—5lÊÚzëíÒÃÜE+¶D‹nm“ˆHLWbP`ârõTä+öUï endstream endobj 440 0 obj <>stream xœ35T0P0bsc…C®B ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶sE–ËÝþO®ªm›ubÏ�i—nÿÕݲíun-�´]·mû­ë{mK*íó½¾Ì¿}ioô¥ºõa_f_ªYubëÑåÿÕVš20r¹z*r4óCx endstream endobj 437 0 obj <>stream xœ35T0P0bc3#…C®Br�õ t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-œ’Qàðaž¸ß¿½É±¦+¾þÿÿÿçQ“Ç?M½þ£�9Ùþÿ¿-`bPàrõTäŸÐ?* endstream endobj 434 0 obj <>stream xœ35T0P0UÐ5T01Q01UH1ä*T0¶ (˜˜)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`ç…/æÍëbû"�ß"}©Vûå×}óã׿ßñµÿÊSKÓø¿ûâÍ.ßÏ¿uÛ;±õF¢n×­[‡¹yt$48¸\=¹Î\;> endstream endobj 431 0 obj <>stream xœ35T0P0RÐ5T01V05UH1ä*T0 (˜š)éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-xvÐÕ¶þ?X¬›S¯¶2Åþ?üdý|ùÿÿ»×^ßú°e›vvv6�ŽA#ƒ—«§B .;Í endstream endobj 428 0 obj <>stream xœ35T0P0TÐ5T01W03TH1ä*T01 (˜)ê�ä€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶SAjåñ“«ÞO¬ÿ'6pøËþÐÞñcÍ«8óCùË~Õ篿¿úûÿ÷ûÁ âã¿í�]=ûeÙƒé<ªG‹_VGoØÖÌ-p¨�ƒ¡�ËÕS!� Î`J0 endstream endobj 381 0 obj <>stream xœMŠ=@@ûïß ¼}ì -+±…„J!*” ÂýÜÌOgŠ)&ã Sª£Í¨gÅF¿Ñ0a)ÕF9§E€„†Ç~.�þ} 5HÑ–TˆfDð¼?®¿QvxSÑ# endstream endobj 378 0 obj <>stream xœ33W0P0b3C3 …C®BS�˜ˆk¢g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAiáæ?³ZÛ¦ÿG ëÿÿúõÿÿßúÿ×ÿ{ÿ�î‡5bJû01(p¹z*rÂXA× endstream endobj 263 0 obj <>stream xœ33T0P0bSK3 …C®BSc ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶`§�úk……ÒQñ×ÿí­�A,Ô›ü?êzüúk«¯}½êkÜþWÓ½_¯Š_°«)P>€‘A€ËÕS!� ÆÞCl endstream endobj 259 0 obj <>stream xœ31Q0P04PÐ52U06W07UH1ä*T02 ƒ$@XÏ$ $“s¹œ<¹ô=}JŠJS¹ôÃ�ê¸ô=@ʸô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P��—§‹‚Ú‚ÅÞ ««·õÒõµ%û½¿ì�Âø×ñÿ/ýÿÿã×ÿÿÿßOýÿÿïþÿ÷÷ßÿ „ßþçûþ¾vïïÛ·ïçï.WO…@.ÖK  endstream endobj 256 0 obj <>stream xœ37U0P0UÐ52V02LR ¹ Ì@¢ ææ ¦z† I ™œËåäÉ¥ïé«PRTšÊ¥TÅ¥ïTÄ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔršÄ¸ã `ƒ‹B…ãCáÞ‰'Wr8î1˜ýrßúe¿òÿçÿß_¿ÿÿÿÛÿ!àõõÿÿöÖÿúúë­þoï-»½·ìHd=‘!¡ú°#îЇƒF�¡*ÿ ŘÚ`apàrõTäoEWÖ endstream endobj 253 0 obj <>stream xœ35V0P0QÐ5T0±P05UH1ä*T01 (˜š)˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶à¹£ïNŽØ‚öÖ‹~�Ì/~ù_~ýåÿ±ÿõ÷yOœR[ÑÂ+i ±¡Æ¶}ûöímîIŸÐóWÜ ç¬µGº}jâ±ïµ¿¿Ö®¿p©M¨™eYFˆÂ¡‡¤`hààrõTäçeH{ endstream endobj 250 0 obj <>stream xœ33T0P0QÐ5T05S05UH1ä*T05 €DLô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[pg‹‡€2‹œ@•âäC,U¾/Í—üò}]åÿ}õ××õ¯þÖ×Ëÿ—[põÿÉUÿ«ÿOÈê½|ëþ¶é¿3s×ÝŠNÔ1ºa¤ep4±µ™uB€ ƒ —«§B P×B endstream endobj 247 0 obj <>stream xœ33W0P0QÐ5T03R05UH1ä*T0µ (˜š)˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶`Á.㎃̇ø9Ú4ªXxªÉM®ò}i~ùu•ïÿµÿ—ÜÿÿºþÿŸòÿ@ ¶:þÿÞ²ýïãßÇ®ûºmÚ­èÌÜ¥E$¶ˆM8˜Ø:!À…Á�…ËÕS!� ÷FK endstream endobj 243 0 obj <>stream xœ36W0P04Fæ †æ )†\… $¤ ô tADr.—“'—¾§¯BIQi*—~8PšKßL:8+ré»DrÄré»é;;»¹66úÞ º@çüœÒܼb b;;.Oµe5/�àè?ß [@ÐÀÁÐÀåê©È½£%ê endstream endobj 240 0 obj <>stream xœ35T0P0bS3C…C®BcK ßÄ5Ó3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôv ð÷O½¯°ÿ?ð\är÷ä�m ˜¸\=¹V>stream xœ37Q0P0SÐ5R03W°4PH1ä*T03 (Xõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÈq‰6ä2ˆåÒwÓwvvrllô½t�2Îù9¥¹yÅ@-vv\ž. j gøñè®±g‘*h~aÚò+Ûy­Èã Uœ/ÙUù{_¾TÿÒn×¾ý—~¿^ÿ×týã¿õǯÿÿÿ¿fÖúÿõ¿'ä̯_^_ÿöoù½Ýß®ÿݲíߥ۱[vdæ®;Ì™#á�´mÛ¶ ׿fãfãbP`ârõTä7Vá endstream endobj 233 0 obj <>stream xœ37Q0P04fF  )†\… ¦ äé*èèX�…©Br.—“'—¾§¯BIQi*—~8P-—¾P)—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQPÛUXçtëD†ý‚à9ëåîOYÓ®08°p¹z*rƒ�GÐ endstream endobj 230 0 obj <>stream xœ³4P0P0UÐ5T°0S03UH1ä*T°0T ›™)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-h1ÈRl‘äyòÿÿ?_× §ýw¿û�üúÿý¿ÝÿöõéÝú7õíÒêDÍ0éÞc[ÇHÄ´…mrP`hààrõTä}¥T¨ endstream endobj 227 0 obj <>stream xœ³0T0P04f– –& )†\… ¦æ@¾ˆkh¤g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@µ\ú@¥\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmÁ•³àCKìdcI±ÚñÖ=aµ…›ÿ¦lþÿ‡Á�…ËÕS!� \®O? endstream endobj 148 0 obj <>stream xœ35Q0P0UÐ5R0±P07PH1ä*T01 (˜)˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ØìP¡�Ý"ßRãpÝ‘¹NÀqëËýžýž_ëæÇß_gþ÷ÿûûïšúT¿Oüð-‹é›[·ÂÁjö ßä$*òÙ>II �pšŸíûíûµ¿yÿïÿ÷Úö¯Ù¥Ù™~jÓ{5óêÎl ‘hmæjljà`hàrõTäõ�PG endstream endobj 145 0 obj <>stream xœ3±T0P0VÐ52T01W01UH1ä*T01Š(˜™)ë‚$�dr.—“'—¾§¯BIQi*—~8P—¾P—¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[¸‚[±ŸEŽCÂ]º¥â°Ã4Ç®(_[õµ9Uµù˯ýƒïë®W½-_»e··›@"ë…$±+þíÿûöû©†£Í¾ÉIªpgh_âèòaBþòKù?–ÿÿ¿ur(PÓmï\Ý6¡Ã< 6qó8�Hè`hààrõTä4U™ endstream endobj 142 0 obj <>stream xœ3±T0P0QÐ5T01W01UH1ä*T01 …ÍLô �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[ÐÖ¸‰CNð`{ ‡ù‚Ù—ò›óý~çÿÿ»ÿÛƒ=õÿOd\Vlœ¡Ô~ÈX¸E¼E|é˪¸éë¯ÿŒÿýÿ­'W[¿û.Ýõï†çÖÃ< ‹65�°™Gƒ¡�ƒËÕS!� F¸H endstream endobj 139 0 obj <>stream xœ3±T0P0bc33…C®Bc ßÄ5Õ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶àYc‡B…ãC9‰*Þ—æ f_Ê¿}ißüè—–?R¼}¿þ§©gná×__×Ç/]zmoffféÒ¥KlÙu ¸½—¾ÔÕ÷¾ôeº×–éÎK»~04pp¹z*rrœIˆ endstream endobj 136 0 obj <>stream xœ³0S0P0QÐ5T°0T0³PH1ä*T07 (˜Y*˜èå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠ä8ÿÿ“+Š<¦çXþ»þ–ÿz»îë¶}ÓnE'–IEó6e‰ØpM" ’m¯ƒ—«§B Ü`O¢ endstream endobj 133 0 obj <>stream xœ3¶P0P0RÐ5T06R03TH1ä*T06PA3##=C �HÎåròäÒ÷ôU()*MåÒ*âÒ÷ªáÒw pV0äÒw‰6ä2ˆåÒwÓwvvrllô½�º¹ô�ósJsóŠ�Zìì¸<]Ô´–ÿÿõÿßú¯×¿^çn }üäJðÃþÿpð°L•Þ­ßõözvۥâm" ,\®ž �\ü¯Ay endstream endobj 130 0 obj <>stream xœ3¶P0P0VÐ5T06Q01UH1ä*T06 (˜˜)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³�ãmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-äeåfá-èç’z!`øÒnò«¿…ûßÿûá˜oðƒ¤³‰oäߨ®ÈgûÄÝ>áB��Ùûòûû¿‡í�º\í�pˆ«Y`…„C—«§B ·>stream xœ31V0P0VÐ5T0¶T01UH1ä*T06 (˜˜)ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶°ÙÀÃáCŸ@…‡Á—Ù—ò½/åG¿üúeýý¿ùñÇÿYÎH«rµ~ÿýC·ÝÛ»ënÙ¥ÛÞ¼-Û$6$‰Ih04pp¹z*rª]<» endstream endobj 124 0 obj <>stream xœ3±T0P0VÐ5T01¡C®B#  �‚‰™‚±ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ@Ý\úÎù9¥¹yÅ@-vv\ž. j Î0dáçøÈÞÂ!QåûÒ|ɽÉU¾¯ë_š¯ýùuýÿ?åÿÿÿ?¹êúßu_ÿ}½õ>vÝ×mÓnEg&n;Ø‘$æØy€…Á�ËÕS!� îÌAI endstream endobj 121 0 obj <>stream xœ32W0P°bC C…C®B ‚@ÊBÏPA×H$çr9yré{ú*”•¦ré‡e¹ô=À¤S€³‚!—¾K´!—A,—§‹‚C}C}ÃÿbË1p¹z*r*2 endstream endobj 118 0 obj <>stream xœ35P0P0QÐ5T01¡C®B#°°¹‚‰ž!PH$çr9yré{ú*”•¦ré‡qé{Õpé;8+ré»DrÄré»é;;»¹66úÞ@Ý\úÎù9¥¹yÅ@-vv\ž. j l%t*_,P¾àûPõ’ÿúxïÿÞß¶fæ^øãÿÿÿ“CþÓXýwë޲ݙ¹K7\:Ì#tc�Á†C':8¸\=¹•õ<Ý endstream endobj 115 0 obj <>stream xœ35S0P0VÐ5T05R01SH1ä*T0± (˜˜+ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÎã iŽ…Øä™«|_(ÜÛ¾ä¾ÿÚÿk¿üºÿÿ¿ìÿÿÿ?emýÿÿíÒ_o½�άßp(:3±™Eìhbk3ë„s \®ž �\ƒ@B& endstream endobj 112 0 obj <>stream xœ33R0P0bSKS…C®BSS ßÄ5Ñ3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§gC.}—hC.ƒX.}7}gg7 7ÀÆFß[A(㜟Sš›W ÔbgÇå颠¶H²]�õ‡�Â9ÁOU,Ÿ²BfßÛïýhöëÿëÿÿú�Ï “þÿƒ¡�ƒËÕS!� KÁAm endstream endobj 108 0 obj <>stream xœ33Q0P0UÐ5T0µP03SH1ä*T05 (˜™+˜êå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶ÀñŠåv….¦‡lⱇ¿p´ÕšÔ²ü“÷¾ú«þñ÷ßï÷“‘YÁs)«³A¢Âù”Ãö ßäî�ôáŠéæÌ'RWŸ0å8¸£2B&¿ìßûwûþæ­Í[¸4Q#Q“MÔó ߀D'6®Æ¹ Œ \®ž �\7N2 endstream endobj 104 0 obj <>stream xœ³4P0P0b 33S…C®B C�(�kªg¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ @ŽK´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[ÐÒ ÐÆÆÆÑÁ;Áñ!ûòEEn‰wfu;šïòßÅõoþ¥ýÞ¿ê¬_ÿ_ÿoÿÿÿëÿã�jŠ¢¼ÿÿ7p04p¹z*r.¬Q3 endstream endobj 100 0 obj <>stream xœ3²P0P0b#3s…C®B#C ßÄ5Ö3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g Ç%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-6¨_þÿw|›˜ýÿÿ?å�ʪýþ üµ˜ë\ÃàÀÂåê©È¨: endstream endobj 690 0 obj <>stream xœ36U0P0VÐ5T06T01QH1ä*T0² (˜˜*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶f‡÷<ᣥ׹[OØSÿÿÿÿ“ÿ[ø™ùw8¶_ýò×¼÷ßßÿOãôÿ/YXàj[¶»tÛ´[Ñ< Žè,`bPàrõTäjÞ;Ý endstream endobj 657 0 obj <>stream xœ3±T0P04P05W0¶P03WH1ä*T0²Š‚Å ô LÍô,’s¹œ<¹ô=}JŠJS¹ôÃ�ª¸ô=€*¸ô�œ ¹ô]¢ ¹ b¹ôÝô��Ý€Ü}o] Œs~Nin^1P‹�—§‹‚ÚÆ ¾ìb³ãeMŽÈle`ärõTäÁd!ó endstream endobj 654 0 obj <>stream xœ3³T0P0VÐ5T03P°0RH1ä*T05 ¹Æ Æz†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-8þÿ‰Ô×ÿ¸ÁÉÿ-òË_þ?úÿÿÒÿžž«þªn˜t#tC¢n3‡Ž!7�ŽÁ&‰K L\®ž �\­÷Kþ endstream endobj 651 0 obj <>stream xœ5K½NÂP6Žç\Î \n/­â@(›†ãà@ÀÝ€†ú.Ž&†EÒwèÒ�¡С‹) 7×ñ„ïœï;ßùk¸è ‡¢îzx©Ø=)xA¯ÁSëî5z5Um¹Œ§Ð@=œ¿.žA>ðÈÛÿ3�í¾� dg À‚ìJßïrÛo6eˆ‚7¾ž,¦³7þiµ èàÕŬw¿eZë¨,M¦õÆl3¦��YD»bWDQÉa2Ú�±[2”QLl‰a+=!¬t•2íûžR¶¬+»¤„#ÌGë¿u>ŠÃßcþ¤_s¦Ë$ɇBÔ¾Ÿgx7ÞÁ)˜ endstream endobj 635 0 obj <>stream xœ341Q0P0UÐ54¶T04¶rR ¹ �Lc Ó@$lªg–Rɹ\Nž\úž¾ %E¥©\úá …\ú u\úNÎ †\ú.ц\±\únúÎÎn@n€��¾7Ð.}çüœÒܼb�&;;.Oë(¾O®Jøþ¦ñá�m'äxXn+Tdî°Oø�¸wÃï¶ßµîÝ~÷wû¶ßÛo¿’·o»½ úöíû{÷þ“@ê~>ηmÛvÝz«·¶^zí ÈœX]½ÆLÕ¥/õ¶.Ù«75SoR”÷ª—,»bvyf²^bÙʽ„û"óÁ¾Jì�l&r ûZ³—®™-ëÀÂàÀåê©ÈL†] endstream endobj 632 0 obj <>stream xœ344R0P0bCSKs…C®BKK €ˆk¦g¨ k g` ¦ ɹ\Nž\úž¾ %E¥©\úá@¥\ú@•\úNÎ †\ú.ц\±\únúÎÎn@n€��¾·‚.PÆ9?§47¯¨ÅÎŽËÓEAmƒþÿÿõx?ÛpSqÓ>nö×ubòkÝÿ¿öÿ¯ûq@ú?��ßæÿÿÿ䊴Š4oýÜà‰ñÌúÿX¸\=¹_^Ù endstream endobj 586 0 obj <>stream xœ36T0P0acS…C®Bcr�õ t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-´s¬ÿ·?þõWlD'�ƒ—«§B mÃ1¡ endstream endobj 518 0 obj <>stream xœ³0U0P0VÐ5T°0T03QH1ä*T0· (˜™*ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠”¸øÿŸYÙl›Þ¶qÿÝõõöúØ×[ïíŽÿöúzÞÞòu׫ÞÖ… âÿsõáâ�ÿ®¿DÿoAè†.WO…@.„gN endstream endobj 515 0 obj <>stream xœ³0T0P0WÐ5R07V°4QH1ä*T03 (Xš)˜ëå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[sE2HJô!óAöúšØ5¾ porç^íËùí/ïçß}ùÿÿÿúøÿïö†]ßú6ŒGõØ~ïµz[€`CÓ‰4žá‡ì “6¨äÕú�ø°}ûö ¿oÿÝ÷ïïÿï¼j~ÕÚÍÿXÿëÿ¥u¾á¯ö–­n™vhíõÄ¥.D³ Ý\ãº1"1±µ�[qnœ£k#ƒ—«§B š i endstream endobj 415 0 obj <>stream xœ35S0P0UÐ5T05P03UH1ä*T01 ¹f ¦z†@9 ‘œËåäÉ¥ïé«PRTšÊ¥TÄ¥ïTÃ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{usé;çç”ææµØÙqyº(¨-K�âžÇÓÔ÷”ažÝ®×ëvÄèíÐãžÃkÿžÿPŽPç°ç°SKæoâý0û¡ùÕ/¿Ãû·ÿ¿ÿ/® ùåãûÿV_ó Z·�S÷ߥ™9&Ûx„n´¶m8t˜µYƒçƒ—«§B FùIÀ endstream endobj 412 0 obj <>stream xœ31P0P04QÐ52U05P07UH1ä*T06SK€$õ AÒ@29—ËÉ“KßÓW¡¤¨4•K?¨ŽKߤŒKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææõØÙqyº(¨-¸¾Z¶l}ííí«·õÒkñWÿÒߪëë�Ö¯¿þ HÑÿÿ]ÿÿÿ4�ÿÿÿ}ýÿÛÿýö?ÿÛ÷†.WO…@.ÀhNç endstream endobj 333 0 obj <>stream xœ37U0P0UÐ5T07T05QH1ä*T03 …MLõ �r@"9—ËÉ“KßÓW¡¤¨4•K?¨ˆKߨ†Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷êæÒwÎÏ)ÍÍ+j±³ãòtQP[ÈŬ± pBÌþÿfMi®-xøˆÿÿõéÏÖ¯ß.ýÕ¨NÔ�¾aà½1Æô0÷„›Kæ(04pp¹z*rlÆL endstream endobj 330 0 obj <>stream xœ34¶T0P0VÐ5T046U°0RH1ä*²�€Â Æ Æz†@Y ‘œËåäÉ¥ïé«PRTšÊ¥RÅ¥ïTÄ¥ïà¬`È¥ïmÈeË¥ï¦ïìì䨨è{µsé;çç”ææƒôØÙqyº((=ôØaøÿÿ§,�+¼i ®*ö—9nÞ^õû÷õòuï¿Çþz÷÷®þþ½å¯·ü¿^·Ûÿ¾÷û·á•çc×þ÷Ûý·lû{¿éß¿ízïãÿµz· È�Ûþ…ÿÿ¨áûø/¿¯ÿö­¿ cü» a8°08p¹z*r\|á endstream endobj 217 0 obj <>stream xœ32W0P°bC c…C®BCr-ô t ô ,�ÀÂT!9—ËÉ“KßÓW¡¤¨4•K?¨”Kߨ’Kß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨mÐQø§?9d?�Ný0}Èþ±fÖÒ‰, \®ž �\á*^ endstream endobj 213 0 obj <>stream xœ36P0PÐ5UÐ52P"3s…C®B#S�„…¹‚®‰ž%HVÏP!9—ËÉ“KßÓW¡¤¨4•K?¨ŒKߨŠKß)ÀYÁ�Kß%Ú�Ë –KßMßÙÙ È °±Ñ÷VÐÊ8çç”ææµØÙqyº(¨-pÐQøïÿ?ûáãÿÿÿW8òDmÿ }ïûÿÑÀŸŸ—�.ý[7eÖÒhNÝ-Žè,`bPàrõTäêUD] endstream endobj 97 0 obj <>stream xœ35Q0P°TÐ5T05T01QH1ä*T01 (˜˜*Xêå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶h>Ïkm'y�ëO®,‘Xöþjýÿ»þ†ÿÿÿz= óõÿõUÿ¯»e°oŽªUÛ·CÜmÚͬv \®ž �\t Bc endstream endobj 94 0 obj <>stream xœ31V0P0SÐ5T01Q01UH1ä*T0¶ (˜˜)˜éå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠¶pÁ� ÷…æ Gó¥U¾/«¶/ý¿ôõ×ү׿þ›~üÏãšÒÿj«ÿ?á±_÷õֻ饻޶l»�¨cpˆ›Çé`+ƒ#—«§B à¶?m endstream endobj 90 0 obj <>stream xœ3±T0P°PÐ5R05T03SH1ä*T01 (˜Y(Xèå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï­  ”qÎÏ)ÍÍ+j±³ãòtQP[°àŒ�€�ò9…{“+<÷ê/û²Wûê¿/û¿ìÿúïem}|üë_ÿ—^ÿÿÿÿ%o ñoRÿÿ×ñ¿Ö_úé§iÔ×_¿nÇ{W½Õ½tÛ;GuÃ!n§ƒM  \®ž �\ÀOÊ endstream endobj 87 0 obj <>stream xœ35T0P°TÐ5T05U01VH1ä*T01 (˜˜(Xêå€Dr.—“'—¾§¯BIQi*—~8P—¾P —¾S€³‚!—¾K´!—A,—¾›¾³³�`c£ï ÔͥSš›W ÔbgÇå颠Äô_mͦÜ­oô×¾¾þzËö¿úõþ^úúë­îïÿÞûKöÖíŽ}}éÿ¥÷7Ö¿þ¶ëßþ,&.WO…@.º•< endstream endobj 83 0 obj <>stream xœ35T0P0b 3C…C®B3 ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]ÔvèZü4�ýd¯°ø?dÿÿÿOSúòÿÿ?yvòÿÿÿ޳²žm¾ V0gÛâÉ¡[¹\=¹CÛC® endstream endobj 80 0 obj <>stream xœ35T0P0b33C…C®B ßÄ5Ò3TÐ5Ð3° S…ä\.'O.}O_…’¢ÒT.ýp R.} J.}§g åmÈeË¥ï¦ïìì䨨è{+èeœósJsóŠ�Zìì¸<]Ôvªq_(ä{rÕvÏô />Üoûûwÿþúüÿõûëÿýýÿÿþøõëÿÿ¿u{ë}ý²ÿËÞZ}Î o‹yM]+Ms48¸\=¹µÑI  endstream endobj 588 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 49/LastChar 50/Widths[ 30 30] /Subtype/Type3>> endobj 754 0 obj <> endobj 91 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 46/LastChar 118/Widths[ 27 0 49 0 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 0 0 0 0 0 0 0 0 0 0 0 0 0 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 43 0 0 0 28 0 0 0 0 0 0 0 0 38 38 0 54 51] /Subtype/Type3>> endobj 755 0 obj <> endobj 570 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 48/LastChar 58/Widths[ 42 42 42 42 42 42 42 42 42 42 23] /Subtype/Type3>> endobj 756 0 obj <> endobj 543 0 obj <> endobj 757 0 obj <>stream xœ]O1Â0 Üó ÿ )ºT]ÊÒ„€¤ŽSe¨¥éÀï!iËÀp–Îw'Ÿe×_zv ä=z|RëØDšý‘` Ñ±¨`¦�•‰“BvW^ï@ð5�]ùMO$õ©.«j ¡74�5�$¥ÚÆÚV›?i vsž�m�RÊÿ®äh.±ß\b$N¥ii’ 8¦ß3Á‡œ‚/ÄBSg endstream endobj 86 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 35/LastChar 124/Widths[ 51 0 0 0 0 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 0 51 51 0 0 0 51 51 51 51 51 51 51 0 51 51 0 51 51 51 51 51 0 51 51 51 0 51 51 0 0 0 0 0 0 0 51 0 51 51 51 51 51 51 51 51 51 0 51 51 51 51 51 51 0 51 51 51 51 51 51 51 51 51 0 51] /Subtype/Type3>> endobj 758 0 obj <> endobj 391 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 48/LastChar 110/Widths[ 35 35 35 35 35 35 35 0 0 0 0 0 0 55 0 0 0 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 60 39] /Subtype/Type3>> endobj 759 0 obj <> endobj 760 0 obj <>stream xœ]O1ƒ0 Üó ÿ ¡•è‚XèÂЪjû�à8(NÂÐß—èÐá,�ïN>Ë®¿öìÈGôø¢Ö±‰4û%"Á@£cQ�À8L;+'„ìn:¼?�`5�Ýø]O$Ÿ—Z•Uµ…КƒFŠšG�Rmcm+ˆÍŸ´»;ës[ ”2Å(9šK7—‰SiZšäŽé÷Lð!§`…ø>SSa endstream endobj 32 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 12/LastChar 121/Widths[ 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 39 33 0 59 59 59 0 0 59 59 59 59 59 0 0 0 0 0 0 0 88 83 85 89 0 0 92 0 0 60 0 0 107 88 0 0 0 86 65 0 88 0 0 0 0 0 0 0 0 0 0 0 59 65 52 0 52 36 59 65 33 0 62 33 99 65 59 65 0 46 46 46 65 62 0 62 62] /Subtype/Type3>> endobj 761 0 obj <> endobj 364 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 67/LastChar 84/Widths[ 62 62 62 0 0 0 62 0 0 0 0 0 0 0 0 62 0 62] /Subtype/Type3>> endobj 762 0 obj <> endobj 16 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 46/LastChar 117/Widths[ 43 0 79 0 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 125 0 0 0 0 0 0 0 0 0 0 0 0 0 119 119 0 0 0 0 0 0 0 0 0 0 0 0 0 88 70 0 0 0 42 0 0 0 0 88 79 0 0 61 62 0 88] /Subtype/Type3>> endobj 763 0 obj <> endobj 14 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 67/LastChar 84/Widths[ 89 89 89 0 0 0 89 0 0 0 0 0 0 0 0 89 0 89] /Subtype/Type3>> endobj 764 0 obj <> endobj 544 0 obj <> endobj 765 0 obj <>stream xœ]O1Â0 Üó ÿ )ˆ²T]ÊÂBÀRÇ©2Ô‰Òtà÷4iËÀp–Îw'Ÿew½\Ù%��èñE ¬ciòsD‚žÇ¢:€q˜6V&Ž:ÙÝtxÁb »ò»I>Ïõ©¬ª5„ÞÐ4RÔ<�h”jk[Alþ¤-ÐÛÍYÛ¥”)þ]ÉÑ\b¿ 8ÇHœJÓÒ$pL¿g‚9 ÄAiSf endstream endobj 274 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 58/LastChar 120/Widths[ 20 20 0 0 0 0 0 0 53 0 58 0 0 0 0 31 0 0 0 0 56 0 0 0 0 0 41 0 0 0 0 0 0 0 0 0 0 0 0 37 30 31 0 0 34 34 0 24 29 0 21 62 43 34 36 0 0 0 25 0 0 0 40] /Subtype/Type3>> endobj 766 0 obj <> endobj 272 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 82/LastChar 82/Widths[ 61] /Subtype/Type3>> endobj 767 0 obj <> endobj 768 0 obj <>stream xœ]�1Â0 E÷œÂ7HZ¤ÂPe)K.§ÊÐ$JÓ�ÛÓ$”�á[²ý¿õ̇ñ<:›€ß¢Ç%0ÖéH‹_#¼h²Ž5-h‹éÛ•Š³ Œžï@°ÈÔþªfâ÷cw*£¦†ÐkZ‚BŠÊMÄz!doŒdäôߪ­�—Ù�$«v’õÝA !t‰ïÆ|)3í€kŒäR/`™Ç:úý|È)ØÄ>ÇMW endstream endobj 268 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 13/LastChar 120/Widths[ 51 43 39 0 0 0 0 0 0 0 0 0 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 27 76 49 76 0 0 0 74 0 81 0 63 0 0 43 0 83 0 0 78 0 63 0 74 60 0 0 0 0 0 0 0 0 0 0 0 0 0 51 41 42 51 45 48 47 0 33 40 0 29 85 58 47 49 0 44 0 35 56 0 70 55] /Subtype/Type3>> endobj 769 0 obj <> endobj 770 0 obj <>stream xœ]O1ƒ0 Üó ÿ ¡•Ê‚XèÂЪjû�à8(NÂÐß—èÐá,�ïN>Ë®¿öìÈGôø¢Ö±‰4û%"Á@£cQ�À8L;+'„ìn:¼?�`5�Ýø]O$Ÿu­ÊªÚBè ÍA#EÍ#‰F©¶±¶ÄæOÚƒÝ�—s[ ”2Å(9šK7—‰SiZšäŽé÷Lð!§`…ø>òSb endstream endobj 264 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 12/LastChar 122/Widths[ 55 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 40 40 0 0 30 35 30 50 50 50 50 50 0 0 0 50 0 50 0 0 0 0 0 0 0 72 0 70 74 66 64 75 0 38 51 0 61 87 72 75 66 0 71 55 70 72 0 97 0 0 0 0 0 0 0 0 0 50 45 45 50 45 30 45 50 30 0 0 25 80 55 50 50 0 41 40 32 52 45 65 45 47 40] /Subtype/Type3>> endobj 771 0 obj <> endobj 261 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 0/LastChar 106/Widths[ 55 0 0 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20] /Subtype/Type3>> endobj 772 0 obj <> endobj 773 0 obj <>stream xœ]�1à EwNÁ IÛ,KºdhUµ½1!Coß`’¾%Ûÿ[Ϭ®ƒ³‰²Gôê‰ët„ůQa²ŽT5ÕV¥½Ãªfëo2¼?èfSú»œ�=Û¶ÁQUBÊkX‚T¥›€tœ‹ÎAÀé¿U]£Ù�g-PuÅO‚t—F 8çã‡1_ÊLUkŒà‚#Xæ±~¿rŠn"_µËV× endstream endobj 244 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 12/LastChar 121/Widths[ 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 0 67 67 67 67 67 0 0 0 0 0 0 0 0 0 0 0 0 0 97 103 88 85 0 0 0 69 0 0 128 105 101 92 0 0 75 94 0 0 139 0 0 0 37 0 37 0 0 0 65 75 60 75 61 41 67 75 37 0 71 37 112 75 67 75 0 55 53 52 75 71 0 71 71] /Subtype/Type3>> endobj 774 0 obj <> endobj 238 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 67/LastChar 84/Widths[ 74 74 74 0 0 0 74 0 0 0 0 0 0 0 0 74 0 74] /Subtype/Type3>> endobj 775 0 obj <> endobj 215 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 0/LastChar 110/Widths[ 77 0 77 0 0 0 77 77 0 0 0 0 0 0 0 50 0 0 0 0 77 0 0 0 0 0 77 0 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 66 0 0 0 0 0 55 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 0 50 50 0 0 28 0 0 0 50] /Subtype/Type3>> endobj 776 0 obj <> endobj 645 0 obj <> endobj 777 0 obj <> endobj 778 0 obj <>stream xœ]�=à …wNáéO:D,é’¡UÕöLÄ@„ ½}I:tx–l¿g}¦mwíœM@Ñ«&0Ö鈓Ÿ£Bèq°Žð ´UiëJU£ „¶7ÞŸ€°Ьý]ŽHŸu})#¾†”×8©0J7 i�1‚ Ó«j ôfsž´(ª8; Òœ¢ˆ1¦K|7æK™iG5Lj.ð–y¬ÃßoÁ‡œ‚Eä ¹,VÜ endstream endobj 110 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 12/LastChar 123/Widths[ 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 0 0 0 31 44 44 0 0 31 37 31 56 56 56 56 56 56 56 56 56 0 0 0 0 0 0 0 0 0 85 80 81 86 74 70 88 88 42 0 0 67 0 88 84 77 84 84 62 78 86 0 0 85 0 0 31 0 31 0 0 0 54 62 50 62 51 34 56 62 32 0 59 32 94 62 56 62 59 46 44 44 62 59 81 59 59 50 56] /Subtype/Type3>> endobj 779 0 obj <> endobj 636 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 2/LastChar 88/Widths[ 42 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 73 73 0 0 0 0 0 0 0 0 0 0 0 0 79 79 0 0 0 0 0 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 144] /Subtype/Type3>> endobj 780 0 obj <> endobj 781 0 obj <>stream xœ]O1Â0 Üó ÿ )HÀPu)K>�:N•¡N”¦¿§I[†³t¾;ù,ÛîÚ±K Ñã‹XÇ&Òäçˆ= ŽEuã0m¬Lu²½éðþ‚Å@våw=’|ž/UYUk½¡)h¤¨y Q+ÕÔÖ6‚ØüI[ ·›ótl ”R¦øw%Gs‰ý&à#q*MK“\À1ýž >ä,_@/Sd endstream endobj 105 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 12/LastChar 119/Widths[ 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 81 81 81 0 0 0 0 0 0 0 0 0 0 0 0 122 0 117 0 0 0 0 0 60 0 0 0 0 0 0 110 0 120 0 112 124 0 0 0 0 0 0 0 0 0 0 0 78 90 72 90 74 49 81 90 44 0 0 44 135 90 81 0 0 66 64 63 90 85 117] /Subtype/Type3>> endobj 782 0 obj <> endobj 618 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 97/LastChar 111/Widths[ 34 27 0 0 0 0 30 0 22 25 0 20 54 38 31] /Subtype/Type3>> endobj 783 0 obj <> endobj 784 0 obj <>stream xœ]�= …{NÁ cŠ �6)tõ– E€!¤ðöòc,,>f»o÷-9�—ÑšˆÉ=8ù„ˆµ±*Àê¶ O0‹š+#ãW•W.Â#r¾ ÿz{À©tÕ7±yœzV¾šj’NÁê…„ ì h ”ZsVý•X5Lzï^¡²ãh`ɘ¡”öI/´ eIv^HUU†ïcòžœxˆåØXÎ*±sZcáw¹w>»p}!œ]~ endstream endobj 101 0 obj <>/FontMatrix[1 0 0 -1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 1/LastChar 127/Widths[ 81 0 0 0 0 0 0 0 0 70 57 54 54 81 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 81 0 0 0 27 38 38 0 76 27 33 27 49 49 49 49 49 49 49 49 49 49 49 27 27 0 76 0 0 76 73 69 70 75 66 64 77 73 35 50 76 61 89 73 76 66 76 72 54 70 73 73 100 73 73 0 27 49 27 0 0 0 49 54 43 54 43 30 49 54 28 30 51 28 82 54 49 54 51 38 38 38 54 51 70 51 51 43 49 0 0 49 49] /Subtype/Type3>> endobj 785 0 obj <> endobj 786 0 obj <>stream GPL Ghostscript 8.54 PDF Writer userguide.dvi endstream endobj 2 0 obj <>endobj xref 0 787 0000000000 65535 f 0000838520 00000 n 0001011426 00000 n 0000838205 00000 n 0000832595 00000 n 0000000015 00000 n 0000000570 00000 n 0000838586 00000 n 0000925142 00000 n 0000967872 00000 n 0000866116 00000 n 0000924876 00000 n 0000967541 00000 n 0000865880 00000 n 0000995821 00000 n 0000924633 00000 n 0000995187 00000 n 0000967242 00000 n 0000865629 00000 n 0000909427 00000 n 0000967004 00000 n 0000865322 00000 n 0000909161 00000 n 0000966680 00000 n 0000865124 00000 n 0000908844 00000 n 0000966400 00000 n 0000864740 00000 n 0000908576 00000 n 0000966068 00000 n 0000864497 00000 n 0000908406 00000 n 0000993611 00000 n 0000965799 00000 n 0000864172 00000 n 0000908108 00000 n 0000954312 00000 n 0000863960 00000 n 0000907838 00000 n 0000954067 00000 n 0000863680 00000 n 0000907556 00000 n 0000953785 00000 n 0000863422 00000 n 0000907318 00000 n 0000953540 00000 n 0000863171 00000 n 0000907001 00000 n 0000953309 00000 n 0000862844 00000 n 0000906728 00000 n 0000953057 00000 n 0000854181 00000 n 0000906448 00000 n 0000952772 00000 n 0000853911 00000 n 0000906206 00000 n 0000952500 00000 n 0000853611 00000 n 0000905943 00000 n 0000952253 00000 n 0000853314 00000 n 0000905674 00000 n 0000951923 00000 n 0000853023 00000 n 0000905397 00000 n 0000951627 00000 n 0000852695 00000 n 0000899553 00000 n 0000951362 00000 n 0000852385 00000 n 0000899245 00000 n 0000951173 00000 n 0000852108 00000 n 0000899018 00000 n 0000838627 00000 n 0000838657 00000 n 0000832755 00000 n 0000000589 00000 n 0000002433 00000 n 0000989369 00000 n 0000891262 00000 n 0000937194 00000 n 0000989126 00000 n 0000890992 00000 n 0000936973 00000 n 0000991253 00000 n 0000988877 00000 n 0000890711 00000 n 0000936808 00000 n 0000988596 00000 n 0000989911 00000 n 0000890449 00000 n 0000936538 00000 n 0000988333 00000 n 0000890208 00000 n 0000936227 00000 n 0000988083 00000 n 0000889974 00000 n 0000935938 00000 n 0000983853 00000 n 0001008160 00000 n 0000889622 00000 n 0000935647 00000 n 0000983598 00000 n 0001006457 00000 n 0000889367 00000 n 0000935352 00000 n 0000983291 00000 n 0000889145 00000 n 0001004121 00000 n 0000935145 00000 n 0000983053 00000 n 0000888903 00000 n 0000934912 00000 n 0000982787 00000 n 0000888627 00000 n 0000934673 00000 n 0000982531 00000 n 0000884837 00000 n 0000934453 00000 n 0000982365 00000 n 0000884583 00000 n 0000934222 00000 n 0000982103 00000 n 0000884313 00000 n 0000934011 00000 n 0000981844 00000 n 0000884053 00000 n 0000933737 00000 n 0000981579 00000 n 0000883793 00000 n 0000933465 00000 n 0000981342 00000 n 0000883555 00000 n 0000924356 00000 n 0000981099 00000 n 0000883287 00000 n 0000924050 00000 n 0000980820 00000 n 0000882989 00000 n 0000923806 00000 n 0000980539 00000 n 0000882752 00000 n 0000923539 00000 n 0000980231 00000 n 0000882460 00000 n 0000923245 00000 n 0000979925 00000 n 0000882202 00000 n 0000922958 00000 n 0000965526 00000 n 0000881957 00000 n 0000922719 00000 n 0000965265 00000 n 0000881678 00000 n 0000922474 00000 n 0000964986 00000 n 0000881467 00000 n 0000922217 00000 n 0000964731 00000 n 0000881275 00000 n 0000921943 00000 n 0000964484 00000 n 0000881036 00000 n 0000921669 00000 n 0000964239 00000 n 0000862605 00000 n 0000921374 00000 n 0000963989 00000 n 0000862310 00000 n 0000921092 00000 n 0000963712 00000 n 0000862047 00000 n 0000920836 00000 n 0000963468 00000 n 0000861793 00000 n 0000920567 00000 n 0000963198 00000 n 0000861525 00000 n 0000920331 00000 n 0000962855 00000 n 0000861216 00000 n 0000905149 00000 n 0000962603 00000 n 0000861014 00000 n 0000904947 00000 n 0000962370 00000 n 0000860792 00000 n 0000904694 00000 n 0000962152 00000 n 0000860535 00000 n 0000904468 00000 n 0000961869 00000 n 0000860244 00000 n 0000904302 00000 n 0000961590 00000 n 0000859995 00000 n 0000904046 00000 n 0000950936 00000 n 0000838711 00000 n 0000838742 00000 n 0000832919 00000 n 0000002454 00000 n 0000004177 00000 n 0000895443 00000 n 0000941588 00000 n 0000848617 00000 n 0000895126 00000 n 0000941301 00000 n 0000848326 00000 n 0000894820 00000 n 0000941055 00000 n 0000987838 00000 n 0000894596 00000 n 0001002939 00000 n 0000940844 00000 n 0000987617 00000 n 0000894373 00000 n 0000946302 00000 n 0000847967 00000 n 0000898744 00000 n 0000838825 00000 n 0000838856 00000 n 0000833093 00000 n 0000004199 00000 n 0000007015 00000 n 0000979693 00000 n 0000888418 00000 n 0000933157 00000 n 0000979440 00000 n 0000880795 00000 n 0000932860 00000 n 0000979219 00000 n 0000880497 00000 n 0000932604 00000 n 0000978914 00000 n 0000880268 00000 n 0001002553 00000 n 0000932403 00000 n 0000978697 00000 n 0000880026 00000 n 0000932174 00000 n 0000978497 00000 n 0001001333 00000 n 0000879756 00000 n 0000931933 00000 n 0000978221 00000 n 0000879473 00000 n 0000920117 00000 n 0000977947 00000 n 0000879198 00000 n 0000919824 00000 n 0000977658 00000 n 0000878931 00000 n 0000919593 00000 n 0000977372 00000 n 0000878684 00000 n 0000919347 00000 n 0000977111 00000 n 0000878465 00000 n 0001000542 00000 n 0000919085 00000 n 0000976864 00000 n 0000999119 00000 n 0000878199 00000 n 0000918840 00000 n 0000961318 00000 n 0000997763 00000 n 0000918565 00000 n 0000961063 00000 n 0000877864 00000 n 0000997261 00000 n 0000918309 00000 n 0000996497 00000 n 0000960771 00000 n 0000877653 00000 n 0000918053 00000 n 0000960488 00000 n 0000877413 00000 n 0000917796 00000 n 0000960235 00000 n 0000877192 00000 n 0000917526 00000 n 0000959958 00000 n 0000859710 00000 n 0000917262 00000 n 0000959716 00000 n 0000859436 00000 n 0000917003 00000 n 0000959430 00000 n 0000859166 00000 n 0000916746 00000 n 0000959155 00000 n 0000858908 00000 n 0000916488 00000 n 0000958886 00000 n 0000858617 00000 n 0000916217 00000 n 0000958724 00000 n 0000858345 00000 n 0000903807 00000 n 0000958462 00000 n 0000858108 00000 n 0000903553 00000 n 0000958248 00000 n 0000857860 00000 n 0000903310 00000 n 0000957959 00000 n 0000857597 00000 n 0000903002 00000 n 0000957730 00000 n 0000857320 00000 n 0000902700 00000 n 0000957475 00000 n 0000857015 00000 n 0000902444 00000 n 0000950692 00000 n 0000856748 00000 n 0000950454 00000 n 0000856511 00000 n 0000838939 00000 n 0000838970 00000 n 0000833259 00000 n 0000007037 00000 n 0000008915 00000 n 0000940527 00000 n 0000847703 00000 n 0000894013 00000 n 0000940233 00000 n 0000987310 00000 n 0000893757 00000 n 0000939938 00000 n 0000987063 00000 n 0000893473 00000 n 0000939610 00000 n 0000847435 00000 n 0000898462 00000 n 0000946025 00000 n 0000847132 00000 n 0000898261 00000 n 0000945777 00000 n 0000846847 00000 n 0000897998 00000 n 0000945513 00000 n 0000846579 00000 n 0000897734 00000 n 0000945249 00000 n 0000839157 00000 n 0000839188 00000 n 0000833433 00000 n 0000008937 00000 n 0000011122 00000 n 0000893187 00000 n 0000945028 00000 n 0000846278 00000 n 0000892925 00000 n 0000944702 00000 n 0000846004 00000 n 0000892706 00000 n 0000944420 00000 n 0000845751 00000 n 0000892418 00000 n 0000944194 00000 n 0000994801 00000 n 0000845476 00000 n 0000892180 00000 n 0000943947 00000 n 0000845204 00000 n 0000891988 00000 n 0000939313 00000 n 0000839323 00000 n 0000839354 00000 n 0000833607 00000 n 0000011144 00000 n 0000013996 00000 n 0000876908 00000 n 0000915972 00000 n 0000976630 00000 n 0000876628 00000 n 0000915697 00000 n 0000976464 00000 n 0000876344 00000 n 0000839489 00000 n 0000839520 00000 n 0000833773 00000 n 0000014018 00000 n 0000016636 00000 n 0000943748 00000 n 0000851893 00000 n 0000897489 00000 n 0000992802 00000 n 0000943436 00000 n 0000851631 00000 n 0000897203 00000 n 0000943206 00000 n 0000851373 00000 n 0000902241 00000 n 0000950192 00000 n 0000856216 00000 n 0000901975 00000 n 0000949950 00000 n 0000851062 00000 n 0000901719 00000 n 0000949711 00000 n 0000850841 00000 n 0000901496 00000 n 0000839629 00000 n 0000839660 00000 n 0000833947 00000 n 0000016658 00000 n 0000018955 00000 n 0000986806 00000 n 0000891733 00000 n 0000939009 00000 n 0000986518 00000 n 0000888127 00000 n 0000938758 00000 n 0000844894 00000 n 0000891475 00000 n 0000942921 00000 n 0000839782 00000 n 0000839813 00000 n 0000834121 00000 n 0000018977 00000 n 0000020824 00000 n 0000876073 00000 n 0000931697 00000 n 0000976196 00000 n 0000875837 00000 n 0000931445 00000 n 0000975960 00000 n 0000875608 00000 n 0000915453 00000 n 0000975700 00000 n 0000875361 00000 n 0000915177 00000 n 0000975463 00000 n 0000875107 00000 n 0000914930 00000 n 0000975197 00000 n 0000874885 00000 n 0000914660 00000 n 0000974890 00000 n 0000874613 00000 n 0000914429 00000 n 0000974675 00000 n 0000874363 00000 n 0000914156 00000 n 0000957217 00000 n 0000874083 00000 n 0000913901 00000 n 0000956969 00000 n 0000873823 00000 n 0000913648 00000 n 0000956704 00000 n 0000873613 00000 n 0000913416 00000 n 0000956535 00000 n 0000873328 00000 n 0000913088 00000 n 0000956219 00000 n 0000873064 00000 n 0000912774 00000 n 0000955886 00000 n 0000855984 00000 n 0000839922 00000 n 0000839953 00000 n 0000834287 00000 n 0000020846 00000 n 0000022859 00000 n 0000942698 00000 n 0000844729 00000 n 0000896940 00000 n 0000942450 00000 n 0000840049 00000 n 0000840080 00000 n 0000834453 00000 n 0000022881 00000 n 0000025208 00000 n 0000872758 00000 n 0000931212 00000 n 0000974470 00000 n 0000872485 00000 n 0000930947 00000 n 0000974247 00000 n 0000872256 00000 n 0000930684 00000 n 0000973988 00000 n 0000871991 00000 n 0000930419 00000 n 0000973768 00000 n 0000840176 00000 n 0000840207 00000 n 0000834619 00000 n 0000025230 00000 n 0000026377 00000 n 0000896720 00000 n 0000949464 00000 n 0000850552 00000 n 0000896476 00000 n 0000949190 00000 n 0000850269 00000 n 0000896279 00000 n 0000948924 00000 n 0000850017 00000 n 0000896025 00000 n 0000942166 00000 n 0000849771 00000 n 0000895727 00000 n 0000840290 00000 n 0000840321 00000 n 0000834785 00000 n 0000026399 00000 n 0000028122 00000 n 0000986177 00000 n 0000887836 00000 n 0000930154 00000 n 0000985925 00000 n 0000887530 00000 n 0000929941 00000 n 0000973486 00000 n 0000887256 00000 n 0000840391 00000 n 0000840422 00000 n 0000834951 00000 n 0000028144 00000 n 0000030851 00000 n 0000948630 00000 n 0000855737 00000 n 0000901220 00000 n 0000948410 00000 n 0000855448 00000 n 0000948119 00000 n 0000849566 00000 n 0000901010 00000 n 0000947957 00000 n 0000849316 00000 n 0000840531 00000 n 0000840562 00000 n 0000835117 00000 n 0000030873 00000 n 0000035376 00000 n 0000990953 00000 n 0000996198 00000 n 0000840697 00000 n 0000840728 00000 n 0000835283 00000 n 0000035398 00000 n 0000038362 00000 n 0000929663 00000 n 0000973212 00000 n 0000871738 00000 n 0000929399 00000 n 0000972946 00000 n 0000871515 00000 n 0000929089 00000 n 0000972699 00000 n 0000871230 00000 n 0000928850 00000 n 0000972452 00000 n 0000870988 00000 n 0000928574 00000 n 0000840811 00000 n 0000840842 00000 n 0000835449 00000 n 0000038384 00000 n 0000041288 00000 n 0000870770 00000 n 0000912554 00000 n 0000990510 00000 n 0000972187 00000 n 0000870491 00000 n 0000912304 00000 n 0000971917 00000 n 0000870281 00000 n 0000911996 00000 n 0000971639 00000 n 0000870034 00000 n 0000911707 00000 n 0000971397 00000 n 0000869757 00000 n 0000911486 00000 n 0000971136 00000 n 0000887037 00000 n 0000928313 00000 n 0000985715 00000 n 0000886824 00000 n 0000989630 00000 n 0000938517 00000 n 0000840990 00000 n 0000841021 00000 n 0000835623 00000 n 0000041310 00000 n 0000044581 00000 n 0000911225 00000 n 0000955570 00000 n 0000869492 00000 n 0000910921 00000 n 0000955280 00000 n 0000869214 00000 n 0000910699 00000 n 0000955046 00000 n 0000868954 00000 n 0000841195 00000 n 0000841226 00000 n 0000835789 00000 n 0000044603 00000 n 0000047632 00000 n 0000970867 00000 n 0000841387 00000 n 0000841418 00000 n 0000835963 00000 n 0000047654 00000 n 0000051803 00000 n 0000928021 00000 n 0000970596 00000 n 0000868717 00000 n 0001007473 00000 n 0000927765 00000 n 0000970265 00000 n 0000841553 00000 n 0000841584 00000 n 0000836137 00000 n 0000051825 00000 n 0000058982 00000 n 0000841771 00000 n 0000841802 00000 n 0000836303 00000 n 0000059004 00000 n 0000061107 00000 n 0000938257 00000 n 0000985455 00000 n 0000886523 00000 n 0000938010 00000 n 0000985110 00000 n 0001005668 00000 n 0000886289 00000 n 0000937678 00000 n 0000841911 00000 n 0000841942 00000 n 0000836469 00000 n 0000061129 00000 n 0000326588 00000 n 0000842116 00000 n 0001003737 00000 n 0000868438 00000 n 0000910495 00000 n 0000970062 00000 n 0000868116 00000 n 0000910255 00000 n 0000984790 00000 n 0000886049 00000 n 0000927507 00000 n 0000984550 00000 n 0000885845 00000 n 0000927306 00000 n 0000984337 00000 n 0000842868 00000 n 0000842903 00000 n 0000842934 00000 n 0000836679 00000 n 0000326612 00000 n 0000329065 00000 n 0000867887 00000 n 0000910028 00000 n 0000954787 00000 n 0000885616 00000 n 0000926963 00000 n 0000969721 00000 n 0000885333 00000 n 0000947717 00000 n 0000843134 00000 n 0000843165 00000 n 0000836853 00000 n 0000329087 00000 n 0000330515 00000 n 0000843313 00000 n 0000843344 00000 n 0000837027 00000 n 0000330537 00000 n 0000365324 00000 n 0000947512 00000 n 0000849113 00000 n 0000843427 00000 n 0000843458 00000 n 0000837193 00000 n 0000365347 00000 n 0000432666 00000 n 0000937462 00000 n 0000984079 00000 n 0000885070 00000 n 0000926701 00000 n 0000843619 00000 n 0000843650 00000 n 0000837359 00000 n 0000432689 00000 n 0000823888 00000 n 0000843824 00000 n 0000843855 00000 n 0000837525 00000 n 0000823912 00000 n 0000826594 00000 n 0000855188 00000 n 0000900759 00000 n 0000947261 00000 n 0000854944 00000 n 0000900463 00000 n 0000947018 00000 n 0000854688 00000 n 0000900232 00000 n 0000946779 00000 n 0000854438 00000 n 0000900014 00000 n 0000946548 00000 n 0000848873 00000 n 0000899776 00000 n 0000954593 00000 n 0000843925 00000 n 0000843956 00000 n 0000837699 00000 n 0000826616 00000 n 0000828876 00000 n 0000941834 00000 n 0000844446 00000 n 0000844130 00000 n 0000844161 00000 n 0000837873 00000 n 0000828898 00000 n 0000831642 00000 n 0000926437 00000 n 0000969501 00000 n 0000867593 00000 n 0000926277 00000 n 0000969206 00000 n 0000867289 00000 n 0000925973 00000 n 0000968901 00000 n 0000867011 00000 n 0000925756 00000 n 0000968648 00000 n 0000866728 00000 n 0000925447 00000 n 0000968335 00000 n 0000866442 00000 n 0000909753 00000 n 0000968095 00000 n 0000844244 00000 n 0000844275 00000 n 0000838039 00000 n 0000831664 00000 n 0000832574 00000 n 0000844345 00000 n 0000844376 00000 n 0000989823 00000 n 0000990364 00000 n 0000990838 00000 n 0000991022 00000 n 0000992479 00000 n 0000993248 00000 n 0000993380 00000 n 0000994541 00000 n 0000995078 00000 n 0000995665 00000 n 0000996089 00000 n 0000996266 00000 n 0000997078 00000 n 0000997439 00000 n 0000997524 00000 n 0000998642 00000 n 0000998888 00000 n 0001000251 00000 n 0001000984 00000 n 0001001092 00000 n 0001002300 00000 n 0001002830 00000 n 0001003559 00000 n 0001003820 00000 n 0001003879 00000 n 0001005359 00000 n 0001006109 00000 n 0001006226 00000 n 0001007266 00000 n 0001007784 00000 n 0001007905 00000 n 0001009727 00000 n 0001010100 00000 n trailer << /Size 787 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 1011619 %%EOF stevengj-nlopt-88c424d/src/algs/esch/000077500000000000000000000000001521061417600174755ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/esch/COPYRIGHT000066400000000000000000000021711521061417600207710ustar00rootroot00000000000000/* Copyright (c) 2008-2013 Carlos Henrique da Silva Santos * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ stevengj-nlopt-88c424d/src/algs/esch/README000066400000000000000000000024451521061417600203620ustar00rootroot00000000000000This is Carlos Henrique da Silva Santos's implementation of a modified version of the Evolutionary Algorithm described in the following paper and Ph.D. thesis: C. H. da Silva Santos, M. S. Gonçalves, and H. E. Hernandez-Figueroa, "Designing Novel Photonic Devices by Bio-Inspired Computing," IEEE Photonics Technology Letters 22(15), pp. 1177-1179 (2010). C. H. da Silva Santos, "Parallel and Bio-Inspired Computing Applied to Analyze Microwave and Photonic Metamaterial Strucutures," University of Campinas, (2010) http://www.bibliotecadigital.unicamp.br/document/?code=000767537&opt=4&lg=en_US The algorithms are adapted from ideas described in: H.-G. Beyer and H.-P. Schwefel. Evolution Strategies: A Comprehensive Introduction. Journal Natural Computing, 1(1):3–52, 2002. Ingo Rechenberg (1971): Evolutionsstrategie – Optimierung technischer Systeme nach Prinzipien der biologischen Evolution (PhD thesis). Reprinted by Fromman-Holzboog (1973). It is distributed under the "MIT license" given in the attached COPYRIGHT file (similar to the rest of NLopt), and was supportedfinancially by the São Paulo Science Foundation (FAPESP - Fundação de Amparo à Pesquisa do Estado de São Paulo) under the grant 2012/14553-9. Carlos Henrique da Silva Santos January 2013 stevengj-nlopt-88c424d/src/algs/esch/esch.c000066400000000000000000000240221521061417600205630ustar00rootroot00000000000000/* Copyright (c) 2008-2013 Carlos Henrique da Silva Santos * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include "esch.h" /****************************************************************************/ /* Cauchy random number distribution */ static double randcauchy(const double params[7]) { /* double min, double max, double mi, double t, double band */ double na_unif, cauchy_mit, limit_inf, limit_sup; double valor; double min = params[1], max = params[2], mi = params[3], t = params[4], band = params[5]; limit_inf = mi - (band*0.5); limit_sup = mi + (band*0.5); do { na_unif = nlopt_urand(0,1); /* ran2(0,1); */ cauchy_mit = t*tan((na_unif-0.5)*3.14159265358979323846) + mi; } while ( (cauchy_mitlimit_sup) ); if (cauchy_mit < 0) cauchy_mit = -cauchy_mit; else cauchy_mit = cauchy_mit + (band*0.5); valor = cauchy_mit/band; valor = min+(max-min)*valor; return valor; } /****************************************************************************/ /* main Individual representation type */ typedef struct IndividualStructure { double * parameters; double fitness; } Individual; static int CompareIndividuals(void *unused, const void *a_, const void *b_) { const Individual *a = (const Individual *) a_; const Individual *b = (const Individual *) b_; (void) unused; return a->fitness < b->fitness ? -1 : (a->fitness > b->fitness ? +1 : 0); } nlopt_result chevolutionarystrategy( unsigned nparameters, /* Number of input parameters */ nlopt_func f, /* Recursive Objective Function Call */ void * data_f, /* Data to Objective Function */ const double* lb, /* Lower bound values */ const double* ub, /* Upper bound values */ double* x, /*in: initial guess, out: minimizer */ double* minf, nlopt_stopping* stop, /* nlopt stop condition */ unsigned np, /* Number of Parents */ unsigned no) { /* Number of Offsprings */ /* variables from nlopt */ nlopt_result ret = NLOPT_SUCCESS; double vetor[8]; unsigned i, id, item; int parent1, parent2; unsigned crosspoint; /* crossover parameteres */ int contmutation, totalmutation; /* mutation parameters */ int idoffmutation, paramoffmutation; /* mutation parameters */ Individual * esparents; /* Parents population */ Individual * esoffsprings; /* Offsprings population */ Individual * estotal;/* copy containing Parents and Offsprings pops */ /* It is interesting to maintain the parents and offsprings * populations stablished and sorted; when the final iterations * is achieved, they are ranked and updated. */ /********************************* * controlling the population size *********************************/ if (!np) np = 40; if (!no) no = 60; if ((np < 1)||(no<1)) { nlopt_stop_msg(stop, "populations %d, %d are too small", np, no); return NLOPT_INVALID_ARGS; } esparents = (Individual*) malloc(sizeof(Individual) * np); esoffsprings = (Individual*) malloc(sizeof(Individual) * no); estotal = (Individual*) malloc(sizeof(Individual) * (np+no)); if ((!esparents)||(!esoffsprings)||(!estotal)) { free(esparents); free(esoffsprings); free(estotal); return NLOPT_OUT_OF_MEMORY; } for (id=0; id < np; id++) esparents[id].parameters = NULL; for (id=0; id < no; id++) esoffsprings[id].parameters = NULL; /* From here the population is initialized */ /* we don't handle unbounded search regions; this check is unnecessary since it is performed in nlopt_optimize. for (j = 0; j < nparameters; ++j) if (nlopt_isinf(low[j]) || nlopt_isinf(up[j])) return NLOPT_INVALID_ARGS; */ /* main vector of parameters to randcauchy */ vetor[0] = 4; /* ignored */ vetor[3] = 0; vetor[4] = 1; vetor[5] = 10; vetor[6] = 1; vetor[7] = 0; /* ignored */ /************************************** * Initializing parents population **************************************/ for (id=0; id < np; id++) { esparents[id].parameters = (double*) malloc(sizeof(double) * nparameters); if (!esparents[id].parameters) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (item=0; itemnevals_p); if (*minf > esparents[id].fitness) { *minf = esparents[id].fitness; memcpy(x, esparents[id].parameters, nparameters * sizeof(double)); } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; if (ret != NLOPT_SUCCESS) goto done; } /************************************** * Main Loop - Generations **************************************/ while (1) { /************************************** * Crossover **************************************/ for (id=0; id < no; id++) { parent1 = nlopt_iurand((int) np); parent2 = nlopt_iurand((int) np); crosspoint = (unsigned) nlopt_iurand((int) nparameters); for (item=0; item < crosspoint; item++) esoffsprings[id].parameters[item] = esparents[parent1].parameters[item]; for (item=crosspoint; item < nparameters; item++) esoffsprings[id].parameters[item] = esparents[parent2].parameters[item]; } /************************************** * Gaussian Mutation **************************************/ totalmutation = (int) ((no * nparameters) / 10); if (totalmutation < 1) totalmutation = 1; for (contmutation=0; contmutation < totalmutation; contmutation++) { idoffmutation = nlopt_iurand((int) no); paramoffmutation = nlopt_iurand((int) nparameters); vetor[1] = lb[paramoffmutation]; vetor[2] = ub[paramoffmutation]; vetor[7] = vetor[7]+contmutation; esoffsprings[idoffmutation].parameters[paramoffmutation] = randcauchy(vetor); } /************************************** * Offsprings fitness evaluation **************************************/ for (id=0; id < no; id++){ /*esoffsprings[id].fitness = (double)fitness(esoffsprings[id].parameters, nparameters,fittype);*/ esoffsprings[id].fitness = f(nparameters, esoffsprings[id].parameters, NULL, data_f); estotal[id+np].fitness = esoffsprings[id].fitness; ++ *(stop->nevals_p); if (*minf > esoffsprings[id].fitness) { *minf = esoffsprings[id].fitness; memcpy(x, esoffsprings[id].parameters, nparameters * sizeof(double)); } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; if (ret != NLOPT_SUCCESS) goto done; } /************************************** * Individual selection **************************************/ /* all the individuals are copied to one vector to easily identify best solutions */ for (i=0; i < np; i++) estotal[i] = esparents[i]; for (i=0; i < no; i++) estotal[np+i] = esoffsprings[i]; /* Sorting */ nlopt_qsort_r(estotal, no+np, sizeof(Individual), NULL, CompareIndividuals); /* copy after sorting: */ for (i=0; i < no+np; i++) { if (i #include #include #include "isres.h" /* Improved Stochastic Ranking Evolution Strategy (ISRES) algorithm for nonlinearly-constrained global optimization, based on the method described in: Thomas Philip Runarsson and Xin Yao, "Search biases in constrained evolutionary optimization," IEEE Trans. on Systems, Man, and Cybernetics Part C: Applications and Reviews, vol. 35 (no. 2), pp. 233-243 (2005). It is a refinement of an earlier method described in: Thomas P. Runarsson and Xin Yao, "Stochastic ranking for constrained evolutionary optimization," IEEE Trans. Evolutionary Computation, vol. 4 (no. 3), pp. 284-294 (2000). This is an independent implementation by S. G. Johnson (2009) based on the papers above. Runarsson also has his own Matlab implementation available from his web page: http://www3.hi.is/~tpr */ static int key_compare(void *keys_, const void *a_, const void *b_) { const double *keys = (const double *) keys_; const int *a = (const int *) a_; const int *b = (const int *) b_; return keys[*a] < keys[*b] ? -1 : (keys[*a] > keys[*b] ? +1 : 0); } static unsigned imax2(unsigned a, unsigned b) { return (a > b ? a : b); } nlopt_result isres_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_constraint *fc, /* fc <= 0 */ int p, nlopt_constraint *h, /* h == 0 */ const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int population) /* pop. size (= 0 for default) */ { const double ALPHA = 0.2; /* smoothing factor from paper */ const double GAMMA = 0.85; /* step-reduction factor from paper */ const double PHI = 1.0; /* expected rate of convergence, from paper */ const double PF = 0.45; /* fitness probability, from paper */ const double SURVIVOR = 1.0/7.0; /* survivor fraction, from paper */ int survivors; nlopt_result ret = NLOPT_SUCCESS; double *sigmas = 0, *xs; /* population-by-n arrays (row-major) */ double *fval; /* population array of function vals */ double *penalty; /* population array of penalty vals */ double *x0; int *irank = 0; int k, i, j, c; int mp = m + p; double minf_penalty = HUGE_VAL, minf_gpenalty = HUGE_VAL; double taup, tau; double *results = 0; /* scratch space for mconstraint results */ unsigned ires; *minf = HUGE_VAL; if (!population) population = 20 * (n + 1); if (population < 1) { nlopt_stop_msg(stop, "population %d is too small", population); return NLOPT_INVALID_ARGS; } survivors = (int) ceil(population * SURVIVOR); taup = PHI / sqrt(2*n); tau = PHI / sqrt(2*sqrt(n)); /* we don't handle unbounded search regions */ for (j = 0; j < n; ++j) if (nlopt_isinf(lb[j]) || nlopt_isinf(ub[j])) { nlopt_stop_msg(stop, "isres requires a finite search region"); return NLOPT_INVALID_ARGS; } ires = imax2(nlopt_max_constraint_dim(m, fc), nlopt_max_constraint_dim(p, h)); results = (double *) malloc(ires * sizeof(double)); if (ires > 0 && !results) return NLOPT_OUT_OF_MEMORY; sigmas = (double*) malloc(sizeof(double) * (population*n*2 + population + population + n)); if (!sigmas) { free(results); return NLOPT_OUT_OF_MEMORY; } xs = sigmas + population*n; fval = xs + population*n; penalty = fval + population; x0 = penalty + population; irank = (int*) malloc(sizeof(int) * population); if (!irank) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (k = 0; k < population; ++k) { for (j = 0; j < n; ++j) { sigmas[k*n+j] = (ub[j] - lb[j]) / sqrt(n); xs[k*n+j] = nlopt_urand(lb[j], ub[j]); } } memcpy(xs, x, sizeof(double) * n); /* use input x for xs_0 */ while (1) { /* each loop body = one generation */ int all_feasible = 1; /* evaluate f and constraint violations for whole population */ for (k = 0; k < population; ++k) { int feasible = 1; double gpenalty; ++ *(stop->nevals_p); fval[k] = f(n, xs + k*n, NULL, f_data); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } penalty[k] = 0; for (c = 0; c < m; ++c) { /* inequality constraints */ nlopt_eval_constraint(results, NULL, fc + c, n, xs + k*n); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (ires = 0; ires < fc[c].m; ++ires) { double gval = results[ires]; if (gval > fc[c].tol[ires]) feasible = 0; if (gval < 0) gval = 0; penalty[k] += gval*gval; } } gpenalty = penalty[k]; for (c = m; c < mp; ++c) { /* equality constraints */ nlopt_eval_constraint(results, NULL, h + (c-m), n, xs + k*n); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (ires = 0; ires < h[c-m].m; ++ires) { double hval = results[ires]; if (fabs(hval) > h[c-m].tol[ires]) feasible = 0; penalty[k] += hval*hval; } } if (penalty[k] > 0) all_feasible = 0; /* convergence criteria (FIXME: improve?) */ /* FIXME: with equality constraints, how do we decide which solution is the "best" so far? ... need some total order on the solutions? */ if ((penalty[k] <= minf_penalty || feasible) && (fval[k] <= *minf || minf_gpenalty > 0) && ((feasible ? 0 : penalty[k]) != minf_penalty || fval[k] != *minf)) { if (fval[k] < stop->minf_max && feasible) ret = NLOPT_MINF_MAX_REACHED; else if (!nlopt_isinf(*minf)) { if (nlopt_stop_f(stop, fval[k], *minf) && nlopt_stop_f(stop, feasible ? 0 : penalty[k], minf_penalty)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, xs+k*n, x)) ret = NLOPT_XTOL_REACHED; } memcpy(x, xs+k*n, sizeof(double)*n); *minf = fval[k]; minf_penalty = feasible ? 0 : penalty[k]; minf_gpenalty = feasible ? 0 : gpenalty; if (ret != NLOPT_SUCCESS) goto done; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; if (ret != NLOPT_SUCCESS) goto done; } /* "selection" step: rank the population */ for (k = 0; k < population; ++k) irank[k] = k; if (all_feasible) /* special case: rank by objective function */ nlopt_qsort_r(irank, population, sizeof(int), fval,key_compare); else { /* Runarsson & Yao's stochastic ranking of the population */ for (i = 0; i < population; ++i) { int swapped = 0; for (j = 0; j < population-1; ++j) { double u = nlopt_urand(0,1); if (u < PF || (penalty[irank[j]] == 0 && penalty[irank[j+1]] == 0)) { if (fval[irank[j]] > fval[irank[j+1]]) { int irankj = irank[j]; irank[j] = irank[j+1]; irank[j+1] = irankj; swapped = 1; } } else if (penalty[irank[j]] > penalty[irank[j+1]]) { int irankj = irank[j]; irank[j] = irank[j+1]; irank[j+1] = irankj; swapped = 1; } } if (!swapped) break; } } /* evolve the population: differential evolution for the best survivors, and standard mutation of the best survivors for the rest: */ for (k = survivors; k < population; ++k) { /* standard mutation */ double taup_rand = taup * nlopt_nrand(0,1); int rk = irank[k], ri; i = k % survivors; ri = irank[i]; for (j = 0; j < n; ++j) { double sigmamax = (ub[j] - lb[j]) / sqrt(n); sigmas[rk*n+j] = sigmas[ri*n+j] * exp(taup_rand + tau*nlopt_nrand(0,1)); if (sigmas[rk*n+j] > sigmamax) sigmas[rk*n+j] = sigmamax; do { xs[rk*n+j] = xs[ri*n+j] + sigmas[rk*n+j] * nlopt_nrand(0,1); } while (xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]); sigmas[rk*n+j] = sigmas[ri*n+j] + ALPHA*(sigmas[rk*n+j] - sigmas[ri*n+j]); } } memcpy(x0, xs, n * sizeof(double)); for (k = 0; k < survivors; ++k) { /* differential variation */ double taup_rand = taup * nlopt_nrand(0,1); int rk = irank[k]; for (j = 0; j < n; ++j) { double xi = xs[rk*n+j]; if (k+1 < survivors) xs[rk*n+j] += GAMMA * (x0[j] - xs[(k+1)*n+j]); if (k+1 == survivors || xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]) { /* standard mutation for last survivor and for any survivor components that are now outside the bounds */ double sigmamax = (ub[j] - lb[j]) / sqrt(n); double sigi = sigmas[rk*n+j]; sigmas[rk*n+j] *= exp(taup_rand + tau*nlopt_nrand(0,1)); if (sigmas[rk*n+j] > sigmamax) sigmas[rk*n+j] = sigmamax; do { xs[rk*n+j] = xi + sigmas[rk*n+j] * nlopt_nrand(0,1); } while (xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]); sigmas[rk*n+j] = sigi + ALPHA * (sigmas[rk*n+j] - sigi); } } } } done: if (irank) free(irank); if (sigmas) free(sigmas); if (results) free(results); return ret; } stevengj-nlopt-88c424d/src/algs/isres/isres.h000066400000000000000000000033051521061417600211770ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef ISRES_H #define ISRES_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result isres_minimize(int n, nlopt_func f, void *f_data, int m, nlopt_constraint *fc, /* fc <= 0 */ int p, nlopt_constraint *h, /* h == 0 */ const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int population); /* init. population */ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/luksan/000077500000000000000000000000001521061417600200505ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/luksan/COPYRIGHT000066400000000000000000000037661521061417600213570ustar00rootroot00000000000000--------------------------------------------------------------------------- Copyright: Subroutines PBUN, PNEW, PVAR, PSEN, Copyright ACM, 2001. The original versions were published in Transactions on Mathematical Software, Vol.27, 2001, pp.193-213. Here are the author's modifications. They are posted here by permission of ACM for your personal use. Not for redistribution. Subroutines PLIP, PSEN, Copyright Jan Vlcek, 2007. The remaining subroutines, Copyright Ladislav Luksan, 2007. Many of sparse matrix modules were prepared by Miroslav Tuma. License: This library (with exception of PBUN, PNEW, PVAR, PSEN) is a 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 (see http://www.gnu.org/copyleft/gpl.html). 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. Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and "Used by permission." Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. Availability: http://www.cs.cas.cz/~luksan/subroutines.html Acknowledgements: This work was supported by the Grant Agency of the Czech Academy of Sciences, under grant IAA1030405. stevengj-nlopt-88c424d/src/algs/luksan/README000066400000000000000000000021201521061417600207230ustar00rootroot00000000000000These routines for nonlinear optimization are based on the Fortran 77 code placed online by Professor Ladislav Luksan at his web site: http://www.uivt.cas.cz/~luksan/subroutines.html and graciously licensed under the GNU Lesser General Public License (LGPL). See also the COPYRIGHT file for details. The C conversions were done via f2c by S. G. Johnson, with the f2c output manually cleaned up somewhat, and then converted to use the NLopt termination conditions, C dynamic allocation, etc. In particular, we converted the subroutines PLIS, PLIP, and PNET (as well as various auxiliary routines required by this code), all of which solve general nonlinear unconstrained or box-constrained optimization problems. Prof. Luksan also provides a large number of more specialized routines for cases where one has additional knowledge of the objective function, but these cases seem outside the scope of NLopt. [We also did not convert the PMIN, PBUN, PNEW, or PVAR subroutines since these were published in ACM Trans. on Math. Software (TOMS) and are subject to the non-free ACM licensing conditions.] stevengj-nlopt-88c424d/src/algs/luksan/luksan.h000066400000000000000000000132631521061417600215230ustar00rootroot00000000000000#ifndef LUKSAN_H #define LUKSAN_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result luksan_plis(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, double tolg); nlopt_result luksan_plip(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, int method, double tolg); nlopt_result luksan_pnet(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, int mos1, int mos2, double tolg); typedef struct { double fl, fu, pl, rl, pu, ru; int mes1, mes2, mes3, mode, mtyp; } ps1l01_state; /***************************** internal routines *************************/ /* mssubs.c: */ void luksan_mxdcmd__(int *n, int *m, double *a, double *x, double *alf, double *y, double *z__); void luksan_mxdrcb__(int *n, int *m, double *a, double *b, double *u, double *v, double *x, int * ix, int *job); void luksan_mxdrcf__(int *n, int *m, double *a, double *b, double *u, double *v, double *x, int * ix, int *job); void luksan_mxdrmm__(int *n, int *m, double *a, double *x, double *y); void luksan_mxdrsu__(int *n, int *m, double *a, double *b, double *u); void luksan_mxucop__(int *n, double *x, double *y, int *ix, int *job); void luksan_mxudir__(int *n, double *a, double *x, double *y, double *z__, int *ix, int *job); void luksan_mxuneg__(int *n, double *x, double *y, int *ix, int *job); void luksan_mxuzer__(int *n, double *x, int *ix, int *job); void luksan_mxvcop__(int *n, double *x, double *y); void luksan_mxvdif__(int *n, double *x, double *y, double *z__); void luksan_mxvneg__(int *n, double *x, double *y); void luksan_mxvscl__(int *n, double *a, double *x, double *y); void luksan_mxvset__(int *n, double *a, double *x); double luksan_mxudot__(int *n, double *x, double *y, int *ix, int *job); double luksan_mxvdot__(int *n, double *x, double *y); void luksan_mxvdir__(int *n, double *a, double *x, double *y, double *z__); void luksan_mxdcmu__(int *n, int *m, double *a, double *alf, double *x, double *y); void luksan_mxvlin__(int *n, double *a, double *x, double *b, double *y, double *z__); void luksan_mxdcmv__(int *n, int *m, double *a, double *alf, double *x, double *u, double *bet, double *y, double *v); void luksan_mxvsav__(int *n, double *x, double *y); void luksan_mxvine__(int *n, int *ix); double luksan_mxvmax__(int *n, double *x); /* pssubs.c: */ void luksan_pcbs04__(int *nf, double *x, int *ix, double *xl, double *xu, double *eps9, int *kbf); void luksan_ps1l01__(double *r__, double *rp, double *f, double *fo, double *fp, double *p, double *po, double *pp, double *minf, double *fmax, double *rmin, double *rmax, double *tols, double * tolp, double *par1, double *par2, int *kd, int *ld, int *nit, int *kit, int *nred, int *mred, int * maxst, int *iest, int *inits, int *iters, int *kters, int *mes, int *isys, ps1l01_state *state); void luksan_pulsp3__(int *n, int *m, int *mf, double *xm, double *gr, double *xo, double *go, double *r__, double *po, double *sig, int *iterh, int *met3); void luksan_pulvp3__(int *n, int *m, double *xm, double *xr, double *gr, double *s, double *so, double *xo, double *go, double *r__, double *po, double *sig, int *iterh, int *met2, int *met3, int *met5); void luksan_pyadc0__(int *nf, int *n, double *x, int *ix, double *xl, double *xu, int *inew); void luksan_pyfut1__(int *n, double *f, double * fo, double *umax, double *gmax, int xstop, const nlopt_stopping *stop, double *tolg, int *kd, int *nit, int *kit, int *mit, int *nfg, int *mfg, int *ntesx, int *mtesx, int *ntesf, int *mtesf, int *ites, int *ires1, int *ires2, int *irest, int *iters, int *iterm); void luksan_pyrmc0__(int *nf, int *n, int *ix, double *g, double *eps8, double *umax, double *gmax, double *rmax, int *iold, int *irest); void luksan_pytrcd__(int *nf, double *x, int *ix, double *xo, double *g, double *go, double *r__, double *f, double *fo, double *p, double *po, double *dmax__, int *kbf, int *kd, int *ld, int * iters); void luksan_pytrcg__(int *nf, int *n, int *ix, double *g, double *umax, double *gmax, int *kbf, int *iold); void luksan_pytrcs__(int *nf, double *x, int *ix, double *xo, double *xl, double *xu, double *g, double *go, double *s, double *ro, double *fp, double *fo, double *f, double *po, double *p, double *rmax, double *eta9, int *kbf); void luksan_pnint1__(double *rl, double *ru, double *fl, double *fu, double *pl, double *pu, double *r__, int *mode, int *mtyp, int *merr); /* Common Block Declarations */ typedef struct { int nres, ndec, nin, nit; /* int nfv; -- now stored in stop->nevals_p */ int nfg, nfh; } stat_common; /* number of double variables that can be stored in scratch memory ... it's >= 2007, and this is in the context of scientific computation, so assume that at least 10M are available, and that sizeof(double)==8 */ #define MEMAVAIL 1310720 #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* LUKSAN_H */ stevengj-nlopt-88c424d/src/algs/luksan/mssubs.c000066400000000000000000000563221521061417600215400ustar00rootroot00000000000000#include #include "luksan.h" #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define iabs(a) ((a) < 0 ? -(a) : (a)) /* subroutines extracted from mssubs.for */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* FUNCTION MXVMAX ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* L-INFINITY NORM OF A VECTOR. */ /* PARAMETERS : */ /* II N VECTOR DIMENSION. */ /* RI X(N) INPUT VECTOR. */ /* RR MXVMAX L-INFINITY NORM OF THE VECTOR X. */ double luksan_mxvmax__(int *n, double *x) { /* System generated locals */ int i__1; double d__1, d__2, d__3; /* Local variables */ int i__; double mxvmax; /* Parameter adjustments */ --x; /* Function Body */ mxvmax = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = mxvmax, d__3 = (d__1 = x[i__], fabs(d__1)); mxvmax = MAX2(d__2,d__3); /* L1: */ } return mxvmax; } /* luksan_mxvmax__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVINE ALL SYSTEMS 94/12/01 */ /* PURPOSE : */ /* ELEMENTS OF THE INTEGER VECTOR ARE REPLACED BY THEIR ABSOLUTE VALUES. */ /* PARAMETERS : */ /* II N DIMENSION OF THE INTEGER VECTOR. */ /* IU IX(N) INTEGER VECTOR WHICH IS UPDATED SO THAT IX(I):=ABS(IX(I)) */ /* FOR ALL I. */ void luksan_mxvine__(int *n, int *ix) { /* System generated locals */ int i__1, i__2; /* Local variables */ int i__; /* Parameter adjustments */ --ix; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ix[i__] = (i__2 = ix[i__], iabs(i__2)); /* L1: */ } return; } /* luksan_mxvine__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDCMV ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* RANK-TWO UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A. */ /* THIS MATRIX IS UPDATED BY THE RULE A:=A+ALF*X*TRANS(U)+BET*Y*TRANS(V). */ /* PARAMETERS : */ /* II N NUMBER OF ROWS OF THE MATRIX A. */ /* II M NUMBER OF COLUMNS OF THE MATRIX A. */ /* RU A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE */ /* ONE-DIMENSIONAL ARRAY. */ /* RI ALF SCALAR PARAMETER. */ /* RI X(N) INPUT VECTOR. */ /* RI U(M) INPUT VECTOR. */ /* RI BET SCALAR PARAMETER. */ /* RI Y(N) INPUT VECTOR. */ /* RI V(M) INPUT VECTOR. */ void luksan_mxdcmv__(int *n, int *m, double *a, double *alf, double *x, double *u, double *bet, double *y, double *v) { /* System generated locals */ int i__1, i__2; /* Local variables */ int i__, j, k; double tempa, tempb; /* Parameter adjustments */ --v; --y; --u; --x; --a; /* Function Body */ k = 0; i__1 = *m; for (j = 1; j <= i__1; ++j) { tempa = *alf * u[j]; tempb = *bet * v[j]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { a[k + i__] = a[k + i__] + tempa * x[i__] + tempb * y[i__]; /* L1: */ } k += *n; /* L2: */ } return; } /* luksan_mxdcmv__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVSAV ALL SYSTEMS 91/12/01 */ /* PORTABILITY : ALL SYSTEMS */ /* 91/12/01 LU : ORIGINAL VERSION */ /* PURPOSE : */ /* DIFFERENCE OF TWO VECTORS RETURNED IN THE SUBTRACTED ONE. */ /* PARAMETERS : */ /* II N VECTOR DIMENSION. */ /* RI X(N) INPUT VECTOR. */ /* RU Y(N) UPDATE VECTOR WHERE Y:= X - Y. */ void luksan_mxvsav__(int *n, double *x, double *y) { /* System generated locals */ int i__1; /* Local variables */ int i__; double temp; /* Parameter adjustments */ --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = y[i__]; y[i__] = x[i__] - y[i__]; x[i__] = temp; /* L10: */ } return; } /* luksan_mxvsav__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVLIN ALL SYSTEMS 92/12/01 */ /* PURPOSE : */ /* LINEAR COMBINATION OF TWO VECTORS. */ /* PARAMETERS : */ /* II N VECTOR DIMENSION. */ /* RI A SCALING FACTOR. */ /* RI X(N) INPUT VECTOR. */ /* RI B SCALING FACTOR. */ /* RI Y(N) INPUT VECTOR. */ /* RO Z(N) OUTPUT VECTOR WHERE Z:= A*X + B*Y. */ void luksan_mxvlin__(int *n, double *a, double *x, double *b, double *y, double *z__) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --z__; --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { z__[i__] = *a * x[i__] + *b * y[i__]; /* L1: */ } return; } /* luksan_mxvlin__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDCMU ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A. THIS MATRIX */ /* IS UPDATED BY THE RULE A:=A+ALF*X*TRANS(Y). */ /* PARAMETERS : */ /* II N NUMBER OF ROWS OF THE MATRIX A. */ /* II M NUMBER OF COLUMNS OF THE MATRIX A. */ /* RU A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE */ /* ONE-DIMENSIONAL ARRAY. */ /* RI ALF SCALAR PARAMETER. */ /* RI X(N) INPUT VECTOR. */ /* RI Y(M) INPUT VECTOR. */ void luksan_mxdcmu__(int *n, int *m, double *a, double *alf, double *x, double *y) { /* System generated locals */ int i__1, i__2; /* Local variables */ int i__, j, k; double temp; /* Parameter adjustments */ --y; --x; --a; /* Function Body */ k = 0; i__1 = *m; for (j = 1; j <= i__1; ++j) { temp = *alf * y[j]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { a[k + i__] += temp * x[i__]; /* L1: */ } k += *n; /* L2: */ } return; } /* luksan_mxdcmu__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVDIR ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* VECTOR AUGMENTED BY THE SCALED VECTOR. */ /* PARAMETERS : */ /* II N VECTOR DIMENSION. */ /* RI A SCALING FACTOR. */ /* RI X(N) INPUT VECTOR. */ /* RI Y(N) INPUT VECTOR. */ /* RO Z(N) OUTPUT VECTOR WHERE Z:= Y + A*X. */ void luksan_mxvdir__(int *n, double *a, double *x, double *y, double *z__) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --z__; --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { z__[i__] = y[i__] + *a * x[i__]; /* L10: */ } } /* luksan_mxvdir__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDCMD ALL SYSTEMS 91/12/01 * PURPOSE : * MULTIPLICATION OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A * BY A VECTOR X AND ADDITION OF THE SCALED VECTOR ALF*Y. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II M NUMBER OF COLUMNS OF THE MATRIX A. * RI A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI X(M) INPUT VECTOR. * RI ALF SCALING FACTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR EQUAL TO A*X+ALF*Y. * * SUBPROGRAMS USED : * S MXVDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * S MXVSCL SCALING OF A VECTOR. */ void luksan_mxdcmd__(int *n, int *m, double *a, double *x, double *alf, double *y, double *z__) { /* System generated locals */ int i__1; /* Local variables */ int j, k; /* Parameter adjustments */ --z__; --y; --x; --a; /* Function Body */ luksan_mxvscl__(n, alf, &y[1], &z__[1]); k = 0; i__1 = *m; for (j = 1; j <= i__1; ++j) { luksan_mxvdir__(n, &x[j], &a[k + 1], &z__[1], &z__[1]); k += *n; /* L1: */ } return; } /* luksan_mxdcmd__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDRCB ALL SYSTEMS 91/12/01 * PURPOSE : * BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION OF * THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRICES A AND B. * II M NUMBER OF COLUMNS OF THE MATRICES A AND B. * RI A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI U(M) VECTOR OF SCALAR COEFFICIENTS. * RO V(M) VECTOR OF SCALAR COEFFICIENTS. * RU X(N) PREMULTIPLIED VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * * SUBPROGRAM USED : * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF VECTORS. * * METHOD : * H.MATTHIES, G.STRANG: THE SOLUTION OF NONLINEAR FINITE ELEMENT * EQUATIONS. INT.J.NUMER. METHODS ENGN. 14 (1979) 1613-1626. */ void luksan_mxdrcb__(int *n, int *m, double *a, double *b, double *u, double *v, double *x, int * ix, int *job) { /* System generated locals */ int i__1; double d__1; /* Local variables */ int i__, k; /* Parameter adjustments */ --ix; --x; --v; --u; --b; --a; /* Function Body */ k = 1; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { v[i__] = u[i__] * luksan_mxudot__(n, &x[1], &a[k], &ix[1], job); d__1 = -v[i__]; luksan_mxudir__(n, &d__1, &b[k], &x[1], &x[1], &ix[1], job); k += *n; /* L1: */ } return; } /* luksan_mxdrcb__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDRCF ALL SYSTEMS 91/12/01 * PURPOSE : * FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION OF * THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRICES A AND B. * II M NUMBER OF COLUMNS OF THE MATRICES A AND B. * RI A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI U(M) VECTOR OF SCALAR COEFFICIENTS. * RI V(M) VECTOR OF SCALAR COEFFICIENTS. * RU X(N) PREMULTIPLIED VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * * SUBPROGRAM USED : * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF VECTORS. * * METHOD : * H.MATTHIES, G.STRANG: THE SOLUTION OF NONLINEAR FINITE ELEMENT * EQUATIONS. INT.J.NUMER. METHODS ENGN. 14 (1979) 1613-1626. */ void luksan_mxdrcf__(int *n, int *m, double *a, double *b, double *u, double *v, double *x, int * ix, int *job) { /* System generated locals */ double d__1; /* Local variables */ int i__, k; double temp; /* Parameter adjustments */ --ix; --x; --v; --u; --b; --a; /* Function Body */ k = (*m - 1) * *n + 1; for (i__ = *m; i__ >= 1; --i__) { temp = u[i__] * luksan_mxudot__(n, &x[1], &b[k], &ix[1], job); d__1 = v[i__] - temp; luksan_mxudir__(n, &d__1, &a[k], &x[1], &x[1], &ix[1], job); k -= *n; /* L1: */ } return; } /* luksan_mxdrcf__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDRMM ALL SYSTEMS 91/12/01 * PURPOSE : * MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR MATRIX A BY * A VECTOR X. * * PARAMETERS : * II N NUMBER OF COLUMNS OF THE MATRIX A. * II M NUMBER OF ROWS OF THE MATRIX A. * RI A(M*N) RECTANGULAR MATRIX STORED ROWWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI X(N) INPUT VECTOR. * RO Y(M) OUTPUT VECTOR EQUAL TO A*X. */ void luksan_mxdrmm__(int *n, int *m, double *a, double *x, double *y) { /* System generated locals */ int i__1, i__2; /* Local variables */ int i__, j, k; double temp; /* Parameter adjustments */ --y; --x; --a; /* Function Body */ k = 0; i__1 = *m; for (j = 1; j <= i__1; ++j) { temp = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[k + i__] * x[i__]; /* L1: */ } y[j] = temp; k += *n; /* L2: */ } return; } /* luksan_mxdrmm__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXDRSU ALL SYSTEMS 91/12/01 * PURPOSE : * SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. SHIFT OF * ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN THE LIMITED * MEMORY BFGS METHOD. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A AND B. * II M NUMBER OF COLUMNS OF THE MATRIX A AND B. * RU A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RU B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RU U(M) VECTOR. */ void luksan_mxdrsu__(int *n, int *m, double *a, double *b, double *u) { int i__, k, l; /* Parameter adjustments */ --u; --b; --a; /* Function Body */ k = (*m - 1) * *n + 1; for (i__ = *m - 1; i__ >= 1; --i__) { l = k - *n; luksan_mxvcop__(n, &a[l], &a[k]); luksan_mxvcop__(n, &b[l], &b[k]); u[i__ + 1] = u[i__]; k = l; /* L1: */ } return; } /* luksan_mxdrsu__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXUCOP ALL SYSTEMS 99/12/01 * PURPOSE : * COPY OF THE VECTOR WITH INITIATION OF THE ACTIVE PART. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. */ void luksan_mxucop__(int *n, double *x, double *y, int *ix, int *job) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --ix; --y; --x; /* Function Body */ if (*job == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = x[i__]; /* L1: */ } } else if (*job > 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] >= 0) { y[i__] = x[i__]; } else { y[i__] = 0.; } /* L2: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] != -5) { y[i__] = x[i__]; } else { y[i__] = 0.; } /* L3: */ } } return; } /* luksan_mxucop__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXUDIR ALL SYSTEMS 99/12/01 * PURPOSE : * VECTOR AUGMENTED BY THE SCALED VECTOR IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A SCALING FACTOR. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= Y + A*X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. */ void luksan_mxudir__(int *n, double *a, double *x, double *y, double *z__, int *ix, int *job) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --ix; --z__; --y; --x; /* Function Body */ if (*job == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { z__[i__] = y[i__] + *a * x[i__]; /* L1: */ } } else if (*job > 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] >= 0) { z__[i__] = y[i__] + *a * x[i__]; } /* L2: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] != -5) { z__[i__] = y[i__] + *a * x[i__]; } /* L3: */ } } return; } /* luksan_mxudir__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* FUNCTION MXVDOT ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* DOT PRODUCT OF TWO VECTORS. */ /* PARAMETERS : */ /* II N VECTOR DIMENSION. */ /* RI X(N) INPUT VECTOR. */ /* RI Y(N) INPUT VECTOR. */ /* RR MXVDOT VALUE OF DOT PRODUCT MXVDOT=TRANS(X)*Y. */ double luksan_mxvdot__(int *n, double *x, double *y) { /* System generated locals */ int i__1; /* Local variables */ int i__; double temp; /* Parameter adjustments */ --y; --x; /* Function Body */ temp = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp += x[i__] * y[i__]; /* L10: */ } return temp; } /* luksan_mxvdot__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* FUNCTION MXUDOT ALL SYSTEMS 99/12/01 * PURPOSE : * DOT PRODUCT OF VECTORS IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * RR MXUDOT VALUE OF DOT PRODUCT MXUDOT=TRANS(X)*Y. */ double luksan_mxudot__(int *n, double *x, double *y, int *ix, int *job) { /* System generated locals */ int i__1; /* Local variables */ int i__; double temp; /* Parameter adjustments */ --ix; --y; --x; /* Function Body */ temp = 0.; if (*job == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp += x[i__] * y[i__]; /* L1: */ } } else if (*job > 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] >= 0) { temp += x[i__] * y[i__]; } /* L2: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] != -5) { temp += x[i__] * y[i__]; } /* L3: */ } } return temp; } /* luksan_mxudot__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXUNEG ALL SYSTEMS 00/12/01 * PURPOSE : * COPY OF THE VECTOR WITH INITIATION OF THE ACTIVE PART. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. */ void luksan_mxuneg__(int *n, double *x, double *y, int *ix, int *job) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --ix; --y; --x; /* Function Body */ if (*job == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = -x[i__]; /* L1: */ } } else if (*job > 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] >= 0) { y[i__] = -x[i__]; } else { y[i__] = 0.; } /* L2: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] != -5) { y[i__] = -x[i__]; } else { y[i__] = 0.; } /* L3: */ } } return; } /* luksan_mxuneg__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXUZER ALL SYSTEMS 99/12/01 * PURPOSE : * VECTOR ELEMENTS CORRESPONDING TO ACTIVE BOUNDS ARE SET TO ZERO. * * PARAMETERS : * II N VECTOR DIMENSION. * RO X(N) OUTPUT VECTOR SUCH THAT X(I)=A FOR ALL I. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. */ void luksan_mxuzer__(int *n, double *x, int *ix, int *job) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --ix; --x; /* Function Body */ if (*job == 0) { return; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] < 0) { x[i__] = 0.; } /* L1: */ } return; } /* luksan_mxuzer__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVCOP ALL SYSTEMS 88/12/01 * PURPOSE : * COPYING OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. */ void luksan_mxvcop__(int *n, double *x, double *y) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = x[i__]; /* L10: */ } return; } /* luksan_mxvcop__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVDIF ALL SYSTEMS 88/12/01 * PURPOSE : * VECTOR DIFFERENCE. * * PARAMETERS : * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= X - Y. */ void luksan_mxvdif__(int *n, double *x, double *y, double *z__) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --z__; --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { z__[i__] = x[i__] - y[i__]; /* L10: */ } return; } /* luksan_mxvdif__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVNEG ALL SYSTEMS 88/12/01 * PURPOSE : * CHANGE THE SIGNS OF VECTOR ELEMENTS. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= - X. */ void luksan_mxvneg__(int *n, double *x, double *y) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = -x[i__]; /* L10: */ } return; } /* luksan_mxvneg__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVSCL ALL SYSTEMS 88/12/01 * PURPOSE : * SCALING OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI A SCALING FACTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= A*X. */ void luksan_mxvscl__(int *n, double *a, double *x, double *y) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *a * x[i__]; /* L1: */ } return; } /* luksan_mxvscl__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE MXVSET ALL SYSTEMS 88/12/01 * PURPOSE : * A SCALAR IS SET TO ALL THE ELEMENTS OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A INITIAL VALUE. * RO X(N) OUTPUT VECTOR SUCH THAT X(I)=A FOR ALL I. */ void luksan_mxvset__(int *n, double *a, double *x) { /* System generated locals */ int i__1; /* Local variables */ int i__; /* Parameter adjustments */ --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = *a; /* L10: */ } return; } /* luksan_mxvset__ */ stevengj-nlopt-88c424d/src/algs/luksan/mssubs.for000066400000000000000000003323031521061417600221000ustar00rootroot00000000000000* SUBROUTINE MXBSBM ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF A BLOCKED SYMMETRIC MATRIX A BY A VECTOR X. * * PARAMETERS : * PARAMETERS : * II L BLOCK DIMENSION. * RI ABL(L*(L+1)/2) VALUES OF NONZERO ELEMENTS OF THE GIVEN BLOCK. * II JBL(L) INDICES OF THE INDIVIDUAL BLOCKS * RI X(N) UNPACKED INPUT VECTOR. * RI Y(N) UNPACKED OR PACKED OUTPUT VECTOR EQUAL TO A*X. * II JOB FORM OF THE VECTOR Y. JOB=1-UNPACKED FORM. JOB=2-PACKED * FORM. * SUBROUTINE MXBSBM(L,ABL,JBL,X,Y,JOB) INTEGER L,JBL(*),JOB DOUBLE PRECISION ABL(*),X(*),Y(*) INTEGER I,J,IP,JP,K DOUBLE PRECISION TEMP DOUBLE PRECISION ZERO PARAMETER (ZERO = 0.0D 0) DO 1 I=1,L IP=JBL(I) IF (IP.GT.0) THEN IF (JOB.EQ.1) THEN Y(IP)=ZERO ELSE Y(I)=ZERO END IF END IF 1 CONTINUE K=0 DO 4 I=1,L IP=JBL(I) IF (IP.GT.0) TEMP=X(IP) IF (JOB.EQ.1) THEN DO 2 J=1,I-1 JP=JBL(J) K=K+1 IF (IP.GT.0.AND.JP.GT.0) THEN Y(IP)=Y(IP)+ABL(K)*X(JP) Y(JP)=Y(JP)+ABL(K)*TEMP END IF 2 CONTINUE K=K+1 IF (IP.GT.0) Y(IP)=Y(IP)+ABL(K)*TEMP ELSE DO 3 J=1,I-1 JP=JBL(J) K=K+1 IF (IP.GT.0.AND.JP.GT.0) THEN Y(I)=Y(I)+ABL(K)*X(JP) Y(J)=Y(J)+ABL(K)*TEMP END IF 3 CONTINUE K=K+1 IF (IP.GT.0) Y(I)=Y(I)+ABL(K)*TEMP END IF 4 CONTINUE RETURN END * SUBROUTINE MXBSBU ALL SYSTEMS 92/12/01 * PURPOSE : * CORRECTION OF A BLOCKED SYMMETRIC MATRIX A. THE CORRECTION IS DEFINED * AS A:=A+ALF*X*TRANS(X) WHERE ALF IS A GIVEN SCALING FACTOR AND X IS * A GIVEN VECTOR. * * PARAMETERS : * II L BLOCK DIMENSION. * RI ABL(L*(L+1)/2) VALUES OF NONZERO ELEMENTS OF THE GIVEN BLOCK. * II JBL(L) INDICES OF THE INDIVIDUAL BLOCKS * RI ALF SCALING FACTOR. * RI X(N) UNPACKED OR PACKED INPUT VECTOR. * II JOB FORM OF THE VECTOR X. JOB=1-UNPACKED FORM. JOB=2-PACKED * FORM. * SUBROUTINE MXBSBU(L,ABL,JBL,ALF,X,JOB) INTEGER L,JBL(*),JOB DOUBLE PRECISION ABL(*),ALF,X(*) INTEGER I,J,IP,JP,K K=0 IF (JOB.EQ.1) THEN DO 3 I=1,L IP=JBL(I) DO 2 J=1,I JP=JBL(J) K=K+1 IF (IP.GT.0.AND.JP.GT.0) THEN ABL(K)=ABL(K)+ALF*X(IP)*X(JP) END IF 2 CONTINUE 3 CONTINUE ELSE DO 5 I=1,L IP=JBL(I) DO 4 J=1,I JP=JBL(J) K=K+1 IF (IP.GT.0.AND.JP.GT.0) THEN ABL(K)=ABL(K)+ALF*X(I)*X(J) END IF 4 CONTINUE 5 CONTINUE END IF RETURN END * SUBROUTINE MXBSMI ALL SYSTEMS 91/12/01 * PURPOSE : * BLOCKS OF THE SYMMETRIC BLOCKED MATRIX ARE SET TO THE UNIT MATRICES. * * PARAMETERS : * II NBLKS NUMBER OF BLOCKS OF THE MATRIX. * RI ABL(NBLA) VALUES OF THE NONZERO ELEMENTS OF THE MATRIX. * II IBLBG(NBLKS+1) BEGINNINGS OF THE BLOCKS IN THE MATRIX. * * SUBROUTINES USED : * MXDSMI DENSE SYMMETRIC MATRIX IS SET TO THE UNIT MATRIX. * SUBROUTINE MXBSMI(NBLKS,ABL,IBLBG) INTEGER NBLKS,IBLBG(*) DOUBLE PRECISION ABL(*) INTEGER I,K,KBEG,KLEN K=1 DO 1 I=1,NBLKS KBEG=IBLBG(I) KLEN=IBLBG(I+1)-KBEG CALL MXDSMI(KLEN,ABL(K)) K=K+KLEN*(KLEN+1)/2 1 CONTINUE RETURN END * SUBROUTINE MXDCMD ALL SYSTEMS 91/12/01 * PURPOSE : * MULTIPLICATION OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A * BY A VECTOR X AND ADDITION OF THE SCALED VECTOR ALF*Y. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II M NUMBER OF COLUMNS OF THE MATRIX A. * RI A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI X(M) INPUT VECTOR. * RI ALF SCALING FACTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR EQUAL TO A*X+ALF*Y. * * SUBPROGRAMS USED : * S MXVDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * S MXVSCL SCALING OF A VECTOR. * SUBROUTINE MXDCMD(N,M,A,X,ALF,Y,Z) INTEGER N,M DOUBLE PRECISION A(*),X(*),ALF,Y(*),Z(*) INTEGER J,K CALL MXVSCL(N,ALF,Y,Z) K=0 DO 1 J=1,M CALL MXVDIR(N,X(J),A(K+1),Z,Z) K=K+N 1 CONTINUE RETURN END * SUBROUTINE MXDCMU ALL SYSTEMS 91/12/01 * PURPOSE : * UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A. THIS MATRIX * IS UPDATED BY THE RULE A:=A+ALF*X*TRANS(Y). * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II M NUMBER OF COLUMNS OF THE MATRIX A. * RU A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI ALF SCALAR PARAMETER. * RI X(N) INPUT VECTOR. * RI Y(M) INPUT VECTOR. * SUBROUTINE MXDCMU(N,M,A,ALF,X,Y) INTEGER N,M DOUBLE PRECISION A(*),ALF,X(*),Y(*) DOUBLE PRECISION TEMP INTEGER I,J,K K=0 DO 2 J=1,M TEMP=ALF*Y(J) DO 1 I=1,N A(K+I)=A(K+I)+TEMP*X(I) 1 CONTINUE K=K+N 2 CONTINUE RETURN END * SUBROUTINE MXDCMV ALL SYSTEMS 91/12/01 * PURPOSE : * RANK-TWO UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX A. * THIS MATRIX IS UPDATED BY THE RULE A:=A+ALF*X*TRANS(U)+BET*Y*TRANS(V). * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II M NUMBER OF COLUMNS OF THE MATRIX A. * RU A(N*M) RECTANGULAR MATRIX STORED COLUMNWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI ALF SCALAR PARAMETER. * RI X(N) INPUT VECTOR. * RI U(M) INPUT VECTOR. * RI BET SCALAR PARAMETER. * RI Y(N) INPUT VECTOR. * RI V(M) INPUT VECTOR. * SUBROUTINE MXDCMV(N,M,A,ALF,X,U,BET,Y,V) INTEGER N,M DOUBLE PRECISION A(*),ALF,X(*),U(*),BET,Y(*),V(*) DOUBLE PRECISION TEMPA,TEMPB INTEGER I,J,K K=0 DO 2 J=1,M TEMPA=ALF*U(J) TEMPB=BET*V(J) DO 1 I=1,N A(K+I)=A(K+I)+TEMPA*X(I)+TEMPB*Y(I) 1 CONTINUE K=K+N 2 CONTINUE RETURN END * SUBROUTINE MXDPGB ALL SYSTEMS 91/12/01 * PURPOSE : * SOLUTION OF A SYSTEM OF LINEAR EQUATIONS WITH A DENSE SYMMETRIC * POSITIVE DEFINITE MATRIX A+E USING THE FACTORIZATION A+E=L*D*TRANS(L) * OBTAINED BY THE SUBROUTINE MXDPGF. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(N*(N+1)/2) FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXDPGF. * RU X(N) ON INPUT THE RIGHT HAND SIDE OF A SYSTEM OF LINEAR * EQUATIONS. ON OUTPUT THE SOLUTION OF A SYSTEM OF LINEAR * EQUATIONS. * II JOB OPTION. IF JOB=0 THEN X:=(A+E)**(-1)*X. IF JOB>0 THEN * X:=L**(-1)*X. IF JOB<0 THEN X:=TRANS(L)**(-1)*X. * * METHOD : * BACK SUBSTITUTION * SUBROUTINE MXDPGB(N,A,X,JOB) INTEGER JOB,N DOUBLE PRECISION A(*),X(*) INTEGER I,II,IJ,J IF (JOB.GE.0) THEN * * PHASE 1 : X:=L**(-1)*X * IJ = 0 DO 20 I = 1,N DO 10 J = 1,I - 1 IJ = IJ + 1 X(I) = X(I) - A(IJ)*X(J) 10 CONTINUE IJ = IJ + 1 20 CONTINUE END IF IF (JOB.EQ.0) THEN * * PHASE 2 : X:=D**(-1)*X * II = 0 DO 30 I = 1,N II = II + I X(I) = X(I)/A(II) 30 CONTINUE END IF IF (JOB.LE.0) THEN * * PHASE 3 : X:=TRANS(L)**(-1)*X * II = N* (N-1)/2 DO 50 I = N - 1,1,-1 IJ = II DO 40 J = I + 1,N IJ = IJ + J - 1 X(I) = X(I) - A(IJ)*X(J) 40 CONTINUE II = II - I 50 CONTINUE END IF RETURN END * SUBROUTINE MXDPGF ALL SYSTEMS 89/12/01 * PURPOSE : * FACTORIZATION A+E=L*D*TRANS(L) OF A DENSE SYMMETRIC POSITIVE DEFINITE * MATRIX A+E WHERE D AND E ARE DIAGONAL POSITIVE DEFINITE MATRICES AND * L IS A LOWER TRIANGULAR MATRIX. IF A IS SUFFICIENTLY POSITIVE * DEFINITE THEN E=0. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RU A(N*(N+1)/2) ON INPUT A GIVEN DENSE SYMMETRIC (USUALLY POSITIVE * DEFINITE) MATRIX A STORED IN THE PACKED FORM. ON OUTPUT THE * COMPUTED FACTORIZATION A+E=L*D*TRANS(L). * IO INF AN INFORMATION OBTAINED IN THE FACTORIZATION PROCESS. IF * INF=0 THEN A IS SUFFICIENTLY POSITIVE DEFINITE AND E=0. IF * INF<0 THEN A IS NOT SUFFICIENTLY POSITIVE DEFINITE AND E>0. IF * INF>0 THEN A IS INDEFINITE AND INF IS AN INDEX OF THE * MOST NEGATIVE DIAGONAL ELEMENT USED IN THE FACTORIZATION * PROCESS. * RU ALF ON INPUT A DESIRED TOLERANCE FOR POSITIVE DEFINITENESS. ON * OUTPUT THE MOST NEGATIVE DIAGONAL ELEMENT USED IN THE * FACTORIZATION PROCESS (IF INF>0). * RO TAU MAXIMUM DIAGONAL ELEMENT OF THE MATRIX E. * * METHOD : * P.E.GILL, W.MURRAY : NEWTON TYPE METHODS FOR UNCONSTRAINED AND * LINEARLY CONSTRAINED OPTIMIZATION, MATH. PROGRAMMING 28 (1974) * PP. 311-350. * SUBROUTINE MXDPGF(N,A,INF,ALF,TAU) DOUBLE PRECISION ALF,TAU INTEGER INF,N DOUBLE PRECISION A(*) DOUBLE PRECISION BET,DEL,GAM,RHO,SIG,TOL INTEGER I,IJ,IK,J,K,KJ,KK,L L = 0 INF = 0 TOL = ALF * * ESTIMATION OF THE MATRIX NORM * ALF = 0.0D0 BET = 0.0D0 GAM = 0.0D0 TAU = 0.0D0 KK = 0 DO 20 K = 1,N KK = KK + K BET = MAX(BET,ABS(A(KK))) KJ = KK DO 10 J = K + 1,N KJ = KJ + J - 1 GAM = MAX(GAM,ABS(A(KJ))) 10 CONTINUE 20 CONTINUE BET = MAX(TOL,BET,GAM/N) * DEL = TOL*BET DEL = TOL*MAX(BET,1.0D0) KK = 0 DO 60 K = 1,N KK = KK + K * * DETERMINATION OF A DIAGONAL CORRECTION * SIG = A(KK) IF (ALF.GT.SIG) THEN ALF = SIG L = K END IF GAM = 0.0D0 KJ = KK DO 30 J = K + 1,N KJ = KJ + J - 1 GAM = MAX(GAM,ABS(A(KJ))) 30 CONTINUE GAM = GAM*GAM RHO = MAX(ABS(SIG),GAM/BET,DEL) IF (TAU.LT.RHO-SIG) THEN TAU = RHO - SIG INF = -1 END IF * * GAUSSIAN ELIMINATION * A(KK) = RHO KJ = KK DO 50 J = K + 1,N KJ = KJ + J - 1 GAM = A(KJ) A(KJ) = GAM/RHO IK = KK IJ = KJ DO 40 I = K + 1,J IK = IK + I - 1 IJ = IJ + 1 A(IJ) = A(IJ) - A(IK)*GAM 40 CONTINUE 50 CONTINUE 60 CONTINUE IF (L.GT.0 .AND. ABS(ALF).GT.DEL) INF = L RETURN END * SUBROUTINE MXDRMM ALL SYSTEMS 91/12/01 * PURPOSE : * MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR MATRIX A BY * A VECTOR X. * * PARAMETERS : * II N NUMBER OF COLUMNS OF THE MATRIX A. * II M NUMBER OF ROWS OF THE MATRIX A. * RI A(M*N) RECTANGULAR MATRIX STORED ROWWISE IN THE * ONE-DIMENSIONAL ARRAY. * RI X(N) INPUT VECTOR. * RO Y(M) OUTPUT VECTOR EQUAL TO A*X. * SUBROUTINE MXDRMM(N,M,A,X,Y) INTEGER N,M DOUBLE PRECISION A(*),X(*),Y(*) DOUBLE PRECISION TEMP INTEGER I,J,K DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D 0) K=0 DO 2 J=1,M TEMP=ZERO DO 1 I=1,N TEMP=TEMP+A(K+I)*X(I) 1 CONTINUE Y(J)=TEMP K=K+N 2 CONTINUE RETURN END * SUBROUTINE MXDRCB ALL SYSTEMS 91/12/01 * PURPOSE : * BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION OF * THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRICES A AND B. * II M NUMBER OF COLUMNS OF THE MATRICES A AND B. * RI A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI U(M) VECTOR OF SCALAR COEFFICIENTS. * RO V(M) VECTOR OF SCALAR COEFFICIENTS. * RU X(N) PREMULTIPLIED VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * * SUBPROGRAM USED : * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF VECTORS. * * METHOD : * H.MATTHIES, G.STRANG: THE SOLUTION OF NONLINEAR FINITE ELEMENT * EQUATIONS. INT.J.NUMER. METHODS ENGN. 14 (1979) 1613-1626. * SUBROUTINE MXDRCB(N,M,A,B,U,V,X,IX,JOB) INTEGER N,M,IX(*),JOB DOUBLE PRECISION A(*),B(*),U(*),V(*),X(*) DOUBLE PRECISION MXUDOT INTEGER I,K K=1 DO 1 I=1,M V(I)=U(I)*MXUDOT(N,X,A(K),IX,JOB) CALL MXUDIR(N,-V(I),B(K),X,X,IX,JOB) K=K+N 1 CONTINUE RETURN END * SUBROUTINE MXDRCF ALL SYSTEMS 91/12/01 * PURPOSE : * FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION OF * THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRICES A AND B. * II M NUMBER OF COLUMNS OF THE MATRICES A AND B. * RI A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RI U(M) VECTOR OF SCALAR COEFFICIENTS. * RI V(M) VECTOR OF SCALAR COEFFICIENTS. * RU X(N) PREMULTIPLIED VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * * SUBPROGRAM USED : * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF VECTORS. * * METHOD : * H.MATTHIES, G.STRANG: THE SOLUTION OF NONLINEAR FINITE ELEMENT * EQUATIONS. INT.J.NUMER. METHODS ENGN. 14 (1979) 1613-1626. * SUBROUTINE MXDRCF(N,M,A,B,U,V,X,IX,JOB) INTEGER N,M,IX(*),JOB DOUBLE PRECISION A(*),B(*),U(*),V(*),X(*) DOUBLE PRECISION TEMP,MXUDOT INTEGER I,K K=(M-1)*N+1 DO 1 I=M,1,-1 TEMP=U(I)*MXUDOT(N,X,B(K),IX,JOB) CALL MXUDIR(N,V(I)-TEMP,A(K),X,X,IX,JOB) K=K-N 1 CONTINUE RETURN END * SUBROUTINE MXDRSU ALL SYSTEMS 91/12/01 * PURPOSE : * SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. SHIFT OF * ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN THE LIMITED * MEMORY BFGS METHOD. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A AND B. * II M NUMBER OF COLUMNS OF THE MATRIX A AND B. * RU A(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RU B(N*M) RECTANGULAR MATRIX STORED AS A ONE-DIMENSIONAL ARRAY. * RU U(M) VECTOR. * SUBROUTINE MXDRSU(N,M,A,B,U) INTEGER N,M DOUBLE PRECISION A(*),B(*),U(*) INTEGER I,K,L K=(M-1)*N+1 DO 1 I=M-1,1,-1 L=K-N CALL MXVCOP(N,A(L),A(K)) CALL MXVCOP(N,B(L),B(K)) U(I+1)=U(I) K=L 1 CONTINUE RETURN END * SUBROUTINE MXDSMI ALL SYSTEMS 88/12/01 * PURPOSE : * DENSE SYMMETRIC MATRIX A IS SET TO THE UNIT MATRIX WITH THE SAME * ORDER. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RO A(N*(N+1)/2) DENSE SYMMETRIC MATRIX STORED IN THE PACKED FORM * WHICH IS SET TO THE UNIT MATRIX (I.E. A:=I). * SUBROUTINE MXDSMI(N,A) INTEGER N DOUBLE PRECISION A(*) INTEGER I, M DOUBLE PRECISION ZERO,ONE PARAMETER (ZERO=0.0D 0,ONE=1.0D 0) M = N * (N+1) / 2 DO 1 I = 1, M A(I) = ZERO 1 CONTINUE M = 0 DO 2 I = 1, N M = M + I A(M) = ONE 2 CONTINUE RETURN END * SUBROUTINE MXDSMS ALL SYSTEMS 91/12/01 * PURPOSE : * SCALING OF A DENSE SYMMETRIC MATRIX. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RU A(N*(N+1)/2) DENSE SYMMETRIC MATRIX STORED IN THE PACKED FORM * WHICH IS SCALED BY THE VALUE ALF (I.E. A:=ALF*A). * RI ALF SCALING FACTOR. * SUBROUTINE MXDSMS( N, A, ALF) INTEGER N DOUBLE PRECISION A(*), ALF INTEGER I,M M = N * (N+1) / 2 DO 1 I = 1, M A(I) = A(I) * ALF 1 CONTINUE RETURN END * SUBROUTINE MXLIIM ALL SYSTEMS 96/12/01 * PURPOSE : * MATRIX MULTIPLICATION FOR LIMITED STORAGE INVERSE COLUMN UPDATE * METHOD. * * PARAMETERS : * II N NUMBER OF VARIABLES. * II M NUMBER OF QUASI-NEWTON STEPS. * RI D(N) DIAGONAL OF A DECOMPOSED TRIDIAGONAL MATRIX. * RI DL(N) SUBDIAGONAL OF A DECOMPOSED TRIDIAGONAL MATRIX. * RI DU(N) SUPERDIAGONAL OF A DECOMPOSED TRIDIAGONAL MATRIX. * RI DU2(N) SECOND SUPERDIAGONAL OF A DECOMPOSED TRIDIAGONAL MATRIX. * II ID(N) PERMUTATION VECTOR. * RI XM(N*M) SET OF VECTORS FOR INVERSE COLUMN UPDATE. * RI GM(M) SET OF VALUES FOR INVERSE COLUMN UPDATE. * II IM(M) SET OF INDICES FOR INVERSE COLUMN UPDATE. * RI U(N) INPUT VECTOR. * RO V(N) OUTPUT VECTOR. * * SUBPROGRAMS USED : * S MXSGIB BACK SUBSTITUTION AFTER INCOMPLETE LU DECOMPOSITION. * S MXVCOP COPYING OF A VECTOR. * S MXVDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * SUBROUTINE MXLIIM(N,M,A,IA,JA,IP,ID,XM,GM,IM,U,V,S) INTEGER M,N DOUBLE PRECISION A(*),GM(*),S(*),U(*),V(*),XM(*) INTEGER IA(*),ID(*),IM(*),IP(*),JA(*) INTEGER I,L CALL MXVCOP(N,U,V) CALL MXSGIB(N,A,IA,JA,IP,ID,V,S,0) L = 1 DO 10 I = 1,M CALL MXVDIR(N,U(IM(I))/GM(I),XM(L),V,V) L = L + N 10 CONTINUE RETURN END * SUBROUTINE MXSCMD ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF A DENSE RECTANGULAR MATRIX A BY A VECTOR X AND * ADDITIOON OF THE SCALED VECTOR ALF*Y. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II NA NUMBER OF COLUMNS OF THE MATRIX A. * II MA NUMBER OF ELEMENTS IN THE FIELD A. * RI A(MA) RECTANGULAR MATRIX STORED AS A TWO-DIMENSIONAL ARRAY. * II IA(NA+1) POSITION OF THE FIRST RORWS ELEMENTS IN THE FIELD A. * II JA(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD A. * RI X(NA) INPUT VECTOR. * RI ALF SCALING FACTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR EQUAL TO A*X+ALF*Y. * * SUBPROGRAMS USED : * S MXVSCL SCALING OF A VECTOR. * SUBROUTINE MXSCMD(N,NA,A,IA,JA,X,ALF,Y,Z) INTEGER N,NA,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),ALF,Y(*),Z(*) INTEGER I,J,K,L,JP CALL MXVSCL(N,ALF,Y,Z) DO 2 I=1,NA K=IA(I) L=IA(I+1)-K DO 1 J=1,L JP=JA(K) IF (JP.GT.0) Z(JP)=Z(JP)+A(K)*X(I) K=K+1 1 CONTINUE 2 CONTINUE RETURN END * SUBROUTINE MXSCMM ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF A DENSE RECTANGULAR MATRIX A BY A VECTOR X. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II NA NUMBER OF COLUMNS OF THE MATRIX A. * II MA NUMBER OF ELEMENTS IN THE FIELD A. * RI A(MA) RECTANGULAR MATRIX STORED AS A TWO-DIMENSIONAL ARRAY. * II IA(NA+1) POSITION OF THE FIRST RORWS ELEMENTS IN THE FIELD A. * II JA(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD A. * RI X(NA) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR EQUAL TO A*X. * * SUBPROGRAMS USED : * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE MXSCMM(N,NA,A,IA,JA,X,Y) INTEGER N,NA,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),Y(*) INTEGER I,J,K,L,JP CALL MXVSET(N,0.0D 0,Y) DO 2 I=1,NA K=IA(I) L=IA(I+1)-K DO 1 J=1,L JP=JA(K) IF (JP.GT.0) Y(JP)=Y(JP)+A(K)*X(I) K=K+1 1 CONTINUE 2 CONTINUE RETURN END * SUBROUTINE MXSGIB ALL SYSTEMS 95/12/01 * PURPOSE : * SOLUTION OF A SYSTEM OF LINEAR EQUATIONS WITH A SPARSE UNSYMMETRIC * MATRIX A USING INCOMPLETE FACTORIZATION OBTAINED BY THE SUBROUTINE * MXSGIF. * * PARAMETERS : * II N MATRIX DIMENSION. * II M NUMBER OF MATRIX NONZERO ELEMENTS. * RU A(M) NONZERO ELEMENTS OF THE MATRIX A. * II IA(N+1) ROW POINTERS OF THE MATRIX A. * II JA(M) COLUMN INDICES OF THE MATRIX A. * IO IP(N) PERMUTATION VECTOR. * II ID(N) DIAGONAL POINTERS OF THE MATRIX A. * RU X(N) ON INPUT THE RIGHT HAND SIDE OF A SYSTEM OF LINEAR * EQUATIONS. ON OUTPUT THE SOLUTION OF A SYSTEM OF LINEAR * EQUATIONS. * RA Y(N) AUXILIARY VECTOR. * JOB OPTION. JOB=0 - SOLUTION WITH THE ORIGINAL MATRIX. * JOB=1 - SOLUTION WITH THE MATRIX TRANSPOSE. * SUBROUTINE MXSGIB(N,A,IA,JA,IP,ID,X,Y,JOB) DOUBLE PRECISION CON PARAMETER (CON=1.0D120) INTEGER JOB,N DOUBLE PRECISION A(*),X(*),Y(*) INTEGER IA(*),ID(*),IP(*),JA(*) DOUBLE PRECISION APOM INTEGER J,JJ,JP,K,KSTOP,KSTRT IF (JOB.LE.0) THEN DO 20 K = 1,N KSTRT = IA(K) KSTOP = IA(K+1) - 1 DO 10 JJ = KSTRT,KSTOP J = JA(JJ) JP = IP(J) IF (JP.LT.K) THEN X(K) = X(K) - A(JJ)*X(JP) IF (ABS(X(K)).GE.CON) X(K) = SIGN(CON,X(K)) END IF 10 CONTINUE 20 CONTINUE DO 40 K = N,1,-1 KSTRT = IA(K) KSTOP = IA(K+1) - 1 DO 30 JJ = KSTRT,KSTOP J = JA(JJ) JP = IP(J) IF (JP.GT.K) X(K) = X(K) - A(JJ)*X(JP) IF (JP.EQ.K) APOM = A(JJ) 30 CONTINUE X(K) = X(K)/APOM 40 CONTINUE CALL MXVSFP(N,IP,X,Y) ELSE CALL MXVSBP(N,IP,X,Y) DO 60 K = 1,N X(K) = X(K)/A(ID(K)) KSTRT = IA(K) KSTOP = IA(K+1) - 1 DO 50 JJ = KSTRT,KSTOP J = JA(JJ) JP = IP(J) IF (JP.GT.K) X(JP) = X(JP) - A(JJ)*X(K) 50 CONTINUE 60 CONTINUE DO 80 K = N,1,-1 KSTRT = IA(K) KSTOP = IA(K+1) - 1 DO 70 JJ = KSTRT,KSTOP J = JA(JJ) JP = IP(J) IF (JP.LT.K) X(JP) = X(JP) - A(JJ)*X(K) 70 CONTINUE 80 CONTINUE END IF RETURN END * SUBROUTINE MXSGIF ALL SYSTEMS 95/12/01 * PURPOSE : * INCOMPLETE FACTORIZATION OF A GENERAL SPARSE MATRIX A. * * PARAMETERS : * II N MATRIX DIMENSION. * II M NUMBER OF MATRIX NONZERO ELEMENTS. * RU A(M) NONZERO ELEMENTS OF THE MATRIX A. * II IA(N+1) ROW POINTERS OF THE MATRIX A. * II JA(M) COLUMN INDICES OF THE MATRIX A. * IO IP(N) PERMUTATION VECTOR. * IO ID(N) DIAGONAL POINTERS OF THE MATRIX A. * RA IW(N) AUXILIARY VECTOR. * RI TOL PIVOT TOLERANCE. * IO INF INFORMATION. * SUBROUTINE MXSGIF(N,A,IA,JA,IP,ID,IW,TOL,INF) DOUBLE PRECISION ZERO,ONE,CON PARAMETER (ZERO=0.0D0,ONE=1.0D0,CON=1.0D-30) DOUBLE PRECISION TOL INTEGER INF,N DOUBLE PRECISION A(*) INTEGER IA(*),ID(*),IP(*),IW(*),JA(*) DOUBLE PRECISION TEMP INTEGER I,II,J,JJ,JSTOP,JSTRT,K,KK,KSTOP,KSTRT INF = 0 DO 10 I = 1,N IF (IP(I).LE.0 .OR. IP(I).GT.N) THEN CALL MXVINP(N,IP) GO TO 20 END IF 10 CONTINUE 20 CALL MXVINS(N,0,IW) DO 70 K = 1,N KSTRT = IA(K) KSTOP = IA(K+1) - 1 ID(K) = 0 DO 30 JJ = KSTRT,KSTOP J = JA(JJ) IW(J) = JJ IF (IP(J).EQ.K) ID(K) = JJ 30 CONTINUE IF (ID(K).EQ.0) THEN INF = -45 RETURN END IF IF (TOL.GT.ZERO) A(ID(K)) = (ONE+TOL)*A(ID(K)) IF (ABS(A(ID(K))).LT.TOL) A(ID(K)) = A(ID(K)) + * SIGN(TOL,A(ID(K))) DO 50 JJ = KSTRT,KSTOP J = IP(JA(JJ)) IF (J.LT.K) THEN JSTRT = IA(J) JSTOP = IA(J+1) - 1 TEMP = A(JJ)/A(ID(J)) A(JJ) = TEMP DO 40 II = JSTRT,JSTOP I = JA(II) IF (IP(I).GT.J) THEN KK = IW(I) IF (KK.NE.0) A(KK) = A(KK) - TEMP*A(II) END IF 40 CONTINUE END IF 50 CONTINUE KK = ID(K) IF (ABS(A(KK)).LT.CON) THEN INF = K IF (A(KK).EQ.ZERO) THEN A(KK) = CON ELSE A(KK) = SIGN(CON,A(KK)) END IF END IF DO 60 JJ = KSTRT,KSTOP J = JA(JJ) IW(J) = 0 60 CONTINUE 70 CONTINUE RETURN END * SUBROUTINE MXSPCA ALL SYSTEMS 93/12/01 * PURPOSE : * REWRITE SYMMETRIC MATRIX INTO THE PERMUTED FACTORIZED COMPACT SCHEME. * MOIDIFIED VERSION FOR THE USE WITH MXSPCJ. * * PARAMETERS: * II N SIZE OF THE SYSTEM SOLVED. * II NB NUMBER OF NONZEROS IN THE UPPER TRIANGLE OF THE ORIGINAL * MATRIX. * II ML SIZE OF THE COMPACT FACTOR. * RU A(MMAX) NUMERICAL VALUES OF THE SPARSE HESSIAN APPROXIMATION * STORED AT THE POSITIONS 1, ...,NB. * IU JA(MMAX) INDICES OF THE NONZERO ELEMENTS OF THE HESSIAN MATRIX IN * THE PACKED ROW FORM AT THE FIRST NB POSITIONS. * NEW POSITIONS * IN THE PERMUTED FACTOR STORED IN A(NB+1), ..., A(2*NB), * INDICES OF COMPACT SCHEME IN A(2*NB+1), ..., A(2*NB+ML). * II PSL(N+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * RI T CORRECTION FACTOR THAT IS ADDED TO THE DIAGONAL. * * SUBROUTINE MXSPCA(N,NB,ML,A,IA,JA,T) INTEGER N,NB,ML,IA(*),JA(*) DOUBLE PRECISION A(*),T INTEGER I,J DO 100 I=1,N J=ABS(JA(IA(I)+NB+ML)) A(NB+J)=A(NB+J)+T 100 CONTINUE RETURN END * SUBROUTINE MXSPCB ALL SYSTEMS 92/12/01 * PURPOSE : * SOLUTION OF A SYSTEM OF LINEAR EQUATIONS WITH A SPARSE SYMMETRIC * POSITIVE DEFINITE MATRIX A+E USING THE FACTORIZATION A+E=L*D*TRANS(L) * STORED IN THE COMPACT SCHEME. THIS FACTORIZATION CAN BE OBTAINED * USING THE SUBROUTINE MXSPCF. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) FACTORS L,D OF THE FACTORIZATION A+E=L*D*TRANS(L) * STORED USING THE COMPACT SCHEME OF STORING. * II PSL(N+1) POINTER ARRAY OF THE FACTORIZED SPARSE MATRIX * II SL(MMAX) ARRAY OF COLUMN INDICES OF THE FACTORS L AND D * STORED USING THE COMPACT SCHEME. * RU X(N) ON INPUT THE RIGHT HAND SIDE OF A SYSTEM OF LINEAR * EQUATIONS. ON OUTPUT THE SOLUTION OF A SYSTEM OF LINEAR * EQUATIONS. * II JOB OPTION. IF JOB=0 THEN X:=(A+E)**(-1)*X. IF JOB>0 THEN * X:=L**(-1)*X. IF JOB<0 THEN X:=TRANS(L)**(-1)*X. * * METHOD : * BACK SUBSTITUTION * SUBROUTINE MXSPCB(N,A,PSL,SL,X,JOB) INTEGER N DOUBLE PRECISION A(*),X(*) INTEGER PSL(*),SL(*),JOB INTEGER I,J,IS * * FIRST PHASE * IF (JOB.GE.0) THEN DO 300 I=1,N IS=SL(I)+N+1 DO 200 J=PSL(I)+I,PSL(I+1)+I-1 X(SL(IS))=X(SL(IS)) - A(J)*X(I) IS=IS+1 200 CONTINUE 300 CONTINUE END IF * * SECOND PHASE * IF (JOB.EQ.0) THEN DO 400 I=1,N X(I) = X(I)/A(PSL(I)+I-1) 400 CONTINUE END IF * * THIRD PHASE * IF (JOB.LE.0) THEN DO 600 I=N,1,-1 IS=SL(I)+N+1 DO 500 J=PSL(I)+I,PSL(I+1)+I-1 X(I)=X(I)-A(J)*X(SL(IS)) IS=IS+1 500 CONTINUE 600 CONTINUE END IF RETURN END * SUBROUTINE MXSPCC ALL SYSTEMS 92/12/01 * PURPOSE : * SPARSE MATRIX REORDER, SYMBOLIC FACTORIZATION, DATA STRUCTURES * TRANSFORMATION - INITIATION OF THE DIRECT SPARSE SOLVER. * MODIFIED VERSION WITH CHANGED DATA STRUCTURES. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * II NJA NUMBER OF NONZERO ELEMENTS OF THE MATRIX. * IO ML SIZE OF THE COMPACT STRUCTURE OF THE TRIANGULAR FACTOR * OF THE HESSIAN APPROXIMATION. * II MMAX SIZE OF THE ARRAYS JA,A. * RO A(MMAX) NUMERICAL VALUES OF THE SPARSE HESSIAN APPROXIMATION * STORED AT THE POSITIONS 1, ...,NJA. LOWER TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION STORED AT THE * POSITIONS NJA+1, ..., NJA+MB. * II IA(N) POINTERS OF THE DIAGONAL ELEMENTS OF THE HESSIAN MATRIX. * II JA(MMAX) INDICES OF THE NONZERO ELEMENTS OF THE HESSIAN MATRIX IN * THE PACKED ROW FORM AT THE FIRST NJA POSITIONS. COMPACT * STRUCTURE OF INDICES OF ITS TRIANGULAR FACTOR IS ROWWISE * STORED. * II PSL(N+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * IO PERM(N) PERMUTATION VECTOR. * IO INVP(N) INVERSE PERMUTATION VECTOR. * IA WN11(N) AUXILIARY VECTOR. * IA WN12(N) AUXILIARY VECTOR. * IA WN13(N) AUXILIARY VECTOR. * IA WN14(N) AUXILIARY VECTOR. * IO ITERM TERMINATION INDICATOR. TERMINATION IF ITERM .NE. 0. * * COMMON DATA : * * SUBPROGRAMS USED : * S MXSTG1 WIDTHENING OF THE PACKED FORM OF THE SPARSE MATRIX. * S MXSSMN SPARSE MATRIX REORDERING. * S MXVSIP INVERSE PERMUTATION COMPUTING. * S MXSPCI SYMBOLIC FACTORIZATION. * S MXSTL1 PACKING OF THE WIDTHENED FORM OF THE SPARSE MATRIX. * SUBROUTINE MXSPCC(N,NJA,ML,MMAX,A,IA,JA,PSL,PERM,INVP,WN11,WN12, * WN13,WN14,ITERM) INTEGER N,NJA,MMAX,ML,ITERM INTEGER PERM(*),INVP(*),WN11(*),WN12(*),WN13(*),WN14(*) INTEGER PSL(*),IA(*),JA(*) INTEGER JSTRT,JSTOP,I,J,K,L,NJASAVE INTEGER LL,LL1,NJABIG,KSTRT DOUBLE PRECISION A(*) IF (ML.GT.0) RETURN IF (2*NJA.GE.MMAX) THEN ITERM=-41 GO TO 1000 END IF * * WIDTHENING OF THE PACKED FORM * NJASAVE=NJA CALL MXSTG1(N,NJA,IA,JA,WN12,WN11) NJABIG=NJA * * REORDERING OF THE SPARSE MATRIX * CALL MXSSMN(N,IA,JA,PERM,WN11,WN12,WN13) * * FIND THE INVERSE PERMUTATION VECTOR INVP * CALL MXVSIP(N,PERM,INVP) * * SHRINK THE STRUCTURE * CALL MXSTL1(N,NJA,IA,JA,WN11) DO 40 I=1,N WN11(I)=0 WN12(I)=0 40 CONTINUE * * WN11 CONTAINS BEGINNINGS OF THE FACTOR ROWS * DO 50 I=1,N K=PERM(I) JSTRT=IA(K) JSTOP=IA(K+1)-1 DO 60 J=JSTRT,JSTOP L=JA(J) L=INVP(L) IF (L.GE.I) THEN WN12(I)=WN12(I)+1 ELSE WN12(L)=WN12(L)+1 END IF 60 CONTINUE 50 CONTINUE WN11(1)=1 DO 69 I=1,N-1 WN11(I+1)=WN11(I)+WN12(I) 69 CONTINUE * * CREATE UPPER TRIANGULAR STRUCTURE NECESSARY FOR THE TRANSFER * DO 300 I=1,N K=PERM(I) JSTRT=IA(K) JSTOP=IA(K+1)-1 DO 200 J=JSTRT,JSTOP L=JA(J) L=INVP(L) IF (L.GE.I) THEN LL1=WN11(I) WN11(I)=LL1+1 JA(NJABIG+LL1)=L A(J)=LL1 A(NJA+LL1)=J ELSE LL1=WN11(L) WN11(L)=LL1+1 JA(NJABIG+LL1)=I A(J)=LL1 A(NJA+LL1)=J END IF 200 CONTINUE 300 CONTINUE * * SORT INDICES IN THE PERMUTED UPPER TRIANGLE * DO 599 I=1,N WN11(I)=0 599 CONTINUE WN11(1)=1 WN14(1)=1 DO 67 I=2,N+1 WN11(I)=WN11(I-1)+WN12(I-1) WN14(I)=WN11(I) 67 CONTINUE DO 602 I=1,N WN12(I)=0 602 CONTINUE JSTOP=WN11(N+1) DO 499 I=N,1,-1 JSTRT=WN11(I) CALL MXVSR5(JSTOP-JSTRT,JSTRT-1,JA(NJABIG+JSTRT), & A,A(NJASAVE+JSTRT)) JSTOP=JSTRT 499 CONTINUE * * WIDTHENING OF THE PERMUTED PACKED FORM. * NJASAVE=NJA CALL MXSTG1(N,NJA,IA,JA,WN12,WN11) NJABIG=NJA * * SYMBOLIC FACTORIZATION. * CALL MXSPCI(N,ML,MMAX-2*NJA,IA,JA,PSL,A(2*NJASAVE+1),PERM, & INVP,WN11,WN12,WN13,ITERM) IF (ITERM.NE.0) THEN ITERM=-42 GO TO 1000 END IF * * RETRIEVE PARAMETERS * CALL MXSTL1(N,NJA,IA,JA,WN11) * * SHIFT PERMUTED UPPER TRIANGLE. * DO 73 I=1,NJASAVE JA(NJA+I)=JA(NJABIG+I) 73 CONTINUE * * SHIFT STRUCTURE SL. * IF (2*NJASAVE+ML.GE.MMAX) THEN ITERM=-41 GO TO 1000 END IF DO 70 I=1,ML JA(2*NJASAVE+I)=A(2*NJASAVE+I) 70 CONTINUE * * SET POINTERS * DO 600 I=1,N WN12(I)=0 600 CONTINUE LL1=PSL(N)+N-1 JSTOP=WN14(N+1) DO 500 I=N,1,-1 JSTRT=WN14(I) DO 700 J=JSTRT,JSTOP-1 K=JA(NJASAVE+J) WN12(K)=J LL=A(NJASAVE+J) WN13(K)=LL 700 CONTINUE JSTOP=JSTRT KSTRT=JA(2*NJASAVE+I)+N+1+2*NJASAVE DO 800 J=KSTRT+PSL(I+1)-PSL(I)-1,KSTRT,-1 L=JA(J) IF (WN12(L).NE.0) THEN LL=WN13(L) A(LL)=LL1 WN12(L)=0 END IF LL1=LL1-1 800 CONTINUE K=WN12(I) WN12(I)=0 LL=WN13(I) A(LL)=LL1 LL1=LL1-1 500 CONTINUE DO 76 I=1,ML JA(NJASAVE+I)=JA(2*NJASAVE+I) 76 CONTINUE DO 72 I=1,NJASAVE JA(ML+NJASAVE+I)=A(I) 72 CONTINUE 1000 CONTINUE RETURN END * SUBROUTINE MXSPCD ALL SYSTEMS 92/12/01 * PURPOSE : * COMPUTATION OF A DIRECTION OF NEGATIVE CURVATURE WITH RESPECT TO A * SPARSE SYMMETRIC MATRIX A USING THE FACTORIZATION A+E=L*D*TRANS(L) * STORED IN THE COMPACT SPARSE FORM. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * II MMAX LENGTH OF THE PRINCIPAL MATRIX VECTORS (SL,A). * RI A(MMAX) FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGF.IT CONTAINS THE NUMERICAL VALUES OF THE * FACTORS STORED IN THE COMPACT FORM ACCORDING TO THE * INFORMATION IN THE VECTORS PSL,SL. * II PSL(N+1) POINTER VECTOR OF THE FACTORIZED MATRIX A. * II SL(MMAX) COMPACT SHEME OF THE FACTORIZED MATRIX A. * RO X(N) COMPUTED DIRECTION OF NEGATIVE CURVATURE (I.E. * TRANS(X)*A*X<0) IF IT EXISTS. * II INF INFORMATION OBTAINED IN THE FACTORIZATION PROCESS. THE * DIRECTION OF NEGATIVE CURVATURE EXISTS ONLY IF INF>0. * * METHOD : * P.E.GILL, W.MURRAY : NEWTON TYPE METHODS FOR UNCONSTRAINED AND * LINEARLY CONSTRAINED OPTIMIZATION, MATH. PROGRAMMING 28 (1974) * PP. 311-350. * SUBROUTINE MXSPCD(N,A,PSL,SL,X,INF) INTEGER N,INF,PSL(*),SL(*) DOUBLE PRECISION A(*),X(*) INTEGER I, J, IS * * RIGHT HAND SIDE FORMATION * DO 100 I=1,N X(I) = 0.0D 0 100 CONTINUE IF (INF .LE. 0) RETURN X(INF) = 1.0D 0 * * BACK SUBSTITUTION * DO 300 I=INF-1,1,-1 IS=SL(I)+N+1 DO 200 J=PSL(I)+I,PSL(I+1)+I-1 X(I)=X(I)-A(J)*X(SL(IS)) IS=IS+1 200 CONTINUE 300 CONTINUE RETURN END * SUBROUTINE MXSPCF ALL SYSTEMS 90/12/01 * PURPOSE : * NUMERICAL FACTORIZATION A+E=L*D*TRANS(L) OF A SPARSE * SYMMETRIC POSITIVE DEFINITE MATRIX A+E WHERE D AND E ARE DIAGONAL * POSITIVE DEFINITE MATRICES AND L IS A LOWER TRIANGULAR MATRIX. IF * A IS SUFFICIENTLY POSITIVE DEFINITE THEN E=0. THE STRUCTURE ON * INPUT WAS OBTAINED BY THE SYMBOLIC FACTORIZATION AND IT MAKES * USE OF THE COMPACT SCHEME OF STORING THE SPARSE MATRIX IN THE * POINTER ARRAY PSL ,INDEX ARRAY SL. NUMERICAL VALUES OF THE FACTOR * CAN BE FOUND IN THE ARRAY A. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RU A(MMAX) ON INPUT NUMERICAL VALUES OF THE LOWER HALF OF THE * MATRIX THAT IS BEEING FACTORIZED(INCLUDING THE DIAGONAL * ELEMENTS. ON OUTPUT IT CONTAINS FACTORS L AND D AS IF THEY * FORM THE LOWER HALF OF THE MATRIX.STRUCTURE INFORMATION * IS SAVED IN THE COMPACT SCHEME IN THE PAIR OF VECTORS PSL * AND SL. * II PSL(NF+1) POINTER VECTOR OF THE FACTOR * II SL(MMAX) STRUCTURE OF THE FACTOR IN THE COMPACT FORM * IA WN11(NF+1) AUXILIARY VECTOR. * IA WN12(NF+1) AUXILIARY VECTOR. * RA RN01(NF+1) AUXILIARY VECTOR. * IO INF AN INFORMATION OBTAINED IN THE FACTORIZATION PROCESS. IF * INF=0 THEN A IS SUFFICIENTLY POSITIVE DEFINITE AND E=0. IF * INF<0 THEN A IS NOT SUFFICIENTLY POSITIVE DEFINITE AND E>0. IF * INF>0 THEN THEN A IS INDEFINITE AND INF IS AN INDEX OF THE * MOST NEGATIVE DIAGONAL ELEMENT USED IN THE FACTORIZATION * PROCESS. * RU ALF ON INPUT A DESIRED TOLERANCE FOR POSITIVE DEFINITENESS. ON * OUTPUT THE MOST NEGATIVE DIAGONAL ELEMENT USED IN THE * FACTORIZATION PROCESS (IF INF>0). * RO TAU MAXIMUM DIAGONAL ELEMENT OF THE MATRIX E. * * METHOD : * S.C.EISENSTAT,M.C.GURSKY,M.H.SCHULTZ,A.H.SHERMAN:YALE SPARSE MATRIX * PACKAGE I. THE SYMMETRIC CODES,YALE UNIV. RES. REPT. * NO.112,1977. * SUBROUTINE MXSPCF(N,A,PSL,SL,WN11,WN12,RN01,INF,ALF,TAU) INTEGER N,PSL(*),SL(*),WN11(*),WN12(*),INF DOUBLE PRECISION A(*),RN01(*),ALF DOUBLE PRECISION BET,GAM,DEL,RHO,SIG,TOL,TADD,TBDD,TAU INTEGER I, J, K, L, II INTEGER ISTRT,ISTOP,NEWK,KPB,ISUB L = 0 INF = 0 TOL = ALF ALF = 0.0D 0 BET = 0.0D 0 GAM = 0.0D 0 TAU = 0.0D 0 DO 60 I=1,N BET=MAX(BET,ABS(A(PSL(I)+I-1))) DO 50 J=PSL(I)+I,PSL(I+1)+I-1 GAM = MAX( GAM, ABS(A(J)) ) 50 CONTINUE 60 CONTINUE BET = MAX(TOL,BET,GAM/N) DEL = TOL*BET DO 100 I=1,N WN11(I)=0 RN01(I)=0.0D 0 100 CONTINUE DO 600 J=1,N * * DETERMINATION OF A DIAGONAL CORRECTION * SIG=A(PSL(J)+J-1) RHO=0.0D 0 NEWK=WN11(J) 200 K=NEWK IF (K.EQ.0) GO TO 400 NEWK=WN11(K) KPB=WN12(K) TADD=A(KPB+K) TBDD=TADD*A(PSL(K)+K-1) RHO=RHO+TADD*TBDD ISTRT=KPB+1 ISTOP=PSL(K+1)-1 IF (ISTOP.LT.ISTRT) GO TO 200 WN12(K)=ISTRT I=SL(K)+(KPB-PSL(K))+1 ISUB=SL(N+1+I) WN11(K)=WN11(ISUB) WN11(ISUB)=K DO 300 II=ISTRT,ISTOP ISUB=SL(N+1+I) RN01(ISUB)=RN01(ISUB)+A(II+K)*TBDD I=I+1 300 CONTINUE GO TO 200 400 SIG=A(PSL(J)+J-1)-RHO IF (ALF.GT.SIG) THEN ALF=SIG L=J END IF GAM=0.0D 0 ISTRT=PSL(J) ISTOP=PSL(J+1)-1 IF (ISTOP.LT.ISTRT) GO TO 370 WN12(J)=ISTRT I=SL(J) ISUB=SL(N+1+I) WN11(J)=WN11(ISUB) WN11(ISUB)=J DO 500 II=ISTRT,ISTOP ISUB=SL(N+1+I) A(II+J)=(A(II+J)-RN01(ISUB)) RN01(ISUB)=0.0D 0 I=I+1 500 CONTINUE DO 350 K=PSL(J)+J,PSL(J+1)+J-1 GAM=MAX(GAM,ABS(A(K))) 350 CONTINUE GAM=GAM*GAM 370 RHO=MAX(ABS(SIG),GAM/BET,DEL) IF (TAU.LT.RHO-SIG) THEN TAU=RHO-SIG INF=-1 END IF * * GAUSSIAN ELIMINATION * A(PSL(J)+J-1)=RHO DO 550 II=ISTRT,ISTOP A(II+J)=A(II+J)/RHO 550 CONTINUE 600 CONTINUE IF (L.NE.0.AND.ABS(ALF).GT.DEL) INF=L RETURN END * SUBROUTINE MXSPCI ALL SYSTEMS 89/12/01 * PURPOSE : * SYMBOLIC FACTORIZATION OF A SPARSE SYMMETRIC MATRIX GIVEN IN THE * NORMAL SCHEME PA,SA. ON OUTPUT WE HAVE POINTER VECTOR OF THE FACTOR * PSL AND VECTOR OF COLUMN INDICES SL. ML IS THE NUMBER OF THE INDICES * USED FOR THE VECTOR SL, WHERE WE HAVE FACTOR IN THE COMPACT FORM. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * IO ML NUMBER OF THE NONZERO ELEMENTS IN THE FACTOR'S COMPACT SCHEME * II MMAX LENGTH OF THE ARRAY SL. IN THE CASE OF THE * INSUFFICIENT SPACE IT IS TO BE INCREASED. * II PA(N+1) POINTER VECTOR OF THE INPUT MATRIX * II SA(MMAX) VECTOR OF THE COLUMN INDICES OF THE INPUT MATRIX * IO PSL(N+1) POINTER VECTOR OF THE FACTOR * RO SL(MMAX) COMPACT SCHEME OF THE INDICES OF THE FACTOR * II PERM(N) PERMUTATION VECTOR * II INVP(N) INVERSE PERMUTATION VECTOR * IA WN11(N+1) WORK VECTOR OF THE LENGTH N+1 * IA WN12(N+1) WORK VECTOR OF THE LENGTH N+1 * IA WN13(N+1) WORK VECTOR OF THE LENGTH N+1 * IO ISPACE AN INFORMATION ON SPACE OBTAINED DURING THE PROCESS * OF THE FACTORIZATION. * ISPACE=0 THE FACTORIZATION HAS TERMINATED NORMALLY * ISPACE=1 INSUFFICIENT SPACE AVAILABLE * * METHOD : * S.C.EISENSTAT,M.C.GURSKY,M.H.SCHULTZ,A.H.SHERMAN:YALE SPARSE MATRIX * PACKAGE I. THE SYMMETRIC CODES,ACM TRANS. ON MATH. SOFTWARE. * * NOTE: TYPE OF SL CHANGED FOR THE UFO APPLICATION. * SUBROUTINE MXSPCI(N,ML,MMAX,PA,SA,PSL,SL,PERM,INVP, & WN11,WN12,WN13,ISPACE) INTEGER N,MMAX,PA(*),SA(*),PSL(*) INTEGER PERM(*),INVP(*),WN11(*),WN12(*),WN13(*) INTEGER ISPACE,I,INZ,J,JSTOP,JSTRT,K,KNZ,KXSUB,MRGK,LMAX,ML INTEGER NABOR,NODE,NP1,NZBEG,NZEND,RCHM,MRKFLG,M DOUBLE PRECISION SL(*) NZBEG=1 NZEND=0 PSL(1)=1 DO 100 K=1,N WN11(K)=0 WN13(K)=0 100 CONTINUE NP1=N+1 DO 1500 K=1,N KNZ=0 MRGK=WN11(K) MRKFLG=0 WN13(K)=K IF (MRGK.NE.0) WN13(K)=WN13(MRGK) SL(K)=NZEND NODE=PERM(K) JSTRT=PA(NODE) JSTOP=PA(NODE+1)-1 IF (JSTRT.GT.JSTOP) GO TO 1500 WN12(K)=NP1 DO 300 J=JSTRT,JSTOP NABOR=SA(J) IF (NABOR.EQ.NODE) GO TO 300 NABOR=INVP(NABOR) IF (NABOR.LE.K) GO TO 300 RCHM=K 200 M=RCHM RCHM=WN12(M) IF (RCHM.LE.NABOR) GO TO 200 KNZ=KNZ+1 WN12(M)=NABOR WN12(NABOR)=RCHM IF (WN13(NABOR).NE.WN13(K)) MRKFLG=1 300 CONTINUE LMAX=0 IF (MRKFLG.NE.0.OR.MRGK.EQ.0) GO TO 350 IF (WN11(MRGK).NE.0) GO TO 350 SL(K)=SL(MRGK)+1 KNZ=PSL(MRGK+1)-(PSL(MRGK)+1) GO TO 1400 350 I=K 400 I=WN11(I) IF (I.EQ.0) GO TO 800 INZ=PSL(I+1)-(PSL(I)+1) JSTRT=SL(I)+1 JSTOP=SL(I)+INZ IF (INZ.LE.LMAX) GO TO 500 LMAX=INZ SL(K)=JSTRT 500 RCHM=K DO 700 J=JSTRT,JSTOP NABOR=SL(N+1+J) 600 M=RCHM RCHM=WN12(M) IF (RCHM.LT.NABOR) GO TO 600 IF (RCHM.EQ.NABOR) GO TO 700 KNZ=KNZ+1 WN12(M)=NABOR WN12(NABOR)=RCHM RCHM=NABOR 700 CONTINUE GO TO 400 800 IF (KNZ.EQ.LMAX) GO TO 1400 IF (NZBEG.GT.NZEND) GO TO 1200 I=WN12(K) DO 900 JSTRT=NZBEG,NZEND IF (SL(N+1+JSTRT)-I .GE.0) THEN IF (SL(N+1+JSTRT).EQ.I) THEN GO TO 1000 ELSE GO TO 1200 END IF END IF 900 CONTINUE GO TO 1200 1000 SL(K)=JSTRT DO 1100 J=JSTRT,NZEND IF (SL(N+1+J).NE.I) GO TO 1200 I=WN12(I) IF (I.GT.N) GO TO 1400 1100 CONTINUE NZEND=JSTRT-1 1200 NZBEG=NZEND+1 NZEND=NZEND+KNZ * * A VARIANT IS USED WHEN CALLED SO THAT SL(X)=A(NB+X) * IF (NZEND.GE.MMAX-N-1) GO TO 1600 I=K DO 1300 J=NZBEG,NZEND I=WN12(I) SL(N+1+J)=I WN13(I)=K 1300 CONTINUE SL(K)=NZBEG WN13(K)=K 1400 IF (KNZ.GT.1) THEN KXSUB=SL(K) I=SL(N+1+KXSUB) WN11(K)=WN11(I) WN11(I)=K END IF PSL(K+1)=PSL(K)+KNZ 1500 CONTINUE SL(N)=SL(N)+1 SL(N+1)=SL(N) ML=N+SL(N+1) ISPACE=0 RETURN 1600 ISPACE=1 RETURN END * SUBROUTINE MXSPCM ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF A GIVEN VECTOR X BY A SPARSE SYMMETRIC POSITIVE * DEFINITE MATRIX A+E USING THE FACTORIZATION A+E=L*D*TRANS(L) OBTAINED * BY THE SUBROUTINE MXSPGN. FACTORS ARE STORED IN THE COMPACT FORM. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGN.IT CONTAINS THE NUMERICAL VALUES OF THE * FACTORS STORED IN THE COMPACT FORM ACCORDING TO THE * INFORMATION IN THE VECTORS PSL,SL. * II PSL(N+1) POINTER ARRAY OF THE FACTORIZED SPARSE MATRIX * II SL(MMAX) INDICES OF THE COMPACT SCHEME OF THE FACTORS. * RU X(N) ON INPUT THE GIVEN VECTOR, ON OUTPUT THE RESULT * OF MULTIPLICATION. * RA RN01(N) AUXILIARY VECTOR. * II JOB OPTION. IF JOB=0 THEN X:=(A+E)*X. IF JOB>0 THEN * X:=TRANS(L)*X. IF JOB<0 THEN X:=L*X. * SUBROUTINE MXSPCM(N,A,PSL,SL,X,RN01,JOB) INTEGER N INTEGER PSL(*),SL(*),JOB DOUBLE PRECISION A(*),X(*),RN01(*),ZERO PARAMETER(ZERO=0.0D0) INTEGER I,J,IS DO 50 I=1,N RN01(I)=ZERO 50 CONTINUE * * FIRST PHASE:X=TRANS(L)*X * IF (JOB.GE.0) THEN DO 300 I=1,N IS=SL(I)+N+1 DO 200 J=PSL(I)+I,PSL(I+1)+I-1 X(I)=X(I)+A(J)*X(SL(IS)) IS=IS+1 200 CONTINUE 300 CONTINUE END IF * * SECOND PHASE:X=D*X * IF (JOB.EQ.0) THEN DO 400 I=1,N X(I) = X(I)*A(PSL(I)+I-1) 400 CONTINUE END IF * * THIRD PHASE:X=L*X * IF (JOB.LE.0) THEN DO 600 I=N,1,-1 IS=SL(I)+N+1 DO 500 J=PSL(I)+I,PSL(I+1)+I-1 RN01(SL(IS))=RN01(SL(IS))+A(J)*X(I) IS=IS+1 500 CONTINUE 600 CONTINUE DO 700 I=1,N X(I)=RN01(I)+X(I) 700 CONTINUE END IF RETURN END * SUBROUTINE MXSPCN ALL SYSTEMS 93/12/01 * PURPOSE : * ESTIMATION OF THE MINIMUM EIGENVALUE AND THE CORRESPONDING EIGENVECTOR * OF A SPARSE SYMMETRIC POSITIVE DEFINITE MATRIX A+E USING THE * FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE SUBROUTINE MXSPCF. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) FACTORS L,D OF THE FACTORIZATION A+E=L*D*TRANS(L) * STORED USING THE COMPACT SCHEME OF STORING. * II PSL(N+1) POINTER ARRAY OF THE FACTORIZED SPARSE MATRIX * II SL(MMAX) ARRAY OF COLUMN INDICES OF THE FACTORS L AND D * STORED USING THE COMPACT SCHEME. * SUBROUTINE MXDPGF. * RO X(N) ESTIMATED EIGENVECTOR. * RO ALF ESTIMATED EIGENVALUE. * II JOB OPTION. IF JOB=0 THEN ONLY ESTIMATED EIGENVALUE IS * COMPUTED. IS JOB>0 THEN BOTH ESTIMATED EIGENVALUE AND * ESTIMATED EIGENVECTOR ARE COMPUTED. * SUBROUTINE MXSPCN(N,A,PSL,SL,X,ALF,JOB) INTEGER N DOUBLE PRECISION A(*),X(*),ALF INTEGER PSL(*),SL(*),JOB DOUBLE PRECISION XP,XM,FP,FM,MXVDOT INTEGER I,K,IS DOUBLE PRECISION ZERO,ONE PARAMETER (ZERO=0.0D 0,ONE=1.0D 0) * * COMPUTATION OF THE VECTOR V WITH POSSIBLE MAXIMUM NORM SUCH * THAT L*D**(1/2)*V=U WHERE U HAS ELEMENTS +1 OR -1 * DO 2 I=1,N X(I)=ZERO 2 CONTINUE DO 6 K=1,N XP=-X(K)+ONE XM=-X(K)-ONE FP=ABS(XP) FM=ABS(XM) IS=SL(K)+N+1 DO 3 I=PSL(K)+K,PSL(K+1)+K-1 FP=FP+ABS(X(SL(IS))+A(I)*XP) FM=FM+ABS(X(SL(IS))+A(I)*XM) IS=IS+1 3 CONTINUE IF (FP.GE.FM) THEN X(K)=XP IS=SL(K)+N+1 DO 4 I=PSL(K)+K,PSL(K+1)+K-1 X(SL(IS))=X(SL(IS))+A(I)*XP IS=IS+1 4 CONTINUE ELSE X(K)=XM IS=SL(K)+N+1 DO 5 I=PSL(K)+K,PSL(K+1)+K-1 X(SL(IS))=X(SL(IS))+A(I)*XM IS=IS+1 5 CONTINUE END IF 6 CONTINUE * * COMPUTATION OF THE VECTOR X SUCH THAT * D**(1/2)*TRANS(L)*X=V * FM=ZERO DO 7 K=1,N IF (JOB.LE.0) THEN FP=SQRT(A(PSL(K)+K-1)) X(K)=X(K)/FP FM=FM+X(K)*X(K) ELSE X(K)=X(K)/A(PSL(K)+K-1) END IF 7 CONTINUE FP=DBLE(N) IF (JOB.LE.0) THEN * * FIRST ESTIMATION OF THE MINIMUM EIGENVALUE BY THE FORMULA * ALF=(TRANS(U)*U)/(TRANS(V)*V) * ALF=FP/FM RETURN END IF FM=ZERO DO 9 K=N,1,-1 IS=SL(K)+N+1 DO 8 I=PSL(K)+K,PSL(K+1)+K-1 X(K)=X(K)-A(I)*X(SL(IS)) IS=IS+1 8 CONTINUE FM=FM+X(K)*X(K) 9 CONTINUE FM=SQRT(FM) IF (JOB.LE.1) THEN * * SECOND ESTIMATION OF THE MINIMUM EIGENVALUE BY THE FORMULA * ALF=SQRT(TRANS(U)*U)/SQRT(TRANS(X)*X) * ALF=SQRT(FP)/FM ELSE * * INVERSE ITERATIONS * DO 11 K=2,JOB * * SCALING THE VECTOR X BY ITS NORM * DO 10 I=1,N X(I)=X(I)/FM 10 CONTINUE CALL MXSPCB(N,A,PSL,SL,X,0) FM=SQRT(MXVDOT(N,X,X)) 11 CONTINUE ALF=ONE/FM END IF * * SCALING THE VECTOR X BY ITS NORM * DO 12 I=1,N X(I)=X(I)/FM 12 CONTINUE RETURN END * FUNCTION MXSPCP ALL SYSTEMS 92/12/01 * PURPOSE : * COMPUTATION OF THE NUMBER MXSPCP=TRANS(X)*D**(-1)*X WHERE D IS A * DIAGONAL MATRIX IN THE FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGN. THE FACTORS ARE STORED IN THE COMPACT FORM. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGN.IT CONTAINS THE NUMERICAL VALUES OF THE * FACTORS STORED IN THE COMPACT FORM ACCORDING TO THE * INFORMATION IN THE VECTORS PSL,SL. * II PSL(N+1) POINTER VECTOR OF THE FACTORIZED MATRIX A. * RI X(N) INPUT VECTOR * RR MXSPCP COMPUTED NUMBER MXSPCP=TRANS(X)*D**(-1)*X * FUNCTION MXSPCP(N,A,PSL,X) INTEGER N DOUBLE PRECISION A(*), X(*), MXSPCP DOUBLE PRECISION TEMP INTEGER PSL(*),I TEMP = 0.0D 0 DO 100 I=1,N TEMP = TEMP + X(I)*X(I)/A(PSL(I)+I-1) 100 CONTINUE MXSPCP = TEMP RETURN END * FUNCTION MXSPCQ ALL SYSTEMS 92/12/01 * PURPOSE : * COMPUTATION OF THE NUMBER MXSPCQ=TRANS(X)*D*X WHERE D IS A * DIAGONAL MATRIX IN THE FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGN. FACTORS ARE STORED IN THE COMPACT FORM. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPGN.IT CONTAINS THE NUMERICAL VALUES OF THE * FACTORS STORED IN THE COMPACT FORM ACCORDING TO THE * INFORMATION IN THE VECTORS PSL,SL. * II PSL(N+1) POINTER VECTOR OF THE FACTORIZED MATRIX A * RI X(N) INPUT VECTOR * RR MXSPCQ COMPUTED NUMBER MXSPCQ=TRANS(X)*D*X * FUNCTION MXSPCQ(N,A,PSL,X) INTEGER N DOUBLE PRECISION A(*), X(*), MXSPCQ DOUBLE PRECISION TEMP INTEGER PSL(N+1),I DOUBLE PRECISION ZERO PARAMETER (ZERO = 0.0D0) TEMP = ZERO DO 100 I=1,N TEMP = TEMP + X(I)*X(I)*A(PSL(I)+I-1) 100 CONTINUE MXSPCQ = TEMP RETURN END * SUBROUTINE MXSPCT ALL SYSTEMS 92/12/01 * PURPOSE : * REWRITE SYMMETRIC MATRIX INTO THE PERMUTED FACTORIZED COMPACT SCHEME. * MOIDIFIED VERSION FOR THE USE WITH MXSPCJ. * * PARAMETERS: * II N SIZE OF THE SYSTEM SOLVED. * II NB NUMBER OF NONZEROS IN THE UPPER TRIANGLE OF THE ORIGINAL * MATRIX. * II ML SIZE OF THE COMPACT FACTOR. * II MMAX DECLARED LENGTH OF THE ARRAYS JA,A. * RU A(MMAX) NUMERICAL VALUES OF THE SPARSE HESSIAN APPROXIMATION * STORED AT THE POSITIONS 1, ...,NB. * IU JA(MMAX) INDICES OF THE NONZERO ELEMENTS OF THE HESSIAN MATRIX IN * THE PACKED ROW FORM AT THE FIRST NB POSITIONS. * NEW POSITIONS * IN THE PERMUTED FACTOR STORED IN A(NB+1), ..., A(2*NB), * INDICES OF COMPACT SCHEME IN A(2*NB+1), ..., A(2*NB+ML). * II PSL(N+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * IO ITERM ERROR FLAG. IF ITERM < 0 - LACK OF SPACE IN JA. * * SUBROUTINE MXSPCT(N,NB,ML,MMAX,A,JA,PSL,ITERM) INTEGER N,NB,ML,MMAX,JA(*) INTEGER PSL(*),ITERM DOUBLE PRECISION A(*) INTEGER I,J * * WN11 CONTAINS BEGINNINGS OF THE FACTOR ROWS * ITERM=0 * * LACK OF SPACE * IF (MMAX.LE.NB+PSL(N+1)+N-1) THEN ITERM=-43 RETURN END IF IF (MMAX.LE.2*NB+ML) THEN ITERM=-44 RETURN END IF DO 50 I=NB+1,NB+PSL(N+1)+N-1 A(I)=0.0D 0 50 CONTINUE DO 100 I=NB+ML+1,2*NB+ML J=JA(I) A(NB+J)=A(I-NB-ML) 100 CONTINUE RETURN END * SUBROUTINE MXSPTB ALL SYSTEMS 94/12/01 * PURPOSE : * SOLUTION OF A SYSTEM OF LINEAR EQUATIONS WITH A SPARSE SYMMETRIC * POSITIVE DEFINITE MATRIX A+E USING INCOMPLETE ILUT-TYPE FACTORIZATION * A+E=L*D*TRANS(L) OBTAINED BY THE SUBROUTINE MXSPTF. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(MMAX) INCOMPLETE FACTORIZATION A+E=L*D*TRANS(L) OBTAINED BY THE * SUBROUTINE MXSPTF. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(MMAX) INDICES OF THE NONZERO ELEMENTS OF A. * RU X(N) ON INPUT THE RIGHT HAND SIDE OF A SYSTEM OF LINEAR * EQUATIONS. ON OUTPUT THE SOLUTION OF A SYSTEM OF LINEAR * EQUATIONS. * II JOB OPTION. IF JOB=0 THEN X:=(A+E)**(-1)*X. IF JOB>0 THEN * X:=L**(-1)*X. IF JOB<0 THEN X:=TRANS(L)**(-1)*X. * * METHOD : * BACK SUBSTITUTION * SUBROUTINE MXSPTB(N,A,IA,JA,X,JOB) INTEGER N,IA(*),JA(*),JOB DOUBLE PRECISION A(*),X(*) INTEGER I,J,K DOUBLE PRECISION TEMP,SUM * * FIRST PHASE * IF (JOB.GE.0) THEN DO 300 I=1,N K=IA(I) IF (K.LE.0) GO TO 300 TEMP=X(I)*A(K) DO 200 J=IA(I)+1,IA(I+1)-1 K=JA(J) IF (K.GT.0) X(K)=X(K)-A(J)*TEMP 200 CONTINUE IF (JOB.EQ.0) X(I)=TEMP 300 CONTINUE END IF * * THIRD PHASE * IF (JOB.LE.0) THEN DO 600 I=N,1,-1 K=IA(I) IF (K.LE.0) GO TO 600 SUM=0.0D 0 TEMP=A(K) DO 500 J=IA(I)+1,IA(I+1)-1 K=JA(J) IF (K.GT.0) SUM=SUM+A(J)*X(K) 500 CONTINUE SUM=SUM*TEMP X(I)=X(I)-SUM 600 CONTINUE END IF RETURN END * SUBROUTINE MXSPTF ALL SYSTEMS 03/12/01 * PURPOSE : * INCOMPLETE CHOLESKY FACTORIZATION A+E=L*D*TRANS(L) OF A SPARSE * SYMMETRIC POSITIVE DEFINITE MATRIX A+E WHERE D AND E ARE DIAGONAL * POSITIVE DEFINITE MATRICES AND L IS A LOWER TRIANGULAR MATRIX. * METHOD IS BASED ON THE SIMPLE IC(0) ALGORITHM WITHOUT DIAGONAL * COMPENSATION. SPARSE RIGHT-LOOKING IMPLEMENTATION. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(M) SPARSE SYMMETRIC (USUALLY POSITIVE DEFINITE) MATRIX. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * IA WN01(N+1) AMXILIARY ARRAY. * IO INF AN INFORMATION OBTAINED IN THE FACTORIZATION PROCESS. IF * INF=0 THEN A IS SUFFICIENTLY POSITIVE DEFINITE AND E=0. IF * INF<0 THEN A IS NOT SUFFICIENTLY POSITIVE DEFINITE AND E>0. IF * INF>0 THEN A IS INDEFINITE AND INF IS AN INDEX OF THE * MOST NEGATIVE DIAGONAL ELEMENT USED IN THE FACTORIZATION * PROCESS. * RU ALF ON INPUT A DESIRED TOLERANCE FOR POSITIVE DEFINITENESS. * ON OUTPUT THE MOST NEGATIVE DIAGONAL ELEMENT USED IN THE * FACTORIZATION PROCESS (IF INF>0). * RO TAU MAXIMUM DIAGONAL ELEMENT OF THE MATRIX E. * * METHOD : * P.E.GILL, W.MURRAY : NEWTON TYPE METHODS FOR UNCONSTRAINED AND * LINEARLY CONSTRAINED OPTIMIZATION, MATH. PROGRAMMING 28 (1974) * PP. 311-350. * SUBROUTINE MXSPTF(N,A,IA,JA,WN01,INF,ALF,TAU) INTEGER N,IA(*),JA(*),WN01(*),INF DOUBLE PRECISION A(*),ALF,TAU INTEGER I,J,K,L,II,LL,K1,L1,L2,JSTRT,JSTOP,IDIAG,KSTRT,KSTOP,NJA DOUBLE PRECISION PTOL,BET,GAM,TEMP,DEL,DIAG,NDIAG,INVDIAG PTOL=ALF NJA=IA(N+1)-1 * * INITIALIZE AMXILIARY VECTOR * INF=0 CALL MXVINS(N,0,WN01) * * GILL-MURRAY MODIFICATION * ALF=0.0D 0 BET=0.0D 0 GAM=0.0D 0 TAU=0.0D 0 DO 2 I=1,N IDIAG=IA(I) IF (JA(IDIAG).LE.0) GO TO 2 TEMP=A(IDIAG) BET=MAX(BET,ABS(TEMP)) DO 1 J=IA(I)+1,IA(I+1)-1 IF (JA(J).LE.0) GO TO 1 TEMP=A(J) GAM=MAX(GAM,ABS(TEMP)) 1 CONTINUE 2 CONTINUE BET=MAX(PTOL,BET,GAM/DBLE(N)) DEL=PTOL*BET * * COMPUTE THE PRECONDITIONER * LL=0 DO 8 K=1,N KSTRT=IA(K) KSTOP=IA(K+1)-1 IF (JA(KSTRT).LE.0) GO TO 8 DIAG=A(KSTRT) IF (ALF.GT.DIAG) THEN ALF=DIAG LL=K END IF GAM=0.0D 0 DO 3 J=KSTRT+1,KSTOP IF (JA(J).LE.0) GO TO 3 TEMP=A(J) GAM=MAX(GAM,ABS(TEMP)) 3 CONTINUE GAM=GAM*GAM INVDIAG=MAX(ABS(DIAG),GAM/BET,DEL) IF (TAU.LT.INVDIAG-DIAG) THEN TAU=INVDIAG-DIAG INF=-1 END IF INVDIAG=1.0D 0/INVDIAG A(KSTRT)=INVDIAG * * RIGHT-LOOKING UPDATE * * * SET POINTERS * DO 4 II=KSTRT,KSTOP K1=JA(II) IF (K1.GT.0) WN01(K1)=II 4 CONTINUE * * INNER LOOP * DO 6 I=KSTRT+1,KSTOP J=JA(I) IF (J.LE.0) GO TO 6 NDIAG=A(I) JSTRT=IA(J) JSTOP=IA(J+1)-1 DO 5 L=JSTRT,JSTOP L1=JA(L) IF (L1.LE.0) GO TO 5 L2=WN01(L1) IF (L2.NE.0) THEN A(L)=A(L)-(A(L2)*INVDIAG)*NDIAG END IF 5 CONTINUE 6 CONTINUE * * CLEAR THE POINTERS * DO 7 II=KSTRT,KSTOP K1=JA(II) IF (K1.GT.0) WN01(K1)=0 7 CONTINUE 8 CONTINUE IF (LL.GT.0.AND.ABS(ALF).GT.DEL) INF=LL RETURN END * SUBROUTINE MXSRMD ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF TRANSPOSE OF A DENSE RECTANGULAR MATRIX A BY * A VECTOR X AND ADDITION OF A SCALED VECTOR ALF*Y. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II NA NUMBER OF COLUMNS OF THE MATRIX A. * II MA NUMBER OF ELEMENTS IN THE FIELD A. * RI A(MA) RECTANGULAR MATRIX STORED AS A TWO-DIMENSIONAL ARRAY. * II IA(NA+1) POSITION OF THE FIRST RORWS ELEMENTS IN THE FIELD A. * II JA(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD A. * RI X(N) INPUT VECTOR. * RI ALF SCALING FACTOR. * RI Y(NA) INPUT VECTOR. * RO Z(NA) OUTPUT VECTOR EQUAL TO TRANS(A)*X+ALF*Y. * SUBROUTINE MXSRMD(NA,A,IA,JA,X,ALF,Y,Z) INTEGER NA,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),ALF,Y(*),Z(*) DOUBLE PRECISION TEMP INTEGER I,J,K,L,JP DO 2 I=1,NA K=IA(I) L=IA(I+1)-K TEMP=ALF*Y(I) DO 1 J=1,L JP=JA(K) IF (JP.GT.0) TEMP=TEMP+A(K)*X(JP) K=K+1 1 CONTINUE Z(I)=TEMP 2 CONTINUE RETURN END * SUBROUTINE MXSRMM ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF TRANSPOSE OF A DENSE RECTANGULAR MATRIX A BY * A VECTOR X. * * PARAMETERS : * II N NUMBER OF ROWS OF THE MATRIX A. * II NA NUMBER OF COLUMNS OF THE MATRIX A. * II MA NUMBER OF ELEMENTS IN THE FIELD A. * RI A(MA) RECTANGULAR MATRIX STORED AS A TWO-DIMENSIONAL ARRAY. * II IA(NA+1) POSITION OF THE FIRST RORWS ELEMENTS IN THE FIELD A. * II JA(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD A. * RI X(N) INPUT VECTOR. * RO Y(M) OUTPUT VECTOR EQUAL TO TRANS(A)*X. * SUBROUTINE MXSRMM(NA,A,IA,JA,X,Y) INTEGER NA,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),Y(*) DOUBLE PRECISION TEMP INTEGER I,J,K,L,JP DO 2 I=1,NA K=IA(I) L=IA(I+1)-K TEMP=0.0D 0 DO 1 J=1,L JP=JA(K) IF (JP.GT.0) TEMP=TEMP+A(K)*X(JP) K=K+1 1 CONTINUE Y(I)=TEMP 2 CONTINUE RETURN END * SUBROUTINE MXSRSP ALL SYSTEMS 95/12/01 * PURPOSE : CREATE ROW PERMUTATIONS FOR OBTAINING DIAGONAL NONZEROS. * * PARAMETERS : * II N NUMBER OF COLUMNS OF THE MATRIX. * II M NUMBER OF NONZEROS MEMBERS IN THE MATRIX. * II IA(M+1) ROW POINTERS OF THE SPARSE MATRIX. * II JA(M) COLUMN INDICES OF THE SPARSE MATRIX. * IO IP(N) PERMUTATION VECTOR. * II NR NUMBER OF STRUCTURALLY INDEPENDENT ROWS. * IA IW1(N) AMXILIARY VECTOR. * IA IW2(N) AMXILIARY VECTOR. * IA IW3(N) AMXILIARY VECTOR. * IA IW4(N) AMXILIARY VECTOR. * SUBROUTINE MXSRSP(N,IA,JA,IP,NR,IW1,IW2,IW3,IW4) INTEGER N,NR INTEGER IA(*),IP(*),IW1(*),IW2(*),IW3(*),IW4(*),JA(*) INTEGER I,I1,I2,II,J,J1,K,KK,L DO 10 I = 1,N IW2(I) = IA(I+1) - IA(I) - 1 IW3(I) = 0 IP(I) = 0 10 CONTINUE NR = 0 * * MAIN LOOP. * EACH PASS ROUND THIS LOOP EITHER RESULTS IN A NEW ASSIGNMENT * OR GIVES A ROW WITH NO ASSIGNMENT. * DO 100 L = 1,N J = L IW1(J) = -1 DO 70 K = 1,L * * LOOK FOR A CHEAP ASSIGNMENT * I1 = IW2(J) IF (I1.LT.0) GO TO 30 I2 = IA(J+1) - 1 I1 = I2 - I1 DO 20 II = I1,I2 I = JA(II) IF (IP(I).EQ.0) GO TO 80 20 CONTINUE * * NO CHEAP ASSIGNMENT IN ROW. * IW2(J) = -1 * * BEGIN LOOKING FOR ASSIGNMENT CHAIN STARTING WITH ROW J. * 30 CONTINUE IW4(J) = IA(J+1) - IA(J) - 1 * * INNER LOOP. EXTENDS CHAIN BY ONE OR BACKTRACKS. * DO 60 KK = 1,L I1 = IW4(J) IF (I1.LT.0) GO TO 50 I2 = IA(J+1) - 1 I1 = I2 - I1 * * FORWARD SCAN. * DO 40 II = I1,I2 I = JA(II) IF (IW3(I).EQ.L) GO TO 40 * * COLUMN I HAS NOT YET BEEN ACCESSED DURING THIS PASS. * J1 = J J = IP(I) IW3(I) = L IW1(J) = J1 IW4(J1) = I2 - II - 1 GO TO 70 40 CONTINUE * * BACKTRACKING STEP. * 50 CONTINUE J = IW1(J) IF (J.EQ.-1) GO TO 100 60 CONTINUE 70 CONTINUE * * NEW ASSIGNMENT IS MADE. * 80 CONTINUE IP(I) = J IW2(J) = I2 - II - 1 NR = NR + 1 DO 90 K = 1,L J = IW1(J) IF (J.EQ.-1) GO TO 100 II = IA(J+1) - IW4(J) - 2 I = JA(II) IP(I) = J 90 CONTINUE 100 CONTINUE * * IF MATRIX IS STRUCTURALLY SINGULAR, WE NOW COMPLETE THE * PERMUTATION IP. * IF (NR.EQ.N) RETURN DO 110 I = 1,N IW2(I) = 0 110 CONTINUE K = 0 DO 130 I = 1,N IF (IP(I).NE.0) GO TO 120 K = K + 1 IW4(K) = I GO TO 130 120 CONTINUE J = IP(I) IW2(J) = I 130 CONTINUE K = 0 DO 140 I = 1,N IF (IW2(I).NE.0) GO TO 140 K = K + 1 L = IW4(K) IP(L) = I 140 CONTINUE RETURN END * SUBROUTINE MXSSDA ALL SYSTEMS 91/12/01 * PURPOSE : * A SPARSE SYMMETRIC MATRIX A IS AUGMENTED BY THE SCALED UNIT MATRIX * SUCH THAT A:=A+ALF*I (I IS THE UNIT MATRIX OF ORDER N). * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * RI ALF SCALING FACTOR. * SUBROUTINE MXSSDA(N,A,IA,ALF) INTEGER N,IA(*) DOUBLE PRECISION A(*), ALF INTEGER I DO 100 I=1,N A(IA(I))=A(IA(I))+ALF 100 CONTINUE RETURN END * FUNCTION MXSSDL ALL SYSTEMS 88/12/01 * PURPOSE : * DETERMINATION OF A MINIMUM DIAGONAL ELEMENT OF A SPARSE SYMMETRIC * MATRIX * * PARAMETERS : * II N ORDER OF THE MATRIX A * RI A(MMAX) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * USUAL FORM. * II IA(N+1) POINTER VECTOR OF THE DIAGONAL OF THE SPARSE MATRIX. * II JA(MMAX) INDICES OF NONZERO ELEMENTS OF THE SPARSE MATRIX. * IO INF INDEX OF INIMUM DIAGONAL ELEMENT OF THE MATRIX A. * RR MXSSDL MINIMUM DIAGONAL ELEMENT OF THE MATRIX A. * FUNCTION MXSSDL(N,A,IA,JA,INF) INTEGER N,IA(*),JA(*),INF DOUBLE PRECISION A(*),MXSSDL DOUBLE PRECISION CON PARAMETER (CON=1.0D 60) INTEGER I,J INF=0 MXSSDL = CON DO 100 I=1,N J=IA(I) IF (JA(J).GT.0.AND.MXSSDL.GT.A(J)) THEN INF=I MXSSDL=A(J) END IF 100 CONTINUE RETURN END * SUBROUTINE MXSSMD ALL SYSTEMS 93/12/01 * PURPOSE : * MULTIPLICATION OF A SPARSE SYMMETRIC MATRIX A BY A VECTOR X * AND ADDITION OF A SCALED VECTOR ALF*Y. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * RI X(N) INPUT VECTOR. * RI ALF SCALING FACTOR. * RI Y(NA) INPUT VECTOR. * RO Z(NA) OUTPUT VECTOR EQUAL TO A*X+ALF*Y. * SUBROUTINE MXSSMD(N,A,IA,JA,X,ALF,Y,Z) INTEGER N,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),ALF,Y(*),Z(*) INTEGER I,J,K,JSTRT,JSTOP DO 100 I=1,N Z(I)=ALF*Y(I) 100 CONTINUE JSTOP=0 DO 300 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN DO 200 J=JSTRT,JSTOP K=JA(J) IF (J.EQ.JSTRT) THEN Z(I)=Z(I)+A(J)*X(I) ELSE IF (K.GT.0) THEN Z(K)=Z(K)+A(J)*X(I) Z(I)=Z(I)+A(J)*X(K) END IF 200 CONTINUE END IF 300 CONTINUE RETURN END * SUBROUTINE MXSSMG ALL SYSTEMS 91/12/01 * PURPOSE : * GERSHGORIN BOUNDS OF THE EIGENVALUAE OF A DENSE SYMMETRIC MATRIX. * AMIN .LE. ANY EIGENVALUE OF A .LE. AMAX. * * PARAMETERS : * II N DIMENSION OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * RO AMIN LOWER BOUND OF THE EIGENVALUE OF A. * RO AMAX UPPER BOUND OF THE EIGENVALUE OF A. * SUBROUTINE MXSSMG(N,A,IA,JA,AMIN,AMAX,X) INTEGER N,IA(*),JA(*) DOUBLE PRECISION A(*),AMIN,AMAX,X(*) INTEGER I,J,K,JSTRT,JSTOP DOUBLE PRECISION CMAX PARAMETER (CMAX=1.0D 60) DO 1 I=1,N X(I)=0.0D 0 1 CONTINUE JSTOP=0 DO 3 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN DO 2 K=JSTRT+1,JSTOP J=JA(K) IF (J.GT.0) THEN X(I)=X(I)+ABS(A(K)) X(J)=X(J)+ABS(A(K)) END IF 2 CONTINUE END IF 3 CONTINUE AMIN= CMAX AMAX=-CMAX DO 4 I=1,N K=IA(I) IF (K.GT.0) THEN AMAX=MAX(AMAX,A(K)+X(I)) AMIN=MIN(AMIN,A(K)-X(I)) END IF 4 CONTINUE RETURN END * SUBROUTINE MXSSMI ALL SYSTEMS 92/12/01 * PURPOSE : * SPARSE SYMMETRIC MATRIX A IS SET TO THE UNIT MATRIX WITH THE SAME * ORDER. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RU A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * SUBROUTINE MXSSMI(N,A,IA) INTEGER N,IA(*) DOUBLE PRECISION A(*) INTEGER I,K DO 100 I=1,IA(N+1)-1 A(I)=0.0D 0 100 CONTINUE DO 200 I=1,N K=ABS(IA(I)) A(K)=1.0D 0 200 CONTINUE RETURN END * SUBROUTINE MXSSMM ALL SYSTEMS 92/12/01 * PURPOSE : * MULTIPLICATION OF A SPARSE SYMMETRIC MATRIX BY A VECTOR X. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * II M NUMBER OF NONZERO ELEMENTS OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y := A * X. * SUBROUTINE MXSSMM(N,A,IA,JA,X,Y) INTEGER N,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),Y(*) INTEGER I,J,K,JSTRT,JSTOP DO 100 I=1,N Y(I)=0.0D 0 100 CONTINUE JSTOP=0 DO 300 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN DO 200 J=JSTRT,JSTOP K=JA(J) IF (J.EQ.JSTRT) THEN Y(I)=Y(I)+A(J)*X(I) ELSE IF (K.GT.0) THEN Y(K)=Y(K)+A(J)*X(I) Y(I)=Y(I)+A(J)*X(K) END IF 200 CONTINUE END IF 300 CONTINUE RETURN END * SUBROUTINE MXSSMN ALL SYSTEMS 89/12/01 * PURPOSE : * THIS SUBROUTINE FINDS THE PERMUTATION VECTOR PERM FOR THE * SPARSE SYMMETRIC MATRIX GIVEN IN THE VECTOR PAIR PA,SA.IT USES * THE SO-CALLED NESTED DISSECTION METHOD. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * II MMAX LENGTH OF THE PRINCIPAL MATRIX VECTORS. * II PA(N+1) POINTER VECTOR OF THE INPUT MATRIX. * II SA(MMAX) VECTOR OF THE COLUMN INDICES OF THE INPUT MATRIX. * IO PERM(N) PERMUTATION VECTOR. * IA WN11(N+1) AMXILIARY VECTOR. * IA WN12(N+1) AMXILIARY VECTOR. * IA WN13(N+1) AMXILIARY VECTOR. * * METHOD : * NESTED DISSECTION METHOD * SUBROUTINE MXSSMN(N,PA,SA,PERM,WN11,WN12,WN13) INTEGER N INTEGER PA(*),SA(*),PERM(*) INTEGER WN11(*),WN12(*),WN13(*) INTEGER I,J,K,NUM,ROOT,NLVL,LVLEND,LBEGIN,ICS INTEGER NN,N1,MINDEG,N2,LVSIZE,NDEG,NUNLVL,MIDLVL INTEGER TEMP,NPUL,NSEP,I1,I2,I3,I4,J1,J2 DO 100 I = 1, N WN11(I) = 1 100 CONTINUE NUM= 0 DO 2000 I = 1, N 200 IF ( WN11(I) .EQ. 0 ) GO TO 2000 ROOT = I WN11(ROOT) = 0 WN13(1) = ROOT NLVL = 0 LVLEND = 0 ICS = 1 300 LBEGIN = LVLEND + 1 LVLEND = ICS NLVL = NLVL + 1 WN12(NLVL) = LBEGIN DO 500 K = LBEGIN, LVLEND NN = WN13(K) DO 400 J=PA(NN),PA(NN+1)-1 N2 = SA(J) IF (N2.EQ.NN) GO TO 400 IF (WN11(N2).EQ.0) GO TO 400 ICS = ICS + 1 WN13(ICS) = N2 WN11(N2) = 0 400 CONTINUE 500 CONTINUE LVSIZE=ICS-LVLEND IF (LVSIZE.GT.0) GO TO 300 WN12(NLVL+1) = LVLEND + 1 DO 600 K = 1, ICS NN = WN13(K) WN11(NN) = 1 600 CONTINUE ICS = WN12(NLVL+1) - 1 IF ( NLVL .EQ. 1 .OR. NLVL .EQ. ICS )GO TO 1470 700 J1 = WN12(NLVL) MINDEG = ICS ROOT = WN13(J1) IF ( ICS .EQ. J1 ) GO TO 1000 DO 900 J = J1, ICS NN = WN13(J) NDEG = 0 DO 800 K=PA(NN),PA(NN+1)-1 N1 = SA(K) IF (N1.EQ.NN) GO TO 800 IF ( WN11(N1) .GT. 0 ) NDEG = NDEG + 1 800 CONTINUE IF ( NDEG .GE. MINDEG ) GO TO 900 ROOT = NN MINDEG = NDEG 900 CONTINUE 1000 CONTINUE WN11(ROOT) = 0 WN13(1) = ROOT NUNLVL = 0 LVLEND = 0 ICS = 1 1100 LBEGIN = LVLEND + 1 LVLEND = ICS NUNLVL = NUNLVL + 1 WN12(NUNLVL) = LBEGIN DO 1300 K = LBEGIN, LVLEND NN = WN13(K) DO 1200 J=PA(NN),PA(NN+1)-1 N2 = SA(J) IF (N2.EQ.NN) GO TO 1200 IF (WN11(N2).EQ.0) GO TO 1200 ICS = ICS + 1 WN13(ICS) = N2 WN11(N2) = 0 1200 CONTINUE 1300 CONTINUE LVSIZE=ICS-LVLEND IF (LVSIZE.GT.0) GO TO 1100 WN12(NUNLVL+1) = LVLEND + 1 DO 1400 K = 1, ICS NN = WN13(K) WN11(NN) = 1 1400 CONTINUE IF (NUNLVL .LE.NLVL) GO TO 1470 NLVL=NUNLVL IF (NLVL.LT.ICS) GO TO 700 1470 CONTINUE IF ( NLVL .GE. 3 ) GO TO 1600 NSEP = WN12(NLVL+1) - 1 DO 1500 K = 1, NSEP NN = WN13(K) PERM(NUM+K) = NN WN11(NN) = 0 1500 CONTINUE GO TO 1950 1600 MIDLVL = (NLVL+2)/2 I3 = WN12(MIDLVL) I1 = WN12(MIDLVL + 1) I4 = I1 - 1 I2 = WN12(MIDLVL+2) - 1 DO 1700 K = I1, I2 NN = WN13(K) PA(NN) = - PA(NN) 1700 CONTINUE NSEP = 0 DO 1800 K = I3, I4 NN = WN13(K) J1 = PA(NN) J2 = IABS(PA(NN+1)) - 1 DO 1750 J = J1, J2 N2 = SA(J) IF (N2.EQ.NN) GO TO 1750 IF ( PA(N2) .GT. 0 ) GO TO 1750 NSEP = NSEP + 1 PERM(NSEP+NUM) = NN WN11(NN) = 0 GO TO 1800 1750 CONTINUE 1800 CONTINUE DO 1900 K = I1, I2 NN = WN13(K) PA(NN) = - PA(NN) 1900 CONTINUE 1950 CONTINUE NUM = NUM + NSEP IF ( NUM .GE. N ) GO TO 2100 GO TO 200 2000 CONTINUE 2100 CONTINUE IF (N.LT.2) GO TO 2300 NPUL = N/2 DO 2200 I=1,NPUL TEMP=PERM(I) PERM(I)=PERM(N-I+1) PERM(N-I+1)=TEMP 2200 CONTINUE 2300 CONTINUE RETURN END * FUNCTION MXSSMQ ALL SYSTEMS 92/12/01 * PURPOSE : * VALUE OF A QUADRATIC FORM WITH A SPARSE SYMMETRIC MATRIX A. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RR MXSSMQ VALUE OF THE QUADRATIC FORM MXSSMQ=TRANS(Y)*A*X. * FUNCTION MXSSMQ(N,A,IA,JA,X,Y) INTEGER N,IA(*),JA(*) DOUBLE PRECISION A(*), X(*), Y(*), MXSSMQ DOUBLE PRECISION TEMP1,TEMP2 INTEGER I,J,K,JSTRT,JSTOP JSTOP=0 TEMP1=0.0D 0 DO 300 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN TEMP2=0.0D 0 DO 200 J=JSTRT,JSTOP K=JA(J) IF (J.EQ.JSTRT) THEN TEMP2=TEMP2+A(J)*Y(I) ELSE IF (K.GT.0) THEN TEMP2=TEMP2+2*Y(K)*A(J) END IF 200 CONTINUE TEMP1=TEMP1+X(I)*TEMP2 END IF 300 CONTINUE MXSSMQ=TEMP1 RETURN END * SUBROUTINE MXSSMY ALL SYSTEMS 93/12/01 * PURPOSE : * CORRECTION OF A SPARSE SYMMETRIC MATRIX A. THE CORRECTION IS DEFINED * AS A:=A+SUM OF (HALF*(X*TRANS(Y)+Y*TRANS(X)))(I)/SIGMA(I) WHERE * SIGMA(I) IS A DOT PRODUCT TRANS(X)*X WHERE ONLY CONTRIBUTIONS * CORRESPONDING TO NONZEROS IN ROW I ARE SUMMED UP, X AND Y ARE GIVEN * VECTORS. * * PARAMETERS : * II N ORDER OF THE MATRIX A. * RI A(M) ELEMENTS OF THE SPARSE SYMMETRIC MATRIX STORED IN THE * PACKED FORM. * II IA(N) POINTERS OF THE DIAGONAL ELEMENTS OF A. * II JA(M) INDICES OF THE NONZERO ELEMENTS OF A. * RA XS(N) AMXILIARY VECTOR - USED FOR SIGMA(I). * RI X(N) VECTOR IN THE CORRECTION TERM. * RI Y(N) VECTOR IN THE CORRECTION TERM. * SUBROUTINE MXSSMY(N,A,IA,JA,XS,X,Y) INTEGER N,IA(*),JA(*) DOUBLE PRECISION A(*),X(*),Y(*),XS(*),SIGMA,TEMP INTEGER I,J,K,JSTRT,JSTOP CALL MXVSET(N,0.0D 0,XS) * * COMPUTE SIGMA(I) * JSTOP=0 DO 200 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN SIGMA=0.0D 0 DO 100 J=JSTRT,JSTOP K=JA(J) IF (K.GT.0) THEN SIGMA=SIGMA+Y(K)*Y(K) IF (K.NE.I) XS(K)=XS(K)+Y(I)*Y(I) END IF 100 CONTINUE XS(I)=XS(I)+SIGMA END IF 200 CONTINUE * * UPDATE MATRIX * JSTOP=0 DO 400 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 IF (JA(JSTRT).GT.0) THEN IF (XS(I).EQ.0.0D 0) THEN TEMP=0.0D 0 ELSE TEMP=X(I)/XS(I) END IF DO 300 J=JSTRT,JSTOP K=JA(J) IF (K.GT.0) THEN IF (XS(K).EQ.0.0D 0) THEN A(J)=A(J)+0.5D 0*TEMP*Y(K) ELSE A(J)=A(J)+0.5D 0*(TEMP*Y(K)+Y(I)*X(K)/XS(K)) END IF END IF 300 CONTINUE END IF 400 CONTINUE RETURN END * SUBROUTINE MXSTG1 ALL SYSTEMS 89/12/01 * PURPOSE : * WIDTHENING THE PACKED FORM OF THE VECTORS IA, JA OF THE SPARSE MATRIX * * PARAMETERS : * II N ORDER OF THE SPARSE MATRIX. * IU M NUMBER OF NONZERO ELEMENTS IN THE MATRIX. * II MMAX LENGTH OF THE ARRAY JA. * II IA(N+1) POINTER VECTOR OF THE INPUT MATRIX. * II JA(MMAX) VECTOR OF THE COLUMN INDICES OF THE INPUT MATRIX. * IA PD(N+1) AMXILIARY VECTOR. * IA WN11(N+1) AMXILIARY VECTOR. * SUBROUTINE MXSTG1(N,M,IA,JA,PD,WN11) INTEGER N,M INTEGER IA(*),PD(*),JA(*),WN11(*) INTEGER I,J,L1,L,K * * UPPER TRIANGULAR INFORMATION TO THE AMXILIARY ARRAY * L1=IA(1) DO 100 I=1,N L=L1 L1=IA(I+1) WN11(I)=L1-L 100 CONTINUE * * LOWER TRIANGULAR INFORMATION TO THE AMXILIARY ARRAY * DO 300 I=1,N DO 200 J=IA(I)+1,IA(I+1)-1 K=ABS(JA(J)) WN11(K)=WN11(K)+1 200 CONTINUE 300 CONTINUE * * BY PARTIAL SUMMING WE GET POINTERS OF THE WIDE STRUCTURE * WN11(I) POINTS AT THE END OF THE ROW I * L=0 DO 400 I=2,N WN11(I)=WN11(I)+WN11(I-1) 400 CONTINUE * * DEFINE LENGTH OF THE WITHENED STRUCTURE * M=WN11(N) * * SHIFT OF UPPER TRIANGULAR ROWS * PD(1)=1 DO 600 I=N,1,-1 L=WN11(I) PD(I+1)=L+1 DO 500 J=IA(I+1)-1,IA(I),-1 JA(L)=JA(J) L=L-1 500 CONTINUE 600 CONTINUE * * FORMING OF THE LOWER TRIANGULAR PART * DO 800 I=1,N DO 700 J=WN11(I)+IA(I)+2-IA(I+1),WN11(I) K=ABS(JA(J)) JA(PD(K))=I PD(K)=PD(K)+1 700 CONTINUE 800 CONTINUE DO 900 I=1,N IA(I+1)=WN11(I)+1 900 CONTINUE RETURN END * SUBROUTINE MXSTL1 ALL SYSTEMS 91/12/01 * PURPOSE : * PACKING OF THE WIDTHENED FORM OF THE VECTORS IA, JA OF THE SPARSE * MATRIX * * PARAMETERS : * II N ORDER OF THE SPARSE MATRIX. * IU M NUMBER OF NONZERO ELEMENTS IN THE MATRIX. * II MMAX LENGTH OF THE ARRAY JA. * IU IA(N+1) POINTER VECTOR OF THE INPUT MATRIX. * IU JA(MMAX) VECTOR OF THE COLUMN INDICES OF THE INPUT MATRIX. * IA PD(N+1) AMXILIARY VECTOR. * SUBROUTINE MXSTL1(N,M,IA,JA,PD) INTEGER N,M INTEGER IA(*),PD(*),JA(*) INTEGER I,J,L,JSTRT,JSTOP L=1 * * PD DEFINITION * JSTOP=0 DO 60 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 DO 50 J=JSTRT,JSTOP IF (ABS(JA(J)).EQ.I) THEN PD(I)=J GO TO 60 END IF 50 CONTINUE 60 CONTINUE * * REWRITE THE STRUCTURE * DO 200 I=1,N DO 100 J=PD(I),IA(I+1)-1 JA(L)=JA(J) L=L+1 100 CONTINUE IA(I+1)=L 200 CONTINUE IA(1)=1 * * SET THE LENGTH OF THE PACKED STRUCTURE * M=L-1 RETURN END * SUBROUTINE MXSTL2 ALL SYSTEMS 90/12/01 * PURPOSE : * PACKING OF THE WIDTHENED FORM OF THE VECTORS A,IA,JA OF THE SPARSE * MATRIX * * PARAMETERS : * II N ORDER OF THE SPARSE MATRIX. * IU M NUMBER OF NONZERO ELEMENTS IN THE MATRIX. * II MMAX LENGTH OF THE ARRAY JA. * RU A(MMAX) VECTOR OF NUMERICAL VALUES OF THE MATRIX BEING SHRINKED. * IU IA(N+1) POINTER VECTOR OF THE INPUT MATRIX. * IU JA(MMAX) VECTOR OF THE COLUMN INDICES OF THE INPUT MATRIX. * IA PD(N+1) AMXILIARY VECTOR. * SUBROUTINE MXSTL2(N,M,A,IA,JA,PD) INTEGER N,M INTEGER IA(*),PD(*),JA(*) DOUBLE PRECISION A(*) INTEGER I,J,L,JSTRT,JSTOP L=1 * * PD DEFINITION * JSTOP=0 DO 60 I=1,N JSTRT=JSTOP+1 JSTOP=IA(I+1)-1 DO 50 J=JSTRT,JSTOP IF (ABS(JA(J)).EQ.I) THEN PD(I)=J GO TO 60 END IF 50 CONTINUE 60 CONTINUE * * REWRITE THE STRUCTURE * DO 200 I=1,N DO 100 J=PD(I),IA(I+1)-1 JA(L)=JA(J) A(L)=A(J) L=L+1 100 CONTINUE IA(I+1)=L 200 CONTINUE IA(1)=1 * * SET THE LENGTH OF THE PACKED STRUCTURE * M=L-1 RETURN END * SUBROUTINE MXTPGB ALL SYSTEMS 93/12/01 * PURPOSE : * BACK SUBSTITUTION FOR A DECOMPOSED TRIDIAGONAL MATRIX. * * PARAMETERS : * II N ORDER OF THE TRIDIAGONAL MATRIX T. * RI D(N) ELEMENTS OF THE DIAGONAL MATRIX D IN THE DECOMPOSITION * T=L*D*TRANS(L). * RI E(N) SUBDIAGONAL ELEMENTS OF THE LOWER TRIANGULAR MATRIX L IN * THE DECOMPOSITION T=L*D*TRANS(L). * RU X(N) ON INPUT THE RIGHT HAND SIDE OF A SYSTEM OF LINEAR * EQUATIONS. ON OUTPUT THE SOLUTION OF A SYSTEM OF LINEAR * EQUATIONS. * II JOB OPTION. IF JOB=0 THEN X:=T**(-1)*X. IF JOB>0 THEN * X:=L**(-1)*X. IF JOB<0 THEN X:=TRANS(L)**(-1)*X. * SUBROUTINE MXTPGB(N,D,E,X,JOB) INTEGER N,JOB DOUBLE PRECISION D(*),E(*),X(*) INTEGER I IF (JOB.GE.0) THEN * * PHASE 1 : X:=L**(-1)*X * DO 1 I=2,N X(I)=X(I)-X(I-1)*E(I-1) 1 CONTINUE END IF IF (JOB.EQ.0) THEN * * PHASE 2 : X:=D**(-1)*X * DO 2 I=1,N X(I)=X(I)/D(I) 2 CONTINUE END IF IF (JOB.LE.0) THEN * * PHASE 3 : X:=TRANS(L)**(-1)*X * DO 3 I=N-1,1,-1 X(I)=X(I)-X(I+1)*E(I) 3 CONTINUE END IF RETURN END * SUBROUTINE MXTPGF ALL SYSTEMS 03/12/01 * PURPOSE : * CHOLESKI DECOMPOSITION OF A TRIDIAGONAL MATRIX. * * PARAMETERS : * II N ORDER OF THE TRIDIAGONAL MATRIX T. * RU D(N) ON INPUT DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX T. * ON OUTPUT ELEMENTS OF THE DIAGONAL MATRIX D IN THE * DECOMPOSITION T=L*D*TRANS(L). * RU E(N) ON INPUT SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX T. * ON OUTPUT SUBDIAGONAL ELEMENTS OF THE LOWER TRIANGULAR MATRIX L * IN THE DECOMPOSITION T=L*D*TRANS(L). * IO INF AN INFORMATION OBTAINED IN THE FACTORIZATION PROCESS. IF * INF=0 THEN A IS SUFFICIENTLY POSITIVE DEFINITE AND E=0. IF * INF<0 THEN A IS NOT SUFFICIENTLY POSITIVE DEFINITE AND E>0. IF * INF>0 THEN A IS INDEFINITE AND INF IS AN INDEX OF THE * MOST NEGATIVE DIAGONAL ELEMENT USED IN THE FACTORIZATION * PROCESS. * RU ALF ON INPUT A DESIRED TOLERANCE FOR POSITIVE DEFINITENESS. ON * OUTPUT THE MOST NEGATIVE DIAGONAL ELEMENT USED IN THE * FACTORIZATION PROCESS (IF INF>0). * RO TAU MAXIMUM DIAGONAL ELEMENT OF THE MATRIX E. * SUBROUTINE MXTPGF(N,D,E,INF,ALF,TAU) INTEGER N,INF DOUBLE PRECISION D(*),E(*),ALF,TAU DOUBLE PRECISION DI,EI,BET,GAM,DEL,TOL INTEGER I,L DOUBLE PRECISION ZERO,ONE,TWO PARAMETER (ZERO=0.0D 0,ONE=1.0D 0,TWO=2.0D 0) L=0 INF=0 TOL=ALF * * ESTIMATION OF THE MATRIX NORM * ALF=ZERO GAM=ZERO TAU=ZERO BET=ABS(D(1)) DO 1 I=1,N-1 BET=MAX(BET,ABS(D(I+1))) GAM=MAX(GAM,ABS(E(I))) 1 CONTINUE BET=MAX(TOL,TWO*BET,GAM/MAX(ONE,DBLE(N-1))) DEL=TOL*MAX(BET,ONE) DO 2 I=1,N EI=D(I) IF (ALF.GT.EI) THEN ALF=EI L=I END IF GAM=ZERO IF (I.LT.N) GAM=E(I)**2 DI=MAX(ABS(EI),GAM/BET,DEL) IF (TAU.LT.DI-EI) THEN TAU=DI-EI INF=-1 END IF * * GAUSSIAN ELIMINATION * D(I)=DI IF (I.LT.N) THEN EI=E(I) E(I)=EI/DI D(I+1)=D(I+1)-E(I)*EI END IF 2 CONTINUE IF (L.GT.0.AND.ABS(ALF).GT.DEL) INF = L RETURN END * SUBROUTINE MXUCOP ALL SYSTEMS 99/12/01 * PURPOSE : * COPY OF THE VECTOR WITH INITIATION OF THE ACTIVE PART. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * SUBROUTINE MXUCOP(N,X,Y,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION X(*),Y(*) INTEGER I IF (JOB.EQ.0) THEN DO 1 I=1,N Y(I)=X(I) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) THEN Y(I)=X(I) ELSE Y(I)=0.0D 0 END IF 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) THEN Y(I)=X(I) ELSE Y(I)=0.0D 0 END IF 3 CONTINUE END IF RETURN END * FUNCTION MXUDEL ALL SYSTEMS 99/12/01 * PURPOSE : * SQUARED NORM OF A SHIFTED VECTOR IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A SCALING FACTOR. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * RR MXUDEL SQUARED NORM OF Y+A*X. * FUNCTION MXUDEL(N,A,X,Y,IX,JOB) INTEGER N,IX(N),JOB DOUBLE PRECISION A,X(N),Y(N),MXUDEL INTEGER I DOUBLE PRECISION TEMP TEMP=0.0D 0 IF (JOB.EQ.0) THEN DO 1 I=1,N TEMP=TEMP+(Y(I)+A*X(I))**2 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) TEMP=TEMP+(Y(I)+A*X(I))**2 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) TEMP=TEMP+(Y(I)+A*X(I))**2 3 CONTINUE END IF MXUDEL=TEMP RETURN END * SUBROUTINE MXUDIF ALL SYSTEMS 99/12/01 * PURPOSE : * VECTOR DIFFERENCE IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= X - Y. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * SUBROUTINE MXUDIF(N,X,Y,Z,IX,JOB) INTEGER N,IX(N),JOB DOUBLE PRECISION X(*),Y(*),Z(*) INTEGER I IF (JOB.EQ.0) THEN DO 1 I=1,N Z(I)=X(I)-Y(I) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) Z(I)=X(I)-Y(I) 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) Z(I)=X(I)-Y(I) 3 CONTINUE END IF RETURN END * SUBROUTINE MXUDIR ALL SYSTEMS 99/12/01 * PURPOSE : * VECTOR AUGMENTED BY THE SCALED VECTOR IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A SCALING FACTOR. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= Y + A*X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * SUBROUTINE MXUDIR(N,A,X,Y,Z,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION A, X(*), Y(*), Z(*) INTEGER I IF (JOB.EQ.0) THEN DO 1 I=1,N Z(I) = Y(I) + A*X(I) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) Z(I) = Y(I) + A*X(I) 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) Z(I) = Y(I) + A*X(I) 3 CONTINUE END IF RETURN END * FUNCTION MXUDOT ALL SYSTEMS 99/12/01 * PURPOSE : * DOT PRODUCT OF VECTORS IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * RR MXUDOT VALUE OF DOT PRODUCT MXUDOT=TRANS(X)*Y. * FUNCTION MXUDOT(N,X,Y,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION X(*),Y(*),MXUDOT DOUBLE PRECISION TEMP INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO = 0.0D 0) TEMP = ZERO IF (JOB.EQ.0) THEN DO 1 I=1,N TEMP=TEMP+X(I)*Y(I) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) TEMP=TEMP+X(I)*Y(I) 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) TEMP=TEMP+X(I)*Y(I) 3 CONTINUE END IF MXUDOT=TEMP RETURN END * SUBROUTINE MXUNEG ALL SYSTEMS 00/12/01 * PURPOSE : * COPY OF THE VECTOR WITH INITIATION OF THE ACTIVE PART. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * SUBROUTINE MXUNEG(N,X,Y,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION X(*),Y(*) INTEGER I IF (JOB.EQ.0) THEN DO 1 I=1,N Y(I)=-X(I) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) THEN Y(I)=-X(I) ELSE Y(I)=0.0D 0 END IF 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) THEN Y(I)=-X(I) ELSE Y(I)=0.0D 0 END IF 3 CONTINUE END IF RETURN END * FUNCTION MXUNOR ALL SYSTEMS 99/12/01 * PURPOSE : * EUCLIDEAN NORM OF A VECTOR IN A BOUND CONSTRAINED CASE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * RR MXUNOR EUCLIDEAN NORM OF X. * FUNCTION MXUNOR(N,X,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION X(*),MXUNOR DOUBLE PRECISION POM,DEN INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D 0) DEN=ZERO IF (JOB.EQ.0) THEN DO 1 I=1,N DEN=MAX(DEN,ABS(X(I))) 1 CONTINUE ELSE IF (JOB.GT.0) THEN DO 2 I=1,N IF (IX(I).GE. 0) DEN=MAX(DEN,ABS(X(I))) 2 CONTINUE ELSE DO 3 I=1,N IF (IX(I).NE.-5) DEN=MAX(DEN,ABS(X(I))) 3 CONTINUE END IF POM=ZERO IF (DEN.GT.ZERO) THEN IF (JOB.EQ.0) THEN DO 4 I=1,N POM=POM+(X(I)/DEN)**2 4 CONTINUE ELSE IF (JOB.GT.0) THEN DO 5 I=1,N IF (IX(I).GE. 0) POM=POM+(X(I)/DEN)**2 5 CONTINUE ELSE DO 6 I=1,N IF (IX(I).NE.-5) POM=POM+(X(I)/DEN)**2 6 CONTINUE END IF END IF MXUNOR=DEN*SQRT(POM) RETURN END * SUBROUTINE MXUZER ALL SYSTEMS 99/12/01 * PURPOSE : * VECTOR ELEMENTS CORRESPONDING TO ACTIVE BOUNDS ARE SET TO ZERO. * * PARAMETERS : * II N VECTOR DIMENSION. * RO X(N) OUTPUT VECTOR SUCH THAT X(I)=A FOR ALL I. * II IX(N) VECTOR CONTAINING TYPES OF BOUNDS. * II JOB OPTION. IF JOB.GT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).LE.-1. IF JOB.LT.0 THEN INDEX I IS NOT USED WHENEVER * IX(I).EQ.-5. * SUBROUTINE MXUZER(N,X,IX,JOB) INTEGER N,IX(*),JOB DOUBLE PRECISION X(*) INTEGER I IF (JOB.EQ.0) RETURN DO 1 I=1,N IF (IX(I).LT.0) X(I)=0.0D 0 1 CONTINUE RETURN END * SUBROUTINE MXVCOP ALL SYSTEMS 88/12/01 * PURPOSE : * COPYING OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= X. * SUBROUTINE MXVCOP(N,X,Y) INTEGER N DOUBLE PRECISION X(*),Y(*) INTEGER I DO 10 I = 1,N Y(I) = X(I) 10 CONTINUE RETURN END * SUBROUTINE MXVCOR ALL SYSTEMS 93/12/01 * PURPOSE : * CORRECTION OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A CORRECTION FACTOR. * RU X(N) CORRECTED VECTOR. ZERO ELEMENTS OF X ARE SET TO BE EQUAL A. * SUBROUTINE MXVCOR(N,A,X) INTEGER N DOUBLE PRECISION A,X(*) DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D 0) INTEGER I DO 1 I=1,N IF (X(I).EQ.ZERO) X(I)=A 1 CONTINUE RETURN END * SUBROUTINE MXVDIF ALL SYSTEMS 88/12/01 * PURPOSE : * VECTOR DIFFERENCE. * * PARAMETERS : * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= X - Y. * SUBROUTINE MXVDIF(N,X,Y,Z) INTEGER N DOUBLE PRECISION X(*),Y(*),Z(*) INTEGER I DO 10 I = 1,N Z(I) = X(I) - Y(I) 10 CONTINUE RETURN END * SUBROUTINE MXVDIR ALL SYSTEMS 91/12/01 * PURPOSE : * VECTOR AUGMENTED BY THE SCALED VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A SCALING FACTOR. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= Y + A*X. * SUBROUTINE MXVDIR(N,A,X,Y,Z) DOUBLE PRECISION A INTEGER N DOUBLE PRECISION X(*),Y(*),Z(*) INTEGER I DO 10 I = 1,N Z(I) = Y(I) + A*X(I) 10 CONTINUE RETURN END * FUNCTION MXVDOT ALL SYSTEMS 91/12/01 * PURPOSE : * DOT PRODUCT OF TWO VECTORS. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RR MXVDOT VALUE OF DOT PRODUCT MXVDOT=TRANS(X)*Y. * FUNCTION MXVDOT(N,X,Y) INTEGER N DOUBLE PRECISION X(*),Y(*),MXVDOT DOUBLE PRECISION TEMP INTEGER I TEMP = 0.0D0 DO 10 I = 1,N TEMP = TEMP + X(I)*Y(I) 10 CONTINUE MXVDOT = TEMP RETURN END * SUBROUTINE MXVICP ALL SYSTEMS 93/12/01 * PURPOSE : * COPYING OF AN INTEGER VECTOR. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * II IX(N) INPUT INTEGER VECTOR. * IO IY(N) OUTPUT INTEGER VECTOR SUCH THAT IY(I):= IX(I) FOR ALL I. * SUBROUTINE MXVICP(N,IX,IY) INTEGER N,IX(*),IY(*) INTEGER I DO 1 I=1,N IY(I)=IX(I) 1 CONTINUE RETURN END * SUBROUTINE MXVINB ALL SYSTEMS 91/12/01 * PURPOSE : * UPDATE OF AN INTEGER VECTOR. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * II M DIMENSION OF THE CHANGED INTEGER VECTOR. * II IX(N) INTEGER VECTOR. * IU JA(M) INTEGER VECTOR WHICH IS UPDATED SO THAT JA(I)=-JA(I) * IF IX(JA(I)).LT.0. * SUBROUTINE MXVINB(M,IX,JA) INTEGER M,IX(*),JA(*) INTEGER I DO 1 I=1,M JA(I)=ABS(JA(I)) IF (IX(JA(I)).LT.0) JA(I)=-JA(I) 1 CONTINUE RETURN END * SUBROUTINE MXVINE ALL SYSTEMS 94/12/01 * PURPOSE : * ELEMENTS OF THE INTEGER VECTOR ARE REPLACED BY THEIR ABSOLUTE VALUES. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * IU IX(N) INTEGER VECTOR WHICH IS UPDATED SO THAT IX(I):=ABS(IX(I)) * FOR ALL I. * SUBROUTINE MXVINE(N,IX) INTEGER N,IX(*) INTEGER I DO 1 I=1,N IX(I)=ABS(IX(I)) 1 CONTINUE RETURN END * SUBROUTINE MXVINI ALL SYSTEMS 99/12/01 * PURPOSE : * ELEMENTS CORRESPONDING TO FIXED VARIABLES ARE SET TO -5. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * IU IX(N) INTEGER VECTOR WHICH IS UPDATED SO THAT IX(I):=ABS(IX(I)) * FOR ALL I. * SUBROUTINE MXVINI(N,IX) INTEGER N,IX(*) INTEGER I DO 1 I=1,N IF (ABS(IX(I)).EQ.5) IX(I)=-5 1 CONTINUE RETURN END * SUBROUTINE MXVINP ALL SYSTEMS 91/12/01 * PURPOSE : * INITIATION OF A INTEGER PERMUTATION VECTOR. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * IO IP(N) INTEGER VECTOR SUCH THAT IP(I)=I FOR ALL I. * SUBROUTINE MXVINP(N,IP) INTEGER N INTEGER IP(*) INTEGER I DO 10 I = 1,N IP(I) = I 10 CONTINUE RETURN END * SUBROUTINE MXVINS ALL SYSTEMS 90/12/01 * PURPOSE : * INITIATION OF THE INTEGER VECTOR. * * PARAMETERS : * II N DIMENSION OF THE INTEGER VECTOR. * II IP INTEGER PARAMETER. * IO IX(N) INTEGER VECTOR SUCH THAT IX(I)=IP FOR ALL I. * SUBROUTINE MXVINS(N,IP,IX) INTEGER IP,N INTEGER IX(*) INTEGER I DO 10 I = 1,N IX(I) = IP 10 CONTINUE RETURN END * SUBROUTINE MXVLIN ALL SYSTEMS 92/12/01 * PURPOSE : * LINEAR COMBINATION OF TWO VECTORS. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A SCALING FACTOR. * RI X(N) INPUT VECTOR. * RI B SCALING FACTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= A*X + B*Y. * SUBROUTINE MXVLIN(N,A,X,B,Y,Z) INTEGER N DOUBLE PRECISION A, X(*), B, Y(*), Z(*) INTEGER I DO 1 I=1,N Z(I) = A*X(I) + B*Y(I) 1 CONTINUE RETURN END * FUNCTION MXVMAX ALL SYSTEMS 91/12/01 * PURPOSE : * L-INFINITY NORM OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RR MXVMAX L-INFINITY NORM OF THE VECTOR X. * FUNCTION MXVMAX(N,X) INTEGER N DOUBLE PRECISION X(*),MXVMAX INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D 0) MXVMAX=ZERO DO 1 I=1,N MXVMAX=MAX(MXVMAX,ABS(X(I))) 1 CONTINUE RETURN END * FUNCTION MXVMX1 ALL SYSTEMS 91/12/01 * PURPOSE : * L-INFINITY NORM OF A VECTOR WITH INDEX DETERMINATION. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * IO K INDEX OF ELEMENT WITH MAXIMUM ABSOLUTE VALUE. * RR MXVMX1 L-INFINITY NORM OF THE VECTOR X. * FUNCTION MXVMX1(N,X,K) INTEGER K,N DOUBLE PRECISION X(*),MXVMX1 INTEGER I K = 1 MXVMX1 = ABS(X(1)) DO 10 I = 2,N IF (ABS(X(I)).GT.MXVMX1) THEN K = I MXVMX1 = ABS(X(I)) END IF 10 CONTINUE RETURN END * SUBROUTINE MXVMUL ALL SYSTEMS 89/12/01 * PURPOSE : * VECTOR IS PREMULTIPLIED BY THE POWER OF A DIAGONAL MATRIX. * * PARAMETERS : * II N VECTOR DIMENSION. * RI D(N) DIAGONAL MATRIX STORED AS A VECTOR WITH N ELEMENTS. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:=(D**K)*X. * II K INTEGER EXPONENT. * SUBROUTINE MXVMUL(N,D,X,Y,K) INTEGER K,N DOUBLE PRECISION D(*),X(*),Y(*) INTEGER I IF (K.EQ.0) THEN CALL MXVCOP(N,X,Y) ELSE IF (K.EQ.1) THEN DO 10 I = 1,N Y(I) = X(I)*D(I) 10 CONTINUE ELSE IF (K.EQ.-1) THEN DO 20 I = 1,N Y(I) = X(I)/D(I) 20 CONTINUE ELSE DO 30 I = 1,N Y(I) = X(I)*D(I)**K 30 CONTINUE END IF RETURN END * SUBROUTINE MXVNEG ALL SYSTEMS 88/12/01 * PURPOSE : * CHANGE THE SIGNS OF VECTOR ELEMENTS. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= - X. * SUBROUTINE MXVNEG(N,X,Y) INTEGER N DOUBLE PRECISION X(*),Y(*) INTEGER I DO 10 I = 1,N Y(I) = -X(I) 10 CONTINUE RETURN END * FUNCTION MXVNOR ALL SYSTEMS 91/12/01 * PURPOSE : * EUCLIDEAN NORM OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RR MXVNOR EUCLIDEAN NORM OF X. * FUNCTION MXVNOR(N,X) INTEGER N DOUBLE PRECISION X(*),MXVNOR DOUBLE PRECISION DEN,POM INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D0) DEN = ZERO DO 10 I = 1,N DEN = MAX(DEN,ABS(X(I))) 10 CONTINUE POM = ZERO IF (DEN.GT.ZERO) THEN DO 20 I = 1,N POM = POM + (X(I)/DEN)**2 20 CONTINUE END IF MXVNOR = DEN*SQRT(POM) RETURN END * SUBROUTINE MXVSAB ALL SYSTEMS 91/12/01 * PURPOSE : * L-1 NORM OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RR MXVSAB L-1 NORM OF THE VECTOR X. * FUNCTION MXVSAB(N,X) INTEGER N DOUBLE PRECISION X(N),MXVSAB INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D 0) MXVSAB=ZERO DO 1 I=1,N MXVSAB=MXVSAB+ABS(X(I)) 1 CONTINUE RETURN END * SUBROUTINE MXVSAV ALL SYSTEMS 91/12/01 * PORTABILITY : ALL SYSTEMS * 91/12/01 LU : ORIGINAL VERSION * * PURPOSE : * DIFFERENCE OF TWO VECTORS RETURNED IN THE SUBSTRACTED ONE. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RU Y(N) UPDATE VECTOR WHERE Y:= X - Y. * SUBROUTINE MXVSAV(N,X,Y) INTEGER N DOUBLE PRECISION X(*),Y(*) DOUBLE PRECISION TEMP INTEGER I DO 10 I = 1,N TEMP = Y(I) Y(I) = X(I) - Y(I) X(I) = TEMP 10 CONTINUE RETURN END * SUBROUTINE MXVSBP ALL SYSTEMS 91/12/01 * PURPOSE : * VECTOR X(N) IS PERMUTED ACCORDING TO THE FORMULA * X(PERM(I)):=X(I). * * PARAMETERS : * II N LENGTH OF VECTORS. * II PERM(N) INPUT PERMUTATION VECTOR. * RU X(N) VECTOR THAT IS TO BE PERMUTED. * RA RN01(N) AMXILIARY VECTOR. * SUBROUTINE MXVSBP(N,PERM,X,RN01) INTEGER N,PERM(*),I DOUBLE PRECISION RN01(*),X(*) DO 100 I=1,N RN01(PERM(I))=X(I) 100 CONTINUE DO 200 I=1,N X(I)=RN01(I) 200 CONTINUE RETURN END * SUBROUTINE MXVSCL ALL SYSTEMS 88/12/01 * PURPOSE : * SCALING OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI A SCALING FACTOR. * RO Y(N) OUTPUT VECTOR WHERE Y:= A*X. * SUBROUTINE MXVSCL(N,A,X,Y) INTEGER N DOUBLE PRECISION A, X(*), Y(*) INTEGER I DO 1 I=1,N Y(I) = A*X(I) 1 CONTINUE RETURN END * SUBROUTINE MXVSET ALL SYSTEMS 88/12/01 * PURPOSE : * A SCALAR IS SET TO ALL THE ELEMENTS OF A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI A INITIAL VALUE. * RO X(N) OUTPUT VECTOR SUCH THAT X(I)=A FOR ALL I. * SUBROUTINE MXVSET(N,A,X) DOUBLE PRECISION A INTEGER N DOUBLE PRECISION X(*) INTEGER I DO 10 I = 1,N X(I) = A 10 CONTINUE RETURN END * SUBROUTINE MXVSFP ALL SYSTEMS 91/12/01 * PURPOSE : * VECTOR X(N) IS PERMUTED ACCORDING TO THE FORMULA * X(I)=X(PERM(I)). * * PARAMETERS : * II N LENGTH OF VECTORS. * II PERM(N) INPUT PERMUTATION VECTOR. * RU X(N) VECTOR THAT IS TO BE PERMUTED. * RA RN01(N) AMXILIARY VECTOR. * SUBROUTINE MXVSFP(N,PERM,X,RN01) INTEGER N,PERM(*),I DOUBLE PRECISION RN01(*),X(*) C DO 100 I=1,N RN01(I)=X(PERM(I)) 100 CONTINUE DO 200 I=1,N X(I)=RN01(I) 200 CONTINUE RETURN END * SUBROUTINE MXVSIP ALL SYSTEMS 91/12/01 * PURPOSE : * THE VECTOR OF THE INVERSE PERMUTATION IS COMPUTED. * * PARAMETERS : * II N LENGTH OF VECTORS. * II PERM(N) INPUT PERMUTATION VECTOR. * IO INVP(N) INVERSE PERMUTATION VECTOR. * SUBROUTINE MXVSIP(N,PERM,INVP) INTEGER N,PERM(*),INVP(*) INTEGER I,J DO 100 I=1,N J=PERM(I) INVP(J)=I 100 CONTINUE RETURN END * SUBROUTINE MXVSR2 ALL SYSTEMS 92/12/01 * PURPOSE : * RADIXSORT. * * PARAMETERS : * II MCOLS NUMBER OF INTEGER VALUES OF THE SORTED ARRAY. * RI DEG(MCOLS) VALUES OF THE SORTED ARRAY. * RO ORD(MCOLS) SORTED OUTPUT. * RA RADIX(MCOLS+1) AUXILIARY ARRAY. * II WN01(MCOLS) INDICES OF THE SORTED ARRAY. * II LENGTH NUMBER OF SORTED PIECES. * SUBROUTINE MXVSR2(MCOLS,DEG,ORD,RADIX,WN01,LENGTH) INTEGER MCOLS,WN01(*) DOUBLE PRECISION DEG(*),ORD(*),RADIX(*) INTEGER LENGTH,I,L,L1,L2 * * RADIX IS SHIFTED : 0-(MCOLS-1) --- 1-MCOLS * DO 50 I=1,MCOLS+1 RADIX(I)=0 50 CONTINUE DO 100 I=1,LENGTH L2=WN01(I) L=DEG(L2) RADIX(L+1)=RADIX(L+1)+1 100 CONTINUE * * RADIX COUNTS THE NUMBER OF VERTICES WITH DEG(I)>=L * L=0 DO 200 I=MCOLS,0,-1 L=RADIX(I+1)+L RADIX(I+1)=L 200 CONTINUE * * ARRAY ORD IS FILLED * DO 300 I=1,LENGTH L2=WN01(I) L=DEG(L2) L1=RADIX(L+1) ORD(L1)=L2 RADIX(L+1)=L1-1 300 CONTINUE RETURN END * SUBROUTINE MXVSR5 ALL SYSTEMS 92/12/01 * PURPOSE : * SHELLSORT. * * PARAMETERS : * II K NUMBER OF INTEGER VALUES OF THE SORTED ARRAY. * II L CORRECTION FOR THE ABSOLUTE INDEX IN THE SORTED ARRAY * IU ARRAY(K) INTEGER SORTED ARRAY. * RO ARRAYC(K) REAL OUTPUT ARRAY. * RU ARRAYD(K) REAL ARRAY WHICH IS PERMUTED IN THE SAME WAY * AS THE INTEGER SORTED ARRAY. * SUBROUTINE MXVSR5(K,L,ARRAY,ARRAYC,ARRAYD) INTEGER K,L INTEGER ARRAY(*) DOUBLE PRECISION ARRAYC(*),ARRAYD(*) INTEGER IS,LA,LT,LS,LLS,I,J,JS,KHALF DOUBLE PRECISION LD * * NOTHING TO BE SORTED * IF (K.LE.1) GO TO 400 * * SHELLSORT * * L - CORRECTION FOR THE ABSOLUTE INDEX IN THE SORTED ARRAY * LS=131071 KHALF=K/2 DO 300 LT=1,17 IF (LS.GT.KHALF) THEN LS=LS/2 GO TO 300 END IF LLS=K-LS DO 200 I=1,LLS IS=I+LS LA=ARRAY(IS) LD=ARRAYD(IS) J=I JS=IS 100 IF (LA.GE.ARRAY(J)) THEN ARRAY(JS)=LA ARRAYD(JS)=LD ARRAYC(INT(LD))=JS+L GO TO 200 ELSE ARRAY(JS)=ARRAY(J) ARRAYD(JS)=ARRAYD(J) ARRAYC(INT(ARRAYD(J)))=JS+L JS=J J=J-LS END IF IF (J.GE.1) GO TO 100 ARRAY(JS)=LA ARRAYD(JS)=LD ARRAYC(INT(LD))=JS+L 200 CONTINUE LS=LS/2 300 CONTINUE 400 CONTINUE RETURN END * SUBROUTINE MXVSR7 ALL SYSTEMS 94/12/01 * PURPOSE : * SHELLSORT * * PARAMETERS : * II K LENGTH OF SORTED VECTOR. * IU ARRAY(K) SORTED ARRAY. * IU ARRAYB(K) SECOND SORTED ARRAY. * SUBROUTINE MXVSR7(K,ARRAY,ARRAYB) INTEGER K INTEGER ARRAY(*),ARRAYB(*) INTEGER IS,LA,LB,LT,LS,LLS,I,J,JS,KHALF * * NOTHING TO BE SORTED * IF (K.LE.1) GO TO 400 * * SHELLSORT * LS=131071 KHALF=K/2 DO 300 LT=1,17 IF (LS.GT.KHALF) THEN LS=LS/2 GO TO 300 END IF LLS=K-LS DO 200 I=1,LLS IS=I+LS LA=ARRAY(IS) LB=ARRAYB(IS) J=I JS=IS 100 IF (LA.GE.ARRAY(J)) THEN ARRAY(JS)=LA ARRAYB(JS)=LB GO TO 200 ELSE ARRAY(JS)=ARRAY(J) ARRAYB(JS)=ARRAYB(J) JS=J J=J-LS END IF IF (J.GE.1) GO TO 100 ARRAY(JS)=LA ARRAYB(JS)=LB 200 CONTINUE LS=LS/2 300 CONTINUE 400 CONTINUE RETURN END * SUBROUTINE MXVSRT ALL SYSTEMS 91/12/01 * PURPOSE : * SHELLSORT * * PARAMETERS : * II K LENGTH OF SORTED VECTOR. * IU ARRAY(K) SORTED ARRAY. * SUBROUTINE MXVSRT(K,ARRAY) INTEGER K INTEGER ARRAY(*) INTEGER IS,LA,LT,LS,LLS,I,J,JS,KHALF * * NOTHING TO BE SORTED * IF (K.LE.1) GO TO 400 * * SHELLSORT * LS=131071 KHALF=K/2 DO 300 LT=1,17 IF (LS.GT.KHALF) THEN LS=LS/2 GO TO 300 END IF LLS=K-LS DO 200 I=1,LLS IS=I+LS LA=ARRAY(IS) J=I JS=IS 100 IF (LA.GE.ARRAY(J)) THEN ARRAY(JS)=LA GO TO 200 ELSE ARRAY(JS)=ARRAY(J) JS=J J=J-LS END IF IF (J.GE.1) GO TO 100 ARRAY(JS)=LA 200 CONTINUE LS=LS/2 300 CONTINUE 400 CONTINUE RETURN END * SUBROUTINE MXVSUM ALL SYSTEMS 88/12/01 * PURPOSE : * SUM OF TWO VECTORS. * * PARAMETERS : * II N VECTOR DIMENSION. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RO Z(N) OUTPUT VECTOR WHERE Z:= X + Y. * SUBROUTINE MXVSUM(N,X,Y,Z) INTEGER N DOUBLE PRECISION X(*),Y(*),Z(*) INTEGER I DO 10 I = 1,N Z(I) = X(I) + Y(I) 10 CONTINUE RETURN END * FUNCTION MXVVDP ALL SYSTEMS 92/12/01 * PURPOSE : * COMPUTATION OF THE NUMBER MXVVDP=TRANS(X)*D**(-1)*Y WHERE D IS A * DIAGONAL MATRIX STORED AS A VECTOR. * * PARAMETERS : * II N VECTOR DIMENSION. * RI D(N) DIAGONAL MATRIX STORED AS A VECTOR. * RI X(N) INPUT VECTOR. * RI Y(N) INPUT VECTOR. * RR MXVVDP COMPUTED NUMBER MXVVDP=TRANS(X)*D**(-1)*Y. * FUNCTION MXVVDP(N,D,X,Y) INTEGER N DOUBLE PRECISION D(*), X(*), Y(*), MXVVDP DOUBLE PRECISION TEMP INTEGER I DOUBLE PRECISION ZERO PARAMETER (ZERO = 0.0D 0) TEMP = ZERO DO 1 I = 1, N TEMP = TEMP + X(I)*Y(I)/D(I) 1 CONTINUE MXVVDP = TEMP RETURN END * SUBROUTINE MXWDIR ALL SYSTEMS 92/12/01 * PURPOSE : * VECTOR AUGMENTED BY THE SCALED VECTOR IN THE PACKED CASE. * * PARAMETERS : * II L PACKED VECTOR DIMENSION. * II N VECTOR DIMENSION. * II JBL(L) INDICES OF PACKED VECTOR. * RI A SCALING FACTOR. * RI X(L) PACKED INPUT VECTOR. * RI Y(N) UNPACKED INPUT VECTOR. * RO Z(N) UNPACKED OR PACKED OUTPUT VECTOR WHERE Z:= Y + A*X. * II JOB FORM OF THE VECTOR Z. JOB=1-UNPACKED FORM. JOB=2-PACKED * FORM. * SUBROUTINE MXWDIR(L,JBL,A,X,Y,Z,JOB) INTEGER L,JBL(*),JOB DOUBLE PRECISION A, X(*), Y(*), Z(*) INTEGER I,IP IF (JOB.EQ.1) THEN DO 1 I=1,L IP=JBL(I) IF (IP.GT.0) Z(IP)=Y(IP)+A*X(I) 1 CONTINUE ELSE DO 2 I=1,L IP=JBL(I) IF (IP.GT.0) Z(I)=Y(IP)+A*X(I) 2 CONTINUE END IF RETURN END * FUNCTION MXWDOT ALL SYSTEMS 92/12/01 * PURPOSE : * DOT PRODUCT OF TWO VECTORS IN THE PACKED CASE. * * PARAMETERS : * II L PACKED OR UNPACKED VECTOR DIMENSION. * II N UNPACKED VECTOR DIMENSION. * II JBL(L) INDICES OF PACKED VECTOR. * RI X(L) UNPACKED OR PACKED INPUT VECTOR. * RI Y(N) UNPACKED INPUT VECTOR. * II JOB FORM OF THE VECTOR X. JOB=1-UNPACKED FORM. JOB=2-PACKED * FORM. * RR MXWDOT VALUE OF DOT PRODUCT MXWDOT=TRANS(X)*Y. * FUNCTION MXWDOT(L,JBL,X,Y,JOB) INTEGER L,JBL(*),JOB DOUBLE PRECISION X(*), Y(*), MXWDOT DOUBLE PRECISION TEMP INTEGER I,IP TEMP=0.0D0 IF (JOB.EQ.1) THEN DO 1 I=1,L IP=JBL(I) IF (IP.GT.0) TEMP=TEMP+X(IP)*Y(IP) 1 CONTINUE ELSE DO 2 I=1,L IP=JBL(I) IF (IP.GT.0) TEMP=TEMP+X(I)*Y(IP) 2 CONTINUE END IF MXWDOT=TEMP RETURN END stevengj-nlopt-88c424d/src/algs/luksan/plip.c000066400000000000000000000363421521061417600211700ustar00rootroot00000000000000#include #include #include #include #include "luksan.h" #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define MIN2(a,b) ((a) < (b) ? (a) : (b)) /* *********************************************************************** */ /* SUBROUTINE PLIP ALL SYSTEMS 01/09/22 */ /* PURPOSE : */ /* GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT */ /* USE THE SHIFTED LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE */ /* PRODUCT FORM UPDATES. */ /* PARAMETERS : */ /* II NF NUMBER OF VARIABLES. */ /* II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. */ /* NB>0-SIMPLE BOUNDS ACCEPTED. */ /* RI X(NF) VECTOR OF VARIABLES. */ /* II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE */ /* X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). */ /* IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND */ /* XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. */ /* RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. */ /* RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. */ /* RA GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. */ /* RO S(NF) DIRECTION VECTOR. */ /* RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. */ /* RI GO(NF) GRADIENTS DIFFERENCE. */ /* RA SO(NF) AUXILIARY VECTOR. */ /* RA XM(NF*MF) AUXILIARY VECTOR. */ /* RA XR(MF) AUXILIARY VECTOR. */ /* RA GR(MF) AUXILIARY VECTOR. */ /* RI XMAX MAXIMUM STEPSIZE. */ /* RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. */ /* RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. */ /* RI TOLB TOLERANCE FOR THE FUNCTION VALUE. */ /* RI TOLG TOLERANCE FOR THE GRADIENT NORM. */ /* RI MINF_EST ESTIMATION OF THE MINIMUM FUNCTION VALUE. */ /* RO GMAX MAXIMUM PARTIAL DERIVATIVE. */ /* RO F VALUE OF THE OBJECTIVE FUNCTION. */ /* II MIT MAXIMUM NUMBER OF ITERATIONS. */ /* II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. */ /* II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. */ /* IEST=1-MINIMUM IS ESTIMATED BY THE VALUE MINF_EST. */ /* II MET METHOD USED. MET=1-RANK-ONE METHOD. MET=2-RANK-TWO */ /* METHOD. */ /* II MF NUMBER OF LIMITED MEMORY STEPS. */ /* IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. */ /* ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN */ /* MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN */ /* MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. */ /* ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. */ /* ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, */ /* BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. */ /* ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. */ /* ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. */ /* VARIABLES IN COMMON /STAT/ (STATISTICS) : */ /* IO NRES NUMBER OF RESTARTS. */ /* IO NDEC NUMBER OF MATRIX DECOMPOSITION. */ /* IO NIN NUMBER OF INNER ITERATIONS. */ /* IO NIT NUMBER OF ITERATIONS. */ /* IO NFV NUMBER OF FUNCTION EVALUATIONS. */ /* IO NFG NUMBER OF GRADIENT EVALUATIONS. */ /* IO NFH NUMBER OF HESSIAN EVALUATIONS. */ /* SUBPROGRAMS USED : */ /* S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. */ /* S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. */ /* S PULSP3 SHIFTED VARIABLE METRIC UPDATE. */ /* S PULVP3 SHIFTED LIMITED-MEMORY VARIABLE METRIC UPDATE. */ /* S PYADC0 ADDITION OF A BOX CONSTRAINT. */ /* S PYFUT1 TEST ON TERMINATION. */ /* S PYRMC0 DELETION OF A BOX CONSTRAINT. */ /* S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC */ /* UPDATE. */ /* S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. */ /* S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. */ /* S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR */ /* MATRIX A BY A VECTOR X. */ /* S MXDCMD MULTIPLICATION OF A COLUMNWISE STORED DENSE RECTANGULAR */ /* MATRIX A BY A VECTOR X AND ADDITION OF THE SCALED VECTOR */ /* ALF*Y. */ /* S MXUCOP COPYING OF A VECTOR. */ /* S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. */ /* RF MXUDOT DOT PRODUCT OF TWO VECTORS. */ /* S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. */ /* S MXUZER VECTOR ELEMENTS CORRESPONDING TO ACTIVE BOUNDS ARE SET */ /* TO ZERO. */ /* S MXVCOP COPYING OF A VECTOR. */ /* EXTERNAL SUBROUTINES : */ /* SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS */ /* THE VALUE OF THE OBJECTIVE FUNCTION. */ /* SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) */ /* IS THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* -- OBJ and DOBJ are replaced by a single function, objgrad, in NLopt */ /* METHOD : */ /* HYBRID METHOD WITH SPARSE MARWIL UPDATES FOR SPARSE LEAST SQUARES */ /* PROBLEMS. */ static void plip_(int *nf, int *nb, double *x, int * ix, double *xl, double *xu, double *gf, double *s, double *xo, double *go, double *so, double *xm, double *xr, double *gr, double *xmax, double *tolx, double *tolf, double *tolb, double *tolg, nlopt_stopping *stop, double * minf_est, double *gmax, double *f, int *mit, int *mfv, int *iest, int *met, int *mf, int *iterm, stat_common *stat_1, nlopt_func objgrad, void *objgrad_data) { /* System generated locals */ int i__1; double d__1, d__2; /* Builtin functions */ /* Local variables */ int i__, n; double p, r__; int kd, ld; double fo, fp; int nn; double po, pp, ro, rp; int kbf, mec, mfg; double par; int mes, kit; double alf1, alf2, eta9, par1, par2; int met3; double eps8, eps9; int mred, nred, iold; double maxf, dmax__; int xstop = 0; int inew; double told; int ites; double rmin, rmax, umax, tolp, tols; int isys; int ires1, ires2; int iterd, iterh, mtesf, ntesf; double gnorm; int iters, irest, inits, kters, maxst; double snorm; int mtesx, ntesx; ps1l01_state state; (void) tolb; /* INITIATION */ /* Parameter adjustments */ --gr; --xr; --xm; --so; --go; --xo; --s; --gf; --xu; --xl; --ix; --x; /* Function Body */ kbf = 0; if (*nb > 0) { kbf = 2; } stat_1->nres = 0; stat_1->ndec = 0; stat_1->nin = 0; stat_1->nit = 0; stat_1->nfg = 0; stat_1->nfh = 0; isys = 0; ites = 1; mtesx = 2; mtesf = 2; inits = 2; *iterm = 0; iterd = 0; iters = 2; iterh = 0; kters = 3; irest = 0; ires1 = 999; ires2 = 0; mred = 10; met3 = 4; mec = 4; mes = 4; eta9 = 1e120; eps8 = 1.; eps9 = 1e-8; alf1 = 1e-10; alf2 = 1e10; rmax = eta9; dmax__ = eta9; maxf = 1e20; if (*iest <= 0) { *minf_est = -HUGE_VAL; /* changed from -1e60 by SGJ */ } if (*iest > 0) { *iest = 1; } if (*xmax <= 0.) { *xmax = 1e16; } if (*tolx <= 0.) { *tolx = 1e-16; } if (*tolf <= 0.) { *tolf = 1e-14; } if (*tolg <= 0.) { *tolg = 1e-8; /* SGJ: was 1e-6, but this sometimes stops too soon */ } #if 0 /* removed by SGJ: this check prevented us from using minf_max <= 0, which doesn't make sense. Instead, if you don't want to have a lower limit, you should set minf_max = -HUGE_VAL */ if (*tolb <= 0.) { *tolb = *minf_est + 1e-16; } #endif told = 1e-4; tols = 1e-4; tolp = .9; if (*met <= 0) { *met = 2; } /* changed by SGJ: default is no limit (INT_MAX) on # iterations/fevals */ if (*mit <= 0) { *mit = INT_MAX; } if (*mfv <= 0) { *mfv = INT_MAX; } mfg = *mfv; kd = 1; ld = -1; kit = -(ires1 * *nf + ires2); fo = *minf_est; /* INITIAL OPERATIONS WITH SIMPLE BOUNDS */ if (kbf > 0) { i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { if ((ix[i__] == 3 || ix[i__] == 4) && xu[i__] <= xl[i__]) { xu[i__] = xl[i__]; ix[i__] = 5; } else if (ix[i__] == 5 || ix[i__] == 6) { xl[i__] = x[i__]; xu[i__] = x[i__]; ix[i__] = 5; } /* L2: */ } luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); } if (*iterm != 0) { goto L11190; } *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } L11120: luksan_pytrcg__(nf, nf, &ix[1], &gf[1], &umax, gmax, &kbf, &iold); luksan_pyfut1__(nf, f, &fo, &umax, gmax, xstop, stop, tolg, &kd, &stat_1->nit, &kit, mit, &stat_1->nfg, &mfg, &ntesx, &mtesx, &ntesf, &mtesf, &ites, &ires1, &ires2, &irest, & iters, iterm); if (*iterm != 0) { goto L11190; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } if (kbf > 0 && rmax > 0.) { luksan_pyrmc0__(nf, &n, &ix[1], &gf[1], &eps8, &umax, gmax, &rmax, & iold, &irest); } L11130: if (irest > 0) { nn = 0; par = 1.; ld = MIN2(ld,1); if (kit < stat_1->nit) { ++stat_1->nres; kit = stat_1->nit; } else { *iterm = -10; if (iters < 0) { *iterm = iters - 5; } } } if (*iterm != 0) { goto L11190; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } /* DIRECTION DETERMINATION */ gnorm = sqrt(luksan_mxudot__(nf, &gf[1], &gf[1], &ix[1], &kbf)); /* NEWTON LIKE STEP */ luksan_mxuneg__(nf, &gf[1], &s[1], &ix[1], &kbf); luksan_mxdrmm__(nf, &nn, &xm[1], &s[1], &gr[1]); luksan_mxdcmd__(nf, &nn, &xm[1], &gr[1], &par, &s[1], &s[1]); luksan_mxuzer__(nf, &s[1], &ix[1], &kbf); iterd = 1; snorm = sqrt(luksan_mxudot__(nf, &s[1], &s[1], &ix[1], &kbf)); /* TEST ON DESCENT DIRECTION AND PREPARATION OF LINE SEARCH */ if (kd > 0) { p = luksan_mxudot__(nf, &gf[1], &s[1], &ix[1], &kbf); } if (iterd < 0) { *iterm = iterd; } else { /* TEST ON DESCENT DIRECTION */ if (snorm <= 0.) { irest = MAX2(irest,1); } else if (p + told * gnorm * snorm <= 0.) { irest = 0; } else { /* UNIFORM DESCENT CRITERION */ irest = MAX2(irest,1); } if (irest == 0) { /* PREPARATION OF LINE SEARCH */ nred = 0; rmin = alf1 * gnorm / snorm; /* Computing MIN */ d__1 = alf2 * gnorm / snorm, d__2 = *xmax / snorm; rmax = MIN2(d__1,d__2); } } if (*iterm != 0) { goto L11190; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } if (irest != 0) { goto L11130; } luksan_pytrcs__(nf, &x[1], &ix[1], &xo[1], &xl[1], &xu[1], &gf[1], &go[1], &s[1], &ro, &fp, &fo, f, &po, &p, &rmax, &eta9, &kbf); if (rmax == 0.) { goto L11175; } L11170: luksan_ps1l01__(&r__, &rp, f, &fo, &fp, &p, &po, &pp, minf_est, &maxf, &rmin, &rmax, &tols, &tolp, &par1, &par2, &kd, &ld, &stat_1->nit, &kit, & nred, &mred, &maxst, iest, &inits, &iters, &kters, &mes, &isys, &state); if (isys == 0) { goto L11174; } luksan_mxudir__(nf, &r__, &s[1], &xo[1], &x[1], &ix[1], &kbf); luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; p = luksan_mxudot__(nf, &gf[1], &s[1], &ix[1], &kbf); goto L11170; L11174: if (iters <= 0) { r__ = 0.; *f = fo; p = po; luksan_mxvcop__(nf, &xo[1], &x[1]); luksan_mxvcop__(nf, &go[1], &gf[1]); irest = MAX2(irest,1); ld = kd; goto L11130; } luksan_mxuneg__(nf, &go[1], &s[1], &ix[1], &kbf); luksan_pytrcd__(nf, &x[1], &ix[1], &xo[1], &gf[1], &go[1], &r__, f, &fo, & p, &po, &dmax__, &kbf, &kd, &ld, &iters); xstop = nlopt_stop_dx(stop, &x[1], &xo[1]); luksan_mxucop__(nf, &gf[1], &so[1], &ix[1], &kbf); if (nn < *mf) { luksan_pulsp3__(nf, &nn, mf, &xm[1], &gr[1], &xo[1], &go[1], &r__, & po, &par, &iterh, &met3); } else { luksan_pulvp3__(nf, &nn, &xm[1], &xr[1], &gr[1], &s[1], &so[1], &xo[1] , &go[1], &r__, &po, &par, &iterh, &mec, &met3, met); } L11175: if (iterh != 0) { irest = MAX2(irest,1); } if (kbf > 0) { luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); } goto L11120; L11190: return; } /* plip_ */ /* NLopt wrapper around plip_, handling dynamic allocation etc. */ nlopt_result luksan_plip(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, /* subspace dimension (0 for default) */ int method, /* 1 or 2, see below */ double tolg) /* gradient tolerance */ { int i, *ix, nb = 1; double *work, *xl, *xu, *gf, *s, *xo, *go, *so, *xm, *xr, *gr; double gmax, minf_est; double xmax = 0; /* no maximum */ int iest = 0; /* we have no estimate of min function value */ int mit = 0; /* default no limit on #iterations */ int mfv = stop->maxeval; stat_common stat; int iterm; ix = (int*) malloc(sizeof(int) * n); if (!ix) return NLOPT_OUT_OF_MEMORY; if (mf <= 0) { mf = MAX2(MEMAVAIL/n, 10); if (stop->maxeval > 0 && stop->maxeval <= mf) mf = MAX2(stop->maxeval, 1); } retry_alloc: work = (double*) malloc(sizeof(double) * (n * 7 + MAX2(n,n*mf) + MAX2(n,mf)*2)); if (!work) { if (mf > 0) { mf = 0; /* allocate minimal memory */ goto retry_alloc; } free(ix); return NLOPT_OUT_OF_MEMORY; } xl = work; xu = xl + n; gf = xu + n; s = gf + n; xo = s + n; go = xo + n; so = go + n; xm = so + n; xr = xm + MAX2(n*mf,n); gr = xr + MAX2(n,mf); for (i = 0; i < n; ++i) { int lbu = lb[i] <= -0.99 * HUGE_VAL; /* lb unbounded */ int ubu = ub[i] >= 0.99 * HUGE_VAL; /* ub unbounded */ ix[i] = lbu ? (ubu ? 0 : 2) : (ubu ? 1 : (lb[i] == ub[i] ? 5 : 3)); xl[i] = lb[i]; xu[i] = ub[i]; } /* ? xo does not seem to be initialized in the original Fortran code, but it is used upon input to plip if mf > 0 ... perhaps ALLOCATE initializes arrays to zero by default? */ memset(xo, 0, sizeof(double) * MAX2(n,n*mf)); plip_(&n, &nb, x, ix, xl, xu, gf, s, xo, go, so, xm, xr, gr, &xmax, /* fixme: pass tol_rel and tol_abs and use NLopt check */ &stop->xtol_rel, &stop->ftol_rel, &stop->minf_max, &tolg, stop, &minf_est, &gmax, minf, &mit, &mfv, &iest, &method, /* 1 == rank-one method VAR1, 2 == rank-two method VAR2 */ &mf, &iterm, &stat, f, f_data); free(work); free(ix); switch (iterm) { case 1: return NLOPT_XTOL_REACHED; case 2: return NLOPT_FTOL_REACHED; case 3: return NLOPT_MINF_MAX_REACHED; case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; case 100: return NLOPT_MAXTIME_REACHED; case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } stevengj-nlopt-88c424d/src/algs/luksan/plip.for000066400000000000000000000465721521061417600215420ustar00rootroot00000000000000************************************************************************ * SUBROUTINE PLIPU ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE UNCONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) METHOD USED. IPAR(5)=1-RANK-ONE METHOD. * IPAR(5)=2-RANK-TWO METHOD. * IPAR(6) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * IPAR(7) MAXIMUM NUMBER OF VARIABLE METRIC UPDATES. * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PLIP LIMITED MEMORY SHIFTED VARIABLE METRIC METHOD IN THE * PRODUCT FORM. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PLIPU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LS,LXO,LGO,LSO,LXM,LXR,LGR INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(5*NF+NF*MF+2*MF)) NB=0 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LS=LGF+NF LXO=LS+NF LGO=LXO+NF LSO=LGO+NF LXM=LSO+NF LXR=LXM+NF*MF LGR=LXR+MF CALL PLIP(NF,NB,X,IPAR,RA,RA,RA(LGF),RA(LS),RA(LXO),RA(LGO), & RA(LSO),RA(LXM),RA(LXR),RA(LGR),RPAR(1),RPAR(2),RPAR(3),RPAR(4), & RPAR(5),RPAR(6),GMAX,F,IPAR(1),IPAR(2),IPAR(4),IPAR(5),MF,IPRNT, & ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PLIPS ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) METHOD USED. IPAR(5)=1-RANK-ONE METHOD. * IPAR(5)=2-RANK-TWO METHOD. * IPAR(6) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * IPAR(7) MAXIMUM NUMBER OF VARIABLE METRIC UPDATES. * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIP. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PLIP LIMITED MEMORY SHIFTED VARIABLE METRIC METHOD IN THE * PRODUCT FORM. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PLIPS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IX(*),IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LS,LXO,LGO,LSO,LXM,LXR,LGR INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(5*NF+NF*MF+2*MF)) NB=1 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LS=LGF+NF LXO=LS+NF LGO=LXO+NF LSO=LGO+NF LXM=LSO+NF LXR=LXM+NF*MF LGR=LXR+MF CALL PLIP(NF,NB,X,IX,XL,XU,RA(LGF),RA(LS),RA(LXO),RA(LGO), & RA(LSO),RA(LXM),RA(LXR),RA(LGR),RPAR(1),RPAR(2),RPAR(3),RPAR(4), & RPAR(5),RPAR(6),GMAX,F,IPAR(1),IPAR(2),IPAR(4),IPAR(5),MF,IPRNT, & ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PLIP ALL SYSTEMS 01/09/22 * PURPOSE : * GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT * USE THE SHIFTED LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE * PRODUCT FORM UPDATES. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. * NB>0-SIMPLE BOUNDS ACCEPTED. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RA GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * RA SO(NF) AUXILIARY VECTOR. * RA XM(NF*MF) AUXILIARY VECTOR. * RA XR(MF) AUXILIARY VECTOR. * RA GR(MF) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. * RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. * RI TOLB TOLERANCE FOR THE FUNCTION VALUE. * RI TOLG TOLERANCE FOR THE GRADIENT NORM. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * RO F VALUE OF THE OBJECTIVE FUNCTION. * II MIT MAXIMUM NUMBER OF ITERATIONS. * II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * II MET METHOD USED. MET=1-RANK-ONE METHOD. MET=2-RANK-TWO * METHOD. * II MF NUMBER OF LIMITED MEMORY STEPS. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITION. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. * S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. * S PULSP3 SHIFTED VARIABLE METRIC UPDATE. * S PULVP3 SHIFTED LIMITED-MEMORY VARIABLE METRIC UPDATE. * S PYADC0 ADDITION OF A BOX CONSTRAINT. * S PYFUT1 TEST ON TERMINATION. * S PYRMC0 DELETION OF A BOX CONSTRAINT. * S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC * UPDATE. * S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. * S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. * S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR * MATRIX A BY A VECTOR X. * S MXDCMD MULTIPLICATION OF A COLUMNWISE STORED DENSE RECTANGULAR * MATRIX A BY A VECTOR X AND ADDITION OF THE SCALED VECTOR * ALF*Y. * S MXUCOP COPYING OF A VECTOR. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXUZER VECTOR ELEMENTS CORRESPONDING TO ACTIVE BOUNDS ARE SET * TO ZERO. * S MXVCOP COPYING OF A VECTOR. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * * METHOD : * HYBRID METHOD WITH SPARSE MARWIL UPDATES FOR SPARSE LEAST SQUARES * PROBLEMS. * SUBROUTINE PLIP(NF,NB,X,IX,XL,XU,GF,S,XO,GO,SO,XM,XR,GR,XMAX, & TOLX,TOLF,TOLB,TOLG,FMIN,GMAX,F,MIT,MFV,IEST,MET,MF,IPRNT,ITERM) INTEGER NF,NB,IX(*),MIT,MFV,IEST,MET,MF,IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),GF(*),S(*),XO(*),GO(*),SO(*), & XM(*),XR(*),GR(*),XMAX,TOLX,TOLF,TOLG,TOLB,FMIN,GMAX,F INTEGER ITERD,ITERS,ITERH,KD,LD,NTESX,NTESF,MTESX,MTESF,MRED,KIT, & IREST,KBF,MEC,MES,MES1,MES2,MES3,MAXST,ISYS,ITES,INITS,KTERS, & IRES1,IRES2,NRED,INEW,IOLD,I,NN,N,MFG,META,MET3 DOUBLE PRECISION R,RO,RP,FO,FP,P,PO,PP,GNORM,SNORM,RMIN,RMAX, & UMAX,FMAX,DMAX,ETA0,ETA9,EPS8,EPS9,ALF1,ALF2,PAR1,PAR2,PAR,TOLD, & TOLS,TOLP DOUBLE PRECISION MXUDOT INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH IF (ABS(IPRNT).GT.1) WRITE(6,'(1X,''ENTRY TO PLIP :'')') * * INITIATION * KBF=0 IF (NB.GT.0) KBF=2 NRES=0 NDEC=0 NIN=0 NIT=0 NFV=0 NFG=0 NFH=0 ISYS=0 ITES=1 MTESX=2 MTESF=2 INITS=2 ITERM=0 ITERD=0 ITERS=2 ITERH=0 KTERS=3 IREST=0 IRES1=999 IRES2=0 MRED=10 META=1 MET3=4 MEC=4 MES=4 MES1=2 MES2=2 MES3=2 ETA0=1.0D-15 ETA9=1.0D 120 EPS8=1.00D 0 EPS9=1.00D-8 ALF1=1.0D-10 ALF2=1.0D 10 RMAX=ETA9 DMAX=ETA9 FMAX=1.0D 20 IF (IEST.LE.0) FMIN=-1.0D 60 IF (IEST.GT.0) IEST=1 IF (XMAX.LE.0.0D 0) XMAX=1.0D 16 IF (TOLX.LE.0.0D 0) TOLX=1.0D-16 IF (TOLF.LE.0.0D 0) TOLF=1.0D-14 IF (TOLG.LE.0.0D 0) TOLG=1.0D-6 IF (TOLB.LE.0.0D 0) TOLB=FMIN+1.0D-16 TOLD=1.0D-4 TOLS=1.0D-4 TOLP=0.9D 0 IF (MET.LE.0) MET=2 IF (MIT.LE.0) MIT=9000 IF (MFV.LE.0) MFV=9000 MFG=MFV KD= 1 LD=-1 KIT=-(IRES1*NF+IRES2) FO=FMIN * * INITIAL OPERATIONS WITH SIMPLE BOUNDS * IF (KBF.GT.0) THEN DO 2 I = 1,NF IF ((IX(I).EQ.3.OR.IX(I).EQ.4) .AND. XU(I).LE.XL(I)) THEN XU(I) = XL(I) IX(I) = 5 ELSE IF (IX(I).EQ.5 .OR. IX(I).EQ.6) THEN XL(I) = X(I) XU(I) = X(I) IX(I) = 5 END IF 2 CONTINUE CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL PYADC0(NF,N,X,IX,XL,XU,INEW) END IF IF (ITERM.NE.0) GO TO 11190 CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 11120 CONTINUE CALL PYTRCG(NF,NF,IX,GF,UMAX,GMAX,KBF,IOLD) IF (ABS(IPRNT).GT.1) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3)') NIT,NFV,NFG,F,GMAX CALL PYFUT1(NF,F,FO,UMAX,GMAX,DMAX,TOLX,TOLF,TOLB,TOLG,KD, & NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF,ITES, & IRES1,IRES2,IREST,ITERS,ITERM) IF (ITERM.NE.0) GO TO 11190 IF (KBF.GT.0.AND.RMAX.GT.0.0D 0) THEN CALL PYRMC0(NF,N,IX,GF,EPS8,UMAX,GMAX,RMAX,IOLD,IREST) END IF 11130 CONTINUE IF (IREST.GT.0) THEN NN=0 PAR=1.0D 0 LD=MIN(LD,1) IF (KIT.LT.NIT) THEN NRES=NRES+1 KIT = NIT ELSE ITERM=-10 IF (ITERS.LT.0) ITERM=ITERS-5 END IF END IF IF (ITERM.NE.0) GO TO 11190 * * DIRECTION DETERMINATION * GNORM=SQRT(MXUDOT(NF,GF,GF,IX,KBF)) * * NEWTON LIKE STEP * CALL MXUNEG(NF,GF,S,IX,KBF) CALL MXDRMM(NF,NN,XM,S,GR) CALL MXDCMD(NF,NN,XM,GR,PAR,S,S) CALL MXUZER(NF,S,IX,KBF) ITERD=1 SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) * * TEST ON DESCENT DIRECTION AND PREPARATION OF LINE SEARCH * IF (KD.GT.0) P=MXUDOT(NF,GF,S,IX,KBF) IF (ITERD.LT.0) THEN ITERM=ITERD ELSE * * TEST ON DESCENT DIRECTION * IF (SNORM.LE.0.0D 0) THEN IREST=MAX(IREST,1) ELSE IF (P+TOLD*GNORM*SNORM.LE.0.0D 0) THEN IREST=0 ELSE * * UNIFORM DESCENT CRITERION * IREST=MAX(IREST,1) END IF IF (IREST.EQ.0) THEN * * PREPARATION OF LINE SEARCH * NRED = 0 RMIN=ALF1*GNORM/SNORM RMAX=MIN(ALF2*GNORM/SNORM,XMAX/SNORM) END IF END IF IF (ITERM.NE.0) GO TO 11190 IF (IREST.NE.0) GO TO 11130 CALL PYTRCS(NF,X,IX,XO,XL,XU,GF,GO,S,RO,FP,FO,F,PO,P,RMAX,ETA9, & KBF) IF (RMAX.EQ.0.0D 0) GO TO 11175 11170 CONTINUE CALL PS1L01(R,RP,F,FO,FP,P,PO,PP,FMIN,FMAX,RMIN,RMAX, & TOLS,TOLP,PAR1,PAR2,KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST, & INITS,ITERS,KTERS,MES,ISYS) IF (ISYS.EQ.0) GO TO 11174 CALL MXUDIR(NF,R,S,XO,X,IX,KBF) CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 P=MXUDOT(NF,GF,S,IX,KBF) GO TO 11170 11174 CONTINUE IF (ITERS.LE.0) THEN R=0.0D 0 F=FO P=PO CALL MXVCOP(NF,XO,X) CALL MXVCOP(NF,GO,GF) IREST=MAX(IREST,1) LD=KD GO TO 11130 END IF CALL MXUNEG(NF,GO,S,IX,KBF) CALL PYTRCD(NF,X,IX,XO,GF,GO,R,F,FO,P,PO,DMAX,KBF,KD,LD,ITERS) CALL MXUCOP(NF,GF,SO,IX,KBF) IF (NN.LT.MF) THEN CALL PULSP3(NF,NN,MF,XM,GR,XO,GO,R,PO,PAR,ITERH,MET3) ELSE CALL PULVP3(NF,NN,XM,XR,GR,S,SO,XO,GO,R,PO,PAR,ITERH,MEC,MET3, & MET) END IF 11175 CONTINUE IF (ITERH.NE.0) IREST=MAX(IREST,1) IF (KBF.GT.0) CALL PYADC0(NF,N,X,IX,XL,XU,INEW) GO TO 11120 11190 CONTINUE IF (IPRNT.GT.1.OR.IPRNT.LT.0) & WRITE(6,'(1X,''EXIT FROM PLIP :'')') IF (IPRNT.NE.0) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3,2X,''ITERM='',I3)') NIT,NFV,NFG, & F,GMAX,ITERM IF (IPRNT.LT.0) & WRITE (6,'(1X,''X='',5(G14.7,1X):/(3X,5(G14.7,1X)))') & (X(I),I=1,NF) RETURN END stevengj-nlopt-88c424d/src/algs/luksan/plip.txt000066400000000000000000000404221521061417600215570ustar00rootroot00000000000000*********************************************************************** * * * PLIP - A LIMITED MEMORY VARIABLE METRIC ALGORITHM FOR * * LARGE-SCALE OPTIMIZATION. * * * *********************************************************************** 1. Introduction: ---------------- The double-precision FORTRAN 77 basic subroutine PLIP is designed to find a close approximation to a local minimum of a nonlinear function F(X) with simple bounds on variables. Here X is a vector of NF variables and F(X) is a smooth function. We suppose that NF is large but the sparsity pattern of the Hessian matrix is not known (or the Hessian matrix is dense). Simple bounds are assumed in the form X(I) unbounded if IX(I) = 0, XL(I) <= X(I) if IX(I) = 1, X(I) <= XU(I) if IX(I) = 2, XL(I) <= X(I) <= XU(I) if IX(I) = 3, XL(I) = X(I) = XU(I) if IX(I) = 5, where 1 <= I <= NF. To simplify user's work, two additional easy to use subroutines are added. They call the basic general subroutine PLIP: PLIPU - unconstrained large-scale optimization, PLIPS - large-scale optimization with simple bounds. All subroutines contain a description of formal parameters and extensive comments. Furthermore, two test programs TLIPU and TLIPS are included, which contain several test problems (see e.g. [2]). These test programs serve as examples for using the subroutines, verify their correctness and demonstrate their efficiency. In this short guide, we describe all subroutines which can be called from the user's program. A detailed description of the method is given in [1]. In the description of formal parameters, we introduce a type of the argument that specifies whether the argument must have a value defined on entry to the subroutine (I), whether it is a value which will be returned (O), or both (U), or whether it is an auxiliary value (A). Note that the arguments of the type I can be changed on output under some circumstances, especially if improper input values were given. Besides formal parameters, we can use a COMMON /STAT/ block containing statistical information. This block, used in each subroutine has the following form: COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH The arguments have the following meaning: Argument Type Significance ---------------------------------------------------------------------- NRES O Positive INTEGER variable that indicates the number of restarts. NDEC O Positive INTEGER variable that indicates the number of matrix decompositions. NIN O Positive INTEGER variable that indicates the number of inner iterations (for solving linear systems). NIT O Positive INTEGER variable that indicates the number of iterations. NFV O Positive INTEGER variable that indicates the number of function evaluations. NFG O Positive INTEGER variable that specifies the number of gradient evaluations. NFH O Positive INTEGER variable that specifies the number of Hessian evaluations. 2. Subroutines PLIPU, PLIPS: ---------------------------- The calling sequences are CALL PLIPU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) CALL PLIPS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) The arguments have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) U On input, DOUBLE PRECISION vector with the initial estimate to the solution. On output, the approximation to the minimum. IX(NF) I On input (significant only if NB>0) INTEGER vector containing the simple bounds types: IX(I)=0 - the variable X(I) is unbounded, IX(I)=1 - the lower bound X(I) >= XL(I), IX(I)=2 - the upper bound X(I) <= XU(I), IX(I)=3 - the two side bound XL(I) <= X(I) <= XU(I), IX(I)=5 - the variable X(I) is fixed (given by its initial estimate). XL(NF) I DOUBLE PRECISION vector with lower bounds for variables (significant only if NB>0). XU(NF) I DOUBLE PRECISION vector with upper bounds for variables (significant only if NB>0). IPAR(7) I INTEGER parameters: IPAR(1)=MIT, IPAR(2)=MFV, IPAR(3)-NONE, IPAR(4)=IEST, IPAR(5)-MET, IPAR(6)-NONE, IPAR(7)=MF. Parameters MIT, MFV, IEST, MET, MF are described in Section 3 together with other parameters of the subroutine PLIP. RPAR(9) I DOUBLE PRECISION parameters: RPAR(1)=XMAX, RPAR(2)=TOLX, RPAR(3)=TOLF, RPAR(4)=TOLB, RPAR(5)=TOLG, RPAR(6)=FMIN, RPAR(7)-NONE, RPAR(6)-NONE, RPAR(9)-NONE. Parameters XMAX, TOLX, TOLF, TOLB, TOLG, FMIN are described in Section 3 together with other parameters of the subroutine PLIP. F O DOUBLE PRECISION value of the objective function at the solution X. GMAX O DOUBLE PRECISION maximum absolute value of a partial derivative of the Lagrangian function. IPRNT I INTEGER variable that specifies PRINT: IPRNT= 0 - print is suppressed, IPRNT= 1 - basic print of final results, IPRNT=-1 - extended print of final results, IPRNT= 2 - basic print of intermediate and final results, IPRNT=-2 - extended print of intermediate and final results. ITERM O INTEGER variable that indicates the cause of termination: ITERM= 1 - if |X - XO| was less than or equal to TOLX in two subsequent iterations, ITERM= 2 - if |F - FO| was less than or equal to TOLF in two subsequent iterations, ITERM= 3 - if F is less than or equal to TOLB, ITERM= 4 - if GMAX is less than or equal to TOLG, ITERM= 6 - if termination criterion was not satisfied, but the solution is probably acceptable, ITERM=11 - if NIT exceeded MIT, ITERM=12 - if NFV exceeded MFV, ITERM< 0 - if the method failed. The subroutines PLIPU, PLIPS require the user supplied subroutines OBJ and DOBJ that define the objective function and its gradient and have the form SUBROUTINE OBJ(NF,X,F) SUBROUTINE DOBJ(NF,X,G) The arguments of the user supplied subroutines have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) I DOUBLE PRECISION an estimate to the solution. F O DOUBLE PRECISION value of the objective function at the point X. G(NF) O DOUBLE PRECISION gradient of the objective function at the point X. 3. Subroutine PLIP: ------------------- This general subroutine is called from all subroutines described in Section 2. The calling sequence is CALL PLIP(NF,NB,X,IX,XL,XU,GF,S,XO,GO,SO,XM,XR,GR,XMAX,TOLX,TOLF, & TOLB,TOLG,FMIN,GMAX,F,MIT,MFV,IEST,MET,MF,IPRNT,ITERM) The arguments NF, NB, X, IX, XL, XU, GMAX, F, IPRNT, ITERM, have the same meaning as in Section 2. Other arguments have the following meaning: Argument Type Significance ---------------------------------------------------------------------- GF(NF) A DOUBLE PRECISION gradient of the objective function. S(NF) A DOUBLE PRECISION direction vector. XO(NF) A DOUBLE PRECISION array which contains increments of variables. GO(NF) A DOUBLE PRECISION array which contains increments of gradients. SO(NF) A DOUBLE PRECISION auxiliary array. XM(NF*MF) A DOUBLE PRECISION array which contains columns of the updated matrix stored in the product form. XR(MF) A DOUBLE PRECISION array which contains reduced increments of variables. GR(MF) A DOUBLE PRECISION array which contains reduced increments of gradients. XMAX I DOUBLE PRECISION maximum stepsize; the choice XMAX=0 causes that the default value 1.0D+16 will be taken. TOLX I DOUBLE PRECISION tolerance for the change of the coordinate vector X; the choice TOLX=0 causes that the default value TOLX=1.0D-16 will be taken. TOLF I DOUBLE PRECISION tolerance for the change of function values; the choice TOLF=0 causes that the default value TOLF=1.0D-14 will be taken. TOLB I DOUBLE PRECISION minimum acceptable function value; the choice TOLB=0 causes that the default value TOLB=FMIN+1.0D-16 will be taken. TOLG I DOUBLE PRECISION tolerance for the Lagrangian function gradient; the choice TOLG=0 causes that the default value TOLG=1.0D-6 will be taken. FMIN I DOUBLE PRECISION lower bound for the minimum function value. MIT I INTEGER variable that specifies the maximum number of iterations; the choice MIT=0 causes that the default value 9000 will be taken. MFV I INTEGER variable that specifies the maximum number of function evaluations; the choice MFV=0 causes that the default value 9000 will be taken. IEST I INTEGER estimation of the minimum functiom value for the line search: IEST=0 - estimation is not used, IEST=1 - lower bound FMIN is used as an estimation for the minimum function value. MET I INTEGER variable that specifies the limited-memory method: MET=1 - rank-one method, MET=2 - rank-two method. The choice MET=0 causes that the default value MET=2 will be taken. MF I The number of limited-memory variable metric updates in each iteration (they use MF stored vectors). The choice of parameter XMAX can be sensitive in many cases. First, the objective function can be evaluated only in a relatively small region (if it contains exponentials) so that the maximum stepsize is necessary. Secondly, the problem can be very ill-conditioned far from the solution point so that large steps can be unsuitable. Finally, if the problem has more local solutions, a suitably chosen maximum stepsize can lead to obtaining a better local solution. The subroutine PLIP requires the user supplied subroutines OBJ and DOBJ which are described in Section 2. 4. Verification of the subroutines: ----------------------------------- Subroutine PLIPU can be verified and tested using the program TLIPU. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation) and TFGU14 (gradient evaluation) containing 22 unconstrained test problems with at most 1000 variables [2]. The results obtained by the program TLIPU on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 5383 NFV= 5417 NFG= 5417 F= 0.601022658E-13 G= 0.599E-06 ITERM= 4 NIT= 530 NFV= 557 NFG= 557 F= 3.57276719 G= 0.124E-05 ITERM= 2 NIT= 125 NFV= 128 NFG= 128 F= 0.338270284E-12 G= 0.518E-06 ITERM= 4 NIT= 109 NFV= 114 NFG= 114 F= 269.499543 G= 0.669E-06 ITERM= 4 NIT= 26 NFV= 27 NFG= 27 F= 0.710072396E-11 G= 0.951E-06 ITERM= 4 NIT= 35 NFV= 36 NFG= 36 F= 0.142942272E-10 G= 0.737E-06 ITERM= 4 NIT= 36 NFV= 41 NFG= 41 F= 336.937181 G= 0.956E-06 ITERM= 4 NIT= 33 NFV= 36 NFG= 36 F= 761774.954 G= 0.192E-02 ITERM= 2 NIT= 15 NFV= 18 NFG= 18 F= 316.436141 G= 0.264E-06 ITERM= 4 NIT= 2003 NFV= 2030 NFG= 2030 F= -124.950000 G= 0.116E-04 ITERM= 2 NIT= 157 NFV= 175 NFG= 175 F= 10.7765879 G= 0.299E-06 ITERM= 4 NIT= 337 NFV= 350 NFG= 350 F= 982.273617 G= 0.145E-04 ITERM= 2 NIT= 9 NFV= 10 NFG= 10 F= 0.230414406E-14 G= 0.642E-07 ITERM= 4 NIT= 8 NFV= 10 NFG= 10 F= 0.128834241E-08 G= 0.977E-06 ITERM= 4 NIT= 1226 NFV= 1256 NFG= 1256 F= 1.92401599 G= 0.970E-06 ITERM= 4 NIT= 237 NFV= 246 NFG= 246 F= -427.404476 G= 0.501E-04 ITERM= 2 NIT= 598 NFV= 604 NFG= 604 F=-0.379921091E-01 G= 0.908E-06 ITERM= 4 NIT= 989 NFV= 998 NFG= 998 F=-0.245741193E-01 G= 0.975E-06 ITERM= 4 NIT= 1261 NFV= 1272 NFG= 1272 F= 59.5986241 G= 0.410E-05 ITERM= 2 NIT= 2045 NFV= 2058 NFG= 2058 F= -1.00013520 G= 0.911E-06 ITERM= 4 NIT= 2175 NFV= 2196 NFG= 2196 F= 2.13866377 G= 0.996E-06 ITERM= 4 NIT= 1261 NFV= 1292 NFG= 1292 F= 1.00000000 G= 0.927E-06 ITERM= 4 NITER =18598 NFVAL =18871 NSUCC = 22 TIME= 0:00:10.63 The rows corresponding to individual test problems contain the number of iterations NIT, the number of function evaluations NFV, the number of gradient evaluations NFG, the final value of the objective function F, the norm of gradient G and the cause of termination ITERM. Subroutine PLIPS can be verified and tested using the program TLIPS. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation), TFGU14 (gradient evaluation) containing 22 box constrained test problems with at most 1000 variables [2]. The results obtained by the program TLIPS on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 5263 NFV= 5321 NFG= 5321 F= 0.530131995E-13 G= 0.370E-05 ITERM= 2 NIT= 2293 NFV= 2447 NFG= 2447 F= 3930.43962 G= 0.251E-04 ITERM= 2 NIT= 127 NFV= 132 NFG= 132 F= 0.210550150E-12 G= 0.437E-06 ITERM= 4 NIT= 70 NFV= 72 NFG= 72 F= 269.522686 G= 0.794E-06 ITERM= 4 NIT= 26 NFV= 27 NFG= 27 F= 0.710072396E-11 G= 0.951E-06 ITERM= 4 NIT= 35 NFV= 36 NFG= 36 F= 0.142942272E-10 G= 0.737E-06 ITERM= 4 NIT= 37 NFV= 43 NFG= 43 F= 336.937181 G= 0.133E-05 ITERM= 2 NIT= 59 NFV= 65 NFG= 65 F= 761925.725 G= 0.399E-03 ITERM= 2 NIT= 508 NFV= 510 NFG= 510 F= 428.056916 G= 0.776E-06 ITERM= 4 NIT= 1253 NFV= 1277 NFG= 1277 F= -82.5400568 G= 0.120E-04 ITERM= 2 NIT= 13 NFV= 19 NFG= 19 F= 96517.2947 G= 0.150E-04 ITERM= 2 NIT= 95 NFV= 102 NFG= 102 F= 4994.21410 G= 0.790E-04 ITERM= 2 NIT= 9 NFV= 10 NFG= 10 F= 0.230414406E-14 G= 0.642E-07 ITERM= 4 NIT= 8 NFV= 10 NFG= 10 F= 0.128834241E-08 G= 0.977E-06 ITERM= 4 NIT= 1226 NFV= 1256 NFG= 1256 F= 1.92401599 G= 0.970E-06 ITERM= 4 NIT= 227 NFV= 228 NFG= 228 F= -427.391653 G= 0.952E-05 ITERM= 2 NIT= 598 NFV= 604 NFG= 604 F=-0.379921091E-01 G= 0.908E-06 ITERM= 4 NIT= 989 NFV= 998 NFG= 998 F=-0.245741193E-01 G= 0.975E-06 ITERM= 4 NIT= 1367 NFV= 1383 NFG= 1383 F= 1654.94525 G= 0.105E-04 ITERM= 2 NIT= 2274 NFV= 2303 NFG= 2303 F= -1.00013520 G= 0.798E-06 ITERM= 4 NIT= 1196 NFV= 1211 NFG= 1211 F= 2.41354873 G= 0.975E-06 ITERM= 4 NIT= 1361 NFV= 1381 NFG= 1381 F= 1.00000000 G= 0.962E-06 ITERM= 4 NITER =19034 NFVAL =19435 NSUCC = 22 TIME= 0:00:11.09 References: ----------- [1] Luksan L., Matonoha C., Vlcek J.: LSA: Algorithms for large-scale unconstrained and box constrained optimization Technical Report V-896. Prague, ICS AS CR, 2004. [2] Luksan L., Vlcek J.: Sparse and partially separable test problems for unconstrained and equality constrained optimization. Research Report V-767, Institute of Computer Science, Academy of Sciences of the Czech Republic, Prague, Czech Republic, 1998. stevengj-nlopt-88c424d/src/algs/luksan/plis.c000066400000000000000000000355651521061417600212010ustar00rootroot00000000000000#include #include #include #include #include "luksan.h" #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define MIN2(a,b) ((a) < (b) ? (a) : (b)) /* *********************************************************************** */ /* SUBROUTINE PLIS ALL SYSTEMS 01/09/22 */ /* PURPOSE : */ /* GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT */ /* USE THE LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG */ /* RECURRENCES. */ /* PARAMETERS : */ /* II NF NUMBER OF VARIABLES. */ /* II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. */ /* NB>0-SIMPLE BOUNDS ACCEPTED. */ /* RI X(NF) VECTOR OF VARIABLES. */ /* II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE */ /* X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). */ /* IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND */ /* XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. */ /* RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. */ /* RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. */ /* RO GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. */ /* RO S(NF) DIRECTION VECTOR. */ /* RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. */ /* RI GO(NF) GRADIENTS DIFFERENCE. */ /* RA UO(NF) AUXILIARY VECTOR. */ /* RA VO(NF) AUXILIARY VECTOR. */ /* RI XMAX MAXIMUM STEPSIZE. */ /* RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. */ /* RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. */ /* RI TOLB TOLERANCE FOR THE FUNCTION VALUE. */ /* RI TOLG TOLERANCE FOR THE GRADIENT NORM. */ /* RI MINF_EST ESTIMATION OF THE MINIMUM FUNCTION VALUE. */ /* RO GMAX MAXIMUM PARTIAL DERIVATIVE. */ /* RO F VALUE OF THE OBJECTIVE FUNCTION. */ /* II MIT MAXIMUM NUMBER OF ITERATIONS. */ /* II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. */ /* II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. */ /* IEST=1-MINIMUM IS ESTIMATED BY THE VALUE MINF_EST. */ /* II MF NUMBER OF LIMITED MEMORY STEPS. */ /* IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. */ /* ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN */ /* MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN */ /* MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. */ /* ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. */ /* ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, */ /* BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. */ /* ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. */ /* ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. */ /* VARIABLES IN COMMON /STAT/ (STATISTICS) : */ /* IO NRES NUMBER OF RESTARTS. */ /* IO NDEC NUMBER OF MATRIX DECOMPOSITION. */ /* IO NIN NUMBER OF INNER ITERATIONS. */ /* IO NIT NUMBER OF ITERATIONS. */ /* IO NFV NUMBER OF FUNCTION EVALUATIONS. */ /* IO NFG NUMBER OF GRADIENT EVALUATIONS. */ /* IO NFH NUMBER OF HESSIAN EVALUATIONS. */ /* SUBPROGRAMS USED : */ /* S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. */ /* S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. */ /* S PYADC0 ADDITION OF A BOX CONSTRAINT. */ /* S PYFUT1 TEST ON TERMINATION. */ /* S PYRMC0 DELETION OF A BOX CONSTRAINT. */ /* S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC */ /* UPDATE. */ /* S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. */ /* S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. */ /* S MXDRCB BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION */ /* OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. */ /* S MXDRCF FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION */ /* OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. */ /* S MXDRSU SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. */ /* SHIFT OF ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN */ /* THE LIMITED MEMORY BFGS METHOD. */ /* S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. */ /* RF MXUDOT DOT PRODUCT OF TWO VECTORS. */ /* S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. */ /* S MXVCOP COPYING OF A VECTOR. */ /* S MXVSCL SCALING OF A VECTOR. */ /* EXTERNAL SUBROUTINES : */ /* SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS */ /* THE VALUE OF THE OBJECTIVE FUNCTION. */ /* SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) */ /* IS THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* -- OBJ and DOBJ are replaced by a single function, objgrad, in NLopt */ /* METHOD : */ /* LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG */ /* RECURRENCES. */ static void plis_(int *nf, int *nb, double *x, int * ix, double *xl, double *xu, double *gf, double *s, double *xo, double *go, double *uo, double *vo, double *xmax, double *tolx, double *tolf, double * tolb, double *tolg, nlopt_stopping *stop, double *minf_est, double *gmax, double *f, int *mit, int *mfv, int *iest, int *mf, int *iterm, stat_common *stat_1, nlopt_func objgrad, void *objgrad_data) { /* System generated locals */ int i__1; double d__1, d__2; /* Builtin functions */ /* Local variables */ double a, b; int i__, k, n; double p, r__; int kd, ld; double fo, fp, po, pp, ro, rp; int kbf, mfg; int mes, kit; double alf1, alf2, eta9, par1, par2; double eps8, eps9; int mred, iold, nred; double maxf, dmax__; int xstop = 0; int inew; double told; int ites; double rmin, rmax, umax, tolp, tols; int isys; int ires1, ires2; int iterd, mtesf, ntesf; double gnorm; int iters, irest, inits, kters, maxst; double snorm; int mtesx, ntesx; ps1l01_state state; (void) tolb; /* INITIATION */ /* Parameter adjustments */ --vo; --uo; --go; --xo; --s; --gf; --xu; --xl; --ix; --x; /* Function Body */ kbf = 0; if (*nb > 0) { kbf = 2; } stat_1->nres = 0; stat_1->ndec = 0; stat_1->nin = 0; stat_1->nit = 0; stat_1->nfg = 0; stat_1->nfh = 0; isys = 0; ites = 1; mtesx = 2; mtesf = 2; inits = 2; *iterm = 0; iterd = 0; iters = 2; kters = 3; irest = 0; ires1 = 999; ires2 = 0; mred = 10; mes = 4; eta9 = 1e120; eps8 = 1.; eps9 = 1e-8; alf1 = 1e-10; alf2 = 1e10; rmax = eta9; dmax__ = eta9; maxf = 1e20; if (*iest <= 0) { *minf_est = -HUGE_VAL; /* changed from -1e60 by SGJ */ } if (*iest > 0) { *iest = 1; } if (*xmax <= 0.) { *xmax = 1e16; } if (*tolx <= 0.) { *tolx = 1e-16; } if (*tolf <= 0.) { *tolf = 1e-14; } if (*tolg <= 0.) { *tolg = 1e-8; /* SGJ: was 1e-6, but this sometimes stops too soon */ } #if 0 /* removed by SGJ: this check prevented us from using minf_max <= 0, which doesn't make sense. Instead, if you don't want to have a lower limit, you should set minf_max = -HUGE_VAL */ if (*tolb <= 0.) { *tolb = *minf_est + 1e-16; } #endif told = 1e-4; tols = 1e-4; tolp = .8; /* changed by SGJ: default is no limit (INT_MAX) on # iterations/fevals */ if (*mit <= 0) { *mit = INT_MAX; } if (*mfv <= 0) { *mfv = INT_MAX; } mfg = *mfv; kd = 1; ld = -1; kit = -(ires1 * *nf + ires2); fo = *minf_est; /* INITIAL OPERATIONS WITH SIMPLE BOUNDS */ if (kbf > 0) { i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { if ((ix[i__] == 3 || ix[i__] == 4) && xu[i__] <= xl[i__]) { xu[i__] = xl[i__]; ix[i__] = 5; } else if (ix[i__] == 5 || ix[i__] == 6) { xl[i__] = x[i__]; xu[i__] = x[i__]; ix[i__] = 5; } /* L2: */ } luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); } if (*iterm != 0) { goto L11190; } *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } L11120: luksan_pytrcg__(nf, nf, &ix[1], &gf[1], &umax, gmax, &kbf, &iold); luksan_pyfut1__(nf, f, &fo, &umax, gmax, xstop, stop, tolg, &kd, &stat_1->nit, &kit, mit, &stat_1->nfg, &mfg, &ntesx, &mtesx, &ntesf, &mtesf, &ites, &ires1, &ires2, &irest, & iters, iterm); if (*iterm != 0) { goto L11190; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } if (kbf > 0 && rmax > 0.) { luksan_pyrmc0__(nf, &n, &ix[1], &gf[1], &eps8, &umax, gmax, &rmax, & iold, &irest); } L11130: /* DIRECTION DETERMINATION */ gnorm = sqrt(luksan_mxudot__(nf, &gf[1], &gf[1], &ix[1], &kbf)); if (irest != 0) { goto L12620; } /* Computing MIN */ i__1 = stat_1->nit - kit; k = MIN2(i__1,*mf); if (k <= 0) { irest = MAX2(irest,1); goto L12620; } /* DETERMINATION OF THE PARAMETER B */ b = luksan_mxudot__(nf, &xo[1], &go[1], &ix[1], &kbf); if (b <= 0.) { irest = MAX2(irest,1); goto L12620; } uo[1] = 1. / b; luksan_mxuneg__(nf, &gf[1], &s[1], &ix[1], &kbf); luksan_mxdrcb__(nf, &k, &xo[1], &go[1], &uo[1], &vo[1], &s[1], &ix[1], & kbf); a = luksan_mxudot__(nf, &go[1], &go[1], &ix[1], &kbf); if (a > 0.) { d__1 = b / a; luksan_mxvscl__(nf, &d__1, &s[1], &s[1]); } luksan_mxdrcf__(nf, &k, &xo[1], &go[1], &uo[1], &vo[1], &s[1], &ix[1], & kbf); snorm = sqrt(luksan_mxudot__(nf, &s[1], &s[1], &ix[1], &kbf)); /* Computing MIN */ i__1 = k + 1; k = MIN2(i__1,*mf); luksan_mxdrsu__(nf, &k, &xo[1], &go[1], &uo[1]); L12620: iterd = 0; if (irest != 0) { /* STEEPEST DESCENT DIRECTION */ luksan_mxuneg__(nf, &gf[1], &s[1], &ix[1], &kbf); snorm = gnorm; if (kit < stat_1->nit) { ++stat_1->nres; kit = stat_1->nit; } else { *iterm = -10; if (iters < 0) { *iterm = iters - 5; } } } /* TEST ON DESCENT DIRECTION AND PREPARATION OF LINE SEARCH */ if (kd > 0) { p = luksan_mxudot__(nf, &gf[1], &s[1], &ix[1], &kbf); } if (iterd < 0) { *iterm = iterd; } else { /* TEST ON DESCENT DIRECTION */ if (snorm <= 0.) { irest = MAX2(irest,1); } else if (p + told * gnorm * snorm <= 0.) { irest = 0; } else { /* UNIFORM DESCENT CRITERION */ irest = MAX2(irest,1); } if (irest == 0) { /* PREPARATION OF LINE SEARCH */ nred = 0; rmin = alf1 * gnorm / snorm; /* Computing MIN */ d__1 = alf2 * gnorm / snorm, d__2 = *xmax / snorm; rmax = MIN2(d__1,d__2); } } if (*iterm != 0) { goto L11190; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11190; } if (irest != 0) { goto L11130; } luksan_pytrcs__(nf, &x[1], &ix[1], &xo[1], &xl[1], &xu[1], &gf[1], &go[1], &s[1], &ro, &fp, &fo, f, &po, &p, &rmax, &eta9, &kbf); if (rmax == 0.) { goto L11175; } L11170: luksan_ps1l01__(&r__, &rp, f, &fo, &fp, &p, &po, &pp, minf_est, &maxf, &rmin, &rmax, &tols, &tolp, &par1, &par2, &kd, &ld, &stat_1->nit, &kit, & nred, &mred, &maxst, iest, &inits, &iters, &kters, &mes, &isys, &state); if (isys == 0) { goto L11174; } luksan_mxudir__(nf, &r__, &s[1], &xo[1], &x[1], &ix[1], &kbf); luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; p = luksan_mxudot__(nf, &gf[1], &s[1], &ix[1], &kbf); goto L11170; L11174: if (iters <= 0) { r__ = 0.; *f = fo; p = po; luksan_mxvcop__(nf, &xo[1], &x[1]); luksan_mxvcop__(nf, &go[1], &gf[1]); irest = MAX2(irest,1); ld = kd; goto L11130; } luksan_pytrcd__(nf, &x[1], &ix[1], &xo[1], &gf[1], &go[1], &r__, f, &fo, & p, &po, &dmax__, &kbf, &kd, &ld, &iters); xstop = nlopt_stop_dx(stop, &x[1], &xo[1]); L11175: if (kbf > 0) { luksan_mxvine__(nf, &ix[1]); luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); } goto L11120; L11190: return; } /* plis_ */ /* NLopt wrapper around plis_, handling dynamic allocation etc. */ nlopt_result luksan_plis(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, /* subspace dimension, 0 for default */ double tolg) /* gradient tolerance */ { int i, *ix, nb = 1; double *work, *xl, *xu, *xo, *gf, *s, *go, *uo, *vo; double gmax, minf_est; double xmax = 0; /* no maximum */ int iest = 0; /* we have no estimate of min function value */ int mit = 0; /* default no limit on #iterations */ int mfv = stop->maxeval; stat_common stat; int iterm; ix = (int*) malloc(sizeof(int) * n); if (!ix) return NLOPT_OUT_OF_MEMORY; if (mf <= 0) { mf = MAX2(MEMAVAIL/n, 10); if (stop->maxeval > 0 && stop->maxeval <= mf) mf = MAX2(stop->maxeval, 1); } retry_alloc: work = (double*) malloc(sizeof(double) * (n * 4 + MAX2(n,n*mf)*2 + MAX2(n,mf)*2)); if (!work) { if (mf > 0) { mf = 0; /* allocate minimal memory */ goto retry_alloc; } free(ix); return NLOPT_OUT_OF_MEMORY; } xl = work; xu = xl + n; gf = xu + n; s = gf + n; xo = s + n; go = xo + MAX2(n,n*mf); uo = go + MAX2(n,n*mf); vo = uo + MAX2(n,mf); for (i = 0; i < n; ++i) { int lbu = lb[i] <= -0.99 * HUGE_VAL; /* lb unbounded */ int ubu = ub[i] >= 0.99 * HUGE_VAL; /* ub unbounded */ ix[i] = lbu ? (ubu ? 0 : 2) : (ubu ? 1 : (lb[i] == ub[i] ? 5 : 3)); xl[i] = lb[i]; xu[i] = ub[i]; } /* ? xo does not seem to be initialized in the original Fortran code, but it is used upon input to plis if mf > 0 ... perhaps ALLOCATE initializes arrays to zero by default? */ memset(xo, 0, sizeof(double) * MAX2(n,n*mf)); plis_(&n, &nb, x, ix, xl, xu, gf, s, xo, go, uo, vo, &xmax, /* fixme: pass tol_rel and tol_abs and use NLopt check */ &stop->xtol_rel, &stop->ftol_rel, &stop->minf_max, &tolg, stop, &minf_est, &gmax, minf, &mit, &mfv, &iest, &mf, &iterm, &stat, f, f_data); free(work); free(ix); switch (iterm) { case 1: return NLOPT_XTOL_REACHED; case 2: return NLOPT_FTOL_REACHED; case 3: return NLOPT_MINF_MAX_REACHED; case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; case 100: return NLOPT_MAXTIME_REACHED; case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } stevengj-nlopt-88c424d/src/algs/luksan/plis.for000066400000000000000000000461211521061417600215330ustar00rootroot00000000000000************************************************************************ * SUBROUTINE PLISU ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE UNCONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(6) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(7) MAXIMUM NUMBER OF VARIABLE METRIC UPDATES. * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PLIS LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PLISU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LS,LXO,LGO,LUO,LVO INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(2*NF+2*NF*MF+2*MF)) NB=0 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LS=LGF+NF LXO=LS+NF LGO=LXO+NF*MF LUO=LGO+NF*MF LVO=LUO+MF CALL PLIS(NF,NB,X,IPAR,RA,RA,RA(LGF),RA(LS),RA(LXO),RA(LGO), & RA(LUO),RA(LVO),RPAR(1),RPAR(2),RPAR(3),RPAR(4),RPAR(5),RPAR(6), & GMAX,F,IPAR(1),IPAR(2),IPAR(4),MF,IPRNT,ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PLISS ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(6) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * IPAR(7) MAXIMUM NUMBER OF VARIABLE METRIC UPDATES. * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PLIS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PLIS LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PLISS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IX(*),IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LS,LXO,LGO,LUO,LVO INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(2*NF+2*NF*MF+2*MF)) NB=1 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LS=LGF+NF LXO=LS+NF LGO=LXO+NF*MF LUO=LGO+NF*MF LVO=LUO+MF CALL PLIS(NF,NB,X,IX,XL,XU,RA(LGF),RA(LS),RA(LXO),RA(LGO), & RA(LUO),RA(LVO),RPAR(1),RPAR(2),RPAR(3),RPAR(4),RPAR(5),RPAR(6), & GMAX,F,IPAR(1),IPAR(2),IPAR(4),MF,IPRNT,ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PLIS ALL SYSTEMS 01/09/22 * PURPOSE : * GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT * USE THE LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. * NB>0-SIMPLE BOUNDS ACCEPTED. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RO GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * RA UO(NF) AUXILIARY VECTOR. * RA VO(NF) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. * RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. * RI TOLB TOLERANCE FOR THE FUNCTION VALUE. * RI TOLG TOLERANCE FOR THE GRADIENT NORM. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * RO F VALUE OF THE OBJECTIVE FUNCTION. * II MIT MAXIMUM NUMBER OF ITERATIONS. * II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * II MF NUMBER OF LIMITED MEMORY STEPS. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITION. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. * S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. * S PYADC0 ADDITION OF A BOX CONSTRAINT. * S PYFUT1 TEST ON TERMINATION. * S PYRMC0 DELETION OF A BOX CONSTRAINT. * S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC * UPDATE. * S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. * S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. * S MXDRCB BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION * OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * S MXDRCF FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION * OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * S MXDRSU SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. * SHIFT OF ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN * THE LIMITED MEMORY BFGS METHOD. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVCOP COPYING OF A VECTOR. * S MXVSCL SCALING OF A VECTOR. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * * METHOD : * LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * SUBROUTINE PLIS(NF,NB,X,IX,XL,XU,GF,S,XO,GO,UO,VO,XMAX,TOLX, & TOLF,TOLB,TOLG,FMIN,GMAX,F,MIT,MFV,IEST,MF,IPRNT,ITERM) INTEGER NF,NB,IX(*),MIT,MFV,IEST,MF,IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),GF(*),S(*),XO(*),GO(*),UO(*), & VO(*),TOLX,TOLF,TOLG,TOLB,FMIN,XMAX,GMAX,F INTEGER ITERD,ITERS,KD,LD,NTESX,NTESF,MTESX,MTESF,MRED,KIT, & IREST,KBF,MES,MES1,MES2,MES3,MAXST,ISYS,ITES,INITS,KTERS, & IRES1,IRES2,INEW,IOLD,I,N,MFG,K,NRED DOUBLE PRECISION R,RO,RP,FO,FP,P,PO,PP,GNORM,SNORM,RMIN,RMAX, & UMAX,FMAX,DMAX,ETA0,ETA9,EPS8,EPS9,ALF1,ALF2,PAR1,PAR2,A,B, & TOLD,TOLS,TOLP DOUBLE PRECISION MXUDOT INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH IF (ABS(IPRNT).GT.1) WRITE(6,'(1X,''ENTRY TO PLIS :'')') * * INITIATION * KBF=0 IF (NB.GT.0) KBF=2 NRES=0 NDEC=0 NIN=0 NIT=0 NFV=0 NFG=0 NFH=0 ISYS=0 ITES=1 MTESX=2 MTESF=2 INITS=2 ITERM=0 ITERD=0 ITERS=2 KTERS=3 IREST=0 IRES1=999 IRES2=0 MRED=10 MES=4 MES1=2 MES2=2 MES3=2 ETA0=1.0D-15 ETA9=1.0D 120 EPS8=1.00D 0 EPS9=1.00D-8 ALF1=1.0D-10 ALF2=1.0D 10 RMAX=ETA9 DMAX=ETA9 FMAX=1.0D 20 IF (IEST.LE.0) FMIN=-1.0D 60 IF (IEST.GT.0) IEST=1 IF (XMAX.LE.0.0D 0) XMAX=1.0D 16 IF (TOLX.LE.0.0D 0) TOLX=1.0D-16 IF (TOLF.LE.0.0D 0) TOLF=1.0D-14 IF (TOLG.LE.0.0D 0) TOLG=1.0D-6 IF (TOLB.LE.0.0D 0) TOLB=FMIN+1.0D-16 TOLD=1.0D-4 TOLS=1.0D-4 TOLP=0.8D 0 IF (MIT.LE.0) MIT=9000 IF (MFV.LE.0) MFV=9000 MFG=MFV KD= 1 LD=-1 KIT=-(IRES1*NF+IRES2) FO=FMIN * * INITIAL OPERATIONS WITH SIMPLE BOUNDS * IF (KBF.GT.0) THEN DO 2 I = 1,NF IF ((IX(I).EQ.3.OR.IX(I).EQ.4) .AND. XU(I).LE.XL(I)) THEN XU(I) = XL(I) IX(I) = 5 ELSE IF (IX(I).EQ.5 .OR. IX(I).EQ.6) THEN XL(I) = X(I) XU(I) = X(I) IX(I) = 5 END IF 2 CONTINUE CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL PYADC0(NF,N,X,IX,XL,XU,INEW) END IF IF (ITERM.NE.0) GO TO 11190 CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 11120 CONTINUE CALL PYTRCG(NF,NF,IX,GF,UMAX,GMAX,KBF,IOLD) IF (ABS(IPRNT).GT.1) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3)') NIT,NFV,NFG,F,GMAX CALL PYFUT1(NF,F,FO,UMAX,GMAX,DMAX,TOLX,TOLF,TOLB,TOLG,KD, & NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF,ITES, & IRES1,IRES2,IREST,ITERS,ITERM) IF (ITERM.NE.0) GO TO 11190 IF (KBF.GT.0.AND.RMAX.GT.0.0D 0) THEN CALL PYRMC0(NF,N,IX,GF,EPS8,UMAX,GMAX,RMAX,IOLD,IREST) END IF 11130 CONTINUE * * DIRECTION DETERMINATION * GNORM=SQRT(MXUDOT(NF,GF,GF,IX,KBF)) IF (IREST.NE.0) GO TO 12620 K=MIN(NIT-KIT,MF) IF (K.LE.0) THEN IREST=MAX(IREST,1) GO TO 12620 END IF * * DETERMINATION OF THE PARAMETER B * B=MXUDOT(NF,XO,GO,IX,KBF) IF (B.LE.0.0D 0) THEN IREST=MAX(IREST,1) GO TO 12620 END IF UO(1)=1.0D 0/B CALL MXUNEG(NF,GF,S,IX,KBF) CALL MXDRCB(NF,K,XO,GO,UO,VO,S,IX,KBF) A=MXUDOT(NF,GO,GO,IX,KBF) IF (A.GT.0.0D 0) THEN CALL MXVSCL(NF,B/A,S,S) END IF CALL MXDRCF(NF,K,XO,GO,UO,VO,S,IX,KBF) SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) K=MIN(K+1,MF) CALL MXDRSU(NF,K,XO,GO,UO) 12620 CONTINUE ITERD=0 IF (IREST.NE.0) THEN * * STEEPEST DESCENT DIRECTION * CALL MXUNEG(NF,GF,S,IX,KBF) SNORM=GNORM IF (KIT.LT.NIT) THEN NRES=NRES+1 KIT = NIT ELSE ITERM=-10 IF (ITERS.LT.0) ITERM=ITERS-5 END IF END IF * * TEST ON DESCENT DIRECTION AND PREPARATION OF LINE SEARCH * IF (KD.GT.0) P=MXUDOT(NF,GF,S,IX,KBF) IF (ITERD.LT.0) THEN ITERM=ITERD ELSE * * TEST ON DESCENT DIRECTION * IF (SNORM.LE.0.0D 0) THEN IREST=MAX(IREST,1) ELSE IF (P+TOLD*GNORM*SNORM.LE.0.0D 0) THEN IREST=0 ELSE * * UNIFORM DESCENT CRITERION * IREST=MAX(IREST,1) END IF IF (IREST.EQ.0) THEN * * PREPARATION OF LINE SEARCH * NRED = 0 RMIN=ALF1*GNORM/SNORM RMAX=MIN(ALF2*GNORM/SNORM,XMAX/SNORM) END IF END IF IF (ITERM.NE.0) GO TO 11190 IF (IREST.NE.0) GO TO 11130 CALL PYTRCS(NF,X,IX,XO,XL,XU,GF,GO,S,RO,FP,FO,F,PO,P,RMAX,ETA9, & KBF) IF (RMAX.EQ.0.0D 0) GO TO 11175 11170 CONTINUE CALL PS1L01(R,RP,F,FO,FP,P,PO,PP,FMIN,FMAX,RMIN,RMAX, & TOLS,TOLP,PAR1,PAR2,KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST, & INITS,ITERS,KTERS,MES,ISYS) IF (ISYS.EQ.0) GO TO 11174 CALL MXUDIR(NF,R,S,XO,X,IX,KBF) CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 P=MXUDOT(NF,GF,S,IX,KBF) GO TO 11170 11174 CONTINUE IF (ITERS.LE.0) THEN R=0.0D 0 F=FO P=PO CALL MXVCOP(NF,XO,X) CALL MXVCOP(NF,GO,GF) IREST=MAX(IREST,1) LD=KD GO TO 11130 END IF CALL PYTRCD(NF,X,IX,XO,GF,GO,R,F,FO,P,PO,DMAX,KBF,KD,LD,ITERS) 11175 CONTINUE IF (KBF.GT.0) THEN CALL MXVINE(NF,IX) CALL PYADC0(NF,N,X,IX,XL,XU,INEW) END IF GO TO 11120 11190 CONTINUE IF (IPRNT.GT.1.OR.IPRNT.LT.0) & WRITE(6,'(1X,''EXIT FROM PLIS :'')') IF (IPRNT.NE.0) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3,2X,''ITERM='',I3)') NIT,NFV,NFG, & F,GMAX,ITERM IF (IPRNT.LT.0) & WRITE (6,'(1X,''X='',5(G14.7,1X):/(3X,5(G14.7,1X)))') & (X(I),I=1,NF) RETURN END stevengj-nlopt-88c424d/src/algs/luksan/plis.txt000066400000000000000000000373061521061417600215710ustar00rootroot00000000000000*********************************************************************** * * * PLIS - A LIMITED MEMORY VARIABLE METRIC ALGORITHM FOR * * LARGE-SCALE OPTIMIZATION. * * * *********************************************************************** 1. Introduction: ---------------- The double-precision FORTRAN 77 basic subroutine PLIS is designed to find a close approximation to a local minimum of a nonlinear function F(X) with simple bounds on variables. Here X is a vector of NF variables and F(X) is a smooth function. We suppose that NF is large but the sparsity pattern of the Hessian matrix is not known (or the Hessian matrix is dense). Simple bounds are assumed in the form X(I) unbounded if IX(I) = 0, XL(I) <= X(I) if IX(I) = 1, X(I) <= XU(I) if IX(I) = 2, XL(I) <= X(I) <= XU(I) if IX(I) = 3, XL(I) = X(I) = XU(I) if IX(I) = 5, where 1 <= I <= NF. To simplify user's work, two additional easy to use subroutines are added. They call the basic general subroutine PLIS: PLISU - unconstrained large-scale optimization, PLISS - large-scale optimization with simple bounds. All subroutines contain a description of formal parameters and extensive comments. Furthermore, two test programs TLISU and TLISS are included, which contain several test problems (see e.g. [2]). These test programs serve as examples for using the subroutines, verify their correctness and demonstrate their efficiency. In this short guide, we describe all subroutines which can be called from the user's program. A detailed description of the method is given in [1]. In the description of formal parameters, we introduce a type of the argument that specifies whether the argument must have a value defined on entry to the subroutine (I), whether it is a value which will be returned (O), or both (U), or whether it is an auxiliary value (A). Note that the arguments of the type I can be changed on output under some circumstances, especially if improper input values were given. Besides formal parameters, we can use a COMMON /STAT/ block containing statistical information. This block, used in each subroutine has the following form: COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH The arguments have the following meaning: Argument Type Significance ---------------------------------------------------------------------- NRES O Positive INTEGER variable that indicates the number of restarts. NDEC O Positive INTEGER variable that indicates the number of matrix decompositions. NIN O Positive INTEGER variable that indicates the number of inner iterations (for solving linear systems). NIT O Positive INTEGER variable that indicates the number of iterations. NFV O Positive INTEGER variable that indicates the number of function evaluations. NFG O Positive INTEGER variable that specifies the number of gradient evaluations. NFH O Positive INTEGER variable that specifies the number of Hessian evaluations. 2. Subroutines PLISU, PLISS: ---------------------------- The calling sequences are CALL PLISU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) CALL PLISS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) The arguments have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) U On input, DOUBLE PRECISION vector with the initial estimate to the solution. On output, the approximation to the minimum. IX(NF) I On input (significant only if NB>0) INTEGER vector containing the simple bounds types: IX(I)=0 - the variable X(I) is unbounded, IX(I)=1 - the lower bound X(I) >= XL(I), IX(I)=2 - the upper bound X(I) <= XU(I), IX(I)=3 - the two side bound XL(I) <= X(I) <= XU(I), IX(I)=5 - the variable X(I) is fixed (given by its initial estimate). XL(NF) I DOUBLE PRECISION vector with lower bounds for variables (significant only if NB>0). XU(NF) I DOUBLE PRECISION vector with upper bounds for variables (significant only if NB>0). IPAR(7) I INTEGER parameters: IPAR(1)=MIT, IPAR(2)=MFV, IPAR(3)-NONE, IPAR(4)=IEST, IPAR(5)-NONE, IPAR(6)-NONE, IPAR(7)=MF. Parameters MIT, MFV, IEST, MF are described in Section 3 together with other parameters of the subroutine PLIS. RPAR(9) I DOUBLE PRECISION parameters: RPAR(1)=XMAX, RPAR(2)=TOLX, RPAR(3)=TOLF, RPAR(4)=TOLB, RPAR(5)=TOLG, RPAR(6)=FMIN, RPAR(7)-NONE, RPAR(6)-NONE, RPAR(9)-NONE. Parameters XMAX, TOLX, TOLF, TOLB, TOLG, FMIN are described in Section 3 together with other parameters of the subroutine PLIS. F O DOUBLE PRECISION value of the objective function at the solution X. GMAX O DOUBLE PRECISION maximum absolute value of a partial derivative of the Lagrangian function. IPRNT I INTEGER variable that specifies PRINT: IPRNT= 0 - print is suppressed, IPRNT= 1 - basic print of final results, IPRNT=-1 - extended print of final results, IPRNT= 2 - basic print of intermediate and final results, IPRNT=-2 - extended print of intermediate and final results. ITERM O INTEGER variable that indicates the cause of termination: ITERM= 1 - if |X - XO| was less than or equal to TOLX in two subsequent iterations, ITERM= 2 - if |F - FO| was less than or equal to TOLF in two subsequent iterations, ITERM= 3 - if F is less than or equal to TOLB, ITERM= 4 - if GMAX is less than or equal to TOLG, ITERM= 6 - if termination criterion was not satisfied, but the solution is probably acceptable, ITERM=11 - if NIT exceeded MIT, ITERM=12 - if NFV exceeded MFV, ITERM< 0 - if the method failed. The subroutines PLISU, PLISS require the user supplied subroutines OBJ and DOBJ that define the objective function and its gradient and have the form SUBROUTINE OBJ(NF,X,F) SUBROUTINE DOBJ(NF,X,G) The arguments of the user supplied subroutines have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) I DOUBLE PRECISION an estimate to the solution. F O DOUBLE PRECISION value of the objective function at the point X. G(NF) O DOUBLE PRECISION gradient of the objective function at the point X. 3. Subroutine PLIS: ------------------- This general subroutine is called from all subroutines described in Section 2. The calling sequence is CALL PLIS(NF,NB,X,IX,XL,XU,GF,S,XO,GO,UO,VO,XMAX,TOLX,TOLF,TOLB, & TOLG,FMIN,GMAX,F,MIT,MFV,IEST,MF,IPRNT,ITERM) The arguments NF, NB, X, IX, XL, XU, GMAX, F, IPRNT, ITERM, have the same meaning as in Section 2. Other arguments have the following meaning: Argument Type Significance ---------------------------------------------------------------------- GF(NF) A DOUBLE PRECISION gradient of the objective function. S(NF) A DOUBLE PRECISION direction vector. XO(NF*MF) A DOUBLE PRECISION array which contains increments of variables. GO(NF*MF) A DOUBLE PRECISION array which contains increments of gradients. UO(MF) A DOUBLE PRECISION Auxiliary array. VO(MF) A DOUBLE PRECISION Auxiliary array. XMAX I DOUBLE PRECISION maximum stepsize; the choice XMAX=0 causes that the default value 1.0D+16 will be taken. TOLX I DOUBLE PRECISION tolerance for the change of the coordinate vector X; the choice TOLX=0 causes that the default value TOLX=1.0D-16 will be taken. TOLF I DOUBLE PRECISION tolerance for the change of function values; the choice TOLF=0 causes that the default value TOLF=1.0D-14 will be taken. TOLB I DOUBLE PRECISION minimum acceptable function value; the choice TOLB=0 causes that the default value TOLB=FMIN+1.0D-16 will be taken. TOLG I DOUBLE PRECISION tolerance for the Lagrangian function gradient; the choice TOLG=0 causes that the default value TOLG=1.0D-6 will be taken. FMIN I DOUBLE PRECISION lower bound for the minimum function value. MIT I INTEGER variable that specifies the maximum number of iterations; the choice MIT=0 causes that the default value 9000 will be taken. MFV I INTEGER variable that specifies the maximum number of function evaluations; the choice MFV=0 causes that the default value 9000 will be taken. IEST I INTEGER estimation of the minimum functiom value for the line search: IEST=0 - estimation is not used, IEST=1 - lower bound FMIN is used as an estimation for the minimum function value. MF I The number of limited-memory variable metric updates in each iteration (they use 2*MF stored vectors). The choice of parameter XMAX can be sensitive in many cases. First, the objective function can be evaluated only in a relatively small region (if it contains exponentials) so that the maximum stepsize is necessary. Secondly, the problem can be very ill-conditioned far from the solution point so that large steps can be unsuitable. Finally, if the problem has more local solutions, a suitably chosen maximum stepsize can lead to obtaining a better local solution. The subroutine PLIS requires the user supplied subroutines OBJ and DOBJ which are described in Section 2. 4. Verification of the subroutines: ----------------------------------- Subroutine PLISU can be verified and tested using the program TLISU. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation) and TFGU14 (gradient evaluation) containing 22 unconstrained test problems with at most 1000 variables [2]. The results obtained by the program TLISU on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 4988 NFV= 5554 NFG= 5554 F= 0.963780013E-14 G= 0.891E-06 ITERM= 4 NIT= 425 NFV= 454 NFG= 454 F= 14.9944763 G= 0.773E-05 ITERM= 2 NIT= 74 NFV= 78 NFG= 78 F= 0.655101686E-09 G= 0.539E-06 ITERM= 4 NIT= 103 NFV= 112 NFG= 112 F= 269.499543 G= 0.899E-06 ITERM= 4 NIT= 24 NFV= 26 NFG= 26 F= 0.130639280E-11 G= 0.671E-06 ITERM= 4 NIT= 30 NFV= 31 NFG= 31 F= 0.216102227E-10 G= 0.946E-06 ITERM= 4 NIT= 38 NFV= 43 NFG= 43 F= 335.137433 G= 0.730E-06 ITERM= 4 NIT= 29 NFV= 33 NFG= 33 F= 761774.954 G= 0.432E-03 ITERM= 2 NIT= 13 NFV= 16 NFG= 16 F= 316.436141 G= 0.369E-06 ITERM= 4 NIT= 1540 NFV= 1582 NFG= 1582 F= -124.630000 G= 0.124E-04 ITERM= 2 NIT= 114 NFV= 138 NFG= 138 F= 10.7765879 G= 0.380E-06 ITERM= 4 NIT= 248 NFV= 267 NFG= 267 F= 982.273617 G= 0.123E-04 ITERM= 2 NIT= 7 NFV= 8 NFG= 8 F= 0.165734137E-12 G= 0.453E-06 ITERM= 4 NIT= 10 NFV= 12 NFG= 12 F= 0.128729169E-08 G= 0.916E-06 ITERM= 4 NIT= 2830 NFV= 2929 NFG= 2929 F= 1.92401599 G= 0.936E-06 ITERM= 4 NIT= 196 NFV= 210 NFG= 210 F= -427.404476 G= 0.991E-05 ITERM= 2 NIT= 1007 NFV= 1032 NFG= 1032 F=-0.379921091E-01 G= 0.876E-06 ITERM= 4 NIT= 1449 NFV= 1474 NFG= 1474 F=-0.245741193E-01 G= 0.862E-06 ITERM= 4 NIT= 1393 NFV= 1431 NFG= 1431 F= 59.5986241 G= 0.259E-05 ITERM= 2 NIT= 2129 NFV= 2191 NFG= 2191 F= -1.00013520 G= 0.908E-06 ITERM= 4 NIT= 2120 NFV= 2169 NFG= 2169 F= 2.13866377 G= 0.927E-06 ITERM= 4 NIT= 1305 NFV= 1346 NFG= 1346 F= 1.00000000 G= 0.982E-06 ITERM= 4 NITER =20072 NFVAL =21136 NSUCC = 22 TIME= 0:00:10.78 The rows corresponding to individual test problems contain the number of iterations NIT, the number of function evaluations NFV, the number of gradient evaluations NFG, the final value of the objective function F, the norm of gradient G and the cause of termination ITERM. Subroutine PLISS can be verified and tested using the program TLISS. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation), TFGU14 (gradient evaluation) containing 22 box constrained test problems with at most 1000 variables [2]. The results obtained by the program TLISS on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 5063 NFV= 5738 NFG= 5738 F= 0.00000000 G= 0.000E+00 ITERM= 3 NIT= 3167 NFV= 4664 NFG= 4664 F= 3926.45961 G= 0.626E-04 ITERM= 2 NIT= 113 NFV= 124 NFG= 124 F= 0.459503394E-12 G= 0.600E-06 ITERM= 4 NIT= 59 NFV= 64 NFG= 64 F= 269.522686 G= 0.838E-06 ITERM= 4 NIT= 24 NFV= 26 NFG= 26 F= 0.130639280E-11 G= 0.671E-06 ITERM= 4 NIT= 30 NFV= 31 NFG= 31 F= 0.216102227E-10 G= 0.946E-06 ITERM= 4 NIT= 33 NFV= 40 NFG= 40 F= 337.722479 G= 0.592E-06 ITERM= 4 NIT= 50 NFV= 55 NFG= 55 F= 761925.725 G= 0.240E-03 ITERM= 2 NIT= 505 NFV= 508 NFG= 508 F= 428.056916 G= 0.334E-07 ITERM= 4 NIT= 1167 NFV= 1227 NFG= 1227 F= -81.0913589 G= 0.100E-04 ITERM= 2 NIT= 20 NFV= 26 NFG= 26 F= 96517.2947 G= 0.745E-05 ITERM= 2 NIT= 91 NFV= 109 NFG= 109 F= 4994.21410 G= 0.104E-04 ITERM= 2 NIT= 7 NFV= 8 NFG= 8 F= 0.165734137E-12 G= 0.453E-06 ITERM= 4 NIT= 10 NFV= 12 NFG= 12 F= 0.128729169E-08 G= 0.916E-06 ITERM= 4 NIT= 2830 NFV= 2929 NFG= 2929 F= 1.92401599 G= 0.936E-06 ITERM= 4 NIT= 178 NFV= 184 NFG= 184 F= -427.391653 G= 0.107E-04 ITERM= 2 NIT= 1007 NFV= 1032 NFG= 1032 F=-0.379921091E-01 G= 0.876E-06 ITERM= 4 NIT= 1449 NFV= 1474 NFG= 1474 F=-0.245741193E-01 G= 0.862E-06 ITERM= 4 NIT= 1561 NFV= 1595 NFG= 1595 F= 1654.94525 G= 0.112E-04 ITERM= 2 NIT= 2075 NFV= 2121 NFG= 2121 F= -1.00013520 G= 0.916E-06 ITERM= 4 NIT= 1361 NFV= 1389 NFG= 1389 F= 2.41354873 G= 0.709E-06 ITERM= 4 NIT= 1562 NFV= 1598 NFG= 1598 F= 1.00000000 G= 0.786E-06 ITERM= 4 NITER =22362 NFVAL =24954 NSUCC = 22 TIME= 0:00:12.39 References: ----------- [1] Luksan L., Matonoha C., Vlcek J.: LSA: Algorithms for large-scale unconstrained and box constrained optimization Technical Report V-896. Prague, ICS AS CR, 2004. [2] Luksan L., Vlcek J.: Sparse and partially separable test problems for unconstrained and equality constrained optimization. Research Report V-767, Institute of Computer Science, Academy of Sciences of the Czech Republic, Prague, Czech Republic, 1998. stevengj-nlopt-88c424d/src/algs/luksan/pnet.c000066400000000000000000000462661521061417600212000ustar00rootroot00000000000000#include #include #include #include #include "luksan.h" #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define MIN2(a,b) ((a) < (b) ? (a) : (b)) /* Table of constant values */ static double c_b7 = 0.; /* *********************************************************************** */ /* SUBROUTINE PNET ALL SYSTEMS 01/09/22 */ /* PURPOSE : */ /* GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT */ /* USE THE LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG */ /* RECURRENCES. */ /* PARAMETERS : */ /* II NF NUMBER OF VARIABLES. */ /* II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. */ /* NB>0-SIMPLE BOUNDS ACCEPTED. */ /* RI X(NF) VECTOR OF VARIABLES. */ /* II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE */ /* X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). */ /* IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND */ /* XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. */ /* RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. */ /* RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. */ /* RO GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. */ /* RA GN(NF) OLD GRADIENT OF THE OBJECTIVE FUNCTION. */ /* RO S(NF) DIRECTION VECTOR. */ /* RA XO(NF) ARRAY CONTAINING INCREMENTS OF VARIABLES. */ /* RA GO(NF) ARRAY CONTAINING INCREMENTS OF GRADIENTS. */ /* RA XS(NF) AUXILIARY VECTOR. */ /* RA GS(NF) AUXILIARY VECTOR. */ /* RA XM(NF*MF) ARRAY CONTAINING INCREMENTS OF VARIABLES. */ /* RA GM(NF*MF) ARRAY CONTAINING INCREMENTS OF GRADIENTS. */ /* RA U1(MF) AUXILIARY VECTOR. */ /* RA U2(MF) AUXILIARY VECTOR. */ /* RI XMAX MAXIMUM STEPSIZE. */ /* RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. */ /* RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. */ /* RI TOLB TOLERANCE FOR THE FUNCTION VALUE. */ /* RI TOLG TOLERANCE FOR THE GRADIENT NORM. */ /* RI MINF_EST ESTIMATION OF THE MINIMUM FUNCTION VALUE. */ /* RO GMAX MAXIMUM PARTIAL DERIVATIVE. */ /* RO F VALUE OF THE OBJECTIVE FUNCTION. */ /* II MIT MAXIMUM NUMBER OF ITERATIONS. */ /* II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. */ /* II MFG MAXIMUM NUMBER OF GRADIENT EVALUATIONS. */ /* II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. */ /* IEST=1-MINIMUM IS ESTIMATED BY THE VALUE MINF_EST. */ /* II MOS1 CHOICE OF RESTARTS AFTER A CONSTRAINT CHANGE. */ /* MOS1=1-RESTARTS ARE SUPPRESSED. MOS1=2-RESTARTS WITH */ /* STEEPEST DESCENT DIRECTIONS ARE USED. */ /* II MOS1 CHOICE OF DIRECTION VECTORS AFTER RESTARTS. MOS1=1-THE */ /* NEWTON DIRECTIONS ARE USED. MOS1=2-THE STEEPEST DESCENT */ /* DIRECTIONS ARE USED. */ /* II MOS2 CHOICE OF PRECONDITIONING STRATEGY. MOS2=1-PRECONDITIONING */ /* IS NOT USED. MOS2=2-PRECONDITIONING BY THE LIMITED MEMORY */ /* BFGS METHOD IS USED. */ /* II MF THE NUMBER OF LIMITED-MEMORY VARIABLE METRIC UPDATES */ /* IN EACH ITERATION (THEY USE 2*MF STORED VECTORS). */ /* IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. */ /* ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN */ /* MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN */ /* MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. */ /* ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. */ /* ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. */ /* ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, */ /* BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. */ /* ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. */ /* ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. */ /* VARIABLES IN COMMON /STAT/ (STATISTICS) : */ /* IO NRES NUMBER OF RESTARTS. */ /* IO NDEC NUMBER OF MATRIX DECOMPOSITION. */ /* IO NIN NUMBER OF INNER ITERATIONS. */ /* IO NIT NUMBER OF ITERATIONS. */ /* IO NFV NUMBER OF FUNCTION EVALUATIONS. */ /* IO NFG NUMBER OF GRADIENT EVALUATIONS. */ /* IO NFH NUMBER OF HESSIAN EVALUATIONS. */ /* SUBPROGRAMS USED : */ /* S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. */ /* S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. */ /* S PYADC0 ADDITION OF A BOX CONSTRAINT. */ /* S PYFUT1 TEST ON TERMINATION. */ /* S PYRMC0 DELETION OF A BOX CONSTRAINT. */ /* S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC */ /* UPDATE. */ /* S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. */ /* S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. */ /* S MXDRCB BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION */ /* OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. */ /* S MXDRCF FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION */ /* OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. */ /* S MXDRSU SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. */ /* SHIFT OF ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN */ /* THE LIMITED MEMORY BFGS METHOD. */ /* S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. */ /* RF MXUDOT DOT PRODUCT OF TWO VECTORS. */ /* S MXVNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. */ /* S MXVCOP COPYING OF A VECTOR. */ /* S MXVSCL SCALING OF A VECTOR. */ /* S MXVSET INITIATINON OF A VECTOR. */ /* S MXVDIF DIFFERENCE OF TWO VECTORS. */ /* EXTERNAL SUBROUTINES : */ /* SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS */ /* THE VALUE OF THE OBJECTIVE FUNCTION. */ /* SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER */ /* OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) */ /* IS THE GRADIENT OF THE OBJECTIVE FUNCTION. */ /* -- OBJ and DOBJ are replaced by a single function, objgrad, in NLopt */ /* METHOD : */ /* LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG */ /* RECURRENCES. */ static void pnet_(int *nf, int *nb, double *x, int * ix, double *xl, double *xu, double *gf, double *gn, double *s, double *xo, double *go, double *xs, double *gs, double *xm, double *gm, double *u1, double *u2, double *xmax, double *tolx, double *tolf, double *tolb, double *tolg, nlopt_stopping *stop, double *minf_est, double * gmax, double *f, int *mit, int *mfv, int *mfg, int *iest, int *mos1, int *mos2, int *mf, int *iterm, stat_common *stat_1, nlopt_func objgrad, void *objgrad_data) { /* System generated locals */ int i__1; double d__1, d__2; /* Builtin functions */ /* Local variables */ double a = 0.0, b = 0.0; int i__, n; double p, r__; int kd, ld; double fo, fp, po, pp, ro, rp; int mx, kbf; double alf; double par; int mes, kit; double rho, eps; int mmx; double alf1, alf2, eta0, eta9, par1, par2; double rho1, rho2, eps8, eps9; int mred, iold, nred; double maxf, dmax__; int xstop = 0; int inew; double told; int ites; double rmin, rmax, umax, tolp, tols; int isys; int ires1, ires2; int iterd, mtesf, ntesf; double gnorm; int iters, irest, inits, kters, maxst; double snorm; int mtesx, ntesx; ps1l01_state state; (void) tolb; /* INITIATION */ /* Parameter adjustments */ --u2; --u1; --gm; --xm; --gs; --xs; --go; --xo; --s; --gn; --gf; --xu; --xl; --ix; --x; /* Function Body */ kbf = 0; if (*nb > 0) { kbf = 2; } stat_1->nres = 0; stat_1->ndec = 0; stat_1->nin = 0; stat_1->nit = 0; stat_1->nfg = 0; stat_1->nfh = 0; isys = 0; ites = 1; mtesx = 2; mtesf = 2; inits = 2; *iterm = 0; iterd = 0; iters = 2; kters = 3; irest = 0; ires1 = 999; ires2 = 0; mred = 10; mes = 4; eps = .8; eta0 = 1e-15; eta9 = 1e120; eps8 = 1.; eps9 = 1e-8; alf1 = 1e-10; alf2 = 1e10; rmax = eta9; dmax__ = eta9; maxf = 1e20; if (*iest <= 0) { *minf_est = -HUGE_VAL; /* changed from -1e60 by SGJ */ } if (*iest > 0) { *iest = 1; } if (*xmax <= 0.) { *xmax = 1e16; } if (*tolx <= 0.) { *tolx = 1e-16; } if (*tolf <= 0.) { *tolf = 1e-14; } if (*tolg <= 0.) { *tolg = 1e-8; /* SGJ: was 1e-6, but this sometimes stops too soon */ } #if 0 /* removed by SGJ: this check prevented us from using minf_max <= 0, which doesn't make sense. Instead, if you don't want to have a lower limit, you should set minf_max = -HUGE_VAL */ if (*tolb <= 0.) { *tolb = *minf_est + 1e-16; } #endif told = 1e-4; tols = 1e-4; tolp = .9; /* changed by SGJ: default is no limit (INT_MAX) on # iterations/fevals */ if (*mit <= 0) { *mit = INT_MAX; } if (*mfv <= 0) { *mfv = INT_MAX; } if (*mfg <= 0) { *mfg = INT_MAX; } if (*mos1 <= 0) { *mos1 = 1; } if (*mos2 <= 0) { *mos2 = 1; } kd = 1; ld = -1; kit = -(ires1 * *nf + ires2); fo = *minf_est; /* INITIAL OPERATIONS WITH SIMPLE BOUNDS */ if (kbf > 0) { i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { if ((ix[i__] == 3 || ix[i__] == 4) && xu[i__] <= xl[i__]) { xu[i__] = xl[i__]; ix[i__] = 5; } else if (ix[i__] == 5 || ix[i__] == 6) { xl[i__] = x[i__]; xu[i__] = x[i__]; ix[i__] = 5; } /* L2: */ } luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); } *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++(*stop->nevals_p); ++stat_1->nfg; if (nlopt_stop_time(stop)) { *iterm = 100; goto L11080; } ld = kd; L11020: luksan_pytrcg__(nf, nf, &ix[1], &gf[1], &umax, gmax, &kbf, &iold); luksan_mxvcop__(nf, &gf[1], &gn[1]); luksan_pyfut1__(nf, f, &fo, &umax, gmax, xstop, stop, tolg, &kd, &stat_1->nit, &kit, mit, &stat_1->nfg, mfg, & ntesx, &mtesx, &ntesf, &mtesf, &ites, &ires1, &ires2, &irest, & iters, iterm); if (*iterm != 0) { goto L11080; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11080; } if (kbf > 0) { luksan_pyrmc0__(nf, &n, &ix[1], &gn[1], &eps8, &umax, gmax, &rmax, & iold, &irest); if (umax > eps8 * *gmax) { irest = MAX2(irest,1); } } luksan_mxvcop__(nf, &x[1], &xo[1]); L11040: /* DIRECTION DETERMINATION */ if (irest != 0) { if (kit < stat_1->nit) { mx = 0; ++stat_1->nres; kit = stat_1->nit; } else { *iterm = -10; if (iters < 0) { *iterm = iters - 5; } goto L11080; } if (*mos1 > 1) { luksan_mxvneg__(nf, &gn[1], &s[1]); gnorm = sqrt(luksan_mxudot__(nf, &gn[1], &gn[1], &ix[1], &kbf)); snorm = gnorm; goto L12560; } } rho1 = luksan_mxudot__(nf, &gn[1], &gn[1], &ix[1], &kbf); gnorm = sqrt(rho1); /* Computing MIN */ d__1 = eps, d__2 = sqrt(gnorm); par = MIN2(d__1,d__2); if (par > .01) { /* Computing MIN */ d__1 = par, d__2 = 1. / (double) stat_1->nit; par = MIN2(d__1,d__2); } par *= par; /* CG INITIATION */ rho = rho1; snorm = 0.; luksan_mxvset__(nf, &c_b7, &s[1]); luksan_mxvneg__(nf, &gn[1], &gs[1]); luksan_mxvcop__(nf, &gs[1], &xs[1]); if (*mos2 > 1) { if (mx == 0) { b = 0.; } else { b = luksan_mxudot__(nf, &xm[1], &gm[1], &ix[1], &kbf); } if (b > 0.) { u1[1] = 1. / b; luksan_mxdrcb__(nf, &mx, &xm[1], &gm[1], &u1[1], &u2[1], &xs[1], & ix[1], &kbf); a = luksan_mxudot__(nf, &gm[1], &gm[1], &ix[1], &kbf); if (a > 0.) { d__1 = b / a; luksan_mxvscl__(nf, &d__1, &xs[1], &xs[1]); } luksan_mxdrcf__(nf, &mx, &xm[1], &gm[1], &u1[1], &u2[1], &xs[1], & ix[1], &kbf); } } rho = luksan_mxudot__(nf, &gs[1], &xs[1], &ix[1], &kbf); /* SIG=RHO */ mmx = *nf + 3; nred = 0; L12520: ++nred; if (nred > mmx) { goto L12550; } fo = *f; pp = sqrt(eta0 / luksan_mxudot__(nf, &xs[1], &xs[1], &ix[1], &kbf)); ld = 0; luksan_mxudir__(nf, &pp, &xs[1], &xo[1], &x[1], &ix[1], &kbf); objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; ld = kd; luksan_mxvdif__(nf, &gf[1], &gn[1], &go[1]); *f = fo; d__1 = 1. / pp; luksan_mxvscl__(nf, &d__1, &go[1], &go[1]); alf = luksan_mxudot__(nf, &xs[1], &go[1], &ix[1], &kbf); if (alf <= 1. / eta9) { /* IF (ALF.LE.1.0D-8*SIG) THEN */ /* CG FAILS (THE MATRIX IS NOT POSITIVE DEFINITE) */ if (nred == 1) { luksan_mxvneg__(nf, &gn[1], &s[1]); snorm = gnorm; } iterd = 0; goto L12560; } else { iterd = 2; } /* CG STEP */ alf = rho / alf; luksan_mxudir__(nf, &alf, &xs[1], &s[1], &s[1], &ix[1], &kbf); d__1 = -alf; luksan_mxudir__(nf, &d__1, &go[1], &gs[1], &gs[1], &ix[1], &kbf); rho2 = luksan_mxudot__(nf, &gs[1], &gs[1], &ix[1], &kbf); snorm = sqrt(luksan_mxudot__(nf, &s[1], &s[1], &ix[1], &kbf)); if (rho2 <= par * rho1) { goto L12560; } if (nred >= mmx) { goto L12550; } if (*mos2 > 1) { if (b > 0.) { luksan_mxvcop__(nf, &gs[1], &go[1]); luksan_mxdrcb__(nf, &mx, &xm[1], &gm[1], &u1[1], &u2[1], &go[1], & ix[1], &kbf); if (a > 0.) { d__1 = b / a; luksan_mxvscl__(nf, &d__1, &go[1], &go[1]); } luksan_mxdrcf__(nf, &mx, &xm[1], &gm[1], &u1[1], &u2[1], &go[1], & ix[1], &kbf); rho2 = luksan_mxudot__(nf, &gs[1], &go[1], &ix[1], &kbf); alf = rho2 / rho; luksan_mxudir__(nf, &alf, &xs[1], &go[1], &xs[1], &ix[1], &kbf); } else { alf = rho2 / rho; luksan_mxudir__(nf, &alf, &xs[1], &gs[1], &xs[1], &ix[1], &kbf); } } else { alf = rho2 / rho; luksan_mxudir__(nf, &alf, &xs[1], &gs[1], &xs[1], &ix[1], &kbf); } rho = rho2; /* SIG=RHO2+ALF*ALF*SIG */ goto L12520; L12550: /* AN INEXACT SOLUTION IS OBTAINED */ L12560: /* ------------------------------ */ /* END OF DIRECTION DETERMINATION */ /* ------------------------------ */ luksan_mxvcop__(nf, &xo[1], &x[1]); luksan_mxvcop__(nf, &gn[1], &gf[1]); if (kd > 0) { p = luksan_mxudot__(nf, &gn[1], &s[1], &ix[1], &kbf); } if (iterd < 0) { *iterm = iterd; } else { /* TEST ON DESCENT DIRECTION */ if (snorm <= 0.) { irest = MAX2(irest,1); } else if (p + told * gnorm * snorm <= 0.) { irest = 0; } else { /* UNIFORM DESCENT CRITERION */ irest = MAX2(irest,1); } if (irest == 0) { /* PREPARATION OF LINE SEARCH */ nred = 0; rmin = alf1 * gnorm / snorm; /* Computing MIN */ d__1 = alf2 * gnorm / snorm, d__2 = *xmax / snorm; rmax = MIN2(d__1,d__2); } } ld = kd; if (*iterm != 0) { goto L11080; } if (nlopt_stop_time(stop)) { *iterm = 100; goto L11080; } if (irest != 0) { goto L11040; } luksan_pytrcs__(nf, &x[1], &ix[1], &xo[1], &xl[1], &xu[1], &gf[1], &go[1], &s[1], &ro, &fp, &fo, f, &po, &p, &rmax, &eta9, &kbf); if (rmax == 0.) { goto L11075; } L11060: luksan_ps1l01__(&r__, &rp, f, &fo, &fp, &p, &po, &pp, minf_est, &maxf, &rmin, &rmax, &tols, &tolp, &par1, &par2, &kd, &ld, &stat_1->nit, &kit, & nred, &mred, &maxst, iest, &inits, &iters, &kters, &mes, &isys, &state); if (isys == 0) { goto L11064; } luksan_mxudir__(nf, &r__, &s[1], &xo[1], &x[1], &ix[1], &kbf); luksan_pcbs04__(nf, &x[1], &ix[1], &xl[1], &xu[1], &eps9, &kbf); *f = objgrad(*nf, &x[1], &gf[1], objgrad_data); ++*(stop->nevals_p); ++stat_1->nfg; ld = kd; p = luksan_mxudot__(nf, &gf[1], &s[1], &ix[1], &kbf); goto L11060; L11064: if (iters <= 0) { r__ = 0.; *f = fo; p = po; luksan_mxvcop__(nf, &xo[1], &x[1]); luksan_mxvcop__(nf, &go[1], &gf[1]); irest = MAX2(irest,1); ld = kd; goto L11040; } luksan_pytrcd__(nf, &x[1], &ix[1], &xo[1], &gf[1], &go[1], &r__, f, &fo, & p, &po, &dmax__, &kbf, &kd, &ld, &iters); xstop = nlopt_stop_dx(stop, &x[1], &xo[1]); if (*mos2 > 1) { /* Computing MIN */ i__1 = mx + 1; mx = MIN2(i__1,*mf); luksan_mxdrsu__(nf, &mx, &xm[1], &gm[1], &u1[1]); luksan_mxvcop__(nf, &xo[1], &xm[1]); luksan_mxvcop__(nf, &go[1], &gm[1]); } L11075: if (kbf > 0) { luksan_pyadc0__(nf, &n, &x[1], &ix[1], &xl[1], &xu[1], &inew); if (inew > 0) { irest = MAX2(irest,1); } } goto L11020; L11080: return; } /* pnet_ */ /* NLopt wrapper around pnet_, handling dynamic allocation etc. */ nlopt_result luksan_pnet(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, int mf, /* subspace dimension (0 for default) */ int mos1, int mos2, /* 1 or 2 */ double tolg) /* gradient tolerance */ { int i, *ix, nb = 1; double *work; double *xl, *xu, *gf, *gn, *s, *xo, *go, *xs, *gs, *xm, *gm, *u1, *u2; double gmax, minf_est; double xmax = 0; /* no maximum */ int iest = 0; /* we have no estimate of min function value */ int mit = 0, mfg = 0; /* default no limit on #iterations */ int mfv = stop->maxeval; stat_common stat; int iterm; ix = (int*) malloc(sizeof(int) * n); if (!ix) return NLOPT_OUT_OF_MEMORY; if (mf <= 0) { mf = MAX2(MEMAVAIL/n, 10); if (stop->maxeval > 0 && stop->maxeval <= mf) mf = MAX2(stop->maxeval, 1); } retry_alloc: work = (double*) malloc(sizeof(double) * (n * 9 + MAX2(n,n*mf)*2 + MAX2(n,mf)*2)); if (!work) { if (mf > 0) { mf = 0; /* allocate minimal memory */ goto retry_alloc; } free(ix); return NLOPT_OUT_OF_MEMORY; } xl = work; xu = xl + n; gf = xu + n; gn = gf + n; s = gn + n; xo = s + n; go = xo + n; xs = go + n; gs = xs + n; xm = gs + n; gm = xm + MAX2(n*mf,n); u1 = gm + MAX2(n*mf,n); u2 = u1 + MAX2(n,mf); for (i = 0; i < n; ++i) { int lbu = lb[i] <= -0.99 * HUGE_VAL; /* lb unbounded */ int ubu = ub[i] >= 0.99 * HUGE_VAL; /* ub unbounded */ ix[i] = lbu ? (ubu ? 0 : 2) : (ubu ? 1 : (lb[i] == ub[i] ? 5 : 3)); xl[i] = lb[i]; xu[i] = ub[i]; } /* ? xo does not seem to be initialized in the original Fortran code, but it is used upon input to pnet if mf > 0 ... perhaps ALLOCATE initializes arrays to zero by default? */ memset(xo, 0, sizeof(double) * MAX2(n,n*mf)); pnet_(&n, &nb, x, ix, xl, xu, gf, gn, s, xo, go, xs, gs, xm, gm, u1, u2, &xmax, /* fixme: pass tol_rel and tol_abs and use NLopt check */ &stop->xtol_rel, &stop->ftol_rel, &stop->minf_max, &tolg, stop, &minf_est, &gmax, minf, &mit, &mfv, &mfg, &iest, &mos1, &mos2, &mf, &iterm, &stat, f, f_data); free(work); free(ix); switch (iterm) { case 1: return NLOPT_XTOL_REACHED; case 2: return NLOPT_FTOL_REACHED; case 3: return NLOPT_MINF_MAX_REACHED; case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; case 100: return NLOPT_MAXTIME_REACHED; case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } stevengj-nlopt-88c424d/src/algs/luksan/pnet.for000066400000000000000000000562101521061417600215320ustar00rootroot00000000000000************************************************************************ * SUBROUTINE PNETU ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE UNCONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) MAXIMUM NUMBER OF GRADIENT EVALUATIONS. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) CHOICE OF DIRECTION VECTORS AFTER RESTARTS. * IPAR(5)=1-THE NEWTON DIRECTIONS ARE USED. IPAR(5)=2-THE * STEEPEST DESCENT DIRECTIONS ARE USED. * IPAR(6) CHOICE OF PRECONDITIONING STRATEGY. * IPAR(6)=1-PRECONDITIONING IS NOT USED. * IPAR(6)=2-PRECONDITIONING BY THE LIMITED MEMORY BFGS METHOD * IS USED. * IPAR(7) THE NUMBER OF LIMITED-MEMORY VARIABLE METRIC UPDATES * IN EACH ITERATION (THEY USE 2*MF STORED VECTORS). * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PNET LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PNETU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LGN,LS,LXO,LGO,LXS,LGS,LXM,LGM,LU1,LU2 INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(8*NF+2*NF*MF+2*MF)) NB=0 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LGN=LGF+NF LS=LGN+NF LXO=LS+NF LGO=LXO+NF LXS=LGO+NF LGS=LXS+NF LXM=LGS+NF LGM=LXM+NF*MF LU1=LGM+NF*MF LU2=LU1+MF CALL PNET(NF,NB,X,IPAR,RA,RA,RA(LGF),RA(LGN),RA(LS),RA(LXO), & RA(LGO),RA(LXS),RA(LGS),RA(LXM),RA(LGM),RA(LU1),RA(LU2),RPAR(1), & RPAR(2),RPAR(3),RPAR(4),RPAR(5),RPAR(6),GMAX,F,IPAR(1),IPAR(2), & IPAR(3),IPAR(4),IPAR(5),IPAR(6),MF,IPRNT,ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PNETS ALL SYSTEMS 97/01/22 * PURPOSE : * EASY TO USE SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * II IPAR(7) INTEGER PAREMETERS: * IPAR(1) MAXIMUM NUMBER OF ITERATIONS. * IPAR(2) MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * IPAR(3) MAXIMUM NUMBER OF GRADIENT EVALUATIONS. * IPAR(4) ESTIMATION INDICATOR. IPAR(4)=0-MINIMUM IS NOT * ESTIMATED. IPAR(4)=1-MINIMUM IS ESTIMATED BY THE VALUE * RPAR(6). * IPAR(5) CHOICE OF DIRECTION VECTORS AFTER RESTARTS. * IPAR(5)=1-THE NEWTON DIRECTIONS ARE USED. IPAR(5)=2-THE * STEEPEST DESCENT DIRECTIONS ARE USED. * IPAR(6) CHOICE OF PRECONDITIONING STRATEGY. * IPAR(6)=1-PRECONDITIONING IS NOT USED. * IPAR(6)=2-PRECONDITIONING BY THE LIMITED MEMORY BFGS METHOD * IS USED. * IPAR(7) THE NUMBER OF LIMITED-MEMORY VARIABLE METRIC UPDATES * IN EACH ITERATION (THEY USE 2*MF STORED VECTORS). * RI RPAR(9) REAL PARAMETERS: * RPAR(1) MAXIMUM STEPSIZE. * RPAR(2) TOLERANCE FOR THE CHANGE OF VARIABLES. * RPAR(3) TOLERANCE FOR THE CHANGE OF FUNCTION VALUES. * RPAR(4) TOLERANCE FOR THE FUNCTION FALUE. * RPAR(5) TOLERANCE FOR THE GRADIENT NORM. * RPAR(6) ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RPAR(7) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RPAR(8) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RPAR(9) THIS PARAMETER IS NOT USED IN THE SUBROUTINE PNET. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PNET LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * SUBROUTINE PNETS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) INTEGER NF,IX(*),IPAR(7),IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),RPAR(9),F,GMAX INTEGER MF,NB,LGF,LGN,LS,LXO,LGO,LXS,LGS,LXM,LGM,LU1,LU2 INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH DOUBLE PRECISION RA(:) ALLOCATABLE RA MF=IPAR(7) IF (MF.LE.0) MF=10 ALLOCATE (RA(8*NF+2*NF*MF+2*MF)) NB=1 * * POINTERS FOR AUXILIARY ARRAYS * LGF=1 LGN=LGF+NF LS=LGN+NF LXO=LS+NF LGO=LXO+NF LXS=LGO+NF LGS=LXS+NF LXM=LGS+NF LGM=LXM+NF*MF LU1=LGM+NF*MF LU2=LU1+MF CALL PNET(NF,NB,X,IX,XL,XU,RA(LGF),RA(LGN),RA(LS),RA(LXO), & RA(LGO),RA(LXS),RA(LGS),RA(LXM),RA(LGM),RA(LU1),RA(LU2),RPAR(1), & RPAR(2),RPAR(3),RPAR(4),RPAR(5),RPAR(6),GMAX,F,IPAR(1),IPAR(2), & IPAR(3),IPAR(4),IPAR(5),IPAR(6),MF,IPRNT,ITERM) DEALLOCATE (RA) RETURN END ************************************************************************ * SUBROUTINE PNET ALL SYSTEMS 01/09/22 * PURPOSE : * GENERAL SUBROUTINE FOR LARGE-SCALE BOX CONSTRAINED MINIMIZATION THAT * USE THE LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II NB CHOICE OF SIMPLE BOUNDS. NB=0-SIMPLE BOUNDS SUPPRESSED. * NB>0-SIMPLE BOUNDS ACCEPTED. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOVER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RO GF(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA GN(NF) OLD GRADIENT OF THE OBJECTIVE FUNCTION. * RO S(NF) DIRECTION VECTOR. * RA XO(NF) ARRAY CONTAINING INCREMENTS OF VARIABLES. * RA GO(NF) ARRAY CONTAINING INCREMENTS OF GRADIENTS. * RA XS(NF) AUXILIARY VECTOR. * RA GS(NF) AUXILIARY VECTOR. * RA XM(NF*MF) ARRAY CONTAINING INCREMENTS OF VARIABLES. * RA GM(NF*MF) ARRAY CONTAINING INCREMENTS OF GRADIENTS. * RA U1(MF) AUXILIARY VECTOR. * RA U2(MF) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RI TOLX TOLERANCE FOR CHANGE OF VARIABLES. * RI TOLF TOLERANCE FOR CHANGE OF FUNCTION VALUES. * RI TOLB TOLERANCE FOR THE FUNCTION VALUE. * RI TOLG TOLERANCE FOR THE GRADIENT NORM. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RO GMAX MAXIMUM PARTIAL DERIVATIVE. * RO F VALUE OF THE OBJECTIVE FUNCTION. * II MIT MAXIMUM NUMBER OF ITERATIONS. * II MFV MAXIMUM NUMBER OF FUNCTION EVALUATIONS. * II MFG MAXIMUM NUMBER OF GRADIENT EVALUATIONS. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * II MOS1 CHOICE OF RESTARTS AFTER A CONSTRAINT CHANGE. * MOS1=1-RESTARTS ARE SUPPRESSED. MOS1=2-RESTARTS WITH * STEEPEST DESCENT DIRECTIONS ARE USED. * II MOS1 CHOICE OF DIRECTION VECTORS AFTER RESTARTS. MOS1=1-THE * NEWTON DIRECTIONS ARE USED. MOS1=2-THE STEEPEST DESCENT * DIRECTIONS ARE USED. * II MOS2 CHOICE OF PRECONDITIONING STRATEGY. MOS2=1-PRECONDITIONING * IS NOT USED. MOS2=2-PRECONDITIONING BY THE LIMITED MEMORY * BFGS METHOD IS USED. * II MF THE NUMBER OF LIMITED-MEMORY VARIABLE METRIC UPDATES * IN EACH ITERATION (THEY USE 2*MF STORED VECTORS). * II IPRNT PRINT SPECIFICATION. IPRNT=0-NO PRINT. * ABS(IPRNT)=1-PRINT OF FINAL RESULTS. * ABS(IPRNT)=2-PRINT OF FINAL RESULTS AND ITERATIONS. * IPRNT>0-BASIC FINAL RESULTS. IPRNT<0-EXTENDED FINAL * RESULTS. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUEBT ITERATIONS. * ITERM=3-IF F IS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX IS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITION. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PCBS04 ELIMINATION OF BOX CONSTRAINT VIOLATIONS. * S PS1L01 STEPSIZE SELECTION USING LINE SEARCH. * S PYADC0 ADDITION OF A BOX CONSTRAINT. * S PYFUT1 TEST ON TERMINATION. * S PYRMC0 DELETION OF A BOX CONSTRAINT. * S PYTRCD COMPUTATION OF PROJECTED DIFFERENCES FOR THE VARIABLE METRIC * UPDATE. * S PYTRCG COMPUTATION OF THE PROJECTED GRADIENT. * S PYTRCS COMPUTATION OF THE PROJECTED DIRECTION VECTOR. * S MXDRCB BACKWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION * OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * S MXDRCF FORWARD PART OF THE STRANG FORMULA FOR PREMULTIPLICATION * OF THE VECTOR X BY AN IMPLICIT BFGS UPDATE. * S MXDRSU SHIFT OF COLUMNS OF THE RECTANGULAR MATRICES A AND B. * SHIFT OF ELEMENTS OF THE VECTOR U. THESE SHIFTS ARE USED IN * THE LIMITED MEMORY BFGS METHOD. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXVNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVCOP COPYING OF A VECTOR. * S MXVSCL SCALING OF A VECTOR. * S MXVSET INITIATINON OF A VECTOR. * S MXVDIF DIFFERENCE OF TWO VECTORS. * * EXTERNAL SUBROUTINES : * SE OBJ COMPUTATION OF THE VALUE OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL OBJ(NF,X,FF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND FF IS * THE VALUE OF THE OBJECTIVE FUNCTION. * SE DOBJ COMPUTATION OF THE GRADIENT OF THE OBJECTIVE FUNCTION. * CALLING SEQUENCE: CALL DOBJ(NF,X,GF) WHERE NF IS THE NUMBER * OF VARIABLES, X(NF) IS THE VECTOR OF VARIABLES AND GF(NF) * IS THE GRADIENT OF THE OBJECTIVE FUNCTION. * * METHOD : * LIMITED MEMORY VARIABLE METRIC METHOD BASED ON THE STRANG * RECURRENCES. * SUBROUTINE PNET(NF,NB,X,IX,XL,XU,GF,GN,S,XO,GO,XS,GS,XM,GM,U1,U2, & XMAX,TOLX,TOLF,TOLB,TOLG,FMIN,GMAX,F,MIT,MFV,MFG,IEST,MOS1,MOS2, & MF,IPRNT,ITERM) INTEGER NF,NB,IX(*),MIT,MFV,MFG,IEST,MOS1,MOS2,MF,IPRNT,ITERM DOUBLE PRECISION X(*),XL(*),XU(*),GF(*),GN(*),S(*),XO(*),GO(*), & XS(*),GS(*),XM(*),GM(*),U1(*),U2(*),XMAX,TOLX,TOLF,TOLG,TOLB, & FMIN,GMAX,F INTEGER ITERD,ITERS,KD,LD,NTESX,NTESF,MTESX,MTESF,MRED,KIT, & IREST,KBF,MES,MES1,MES2,MES3,MAXST,ISYS,ITES,INITS,KTERS, & IRES1,IRES2,INEW,IOLD,I,N,NRED,MX,MMX DOUBLE PRECISION R,RO,RP,FO,FP,P,PO,PP,GNORM,SNORM,RMIN,RMAX, & UMAX,FMAX,DMAX,ETA0,ETA9,EPS8,EPS9,ALF,ALF1,ALF2,RHO,RHO1,RHO2, & PAR,PAR1,PAR2,A,B,TOLD,TOLS,TOLP,EPS DOUBLE PRECISION MXUDOT INTEGER NRES,NDEC,NIN,NIT,NFV,NFG,NFH COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH IF (ABS(IPRNT).GT.1) WRITE(6,'(1X,''ENTRY TO PNET :'')') * * INITIATION * KBF=0 IF (NB.GT.0) KBF=2 NRES=0 NDEC=0 NIN=0 NIT=0 NFV=0 NFG=0 NFH=0 ISYS=0 ITES=1 MTESX=2 MTESF=2 INITS=2 ITERM=0 ITERD=0 ITERS=2 KTERS=3 IREST=0 IRES1=999 IRES2=0 MRED=10 MES=4 MES1=2 MES2=2 MES3=2 EPS=0.80D 0 ETA0=1.0D-15 ETA9=1.0D 120 EPS8=1.0D 0 EPS9=1.0D-8 ALF1=1.0D-10 ALF2=1.0D 10 RMAX=ETA9 DMAX=ETA9 FMAX=1.0D 20 IF (IEST.LE.0) FMIN=-1.0D 60 IF (IEST.GT.0) IEST=1 IF (XMAX.LE.0.0D 0) XMAX=1.0D 16 IF (TOLX.LE.0.0D 0) TOLX=1.0D-16 IF (TOLF.LE.0.0D 0) TOLF=1.0D-14 IF (TOLG.LE.0.0D 0) TOLG=1.0D-6 IF (TOLB.LE.0.0D 0) TOLB=FMIN+1.0D-16 TOLD=1.0D-4 TOLS=1.0D-4 TOLP=0.9D 0 IF (MIT.LE.0) MIT=5000 IF (MFV.LE.0) MFV=5000 IF (MFG.LE.0) MFG=30000 IF (MOS1.LE.0) MOS1=1 IF (MOS2.LE.0) MOS2=1 KD= 1 LD=-1 KIT=-(IRES1*NF+IRES2) FO=FMIN * * INITIAL OPERATIONS WITH SIMPLE BOUNDS * IF (KBF.GT.0) THEN DO 2 I = 1,NF IF ((IX(I).EQ.3.OR.IX(I).EQ.4) .AND. XU(I).LE.XL(I)) THEN XU(I) = XL(I) IX(I) = 5 ELSE IF (IX(I).EQ.5 .OR. IX(I).EQ.6) THEN XL(I) = X(I) XU(I) = X(I) IX(I) = 5 END IF 2 CONTINUE CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL PYADC0(NF,N,X,IX,XL,XU,INEW) END IF CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 LD=KD 11020 CONTINUE CALL PYTRCG(NF,NF,IX,GF,UMAX,GMAX,KBF,IOLD) CALL MXVCOP(NF,GF,GN) IF (ABS(IPRNT).GT.1) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3)') NIT,NFV,NFG,F,GMAX CALL PYFUT1(NF,F,FO,UMAX,GMAX,DMAX,TOLX,TOLF,TOLB,TOLG,KD,NIT,KIT, & MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF,ITES,IRES1,IRES2, & IREST,ITERS,ITERM) IF (ITERM.NE.0) GO TO 11080 IF (KBF.GT.0) THEN CALL PYRMC0(NF,N,IX,GN,EPS8,UMAX,GMAX,RMAX,IOLD,IREST) IF (UMAX.GT.EPS8*GMAX) IREST=MAX(IREST,1) END IF CALL MXVCOP(NF,X,XO) 11040 CONTINUE * * DIRECTION DETERMINATION * IF (IREST.NE.0) THEN IF (KIT.LT.NIT) THEN MX=0 NRES=NRES+1 KIT = NIT ELSE ITERM=-10 IF (ITERS.LT.0) ITERM=ITERS-5 GO TO 11080 END IF IF (MOS1.GT.1) THEN CALL MXVNEG(NF,GN,S) GNORM=SQRT(MXUDOT(NF,GN,GN,IX,KBF)) SNORM=GNORM GO TO 12560 END IF END IF RHO1=MXUDOT(NF,GN,GN,IX,KBF) GNORM=SQRT(RHO1) PAR=MIN(EPS,SQRT(GNORM)) IF (PAR.GT.1.0D 1*1.0D-3) THEN PAR=MIN(PAR,1.0D 0/DBLE(NIT)) END IF PAR=PAR*PAR * * CG INITIATION * RHO=RHO1 SNORM=0.0D 0 CALL MXVSET(NF,0.0D 0,S) CALL MXVNEG(NF,GN,GS) CALL MXVCOP(NF,GS,XS) IF (MOS2.GT.1) THEN IF (MX.EQ.0) THEN B=0.0D 0 ELSE B=MXUDOT(NF,XM,GM,IX,KBF) ENDIF IF (B.GT.0.0D 0) THEN U1(1)=1.0D 0/B CALL MXDRCB(NF,MX,XM,GM,U1,U2,XS,IX,KBF) A=MXUDOT(NF,GM,GM,IX,KBF) IF (A.GT.0.0D 0) CALL MXVSCL(NF,B/A,XS,XS) CALL MXDRCF(NF,MX,XM,GM,U1,U2,XS,IX,KBF) END IF END IF RHO=MXUDOT(NF,GS,XS,IX,KBF) C SIG=RHO MMX=NF+3 NRED=0 12520 CONTINUE NRED=NRED+1 IF (NRED.GT.MMX) GO TO 12550 FO=F PP=SQRT(ETA0/MXUDOT(NF,XS,XS,IX,KBF)) LD=0 CALL MXUDIR(NF,PP,XS,XO,X,IX,KBF) CALL DOBJ(NF,X,GF) NFG=NFG+1 LD=KD CALL MXVDIF(NF,GF,GN,GO) F=FO CALL MXVSCL(NF,1.0D 0/PP,GO,GO) ALF=MXUDOT(NF,XS,GO,IX,KBF) IF (ALF.LE.1.0D 0/ETA9) THEN C IF (ALF.LE.1.0D-8*SIG) THEN * * CG FAILS (THE MATRIX IS NOT POSITIVE DEFINITE) * IF (NRED.EQ.1) THEN CALL MXVNEG(NF,GN,S) SNORM=GNORM END IF ITERD=0 GO TO 12560 ELSE ITERD=2 END IF * * CG STEP * ALF=RHO/ALF CALL MXUDIR(NF, ALF,XS,S,S,IX,KBF) CALL MXUDIR(NF,-ALF,GO,GS,GS,IX,KBF) RHO2=MXUDOT(NF,GS,GS,IX,KBF) SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) IF (RHO2.LE.PAR*RHO1) GO TO 12560 IF (NRED.GE.MMX) GO TO 12550 IF (MOS2.GT.1) THEN IF (B.GT.0.0D 0) THEN CALL MXVCOP(NF,GS,GO) CALL MXDRCB(NF,MX,XM,GM,U1,U2,GO,IX,KBF) IF (A.GT.0.0D 0) CALL MXVSCL(NF,B/A,GO,GO) CALL MXDRCF(NF,MX,XM,GM,U1,U2,GO,IX,KBF) RHO2=MXUDOT(NF,GS,GO,IX,KBF) ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XS,GO,XS,IX,KBF) ELSE ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XS,GS,XS,IX,KBF) END IF ELSE ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XS,GS,XS,IX,KBF) END IF RHO=RHO2 C SIG=RHO2+ALF*ALF*SIG GO TO 12520 12550 CONTINUE * * AN INEXACT SOLUTION IS OBTAINED * 12560 CONTINUE * * ------------------------------ * END OF DIRECTION DETERMINATION * ------------------------------ * CALL MXVCOP(NF,XO,X) CALL MXVCOP(NF,GN,GF) IF (KD.GT.0) P=MXUDOT(NF,GN,S,IX,KBF) IF (ITERD.LT.0) THEN ITERM=ITERD ELSE * * TEST ON DESCENT DIRECTION * IF (SNORM.LE.0.0D 0) THEN IREST=MAX(IREST,1) ELSE IF (P+TOLD*GNORM*SNORM.LE.0.0D 0) THEN IREST=0 ELSE * * UNIFORM DESCENT CRITERION * IREST=MAX(IREST,1) END IF IF (IREST.EQ.0) THEN * * PREPARATION OF LINE SEARCH * NRED = 0 RMIN=ALF1*GNORM/SNORM RMAX=MIN(ALF2*GNORM/SNORM,XMAX/SNORM) END IF END IF LD=KD IF (ITERM.NE.0) GO TO 11080 IF (IREST.NE.0) GO TO 11040 CALL PYTRCS(NF,X,IX,XO,XL,XU,GF,GO,S,RO,FP,FO,F,PO,P,RMAX,ETA9, & KBF) IF (RMAX.EQ.0.0D 0) GO TO 11075 11060 CONTINUE CALL PS1L01(R,RP,F,FO,FP,P,PO,PP,FMIN,FMAX,RMIN,RMAX,TOLS,TOLP, & PAR1,PAR2,KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST,INITS,ITERS,KTERS, & MES,ISYS) IF (ISYS.EQ.0) GO TO 11064 CALL MXUDIR(NF,R,S,XO,X,IX,KBF) CALL PCBS04(NF,X,IX,XL,XU,EPS9,KBF) CALL OBJ(NF,X,F) NFV=NFV+1 CALL DOBJ(NF,X,GF) NFG=NFG+1 LD=KD P=MXUDOT(NF,GF,S,IX,KBF) GO TO 11060 11064 CONTINUE IF (ITERS.LE.0) THEN R=0.0D 0 F=FO P=PO CALL MXVCOP(NF,XO,X) CALL MXVCOP(NF,GO,GF) IREST=MAX(IREST,1) LD=KD GO TO 11040 END IF CALL PYTRCD(NF,X,IX,XO,GF,GO,R,F,FO,P,PO,DMAX,KBF,KD,LD,ITERS) IF (MOS2.GT.1) THEN MX=MIN(MX+1,MF) CALL MXDRSU(NF,MX,XM,GM,U1) CALL MXVCOP(NF,XO,XM) CALL MXVCOP(NF,GO,GM) END IF 11075 CONTINUE IF (KBF.GT.0) THEN CALL PYADC0(NF,N,X,IX,XL,XU,INEW) IF (INEW.GT.0) IREST=MAX(IREST,1) END IF GO TO 11020 11080 CONTINUE IF (IPRNT.GT.1.OR.IPRNT.LT.0) & WRITE(6,'(1X,''EXIT FROM PNET :'')') IF (IPRNT.NE.0) & WRITE (6,'(1X,''NIT='',I5,2X,''NFV='',I5,2X,''NFG='',I5,2X, & ''F='', G16.9,2X,''G='',E10.3,2X,''ITERM='',I3)') NIT,NFV,NFG, & F,GMAX,ITERM IF (IPRNT.LT.0) & WRITE (6,'(1X,''X='',5(G14.7,1X):/(3X,5(G14.7,1X)))') & (X(I),I=1,NF) RETURN END stevengj-nlopt-88c424d/src/algs/luksan/pnet.txt000066400000000000000000000420151521061417600215610ustar00rootroot00000000000000*********************************************************************** * * * PNET - A LIMITED MEMORY VARIABLE METRIC ALGORITHM FOR * * LARGE-SCALE OPTIMIZATION. * * * *********************************************************************** 1. Introduction: ---------------- The double-precision FORTRAN 77 basic subroutine PNET is designed to find a close approximation to a local minimum of a nonlinear function F(X) with simple bounds on variables. Here X is a vector of NF variables and F(X) is a smooth function. We suppose that NF is large but the sparsity pattern of the Hessian matrix is not known (or the Hessian matrix is dense). Simple bounds are assumed in the form X(I) unbounded if IX(I) = 0, XL(I) <= X(I) if IX(I) = 1, X(I) <= XU(I) if IX(I) = 2, XL(I) <= X(I) <= XU(I) if IX(I) = 3, XL(I) = X(I) = XU(I) if IX(I) = 5, where 1 <= I <= NF. To simplify user's work, two additional easy to use subroutines are added. They call the basic general subroutine PNET: PNETU - unconstrained large-scale optimization, PNETS - large-scale optimization with simple bounds. All subroutines contain a description of formal parameters and extensive comments. Furthermore, two test programs TNETU and TNETS are included, which contain several test problems (see e.g. [2]). These test programs serve as examples for using the subroutines, verify their correctness and demonstrate their efficiency. In this short guide, we describe all subroutines which can be called from the user's program. A detailed description of the method is given in [1]. In the description of formal parameters, we introduce a type of the argument that specifies whether the argument must have a value defined on entry to the subroutine (I), whether it is a value which will be returned (O), or both (U), or whether it is an auxiliary value (A). Note that the arguments of the type I can be changed on output under some circumstances, especially if improper input values were given. Besides formal parameters, we can use a COMMON /STAT/ block containing statistical information. This block, used in each subroutine has the following form: COMMON /STAT/ NRES,NDEC,NIN,NIT,NFV,NFG,NFH The arguments have the following meaning: Argument Type Significance ---------------------------------------------------------------------- NRES O Positive INTEGER variable that indicates the number of restarts. NDEC O Positive INTEGER variable that indicates the number of matrix decompositions. NIN O Positive INTEGER variable that indicates the number of inner iterations (for solving linear systems). NIT O Positive INTEGER variable that indicates the number of iterations. NFV O Positive INTEGER variable that indicates the number of function evaluations. NFG O Positive INTEGER variable that specifies the number of gradient evaluations. NFH O Positive INTEGER variable that specifies the number of Hessian evaluations. 2. Subroutines PNETU, PNETS: ---------------------------- The calling sequences are CALL PNETU(NF,X,IPAR,RPAR,F,GMAX,IPRNT,ITERM) CALL PNETS(NF,X,IX,XL,XU,IPAR,RPAR,F,GMAX,IPRNT,ITERM) The arguments have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) U On input, DOUBLE PRECISION vector with the initial estimate to the solution. On output, the approximation to the minimum. IX(NF) I On input (significant only if NB>0) INTEGER vector containing the simple bounds types: IX(I)=0 - the variable X(I) is unbounded, IX(I)=1 - the lower bound X(I) >= XL(I), IX(I)=2 - the upper bound X(I) <= XU(I), IX(I)=3 - the two side bound XL(I) <= X(I) <= XU(I), IX(I)=5 - the variable X(I) is fixed (given by its initial estimate). XL(NF) I DOUBLE PRECISION vector with lower bounds for variables (significant only if NB>0). XU(NF) I DOUBLE PRECISION vector with upper bounds for variables (significant only if NB>0). IPAR(7) I INTEGER parameters: IPAR(1)=MIT, IPAR(2)=MFV, IPAR(3)=MFG, IPAR(4)=IEST, IPAR(5)=MOS1, IPAR(6)=MOS2, IPAR(7)=MF. Parameters MIT, MFV, MFG, IEST, MOS1, MOS2, MF are described in Section 3 together with other parameters of the subroutine PNET. RPAR(9) I DOUBLE PRECISION parameters: RPAR(1)=XMAX, RPAR(2)=TOLX, RPAR(3)=TOLF, RPAR(4)=TOLB, RPAR(5)=TOLG, RPAR(6)=FMIN, RPAR(7)-NONE, RPAR(6)-NONE, RPAR(9)-NONE. Parameters XMAX, TOLX, TOLF, TOLB, TOLG, FMIN are described in Section 3 together with other parameters of the subroutine PNET. F O DOUBLE PRECISION value of the objective function at the solution X. GMAX O DOUBLE PRECISION maximum absolute value of a partial derivative of the Lagrangian function. IPRNT I INTEGER variable that specifies PRINT: IPRNT= 0 - print is suppressed, IPRNT= 1 - basic print of final results, IPRNT=-1 - extended print of final results, IPRNT= 2 - basic print of intermediate and final results, IPRNT=-2 - extended print of intermediate and final results. ITERM O INTEGER variable that indicates the cause of termination: ITERM= 1 - if |X - XO| was less than or equal to TOLX in two subsequent iterations, ITERM= 2 - if |F - FO| was less than or equal to TOLF in two subsequent iterations, ITERM= 3 - if F is less than or equal to TOLB, ITERM= 4 - if GMAX is less than or equal to TOLG, ITERM= 6 - if termination criterion was not satisfied, but the solution is probably acceptable, ITERM=11 - if NIT exceeded MIT, ITERM=12 - if NFV exceeded MFV, ITERM=13 - if NFG exceeded MFG, ITERM< 0 - if the method failed. The subroutines PNETU, PNETS require the user supplied subroutines OBJ and DOBJ that define the objective function and its gradient and have the form SUBROUTINE OBJ(NF,X,F) SUBROUTINE DOBJ(NF,X,G) The arguments of the user supplied subroutines have the following meaning. Argument Type Significance ---------------------------------------------------------------------- NF I Positive INTEGER variable that specifies the number of variables of the objective function. X(NF) I DOUBLE PRECISION an estimate to the solution. F O DOUBLE PRECISION value of the objective function at the point X. G(NF) O DOUBLE PRECISION gradient of the objective function at the point X. 3. Subroutine PNET: ------------------- This general subroutine is called from all subroutines described in Section 2. The calling sequence is CALL PNET(NF,NB,X,IX,XL,XU,GF,GN,S,XO,GO,XS,GS,XM,GM,U1,U2,XMAX, & TOLX,TOLF,TOLB,TOLG,FMIN,GMAX,F,MIT,MFV,MFG,IEST,MOS1,MOS2,MF, & IPRNT,ITERM) The arguments NF, NB, X, IX, XL, XU, GMAX, F, IPRNT, ITERM, have the same meaning as in Section 2. Other arguments have the following meaning: Argument Type Significance ----------------------------------------------------------------------- GF(NF) A DOUBLE PRECISION gradient of the objective function. GN(NF) A DOUBLE PRECISION old gradient of the objective function. S(NF) A DOUBLE PRECISION direction vector. XO(NF) A DOUBLE PRECISION array which contains increments of variables. GO(NF) A DOUBLE PRECISION array which contains increments of gradients. XS(NF) A DOUBLE PRECISION auxiliary array. GS(NF) A DOUBLE PRECISION auxiliary array. XM(NF*MF) A DOUBLE PRECISION array which contains increments of variables. GM(NF*MF) A DOUBLE PRECISION array which contains increments of gradients. U1(MF) A DOUBLE PRECISION auxiliary array. U2(MF) A DOUBLE PRECISION auxiliary array. XMAX I DOUBLE PRECISION maximum stepsize; the choice XMAX=0 causes that the default value 1.0D+16 will be taken. TOLX I DOUBLE PRECISION tolerance for the change of the coordinate vector X; the choice TOLX=0 causes that the default value TOLX=1.0D-16 will be taken. TOLF I DOUBLE PRECISION tolerance for the change of function values; the choice TOLF=0 causes that the default value TOLF=1.0D-14 will be taken. TOLB I DOUBLE PRECISION minimum acceptable function value; the choice TOLB=0 causes that the default value TOLB=FMIN+1.0D-16 will be taken. TOLG I DOUBLE PRECISION tolerance for the Lagrangian function gradient; the choice TOLG=0 causes that the default value TOLG=1.0D-6 will be taken. FMIN I DOUBLE PRECISION lower bound for the minimum function value. MIT I INTEGER variable that specifies the maximum number of iterations; the choice MIT=0 causes that the default value 5000 will be taken. MFV I INTEGER variable that specifies the maximum number of function evaluations; the choice MFV=0 causes that the default value 5000 will be taken. MFG I INTEGER variable that specifies the maximum number of gradient evaluations; the choice MFG=0 causes that the default value 30000 will be taken. IEST I INTEGER estimation of the minimum functiom value for the line search: IEST=0 - estimation is not used, IEST=1 - lower bound FMIN is used as an estimation for the minimum function value. MOS1 I INTEGER choice of restarts after constraint change: MOS1=1 - restarts are suppressed, MOS1=2 - restarts with steepest descent directions are used. MOS2 I INTEGER choice of preconditioning strategy: MOS2=1 - preconditioning is not used, MOS2=2 - preconditioning by the incomplete Gill-Murray decomposition, MOS2=3 - preconditioning by the incomplete Gill-Murray decomposition combined with preliminary solution of the preconditioned system. MF I The number of limited-memory variable metric updates in each iteration (they use 2*MF stored vectors). The choice of parameter XMAX can be sensitive in many cases. First, the objective function can be evaluated only in a relatively small region (if it contains exponentials) so that the maximum stepsize is necessary. Secondly, the problem can be very ill-conditioned far from the solution point so that large steps can be unsuitable. Finally, if the problem has more local solutions, a suitably chosen maximum stepsize can lead to obtaining a better local solution. The subroutine PNET requires the user supplied subroutines OBJ and DOBJ which are described in Section 2. 4. Verification of the subroutines: ----------------------------------- Subroutine PNETU can be verified and tested using the program TNETU. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation) and TFGU14 (gradient evaluation) containing 22 unconstrained test problems with at most 1000 variables [2]. The results obtained by the program TNETU on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 1481 NFV= 1656 NFG=26037 F= 0.117631766E-15 G= 0.354E-06 ITERM= 4 NIT= 132 NFV= 387 NFG= 7945 F= 0.153382199E-15 G= 0.988E-08 ITERM= 4 NIT= 19 NFV= 20 NFG= 110 F= 0.421204156E-09 G= 0.353E-06 ITERM= 4 NIT= 19 NFV= 20 NFG= 230 F= 269.499543 G= 0.779E-07 ITERM= 4 NIT= 12 NFV= 13 NFG= 49 F= 0.465606821E-11 G= 0.364E-06 ITERM= 4 NIT= 13 NFV= 14 NFG= 76 F= 0.366783327E-11 G= 0.404E-06 ITERM= 4 NIT= 9 NFV= 10 NFG= 37 F= 336.937181 G= 0.248E-06 ITERM= 4 NIT= 11 NFV= 12 NFG= 58 F= 761774.954 G= 0.155E-07 ITERM= 4 NIT= 7 NFV= 11 NFG= 28 F= 316.436141 G= 0.158E-07 ITERM= 4 NIT= 75 NFV= 153 NFG= 3213 F= -133.610000 G= 0.777E-08 ITERM= 4 NIT= 33 NFV= 45 NFG= 181 F= 10.7765879 G= 0.414E-07 ITERM= 4 NIT= 23 NFV= 30 NFG= 457 F= 982.273617 G= 0.591E-08 ITERM= 4 NIT= 7 NFV= 8 NFG= 16 F= 0.533593908E-15 G= 0.327E-07 ITERM= 4 NIT= 1 NFV= 2 NFG= 1005 F= 0.120245125E-08 G= 0.879E-07 ITERM= 4 NIT= 14 NFV= 15 NFG= 4033 F= 1.92401599 G= 0.468E-07 ITERM= 4 NIT= 13 NFV= 17 NFG= 295 F= -427.404476 G= 0.800E-08 ITERM= 4 NIT= 4 NFV= 5 NFG= 810 F=-0.379921091E-01 G= 0.537E-06 ITERM= 4 NIT= 4 NFV= 5 NFG= 1146 F=-0.245741193E-01 G= 0.425E-06 ITERM= 4 NIT= 10 NFV= 11 NFG= 1986 F= 59.5986241 G= 0.423E-06 ITERM= 4 NIT= 18 NFV= 39 NFG= 3051 F= -1.00013520 G= 0.712E-07 ITERM= 4 NIT= 7 NFV= 8 NFG= 4901 F= 2.13866377 G= 0.120E-08 ITERM= 4 NIT= 55 NFV= 145 NFG= 4760 F= 1.00000000 G= 0.206E-08 ITERM= 4 NITER = 1967 NFVAL = 2626 NSUCC = 22 TIME= 0:00:06.95 The rows corresponding to individual test problems contain the number of iterations NIT, the number of function evaluations NFV, the number of gradient evaluations NFG, the final value of the objective function F, the norm of gradient G and the cause of termination ITERM. Subroutine PNETS can be verified and tested using the program TNETS. This program calls the subroutines TIUD14 (initiation), TFFU14 (function evaluation), TFGU14 (gradient evaluation) containing 22 box constrained test problems with at most 1000 variables [2]. The results obtained by the program TNETS on a PC computer with Microsoft Power Station Fortran compiler have the following form. NIT= 1611 NFV= 1793 NFG=28524 F= 0.00000000 G= 0.000E+00 ITERM= 3 NIT= 259 NFV= 259 NFG= 4418 F= 3930.43956 G= 0.230E-07 ITERM= 4 NIT= 17 NFV= 18 NFG= 98 F= 0.158634811E-08 G= 0.954E-06 ITERM= 4 NIT= 12 NFV= 13 NFG= 105 F= 269.522686 G= 0.103E-07 ITERM= 4 NIT= 12 NFV= 13 NFG= 49 F= 0.465606821E-11 G= 0.364E-06 ITERM= 4 NIT= 13 NFV= 14 NFG= 76 F= 0.366783327E-11 G= 0.404E-06 ITERM= 4 NIT= 9 NFV= 10 NFG= 37 F= 336.937181 G= 0.248E-06 ITERM= 4 NIT= 40 NFV= 41 NFG= 248 F= 761925.725 G= 0.281E-06 ITERM= 4 NIT= 553 NFV= 555 NFG= 2056 F= 428.056916 G= 0.850E-07 ITERM= 4 NIT= 112 NFV= 137 NFG= 2109 F= -84.1426617 G= 0.732E-06 ITERM= 4 NIT= 7 NFV= 8 NFG= 17 F= 96517.2947 G= 0.112E-11 ITERM= 4 NIT= 133 NFV= 136 NFG= 2689 F= 4994.21410 G= 0.180E-06 ITERM= 4 NIT= 7 NFV= 8 NFG= 16 F= 0.533593908E-15 G= 0.327E-07 ITERM= 4 NIT= 1 NFV= 2 NFG= 1005 F= 0.120245125E-08 G= 0.879E-07 ITERM= 4 NIT= 14 NFV= 15 NFG= 4033 F= 1.92401599 G= 0.468E-07 ITERM= 4 NIT= 12 NFV= 13 NFG= 294 F= -427.391653 G= 0.594E-06 ITERM= 4 NIT= 4 NFV= 5 NFG= 810 F=-0.379921091E-01 G= 0.537E-06 ITERM= 4 NIT= 4 NFV= 5 NFG= 1146 F=-0.245741193E-01 G= 0.425E-06 ITERM= 4 NIT= 8 NFV= 9 NFG= 1902 F= 1654.94525 G= 0.690E-07 ITERM= 4 NIT= 16 NFV= 25 NFG= 3254 F= -1.00013520 G= 0.836E-08 ITERM= 4 NIT= 4 NFV= 5 NFG= 1211 F= 2.41354873 G= 0.135E-06 ITERM= 4 NIT= 52 NFV= 137 NFG= 4843 F= 1.00000000 G= 0.657E-06 ITERM= 4 NITER = 2900 NFVAL = 3221 NSUCC = 22 TIME= 0:00:08.56 References: ----------- [1] Luksan L., Matonoha C., Vlcek J.: LSA: Algorithms for large-scale unconstrained and box constrained optimization Technical Report V-896. Prague, ICS AS CR, 2004. [2] Luksan L., Vlcek J.: Sparse and partially separable test problems for unconstrained and equality constrained optimization. Research Report V-767, Institute of Computer Science, Academy of Sciences of the Czech Republic, Prague, Czech Republic, 1998. stevengj-nlopt-88c424d/src/algs/luksan/pssubs.c000066400000000000000000001047561521061417600215500ustar00rootroot00000000000000#include #include "luksan.h" #include "nlopt-util.h" #define FALSE_ 0 #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define MIN2(a,b) ((a) < (b) ? (a) : (b)) #define iabs(a) ((a) < 0 ? -(a) : (a)) /* subroutines extracted from pssubs.for */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PCBS04 ALL SYSTEMS 98/12/01 * PURPOSE : * INITIATION OF THE VECTOR CONTAINING TYPES OF CONSTRAINTS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RI EPS9 TOLERANCE FOR ACTIVE CONSTRAINTS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. */ void luksan_pcbs04__(int *nf, double *x, int *ix, double *xl, double *xu, double *eps9, int *kbf) { /* System generated locals */ int i__1, i__2; double d__1, d__2; /* Local variables */ int i__, ixi; double temp; /* Parameter adjustments */ --xu; --xl; --ix; --x; /* Function Body */ if (*kbf > 0) { i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { temp = 1.; ixi = (i__2 = ix[i__], iabs(i__2)); /* Computing MAX */ d__2 = (d__1 = xl[i__], fabs(d__1)); if ((ixi == 1 || ixi == 3 || ixi == 4) && x[i__] <= xl[i__] + * eps9 * MAX2(d__2,temp)) { x[i__] = xl[i__]; } /* Computing MAX */ d__2 = (d__1 = xu[i__], fabs(d__1)); if ((ixi == 2 || ixi == 3 || ixi == 4) && x[i__] >= xu[i__] - * eps9 * MAX2(d__2,temp)) { x[i__] = xu[i__]; } /* L1: */ } } return; } /* luksan_pcbs04__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PNINT1 ALL SYSTEMS 91/12/01 */ /* PURPOSE : */ /* EXTRAPOLATION OR INTERPOLATION FOR LINE SEARCH WITH DIRECTIONAL */ /* DERIVATIVES. */ /* PARAMETERS : */ /* RI RL LOWER VALUE OF THE STEPSIZE PARAMETER. */ /* RI RU UPPER VALUE OF THE STEPSIZE PARAMETER. */ /* RI FL VALUE OF THE OBJECTIVE FUNCTION FOR R=RL. */ /* RI FU VALUE OF THE OBJECTIVE FUNCTION FOR R=RU. */ /* RI PL DIRECTIONAL DERIVATIVE FOR R=RL. */ /* RI PU DIRECTIONAL DERIVATIVE FOR R=RU. */ /* RO R VALUE OF THE STEPSIZE PARAMETER OBTAINED. */ /* II MODE MODE OF LINE SEARCH. */ /* II MTYP METHOD SELECTION. MTYP=1-BISECTION. MTYP=2-QUADRATIC */ /* INTERPOLATION (WITH ONE DIRECTIONAL DERIVATIVE). */ /* MTYP=3-QUADRATIC INTERPOLATION (WITH TWO DIRECTIONAL */ /* DERIVATIVES). MTYP=4-CUBIC INTERPOLATION. MTYP=5-CONIC */ /* INTERPOLATION. */ /* IO MERR ERROR INDICATOR. MERR=0 FOR NORMAL RETURN. */ /* METHOD : */ /* EXTRAPOLATION OR INTERPOLATION WITH STANDARD MODEL FUNCTIONS. */ void luksan_pnint1__(double *rl, double *ru, double *fl, double *fu, double *pl, double *pu, double *r__, int *mode, int *mtyp, int *merr) { /* System generated locals */ double d__1, d__2; /* Local variables */ double a = 0.0, b = 0.0, c__, d__, den = 0.0, dis; int ntyp; *merr = 0; if (*mode <= 0) { return; } if (*pl >= 0.) { *merr = 2; return; } else if (*ru <= *rl) { *merr = 3; return; } for (ntyp = *mtyp; ntyp >= 1; --ntyp) { if (ntyp == 1) { /* BISECTION */ if (*mode == 1) { *r__ = *ru * 4.; return; } else { *r__ = (*rl + *ru) * .5; return; } } else if (ntyp == *mtyp) { a = (*fu - *fl) / (*pl * (*ru - *rl)); b = *pu / *pl; } if (ntyp == 2) { /* QUADRATIC EXTRAPOLATION OR INTERPOLATION WITH ONE DIRECTIONAL */ /* DERIVATIVE */ den = (1. - a) * 2.; } else if (ntyp == 3) { /* QUADRATIC EXTRAPOLATION OR INTERPOLATION WITH TWO DIRECTIONAL */ /* DERIVATIVES */ den = 1. - b; } else if (ntyp == 4) { /* CUBIC EXTRAPOLATION OR INTERPOLATION */ c__ = b - a * 2. + 1.; d__ = b - a * 3. + 2.; dis = d__ * d__ - c__ * 3.; if (dis < 0.) { goto L1; } den = d__ + sqrt(dis); } else if (ntyp == 5) { /* CONIC EXTRAPOLATION OR INTERPOLATION */ dis = a * a - b; if (dis < 0.) { goto L1; } den = a + sqrt(dis); if (den <= 0.) { goto L1; } /* Computing 3rd power */ d__1 = 1. / den; den = 1. - b * (d__1 * (d__1 * d__1)); } if (*mode == 1 && den > 0. && den < 1.) { /* EXTRAPOLATION ACCEPTED */ *r__ = *rl + (*ru - *rl) / den; /* Computing MAX */ d__1 = *r__, d__2 = *ru * 1.1; *r__ = MAX2(d__1,d__2); /* Computing MIN */ d__1 = *r__, d__2 = *ru * 1e3; *r__ = MIN2(d__1,d__2); return; } else if (*mode == 2 && den > 1.) { /* INTERPOLATION ACCEPTED */ *r__ = *rl + (*ru - *rl) / den; if (*rl == 0.) { /* Computing MAX */ d__1 = *r__, d__2 = *rl + (*ru - *rl) * .01; *r__ = MAX2(d__1,d__2); } else { /* Computing MAX */ d__1 = *r__, d__2 = *rl + (*ru - *rl) * .1; *r__ = MAX2(d__1,d__2); } /* Computing MIN */ d__1 = *r__, d__2 = *rl + (*ru - *rl) * .9; *r__ = MIN2(d__1,d__2); return; } L1: ; } return; } /* luksan_pnint1__ */ /* save and restore state, replacing old non-reeentrant implementation that used static local variables */ #define SS(var) state->var = var #define SAVE_STATE SS(fl); SS(fu); SS(pl); SS(rl); SS(pu); SS(ru); \ SS(mes1); SS(mes2); SS(mes3); SS(mode); SS(mtyp) #define RS(var) var = state->var #define RESTORE_STATE RS(fl); RS(fu); RS(pl); RS(rl); RS(pu); RS(ru); \ RS(mes1); RS(mes2); RS(mes3); RS(mode); RS(mtyp) /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PS1L01 ALL SYSTEMS 97/12/01 * PURPOSE : * STANDARD LINE SEARCH WITH DIRECTIONAL DERIVATIVES. * * PARAMETERS : * RO R VALUE OF THE STEPSIZE PARAMETER. * RO RP PREVIOUS VALUE OF THE STEPSIZE PARAMETER. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI FO INITIAL VALUE OF THE OBJECTIVE FUNCTION. * RO FP PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RO P VALUE OF THE DIRECTIONAL DERIVATIVE. * RI PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP PREVIOUS VALUE OF THE DIRECTIONAL DERIVATIVE. * RI FMIN LOWER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI MAXF UPPER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI RMIN MINIMUM VALUE OF THE STEPSIZE PARAMETER * RI RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER * RI TOLS TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE FUNCTION VALUE). * RI TOLP TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE DIRECTIONAL DERIVATIVE). * RO PAR1 PARAMETER FOR CONTROLLED SCALING OF VARIABLE METRIC * UPDATES. * RO PAR2 PARAMETER FOR CONTROLLED SCALING OF VARIABLE METRIC * UPDATES. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES OF OBJECTIVE * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO NRED ACTUAL NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * II MRED MAXIMUM NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * IO MAXST MAXIMUM STEPSIZE INDICATOR. MAXST=0 OR MAXST=1 IF MAXIMUM * STEPSIZE WAS NOT OR WAS REACHED. * II IEST LOWER BOUND SPECIFICATION. IEST=0 OR IEST=1 IF LOWER BOUND * IS NOT OR IS GIVEN. * II INITS CHOICE OF THE INITIAL STEPSIZE. INITS=0-INITIAL STEPSIZE * IS SPECIFIED IN THE CALLING PROGRAM. INITS=1-UNIT INITIAL * STEPSIZE. INITS=2-COMBINED UNIT AND QUADRATICALLY ESTIMATED * INITIAL STEPSIZE. INITS=3-QUADRATICALLY ESTIMATED INITIAL * STEPSIZE. * IO ITERS TERMINATION INDICATOR. ITERS=0-ZERO STEP. ITERS=1-PERFECT * LINE SEARCH. ITERS=2 GOLDSTEIN STEPSIZE. ITERS=3-CURRY * STEPSIZE. ITERS=4-EXTENDED CURRY STEPSIZE. * ITERS=5-ARMIJO STEPSIZE. ITERS=6-FIRST STEPSIZE. * ITERS=7-MAXIMUM STEPSIZE. ITERS=8-UNBOUNDED FUNCTION. * ITERS=-1-MRED REACHED. ITERS=-2-POSITIVE DIRECTIONAL * DERIVATIVE. ITERS=-3-ERROR IN INTERPOLATION. * II KTERS TERMINATION SELECTION. KTERS=1-PERFECT LINE SEARCH. * KTERS=2-GOLDSTEIN STEPSIZE. KTERS=3-CURRY STEPSIZE. * KTERS=4-EXTENDED CURRY STEPSIZE. KTERS=5-ARMIJO STEPSIZE. * KTERS=6-FIRST STEPSIZE. * II MES METHOD SELECTION. MES=1-BISECTION. MES=2-QUADRATIC * INTERPOLATION (WITH ONE DIRECTIONAL DERIVATIVE). * MES=3-QUADRATIC INTERPOLATION (WITH TWO DIRECTIONAL * DERIVATIVES). MES=4-CUBIC INTERPOLATION. MES=5-CONIC * INTERPOLATION. * IU ISYS CONTROL PARAMETER. * * SUBPROGRAM USED : * S PNINT1 EXTRAPOLATION OR INTERPOLATION WITH DIRECTIONAL * DERIVATIVES. * * METHOD : * SAFEGUARDED EXTRAPOLATION AND INTERPOLATION WITH STANDARD TERMINATION * CRITERIA. */ void luksan_ps1l01__(double *r__, double *rp, double *f, double *fo, double *fp, double *p, double *po, double *pp, double *minf, double *maxf, double *rmin, double *rmax, double *tols, double * tolp, double *par1, double *par2, int *kd, int *ld, int *nit, int *kit, int *nred, int *mred, int * maxst, int *iest, int *inits, int *iters, int *kters, int *mes, int *isys, ps1l01_state *state) { /* System generated locals */ double d__1, d__2; /* Local variables */ unsigned l1, l2, l3, m1, l5, m2, l7, m3; double fl, fu, pl, rl, pu, ru; int mes1, mes2, mes3, mode; int merr; int mtyp; int init1; double rtemp; RESTORE_STATE; if (*isys == 1) { goto L3; } mes1 = 2; mes2 = 2; mes3 = 2; *iters = 0; if (*po >= 0.) { *r__ = 0.; *iters = -2; goto L4; } if (*rmax <= 0.) { *iters = 0; goto L4; } /* INITIAL STEPSIZE SELECTION */ if (*inits > 0) { rtemp = *minf - *f; } else if (*iest == 0) { rtemp = *f - *fp; } else { /* Computing MAX */ d__1 = *f - *fp, d__2 = *minf - *f; rtemp = MAX2(d__1,d__2); } init1 = iabs(*inits); *rp = 0.; *fp = *fo; *pp = *po; if (init1 == 0) { } else if (init1 == 1 || (*inits >= 1 && *iest == 0)) { *r__ = 1.; } else if (init1 == 2) { /* Computing MIN */ d__1 = 1., d__2 = rtemp * 4. / *po; *r__ = MIN2(d__1,d__2); } else if (init1 == 3) { /* Computing MIN */ d__1 = 1., d__2 = rtemp * 2. / *po; *r__ = MIN2(d__1,d__2); } else if (init1 == 4) { *r__ = rtemp * 2. / *po; } *r__ = MAX2(*r__,*rmin); *r__ = MIN2(*r__,*rmax); mode = 0; ru = 0.; fu = *fo; pu = *po; /* NEW STEPSIZE SELECTION (EXTRAPOLATION OR INTERPOLATION) */ L2: luksan_pnint1__(&rl, &ru, &fl, &fu, &pl, &pu, r__, &mode, &mtyp, &merr); if (merr > 0) { *iters = -merr; goto L4; } else if (mode == 1) { --(*nred); *r__ = MIN2(*r__,*rmax); } else if (mode == 2) { ++(*nred); } /* COMPUTATION OF THE NEW FUNCTION VALUE AND THE NEW DIRECTIONAL */ /* DERIVATIVE */ *kd = 1; *ld = -1; *isys = 1; SAVE_STATE; return; L3: if (mode == 0) { *par1 = *p / *po; *par2 = *f - *fo; } if (*iters != 0) { goto L4; } if (*f <= *minf) { *iters = 7; goto L4; } else { l1 = *r__ <= *rmin && *nit != *kit; l2 = *r__ >= *rmax; l3 = *f - *fo <= *tols * *r__ * *po; l5 = *p >= *tolp * *po || (mes2 == 2 && mode == 2); l7 = mes2 <= 2 || mode != 0; m1 = FALSE_; m2 = FALSE_; m3 = l3; if (mes3 >= 1) { m1 = fabs(*p) <= fabs(*po) * .01 && *fo - *f >= fabs(*fo) * 9.9999999999999994e-12; l3 = l3 || m1; } if (mes3 >= 2) { m2 = fabs(*p) <= fabs(*po) * .5 && (d__1 = *fo - *f, fabs(d__1)) <= fabs(*fo) * 2.0000000000000001e-13; l3 = l3 || m2; } *maxst = 0; if (l2) { *maxst = 1; } } /* TEST ON TERMINATION */ if (l1 && ! l3) { *iters = 0; goto L4; } else if (l2 && l3 && ! l5) { *iters = 7; goto L4; } else if (m3 && mes1 == 3) { *iters = 5; goto L4; } else if (l3 && l5 && l7) { *iters = 4; goto L4; } else if (*kters < 0 || (*kters == 6 && l7)) { *iters = 6; goto L4; } else if (iabs(*nred) >= *mred) { *iters = -1; goto L4; } else { *rp = *r__; *fp = *f; *pp = *p; mode = MAX2(mode,1); mtyp = iabs(*mes); if (*f >= *maxf) { mtyp = 1; } } if (mode == 1) { /* INTERVAL CHANGE AFTER EXTRAPOLATION */ rl = ru; fl = fu; pl = pu; ru = *r__; fu = *f; pu = *p; if (! l3) { *nred = 0; mode = 2; } else if (mes1 == 1) { mtyp = 1; } } else { /* INTERVAL CHANGE AFTER INTERPOLATION */ if (! l3) { ru = *r__; fu = *f; pu = *p; } else { rl = *r__; fl = *f; pl = *p; } } goto L2; L4: *isys = 0; SAVE_STATE; return; } /* luksan_ps1l01__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PULSP3 ALL SYSTEMS 02/12/01 * PURPOSE : * LIMITED STORAGE VARIABLE METRIC UPDATE. * * PARAMETERS : * II N NUMBER OF VARIABLES (NUMBER OF ROWS OF XM). * II M NUMBER OF COLUMNS OF XM. * II MF MAXIMUM NUMBER OF COLUMNS OF XM. * RI XM(N*M) RECTANGULAR MATRIX IN THE PRODUCT FORM SHIFTED BROYDEN * METHOD (STORED COLUMNWISE): H-SIGMA*I=XM*TRANS(XM) * RO GR(M) MATRIX TRANS(XM)*GO. * RU XO(N) VECTORS OF VARIABLES DIFFERENCE XO AND VECTOR XO-TILDE. * RU GO(N) GRADIENT DIFFERENCE GO AND VECTOR XM*TRANS(XM)*GO. * RI R STEPSIZE PARAMETER. * RI PO OLD DIRECTIONAL DERIVATIVE (MULTIPLIED BY R) * RU SIG SCALING PARAMETER (ZETA AND SIGMA). * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET3 CHOICE OF SIGMA (1-CONSTANT, 2-QUADRATIC EQUATION). * * SUBPROGRAMS USED : * S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR * MATRIX BY A VECTOR. * S MXDCMU UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. * S MXVDIR VECTOR AUGMENTED BY A SCALED VECTOR. * RF MXVDOT DOT PRODUCT OF VECTORS. * S MXVSCL SCALING OF A VECTOR. * * METHOD : * SHIFTED BFGS METHOD IN THE PRODUCT FORM. */ void luksan_pulsp3__(int *n, int *m, int *mf, double *xm, double *gr, double *xo, double *go, double *r__, double *po, double *sig, int *iterh, int *met3) { /* System generated locals */ double d__1, d__2, d__3, d__4; /* Builtin functions */ /* Local variables */ double a, b, aa, bb, ah, den, par, pom; (void) r__; (void) po; /* Parameter adjustments */ --go; --xo; --gr; --xm; /* Function Body */ if (*m >= *mf) { return; } b = luksan_mxvdot__(n, &xo[1], &go[1]); if (b <= 0.) { *iterh = 2; goto L22; } luksan_mxdrmm__(n, m, &xm[1], &go[1], &gr[1]); ah = luksan_mxvdot__(n, &go[1], &go[1]); aa = luksan_mxvdot__(m, &gr[1], &gr[1]); a = aa + ah * *sig; /* DETERMINATION OF THE PARAMETER SIG (SHIFT) */ par = 1.; pom = b / ah; if (a > 0.) { den = luksan_mxvdot__(n, &xo[1], &xo[1]); if (*met3 <= 4) { /* Computing MAX */ d__1 = 0., d__2 = 1. - aa / a; /* Computing MAX */ d__3 = 0., d__4 = 1. - b * b / (den * ah); *sig = sqrt((MAX2(d__1,d__2))) / (sqrt((MAX2(d__3,d__4))) + 1.) * pom; } else { /* Computing MAX */ d__1 = 0., d__2 = *sig * ah / a; /* Computing MAX */ d__3 = 0., d__4 = 1. - b * b / (den * ah); *sig = sqrt((MAX2(d__1,d__2))) / (sqrt((MAX2(d__3,d__4))) + 1.) * pom; } /* Computing MAX */ d__1 = *sig, d__2 = pom * .2; *sig = MAX2(d__1,d__2); /* Computing MIN */ d__1 = *sig, d__2 = pom * .8; *sig = MIN2(d__1,d__2); } else { *sig = pom * .25; } /* COMPUTATION OF SHIFTED XO AND SHIFTED B */ bb = b - ah * *sig; d__1 = -(*sig); luksan_mxvdir__(n, &d__1, &go[1], &xo[1], &xo[1]); /* BFGS-BASED SHIFTED BFGS UPDATE */ pom = 1.; d__1 = -1. / bb; luksan_mxdcmu__(n, m, &xm[1], &d__1, &xo[1], &gr[1]); d__1 = sqrt(par / bb); luksan_mxvscl__(n, &d__1, &xo[1], &xm[*n * *m + 1]); ++(*m); L22: *iterh = 0; return; } /* luksan_pulsp3__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PULVP3 ALL SYSTEMS 03/12/01 * PURPOSE : * RANK-TWO LIMITED-STORAGE VARIABLE-METRIC METHODS IN THE PRODUCT FORM. * * PARAMETERS : * II N NUMBER OF VARIABLES (NUMBER OF ROWS OF XM). * II M NUMBER OF COLUMNS OF XM. * RI XM(N*M) RECTANGULAR MATRIX IN THE PRODUCT FORM SHIFTED BROYDEN * METHOD (STORED COLUMNWISE): H-SIGMA*I=XM*TRANS(XM) * RO XR(M) VECTOR TRANS(XM)*H**(-1)*XO. * RO GR(M) MATRIX TRANS(XM)*GO. * RA S(N) AUXILIARY VECTORS (H**(-1)*XO AND U). * RA SO(N) AUXILIARY VECTORS ((H-SIGMA*I)*H**(-1)*XO AND V). * RU XO(N) VECTORS OF VARIABLES DIFFERENCE XO AND VECTOR XO-TILDE. * RU GO(N) GRADIENT DIFFERENCE GO AND VECTOR XM*TRANS(XM)*GO. * RI R STEPSIZE PARAMETER. * RI PO OLD DIRECTIONAL DERIVATIVE (MULTIPLIED BY R) * RU SIG SCALING PARAMETER (ZETA AND SIGMA). * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET2 CHOICE OF THE CORRECTION PARAMETER (1-THE UNIT VALUE, * 2-THE BALANCING VALUE, 3-THE SQUARE ROOT, 4-THE GEOMETRIC * MEAN). * II MET3 CHOICE OF THE SHIFT PARAMETER (4-THE FIRST FORMULA, * 5-THE SECOND FORMULA). * II MET5 CHOICE OF THE METHOD (1-RANK-ONE METHOD, 2-RANK-TWO * METHOD). * * SUBPROGRAMS USED : * S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR * MATRIX BY A VECTOR. * S MXDCMU UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. RANK-ONE FORMULA. * S MXDCMV UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. RANK-TWO FORMULA. * S MXVDIR VECTOR AUGMENTED BY A SCALED VECTOR. * RF MXVDOT DOT PRODUCT OF VECTORS. * S MXVLIN LINEAR COMBINATION OF TWO VECTORS. * S MXVSCL SCALING OF A VECTOR. * * METHOD : * RANK-ONE LIMITED-STORAGE VARIABLE-METRIC METHOD IN THE PRODUCT FORM. */ void luksan_pulvp3__(int *n, int *m, double *xm, double *xr, double *gr, double *s, double *so, double *xo, double *go, double *r__, double *po, double *sig, int *iterh, int *met2, int *met3, int *met5) { /* System generated locals */ double d__1, d__2, d__3, d__4; /* Builtin functions */ /* Local variables */ double a, b, aa, bb, cc, ah, den, par, pom, zet; (void) po; /* Parameter adjustments */ --go; --xo; --so; --s; --gr; --xr; --xm; /* Function Body */ zet = *sig; /* COMPUTATION OF B */ b = luksan_mxvdot__(n, &xo[1], &go[1]); if (b <= 0.) { *iterh = 2; goto L22; } /* COMPUTATION OF GR=TRANS(XM)*GO, XR=TRANS(XM)*H**(-1)*XO */ /* AND S=H**(-1)*XO, SO=(H-SIGMA*I)*H**(-1)*XO. COMPUTATION */ /* OF AA=GR*GR, BB=GR*XR, CC=XR*XR. COMPUTATION OF A AND C. */ luksan_mxdrmm__(n, m, &xm[1], &go[1], &gr[1]); luksan_mxvscl__(n, r__, &s[1], &s[1]); luksan_mxdrmm__(n, m, &xm[1], &s[1], &xr[1]); d__1 = -(*sig); luksan_mxvdir__(n, &d__1, &s[1], &xo[1], &so[1]); ah = luksan_mxvdot__(n, &go[1], &go[1]); aa = luksan_mxvdot__(m, &gr[1], &gr[1]); bb = luksan_mxvdot__(m, &gr[1], &xr[1]); cc = luksan_mxvdot__(m, &xr[1], &xr[1]); a = aa + ah * *sig; /* DETERMINATION OF THE PARAMETER SIG (SHIFT) */ pom = b / ah; if (a > 0.) { den = luksan_mxvdot__(n, &xo[1], &xo[1]); if (*met3 <= 4) { /* Computing MAX */ d__1 = 0., d__2 = 1. - aa / a; /* Computing MAX */ d__3 = 0., d__4 = 1. - b * b / (den * ah); *sig = sqrt((MAX2(d__1,d__2))) / (sqrt((MAX2(d__3,d__4))) + 1.) * pom; } else { /* Computing MAX */ d__1 = 0., d__2 = *sig * ah / a; /* Computing MAX */ d__3 = 0., d__4 = 1. - b * b / (den * ah); *sig = sqrt((MAX2(d__1,d__2))) / (sqrt((MAX2(d__3,d__4))) + 1.) * pom; } /* Computing MAX */ d__1 = *sig, d__2 = pom * .2; *sig = MAX2(d__1,d__2); /* Computing MIN */ d__1 = *sig, d__2 = pom * .8; *sig = MIN2(d__1,d__2); } else { *sig = pom * .25; } /* COMPUTATION OF SHIFTED XO AND SHIFTED B */ b -= ah * *sig; d__1 = -(*sig); luksan_mxvdir__(n, &d__1, &go[1], &xo[1], &xo[1]); /* COMPUTATION OF THE PARAMETER RHO (CORRECTION) */ if (*met2 <= 1) { par = 1.; } else if (*met2 == 2) { par = *sig * ah / b; } else if (*met2 == 3) { par = sqrt(1. - aa / a); } else if (*met2 == 4) { par = sqrt(sqrt(1. - aa / a) * (*sig * ah / b)); } else { par = zet / (zet + *sig); } /* COMPUTATION OF THE PARAMETER THETA (BFGS) */ d__1 = sqrt(par * b / cc); pom = copysign(d__1, bb); /* COMPUTATION OF Q AND P */ if (*met5 == 1) { /* RANK ONE UPDATE OF XM */ luksan_mxvdir__(m, &pom, &xr[1], &gr[1], &xr[1]); luksan_mxvlin__(n, &par, &xo[1], &pom, &so[1], &s[1]); d__1 = -1. / (par * b + pom * bb); luksan_mxdcmu__(n, m, &xm[1], &d__1, &s[1], &xr[1]); } else { /* RANK TWO UPDATE OF XM */ d__1 = par / pom - bb / b; luksan_mxvdir__(n, &d__1, &xo[1], &so[1], &s[1]); d__1 = -1. / b; d__2 = -1. / cc; luksan_mxdcmv__(n, m, &xm[1], &d__1, &xo[1], &gr[1], &d__2, &s[1], &xr[1]); } L22: *iterh = 0; return; } /* luksan_pulvp3__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYADC0 ALL SYSTEMS 98/12/01 * PURPOSE : * NEW SIMPLE BOUNDS ARE ADDED TO THE ACTIVE SET. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N REDUCED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * IO INEW NUMBER OF ACTIVE CONSTRAINTS. */ void luksan_pyadc0__(int *nf, int *n, double *x, int *ix, double *xl, double *xu, int *inew) { /* System generated locals */ int i__1; /* Local variables */ int i__, ii, ixi; /* Parameter adjustments */ --ix; --x; --xl; --xu; /* Function Body */ *n = *nf; *inew = 0; i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { ii = ix[i__]; ixi = iabs(ii); if (ixi >= 5) { ix[i__] = -ixi; } else if ((ixi == 1 || ixi == 3 || ixi == 4) && x[i__] <= xl[i__]) { x[i__] = xl[i__]; if (ixi == 4) { ix[i__] = -3; } else { ix[i__] = -ixi; } --(*n); if (ii > 0) { ++(*inew); } } else if ((ixi == 2 || ixi == 3 || ixi == 4) && x[i__] >= xu[i__]) { x[i__] = xu[i__]; if (ixi == 3) { ix[i__] = -4; } else { ix[i__] = -ixi; } --(*n); if (ii > 0) { ++(*inew); } } /* L1: */ } return; } /* luksan_pyadc0__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYFUT1 ALL SYSTEMS 98/12/01 * PURPOSE : * TERMINATION CRITERIA AND TEST ON RESTART. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * RI F NEW VALUE OF THE OBJECTIVE FUNCTION. * RI FO OLD VALUE OF THE OBJECTIVE FUNCTION. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RO GMAX NORM OF THE TRANSFORMED GRADIENT. * RI DMAX MAXIMUM RELATIVE DIFFERENCE OF VARIABLES. * RI TOLX LOWER BOUND FOR STEPLENGTH. * RI TOLF LOWER BOUND FOR FUNCTION DECREASE. * RI TOLB LOWER BOUND FOR FUNCTION VALUE. * RI TOLG LOWER BOUND FOR GRADIENT. * II KD DEGREE OF REQUIRED DERIVATIVES. * IU NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER RESTART. * II MIT MAXIMUM NUMBER OF ITERATIONS. * IU NFV ACTUAL NUMBER OF COMPUTED FUNCTION VALUES. * II MFV MAXIMUM NUMBER OF COMPUTED FUNCTION VALUES. * IU NFG ACTUAL NUMBER OF COMPUTED GRADIENT VALUES. * II MFG MAXIMUM NUMBER OF COMPUTED GRADIENT VALUES. * IU NTESX ACTUAL NUMBER OF TESTS ON STEPLENGTH. * II MTESX MAXIMUM NUMBER OF TESTS ON STEPLENGTH. * IU NTESF ACTUAL NUMBER OF TESTS ON FUNCTION DECREASE. * II MTESF MAXIMUM NUMBER OF TESTS ON FUNCTION DECREASE. * II IRES1 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * II IRES2 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * IU IREST RESTART INDICATOR. RESTART IS PERFORMED IF IREST>0. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * IO ITERM TERMINATION INDICATOR. ITERM=1-TERMINATION AFTER MTESX * UNSUFFICIENT STEPLENGTHS. ITERM=2-TERMINATION AFTER MTESF * UNSUFFICIENT FUNCTION DECREASES. ITERM=3-TERMINATION ON LOWER * BOUND FOR FUNCTION VALUE. ITERM=4-TERMINATION ON LOWER BOUND * FOR GRADIENT. ITERM=11-TERMINATION AFTER MAXIMUM NUMBER OF * ITERATIONS. ITERM=12-TERMINATION AFTER MAXIMUM NUMBER OF * COMPUTED FUNCTION VALUES. */ void luksan_pyfut1__(int *n, double *f, double *fo, double *umax, double *gmax, int xstop, /* double *dmax__, */ const nlopt_stopping *stop, double *tolg, int *kd, int *nit, int *kit, int *mit, int *nfg, int *mfg, int *ntesx, int *mtesx, int *ntesf, int *mtesf, int *ites, int *ires1, int *ires2, int *irest, int *iters, int *iterm) { /* System generated locals */ double d__1, d__2; /* Builtin functions */ if (*iterm < 0) { return; } if (*ites <= 0) { goto L1; } if (*iters == 0) { goto L1; } if (*nit <= 0) { /* Computing MIN */ d__1 = sqrt((fabs(*f))), d__2 = fabs(*f) / 10.; *fo = *f + MIN2(d__1,d__2); } if (nlopt_stop_forced(stop)) { *iterm = -999; return; } if (*f <= stop->minf_max /* *tolb */) { *iterm = 3; return; } if (*kd > 0) { if (*gmax <= *tolg && *umax <= *tolg) { *iterm = 4; return; } } if (*nit <= 0) { *ntesx = 0; *ntesf = 0; } if (xstop) /* (*dmax__ <= *tolx) */ { *iterm = 1; ++(*ntesx); if (*ntesx >= *mtesx) { return; } } else { *ntesx = 0; } if (nlopt_stop_ftol(stop, *f, *fo)) { *iterm = 2; ++(*ntesf); if (*ntesf >= *mtesf) { return; } } else { *ntesf = 0; } L1: if (*nit >= *mit) { *iterm = 11; return; } if (nlopt_stop_evals(stop)) /* (*nfv >= *mfv) */ { *iterm = 12; return; } if (*nfg >= *mfg) { *iterm = 13; return; } *iterm = 0; if (*n > 0 && *nit - *kit >= *ires1 * *n + *ires2) { *irest = MAX2(*irest,1); } ++(*nit); return; } /* luksan_pyfut1__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYRMC0 ALL SYSTEMS 98/12/01 * PURPOSE : * OLD SIMPLE BOUND IS REMOVED FROM THE ACTIVE SET. TRANSFORMED * GRADIENT OF THE OBJECTIVE FUNCTION IS UPDATED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N REDUCED NUMBER OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI EPS8 TOLERANCE FOR CONSTRAINT TO BE REMOVED. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RI GMAX NORM OF THE TRANSFORMED GRADIENT. * RO RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * II IOLD NUMBER OF REMOVED CONSTRAINTS. * IU IREST RESTART INDICATOR. */ void luksan_pyrmc0__(int *nf, int *n, int *ix, double *g, double *eps8, double *umax, double *gmax, double *rmax, int *iold, int *irest) { /* System generated locals */ int i__1, i__2, i__3; /* Local variables */ int i__, ixi; /* Parameter adjustments */ --g; --ix; /* Function Body */ if (*n == 0 || *rmax > 0.) { if (*umax > *eps8 * *gmax) { *iold = 0; i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { ixi = ix[i__]; if (ixi >= 0) { } else if (ixi <= -5) { } else if ((ixi == -1 || ixi == -3) && -g[i__] <= 0.) { } else if ((ixi == -2 || ixi == -4) && g[i__] <= 0.) { } else { ++(*iold); /* Computing MIN */ i__3 = (i__2 = ix[i__], iabs(i__2)); ix[i__] = MIN2(i__3,3); if (*rmax == 0.) { goto L2; } } /* L1: */ } L2: if (*iold > 1) { *irest = MAX2(*irest,1); } } } return; } /* luksan_pyrmc0__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYTRCD ALL SYSTEMS 98/12/01 * PURPOSE : * VECTORS OF VARIABLES DIFFERENCE AND GRADIENTS DIFFERENCE ARE COMPUTED * AND SCALED AND REDUCED. TEST VALUE DMAX IS DETERMINED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RU GO(NF) GRADIENTS DIFFERENCE. * RO R VALUE OF THE STEPSIZE PARAMETER. * RO F NEW VALUE OF THE OBJECTIVE FUNCTION. * RI FO OLD VALUE OF THE OBJECTIVE FUNCTION. * RO P NEW VALUE OF THE DIRECTIONAL DERIVATIVE. * RI PO OLD VALUE OF THE DIRECTIONAL DERIVATIVE. * RO DMAX MAXIMUM RELATIVE DIFFERENCE OF VARIABLES. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * IO KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF COMPUTED DERIVATIVES. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * * SUBPROGRAMS USED : * S MXVDIF DIFFERENCE OF TWO VECTORS. * S MXVSAV DIFFERENCE OF TWO VECTORS WITH COPYING AND SAVING THE * SUBSTRACTED ONE. */ void luksan_pytrcd__(int *nf, double *x, int *ix, double *xo, double *g, double *go, double *r__, double *f, double *fo, double *p, double *po, double *dmax__, int *kbf, int *kd, int *ld, int * iters) { /* System generated locals */ int i__1; double d__1, d__2, d__3, d__4, d__5; /* Local variables */ int i__; /* Parameter adjustments */ --go; --g; --xo; --ix; --x; /* Function Body */ if (*iters > 0) { luksan_mxvdif__(nf, &x[1], &xo[1], &xo[1]); luksan_mxvdif__(nf, &g[1], &go[1], &go[1]); *po = *r__ * *po; *p = *r__ * *p; } else { *f = *fo; *p = *po; luksan_mxvsav__(nf, &x[1], &xo[1]); luksan_mxvsav__(nf, &g[1], &go[1]); *ld = *kd; } *dmax__ = 0.; i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { if (*kbf > 0) { if (ix[i__] < 0) { xo[i__] = 0.; go[i__] = 0.; goto L1; } } /* Computing MAX */ /* Computing MAX */ d__5 = (d__2 = x[i__], fabs(d__2)); d__3 = *dmax__, d__4 = (d__1 = xo[i__], fabs(d__1)) / MAX2(d__5,1.); *dmax__ = MAX2(d__3,d__4); L1: ; } return; } /* luksan_pytrcd__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYTRCG ALL SYSTEMS 99/12/01 * PURPOSE : * GRADIENT OF THE OBJECTIVE FUNCTION IS SCALED AND REDUCED. TEST VALUES * GMAX AND UMAX ARE COMPUTED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N ACTUAL NUMBER OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RI GMAX NORM OF THE TRANSFORMED GRADIENT. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II IOLD INDEX OF THE REMOVED CONSTRAINT. * * SUBPROGRAMS USED : * RF MXVMAX L-INFINITY NORM OF A VECTOR. */ void luksan_pytrcg__(int *nf, int *n, int *ix, double *g, double *umax, double *gmax, int *kbf, int *iold) { /* System generated locals */ int i__1; double d__1, d__2; /* Local variables */ int i__; double temp; /* Parameter adjustments */ --g; --ix; /* Function Body */ if (*kbf > 0) { *gmax = 0.; *umax = 0.; *iold = 0; i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { temp = g[i__]; if (ix[i__] >= 0) { /* Computing MAX */ d__1 = *gmax, d__2 = fabs(temp); *gmax = MAX2(d__1,d__2); } else if (ix[i__] <= -5) { } else if ((ix[i__] == -1 || ix[i__] == -3) && *umax + temp >= 0.) { } else if ((ix[i__] == -2 || ix[i__] == -4) && *umax - temp >= 0.) { } else { *iold = i__; *umax = fabs(temp); } /* L1: */ } } else { *umax = 0.; *gmax = luksan_mxvmax__(nf, &g[1]); } *n = *nf; return; } /* luksan_pytrcg__ */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* SUBROUTINE PYTRCS ALL SYSTEMS 98/12/01 * PURPOSE : * SCALED AND REDUCED DIRECTION VECTOR IS BACK TRANSFORMED. VECTORS * X,G AND VALUES F,P ARE SAVED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RO XO(NF) SAVED VECTOR OF VARIABLES. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO GO(NF) SAVED GRADIENT OF THE OBJECTIVE FUNCTION. * RO S(NF) DIRECTION VECTOR. * RO RO SAVED VALUE OF THE STEPSIZE PARAMETER. * RO FP PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RU FO SAVED VALUE OF THE OBJECTIVE FUNCTION. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RO PO SAVED VALUE OF THE DIRECTIONAL DERIVATIVE. * RI P VALUE OF THE DIRECTIONAL DERIVATIVE. * RO RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * * SUBPROGRAMS USED : * S MXVCOP COPYING OF A VECTOR. */ void luksan_pytrcs__(int *nf, double *x, int *ix, double *xo, double *xl, double *xu, double *g, double *go, double *s, double *ro, double *fp, double *fo, double *f, double *po, double *p, double *rmax, double *eta9, int *kbf) { /* System generated locals */ int i__1; double d__1, d__2; /* Local variables */ int i__; /* Parameter adjustments */ --s; --go; --g; --xu; --xl; --xo; --ix; --x; /* Function Body */ *fp = *fo; *ro = 0.; *fo = *f; *po = *p; luksan_mxvcop__(nf, &x[1], &xo[1]); luksan_mxvcop__(nf, &g[1], &go[1]); if (*kbf > 0) { i__1 = *nf; for (i__ = 1; i__ <= i__1; ++i__) { if (ix[i__] < 0) { s[i__] = 0.; } else { if (ix[i__] == 1 || ix[i__] >= 3) { if (s[i__] < -1. / *eta9) { /* Computing MIN */ d__1 = *rmax, d__2 = (xl[i__] - x[i__]) / s[i__]; *rmax = MIN2(d__1,d__2); } } if (ix[i__] == 2 || ix[i__] >= 3) { if (s[i__] > 1. / *eta9) { /* Computing MIN */ d__1 = *rmax, d__2 = (xu[i__] - x[i__]) / s[i__]; *rmax = MIN2(d__1,d__2); } } } /* L1: */ } } return; } /* luksan_pytrcs__ */ stevengj-nlopt-88c424d/src/algs/luksan/pssubs.for000066400000000000000000005602701521061417600221110ustar00rootroot00000000000000* SUBROUTINE PA0GS3 ALL SYSTEMS 91/12/01 * PURPOSE : * NUMERICAL COMPUTATION OF THE GRADIENT OF THE APPROXIMATED * FUNCTION. * * PARAMETERS : * II N NUMBER OF VARIABLES. * II KA INDEX OF THE APPROXIMATED FUNCTION. * RI X(N) VECTOR OF VARIABLES. * RO FA VALUE OF THE APPROXIMATED FUNCTION. * RA GA(N) GRADIENT OF THE APPROXIMATED FUNCTION. * II IAG(N+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI ETA1 PRECISION OF THE COMPUTED FUNCTION VALUES. * IU NAV NUMBER OF APPROXIMATED FUNCTION EVALUATIONS. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SUBROUTINE PA0GS3(N,KA,X,FA,GA,IAG,JAG,ETA1,NAV) DOUBLE PRECISION ETA1,FA INTEGER KA,N,NAV DOUBLE PRECISION GA(*),X(*) INTEGER IAG(*),JAG(*) DOUBLE PRECISION ETA,FTEMP,XSTEP,XTEMP INTEGER IVAR,KVAR ETA = SQRT(ETA1) FTEMP = FA DO 10 KVAR = IAG(KA),IAG(KA+1) - 1 IVAR = JAG(KVAR) * * STEP SELECTION * XSTEP = ETA*MAX(ABS(X(IVAR)),1.0D0)*SIGN(1.0D0,X(IVAR)) XTEMP = X(IVAR) X(IVAR) = X(IVAR) + XSTEP XSTEP = X(IVAR) - XTEMP NAV = NAV + 1 CALL FUN(N,KA,X,FA) * * NUMERICAL DIFFERENTIATION * GA(IVAR) = (FA-FTEMP)/XSTEP X(IVAR) = XTEMP 10 CONTINUE FA = FTEMP RETURN END * SUBROUTINE PA0HS3 ALL SYSTEMS 99/12/01 * PURPOSE : * NUMERICAL COMPUTATION OF THE HESSIAN MATRIX OF THE APPROXIMATED * FUNCTION USING ITS VALUES. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II KA INDEX OF THE SELECTED FUNCTION. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RO HA(M) HESSIAN MATRIX OF THE APPROXIMATED FUNCTION. * RA GO(NF) AUXILIARY VECTOR. * RA GS(NF) AUXILIARY VECTOR. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI FA VALUE OF THE SELECTED FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED VALUES. * II KBF TYPE OF BOUNDS. KBF=0-BOUNDS ARE NOT USED. KBF=1-ONE SIDED * BOUNDS. KBF=1-TWO SIDED BOUNDS. * IO NAV NUMBER OF APPROXIMATED FUNTION VALUES. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SUBROUTINE PA0HS3(NF,KA,X,IX,HA,GO,GS,IAG,JAG,FA,ETA1,KBF,NAV) INTEGER NF,KA,IX(*),IAG(*),JAG(*),KBF,NAV DOUBLE PRECISION X(*),HA(*),GO(*),GS(*),FA,ETA1 DOUBLE PRECISION XTEMPI,XTEMPJ,FTEMP,ETA INTEGER I,J,IJ INTEGER IVAR,JVAR,KVAR,LVAR,MVAR ETA=ETA1**(1.0D 0/3.0D 0) FTEMP=FA MVAR=IAG(KA)-1 DO 4 KVAR=MVAR+1,IAG(KA+1)-1 IVAR=ABS(JAG(KVAR)) IF (KBF.GT.0) THEN IF (IX(IVAR).LE.-5) GO TO 4 END IF * * STEP SELECTION * XTEMPI=X(IVAR) IF (XTEMPI.GE.0.0D 0) THEN GO(IVAR)= ETA*MAX(ABS(XTEMPI),1.0D 0) ELSE GO(IVAR)=-ETA*MAX(ABS(XTEMPI),1.0D 0) END IF X(IVAR)=X(IVAR)+GO(IVAR) GO(IVAR)=X(IVAR)-XTEMPI CALL FUN(NF,KA,X,FA) NAV=NAV+1 GS(IVAR)=FA X(IVAR)=XTEMPI 4 CONTINUE * * NUMERICAL DIFFERENTIATION * DO 10 KVAR=MVAR+1,IAG(KA+1)-1 IVAR=ABS(JAG(KVAR)) IF (KBF.GT.0) THEN IF (IX(IVAR).LE.-5) GO TO 10 END IF XTEMPI=X(IVAR) X(IVAR)=XTEMPI+GO(IVAR) DO 9 LVAR=KVAR,IAG(KA+1)-1 JVAR=ABS(JAG(LVAR)) IF (KBF.GT.0) THEN IF (IX(JVAR).LE.-5) GO TO 9 END IF XTEMPJ=X(JVAR) X(JVAR)=X(JVAR)+GO(JVAR) CALL FUN(NF,KA,X,FA) NAV=NAV+1 I=KVAR-MVAR J=LVAR-MVAR IJ=MAX(I,J)*(MAX(I,J)-1)/2+MIN(I,J) HA(IJ)=((FTEMP-GS(IVAR))+(FA-GS(JVAR)))/(GO(IVAR)*GO(JVAR)) X(JVAR)=XTEMPJ 9 CONTINUE X(IVAR)=XTEMPI 10 CONTINUE FA=FTEMP RETURN END * SUBROUTINE PA0SQ3 ALL SYSTEMS 92/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT OF THE OBJECTIVE FUNCTION * WHICH IS DEFINED AS A SUM OF SQUARES. * * PARAMETERS: * II N NUMBER OF VARIABLES. * RI X(N) VECTOR OF VARIABLES. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO AF(N) VALUES OF THE APPROXIMATED FUNCTIONS. * RA GA(N) GRADIENT OF THE APPROXIMATED FUNCTION. * RI AG(IAG(N+1)-1) SPARSE RECTANGULAR MATRIX WHICH IS USED FOR THE * DIRECTION VECTOR DETERMINATION. * II IAG(N+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI G(N) GRADIENT OF THE OBJECTIVE FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED FUNCTION VALUES. * II KD DEGREE OF REQUIRED DERIVATIVES. * IU LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * II IDER DEGREE OF ANALYTICALLY COMPUTED DERIVATIVES (0 OR 1). * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * S PA0GS3 NUMERICAL DIFFERENTIATION. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PA0SQ3(N,X,F,AF,GA,AG,IAG,JAG,G,ETA1,KD,LD,NFV,NFG, & IDER) DOUBLE PRECISION ETA1,F INTEGER IDER,KD,LD,N,NFV,NFG DOUBLE PRECISION AF(*),AG(*),G(*),GA(*),X(*) INTEGER IAG(*),JAG(*) DOUBLE PRECISION FA INTEGER J,JP,K,KA,L,NAV IF (KD.LE.LD) RETURN IF (KD.GE.0 .AND. LD.LT.0) THEN F = 0.0D0 NFV=NFV+1 END IF IF (KD.GE.1 .AND. LD.LT.1) THEN CALL MXVSET(N,0.0D0,G) IF (IDER.GT.0) NFG=NFG+1 END IF NAV=0 DO 30 KA = 1,N IF (KD.LT.0) GO TO 30 IF (LD.GE.0) THEN FA = AF(KA) ELSE CALL FUN(N,KA,X,FA) AF(KA) = FA END IF IF (LD.GE.0) GO TO 10 F = F + FA*FA 10 IF (KD.LT.1) GO TO 30 IF (IDER.EQ.0) THEN CALL PA0GS3(N,KA,X,FA,GA,IAG,JAG,ETA1,NAV) ELSE CALL DFUN(N,KA,X,GA) END IF K = IAG(KA) L = IAG(KA+1) - K DO 20 J = 1,L JP = JAG(K) G(JP) = G(JP) + FA*GA(JP) AG(K) = GA(JP) K = K + 1 20 CONTINUE 30 CONTINUE IF (KD.GE.0 .AND. LD.LT.0) F = 0.5D0*F IF (IDER.EQ.0) NFV=NFV+NAV/N LD = KD RETURN END * SUBROUTINE PA1HS3 ALL SYSTEMS 99/12/01 * PURPOSE : * NUMERICAL COMPUTATION OF THE HESSIAN MATRIX OF THE APPROXIMATED * FUNCTION USING ITS GRADIENTS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II KA INDEX OF THE SELECTED FUNCTION. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RO HA(M) HESSIAN MATRIX OF THE APPROXIMATED FUNCTION. * RI GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RA GO(NF) AUXILIARY VECTOR. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI FA VALUE OF THE SELECTED FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED VALUES. * II KBF TYPE OF BOUNDS. KBF=0-BOUNDS ARE NOT USED. KBF=1-ONE SIDED * BOUNDS. KBF=2-TWO SIDED BOUNDS. * IO NAG NUMBER OF APPROXIMATED FUNTION GRADIENTS. * * SUBPROGRAMS USED : * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * SUBROUTINE PA1HS3(NF,KA,X,IX,HA,GA,GO,IAG,JAG,FA,ETA1,KBF,NAG) INTEGER NF,KA,IX(*),IAG(*),JAG(*),KBF,NAG DOUBLE PRECISION X(*),HA(*),GA(*),GO(*),FA,ETA1 DOUBLE PRECISION XSTEP,XTEMP,FTEMP,ETA INTEGER I,J,IJ INTEGER IVAR,JVAR,KVAR,LVAR,MVAR ETA=SQRT(ETA1) FTEMP=FA MVAR=IAG(KA)-1 DO 5 KVAR=MVAR+1,IAG(KA+1)-1 IVAR=ABS(JAG(KVAR)) IF (KBF.GT.0) THEN IF (IX(IVAR).LE.-5) GO TO 5 END IF * * STEP SELECTION * XTEMP=X(IVAR) IF (XTEMP.GE.0.0D 0) THEN XSTEP= ETA*MAX(ABS(XTEMP),1.0D 0) ELSE XSTEP=-ETA*MAX(ABS(XTEMP),1.0D 0) END IF X(IVAR)=XTEMP+XSTEP XSTEP=X(IVAR)-XTEMP CALL DFUN(NF,KA,X,GA) NAG=NAG+1 * * NUMERICAL DIFFERENTIATION * DO 4 LVAR=MVAR+1,IAG(KA+1)-1 JVAR=ABS(JAG(LVAR)) IF (KBF.GT.0) THEN IF (IX(JVAR).LE.-5) GO TO 4 END IF I=KVAR-MVAR J=LVAR-MVAR IJ=MAX(I,J)*(MAX(I,J)-1)/2+MIN(I,J) IF (LVAR .GE. KVAR) THEN HA(IJ)=(GA(JVAR)-GO(JVAR))/XSTEP ELSE HA(IJ)=0.5D 0*(HA(IJ)+(GA(JVAR)-GO(JVAR))/XSTEP) END IF 4 CONTINUE X(IVAR)=XTEMP 5 CONTINUE FA=FTEMP RETURN END * SUBROUTINE PA1SF3 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT OF THE OBJECTIVE FUNCTION * WHICH IS DEFINED AS A SUM OF SQUARES. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * RU GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO AG(MA) SPARSE JACOBIAN MATRIX. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * II ISNA SAVING SPECIFICATION. ISNA=0-NO SAVING. ISNA=1-FUNCTION * VALUES ARE SAVED. ISNA=2-FUNCTION VALUES AND GRADIENTS ARE * SAVED. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PA1SF3(NF,NA,X,GA,G,AG,IAG,JAG,F,AF,KD,LD,ISNA, & NFV,NFG) INTEGER NF,NA,IAG(*),JAG(*),KD,LD,ISNA,NFV,NFG DOUBLE PRECISION X(*),GA(*),G(*),AG(*),F,AF(*) INTEGER J,JP,K,L,KA DOUBLE PRECISION FA IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN F=0.0D 0 NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) NFG=NFG+1 END IF DO 5 KA=1,NA IF (KD.LT.0) GO TO 5 IF (LD.LT.0) THEN CALL FUN(NF,KA,X,FA) F=F+FA AF(KA)=FA ELSE FA=AF(KA) END IF IF (KD.LT.1) GO TO 5 IF (LD.LT.1) THEN CALL DFUN(NF,KA,X,GA) K=IAG(KA) L=IAG(KA+1)-K DO 4 J=1,L JP=ABS(JAG(K)) G(JP)=G(JP)+GA(JP) IF (ISNA.GT.1) AG(K)=GA(JP) K=K+1 4 CONTINUE END IF 5 CONTINUE LD=KD RETURN END * SUBROUTINE PA2SF4 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT AND THE HESSIAN MATRIX * OF THE OBJECTIVE FUNCTION WHICH IS DEFINED AS A SUM OF SQUARES. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RU GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA GO(NF) AUXILIARY VECTOR. * RU HA(MB) HESSIAN MATRIX OF THE APPROXIMATED FUNCTION. * RO H(M) SPARSE HESSIAN MATRIX OF THE OBJECTIVE FUNCTION. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED FUNCTION VALUES. * II KBF TYPE OF BOUNDS. KBF=0-BOUNDS ARE NOT USED. KBF=1-ONE SIDED * BOUNDS. KBF=2-TWO SIDED BOUNDS. * II KD DEGREE OF REQUIRED DERVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * IU IDECF DECOMPOSITION INDICATOR. IDECF=0-NO DECOMPOSITION. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * S PA1HS3 NUMERICAL COMPUTATION OF THE PARTIAL HESSIAN MATRIX. * S PASSH2 ADDITION OF THE PARTIAL HESSIAN MATRIX TO THE SPARSE * HESSIAN MATRIX. * SUBROUTINE PA2SF4(NF,NA,X,IX,GA,G,GO,HA,H,IH,JH,IAG,JAG,AF,F, & ETA1,KBF,KD,LD,NFV,NFG,IDECF) INTEGER NF,NA,IX(*),IH(*),JH(*),IAG(*),JAG(*),KBF,KD,LD,NFV,NFG, & IDECF DOUBLE PRECISION X(*),GA(*),G(*),GO(*),HA(*),H(*),AF(*),F,ETA1 DOUBLE PRECISION FA INTEGER J,JP,K,KA,L,NAG IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN F=0.0D 0 NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) NFG=NFG+1 END IF IF (KD.GE.2.AND.LD.LT.2) CALL MXVSET(IH(NF+1)-1,0.0D 0,H) NAG=0 DO 9 KA=1,NA IF (KD.LT.0) GO TO 9 IF (LD.LT.0) THEN CALL FUN(NF,KA,X,FA) F=F+FA AF(KA)=FA ELSE FA=AF(KA) END IF IF (KD.LT.1) GO TO 9 CALL DFUN(NF,KA,X,GA) IF (LD.LT.1) THEN K=IAG(KA) L=IAG(KA+1)-K DO 1 J=1,L JP=ABS(JAG(K)) G(JP)=G(JP)+GA(JP) K=K+1 1 CONTINUE END IF IF (KD.LT.2) GO TO 9 IDECF=0 CALL PA1HS3(NF,KA,X,IX,HA,GO,GA,IAG,JAG,FA,ETA1,KBF,NAG) CALL PASSH2(H,IH,JH,HA,IAG,JAG,KA,1.0D 0) 9 CONTINUE NFG=NFG+NAG/NA LD=KD RETURN END * SUBROUTINE PA2SQ4 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT AND THE HESSIAN MATRIX * OF THE OBJECTIVE FUNCTION WHICH IS DEFINED AS A SUM OF SQUARES. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * RU GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RO AG(MA) SPARSE JACOBIAN MATRIX. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO H(M) SPARSE HESSIAN MATRIX OF THE OBJECTIVE FUNCTION. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED FUNCTION VALUES. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * II ISNA SAVING SPECIFICATION. ISNA=0-NO SAVING. ISNA=1-FUNCTION * VALUES ARE SAVED. ISNA=2-FUNCTION VALUES AND GRADIENTS ARE * SAVED. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * II IDER DEGREE OF ANALYTICALLY COMPUTED DERIVATIVES (0 OR 1). * IU IDECF DECOMPOSITION INDICATOR. IDECF=0-NO DECOMPOSITION. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * S PASSH1 ADDITION OF THE PARTIAL GAUSS-NEWTON TERM TO THE SPARSE * HESSIAN MATRIX. * SUBROUTINE PA2SQ4(NF,NA,X,GA,AG,G,H,IH,JH,IAG,JAG,AF,F,ETA1,KD, & LD,ISNA,NFV,NFG,IDER,IDECF) INTEGER NF,NA,IH(*),JH(*),IAG(*),JAG(*),KD,LD,ISNA,NFV,NFG,IDER, & IDECF DOUBLE PRECISION X(*),GA(*),AG(*),G(*),H(*),AF(*),F,ETA1 INTEGER J,JP,K,KA,L,NAV DOUBLE PRECISION FA IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN F=0.0D 0 NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) IF (IDER.GT.0) NFG=NFG+1 END IF IF (KD.GE.2.AND.LD.LT.2) CALL MXVSET(IH(NF+1)-1,0.0D 0,H) NAV=0 DO 3 KA=1,NA IF (KD.LT.0) GO TO 3 IF (LD.LT.0) THEN CALL FUN(NF,KA,X,FA) F=F+FA*FA AF(KA)=FA ELSE FA=AF(KA) END IF IF (KD.LT.1) GO TO 3 IF (IDER.EQ.0) THEN CALL PA0GS3(NF,KA,X,FA,GA,IAG,JAG,ETA1,NAV) ELSE CALL DFUN(NF,KA,X,GA) END IF IF (LD.GE.1) GO TO 2 K=IAG(KA) L=IAG(KA+1)-K DO 1 J=1,L JP=ABS(JAG(K)) G(JP)=G(JP)+FA*GA(JP) IF (ISNA.GT.1) AG(K)=GA(JP) K=K+1 1 CONTINUE 2 IF (KD.LT.2) GO TO 3 IDECF=0 CALL PASSH1(H,IH,JH,IAG,JAG,GA,KA,1.0D 0) 3 CONTINUE IF (KD.GE.0.AND.LD.LT.0) F=5.0D-1*F IF (IDER.EQ.0) NFV=NFV+NAV/NA LD=KD RETURN END * SUBROUTINE PA2SQ8 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT AND THE HESSIAN MATRIX * OF THE OBJECTIVE FUNCTION WHICH IS DEFINED AS A SUM OF SQUARES. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RU GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA GO(NF) AUXILIARY VECTOR. * RA GS(NF) AUXILIARY VECTOR. * RU HA(ME) HESSIAN MATRIX OF THE APPROXIMATED FUNCTION. * RO H(M) SPARSE HESSIAN MATRIX OF THE OBJECTIVE FUNCTION. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED FUNCTION VALUES. * II KBF TYPE OF BOUNDS. KBF=0-BOUNDS ARE NOT USED. KBF=1-ONE SIDED * BOUNDS. KBF=2-TWO SIDED BOUNDS. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * II IPOM1 CORRECTION OPTION. IPOM1=0-THE NEWTON CORRECTION IS USED. * IPOM1=1-CORRECTION IS NOT USED. * II IDER DEGREE OF ANALYTICALLY COMPUTED DERIVATIVES (0 OR 1). * IU IDECF DECOMPOSITION INDICATOR. IDECF=0-NO DECOMPOSITION. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * S PA0HS3 NUMERICAL COMPUTATION OF THE PARTIAL HESSIAN MATRIX. * S PA1HS3 NUMERICAL COMPUTATION OF THE PARTIAL HESSIAN MATRIX. * S PASSH1 ADDITION OF THE PARTIAL GAUSS-NEWTON TERM TO THE SPARSE * HESSIAN MATRIX. * S PASSH2 ADDITION OF THE PARTIAL HESSIAN MATRIX TO THE SPARSE * HESSIAN MATRIX. * SUBROUTINE PA2SQ8(NF,NA,X,IX,GA,G,GO,GS,HA,H,IH,JH,IAG,JAG,AF,F, & ETA1,KBF,KD,LD,NFV,NFG,IPOM1,IDER,IDECF) INTEGER NF,NA,IX(*),IH(*),JH(*),IAG(*),JAG(*),KBF,KD,LD,NFV,NFG, & IPOM1,IDER,IDECF DOUBLE PRECISION X(*),GA(*),G(*),GO(*),GS(*),HA(*),H(*),AF(*),F, & ETA1 INTEGER J,JP,K,KA,L,NAV,NAG DOUBLE PRECISION FA IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN F=0.0D 0 NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) IF (IDER.GT.0) NFG=NFG+1 END IF IF (KD.GE.2.AND.LD.LT.2) CALL MXVSET(IH(NF+1)-1,0.0D 0,H) NAV=0 NAG=0 DO 9 KA=1,NA IF (KD.LT.0) GO TO 9 IF (LD.LT.0) THEN CALL FUN(NF,KA,X,FA) F=F+FA*FA AF(KA)=FA ELSE FA=AF(KA) END IF IF (KD.LT.1) GO TO 9 IF (IDER.EQ.0) THEN CALL PA0GS3(NF,KA,X,FA,GA,IAG,JAG,ETA1,NAV) ELSE CALL DFUN(NF,KA,X,GA) END IF IF (LD.LT.1) THEN K=IAG(KA) L=IAG(KA+1)-K DO 1 J=1,L JP=ABS(JAG(K)) G(JP)=G(JP)+FA*GA(JP) K=K+1 1 CONTINUE END IF IF (KD.LT.2) GO TO 9 IDECF=0 IF (IPOM1.EQ.0) THEN IF (IDER.EQ.0) THEN CALL PA0HS3(NF,KA,X,IX,HA,GO,GS,IAG,JAG,FA,ETA1,KBF,NAV) ELSE CALL PA1HS3(NF,KA,X,IX,HA,GO,GA,IAG,JAG,FA,ETA1,KBF,NAG) END IF END IF CALL PASSH1(H,IH,JH,IAG,JAG,GA,KA,1.0D 0) IF (IPOM1.EQ.0) CALL PASSH2(H,IH,JH,HA,IAG,JAG,KA,FA) 9 CONTINUE IF (KD.GE.0.AND.LD.LT.0) F=5.0D-1*F IF (IDER.EQ.0) NFV=NFV+NAV/NA IF (IDER.GT.0) NFG=NFG+NAG/NA LD=KD RETURN END * SUBROUTINE PALNG3 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE GRADIENT OF THE LINEAR APPROXIMATED FUNCTION. * * PARAMETERS : * RO AG(MA) SPARSE JACOBIAN MATRIX. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * II KA INDEX OF THE SELECTED FUNCTION. * SUBROUTINE PALNG3(AG,IAG,JAG,GA,KA) DOUBLE PRECISION AG(*),GA(*) INTEGER IAG(*),JAG(*),KA INTEGER J,JP,K,L K=IAG(KA) L=IAG(KA+1)-K DO 2 J=1,L JP=ABS(JAG(K)) GA(JP)=AG(K) K=K+1 2 CONTINUE RETURN END * SUBROUTINE PASED3 ALL SYSTEMS 07/12/01 * PURPOSE : * COMPRESSED SPARSE STRUCTURE OF THE JACOBIAN MATRIX IS COMPUTED FROM * THE COORDINATE FORM. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * II MA NUMBER OF NONZERO ELEMENTS IN THE SPARSE JACOBIAN MATRIX. * IU IAG(MA+NA) ON INPUT ROW INDICES OF NONZERO ELEMENTS IN THE FIELD AG. * ON OUTPUT POSITIONS OF THE FIRST ROW ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * IO IER ERROR MESAGE. IER=0-THE STANDARD INPUT DATA ARE CORRECT. * IER=1-ERROR IN THE ARRAY IAG. IER=2-ERROR IN THE ARRAY JAG. * SUBROUTINE PASED3(NA,MA,IAG,JAG,IER) INTEGER NA,MA,IAG(*),JAG(*),IER INTEGER I,J,K,L,KA IER=0 CALL MXVSR7(MA,IAG,JAG) IF (IAG(1).LT.1.OR.IAG(MA).GT.NA) THEN IER=1 RETURN END IF CALL MXVINS(NA,0,IAG(MA+1)) DO 1 J=1,MA IAG(IAG(J)+MA)=IAG(IAG(J)+MA)+1 1 CONTINUE IAG(1)=1 DO 2 KA=1,NA IAG(KA+1)=IAG(KA)+IAG(KA+MA) 2 CONTINUE I=0 DO 4 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K IF (L.GT.0) THEN CALL MXVSRT(L,JAG(K)) IF (JAG(K).LT.1.OR.JAG(K+L-1).GT.NA) THEN IER=2 RETURN END IF END IF IAG(KA)=IAG(KA)-I DO 3 J=1,L IF (J.GT.1.AND.JAG(K).EQ.JAG(K-1)) THEN I=I+1 ELSE JAG(K-I)=JAG(K) END IF K=K+1 3 CONTINUE 4 CONTINUE IAG(NA+1)=IAG(NA+1)-I MA=IAG(NA+1)-1 RETURN END * SUBROUTINE PASSH1 ALL SYSTEMS 98/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE SPARSE JACOBIAN * MATRIX. * * PARAMETERS : * RU H(M) NONZERO ELEMENTS OF THE SPARSE HESSIAN MATRIX. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) COLUMN INDICES OF THE NONZERO ELEMENTS OF H. * II IAG(NA+1) POSITIONS OF THE FIRST ROWS ELEMENTS IN THE SPARSE * JACOBIAN STRUCTURE. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE SPARSE JACOBIAN * STRUCTURE. * RI GA(NF) GRADIENT OF THE SELECTED FUNCTION. * II KA INDEX OF THE SELECTED FUNCTION (ROW OF THE SPARSE JACOBIAN * MATRIX). * RI FACTOR SCALING FACTOR. * SUBROUTINE PASSH1(H,IH,JH,IAG,JAG,GA,KA,FACTOR) INTEGER IH(*),JH(*),IAG(*),JAG(*),KA DOUBLE PRECISION H(*),GA(*),FACTOR DOUBLE PRECISION TEMP INTEGER I,J,JF,JA,K,LA LA=IAG(KA+1)-1 DO 6 K=IAG(KA),LA I=ABS(JAG(K)) TEMP=FACTOR*GA(I) JF=IH(I) DO 5 JA=K,LA J=ABS(JAG(JA)) 2 IF (ABS(JH(JF)).LT.J) THEN JF=JF+1 GO TO 2 END IF H(JF)=H(JF)+TEMP*GA(J) 5 CONTINUE 6 CONTINUE RETURN END * SUBROUTINE PASSH2 ALL SYSTEMS 98/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE SPARSE JACOBIAN * MATRIX. * * PARAMETERS : * RU H(M) NONZERO ELEMENTS OF THE SPARSE HESSIAN MATRIX. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) COLUMN INDICES OF THE NONZERO ELEMENTS OF H. * II HA(ME) PACKED HESSIAN MATRIX OF THE SELECTED FUNCTION. * II IAG(NA+1) POSITIONS OF THE FIRST ROWS ELEMENTS IN THE SPARSE * JACOBIAN STRUCTURE. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE SPARSE JACOBIAN * STRUCTURE. * II KA INDEX OF THE SELECTED FUNCTION (ROW OF THE SPARSE JACOBIAN * MATRIX). * RI FACTOR SCALING FACTOR. * SUBROUTINE PASSH2(H,IH,JH,HA,IAG,JAG,KA,FACTOR) INTEGER IH(*),JH(*),IAG(*),JAG(*),KA DOUBLE PRECISION H(*),HA(*),FACTOR INTEGER I,II,IA,J,JJ,JA,JF,K,KK,L KK=0 II=IAG(KA) L=IAG(KA+1)-II DO 6 IA=1,L KK=KK+IA I=ABS(JAG(II)) JF=IH(I) JJ=II K=KK DO 4 JA=IA,L J=ABS(JAG(JJ)) 2 IF (ABS(JH(JF)).LT.J) THEN JF=JF+1 GO TO 2 END IF H(JF)=H(JF)+FACTOR*HA(K) K=K+JA JJ=JJ+1 4 CONTINUE II=II+1 6 CONTINUE RETURN END * SUBROUTINE PASSH3 ALL SYSTEMS 98/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE SPARSE JACOBIAN * MATRIX. * * PARAMETERS : * RU H(M) NONZERO ELEMENTS OF THE SPARSE HESSIAN MATRIX. * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) COLUMN INDICES OF THE NONZERO ELEMENTS OF H. * II IAG(NA+1) POSITIONS OF THE FIRST ROWS ELEMENTS IN THE SPARSE * JACOBIAN STRUCTURE. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE SPARSE JACOBIAN * STRUCTURE. * RI GA(NF) GRADIENT OF THE SELECTED FUNCTION. * II KA INDEX OF THE SELECTED FUNCTION (ROW OF THE SPARSE JACOBIAN * MATRIX). * RI FACTOR SCALING FACTOR. * SUBROUTINE PASSH3(H,IH,JH,IAG,JAG,GA,KA,FACTOR) INTEGER IH(*),JH(*),IAG(*),JAG(*),KA DOUBLE PRECISION H(*),GA(*),FACTOR DOUBLE PRECISION TEMP INTEGER I,J,JF,JA,K,LA LA=IAG(KA+1)-1 DO 6 K=IAG(KA),LA I=ABS(JAG(K)) IF (I.LE.0) GO TO 6 TEMP=FACTOR*GA(I) JF=IH(I) DO 5 JA=K,LA J=ABS(JAG(JA)) IF (J.LE.0) GO TO 5 2 IF (ABS(JH(JF)).LT.J) THEN JF=JF+1 GO TO 2 END IF H(JF)=H(JF)+TEMP*GA(J) 5 CONTINUE 6 CONTINUE RETURN END * SUBROUTINE PCBS04 ALL SYSTEMS 98/12/01 * PURPOSE : * INITIATION OF THE VECTOR CONTAINING TYPES OF CONSTRAINTS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RI EPS9 TOLERANCE FOR ACTIVE CONSTRAINTS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * SUBROUTINE PCBS04(NF,X,IX,XL,XU,EPS9,KBF) INTEGER NF,IX(*),KBF DOUBLE PRECISION X(*),XL(*),XU(*),EPS9 DOUBLE PRECISION TEMP INTEGER I,IXI IF (KBF.GT.0) THEN DO 1 I=1,NF TEMP=1.0D 0 IXI=ABS(IX(I)) IF ((IXI.EQ.1.OR.IXI.EQ.3.OR.IXI.EQ.4).AND.X(I).LE.XL(I)+ & EPS9*MAX(ABS(XL(I)),TEMP)) X(I)=XL(I) IF ((IXI.EQ.2.OR.IXI.EQ.3.OR.IXI.EQ.4).AND.X(I).GE.XU(I)- & EPS9*MAX(ABS(XU(I)),TEMP)) X(I)=XU(I) 1 CONTINUE END IF RETURN END * SUBROUTINE PDSGM1 ALL SYSTEMS 01/09/22 * PURPOSE : * COMPUTATION OF A TRUST-REGION STEP BY THE DOG-LEG METHOD WITH DIRECT * MATRIX DECOMPOSITIONS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II MMAX MAXIMUM DIMENSION OF THE SPARSE TABLEAU. * II MH POINTER OBTAINED BY THE SUBROUTINE MXSPCC. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA H(MMAX) NONZERO ELEMENTS OF THE APPROXIMATION OF THE SPARSE * HESSIAN MATRIX TOGETHER WITH AN ADDITIONAL SPACE USED FOR * THE NUMERICAL DIFFERENTIATION. * II IH(NF+1) POINTERS OF DIAGONAL ELEMENTS OF THE MATRIX H. * IU JH(MMAX) INDICES OF NONZERO ELEMENTS OF THE MATRIX H * TOGETHER WITH AN ADDITIONAL SPACE USED FOR THE NUMERICAL * DIFFERENTIATION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * RA XS(NF) AUXILIARY VECTOR. * II PSL(NF+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * IA PERM(NF) PERMUTATION VECTOR. * IA WN11(NF+1) AUXILIARY VECTOR. * IA WN12(NF+1) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RU XDEL TRUST REGION RADIUS. * RO GNORM NORM OF THE GRADIENT VECTOR. * RO SNORM NORM OF THE DIRECTION VECTOR. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RO P VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP VALUE OF THE QUADRATIC TERM. * RI ETA2 TOLERANCE FOR POSITIVE DEFINITENESS. * RI ALF2 TOLERANCE FOR THE GRADIENT NORM. * II KD ORDER OF COMPUTED DERIVATIVES. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * IU IDEC DECOMPOSITION INDICATOR. IDEC=0-NO DECOMPOSITION. * IU NDEC NUMBER OF MATRIX DECOMPOSITIONS. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F WAS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX WAS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * VALUES ITERM<=-40 DETECT A LACK OF SPACE. * * SUBPROGRAMS USED : * S PNSTEP COMPUTATION OF THE BOUNDARY STEP. * S MXSPCB BACK SUBSTITUTION USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXSPCD COMPUTATION OF A DIRECTION OF NEGATIVE CURVATURE USING * THE SPARSE DECOMPOSITION OBTAINED BY MXSPCF. * S MXSPCF GILL-MURRAY DECOMPOSITION OD A SPARSE SYMMETRIC MATRIX. * S MXSPCM MATRIX-VECTOR PRODUCT USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * RF MXSPCQ GENERALIZED DOT PRODUCT USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXSPCT COPYING A SPARSE SYMMETRIC MATRIX INTO THE PERMUTED * FACTORIZED COMPACT SCHEME. * RF MXSSMQ COMPUTATION OF THE SPARSE QUADRATIC TERM. * S MXUCOP COPYING OF A VECTOR. * S MXUDIF DIFFERENCE OF TWO VECTORS. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVSBP INVERSE PERMUTATION OF A VECTOR * S MXVSCL SCALING OF A VECTOR. * S MXVSET INITIATION OF A VECTOR. * S MXVSFP PERMUTATION OF A VECTOR. * * METHOD : * J.E.DENNIS, H.H.W.MEI: AN UNCONSTRAINED OPTIMIZATION ALGORITHM WHICH * USES FUNCTION AND GRADIENT VALUES. REPORT NO. TR-75-246, DEPT. OF * COMPUTER SCIENCE, CORNELL UNIVERSITY 1975. * SUBROUTINE PDSGM1(NF,MMAX,MH,IX,G,H,IH,JH,S,XO,GO,XS,PSL,PERM, & WN11,WN12,XMAX,XDEL,GNORM,SNORM,FMIN,F,P,PP,ETA2,ALF2,KD,KBF, & IEST,IDEC,NDEC,ITERD,ITERM) INTEGER NF,MMAX,MH,IX(*),IH(*),JH(*),PSL(*),PERM(*),WN11(*), & WN12(*),KD,KBF,IEST,IDEC,NDEC,ITERD,ITERM DOUBLE PRECISION G(*),H(*),S(*),XO(*),GO(*),XS(*),XMAX,XDEL, & GNORM,SNORM,FMIN,F,P,PP,ETA2,ALF2 INTEGER MM,INF,MODE DOUBLE PRECISION B1,B2,B3,D3,S1,S2 DOUBLE PRECISION MXSSMQ,MXSPCQ,MXUDOT SAVE INF * * DIRECTION DETERMINATION * IF (IDEC.LT.0) IDEC=0 IF (IDEC.EQ.0) THEN ELSE IF (IDEC.EQ.1) THEN ELSE ITERD=-1 GO TO 13130 END IF MM=IH(NF+1)-1 B2=MXUDOT(NF,G,G,IX,KBF) GNORM=SQRT(B2) MODE=1 IF (ALF2*GNORM.LE.XDEL) THEN MODE=2 IF (IDEC.EQ.0) THEN CALL MXSPCT(NF,MM,MH,MMAX,H,JH,PSL,ITERM) IF (ITERM.NE.0) GO TO 13130 * * SPARSE GILL-MURRAY DECOMPOSITION * S1=ETA2 CALL MXSPCF(NF,H(MM+1),PSL,JH(MM+1),WN11,WN12,XS,INF,S1,S2) NDEC=NDEC+1 IDEC=1 END IF IF (INF.GT.0) THEN CALL MXSPCD(NF,H(MM+1),PSL,JH(MM+1),S,INF) CALL MXVSBP(NF,PERM,S,XS) * * DIRECTION OF NEGATIVE CURVATURE * SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) IF (SNORM*SNORM*GNORM+S1*XDEL.LE.0.0D 0) THEN CALL MXVSCL(NF,XDEL/SNORM,S,S) SNORM=XDEL ITERD=4 GO TO 13120 END IF ELSE IF (GNORM.LE.0.0D 0) THEN * * ZERO DIRECTION * SNORM=0.0D 0 CALL MXVSET(NF,0.0D 0,S) GO TO 13120 END IF END IF IF (IDEC.EQ.0) THEN B1=MXSSMQ(NF,H,IH,JH,G,G) ELSE CALL MXUCOP(NF,G,GO,IX,KBF) CALL MXVSFP(NF,PERM,GO,XS) CALL MXSPCM(NF,H(MM+1),PSL,JH(MM+1),GO,XS,1) B1=MXSPCQ(NF,H(MM+1),PSL,GO) END IF IF (XDEL.LE.0.0D 0) THEN * * INITIAL TRUST REGION BOUND * IF (B1.LE.0.0D 0) THEN XDEL=GNORM ELSE XDEL=(B2/B1)*GNORM END IF IF (IEST.EQ.1) XDEL=MIN(XDEL,4.0D 0*(F-FMIN)/GNORM) XDEL=MIN(XDEL,XMAX) END IF IF (B1.LE.0.0D 0.OR.B2*GNORM.GE.B1*XDEL) THEN * * SCALED STEEPEST DESCENT DIRECTION IS ACCEPTED * CALL MXVSCL(NF,-XDEL/GNORM,G,S) SNORM=XDEL ITERD=3 GO TO 13120 END IF IF (IDEC.EQ.0) THEN CALL MXSPCT(NF,MM,MH,MMAX,H,JH,PSL,ITERM) IF (ITERM.NE.0) THEN GO TO 13130 END IF * * SPARSE GILL-MURRAY DECOMPOSITION * S1=ETA2 CALL MXSPCF(NF,H(MM+1),PSL,JH(MM+1),WN11,WN12,XS,INF,S1,S2) NDEC=NDEC+1 IDEC=1 END IF * * COMPUTATION OF THE NEWTON DIRECTION * CALL MXUCOP(NF,G,GO,IX,KBF) CALL MXVSFP(NF,PERM,GO,XS) CALL MXSPCB(NF,H(MM+1),PSL,JH(MM+1),GO,0) CALL MXVSBP(NF,PERM,GO,XS) D3=SQRT(MXUDOT(NF,GO,GO,IX,KBF)) * * COMPUTATION OF THE STEEPEST DESCENT DIRECTION * B2=B2/B1 SNORM=B2*GNORM CALL MXVSCL(NF,-B2,G,S) CALL MXUNEG(NF,GO,GO,IX,KBF) CALL MXUDIF(NF,GO,S,XO,IX,KBF) B1=MXUDOT(NF,S,XO,IX,KBF) B2=MXUDOT(NF,XO,XO,IX,KBF) IF (B2.LE.1.0D-8*XDEL*XDEL) THEN * * NEWTON AND THE STEEPEST DESCENT DIRECTION ARE * APPROXIMATELY EQUAL * CALL MXUCOP(NF,GO,S,IX,KBF) SNORM=D3 ITERD=1 ELSE IF (B1.LE.0.0D 0) THEN * * BOUNDARY STEP WITH NEGATIVE INCREMENT * CALL PNSTEP(XDEL,SNORM,-B1,B2,B3) CALL MXUDIR(NF,-B3,XO,S,S,IX,KBF) SNORM=XDEL ITERD=3 ELSE IF (D3.LE.XDEL) THEN * * NEWTON DIRECTION IS ACCEPTED * CALL MXUCOP(NF,GO,S,IX,KBF) SNORM=D3 ITERD=1 ELSE * * DOUBLE DOGLEG STRATEGY * D3=XDEL/D3 B3=MXUDOT(NF,S,GO,IX,KBF) D3=MAX(D3,SNORM*SNORM/B3) CALL MXUDIR(NF,-D3,GO,S,XO,IX,KBF) B1=SNORM*SNORM-D3*B3 B2=MXUDOT(NF,XO,XO,IX,KBF) CALL PNSTEP(XDEL,SNORM,-B1,B2,B3) CALL MXUDIR(NF,-B3,XO,S,S,IX,KBF) SNORM=XDEL ITERD=3 END IF 13120 CONTINUE IF (IDEC.EQ.0) THEN PP=MXSSMQ(NF,H,IH,JH,S,S)*0.5D 0 ELSE CALL MXUCOP(NF,S,GO,IX,KBF) CALL MXVSFP(NF,PERM,GO,XS) CALL MXSPCM(NF,H(MM+1),PSL,JH(MM+1),GO,XS,1) PP=MXSPCQ(NF,H(MM+1),PSL,GO)*0.5D 0 IF (ITERD.EQ.1.AND.INF.NE.0) ITERD=2 END IF 13130 CONTINUE IF (KD.GT.0) P=MXUDOT(NF,G,S,IX,KBF) RETURN END * SUBROUTINE PDSGM4 ALL SYSTEMS 01/09/22 * PURPOSE : * COMPUTATION OF A TRUST-REGION STEP BY THE SHIFTED STEIHAUG-TOINT * METHOD WITH CONJUGATE GRADIENT ITERATIONS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II MMAX MAXIMUM DIMENSION OF THE SPARSE TABLEAU. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA H(MMAX) NONZERO ELEMENTS OF THE APPROXIMATION OF THE SPARSE * HESSIAN MATRIX TOGETHER WITH AN ADDITIONAL SPACE USED FOR * THE NUMERICAL DIFFERENTIATION. * II IH(NF+1) POINTERS OF DIAGONAL ELEMENTS OF THE MATRIX H. * IU JH(MMAX) INDICES OF NONZERO ELEMENTS OF THE MATRIX H * TOGETHER WITH AN ADDITIONAL SPACE USED FOR THE NUMERICAL * DIFFERENTIATION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * RA XS(NF) AUXILIARY VECTOR. * RA GS(NF) AUXILIARY VECTOR. * IA IW(NF+1) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RU XDEL TRUST REGION RADIUS. * RO GNORM NORM OF THE GRADIENT VECTOR. * RO GNORMO OLD NORM OF THE GRADIENT VECTOR. * RO SNORM NORM OF THE DIRECTION VECTOR. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RO P VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP VALUE OF THE QUADRATIC TERM. * RI ETA0 MACHINE PRECISION. * RI ETA2 TOLERANCE FOR POSITIVE DEFINITENESS. * RI DEL1 LOWER TOLERANCE FOR THE TRUST-REGION RADIUS. * II KD ORDER OF COMPUTED DERIVATIVES. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II MOS1 NUMBER OF LANCZOS STEPS IN THE SHIFTED STEIHAUG-TOINT * METHOD. * II MOS2 TYPE OF PRECONDITIONING. MOS2=1-PRECONDITIONING IS NOT * USED. MOS2=2-PRECONDITIONING BY THE INCOMPLETE GILL-MURRAY * DECOMPOSITION. MOS2=3-PRECONDITIONING BY THE INCOMPLETE * GILL-MURRAY DECOMPOSITION WITH A PRELIMINARY SOLUTION OF * THE PRECONDITIONED SYSTEM WHICH IS USED IF IT SATISFIES * THE TERMINATION CRITERION. * II MOS3 PRECONDITIONING IN ILL-CONTITIONED AND INDEFINITE CASES. * MOS3=0-PRECONDITIONING IN BOTH THESE CASES IS SUPPRESSED. * MOS3=1-PRECONDITIONING IN ILL-CONDITIONED CASE IS SUPPRESSED. * MOS3=2-PRECONDITIONING IS ALWAYS USED. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * IU IDEC DECOMPOSITION INDICATOR. IDEC=0-NO DECOMPOSITION. * IU NDEC NUMBER OF MATRIX DECOMPOSITIONS. * II NIT NUMBER OF OUTER ITERATIONS. * IU NIN NUMBER OF INNER CONJUGATE GRADIENT ITERATIONS. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F WAS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX WAS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * VALUES ITERM<=-40 DETECT A LACK OF SPACE. * * SUBPROGRAMS USED : * S PNSTEP COMPUTATION OF THE BOUNDARY STEP. * S MXSPTB BACK SUBSTITUTION AFTER THE GILL-MURRAY DECOMPOSITION. * S MXSPTF INCOMPLETE GILL-MURRAY DECOMPOSITION. * S MXSSDA SPARSE SYMMETRIC MATRIX IS AUGMENTED BY THE SCALED UNIT * MATRIX. * S MXSSMD MATRIX-VECTOR PRODUCT FOLLOWED BY THE ADDITION OF A * SCALED VECTOR. * S MXSSMM MATRIX-VECTOR PRODUCT. * RF MXSSMQ COMPUTATION OF THE SPARSE QUADRATIC TERM. * S MXTPGB BACK SUBSTITUTION FOR A DECOMPOSED TRIDIAGONAL MATRIX. * S MXTPGF CHOLESKI DECOMPOSITION OF A TRIDIAGONAL MATRIX. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDEL NORM OF VECTOR DIFFERENCE. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * RF MXUNOR EUCLIDEAN NORM OF A VECTOR. * S MXVCOP COPYING OF A VECTOR. * S MXVCOR CORRECTION OF A VECTOR (ZERO ELEMENTS ARE REPLACED BY * THE NONZERO NUMBER). * RF MXVDOT DOT PRODUCT OF TWO VECTORS. * S MXVNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVSCL SCALING OF A VECTOR. * S MXVSET INITIATION OF A VECTOR. * S MXVSUM SUM OF TWO VECTORS. * RF MXVVDP GENERALIZED DOT PRODUCT. * * METHOD : * L.LUKSAN, C.MATONOHA, J.VLCEK: A SHIFTED STEIHAUG-TOINT METHOD FOR * COMPUTING TRUST-REGION STEP. REPORT NO. V-914, INST. OF COMPUTER * SCIENCE, CZECH ACADEMY OF SCIENCES, 2004. * SUBROUTINE PDSGM4(NF,MMAX,IX,G,H,IH,JH,S,XO,GO,XS,GS,IW,XMAX, & XDEL,GNORM,GNORMO,SNORM,FMIN,F,P,PP,ETA0,ETA2,DEL1,KD,KBF, & MOS1,MOS2,MOS3,IEST,IDEC,NDEC,NIT,NIN,ITERD,ITERM) INTEGER NF,MMAX,IX(*),IH(*),JH(*),IW(*),KD,KBF,MOS1,MOS2,MOS3, & IEST,IDEC,NDEC,NIT,NIN,ITERD,ITERM DOUBLE PRECISION G(*),H(*),S(*),XO(*),GO(*),XS(*),GS(*),XMAX, & XDEL,GNORM,GNORMO,SNORM,FMIN,F,P,PP,ETA0,ETA2,DEL1 INTEGER NOS1,NOS2,NRED,I,M,INF DOUBLE PRECISION T,EL,EU,PAR,ALF,EPS,RHO,RHO1,RHO2,SIG,TAU DOUBLE PRECISION MXSSMQ,MXUDOT,MXUDEL,MXUNOR,MXVDOT,MXVVDP SAVE EPS * * DIRECTION DETERMINATION * IF (NIT.LE.1) THEN EPS=0.9D 0 GNORMO=1.0D 60 END IF IF (IDEC.LT.0) IDEC=0 IF (IDEC.NE.0.AND.IDEC.NE.1) THEN ITERD=-1 GO TO 13180 END IF GNORM=SQRT(MXUDOT(NF,G,G,IX,KBF)) IF (GNORM.GE.1.0D 3*GNORMO) EPS=1.0D-6 GNORMO=GNORM RHO1=MXUDOT(NF,G,G,IX,KBF) IF (XDEL.LE.0.0D 0) THEN * * INITIAL TRUST REGION BOUND * RHO2=MXSSMQ(NF,H,IH,JH,G,G) IF (RHO2.LE.0.0D 0) THEN XDEL=GNORM ELSE XDEL=(GNORM*GNORM/RHO2)*GNORM END IF IF (IEST.EQ.1) XDEL=MIN(XDEL,4.0D 0*(F-FMIN)/GNORM) XDEL=MIN(XDEL,XMAX) END IF PAR=MIN(EPS,SQRT(GNORM)) IF (PAR.GT.1.0D-2) THEN PAR=MIN(PAR,1.0D 0/DBLE(NIT)) END IF PAR=PAR*PAR NOS1=MIN(NF,MOS1) IF (NOS1.LE.1) THEN T=0.0D 0 ELSE * * INCOMPLETE LANCZOS TRIDIAGONALIZATION * INF=0 CALL MXVCOP(NF,G,XS) CALL MXVSET(NF,0.0D 0,GS) CALL MXVSCL(NF,1.0D 0/MXUNOR(NF,XS,IX,KBF),XS,XS) DO 13111 NRED=1,NOS1 IF (NRED.GT.1) THEN DO 13112 I=1,NF EL=XS(I) XS(I)=GS(I)/EU GS(I)=-EU*EL 13112 CONTINUE END IF CALL MXSSMD(NF,H,IH,JH,XS,1.0D 0,GS,GS) EL=MXUDOT(NF,XS,GS,IX,KBF) CALL MXUDIR(NF,-EL,XS,GS,GS,IX,KBF) EU=MXUNOR(NF,GS,IX,KBF) IF (EU.LE.0.0D 0) THEN INF=NRED GO TO 13116 END IF XO(NRED)=EL GO(NRED)=EU 13111 CONTINUE 13116 CONTINUE CALL MXVCOR(NOS1,ETA0,XO) T=0.0D 0 RHO2=DEL1*XDEL DO 13117 NRED=1,10 T=MIN(T,1.0D 5) IF (T.GE.1.0D 5) GO TO 13118 * * SOLUTION OF THE TRIDIAGONAL SYSTEM * ALF=ETA0 CALL MXVSET(NOS1,T,XS) CALL MXVSUM(NOS1,XO,XS,XS) CALL MXVCOP(NOS1,GO,GS) CALL MXTPGF(NOS1,XS,GS,INF,ALF,TAU) CALL MXVSET(NOS1,0.0D 0,S) S(1)=GNORM CALL MXTPGB(NOS1,XS,GS,S,0) RHO=MXVDOT(NOS1,S,S) IF (RHO.LE.XDEL**2) GO TO 13118 CALL MXTPGB(NOS1,XS,GS,S,1) * * MARQUARDT PARAMETER T IS COMPUTED USING THE ONE-DIMENSIONAL * NEWTON METHOD * T=T+(RHO/MXVVDP(NOS1,XS,S,S))*((SQRT(RHO)-RHO2)/RHO2) 13117 CONTINUE END IF 13118 CONTINUE CALL MXVNEG(NF,G,XO) NOS2=MOS2-1 IF (NOS2.GT.0) THEN * * INCOMPLETE GILL-MURRAY DECOMPOSITION * ALF=ETA2 M=IH(NF+1)-1 IF (2*M.GE.MMAX) THEN ITERM=-48 GO TO 13180 END IF CALL MXVCOP(M,H,H(M+1)) IF (T.GT.0.0D 0) CALL MXSSDA(NF,H(M+1),IH,T) CALL MXSPTF(NF,H(M+1),IH,JH,IW,INF,ALF,SIG) IF (INF+10.LT.0) THEN ITERM=-48 GO TO 13180 END IF IF (MOS3.EQ.0) THEN IF (INF.NE.0) NOS2=0 ELSE IF (MOS3.EQ.1) THEN IF (INF.LT.0) NOS2=0 END IF NDEC=NDEC+1 IDEC=1 IF (NOS2.GT.1) THEN * * PRELIMINARY INEXACT SOLUTION * CALL MXSPTB(NF,H(M+1),IH,JH,XO,0) SNORM=SQRT(MXUDOT(NF,XO,XO,IX,KBF)) IF (SNORM.LE.XDEL*1.0D 5) THEN CALL MXVCOP(NF,XO,S) IF (SNORM.LE.XDEL) THEN ITERD=2 ELSE CALL MXVSCL(NF,XDEL/SNORM,S,S) SNORM=XDEL ITERD=3 END IF CALL MXSSMD(NF,H,IH,JH,S,1.0D 0,G,GO) IF (MXUDOT(NF,GO,GO,IX,KBF).LE.1.0D-2*PAR*RHO1) GO TO 13180 END IF END IF END IF * * CG INITIATION * RHO=RHO1 SNORM=0.0D 0 CALL MXVSET(NF,0.0D 0,S) CALL MXVNEG(NF,G,XS) IF (NOS2.EQ.0) THEN ELSE IF (NOS2.EQ.1) THEN CALL MXSPTB(NF,H(M+1),IH,JH,XO,0) RHO=MXUDOT(NF,XS,XO,IX,KBF) ELSE RHO=MXUDOT(NF,XS,XO,IX,KBF) END IF DO 13120 NRED=1,NF+3 IF (T.GT.0.0D 0) THEN CALL MXSSMD(NF,H,IH,JH,XO,T,XO,GO) ELSE CALL MXSSMM(NF,H,IH,JH,XO,GO) END IF ALF=MXUDOT(NF,XO,GO,IX,KBF) IF (ALF.LE.0.0D 0) GO TO 13160 ALF=RHO/ALF RHO2=SQRT(MXUDEL(NF,ALF,XO,S,IX,KBF)) IF (RHO2.GE.XDEL) GO TO 13160 * * CG STEP * CALL MXUDIR(NF, ALF,XO,S,S,IX,KBF) CALL MXUDIR(NF,-ALF,GO,XS,XS,IX,KBF) NIN=NIN+1 SNORM=RHO2 RHO2=MXUDOT(NF,XS,XS,IX,KBF) IF (RHO2.LE.PAR*RHO1) GO TO 13150 IF (NRED.GE.NF+3) GO TO 13150 IF (NOS2.NE.0) THEN CALL MXVCOP(NF,XS,GO) CALL MXSPTB(NF,H(M+1),IH,JH,GO,0) RHO2=MXUDOT(NF,XS,GO,IX,KBF) ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XO,GO,XO,IX,KBF) ELSE ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XO,XS,XO,IX,KBF) END IF RHO=RHO2 13120 CONTINUE * * AN INEXACT SOLUTION IS OBTAINED * 13150 CONTINUE SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) ITERD=2 GO TO 13180 * * BOUNDARY STEP IS COMPUTED * 13160 CONTINUE RHO1=MXUDOT(NF,XO,S,IX,KBF) RHO2=MXUDOT(NF,XO,XO,IX,KBF) CALL PNSTEP(XDEL,SNORM,RHO1,RHO2,ALF) CALL MXUDIR(NF,ALF,XO,S,S,IX,KBF) SNORM=XDEL ITERD=3 NRED=-NRED 13180 CONTINUE PP=MXSSMQ(NF,H,IH,JH,S,S)*0.5D 0 IF (KD.GT.0) P=MXUDOT(NF,G,S,IX,KBF) RETURN END * SUBROUTINE PDSGM7 ALL SYSTEMS 01/09/22 * PURPOSE : * COMPUTATION OF A TRUST-REGION STEP BY THE MORE-SORENSEN METHOD WITH * DIRECT MATRIX DECOMPOSITIONS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II MMAX MAXIMUM DIMENSION OF THE SPARSE TABLEAU. * II MH POINTER OBTAINED BY THE SUBROUTINE MXSPCC. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA H(MMAX) NONZERO ELEMENTS OF THE APPROXIMATION OF THE SPARSE * HESSIAN MATRIX TOGETHER WITH AN ADDITIONAL SPACE USED FOR * THE NUMERICAL DIFFERENTIATION. * II IH(NF+1) POINTERS OF DIAGONAL ELEMENTS OF THE MATRIX H. * IU JH(MMAX) INDICES OF NONZERO ELEMENTS OF THE MATRIX H * TOGETHER WITH AN ADDITIONAL SPACE USED FOR THE NUMERICAL * DIFFERENTIATION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * II PSL(NF+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * IA PERM(NF) PERMUTATION VECTOR. * IA WN11(NF+1) AUXILIARY VECTOR. * IA WN12(NF+1) AUXILIARY VECTOR. * RI XMAX MAXIMUM STEPSIZE. * RI XDEL TRUST REGION RADIUS. * RO XDELO OLD TRUST REGION RADIUS. * RO GNORM NORM OF THE GRADIENT VECTOR. * RO SNORM NORM OF THE DIRECTION VECTOR. * RI FMIN ESTIMATION OF THE MINIMUM FUNCTION VALUE. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RO P VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP VALUE OF THE QUADRATIC TERM. * RI ETA2 TOLERANCE FOR POSITIVE DEFINITENESS. * RI DEL1 LOWER TOLERANCE FOR THE TRUST-REGION RADIUS. * RI DEL2 UPPER TOLERANCE FOR THE TRUST-REGION RADIUS. * II KD ORDER OF COMPUTED DERIVATIVES. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II IEST ESTIMATION INDICATOR. IEST=0-MINIMUM IS NOT ESTIMATED. * IEST=1-MINIMUM IS ESTIMATED BY THE VALUE FMIN. * II IDIR TRUST-REGION CHANGE INDICATOR. * IU IDEC DECOMPOSITION INDICATOR. IDEC=0-NO DECOMPOSITION. * IU NDEC NUMBER OF MATRIX DECOMPOSITIONS. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F WAS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX WAS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * VALUES ITERM<=-40 DETECT A LACK OF SPACE. * * SUBPROGRAMS USED : * S PNSTEP COMPUTATION OF THE BOUNDARY STEP. * S MXSPCA ADDITION OF THE LEVENBERG-MARQUARDT TERM TO THE SPARSE * SYMMETRIC MATRIX. * S MXSPCB BACK SUBSTITUTION USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXSPCD COMPUTATION OF A DIRECTION OF NEGATIVE CURVATURE USING * THE SPARSE DECOMPOSITION OBTAINED BY MXSPCF. * S MXSPCF GILL-MURRAY DECOMPOSITION OD A SPARSE SYMMETRIC MATRIX. * S MXSPCN ESTIMATION OF THE MINIMUM EIGENVALUE AND THE * CORRESPONDING EIGENVECTOR OF A SYMMETRIC MATRIX USING THE * SPARSE DECOMPOSITION OBTAINED BY MXSPCF. * RF MXSPCP GENERALIZED DOT PRODUCT USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXSPCT COPYING A SPARSE SYMMETRIC MATRIX INTO THE PERMUTED * FACTORIZED COMPACT SCHEME. * RF MXSSDL DETERMINATION OF A MINIMUM DIAGONAL ELEMENT OF A SPARSE * SYMMETRIC MATRIX. * S MXSSMG GERSHGORIN BOUNDS FOR EIGENVALUES OF A SPARSE SYMMETRIC * MATRIX * RF MXSSMQ COMPUTATION OF THE SPARSE QUADRATIC TERM. * S MXUCOP COPYING OF A VECTOR. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVSBP INVERSE PERMUTATION OF A VECTOR * S MXVSFP PERMUTATION OF A VECTOR. * * METHOD : * J.J.MORE, D.C.SORENSEN: COMPUTING A TRUST REGION STEP. REPORT NO. * ANL-81-83, ARGONNE NATIONAL LAB. 1981. * SUBROUTINE PDSGM7(NF,MMAX,MH,IX,G,H,IH,JH,S,XO,GO,PSL,PERM,WN11, & WN12,XMAX,XDEL,XDELO,GNORM,SNORM,FMIN,F,P,PP,ETA2,DEL1,DEL2,KD, & KBF,IEST,IDIR,IDEC,NDEC,ITERD,ITERM) INTEGER NF,MMAX,MH,IX(*),IH(*),JH(*),PSL(*),PERM(*),WN11(*), & WN12(*),KD,KBF,IEST,IDIR,IDEC,NDEC,ITERD,ITERM DOUBLE PRECISION G(*),H(*),S(*),XO(*),GO(*),XMAX,XDEL,XDELO, & GNORM,SNORM,FMIN,F,P,PP,ETA2,DEL1,DEL2 INTEGER NRED,MM,INF,MODE DOUBLE PRECISION T,TL,TU,E,EL,EU,ALF,RHO,RHO1,RHO2,CON DOUBLE PRECISION MXSSMQ,MXSPCP,MXSSDL,MXUDOT SAVE T,TL,TU,E,EL,EU * * DIRECTION DETERMINATION * IF (IDEC.LT.0) IDEC=0 IF (IDEC.NE.0) THEN ITERD=-1 GO TO 13250 END IF MM=IH(NF+1)-1 GNORM=SQRT(MXUDOT(NF,G,G,IX,KBF)) IF (XDEL.LE.0.0D 0) THEN * * INITIAL TRUST REGION BOUND * RHO1=MXSSMQ(NF,H,IH,JH,G,G) RHO2=GNORM*GNORM IF (RHO1.LE.0.0D 0) THEN XDEL=GNORM ELSE XDEL=(RHO2/RHO1)*GNORM END IF IF (IEST.EQ.1) XDEL=MIN(XDEL,4.0D 0*(F-FMIN)/GNORM) XDEL=MIN(XDEL,XMAX) END IF * * INITIAL BOUNDS FOR THE PARAMETER T * NRED=0 IF (IDIR.LE.0) THEN T=0.0D 0 E=-MXSSDL(NF,H,IH,JH,INF) CALL MXSSMG(NF,H,IH,JH,EL,EU,S) TL=GNORM/XDEL-EU TU=GNORM/XDEL-EL ELSE IF (IDIR.EQ.1) THEN T=T*XDELO/XDEL TL=MAX(TL,GNORM/XDEL-EU) TU=GNORM/XDEL-EL ELSE IF (IDIR.EQ.2) THEN T=T*XDELO/XDEL TL=GNORM/XDEL-EU TU=MIN(TU,GNORM/XDEL-EL) END IF TL=MAX(TL,0.0D 0,E) TU=MAX(TL,TU) T=MAX(T,TL) T=MIN(T,TU) 13220 CONTINUE TL=MAX(TL,E) IF (T.LE.E.AND.NRED.NE.0) THEN * * THE PARAMETER T IS SHIFTED * T=SQRT(TL*TU) T=MAX(T,TL+0.1D 0*(TU-TL)) T=MIN(T,TL+0.9D 0*(TU-TL)) END IF ALF=ETA2 CALL MXSPCT(NF,MM,MH,MMAX,H,JH,PSL,ITERM) IF (ITERM.NE.0) THEN GO TO 13250 END IF * * SPARSE GILL-MURRAY DECOMPOSITION * CALL MXSPCA(NF,MM,MH,H,IH,JH,T) CALL MXSPCF(NF,H(MM+1),PSL,JH(MM+1),WN11,WN12,GO,INF,ALF,RHO) NDEC=NDEC+1 IF (INF.GT.0) THEN * * NEW ESTIMATION E IS COMPUTED (THE MATRIX IS NOT POSITIVE DEFINITE) * IF (E.GE.TU) THEN ITERD=-2 GO TO 13250 ELSE MODE=2 CALL MXSPCD(NF,H(MM+1),PSL,JH(MM+1),S,INF) CALL MXVSBP(NF,PERM,S,GO) E=MAX(E,T-ALF/MXUDOT(NF,S,S,IX,KBF)) NRED=NRED+1 GO TO 13220 END IF ELSE * * STEP S IS COMPUTED * CALL MXUNEG(NF,G,S,IX,KBF) CALL MXVSFP(NF,PERM,S,GO) CALL MXSPCB(NF,H(MM+1),PSL,JH(MM+1),S,0) CALL MXVSBP(NF,PERM,S,GO) SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) MODE=1 END IF IF (TU-TL.LE.1.0D-8) THEN * * INTERVAL IS TOO SMALL * IF (T.NE.0.0D 0) THEN ITERD=5 ELSE ITERD=1 END IF GO TO 13240 ELSE IF (NRED.GE.20) THEN * * MAXIMUM NUMBER OF OLC REDUCTIONS * ITERD=6 GO TO 13240 ELSE IF (SNORM.GT.DEL2*XDEL) THEN * * STEP IS TOO LARGE * TL=MAX(TL,T) GO TO 13230 ELSE IF (SNORM.LT.DEL1*XDEL) THEN IF (T.NE.0.0D 0) THEN * * STEP IS TOO SMAL * TU=MIN(TU,T) ELSE * * STEP IS ACCEPTABLE * ITERD=1 GO TO 13240 END IF ELSE ITERD=3 GO TO 13240 END IF * * TRYING TO USE BOUNDARY STEP * CALL MXSPCN(NF,H(MM+1),PSL,JH(MM+1),XO,RHO,1) CALL MXVSBP(NF,PERM,XO,GO) RHO1=MXUDOT(NF,XO,S,IX,KBF) RHO2=MXUDOT(NF,XO,XO,IX,KBF) CALL PNSTEP(XDEL,SNORM,ABS(RHO1),RHO2,ALF) CON=(1.0D 0-DEL1)*(1.0D 0+DEL1) IF (ALF*ALF*RHO.LE.CON*(T*XDEL*XDEL-MXUDOT(NF,G,S,IX,KBF))) THEN IF (RHO1.LT.0.0D 0) ALF=-ALF CALL MXUDIR(NF,ALF,XO,S,S,IX,KBF) SNORM=XDEL ITERD=3 GO TO 13240 ELSE E=MAX(E,T-RHO) END IF 13230 CONTINUE IF (GNORM.LE.0.0D 0) THEN T=E ELSE * * NEW T IS COMPUTED USING ONE STEP OF THE NEWTON METHOD FOR * NONLINEAR EQUATION * CALL MXUCOP(NF,S,XO,IX,KBF) CALL MXVSFP(NF,PERM,XO,GO) CALL MXSPCB(NF,H(MM+1),PSL,JH(MM+1),XO,1) T=T+(SNORM*SNORM/MXSPCP(NF,H(MM+1),PSL,XO))*(SNORM-XDEL)/XDEL CALL MXVSBP(NF,PERM,XO,GO) END IF NRED=NRED+1 GO TO 13220 13240 CONTINUE PP=MXSSMQ(NF,H,IH,JH,S,S)*0.5D 0 13250 CONTINUE IF (KD.GT.0) P=MXUDOT(NF,G,S,IX,KBF) RETURN END * SUBROUTINE PDSLM1 ALL SYSTEMS 01/09/22 * PURPOSE : * DIRECTION DETERMINATION FOR LINE SEARCH USING DIRECT MATRIX * DECOMPOSITIONS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II MMAX MAXIMUM DIMENSION OF THE SPARSE TABLEAU. * II MH POINTER OBTAINED BY THE SUBROUTINE MXSPCC. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA H(MMAX) NONZERO ELEMENTS OF THE APPROXIMATION OF THE SPARSE * HESSIAN MATRIX TOGETHER WITH AN ADDITIONAL SPACE USED FOR * THE NUMERICAL DIFFERENTIATION. * II IH(NF+1) POINTERS OF DIAGONAL ELEMENTS OF THE MATRIX H. * IU JH(MMAX) INDICES OF NONZERO ELEMENTS OF THE MATRIX H * TOGETHER WITH AN ADDITIONAL SPACE USED FOR THE NUMERICAL * DIFFERENTIATION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * II PSL(NF+1) POINTER VECTOR OF THE COMPACT FORM OF THE TRIANGULAR * FACTOR OF THE HESSIAN APPROXIMATION. * IA PERM(NF) PERMUTATION VECTOR. * IA WN11(NF+1) AUXILIARY VECTOR. * IA WN12(NF+1) AUXILIARY VECTOR. * RO GNORM NORM OF THE GRADIENT VECTOR. * RO SNORM NORM OF THE DIRECTION VECTOR. * RI ETA2 TOLERANCE FOR POSITIVE DEFINITENESS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * IU IDEC DECOMPOSITION INDICATOR. IDEC=0-NO DECOMPOSITION. * IU NDEC NUMBER OF MATRIX DECOMPOSITIONS. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F WAS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX WAS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * VALUES ITERM<=-40 DETECT A LACK OF SPACE. * * SUBPROGRAMS USED : * S MXSPCB BACK SUBSTITUTION USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXSPCF GILL-MURRAY DECOMPOSITION OD A SPARSE SYMMETRIC MATRIX. * S MXSPCT COPYING A SPARSE SYMMETRIC MATRIX INTO THE PERMUTED * FACTORIZED COMPACT SCHEME. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXUNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVSBP INVERSE PERMUTATION OF A VECTOR * S MXVSFP PERMUTATION OF A VECTOR. * SUBROUTINE PDSLM1(NF,MMAX,MH,IX,G,H,IH,JH,S,XO,PSL,PERM,WN11, & WN12,GNORM,SNORM,ETA2,KBF,IDEC,NDEC,ITERD,ITERM) INTEGER NF,MMAX,MH,IX(*),IH(*),JH(*),PSL(*),PERM(*),WN11(*), & WN12(*),KBF,IDEC,NDEC,ITERD,ITERM DOUBLE PRECISION G(*),H(*),S(*),XO(*),GNORM,SNORM,ETA2 INTEGER MM,INF DOUBLE PRECISION ALF,BET DOUBLE PRECISION MXUDOT * * DIRECTION DETERMINATION * IF (IDEC.LT.0) IDEC=0 MM=IH(NF+1)-1 IF (IDEC.EQ.0) THEN CALL MXSPCT(NF,MM,MH,MMAX,H,JH,PSL,ITERM) IF (ITERM.NE.0) RETURN * * SPARSE GILL-MURRAY DECOMPOSITION * ALF=ETA2 CALL MXSPCF(NF,H(MM+1),PSL,JH(MM+1),WN11,WN12,XO,INF,ALF,BET) NDEC=NDEC+1 IDEC=1 ELSE IF (IDEC.EQ.1) THEN ELSE ITERD=-1 RETURN END IF GNORM=SQRT(MXUDOT(NF,G,G,IX,KBF)) * * NEWTON LIKE STEP * CALL MXUNEG(NF,G,S,IX,KBF) CALL MXVSFP(NF,PERM,S,XO) CALL MXSPCB(NF,H(MM+1),PSL,JH(MM+1),S,0) CALL MXVSBP(NF,PERM,S,XO) ITERD=1 SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) RETURN END * SUBROUTINE PDSLM3 ALL SYSTEMS 01/09/22 * PURPOSE : * DIRECTION DETERMINATION FOR LINE SEARCH USING CONJUGATE GRADIENT * ITERATIONS. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II M NUMBER OF NONZERO ELEMENTS IN THE HESSIAN MATRIX. * II MMAX MAXIMUM DIMENSION OF THE SPARSE TABLEAU. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. IX(I)=0-VARIABLE * X(I) IS UNBOUNDED. IX(I)=1-LOWER BOUND XL(I).LE.X(I). * IX(I)=2-UPPER BOUND X(I).LE.XU(I). IX(I)=3-TWO SIDE BOUND * XL(I).LE.X(I).LE.XU(I). IX(I)=5-VARIABLE X(I) IS FIXED. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA H(MMAX) NONZERO ELEMENTS OF THE APPROXIMATION OF THE SPARSE * HESSIAN MATRIX TOGETHER WITH AN ADDITIONAL SPACE USED FOR * THE NUMERICAL DIFFERENTIATION. * II IH(NF+1) POINTERS OF DIAGONAL ELEMENTS OF THE MATRIX H. * IU JH(MMAX) INDICES OF NONZERO ELEMENTS OF THE MATRIX H * TOGETHER WITH AN ADDITIONAL SPACE USED FOR THE NUMERICAL * DIFFERENTIATION. * RO S(NF) DIRECTION VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * RA XS(NF) AUXILIARY VECTOR. * RA IW(NF+1) AUXILIARY VECTOR. * RO GNORM NORM OF THE GRADIENT VECTOR. * RO SNORM NORM OF THE DIRECTION VECTOR. * RI ETA2 TOLERANCE FOR POSITIVE DEFINITENESS. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II MOS2 TYPE OF PRECONDITIONING. MOS2=1-PRECONDITIONING IS NOT * USED. MOS2=2-PRECONDITIONING BY THE INCOMPLETE GILL-MURRAY * DECOMPOSITION. MOS2=3-PRECONDITIONING BY THE INCOMPLETE * GILL-MURRAY DECOMPOSITION WITH A PRELIMINARY SOLUTION OF * THE PRECONDITIONED SYSTEM WHICH IS USED IF IT SATISFIES * THE TERMINATION CRITERION. * IU IDEC DECOMPOSITION INDICATOR. IDEC=0-NO DECOMPOSITION. * IU NDEC NUMBER OF MATRIX DECOMPOSITIONS. * II NIT NUMBER OF OUTER ITERATIONS. * IU NIN NUMBER OF INNER CONJUGATE GRADIENT ITERATIONS. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERM VARIABLE THAT INDICATES THE CAUSE OF TERMINATION. * ITERM=1-IF ABS(X-XO) WAS LESS THAN OR EQUAL TO TOLX IN * MTESX (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=2-IF ABS(F-FO) WAS LESS THAN OR EQUAL TO TOLF IN * MTESF (USUALLY TWO) SUBSEQUENT ITERATIONS. * ITERM=3-IF F WAS LESS THAN OR EQUAL TO TOLB. * ITERM=4-IF GMAX WAS LESS THAN OR EQUAL TO TOLG. * ITERM=6-IF THE TERMINATION CRITERION WAS NOT SATISFIED, * BUT THE SOLUTION OBTAINED IS PROBABLY ACCEPTABLE. * ITERM=11-IF NIT EXCEEDED MIT. ITERM=12-IF NFV EXCEEDED MFV. * ITERM=13-IF NFG EXCEEDED MFG. ITERM<0-IF THE METHOD FAILED. * VALUES ITERM<=-40 DETECT A LACK OF SPACE. * * SUBPROGRAMS USED : * S MXSPTB BACK SUBSTITUTION AFTER THE GILL-MURRAY DECOMPOSITION. * S MXSPTF INCOMPLETE GILL-MURRAY DECOMPOSITION. * S MXSSMD MATRIX-VECTOR PRODUCT FOLLOWED BY THE ADDITION OF A * SCALED VECTOR. * S MXSSMM MATRIX-VECTOR PRODUCT. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF TWO VECTORS. * S MXVCOP COPYING OF A VECTOR. * S MXVNEG COPYING OF A VECTOR WITH CHANGE OF THE SIGN. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PDSLM3(NF,M,MMAX,IX,G,H,IH,JH,S,XO,GO,XS,IW,GNORM, & SNORM,ETA2,ETA9,KBF,MOS2,IDEC,NDEC,NIT,NIN,ITERD,ITERM) INTEGER NF,M,MMAX,IX(*),IH(*),JH(*),IW(*),KBF,MOS2,IDEC,NDEC, & NIT,NIN,ITERD,ITERM DOUBLE PRECISION G(*),H(*),S(*),XO(*),GO(*),XS(*),GNORM,SNORM, & ETA2,ETA9 INTEGER NOS2,NRED,MMX,INF DOUBLE PRECISION PAR,ALF,EPS,RHO,RHO1,RHO2,SIG DOUBLE PRECISION MXUDOT SAVE EPS * * DIRECTION DETERMINATION * IF (NIT.LE.1) THEN EPS=0.9D 0 END IF NOS2=MOS2-1 IF (IDEC.LT.0) IDEC=0 IF (IDEC.NE.0.AND.IDEC.NE.1) THEN ITERD=-1 RETURN ELSE IF (IDEC.EQ.0) THEN IF (MOS2.GT.1) THEN * * INCOMPLETE GILL-MURRAY DECOMPOSITION * ALF=ETA2 IF (2*M.GE.MMAX) THEN ITERM=-48 RETURN END IF CALL MXVCOP(M,H,H(M+1)) CALL MXSPTF(NF,H(M+1),IH,JH,IW,INF,ALF,SIG) IF (INF+10.LT.0) THEN ITERM=-48 RETURN END IF IF (INF.NE.0) NOS2=0 NDEC=NDEC+1 IDEC=1 END IF END IF RHO1=MXUDOT(NF,G,G,IX,KBF) GNORM=SQRT(RHO1) PAR=MIN(EPS,SQRT(GNORM)) IF (PAR.GT.1.0D-2) THEN PAR=MIN(PAR,1.0D 0/DBLE(NIT)) END IF PAR=PAR*PAR IF (MOS2.GT.2) THEN * * PRELIMINARY INEXACT SOLUTION * CALL MXVNEG(NF,G,XO) IF (NOS2.NE.0) THEN CALL MXSPTB(NF,H(M+1),IH,JH,XO,0) CALL MXVCOP(NF,XO,S) CALL MXSSMD(NF,H,IH,JH,S,1.0D 0,G,GO) IF (MXUDOT(NF,GO,GO,IX,KBF).LE.1.0D-2*PAR*RHO1) THEN SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) ITERD=2 RETURN END IF END IF END IF * * CG INITIATION * RHO=RHO1 SNORM=0.0D 0 CALL MXVSET(NF,0.0D 0,S) CALL MXVNEG(NF,G,XS) IF (NOS2.EQ.0) THEN CALL MXVNEG(NF,G,XO) ELSE IF (MOS2.GT.2) THEN RHO=MXUDOT(NF,XS,XO,IX,KBF) ELSE CALL MXVNEG(NF,G,XO) CALL MXSPTB(NF,H(M+1),IH,JH,XO,0) RHO=MXUDOT(NF,XS,XO,IX,KBF) END IF C SIG=RHO MMX=NF+3 DO 10 NRED=1,MMX CALL MXSSMM(NF,H,IH,JH,XO,GO) ALF=MXUDOT(NF,XO,GO,IX,KBF) IF (ALF.LE.1.0D 0/ETA9) THEN C IF (ALF.LE.1.0D-8*SIG) THEN * * CG FAILS (THE MATRIX IS NOT POSITIVE DEFINITE) * IF (NRED.EQ.1) THEN CALL MXVNEG(NF,G,S) SNORM=GNORM END IF ITERD=0 RETURN ELSE ITERD=2 END IF * * CG STEP * ALF=RHO/ALF CALL MXUDIR(NF, ALF,XO,S,S,IX,KBF) CALL MXUDIR(NF,-ALF,GO,XS,XS,IX,KBF) NIN=NIN+1 RHO2=MXUDOT(NF,XS,XS,IX,KBF) SNORM=SQRT(MXUDOT(NF,S,S,IX,KBF)) IF (RHO2.LE.PAR*RHO1) RETURN IF (NRED.GE.MMX) RETURN IF (NOS2.NE.0) THEN CALL MXVCOP(NF,XS,GO) CALL MXSPTB(NF,H(M+1),IH,JH,GO,0) RHO2=MXUDOT(NF,XS,GO,IX,KBF) ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XO,GO,XO,IX,KBF) ELSE ALF=RHO2/RHO CALL MXUDIR(NF,ALF,XO,XS,XO,IX,KBF) END IF RHO=RHO2 C SIG=RHO2+ALF*ALF*SIG 10 CONTINUE RETURN END * SUBROUTINE PF1HS2 ALL SYSTEMS 99/12/01 * PURPOSE : * NUMERICAL COMPUTATION OF THE HESSIAN MATRIX OF THE MODEL FUNCTION * USING ITS GRADIENTS - SPARSE VERSION USING DIRECT COLOURING METHOD. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II ML SIZE OF THE COMPACT FACTOR. * II M NUMBER OF NONZERO ELEMENTS OF THE SPARSE HESSIAN MATRIX. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RA XO(NF) AUXILIARY VECTOR. * RO HF(M) HESSIAN MATRIX OF THE MODEL FUNCTION. * IU IH(NF+1) POINTER VECTOR OF SPARSE HESSIAN MATRIX. * IU JH(M) INDEX VECTOR OF THE HESSIAN MATRIX. * RI GF(NF) GRADIENT OF THE MODEL FUNCTION. * RA GO(NF) AUXILIARY VECTOR. * II COL(NF) VECTOR DISCERNING GROUPS OF THE HESSIAN COLUMN OF THE * SAME COLOUR. * IA WN11(NF+1) AUXILIARY VECTOR. * IA WN12(NF+1) AUXILIARY VECTOR. * RA XS(NF) AUXILIARY VECTOR USED FOR STEP SIZES. * RI FF VALUE OF THE MODEL FUNCTION. * RI ETA1 PRECISION OF THE COMPUTED VALUES. * II KBF TYPE OF BOUNDS. KBF=0-BOUNDS ARE NOT USED. KBF=1-ONE SIDED * BOUNDS. KBF=2-TWO SIDED BOUNDS. * IU ITERM TERMINATION INDICATOR. * IU ISYS CONTROL PARAMETER. * * SUBPROGRAMS USED : * S MXSTG1 WIDTHEN THE STRUCTURE. * S MXSTL2 SHRINK THE STRUCTURE. * S MXVCOP COPYING OF A VECTOR. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PF1HS2(NF,ML,M,X,IX,XO,HF,IH,JH,GF,GO,COL,WN11, & WN12,XS,FF,ETA1,KBF,ITERM,ISYS) INTEGER NF,ML,M,IX(*),IH(*),JH(*),COL(*),WN11(*), & WN12(*),KBF,ITERM,ISYS DOUBLE PRECISION X(*),XO(*),HF(*),GF(*),GO(*),XS(*), & FF,ETA1 DOUBLE PRECISION XTEMP,FTEMP,ETA INTEGER I,J,J1,K,K1,L,MX,MM,IVAR,JVAR SAVE MX,MM,IVAR,JVAR SAVE XTEMP,FTEMP,ETA IF (ITERM.NE.0) GO TO 12 IF (ISYS.EQ.1) GO TO 3 MM=IH(NF+1)-1 IF (3*MM-NF+ML.GE.M) THEN ITERM=-45 ISYS=0 RETURN END IF ETA=SQRT(ETA1) FTEMP=FF CALL MXVCOP(NF,X,XO) * * WIDTHEN THE STRUCTURE * K=2*MM-NF DO 50 I=ML+MM,1,-1 JH(K+I)=JH(MM+I) 50 CONTINUE CALL MXSTG1(NF,MX,IH,JH,WN12,WN11) CALL MXVSET(K,0.0D 0,HF) IVAR=1 2 CONTINUE IF (IVAR.GT.NF) GO TO 870 DO 200 J=IVAR,NF IF (COL(J).GE.1) THEN GO TO 200 ELSE JVAR=J GO TO 300 END IF 200 CONTINUE 300 CONTINUE DO 400 J=IVAR,JVAR L=ABS(COL(J)) IF (KBF.GT.0) THEN IF (IX(L).LE.-7) GO TO 400 END IF * * STEP SELECTION * XS(L)=ETA*MAX(ABS(X(L)),1.0D 0)*SIGN(1.0D 0,X(L)) XTEMP=X(L) X(L)=XTEMP+XS(L) XS(L)=X(L)-XTEMP 400 CONTINUE ISYS=1 RETURN 3 CONTINUE * * NUMERICAL DIFFERENTIATION * * * SET AUXILIARY VECTOR DISCERNING THE SINGLETONS IN A GROUP TO ZERO * DO 450 J1=1,NF WN11(J1)=0 450 CONTINUE * * DISCERN SINGLETONS OF THE GROUP OF THE SAME COLOR. * DO 600 J1=IVAR,JVAR L=ABS(COL(J1)) DO 500 K=IH(L),IH(L+1)-1 K1=ABS(JH(K)) IF (WN11(K1).EQ.0) THEN WN11(K1)=J1 ELSE WN11(K1)=-1 END IF 500 CONTINUE 600 CONTINUE * * NUMERICAL VALUES COMPUTATION * DO 800 J1=IVAR,JVAR L=ABS(COL(J1)) DO 700 K=IH(L),IH(L+1)-1 K1=ABS(JH(K)) IF (WN11(K1).GT.0) THEN HF(K)=(GF(K1)-GO(K1))/XS(L) END IF 700 CONTINUE 800 CONTINUE * * SET THE ORIGINAL VALUE OF X FOR THE COMPONENTS OF THE ACTUAL COLOR. * DO 850 J=IVAR,JVAR L=ABS(COL(J)) X(L)=XO(L) 850 CONTINUE IVAR=JVAR+1 GO TO 2 870 CONTINUE * * MOVE THE ELEMENTS OF THE HESSIAN APPROXIMATION INTO THE UPPER * TRIANGULAR PART * DO 900 I=1,NF WN11(I)=WN12(I)+1 900 CONTINUE DO 1100 I=1,NF IVAR=IH(I) JVAR=WN12(I)-1 DO 1000 J=IVAR,JVAR K=ABS(JH(J)) L=WN11(K) IF (HF(L).EQ.0) THEN HF(L)=HF(J) ELSE IF (HF(L).NE.0.AND.HF(J).NE.0) THEN HF(L)=0.5D 0*(HF(J)+HF(L)) END IF WN11(K)=WN11(K)+1 1000 CONTINUE 1100 CONTINUE FF=FTEMP * * SHRINK THE STRUCTURE * CALL MXSTL2(NF,MX,HF,IH,JH,WN12) K=2*MM-NF DO 1200 I=1,ML+MM JH(MM+I)=JH(K+I) 1200 CONTINUE * * RETRIEVE VALUES * CALL MXVCOP(NF,XO,X) 12 CONTINUE ISYS=0 RETURN END * SUBROUTINE PFSEB4 ALL SYSTEMS 98/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE PARTITIONED HESSIAN * MATRIX. * * PARAMETERS : * II NC NUMBER OF CONSTRAINTS. * RU B(M) ELEMENTS OF THE SPARSE MATRIX B. * IO IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF B. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF B. * II CH(MB) ELEMENTS OF THE PARTITIONED MATRIX H. * II ICG(NC+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JCG(MC) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * II ICA(NC) VECTOR CONTAINING TYPES OF CONSTRAINTS. * RI CZL(NC) VECTOR CONTAINING LOWER MULTIPLIERS FOR CONSTRAINTS. * RI CZU(NC) VECTOR CONTAINING UPPER MULTIPLIERS FOR CONSTRAINTS. * II JOB SUBJECTS OF UPDATES. JOB=0-CONSTRAINT FUNCTIONS. * JOB=1-CONSTRAINT FUNCTIONS MULTIPLIED BY SIGNS OF THE * LAGRANGIAN MULTIPLIERS. JOB-2-ACTIVE TERMS OF THE LAGRANGIAN * FUNCTION. JOB-3-ALL TERMS OF THE LAGRANGIAN FUNCTION. * SUBROUTINE PFSEB4(NC,B,IH,JH,CH,ICG,JCG,ICA,CZL,CZU,JOB) INTEGER NC,IH(*),JH(*),ICG(*),JCG(*),ICA(*),JOB DOUBLE PRECISION B(*),CH(*),CZL(*),CZU(*) INTEGER I,II,IC,J,JJ,JC,JF,K,KK,L,LL,KC DOUBLE PRECISION TEMP KK=0 DO 7 KC=1,NC IF (JOB.LE.1) THEN LL=ABS(ICA(KC)) IF (LL.EQ.3.OR.LL.EQ.4) THEN TEMP= CZU(KC)-CZL(KC) ELSE IF (LL.EQ.1) THEN TEMP=-CZL(KC) ELSE IF (LL.EQ.2) THEN TEMP= CZU(KC) ELSE IF (LL.EQ.5) THEN TEMP= CZL(KC) END IF IF (JOB.EQ.1) TEMP=ABS(TEMP) ELSE IF (JOB.EQ.2) THEN IF (ICA(KC).GE.0) GO TO 7 TEMP=1.0D 0 ELSE TEMP=1.0D 0 END IF II=ICG(KC) L=ICG(KC+1)-II DO 6 IC=1,L KK=KK+IC I=JCG(II) IF (I.LE.0) GO TO 5 JF=IH(I) JJ=II K=KK DO 4 JC=IC,L J=JCG(JJ) IF (J.LE.0) GO TO 3 2 IF (JH(JF).LT.J) THEN JF=JF+1 GO TO 2 END IF B(JF)=B(JF)+TEMP*CH(K) 3 K=K+JC JJ=JJ+1 4 CONTINUE 5 II=II+1 6 CONTINUE 7 CONTINUE RETURN END * SUBROUTINE PFSEB5 ALL SYSTEMS 06/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE PARTITIONED HESSIAN * MATRIX. * * PARAMETERS : * II NC NUMBER OF CONSTRAINTS. * RU B(M) ELEMENTS OF THE SPARSE MATRIX B. * IO IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF B. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF B. * II CH(MB) ELEMENTS OF THE PARTITIONED MATRIX H. * II ICG(NC+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JCG(MC) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI CZ(NC) VECTOR CONTAINING LAGRANGE MULTIPLIERS FOR CONSTRAINTS. * II JOB SUBJECTS OF UPDATES. JOB=0-CONSTRAINT FUNCTIONS. * JOB=1-CONSTRAINT FUNCTIONS MULTIPLIED BY SIGNS OF THE * LAGRANGIAN MULTIPLIERS. JOB-2-ACTIVE TERMS OF THE LAGRANGIAN * FUNCTION. JOB-3-ALL TERMS OF THE LAGRANGIAN FUNCTION. * SUBROUTINE PFSEB5(NC,B,IH,JH,CH,ICG,JCG,CZ,JOB) INTEGER NC,IH(*),JH(*),ICG(*),JCG(*),JOB DOUBLE PRECISION B(*),CH(*),CZ(*) INTEGER I,II,IC,J,JJ,JC,JF,K,KK,L,KC DOUBLE PRECISION TEMP KK=0 DO 7 KC=1,NC IF (JOB.EQ.0) THEN TEMP=CZ(KC) ELSE IF (JOB.EQ.1) THEN TEMP=ABS(CZ(KC)) ELSE TEMP=1.0D 0 END IF II=ICG(KC) L=ICG(KC+1)-II DO 6 IC=1,L KK=KK+IC I=JCG(II) IF (I.LE.0) GO TO 5 JF=IH(I) JJ=II K=KK DO 4 JC=IC,L J=JCG(JJ) IF (J.LE.0) GO TO 3 2 IF (JH(JF).LT.J) THEN JF=JF+1 GO TO 2 END IF B(JF)=B(JF)+TEMP*CH(K) 3 K=K+JC JJ=JJ+1 4 CONTINUE 5 II=II+1 6 CONTINUE 7 CONTINUE RETURN END * SUBROUTINE PFSED3 ALL SYSTEMS 07/12/01 * PURPOSE : * COMPRESSED SPARSE STRUCTURE OF THE HESSIAN MATRIX IS COMPUTED FROM * THE COORDINATE FORM. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II M NUMBER OF NONZERO ELEMENTS IN THE UPPER PART OF THE SPARSE * HESSIAN MATRIX. * IU IH(M+NF) ON INPUT ROW INDICES OF NONZERO ELEMENTS IN THE FIELD * H. ON OUTPUT POSITIONS OF DIAGONAL ELEMENTS IN THE FIELD H. * II JH(M+NF) COLUMN INDICES OF NONZERO ELEMENTS IN THE FIELD H. * IO IER ERROR MESAGE. IER=0-THE STANDARD INPUT DATA ARE CORRECT. * IER=1-ERROR IN THE ARRAY IH. IER=2-ERROR IN THE ARRAY JH. * SUBROUTINE PFSED3(NF,M,IH,JH,IER) INTEGER NF,M,IH(*),JH(*),IER INTEGER I,J,K,L,LL IER=0 DO 1 J=1,M IF (IH(J).GT.JH(J)) THEN K=IH(J) IH(J)=JH(J) JH(J)=K END IF 1 CONTINUE DO 2 I=1,NF IH(M+I)=I JH(M+I)=I 2 CONTINUE CALL MXVSR7(M+NF,IH,JH) IF (IH(1).LT.1.OR.IH(M+NF).GT.NF) THEN IER=1 RETURN END IF K=1 DO 3 J=1,M+NF IF (IH(J).EQ.K) THEN IH(K)=J K=K+1 END IF 3 CONTINUE IH(K)=J LL=0 DO 5 I=1,NF K=IH(I) L=IH(I+1)-K IF (L.GT.0) THEN CALL MXVSRT(L,JH(K)) IF (JH(K).LT.1.OR.JH(K+L-1).GT.NF) THEN IER=2 RETURN END IF END IF IH(I)=IH(I)-LL DO 4 J=1,L IF (J.GT.1.AND.JH(K).EQ.JH(K-1)) THEN LL=LL+1 ELSE JH(K-LL)=JH(K) END IF K=K+1 4 CONTINUE 5 CONTINUE IH(NF+1)=IH(NF+1)-LL M=IH(NF+1)-1 RETURN END * SUBROUTINE PFSET2 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE NUMBER OF NONZERO ELEMENTS OF THE SPARSE * HESSIAN MATRIX STORED IN THE BLOCKED FORM. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * II MB NUMBER OF NONZERO ELEMENTS OF THE PARTITIONED HESSIAN MATRIX * II MC MAXIMUM NUMBER OF ELEMENTS OF THE PARTIAL HESSIAN MATRIX. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE SPARSE * JACOBIAN MATRIX. * SUBROUTINE PFSET2(NA,MB,MC,IAG) INTEGER NA,MB,MC,IAG(*) INTEGER K,L,KA MB=0 MC=0 DO 1 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K MB=MB+L*(L+1)/2 MC=MAX(MC,L*(L+1)/2) 1 CONTINUE RETURN END * SUBROUTINE PFSET3 ALL SYSTEMS 97/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE STRUCTURE OF THE HESSIAN MATRIX FROM THE * SPARSE STRUCTURE OF THE JACOBIAN MATRIX. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * IO M NUMBER OF NONZERO ELEMENTS OF THE HESSIAN MATRIX. * II MMAX DECLARED LENGHT OF THE ARRAYS H AND JH. * IO IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * II IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * IU ITERM TERMINATION INDICATOR. * SUBROUTINE PFSET3(NF,NA,M,MMAX,IH,JH,IAG,JAG,ITERM) INTEGER NF,NA,M,MMAX,IH(*),JH(*),IAG(*),JAG(*),ITERM INTEGER I,J,JF,JA,K,LF,LA,KA M=IH(NF+1)-1 IF (M.GT.MMAX) THEN ITERM=-40 RETURN END IF DO 7 KA=1,NA LA=IAG(KA+1)-1 DO 6 K=IAG(KA),LA I=JAG(K) JF=IH(I) LF=IH(I+1)-1 DO 5 JA=K,LA J=JAG(JA) 2 IF (JH(JF).LT.J.AND.JF.LE.LF) THEN JF=JF+1 IF (JF.LE.LF) GO TO 2 END IF IF (JH(JF).GT.J .OR.JF.GT.LF) THEN DO 3 J=I+1,NF+1 IH(J)=IH(J)+1 3 CONTINUE DO 4 J=M,JF,-1 JH(J+1)=JH(J) 4 CONTINUE JH(JF)=JAG(JA) JF=JF+1 LF=LF+1 M=M+1 IF (M.GT.MMAX) THEN ITERM=-40 RETURN END IF END IF 5 CONTINUE 6 CONTINUE 7 CONTINUE RETURN END * SUBROUTINE PFSET4 ALL SYSTEMS 98/12/01 * PURPOSE : * COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE PARTITIONED HESSIAN * MATRIX. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RU B(M) ELEMENTS OF THE SPARSE MATRIX B. * IO IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF B. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF B. * II AH(MB) ELEMENTS OF THE PARTITIONED MATRIX H. * II IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * SUBROUTINE PFSET4(NA,B,IH,JH,AH,IAG,JAG) INTEGER NA,IH(*),JH(*),IAG(*),JAG(*) DOUBLE PRECISION B(*),AH(*) INTEGER I,II,IA,J,JJ,JA,JF,K,KK,L,KA KK=0 DO 7 KA=1,NA II=IAG(KA) L=IAG(KA+1)-II DO 6 IA=1,L KK=KK+IA I=JAG(II) IF (I.LE.0) GO TO 5 JF=IH(I) JJ=II K=KK DO 4 JA=IA,L J=JAG(JJ) IF (J.LE.0) GO TO 3 2 IF (JH(JF).LT.J) THEN JF=JF+1 GO TO 2 END IF B(JF)=B(JF)+AH(K) 3 K=K+JA JJ=JJ+1 4 CONTINUE 5 II=II+1 6 CONTINUE 7 CONTINUE RETURN END * FUNCTION PNFUZ1 ALL SYSTEMS 01/09/22 * PURPOSE : * COMPUTATION OF LOWER AND UPPER LAGRANGE MULTIPLIERS. * * PARAMETERS : * RO Z SLACK VARIABLE IN THE NONLINEAR PROGRAMMING FORMULATION OF * A MINIMAX PROBLEM. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI RPF3 BARRIER PARAMETER. * RO AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * RA AZL(NA) VECTOR OF LOWER LAGRANGE MULTIPLIERS. * RA AZU(NA) VECTOR OF UPPER LAGRANGE MULTIPLIERS. * II IEXT TYPE OF MINIMAX. IEXT<0-MINIMIZATION OF THE MAXIMUM * PARTIAL VALUE. IEXT-0-MINIMIZATION OF THE MAXIMUM PARTIAL * ABSOLUTE VALUE. IEXT>0-MAXIMIZATION OF THE MINIMUM PARTIAL * VALUE. * FUNCTION PNFUZ1(Z,NA,RPF3,AF,AZL,AZU,IEXT) INTEGER NA,IEXT DOUBLE PRECISION Z,RPF3,AF(*),AZL(*),AZU(*),PNFUZ1 INTEGER KA PNFUZ1=1.0D 0 DO 1 KA=1,NA IF (IEXT.LE.0) THEN AZU(KA)=RPF3/(Z-AF(KA)) PNFUZ1=PNFUZ1-AZU(KA) END IF IF (IEXT.GE.0) THEN AZL(KA)=RPF3/(Z+AF(KA)) PNFUZ1=PNFUZ1-AZL(KA) END IF 1 CONTINUE RETURN END * SUBROUTINE PNINT1 ALL SYSTEMS 91/12/01 * PURPOSE : * EXTRAPOLATION OR INTERPOLATION FOR LINE SEARCH WITH DIRECTIONAL * DERIVATIVES. * * PARAMETERS : * RI RL LOWER VALUE OF THE STEPSIZE PARAMETER. * RI RU UPPER VALUE OF THE STEPSIZE PARAMETER. * RI FL VALUE OF THE OBJECTIVE FUNCTION FOR R=RL. * RI FU VALUE OF THE OBJECTIVE FUNCTION FOR R=RU. * RI PL DIRECTIONAL DERIVATIVE FOR R=RL. * RI PU DIRECTIONAL DERIVATIVE FOR R=RU. * RO R VALUE OF THE STEPSIZE PARAMETER OBTAINED. * II MODE MODE OF LINE SEARCH. * II MTYP METHOD SELECTION. MTYP=1-BISECTION. MTYP=2-QUADRATIC * INTERPOLATION (WITH ONE DIRECTIONAL DERIVATIVE). * MTYP=3-QUADRATIC INTERPOLATION (WITH TWO DIRECTIONAL * DERIVATIVES). MTYP=4-CUBIC INTERPOLATION. MTYP=5-CONIC * INTERPOLATION. * IO MERR ERROR INDICATOR. MERR=0 FOR NORMAL RETURN. * * METHOD : * EXTRAPOLATION OR INTERPOLATION WITH STANDARD MODEL FUNCTIONS. * SUBROUTINE PNINT1(RL,RU,FL,FU,PL,PU,R,MODE,MTYP,MERR) DOUBLE PRECISION RL, RU, FL, FU, PL, PU, R INTEGER MODE,MTYP,MERR,NTYP DOUBLE PRECISION A,B,C,D,DIS,DEN DOUBLE PRECISION C1L,C1U,C2L,C2U,C3L PARAMETER (C1L=1.1D 0,C1U=1.0D 3,C2L=1.0D-2,C2U=0.9D 0, & C3L=0.1D 0) MERR=0 IF (MODE.LE.0) RETURN IF (PL.GE.0.0D 0) THEN MERR=2 RETURN ELSE IF (RU.LE.RL) THEN MERR=3 RETURN END IF DO 1 NTYP=MTYP,1,-1 IF (NTYP.EQ.1) THEN * * BISECTION * IF (MODE.EQ.1) THEN R=4.0D 0*RU RETURN ELSE R=0.5D 0*(RL+RU) RETURN END IF ELSE IF (NTYP.EQ.MTYP) THEN A = (FU-FL)/(PL*(RU-RL)) B = PU/PL END IF IF (NTYP.EQ.2) THEN * * QUADRATIC EXTRAPOLATION OR INTERPOLATION WITH ONE DIRECTIONAL * DERIVATIVE * DEN = 2.0D 0*(1.0D 0-A) ELSE IF (NTYP.EQ.3) THEN * * QUADRATIC EXTRAPOLATION OR INTERPOLATION WITH TWO DIRECTIONAL * DERIVATIVES * DEN = 1.0D 0 - B ELSE IF (NTYP.EQ.4) THEN * * CUBIC EXTRAPOLATION OR INTERPOLATION * C = B - 2.0D 0*A + 1.0D 0 D = B - 3.0D 0*A + 2.0D 0 DIS = D*D - 3.0D 0*C IF (DIS.LT.0.0D 0) GO TO 1 DEN = D + SQRT(DIS) ELSE IF (NTYP.EQ.5) THEN * * CONIC EXTRAPOLATION OR INTERPOLATION * DIS = A*A - B IF (DIS.LT.0.0D 0) GO TO 1 DEN = A + SQRT(DIS) IF (DEN.LE.0.0D 0) GO TO 1 DEN = 1.0D 0 - B*(1.0D 0/DEN)**3 END IF IF (MODE.EQ.1.AND.DEN.GT.0.0D 0.AND.DEN.LT.1.0D 0) THEN * * EXTRAPOLATION ACCEPTED * R = RL + (RU-RL)/DEN R = MAX(R,C1L*RU) R = MIN(R,C1U*RU) RETURN ELSE IF (MODE.EQ.2.AND.DEN.GT.1.0D 0) THEN * * INTERPOLATION ACCEPTED * R = RL + (RU-RL)/DEN IF (RL.EQ.0.0D 0) THEN R = MAX(R,RL+C2L*(RU-RL)) ELSE R = MAX(R,RL+C3L*(RU-RL)) END IF R = MIN(R,RL+C2U*(RU-RL)) RETURN END IF 1 CONTINUE END * SUBROUTINE PNINT3 ALL SYSTEMS 91/12/01 * PURPOSE : * EXTRAPOLATION OR INTERPOLATION FOR LINE SEARCH WITHOUT DIRECTIONAL * DERIVATIVES. * * PARAMETERS : * RI RO INITIAL VALUE OF THE STEPSIZE PARAMETER. * RI RL LOWER VALUE OF THE STEPSIZE PARAMETER. * RI RU UPPER VALUE OF THE STEPSIZE PARAMETER. * RI RI INNER VALUE OF THE STEPSIZE PARAMETER. * RI FO VALUE OF THE OBJECTIVE FUNCTION FOR R=RO. * RI FL VALUE OF THE OBJECTIVE FUNCTION FOR R=RL. * RI FU VALUE OF THE OBJECTIVE FUNCTION FOR R=RU. * RI FI VALUE OF THE OBJECTIVE FUNCTION FOR R=RI. * RO PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * RO R VALUE OF THE STEPSIZE PARAMETER OBTAINED. * II MODE MODE OF LINE SEARCH. * II MTYP METHOD SELECTION. MTYP=1-BISECTION. MTYP=2-TWO POINT * QUADRATIC INTERPOLATION. MTYP=2-THREE POINT QUADRATIC * INTERPOLATION. * IO MERR ERROR INDICATOR. MERR=0 FOR NORMAL RETURN. * * METHOD : * EXTRAPOLATION OR INTERPOLATION WITH STANDARD MODEL FUNCTIONS. * SUBROUTINE PNINT3(RO,RL,RU,RI,FO,FL,FU,FI,PO,R,MODE,MTYP,MERR) DOUBLE PRECISION RO,RL,RU,RI,FO,FL,FU,FI,PO,R INTEGER MODE,MTYP,MERR,NTYP DOUBLE PRECISION AL,AU,AI,DEN,DIS LOGICAL L1,L2 DOUBLE PRECISION ZERO,HALF,ONE,TWO,THREE,FOUR,C1L,C1U,C2L,C2U,C3L PARAMETER(ZERO=0.0D 0,HALF=0.5D 0,ONE=1.0D 0,TWO=2.0D 0, & THREE=3.0D 0,FOUR=4.0D 0,C1L=1.1D 0,C1U=1.0D 3, & C2L=1.0D-2,C2U=0.9D 0,C3L=1.0D-1) MERR = 0 IF (MODE .LE. 0) RETURN IF (PO .GE. ZERO) THEN MERR = 2 RETURN ELSE IF (RU .LE. RL) THEN MERR = 3 RETURN END IF L1 = RL .LE. RO L2 = RI .LE. RL DO 1 NTYP = MTYP, 1, -1 IF (NTYP .EQ. 1) THEN * * BISECTION * IF (MODE .EQ. 1) THEN R = TWO * RU RETURN ELSE IF (RI-RL.LE.RU-RI) THEN R=HALF*(RI+RU) RETURN ELSE R=HALF*(RL+RI) RETURN END IF ELSE IF (NTYP.EQ.MTYP.AND.L1) THEN IF (.NOT.L2) AI=(FI-FO)/(RI*PO) AU=(FU-FO)/(RU*PO) END IF IF (L1.AND.(NTYP.EQ.2.OR.L2)) THEN * * TWO POINT QUADRATIC EXTRAPOLATION OR INTERPOLATION * IF (AU.GE.ONE) GO TO 1 R=HALF*RU/(ONE-AU) ELSE IF (.NOT.L1.OR..NOT.L2.AND.NTYP.EQ.3) THEN * * THREE POINT QUADRATIC EXTRAPOLATION OR INTERPOLATION * AL=(FI-FL)/(RI-RL) AU=(FU-FI)/(RU-RI) DEN=AU-AL IF (DEN.LE.ZERO) GO TO 1 R=RI-HALF*(AU*(RI-RL)+AL*(RU-RI))/DEN ELSE IF (L1.AND..NOT.L2.AND.NTYP.EQ.4) THEN * * THREE POINT CUBIC EXTRAPOLATION OR INTERPOLATION * DIS=(AI-ONE)*(RU/RI) DEN=(AU-ONE)*(RI/RU)-DIS DIS=AU+AI-DEN-TWO*(ONE+DIS) DIS=DEN*DEN-THREE*DIS IF (DIS.LT.ZERO) GO TO 1 DEN=DEN+SQRT(DIS) IF (DEN.EQ.ZERO) GO TO 1 R=(RU-RI)/DEN ELSE GO TO 1 END IF IF (MODE .EQ. 1 .AND. R .GT. RU) THEN * * EXTRAPOLATION ACCEPTED * R = MAX( R, C1L*RU) R = MIN( R, C1U*RU) RETURN ELSE IF (MODE .EQ. 2 .AND. R .GT. RL .AND. R .LT. RU) THEN * * INTERPOLATION ACCEPTED * IF (RI.EQ.ZERO.AND.NTYP.NE.4) THEN R = MAX( R, RL + C2L*(RU-RL)) ELSE R = MAX( R, RL + C3L*(RU-RL)) END IF R = MIN( R, RL + C2U*(RU-RL)) IF (R.EQ.RI) GO TO 1 RETURN END IF 1 CONTINUE END * SUBROUTINE PNNEQ1 ALL SYSTEMS 92/12/01 * PURPOSE : * SOLUTION OF A SINGLE NONLINEAR EQUATION. * * PARAMETERS : * RI AA LEFT ENDPOINT OF THE INTERVAL. * RI BB RIGHT ENDPOINT OF THE INTERVAL. * RO X COMPUTED SOLUTION POINT. * RO F COMPUTED VALUE OF THE NONLINEAR FUNCTION. * RF FUN EXTERNAL FUNCTION. * RI EPSX REQUIRED PRECISION FOR THE SOLUTION POINT. * RI EPSF REQUIRED PRECISION FOR THE NONLINEAR FUNCTION. * IO IC NUMBER OF ITERATIONS. * IO IE ERROR SPECIFICATION. * IU ISYS CONTROL PARAMETER. * * METHOD : * D.LEE: THREE NEW RAPIDLY CONVERGENT ALGORITHMS FOR FINDING A ZERO * OF A FUNCTION, SIAM J. SCI. STAT. COMPUT. 6 (1985) 193-208. * SUBROUTINE PNNEQ1(AA,BB,X,F,EPSX,EPSF,IC,IE,ISYS) DOUBLE PRECISION AA,BB,X,F,EPSX,EPSF INTEGER IC,IE,ISYS INTEGER ITER,ITMAX,K,L DOUBLE PRECISION FA,FB,X1,X2,X3,F1,F2,F3,R,R1,RA,RB,D,D1,A,B,C,Z, & W,FW,GW,DEL,DDL,F21,F32 DOUBLE PRECISION ZERO,ONE,TWO,THREE,FOUR,HALF,CON PARAMETER (ZERO=0.0D 0,ONE=1.0D 0,TWO=2.0D 0,THREE=3.0D 0, & FOUR=4.0D 0,HALF=0.5D 0,CON=0.1D 0) SAVE A,B,C,FA,FB,X1,X2,X3,F1,F2,F3,R,D,FW SAVE L,ITER,ITMAX GO TO (1,2,3,4,6) ISYS+1 1 IE=0 ITMAX=IC IF (ITMAX.LE.0) ITMAX=100 X=AA ISYS=1 IC=1 RETURN 2 CONTINUE IF (ABS(F).LE.EPSF) GO TO 7 FA=F X=BB ISYS=2 IC=2 RETURN 3 CONTINUE IF (ABS(F).LE.EPSF) GO TO 7 FB=F IF (FA*FB.GT.0.0D 0) THEN X=AA F=FA IE=-2 GO TO 7 END IF X1=AA F1=FA X=HALF*(AA+BB) ISYS=3 IC=3 RETURN 4 CONTINUE X2=X F2=F IF (F1*F2.GT.0.0D 0) THEN X3=X1 F3=F1 X1=BB F1=FB ELSE X3=BB F3=FB END IF L=0 D=0.0D 0 R=0.0D 0 ITER=1 5 CONTINUE D1=D R1=R D=ABS(X1-X2) IF (ABS(F1).LT.ABS(F2)) THEN X=X1 F=F1 ELSE X=X2 F=F2 END IF DEL=EPSX*(ABS(X)+ONE) IF (ABS(F).LE.EPSF.OR.D.LE.TWO*DEL) GO TO 7 Z=X1+HALF*(X2-X1) DDL=MAX(CON*D,DEL) IF (THREE*D.LE.TWO*D1) THEN K=0 ELSE K=1 END IF IF (X2.EQ.X1) THEN F21=0.0D 0 ELSE F21=(F2-F1)/(X2-X1) ENDIF IF (X3.EQ.X2) THEN F32=0.0D 0 ELSE F32=(F3-F2)/(X3-X2) ENDIF A=(F32-F21)/(X3-X1) B=A*(X2+X1)-F21 C=F2-(A*X2-B)*X2 IF (ABS(A).LE.1.0D-10) THEN R=(F2*X1-F1*X2)/(F2-F1) ELSE R=B*B-FOUR*A*C IF (R.LT.0.0D 0) THEN R=(F2*X1-F1*X2)/(F2-F1) ELSE R=SQRT(R) RA=HALF*(B+R)/A RB=HALF*(B-R)/A IF (ABS(RA-Z).LE.ABS(RB-Z)) THEN R=RA ELSE R=RB END IF IF (R.LE.MIN(X1,X2).OR.R.GE.MAX(X1,X2)) THEN R=(F2*X1-F1*X2)/(F2-F1) END IF END IF END IF IF (L.GE.2) THEN W=R IF (ABS(W-X).LT.DEL) W=X+DEL*SIGN(ONE,Z-X) ELSE IF (K.EQ.1.OR.ABS(R-X).GE.ABS(Z-X)) THEN W=Z ELSE W=R+HALF*ABS(R-R1)*SIGN(ONE,R-X) IF (ABS(W-X).LT.DDL) W=X+DDL*SIGN(ONE,Z-X) IF (ABS(W-X).GE.ABS(Z-X)) W=Z END IF X=W FW=F ISYS=4 IC=IC+1 RETURN 6 CONTINUE GW=(A*X-B)*X+C IF (ABS(F-GW).LE.1.0D-1*ABS(FW).OR.ABS(FW).LE.1.0D-3* *MAX(ABS(F1),ABS(F2)).AND.L.GE.2) THEN L=L+1 ELSE L=0 END IF IF (F*SIGN(ONE,F1).GE.0.0D 0) THEN IF (D.LE.ABS(X3-X)) THEN X3=X1 F3=F1 X1=X2 F1=F2 X2=X F2=F ELSE X1=X F1=F END IF ELSE X3=X2 F3=F2 X2=X F2=F END IF ITER=ITER+1 IF (ITER.LE.ITMAX) GO TO 5 IE=-1 7 ISYS=0 RETURN END * SUBROUTINE PNSTEP ALL SYSTEMS 89/12/01 * PURPOSE : * DETERMINATION OF A SCALING FACTOR FOR THE BOUNDARY STEP. * * PARAMETERS : * RI DEL MAXIMUM STEPSIZE. * RI A INPUT PARAMETER. * RI B INPUT PARAMETER. * RI C INPUT PARAMETER. * RO ALF SCALING FACTOR FOR THE BOUNDARY STEP SUCH THAT * A**2+2*B*ALF+C*ALF**2=DEL**2. * SUBROUTINE PNSTEP(DEL,A,B,C,ALF) DOUBLE PRECISION DEL, A, B, C, ALF DOUBLE PRECISION DEN, DIS ALF = 0.0D 0 DEN = (DEL+A) * (DEL-A) IF (DEN .LE. 0.0D 0) RETURN DIS = B*B + C*DEN IF (B .GE. 0.0D 0) THEN ALF = DEN / (SQRT(DIS) + B) ELSE ALF = (SQRT(DIS) - B) / C END IF RETURN END * SUBROUTINE PNSTP4 ALL SYSTEMS 99/12/01 * PURPOSE : * STEPSIZE SELECTION USING POLYHEDRAL APPROXIMATION * FOR DESCENT STEP IN NONCONVEX VARIABLE METRIC METHOD. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * II MA DECLARED NUMBER OF LINEAR APPROXIMATED FUNCTIONS * II MAL CURRENT NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * RU X(N) VECTOR OF VARIABLES. * RI AF(4*MA) VECTOR OF BUNDLE FUNCTIONS VALUES. * RI AG(N*MA) MATRIX WHOSE COLUMNS ARE BUNDLE SUBGRADIENTS. * RI AY(N*MA) MATRIX WHOSE COLUMNS ARE VARIABLE VECTORS. * RI S(N) DIRECTION VECTOR. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RI DF DIRECTIONAL DERIVATIVE. * RO T VALUE OF THE STEPSIZE PARAMETER. * RO TB BUNDLE PARAMETER FOR MATRIX SCALING. * RI ETA5 DISTANCE MEASURE PARAMETER. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * RI MOS3 LOCALITY MEASURE PARAMETER. * SUBROUTINE PNSTP4(N,MA,MAL,X,AF,AG,AY,S,F,DF,T,TB,ETA5,ETA9,MOS3) DOUBLE PRECISION DF,ETA5,ETA9,F,T,TB INTEGER MA,MAL,MOS3,N DOUBLE PRECISION AF(*),AG(*),AY(*),S(*),X(*) DOUBLE PRECISION ALF,ALFL,ALFR,BET,BETL,BETR,DX,Q,R,W INTEGER I,J,JN,K,L,LQ W = DF*T* (1.0D0-T*0.5D0) * * INITIAL CHOICE OF POSSIBLY ACTIVE LINES * K = 0 L = -1 JN = 0 TB = SQRT(ETA9) BETR = -ETA9 DO 20 J = 1,MAL - 1 R = 0.0D0 BET = 0.0D0 ALFL = AF(J) - F DO 10 I = 1,N DX = X(I) - AY(JN+I) Q = AG(JN+I) R = R + DX*DX ALFL = ALFL + DX*Q BET = BET + S(I)*Q 10 CONTINUE IF (MOS3.NE.2) R = R** (DBLE(MOS3)*0.5D0) ALF = MAX(ABS(ALFL),ETA5*R) R = 1.0D0 - BET/DF IF (R*R+ (ALF+ALF)/DF.GT.1.0D-6) THEN K = K + 1 AF(MA+K) = ALF AF(MA+MA+K) = BET R = T*BET - ALF IF (R.GT.W) THEN W = R L = K END IF END IF IF (BET.GT.0.0D0) TB = MIN(TB,ALF/ (BET-DF)) BETR = MAX(BETR,BET-ALF) JN = JN + N 20 CONTINUE LQ = -1 IF (BETR.LE.DF*0.5D0) RETURN LQ = 1 IF (L.LT.0) RETURN BETR = AF(MA+MA+L) IF (BETR.LE.0.0D0) THEN IF (T.LT.1.0D0 .OR. BETR.EQ.0.0D0) RETURN LQ = 2 END IF ALFR = AF(MA+L) * * ITERATION LOOP * 30 IF (LQ.GE.1) THEN Q = 1.0D0 - BETR/DF R = Q + SQRT(Q*Q+ (ALFR+ALFR)/DF) IF (BETR.GE.0.0D0) R = - (ALFR+ALFR)/ (DF*R) R = MIN(1.95D0,MAX(0.0D0,R)) ELSE IF (ABS(BETR-BETL)+ABS(ALFR-ALFL).LT.-1.0D-4*DF) RETURN R = (ALFR-ALFL)/ (BETR-BETL) END IF IF (ABS(T-R).LT.1.0D-4) RETURN T = R AF(MA+L) = -1.0D0 W = T*BETR - ALFR L = -1 DO 40 J = 1,K ALF = AF(MA+J) IF (ALF.LT.0.0D0) GO TO 40 BET = AF(MA+MA+J) R = T*BET - ALF IF (R.GT.W) THEN W = R L = J END IF 40 CONTINUE IF (L.LT.0) RETURN BET = AF(MA+MA+L) IF (BET.EQ.0.0D0) RETURN * * NEW INTERVAL SELECTION * ALF = AF(MA+L) IF (BET.LT.0.0D0) THEN IF (LQ.EQ.2) THEN ALFR = ALF BETR = BET ELSE ALFL = ALF BETL = BET LQ = 0 END IF ELSE IF (LQ.EQ.2) THEN ALFL = ALFR BETL = BETR LQ = 0 END IF ALFR = ALF BETR = BET END IF GO TO 30 END * SUBROUTINE PNSTP5 ALL SYSTEMS 99/12/01 * PURPOSE : * STEPSIZE SELECTION USING POLYHEDRAL APPROXIMATION * FOR NULL STEP IN NONCONVEX VARIABLE METRIC METHOD. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * II MA DECLARED NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * II MAL CURRENT NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * RU X(N) VECTOR OF VARIABLES. * RI AF(4*MA) VECTOR OF BUNDLE FUNCTIONS VALUES. * RI AG(N*MA) MATRIX WHOSE COLUMNS ARE BUNDLE SUBGRADIENTS. * RI AY(N*MA) MATRIX WHOSE COLUMNS ARE VARIABLE VECTORS. * RI S(N) DIRECTION VECTOR. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RI DF DIRECTIONAL DERIVATIVE. * RO T VALUE OF THE STEPSIZE PARAMETER. * RO TB BUNDLE PARAMETER FOR MATRIX SCALING. * RI ETA5 DISTANCE MEASURE PARAMETER. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * RI MOS3 LOCALITY MEASURE PARAMETER. * SUBROUTINE PNSTP5(N,MA,MAL,X,AF,AG,AY,S,F,DF,T,TB,ETA5,ETA9,MOS3) DOUBLE PRECISION DF,ETA5,ETA9,F,T,TB INTEGER MA,MAL,MOS3,N DOUBLE PRECISION AF(*),AG(*),AY(*),S(*),X(*) DOUBLE PRECISION ALF,ALFL,ALFR,BET,BETL,BETR,DX,Q,R,W INTEGER I,J,JN,K,L W = DF*T * * INITIAL CHOICE OF POSSIBLY ACTIVE PARABOLAS * K = 0 L = -1 JN = 0 TB = SQRT(ETA9) BETR = -ETA9 DO 20 J = 1,MAL - 1 BET = 0.0D0 R = 0.0D0 ALFL = AF(J) - F DO 10 I = 1,N DX = X(I) - AY(JN+I) R = R + DX*DX Q = AG(JN+I) ALFL = ALFL + DX*Q BET = BET + S(I)*Q 10 CONTINUE IF (MOS3.NE.2) R = R** (DBLE(MOS3)*0.5D0) ALF = MAX(ABS(ALFL),ETA5*R) IF (BET+BET.GT.DF) TB = MIN(TB,ALF/ (BET-DF)) BETR = MAX(BETR,BET-ALF) IF (ALF.LT.BET-DF) THEN K = K + 1 R = T*BET - ALF AF(MA+K) = ALF AF(MA+MA+K) = BET IF (R.GT.W) THEN W = R L = K END IF END IF JN = JN + N 20 CONTINUE IF (L.LT.0) RETURN BETR = AF(MA+MA+L) ALFR = AF(MA+L) ALF = ALFR BET = BETR ALFL = 0.0D0 BETL = DF * * ITERATION LOOP * 30 W = BET/DF IF (ABS(BETR-BETL)+ABS(ALFR-ALFL).LT.-1.0D-4*DF) RETURN IF (BETR-BETL.EQ.0.0D0) STOP 11 R = (ALFR-ALFL)/ (BETR-BETL) IF (ABS(T-W).LT.ABS(T-R)) R = W Q = T T = R IF (ABS(T-Q).LT.1.0D-3) RETURN AF(MA+L) = -1.0D0 W = T*BET - ALF L = -1 DO 40 J = 1,K ALF = AF(MA+J) IF (ALF.LT.0.0D0) GO TO 40 BET = AF(MA+MA+J) R = T*BET - ALF IF (R.GT.W) THEN W = R L = J END IF 40 CONTINUE IF (L.LT.0) RETURN BET = AF(MA+MA+L) Q = BET - T*DF IF (Q.EQ.0.0D0) RETURN * * NEW INTERVAL SELECTION * ALF = AF(MA+L) IF (Q.LT.0.0D0) THEN ALFL = ALF BETL = BET ELSE ALFR = ALF BETR = BET END IF GO TO 30 END * SUBROUTINE PP0BA1 ALL SYSTEMS 05/12/01 * PURPOSE : * EVALUATION OF THE BARRIER FUNCTION FOR THE SUM OF ABSOLUTE VALUES. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI AS(NA) SUM OF ABSOLUTE VALUE SLACK VARIABLES. * RI RPF3 BARRIER COEFFICIENT. * RO F VALUE OF THE BARRIER FUNCTION. * SUBROUTINE PP0BA1(NA,AS,RPF3,F) INTEGER NA DOUBLE PRECISION AS(*),RPF3,F INTEGER KA F=-DBLE(NA)*RPF3*LOG(2.0D 0*RPF3) DO 1 KA=1,NA F=F+AS(KA)-RPF3*LOG(AS(KA)) 1 CONTINUE RETURN END * SUBROUTINE PP0BX1 ALL SYSTEMS 05/12/01 * PURPOSE : * EVALUATION OF THE BARRIER FUNCTION FOR THE MINIMAX OPTIMIZATION. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI Z MINIMAX SLACK VARIABLE. * RI AF(NA) VECTOR CONTAINING VALUES OF APPROXIMATED FUNCTIONS. * RO F VALUE OF THE BARRIERY FUNCTION. * RI FF VALUE OF THE THE OBJECTIVE FUNCTION. * RI PAR PARAMETER OF THE BEN-TAL BARRIER FUNCTION. * RI RPF3 BARRIER COEFFICIENT. * II MEP MERIT FUNCTION USED. MEP=1-LOGARITHMIC BARIER FUNCTION. * MEP=2-BEN-TAL BARRIER FUNCTION. MEP=3-COMPOSITE BARRIER * FUNCTION. * II IEXT KIND OF THE MINIMAX APPROXIMATION. IEXT=0-CHEBYSHEV * APPROXIMATION. IEXT=-1-MINIMAX. IEXT=+1-MAXIMIN. * SUBROUTINE PP0BX1(NA,Z,AF,F,FF,PAR,RPF3,MEP,IEXT) INTEGER NA,MEP,IEXT DOUBLE PRECISION Z,AF(*),PAR,RPF3,F,FF DOUBLE PRECISION FA INTEGER KA IF (Z.LE.FF) THEN F=1.0D 60 ELSE F=Z IF (MEP.EQ.1) THEN DO 11 KA=1,NA FA=AF(KA) IF (IEXT.LE.0) THEN F=F-RPF3*LOG(Z-FA) END IF IF (IEXT.GE.0) THEN F=F-RPF3*LOG(Z+FA) END IF 11 CONTINUE ELSE IF (MEP.EQ.2) THEN DO 21 KA=1,NA FA=AF(KA) IF (IEXT.LE.0) THEN IF (Z-FA.LE.PAR) THEN F=F-RPF3*LOG(Z-FA) ELSE F=F+(2.0D 0-0.5D 0*PAR/(Z-FA))*RPF3*PAR/(Z-FA) END IF END IF IF (IEXT.GE.0) THEN IF (Z+FA.LE.PAR) THEN F=F-RPF3*LOG(Z+FA) ELSE F=F+(2.0D 0-0.5D 0*PAR/(Z+FA))*RPF3*PAR/(Z+FA) END IF END IF 21 CONTINUE ELSE IF (MEP.EQ.3) THEN DO 31 KA=1,NA FA=AF(KA) IF (IEXT.LE.0) THEN F=F+RPF3*LOG(1.0D 0/(Z-FA)+1.0D 0) END IF IF (IEXT.GE.0) THEN F=F+RPF3*LOG(1.0D 0/(Z+FA)+1.0D 0) END IF 31 CONTINUE ELSE IF (MEP.EQ.4) THEN DO 41 KA=1,NA FA=AF(KA) IF (IEXT.LE.0) THEN F=F+RPF3*RPF3/(Z-FA) END IF IF (IEXT.GE.0) THEN F=F+RPF3*RPF3/(Z+FA) END IF 41 CONTINUE END IF END IF RETURN END * SUBROUTINE PP1MX3 ALL SYSTEMS 05/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT OF THE LAGRANGIAN FUNCTION * FOR THE MINIMAX OPTIMIZATION. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * RI GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RI AG(IAG(N+1)-1) SPARSE RECTANGULAR MATRIX WHICH IS USED FOR THE * DIRECTION VECTOR DETERMINATION. * II IAG(N+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI AZL(NA) LOWER LAGRANGE MULTIPLIERS. * RI AZU(NA) UPPER LAGRANGE MULTIPLIERS. * RI FA VALUE OF THE SELECTED FUNCTION. * RI AF(NA) VALUES OF THE APPROXIMATED FUNCTIONS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * II ISNA INDICATOR FOR STORING ELEMENTAL FUNCTION VALUES AND * GRADIENTS. ISNA=0-STORING SUPPRESSED. ISNA=1-STORING * ELEMENTAL FUNCTION VALUES. ISNA=2-STORING ELEMENTAL * FUNCTION VALUES AND GRADIENTS. * II IEXT TYPE OF MINIMAX. IEXT=0-MINIMIZATION OF THE MAXIMUM VALUE. * IEXT=1-MINIMIZATION OF THE MAXIMUM ABSOLUTE VALUE. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PP1MX3(NF,NA,X,GA,AG,IAG,JAG,G,AZL,AZU,FA,AF, & F,KD,LD,NFV,NFG,ISNA,IEXT) INTEGER NF,NA,IAG(*),JAG(*),KD,LD,NFV,NFG,ISNA,IEXT DOUBLE PRECISION X(*),GA(*),AG(*),G(*),AZL(*),AZU(*),FA,AF(*),F INTEGER J,JP,K,KA,L IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) NFG=NFG+1 END IF DO 3 KA=1,NA IF (LD.GE.0) GO TO 1 CALL FUN(NF,KA,X,FA) IF (ISNA.GE.1) AF(KA)=FA IF (IEXT.EQ.0) THEN IF (KA.EQ.1) F=ABS(FA) F=MAX(F,ABS(FA)) ELSE IF (IEXT.LT.0) THEN IF (KA.EQ.1) F= FA F=MAX(F, FA) ELSE IF (IEXT.GT.0) THEN IF (KA.EQ.1) F=-FA F=MAX(F,-FA) END IF 1 IF (KD.LT.1) GO TO 3 IF (LD.GE.1) GO TO 3 CALL DFUN(NF,KA,X,GA) K=IAG(KA) L=IAG(KA+1)-K DO 2 J=1,L JP=ABS(JAG(K)) IF (IEXT.EQ.0) THEN G(JP)=G(JP)+(AZU(KA)-AZL(KA))*GA(JP) ELSE IF (IEXT.LT.0) THEN G(JP)=G(JP)+AZU(KA)*GA(JP) ELSE IF (IEXT.GT.0) THEN G(JP)=G(JP)-AZL(KA)*GA(JP) END IF IF (ISNA.GE.2) AG(K)=GA(JP) K=K+1 2 CONTINUE 3 CONTINUE RETURN END * SUBROUTINE PP1SA3 ALL SYSTEMS 05/12/01 * PURPOSE : * COMPUTATION OF THE VALUE AND THE GRADIENT OF THE LAGRANGIAN FUNCTION * FOR THE SUM OF ABSOLUTE VALUES. * * PARAMETERS: * II NF NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI X(NF) VECTOR OF VARIABLES. * RI GA(NF) GRADIENT OF THE APPROXIMATED FUNCTION. * RI AG(IAG(N+1)-1) SPARSE RECTANGULAR MATRIX WHICH IS USED FOR THE * DIRECTION VECTOR DETERMINATION. * II IAG(N+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RO G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI AZ(NA) VECTOR OF LAGRANGE MULTIPLIERS. * RI FA VALUE OF THE SELECTED FUNCTION. * RI AF(NA) VALUES OF THE APPROXIMATED FUNCTIONS. * RO F VALUE OF THE OBJECTIVE FUNCTION. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES. * IU NFV NUMBER OF OBJECTIVE FUNCTION VALUES COMPUTED. * IU NFG NUMBER OF OBJECTIVE FUNCTION GRADIENTS COMPUTED. * II ISNA INDICATOR FOR STORING ELEMENTAL FUNCTION VALUES AND * GRADIENTS. ISNA=0-STORING SUPPRESSED. ISNA=1-STORING * ELEMENTAL FUNCTION VALUES. ISNA=2-STORING ELEMENTAL * FUNCTION VALUES AND GRADIENTS. * * SUBPROGRAMS USED : * SE FUN COMPUTATION OF THE VALUE OF THE APPROXIMATED FUNCTION. * SE DFUN COMPUTATION OF THE GRADIENT OF THE APPROXIMATED FUNCTION. * S MXVSET INITIATION OF A VECTOR. * SUBROUTINE PP1SA3(NF,NA,X,GA,AG,IAG,JAG,G,AZ,FA,AF,F,KD,LD,NFV, & NFG,ISNA) INTEGER NF,NA,IAG(*),JAG(*),KD,LD,NFV,NFG,ISNA DOUBLE PRECISION X(*),GA(*),AG(*),G(*),AZ(*),FA,AF(*),F INTEGER J,JP,K,KA,L IF (KD.LE.LD) RETURN IF (KD.GE.0.AND.LD.LT.0) THEN F=0.0D 0 NFV=NFV+1 END IF IF (KD.GE.1.AND.LD.LT.1) THEN CALL MXVSET(NF,0.0D 0,G) NFG=NFG+1 END IF DO 3 KA=1,NA IF (LD.GE.0) GO TO 1 CALL FUN(NF,KA,X,FA) IF (ISNA.GE.1) AF(KA)=FA F=F+ABS(FA) 1 IF (KD.LT.1) GO TO 3 IF (LD.GE.1) GO TO 3 CALL DFUN(NF,KA,X,GA) K=IAG(KA) L=IAG(KA+1)-K DO 2 J=1,L JP=ABS(JAG(K)) G(JP)=G(JP)+AZ(KA)*GA(JP) IF (ISNA.GE.2) AG(K)=GA(JP) K=K+1 2 CONTINUE 3 CONTINUE RETURN END * SUBROUTINE PPLAG1 ALL SYSTEMS 05/12/01 * PURPOSE : * COMPUTATION OF THE LAGRANGE MULTIPLIERS FOR THE SUM OF ABSOLUTE * VALUES. * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI AF(NA) VECTOR CONTAINING VALUES OF APPROXIMATED FUNCTIONS. * RA AS(NA) AUXILIARY ARRAY. * RO AZ(NA) LAGRANGE MULTIPLIERS. * RI RPF3 BARRIER COEFFICIENT. * SUBROUTINE PPLAG1(NA,AF,AS,AZ,RPF3) INTEGER NA DOUBLE PRECISION AF(*),AS(*),AZ(*),RPF3 DOUBLE PRECISION FA INTEGER KA DO 1 KA=1,NA FA=AF(KA) AS(KA)=RPF3+SQRT(RPF3**2+FA**2) AZ(KA)=FA/AS(KA) 1 CONTINUE RETURN END * SUBROUTINE PS0G01 ALL SYSTEMS 97/12/01 * PURPOSE : * SIMPLE SEARCH WITH TRUST REGION UPDATE. * * PARAMETERS : * RO R VALUE OF THE STEPSIZE PARAMETER. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI FO INITIAL VALUE OF THE OBJECTIVE FUNCTION. * RI PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * RI PP QUADRATIC PART OF THE PREDICTED FUNCTION VALUE. * RU XDEL TRUST REGION BOUND. * RO XDELO PREVIOUS TRUST REGION BOUND. * RI XMAX MAXIMUM STEPSIZE. * RI RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * RI SNORM EUCLIDEAN NORM OF THE DIRECTION VECTOR. * RI BET1 LOWER BOUND FOR STEPSIZE REDUCTION. * RI BET2 UPPER BOUND FOR STEPSIZE REDUCTION. * RI GAM1 LOWER BOUND FOR STEPSIZE EXPANSION. * RI GAM2 UPPER BOUND FOR STEPSIZE EXPANSION. * RI EPS4 FIRST TOLERANCE FOR RATIO DF/DFPRED. STEP BOUND IS * DECREASED IF DF/DFPREDEPS5. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES OF OBJECTIVE * FUNCTION. * IU IDIR INDICATOR FOR DIRECTION DETERMINATION. * IDIR=0-BASIC DETERMINATION. IDIR=1-DETERMINATION * AFTER STEPSIZE REDUCTION. IDIR=2-DETERMINATION AFTER * STEPSIZE EXPANSION. * IO ITERS TERMINATION INDICATOR. ITERS=0-ZERO STEP. ITERS=1-STEP * BOUND WAS DECREASED. ITERS=2-STEP BOUND WAS UNCHANGED. * ITERS=3-STEP BOUND WAS INCREASED. ITERS=6-FIRST STEPSIZE. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO MAXST MAXIMUM STEPSIZE INDICATOR. MAXST=0 OR MAXST=1 IF MAXIMUM * STEPSIZE WAS NOT OR WAS REACHED. * IO NRED ACTUAL NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * II MRED MAXIMUM NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * II KTERS TERMINATION SELECTION. KTERS=1-NORMAL TERMINATION. * KTERS=6-FIRST STEPSIZE. * II MES1 SWITCH FOR EXTRAPOLATION. MES1=1-CONSTANT INCREASING OF * THE INTERVAL. MES1=2-EXTRAPOLATION SPECIFIED BY THE PARAMETER * MES. MES1=3 SUPPRESSED EXTRAPOLATION. * II MES2 SWITCH FOR TERMINATION. MES2=1-NORMAL TERMINATION. * MES2=2-TERMINATION AFTER AT LEAST TWO STEPS (ASYMPTOTICALLY * PERFECT LINE SEARCH). * II MES3 SAFEGUARD AGAINST ROUNDING ERRORS. MES3=0-SAFEGUARD * SUPPRESSED. MES3=1-FIRST LEVEL OF SAFEGUARD. MES3=2-SECOND * LEVEL OF SAFEGUARD. * IU ISYS CONTROL PARAMETER. * * METHOD : * G.A.SCHULTZ, R.B.SCHNABEL, R.H.BYRD: A FAMILY OF TRUST-REGION-BASED * ALGORITHMS FOR UNCONSTRAINED MINIMIZATION WITH STRONG GLOBAL * CONVERGENCE PROPERTIES, SIAM J. NUMER.ANAL. 22 (1985) PP. 47-67. * SUBROUTINE PS0G01(R,F,FO,PO,PP,XDEL,XDELO,XMAX,RMAX,SNORM,BET1, & BET2,GAM1,GAM2,EPS4,EPS5,KD,LD,IDIR,ITERS,ITERD,MAXST,NRED,MRED, & KTERS,MES1,MES2,MES3,ISYS) INTEGER KD,LD,IDIR,ITERS,ITERD,MAXST,NRED,MRED,KTERS,MES1,MES2, & MES3,ISYS DOUBLE PRECISION R,F,FO,PO,PP,XDEL,XDELO,XMAX,RMAX,SNORM,BET1, & BET2,GAM1,GAM2,EPS4,EPS5 DOUBLE PRECISION DF,DFPRED INTEGER NRED1,NRED2 SAVE NRED1,NRED2 IF (ISYS.EQ.1) GO TO 2 IF (IDIR.EQ.0) THEN NRED1=0 NRED2=0 END IF IDIR=0 XDELO=XDEL * * COMPUTATION OF THE NEW FUNCTION VALUE * R=MIN(1.0D 0,RMAX) KD= 0 LD=-1 ISYS=1 RETURN 2 CONTINUE IF (KTERS.LT.0.OR.KTERS.GT.5) THEN ITERS=6 ELSE DF=FO-F DFPRED=-R*(PO+R*PP) IF (DF.LT.EPS4*DFPRED) THEN * * STEP IS TOO LARGE, IT HAS TO BE REDUCED * IF (MES1.EQ.1) THEN XDEL=BET2*SNORM ELSE IF (MES1.EQ.2) THEN XDEL=BET2*MIN(0.5D 0*XDEL,SNORM) ELSE XDEL=0.5D 0*PO*SNORM/(PO+DF) XDEL=MAX(XDEL,BET1*SNORM) XDEL=MIN(XDEL,BET2*SNORM) END IF ITERS=1 IF (MES3.LE.1) THEN NRED2=NRED2+1 ELSE IF (ITERD.GT.2) NRED2=NRED2+1 END IF ELSE IF (DF.LE.EPS5*DFPRED) THEN * * STEP IS SUITABLE * ITERS=2 ELSE * * STEP IS TOO SMALL, IT HAS TO BE ENLARGED * IF (MES2.EQ.2) THEN XDEL=MAX(XDEL,GAM1*SNORM) ELSE IF (ITERD.GT.2) THEN XDEL=GAM1*XDEL END IF ITERS=3 END IF XDEL=MIN(XDEL,XMAX,GAM2*SNORM) IF (FO.LE.F) THEN IF (NRED1.GE.MRED) THEN ITERS=-1 ELSE IDIR=1 ITERS=0 NRED1=NRED1+1 END IF END IF END IF MAXST=0 IF (XDEL.GE.XMAX) MAXST=1 IF (MES3.EQ.0) THEN NRED=NRED1 ELSE NRED=NRED2 END IF ISYS=0 RETURN END * SUBROUTINE PS0L02 ALL SYSTEMS 97/12/01 * PURPOSE : * EXTENDED LINE SEARCH WITHOUT DIRECTIONAL DERIVATIVES. * * PARAMETERS : * RO R VALUE OF THE STEPSIZE PARAMETER. * RO RO INITIAL VALUE OF THE STEPSIZE PARAMETER. * RO RP PREVIOUS VALUE OF THE STEPSIZE PARAMETER. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI FO INITIAL VALUE OF THE OBJECTIVE FUNCTION. * RO FP PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RI PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP PREVIOUS VALUE OF THE DIRECTIONAL DERIVATIVE. * RI FMIN LOWER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI FMAX UPPER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI RMIN MINIMUM VALUE OF THE STEPSIZE PARAMETER * RI RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER * RI TOLS TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE FUNCTION VALUE). * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES OF OBJECTIVE * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO NRED ACTUAL NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * II MRED MAXIMUM NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * IO MAXST MAXIMUM STEPSIZE INDICATOR. MAXST=0 OR MAXST=1 IF MAXIMUM * STEPSIZE WAS NOT OR WAS REACHED. * II IEST LOWER BOUND SPECIFICATION. IEST=0 OR IEST=1 IF LOWER BOUND * IS NOT OR IS GIVEN. * II INITS CHOICE OF THE INITIAL STEPSIZE. INITS=0-INITIAL STEPSIZE * IS SPECIFIED IN THE CALLING PROGRAM. INITS=1-UNIT INITIAL * STEPSIZE. INITS=2-COMBINED UNIT AND QUADRATICALLY ESTIMATED * INITIAL STEPSIZE. INITS=3-QUADRATICALLY ESTIMATED INITIAL * STEPSIZE. * IO ITERS TERMINATION INDICATOR. ITERS=0-ZERO STEP. ITERS=1-PERFECT * LINE SEARCH. ITERS=2 GOLDSTEIN STEPSIZE. ITERS=3-CURRY * STEPSIZE. ITERS=4-EXTENDED CURRY STEPSIZE. * ITERS=5-ARMIJO STEPSIZE. ITERS=6-FIRST STEPSIZE. * ITERS=7-MAXIMUM STEPSIZE. ITERS=8-UNBOUNDED FUNCTION. * ITERS=-1-MRED REACHED. ITERS=-2-POSITIVE DIRECTIONAL * DERIVATIVE. ITERS=-3-ERROR IN INTERPOLATION. * II KTERS TERMINATION SELECTION. KTERS=1-PERFECT LINE SEARCH. * KTERS=2-GOLDSTEIN STEPSIZE. KTERS=3-CURRY STEPSIZE. * KTERS=4-EXTENDED CURRY STEPSIZE. KTERS=5-ARMIJO STEPSIZE. * KTERS=6-FIRST STEPSIZE. * II MES METHOD SELECTION. MES=1-BISECTION. MES=2-QUADRATIC * INTERPOLATION (WITH ONE DIRECTIONAL DERIVATIVE). * MES=3-QUADRATIC INTERPOLATION (WITH TWO DIRECTIONAL * DERIVATIVES). MES=4-CUBIC INTERPOLATION. MES=5-CONIC * INTERPOLATION. * IU ISYS CONTROL PARAMETER. * * SUBPROGRAM USED : * S PNINT3 EXTRAPOLATION OR INTERPOLATION WITHOUT DIRECTIONAL * DERIVATIVES. * * METHOD : * SAFEGUARDED EXTRAPOLATION AND INTERPOLATION WITH EXTENDED TERMINATION * CRITERIA. * SUBROUTINE PS0L02(R,RO,RP,F,FO,FP,PO,PP,FMIN,FMAX,RMIN,RMAX,TOLS, & KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST,INITS,ITERS,KTERS,MES,ISYS) INTEGER KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST,INITS,ITERS,KTERS,MES, & ISYS DOUBLE PRECISION R,RO,RP,F,FO,FP,PO,PP,FMIN,FMAX,RMIN,RMAX,TOLS DOUBLE PRECISION RL,FL,RU,FU,RI,FI,RTEMP,TOL INTEGER MTYP,MERR,MODE,INIT1,MES1,MES2 LOGICAL L1,L2,L3,L4,L6,L7 PARAMETER(TOL=1.0D-2) SAVE MTYP,MODE,MES1,MES2 SAVE RL,FL,RU,FU,RI,FI IF (ISYS.EQ.1) GO TO 3 MES1=2 MES2=2 ITERS=0 IF (PO.GE.0.0D 0) THEN R=0.0D 0 ITERS=-2 GO TO 4 END IF IF (RMAX.LE.0.0D 0) THEN ITERS= 0 GO TO 4 END IF * * INITIAL STEPSIZE SELECTION * IF (INITS.GT.0) THEN RTEMP=FMIN-F ELSE IF (IEST.EQ.0) THEN RTEMP=F-FP ELSE RTEMP=MAX(F-FP,FMIN-F) END IF INIT1=ABS(INITS) RP=0.0D 0 FP=FO PP=PO IF (INIT1.EQ.0) THEN ELSE IF (INIT1.EQ.1.OR.INITS.GE.1.AND.IEST.EQ.0) THEN R=1.0D 0 ELSE IF (INIT1.EQ.2) THEN R=MIN(1.0D 0,4.0D 0*RTEMP/PO) ELSE IF (INIT1.EQ.3) THEN R=MIN(1.0D 0, 2.0D 0*RTEMP/PO) ELSE IF (INIT1.EQ.4) THEN R=2.0D 0*RTEMP/PO END IF RTEMP=R R=MAX(R,RMIN) R=MIN(R,RMAX) MODE=0 RL=0.0D 0 FL=FO RU=0.0D 0 FU=FO RI=0.0D 0 FI=FO * * NEW STEPSIZE SELECTION (EXTRAPOLATION OR INTERPOLATION) * 2 CALL PNINT3(RO,RL,RU,RI,FO,FL,FU,FI,PO,R,MODE,MTYP,MERR) IF (MERR.GT.0) THEN ITERS=-MERR GO TO 4 ELSE IF (MODE.EQ.1) THEN NRED=NRED-1 R=MIN(R,RMAX) ELSE IF (MODE.EQ.2) THEN NRED=NRED+1 END IF * * COMPUTATION OF THE NEW FUNCTION VALUE * KD= 0 LD=-1 ISYS=1 RETURN 3 CONTINUE IF (ITERS.NE.0) GO TO 4 IF (F.LE.FMIN) THEN ITERS=7 GO TO 4 ELSE L1=R.LE.RMIN.AND.NIT.NE.KIT L2=R.GE.RMAX L3=F-FO.LE.TOLS*R*PO.OR.F-FMIN.LE.(FO-FMIN)/1.0D 1 L4=F-FO.GE.(1.0D 0-TOLS)*R*PO.OR.MES2.EQ.2.AND.MODE.EQ.2 L6=RU-RL.LE.TOL*RU.AND.MODE.EQ.2 L7=MES2.LE.2.OR.MODE.NE.0 MAXST=0 IF (L2) MAXST=1 END IF * * TEST ON TERMINATION * IF (L1.AND..NOT.L3) THEN ITERS=0 GO TO 4 ELSE IF (L2.AND..NOT.F.GE.FU) THEN ITERS=7 GO TO 4 ELSE IF (L6) THEN ITERS=1 GO TO 4 ELSE IF (L3.AND.L7.AND.KTERS.EQ.5) THEN ITERS=5 GO TO 4 ELSE IF (L3.AND.L4.AND.L7.AND.(KTERS.EQ.2.OR.KTERS.EQ.3.OR. * KTERS.EQ.4)) THEN ITERS=2 GO TO 4 ELSE IF (KTERS.LT.0.OR.KTERS.EQ.6.AND.L7) THEN ITERS=6 GO TO 4 ELSE IF (ABS(NRED).GE.MRED) THEN ITERS=-1 GO TO 4 ELSE RP=R FP=F MODE=MAX(MODE,1) MTYP=ABS(MES) IF (F.GE.FMAX) MTYP=1 END IF IF (MODE.EQ.1) THEN * * INTERVAL CHANGE AFTER EXTRAPOLATION * RL=RI FL=FI RI=RU FI=FU RU=R FU=F IF (F.GE.FI) THEN NRED=0 MODE=2 ELSE IF ( MES1 .EQ. 1) THEN MTYP=1 END IF * * INTERVAL CHANGE AFTER INTERPOLATION * ELSE IF (R.LE.RI) THEN IF (F.LE.FI) THEN RU=RI FU=FI RI=R FI=F ELSE RL=R FL=F END IF ELSE IF (F.LE.FI) THEN RL=RI FL=FI RI=R FI=F ELSE RU=R FU=F END IF END IF GO TO 2 4 ISYS=0 RETURN END * SUBROUTINE PS1L01 ALL SYSTEMS 97/12/01 * PURPOSE : * STANDARD LINE SEARCH WITH DIRECTIONAL DERIVATIVES. * * PARAMETERS : * RO R VALUE OF THE STEPSIZE PARAMETER. * RO RP PREVIOUS VALUE OF THE STEPSIZE PARAMETER. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI FO INITIAL VALUE OF THE OBJECTIVE FUNCTION. * RO FP PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RO P VALUE OF THE DIRECTIONAL DERIVATIVE. * RI PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * RO PP PREVIOUS VALUE OF THE DIRECTIONAL DERIVATIVE. * RI FMIN LOWER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI FMAX UPPER BOUND FOR VALUE OF THE OBJECTIVE FUNCTION. * RI RMIN MINIMUM VALUE OF THE STEPSIZE PARAMETER * RI RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER * RI TOLS TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE FUNCTION VALUE). * RI TOLP TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE DIRECTIONAL DERIVATIVE). * RO PAR1 PARAMETER FOR CONTROLLED SCALING OF VARIABLE METRIC * UPDATES. * RO PAR2 PARAMETER FOR CONTROLLED SCALING OF VARIABLE METRIC * UPDATES. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES OF OBJECTIVE * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO NRED ACTUAL NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * II MRED MAXIMUM NUMBER OF EXTRAPOLATIONS OR INTERPOLATIONS. * IO MAXST MAXIMUM STEPSIZE INDICATOR. MAXST=0 OR MAXST=1 IF MAXIMUM * STEPSIZE WAS NOT OR WAS REACHED. * II IEST LOWER BOUND SPECIFICATION. IEST=0 OR IEST=1 IF LOWER BOUND * IS NOT OR IS GIVEN. * II INITS CHOICE OF THE INITIAL STEPSIZE. INITS=0-INITIAL STEPSIZE * IS SPECIFIED IN THE CALLING PROGRAM. INITS=1-UNIT INITIAL * STEPSIZE. INITS=2-COMBINED UNIT AND QUADRATICALLY ESTIMATED * INITIAL STEPSIZE. INITS=3-QUADRATICALLY ESTIMATED INITIAL * STEPSIZE. * IO ITERS TERMINATION INDICATOR. ITERS=0-ZERO STEP. ITERS=1-PERFECT * LINE SEARCH. ITERS=2 GOLDSTEIN STEPSIZE. ITERS=3-CURRY * STEPSIZE. ITERS=4-EXTENDED CURRY STEPSIZE. * ITERS=5-ARMIJO STEPSIZE. ITERS=6-FIRST STEPSIZE. * ITERS=7-MAXIMUM STEPSIZE. ITERS=8-UNBOUNDED FUNCTION. * ITERS=-1-MRED REACHED. ITERS=-2-POSITIVE DIRECTIONAL * DERIVATIVE. ITERS=-3-ERROR IN INTERPOLATION. * II KTERS TERMINATION SELECTION. KTERS=1-PERFECT LINE SEARCH. * KTERS=2-GOLDSTEIN STEPSIZE. KTERS=3-CURRY STEPSIZE. * KTERS=4-EXTENDED CURRY STEPSIZE. KTERS=5-ARMIJO STEPSIZE. * KTERS=6-FIRST STEPSIZE. * II MES METHOD SELECTION. MES=1-BISECTION. MES=2-QUADRATIC * INTERPOLATION (WITH ONE DIRECTIONAL DERIVATIVE). * MES=3-QUADRATIC INTERPOLATION (WITH TWO DIRECTIONAL * DERIVATIVES). MES=4-CUBIC INTERPOLATION. MES=5-CONIC * INTERPOLATION. * IU ISYS CONTROL PARAMETER. * * SUBPROGRAM USED : * S PNINT1 EXTRAPOLATION OR INTERPOLATION WITH DIRECTIONAL * DERIVATIVES. * * METHOD : * SAFEGUARDED EXTRAPOLATION AND INTERPOLATION WITH STANDARD TERMINATION * CRITERIA. * SUBROUTINE PS1L01(R,RP,F,FO,FP,P,PO,PP,FMIN,FMAX,RMIN,RMAX, & TOLS,TOLP,PAR1,PAR2,KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST,INITS, & ITERS,KTERS,MES,ISYS) INTEGER KD,LD,NIT,KIT,NRED,MRED,MAXST,IEST,INITS,ITERS,KTERS, & MES,ISYS DOUBLE PRECISION R,RP,F,FO,FP,P,PO,PP,FMIN,FMAX,RMIN,RMAX, & TOLS,TOLP,PAR1,PAR2 DOUBLE PRECISION RL,FL,PL,RU,FU,PU,RTEMP INTEGER MTYP,MERR,MODE,INIT1,MES1,MES2,MES3 LOGICAL L1,L2,L3,L5,L7,M1,M2,M3 DOUBLE PRECISION CON,CON1 PARAMETER (CON=1.0D-2,CON1=1.0D-13) SAVE MTYP,MODE,MES1,MES2,MES3 SAVE RL,FL,PL,RU,FU,PU IF (ISYS.EQ.1) GO TO 3 MES1=2 MES2=2 MES3=2 ITERS=0 IF (PO.GE.0.0D 0) THEN R=0.0D 0 ITERS=-2 GO TO 4 END IF IF (RMAX.LE.0.0D 0) THEN ITERS=0 GO TO 4 END IF * * INITIAL STEPSIZE SELECTION * IF (INITS.GT.0) THEN RTEMP=FMIN-F ELSE IF (IEST.EQ.0) THEN RTEMP=F-FP ELSE RTEMP=MAX(F-FP,FMIN-F) END IF INIT1=ABS(INITS) RP=0.0D 0 FP=FO PP=PO IF (INIT1.EQ.0) THEN ELSE IF (INIT1.EQ.1.OR.INITS.GE.1.AND.IEST.EQ.0) THEN R=1.0D 0 ELSE IF (INIT1.EQ.2) THEN R=MIN(1.0D 0,4.0D 0*RTEMP/PO) ELSE IF (INIT1.EQ.3) THEN R=MIN(1.0D 0, 2.0D 0*RTEMP/PO) ELSE IF (INIT1.EQ.4) THEN R=2.0D 0*RTEMP/PO END IF R=MAX(R,RMIN) R=MIN(R,RMAX) MODE=0 RU=0.0D 0 FU=FO PU=PO * * NEW STEPSIZE SELECTION (EXTRAPOLATION OR INTERPOLATION) * 2 CALL PNINT1(RL,RU,FL,FU,PL,PU,R,MODE,MTYP,MERR) IF (MERR.GT.0) THEN ITERS=-MERR GO TO 4 ELSE IF (MODE.EQ.1) THEN NRED=NRED-1 R=MIN(R,RMAX) ELSE IF (MODE.EQ.2) THEN NRED=NRED+1 END IF * * COMPUTATION OF THE NEW FUNCTION VALUE AND THE NEW DIRECTIONAL * DERIVATIVE * KD= 1 LD=-1 ISYS=1 RETURN 3 CONTINUE IF (MODE.EQ.0) THEN PAR1=P/PO PAR2=F-FO END IF IF (ITERS.NE.0) GO TO 4 IF (F.LE.FMIN) THEN ITERS=7 GO TO 4 ELSE L1=R.LE.RMIN.AND.NIT.NE.KIT L2=R.GE.RMAX L3=F-FO.LE.TOLS*R*PO L5=P.GE.TOLP*PO.OR.MES2.EQ.2.AND.MODE.EQ.2 L7=MES2.LE.2.OR.MODE.NE.0 M1=.FALSE. M2=.FALSE. M3=L3 IF (MES3.GE.1) THEN M1=ABS(P).LE.CON*ABS(PO).AND.FO-F.GE.(CON1/CON)*ABS(FO) L3=L3.OR.M1 END IF IF (MES3.GE.2) THEN M2=ABS(P).LE.0.5D 0*ABS(PO).AND.ABS(FO-F).LE.2.0D 0*CON1*ABS(FO) L3=L3.OR.M2 END IF MAXST=0 IF (L2) MAXST=1 END IF * * TEST ON TERMINATION * IF (L1.AND..NOT.L3) THEN ITERS=0 GO TO 4 ELSE IF (L2.AND.L3.AND..NOT.L5) THEN ITERS=7 GO TO 4 ELSE IF (M3.AND.MES1.EQ.3) THEN ITERS=5 GO TO 4 ELSE IF (L3.AND.L5.AND.L7) THEN ITERS=4 GO TO 4 ELSE IF (KTERS.LT.0.OR.KTERS.EQ.6.AND.L7) THEN ITERS=6 GO TO 4 ELSE IF (ABS(NRED).GE.MRED) THEN ITERS=-1 GO TO 4 ELSE RP=R FP=F PP=P MODE=MAX(MODE,1) MTYP=ABS(MES) IF (F.GE.FMAX) MTYP=1 END IF IF (MODE.EQ.1) THEN * * INTERVAL CHANGE AFTER EXTRAPOLATION * RL=RU FL=FU PL=PU RU=R FU=F PU=P IF (.NOT.L3) THEN NRED=0 MODE=2 ELSE IF ( MES1 .EQ. 1) THEN MTYP=1 END IF ELSE * * INTERVAL CHANGE AFTER INTERPOLATION * IF (.NOT.L3) THEN RU=R FU=F PU=P ELSE RL=R FL=F PL=P END IF END IF GO TO 2 4 ISYS=0 RETURN END * SUBROUTINE PS1L18 ALL SYSTEMS 99/12/01 * PURPOSE : * SPECIAL LINE SEARCH FOR NONSMOOTH NONCONVEX VARIABLE METRIC METHOD. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * II MA DECLARED NUMBER OF LINEAR APPROXIMATED FUNCTIONS * II MAL CURRENT NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * RU X(N) VECTOR OF VARIABLES. * RO G(N) SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RI S(N) DIRECTION VECTOR. * RU U(N) PREVIOUS VECTOR OF VARIABLES. * RI AF(4*MA) VECTOR OF BUNDLE FUNCTIONS VALUES. * RI AG(N*MA) MATRIX WHOSE COLUMNS ARE BUNDLE SUBGRADIENTS. * RI AY(N*MA) MATRIX WHOSE COLUMNS ARE VARIABLE VECTORS. * RO T VALUE OF THE STEPSIZE PARAMETER. * RO TB BUNDLE PARAMETER FOR MATRIX SCALING. * RO FO PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RU PO PREVIOUS DIRECTIONAL DERIVATIVE. * RU P DIRECTIONAL DERIVATIVE. * RI TMIN MINIMUM VALUE OF THE STEPSIZE PARAMETER. * RI TMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * RI SNORM EUCLIDEAN NORM OF THE DIRECTION VECTOR. * RI WK STOPPING PARAMETER. * RI EPS1 TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * CHANGE OF THE FUNCTION VALUE). * RI EPS2 TERMINATION TOLERANCE FOR LINE SEARCH (IN TEST ON THE * DIRECTIONAL DERIVATIVE). * RI ETA5 DISTANCE MEASURE PARAMETER. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * II KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF PREVIOUSLY COMPUTED DERIVATIVES OF OBJECTIVE * II JE EXTRAPOLATION INDICATOR. * RI MOS3 LOCALITY MEASURE PARAMETER. * IO ITERS NULL STEP INDICATOR. ITERS=0-NULL STEP. ITERS=1-DESCENT * STEP. * IU ISYS CONTROL PARAMETER. * * VARIABLES IN COMMON /STAT/ (STATISTICS) : * IO NRES NUMBER OF RESTARTS. * IO NDEC NUMBER OF MATRIX DECOMPOSITIONS. * IO NIN NUMBER OF INNER ITERATIONS. * IO NIT NUMBER OF ITERATIONS. * IO NFV NUMBER OF FUNCTION EVALUATIONS. * IO NFG NUMBER OF GRADIENT EVALUATIONS. * IO NFH NUMBER OF HESSIAN EVALUATIONS. * * SUBPROGRAMS USED : * S PNINT1 EXTRAPOLATION OR INTERPOLATION FOR LINE SEARCH * S PNSTP4 STEPSIZE DETERMINATION FOR DESCENT STEPS. * S PNSTP5 STEPSIZE DETERMINATION FOR NULL STEPS. * WITH DIRECTIONAL DERIVATIVES. * S MXVDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXVDOT DOT PRODUCT OF TWO VECTORS. * * METHOD : * SPECIAL METHOD OF STEP LENGTH DETERMINATION. * SUBROUTINE PS1L18(N,MA,MAL,X,G,S,U,AF,AG,AY,T,TB,FO,F,PO,P,TMIN, & TMAX,SNORM,WK,EPS1,EPS2,ETA5,ETA9,KD,LD,JE,MOS3,ITERS,ISYS) DOUBLE PRECISION EPS1,EPS2,ETA5,ETA9,F,FO,P,PO,SNORM,T,TB,TMAX, & TMIN,WK INTEGER ITERS,ISYS,JE,KD,LD,MA,MAL,MOS3,N DOUBLE PRECISION AF(*),AG(*),AY(*),G(*),S(*),U(*),X(*) DOUBLE PRECISION BET,FL,FU,PL,PU,TL,TU INTEGER IER DOUBLE PRECISION MXVDOT SAVE FL,FU,PL,PU,TL,TU IF (ISYS.GT.0) GO TO 25 IF (JE.GT.0) T = DBLE(2-JE/99)*T IF (JE.LE.0) T = MIN(1.0D0,TMAX) IF (PO.EQ.0.0D0 .OR. JE.GT.0) GO TO 10 IF (ITERS.EQ.1) THEN CALL PNSTP4(N,MA,MAL,X,AF,AG,AY,S,F,PO,T,TB,ETA5,ETA9,MOS3) ELSE CALL PNSTP5(N,MA,MAL,X,AF,AG,AY,S,F,PO,T,TB,ETA5,ETA9,MOS3) END IF 10 T = MIN(MAX(T,TMIN),TMAX) TL = 0.0D0 TU = T FL = FO PL = PO * * FUNCTION AND GRADIENT EVALUATION AT A NEW POINT * 20 CALL MXVDIR(N,T,S,U,X) KD= 1 LD=-1 ISYS=1 RETURN 25 CONTINUE P = MXVDOT(N,G,S) * * NULL/DESCENT STEP TEST (ITERS=0/1) * ITERS = 1 IF (F.LE.FO-T* (EPS1+EPS1)*WK) THEN TL = T FL = F PL = P ELSE TU = T FU = F PU = P END IF BET = MAX(ABS(FO-F+P*T),ETA5* (SNORM*T)**MOS3) IF (F.LE.FO-T*EPS1*WK .AND. (T.GE.TMIN.OR. & BET.GT.EPS1*WK)) GO TO 40 IF (P-BET.GE.-EPS2*WK .OR. TU-TL.LT.TMIN*1.0D-1) GO TO 30 IF (TL.EQ.0.0D0 .AND. PL.LT.0.0D0) THEN CALL PNINT1(TL,TU,FL,FU,PL,PU,T,2,2,IER) ELSE T = 5.0D-1* (TU+TL) END IF GO TO 20 30 ITERS = 0 40 CONTINUE ISYS=0 RETURN END * SUBROUTINE PUBBM1 ALL SYSTEMS 97/12/01 * PURPOSE : * PARTITIONED VARIABLE METRIC UPDATE. * * PARAMETERS : * II NA NUMBER OF BLOCKS OF THE MATRIX H. * RU AH(MB) APPROXIMATION OF THE PARTITIONED HESSIAN MATRIX. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RA S(NF) AUXILIARY VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI AGO(MA) GRADIENTS DIFFERENCE. * RI ETA0 MACHINE PRECISION. * RI ETA9 MAXIMUM MACHINE NUMBER. * IU ICOR SWITCH BETWEEN UPDATES. ICOR=0-THE BFGS UPDATE. * ICOR=1-THE RANK ONE UPDATE. * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET METHOD SELECTION. MET=0-NO UPDATE. MET=1-BFGS UPDATE. * MET=2-COMBINATION OF BFGS AND RANK-ONE UPDATES. * II MET1 SELECTION OF SELF SCALING. MET1=1-SELF SCALING SUPPRESSED. * MET1=2 SELF SCALING IN THE FIRST ITERATION AFTER RESTART. * MET1=3-SELF SCALING IN EACH ITERATION. * * SUBPROGRAMS USED : * S MXBSBM MULTIPLICATION OF A PARTITIONED MATRIX BY A VECTOR. * S MXBSBU UPDATE OF A PARTITIONED MATRIX. * S MXDSMS SCALING OF A DENSE SYMMETRIC MATRIX. * S MXWDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXWDOT DOT PRODUCT OF TWO SPARSE VECTORS. * SUBROUTINE PUBBM1(NA,AH,IAG,JAG,S,XO,AGO,ETA0,ETA9,ICOR,NIT,KIT, & ITERH,MET,MET1) INTEGER NA,IAG(*),JAG(*),ICOR,NIT,KIT,ITERH,MET, & MET1 DOUBLE PRECISION AH(*),S(*),XO(*),AGO(*),ETA0,ETA9 DOUBLE PRECISION A,B,C,GAM,POM,DEN,MXWDOT INTEGER K,L,KA,NB,INEG LOGICAL L1,L3 IF (MET.LE.0) GO TO 22 L1=MET1.GE.3.OR.MET1.EQ.2.AND.NIT.EQ.KIT L3=.NOT.L1 NB=0 INEG=0 DO 21 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K * * DETERMINATION OF THE PARAMETERS B, C * B=MXWDOT(L,JAG(K),AGO(K),XO,2) IF (MET.EQ.1) THEN IF (B.LE.1.0D 0/ETA9) GO TO 20 ELSE IF (ABS(B).LE.1.0D 0/ETA9) GO TO 20 END IF A=0.0D 0 CALL MXBSBM(L,AH(NB+1),JAG(K),XO,S,1) C=MXWDOT(L,JAG(K),XO,S,1) IF (ABS(C).LE.1.0D 0/ETA9) GO TO 20 IF (L1) THEN * * DETERMINATION OF THE PARAMETER GAM (SELF SCALING) * GAM=C/B IF (L3) THEN GAM=1.0D 0 END IF ELSE GAM=1.0D 0 END IF IF (MET.EQ.1) THEN * * BFGS UPDATE * POM=0.0D 0 CALL MXBSBU(L,AH(NB+1),JAG(K),GAM/B,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/C,S,1) ELSE IF (B.LT.0.0D 0) INEG=INEG+1 IF (ICOR.GT.0) THEN * * RANK ONE UPDATE * DEN=GAM*B-C IF (ABS(DEN).GT.ETA0*ABS(C)) THEN POM=GAM*B/DEN CALL MXWDIR(L,JAG(K),-GAM,AGO(K),S,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K), 1.0D 0/DEN,AGO(K),2) ELSE GO TO 20 END IF ELSE IF (B.LT.0.0D 0) THEN GO TO 20 ELSE * * BFGS UPDATE * POM=0.0D 0 CALL MXBSBU(L,AH(NB+1),JAG(K),GAM/B,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/C,S,1) END IF END IF ITERH=0 IF (GAM.NE.1.0D 0) THEN CALL MXDSMS(L,AH(NB+1),1.0D 0/GAM) END IF 20 CONTINUE NB=NB+L*(L+1)/2 21 CONTINUE IF (INEG.GE.NA/2) ICOR=1 22 CONTINUE RETURN END * SUBROUTINE PUBBM2 ALL SYSTEMS 97/12/01 * PURPOSE : * PARTITIONED VARIABLE METRIC UPDATE. * * PARAMETERS : * II NA NUMBER OF BLOCKS OF THE MATRIX H. * RU AH(MB) APPROXIMATION OF THE PARTITIONED HESSIAN MATRIX. * RI IAG(NA+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RA S(NF) AUXILIARY VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI AGO(MA) GRADIENTS DIFFERENCE. * RI ETA0 MACHINE PRECISION. * RI ETA9 MAXIMUM MACHINE NUMBER. * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET VARIABLE METRIC UPDATE. MET=1-THE BFGS UPDATE. MET=2-THE * DFP UPDATE. MET=3-THE HOSHINO UPDATE. MET=4-THE RANK ONE * UPDATE. * II MET1 SELECTION OF SELF SCALING. MET1=1-SELF SCALING SUPPRESSED. * MET1=2 SELF SCALING IN THE FIRST ITERATION AFTER RESTART. * MET1=3-CONTROLLED SELF SCALING. * II MET3 CORRECTION OF THE UPDATE. MET3=1-CORRECTION IS SUPPRESSED. * MET3=2-THE POWELL UPDATE. * * SUBPROGRAMS USED : * S MXBSBM MULTIPLICATION OF A PARTITIONED MATRIX BY A VECTOR. * S MXBSBU UPDATE OF A PARTITIONED MATRIX. * S MXDSMS SCALING OF A DENSE SYMMETRIC MATRIX. * S MXWDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXWDOT DOT PRODUCT OF TWO SPARSE VECTORS. * SUBROUTINE PUBBM2(NA,AH,IAG,JAG,S,XO,AGO,ETA0,ETA9,NIT,KIT,ITERH, & MET,MET1,MET3) INTEGER NA,IAG(*),JAG(*),NIT,KIT,ITERH,MET,MET1,MET3 DOUBLE PRECISION AH(*),S(*),XO(*),AGO(*),ETA0,ETA9 DOUBLE PRECISION A,B,C,GAM,POM,DEN,DIS,MXWDOT INTEGER K,L,KA,NB LOGICAL L1,L3 DOUBLE PRECISION CON,CON1,CON2 PARAMETER (CON=0.1D 0,CON1=0.5D 0,CON2=4.0D 0) L1=MET1.GE.3.OR.MET1.EQ.2.AND.NIT.EQ.KIT L3=.NOT.L1 NB=0 DO 21 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K * * DETERMINATION OF THE PARAMETERS B, C * B=MXWDOT(L,JAG(K),AGO(K),XO,2) IF (MET3.EQ.1) THEN IF (B.LE.1.0D 0/ETA9) GO TO 20 ELSE IF (ABS(B).LE.1.0D 0/ETA9) GO TO 20 END IF A=0.0D 0 CALL MXBSBM(L,AH(NB+1),JAG(K),XO,S,1) C=MXWDOT(L,JAG(K),XO,S,1) IF (MET3.EQ.3) THEN IF (ABS(C).LE.1.0D 0/ETA9) GO TO 20 ELSE IF (C.LE.1.0D 0/ETA9) GO TO 20 END IF IF (MET3.EQ.2) THEN IF (B.LE.0.0D 0) THEN * * POWELL'S CORRECTION * DIS=(1.0D 0-CON)*C/(C-B) CALL MXWDIR(L,JAG(K),-1.0D 0,AGO(K),S,AGO(K),2) CALL MXWDIR(L,JAG(K),-DIS,AGO(K),S,AGO(K),2) B=C+DIS*(B-C) END IF END IF IF (L1) THEN * * DETERMINATION OF THE PARAMETER GAM (SELF SCALING) * GAM=C/B IF (MET1.EQ.3) THEN IF (NIT.NE.KIT) THEN L3=GAM.LT.CON1.OR.GAM.GT.CON2 END IF ELSE IF (MET1.EQ.4) THEN GAM=MAX(1.0D 0,GAM) END IF IF (L3) THEN GAM=1.0D 0 END IF ELSE GAM=1.0D 0 END IF IF (MET.EQ.1) THEN GO TO 18 ELSE IF (MET.EQ.2) THEN * * DFP UPDATE * DEN=GAM*B+C DIS=GAM+C/B POM=1.0D 0 CALL MXWDIR(L,JAG(K),-DIS,AGO(K),S,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),1.0D 0/DEN,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/DEN,S,1) GO TO 19 ELSE IF (MET.EQ.3) THEN * * HOSHINO UPDATE * DEN=GAM*B+C DIS=0.5D 0*B POM=GAM*B/DEN CALL MXBSBU(L,AH(NB+1),JAG(K),GAM/DIS,AGO(K),2) CALL MXWDIR(L,JAG(K),GAM,AGO(K),S,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/DEN,AGO(K),2) GO TO 19 ELSE IF (MET.EQ.4) THEN * * RANK ONE UPDATE * DEN=GAM*B-C IF (MET3.EQ.3) THEN IF (ABS(DEN).LE.ETA0*ABS(C)) GO TO 18 ELSE IF (DEN.LE.ETA0*C) GO TO 18 END IF POM=GAM*B/DEN CALL MXWDIR(L,JAG(K),-GAM,AGO(K),S,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K), 1.0D 0/DEN,AGO(K),2) GO TO 19 END IF 18 CONTINUE * * BFGS UPDATE * POM=0.0D 0 CALL MXBSBU(L,AH(NB+1),JAG(K),GAM/B,AGO(K),2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/C,S,1) 19 CONTINUE ITERH=0 IF (GAM.NE.1.0D 0) THEN CALL MXDSMS(L,AH(NB+1),1.0D 0/GAM) END IF 20 CONTINUE NB=NB+L*(L+1)/2 21 CONTINUE RETURN END * SUBROUTINE PUBVI2 ALL SYSTEMS 04/12/01 * PURPOSE : * NONSMOOTH VARIABLE METRIC UPDATE OF THE INVERSE HESSIAN MATRIX. * * PARAMETERS : * II NF ACTUAL NUMBER OF VARIABLES. * II NA NUMBER OF APPROXIMATED FUNCTIONS. * II MA NUMBER OF ELEMENTS IN THE FIELD AG. * II MB NUMBER OF NONZERO ELEMENTS OF THE PARTITIONED HESSIAN MATRIX. * RU AH(MB) NUMERICAL VALUES OF ELEMENTS OF THE PARTITIONED HESSIAN * MATRIX. * II IAG(NA+1) POINTERS OF THE JACOBIAN MATRIX. * RI JAG(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * RI AG(NF) NEW GENERALIZED JACOBIAN MATRIX. * RI AGO(NF) OLD GENERALIZED JACOBIAN MATRIX. * RI XO(N) VECTOR OF VARIABLES DIFFERENCE. * RO S(NF) AUXILIARY VECTOR. * RO U(NF) AUXILIARY VECTOR. * RI ETA9 MAXIMUM MACHINE NUMBER. * II NNK CONSECUTIVE NULL STEPS COUNTER. * II NIT ACTUAL NUMBER OF ITERATIONS. * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * * SUBPROGRAMS USED : * S MXBSBM MULTIPLICATION OF A DENSE SYMMETRIC MATRIX BY A VECTOR. * S MXBSBU UPDATE OF A PARTITIONED SYMMETRIC MATRIX. * S MXDSMS SCALING OF A DENSE SYMMETRIC MATRIX. * S MXVDIF DIFFERENCE OF TWO VECTORS. * S MXWDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXWDOT DOT PRODUCT OF VECTORS. * SUBROUTINE PUBVI2(NA,AH,IAG,JAG,AG,AGO,XO,S,U,ETA9,NNK,NIT,ITERH) INTEGER NA,IAG(*),JAG(*),NNK,NIT,ITERH DOUBLE PRECISION AH(*),AG(*),AGO(*),XO(*),S(*),U(*),ETA9 DOUBLE PRECISION GAM,A,B,C,Q,DEN,POM,MXWDOT INTEGER KA,K,L,NB,INEG LOGICAL LB,LR NB=0 INEG=0 DO 21 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K CALL MXVDIF(L,AG(K),AGO(K),U) * * DETERMINATION OF THE PARAMETERS B, C * B=MXWDOT(L,JAG(K),U,XO,2) IF (ABS(B).LE.1.0D 0/ETA9) GO TO 20 A=0.0D 0 CALL MXBSBM(L,AH(NB+1),JAG(K),XO,S,1) C=MXWDOT(L,JAG(K),XO,S,1) IF (ABS(C).LE.1.0D 0/ETA9) GO TO 20 GAM=1.0D 0 IF (NIT.EQ.1) THEN Q=1.0D 0 IF (C.NE.0.0D 0) Q=C/B IF ((Q-2.5D-1)*(Q-3.0D 0).GT.0.0D 0) GAM=MIN(3.0D 0, & MAX(2.0D-2,Q)) END IF IF (B.LT.0.0D 0) INEG=INEG+1 LB=NNK.EQ.0 LR=NNK.NE.0.AND.C.LT.GAM*B IF (LB)THEN IF (B.LT.0.0D 0) GO TO 20 * * BFGS UPDATE * POM=0.0D 0 CALL MXBSBU(L,AH(NB+1),JAG(K),GAM/B,U,2) CALL MXBSBU(L,AH(NB+1),JAG(K),-1.0D 0/C,S,1) ITERH=0 IF (GAM.NE.1.0D 0) THEN CALL MXDSMS(L,AH(NB+1),1.0D 0/GAM) END IF ELSE IF (LR) THEN DEN=GAM*B-C POM=GAM*B/DEN CALL MXWDIR(L,JAG(K),-GAM,U,S,U,2) CALL MXBSBU(L,AH(NB+1),JAG(K), 1.0D 0/DEN,U,2) END IF 20 CONTINUE NB=NB+L*(L+1)/2 21 CONTINUE RETURN END * SUBROUTINE PULCI3 ALL SYSTEMS 96/12/01 * PURPOSE : * LIMITED STORAGE INVERSE COLUMN UPDATE METHODS. * * PARAMETERS : * II N NUMBER OF VARIABLES. * RI A(IAG(N+1)-1) SPARSE RECTANGULAR MATRIX WHICH IS USED FOR THE * DIRECTION VECTOR DETERMINATION. * II IA(N+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD AG. * II JA(MA) COLUMN INDICES OF ELEMENTS IN THE FIELD AG. * IU IP(N) PERMUTATION VECTOR. * IU ID(N) POSITION OF THE DIAGONAL ELEMENTS IN THE FIELD AG. * RU XM(N*MF) SET OF VECTORS FOR INVERSE COLUMN UPDATE. * RU GM(MF) SET OF VALUES FOR INVERSE COLUMN UPDATE. * IU IM(MF) SET OF INDICES FOR INVERSE COLUMN UPDATE. * RA XO(N) AUXILIARY VECTOR. * RI AFO(N) GRADIENTS DIFERENCES. * RO S(N) DIRECTION VECTOR. * II MF NUMBER OF VARIABLE METRIC UPDATES. * II NIT NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * IU IREST RESTART INDICATOR. * * SUBPROGRAMS USED : * S MXLIIM MATRIX MULTIPLICATION FOR LIMITED STORAGE INVERSE * COLUMN UPDATE METHOD. * S MXVDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXVMX1 DOT PRODUCT OF VECTORS. * * METHOD : * LIMITED STORAGE VARIABLE METRIC METHODS. * SUBROUTINE PULCI3(N,A,IA,JA,IP,ID,XM,GM,IM,XO,AFO,S,MF,NIT,KIT, + ITERH,IREST) INTEGER IREST,ITERH,NIT,KIT,MF,N DOUBLE PRECISION A(*),AFO(*),GM(*),S(*),XM(*),XO(*) INTEGER IA(*),ID(*),IM(*),IP(*),JA(*) DOUBLE PRECISION TEMP INTEGER II,MA,MM DOUBLE PRECISION MXVMX1 MA = IA(N+1) - 1 MM = MIN(NIT-KIT,MF) IF (MM.GE.MF) THEN ITERH = 1 IREST = 1 ELSE II = N*MM + 1 CALL MXLIIM(N,MM,A(MA+1),IA,JA,IP,ID,XM,GM,IM,AFO,XM(II),S) CALL MXVDIR(N,-1.0D0,XM(II),XO,XM(II)) MM = MM + 1 TEMP = MXVMX1(N,AFO,II) IF (TEMP.LE.0.0D0) THEN ITERH = 2 ELSE IM(MM) = II GM(MM) = AFO(II) ITERH = 0 END IF END IF RETURN END * SUBROUTINE PULSP3 ALL SYSTEMS 02/12/01 * PURPOSE : * LIMITED STORAGE VARIABLE METRIC UPDATE. * * PARAMETERS : * II N NUMBER OF VARIABLES (NUMBER OF ROWS OF XM). * II M NUMBER OF COLUMNS OF XM. * II MF MAXIMUM NUMBER OF COLUMNS OF XM. * RI XM(N*M) RECTANGULAR MATRIX IN THE PRODUCT FORM SHIFTED BROYDEN * METHOD (STORED COLUMNWISE): H-SIGMA*I=XM*TRANS(XM) * RO GR(M) MATRIX TRANS(XM)*GO. * RU XO(N) VECTORS OF VARIABLES DIFFERENCE XO AND VECTOR XO-TILDE. * RU GO(N) GRADIENT DIFFERENCE GO AND VECTOR XM*TRANS(XM)*GO. * RI R STEPSIZE PARAMETER. * RI PO OLD DIRECTIONAL DERIVATIVE (MULTIPLIED BY R) * RU SIG SCALING PARAMETER (ZETA AND SIGMA). * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET3 CHOICE OF SIGMA (1-CONSTANT, 2-QUADRATIC EQUATION). * * SUBPROGRAMS USED : * S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR * MATRIX BY A VECTOR. * S MXDCMU UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. * S MXVDIR VECTOR AUGMENTED BY A SCALED VECTOR. * RF MXVDOT DOT PRODUCT OF VECTORS. * S MXVSCL SCALING OF A VECTOR. * * METHOD : * SHIFTED BFGS METHOD IN THE PRODUCT FORM. * SUBROUTINE PULSP3(N,M,MF,XM,GR,XO,GO,R,PO,SIG,ITERH,MET3) INTEGER N,M,MF,ITERH,MET3 DOUBLE PRECISION XM(*),GR(*),XO(*),GO(*),R,PO,SIG DOUBLE PRECISION DEN,POM,A,B,C,AA,AH,BB,PAR,MXVDOT IF (M.GE.MF) RETURN B=MXVDOT(N,XO,GO) IF (B.LE.0.0D 0) THEN ITERH=2 GO TO 22 END IF CALL MXDRMM(N,M,XM,GO,GR) AH=MXVDOT(N,GO,GO) AA=MXVDOT(M,GR,GR) A=AA+AH*SIG C=-R*PO * * DETERMINATION OF THE PARAMETER SIG (SHIFT) * PAR=1.0D 0 POM=B/AH IF (A.GT.0.0D 0) THEN DEN=MXVDOT(N,XO,XO) IF (MET3.LE.4) THEN SIG=SQRT(MAX(0.0D 0,1.0D 0-AA/A))/(1.0D 0+ & SQRT(MAX(0.0D 0,1.0D 0-B*B/(DEN*AH))))*POM ELSE SIG=SQRT(MAX(0.0D 0,SIG*AH/A))/(1.0D 0+ & SQRT(MAX(0.0D 0,1.0D 0-B*B/(DEN*AH))))*POM END IF SIG=MAX(SIG,2.0D-1*POM) SIG=MIN(SIG,8.0D-1*POM) ELSE SIG=2.5D-1*POM END IF * * COMPUTATION OF SHIFTED XO AND SHIFTED B * BB=B-AH*SIG CALL MXVDIR(N,-SIG,GO,XO,XO) * * BFGS-BASED SHIFTED BFGS UPDATE * POM=1.0D 0 CALL MXDCMU(N,M,XM,-1.0D 0/BB,XO,GR) CALL MXVSCL(N,SQRT(PAR/BB),XO,XM(N*M+1)) M=M+1 22 CONTINUE ITERH=0 RETURN END * SUBROUTINE PULVP3 ALL SYSTEMS 03/12/01 * PURPOSE : * RANK-TWO LIMITED-STORAGE VARIABLE-METRIC METHODS IN THE PRODUCT FORM. * * PARAMETERS : * II N NUMBER OF VARIABLES (NUMBER OF ROWS OF XM). * II M NUMBER OF COLUMNS OF XM. * RI XM(N*M) RECTANGULAR MATRIX IN THE PRODUCT FORM SHIFTED BROYDEN * METHOD (STORED COLUMNWISE): H-SIGMA*I=XM*TRANS(XM) * RO XR(M) VECTOR TRANS(XM)*H**(-1)*XO. * RO GR(M) MATRIX TRANS(XM)*GO. * RA S(N) AUXILIARY VECTORS (H**(-1)*XO AND U). * RA SO(N) AUXILIARY VECTORS ((H-SIGMA*I)*H**(-1)*XO AND V). * RU XO(N) VECTORS OF VARIABLES DIFFERENCE XO AND VECTOR XO-TILDE. * RU GO(N) GRADIENT DIFFERENCE GO AND VECTOR XM*TRANS(XM)*GO. * RI R STEPSIZE PARAMETER. * RI PO OLD DIRECTIONAL DERIVATIVE (MULTIPLIED BY R) * RU SIG SCALING PARAMETER (ZETA AND SIGMA). * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II MET2 CHOICE OF THE CORRECTION PARAMETER (1-THE UNIT VALUE, * 2-THE BALANCING VALUE, 3-THE SQUARE ROOT, 4-THE GEOMETRIC * MEAN). * II MET3 CHOICE OF THE SHIFT PARAMETER (4-THE FIRST FORMULA, * 5-THE SECOND FORMULA). * II MET5 CHOICE OF THE METHOD (1-RANK-ONE METHOD, 2-RANK-TWO * METHOD). * * SUBPROGRAMS USED : * S MXDRMM MULTIPLICATION OF A ROWWISE STORED DENSE RECTANGULAR * MATRIX BY A VECTOR. * S MXDCMU UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. RANK-ONE FORMULA. * S MXDCMV UPDATE OF A COLUMNWISE STORED DENSE RECTANGULAR MATRIX. * WITH CONTROLLING OF POSITIVE DEFINITENESS. RANK-TWO FORMULA. * S MXVDIR VECTOR AUGMENTED BY A SCALED VECTOR. * RF MXVDOT DOT PRODUCT OF VECTORS. * S MXVLIN LINEAR COMBINATION OF TWO VECTORS. * S MXVSCL SCALING OF A VECTOR. * * METHOD : * RANK-ONE LIMITED-STORAGE VARIABLE-METRIC METHOD IN THE PRODUCT FORM. * SUBROUTINE PULVP3(N,M,XM,XR,GR,S,SO,XO,GO,R,PO,SIG,ITERH,MET2, & MET3,MET5) INTEGER N,M,ITERH,MET2,MET3,MET5 DOUBLE PRECISION XM(*),XR(*),GR(*),S(*),SO(*),XO(*),GO(*), & R,PO,SIG DOUBLE PRECISION MXVDOT DOUBLE PRECISION DEN,POM,A,B,C,AA,BB,CC,AH,PAR,ZET ZET=SIG * * COMPUTATION OF B * B=MXVDOT(N,XO,GO) IF (B.LE.0.0D 0) THEN ITERH=2 GO TO 22 END IF * * COMPUTATION OF GR=TRANS(XM)*GO, XR=TRANS(XM)*H**(-1)*XO * AND S=H**(-1)*XO, SO=(H-SIGMA*I)*H**(-1)*XO. COMPUTATION * OF AA=GR*GR, BB=GR*XR, CC=XR*XR. COMPUTATION OF A AND C. * CALL MXDRMM(N,M,XM,GO,GR) CALL MXVSCL(N,R,S,S) CALL MXDRMM(N,M,XM,S,XR) CALL MXVDIR(N,-SIG,S,XO,SO) AH=MXVDOT(N,GO,GO) AA=MXVDOT(M,GR,GR) BB=MXVDOT(M,GR,XR) CC=MXVDOT(M,XR,XR) A=AA+AH*SIG C=-R*PO * * DETERMINATION OF THE PARAMETER SIG (SHIFT) * POM=B/AH IF (A.GT.0.0D 0) THEN DEN=MXVDOT(N,XO,XO) IF (MET3.LE.4) THEN SIG=SQRT(MAX(0.0D 0,1.0D 0-AA/A))/(1.0D 0+ & SQRT(MAX(0.0D 0,1.0D 0-B*B/(DEN*AH))))*POM ELSE SIG=SQRT(MAX(0.0D 0,SIG*AH/A))/(1.0D 0+ & SQRT(MAX(0.0D 0,1.0D 0-B*B/(DEN*AH))))*POM END IF SIG=MAX(SIG,2.0D-1*POM) SIG=MIN(SIG,8.0D-1*POM) ELSE SIG=2.5D-1*POM END IF * * COMPUTATION OF SHIFTED XO AND SHIFTED B * B=B-AH*SIG CALL MXVDIR(N,-SIG,GO,XO,XO) * * COMPUTATION OF THE PARAMETER RHO (CORRECTION) * IF (MET2.LE.1) THEN PAR=1.0D 0 ELSE IF (MET2.EQ.2) THEN PAR=SIG*AH/B ELSE IF (MET2.EQ.3) THEN PAR=SQRT(1.0D 0-AA/A) ELSE IF (MET2.EQ.4) THEN PAR=SQRT(SQRT(1.0D 0-AA/A)*(SIG*AH/B)) ELSE PAR=ZET/(ZET+SIG) END IF * * COMPUTATION OF THE PARAMETER THETA (BFGS) * POM=SIGN(SQRT(PAR*B/CC),BB) * * COMPUTATION OF Q AND P * IF (MET5.EQ.1) THEN * * RANK ONE UPDATE OF XM * CALL MXVDIR(M,POM,XR,GR,XR) CALL MXVLIN(N,PAR,XO,POM,SO,S) CALL MXDCMU(N,M,XM,-1.0D 0/(PAR*B+POM*BB),S,XR) ELSE * * RANK TWO UPDATE OF XM * CALL MXVDIR(N,PAR/POM-BB/B,XO,SO,S) CALL MXDCMV(N,M,XM,-1.0D 0/B,XO,GR,-1.0D 0/CC,S,XR) END IF 22 CONTINUE ITERH=0 RETURN END * SUBROUTINE PUSMM1 ALL SYSTEMS 97/12/01 * PURPOSE : * VARIABLE METRIC UPDATE OF A SPARSE SYMMETRIC POSITIVE DEFINITE MATRIX * USING THE MARWIL PROJECTION. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RU H(M) POSITIVE DEFINITE APPROXIMATION OF THE SPARSE HESSIAN * MATRIX. * II IH(NF) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RA XS(NF) AUXILIARY VECTOR. * RA S(NF) AUXILIARY VECTOR. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI GO(NF) GRADIENTS DIFFERENCE. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RO R VALUE OF THE STEPSIZE PARAMETER. * RI PO INITIAL VALUE OF THE DIRECTIONAL DERIVATIVE. * II NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER LAST RESTART. * II MET1 SELECTION OF SELF SCALING. MET1=1-SELF SCALING SUPPRESSED. * MET1=2-INITIAL SELF SCALING. MET1=3-SELF SCALING IN EACH * ITERATION. * II ITERD CAUSE OF TERMINATION IN THE DIRECTION DETERMINATION. * ITERD<0-BAD DECOMPOSITION. ITERD=0-DESCENT DIRECTION. * ITERD=1-NEWTON LIKE STEP. ITERD=2-INEXACT NEWTON LIKE STEP. * ITERD=3-BOUNDARY STEP. ITERD=4-DIRECTION WITH THE NEGATIVE * CURVATURE. ITERD=5-MARQUARDT STEP. * IO ITERH TERMINATION INDICATOR. ITERH<0-BAD DECOMPOSITION. * ITERH=0-SUCCESSFUL UPDATE. ITERH>0-NONPOSITIVE PARAMETERS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * * SUBPROGRAMS USED : * S MXSSMM MATRIX-VECTOR PRODUCT. * S MXSSMY MARWILL CORRECTION OF A SPARSE SYMMETRIC MATRIX. * S MXUDIF DIFFERENCE OF TWO VECTORS. * S MXUDIR VECTOR AUGMENTED BY THE SCALED VECTOR. * RF MXUDOT DOT PRODUCT OF VECTORS. * S MXVSCL SCALING OF A VECTOR. * SUBROUTINE PUSMM1(NF,H,IH,JH,G,XS,S,XO,GO,IX,R,PO,NIT,KIT, & MET1,ITERD,ITERH,KBF) INTEGER NF,IH(*),JH(*),IX(*),NIT,KIT,MET1,ITERD,ITERH,KBF DOUBLE PRECISION H(*),G(*),S(*),XO(*),GO(*),XS(*),R,PO INTEGER MM DOUBLE PRECISION MXUDOT DOUBLE PRECISION A,B,C,GAM LOGICAL L1 MM=IH(NF+1)-1 * * DETERMINATION OF THE PARAMETER C AND THE VECTOR S * A=0.0D 0 L1=MET1.GE.3.OR.MET1.GE.2.AND.NIT.EQ.KIT IF (ITERD.NE.1) THEN CALL MXSSMM(NF,H,IH,JH,XO,S) IF (L1) C=MXUDOT(NF,XO,S,IX,KBF) ELSE CALL MXUDIF(NF,GO,G,S,IX,KBF) CALL MXVSCL(NF,R,S,S) IF (L1) C=-R*PO END IF GAM=1.0D 0 IF (L1) THEN * * SELF SCALING * B=MXUDOT(NF,XO,GO,IX,KBF) IF (B.GT.0.0D 0.AND.C.GT.0.0D 0) THEN GAM=C/B CALL MXVSCL(MM,1.0D 0/GAM,H,H) CALL MXVSCL(NF,1.0D 0/GAM,S,S) END IF END IF CALL MXUDIR(NF,-1.0D 0,S,GO,S,IX,KBF) * * RANK-ONE UPDATE PROJECTED USING MXSSMY * CALL MXSSMY(NF,H,IH,JH,XS,S,XO) ITERH=0 RETURN END * SUBROUTINE PUSSD5 ALL SYSTEMS 97/12/01 * PURPOSE : * INITIATION OF A DENSE SYMMETRIC POSITIVE DEFINITE MATRIX * * PARAMETERS : * II NA NUMBER OF APPROXIMATED FUNCTIONS. * RI AF(NA) VECTOR CONTAINING VALUES OF THE APPROXIMATED * FUNCTIONS. * RU AH(MB) POSITIVE DEFINITE APPROXIMATION OF THE PARTITIONED * HESSIAN MATRIX. * II IAG(NA+1) POINTERS OF THE SPARSE JACOBIAN MATRIX. * II JAG(MA) COLUMN INDICES OF THE SPARSE JACOBIAN MATRIX. * RU H(M) POSITIVE DEFINITE APPROXIMATION OF THE SPARSE HESSIAN * MATRIX * II IH(NF+1) POINTERS OF THE DIAGONAL ELEMENTS OF THE SPARSE * HESSIAN MATRIX. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF THE SPARSE HESSIAN * MATRIX IN THE PACKED ROW FORM. * * SUBPROGRAMS USED : * S PASSH2 COMPUTATION OF THE SPARSE HESSIAN MATRIX FROM THE * PARTITIONED HESSIAN MATRIX. * SUBROUTINE PUSSD5(NA,AF,AH,IAG,JAG,H,IH,JH) INTEGER NA,IAG(*),JAG(*),IH(*),JH(*) DOUBLE PRECISION AF(*),AH(*),H(*) INTEGER K,KA,L,LL,NB NB=0 DO 2 KA=1,NA K=IAG(KA) L=IAG(KA+1)-K LL=L*(L+1)/2 CALL PASSH2(H,IH,JH,AH(NB+1),IAG,JAG,KA,AF(KA)) NB=NB+LL 2 CONTINUE RETURN END * SUBROUTINE PYABU1 ALL SYSTEMS 04/12/01 * PURPOSE : * SUBGRADIENT AGGREGATION FOR NONSMOOTH VARIABLE METRIC METHOD. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI H(M) POSITIVE DEFINITE APPROXIMATION OF THE SPARSE HESSIAN * MATRIX. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * II PSL(NF+1) POINTER ARRAY OF THE FACTORIZED SPARSE MATRIX * II PERM(NF) PERMUTATION VECTOR * RI G(NF) NEW SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RI GO(NF) OLD SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RU GV(NF) AGGREGATED SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RI S(NF) DIRECTION VECTOR. * RA U(NF) AUXILIARY VECTOR. * RA V(NF) AUXILIARY VECTOR. * RO ALF LINEARIZATION TERM. * RU ALFV AGGREGATED LINEARIZATION TERM. * RI RHO CORRECTION PARAMETER. * II JC CORRECTION INDICATOR. * * SUBPROGRAMS USED : * S MXSPCB BACK SUBSTITUTION USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * RF MXVDOT DOT PRODUCT OF TWO VECTORS. * S MXVSBP INVERSE PERMUTATION OF A VECTOR * S MXVSFP PERMUTATION OF A VECTOR. * SUBROUTINE PYABU1(NF,H,JH,PSL,PERM,G,GO,GV,S,U,V,ALF,ALFV,RHO, & JC) INTEGER NF,JH(*),PSL(*),PERM(*),JC DOUBLE PRECISION H(*),G(*),GO(*),GV(*),S(*),U(*),V(*),ALF,ALFV, & RHO DOUBLE PRECISION A,B,ALFM,LAM1,LAM2,PQ,PR,PRQR,QQP,QR,RR,RRP,RRQ, & W,W1 INTEGER I DOUBLE PRECISION ZERO,ONE,MXVDOT PARAMETER (ZERO=0.0D 0,ONE=1.0D 0) ALFM=ZERO * * General routine - here always input parameter ALFM=0 * RR=ALFV+ALFV RRP=ALFV-ALFM RRQ=ALFV-ALF DO 1 I=1,NF A=S(I) U(I)=GO(I)-GV(I) S(I)=G(I)-GV(I) RR=RR-A*GV(I) RRP=RRP+A*U(I) RRQ=RRQ+A*S(I) 1 CONTINUE PQ=ZERO PR=ZERO QR=ZERO PRQR=ZERO QQP=ZERO IF (JC.GE.1) THEN DO 2 I=1,NF PQ=PQ+RHO*(S(I)-U(I))**2 PR=PR+RHO*U(I)**2 QR=QR+RHO*S(I)**2 PRQR=PRQR+RHO*U(I)*S(I) QQP=QQP+RHO+G(I)*(S(I)-U(I)) 2 CONTINUE END IF QQP=QQP+ALF-ALFM CALL MXVSFP(NF,PERM,U,V) CALL MXSPCB(NF,H,PSL,JH,U,1) CALL MXVSFP(NF,PERM,S,V) CALL MXSPCB(NF,H,PSL,JH,S,1) DO 4 I=1,NF W1=ONE/H(PSL(I)+I-1) PQ=PQ+W1*(S(I)-U(I))**2 PR=PR+W1*U(I)**2 QR=QR+W1*S(I)**2 PRQR=PRQR+W1*U(I)*S(I) S(I)=W1*(S(I)-U(I)) 4 CONTINUE CALL MXSPCB(NF,H,PSL,JH,S,-1) CALL MXVSBP(NF,PERM,S,V) QQP=QQP+MXVDOT(NF,G,S) IF (PR.LE.ZERO.OR.QR.LE.ZERO) GO TO 10 A=RRQ/QR B=PRQR/QR W=PRQR*B-PR IF (W.EQ.ZERO) GO TO 10 LAM1=(A*PRQR-RRP)/W LAM2=A-LAM1*B IF (LAM1*(LAM1-ONE).LT.ZERO.AND.LAM2*(LAM1+LAM2-ONE).LT.ZERO) & GO TO 40 * * MINIMUM ON THE BOUNDARY * 10 LAM1=ZERO LAM2=ZERO IF (ALF.LE.ALFV) LAM2=ONE IF (QR.GT.ZERO) LAM2=MIN(ONE,MAX(ZERO,RRQ/QR)) W=(LAM2*QR-RRQ-RRQ)*LAM2 A=ZERO IF (ALFM.LE.ALFV) A=ONE IF (PR.GT.ZERO) A=MIN(ONE,MAX(ZERO,RRP/PR)) B=(A*PR-RRP-RRP)*A IF (B.LT.W)THEN W=B LAM1=A LAM2=ZERO END IF IF (QQP*(QQP-PQ).GE.ZERO) GO TO 40 IF (QR-RRQ-RRQ-QQP*QQP/PQ.GE.W) GO TO 40 LAM1=QQP/PQ LAM2=ONE-LAM1 40 IF (LAM1.EQ.ZERO.AND.LAM2*(LAM2-ONE).LT.ZERO.AND.RRP-LAM2*PRQR & .GT.ZERO.AND.PR.GT.ZERO) LAM1=MIN(ONE-LAM2,(RRP-LAM2*PRQR)/PR) A=ONE-LAM1-LAM2 ALFV=LAM1*ALFM+LAM2*ALF+A*ALFV DO 5 I=1,NF GV(I)=LAM1*GO(I)+LAM2*G(I)+A*GV(I) 5 CONTINUE RETURN END * SUBROUTINE PYABU2 ALL SYSTEMS 04/12/01 * PURPOSE : * SIMPLIFIED AGGREGATION FOR NONSMOOTH VARIABLE METRIC METHOD. * * PARAMETERS : * II NF NUMBER OF VARIABLES. * RI H(M) POSITIVE DEFINITE APPROXIMATION OF THE SPARSE HESSIAN * MATRIX. * IO JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * II PSL(NF+1) POINTER ARRAY OF THE FACTORIZED SPARSE MATRIX * II PERM(NF) PERMUTATION VECTOR * RI G(NF) ACTUAL SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RU GV(NF) AGGREGATED SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RA S(NF) DIRECTION VECTOR. * RA V(NF) AUXILIARY VECTOR. * RO ALF LINEARIZATION TERM. * RU ALFV AGGREGATED LINEARIZATION TERM. * RI RHO CORRECTION PARAMETER. * II JC CORRECTION INDICATOR. * * SUBPROGRAMS USED : * S MXSPCB BACK SUBSTITUTION USING THE SPARSE DECOMPOSITION * OBTAINED BY MXSPCF. * S MXVSFP PERMUTATION OF A VECTOR. * SUBROUTINE PYABU2(NF,H,JH,PSL,PERM,G,GV,S,V,ALF,ALFV,RHO,JC) INTEGER NF,JH(*),PSL(*),PERM(NF),JC DOUBLE PRECISION H(*),G(*),GV(*),S(*),V(*),ALF,ALFV,RHO DOUBLE PRECISION P,Q,W,LAM INTEGER I DOUBLE PRECISION ZERO,ONE PARAMETER (ZERO=0.0D 0,ONE=1.0D 0) P=ALFV-ALF DO 1 I=1,NF W=S(I) P=P+W*S(I) S(I)=G(I)-GV(I) 1 CONTINUE Q=ZERO IF (JC.GE.1) THEN DO 2 I=1,NF Q=Q+RHO*S(I)**2 2 CONTINUE END IF CALL MXVSFP(NF,PERM,S,V) CALL MXSPCB(NF,H,PSL,JH,S,1) DO 4 I=1,NF W=ONE/H(PSL(I)+I-1) Q=Q+W*S(I)**2 4 CONTINUE LAM=0.5D 0+SIGN(0.5D 0,P) IF (Q.GT.ZERO) LAM=MIN(ONE,MAX(ZERO,P/Q)) P=ONE-LAM ALFV=LAM*ALF+P*ALFV DO 5 I=1,NF GV(I)=LAM*G(I)+P*GV(I) 5 CONTINUE RETURN END * SUBROUTINE PYADC0 ALL SYSTEMS 98/12/01 * PURPOSE : * NEW SIMPLE BOUNDS ARE ADDED TO THE ACTIVE SET. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N REDUCED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * IO INEW NUMBER OF ACTIVE CONSTRAINTS. * SUBROUTINE PYADC0(NF,N,X,IX,XL,XU,INEW) INTEGER NF,N,IX(NF),INEW DOUBLE PRECISION X(*),XL(*),XU(*) INTEGER I,II,IXI N=NF INEW=0 DO 1 I=1,NF II=IX(I) IXI=ABS(II) IF (IXI.GE.5) THEN IX(I)=-IXI ELSE IF ((IXI.EQ.1.OR.IXI.EQ.3.OR.IXI.EQ.4).AND.X(I).LE.XL(I)) & THEN X(I)=XL(I) IF (IXI.EQ.4) THEN IX(I)=-3 ELSE IX(I)=-IXI END IF N=N-1 IF (II.GT.0) INEW=INEW+1 ELSE IF ((IXI.EQ.2.OR.IXI.EQ.3.OR.IXI.EQ.4).AND.X(I).GE.XU(I)) & THEN X(I)=XU(I) IF (IXI.EQ.3) THEN IX(I)=-4 ELSE IX(I)=-IXI END IF N=N-1 IF (II.GT.0) INEW=INEW+1 END IF 1 CONTINUE RETURN END * SUBROUTINE PYBUN1 ALL SYSTEMS 97/12/01 * PURPOSE : * BUNDLE UPDATING. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * II MB DECLARED NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * II NB CURRENT NUMBER OF LINEAR APPROXIMATED FUNCTIONS. * RU X(N) VECTOR OF VARIABLES. * RO G(N) SUBGRADIENT OF THE OBJECTIVE FUNCTION. * RO F VALUE OF THE OBJECTIVE FUNCTION. * RI AY(N*MB) MATRIX WHOSE COLUMNS ARE VARIABLE VECTORS. * RI AG(N*MB) MATRIX WHOSE COLUMNS ARE BUNDLE SUBGRADIENTS. * RI AF(4*MB) VECTOR OF BUNDLE FUNCTIONS VALUES. * IO ITERS NULL STEP INDICATOR. ITERS=0-NULL STEP. ITERS=1-DESCENT * STEP. * * SUBPROGRAMS USED : * S MXVCOP COPYING OF A VECTOR. * SUBROUTINE PYBUN1(N,MB,NB,X,G,F,AY,AG,AF,ITERS) INTEGER N,MB,NB,ITERS DOUBLE PRECISION X(*),G(*),F,AY(*),AG(*),AF(*) INTEGER I,IND,K,KN,L L=0 IF (ITERS.EQ.0) L=1 * * BUNDLE REDUCTION * KN=0 IF (NB.GE.MB) THEN DO 2 K=1,NB-1 KN=K*N-N DO 1 I=1,N IF (G(I).NE.AG(KN+I)) GO TO 2 1 CONTINUE IND=K GO TO 3 2 CONTINUE IND=1 3 DO 4 K=IND,NB-1 AF(K)=AF(K+1) AF(K+MB*3)=AF(K+1+MB*3) KN=K*N+1 CALL MXVCOP(N,AG(KN),AG(KN-N)) CALL MXVCOP(N,AY(KN),AY(KN-N)) 4 CONTINUE NB=NB-1 END IF * * BUNDLE COMPLETION * IF (L.GT.0.AND.KN.EQ.0) THEN AF(NB+1)=AF(NB) AF(3*MB+NB+1)=AF(3*MB+NB) KN=NB*N+1 CALL MXVCOP(N,AG(KN-N),AG(KN)) CALL MXVCOP(N,AY(KN-N),AY(KN)) END IF NB=NB+1 KN=NB-L AF(KN)=F AF(KN+MB*3)=L K=(KN-1)*N+1 CALL MXVCOP(N,G,AG(K)) CALL MXVCOP(N,X,AY(K)) RETURN END * SUBROUTINE PYCSER ALL SYSTEMS 98/12/01 * PURPOSE : * GROUP OF THE SAME COLOUR FOR THE POWELL-TOINT ALGORITHM FOR SPARSE * HESSIANS APPROXIMATIONS IS CREATED. * * PARAMETERS : * IU IH(MCOLS+1) POINTER VECTOR OF SPARSE HESSIAN MATRIX. * IU JH(M) INDEX VECTOR OF THE HESSIAN MATRIX. * IA WN02(MCOLS) AUXILIARY VECTOR. * RA WN03(MCOLS) AUXILIARY VECTOR. * RI DEG(MCOLS) DEGREES OF THE ADJACENCY GRAPH. * IA WN01(NF) AUXILIARY VECTOR USED FOR INDICES OF THE COLUMNS * THAT HAVE NOT BEEN COLOURED YET. * II COL(NF) VECTOR DISCERNING GROUPS OF THE HESSIAN COLUMN OF THE * SAME COLOUR. * IU NCOL NUMBER OF COLOURS USED SO FAR. * IU CNM NUMBER OF COLUMNS THAT HAVE NOT BEEN COLOURED SO FAR. * SUBROUTINE PYCSER(JH,IH,WN02,WN03,DEG,WN01,COL,NCOL,CNM) INTEGER JH(*),IH(*),COL(*) INTEGER WN01(*),WN02(*) DOUBLE PRECISION WN03(*),DEG(*) INTEGER NCOL,CNM,I,J,K,L,IP * * DEFINITION OF THE INCIDENCE ARRAY A * L=WN01(1) * * ELEMENT WAS MARKED THAT IT IS INSERTED * DO 100 I=IH(L),IH(L+1)-1 K=JH(I) * * COLUMN OF THIS NUMBER HAS APPEARED IN ONE OF THE PREVIOUS GROUPS * IF (COL(K).LT.NCOL) GO TO 100 DEG(K)=DEG(K)-1 WN02(K)=NCOL 100 CONTINUE * * COLUMN IS INSERTED * COL(L)=NCOL * * THE CYCLE OF COMPARING COLUMN WITH THE ARRAY A * A2 IS AN HELP ARRAY CONTAINING COLUMNS THAT ARE * BEEING EXAMINED BUT THAT WERE NOT YET ACCEPTED * P IS ITS POINTER * IF (CNM.EQ.1) GO TO 250 DO 200 I=2,CNM * * TRANSFORMATION OF THE EXAMINED COLUMN I IS * IP=1 L=WN01(I) DO 300 J=IH(L),IH(L+1)-1 K=JH(J) IF (COL(K).LT.NCOL) GO TO 300 IF (WN02(K).GE.NCOL) GO TO 200 WN03(IP)=K IP=IP+1 300 CONTINUE IF (IP.NE.1) THEN * * COPY OF THE WN03 ARRAY INTO WN02 FOR THE COLUMN WAS ACCEPTED * DO 400 K=1,IP-1 WN02(INT(WN03(K)))=NCOL DEG(INT(WN03(K)))=DEG(INT(WN03(K)))-1 400 CONTINUE END IF * * INSERT THE COLUMN INTO THE PROCESSED GROUP * COL(L)=NCOL * * END OF THE MAIN CYCLE * 200 CONTINUE * * JUMP LABEL * 250 CONTINUE * * INVP SHIFT * K=1 DO 500 I=1,CNM L=WN01(I) IF (COL(L).EQ.NCOL) THEN ELSE WN01(K)=L K=K+1 END IF 500 CONTINUE * * CNM UPDATE * CNM=K-1 RETURN END * SUBROUTINE PYFUT1 ALL SYSTEMS 98/12/01 * PURPOSE : * TERMINATION CRITERIA AND TEST ON RESTART. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * RI F NEW VALUE OF THE OBJECTIVE FUNCTION. * RI FO OLD VALUE OF THE OBJECTIVE FUNCTION. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RO GMAX NORM OF THE TRANSFORMED GRADIENT. * RI DMAX MAXIMUM RELATIVE DIFFERENCE OF VARIABLES. * RI TOLX LOWER BOUND FOR STEPLENGTH. * RI TOLF LOWER BOUND FOR FUNCTION DECREASE. * RI TOLB LOWER BOUND FOR FUNCTION VALUE. * RI TOLG LOWER BOUND FOR GRADIENT. * II KD DEGREE OF REQUIRED DERIVATIVES. * IU NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER RESTART. * II MIT MAXIMUM NUMBER OF ITERATIONS. * IU NFV ACTUAL NUMBER OF COMPUTED FUNCTION VALUES. * II MFV MAXIMUM NUMBER OF COMPUTED FUNCTION VALUES. * IU NFG ACTUAL NUMBER OF COMPUTED GRADIENT VALUES. * II MFG MAXIMUM NUMBER OF COMPUTED GRADIENT VALUES. * IU NTESX ACTUAL NUMBER OF TESTS ON STEPLENGTH. * II MTESX MAXIMUM NUMBER OF TESTS ON STEPLENGTH. * IU NTESF ACTUAL NUMBER OF TESTS ON FUNCTION DECREASE. * II MTESF MAXIMUM NUMBER OF TESTS ON FUNCTION DECREASE. * II IRES1 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * II IRES2 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * IU IREST RESTART INDICATOR. RESTART IS PERFORMED IF IREST>0. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * IO ITERM TERMINATION INDICATOR. ITERM=1-TERMINATION AFTER MTESX * UNSUFFICIENT STEPLENGTHS. ITERM=2-TERMINATION AFTER MTESF * UNSUFFICIENT FUNCTION DECREASES. ITERM=3-TERMINATION ON LOWER * BOUND FOR FUNCTION VALUE. ITERM=4-TERMINATION ON LOWER BOUND * FOR GRADIENT. ITERM=11-TERMINATION AFTER MAXIMUM NUMBER OF * ITERATIONS. ITERM=12-TERMINATION AFTER MAXIMUM NUMBER OF * COMPUTED FUNCTION VALUES. * SUBROUTINE PYFUT1(N,F,FO,UMAX,GMAX,DMAX,TOLX,TOLF,TOLB,TOLG,KD, & NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF,ITES,IRES1, & IRES2,IREST,ITERS,ITERM) INTEGER N,KD,NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF, & ITES,IRES1,IRES2,IREST,ITERS,ITERM DOUBLE PRECISION F,FO,UMAX,GMAX,DMAX,TOLX,TOLF,TOLG,TOLB DOUBLE PRECISION TEMP IF (ITERM.LT.0) RETURN IF (ITES .LE.0) GO TO 1 IF (ITERS.EQ.0) GO TO 1 IF (NIT.LE.0) FO=F+MIN(SQRT(ABS(F)),ABS(F)/1.0D 1) IF (F.LE.TOLB) THEN ITERM = 3 RETURN END IF IF (KD.GT.0) THEN IF (GMAX.LE.TOLG.AND.UMAX.LE.TOLG) THEN ITERM = 4 RETURN END IF END IF IF (NIT.LE.0) THEN NTESX = 0 NTESF = 0 END IF IF (DMAX.LE.TOLX) THEN ITERM = 1 NTESX = NTESX+1 IF (NTESX.GE.MTESX) RETURN ELSE NTESX = 0 END IF TEMP=ABS(FO-F)/MAX(ABS(F),1.0D 0) IF (TEMP.LE.TOLF) THEN ITERM = 2 NTESF = NTESF+1 IF (NTESF.GE.MTESF) RETURN ELSE NTESF = 0 END IF 1 IF (NIT.GE.MIT) THEN ITERM = 11 RETURN END IF IF (NFV.GE.MFV) THEN ITERM = 12 RETURN END IF IF (NFG.GE.MFG) THEN ITERM = 13 RETURN END IF ITERM = 0 IF (N.GT.0.AND.NIT-KIT.GE.IRES1*N+IRES2) THEN IREST=MAX(IREST,1) END IF NIT = NIT + 1 RETURN END * SUBROUTINE PYFUT8 ALL SYSTEMS 98/12/01 * PURPOSE : * TERMINATION CRITERIA AND TEST ON RESTART. * * PARAMETERS : * II N ACTUAL NUMBER OF VARIABLES. * RI F NEW VALUE OF THE OBJECTIVE FUNCTION. * RI FO OLD VALUE OF THE OBJECTIVE FUNCTION. * RO GMAX NORM OF THE TRANSFORMED GRADIENT. * RI DMAX MAXIMUM RELATIVE DIFFERENCE OF VARIABLES. * RI RPF3 VALUE OF THE BARRIER PARAMETER. * RI TOLX LOWER BOUND FOR STEPLENGTH. * RI TOLF LOWER BOUND FOR FUNCTION DECREASE. * RI TOLB LOWER BOUND FOR FUNCTION VALUE. * RI TOLG LOWER BOUND FOR GRADIENT. * RI TOLP LOWER BOUND FOR BARRIER PARAMETER. * II KD DEGREE OF REQUIRED DERIVATIVES. * IU NIT ACTUAL NUMBER OF ITERATIONS. * II KIT NUMBER OF THE ITERATION AFTER RESTART. * II MIT MAXIMUM NUMBER OF ITERATIONS. * IU NFV ACTUAL NUMBER OF COMPUTED FUNCTION VALUES. * II MFV MAXIMUM NUMBER OF COMPUTED FUNCTION VALUES. * IU NFG ACTUAL NUMBER OF COMPUTED GRADIENT VALUES. * II MFG MAXIMUM NUMBER OF COMPUTED GRADIENT VALUES. * IU NTESX ACTUAL NUMBER OF TESTS ON STEPLENGTH. * II MTESX MAXIMUM NUMBER OF TESTS ON STEPLENGTH. * IU NTESF ACTUAL NUMBER OF TESTS ON FUNCTION DECREASE. * II MTESF MAXIMUM NUMBER OF TESTS ON FUNCTION DECREASE. * II IRES1 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * II IRES2 RESTART SPECIFICATION. RESTART IS PERFORMED AFTER * IRES1*N+IRES2 ITERATIONS. * IU IREST RESTART INDICATOR. RESTART IS PERFORMED IF IREST>0. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * IO ITERM TERMINATION INDICATOR. ITERM=1-TERMINATION AFTER MTESX * UNSUFFICIENT STEPLENGTHS. ITERM=2-TERMINATION AFTER MTESF * UNSUFFICIENT FUNCTION DECREASES. ITERM=3-TERMINATION ON LOWER * BOUND FOR FUNCTION VALUE. ITERM=4-TERMINATION ON LOWER BOUND * FOR GRADIENT. ITERM=11-TERMINATION AFTER MAXIMUM NUMBER OF * ITERATIONS. ITERM=12-TERMINATION AFTER MAXIMUM NUMBER OF * COMPUTED FUNCTION VALUES. * SUBROUTINE PYFUT8(N,F,FO,GMAX,DMAX,RPF3,TOLX,TOLF,TOLB,TOLG,TOLP, & KD,NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF,IRES1, & IRES2,IREST,ITERS,ITERM) INTEGER N,KD,NIT,KIT,MIT,NFV,MFV,NFG,MFG,NTESX,MTESX,NTESF,MTESF, & IRES1,IRES2,IREST,ITERS,ITERM DOUBLE PRECISION F,FO,RPF3,GMAX,DMAX,TOLX,TOLF,TOLG,TOLB,TOLP DOUBLE PRECISION TEMP IF (ITERM.LT.0) RETURN IF (ITERS.EQ.0) GO TO 1 IF (NIT.LE.0) FO=F+MIN(SQRT(ABS(F)),ABS(F)/1.0D 1) IF (F.LE.TOLB) THEN ITERM = 3 RETURN END IF IF (RPF3.GT.TOLP) GO TO 1 IF (KD.GT.0) THEN IF (GMAX.LE.TOLG) THEN ITERM = 4 RETURN END IF END IF IF (NIT.LE.0) THEN NTESX = 0 NTESF = 0 END IF IF (DMAX.LE.TOLX) THEN ITERM = 1 NTESX = NTESX+1 IF (NTESX.GE.MTESX) RETURN ELSE NTESX = 0 END IF TEMP=ABS(FO-F)/MAX(ABS(F),1.0D 0) IF (TEMP.LE.TOLF) THEN ITERM = 2 NTESF = NTESF+1 IF (NTESF.GE.MTESF) RETURN ELSE NTESF = 0 END IF 1 IF (NIT.GE.MIT) THEN ITERM = 11 RETURN END IF IF (NFV.GE.MFV) THEN ITERM = 12 RETURN END IF IF (NFG.GE.MFG) THEN ITERM = 13 RETURN END IF ITERM = 0 IF (N.GT.0.AND.NIT-KIT.GE.IRES1*N+IRES2) THEN IREST=MAX(IREST,1) END IF NIT = NIT + 1 RETURN END * SUBROUTINE PYPTSH ALL SYSTEMS 98/12/01 * PURPOSE : * POWELL-TOINT GRAPH COLORING ALGORITHM FOR GROUPING COLUMNS OF THE * HESSIAN MATRIX BEFORE NUMERICAL DIFFERENTIATION. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II MMAX MAXIMUM NUMBER OF NONZERO ELEMENTS. * II IH(NF+1) POINTER VECTOR OF SPARSE HESSIAN MATRIX. * II JH(MMAX) INDEX VECTOR OF THE HESSIAN MATRIX. * IO COL(NF) VECTOR DISCERNING GROUPS OF THE HESSIAN COLUMN OF THE * SAME COLOUR. * RA DEG(NF) DEGREES OF THE ADJACENCY GRAPH. * RA ORD(NF) AUXILIARY ARRAY. * RA RADIX(NF+1) AUXILIARY ARRAY. * IA WN11(NF) AUXILIARY VECTOR USED FOR INDICES OF THE COLUMNS * THAT HAVE NOT BEEN COLOURED YET. * IA WN12(NF) AUXILIARY VECTOR. * RA XS(NF) AUXILIARY VECTOR. * IO ITERM TERMINATION INDICATOR. * * SUBPROGRAMS USED : * S PYCSER GROUPING COLUMNS OF THE SPARSE SYMMETRIC MATRIX. * S MXSTG1 WIDTHEN THE STRUCTURE. * S MXSTL1 SHRINK THE STRUCTURE. * S MXVSR2 SORT. * SUBROUTINE PYPTSH(NF,MMAX,IH,JH,COL,DEG,ORD,RADIX,WN11,WN12,XS, & ITERM) INTEGER NF,MMAX,IH(*),JH(*),COL(*) INTEGER WN11(*),WN12(*),ITERM DOUBLE PRECISION RADIX(*),ORD(*) DOUBLE PRECISION XS(*),DEG(*) INTEGER NCOL,CNM,I,ML,MM,J,K1,L * * SAVE SYMBOLIC STRUCTURE OF FACTOR * MM=IH(NF+1)-1 IF (2*MM-NF+2.GE.MMAX) THEN ITERM=-45 RETURN END IF * * WIDTHEN THE STRUCTURE * CALL MXSTG1(NF,ML,IH,JH,WN12,WN11) DO 100 I=1,NF COL(I)=NF WN12(I)=0 WN11(I)=I 100 CONTINUE * * NUMBER OF THE FREE COLUMNS * CNM=NF * * NUMBER OF USED COLOURS * NCOL=1 * * DEGREE RECOUNT * K1=1 DO 110 I=1,NF L=IH(I+1) DEG(I)=L-K1 K1=L 110 CONTINUE * * COLUMN RESORT * 200 CALL MXVSR2(NF,DEG,ORD,RADIX,WN11,CNM) * * ORD REWRITE INTO THE ARRAY INVP * DO 250 I=1,CNM WN11(I)=ORD(I) 250 CONTINUE * * COLUMNS OF THE NEW COLOUR NCOL * CALL PYCSER(JH,IH,WN12,XS,DEG,WN11,COL,NCOL,CNM) * * STOP TEST * IF (CNM.GE.1) THEN NCOL=NCOL+1 GO TO 200 END IF * * SHRINK THE STRUCTURE * CALL MXSTL1(NF,ML,IH,JH,WN12) * * INTO COL GIVE INDICES OF THE INDIVIDUAL GROUPS ONE AFTER ANOTHER, * END OF THE GROUP IS MARKED BY THE NEGATIVE INDEX VALUE. * * * READ COL * DO 300 I=1,NF WN11(I)=0 300 CONTINUE DO 400 I=1,NF J=COL(I) WN11(J)=WN11(J)+1 400 CONTINUE WN12(1)=1 L=1 DO 500 I=2,NF L=L+WN11(I-1) WN12(I)=L IF (WN11(I).EQ.0) GO TO 550 500 CONTINUE 550 CONTINUE * * CHANGE COL * DO 600 I=1,NF J=COL(I) WN11(I)=J 600 CONTINUE DO 700 I=1,NF J=WN11(I) COL(WN12(J))=I WN12(J)=WN12(J)+1 700 CONTINUE DO 800 I=1,NCOL L=WN12(I)-1 IF (L.GT.NF) GO TO 900 COL(L)=-COL(L) 800 CONTINUE 900 CONTINUE RETURN END * SUBROUTINE PYRMC0 ALL SYSTEMS 98/12/01 * PURPOSE : * OLD SIMPLE BOUND IS REMOVED FROM THE ACTIVE SET. TRANSFORMED * GRADIENT OF THE OBJECTIVE FUNCTION IS UPDATED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N REDUCED NUMBER OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI EPS8 TOLERANCE FOR CONSTRAINT TO BE REMOVED. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RI GMAX NORM OF THE TRANSFORMED GRADIENT. * RO RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * II IOLD NUMBER OF REMOVED CONSTRAINTS. * IU IREST RESTART INDICATOR. * SUBROUTINE PYRMC0(NF,N,IX,G,EPS8,UMAX,GMAX,RMAX,IOLD,IREST) INTEGER NF,N,IX(*),IOLD,IREST DOUBLE PRECISION G(*),EPS8,UMAX,GMAX,RMAX INTEGER I,IXI IF (N.EQ.0.OR.RMAX.GT.0.0D 0) THEN IF (UMAX.GT.EPS8*GMAX) THEN IOLD=0 DO 1 I=1,NF IXI=IX(I) IF (IXI.GE.0) THEN ELSE IF (IXI.LE.-5) THEN ELSE IF ((IXI.EQ.-1.OR.IXI.EQ.-3).AND.-G(I).LE.0.0D 0) THEN ELSE IF ((IXI.EQ.-2.OR.IXI.EQ.-4).AND. G(I).LE.0.0D 0) THEN ELSE IOLD=IOLD+1 IX(I)=MIN(ABS(IX(I)),3) IF (RMAX.EQ.0) GO TO 2 END IF 1 CONTINUE 2 IF (IOLD.GT.1) IREST=MAX(IREST,1) END IF END IF RETURN END * SUBROUTINE PYTCAB ALL SYSTEMS 06/12/01 * PURPOSE : * VECTORS OF VARIABLES DIFFERENCE AND GRADIENTS DIFFERENCE ARE COMPUTED * AND SCALED. TEST VALUE DMAX IS DETERMINED. * * PARAMETERS : * II NC NUMBER OF APPROXIMATED FUNCTIONS. * II MC NUMBER OF NONZERO ELEMENTS IN THE FIELD CG. * RI CG(MC) JACOBIAN MATRIX OF THE APPROXIMATED FUNCTIONS. * RO CGO(MC) SAVED JACOBIAN MATRIX OF THE APPROXIMATED FUNCTIONS. * RI ICG(NC+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD CG. * RI CZ(NC) VECTOR CONTAINING LAGRANGE MULTIPLIERS FOR CONSTRAINTS. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * II JOB SUBJECTS OF UPDATES. JOB=0-CONSTRAINT FUNCTIONS. * JOB=1-CONSTRAINT FUNCTIONS MULTIPLIED BY SIGNS OF THE * LAGRANGIAN MULTIPLIERS. JOB-2-TERMS OF THE LAGRANGIAN * FUNCTION. * * SUBPROGRAMS USED : * S MXVDIF DIFFERENCE OF TWO VECTORS. * S MXVSAV DIFFERENCE OF TWO VECTORS WITH COPYING AND SAVING THE * SUBSTRACTED ONE. * SUBROUTINE PYTCAB(NC,MC,CG,CGO,ICG,CZ,ITERS,JOB) INTEGER NC,MC,ICG(*),ITERS,JOB DOUBLE PRECISION CG(*),CGO(*),CZ(*) INTEGER J,K,KC,L,M DOUBLE PRECISION TEMP IF (ITERS.GT.0) THEN CALL MXVDIF(MC,CG,CGO,CGO) ELSE CALL MXVSAV(MC,CG,CGO) END IF DO 4 KC=1,NC M=ICG(KC) L=ICG(KC+1)-M IF (JOB.GT.0) THEN TEMP=CZ(KC) IF (JOB.EQ.1) TEMP=SIGN(1.0D 0,TEMP) K=M DO 2 J=1,L CGO(K)=CGO(K)*TEMP K=K+1 2 CONTINUE END IF 4 CONTINUE RETURN END * SUBROUTINE PYTCUB ALL SYSTEMS 06/12/01 * PURPOSE : * VECTORS OF VARIABLES DIFFERENCE AND GRADIENTS DIFFERENCE ARE COMPUTED * AND SCALED. TEST VALUE DMAX IS DETERMINED. * * PARAMETERS : * II NC NUMBER OF APPROXIMATED FUNCTIONS. * II MC NUMBER OF NONZERO ELEMENTS IN THE FIELD CG. * RI CG(MC) JACOBIAN MATRIX OF THE APPROXIMATED FUNCTIONS. * RO CGO(MC) SAVED JACOBIAN MATRIX OF THE APPROXIMATED FUNCTIONS. * RI ICG(NC+1) POSITION OF THE FIRST ROWS ELEMENTS IN THE FIELD CG. * II IC(NC) VECTOR CONTAINING TYPES OF CONSTRAINTS. * RI CZL(NC) VECTOR CONTAINING LOWER MULTIPLIERS FOR CONSTRAINTS. * RI CZU(NC) VECTOR CONTAINING UPPER MULTIPLIERS FOR CONSTRAINTS. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * II JOB SUBJECTS OF UPDATES. JOB=0-CONSTRAINT FUNCTIONS. * JOB=1-CONSTRAINT FUNCTIONS MULTIPLIED BY SIGNS OF THE * LAGRANGIAN MULTIPLIERS. JOB-2-TERMS OF THE LAGRANGIAN * FUNCTION. * * SUBPROGRAMS USED : * S MXVDIF DIFFERENCE OF TWO VECTORS. * S MXVSAV DIFFERENCE OF TWO VECTORS WITH COPYING AND SAVING THE * SUBSTRACTED ONE. * SUBROUTINE PYTCUB(NC,MC,CG,CGO,ICG,IC,CZL,CZU,ITERS,JOB) INTEGER NC,MC,ICG(NC+1),IC(NC),ITERS,JOB DOUBLE PRECISION CG(*),CGO(*),CZL(*),CZU(*) INTEGER J,K,KC,KK,L,M DOUBLE PRECISION TEMP IF (ITERS.GT.0) THEN CALL MXVDIF(MC,CG,CGO,CGO) ELSE CALL MXVSAV(MC,CG,CGO) END IF DO 4 KC=1,NC M=ICG(KC) L=ICG(KC+1)-M IF (JOB.GT.0) THEN KK=ABS(IC(KC)) IF (KK.EQ.3.OR.KK.EQ.4) THEN TEMP= CZU(KC)-CZL(KC) ELSE IF (KK.EQ.1) THEN TEMP=-CZL(KC) ELSE IF (KK.EQ.2) THEN TEMP= CZU(KC) ELSE IF (KK.EQ.5) THEN TEMP= CZL(KC) END IF IF (JOB.EQ.1) TEMP=SIGN(1.0D 0,TEMP) K=M DO 2 J=1,L CGO(K)=CGO(K)*TEMP K=K+1 2 CONTINUE END IF 4 CONTINUE RETURN END * SUBROUTINE PYTRCD ALL SYSTEMS 98/12/01 * PURPOSE : * VECTORS OF VARIABLES DIFFERENCE AND GRADIENTS DIFFERENCE ARE COMPUTED * AND SCALED AND REDUCED. TEST VALUE DMAX IS DETERMINED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RU XO(NF) VECTORS OF VARIABLES DIFFERENCE. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RU GO(NF) GRADIENTS DIFFERENCE. * RO R VALUE OF THE STEPSIZE PARAMETER. * RO F NEW VALUE OF THE OBJECTIVE FUNCTION. * RI FO OLD VALUE OF THE OBJECTIVE FUNCTION. * RO P NEW VALUE OF THE DIRECTIONAL DERIVATIVE. * RI PO OLD VALUE OF THE DIRECTIONAL DERIVATIVE. * RO DMAX MAXIMUM RELATIVE DIFFERENCE OF VARIABLES. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * IO KD DEGREE OF REQUIRED DERIVATIVES. * IO LD DEGREE OF COMPUTED DERIVATIVES. * II ITERS TERMINATION INDICATOR FOR STEPLENGTH DETERMINATION. * ITERS=0 FOR ZERO STEP. * * SUBPROGRAMS USED : * S MXVDIF DIFFERENCE OF TWO VECTORS. * S MXVSAV DIFFERENCE OF TWO VECTORS WITH COPYING AND SAVING THE * SUBSTRACTED ONE. * SUBROUTINE PYTRCD(NF,X,IX,XO,G,GO,R,F,FO,P,PO,DMAX,KBF,KD,LD, & ITERS) INTEGER NF,IX(*),KBF,KD,LD,ITERS DOUBLE PRECISION X(*),XO(*),G(*),GO(*),R,F,FO,P,PO,DMAX INTEGER I IF (ITERS.GT.0) THEN CALL MXVDIF(NF,X,XO,XO) CALL MXVDIF(NF,G,GO,GO) PO=R*PO P=R*P ELSE F = FO P = PO CALL MXVSAV(NF,X,XO) CALL MXVSAV(NF,G,GO) LD=KD END IF DMAX = 0.0D 0 DO 1 I=1,NF IF (KBF.GT.0) THEN IF (IX(I).LT.0) THEN XO(I)=0.0D 0 GO(I)=0.0D 0 GO TO 1 END IF END IF DMAX=MAX(DMAX,ABS(XO(I))/MAX(ABS(X(I)),1.0D 0)) 1 CONTINUE RETURN END * SUBROUTINE PYTRCG ALL SYSTEMS 99/12/01 * PURPOSE : * GRADIENT OF THE OBJECTIVE FUNCTION IS SCALED AND REDUCED. TEST VALUES * GMAX AND UMAX ARE COMPUTED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II N ACTUAL NUMBER OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RI UMAX MAXIMUM ABSOLUTE VALUE OF THE NEGATIVE LAGRANGE MULTIPLIER. * RI GMAX NORM OF THE TRANSFORMED GRADIENT. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * II IOLD INDEX OF THE REMOVED CONSTRAINT. * * SUBPROGRAMS USED : * RF MXVMAX L-INFINITY NORM OF A VECTOR. * SUBROUTINE PYTRCG(NF,N,IX,G,UMAX,GMAX,KBF,IOLD) INTEGER NF,N,IX(*),KBF,IOLD DOUBLE PRECISION G(*),UMAX,GMAX DOUBLE PRECISION TEMP,MXVMAX INTEGER I IF (KBF.GT.0) THEN GMAX = 0.0D 0 UMAX = 0.0D 0 IOLD=0 DO 1 I=1,NF TEMP=G(I) IF ( IX(I) .GE. 0) THEN GMAX=MAX(GMAX,ABS(TEMP)) ELSE IF (IX(I).LE.-5) THEN ELSE IF (( IX(I) .EQ. -1 .OR. IX(I) .EQ. -3) & .AND. UMAX+TEMP .GE. 0.0D 0) THEN ELSE IF (( IX(I) .EQ. -2 .OR. IX(I) .EQ. -4) & .AND. UMAX-TEMP .GE. 0.0D 0) THEN ELSE IOLD=I UMAX=ABS(TEMP) END IF 1 CONTINUE ELSE UMAX=0.0D 0 GMAX=MXVMAX(NF,G) END IF N=NF RETURN END * SUBROUTINE PYTRCS ALL SYSTEMS 98/12/01 * PURPOSE : * SCALED AND REDUCED DIRECTION VECTOR IS BACK TRANSFORMED. VECTORS * X,G AND VALUES F,P ARE SAVED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * RI X(NF) VECTOR OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RO XO(NF) SAVED VECTOR OF VARIABLES. * RI XL(NF) VECTOR CONTAINING LOWER BOUNDS FOR VARIABLES. * RI XU(NF) VECTOR CONTAINING UPPER BOUNDS FOR VARIABLES. * RI G(NF) GRADIENT OF THE OBJECTIVE FUNCTION. * RO GO(NF) SAVED GRADIENT OF THE OBJECTIVE FUNCTION. * RO S(NF) DIRECTION VECTOR. * RO RO SAVED VALUE OF THE STEPSIZE PARAMETER. * RO FP PREVIOUS VALUE OF THE OBJECTIVE FUNCTION. * RU FO SAVED VALUE OF THE OBJECTIVE FUNCTION. * RI F VALUE OF THE OBJECTIVE FUNCTION. * RO PO SAVED VALUE OF THE DIRECTIONAL DERIVATIVE. * RI P VALUE OF THE DIRECTIONAL DERIVATIVE. * RO RMAX MAXIMUM VALUE OF THE STEPSIZE PARAMETER. * RI ETA9 MAXIMUM FOR REAL NUMBERS. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * * SUBPROGRAMS USED : * S MXVCOP COPYING OF A VECTOR. * SUBROUTINE PYTRCS(NF,X,IX,XO,XL,XU,G,GO,S,RO,FP,FO,F,PO,P,RMAX, & ETA9,KBF) INTEGER NF,IX(*),KBF DOUBLE PRECISION X(*),XO(*),XL(*),XU(*),G(*),GO(*),S(*),RO,FP,FO, & F,PO,P,RMAX,ETA9 INTEGER I FP = FO RO = 0.0D 0 FO = F PO = P CALL MXVCOP(NF,X,XO) CALL MXVCOP(NF,G,GO) IF (KBF.GT.0) THEN DO 1 I=1,NF IF (IX(I).LT.0) THEN S(I)=0.0D 0 ELSE IF (IX(I).EQ.1.OR.IX(I).GE.3) THEN IF (S(I).LT.-1.0D 0/ETA9) RMAX=MIN(RMAX,(XL(I)-X(I))/S(I)) END IF IF (IX(I).EQ.2.OR.IX(I).GE.3) THEN IF (S(I).GT. 1.0D 0/ETA9) RMAX=MIN(RMAX,(XU(I)-X(I))/S(I)) END IF END IF 1 CONTINUE END IF RETURN END * SUBROUTINE PYTSCH ALL SYSTEMS 99/12/01 * PURPOSE : * HESSIAN MATRIX OF THE OBJECTIVE FUNCTION OR ITS APPROXIMATION * IS SCALED. * * PARAMETERS : * II NF DECLARED NUMBER OF VARIABLES. * II IX(NF) VECTOR CONTAINING TYPES OF BOUNDS. * RU H(M) HESSIAN MATRIX OR ITS APPROXIMATION. * II IH(N+1) POINTERS OF THE DIAGONAL ELEMENTS OF H. * II JH(M) INDICES OF THE NONZERO ELEMENTS OF H. * II KBF SPECIFICATION OF SIMPLE BOUNDS. KBF=0-NO SIMPLE BOUNDS. * KBF=1-ONE SIDED SIMPLE BOUNDS. KBF=2=TWO SIDED SIMPLE BOUNDS. * SUBROUTINE PYTSCH(NF,IX,H,IH,JH,KBF) INTEGER NF,IX(*),IH(*),JH(*),KBF DOUBLE PRECISION H(*) INTEGER I,J,K,JSTRT,JSTOP IF (KBF.GT.0) THEN JSTOP=0 DO 3 I=1,NF JSTRT=JSTOP+1 JSTOP=IH(I+1)-1 IF (IX(I).GE.0) THEN DO 1 J=JSTRT,JSTOP K=JH(J) IF (K.LT.0) THEN H(J)=0.0D 0 END IF 1 CONTINUE ELSE H(JSTRT)=1.0D 0 DO 2 J=JSTRT+1,JSTOP H(J)=0.0D 0 2 CONTINUE END IF 3 CONTINUE END IF RETURN END stevengj-nlopt-88c424d/src/algs/luksan/v999-07.pdf000066400000000000000000014553071521061417600215260ustar00rootroot00000000000000%PDF-1.4 %Çì�¢ 5 0 obj <> stream xœ•}I“&Éq�Îu’™ôêXM¡k2"cÅIE3HÊhŒ:Ðt‹ØlØØˆi©ñëéËs�L�¯† Á Óõef¬¾Çóß?¯éùàÿá¿oŸž¾úiþå¿>¯9ÍÙÿiÌYäﯭÏ6Æó·Oé8Ž×ÞŸ{®óµ´çOOsÒ?5´ãuäç9ÇëQ…Îô†ç/O—–öšÛåýx=˳¿ Ÿ¯G{~»|£Ï×Ñž‰>_Ë$z´×&4½ˆŸ˜'÷Ažè¯•ž8�ôÚ2ÿb¼Î“éùÚщÚ+Ñ©½Ö!O$ú½ãÌçë)¿(¯'¿áä�3]_;¿á¬üFy¢¿Ô‹³$î'Ñãµð;K}M…iê-¿±Ì׌'ð‹zðW/tz�åJS²¶×ƒ‡•ÓkêNóÖBs9ù4œÁ�¤ÉìLÒŒñ õ@ß_'ÿ~íRž¯'s ý" ¿ñó3¿ö"OxËЉ]ŽÌ«It¦ådºñjÊhIÇkÉ—_ÐW&OYïBó‰yò–¡�:‹¬¡áË<�í5Q' Vçéì²!ʙѧñ:ø ´4<êrÈþ(4Ïø‚·œúFú!ï—R±£J–ýRê°‰µ–Vx[/ºc‡•òš¹ ½Û®õ–¡Ã¦}Á{®tìÁÒeÇ•‘x¿ÈCö\´üƒ)[®ÌÎÛ:Ñ!‘ Wß‚øE¥¹–ÕvzðÜyZÏ$lÊšeGÕŒ-HÀ;ªfßAÖÂÿòZ™ÚZeƒUZƒ©¿§#Äß,ØqµËŽ«Ewñ…Ì,�gA°–‰.�¦®Êévú´Õò–ª«E¬…wq¥Oñ<µ${¸VÙ³ü€ý€þ"‡Ùé"cr²¿°‰k²Í}Tú¥4lrý¢œ='Ö#ï¡ÓÅù‹r %8fÁ™`¥]"ûgNÚŠsµÌYé‹Ù&v¯›ÒeÚˆrÎ&áRWˤ}%?�•š½È~Å:ÒÏiRõÚ²è…òø)¢�à³,C¦U˜Ï�'F†¨œ¬±„SV7u«¶q¢CÚÒXJ¦õÊFŒ_ç¼@|¶6^/ �ürù»ô9�׿Wæ[�¼þ½óN^$OÉ¥;"»©;Þ¢Sé/×_ȵnÛ‚N×y±-jëÅ–yòyo]ÏvAcµA`Dæ0Ëâß7:„ôÞn²š™÷qcöË'Íyy›먼»ñŽ•}Ço"²ëA(¼8º¬¶Ù£�ÂÙûÑ1‚y`[vt¤¡§¬GÙé†ûIY"^˜Î>Ç'U6‰wˆ¹¹l,=Z¤2¨ÀÉ,CfPiÞø'>Ðõœ<�щIJr‡uÖ¦hP�¦J$q#]¥é´'ãW<øçQ°J•5°ç1ºîóÊ=î0 „Ÿ î‡0T’õ´ïé·ÆÎ†­Á«"/˜,.'-�0ªI_mJ]-Âaï$)®tzå‹*Ê&‹Ð3-N<_tUåjRGõ‹*fÁ APM’2 •RôM² L“ö£ì¢ÚDך¤µé X»»±ü.Ê×`˜•Î�Ùesù„Ë™.ê™ëÖ‹.¢:�¾¨”•™ëEK­Côµ%+‡ëoÐlêL"Me S#”˜µÈNbvÐ)[QñÊž€•ÙQ÷”䟣¡Ñ9Ý«+×m öí5þ~Ë®½Y ³UþAE«�Pæhh¼wÚÙu¯­\»ü¢dÕrœ.6Mö m¡NMQ÷=D¼<µ¦Õ¤‹‰lµAÏ¢Yµ–ƒv�·vú0MjÇú…š1­ÝÍЗ Â|œí7h�yãó$ÉÛ•lØP¼—e1˜5Òž>tG2�åCBó%¼œåV—NH`æº|lNp–u•Èß’µeDý5ÆžfŽÉ;œÎ¦Òžqè óDÚ ~èzurÒÞä€ä=Ædú‰Þç‘Ï óD>Sm*sïõP Ö�e¯²ã'Í…Œ‘6œœk;¦¬l$9¦Þ 2ÛæÔÉSÖ$ÿ =ë±Ç)§.òöœ4qÂ);ŸjùýÀz×cŸtÊ jpV�îuŸIÏ0,è>'¶…ÚÇ〦åöñ8äˆøÆlY¯}¥äÅte./Û›™u:±~`‰Ž å:óÈífŠŽ¬Ö¬Æqúi€™8Nìe˜‰ã,ªÄÃL-O¨]8Î#N;Á§zYh£`s;'eè(`¡±°êËÞ5¹Ñ‡–ûÊqê°Á G�Á¸­Ý¸ã Å—>‚޹F-CÇÙ'ØŸ²Ã1`�ñ“üÆ‘�Óx‹ÚdNVU�ƒ²Uª rL¸XS'æQÀ‚Ç”qLÚ ÒK~p2 ¯À,²¼,D•£¦C5íI€Ý%4p±ÙgV£>¥,üqž¼+±¼å'N)éÉå#Ï;0åCvؤ5ÑÕò–*ûžè¤½®âHùÔ>W;)WíuÓc�òÐ^7=‰ûÂï&Ò™duø ò+�œ²‹�|¾0^çeÀø„Ñ_¼ƒÏ 33?"2©ã ½&:ëÉÂ(9^~ÌËà'£NÌñˆÎ¶)1‘ƒ�A¼ ©›¼ÏŸÁê3?ø<€–Swñ¢Óu­ŸÀS@JA§1ˆZu±m^šÙØÚÁ›¹É/X÷!º«žHí+Üçn6újÑ-—N–EWšÍC§ù ¨ƒß9Ô5•xçð´›yñèpË4ÐÞíÚ)oQU'Ñ镉›â©J¼¯øyb¨˜(oQ]hÑâ¹âÕ­Â˱3geæÍtÓqÖ)«OçÁzÝ„{S sw"³lžbYîvʆâm §;µ*“ËÛ�‡ÕšÌ,o™û6dfAËÖ"&Þ…†IGßù0xÝd\]´ÂÁs.£èbä žae­i²%Riº†È‹Á3"s?D@mêÏjÑ£4ºN”‘"?@ÊϧN\UwZš¢ ž@ÙÔSÌàéSwÚjɲzNâ¬: “‡ZN]‹¦(ͪ+ѺnûÙt)”–'ÐÒÕE—�¡ó4Ì·ZDbä$:Þ"E�¤æ”ub§ÕœŠN딣šS×Y�&>¬%zTs u¡E-OX Þ”³x‰Tù“³x‰îªR‹¸…·lÎ"Ã�%1)@�ò{kP –³x�…·FÎ"ñˆ†ewia�6ªøç)þ=�üóSÌ…Á]eŽ—O‘ƒ?Ì[#ˆƒß#^î\ØSÅ *ÞrH´(�DYÐò„ØÇƒ_Í“TDyü" ¹&�õbÜ)׬ó^”åzê,;]uš‹q§\»Nk=d”¬1ðUL7¢O�“j†ØjöµÈ )ž[ÑykêhÏ­ cÈ-éfꇜsÐüÊžtæš2¼ÌÜ—GÑ„áå^t"…äß³ŠÁ ]Dòz\Ù_*Xø5*þV‹Ú~y¨(ÊÄÖe"‡ «ÜÍÌCE Zˆž:qFϤӦoà'¦ D|u=ÑT³X´¨Þ+›(Ò¤dµmî{Õý²‹ÅÔ\ûÁ澨Øé<Á|xŽeÓkËZÞ�î¶¶²(i¾a’è}kCé©’=ª»Ì ñî90T1°s›ºiÌvÖ�¡+0–hÌá´Ipugó÷¢É˜vmÓH´…q1óK§ ¾énÒ…2õ]PËš]kªÀ‰Bg*¿i€W›AuÄÎ~ÙNçT³Ä¬ Õ*É™®‡6¶¶˜^z¡E“…ÙrµNìi³22”F³B²ë¡ª>[˲\²ò+7lÔ–\½­3µ«@ô #áÔ‰HvTNî[:¦ÎÌ¡§â☇Ÿ ¶ôª·¸ýf&b:ŠZ¡!2>Âb¦N�‰™8&Ž‘Ó&tÓq¨‰oVè¦ÛÙ×[/ä0&{ÌC� ¡D’&ât0Û>8Ž4iØ®‹ 7ó{™ÎáQ6ÂëÍ ·XüNÂ!à´» Ì~/ˆÉ":9Šre >Ö9ôˆ˜ŽrÜB¬îÇ@V!o+¨;rGôN󜘗"W÷ȳ‘å¨ZðÚ�1ð<ŽäÁkDÔÝ}c¾”„p·ùZ÷˜š7ÆDæ¯Q’‡PÇQ ¿ÜÁsœß6Ðqè¸AsÜÏüŸê4B Ѹéa{d;töxéêuêq~8PÝï‡i�Gæ¶ÒwŸ*ÉŽ¸½úPÓÉepµy¢ GC°ºæZg�ç®À—·/×·z†×nJ éºç9Ö/NZüÐôtܲ+àz–³®g[}ÓÎ]ú�\ xÍ:s:Ý p“q|�ãÌÙû>»Ê7°DŽ/¶«'†ZÄX3˜?QbÎòKä¼Óš¤ätf†{ ÜI�-u­'ÚŠB˜¬if1d mu'UBº ' â_±‰žvê97ÑÓø°ªüƒô±€ŽÉž– Ö�.H*ñ>%9·&r[†ÿr¿åÓ,w–÷ü@†*qè2µX!$hu«×Ð~Ú©Ü ¢ÍeˆE•Ìáq¡•׬¨|>Qê�ð Tšº…[IØ€ùP&Û*øCÙtkâK„{aEk.-*¿ào¸Ðš´´ö[éÇÂŽ‚qnñ3Æ�^æ¹v¢Õ_ vbæyçd ³dÐRÔ²Uã»sÐùX¶³ÑËV¢…jMYÅì±ÅU/-š"[Ùùpnz-¦bŸÅTÌÖ%RTG³��ó‹1­Â,‰-Ö!²¡ÂüÖ]ÝG7#QíNk1óúBŸ�.þ„ÚËëjÛ®^©u|†7`œNê—0±*³¿×ä[ªYÓèc5Ÿ€ ‹g³PÔ­¡Ë26¦ WŠs(Û ­V÷Å rZ§úb4zadE,·B;b‡‰+„<í{­ì•®¼AΈ @ÕÎÖàÄÃÊ.ÜHé屩Ïg®¤åÕ0*O€?IÕgÝIµ””U»3åóÐ@„ÓóPDƒ®ô'¶–i ‰³Xås"'­®+ÿ¼¨1±ržœ~ÄSv6ð¡iY�«EÏ¢Õ'x6Ī•–' oUø¥³«ÆhÂñʉ8JçˆsNeo«|%òò¸à<.±Ëù›ÄeRU½9ÍŠ·§ ÕE¾<V¤:AII÷*”ÎHU%Â2 K+RE…h ”oãÕ<¯Û›“Tå¼€Ûq’ê!š�Z%ë~ÕóÁxƒ:4JÖÔ‚Eƒû)-Ohð  7ð¶*q ¢u‡#ÍOœ`fà—œ[.\€“½ÒŠ0óÇXY¢ÁÌÀh8ŸKY—±¿Õ¢¬©Tcfª*—ªZØ!?Qoì-q~×áÚxâü.åuPÎKkšY—«i¼ÏÔÎTí~Â5ÈÙºb â�*MÏl¢õ˜-+†ÓyÅ&IšçÁ™‡bÕ$�:p˜ØEbHÉÖ ¸ õ',:«iåqnÎɪ—8wš™‰87§pñ4­87çxIú¡^¦ú8Ì\äôI1zÝ ä|L1µªä`¤šÔ(± 4Y j`6;¬õDt^[']iPÚh˜fÍ‚«E8ˆ“0¬9éê\qoyØÁþ‰S¹l=UÙ�Q+O ›˜ÊšÕX3«•U/)üDV•ßVoѪ@9íë]³%:¨NfSe[Êiß´5•ÛA¨)ãè¨bÁÙle™o²CÙP“t([;­œÎ-§ÕòKV η?!öóÓú†ýÀú ¯X}¬É{�qTuôs’�5‘â>1.Ôm5�â’8Iî¸hœã&œÒYŒ·@ÑàÌèc弤Ú4ÏÁ³\g±µ ⤵ó:“ìÛ™Rà¶`Juæ›6Ô’Jò•è²Z” ú ÿ´2a:lÈ+ÁcÚYï.ÖÍÕ¡;„3Âdqà“h¥!µÆ,‡Õ¢^Ì@s*XeeÍìú’/(ýö”ÙG(Î|VSŸ‰D�#‹ÉìRßF|“ZÉ’†BôD„tBäEi~"é\¿@¬Æie8—ox zá´tûBC¬­oȸ3'4ID'juÒRÆÖ0t®×@u-Ö¼XVšO�.'_\Ô¨‡-7èË™Pưƒ&/b¶6Ø’²xÖ¢{ÖHD m±>ŽvÉAêw´ýáÇÛg$Ûb–ßg›tt1˜gEà¥Û�¶ïÁ8ñ\O»š^¼ˆÂ‡]ßãÀR¹0%ÞœÂU››"Í’FüpWˆÛKÜ5aj®î�†üP�¤$ÖEÓ%,2Ή 3çdÊYVÆÍj¡p¨¢nÈEõ8uw˜ÌáÕƒ�ã]OdS¤Õlg©£ª¶ª ,§ê ¼ðÇÔ™=%Ÿ/±á �4i3[ˆ´Ð^ƒ6 7ì£Ë–¦Ä”HmIìpÒ¼W£ÕSµWd˜z4\î6µ¾Ilå©bŒÈk¯Hï”’™í¦=°)z7ƒú‰ `¿0± 5yÑæìì1(˜V=#Ĥ–WOOZ¦»Ú%娔 U´HÛ¨°õ,¶Ë¾ Q(»1ýÄih4|)LϪiIhIìU ö¦©UPù‰¦»ÒÊV’ÔºÖ�¸íF/ûÀÛÅ`G¬t^ÃVX r…Z.{½óÅ4o‡™ê¸ÜêJ/̇†êö¤WëRð¢Â 2M\=p®ÊÃ!QæÉ�nNh°¥H7¯ ÌåáåKA2êC޽æ#6«Ùo$¾Z%,Üm(m• »ºé]¸º/¦»ù×͸7}ip¡¥àh‡ÚÌaQ§f9mWa¨E�"n…š�÷N‰V®ê÷ƒ.-ª9­WŽ.´iQæ™Á�J¢Uaa³“˜’Õ�]“ñMóöè¥(wáί;‹x�ð ø—pëòB«·ÀI_ 8¨Ðé/OîäÂm2w‹ÙMæ’Ô[º/iìPá¹OêÃÅýº mìÂq¸¢GtÇ=L9ýNÚ­Awõ±oKœƒS9Ï—8$§j›%Ak¢�’—CÜÝ‹çTMî*Òø¿§úÕ#yv•ÌgWžÅ¾Nõ`j„û,–'}V»â¯ûžÿ"o8ᦅßõ#…K[çÞi ”;¿À „_¨ŽÃZ�øaÕpYduv�Ûxˆ €Ÿ ‡‹ð fÈ4j¤Õv“…jm·aή�(ûŽ·µ‘Ó¶cÖ’*#v [eĘ + [Or;Ô=ÆG^‚B¶<¢>uš Ž“ !@H·Y´ªuø¹Cd -D«Ú^‡8Ϭ Síì)«ò  ëq\7=3@ \*ŸY�:\aMgR¥]Iª®ÄòIµxV„„¯' è%Z¢U%S1Ïj£»Ábkzm×Cozë÷mDMÊ[€“õ( €#P¬ûm8!Âs�|•»â–knWÉßVô»ô‚tö¾34ý]Ý¢`Což.o×Ý-!ß„'2ø/Ây¾vEßò|펿]"^ÊÛ ú@Ų6ÒCßH+0éŒmà>ýçóÓaëv\~ÁzV»ÐÞ{%¹ð~ìFâý÷Ù°h)óP&Í\Ÿ2,š;šäoŸb>=½ÛÉ8ˆra�"LÒ¤ –Ó¨¦æ°ž6,¨€�¤6¤©€D�ªv(«vÁ°6¸¬€§µÁmmx\¯+ÂyE¼¯¶†í�bèX%ÛPËî fòlE‹¨iT-®E`¶¸m‡vÛÀßîØpv\—‹às;<Ý{øuo÷.ºô¾b/€ðE�¾ Œ_Àù‹0€N`|Œ3x"ŒP…Êðvx‡xLü¼~áŠID\Ü!#hcuÜa#0ä;À‘hÉ>Á)7øÊ€o¹Á_nø˜@3lóÏ Èg„} z�P£é†U°L#Ôé†áR78ÕwñV# «¶¾ éê ¯v‡��À²xvƒ¦�൸íroºÂîÁûD¯)Då7j3ŸŸŸ -2VmjŦw�¢Õ¨OO»¢±ªZÐ墪·+ƒwm1*“Ôͨ�ÞõÕ]¡ÝTÞ¨o:sTªƒÒ½«å›âû]õ�ÆA0vóâûÃÍ“Í~ öM0îÒ#êfc}yÚl°h¡mÜ;&ž›€›��Èhdîfh0T£!ûÀÔ�Æp0–wsz3¸£A¾™ìÁ¦ßLþÝ)ÝÑ­Ñ5=›g#x>¢cdw�DßJt½ìΙྉî� à"Š.¤N¦è†ŠnªèÇŠŽ®èÛ]eï:Ó¢³m¹ã‚¿.ºóv‡_p F—á§bt;¾ã–t¿etlFÇçî�ÎÓè\ÝݯÑA¸»‹7ú€£‹xs"G7spCo~êݑݛ+<øÊ7WúîlÞøà«ß|ùÑÙ‚{¸ ÆB¸aH„ˆE h<yÜc"!b²ETbÈ%†dbÌ&ÄtbÄg‹m!£RÚƒN÷¨T Z=kÅÀWˆ‹mq³W a·=0·…îBhoþmáÁ>ÜŒ÷d P>a† g ‚>“†@jˆ³nqا½Gq÷0ïŽaâ-�CÍ!½‡ªc0;ĺ÷`xŒ–Ç`ún�ù-`¿…ôcÐK ØÓî‰1ñàQjBÈ]™ [êCLŽØ’'öôŠ�€4öŽ˜ä±%�lY"1�$¦™l‰(!SeKdÙS]B.LL•Ù“iBºMLÇy�°Szî?{JЖ4ôNRÑÊ:ŠiI1mé–Øôö(õéšõùiOžŠÉU{úULЊ \{†WH‹)b’Èîif1 íQ¢ZÈd ‰n{*Ü–,réöd»˜ŽÓõn }oRþîI�ŸŸÞÏ·$¡kÚaLL y‹[bcL}ÜR#÷äÉwÒ+cúå%A3¤p† Ï) !I4ä�n9¦[jLRÝÓXC¢kL„ÝSec2mL¶ÝÒqcÂnÌçÝ~cJpÈÞSŠcÒñ='yËYÞ’šcÒóž½%N‡Äê=õ:æf‡Ôí=¹{Kÿéá{ù½åBó~ø¼~`�ÑfX½Â‚vgÙ€¦L¯°`xâÏ Æï|zz·'±§~¹úßÊ-ø¶}4Ò_þŒÐŸ[ñà§Ÿ¸%Áœ)·´ õE»7ØvÖé/×_¨‚´ÓöNG ±3ÂáK°8€ù¼üÅê7X& �TË Òx Â8€N4ne¦%ŒyÀZT'sN³=3ÛÒ\ f:ÂpÛpiŠfBÅb¤ï 3A‹±¨Òpq­CK-8¸ÆÂ¬� Z!dр߸<”RÈxBŠ0äæ x,?1Áu�‹s¦ŒÒ YdæÖ5:s¿•V0ûkÑ("þÄ9Á¹Õ21Û†´‡ô0UÓ!=úq‡ôè€îqHh³þ€YFqÛ©‡Ü8¯}\Ö–"¥œxCެrV8ÝÔòpû ²ÊTÑey¸Å‡•ðAotv“Ð"fϙѩ0I ‰äÌÐÀmZ±ŸLYmy®…17S¨¡Yšùc¶1° |%—Ujè(¨bƼYG7dx+æZ´ýÄÐÅVüÊÅ?Ô g®EÛ‘æ!0È—Ë鞪K˜Ó�ƒ©?¢sxÀ‹°®�iý¤-•ÊN#Z–§e£ín¡¡åÀÎsœ$s‘.ÚП›éuÀ“nw½Ï ›àËá'ïK@·ç5€Ÿ¥JdÃ(Þ³ª·ð˜/Ú#Ãæ‘ª‡âíBƨH¯Ì‡åã‚1j¨W¦c×SÖ›ƒ^»Wß}h‹v•al@�w?\WëÕd�·§åÙCdÙ°»LF¹#±(»;ÍsgÎH F\èæ2 îKĢݿ W DBÓ!f¢”qÆÅÙ aì´H†b¦‰/²nõÄ –ýbÄ»WVœîÃEÄ%¨f"U¨KvɤBY²;¹ÒžT©eè¸F:Œuh°Ï½ò²ü Ö!¼?TEû¾ºi:‚Ïÿ‘L+¼ã’iuÿlìÕŸYÇã†Ùî4´ÀËÖ‚ú¦&r-¡vQ¯XÍ"¢]lp/#âiÜ7Þ¾“CN«ö×#â~lÀ 9$‹Ü‘GÞ¾›¹{¾É†²#¤l*ceGa‰8-ŽË†ô±`"VÌ&Àf"Í´š€gñnn€8o�sn˜:_ž îPž µ'âúl¸?;2PÀŠØBЇÞÁ'rü¢á(` EŒ¤(Jg)â0íHMËé1ÔÓ *¢EE4© o*"RĪÓjC½  XP³¬VDÝÚq¹rWDöÚ¡¿"6XÀÛÑÅ6ü±O¶ã—„³ˆ€¶C¤µˆ°¶c°”¶ˆâöç-"ÁE¤¸K. ÍE4ºxuÑ."Þ=ÀÄ‹¨yUoƒÝ ¸|·ï²_Äþ‹Ø€;z`À ðƒð #‚a8Œˆ#qÇPÜP#cÄi|€ä±ßÂt´Èˆ'à&78ÊWÀ,w°Ë;fDË|§y‡Û `œÐ:#žgÀûÜA7ÌЀ)º�ŽFTÒˆZºÁšØÓŠº¡¦F\Õ»ºã²FàÖ;¬ëûºáÂÜØ Xö=äÙ ™Ö k#¶í†}»£ãü܈¯û�7bôF ßå7àGœàH8" G$â«8 G´ã9"&G@å q9b2o˜Í;ªsÀ}ޏÐ�£#¶tÄžÞЩ|u@·Þñ¯w„ì;€öް½apGŒî Å;â|Gð)Ú^Am«±k°mEÚB·PäíA¸X'.Ö‘Û+ÍÅZt±VÝVÌ.V»‹Õðb¹¼XOo«··Wä‹5ûî%ý¶’[MÀP3p¯*Ëƪ„{ÝÂPØ0Ö=Ü*#ÆÚ‰±¶âV|ñ^œ1”n|PÛ1VŒÅ!÷ê‘¡¾d¬?¹W¨Œ5,c�˽ æV'ó^Fs¯³¹U⌕:÷Zž±Úç½è^-4Ö�õFT$ 5KcMÓ½êi¬‹ºÕMÝ+«ÆÚ«±6ëV½u«ïÊ¿Æò°±|l¬.»ÕŸ�j· ¶··×µˆEpEV|¾,¯Í}(³û o¬Ô+ùnµ~c5àX,x¯&ë Çzı`q¬h¼U<ÞJ"ßK&‡‚Ê*.ǚ̱fóVÔ9}Ž5¡÷ªÑ¡®t(;ý .u¬\+[ﵯCqìX;{+®}/¾Jsßkw¿íÕ½CýïÏO*„Ç â{�ñ÷ª�‡"嫊y¨së ï…ÒC!õPf}¯Ã+µ‡Jî{­÷­|¨¯'ÿö}ç-Ô¹W­Eí÷ª÷*OÙ)Ð.7¥+²Ò`ísÜÊú²«Ž›SçÉÄ¥ºm«ÔpšxK¿^öìVÚë"Q¨Á×'yõT¡|¿òR~v°ß¡Jà`×Cwq uÕ*M+xsÀ°¥'¨^ú€®®‡Uú blðMUUu“jÍ, >/õHý,ƒï§åglªMà ÐØœÖ£êt¶(ýƒ-ØU#p©€j ¶�Íÿ„>¤#@"ÔH3£ÈÏÛ .Zª 0ØÌOîL25õÍqÒ–âjórHÊÏçKáÞiw5A=J¸âÝúje˜>nvHÃÁ0»¥zn‹Ù6U·yF-�z\G}µàs+ž;5\Ü%»æb¿Íßtä5›ø„ë˜àád?¥ .ӂ蘹uÙ+ ßÔ®á .S�¯ðùV§jV��¸öA�Ï\gCæL\Ó“�»õâ,Ÿìš]AV7!'wSiÌrdN9ûª0XÓP—«†]9[«‹óÝ¢56©Eu¬ÅHm׬‹-¶±ÐâþS yš¿´µÃü÷Þ‚_À�ºè|MÒ~[ØJv½Æ¸@«¶0® ÌŠæ5É™˜â¦NŸH.÷'¼Eó<­ ”Óu2ÙN`Ù74GÞɼ0".ÚŠ»ÈX6ÚÑŒ}Á€.œö\fF§ÌR¼Y4 ¯ä¤;ÑÚ1‡r/�ïJ)H�Ý ì]�­hX0sFƒ-ùE1§Kj4gñIþîˆùŸ¾`Àäá¨�\¥ÑCéó $N@éìž/s@²Ód란? ]7“%Á÷é÷œ^/=: ä d·!؇Ý,–�öôs,æîâ€b×±‘Öx*Ps»ù¢·ìc&+=îÂ!˜£j—õŠ'sT]…¦—Z…fn7ÆMP¬?  ÜÐò´9ȪÐ}’—}Éë•HÒž=ÌàJv_�ÃOœ˜…ŒSËh²T.ˉ²ä°b>FÏ/Cf&÷ð¸¤Uz ›Ý\ ùvcÒ2,%nå2ØÊõ ½9á4nP^Ÿ@j®æ—ú'´×~‹ó’Éeiq>nd�hÈtÍK®Ñ{Êš¶¬”5§os‹$ô̧Ò3$sÒ1ç\lZü6ß}³´X.1¦ëá-u¢â¥ÑýVµqÙ–c û�±òDý/÷$UÄ ø�tÞ¢–kq�z `pš£±L+&¬ÜGÕjdž6©U½ÞV U çØô›9a“¿j®Ùä!Jå©x°,)n¼2 .2%×opñÉmvÿ±½·toñ@è0½úL–üi¨ yê6´2LvÙ5”,ʵdKÒ�–¼È9<(fwøå ËÙ�–ìI:î¨ ‚¿o—œ \–Šp2®^àÂȺ¿j9:vÕ2nœÆý�˸ïáïÄ…û$2r.}:,<| ¸q`_\Éý–dY²–7dæ‡ÝrY9Ïv%Ñòlí¢ ¢ÇvófE�írŽÙ@`cÑcxO/IÒÞrÚul¹ÙxH‡Âv‘ÕC5j–�‡|dKçCÖõ ;¸ígia¶#-cÏVÁ#Ò–gIÒv¥ÌKO® µíJ£¥a ÄåÙ9ÑÊrv{Ïj>vŒn~—n6¼Dz-¥v¦••[ÊU€ËãEéCC>ñ�ÎW-’kœØŠ#Ú�~/ŽèéÆÆŽŠ¹; �ÀÚ½p¡g4;?3~tŠêk)Ö˃bIØÆ"-é.7:6ÆÕ)ÇE€ËeX$SA† å¦›×DzßÙˆÔë(œX¸s¦ ¿RMÒª$ñ» ³YŠ™a e §o²è?xí§ûrí<\î w\Zׇn׋äŽ=üÏÙ.¦C¦5\ÌÙ+×þ»µnÃ�£?GX—e<Ùö`Y]Λ�M݇¸ƒ{3K�²Ñq^ö_Û¼Êî¦ìž°[¤¦ŒÏÜ‹µáøuKæ±ë>Þg8)�æ+ëäû©²<Ó¼Av¥ˆ‘‘eëLœá)î¤:58§(?05€ÆéTÒ‰ÙÔ1«~Ö:5܆ð?¯Æ¡9F6�ËXG�'Vv„½O°e¾¸e}H|5½xùoP?mK`5'NÊÒ ß!‡j>“.ÍZ�o¡»I”U›Œr§ƨ|q½Ì«//ô ZUð�;&†Z–µ°<˜ZTv¢�ìÚ` ¯Ðh¦1žÏë¤>{Û·O“Ïéùoü_ß>ýžìr%ô?oŸžôÍÓW?¥ж¥�<ó‹§„ŸKŠ›t,û¿ùôô�/_ 1�zV_~ó�zG†TzùWþ×Yz{ùã‡�üùrŒñòëɬgÉÖ|ž}¾|ç�Ù�i÷¾üüÃG¾–@âáå·ÜÜMs{ù5s`í˜/ùá#±:yóõŸ¨?'‰÷óåwþâíòáŸàY§¾ü�Þ:ب>_þ7w2Obù/ohZ+‰Ôf]Ï=]žZã½üRÿ\úø¿ßüX'‘uZlžD’ ÄQž¿ùÛ§oþâ_þ¿”­èL/ 3Uè?ãAÍF6ÄË?ÓKi-ÓKIlt¾AÃûÈÆõqΗ/<´ajã  ƒA§¤ê ÑFL•ÆBRŠú•>@ýšŸg«1]ßúù)0yýRþÜf;:­çG† ¦òΗþø�%c™ãåWò¦’Ò)KØXß ¥â[¨'õãO<ÿ¤#¤Ûç}ø¿âÑy£?ÿTžiÄЮ¿üÝzýwëŸÿ$ÿ°ëw´KG~yéÈzûGÙ�d ŽËˆ.›ùgüKFÙº¾Ýçéäû<}ØÒïht|~·�70=©dé]ÿÄ�¤7•Ëǯ‡?-é¼�zŸ;]cbe—sמ?²Ã‰ ]Þ¿¥™$Å©ó7h7Ò°ô´•3Ý7ƒDxãÉç0m\ÝWÔšÒå™ÏÔÈÆv©—W~'/:j™/ß~ µp´V_þë‡Â•ËÏr}çzÑoÖ3? wÒêå^•Áñ½/=_4÷£_»÷þ;1ˆ‘nãøÈД¤U¿üÿ´‘\Ëø;MÛ¸¼ê·ü÷y–Û÷јõ$£ñòøt̤½ü˜çŸÔ‹c–ÛX>žä/ÿÀ¢�“¬iúø8<4)<�¼ÏHÁ¢�&izØ1tÔô2õï™:7×OW+O›£áñcùc¡m¥;n%s_ê^#ñ‘õE'�÷X_’•äy¯ïüàX­ýÖ•¿úæé'O¿&+©‰Zð‘tMN ›@ :²eHÝùôô£¯Ÿ¾úúïžÿø‡ï~þôÕÿyNO_ý5ÿß�þþ/é?_ÿÏçÿôôW_?ÿä]ä¾ô¦�pñìqˆ_�TdQAþžùm+ݽÄhiå ðOˆýöÈïd8_’b/ÿåC‘ôÊÓv�žGË~™Yf•´méX~û�c±e&[až«ïè=’Ã1ˆA0Ù›²íYsâu¡gZ§¿®¶?}HÜØ¸;ŒD‚çå?cö~][4béi­ÔXÿ¤ßrÌ þqYÊÎ�±×)ÓdÑI­,}.»ö²û¹žÒ�5†È a+íÌü1†×)£‹4Æ~µþùÛõ†ß\ß`SùC:ìT¡ƒÿßD‡#qQ^Êm —=(ᩱ‘ÑÚá�5ôòAŽ §õdÚ5Â*òzÕå[å~ $S¤°jÃi,̺05q¬ÿ/*…œèm ó EåûÇÐóêC¹v¼ê?-µ�¡[+–ÏÞ06VÁ�ý€evÏGm<î�©Ò¡ä0�Ž\§>Ñ"�Àg7@¡uþD‹_Ž2çuñÁ{ž™Ù ÿ›yúåõÇAâq-#ÞÕ2^Õ×d½ó*ù÷½«·Ÿ,¦­Ç‹ÔÅ—ÿÎ[5�N òèϯëMo>ÂKô—'1€×Õÿõ¢?ѿҨýt–ö“§¾÷/Õendstream endobj 6 0 obj 14003 endobj 15 0 obj <> stream xœÍ}Ù“.IuŸŸ;~òÐ�Ý º©Ü3ý†–‘@fKË~€f5ÜaÌ•.½ÏžY'ëë»0ƒD0�y¿ªÊåäÙów~<‡ûÿ'ÿ}ys÷͵û_þáîxŽaŒðŸú™þý¹¶Q{¿ÿÍ]8Žã¹µûËxÎõþÍÝðG€Žz<÷x?F> µ#¼áþÝÝÒSŸc]~ÑŽç”ïí-=õþeùFϽÞC;=çí^Ÿ+µáEøÄH8z¢=x"á¹FüE Ûã¹uhè/Ðõ¹tz"À×à)¦çD¿ÈÏ ß�pâØ.Ï ß� ¾‘žhÏŒ"å€ã„vÎøÎ\žCÆ6ŒߘÇs”'äåÀ¯.íð<òÚ†1œÈd†Éò:¥F‘S”1õçŽ_€­ÁYçƒè#Ã:ˬ'ñá‡H/¹EåHô’K×…Õžš‘¬g» …åüq­)ÕZOçi] Íå&4˜Q\îé…žèDs¹Ã&à‘\ É:À!!‚+‡‘ ü¢ÀZÓn[»ãÚ¿»›Ï!ʉ¢J„@Š*Ñ(H{�ð—ÀÐÒ–BV`ÿŽ~3 Å•FW2Sð…ˆÌW�О!C’6 •N·µ“î–õÞ-`-HÅ>…ëTÑp)D³ø€þþ…³µ3ÍÉšEù….\%27ú(ðK:hBäüE:7|NtrŒl„ÖÎÆ_˜[Ø,…CÉ*,@%D?c)ŽÙ3F�/F]ؼnÐ��éœ 8¹̞tE? �-½Ê>ÂÏaQùÜ3Û±ã XþÐâB#ÂsWq´Ì5�hä×›ÒkÇ#òrמ€IÁ½â±ŒØ† M9æ#3oé¹2þ{/ø�Žì— 7`¾÷ 9N¢3Xy­Ë˜s%ÎߺŒ9þÁ+[Ô‚�kx†Ã<ù ($OÖЊL1ÃQDÙp»hÔÑp·èÒZqù9®5=ž‘Ú.]¡§I´5<…ôx"ÑàY¦)Ã.ŒûŠ CSdNVQÂ1«Lªµ'÷T”’a¾²ãç5Ï">kíÏK‡k¾[þ�Æìšë¿ä[®¹þ{CJžM\’e8$»a8ÖÃKîÛïÖ_ÐÕ¦d§+-3ÖM­-ë6<ïµñY*¨¨6Ш‚ÐF`Yøû ‡~€äF»‘Ž+²_Z 2°À“&² ZAn#á'ù@ãs’åyœH™Bdî0ÏÚ ªÁRÑ&H¸o·á´åW8ùûže— j`÷½7¦ó‚#%îÐE ?ë8b¨ ë�îá·ÊÎ:­Ž»B/(.l1T¾Z¹­ tö‡=7Aq…ÓK_dQ6P„¦0Y8ð|fÐ…•«å/²YVHÕÙAb)À"³`Á4€‰ŠJ%]k€ÖÆ/@íîÄò)_£ Ã,pFpÎ&3�ûÓ'LÎ4RÏL·žíLª“´•² s]´ÔÒI_›²²›þ&šM�„£ª pjH˜³&Ù ÌNtÊšY¼"‡ÇÈÎI³¤îq.Îé^�¹n b­á÷k4íM{�­â")Z5‰2SCÚ©©1­Íœ\]~‘#k9ÖκLú î�A R÷f»“:¸"õ!Dâ�#Eá]å->‘H „À'� UÊzXšmò\áîâåØϳ óÆvåy–A»çAG]‰{CrwhF"\bÚ � øt‡Zhq‘ÜqZµÒÊ"áÐÚ×N++mz@{ÈÄ[ÚbÒÁ·H>tÜ7šW#­°ãšÓ,yW˜Ykè‘DÈ•) “¼è¸"´ö�´Uý™=|”zã…Ò&ÉiÒÏ/\awZ¤ u\@"êA¦ãò±;möDÚ=kÊYµ¶˜<Гx/*K 0 ïDmLö£òVp›ž�žÆ.ºxt^§®¸ÙC#Òñf“�4á…1D^ØÁG5†ÌË:è¨ÆÐxU‡Ší‰ÕHB-m@Ú¦'´oˆ‘<„Ðdù#y¡ÝX#„rvœ ’lŒ$Ã:Î%`“€Ò¤ßkK°É#Øq.H1’ă¶XvKêx@¨äŸ›MòïIžÈ\è8Täx1‘ˆìøa$�˜I v|y¹cFOv°x‹™ ´I „v¦]‘6=AöqÇWã"eRÞ;¾C,�W=+wŠ%òºgæF±$^ek^æ¬Ü)–ÆËZš%j ø@!Ó Ú‰×¤¨!6{ˆ}Íæ)kæu«ìh�µcˆ501µƒÎ¹´ñ•-ðÊUfx¹/΢Ë-óBR�*v4Éóqf±³`Á×°ø›=lûÅ΢([§…ì,¬bS[0v%ÒíÁ §íxÙø øÄ`�(_�OTÖ,f[ T•.hR´Ûºö­0½ÌÍB15&=èÚgö[;a>¸ÆDôÜ3·wk7Ý ¥‡HJšL ½oŸ*¢Q¦ba©—ä@gÅ@Ïmhª1ëYW†¦¬@Y¢2á©Ä,„ÿ0W6öU8ê�L"×W ¹ ’DÈdiãØhL ]w“_Fö—N6*‹ 4*.ë`¡ß“ÄkÏ´\"ó+3lØ–"œ½­#ÔÕ€v#!ñB„C(*'7ƒ-ƒWæàSqtrŒÃNZzÅzÌ~S1™­Ð!!2<Âd¦މ©؇#k«Ð ÇÁ&¾Z¡ƒ˜nC_oYš]™ì1v*t %‚4!§ƒÚÎâƒÃH‡í z5¿§é\$<ŠFx9ôÚ#¿5Å!`ms¨ýž%&+ÑÉž™+kð±£ÎÁŸ�ˆiÏÇ)Äj~ Á²#äeu{l½'ƒzNÔK‹ydųé¨jðÚœ1âyìÁ‚×Q7÷�úR‚„»Õ×r˜ÇT½1ê R »�,„Ú�,òËÐJ§8–P”ç_Qc\ÛÓ<×ÃmöW ;Qó¼a²„Z2Ò“Ù²eã»aÐù˜¶³¶§­=b²5¥!µÇ&W]z8ELleãñòQÔ˜ŠZ|SQ[š¤:ªm¬œŸŒiÖˆ$ÌÐbí$Š˜ßLÕ­75ÙîÔ5¯—vébO°½<¿Á¶í[ÇË4¬CæiíƒýÚ–X•Úßsñu E­icQŸ€NK6OW!³[ƒ= **¦e¬LS\)Æ¡”j)æ‹‘Èiì‹áè…6‹Är‹hGè0¡c%!Oý^­Yh¥1o 3B`µ³VqâÉÎζp#nO7ˆÆHm�0s%L¯†òPzBø…QmÕ­É7i×ÎL9ˆÐcš¶A8è `bkÚ0‹•>Gr!`Òê ±âÏ3s"VRfá‰éG¸d© š8{XðÌ6ûS•X5·é ‘·,üBj¬1ªpL�9f@ñaÎ)Ñ6ËWh‹¼yœá<&±ó!ò7�Ë$¬zcš’¦ ÅD>= ¬ˆu‚Óª(˜‘ÊJ„fæ ¬ˆhs Ly¦¨Æ±’7&©Òyn‡IªiBlhåÈôÊç°vhäÈ©³-Ü�ÛôßDÁá&¼­P\ÚLá�Æ'’03á—˜›.€É^aF˜ñ‰,ǘYh 3Fƒù\̺”ýÍfM¹(3cU9Ö„âåÄÞæw¦�Ìïb^'Êy.šFäíªïSõ³Y»âÄl]2òFåÊçLlhó1›V ¦ó’M8Ï3ɪ uÀ0²‹È�¢´ƒ%pîìO˜íȦ•Ź1'«,qîÜ93Sâܘ…Ë4ãܘãEAèDB=öq¨¹ˆé“dôšA‰ù˜djÊÁ%°Q¢Ai°ØÀ¬zXK’è<÷Lºâ ´¶Å4«˜=ÄA¬)†5&]¥÷¦$à/v°}"1—-‰•1jé ¦,e‰l¬©ÕЉªKŠ>Yå×Ý›mV ¬mû]¢&:°N¦K¥$em#Úòé ”åè°b�Ùlyšo´�ÙP¥t(Ý=­˜ÎM§UóKf�œo{‚$ìÛ»ù ý�Ž�_1ÇX‚�ZæQØÑ�IvtÔHŠÛ˜P×Ý�—€IrÇ¢`ŽqJc1Ö#ŠfF3ç%”Êy–å0‹­.L“ÖÒº’MØ·1¥Ò…Û S*#ž´¡X’ÏD—ÙÃLȵßá/T+#¦ƒ½RxLMåìR@Ýœ}L!˜F›#>‰š«¤Ö¨å0{Ø‹éÚ8†",@YZgK2BÇ/­g…qˆÛ²SØl[q„šûvImbÿ.Þ/ WŠûw$Öœ¦ƒx$V…Ô¥<²øÉç0÷o̬%| ðqW§5&û‘7ÿ`õ /=°×[Õ·QÕ/ÎêÛ¨’–$‰Nz ¤$ö›ãM²ŽÈµMñæ‹ç}tÉ! â~ƒ 2˜ÐGcŠÌšÑõE_àöË]D!9óQM½‡¦9" �ˆ.EòýG‰oB�F"¥¡@{H„AÚA"/ÜÆ'Óàü…Äj¬Í gù†õÈ(¬MÃ^Ú"Öæ7hÞš(  5©)cs¼Ös¢¼s]4+Í–Ž·/.rÔC·[Ú � QÆ„‚†^‰QèÞIÒæiÓ¬6%1ÛëÃh¤Î~G¥;&B>ó )‰i~Ÿiod0�"�—–••î…`â9Ÿv6½p‰›¾‡�¥¼0%$N⊬Í�C"U“Fìp+Wë ¶phÄÔLÝëUòC9’P KX¤§!Aa̘“Ig™7ª…Ä¡2»!gû�Y÷ÄÔ¡z0†KXÖ¶0ÞùDTEšÍv”:¬j³ ŠrªÌÀ >q ^ÙDù| ¤J›Q]¤hM´y‘p½Š= m‰ŠEMSB Š$÷t8qÞ«¶ÙS%j/É0öh˜Ü­lJø& •ÇŠ±D^[‘ôNê™YOÚš¢g3¨%!ý…Š]Q“g[��-J JL«%ÄÄ–W Oš¦ºê’r¬Ê+Z m±õ4¶‹¾ R(%v£ú‰µE£ÁKa|VUK’ž€nPRÕÄÞTµJ”A|¢2UšBY‹Ä‡(µ®VIÜ6£}àu±ÐKƒ¯a-‡X 2…R´\ôzÇÅ4¯‡šêr¹Õ”^1š¸0X·½š·7U¬ ÕÄÙgª¼8$J�u2'‡™l)‡¤�«WD ÌéáÅKA4냎½ê#V«Ùn¼ZE,¹Û�ëW¶ØÕ•{1ÝÕ¿®Æ½zèsZpÞ�zP Mep¦‘µõ* ôðQ”[¡ê#‘{§Ðf®j÷ƒ–Ö�¬ÍWŽ–¶jQꙑ;•Ðf…ÍNT`rd?v Ê7ÕÛ×¢Ì$w~ÍY„{$Ÿÿ’ܺ\Úì-°¦m…8¨¤Ç·ßÝ™“Kn“™[Lo2çÀØÜl³Ä‘†\ûÀ>\¹_·´•]¨#N®èA»É=L:ýÖÔ[ƒæêCß9s(\/rHÖ6s­ z8JžÚps/¦Áš\ê,Òð¿‰ý�ì‘L�%sj̳Ð×ÉLŽp§¬yÒ©è¦{üzC7­ø]S!—sœ”ÈW³´i{ß­¿`99_¡¯d–’z~µC`f›�?ø 2A#99rÅ0Ðdg�M3 VBÕ0§õèÂ漩±Òƒø„¦ÐUQŸ=¬¨ã§æZÄ3 ­èÊ‚R0AЕEBhÓ½ŒîXYzëa‡DªIè!‹ [îtF‰k¤Êò�d¡ØÀÁcO Ý•@ïÍξ\ ô¡WþY(Z[/Yœ.%V”äô¿’d9ÔUg=�õBÕrù> ½ò¨9ÖSÔc-wãê�“Ʊ4Í ÒÃ[:/”z¬ë!®_á(è6',Hâ±æn6N,LmÞd›= «,V¾(ÌŸX¯º9þ¡¼oÞëUÇð1©¸´9pnƒæ@¹ñ yñ ÖqP+ ?ìÁ®DDf³»�ÛxA~"#ÔX„�0ƒ–‘#­JMªUj“5[#(Q6Š×µ‘ÓÖcV+#z k eD™ * C6Ÿäz°{ �<…!y‰ú”¡.8dL„„ BR¹Íl³*Pº�;‰,I´Ym/�‰)²ÂTZöYyàŽù¸\7MQ@ L*§ÈF�\a )°ÒÎw^¡Éª‡\‰Åkñ¨_‚tÀ—h¡Í*‹y|à`M°4¶Æ×v-ôÆ·~_f@T¥¼8Q�¢¸ŠYb¿Ì§ˆð˜E¾Ò]qÍ5׫ä/3ú�[–tö*|§sú;»E… ½Xº¼^wׄ|ž’Á¿OÉóÕ+úšç«wüõ�ॼ̠¿¨hVÀִз¤¨t–Í6‡eøjíY–�°dÍ�Ö8•|^m×ôc¹ú®¹Tv÷~°œsÐ2»¿// àU¶xâ—šƒfØ6’D+üOovŠ‘ƒHV­.ìÑÅD#Fï—`I³r�Ô�‹$1N Ž -æÂ„W’D\áYvÇUXÌlÑ{±ÊA4W9Èl+j€€ ¨†hmE•²¶ÄÀ4»O†&îòÑ´{»iè•Xë !ù½0‡·3ÑWµbMôe4.Ëóe¬.z#3róÒvåtCkªv¨І&×—‚Ì2Å6x™ Uj^h¤(ÖŽ]¿!™À) ¢€d £TÍKå(ß—Tá84˜ÕjAk³Ä`L‘a¶ª©šxY(Í,ߨ%iW²|cÓ¬(MëÅÌÎÊea€9[mfñ¢¤’–ëê˜ DéÌ’Ö‹Yat›��¹`ÖÑ̤Çò|åÎàœŸ é x�×m¶OÀy/w¿ø«;8Ð C„“ šní™Ðö€²Æhõþ7ËçÍîãÐÞN0´nûò Ô³êÒ¶qè+¥Ã5'Þ�¾@›òþó€tZ0ƒq*V® š¬,òoîüÞÜݤŸÄ9ò0H&iRrPK‰éªÉƒ99¬§ ÊaE9$© iÊ!Qy ªÊʃ]y0¬ .Ëáimp[—Ãëòp^ïË‚m€a;¤Ø:æ@É6Ô²3¨™‡<ÛAÑ= è5Lè$ê¡F7(Ò «Ôa™z¨Ó ÕÃ¥npª7ñV= «¶Þ„t5ÐW »ÃÆz`Y<»AÓzðÚ Üv‡¿õ¹'Ý aw‡à½Ñ« ‘CùõÚÌÛ;Ãg“ ™«VµbÓ;@QðjÔ›»]ÑòŠØ…ªæt9¯êíÊàY[ôÊä…ºéÒ³¾º+´›ÊëUâMgöJµSºwµ|Sܽb¿«þÞ8pÆÃn^ܰ?Ì<Ùìgß8óçl ]™P'ëÝÝfƒy m³àn˜xfn6¢7"½‘¹›¡ÎPõ†ì…©ë�ag,ïæôfp{ƒ|3Ù�M¿™ü»SÀ» ¼[Á;¼kÂ{.6φó|xÇÈî:ñ¾ïzÙ�3Î}ãÝ; ç"ò.¤ '“wCy7•÷cyG—w„í®²›Î4ïl›î8ç¯óî¼Ýáç\‚ÞexáTônÇnIó[zǦw|î®Qï<õÎÕÝýê´Þ�»»x½Ø»ˆ7'²w3;7ôæ§ÞÙÞѽ¹Â�¯|s¥ïÎvç�w¾úÍ—ï�ý.°‡ |<Á…ö€„‹Xø€ÆEÈãq“-¢âC.>$ãc6.¦ã#>[Dh ù�Òt:G¥|Ðê"¬å_..¶ÅÍ\\Í…ÝöÀܺs¡½=ø·…}øp0ž#�>@yÂtAN½“º@ª‹³nqX§=Gq÷0ïöaâ-�ìCÍ.½‡ª}0Ûź÷`¸�–û`ún÷ù-`¿…ô}ÐK ØÓΉ>ñà*5Áå.¸Ì†-õÁ'GlÉ{z…KÀð { ‡OòØ’@¶,ŸFâÓL¶D—©²%²ì©..ƧÊìÉ4.ÝÆ§ã\$ìø”žsÆÏž´% ÝH*šYG>-ɧ-�›^®RŸÖܨ·w{ò”O®ÚÓ¯|‚–OàÚ3¼\ ˜O»H";§™ù4´«D5—ÉæÝöT¸-YÎåÒíÉv>ϧë�ú^.RþÎI�oïng öS’Кvè]Þâ–ØèS·ÔÈ=yòFz¥O¿\4] §Ëð¼HuI¢.‡tË1Ý’P}’êžÆê]}"ìž*ë“i}²í–Žëv}>ïžðëS‚]ÆðžR쓎Ï9É[Îò–Ô쓞÷´è-qÚ%Vï©×>7Û¥nïÉÝ[ú·KßÈÏ=Kéáíü�j@ÚVÃJÛ3,¨w–5 ¨Êô º'>$,è¿óæîæHüHírõû§rоlõíwú3+^øéì bÎäSÚ†õÙ6o¸`Ûi�o¿[Á ÒÞÖw�ö¨.¾�¨¯ÁÊ_Ìq ˨CãE Õ2ƒ4Ö#a�NTn¥¦¥!ô€ö°NfmqÚ¨í9ù›Ú–êQÓQŒ³ §¦¨Ö¡¨ø‚iT¡Æ¢´ÉXd ©¸8†ÖÁ¥ \cbÖ�ŠôBÈl üÆò„pH)…ØOˆ†Ì‹O Ẃ‹“B”Ò Y¤æÖ5J±�J+¨ý5ÛCPDì‰4„s³e¢¶‘"¢½¤‡ªšéÑŽ3¤GèƒômÖPËH@FÌvªÙ 7Ò:Æim1RJ*‚7dÈ*©ˆÓ�-³ßDV©*:-³ød'lÒ[;šÉ(Ð"jÏ©ÑÉ0I‰$EÑÀuY…žTY­qˆ]+~ÄXU¡ÍR͵� ÊvrZ¥ŠŽ"õCÔ˜WëÈÜCñ†oE]‹JOx�l�_YÌñƒ�pêZTŠT�B¾,§{°.¡N „vÕ6Ìá..X ëê9‘ ­�´©Réi”žéiÙÚz·PÑrÄÎ3œ$u‘ζ¢?WÕëOºžõ>…n_>!ðNb) ЭÅyàgª’ „°Œ÷Ìê­xÌgÛ"Ãê‘*ãí„�£ =3¦�KŒQE½R[¹;°^ ôÚ¼úæC�1ÛÆ£¢¢Æ›® WÖËÉ/wÓ³'‘eÅîReŽÄª ìælTÏ�:#9±´«É$q_J,Úü›â %¡éEˆ©(Eœqr6‹0¶¶HŠbƉ/ ²®õÄ–}1âÍ+ËNóáJÄÅ©˜Håê’-™TR–ìÜœiO¬TKKÑqµi0Ö®C?§í™—eoÐÉû]U´×ê¦ñ Þ~L¦•¼cÉ´:Ö�jÁç–€¬áq‹ÙnmÑ—'´Gꨚˆµ„ê¢6®XÍ£]lp/Ããiœ7^^Ãä “�ª½Çõð¸0ˆGqÀ"gä‘—×°I$woÃ7ÙðOv„” CÅa¬ì(,§eÃqÙ�^<ŒÇŠÙÀd،Ǣ¹@«qx6ïæˆór…˜sÂÔyww�ºã@y6Ô�ë³áþìÈ@;Èc ] ÝÀ'2ü¢áÈa yŒ¤ %�³äq˜v¤&�åt õ´`Ay´(�&µáMyD*‡XµcZm¨Wë5ËÁjyÔ­—Ë!wyd¯úËcƒ9ì°]lÃsðd;~™C8óh;DšƒPók;›Ció(n8o Î#ÅíXrmΣÑ]àÕ9D;�xw�‰çQó<ªÞ»çpùÒ)J¡y°×(‡ ’:óÐbb‚ ÷Q¹™¥MrU¯—YBUÃ9ºüjNèâÏškºx¥²T<±4)n¼R ,2E×oäâ“Úôþ»Äö^&нÆ Cõê4ùSQâ`2Ô2LzÙFj(iþ”iÉš¤#Zòl&Éá‘bv‡]ÎМÑ’-IG‚» ª"Áß—%g.K‘p²\½� #óþªæèèýU͸±¶ÜÿXž�ûöN¹ð¡Ÿ”ŒœeL‡†‡× �úřܯYAš%«yCj~è-—™ó¬W5ÏV/ÊHôXoÞÌè±^ÎQHl4z,ÞÓ%IÚz’^÷’K’�'éPB.´{RAM 5ÍÇ“|dM瓬ëv0ÛOÓ”"5cP žÍ(‚E¤5N“¤õJ™•žT\IÔÖ+�š†­(Ë9Òs•åôöžÖ|Tì 1ºñ¹¤(áfÅK�H¯¦ÔŽ0³r‹„r`Aóx¥ô¡"ŸX�@ã«ÉUN¬ÅõF¿G´tceGYÝ"�„µ[áBËh6~¦ü(‘ê«)ÖÓƒ¢IØÊ"5éZ\.*n,t¬ «SöE€)ËEX$šS– AÍMW¯�f¿£Éפpb‘À�1mñ+• AZ–$vWaTM1S 陂ÂÚ'Yô‘×Îåt/×ÎÝåw÷çârм>tº^DwìÅÿõbºÈ´*söʵï­uën}ˆ°Î‡”ñDÛeuN'?šL‡r FîÍLAŠFGZè¯m®²»2ûa�h�nReƧîÅRåø5MæÑë>ÞG8)Žæ3ëÄû©´=C½Az¥‘‘‰t†œáAî¤288&NQ|`p Ó©h£²c–ý¬ep¸MÂÿ¸äÙ€.cY<±ô€`Gèûèíaæ+÷¢t ¯¦g">`ì§­A˜„Ì'ikºQÈÁ‡­ä—f)‚oÁºI˜U*šŒt§E02”QÙæZ™WÛ^уJaÁ'Ü1 Ô2í…æÁ”̲S ÉN“æJ€z@#Ì1ÝÏ“zo}¿¹;°yîÿÞþúÍÝïÁ.çÿçåÍý_v÷ÍÁ €lá#÷Ÿýâ.ÈÏ)ÅM:”ýŸ½¹ûç‡ï>Â@=+Ÿ?ÂèÀ� À¿Rnõá��Oøù|ôþðëÇ'0KÊQ»SjãáK{L ÔûðóÇ'¼–âááwØ]+,s}øtc`íß~|VGo^ñÆ“@¼§‡/ìÅÛ'èÃ?ÄU‡?þÞÚѨN?ÆAÆ,ÿáå–µ€H­:ôØÂòÔœïòKþçÜúÿùìïxQg�ÍÆE©åþ³ïÝ}öWÿüð-|)ZÑ^g*Ã?ÁI� 6ÄÃÏॴ�ᥠ6^‚€é=¡q}¤ñðצT\8pJ ¯b(0�R0®PåðЯñy´ÃúÖÏé[ ÀÄùKúç:êÑ`?Ÿz˜Ê�/ýñ%cýáWô¦B¢-¬¨oÀVá-Ôãø®?èáôy›þ¯ðCpÞàŸDÏT`hë/¿˜¯ÿrþùSúó€Ýù-OoNì9yýQlK&]?�H¥ªÝ?¡Ý]�·|ö3 ê 2G˺á@gÿŠ£CÞ Ÿ´õÓGTJEz‚�ÅåTÊDëë¡/¤5 j-=j%Ö6;û…·¢D9r&ÊE¹ ¯ÿí|ÑOÑ÷Ûë2�_.™o" µ/3Z¨ù'øK„ÙZßn�ãzâ•ýÒAhZæÛ+œŸ/¶ù:.ÀGL½µóOØ ŠS^>¾žZùiétìmíx“�—-¯Þ?¡Ç‰Înï÷`%Asjø G˜·œBfÂé Ã+.>Æy€r™° 7„噷ЉÖv.Ë+¿¤%�‡ß<‚^Øk-ÿù1céò”×wÎ}>Ÿù¼v/¶Â/~ñƒµïm޿࿇èá4�'ĦµúáûøÓ ‚-ʿòõåU¿Ã)Ÿ¾/�‘�²t.�ƒç ÑÃßáúƒ~qŒ|šËS¢(øG” ˜e ˇÀÂÁ•€EÁuD: (�NxÄBÈ Ö &UÑ‹%;Ùî�ü+œ@ÜIÌ:ú}Á³*ïfx|*´5eî=nF¡½B�nxŽÑ³œîϱ¦ýH(e@ïª0lâüMfe¶(þšæ ôÔ‚ü¦ú\«mj¢�„r¿À¶À9 syû@´ >ôQùì‚}Öåw!à–ôŽôÇŽ � À.ôév\o®übTµ²�)œÐõ^„ˆ� _üWÛ2ÔHçKÖm9bhv!ÿŠí,.õà<³úÓ@Ie¾ Ü*nY%ËF$1nJ¨*¬î`Tv=ìça‚×™q�*#2³*Ûw¬ï3ýëÙÆ:b»%¤çÑÀµB´ö£½Ê�œ~�2Íê9¸¥Ôy¹~z–©°ÌΦ¼.^0H÷žK3™]›û诩Ÿ+³ºyn7åóƒy†®@Ï~…×E¢Ãâu¬.­¼Ž]gEùS™hFr;»Ãƒ¾®ùº¡8èì¹vÖp-ÖYáÅhøäYãÕUlõê¼€Lù7fQGYIx5QŸ]Zê›Yo©Î—ªë•ùˆ“ÅœA0¦ aþ3› y5¨Ý¢4²šQä‘ÇÂДa…Uy@6U°@Ø×ê!q©“9ÿõ*…ˆj2œ†\Êñ+RÃþFûnè„c× ñô|ŒN86�ðÖ`¾ýê`væÙðËé«Õ ™*@äG<ޤ1³ˆë­.Çï‹õx¢�r´u³Ï¼‘4Á²sG7ºW¸#ޅψ¹šŸ£®b ~± ÂOû5Äó1\%é"u?;<¥+ÓòÃÅÍs6K¯lLÕ`Ó1ÈO¾×+ý0S¹àøqú!�7ÇÐñG]˜ƒœþÃJ;ë’ýGømG©ÂÃÂ{¬ON×F1z†�RŽìÌjL$„ÃrÍŸp0i%Ý!‹,M…}q¤–b¼d„öö²±[ü!³Ûªü–žóå³N­~¸©ü6uÇo{Å×Þâ·7P™õrF„. Žjã<-7ÕÆI¢—Fzzî»öøã íño^Õ‡�ÎÜxó%韗Ü8žúëƒùöÇ©²˜%‹Çä«UOõÞô�bÞ#σϬáòä-žÈŵjpïðýìÑr©l½þÍåàß6ÉýÙi“_�ŠûÁþUÐ\pQ¿—uÙò :à$ÛÍ�]Öác4]罩Ï9yõukœ*�o8ú*ݶÅxCÀ]{V6Ö혒/b¾5äѱºrýÐr¨o È'¬­4Zy�ÞºÙñ1Áë5éä!•Pݨ'½öRrÍ/ÍM†Œ—ZL1ø’¹ám–]Ñüñ…¢ù§hbѦšoŽêSY¦TÏÚ¦h³Ã)½ßƒN;‘á'ωÎV×gÎáÊè\¬xιy®5Qý›ØÌ;ó]±÷/#ž„ï x®1ãíh–KWèíÃ�¥ÊÆ×á ý`õ÷ÀpýkêïG0ÔÍ?ŠDQ†WêhÖ0š�T|q¤ex«SáUŸ Q_õ©8¢ÝGR1¹D½-:�‘®Ú"îö%•0&‘Dþt¿'=ž>˜a⩸²=u›R¾]áÅ�ÝÛ"¸£.ÑáXq…Aó61ÔÂ‰Š§ÅvŽ›c¦t)géô^×­0©âKwÞ$çš6ý„X�õã™wüãJëw–,µ7Ž“9¿PçI§zB`J �¯ °‰U¹KÿÎ~�¼$«^9vþ‡©§ßÿ8õwïh7OÛ'ª§DG¿©Ÿ"ºi9§žöWójÏÆçm‰÷¬qcÏ,¯ó>÷‡º:NlOÆbÚhˆ×±G|'¡~–ÕÝÒÞÓ’QÛÂéü^ÊYàŸˆ,€w·N®ÕË$š/¯NýIA¥Kçù|ˆÿ€#Ççå½éÆ,pï2çðš)÷Ž›ZOf\zá/eÐYÄ ªBî«lœ�_ªhó‡3GüJëüå%³qsÃýùCŽ©¥­,Ùs—³ô¬ÿùÏà…ÁL¾òCx¡-£ Ÿx^¸ÎK£ÑöëŠ+‚M´'Ú~ÇmxöußJ´¥hÀ9+o9§Ÿ›-ùž°âEâ/i¬ß1ýCëûÞGj±”ø›¿j-V¼U§û+k–¯ä–O61½È¢”Û.ºN´ò¶é ÿ¨Äz¼´Y½ûõçÕ#îL_ ñkÊ«×ÝÍ[TLÓ}ù‚ÂI!eq›6Ó-Å4"Ŀܯ{©ÜRLù‹ç“V—ç=š=?g¦­î_&‡ÖÞ“4ár"Û_?™ù§¸&[d—™Æót,7üNi·ì’ȧô=w5…|ùú]Knû�ºÈg¯_'G…qr� Ý0¥¦Ž»ÐØ”jŸåäTs`òï¥ýIÏ‹ šø€ÌDüâ•ß#½W�ç»\qq%_kòšX_òF®çP®¬Q«ë_w�¹f,¦ï|èœGÑ­ŽR% Ò;>ü5N¸€šœ/²žºK=Û¼–ùƒ¬L^¤EÌ]J†éF}y¼e®�ï9u¯å03šI¹9€ Ú§žÜE…¦ûe1¦í“¼²ëeý|°(>œo­îš§Œ€ñ°&@¶ ¯¤ç•S¾çˆÞÎ'µñ|êÍó×§þòÚÞ¥iù‰âè”ÄÎIû�ŵryL¦}m·Mñp™¤j½ìø«Mщ›Kõ«¹¹—yÊx5wÀGBK¬×ÉD6ɪãåº%ªœ° ÕhU=þÓ#ÞÅEçá‘CÛ*·Óyúj×Ù§2-töuF‚�»´0þœHpïùW^ƒ¶-øËÞH?-¹ê<ç%_ãÏë’/†Ç«Ö­,ù'Ƨ^ô%ј¾F½Í Þëh £ˆÅwÎZÍîq@ÜÉs¢šÉÒòÕ¹nžƒt9| “û‚ÒPþ´ô�Õ¦à=ë=W‘«i¬ržÅP?%sùÆY[ÿFš‰™2Н€_^ýè–’y•ä®§úëº2N«sɆ_¹Ê}ö½ýy¸Ïš®g"¼xø!»«0¿ŠÛ)¸ä¯ÖIE•9Æ'ÞìÁÍ ÿ';Ù×Yž36x9÷ûI•'ñæÜ2HÊëÚ,ûiWFi¢×TñQ&ûzºi;ã§‚«}Ôµð¿@Ø…°½ÚŸ�ö¦Î¶(Äw>»ûáÝïïÕu ˜N'–îK+N�-tôû—7wýÝ»o~÷û÷ü—/~÷ͺwßüoøýƒoþû7÷ÿáî;ß½ÿáM@Ðî+VaèeEÅBÕ•ê…Pý  hn!(ð„[Æ»)èJÏUñØ`á2�RÂsAá»}¨hʃéDî€<àÛäw\§cøl Æ?ãqt„�Ã;Œ0Ìå§?™?%˜©øÜB÷ÒÉ 1ñ£©#Ýéçq�ãsÅ|­ë/ýö#çÊÊ‚.Çž({P"°ðX`—+)"¹g Ry¦�,óŒ… pÄÓ‡ý-ô!ftÐÏÄ’tìy‹¾ð�|û¿oŒá`<�Á[ô¹Mè…;Kìs@¶Š�®^`õ ‡{}˜ßæí:à‡šúù|ýËcÄ0w'� ktè2�9¹ŸÙ8.ž\äræyzó+ææ�e17'ü K¥PDò4aÔú™–Ž£é0±“—fŒÓˆ–Ÿô�Wm 0>-Â{Ðï#©„i˜þï#Ò÷A ­ö¦e$ºuÌsyA–‰<ë@ÙŸŒ#èO´¼ïâÒG`"u]Púë€&PˆD©Çü3]öf[û¥³Ì?¿ÁªP&G‚’ú¯–m"€Þ çc£[<Ë™;.z¨zÙè–~øt›0¼?™nSAæPnÑmBó–>’p«þ~øÑ#Ft3aûÚ/'|iýÔþú-íb$ïþ•¡FÚÓt_ŸbÒ=Ñ™zBÓt£'òò*±g°|ŒÅ=nPÖ"¾X»èvžþ=Xç7gça�uv.ÿþ(ª¼@ŽiöŽùg›â¤8Ô½mPïÜçŸÉ’7ÙFÄ=“mãr–çžGu>;7ûæf]ýîwWÃZÆúÛÓá”5·³©´o<&ŸdÌÒ¹ y(J1Bob*Ýý"/ÔñÛ) W‰@ÚukuÛsz;�µe¼ö­Ç€ ~ÿh?[ýÿÂAræÔÎ@à3;ÿ8“N¹ê4öb:Êïþ¡.ùendstream endobj 16 0 obj 17914 endobj 26 0 obj <> stream xœí]Y³Eröóµßìpæí§©}q„†�ÙŒ èFŒ#´‹�@H30üygVUWe-Ý}Î]4’CA\úÖ^¹~™•÷Ç›øŽá?é¿¿¿øð+»{úÓEøºã»ÿÎ?ýåâÇ žþ‡¥Ö»�.¡ƒp;n'ÁµÚ]>¹à©½c“æÞfl߉Ýå÷_ïùáè¥�œû;69/¬Ðûç19ç¬Ý¿:ùä-÷jÿòpd“Tνq8 5YæÔþQlËÌþuîõ› '�¤|‹_•†9@NÜ(S¦úæò¿`å íµ¸ra`Æw—Ÿ_\þû×û?œ˜´…©ÃüÞÂÏzÿÃÚ+Ë]\ QVj8 #Œ‡Gá&na­é«´|ÿÓÖï¥çy,Ã÷OÂbgš6}fp¢šàùù1lF8·øƒÔ¶“ú‰k¹�x¿,*N¯¼„Sap>Œq…Ç&¬Ä™ô{"ή™Pi ²X½§--_‘q|Á4žu ®“+óÀ”f’ŽïÿSjé�Ý?›Û‘¾RNÆ1¿….¨KÑß÷è…>^HXÆwekådJCzZRLÌJ‡+—@Ž;r¥a5"R ž—q@Þ—�€šæ}õ׃_áè°t¥ÓHaééZ n:Y-¹Þ?-ŸËÇÃQMN ÎÉ–iÉ ‡ Œ…9 …¹š.ñ”Œ´p]ñ¤”LçÇú{˜KöȲ “=Ÿ'ÃC;¦S;r5©xri091ˆ3Ÿ||‘J'ä¤ui*,¯ |Îä7 ¡Wá¶ép´ŒCÓýe 7?=Ë'¥¸›Ç»š?¶$>ff Yè$]“„)×” }˜ûFrgZƒw+á'’ð÷R ÞäþPx�ŽjÿÕÁ‚Äqðñ23ÕWØ�3á·°&a�”û»¸_•ð{[viñ«œP¦¾99�vÅ0÷T KCÏ<ö\ª1žÙýçø“å@ÀwÂ7ËäþÞüm(Î�ÜPœ§‘>È+MêPô3WO‹SŒ¦ýâ§Uý”wó”Ÿäo—«Sú¨jYÅ]x95p¢‡Ï�ú+É4XV�B—&°l9Œ[ØêÛׯ{¶†JP�ÊÃPº’‘@>¼f|ÿ/™Ç2�Ì� ÿ}üjNX绡̡:ÙÉ*Ÿ èÕæáÇ<úâ ,îßí†�œ²âÑ"ÉéÒ--²®”°QKÍi[²l°Ùh(éï…=ŽúŽ |¬U+µãžçV;€gÊûba|ãh A^1ô“¸$�”³ó5‹|»¨žG¥„’(¯üŠ-Q¸r v�FS ÈVé“)`Mk¤�Ï×i¨ê«” ªs„±(€°�ѦìüEYRþVÄ0¹Š_10á¢&K<‘ÔØ£Lñ„!þáA.óÌ@æ/G\Z¹J¢¶’ïXÁiZäIjK¾î9ªðÎÂDÄþœ;%A#¨ áÜ�õ{h¨€côH$q°³¥Ïòô?)Xkà¼ÏTôдæÒÍFºÚY$bα­ß© ¬*/b[´|�Ó¹ž:0_LÈݱêó86”r¸®§Å•Ô[v"‚¾´ä\)E>Kb��\¾ ¿d™ó¼�( $Æcʼn®‚zQ y© ·­`�ÖnEß³€ºqûϲiPÚ—f­]Òš¯Ï‹œŽbˆM÷â1lþå˜5£¬UÒ ¥¦<¸„ €ïÍ+~�mÖ“Œ�5ëö\#äȸŒ¢Ñ€ÉÑ.™ ”;ùÛ½ù۵͸›Ê,}žM¡;ùÛ«S: ‰Î,@¯¥ÑQ˜0ŸòÐwŒ®+UëèÐòZrÀHðUz*¤†Jt�E¨ï4«°b\—î¥]ùö¢³zÂö~Á¥š uÒ_ZO„†Û¦d¥¤Åƒ±ƒMò᪨”] |ô¾-Œ@5PÂ4áãk£(Ú¤­Œ­I \…éTûvݬö#’} >k[aê%©pŸjô™›Ÿâr2Ú-8TÅCŽ f“‚êè¢ú^gm=_º3v ˜‹ÐDN(ý©ˆü0«÷_—åeò€öŠfÿMùýèÆ±I{C{‰ÒËVúmuÐ4e[b!§å�nš ÝzÙ*â£82ømá¢Õ©·¬‡&ºãÙÈMFŠ`#@+!&Š�3ãÞ2 ‚Û3N^G‚ L7f�0Dw®>Au>,î\+@ ïH‹ÛP’n¯"KYº¹@ÌN8JÌS0ý�`ñN²s/3Ya·-ãÜfˆ³,˜§…3Ž(L# ¶z¯:ïfÚÿ$»ÜP�šŒD–‚"M€ ¦Ö=ðB›™d‹;é:[9àÕØûÊ´¥:[\èuSÜË"yÇ~¤.ó|Sh¡ ÂyJÚÚaÛuX‹[ôùøM؃uuñ´É¯ÁŽU°ºQ^ñ,z´«ø‰ÀÆÉEic É·ò úkûÓžLúñá¨'&0rKÕdë3ÅʃEõkaÂ?@_gµ§(Ï·?ƒ\¾§Î[HSж�rT,%Ð|«°‡8—Tu š4šÛý¿†N=Ï_‹áv�Ðö&ï±Á‘¯�ʘ�×®)Aù4Eùrƒ?ºá཭~nˆzp�ÌÎÝ„k⪀Ö¦—Z�op‚ÒBºm0oÁv]P'=HTɃòÎc�±¿mœ¡pIX+(£ŠKî 5%õ¼¨g•�˜øo¿–í]"¬J0$W'²1”åÄã#ïìÅ^8î%H/¸ohÊ“�.¼ á„–7�ËÐuŒÆ©`²Í)Ö9 9„]ˆ Qzõ±3ÌÈG©w%»jxîUŽåÓò­;wð¯¨0 �L:÷˜ÔC¯ �Óª´ÌìRp˜ÂPL¼ éb­ÇÖ(ÿ1oj iyZÒ:H†Ç&NX,¿„-:/ôÔÓ†\ ‚û”húFzò »³ö‡r Oƒé §ö¢ºà= ÷®z÷þ1€ÞhÚ÷€Þ»è¡rð¦ô8"êÚ½nây`« Á¯èI75�žÄÕq©©$.lYÅ&q�¦vÝ #ˆT£‹œ\Snc\ä„HÖÃŒ·¹qºüxÚèpã�—,…F%Øöd®›„†ßÿ¹àkmbõ ¬–lB¯i>á‚ê8lǨÝWÐ@uÊÈ‘P ª±HEjsŽfP­,Ò ÙJ‚Ï3 mš"®f§Ã€"ÿϬ`FÈVŽ+çz!íÎí4´¶Ú…8ìÄÁã³;Ä_ácò½[ ¹Š$‘Uµ®£CÀ€a²öB§ÿ=ÄQ“£…q ? =‰¨•|д.%ª]€ŸD0Ͱeãáçpb‰…ŒÀ„°b’|ìù¦ûtèhM`ŒÄíó¹}»¬úFdÒE¹ù-^÷Ãv9›õu ¦¾4�VcŸÏZj!õu4=¸Ÿ†èïvW5ŠÌñ*s[mÁ"Rjx}²<'8?µ´ÀØlÆ&]ê<�™€*�òNf)Ädg#T¯è^"Z&³�Zw$Ça´i«Jò>z“Lë1^žÏæFÓãÚT)3Hðšq ì=ÜCÄevÝdº@¼§2� Ž)/L·ž¢ì‚¸-¥(!µT´‘Ÿl«(Îj0Äc|r¸IPZÅ;.ÇGºNýþ 4|0¹&s’Œ@¿Æ¨Ñ¸>èq•q#ùJ=”ÿsêx¹öû‹"ˆ<¨–ÜšÌv”áœ' ¬=fî{�àØå/ò`)TA½Þø Ñ‚C5†¤Z ½ÙâpÖ±S…Î¥ÒÄ&^êüŒÁSQu[¯âaU ‚kéI§>@¬°K| (8˜•òœ¨WºÅ7ø@oÅÕ9eõ±Ç‡¨( 3‹´á¯×-äWâKÂÚ É Î‚'�TÃâìàÓÍãf-8«kšgÁGÁ…-ƒ4ÙKM§D¼Ôâ]öÁ´6¸ÉÖFŸî¥ðÕœ®M_�®æk'…(ÁdR‹¹Ãb!wX‚˜’Ü,ôò£^¡3`[;xhy>ðR'Knf„ãö£Y4{¼×!„ÑÄ•ƒh½ÝÎâ_ÍBlBgŸ¢L7¬øZ�:²yà£WÜÐàe)U>< ‚]g�\ 虄-Ð!;t˜u¿mB³¿�ͪ'-l¶ôŒ $¸*~WÔXÒX�!JؘïÑiÄžPÉ ^_´üüs _ [Ýјc±§v–>öÄäžT�¸"u…@"üXQWá*rwDq–ž–xÁë�‚ ûÀ’dþ…¯ÔåÏ¥MäÝj#K§CÛ.„ùRÖGNñbnöRŸä•‘ˆØV‚ýz€<ð ŽÆÁ‹jÿ,„nǶ^™=k×îµZ«9«PMHó£ç‘t[<�:ÄFÊ)ôéó†>HM’G/„±{: ^iªËBx1\‘îÃ*% ANò°×c61óÈ¿í1›Û.Ñû¦,Ñ¡è×0à‰‘š»«ƒoÇ5éjÔ¦ù9‘’ùbšHI8Pð~Ʊ’9#êþ\Cœ+‰Dk*{¦T`©k-¯A@4>_9 ÖiŒœ`¡£÷‘“Qä„<ž®Íš&‡¸‹« Ä_‰«¤ã¹Í¸ LJ‹z+®ƒ)¢š�¹ìýÿ‹«`®fˆ«¸÷A•÷A•÷A•>¨‚ EQµëAVåÿ­Ux‰/ÜXP%äH¯T懗D!]5 ‡Óª3*¬Ýõ€ « ÜVT%àî*Q^_7U –/\Þ‰Q•¹ù-~‰á†3 ¿È«VB)&c¶+¦ÉBÄ3χ+Ó®VlzFs…q·+�¼=;°2Ìr`%<™ªßtÍ™¢÷Š-†üLí?Ç)”¾2x³URgÖ*×” ìAí¿×°2ìj_^»$Ÿ—o#tòÄK©X©½¾zˆ%¾×³·P(ªŽ±„hšÆXaŽhž¹ý$ÄX~’ñáôòœÐIx0ÚX§ ##ÏEqõ3\¥ú2)ÅyT_T®+“j²ÞdP$ž×ר5–åÕõÀ´Œ\)7~ ÕúúRõO¡Z’|Ã0F�J.^“EöåÆ�3d!ﮄAç!Wï³�ß™lãOóO¿}“ÙÆ£ißg¯e¬û}Âñµ`³Nh‡AÇFÙã‘%Vn‹UŠ-•ßÿ˜ŸoÅ¡fŒŠ_1$*^O`êÓ±$8ìwK<Š—ìîмö@>¹¼øòâÇ�v¡˜ C_Èí„wXÊj'Ã@VüÿèÎŇwþ°{õòõã‹ÿ¸ã~†ÿúè‹ßÁî|¼û§‹Oîì¾\¬þßx¿©ú?̃Ãs³›Xü_ÿ¨ÆœRÁP¤N=#›ˆXtNÏBÄÞN,ÌàÞçÚCǼžÉ"T3)4Æ$/ˆ �¤Ú,%ºÂGKûløó;ù.¡gVâ³ÏŸI}#ð™©òŒWá3_W±Ý‚Ï÷:Õ5š¬ÖH€uu�Úó=? ½#ÃûÛ«¢hÓm[£fE3!_ód íÖs“ãYØóQ40™Ý­å&Ÿ�¢�^:¹#¤%mLI·ƒ  Ë@�¹-MWèÕÒ•Ïd>“]^ò)ƒÞ6vÒ|2¿‚�ç2TÒ<=)YX /ð¥¤ä7XG]ÍÚÛSJ=ÎídèùN¥ìéIÈ!(ôFs�Á£ŸÄ²´%Ôw|`£Zü ÝD)áæÌ­_ÒƒpK¬øá>É6æáõu³½f� R“ý �e”þ.Atʤ4eõ£/–ÃkW8 ᜘mÊÄ#îR)=ýTRŠƒ¬¤ˆSW1ˆþ�«3² «U JwåNª™?ßë¢¿Š§?_¹i„¿F–�Y›™2˜N7YT<²ºÙL]ÆiçÓx˜rEÔ$G•®–R‹ÛÌ�–{zIW�F³ì0n!¹«5§·…gìB7?ì¶‘ßÎ-êS•?Í©Ê ÔwJªr øle+Çz1ƒQg¤(ã>&¸î¸.X¥ž"rÐç¶oñè)…oºòPUÑɺ<ÔìyÌê‹TZY(•JÍôå¡"$ëh”„k¼›ë@ùæ÷M!(Z×*­µS[ª·¼ºÝþ”ã=å9MIŽ›O-ÅÆ,Q B‰Þ;ÙJÒ7;²i5M_ØÊaÛ¬ …´biÒóÿH4=B> stream xœí]K“· Îy“c~Àä”™T¦Ã÷#.dËv’lK›*UÙ>H–µr¬—mÉ–òë�ld³{fvg%YµÖÁ­>@�`ëÇøŠáŸôÿoŸœüí¶]�ý|Þ®øêßù釓Oxú K­W�B oøàµ«Ó‡'<µ÷j0Žñ•UvðË““¯Ö§5héŒZ?Ú@e¹[·Ù*á¦üúA~ùl³ƒ0ÂøõËüò~xrbýxÃoÓzËA©Åz ã N+®×Ïs—Ÿ6[6e¥¶¤é·áIèõ÷a ɬ]ÿ ¤Y/=O/Ãè‰ iùú)’écôúÓ�0ƒå^®?ßlù œÑj}{cÝÀ¼Œ‹ôÆÂ;èΙ×r} HÖH¹¾q£Úµ-«´8¼œ).-]3¡ÊÒÓ‚€P?aRhù‚4 +y:¹À•ûæô_°wÜÓ½T°}§`·¾ØX¯gv}3?] O–ÉõÝñ]¨à”æÞ�#B~Æåû̸ݙ&Ü™²vÒå,®ÓÀ.M—£ä�yQ3'0TéõÆN±·âÙÀD é£VÞ<ÁÙÝ�H—õ0RÇ¥&£“eGþàÅttéêÑŒk{ˆºê•!~Y „d‰3úChË�²8$ •´vðfµ@¨ô.nû§ÐU9edOg`� aÖ¾¯×…’Þ`d ãflŽ‘š[ßÚ ¹Ý×X‰ãƒñbýáf 2†"¿ƒËqL%VyÍyPqØ|´ï[;HPu‡çÐE8!Mêâiøi$ã�¸Ö¦½Š6$ôâHç™°½ÅàcîàQŸâ"-œ£õr+PQkµÃ†zàþ²þ{à±6±pÆ`û„éíŽî�%,möC ÜIΕï£ÁâöÁ®¿Òz %ì.Ò”›_¢|Ða·Â²(Èf4^£qôxíëêc°{á4x/uÀzt@0Éß/ˆò »‚gætÀÔEoÉ–£�EßÀŸbZw%•óxš¦¶¿l´p ÷*W/x=¤Åýìs=.¿Sç:±£ò ³;ó`ìÝ]‹–yo5=èl³ƒ V?7ŸÈ|MKÚîs˱y¦(¬x-PBmµ Û]b¸FYš%¦رÕ_QšØ ãNt5 Œ­bäÄ5÷Ìó.%2P] �­Q½qAÉé9Æ…ÿú§¸ ÛS‹±Ô²¼øÆ@ßÛX´E¼Ë�qX�,O3•üà“Cä 0X‡ª q 8~ýk¹­TûK4‡}ÀLºêeåÑKTíyï?60ð”C‡:Âv@·ÆÓ)~ÒËî%˜AÑPë5†@pt KMü~Qí©ÅêÙóq!VÌÅ…$€ë£)@ ˆœÏ¦�3M˜#ÅKë˜gæš %�Æv�GÖx}é°HX¹¦�ý^MÀ§{}<€ÀRzÐDYóÅÎáâý=ohoíz×Ũ[¢Ó©¦âÙÊo¡)Í %O�—§U´Ç›-t@¸ÆÿˆŠ‘¤Wœ Îdœ,uŠ´2�À8)r)�202 Nø§Š£·‘I+y�•§Å‰€7ßv‚ðæ~\�Ñœt7Iðš�)ùª¼-zÄëP{¾) †¬©H?ÐÍñ<¨MÁðùÛ>ïä§ÿdàóæðy|¾à3“×× ì;!Y‘�þU`PÁÏè¡’Ÿ©{Ѹ\x62Ó�KzÝ‹”îIÁ�[Áè |cðú®àC½ÃJ–®çïBØÍQÝ9úÏŒXQu˜ï!Ä¡€ŒÍïnbǺ~8:Ô[¡Ñ¿«�>ÌR‹d5±I:àÀ†ø|н]°' þ^ƒ=À0ªTzcWpÏÜs÷\Á=WpÏÛƒ{@„®àž+¸ç îyïàwt¸Gi°—ï:ÜQ™Óòp�޶½�{Àxz#ÞÜÓF -ð㋎Üç“üôeÆ}n-â> Sß¼œøµGSOê’ô״7ðÉrÎ{Ó‚qàÄ ˜?D•‚]k÷`�?‡AO„Dˆ ôdÔÀ˜˜ƒž€ÛÖsBg´`ó­àÔ 1-ÇjT®•!'ìA8y›�’`p"¤©v¼@޼{ÑÕ²±Æ ­þø™�í)ÙúîËrœ˜†Ð[²ßÔèÿ˜+â^6Gv8ZUU¢)jûíÖ9‘ áà˜RjÍZÿ¼Ž–M¶}°­Ã9¤I¨°ìù7ÀÖ²ç/hiЂÛßDN{šC×�x„csÇ­>¡ÁÇ2Á+¨}vï²Ts-b8\ø¶êÒ¸”Þìñv¡¥=7$¡`¼öäv@2’·'$Aá‹Ë‚$3ÈÍs@ÜPo/;t ”Ý’›Ÿ[œæ ‰¾<í€$Ì0+سxfâ´õ»ðõz/’<áýðˆÊZÆ#êq[<¢±ïžŽ‹ë ±| ]ð°WÒ)xV<§—“3µÆ’‡} �k¨DBßÏgD÷;ìë1àá,È?XôÆ*ž û�ð8²F`¾5ýšYW,ÊRH@RV­u*žÖb˜;9ìé‘/¶ë£"#8ÄbÌ«Z(·ð¿¡uë‘u†ªPxÞáQ–[„�j3…‡SA‘à� ‘b_¥�êM21•´ÀÇÚQÀ¦Ú{AP ¢SO#O8ìÃ…`ˆ˜ŸFÂP�ûªhšÈ�‰þѤ(̃h ˜Â¾^[EÛŠÒVµøf4ÉŽj%9sÚ¾„#Äà§¾ïPZÎ(è~U\ÙÁuª$fÃÖ…* Cܱ~•ÄZê êD:âÌÚëy-Qx¥¸ˆvrÐ8�†šØb»ÆÐš‹é ‚JÜ ’ù¡¾g|¹4#Ð܃†¨�RÁZ ðÖ)ĸµ�kþ‘u—¹÷ÒÈÖ?¥…מ”kà°RÀñÝä¤p õÔË€ÙaÔ+�S b‚n­r0… ú½Ô�˜^2 wòQ\Lðíp¥‹Ø`ƒtŽ.V­F‡˜ mð€¨a&ìšùVØŠ¬1 éÄL¾hÖ£�@¹q–é°/ÌÏD!º8#×ëâ@Ðlff‹…M®õ-`Í%=$27ÿ]Ö×°P8rk:½à—�›Æ:ÞæˆýÖtÒÔo×o€ùëù`³u0%W8ÝÑAèV½ù€š¬TÒ¹Ä7ðn¸66¨g©ºÛZÚjïr%suœ°"$|—±bðÇÁNj¬xëÅècX¢0;÷¸ZYÐuË Ì@K~zãäô/»÷ߨy,û; ¾ˆvëWróCv;î»Ë{€¸ÃCÈ>O0²CöY ‚…;Ðvô%�¨È®.§9Þ&V¼}Ò»¥¸(gé§YkË¥¤�U^î_P‘Å6˜ 6pqÐþ.(ñ>ÚkCgùõö�º÷EÔäED�éQÔJÕÙñöõ`‡ çø ŽØïs¹©ªÚÅC÷j¬#<ê^�õ·ÞøÉŽéóïØ4_ Ǿküºâ$?j+Ÿ&À~.×ãÙîm¥ÈòEL¯x×_ÀE’Éû ºœtdñî@sŸcîƒ"M®QXÀÍ ´ª¸·–©Dϸ.îFt_¦ w}£kòl·Þ"+J ;ü$(Ãòãær±”€{1x‚Ưë/—4P.óC¹òQà›Å¯zq3ô$0*å_Ïó²Òò-§æ¡�œÍ«±DV“Ç{aÉCnœ€|üˤ Ï!®Éã�¯tÓ«[ÿVÙRRG"iÒ2v ‚u¬ãUX-*š˜¶ z±È”;‚–ùûŽ®k` v5Eãº�‡n9¨cÇ<—Sq#üžI�uë•:å©fÝ­R*�E‘`Í/ú¨i„'Å pûX·{¾òA”�ÙˆìWH¨,€ûÁôR>9�7e}¬€›�‚s�´©°÷GÓÕUL©—äeO“Ô‚ˆ¨ÒV¢Í­Àí~]ŠØÏ _‡ä®Ç¤Î5W³KÇŸ–Ø…DvÊð4隘SÓBU«ía…ªx¡Ó»µ/»ÆÊ½dZ�ÖQõj{^c7¬péfÿëÛ³q|"EM²ô9jo›¦[[%a�ŒOÁØàq¥Î˜]±Š¤ª¦7j“" ¬ ,gƒ_ç`çkñ0Þ'VÖvUî “jrðlöZHçÄSvR³‰¹iz[¯�j·q}õ¡1½ó[ž>Nµ 0ÛYñŠ4fƒX÷€HÖÆ3d‡�~#)ÝÊ%éz¡n~ �·IÄ©ï •w!ÜÉ)÷¦=^nÉ…ã¹¥ÙÕ^nné Õ/ã2;íåæ—ºLÎR2.Íj�’èé®vnÚ[Gœvfµ½üÒñÒZ³«=<­uÈ´áJ ¯¼—$VàÜ̉ékùÝÝ£eÁGØ|’o¾ÞÝ<â´~rW$LÑÝ„w·.µ½io0-ø¹è� &{w{á3ú¹Ì†½±/ÄOŸaÞ‘O]%tÞ°Í{Œii ,×KÎÜÚè~ã…øg¯ã¬ÂMK¡ÿ£Ž'X‚±³ò².Dê¦8‚ð2ÜrhfÏ ˆˆ³—’ ÉaFB®åÚ [q|§}s³+_B�sæÞQD5¹kjðîÇü¢)We9½3Wd¤{?n—;t¶ ×wµ5Ó¬1Í£_7wágZÎô4Ó\'’ªy8¸Ð% ½Öñ|nd úy~—�gÒã´óî£i%^ÑÝžž[a²»ª* î8Ä/’§\UW{y×§S�Ó©%Ÿö!û.s”\ÿETÂaé;ÐÀˆÊLê Æþ,ÂW‚¼‹GVAøk2ÎYõc�÷â+TÙtmÉàõ·&öpD[hr;Ÿ÷×–Ž"nªÛE¤(¥_*�æ âPàHü <¹À=~, Á8n²8ƒâ’ne¬‰] q`:ñ).'‡Eª!–ÊR÷¾?ÖýØŒˆ, –ã³Å1ã¤;ÞcTЂ‚ ]X¶ŽkTebI>„Ò ÖáRx[4�†æeDÚ4'5çsEiT?¹ñODQÎúÜ� >8¢ƒž ΊÕfUISAûšÏ;$€°.a€CY�Uº“û¶XH眓ý/°Í yÿË2UŠ& §fæÎ:Ù·1]àÔŒ˜SE Û3Z8~ÅAIªªäÃh¿°ú<ŽkùæM�ä’f!ÈǺ>�~0”­lOr=µ Õyà£e.¡Š…sFÌ•ùõ¬óDËuŸ±Ä >*%™]ÓWöfr�¥Mˆ<ßµ%õÌŠIÖÞ×DR8S‡ÔRA}(îE±0Ë'J O®åï6.=@r*¥ó%©t³_2Aï Ä¢%ëjÉ= y`d¼��!ƨEýzÅDö‹Þý½VI ÌÑZ6Ÿõ¹ £9+• ¹úíÊïˆÄ†‚[gº|鯀7¨5RÐ1^e ~�zÆo*”Üdkö–b�*Ý»\Á_ðŒ¡ã¤ß�¾»°»îÓ?qüÉ“ýÏu,‚ÅoŸ{‹ ò^äYÖ½f{qò* ´Ç&ò Gó?9~=&y�Í�ƒm¯_:yp@›A„“ÚcARúÄc]¡øÉéÉ—ðçÿ™Å�‡endstream endobj 48 0 obj 4665 endobj 54 0 obj <> stream xœå]m“µÎçKU~Ã~¼«bÅè]“opvˆ&8wª’|À6±©`Œ ¿>ݽ´f4³¯ÚÛ+Š*n=;;jµÔO?Ýji~\uŒ¯:ü/ü}öêâÿÙÕ‹Ÿ.üÕ_ýçâÇ•’Æ0ç/¬|p}Ç„µ+«{Á:‡¿úøÑŇ�¯Þ½}ÿíŇ_ñ‹ÿŒÿûø‹køóèÁêw­ž¤§~zñãÿèBË«�o¡q W8뵫Û_ðp¯XÏû~e•fÖ­n_]üãòæ îSÖô—ïý''.Ÿ—¸»|{µî˜QVj{ùæj-˜0"݉7¼#7|wÕ±ÞŠN›Ë×é†o¯$ÓFjñ¯Û¿\<¼½x‚ŠˆZàV­¸é4S´àþÝ^ »õ�÷šqQtý � äµ6ö³—}Oûé¡;¡.¿÷}ë:®r�._] Ö !ú¹¾ +$síû&¬鋾]_)¦eoŠq{Gø'øÖöÐß8€¾çt´¿É¿ú.÷ýõ•„©ªµ*~—ž6§©¤ÄÞZ 8sª2½¡Ët¦Òá&¥· £Ì•»|‘oø:êŒ�³“YqÍO1àJp¦ÊŽ>�@I:óº2ºZr= ©±`­—Ï|GuÑå� ¦ÍO1 0p^�µ}“»ù}Fžÿ^I9Ã%énÚ¡98†Adæ}â}ˆ:ËàŠŽq�H0Ö_~†ŸLßÙËGéÚMúôeüv#˜*¾£KÙLý°Ó>3‘–„L€3Œ1Èä!ܦ�û&;¸VŽÏëÑœ�7B]k)µÀIJ¥$VP@v18*ë+œðÚP?�ˆ +À -Âð¾ OÜ‚�U ¤eÜ,€ÃFk-%�;¡¶‘r kéü¯¹bðËç;ÅÍ"PšŠ BºS@®u¨ð½K`Ѹw²ëüè’ÞýZñ@ËÕKœ€£µÄ8ˆÄg^ :+!BQ¶Ð1ÈÁ£µœ<6˹c¾-ðã‹-‰F‰D•íñÃô=âôøÑ¸w�lÐÞmK6JÔh-ç€TÎ3D�ÆJ¨±4XÛ¡Fk9ÔØB΃)ÇûPÓëî�á ýÓCFëÞÊA{w åh.q"ñù�Gk%Dð JØ <šËÀc³œ»RŽÏ~¢ÕCI_k‘#é#"Ÿ!6ÖB"}‡\ÂÃÖ"G<$"ß%v|{Dü|/R(MÛ­6ÎáaZh˜””¿ "Ο<‚X6œž¢¤Âû¤@¤“ô'4;¾yÒ'´jÜáHØ&Þ•°µ–36"ç"Tc%DÂF”p(@µ–8F¥Dä;¨û$áÏG®3nšâ�uÞá+v+ £){NŽ©z…ã0/Š0ÿÆ«’q© ,ýÏøÉ+vaÆwF¾`§ ”ð©±B">…ì‡O­åê;¨œç¿rÚZ)¯ˆRÅ«Öõ­TâS/,cÕ.ÑcgÛš4`•ê-ëîV5VH(ø  94ðk-q(ø "ߨj¬•[GÇ[­%4‹Š|&4k¯Ü¿êEÛý@ºœˆÛιZë#°,¢�½HVs1’EÄ<°j­“VY'bUs�‡Z"ðùeð—�l¦ìpâgk 3Žñ{d�õ)XÖÇ� ¬¹À‘�e‰ï¦5VJÄ´ƒG1aZk�CžH|~ ö¸j_ïÅÎŒtmAMa4•ÙA™9·^=”�\Ìw�þH' S¼Ðt¢8Ïã±èƒF¥ BYŒ·CѼ:1é¬ñ˜h1ܬú•ÅÔ3çx³dÊö¦…�æüýüj ��jžÇÆz�,/ëu?–×ZÌ!ÕOÄ<¿LkDÌ:8[ <$ΈÀwæeÆ/KÔÛá@„#m#5m .ðJöiÆXÄ&`AU¹ÅF§#öfWHoö–Ör†ð‘Èy¸Vc¥D¤!J9jZK †H|êýÃ4O«gP8'[nþöï„PB¥÷M,”3àÅïsI×òûoFÞTJ¸ƒèy9Žœ!¹‹¯vÙç+3âÜD›»â\k9�"rž!ƒj¬„ˆkD ‡âZk‰cID>¿(²}Ÿí}¢k¼£ÉCï˜ü @_ceFè›hsWèk-g€>"çB_c%Dè#J8úZK¡�ˆ|èÛðò,Õ™®é›îÀ|Á:œIݾ½Â“ªµØ¢ä}-ñ°øšç;ÿ“XúÙ H_Hž”ã™ôò·8ñazÊ#�Dî¨DF(‰´Ìv†\|“jYø™·æ;g†®rüG1w'î‹«áànqAü—éµ#/z˜®å¥–¼Ûm%GzK½ÛxH•ƒéÕ‰UH~PœD2Ñ1k:nâÍÛVJŸN<çºÎMÅ-ŒÁE9'ùk#ñü§¯§×šhÏ7Qïú|Ä{\ïë;o:¸¾‰QúÌ‹÷x³xà#x¸¿h£=åajìIºöyºÆÒµÛR·w)ÞgÇo­:Ÿê¥=Ÿ%â°TŠð>Sel‘­"{³j¨Z»† ,®Iiÿkü(]H³”\¸ÒÐ(í5Ù¦…?{ŽOíY§Eõ©™�=û{òn^Ïä~Øä> jZ壅pøÀz>s”|\ ˆýðí³“¥&!za�¯Ã3²xle×ܘ« ãeÇ+ gFìBq ‡S:ÎÑM®t-¬a¾�á¸àß…¶Lu…~†aS0{ŸOš.1`ž£û'  LöŽsš¦{=Š‘’ꇯ‹„Nƒ’aN|€"w0ÑÝ 5tØw~z <ŒÒôy‹aE‰øÖÕ@rç¨ÂuÐ! ‚_$;«ìLDëf„”"WaÔ èyzˆÃ“]ùoKƒr¾í̲�[¾9VËø¶n±±uÿ)»¥FýöÏ·Œ°\qˆÇï·þè >âZ÷{¹å£õ{Ë–¿Ï;hüAÙotÈGîwÉTrË×éZ"\ ú½¹õ›cµ^é÷M¥åÇî÷ZéŽq1:”äv1è›ÙSqd`Ýá8”“¶ÜÒG­çIØÚ–CÔ»k¹µ3YŽ}OÝïëã÷»Òòl@}\P]„µQ¬|8_…[ö{9Ê]lÁ3eÔÓ=ñääéÙ;¾„¯Ó=©fÎΘxìAI’F–¿ø¼f'\ñôÊaÂ9Ð"ç˜ ib§}V"øÌ+¡v:æÄÿ¨á>‡ÈÛ-ù@� ³¼Wj;ˆ�´ªÄ;9\U*ª¾¨{ïx=�§.ž£B )“Lr!@”¦KmåÌ “–R™D�8k°‚[¥‰GãH¯™ty‰ÁøË…Äp?±M�({PZg6‰/&Çôƒâ:¡½â ²6©À¾\Q¢*tÚ‘Õ‰uÐ1™lðxe èSWgÿD$Ë|¼OuÎâ#q Ìy˜sx+ï4�ôo±Mᇡf�3©$å¯}¾L) (ë˜(æñ‰–0•ÀºNÕVˆærNA9ϯØ=| …›í^|‘ õˆg@joê-¦›.2¼ …LƒÝôþôš`8‹�Æav0̪R=$t`”{愨åvòŸ þ¸0«j'fëp8˜NN5YJP*’Vq­£Ê\iVÛRŠ&ãóð8ÞI]sù¾!eÁŒXá8¡)Žùcb¥7ƒqÄé‰Ïyšìe�³A½›ÌºÙR„”½#¦=­IÌ>bp›¹“˜´ÂÎøJÌÒºžqeJ9ÖB÷ ¡>剥�ìb}‡Ü©µj!wêS£Ð³ŸÑD�ÑsoÀL%8"�H€zŸ ÔýlÌZ[7^E³ª• V≙15‹ïãîÎ¥(ˆÊ3€@E§>°o€b~$~BΫ ÓÂDd×¹Þ.¯@ú{ ï#É;2±Už°ÒÓçY¬úFéªy_ÏZ¼ T"F˜&ÁŽr}q õÍYyRþóŠÜ�؇ ìÕú¦­ …šÑUƒª|ã$EZ ØCnJ�U™ñÚ× EôRžw”B`Ï£1’6Z¾MÁ«B˜êÞçßã¯z`¶ÎMYÅÈ þ©à³€@8�‰Ž"§• ”Ó.q ,¯›±IºÑ};<Ï$'±—,×ÃÎDÉІñÆl^Ó¯¿§¡bWór(£¥—C‰œHº9�RñÂgVŽês|\‹d ©²ªle5›FjŽë¼qÍ‚)PÄBÃÐj™ä@ #çG»+÷K %…¾ÄíÎ F2!ïkV7z5J*K”–‰…U­çÑYT²¢ãu+¸ÓáA㤦4ÀDeq|œ™‹Ê†ÒϘCš 2Î;-ªç§ÅŸ£…†$vž8“ÊÒNGÜïSÐEôû®˜ñÖH±} „™~ˆËÐboÒÄn¾tµP#Íy‡§/Lèi­Tx±ÂhG’ÕÕ·Æ,ÖËܬÁý'µ Cm)åNÍ.ÓÊ£4[«IÅZ£b½¹ºçà hcÅZ»Þ.–«U›uÙÛL(d'HUUu}¨Lœ)Á!—%ç]"c–iRÁ›¡iæz "ËjýͳœV ¬$I?ƒÓÕƒöþ7ÎCKËç0 ã�N9uð"éPF5Ÿ”B ¶§1‹g5ëFZ³‘Ú«Ã^ìãJ ¨2R]ç›ò�Xà7Æo}Ÿ¹È$Ì~äMU_i‹ýDŸ¥™¾N³ÿãtíOéÚ'e1ëìîÈòDR? 6Õ,­0ÓmP£JÖlÈ¥k×éÚ§ÄV™%•Ù2 æé¶ÙÇG!#l†Çu÷ä”Y—®¹Åä�›©”¨Né¥Ä@o{ÅjDá4b_%¡òÙ-¼tA¼®>öDB•Aa""®óΈ˜ú�··gJWÙ‹tù×ô)‘ÀêÀ—™Íi½ Êìæëœ™�ÔúùTB ž”ªÞÌS·ÛΖé`Y·Àì-–ˆ¤rÐUËjÌÔ)Lâ»P;�e¨\˹¬ÿ4½2ÍÏø¬C‘«'©øq¶ .oÉ^„¤-¦ügNy‰µ½ÏŠmˆË,'ÄVÚM�¦ÿs Éo0Z(ãß·©Ü)x 3ŽÌü:�ÒœºÙñJ Ý‹´µ,¨ÎΨ¢±aex±âº7hÿ¦™Më±–½<>¼|?,|+`Ió‡°âºÍR–�¾@¶š¤®ÕËL –ËhN® Èãd¬™””>å ,Ÿ¦O}úÔ-¹¬�¬›2AÍžš2¨ÂÝN-Ô�„uüo‚^ c%·Vˆê̲ÛÖ¶ø6 â ™‹£ÞÓôˆšëÌLòã;:ºaÍzTôŒŒÏšJ©ñ@¢ÁEÊ^¯ÖX¦2h4«ïðGø<¹ø?dÉVÀendstream endobj 55 0 obj 5559 endobj 59 0 obj <> stream xœÝ]Ù³Åy'¯×¯ÎûIžÎ�9£Þ—`\e J€bQbW�@ˆI,’Yò·çûzýº§{Îé^CR®2Gsgzzº¿å÷­ýÍ�-üÀðé¿÷_Ýùоøî*\=ðÔ_�®¾¹âé,Ý}xã< á _¼Öâpï¯W<ÝïØ¢¹÷«ì"à/�¯>>~-ÕbŒ²ÇO¯ObFŠãw×'ÉÍ¢¸<>¿†a”åîø$ür¢Ügùñ³|í«k¶x+˜6ÇÏáafíÌñÙõ‰-0´ÔöøÇ”‹’†W‹õÒs¼˜‡"#ü §ä�ña,n¸ßž†Þšæ"àÞoãË`\ü¢^&Óyr-ÅÂŒ5é«`Þ�¯¥\˜‚G>ƒGÜÂ5sðˆ\´áÊá˜RðÅ™2Uò¯8$¾‹J*2ø'×d¤åú¤üËËãGy¤2ã0¶fBÁËÿrï߯¤‹@2÷…Œ¾‘~Ø—uB…FêÌâ|àNøÎ‡ÜS„•×¼Ÿ`Œeòøþ²œóãÝríý|-ÓÒ·P‹rŒç‘^-½Ó.Ì1æÖ¯ý¨¼öÍrí½Ûí»åµ¿/×þ|c¯=) ’DNž¢¯öÚ¥/fÌÿ³\{7_¾Ú!—� ’€R-²œ®u6Q-Š©•ÿ+O<€g¤_$×T(&ê½òÚ.Ö8áÎ?ÅãSÆÚ£�B膛L*Ýó¸¾BNžOviè†ÐH‹�°ƒR ¯ù=,´°N:*&aC¬Ž£”WõÚgÝÞ8iÝZæá�ÏV”5zQŸ&OÄÐRm�ÄýrmM´a褔Œæ- é`XÕ‘€€{½à�p~XD;áœP&3®ÑšuŠcz¤“|†CðE�f\ëà,€…€LP_â*f'¯Ã[A`çè½í›ÃÛ1RW�\|°ÞŒÇ�…ðïLŽdáî×—?¯¬[9/üUª‘·Ä-Wœ‡ÍÀe¹u¿ìPsgÚY†ðem O¯á=N b HZZ#*ij6)]–ÕwãŒ(¡Ä§#¿0”�HKÍa bIŠ$ý¤#Å‚>¯æ÷E�|õì^½¶”_÷Ë_¿Ûüë§åÚwåZw_øõSùë�ríʯ¯Ê_Ÿ—_�ÚÔ·µû¤¯»ïùõ †F¾Ì¿-¿ž–aâ�Æ1ÄIùÏ_–_OÊ�Ÿ×» ¿ÆîÉ8�˯¯ò8CMpmÞ ¥ÃÂ�ü¸V#€ÞƒÝ?œP&â3 ¼DŠ€ €$àÃ]2¸“ Pžú±Ü«H?R9Ôû%þV _Iÿ€¿5ü‘zÂßè_´1�ôÚ¢ŠÅœ42‚v³xú1^µVðÀÓåŽôr/|ëàÐn ]`\.,Ð~¾Œ½�ñ½:ÈwÉa}¸�V†ÿ8d­äôEOÊ@ä"ýÞ´"Bˈ`\c@‚‚Š´Æ›æÞ§á Òù@AÆÅm 류°ôé»90%~|¬ÓjŒ ¨NÙ@â¹}h«us3b"˜´6¢Ù‚÷ ¢}§`¿»åZñáÜ€‡*ŠÛ]¯}ÿ¢×ž$zú¼YÛPND]Œ\6šÈgŽÖ}ã6é¼W~Uoݽ|mâ»2dRE-Ÿ¡™â˜’­²�——âcd’�1üt·ÏT޾5ùòÎ)ie'ìSÀÕ�çÉÅL zòÞ¢·f¶¼™b¦ˆã, kXŽ!”Y bæ�4ƒéVV€±= iÕn¨ "ú¥É ¤±n�½SXÁþh>¡ìÆL(kJæ'”Դ_ã½;ÔˆÔn®ÎódÆïˆìÄ¥fLó“@Ô}$ ã`ÏâJÃL¥¢LAï%CĽ`B“7Ä@ ë�K.<ÿ? XÚ(2çÉë�3™ U+Á™Ï*ÎŒ8¶» !ÌÀ[^«£ë[‰¼¤Åø¬#!”>,è)$°•F¾)rãùúM•wï7b5„í@¾…K�=¢$7¬,S+[’ë¢_½Ñ@°¨yÔRõ‘õd›²àíDnÇÝ^œtÜ� ($ ¼-ß.`tî™[O¼1ú^ÊŽkä“@Fu¦\CÚÉØjC=ÂÁ�^�¾� ¿K¾ð= km†8¸¬E/î0èöËÞ‡BàbCÂ=퉴mtE–¶%6ÔÅБÒÅ*r^“%°Dy÷!WÏÄ6ù�¬ +x8 ¡Ñ.:Ü A%è½ ­Þ�ß Ô30}ä×èer¼üÉ)oyÎh5ÜYÑ`Í—˜}; PŠu ¿Ùž_,!˜_Á>*$4ä"¨jk¢e!®½µu.¨ò@ %ÆŸÈÁÖç ÏÂtÊí¯õÌÙn¨°šðÉ‘%¯b1gàõ¤A.½ù-ß'åÃb^% Íú`r’ÑC»V.ž¬|Z©ôdi‚ Z- |îX†Â®ke¨蹃ÎÊP¥˜�T†J7�x6κy¤5„Q탼§X÷AP%«¤ c«>¼ÌÉ‘ ³t §(h«|ƒ¬†Í¬h÷^ðÛvlþKŒÕmëf„+IÞ+Ê3í‡Z9¿w –‡a Ä·ÕÃpc�  J+.{Ðob¬4‰ÜÚî–8ÿg¡¹ÒT kì†,†a©Ð¶RÞ¨Ãf(†áš‚·À—˜(…!TtV™a„È\FH{ ¸VX×Yœ™P�DýŒ$¦=àˆ È¬ûØsdÖMfµ -ÂÕ4TÒ \± áVK*?œ¦ÂoW\róž�¶z”iMäjuÜ?Ð=Æ¡fXìÎ:ëÚ|–|³ÖÏBôÔmßÍr”:¬ †¥¬k]‹À@¼Œ# Qv:÷"›cOgëjLÉäî ºàÚ˜ K°U©Ô.ÁƒJ ðl:æ”ÝžàQ°ôÉ]”<¿îDhq®éZ<æ¯K¯ZúŽÊWËœ3oØÄÑ3ê½{3MÀV§Ã|$•­sÎM¢ê�[åÈ´&Ú§Ã=P: ÿ›Ûƒa9…ÝbApÑMx>ÔŠ�ÇL bVœ«ÉQâ³D¡pÕ­cí•è.�{F¾SwSm9Sr†Fë€ëÒF½_ø¨–Áö·½œ &Tcùû‡M×Å š- �ïÐ^“TýƳ¤‚øAŠ0HHnè¾û‰¸ÝŠSzÃ]‚¼n‰¹Q,áI 9þ’‘uëµÕÁ^ì4à%Á+ª-oµ7Ï7¥†}ˆnJVRªXçï ¾„ !óïÀnAO›ß—¨5Y½¿?濌e ˆ <*ÜoCÐßo¢NñŽ:íÞÇÜYV¶ �œõÙ†�ÜëTµ¥¼ñ—úlÿ_™�7�é·&óp-W€iÎ,5Ã�'8_êÿ+ë{ûq˜™€»k¾çj“£ ç¸ZœáêÀG=Û)5äê o�¾£͇1´5- �Ê åí$ª1 „:ÛžËÚ`n©fÊ/ºµ䆥+-âŒ2ucγ,5ÇÚ‘ä›G5OûO×`ziW«Ráà˜$fq_Ú]†k—»3Á #˵B6\LŽÀ?ïµa_ÍXÕ_d¹¢�Ùsq‘Pj¤‹£ì·˜N D K²­>¹Çt»W}r m0Âh¿íã£}DWÛscþÌ6"ª^ïof7‹ë`œ8Éû4Q %'cCºa�–VORtj Á'4óÄ·PT!iÉt˜&Ih�m»Š>„è ZL NÂéœËSí·d¦«ò�RÐd¹ç”‡cºØØÇ4®gò8ÍÚ‘‚þSGÿ¾æÖÝ®•—@D6.™p‰º(�Ã7·ÇfÊiû´Ö*Èx†™d°ä©/Ç€@æ}r´4€Áb^W�ØJލ>Ö;—´·±øEjÛÔ)¤ îçś҈Vg#W)ÀÚ¡Sqœ.xqü­7h1ÅÓêçüØ�ö\O�œ"µž%û6÷†6Ú—Ôfíߨܬõ(éw#­½¬ÚÈ‹Çp€Àò#^5ØX¹9ñ`¬nà@Á~”ñ™Ë2Ò kYÑjäç¹P˜}h,9€¹~?wé-›Fºïí¼×£vÖdM ÓjR,’iTóÙÚâud¢®óOä8Ž•>2dîHˆïT¤¨~„Kmâ^í\«³¨ã%ÖʧÚÂÎÓ¥‘µvÆD8,lâV ý`}9¯ãë�/ÐäAÃèv´˜öÃÔ$«@�*`‚“t^²Ý?ŒrÛS 9'Ž÷ÇTïåíäHL3Z~·î -Þ^FKnNlR“¦´(66}l2“6ºúÄNÓÀÖ/+ÆAœÓÃ�Œe’‘r4 U’¥˜KäÔP«L-&™ aŠ%hnÕë{©D‚�šÔ\ Si¦Û&¶ž¹õíCÓÊÁîm$$�woâ"Ê)¼“¼ÐôñÞ[#¼AW7|¼¥n/ïÁØùöÈù½ã¤’&syeæ˜ 3ç—–_0tw�Üéœwu�±»–Hí®Jˆ—Ýþ®bŽ›ݶÞuzU‹„G§ÏÁÒ­êˆ÷uý1è삪͉EiE‹®†q9š2Þb¶lNêuæ6gG$ñàéªè8<ó¸#ê†FNÂè\n\,ËD'zâIýƒ9¦óPpLÞ-o çÝpÚ\ s“﹬˟:“©Bš§5þ·¯G¥×“úš¾êKèó9‚q2]Í*‹FošÏŸKuæ»åW×Þl£NÓ·‹€©cûŒYß½”[üóC­°¿ˆ×áEƒYr2Ïõ¢ãø/�NÐnH¹aõîB…qÐkâ\½c(õvþ,T~#ŽÒ¦‡#DÅm‡yc©ê$Õ謳nÓBoSØ›~! ¡G¿7ÐV›¶[™ƒÉæ+µ À\ßæ®ƒŒ kr'Æ>mŸ–kN“ö7=×IéA�½ecÎ,iTz¦käâ�6yW5’-HªÚ«QuH˜1ºÃ-ƒ¹™^g)ø‡mÍUX%îS}ºQ ÷�z€Q =©)$5Ÿ÷S�‡Q]_ßêe ]r‘ �8•ÏSd·kØÕ9Ò=aÂiß¼bdv¡/÷)~™\°½ãMº•Ë;/Nó’Ž®)‰¾kQrŽF»èØ»¥uå›mS„)‘ʦW )I¬µÕ[Ñ( X-Ug¥I/ÎdËÉ ììi´i¡»¢Q¼x1‘J‡6Í -ÒÏC¤ðÇ�ëWþœHAuÃFˆ4†ê‚SÌôU·îö°·L�½ÀH@X\T­µðW.ˆ„„„;¢·K+–�z³ôŽýh»ܘâù,ÐH>ÔÁΪÍc2 öirT%¶œ ±Á„!ºjÐu³íÄ�Ñ6m��i¶™¶Ý$\L\Ö»Ôfè-ÀÏkM!z­I:“T­9ÛÑtÕÅí�Kú¨&:á%¶¯c*ÇÇy,Ž×ÁÓUN:<«¨y§n óHN¢Ý×.Ÿ=ȱ‰xëÚð‚U!וͽtXV=îg°�i,�žo ó•{=l35ˆ× ܪªG4Ò¤Xw·BìŠ3m&íšbwœ°›ýÕúü‹(4¯×ö‚¥Ÿ‹ž»©b ÛFV{Ó°½ˆ¾Òh…V\“ä•ÈÖB$Y¤Ó𔊶p9 ¯Vo–Bäê±¶Ÿù¤;ú%Q»Õ^9Øþ¾¥ÅÖ^éý Ã(]ü̳"sMçä–D>E‡¸sCòêjÞÆ�-PðpÎ¥¡Å|Î}”Ö¯Ø%Úª6çÁŒ»«ÌPY¶ËX‚›œ(¢›–?´½Öˆ~ÿvQÛ:´ç› �³jÕ³l&œÛ:‚ší¤³n(ÎͨØD+ž)š�7`"Ì11 ˆ8,-5ƒNV5(Ò7¨iC�/Ýä¥ãˆ.ûnÕm¨ç Z‰~Ië€U­@O¸çJLúZû¶-Pi²i_0ÔºJBo[f��þ¹®F.ûV€_hÙÅŽd{â`Ùê�†Â‡¬ý9†Š%žû»´óê´6jA×%}–zDr•„²³Žl#k¡ÊPÙY¢ÓÜPßѨ¹ˆmú$6Öï½$à–º=ÆæÍnàThÚ¥ LOSÚ äLj«r÷à »Wf¦lÑß䜗’¯xD Ò6}kßÂ4¨æIßÏTS¹£ˆ´mE£”öeyƒµO3D#¼Ð¥©Ý>t1•ÿf«Í€ÄEJÞq¶Óçm6ß>n0Ž´ý%þVáÞEFÀo)Þî�§³§á¢üaý BÙÑ:Š‹RÊ$s 6|ø;x«ò°#“�Ü ãFˆÞƽçÞ¨uÈIÆ ‚6_ÊÅ0H5qà–'§7çZ,ü‚�¼xT'§u+Í&/ºOpHk•‚S(Xåɺ‡“3ƒ¦¼^•œ@öœ\¤•Á¤‘�3ݰ¢ÐÞ‡þ’ X£{­†s} ;¾îÊ7Vº§µ‰É9ÚŸɶ§‹ûŒÉÆGÕ>Ž{T¾WºØ‰Þ«UVù ʱcÒxÀM}’J8Ò©z"äPA>òf³ Xk¤œ£-T§ :ÙÖ3¦™��BÊ#¦®þjñ»Ðùµß—Âj-èé(i–T[1B—p,H)�ç1Mø´:ÛâÁ¬l#·øv9VÕ"ßE¥+Ä�:ü¦FöLË£X�Êbx O‹Tºg/Tá,§1{ñxZë ³WÜ=ÖêÄ×:>ôº¯¼]á'Q¢ñP nt9nÖ Åè]S‘ó—ê_¿P¨�®Ÿ}ÖH«‘³[9ñÚvçFUwwËÒQ ;n-'ßEžÄ ¡��tJαÙÈ•‚ÀR–Ï·ù<æcxÖĨr Åeà§mã×…AáM ¡?-÷‘Y>èd…±­Ýoô~JØ›zÑÔ$¾:Ùöz/qs–9mµ»Ëà’z Øt�«ܢ‡G9öMFkÂ#ib[°‡!/‚ ăáMrJS&³ËÛ™E}�rZø®Vq%•ˆÇöHZjì’!f)�Æ$Ðõ,'#™õ^ªh)�Ò—ÖÈéýÁoEY‘#"§ÛµÊ¦¥î1R›KÝÛ¨  $Î}i^¤ÆX¤¦6¯| a VU¦Nöô6Š=ïvÄUo+7©œ'ó¢}•·ì|aørAÓ ‘ö*¦°á=]ÅnÊ{z‘ûqˆ6B½\X¢ÃˆäUþ8÷þ'�ÄŽõ¹{%FžÙ(¼fFáµõ°1ðÒ1SÖ»Š˜X»�*Õ” Y%©VÐKQ (\ ‰_Ÿ¼U¡Éä;�;\ÈÊÆµö<é'ÌcáÜ–«å(|šå E9žêP‘=Àôø#ærT£oÁPp£5ûÑu88ÚËÙ»ÒTCSJœ_¨tFFó “*M/N¹B_ŒÔ¦é£o¯5×7ƒo ¬G�uíoì1×tAëΩ—Ð"¿Àèî#MB¬ÏÛìW9ÏŸk +Yl^ÀÖ›’?aëñIA;½Z…èµÀeÇ„ÍA¦Xd2n(DËšR¹ó_‰K2úÊ”�_ ¸HO¾²äP´ík»šË¾qí:ŠÄ²§ CÌ�SþRô¹YÀUÆJ¿ç]~òm€-ü ¦Îl§¡ÜEÐ �s{:¾�;òŠÑÜ3ó h¶ù]¿„}—hÊ6ì:µ�펆ìmæÑ[A¸ë)s=çùØ]¥P¿¢Ð\>$wý÷õ)œ+Òf´UÁá” æ¼à$*�}™å Hœÿ›%—lè͵’ó6”cã.o~go3EÊ�—Ƀõj©WäÁîY”ŽˆÛk`R„JÆ«aÙˆI&‡rqÏ_r)í"ÜÒv›ËÍdÓÃi`‡§²Ø[ì�á¹@ðL„ÇÁ5 “¶¥}O»>y_6Ö§PÑÎÍùR0f BVÃ=X·SÚ~GÖåöóã_v ÊʪÝ6_ƒ�åxAEn“™Œs¸€ÌLKf±}T ÎS*sÒÓÄýÑˇ˜äRr¡¦±7Æm“3¼�‰·JÎ11ƒ’3–ƒÙãJbGm¶;â*½‚‹¡ŠÂü�¦_ì‹Ssj;¦æúúf‹O ß1™í�jݨõpõ¿÷Ô¹endstream endobj 60 0 obj 7547 endobj 64 0 obj <> stream xœå]I“ÇuVø8æÁÛûÒ¾õØêbЖƒ°%‡hÂ[ˆ:�HÈ FÈ¢þí~/÷Ìʬeº{ËÁrX]••ËÛß÷^½>�‰þþûäåÍÇÿ¬ß~ã®èáÓ_/n^ßÐð?$Ü}øô1<Àá �¬”ìðø›î7d’ÔÚƒzbðËË›_¿¹=Á�‚Juüíí‰MLqv|s{"“šKýëÇÿ€ã±j<= ðñSxþ>¤µ,Ü©Ê;M¾ñG·b2ÆÛ‘N„[ï}yË'f¨¦½1)Ÿ¤",Þû§‹ã²IãŠÃ½ÿ ãJ#­íÏU+BÕÖqÕÙ;@v€†³Ðô8Ýžƒã òøÙ-�˜VœŸáJ—é¬,·6_íÍYÐ<•ïñ!I”q2â '« ¥x«œ$#œ€4Lܹ“2Ìô&¯'¥­²‡tû'HUÌ()»' ¡q2¿‡}á’êîTlôx‚•÷òÉ–'ø78 #a;L‡q5 (‚ÓIoqe‰¥HõŒÉ×{(�ªaòéö߉©zÓP“�Y¤ýˆdâÚpÑ?OOÚÛÏSJ«õ=Ïó[¤]K¤Uý¹(7ñùPWW ã;N–ƒ b÷<Ù¯n¬D“îTÔDÝÐÛÖì8T^ˆÙeSssŽKu�þ ÿõé/ÿþóèï?ºùÙ£ÃçcÓ¼Þš`šÃ{&ØM€ ‚eî?Ln ø~ƒà¾F^x2†pªÂ=qð2Ãt§Í(ZDr"N�öɳzÅ)™.<¨÷Ѐ¡ WY—x`<îŸaÒ» î™ß€\ÆVöÖÌÀ4/6è“fƒæv¹ÿ¶ó8…á¨/oa \ë® °ayÈViuÿŠCsÊÉÀ5�Ñåwæ{ÛÎÃ+8!þþ¿Z:Vët»Åáýz 鮣}V¿Á#ªz⃠áæÓ£�b·6ÐÎú)Ú1Ô> íøå½WÚ!��6,l8ˆ¾B •†iM�V%Áñ²#¢¦5i/.+Jø÷[¯3 éÓ‚òud]ÑÂwhŸ�‰Šº¥UÚg-´!§ÃóA…¨S¶Ð‡†ºñ‚BKúA"¼§Uˆ;mÝÙ9‘Únä޳ج»`½ïÜ)‚‚¯¸CñÈp ‚vó‚ïÝ�ºí2�O½*dÜvnWP^ªwTp?ÚE˜ä忚ûù~ƒ¹PÝ�âÁO·o¿rªe$Óÿç7�ÿzþúV ûá@¤Š-`}L¥ËɃš+aïw8@Ðî*‘üÞÏ9¸Üngøu´�à×UÀt€’Ovµl±Üs”ì Žg¨‡Tñ¤¿<æ ÿñ¿n9¨Iåñ8¸ÊL@Á™ÕÔo–[ºa–ÎÉ�»õåŒfiWέ»03uå¼È6~5r:ëÉ|xîæl÷:Ñ—˜Xô){ ‰gj¯† ¹‘ëߤÖñH@Z0ØDL/�q‘Ã$H! �å3/a±¼p{|…÷I„gS0¨(RùÆ|íÎÅb47Ç·Ebä+ÿn�«Õåâ¥Åìîâì¾¼-î�nO¦Ê„ ‘«ôñy¼5° #qú Râ[qÌò­Ev-ÌÀ­ 3 ðÞ%vˆ¢xË�P‹Ö®ž…LŒ8c,gPo ûÕŒuÙ˜¬È¢ÕI»\fÔ î‘»|HT˜â¯§xDv2¤8ápêJk<¡@Š_ÃE�€2Ñõüqâ(™MD!ú$Ñ]NžÞ5b=¿áÚTÇŸÁÄd¼Óýš©æÎaîB”=Áf<Ÿà0ße‚.h;ϲ¸X¾¨xì|“š$S…Ô¯ºš1ú Ñ“¡<è.J�ËoOÅ?Rœ Xr“•ÚcÁff¨¾´DÆâS¹ôø;|£U”cæ©•lW ¿’ßA�.N pœ!;]Ÿg`ZOŽ7&—éÅØ gW5–„-²0‹I,Bìg3f˜ú cæ¶É,soBmyeˆ#) @g-æ¨| !G½=wDËaÝ~ô RúI¢›¯Jtd‰Ä_‰ƒ@ÔŠOtåE?6Né9\PiQrgeeú¿{ Ä/29_ûÜ‚òôÏÀm…Ù÷,³�~‹ó…7qäËVˆ<*œÌâ°ÂÔB)³i’J¥ÂN÷ÍŸ�;»ò!üö=Nd Ì;ZŸŽ3KQTjTÎ4LÔ¿ˆ×ÞÎß^ª÷JràÚѯQ&b\@'„NÀáe§�<Åð­I ò‘8þ=¬=.˃(ç8Sî*R.iÃå.I†Ä ú<‘ÛËÕøW±>tåD9Q 3. ßêšê†êAîNïÌ2wóˆ 2®Ì#62N´jŸa, =Öä÷Ëi ¼vÅÙ¶ÚÇ� Œ“v~3Èž  ,vÁý½jôgvŒÝä;åñ:PÜb4D%Þ 3YV[mà~óÓ* Ó¹ ¹&�‡¸/°ô{DmƒúÛ„ýb™Ž¢Ë·aÌ?ÛŠP[�½U´³yÐeØÛÊòYù-î¯u3Ó�(69ü¿’Q8£—\+¤§ ˆXGU£Øs2ß5z¦ÆÔ9C�ƒMÀtÔÊÚke¨”w’ÿ¥{W)&Ôº¶ö Ÿ§iDÍg,¼'}=Æ Ó¹Ñå�åvsï‹MZÒõÅC®Þ%ãæIºV¹L³ *q¦°qŠ8þ%,”t?¸@ç¼²­à¦ÉÜ ‡E]CvC­kÂ4aTÎÔµ÷…ǵÂtL‹t³˜g.4KGÒ„´DHòö…ª±A1§f“÷¢¶þ÷#Œ÷tT-’Ñl…1&yWµGXûZg#M›á€UM!³86ÓÜ!§²üðŸ¥*¸Z%±FZ•°»æ>ëÖ¼9ýzWèÚt$S[·Æ0oþ‘âlþ`)Û5…‡Ñ`Î3ƒ(AßBüÓÀ_Ï“#ZF`“ª978³âÉ02²\yÂÍów0'Eàì¶…®�y&7ç*‚�2aÏ7e,úa§Èa1 |§1hv5€œ†Ý¬ä;± ÷ð4ÈdÚÜpÊ¡¶ut�çi�Z+¦µ·œDŸþœ<0XФÕ]{àÑnà·òd´¬ÀxÔŠc|Ü ~ĵñŠi“=Ò×J *"X;R,›Á\™K¶‚¹*ªßæÊtÿÿÌÅ-C¡}má�ö•ð¾˜k£¬-Á\{Ä­;Äm 溶¸½6˜ëz5�¹6 Ô1žk,Pž+ ÔÏUQá<×<ȉ§Ô@ÒÛØë ¡Z|AàèÓ1ZÍÇVtucxñœ²â{W/TS|nl9e�Ävôt=ïç㦢Îý¶qSÊ˪KÅM½‹\%IWæRy+©{x/×vÃ×+±­H üº_hí¼´ GR'a @�e²Ê4w§ÆgÀçj±.^-Îk­ÙÜ£žr“®ê)êë)Ï<¥åhð¥bÎMÉf°,SöýiÉ’úï[Az¡''˜$¾B|Sx¼OÅ}ã ÙJ¨pWìdšɖs[äí΂Z€|&mh…]îr’©^$mN%ï û»ÛÐr[3ñ�ܶž`‘K¸°p¬«– 𺤓�|€ø¹ë$l $QcþáÖ`ˆÌœÇ/5|R˜m²‡˜) ˆ·Ë›l©ÂlE0®„�ê ±Á£Ýªö¹c°�jÿ< �B`°>þSj•S˜­µeêÊð�ÑsC²8À ÉC¥8²*¨Ò®U×Éçoh«tW¾É¼%£, þU ¸òZÞu—áHå×\¼AB£m—»WÄÇÖ®5{;i8BÞ8—“�è•pî5§³2“WœÎ*�¸ìyʪIÕ²“(¼'°Åù³ÉÞsÜ5ÿsq#Z5^nÅ$"°´â ®'˜RಞKXÃùÁŸÔTtáŸø38n ^”h‰�{„3‡5 RE»jÔQáÇJXJOЭM÷¸RtV#Š˜”% Xþ"Af°*ú Nn¡}ß;ƒnßwG×/T•;@JEchiwD ‘D ìJ’]=^` UûººÃ” F€Ñ®É¸Y x�-è9¡&3,_™vP Þ…øªá]/ª'vbÆ,épè_îA¹è”“øB\Xwªàj®ú–ÒÑh�‰�twÉä}«#+Q�énaÜÓðEÉ]áO ²Š%1«±ó~ùKeJqŽËQ`¼ouFÛPÅ‚)¼HËå´¦ÆzŽáB…@™CâcÒ(Ä5úŠ–£p˜\á¹ï¯Z ÷Àî|‚R�ÜÀ’ 8.7L‹ü²„¸b)¸“P”]ð 5JûJEì|K±^2=U ðÿTð—NW­ cQg¤c…÷Ÿàªcñqb… wjÃtyõ·· Q»ÜI:Øzæ�Ë °ãˆÛ nÕào¢EÒÍå­Å¤¾Â|,œ’ñ‰3!Rظ*œñæ¬%ËUùiY¬„ «2zð‚'!�ÄÅêÏó �ÐAxÀCOóÅïñŽ­+N=ÞÁ'G¿HÂ3[ƒ_§¿Þ5¸³Zt”%�΄Q%ƒzúAZŸå,5p¥õÂ)èGéZúµ»$½¤ªA†³lÐÊ4l›­"QᅧÄì‰P­®Wð>Z`; TȲ"y×7&ž†ÈNÙ³¡5…~–¦'�”ŠuÍš|m�PüÁS ,ñ‹ºRL�䑦r¥¼ødE©r§ËÀÜ—bcŠŒÜ²ÖCÃÈ)މóW\u¸fÓÜt^µ¼§Aø•òAÃi-JMÞi6â¼y�G²1ÜN0ÍI…ý*_åy·Mô×ù j ºq È\Nä$°ÝUå_õ�Ýdµö÷ –¡& ³È¡Þ%½ð÷b±rö„üÑ–ë⺛˜¢Û“½ÕÕ†»Šäm¬<Üb•gø'Î�Z iS¡°VHê¬å#Tb\™~§�ˆL*séKtËxñ¿ÀÙI&ú™—Ãí%CrƒŒå‚ÆÅÑ#¤$æhç@$\‡k�_îГÎ<cs–cV¢?3½{np×®;#ÜÁê8á²¹¥Ä#‹Â½ä–ÆŒBEbh!€‚G™'âýÈ|œ³Â£ëÔ¬·†oäÑ?Fî[/Ô$ÒO“ëÕ.FmUЬSÓ½ÀW6�R\­ðÊVÃjQIgÔ�ïdà”$\¼\i~?d$ å÷NÑ®ˆÒ£4pÎ5²…\ãVÌLŒYÞ¯³þ^ØåjÉs-eÏÜ …š§-,sx¤8ËVN(8?h+Ô†Žz¤¬ÝéÂ8Mnð o/Óz±µ—Lº‡OtH¯7+ñyz˜åºÛ,¦ñ¥ëR‡U°%&¢°›ÊH <ÔöJlmý�ù‘gCwP Ww1sm˜…§(_Ï-õÊ”H°ÛYgú­Ó{nðT€Ü“J‡si ø]sÙùa©Õ©ìùzY3•µbÀ]S¡Ä{ÌéöÊŒólk»Ø!‰ˆÈ�æ�xË1oÇÂp5}"Ë÷Ì5™³NrÌP«TõY¡ÒêóTP?°|%@Û’.Ø‘­¤j’šÌbt¥¾“õ¹uj‘oU£æ‚¯Ò´ú¹Æ6"Q5éU�"¢|lcs~gàÅ ¨uVfë/…g²Í:«Ø�ÞH�6ëðOÛ”g¯;Eßf½†Pº¿µúßh­Áêþ4xSz³»ŸÛ‰QŠ=í–]‹ØKäüld˜Þ²²úÅNv[,Í+¹ C}ð~\†­AüYNeƒ +‹e^¸·ª_1u)úU‹ôÛN¢©×¨Å [ŠAÆÏ°�ªGv} òþŽå2“Þ»æ­÷ Á¹f*|”€¿'ïvyO~²R0&-÷u*ÆXMÚùK)ëÂi�s°­çÙ Ä$v[ãÂõ·eŽ8¡—­?@­þñÚw±_ôýû‡s Ö‡0WÃI¦«`JA~SMKhºÞxÕÎWÄe‚á@Ã>È5Ìí›Y_‚«¢ÿu¿"ª°m}‹jÍÔä± ˜8JR�´˜OŠ=M¾5v½–=2Î÷EÜ®¢¢ßÏ{jŸ "Þ—øù‡ Öéw�è�Ô�£ý[·Òw°©¶‘ð‰h¶$·§UÄ»ç}Ô�Þñ¸°Ð˜êaKp ’ÄaÀâ¬^§ ôléÂ-_OwÀ©ãí1å°ÈCõ‹]»½ùr ÅL/½<Æ*®U#lăº*€š��`òÌ�—Ûħ!ý¢x›+pI™N߃Ø.�ÀnXqv=Y×aµ*Èh¼V0.vD–GMñûºÙËg†‘þ¹U³> stream xœÝ]I“ÇuæÉ‡ †¶Ãް}hÙ—‹]Ì}ƒ“æ[dˆl$¸2A .:ø·û½\_fe-=ÓP–"„ÑLUV.oýÞ’Olâ†ÿMÿ~öõÕëÛÃo¯Âoüð姯®ž^ñôXzúðÖ}xAÂoøäµ‡û_^ñô¼c“æÞ¬²“€¿|}õ»ã¯Ùä-×Ê¿½>)e&çÕñù5¼­¬ñðK5Y/=?~q-'m¤ÇÏáAí'kmz]0mŽ�Óo�"/¥�¸;~~râøìúÄ&£œ´îøÍõILÂøP}ò»ø€•º? P&ò‡ûÿkå¾Y+7S°ÜûŸÃê~s-&cóÇ_ãOÆ3{¼~²LÆ¿âïâ@í¦ 5)Çxi‚Õ«³Çû°:-=üô°N Öî&nõñkÔ %]\Üá<.Ni1IáÓ:¸rÇ¿,ï|V69®œ1®ÈÎ?¾––gEÇŠIqNóÑL(úö—×'œ¥€¥Ó�­_/ÇiŽ�êv“ê’Èq¤±à”}3VžÁ F�œ6"½Î„NÏiøzýÙ¥gdÈŸpR@ŒöøýµÖ~ñ“ñ“dNé „YÈ�, OIÁ)•%µs¢+ZøÀgy¡H1'®€¡Äþ�T¤’8¬”„H˦;J0°j8I鼌[&¬© ¤5IË‘Ã`ñ³ÈM'+ÑðÖø[;)åÉPõóÏÆÜôýµTð³4-_MúÓ@hHâ§8)l�S±&ãÖ…|)PybÎÙá‰D >Q˜œ¼õgÀ&ÆíñI'Dú‘ÊëC>zRˆóш¹�Å%Œ*PZÀðÊ3Î!n2ý$1D#1¬…³À¸³ZqŸU‹Ÿä–Þ) �ÉÅÇ¿‚€_ºò|#ŒÜ$cîPÏçÏêùë°gÎGZ"~‚ŸœR6¾1õÃGa�RÂVÆïÃ^Íļ·$(fè´ €­SŽ'vtÓ_ ¿B9WwK æ„» Ì”^ÇŸ™­DC” ÌòcØC.‰0dzjf#¸Ñ8€�|ÒL-³-l<ܳ-·¸qD]>, ü͵°@FêÆæ€Á@ðÍßÉÂë¶×mÃá¥�¤äÇßÕ…ÈzVîÚ‚6sÂÿPÿþûë´¡›­­Š¥åf!ø¤Œ]xç«�Àeï^[3y’ƒÒaü´3¶a¸Ç#}ö<“ŠKÚ”îc"WGâ¨�~b.Óð­×H)¬0"p™UÆ�x|‰½•§ìí�ä´<€ØÒñ�Wp`ëÖéÑJ„24‡ãNH3’ð§üÜ›ísíxä9±6Þ ì%ƒvÎÉ£½Ãv‰#œ„G¡)nbÁô¾ˆ‘.Z1΃T.�£;IëŠÙÑ ¯áËÞÚÅáß¹õÑÕÓƒ/Xé XàÎŒÕà 9ć޺wõú½ß={þÅÕëÿ}àW¯¿�ÿóÖoÞ†îýÛá•«wî>ZÆŠÄ+‚ïÀ× ¸6E닯5ìšegÁª�j�)Ðp v~Ýþõýƒ1l�Lcï:1Å„<çÄÂöŸX8à½ÃçMá༢¹´ãðJX�J|0ÞKàYëp/ÉC;÷’² áb�“|·sÚðà/£$0:-O±Îà¢‡Ç hrt¥6£‰ uj^ù{x…kɆFÌêu†—‰”ÿß"Ňò¸l}’dߢZÑ †Ô�5ìñÆFvÂÌ´^þº@ëêòiŽ%ê^žøî5˜Xv¼Äý Æ*�Ì4†Ÿ ë½HÚ’Bõ¡‹rι{ÝjŒïuVuDQ^}ʾƒvʵE‘p»µ…E k”¨‹LT½�;a¢:|‡òwÃ7 rãçZ>$ÁÊZ‚I¼±‹`gÖÅÈÌÚƒŸÕÂŽ¨„ï& ¬ñY£(pÂl…ÔÊêYˆ0‘_Wäe«!¿¥äh›”}Ø'øjþÕ«*¿{�#.<ÌGÃ�¦x4‹L¶0Ižk�/q lt‰Ànˆj;ìv˜Û¾À..y×E¢A½�Þžoˆ+j~Ñ/ I§Î Î.âs' 4mÕœÐj”„€�ËÑÝŒ:N×' šÞ+°&³ «�ѾŒ(�ÆOÒ\‚ç#ªønÌ# ñð°²…# O>o !Jm&­DG¼ˆ& ¹&Ö÷ó2p¦Q…§á¡A˜:�úŒ f)¿ã8ª1a�+60!9SÒEÊ&-lb›í"f‚ i“Ro tPb³€g§eaäõù/lY!@ÓÜon–¡2 :"Ýò‘ßÁ OiGÚ¸éRo„7•¢1Ð5ù‡GD9‚ ðiŽ*œðî¿¥c\aeñ?VŒ¾å"ĺ5_XÑ5"ˆü›©èÛ‘—Ì�øÿc=ß´¿[Ãén£· a5]"Ù(aM’�b@J¢�ÂCŠßÝe ,“9hÆ'~a…µçË2QbçË5Q.âûÞ-ƒ<ˆ3· §“P—O§IÌiÝÂ6rþDQbž/�òž™6½k3þ¼Ïû–6,[|�ZÝå×ÇíΠÚ<Æ<ÏPJSj^yc#ì)ƒŸÿ<&›ÀÁ$â&#’rõ™Ÿ]ÃÓ >I:[¸ FT 8@ž G7´¼ !Z²’mA;ZÝV©Ô×3îŠP‹CØe“­O6¸ì£qx)MÉø&a¹…ö¥ÅŠG±’œfmÓöX°i©;€îk€߯tJOQé4¹ø&‘Å}ÜbSLÕ­ÖâÏB Ê… ½R�ÃêâRpæV"K†S¿eƒ"Ú©l,­†L)ª)¤€á7_Qüø�‚C®�{D$žR="ØÚàæËN�ešÄ'’dC5¬K"®Ø‡JœAJ]!Y "õ@%{ Yb5ÎÑ8 ‰£J^e_'ý”´=ÄRhíŽï”Béû¹xz´½BF”³Ô"�€&ëxXµ—“•³x™‡]SfEþx 0n^>îÄ:|KÁãñ®¸ß(åá)¥¯­O_t—‡åM]ÆŠ%¨ðàë.ð­ÿð`(B“~±ºÁâ�<ˆ ÞÆ�£.±©¢Q‡âáå�‡®¨}EE¢‘m¸øP{.0Å¥�æ-gÞ�åÝræÝE’ÌŠÇ|Ò&pÀ3؉ o‚˘Q}KG{±¨­ó¯Á¼œOvŽ5¢Š½60ŽfŽ, ¢äX)ç…yÄ!k¨¹‚e›¤ÏèY2¹ŠÙS qžiD63àˆY™H:©Ô²Lý<~| èXòøî5æ¨q˜ë{H †3.Ž¿Mµ÷ê¦(�FáNv27ü¶Ö¡ tÃüšd¢‘ÕF�IRÑ5šê°ÿE—ø6“Øa¤²mÄ爂øäNu© ˜Ö`ü4fuHxzXüµ˜Ì7¿E‡�įpϰLÃE:£o˜Â´§,-w 1N±U,Îc"å>Å- ¦Áçŧ˜7‡@fÙnpdÁo–•`d[,éðl#WŠ3­Ã'®ÃÈâ¹Ñû�'R22ÌWï­´‹Ã‹WÚ áäåJ»—'·Ö ²áä †½Xd+§xKZ:'a{@É+†)w\Jt.Ò«�å©èk¸R±„0V`âåA‡%q[þl`´åЏR·ð ÝBIøpµ\ ýMnòê6jÕr"VyþBA”|’>Ùž/�£¸àMÂSØ?âÎy ˹á3”§n‹±4­e9_—ÄAoV{Wií–�Ó™¼J•\û¨ÕÍÈÊ@µ¤ “FôäÎI×bùûyê଀Ó~uPrb^¢:覗Ø0ß‹žR_É–ØÐåÌ”½elý_£ÖÜhÀ-7«bkJ>÷îÂy\Å™‡Rõ]¦(-²u¡Ü[¥(uóÝ]ÂfPTÆ6,nO€*"ËRííˆ1t’´Ÿ`EYV‹Ž‘4rB­C–1¿_g`Y»¦£X—‚ß6ÀA€ÖÀÇU“JUa�!\ ¡/Úðƒ‚’v2â¥C?AáE0d‰þ—äa}Xîâfy]°?Òù•hV’¸Y*ü¹Ç�ûB’úä-AäY ÒK¡È±¢E.´ k÷Ž '}cQüYO—ep†Z—òS T°¾\�¬ž‚í¶íoÚ£ÉU2èJ_ Ô$eGƒ `#ßá~·n³™Ë`F 3gYè‘;òƒM5��aœkÑøb;írœ#Ðè5W¤hit›Ì0ìœD™`”ÔrÍ\jÜeŸD]ºrs$­Qd•UVÝ.=yлû�”™aŽDÁ°yebÄ%(»d¹|ØñÉç36V½dGKóY6h±œíXøí°ƒoåùy™g /Ú)D" †˜ÚÂÒv„ýe좘.‘H¦)§´ýA_�ÅbHÄ�tY«Y¸£³·6ÂMÍÙ‹¢r¶\îÅ’çyi@EÝf¥pЇœN^yÓ¬ÆÆá¤á÷J „<þ{W|Ö‚à­O–Úßá&ƒ{^j¹Z­�oý>®¹§çº3�Sß/ÁÔ5ÌWŽ-wGÎd³µ'«½ºæÄ£Û*«Í,`Ú íoql“Ψ=d‘]®î Ûï¦î IúæEÞÙ M)XÇPXt›ö®8õ€ºE†IYÄk½5ßå•7ÂdÇÄÔ9dÑ5úìzf‚®àÖÐ>ÎcÅL¢qÛM!i0§4Z®öV«·ú¶„¡É¯‡ ü�­Bç™^_®Sn´Tèø`ö6^ÐUÂêÜ‹½pj“çlª:�ó´mZT”’“³{nppÀ%yYù·Z¢ÖÁÕIŒs%4ª93 &¼ŒjH`qïEÔÐðö •‚BQ ñ^™‘ -âä$„F ÝxaÞ‹æÊÞ!Ô�cƒ§æ•*¦�&±#‘›³|?-…öý^)àV{ÿX²À¢AªHâ"Íø°'ñAÛ£„aàGb›õvèÛ¿>K¹¦VRÓ±6ážôt¸¸j™Y# ]Q.9å!ÁTæRekh·´z•÷m;"¼Æ{·Q 9öêˆjèº" õÿ˜:¯)óv<øfºí¬Ýqïû/¤?Ä^újÌ ‚ch1 ¶ºlŸ•�äS qAùFÒŸÕ¥ïÐB1”5 °è×!´èšÜI ƒ` 1 P+´�UTž™Ø¬C)ºg�šÜ ûÈÐä‹v% ß|P®Îy·Ã¨ÖL×7`~Ø/Ji|�¤×tëš‹ìïõ€[;fÑgħRQ™ ¼ãè2ÔCeÆ•�Ÿ1å&¥Y†ŠW‘ë¨o<º�eõ^#¥cTnótÚéšÆÌ Áš“5�½3äX¾«zQƒÅf Q“š½L,×P„û6X®‹×,°Æ2í{TTƒv&E“¬™AxµÀ KüÍÝ3J ”:* q¨®z*IÜïE÷�Ñ�‘\U›·Òmjv²!`b{�˜?sêí3äÎ,õ.ÌÓT;øëRyª«M�ä¬�V(w7;úþo5rŠ ‰éfÁam‰“AìðÈTÌ™Ä� ›j)DGÅRJ+À¨Ñä%zµ�i…•òú²g`ÝCí ›Â1àÁàÝpÿSÆé‘MIþ[øfnñJªgÁ �ÂaµB³ þY<ލâñeÎDú¸uÂÆüJ2å? ¯{¦}àœ�1:$!‡\0•Ã’u¤7ÌÀ b|’snéêêKÃø¡¿AHa“ »ëä_.„êJ‚ÕoK"i½&ðÓòÓí®÷k´ãH Öã ?l�áwëÅ+¤Êc„²—õ´^ÏÂ]ˆ1Þã{æNõšB™»)Õ‹£fE Ê9åÍ[¢n!ŽÌØqp"súÓèÑ}—h¤Ë:Îê X4}Eˆ,¾¶æÞ‡zR'EBO·ë�—�6ià£H7üdU(e£X!í¹¤Tͯq NŠÙÐÅ¢Ú†ÊÿSjºêWH…ÎÂÅ3¤+냱"§Ük(®7Pšh¶ °ëRkRºß./)o‹¥§7{�.Ìlg¶| ©Œ¦š•ÊRÌÃö•U9�ýèï» tV[À¡ã- £û÷*9Œ—ý5Žä­IÃv°�æ]VÏéÇ·ŸZæO³+NZPîÞoSŒ JéÃø¸J¬º.ï…|-`4¹š ;ˆ?Œ±³¦<Ñ�ÇV�†&w¬ ÊÀ׆ý<€HB©¡mŸoNúèƒ`¡ìkX—/kö"0¯/hH·6NÑÒ´má>U/8•`sˆaõÓiQÆŸ³¬�c‡ein‡„Ö-+ú¨ò|ü/gÂÌ”–¼ &‹-P÷‹YOßß1¦¡l¥©<¸š3•ÑbÀ³�6H{iàg¦çþoªö z\­ )£eùíËv¥µ�rÝôn³O}ù1¦v(×÷îÎI9£‚ºîzÚ¾†•؃žaCTÀ�Ñ^¨éÝk¼—Qè!ypÙ4¬�å4v—i–û1Xp=‡Á,—Riš\V¬¦›¬tz$þ<ÆÊšÇÑĨfØŸn:Ú÷³é—HÑ®ö@? n5� œ�ܹ¤œe¼&R{  ‘ʭܼ%Ä…õþl–ÆêYËàÕu´©?O•⌳@KðÏ6:†ÌŠ Á�É ¼^¶u8]ŸœÂ…8PÓq#^Á½‚:( F�¿ k&‹k­uÓ 4Ev k,ØÎŒKb±°^ ¦Î»kŸÃFÙñÍšKaŒ°ÉÝ�³¾ñÕyJdçX@~¸nTÛÜæF1öêœÎ40á›~²ÌuRg¢Õ õqÎÎBÚ%ó$³ŠÑœpuÒŠ"pdz£Nú¹¦™å€(ªÐ1ŸÁÀE,�zI›}%ÛÐB9�` í9лo—å{8e=Y!.XqŽn—‡} 7„޼àÆåÆûSUò¶M{ÐÑf1§˜ù€çÍý¨>l%ñ1„9¢—ÏHëžñ˜¥@C©è›yЫ"FQè?Š,dÊØ=mÓ#Ôç[*ÊÆÒuŽÒKéðÕÁ{F Ž\CÏ»5¢H»³QHN³¯W´Ns{O¥DkCp3ÕMÏ;g½1\qÎg0Úlm-„×ð±Ãt9 ¦ÛßõÀ¦èƒ~$ÝýCÕc ¹’6¹”B ËÅ Ö¾ÑIJզ£®OxÃÜ,;bu×3ß„®Š19eÚïŸWél͙ͮ8«%j?•‹»½;UôþüÁb0 ÓÊz5>á>ÿhc»,Û³2J߯Md^ޝ«÷¥àPÖ‚Ë_W?Nmjƾ(y)ZÚº~8cèõøŸà©*æTî›ÔÏÃu¹Ag3áÝà@—¤«3v/çJ¥Yü «ÌB÷d3™[вo;ÄÃBx©´¬´×õrl§ÝT^’—Vi¼»!tëtº¤¥�½!ô´™3V±šfw÷Ô>pƒ.I N*w±-e�™jÍ’ö=ìM@ªøðŒ¤Íù� eùªÈ’9´Vd©Ót,§S®�Ü¥°Ÿ5²-Dƒæø¤âkÉ�Ȇ¸à�o� ‘6;-„'»Xkêå3ˆŽõ!¹qødÜ*¦V#¬V�ù¥¼PLIP´¡Ó'¥?\´Â” ƒfð>“Ç{ø²Àz£¾&µ“«NHlgMòÌȘW%3*ÐpQÒy&†SÈ „›ÄDXÂßЊˆ”³céu½°>Œ7r¡Õ]…¬Rœ1ˆ—”³ó ÜmR'mÛ¼èÅÅdÌʰçíÏ(hrîºØp]ÄAÙ¨­-%©c_œ ÐC‘'šÄµ­H˜¥º©É)´;y®Ëµìyäç8Ó]iDàq‘3Ýk1ÈãâÀÖ[¡V³¿ع%,…ÞcÕÒ�så;F†êW«&ö:Ý.ÝC’;©5b?ãð|/烠T:][q#9Ä§à˜†#|º–žëÜV¤tÇ¡öÌ=jwþl ã3†�þh¾t½vWX8Û@±ªæÈ-]ÿx�}�ýøæa)£å÷bNj{ÕéÂjß; ¥yQÉ0\ß<‘6ñ"ôÚow‹l´%Ñ}0�nk“æ)¸ ÈGWÿ×k,Èendstream endobj 70 0 obj 7126 endobj 74 0 obj <> stream xœÝ]K“ÇqÖy¥PØòAaÆ>ÍHœf½¶¤iŠ„lR¢¹:H:àÁA‚ÿ½3«ª»²ª³»gvvXÁrÙÓ]]••Ï/3«¿Ù‰AîþSþûðë«wÿÇï¾üö*]ÝÉÝM=¹úæJ–ÿåîÝ{×ð€†+rˆÖªÝõW²ÜÄ`eŒ;oü à—¯¯þ´¿w€û”tvÿÅáiÝ_®‡c¨f 9¨ p¤ëGðØ¿ôàŒW¶Ükv~ˆ^H‰÷ÚAèÌÆ ùöÇ1è”“ÜØnðJh¹›nÿÕᨼ´4í‹>¸¾úôê›�3p#.éˆHiã ¬ÊúÁ¤Ø{÷®Þ½÷ñî»—¯>¿z÷�;yõîGø¯÷þð>üçÞî~tõÁ½Ý§gRO*;x×ï»ÃQàì´õû¯��ÆË°ÿ¦l�¶jÿ Öã ƒÙ{0ƒ�:Jòsy(Üg¸·z`B² « @õçE’½q¿ o0ðœcMŽLbÌž‘½‰¬º““äzº}¦0{¡2Äúý3¬Æ80›¼L¹µi4ãjÐwÑûfi¼,–/L‚ؼD d—Ó×;ê±éö9Ñ ô}s&°É™I•Š™I­P¦piX�,^é‹d©ŽÊ�Üw‚’ŠjEIEïÝNMá/qgÌË‚Î0°:¥YÛ¥d²t3–XÒ³ètT–¸t {ÖYür}²Ñ¤YHÀ¨²LBÂúed=w&»3Ýþ÷Ø€#$YηCðÑÅ›�ÿ­–Š*/î(}v\y¤›ƒcÁ[Å,›KØÚ¦ÿÌò h «ŒüeR|§�žÝÛ5V±°È*E© ñ²ÆGà ¤ûuÊûÈ&"‚æ.SŠtJ£cn†˜–R\ùqbÜ*ˆÝO»SÑ.«èfìK¹ö¦eãPÂG%Á”€ÙÉf9Œäjç§m~ðŽw][{ÆŽ·Þú:‰G+ÒìÊ5°9¸sy6¨žaÖ¶ÎÓ›ît+ô•·fJGµ 8J`ÇSmVfõ7­ÜŠ"Hz‘EOºýmP{² Ô.�ßþ‘ÝĤ4z¶�«½ Ón°1º»�éžÑÍÌEGÏyur3ø¸jâĪŰö ôä®�³o,n?{ðæ ì/õꯧè�Æ‘Gcè1Y]¼H€’yÐ ¡ÅÃ)d$¿ÖÇI(󇇱œ), 9ï×ðŠÆ¹SCƒ[œªhiHý^…ጜú) š³ìZ>Ÿ+D»‚SZÑ<¤Ñ±±`tè¿ä¦ÍPj§ox„óŒƒjÿI2!Nkòsí£kßÞ` @jxDºB&uusaˆçä­,µ5rJ‘Íæ‹WhPÉ\vZ=§d™ŠÑpÙ/`3-¤b ÏK/-c&[«aÖÉá1$:ù(Ñ2è 2’€õ/²Ô&?*�†ZàÙ¡É\%5‹¨„êÿ}ˆ�[qVš;›2êìE(óWƒ¹¦ÛzPÄ #talòç ?+ƒF.T È„…í",ˆ°°Ht†•º h{Z_MfQù‡\¤\Aûá  q g;‚O4÷Z /C$i¹Ò/ë¥ý �ÝÐàæÁF’¹?졳^&7gb·ýVhv“öÿpü×jຉä56·÷,¨.„kçÜh p¨#áã+»aÓgÓʼn_ê[ê0ªf¹µ±†MŒŒj7yº¦ânI¼Ü8”´ÆíŒoˆà˜ÊHtU7ù*L+ÏÙø5ž«¶^w-¡ÕI¥j% Zà˜³¦_â#0!qkX6¦=II,ˆ ÐÆšnÁSNM³²e5â¾@ó÷,a±RÅÌ@öŸ¯Å1RÃm¡àBo6רmÎY¨ÚOAh… †Õ.†½.ß¡>æhó Ã4[êuRP †5Àó e�é°¥˜ Цš@‹è×κèP[ÞB5AK˜RM !N‚+Ö†©š`‹sÒ¢OåcsÆ*‚*ÇçÐtµÃߎۅ½i“­”ŒÉ GÍ7M¬„Ò�zØ­’…<èâ€�I#Wàâ�C�åô_—ÇÞ¬—H¡¼/¸hE1(­¢Ü$­ •)&xƒ�5`‚ÔÝñ¼ÞfÁa´!³Ò¿a6ÊJ½D-Û¡@ãýFËÆ ±×B5KÉQ˶(Ë$-ì„c³¼—Ú²ÃnU³Í¦ÑiüpAÀs1¹EgMƒžµŽ)jcÃr‘rîjA–¨ü~âÔò(E¥º·s±­I$Õ€•ª„4YªKöÄÞN€-•9Bðá«ì{GC½£ŸÙ ;/u(SOŸœE}F;KIßÇQáv«²±j¼ÃñŽ&xÄЮ¾¬zòß!Ñ’_¿?XpÃ�ö3OÝ�Š!Ñâ‚ó8C(ñ¹‘ÿž×©�tȪ4ºTBA\ý‰›ÆçªªV¶ÁŠ~{4úêb— ¢#çHÖ6/"IÜô“aÿþ„~ˆAæ�gÂïŽ é`‹D[gÄ!ý.„L�Kæ¼³ÙÀ2§yÃO¼‡Å”e‚ êsM¹Nd•@@ãX¡÷ Ψ_ZfªL«õå\4w[Õ‚*„pÈØ“½˜Yñ«Z€×¼ˆ­ ¤Ñ‡³Â¨[òåØÊP¬ñt^cç²n¼'Ô-Jc¦ Ç�u«n¶¹—ÂB™û¨óÕÄÑ”%²Êi‘Æ5ø{¬hËÜmYVt½R  /a©ÖH,!##r‚ö@£ªm£k,Ð"öåì¿]¯ó|�¦,T,°ùí¨(é]z’97ê°ÿYª· ÁÎõ„o0æpM ·Å·¬ß8Öƒ›fÂdÆýW$�õα!Âèß=.Ü ëV†=os]dÀ…ô-[Ù©>kR9«ZEÕ~: 6·F+ØÑ—ñ*YX!yÞ‘S˜íŽÔ îî̉EL�sb©«…Ê2øØ+›çÓïÿx(ÒSË&FO{ÙOŽ(¯€ ²øj¦I9–S^‚¿Å6`°Öb©ÔaBt¨ ïÊú…ez�ùõØ¿ai™¶˜¼T®œI™$�;S*yi9ܳQÎäÆü=¼e­0AeLáØ¼…ó`ÙéiL–ê%±dÄûf«aÙ:ò¼ÕvT26ÉtÀ…¤þç@`�A>Á¿ÀU�û¦k×ã5¶ôÄ4µËVª‹A Nm*Tö/\k"…ñŸÖBïWä!‚ã0M%�MÀ”í!Îî †|gÌäBMôë2f¹YEušMÁLbr¢¹ÌæÔWùÚ6gE•5ÀÒ¤Š ^ÎÓŒxU®>Œ-—>$z}ㄱۃŒÿb’¼ÞzõÏ“8¿ܾ*ƒZ³ÿS]œ¯·þ¥^E[¢ÀµŠ¥¹N—IyPÇèx§ø]jRÁÌSLÌWAF‡'ÙV×öƒ(ˆv¡š‚â¸Uç|”2̨ŸJe:;žèzÜÞƒg' SŸ‚�ù€‰wÎTÜÇ6{HzQîÆ\3jO))÷5F…[²À¬Úƒ÷ Â쌶0¯FóYÉ"Œ šï† —•î—'tIVKŽÙ°&û„nŽs’¶Úõ�â4¼)žA3²)99�²RûØRa3Ì�šŸ¦Lí œ¤‡Õ;²�:êLia ¬—ë–,˜ã¶Þ“ %ÙÊó›גb»`ÇEoåoê­ç¹R!¸` ¹1»d)þ|’`;‚íÞÇh Ú ò�kxj¤UU`zU ’Ê?RA™g‚dêÔ>Öû7rа^ÏçívNt×/I+rî¨4:톄ˆóv:Æywl)°³nˆ§8¤ð§ Ï)Š2cèTn]]× H£øz¡®nkBÁ&ûÒÛ Èçàƒ� Õ;õÎc>÷ ¹0(Ȧ9¢Ä@Âç(ý•c /tŽ�ð[�, q]&d Ô— à}ÞE ¦“µƒ¹´÷˜©�´ÏÒ®�–RÿûòÒÅ2©´ÉÔ£AlE:L¹&´³Ž´žm Û!}¡¤�tVœÚ¥Ü`â/Kâ,šVgÔ`è‡)ˆ¨]©}Â¥¯”\¬�›`ž¥®XÌÉX̆‚ON‹|„¶½ìIÙHÁ%IÿÉ®ž Àï†�%ŸM×Ôx�Æ<ÖFѳ=€Y€kØ×v�zr|«ºîŸä¼nèÎǽdE1'®§s5¦ .åªÛ:Ö#ºŠÊH*Ì/&a _+ÌDVTni¢¡*“xÕt 0‘-�kÂ,ü`£z“žˆ4ޏ±8"Ûä ÞA aMÓ§2A蛀™ž·þÔ#Ú,î¼y€3½5-B”לdé2[AѺ£ï¨…*e¨c°,BZˆ–æÝBÖ2í¥[(FRá·#ÌÎtN–U¼¤ªjA{ù_mÔ½‡Å`†ÂIÉÄC±©r¦È±Û1ª­>–òãPºÛÂÉÊ쇙û½O‰ƒßOɄϦkj5™ÀéÌZ6¹ª3WîH†²`Eª/j!>ãAÕ"ć?›¸¢K È7Vmõý\Lª¶7NJ�.ƒ(ÝuxEÅ€üy?6šøÔh‚EsƘÝ’³™33Ÿ„ž-+âë=Æ ð¢^›Z湉4Ð8U ø{𪠂­ñÛÒ9†Ê$"¨ ^Lï³±-κfNÔ/DƼUû½'8¹ö£zb/ynë$=•,ºy‡&ZA&¸cQ¹�S¤ ñãìxˆ”á4åäšOµ£•Û8Bö<²0´6což DÇGx³·qÔµ¦�zߥ^PE '?Ÿ0«O>w*Nhöäôå°ô»Yj r¦v)!QÍzšV^‡BÝN0­Ux� øR¿Õl‘‘©`éôUao•˜iʈE ,,&È "­¬6æ•iH¶ŸÌü¥V_¹k²=–´Xå"»NΓÞä 6_ðö¸Öøv¹,|9¬WÕ«C½WÒ«G !dLN&òZÂ6„ÌÏ a-Öj¢ ×ÉÙÛ­©b:í½Œ¨²�‡3¤�ìK†‘Î�Eªú˜ÔøR¯Æ\Š ÎPL´ÇÕÎVÔ”ÏZG U& 7Øîø‡\õm‹=”(ÿu¶ '0@.F1 ýªF�¨\Läšyu3F/!>ç�4sLèg3'?ÁÁ¥njQs¸oIÿЩÍÊKnŒ%„9ñHÒü@}pZ%›#pÈ�97M¦GÏðÇe‚yM�¨KR–�þÎ?ýr²�¡ëùO{­›ªÒ¤@ÑâÐ»ŠØc&'èT¥òÝA¥5ÆÑèLM¯6¼†ÙÉ<’ZFê túõýõùúëäåð(/‚ðyS˜<2A˜v1;ðœGé)ÎV�Ø-Ô 5.`X§<Í Žfúü�#0©k$ã7œˆîxÕÄýõpÙxŒ”ŽÕ-¤œ1ò²5ŸïQý>#<¬W©òKúåóÀ,ÕŽ=îµb�-“Îæ"§ïµç ÷ÓèêŒfkM©Gw‚yß^ÞãvŠ Y G7pS'ÿO‡PËöWÜ‘`ùÚ”nÂ猻E‰æ¼ïõFû–ÀÚàBHÏS�œ8NXñ>Ï`£L†[=%+^»©™”j«QÍq]°Ì9M�Š}Àä8j¹ç“1›žU«nµB[I;5B®!‰²¹ ×ȱ*Œ÷ŸcY눛ó”7Ís'Ë{Râ7;¼ô[\™ùÞ½|–%ºb×ÿ}uý f’]“ Û�'û�¨òp©½õÏu9@áü3ehÅw�»½±l£;iXÛŸÎ5í9ݱ¸!އžNÇâ^Hœ´§±žÅ"ohŸ\§˜É&m¨ÚqðKä«ß¿¶ò$‰öA³4Á�´Ç\l ß�ú¾^¬wT©H5Éí�åaæ–K?þ�ë¨eè—9n·¶žt¢ñÒ¡"³31— ‘@ •fµÉlHª›å!”žY�Ûp ýä'|Óp"²ôŸ¯û¶$¯¯vluǺ/éZ/n݃3'UD¿lÔ{P½¶°„~¶á™¹“üÈЖŸ<èE$`·bæN'7QˆA¿â&¦/Ÿ8só°™q“<ôGåE—ÊðÎq³ã½üQ–2ur†èBZ2{‚  !Ò S{²¼ðû›0˜Q–Bá~5)Ø[w�KåzU­¿âÙÑø—- ÇüD ¿¶Óªgór«ó:çĵuGÂqß8é$ù-W<󂾕]ZwuoË¡«Ù™'(žõÜ•‡ÇÝ‘ÿæI$ï+8p§!î½ûÖæLL õ% sçz2Ô {Ú-v!+ÇîÃJ¥™b«Ñd:™ÎÌe-[ª0 Ð--öäzŒYjˆû‚Ô}<2”KIùº&½ ÿ�/7�ž\“´3ƒÇ¾Lá”N_QÙàAïK‰­ðNñ€\@�¹cšHnöi­v(©dð|ÐCƒA•s]^¸4Ðϱ1qGiÚǚɽIòuåÔeþÃkËßG176û›Ý§ áš$�çÄ“í¾÷—JqõR;q{¨|®|&¬ñôC‹ãúèXâç5æK˜¥¥t~‰"==ŽNÿi)KV~%iÑ»�1çià nýGPæcꨵ7µ¨Ú²¡ÎBöÿÄÿ�Ñ{§�´ï5}¢Né\Â¥O·v.á“ßp’¶²@ê4¯ôxkÞ»êâk.ÛÐeø‘ÙЛžª|Q4s°·vUœ“ÛkšNÏYäß Û÷�ôæƒzÌSÿé’±�3•Õ£„x˜‰±/u(Ö«º4ݾ€�´Íâ1‘ Í"11ñÀjÜRk�[]ÂÐ&Sd€×`2Å[xblK÷�MOÝæŸ^ý©S€–endstream endobj 75 0 obj 5809 endobj 79 0 obj <> stream xœí]Ë“·q×™åÊ)¹oåôm¬�àýˆWI»â¼ª’ðâØ9ð%J‘DR¤¨‡ÿútc€™И™o÷[š´eL;ƒÝ�~üºñÍ•˜ä•Àÿæÿ}òõƒ¿ÿ/õü̓ô땼ú×å__>øæ�ÌÿG䧯>}/Àÿ•fÒÆ©«‡Ÿ=�ùù &+c¼òÆO þòõƒßŸÔõ�ž¢6QŸ¦ë3 c£?™ë›èͤ¤9}r­¦(¢ §'×~‰VÅÓ·ð£òBúÓø~ˆRÊÓwøO„‰§gðOé'gÜéÍõ�œ„³Z¯8@p>À7ZÁ‡m ¬Ã¾ÆƒVAžÁ[Z[eÉŸŸ­Syž`O?¿´˜„ЧÏðõh„P§—×JNÞÂ1µŒ“ƒõ=¾¾QfrÞä?;{úg$'§]èËeôð£ÑÂÂêºËÀÌX[ y„rt€u!ëPÿûð_`ã4ìÌÜÚ´q »zøoþÝïO¿½†ßΧ½ž´tia’vâ§`­O+qn²¢'ë€v¸Ëi/aHš àÛfòQG\Å�€Í væõüo¯a¤Gó[ÊEXˆ˜¢WÂâB´š„W¾¼—ž…•èà&Ï>Z?FGC¦p0G`•nbø‰fb*T_}Zþú,½+Mh/¿¦­Pæô10´ž×e¢°Øxú|ùûúÎ $iœŒÓ8y¤®3šŸÇ×(ÊhszUfôÕúW\£‡5úŠxëréDÈ ß]kÿÖëÖ‘Ï?£ïëÔwþŒ,£E€¯E�ï‡OAœé޼&ß"“ù¶£2ÍóùG9òÈ?ÕßÌ¿"]ÞÖ…º£!?þÔ‰ I�^K>ÉS¢®%/wÔ ìuɃ‹„k˜/ î„ H�›B�P€¦'JÚ}›(=·Ëœç“±t"M&óéøGC”À€6ž¾ÇvΨ廖 åÊUdÌo‘Õ$�o~e¸~ ¶~«f '[Kx¦=#t?$j+­²ÂRTaɦè 3~‰_qNEÃ)7ø§ B–‡«ÏÏS’v(¸yëbá5óVYá™ùŸBH“U¤Þûautž]õs¤;e   ®bù„¥þëÞÞºDlœ“°xú5Œï%jÔY?8à™nÇÓ˜?âŒA8Ç)é þ½³9%¶¸Pë…,ÆIú°»2Iø’©‘¶¶;h<Ø‹L©Šz=w#ÍŸâá�_ yxú8ç’žRnÒAoH8ì8Rå)ù±ÑÅͧ:]=�ôù(‹#‚�EÉôÙlÚHm×M]‡ÿ_q“ׄ{2%„3ŒäqGà¦6ÇßÌ_1Ñäõl퀽p‡sJûÉ“e¼d–± K}2ÍG—Ë«Èÿ¦­¡C5£õè@›ÕT¬pÈ L{§€‹Àë䤺kx²ÂM¬ÕÂ.²'Yþ"Øf–Óu`AÊɯ+ ,Š,-Õ£á�ùsåQH‰¯€„^¡•¸j<ÂSÝ~hS6åY p,„e �;ŽdÖ—·7©ã& ZTíQ¨oÏ¥ŽI”i)¤À¸ÔÆàš²4²Ì*b­[½Év°ÕéLh%€ÌÑ5�¿<þ×ͦ´àr¿ã8X,mÁÊî#Ú•M©h÷ó–»TcëxB°¿E¯ÐJc%7A›È¤�ž€MV$øÀÜ|B^ÌòøjD¥ \ƒêV�rÿÃiÕ¥ááP]˜ûÿpªàán >%»‰Þž©t@3»Šô0yvb¬¢9g†¿Xä“#¤Eƒ†]åºï×ÅêýE×>þ3pÈØ~ØO_<’KžµŒ\ò”pWpاáÓÓo‘ÒHæ";,,ú.'C5‡�“a¤SþD§‚ºÿSa‡2Ë©p�2Û'‚zO„¿¹Ø‰°Áéì‰àj ,{½Ô2K{ "ˆ—>$H…ß=rØd9ˆ¥ÛžÔS¿à‘ÀÓÝ(sè8(tùàŽÐl澎ƒûvª 뜆ùOç8 ú^òÔþÁ ïùHÐïÏ‘p]æcAw‚~„˹ ŸŸï"蟜ƒ³œ†èg;úÃ9þ Ý‚cþÀ_�Ò7?)ý¿0/@ÿdÿ¿[ûÿƒÑøÊÃjf�¿fÇ.!âïkľ?Êï"A[©¿¥cP'€òâ$ɦ §rrrÚfÒ^Dm!^²eC <£µöˆ·�Ú±»ç'�èsî /`P-¬Ø·‘JÓÇH!1 rf=8SåaKZ±GìÀ¯¬¸Æ)9Êú4É@?&¯÷¨~,$©Î›æ¢è;a’®ô Q\�3_WóM�B¬yF’ü¡“`PˆHÐü“kbµË¶7�¤:Gœ$¨zjÈ礧Åô&| Î yOú«êôݵµŽNŽ «xÛ!Cxƒ@Oþ¸gsæ.šÚ³aÓW'±`,æAL¬l“h³f%>BvøL~Eµ§V^PÂÁ'5{ˆ{릻†¹À'Q¡Žfº‚Ñ‘t†‡yxM6h!ûcú\9¼) äíöäÅ2À [¿CϹÓÔø-ÖPtÕ'0�òAªú(Ðc8ò5&ëa~‘Ö ¨W‹îh—Ñ¢1V°¢vœžbÌÖ '¯x2Ö*Ù3ìŽJ=–ÁuY*ü�¾…�,C46_wèÖ›*(°=r9 óÃŒ _� º³ÑˆUÜ ½\ÝT] _ªBqáò–ƒÜÃAÂ/Zk¹�7(SÅ"^è^_Ö™>‡¾Ã ˜©÷œ,ç X º}ÐdUk�û�Æce¨‰Í‹1ih€,4¶ ª î„Xªu€·\GP÷Ë Àæ’cDá–L:ê _—å‘Pý2�§ûöIä@‹›}i@`@«¦Ž aS9òh߇Bê�PÊ6q@è£Ä�ÿ (Þ¦¿6XÛf—{9‰0CÓDNŽê,¢�z�å£ þv:«t»¯­øè莲â’—RV£@ÇØK§Í9*Ku«þsUY÷€Ò|‡h¥w¤¸8"ÝQq1$ºõe¬^"™¾Û›[ZÉÎÜru|aÌP#Õev„øŽª«ŠÑn©®£ *ÞÎIàã$ÔíÞÛÕÙ=j£\:ñvÿ6нË ï“�»#x—�·a+ RSl›qa‰d‡›]Z_\sÜùIDërió¾¢Ùïe¦ÛÊ­aùØL %S‰cí=WÅÙ9ÊŠmü2ÕŒ{àeÖþ8ÀÈ�9³í4Ì$ÒŠoªwòlŒ \¤œ‚O$ŽnÀXpIKfÁòø¯ZðI«Ê¨ÑÎâ¶4)A�u}µíßÓÄ�+/G“š5’œ3IÔ‹ÔüÝh§¶öðsM5wj/uôÝ[ Ö;)Ï«Êâ,2ŠTê­c¾ÂGãdD _Ï vëPo�á “×âjj×ÑOË|Iêc,ÍèB€ÖÆ�*wI)ð(* kôø}&ãW·/3¢1TYUgÎU½¤|Q;ø·h .‘Y´Äp`S¿]z™gÙ_ÖaÝÔ·Á*9µ Y¾2—‹Îª:¾ÉDb—¢Ó”�bŠt×�uÔO�'63բÕÃ׿|÷|mî�n™(,}›2�ûd鳋ºï[Q놡ÿŠú'†þðÚ|0 }z'ì�E‹¾7¯KØ£àí¨O± )÷¨l…O$¹xBÀ¿ëîYðâd¥$ƒÏ/›X¼$'f(c„}Õgë1'µž©ÈÞÌèJ|'èIEÚjuw©ûȃGk×PÈÉ?jù¦"üÙ6M†PºãÚ=èüþ=3yÜ-;ø°M¤¾È�}Å�ZøÀ÷Á/Z ‘*À²{¼K… j BæT&’CÔjv…9g»HBû>ßY‹mè–ýq—R3™R¯¬ÅºÏxFÒEQU¾ù¨Už"ŠŒ“‘Žñí×€í¯—'e¤íÐÅZxúãÂT¥�£–¬/_µA¶ÓJ®>>¯f·taôn †çèœ<èÁFžx¼ˆg JÑ”@v¬ÛçŽåÉ.<)]- 87ƒã¬?£e¶K4¥s'+ìN÷y’'dDOÐþUOFìôî Òä•uÀÒ e°Fˆ‚Ÿ-q&FU橹G¯�žœ<Ukc„¸0“„„²^-‚óšˆËZ‚±h~–M¿Æhb@ª“ B²úP›ÛªPøÐ {ž’!ZFL'×W« ,’¹ÈæR„Î.£'fKkyüãÖ¨Ó@9ztžu¨Y‡zÃ:lk­RF2�ôüpg%•Ae‚.ûYᑜÇõ•Å�JN~¬»ò‚A Ûptjõ)ûè©ñµ|6HfxRe£èã€[1€ކ's™j4ŸÈ�“Ī…fÿƒ#ƒÈ£¢€À´òm™N+o4Ó–ù…Úe Ö»cZþK]¥ ´i¼j_ÙKÀ ’TÏ<ƒA¤2Áðö}Ÿ3ʱ>H—3žENZ>«jsý~EŽ@ßÚüeªJ  XRLV3„%Âf´>Ó pl”_–$¿|6¥Ç€½9›?¨÷îOs5Ý*S3•Vi ñšý®jæˆÙÕ.F!>nÐY“X.‹F |=—0Ô�µ?›éß÷Ó5:L"Ú6±Ucñ±!±E A¼�ÂI“&°çkòD)' ®)'Áiy*äU³Ô¥`ã¨y/€a¦¹Š¾s,‘ù»Æ_´P„Õ@R¢gÛ4Ô= XS<¯“ò6T4„¦ša·aÓä“ÁDÏͧh®jü‡©jÌV¬’åR=Þ­¸ çTÅ݃Ü:Ö]J¡ù"TRVj,G-©*‘ŽÛÊ@;ìl/oœCþ½:ÔÿŒ[jxiÁÝâfS€†Û}¡XMÝïþq@ûËÄ>‰°~¤šW‰åÝi^”¸/çŒÙšÖ%î*�ë1ÁŽÖ$Èœ¢Í ÉÇÙ§QÈí7vN¤-ÙG[mN¹E}àöüyNÁVåàgO¿AŠ8 ,�„­¥Ì|É=ùç#w~øY0~US‡[B|‘IÙ s°®ÎºÌtdªB›Mcà礋Y’.aNº¸TpÑtÊï g�ú ­¢\Oœüøjù±i¯£“sÙXºküEÁcm�y�¥ à¶EÇôç3¬DþÚæF‡ìÈáL\T¼�P§x] f(“ö‚Ä J9´(ÑnS4K²a}ÎE�”&ŠËÝØ8-_#WËë�k›Æ óæÜY7é­H5£Ïé&‰È¿%j0³ê Ž=hÕu>Þ|#”íÀ¶T¡�5Ž,ã@kï­á×ñôßLÎê7�œpfÁHï•›LÞ™—?ïEJ'®a‚Ïæ�è�Ý»P˜|¢=±½=îïÖ±9�8Ìn_ä´Y¦tú¹Xwµ"ØŒÒ7áÝ9­è�I¥ W�lK®uàÀ ZñàKÎÐ\3­&žåÀé!Zò³R�I«Ðz 0�zI qÐlka/MB«œkÇè3ªý­d 5 C]}º�^®Ñi¢ÈG 6>|“)GDlÔî+eôÝ=cž­�kd/gîß5*Dá'mˆz«eÍvº©i76»v–�}ƒn ï/²m“:6ÿ¯oî_¶øg¯f®™Y¯wõ0‡›z;XÕÇj€…Úr ‡–1ç6½ªnŒ`”—KÕœNÃôD¹¿mN<.°–¥mî£{F‚A ï~‚¹½0n€¢í•€ “qtò§/Úa¥ÊéáRmŒÒFë;(׺  ï´“�C:[,óI¨ƒ¯‰ÒUôÍ\ùa”_ðj„–i Uò5‚µ+0Ò´‹þœ--­›h-¡:º�΄/²^…u‰ýÒ^dŠ&¦7ŒÜ›Œ`þ¦S2ÒQcµG%öœZPeˆÝ¨}²ÛaC.Šk-ºz® ÿ¥â4Vª²)£¦�W[f»ÙXu9©…Ó2ÆêÞ8²-ÉîÖ¼ñÏE_Yë� Ÿœq䨳V^ôàŠSŠy» bÖèÒÊ› $Øw” Jœ ÿ¸.]þè]†E¢¨IÓx�ø¾��©Ú´'ï@âÛÆ¶\!A+±š�5W[k˜¾Æc±È—É{§8¼ƒ5©QIÉìÄV¿µ!,�ólëµ}e¾h[· _<ð¤09­¨%�ˆÕ‘>|}ÿ…·Dv÷[ �‚Û+–�ð_­Xòµ‹;âÃb[š¥¸Ò{·FÖ -… ²ô›kï0\ïSÕ§|œ�nGTL GzVœÙ](ä“"Õq;;žq=Eeå¹WdªP3'òlÁV·’�D4DÀžR*6:,�/:ÑLƒ^UX}¡rŠñE¦g( g�öû–±ØXo}TêœõFŽnÖÕ…¬ü)7 ’¦ç uˆ)[2¡¥"Kš  Ÿ…=˜U“Ïí‡ÑÔjMÙ•rÖ›‘@~fRÒ�¼ ô6ÖÙ'3€Ã¤z>å/Û¥ì_õ†6X°Geðg�KÓÚÆÁ¯M¨÷%þ Ž”P‡¢Q[¶ “ûEL€#Ø ñ/шs±plöø¾“í¾¤‰\ïÖ ^:XXéëµíƒ¶¨°nRò.&±Î»`+²ÈÏC‡È“qO_šp6W×"¨ž]Š Jìâvb?Ã_Ñ�]œä/z��ˆ½Ö4U3h |åª>зH¸gN±vP¤o'eÖþù=› Jlr «©å�:þ]Ð’˜éÛþnK&³üós¢r¿»N×0o~‡^·�Ã7à s²sSxZaHÝIo�%²ÕL÷™©tû<Í“z°œ¥yLuõÉYšÇñ[{Xó|ŠßIJðBNKu榱TÙ¹±ì�±TODŠZ‘šü®Vj“#WMÔF jÑ×d1õ ÄH¿\âŽf 8�xDÜ#œ=jpåIü ¾ZV_3øêQ Æ�}ÌOÛ§LS÷6ÓaÛ¡bÓ7Ø,hö¥udÓ“»Bà·$Mˆ_¶š´-qXØdmõš8R¤J‰Ö�K"µ<·ð‰«;·tÇ:#i»ë ’»÷š5£w#|M|¿pgÎjGózÝá†Âã;a„Çq£ 9'1qÔT1£®…=0ÎÄyçhþcë3,ιþÌY,­U?˜/<ƒ -.»×îžóP‡÷¡_(–„i9a¢÷ßAn@ƒ¬QŽ6½M3/$hõd±¼¢Â1¯pwŽ\s;å=VÞ2À±šÒƒ”í˜ÕÆÓc$aä­a2F{„9ãñÌíF/qò¯–*¬5]àZ`–cGÀÒÐŒÕÊD—罋=t0Ïf U‰Ô±bÔtÕ_TJÂéktùË%ø·­¶ äq;³ìÀ¤‚AÓÙwÛ…§Ã¢SÖw¼Mú]ÝɹMû2knoº.ÑûØÇ%r9}JÎ0ಜ(jèÇÜÙOê!ʪä‰JðOç?P?=Í,\é+h½…O±FöóùŠ+ä}Åaò—’šQx9IÕl‘ö&i¬5Ñ™Žc#kPn$^?ºìþ|Ï k‹j/WgrîóÚ µ=­­ë¼ûÝpLØtŸ/‘1LÍ@O…6`¡zä¶k¹KrÇé½Û�^ýýu½¯ï¢”üŠ0´}³­BWƒ©l^.VjKÏîÁ¤ÍÃÈcaª`¯HœIô3홑#Ó¶v#G »´öqË/ Nk—g\SÚcæÎ®ƒ÷Ý50áQ°¿)²£œ4h,æ“ZÓ*q¡¦—!.ïüÕ^çæËˆ�ÇlŒ†Åtˆý*Ùžk Þ—Y‡F†�Mš$“<Ðx§FFáÕcª$—6�iš‰±l ÌÑ. 5#2–ÆÀÆu¯ót•ìš'-u›×Vàgj»þh�Ácø_ù”Ž=6aïCì¡A;8œþ vg¿ÄU r2�Þ7¨†'“Z\Ý⸄°v„Ø5õçMˆm±Bºw–; .]sv¡f×É}à–ûPêNîg¸®$Æ»ç·ûÿnsÔTÕæ¤BÏ Âaé¿–§ñ™_?|ðŸðßÿæ8èæendstream endobj 80 0 obj 6740 endobj 84 0 obj <> stream xœí=ɲÇq²u{rè¦ûø6ccšµ/¦å�IQi›Á:H<€ Â$‚€Hñë•Y]KVuvÏÌÃ{-[Œ›=ÕU••ûVïÛ�˜äNà?ùßž\½õ‰ß=úî*½ÝÉÝÖ§¯¯¾½’ù?D½{ç| á�œ¢µjwïË+™Ç1YãÎ?)øåÉÕöŸŽ*LÒʰÿâpÔÊOÎᣞ¬ÓVíïÃï“rÚËýw3ù¨£Ü?>ˆ)z%¬Û“µð~ÿgøÞ¸ÉÀW°ºñ’Îôâp“3^[O'øÓAœÁ‘¡q¦8áã—‡#N%…í&xÖ¶õË0)ïö/Ɉ¯Ò‚ÊÓJèª/p  X*ÄýsüÄ e ÔÊŲ*ÀóPxÎS ! ,ª"íC=cæ©pu2ÝÝK2ëâˆÒÛ§ˆ�˜Àúü Õ$<á V�zÿ ‚•ÏB8åePè‡Ë#YAÊÓÃg÷>¸R1LÂG �{�TÁâ?ŒeI„ª.ùMû·©Ü¤á-” Àð“§;!Ÿ·—OjŠÊhCÞ=M§�Tö’C n@u 4LSซ$å�Ð*�5;�È”r;¹ ìÎÂÌBéù“燣ŸdpÊã'°jtBZ·;œHºy ŽJÄýÿŽ@›¼DÏ�rRAÈ�ž$°£š?~Æ’ �™L�å8R”Ö(@–Aˆp”ëBq4@ë*쎜ôuáW@cáÑD×FÁ³ŠûïOV Õ¯ªŒxÜdPµ†ó—±ýÌ�!ì¸bô}˜@éÙSpù”ͤÛiÿ;©<5 ÔÓQé(‚7Ñæ‰Ý€F<×]>Ø_d!ÄY”›ÉéʆE_w*ð+¸N"ûL@•Ðò:€fLÖÅÍS@£ˆrPŠ�˜×S9[¹ŸPú7T8ÁÈ89+yáõ)¨Øì_1‡Š‚ûƒpJý‹Q\âϯêÏmÉNŒ;Ibj¦q Vû{‰€£[hàmqÆ€bÕÄ÷r¿ÏPBm�IÞÃξƃuJãø5M„ÓƒÞF™¿"a›¸ÌçªÛÁ5=ÖÆáùë8y9(‚ùk¯³,Ê2:--N÷G¦ø!Aà$”ZÎB#v¢’Œ[•1b|% iMEnо“Ï«!ÛË€�Ýï¨ïˆ9ATè¬k½¥FPýùaÖÏ‘()2Ž.´T²Épø!kI§FÍŒ¤´Ðï¸ý¶Ôól·‰î÷…]~ÔáLõto€.‰l}LÊ'«1á³d×Ä\[*´´ \å=h&O Ê—Ý€Œ¶jCQ† Je!¢¬ËãäÑOÖD2yÛÝÂÆh­›=qÖAÝä 0Ò�•¬syùËKÕ8ñþlê`E±t�Ôu›¾\¸�×À’#ˆ¥É8p�:È+-jíRdd™0ÏK’Fà¨â‰L?³®1÷*ÙŒZ0HŠø‚k‚m.$!Í% Ön6Rt»"§¢È+:ÈËØ¶•Ràpá÷î]}|õí΃±“Üœcg,HpØŽ—„X@oê�÷¯Þzÿ¿w/_¼úâê­ßïäÕ[wñÿÞùè]ø×û¿Ýýìê½÷w¯{VŠó¬`� Þx´3g¿ê°a㬞ՒÀ:åŒF 4swðíèÚS•åƒVHô§õ ­�D1hŸi”ÄÄ|[ú€!•À'Uõ¶ð ‰@ÎJ=%CgÍ �¨Y�“E³®š†EGKçün¢àFî¼Ã&1ˤõìx/ %;hBð…ÏkÍ¥)Ü“¼gMù•ðkBpæ û猙†úUÂÖ"D°6w.:È·GØZÄ€p_JÖ¿FZǘ ¹”Nî�ûÞßáy€|ëÛäÔlÁlµºQ¢F�|»L�K c}6xÆu z— ‘êè·;=ËÃîÁY~Èås!èÉml « ûèâe G©Q€ß:èQÃ_»I>uƒ]oÃ~Ê�á¬nnXg æ2¸Á4nózpƒy`Ü µ^ãMÁ͆BM2¼;¸ÿ®ø7èÅBúu'¡GÙ³Šf}�ê xãØP†+ÃPí€oŒçæ,QŒµ9;çDW¡É Z“£0Þ)Îc|Áš«”*ƒò cpÈ©·E©°ÎäcÖ‚yO)$¶]ÌÞ/³Š;3p¦C×Ñ€c)qµxB�±QDÐ|6 ³Ì»Èá›#œ‘S¢` csð« 3¯Ì€³}’â7^ê™,çp�-.ØcÀXƒ&rð[„¢hô�š Ö.ÔÔ­ôûöVŒü†‡”áÞJnû.³, Øíõ+€Ÿ“Ï;�þ׺57U¢[§„µ$i>A8X+=» œ¶‹—%3 lÌ9ÄæqsÿuuïŸJ,|‘MöT™õÓ\?e=]W^>¹ÁFÁý&2?bÎ!4†TÖèd-ØàoÓçQÎïÀœ­ò3Ë/eذz9 5X«ø9àáMe†s â›G˜rŠœ8Ú´;q4Kÿ·ÅÑxmqôo? qô iäœ9[d°Ì—âþÇó›Ä¡²“I&zËïÒÆèäÈ˘3¢bÉáv‰%/ì›KF˜d8/%S³¬Î‘LšÅ:!�¿X0�Ù5o LÌÛ´èapMvü&}ž™Ä;2ëfR²ÿoL.¤ºcq%/“Kí“‘K °Q.�nÝ—K3uÞ¸™4cý2¹”Ò‹¬™”ºÄTÒçIŒTºIKɉS’Îܦ­ \HË€ê6�% GQ3ñçKJ¸7!“`ÐúK™tý ÃÿˤŸ’Lº)[éõdÒh+] “ Q™´j)õŽÛº‘´G§ $¥Þ„42h‡N­Hé$× ¤¾.Hk‰È¤’G§cŽDíÉÕ”ÛÿÓ&¸xªÛУ�Oå¼XI©�å˜ó-éñȦörù¥§õå£y#VH6‹üò�@ ^±‰(¾~íyË9¥rAéi1_—BN¥q|±F)›;™‚úÓÄ_ŸK¢¦WlFpä eiÙœD"ñ°&+ƒWt1ǾŠà­O@ÙY(‰>3�ŠrW8êˆuIªØŸÇˆ £R½SˆÊ+ èAg&øTA @Šh§QÄ ”ÒÁ‡R4ă6‘…E£L3ÌIÂïFÉ� 1YŒ§_%òÖ¶ÞÐå^¦±^ª Î¢³ûÓ&õ\¥XÇ~ŸND¬Šå;€ÈˆÝ�$Jž «Acš$Ð3³~öUÚ;�{¢gT+Êg€ðåwÊT�!'›ÊQa)9 #SêUpœ«Z\ÄÍóúùýƒ²“%›¬��-C­‘ Z$d�öš‡!›ÌPY-÷Ÿã¤QH$·tÈ °C�ʰ-"Y�#)år]á,Áß� ¯$-,|ZË…Øâä•2deàˆô\Ö£Q™idù"%ÚЧË"Œ¤©c­£R˜�-åÀ@þ¤Ô‘l©I6LÖkÔRf­–7Õ¹ÜÞÕf•äteçKjÛàÀ¢ñ¾Õš�¹qH¥‚6ê%ðCºüä>É9q¥pxè¬{G礊Z§ƒä¢‚Cu)šJꋹhqòŠ#Ÿbby‚ßÁPÀOæ¥Ûlæ±ÿ2Hµ!£Óì�O€,h!ÉéÕØ‡zžâ¶½l­iD� þÇQ÷ �IªMÇ]ˆ~æ<êâ!&‰v½ôи @GF_æG®…¶ìùµ^¯ªÊ•L‰X´e? |lacçIqP®°-Ø:i0tCKÙî3m"œl<ßÑž^U)CËÕ�:`ÒžkJÀ¡}M¢öÀB*®ŒÅÉè°°z�¿Ùò¿®&ÂÇWx1՜ˢÅ\ÆÒ]ThZf$þGRÎÚ‚iÍ£\%›[ôâZÕ»ÉÞØJ(@¬p Z#ÚÁé ‹œ×„Bí› ÚÐþY2”Ù«!‚Öœ�eeµè]žÙI©_Þâ)TÌ~†'r>ÿDoT^þÍ{vÀæý=¿,¸?Qù¶)�ßå\0í¢$ ›w( ¸pË¿Á"¹I�’Ýö91¾"£=7”­Ø:ò’5€fəĥbÆ&gœ‰�´èÁL _ʹÉz*ÒÆ–ªQösEíÓájÈÅ‚+ŸýõF¬îE�¼î÷g$�y穲Z¢Ié;Ø€áFûŸMŠ? ®ÁËí‹¥ç>íKy±`,¶4”-�æ¹:иAv¥å_"Ìà�û¸î}øä䡜¦Ûø¾öLŒÅ®M1�Ÿ2¡æZ¾Ø¾>ÒB�½ "N¶~tŸšÒóô¦¶;Î>‰>9Em¥_ÖÕÏ…Í*´¸Z+[æ»ÑzC[9�VNö_àU-¢€Ê¾~xl¨¥nß·-Ím$B…ÞY�¹¼ún+ÂPhzœA$véÁ(§­$Cò*9@ÀÇ`Þ-"®dù��ríxŒ�  u-ž­«€­Í’�¶žUGÍvmª¬>ÆØ4ø¢\õñJcO©ñ¿©6.6™Tï 1�X�ÿù ûúªðŽˆx"] õíÉÊâ‚‘µº å±ñmM ôædkißFe‚_Ö~¢Æ³�©[Ø7|‚g´Áb*âQúkª‹Z57³ºY÷ѺF;{tI: ƒýofÙñ„ÀkMyh»eh=h¤yDWX­)#Ä~ˆ“4C¯÷Ü…ÃFOW®›;ªºúº()¡/hb$!ײò¨´CÈ´"<ªÚê‹´Ä:1„0P*E1IÉÅJšôé”qsµÀ>a7hA¾LP|Í‘kÉN¸ÀÊHÖ.õÍT'Ð_nå «Q�²{á�'ª¦Ó�ÿ`Ù0“ˆp¡©Ý¿·�‚?ko³Œ´qÿûC_;‰äãÔ—´¡d¸Yœh Gõe×XÌ*¥ß¯¾u€fåH+s§b.§|0T qf]!t«{u—$®½BÎW·\{ü gØh¿2à ;“”­ áoPµ‘«ÁÃE`gh¡—±sñ¹Æg>Æs.‚’ø°>½—ž<-¿-ïØ¨®éBiw·³_¬Pª®·—}÷‚e§*Ø~ÞLÝ�œýk]•~œj¢hzÉ2ôp9ÄLufE8­]»Ð]Gz ý¦¦¤(û^S¹a¾\8ÌR÷ÙB.ƒ7ØèŒ ÎøÊá³dè;OìÌŠƒÌêØwÞùMéÂíØ›<(ô¤ÑµWv’zìQK;t”—_ò’‡�±Wg”2Ù­Y÷Èà±Ï0 -êÍZoÚ x†f­•hau¦ÂYÝoÅ¡j…FD(ŒÍâäœ*¹¢‚OñÉK`î�껯ï>-ï81¡Í\AÓ‚:À'Q8~õ>+ ·&ú7¥À÷2®ùxžûœëÍèÓè�e§up~%ìÝ“û˜xǰ¸�)`sv¿å©dý¨W•MË`¤p¯¢UJ cŠâˆ­zA˜³7¥T¤A »[øÐ©SħŠJÐ?·huä‡éÓú4�_ÿëÙäœ5g�ŸÚš˜!¿¼7ØâØèÖýU*ºr×»C½×.µÈ²�ÆÛIw7º”óº»ð¿%_�7$ó÷!QV «FÏ…sùû*¾îq±’ ¤éµ)ÇÓ£Úÿî.=ˆ‹0Pb:kªÌë¥T­Ž¼ƒ»g¯EºÃFM{Q { å¦ ³׬U#þ¬ìÒ�b²K©oZ.³ÓWb`¾Ãð©²Zd#×U^)�¹‰+¸6²ÇÎ¥"'kfº='ãtãÖXÛŒ#SnZ‡‚;ÌŸÈ(L2“•œkÐse„£¿‘�὘[.úÆÑo ýmqI�šKxŒ(�þŸŽ ¡ö¯�ŽEƒ¹Ra[�àV¥´É-(ƒû™�Nƒ9š•ðÏÚ‚F¾;w ‘Ží™‡ÁÛ3ãþØÁÃþojúÛÛø&VE‚¥ vÊ ®ð9•ŒNõ·†ÎA^I, µ»TÑZ›HÖä•_‘=~C^�ùM'¯ì ¯z LáÀ‹ÑeÏ�×É\z‡:WTYÓ–-S®0q�-M«¶Ö3^i–úO©H>e‘Á×?2qâ!Ô•*\%MœuãzÅW3]ç¬#½î¥’«ÊÊ•—·ab*+HÁØùæºyYJ‰[+Á°"É#|pùz”’­õŽc:Ðà.EóÙmöU4)„FZwÎ6œ€Û.l#o=+k²ÛSJÆÒ'�½QJ½R02÷êcé,�É"˜° <ù oó£êÓX‰ÁÜù­¢�¦=ÚA¼PX,zßÕ ý< ¢b+5\º¶Ñ!è·7c§Ò§¦†Kéo‰‡ uîÐ^à�€1â¡€1âAµcîÔ¶¯L;fÓÆš4– HŸé3ð Ì†;Oeºìœ«¬ÑZµbig�óýY,JP5�½±Æ2×;æˆ>]#dPyçtÄ —`)Ató�¬°6uòüï�™õmcrßc' ü¢|æË[”»r›Î„ÄâÎäw�é /âwç;|ýDø}Mînñ;�yø,~ooo’ß1nÿ·Âïj‹ß‡á”ëÕ€ÞçÒ9él³Ðüé`Ò?°ñß.�Ú¨_³E+nhÜ ö„­#£­ÜßÎùãP5Þ”y;öoŠH[£FL‰¹�[7sSW Ä.rSZöp¤s‹j+7U‰|¯0f véÜj–°„ÐhWFfÅxøoÌc·ãanÑ?»Ą̃9¶zÖFLw•ÈÐm€½„~õ.ý™¬t,5{vYFhC¥.5ÜÏ�*BŒu0Ð$x“ C†Ö×lÙ1CÅW.¥S©�ºéÅñîód´¶—­Rgúì¶rc3€y¡aÌì”^¤û¿)ˇ3ë]ûî¯d+b ¯½YSãÀ+¦/±û~…ùÏ3Ñ*" ?V<%%’\«Á­?ã/ù|^iŸ¼dô¹¢ý£Í2,þ£ïÖŸÚ@¤{ÿ+-v‡ZòTex¡ ⥖y¹šSÈv ±V”[„ð V/^“Wò) 4 ×kîÒsFR5óÁÙ6d¸IÖ˜›™·Å�üe6aóM£(b42.PŒ‰›nížÅ0 «Ø0îLwŽn¦Þr·v© ï¦óù5K¢çç×ë~¥Ë‰³ÿ”ìŠÆN™·4n®²°™+Û.×ð[Y20ðÞÿ²Êáåv�U›3µüû•[ZðeÀJê§èë¾^לo;Š£ÍŒŠµ»äÛꆾ0‰üôÍ| �RrtÏò¶·¼õ�o[ø¤¼ ˜¨hx¾$¥Ó¢hŒhø/…a×Ò¯z"Ñ,ܹ‰f—dÉ52Í”@¯“l¶‹ZÆKW=õg‹’ ?è�góå@FûÑ\0X,ÂO¯ç_'? sÿF#Úøóüë± cð¯W$�LL|æ']ëéL¡è…$€ðÕª°�«uˆ©)Û�uT™O؆üÁ#×Àý¦Žœû_fÔ.£$¤'}lÄÊ´ãÌB‘?°7ÿ šÚRÓ4)v®nºBïã«¿æÁ#endstream endobj 85 0 obj 6100 endobj 89 0 obj <> stream xœí][³·q¶_�õçEyÙ¼íVxF¸_â(UÖÅ2K‘LVÅU¶LI¤I$Eжeÿùtcf€¦13ËsV¤R±ª|–»˜ÐhôõCãÛƒäAàÓßO¿¹zë·þðèùUúö ÿ™?}uõ한þ!¦Ö‡wîþ‘C´Vî?¼’Sûh„”7’î ™ ៑ —Õ¯—Æÿ|ÒfˆNjÒ’©¼Ÿtú„ÿ�÷ÿãJÅ0(à˜ûŸƒ<‡ 7h  iø «ãcµ _*�Ì Ôñ£†pL�qXí�šŸ¶ZÚùýÎû%e§ç-ÌcÙ§‘i|ZÁHƒâBÿq‘²KIœ0¬ <ç×Ò fœö³Åòi!3ªã×…~„”K-óPqù`$Zǘ¸b+iTtýͤµð#m@Gõ"7.[ж½>]›!X+7Ù£B™7Œ£ô×{SÂWT$›j\&¥"éá/ÈŽNOßJóŒ<8¡Âq€Ñ:1x㎿Á& )Ïð¸d ã•qJ™A˜™ißÚˆ TœššƒÇ})%6 CðÑEXí!ŒÍ¿‚‰À¡rn_‰ÏxÈ ky‘Vi • Ðî?K‚ܦ/s||þλŠÁ§…4°C¸Ç†M#P9„å®o¤FTE.â<@x§é8ŸæMõt~„¾ñÉIy’Y;¯ ÒBpã–¦SêónQƒ#B§­ª üK¥­jeŒãºô7ŒÓÿÝX'�“«:i±EÉÛF:IÍñ®§4ñîø«aSqÌ ÛÑ¥—Ì ýpÌ@ å¦o#)A5ZÃC�ö²‡šß _cÈ;îDz¼ÜËaµœ�nnŽäÐVzvƒºÁíÞœvcô¾Ìñ'Âg(U4üËšã{§k;åœm÷CRá„á¾[là~Ý‹q¸V0b Æ8€O€C`¡£î,_¢ÚÓKd+Ó;�Ψ} ‘e7HØB™ó�tÊËÁ9Ù°Š’°Z0Á0Q;5—™dØäýûWŸ\}{° ]“¹‰2ë `˜Cÿ‚5ûÎÝ«·î~xøîًϯÞúzë×øï|ü.ü¹ûÞá'Wïß=|r¦e«¢9¸K5µªYK"�ªA¤É$Rñ„j8r$Wéozä~’)^;®“ÄÃUó-�”Æ´Âj•í×:$þÌ›õ_Öå€m 2W$¥…�¬<Ê(¡å eP™ÃÜ™âÊÞ�­R$ô§4¯ÝèS/9Ž-¿F)-ÀÏŒô["¥'}V±Ô¿]„ŽŸŽóÓ>åâýÕ3Ù¥eÔÙ§+áoü�¨�ü�àF7Qç‘Îv{žä±§ke¥;þOI™L.§„VYvl*ñ)—g Ñ—`xY¼Ç9V¿ ^J«¥w:¯­µñô8ÆH 4Çû§€‰†&Ç“ûI_rÙ —W9õYVìQÉôÌ‚iø9§LÞ�­ÓÅ™cQ{ c`>XèkÝZ�·³q0Òµ‰;ügéCåE8ƒ‘Ì5Ó²³æ�kž#ÕG9%cm¡­>³ÔÇ(`]„õû(z?}òÀ/ïÍßq¼,ûo]ÓºW_‹Òõnß½|·äO¿ü!gËu{ÎlQ«h§!,Í2!(Þ4_Í&qŒ 6ˆß1YY§Óˆ4Ó�^×¢¼a¸Z‹F9X[¢\‘02�(Ñ‹Ê`#yVï•ÁiÖãlŒÆßÉ-Xð’5+fЉ¤¶+`–7)&'¼zd=JÓ0ÇWø~çT4Ü¥H/žŸ3IQH07px¯%më_ ÚÜH n%Ž´¦B"pm &Ãws0Ù”„·ŸüΠjM¡^ønv…eÏBYò-ŠI–ÛR@Çwìg£´"�ýHhænèÄr|m?V(œë6õ£[ïAmº,? F¢}’I: §=ß6 cͱ‰ ÞÀ�«Ii¦¸0�s9˜‹�Hª4φfÌ‚¾\ºù5p?‹il%Ï�ÁfËC93¸È&Òö¿¾ �ý¦*�ô†ÎöD„')…aÅ›Dâ•5úl=ðx@ý¢•Š¢5KTî�zfGWx}áU†1à­r6}Êu�öEF*< lb³3zÜ1µ÷›ï¬¥( WËÓª.0hwÐsT]:°üvŽêŠ)ÅÕEü·šPÙC¼|БC$ò¯ê@ÄæÌ_| 9)5jÆ[ÛÞýEÿÇ&À$A—Ç X¬£ˆ_Y|TÞÎþ5Aˆ±Ï¿5)Ìý4CïÀ‘" ò8�%;ÏÙ„I!t‰‡¨ò¯"pÐg û4 ’ã�.R”û¶yÇ>e¶yßx[nó[°PÁQ÷) .J£Poó6Î2ñ‘™Œ8>k1ž´¡�Úû�ý\_ó^ŽI‘‡¶#Y¥-�CÌ€‚ ‰˜·šÔÇ?Ÿ,ˆœ:¢EN¼Xd1{³ ú‡ØeÐÏ Ù]Ö�q7i‚· '¬sÐŒšžû×U�©k36–åià˜×Ú%ª ÏðwøG°d©ò< í¸0Û>x¾ Å.ý,BSCÑ‹[[È cny ±Ç,è3ÊMÐ9à šÂ›””Ea•0*JèuôWÚ"áÞ&ÀÞ=LÔ —(H˪y÷™Xÿž£ù/ÈXò±¤G¥) üO¡Ygš@àtôuqÀ{—ƒ?äÜ èê„ïª3Fó!¡Å!N+„WÜkô¶â ЦãbxKgOj3•<µßƾd*a:EánóÒ’ã t}^ SePÂÂl1ˆå!p<™¯¥@^k À×ç}Cg¾={³‰gŽ“ºnødÅ_Aþ¨Iƒ‡°·À­åÒV©Ïgƒ6ÔkÁûü퇲”•ÅSÎ1Ï"§ÎËÑeU¬/2…©ìŽ$Ü.ºù¦¬Ú„p7<ņUÿ}Ý(UÕ2þˆÙUžÃ®ëÖà>v•}v#E%ö¬R[ÂWÕ©Â�•dP›ò¦Ëj%™ùð2Hv%TÏeù¾<�Å’ãÎ7…Ò\ëÜKÇ[l`G[é—-LN_‘sù�ˆ-ŠŸ¨\2$µ‘5r¡„Ah-kF;÷§¸ a€_VŒ‡TTÊåü± кN�>a©«‘ �÷2qA±G^drÂúk˜à ó¡…t43ØÐf°!²3ŠÎÊL¿j N÷eC±x‡¸ÃšŸÈ©èm~jÒ5°.ñ“_@ ž®á¦ÆBø9=Ír”1N¡ÛtiŽ‚~àÅrT¨ÅU³Áj‚(?»i¯­C¶‹ú¦³(éR œËøCì;èÜ©•v&3ˆo�CÌÞ›¢@ÞÉyó¼ïö`¬,åÅ]<å ¹ù\² �µQËzsz6R›Ã Â9Þñ;LÛ�3 r:D€Ÿ~³ «IÏoÚ�«Ç¡Ære©ËtÿïÎ_í�; ‚A`‘y±Øž)iÁr¥åK*�(,©¥åùøºkÐ_ÐY°ÿñÁö¬Tðfòµ1‚Ñ ³�XÑf’NÆ%V�Iu: ÔÈ¥“« z±ƒŸhžaP¿q€ •ð4�‡Æý.?-SÒ„NäU†Yb+²róÝ èe¡ü-pϬ³ÍrÇà“Rö²‹#ݨ–»fÆeÜDSgô<ÞèCGùeè@GÏ“í̱òÑ©ƒ¨Îˆgh­Ç3Ív3Ê*5^de•Ë-(åMBü_j�Ë� 6åÁ‡ž½Ê\.˜…Ä¿þ?z¸=\WCÁê[ZZ>‰iKÛ®X¢'9–:KôtÖ+¬›g¤PIh©×ǧԘK¼|W‚C·oÒ}qÂó�@Ý~A MPp$ÇB­°Ëok§ò�#iª}šÃe›ö‰4ÃnYF$¨'Ï̾øy9b{ ±lÂoÅ®1’FüDc� ðÖѦ{’J×Úâ–keÀša�çv,nÞø||…geÛ‹› !¬`+]7V í�Óµ›Tzµ…›*‰8ÔZ‚¡>Ð…ëd`�´ß�˜íÒŒ‚tz#,ÝœöÉÌö‚ͬÛã^ƒÑ¨«©iìà´!™šx¼í’®£HE¨ÉàÞÄ… °¥ÍrNÙd?n1 %·ìƒçÆío;à9£àWgÎÏmÖç AÈa}Þ²á%¿Ng)õßž8Øo0>Æ�æ�¢+¯=Ú"êïpê°!JPG^V|A?)ÓT °&˜Ñv\œ|~ùa\g›R:¹ÜH–‘ŽŸ“¨`’Ä”S%ÿp'ÃÔØ)Öú~GàK <”Ñ^’ë%Ž \:3ýè�Ø­¤ö9x�fåd�p<1l£8˜i½ ü…~R¤¶£Z¨vNç_׬½8áðlBÀuúfº.ª“½å?€Ñ÷в7N ¹ùùÎ%§sI»¶B+¹íjOÞ<Íp¥XY D5;îN‰òuU|úƒ¬kÌ�_ŽN�sS¶ Åªpµ Òr[Ó”ñAöQQ“‚kŸåœó—ŒÊ~~¯!ËIð*œëh+·p# ®êªí‹“ö“mÜ�d‘ÄË“öŠ×+ùàN@ Ê¦ÐÅ„ã¨òÊ àeÇl2ÐIÃz²7ë½ôHl„­ ২h½€Ny�o4~¡;yÕŒ �»4aYi�MS’É+ùá6M�ùáõ4µ¯Ò<,Ì1íaÐ×<Ìû«·<Ìײ• ’°ÐäË)-—õ\MÍ©Šœ×5¾‡¦‡Óx>!qb[ &m&]˜Â2×dÑBYhcìº&k’ƒã=øàË�:eC¾i"3õ™c%ÓñÁh1ei,bmÏ%º8'söÕvïœÑ:óøÞ\ú§ö0Ûš­ã"˜^© ¤§ñõv'oâÄúóq¿keé~¯îInm©W2L+’ƒ\ªÆ)ØrTvž‡ÙfyÖ.p±å¡Vë^ê5¶¦t«DfØ(¦±œl¯L‡©ØBÔoÔµ™CÝÝ,?†l'f‘FÎÇÊÌ ×F €\­ê{°Žâ ¯ŒèÜ45élæ��ùD˜Ðk¯j‹£·TzŠgÛ¾)¢´%Ò½ c‹'<®4èÿÀ–ÂÞ*éïe”U)èæHºŽ0|Pl½Ûƒy¼où!²XZ…›8_܉9V.V¨KGóÅ ßã—.E‹NUÅ#9WÙ; èÍf?ú>«ˆ6Õ¼'Sa\ü´Ê ¡yOŒ¾ s h÷|•pÎåê궈ZYÔ /—Z¿ÈŸäO«µ¹ÛwÙ[±Û*z€«³•ÿ8 ê¦Nv�½¦Owò¯å‰ò§_Ö~Çæ%EKïƒüç@tT,Šä×Ð~äÊ)­ÌÀ$FucL§@uÿÖnƒµI5ë†,6Um^==q6dÿv¢™ N1š…jÛyùô"D~¸C0“LÇ«¯¿XêÜÝÆ¡oÐK`R!ÒÙ9V˼¼11¯¥r#à+ë›þ�àƒƒ³¼Dµ8ÏÕņlñ¿¿‹áCx8x�K¡iBJ¤TL%š‹’c÷jfÛ&€€–d)ÈÃ�ŠT.—|ÍI�G�Z©\ú‚)ÚÓ²‹ëÆ É5ø.VùãïKWñäï�Ž,_Všliñ*ÁÚNÊXð¦ò†/ÓåO«æ-Ý".O[»¹1PëC/rÍcîRI„t­ï–´.¸…9ªß1�i¥?þÃÉ`ýŽêì6Ñë÷èŽ\=`ÁÔˆlŽ0�K“xéèÇ�tÁ ÓâÚ» Yû´/1h(ÚòÕž Ç>6‰º*á‡Y‹4LÑÓ"E•ºäSQ[wߌê7"Ôºº/åå<"E‘0­KŒè•CF4_ÆiyJV),«ŸtUæsUË�ìÒÕ÷,öõ=åCu¦HóÖ^ƒ¡ác®O�¸sFX±|ÚbíuT“€Î¹·Ïæ³;̸ e‹{æZXb<».K@oÓ×®ëÃqþÝsímhdºÉ. ?“çæZñÎt7€µs'm‚ n[8ãBÙFí-$3�EM8ðH#"MkË·dªK0‡n¾*ºœÒ·4÷r®²¶ûÆ{é%‹¥Ã«¹HøfºUEFö>!Ð9Ì!döêÄÈŽ¤ =·õôs1§>GäjOÜìùËÄæƒÇ}zUO m—®9¶UHrŠÑ²I7 úìK`5C�1�û4q>‰×;K€xï„¢8'RºgÂÀ%œÓ'Wÿ ˜v endstream endobj 90 0 obj 6449 endobj 94 0 obj <> stream xœÕ]ÛÓdµqǯ_Ryˆqü:�óÅÌA÷‹m¨ ¶+!‰]Ál•ÖËX`ÙµÁüóé–ŽŽZ:’ΙùfÖWyç›9©ÕêþõU_ØÄ ÿ7ÿûñwoþÞž|s¾=ðÃ-Ÿ>»ûúŽÏ°ùêÃ;�àø“«I*#�þtÇçë›4÷þ`•�üòÅÝGy’“—ÊËãtRSÚÛ#¿?y«&ÁÕñ·x�1BˆãïÙ$¥úøâ^LÂ2n�ÏïO|rR8~|ŠW:Ï9?~ ¹„Kôñ¸IIxÐcø ¸3Ö?½þøe|¿–úøExÜn�_ÝŸ„‚·ÂSç ”>~ƒ¯bFËåUL2òe¾é|bnói&L ø]ð‰+Ã8LîŽ?¾WÚL8øÇytß/Ïy¿´Ú8;ß ¯¤“'7= 3fZy:äx�uÂ☄@J5�ž»‚�/›xc‘pWItòÞ'Ë`ÓJø…Â-”ОRš +SòÓûýç�Ôn28çÑ'À(_â '&µ�—TÍñ²7/�¹øäµÜvšï; x\¼÷ѽš´ôÜÀ“áBea5À­401y¡€ø’Ii9Ì\MÖÃMaâ n’|I®ü*<Ó‰ôpX̧0BoÓ¦|›Œ²8rÁÇ÷rÒØø{y&½öñrÁ'8?áÇ<æø32½éÓ4(\X5ç$Ü>÷ >ÇLšéôNy^¼¨#Ž¥›È•qN¸góËÓØ¬M´Á+qÑaÙD¼_*¸ZÏ3Æ›æ+™Qó„ðQ §fB#ÎïžgdôixýšP´z¿„Q‰bTŠü%ù¤Tâ/ú¬…x‰I4§·ÇWœ÷�g¬ª|ŽCÁMìá#kX%Y©É¥á£±ð×ñ»¸€Jš51ã´ÓO(T�<ì•Ó<çHgç½æO‘/$¶tŠÏ2‰ðýBÀ¥ö=ž_®\6 J|Í&ËõñßPb{ä€ã_‰2I8?o’ù‰NÚbÆdÀ³PT(plYkê_)1_kèµÀ.†q“.0î™2Íç9Ó…¿‡U×\º4u°@-Æyxèô!(¿Y"¡ž¬âËhY9åVÜS 5¬¿.hðQµ]èêáïýåKxÞªÝO2cM`4 /âIö çé®�ìÉè׿ÀïΈ› r�éh=µG|æËeÓ/³XØä9ÙeäÝË…d�äé,{0ð½u ¯] ¹’âÍ+ÿ¶0åòÚ�hß=³É{ð(Ã¥—í•péÂRÿ{ÌSo=ÔeÕ_ÏFt�Ì”ž}¤t|2^ßB….œÑ�Z/ÒÈÁ–aBÆËùÂGxÉoݽw÷õ4­ à…Ì~Xà´9j`ÀŽï¼{÷滿=¼xþòñÝ›8ð»7ÿÿï�ÿùüóÝýæÝÃ{]YN áHxhvc9È͈"E1¸šJ—¶“›8€KÛ¡U±]­@ &y‚@$ ˆ¡õ3¤¹ü�nž#åÆÂp7 tZ˜Ÿ‹Ñ�8Ö䋟àÌ=€*Ó�†–gMc=ä–�ñÛbHíM}R0K�Ç?ãô¼Ì’ÝZÈwÉ`Ž®Ô®yß·D62rì<‚Ï>µÊ4÷c½]”²Íg–Ûž)¬À§_GIÿ5e7n²Ûº5ª�¼âç‹hin_X´ž¢�lΣΈw8^è=¼þ  Ý�t0ă~ØÁI—Ô-W’Mh¢Óó'X)`HèDizÅ¢ >‰ª^hOõr‘ºÿ´ˆÚ<Чµ„Ç/Ÿ-eƒå î·²�-É«çä�{@$Áͨ �¹pq‰B$2€Ök<öÁÓ¬/“WÛªµÆÁÄ„¿S]PXÚ—ºª`z`¹ê’}–ß%ûÈ;¿{Íê|cýb¸�¸iî£r¬Tì;÷@ˆæ˜¹s­¹í@ÒR�ÿ‡á jîø.ÅÒµ!¼Ä“ûÒ&¿ Dp8¤|ñÃ4Ql PýVä p� uw¥#âZN S‡+[t½»h"£•0'-7ýyÙ3ßtIÀ’-3OWÆ@õK§ F³¤ƒj 弟¼òєԗ`2gꪪÞÈ5EéÞ| F'4ìeµ!Џ»T§—eMù�2 Mcx`\'еh§ªÀ·=elÊXZÝT‹¸¥¢èøW´‚�Óø1`'O\Z¢%³æÄŸ5B[Ýpá¥é~¡È]ßk� 4”À.cÊ£ýsƒqGÝ[QIf›å™=~:ç&CÄyW}*xÑ1í³ÏÐñy['Rˈ>yiJ»Ý­NW/Nš¦töp‘Gv´oôW8ë—¥X€*=–Úˆ wW3Âëþ1}õl®P,´¢KžBþD•z_Ѓk5;H­…ë+ÌX÷·ðLÐb~Y+äçç÷ c•æ6x®á£räåßgR¾¿ø¢Ök:Ï"xã˜#¹Ö®ÆôãŒiáAÖS—V¤3Ú�k·Qpn­|£^.ޘٙ؂âj´r¬0ÇgGžÑM—Œ�¸õV>Ó¸a©?½“°É¿¤@yÆÇâ >ô¸*E}.ÏÈì „*yøØ]Dܰˆz%\@~ýzØ‚]ÏôÛæ%樰 AÉbíÐZoÕ*Î .>ñît´œçÄÙЭ&Àb5€fðð±Æ«¼O¤ñs@ÚŠâl@ña¨�MhÆý5†iŒíÉ»OáZ` ÕéQ CG†~l8X|e°ýU3C%¥JLÊ@æ¿VyMÄ€óf[¢9�5€%§aVì&*vV^™²À¯zíø�YÐeUÇžá퀃\…àD €­´Œ2p7€�—k ×C/NÁÜ‚·EYøÈ]±\…÷ÈîY Ä*¸´;~¦kt?ƒi`,ÛvÜ ‘© Ëq½µg"ÜOuýrÿ¯¡ði¥¸bP­áúÿ& …á$âD�„³§è—eÀ‹-4Ù §}‘œx Z~„wø•pðH\Äuª".ŽŠ1ÙÚ(§4-‚wfáÖÜ-•¸ÚtI¨J*h˜ÔX®¡“]¯-†Åh;·`tm00&íE׆û…<þ;F4 g¼`ôl¥Pž 04‚X ÓYvµ(þñÌi@/>x2a‚RóNð n͇[U ;€ÂŸS“|êÀ û0ÿ^ãý–'ÄèØYËz­Ãp¥‘a•ôP¢öÏg˜o^˜ì»{§Ñ\’Ç7¨63×)ò(š[um s0|;ˆï)Î�è�C eƒõ_P3ï£wkn!á/Xh†@Us~¥ð—4˜“Â_š#Íà6Iã_è-œ�M×››P˜øƒÆ ¯0ŸV6G´§z@¼Ì®š±Þ”`/Mz�ï€fÌ·AàrÙ£’ ?Ç}€¸i“åØkØÏäÒ'yÔ…ÁÔ°·ð©°>LQƒk)^Å” òH æ²Ò�}ņ… ´ab=i|½«ãÁø6ÙPMp%`9U�­ˆ¿o„­†P8eÌ×¾�“Ç›þŒc˜)μƒ*˜9o!ã‚Ê™·�T´¾;(X$ÉͶ�Ôw¨ò`Œˆ][(FÂÅl»ÔæQs‰¿½?áFE³…È¥+´t6^©ºÂ†£âÜPØ(æaµá5rRJU¶…±ÞTÂf�I—®\Ò¥úz£xH“}Ýid�Ä®�€Pâ£Di"Q`Ù"MV6TIM°¡ÿ ñ�\cv ;v¹:Zž™vBÄ|�ó|•�u–Ÿ¼ýÄsí~Ô“äóφ³(|™Š1,Ó·:ØÛôÞà ö2™›ë{�"Dt¥OlЩC¬˜ýJÍ:BÆCé+[hƒjòz-4ºÚ*&IêUb¬ˆ$IH¯ÜÑ1ç•ícù¿*+¬¹6àÙ�’Icf!pÌrõ†Â(�ØQn|ÃéHŠç]ò@‡²¯ô}º«ôWhºvz¿Wâ|<ˆŠoNÝK 54Ö;L"Òì–ÉCh*°à@ÎF‹0íTSº$Û¾(ƒÇLôÒ|;)ÊL´;å¾/6$µ;7eÄ;Psh‰2 ÝÜÎÎâL£¡ÏPºQK?ûpËTQæ,„ f¼y8Ì5ê¨Úp ‚µ §ßå®èfšÉrùfÀ �ØcEtKfnÉÚ]‘#viQî¸1Zœf¸wÞøeB^jdž‘0×à-¿ñ†‘NO®Ü/`šÀ∵’4Kjds…PWß�µda ¯ql*²ªYo´N)(ã+rê7 ÕDœåSÙ�×Önß{,K·yÇ{œ— €¾Šž_š•Üh.Ëx#—Fv ÑnŸÚèQp|PÄ.°ô]t°Ñ½  d3N–*u†¦M)þÈ¡¢Øç,9$lŒÚI¯®½j+n‡^^éõä]D˜í|_õÜË ŠÑ¡½¼ï`*¼rÛ™më¶VYP‰Kò)”, lw…_@#$¸âB6­2 ‰/{9{ð;0¸Ë0i¾e•]”ŠÑòÀ�7'šâ¡=yM´­Øm1ù=µPb†‡Ìð+5cm×B‰én¾l fìal¿É4˜"vY,亀fôIµóÍ ›O¸4¦ˆ[`' &'{¿ê°¬5·’07<¥8F¯r`aÊÍ•… q¾¿¿Ÿ«PµÒ`ËF¦s¬y°¸ML•Çœ=÷ýØý* ¬ ¦î„$L3<�Ô]FR5ßBR`ûO”ù‘ ÍJ_� ]ñØÍÓÛš2ò¨ÏÍ™:Ëå㎎*ûgJÜ+‰ ©MZ²¯Ë#(Èð™S‹*™op¥ n‰ :`k9&ªb|̨”>Æž '˜á„ÍRÈçÓ: ÞCI”²sý;¶(Ü:Za_Žž6qì¶Z9�E�Š¿4–òéÏÒ ´ìŒ¼ŽÐci”û\*i¥Ã&ÇE¿ƒ?a»c,%ØYˆÈùÕz”¢U3Ð'j+»Ùš¹W!ÖJ#JÉ+¶iÞ-ò¢×GIbË"Q¦ú|I ÃêµîÁ¾~“�ՠ¤~m“ìxˆ�MohxvÄ?±×a` � ¤õ„×Õ§ƒÄš¼—k�(ÃÁRÓÏ3ÃÎ�¼sŠm{4?¼¨'\ŠcÃII^¶7*m)•”kjÕõr©ì›[�º¢iæ€-¼!Bªvb³¸Ç)ËNF�EímÖ‚¸8VY?v9-[리ŠMtº@ªÎvÞéëóÁÁƒ�Ú{‚Û;ÛéÅÅÓ†5qš�S�ö‡ñ«Dç¿#jôVœ3KÔb§‡ªÌJ‚5õ`i7¼šˆ¥=e‘G`ÜjNZ[ 45¥ Êù~€�ªÎ“ 6ÚɈ×Ná(m®fП—ŒP5z»B~±Ëé¸åõ!ü#R§Õ‰ºshFe!�ËI–º#œÀ4Ý'ª8ø‡RQ2R;eçyBÚõg<„gnÎý¿¦Á×@”}•ÆJN¤Ùïä~:£)ѺtfãÝÿöŽêBϹ…e®"ëTâ9¨�Õ"û�àaN9ùpé9# ñ÷žàXBtÒöì³Ûs¼kÅ�\!1“§¨U�~È?Ü;0Ë-·‹Ï‡ÙÖz$q~ÂTá·¬©‡ï'É5Ûqpe5Ðîz"¼ íð|Àr5›õr�àULcÐ&KǤO7½]‡Ö¤�cÛñÃȱÝÔíØÝ±˜Î)@Ä0±ÃoéJî%©:›‡;\LMÒ¸<´ œJì u�Òfav†7SÌ>ªòkëìÒ|e§Šnxªô´8üâô`-€�çÂ�Þ¤S8­35�“h§yï.` �•x,01Ç–h'>U8Jò¬§qõ­N£â® ÐËüòÔ‘ѼvôZòØ'ËdȰ¾\Æ’f¨=¥ ¹?SèÓ0!æÚo¸)áž¾mZÐ]§ÿ}÷è_?˜O%÷ܤdÈ��Ã*�7!|UY^KN‘Ä÷y½Ÿx»}@ÌêlõúÀÊükôYÚõAr[†3[ãÝN–ñ³Ðž³7Z±ŒºÁapËWIô‹_~•²Dˆ…¼À0ÃÆ4.#ÍÛ‰Ù —<‰ž·O‹Älj†Í°8=[ý„¢Ài0øÃQ4xL ŒŽžüЬ‚*û§Û'³´$=úu¹p~§Á‰"ËXø´FRvØBùjÏ‹­áN;$º�$krJ‘"UˆæöN@i¦\Ÿ[m=IT'4ÎÝ«täM§×\ç½­Ò Ðx&½÷Kö«êD–Üu¡*‰0Í›õö%!‡Áþ]–æm&Í 4T©ªð¼ž7[ëÎò$£HLÛ$ñèÌ‹uEBØB æ89áj!×ß6ÚÈv92EÊjj”¤EîÃòŒd[ïì™!�Ù?|ÜÓ¡ÑŒ;°�]ºØ60£T@#�äØüä¤Ú/WÂÌÄ …s,¾ ¦Í<¶¤Î"Y¹V†ô\¨UO!³ãá`ÔG JËB}ÇVGtW-hkßXæÑê=ÉEMm¥tµ sz!b,Öჳº`KMÖ‰ö!YÕY$(.>-2bE�ô¥*l¨«D�¦ÛÐE�ܸ»«%ŽXÓ6™¥&Êô½‹«Ð1;†Š‡í©¹õ öÍ2�4Ë~¡å:nªÄ#<î^¸d‚œ&Y·<,™.Ä[oU¢v�ÄòÍïà©ð0)‡¹&¹öç%óË2/mÕjõŽoK;âwaòN:ÂÈ1ÁÑAƒè½üˆ 5ô|–å’±•EHÚ+`\YõUj�@.ðï@Hp':�sS’x½_l;‰ö �¨¿Vt�’±ªZGåËüðXmTdˆ¼¶DšáÔÌLÃSÊÐËÏ�™Éøö™¥¥zCSÛ3PJ~¶© Wõ¢ˆL ÿÏ,f¢¬QÌ€âYègà²: PzŠížÎõ�G×Έð’�š€-QÉæÍO²ŽÉ¸¾i®mµCÍuŽXg]Â=ƒ&ëÊ„ïâƒü­Ï[÷CÜú@W-› 2~BÀýÙŒ {>T(;¾­Nº“f uvò¦tZ¤uæâ�l’¶OžšÿÏÎÞNÒŒ?Ѷí\Í1c¾2¤´UØÈUšãd¹FcÈÝÉrA¡YkL;"bMNm)ó�;�š«Ã®Õ¨¹JÐZ�¾YÁH³g$Xù¡†þk„=´‚)¼¥뾜k"6/<œ°á’ðÇóõ¼�8!ñÞÝÿÆ(jñendstream endobj 95 0 obj 7881 endobj 99 0 obj <> stream xœÍ]I“Çq¦¯°B'ë¦Ãø6cišµ/¶ébÈ´µQD„² @B H€ !QÖŸwf-]•ÕYýúͼ¡hEX£‡êîZrùr­/¯Ä"¯þ§ü÷³Ï½ûkõâ«Gé×+yõ?ë_zôå#Yþ‡(£¯Þhu%å­UWO>{$Ëø +c¼òÆ/ þåóG¿½~~s«©´±¿{òßø¤èŸŒ‹vB:xúÉsüÞÍ­ jÑÆ\ÿïõÍ­XœñÚúë¸QKTZ«òòuåï„êß±(§½,ƒ]?Ø.!êà?ÝÜÊ%xã÷æu^›E˜+¿D/¤LÃ)£ÕWøª<þñ�YŒ‰š›�[bZò:x3ÁÎáoÚ†p“5‹í·òÀ”£šO™ÌA¹ÚÚ”ÿp#à]JXwýÎ>),·XxR#E\x»•ÐòøvÛè=Ùn¤±¨Ãõà¹E”Ü¢•ăZÉ*“ Ñæz¹¹5 NB˜ëo`�’Î^o�q‘A_�Ï)ê¯�¬PæúSü¬_¬Ö×oºŸÞh87mÕõçëžf V.–�BøB}Õø£ êúl™Ð‹öúúYz¥4¡¾H8sý,ÕGâ:©VK3Ùž©ž=Sc­îv¤Ê¨sÈÑ{v~‰‰ç,¤¨�Q:S§òï8Xg Këj1AHzìBYîÅRãD$}qŽ%Dx±îèé¼}ƒ­8¶o¿€S”Þ;ç¸9„E¤�¸«ìI„òã•PØ=‘‹™N~�ý¦Åý}…Ìä`¤àd-dGÖ¯|q£Õ" °ÏŸo´†•º°üùÛ�&z +‡©ÝJ ¬üÅg+ï•7jäB ‡ªaŸ$Öò2”™iá}á7ü±cÒÂðA{2öÕªˆP:hdû7’“ì£�Kì$ç=E¢ŽÉ QÁÓ~¦E <¯+eU®Z\Gø?„•аè}>¯Ì5Ð+ì\TÜLÃ"©ðþ1¼^ ˜«»þ ¬Ðêè|²8ç&L·"è�Õš‚lóa,<¦"O°>qÛ¬°²û››[»H§,´Ü,t@X" ËtØ&©V•y{ ¼Ï¤î“ØüÉÏ=ù—­,Uœ~ÔE”\DZ«]iý^Û£S䲳ȓ+«ß½×Ê6ô©yj„Òmiÿ6ÊFB@ÔN'ñVHÁ+­ ±å=»8ª=o/¦ºÅ'FR÷Õ-™¿},ˆ~¾~[ùû g@LýÇ�ñ`ÔnáȆ$Rùw«%‹P�&úþ®jyÀœ²?»ý�ÐÉ*U\Ã9{²º5h;«²doæ@yê®ì*)Àzd‹pvÈ:A‡NHþe}¢×`D»ÂãqqÑ•ÓÐQÖ±É.Ëï‚ ¾.#Cô8(_PÁz«½”f±©@-¾^ÁízØ_³(ùyþ� 4ê~çÝõ_ów|íñF>¸lŒ^¢°s¸nì�Îm–�˜ïUMû(>o@})wýSø¬غn&/Û.½l¿þ­íÍÏaÉÁëžüû/õ?½Q6¶7Ía‹ŠIð€¢J[ ±`êó•Þ^#‚îm€ÿ}ÜÒ4û¯yâUc@¤"G¦üõoÛÙˆ|Páúwíß)ʼè ›Ù£·¢ÿ¥«ô¾šKÒóY!c’ð}�Äß¾BYâ–Žæm.Ò¦hb‡Ùz$÷¦{ìó=¡.…‚}¨Çñ>|T6*¡\¨c”�ÏÛþðg�>€9HéÝìÅ‘ºK¨5¤†Á¾ƒG?²�3�3û Ú›ðÀèë�œQIJïèqÆÙçLÆŸ5Ç_Ãâ­Ô��NÜŸÈ€ŒÜ0�ñÕTŽ×  X©¢¿FÅÅ=]�°oT�RYlRŽZ£Úó+£‹°ÇèI6õ¼Ñ½6Û]ÁÆ•M@Ú÷r° š†‘»§³•a¤ì~¯nÕ*­ÓÎÃ3½6Ot ù€Ÿ3C;Ñþ$‚i‹^R±ûBdдŸWoäj8QÉñ†ß)°´‡°’:7E|™ìU¡:5Ö™f/áù(àØèYÀ‚tÐIõþßú¦ •UÕž‡ÊN÷3”Y7†å6 !sL‚™lfò¤;Çx?L?ô™#0;lðóí¢&dµÕb�{—kQHøI^²Ãɺ�œœ`·¿)OË9y‚^%5¯�½þ‚Kvn=gœë\< ²–7¼v~Úc¼Ê�“¬ä÷’e'üVHثà [‡ÈÞ V×LÞ×ô v_­ /o(�'äÈÌÍȬPQÍ…à3=„xZP €´J‡2ôн¡Þ-­L¡Kth,¼Ì…æE™bó0mÞξ¨ó0uÂa+áÚárx/qÑð çx·sx#Ë}ƒ¯\¯å–’ªëa2ë:ýÞ¬�]�šŠe”lUúõŒ2aƒWê}ÝþH§ë´¤c,XZêК;_zoEð³á2ü–Qˆa.À1ËÍ­�ð9�ÙèóNõb<�¿srx«Ó)âH-âبÂBu¢>eИ ¬+¤f0b‚ g°Ø—ûùÈÐò:ðLd8H¨™‘Ñ´ï­qq "Zl^ïÓZ³íÚ#« Ë:Ê Á—ûJÝ&ßÖ» �ÄG°[NjÞ;=øCN¹Nù°gói‰Ç q=W� ”í W °ýÖøSK¦�]„ÒÎv¤Eçx‘„GÃ3kçÔ,üvN€Ïä ²3$Ë?[ë_*n„u ÇBÐÉ=’h'òæE�˜(EÞ®Ïw‡¸}?‹7x@s~«\ð¢Â9`nÃ%†Î­qëÈzÌö-@Ó}k$oÔÓZ!t§'oÑ,*÷¯oT\à$ÌGJ]•ƒ¦™0ŠÕÜ›€Qóš 5p/ ‘è„úÞ’‡SÆ#S¼§$®à4ŽíÅÈDl]7ë¹%ª^ô+�¯ z)sü"q¡ª�L5Ò;Ë1@Æ0üQÔHtnÁç”Bd" [ŠŽ8ø,ˆãd@ÁÊ´ ¸6¢ÒAû Ì[�Êý¯í©OáMJçCÿîýÝãÆ?½�.¾ô‹ƒÕ~Œ¯òÖ_ž’¡¾Hg}j¼ßïF kb÷©·íÇe/,²~ùëÉ  g‹E–ë^ùE{úkœ“]l²|ëDºÕuú ,ãô”‚÷Z²yþ�z/ÆÏÊèê\TH´;a$ZíxR°S¾¾Í¥[>ÒMÄØ):ñW |f<\I¥ePT×Ú4¬Ìè(Ö¡ŽHajw渲ì°÷+°Q‹¦ãÚ·ëÈï¯ùY'°q”£ÒèðìùœJI-a"Dt½fÀú̹\9}Mè0f«Š»i(X\D§îé •»º¼�¦ák¦Šð^�¾ê-�aÏpzí=Y„+M4há@U„»*ÂU½Þg6ÀÆÂs^€gÉ-®bÀÏVÙHs<ãKûÀSz�³ýË É ¡YX–üš–’<(šN]6—‚É‹X #9Bܵ²çN• S×ÃþQ³%¿{ÉÃ=ª%`Á`QÆÓŒ)íá �™ bÆ7¢eÇzO9Û> ¬;»X6PJYæ“™F�ZãHë§?a”cÊçueqTèÍŒŽ�Ó·øž Σ“º:� 1ÎI(Mƒ@°"žøâ×t°fæv¦ïÓiBϳlœ‚C`;<Rÿ�_­|Â-®§ÌñË ®(’Äöxµ‡sÔ —I0_7 ø£X©ŸØX)a\êw*CÝNÌÒó/âWvô: 2UQk-«¨&@³[NKnbñ4¢6�Ϫ·qßAÿ�Áwâ)ù‰¦ê6N¶?‡kCÂÄ·T)ú>Š'EŒb�&-¬ÓÔµ½üäóŠû<˥ݧ:�Ã*"jr(®)꽸½TÊd–fÈžPå�v#—�‘ÆiØ„Êò#ð#•KõW6•¢ƒM_ñþ†ºÏžA#'³2¨“©lµ ³ß@±y›·ÁeK#™éàM,ã�"Þ-šŽ“b·.ZØ!y“|-WÁ¸ëWN¥|×”›–ª@ÌÁÖ•�’�õá€ÙèþNûD'¢Kö?Yp²j[òònR"ɺђdã^.µÿÞ'¯£-'¯4›;…'ï£ßÉ�¢³:šz¦�A§é:ú?ÆHúåR”÷ÒÈHqDÞA°tÙÜ© MÜ}+Æ´‚äqn´Öã†!P?˜NlÂ>;ù@¬ÔÊûçRŠuÔï­2%Sñu$ŸW:îwªüÐS8Ì9ù¯i{ù¯ë7{58òs zeÛBF·(E�r§ÒS-Xð1ì�ÌQqOÊ8“ E NþÕq®á¬»µò)7`D3ì�d×WH{¾ÑA,z(Ô¢Éu!B�›ï÷§8u»Éaö„2þMT“@íf�ˆn¿ÊCVøYö£IØôÇk¾D71âF`æ{ýý5»qt%�Æè.2ž:fÖ´4ÆóR�€ì¯¼tE=+´¬XÀ®¿þ z,­—í«ºwFO¨b"KµÆtµ~¦+‚�˜+(EHHûh_¨! œ8ÂÊf{42Þ¡r’2:‹‘n*³ºÈMbz^Ü÷ºO†âY»bÎ02 ÿ¤ a“";— 5%r%JÎ@ê6Ö_ÐÛ© <_m'| Âd_ÉFJ¸�q¢Õ@Èj £Ûòë©É–W¿yo¡™©g´ŠÑY¦À�w<Îau¥M\>/XÂbæhÐÜã˜�R{šöófweöÁô 5tÛÓ5ú£•õ4+­N¨¿h"ÿ´Ë¤/Ô‚óô‹ïØ’Íuþó�µËäî_ÞèÍ�ˆ‡æý–Æšo&o 53;Öùb�@>’ŒÓÛžUw⤌:ÛRÁÂàÒɤk&Û>ÏGNäHlÉ1+6.qÿ"ôX8iðÓ!™°NþVXJp))I¡O{5×z¸x§�»Q7çŸë`ëÙt ø½ X³ŸÇÈ (? ‡õév9z`0]ô^púÆnq,Ü ÄÎQæÐ7ø4%ç ÕV¥ D´-ÝϺ|“ìÆ2ÁD Q°öƒM¹-æèô6Sï�E³{†�ÈnnÇ~•j­ +ƒ_ãyLîã¹x¹5îYÝï`pþ�5X/×cÜ­*/6‘¤4•ÁÄPz'»$` Ol«U:.qp …!jïh€»=œ#ïïElŽ�€à;Yg1É“w¦‚)”|ŽuZŠ÷r; Ühª+ºõ�  ›Z:«ØOí¾v(à;ëÍú¼7ß‚x­¨®ÿuòçÞ§A/õŽ"�jA7õ›'ϵ’l~< ]$ »Ó^!ÕHÝ+pwò>çT@UÍÄä´¥ðEÐ °I§ rÝ•u¡¨ ’ÍdƒLùMjìŸBð]äì Ï¨°›�¬£& ecïå3Ò”@ŒêåÑO}ôèË+RÇÄWFIW&Z$l(óþ‡�ÞýðçW_¿yûé£ws%½û_øÿÞÿÕcø¯rõΣ>¼úèÌæ2ðÜ&Ød8ÑÜ[æŸq¬³”["¤ó‹b9v÷ºN×4P4¨5 °t)™ö-F:3�í÷¶å½ì7_HUVâ� ¦E'R �áE%ØHDò/¤\b¬‹z_7ä ». „ºÙJ£1~t­ ZžFÝÛÆ^’Ì‘ú [ÌÚe’Ÿ·_; KÛ !Ÿ÷7Ê·!/µÚbêNxVËþºU©ÂÂçSüS¢•¬ÛA¶�î°ëÔ•jøRíø“{Hõ>Ø1+f¤'Áܼ֗¸tiã†â@îÜ*)±©Âõ?bœ³N°œ¢rñ fžhŠæL�g:î ßà¯n}?è”g½´• @ðâ¨&ÀL&ñÎ;»Puº“wŸÔži:lj@Ó.%]ƒ‹Sô&sï²ùö¯{~,žáêŽß—ýöW¸�o1¿.$yPÆNó¤yl™…Œðlp¶¶9Ù 7Ý�eÖ m"%—†ÔT‹&é1³Ì‰ÅëxÍe‰ŸŽQ´”q¶µÐb¤–kéÅFvH[7Û¡S”¼¿C»Ò¶;d´Æ„̹׆ M³¼]q;i鑿Z«ú&mçò3'Æï'äïÐÉûÓíõçñgH÷@{rýèœj÷}%sàü÷ùü„øªÆåå‚ûcBŒíÖúò�îÚ¢TF´|ÚÕ)¼¬–£`™Î£ ¿SÐÙsm�÷rۅΛ6’?:åHs‡i†“ªÝÈ­tv¼ò¹ã‹9fuaóÀ€jñú`öAígs¡V>¬ßÙ[ÀCçµA›Ëž»¦fQÞwCÞÐ ðmH3Ú{§öQ;<oU±Ãöœ¦Øc{NSÌØ~#U°æÙ#†ÔKj®~‚(@ŸöánË8BsèE<;¸4•¦ý`P÷¬#Šª×”´�˜É`ǰçêviÎ-– î!°,†u;ýxËž…ö}É\¥XvŠö©—K ; ßô€e«šË˜(X6æötÉ‘—¥ó›¦X65…a¸Î†²c,G²»"v”OоNBYyŽ|b�Êr¸ä‚PÖœèA<ú[{RÇx“Q˜;Ð5–F_ÀŒÝp'œ‰œŸvRß»7p6Ë»ù¨†³êLÕvé|‡T0þ¦óî˜l¹ÆAwk”RšKëñÁf¤MRfh>R] áÙ‡s�Ÿ—¤I²ÿ« Ü’6Ê;wþ‡}àqcnìÚ;ÇŠ7Òʼn¯Ž÷F^¸øDÉìù>ŠsqÔGîËî!tvTƒH‚¶/­A ÿ°.Õ9ô=xÒyEÃ}IÛƒÿvb'‡Ã )ðáØF0|paC�í ŠƒáXÜ¡$Èt³¿TÜ!%Ètï½oÌáb›D,‹.T±?AyßCÞć»p§u2�i{Z÷NgÊ©ì‰�#•g˜¤½ÌõŒ¶º±îˆG¿u±ïvÄþ;Cxà@®Úéàw€Oè‰Ë8–ôàX:KÕí«ˆÔ ì¸šKxACiß;;Ô[Vwøè Ójíý*·] GT8íÇš@±âIÏ}¡]£ø8õpÍ(zÚ7Šl ¬J— R÷Š¿Z4ºbïFønt�xSz*XZHÙÐtkÎÒ€ó؈c0kgýŸµäÂIO�a@²ær…P¶‘˜VÏ·¾óï­&Öé~²H4év&þÒÌ4éN–ߦŒƒ£ž\IîçXîí¼Ð׿Ŀs²^ ²¹M²OPÊ=7ÍZ´�£(©y›·½Òx6ÈYz‹Gc >½©å¡ÖZZ0?éí´©÷§žDv¨|J #e¿»“›d‡6¤¨ªûbÙ²N×®<è¹�TÊ×þl™\„6ÖPòÙy96%Ÿƒ—ãTÉ' _žp£Qˆôn´mÉçeÜhÛ’ÏæFÛƒvH—x�´�Ç ã"©B>˜Ò°)ö˜–õn‹=vÏ7êhxZ�[EÏ«)Cœ Ë<]xç^Ãz¥lDoÕÃÞy�u}ʪõR÷S…w߉¢;¼»IøX%’^ñ!¶¾C¾0ЯÝ^uîýöÇ §ÓŠ-JŸ8úkÁó˜z0ô×[Û?`™Bô0¶¥©šhÅð÷�Âß½Ì5Yƒ_°Î®4m"š²ÒåÄ{Ë5ˆÚ´:ELøv°…0ƒ�"F°=T´S.ö˜ÇÛ3KŸ%¥¦­|/Ú&7 54T^áéW[ûTçŠmk<{ã÷pQª6ã�=Lã¯Iå2×’v‚Ó¸¾6%‡•w5ñXóŽY›¦dz«!ØÖGŸP^º†æ‡OÆ8I'¬¶üWÅ8³vïôÔräÓÅõsf ÛìT;àJÜÝ�(¹£¯VÄ6íèKn £Î±Ísk¡õ³Bò±@¥ù¡¡XÊùl�—T×ÓzÛîàïÜXoË©xeË›xš‚#6¶‚õÑ'}„Z?ª§õB‚Ù¨†I&Âu!"1/¨d߇oÒõ§eþïW÷þïo+v,q¢y=wï_®, ô6¬×Ò[ ÛÿÙK÷ÑÔ < -ð]ï>åL?„À ‚Þ½â­#MY¾›-Qw®&O¤>f�ä^P“Íõm£Hô£päÞÏ®ç¹é† .püTŒáBWÉJ�=rfíƒè.‡e¯l 9ÂË1��RÆ‚”þ»"6·W™eÁ ”ëGOjNñ–dï¦*RŽöö3Á°¤«ž¨½HßxŸiÖz §¶W¤fúæƒmÉÝu¹)gàý2“öˆÔÑYú,‡v ¬~{…øöþ-Á›éi†ªï× Îþ%«uv©\#GõC_?'�Ž�÷<qâüFS×Ä_t¤[‡ŒSÉÝ c39ÇùVÖVof‘Q˜Y‡ ÕÆ~G Þó)‚‚äæÔpY°lKÔ±¡kºkœñ(p—ÕÀyeÊ¢€‰´L ~j£æ§K\ ]8Cñ\ ‹1=¢É§²€Qk…b‘/äÖu«ÀT&ûãÎûª:àœé•‹oŽYz->;úÔrvš;ÚüöR÷Ì3¹VÆ®kÀx8 �÷Á?ʼn¤�Û N}°ä'Þ• K776<öE>nX=ÅJ𫳄:¿N‡ÐZo^ö¾Ñ#ô�*Ã:~žÓI%J™ˆ˜¨.f7Kçœ[ͺÏólmKÙ �»µY;�4h”t&Us ö~»"ngWwìÁ7åâiZš»›>À¤»Ð„ààðó+ á¤àƒ�õ¦³v0%¥Uö�½.IŸÝgÙc©µgKúî`]lÒy&jb̺@ÝäÌÅR™3�œËú�Tܵ7 í)È:æ†Ï�h"錾]¤P±êOJ_ÿu¦lLW.Ê).é ò±ä§eb%½)wÏÓ %‘¤-¯Ù&9¤üLëx¡7 `¤GöÙ Xaò‹v#ìucO Åf )ÔÙiÁžSew4Q’ZnÔD8]+�´hÏ9Ï'k6%l‹þdà°w)ÑìéhœcÒݲÁUï'=¥óÀ®@I0hѵkï´"½-`+tŽˆ‘|é’‚m4jó*ÛÝ]�ڳʱ”�ªèOV}ÌÄ3OÜ=’ïù“]jpY>íõ1IVªªÐl¥œeJšrOb;qR0®ß¬¶{s»bNÍONtÍù.ERI´h%ÔIžK©/[úÒKrÎÛ–Õñè­EàŽâ8Þ%vôڙ͕®É?O:Ú^ßL.=ɺTt‰®C4ŒñïmüÕáº"ˆxYâ.ó®-»½›ZD\ bŸ+�§·­*|Ñôä²7ÈO0Ì�üôªã§Jª;Hý�…Éú‹Æ*µ#â=î0kš¨�ÜbÚ”èÑOõDÎèd¦) ®‡‹X²ÕlÙ4èõ§ÑU¹1œVçÜ�Æd9‡@o.»N”Ûf«Ã'uiïC½„ÎaŒ¦ú†e]MŸ0ùë•²ú&.�äLäTQÿ¥Y A³‚k®AØ$á;½¨È$0~9^Qõz5ãªä§Í¥ØÎ"Û@ïÊKTXf«Ž^î¨Ûäœsi8º°�\ŒÂÌùšJ.7 Œ†‰‰óÀ9Nƒæ+.ÅF ߬*¬ ü–’æŠõÀÅv@ÄÅ’“/L—¾äÛhâig›õ|':aÐTprÞ¡?1BáNŽ‚ÆòZ)«ikä¥XÉxýŸëÊòK½Ó~Ixíh$6ÃÞêVήÜê6ø1R?~·'-î9Í’H07¶Ÿ…ëð;! ùré¨È[‘µ�éª-z|· î*µz?—“�vxèòÎÌ®ëƒ9dôh^°=L<¬Ýö;P»Ì|MþèÑÿj:êFendstream endobj 100 0 obj 8054 endobj 104 0 obj <> stream xœÝ]Y“Çq_7ôfû}gmL£ë®’MEˆ’‚-†M~ ø@` @&‚!‹b„~»3ëèʪÎê9v–І³ÝudåñåUóÝnžÄnÆÿ埾ºzø;·{þî*~»»_>}sõÝ•Èÿ1ç§wŸ<†à?…ž”¶r÷øÙ•ÈÏûy2"„�Ón’ð—WW_ìÕõAMAé öÓõAO³6Áíõõ!8=I¡÷ŸâÖJ)÷_]Ï“RFšý÷×r’nnÿöú &¯¤û?à“>!ö‚�BÁ#†~[ßúF’Â[çéÜøäõ?âGç‚Õð>Œï&+õþ¾?[£Äþ¼¯ÕltX^ vÿ zžeVø²€`dØßÀ£ÒÀÀnÿ9~댅úG�—Ëbfié\uÙïë—Ï3]ÍþÇåÓãkƒØô·ËwdÈ×õíïáÛI(²B)2Ù?¾¥ä¤Úc![}ÞO‹ôÉk‘³†i6aÿêúËÇÿv¥�Q<ðÎã`Bˆz>‰R�Ix[4-ßâ0§€ýàŒ‰üxÈã$Œ’ÆþüÏÈY<¹y N�)_>½V“±@ãxòNÞÇíΓÕ'|‘¾²†Š š¤UNìßÄ¿{Ù¼”¦’³±°_9©•†Ó\^z‰sáž |\Ez‘½dYÍ[ø(Ÿ£oý€oÙI9›ßÚ—ÎÀѯËß]ëÉéC³Ô·ésP!”¹äB¬8Á2À×Ë¢"gà¸Á _/ y“Ÿ„×_”qÈ4ï�¦vÒby?.$RBMÚz2ÁWuOôY²ÒúlM9»H˜BѼö"ñá�yWRÞµbÒz6e9ŸÀ|³—Jq|½ŸEyöŸp·2ÌVqÃG«Â"lÿ€ËVyï÷�Pð”…�ì,À¹v–åÅß_oo@ÍfaËãÈ#“�Z;nl †¼hÏ‘¾af× ´¦‹øÕöj?×s{€geq}2Í@ÍX6�Þû8w£‚°Eþmá 5‹"3„ÕA(¸…+0•h[Ò›Pvi›]Âßš‡�õ|ð�=œ´ ìMY0¦ Õq€oíd65šu“â|�&e£/P£9PÍÀè¿Å×t˜…h„åyýHéGžX y—h`‰0«RÓ,A�.’H”à@ß0�¦?Ãyk¢Ð`E wAà\#§Y£ †©:—䪅öYQõ“­ R³üGÜùƒL2!è’ÑÔ:XI E�ÑÉñ“�×Ó1Ìðœ½�¬Ñ+%ŠLVõIRv =Uwxöð>9‚›H01‘1€ÙTwB(*Ƶ­U_])чï[c¤“$ÀŽÍd£üEH¹¯Øƒe1 �—³}³ð31�Å*† Ö�ÚÞ„_®Mò9œÞ„¡¸¼ï¸¿û±R ™F¼´€†•uE’:gWÆâWÐPO~½˜³@¯›ììÈ”¶æ• r±{•áÞ/~Ò’ÙË1œñ¤•µNÀ–áy[ Ó¡Â…yª±xàuÓ+ð�‡Ãb*òåŸ ’#*ÙÂZwhˆf%Ò<YÎ�SÙð7-È¡yé3˜Ôk`Í1PÌ“^ åKÏJ©%7¶�5”¨A{O6H4n`4=È=7 âK‚º h¹sxJB¤  ôÈü`°šÊæa5}v¦À‘³ððmÜv6W•¾b­²ÉÖ^eB}29 “™$À,$‹ŸD=>.–øõã«Ï®¾Ûµå¼çÕïœà›;ëPË£ûüÉ£«‡�>Ý}ÿöý×Wÿk'®þÿï“ÿü%üóèW»Ÿ\ýúÑ+ÝYôìJÃ<°²�¾5>yÒr“a-| Îá†â¿<±š3,ÄÒh@ ‡?I“Î-§Þ‘×"Èãgž^‚³³äÑŒŒ jÁ`90ø£X�¼ÿ¨“dxÆ3ž�G!&o­¡¯çúN�ï€S}Ö/ìfäëÈB2ò5�Íx¬BokÇ;H'ßíöúÁ¦Kj ùÂülÑÖÜÀªÕ¢ßŸEóÕÐ-´^ܪobøÂ�9dé1t^솲ùu�ÄQ÷A»÷¬Ï#ñcuc>*Ž[I˜�⟷)g&Öø½¶w„v6J˜ÅrºŸ4úY·q�¥û$®‰FT\WòÖQwi!϶¯†�8J2(ºs”@'EaÝkü.Xú-:ß68�GÌû§%p@ü�U,ˆˆ—Ÿm"8°hXŠC>K®mpa ìdpp2š¾¶áÝ�×ø²g¿VI�¤ÞÍ+%Ë[O¥CÀTÀL?Nüf º-;ÐÅó°n¼�9&©‹L?a‚½ãk�XÄ£¡„-˜ÑÅo9<‚yǸ´�ÆBï(^“{îÓ|%“Ô0–­é±×xì›Å¢×'‡‰uˆ9K2vX&ù•0§Ô‰ÀØ1u„°3 +I‚¥ŠÎêtâB2h•B$`œvK¤¢á¶âL£Äj�ØÙ¶~'!"Ú#ùj€×I'‚-ú& �בž®Ãåä�U&]̆M¼‘`ÿ9 5 ^Žêin×)Ü4Zg3¿·2‹«*”ay«1µhÂå*WéÖ)ß×ËÛ8§EùS€&øœ6žZ X³'qÐD¯Á¦•Á«B÷´×3= òá[#:ƒ‰ËЮµ¬‰¥,ÃÇYóÎÙdOžuYß´5eãÑgG„†9÷Í-Ö ÿÚµ-´bñØ8¯A¶½É6ÎÛ5ØMÔîºèy(b‡›F,X:h ²íB;éA¥�‘c.‹“u:…ÊKjú›¬tìHÈž³àª[#ˆ‡s––Õ)zÙ°w›ííÇ8¦�¹ñ[ƒ¿$)s mÞäû.¼gdĹÓ!ïÒ“À—g¨ö6Ášèå¹Q¥æPèû±�À�QÛ/«ïÁ”yËVîÉ,§¶}�ì;H¬�ý™diáìš7x"‚g…U�t�DÿKò~<>U Tš\)ºXŸ6¨‰«%,oÖp4[^Æ-@÷Ѻ‘åz‘ŸU!ÛHn¹h (‘©xCbú1‹Â°€@aeØZö´h}À-áÃg«XÜä5 × �RX¶§Æ–$íc€3ɤ±qzà«úç6 }Èiã�µÜ“zw\Ì!Ô)f!ž… «biaë=¢j³Êà1þ¨1k-©ÞX2 ÞºdoEÉ{’¦ø#b”`gUß¼Öù]Xö†ÌMTN¯ìûÀɆÅ6©*Á ­è\óTì¦á`ƒé@8Õ–„�¿êõc$X¦Rã©RáÅF!�t@Á™Zìúg2™€¯š½ÉÉ' bïuOòüœJ[%`¬¢0zÆFÕu©ƒTêO.µ¢ikko›V¡¼o{eÝZ´À’¬,hi*¿ËðEý– í5zONÚý—•´˜¥Ò°Ä Xy#à]ÖŒÀ±É}®ár' !2kŸèƒµ™+%ÙJM=è^¬%å4Ÿ±“s¬Tk’RîtZ˜'®n?ÑkÏRW—˜`EiÍðòÛméÖm‰ü1éžIƒAºÖÖæIb,bŠ×ÙUÙ3V¥ž>CŸFWQ¯ ‘ÄzCáÇö&Ó&Ôj)ð²Å�è"»ûðÞbôãÂP®#ÚzÔ}pN%6$]o°ÓM ÛRñ¼¦))üzÂån˜g ú u‘°´Æ5îB=¥iå‚áþÉ·²ÃnBïZ Ø èÊ/ê·@‰*À_2ƒÉÁkšÃ]õ`›lg[…Y€DؼKAV]†ON© “vGaÐVõÖʼnUІటV%Û¢Š»‰6ä½qŠŒla‡!y¥£QªâS Пöf5r81`D“ðu°f:©ÿ«+—˜ZyPhe–É¡ÉÚ2ª“"^s$¡åú3º>“û¯RÊíÁ¦®ŠØ^±àæ�ö ?¨R\Õ]Õ$ø„S™� §§­§D™U;å„Ï÷Xe°"ªJ[úª*²Ë™õP§”ݺª–fŸQ…Ç}ÿ5QÛì›5Q y¬¸·º(ËîΫ‹:©ìîxm~ßÏuÐàsa…ÆWg°×ÔÙ{V ¥Î‹Þdf¥Ï�lºŽVGÓ‘%1ß�1ì�×ë{Eëõœ‚iʳP Úªâ qF´=hÉ7#ÆÓõ9n%�[žT2"ƒhã™]Ɉ¦žÄï®f$%ŸõÅí�Í0¾`åô–îAKÉ—«>_‹-Y¤Ï×S® ͦ÷’“( ¯Ei°vøbiÐ…!™˜TÁl^žÜÉ»‰P:¢^ × êlݬMGn"M³6�‡²›¦:¬mâîšvI¼ŽÆTû_ÒÆÿ¾„W»’{˜ï£e»§¡�ÎL™¢NÅ¡Î_Dkã•'æØ‹²�'$m›€!�1¹ª .ä|sº_ÀærÖÑúäÞŬ´¾,Ï1¬ÿâÓ´ ûd-•¼xOÜ@F[­ª{riX'à1zuÅz`§¨+7PW*k£.ÿK”Ô -Lõ6½ø&OóÁú8œ(™…;o@ßr‘j'ê).’ž1°•óÜ÷æ"éq huÐB§4; QÌþ†ã±ûÃ6×Ç?hñ:Ó�šQÅÔ·‹ý_6o·°Ü²áب[uù|X‡0ðÔU~ÞΟù°íÃ�;¢¥”XùÖ¸#UxË•G¼;‚]±å×,!"¾2ŒS±L!_-…éãÄ Üôû¾å%â7’ȹ¸Æs‰îŽ£�ʬb¿L ßý¢ÁLœ&më ¨¶¤M6èó®¸èô¡¹À™ÞF»ãÞ¦7½¹á¨Ã¾vˆ63ø‹�-)¼IoÝ%’Ï ÞàwïÈ>Ò´~WHï,¾ï£(;¶dX.ç„Ò°v¢"‹¯²R8ZwåÎÔý_z{ôª2Ä+—ôªã�Q}¯©P”Ó;”Õû½xè °Öªám]¡­Pã„]gKrÏéb¡5GŒlÔßû6’'ø¨{”aéŽY]\¸ é¥'è>½x뱊‘ñâeq»Ü ´aò6^|¬¨·öbÓ³ò¼nJ=¾n£nZêݪÑ×>^ñ×ÒtëÏ/õLµÂ[Eôí3©µµ!‰…Ã*Òô©[h²m¡êݧ=ßÖ7Ðq™ú|úh­ÐÔ¶õÉfŠrø+‘¥­OÞîuÙê?<ÅÅDèc>·‰û�ŒüF1”õ` L>Â9¤°ñø4zJaÜ�»�k;^á-pv�qe°©öXYEØ8Þª%Oº|1�uäêÅ®� îeT¼Û¦ôÓ£ôÎPÇKgH…mÄîa££xaksÚ9—XÑ‹ÖzcÒçÛèÕ°ýª:\;]~mKä޶ OÂ˳\ pÛhðÝÒSÖ_µÛÖþ·å¨�qîÒ<®m,ªÔ·ä [Ûº‹)%¶tSãǃÁÚ½ÓÁØU½‡m*ÍÎB§§’L êœú…Á ñQ©Ólm’Äù­I(ýLؽùoLoìŠÞú¼íž«�âw¹çÕϺ<»\î!ÉÿKïîõ<–ÈæG¸s�:�¿^÷t›Ü0­1X'd>€#8àOèe˨*¤ˆpŽ^ñ´º>+ï‚�l`zŠ–r¥Ü-^¥™kô#÷%ñÝäxþ —ü«ê;§ÎüAÂ)¶•{Þ¬± r>åSã1\�x{Ÿ‚µ°ìЉ´Á;þ7ÊŸØÓƒòUþú€Vÿ#†¦ÊzÙ•áÀ×2§è®±JèÙŽê_Û^ èЬ Y w/3öK8˰ÿŵHýÔlðòñ�¼…ÙkîijjÖý¥ó€1‹ÂU­>(IFϋɠ9BCµ}½n0G׋”^,�²‰6ô½X[��Úó¦wQa éV. ´ë= •‹ºðåkFm´‰Ç¥®�¿›!­f¾Íøn‚Ux§ß,ìþç]‡I –Swÿ{Yãƒ\ˆ©‡Y�Í¥Ùh F±Ü ¸!Õ˜DK{[ÒÅ¢�¤ûj�·£8çíò>Ô�¸{“yË”�4×¢1NïÜ.ý¢@žì'¸ °˜Ápj¶±¯Në(hK©!ûKðBûð $ÙŽ.úüŒKwì-íB®¥ü¡ÝÌî+Erˆh\®Ò’Ýà(”L½Ñ›�«¾Û "¶_o2œœú2Õß[÷lʾ Â�»º >vðšäh{�$^·ñKR9°âŠoúÞOjPÅl:[B¢� Ð-:òÃ2 üRÆ îæi^ªlÚ¥»SöLjm»$­Y³iF„)ìÇ{×ÿèÐ_’òl¯ ƒm]^Ñ}ðà4\¼¸&&‡<¢&zÍ\,®ÜhmJGÈ6àq—­ÜGlð ±IqV4Æì>WÆåè®[AºŽB­L ?9‰|m;Þ8Ë�.K<†‘¶›”G—!®â÷à ÝnÊ�cƒþ„[•éÄ”b€öÈNº•-{¤ƒ; ˆpò÷ñô¡ìÒKæØ”t_j¢$–ލ‰TšfHiÚiÅcñ6??,“6m]›p+œ_î’Óå>-Uï�3bí Ñ%4g¼ô²OÄRkÄ6(%Ó”ö�‚-w¤mÝ9ú錼ÿR庑÷¿Ó “öÇ“›ƒëT}¼ΙKï)J÷ï‰>ÐCƒ‚³Òm.ôöw�gésݲÛßæëb$Bוê1LÐGšbïø·ù’ÀœòÛ|øä0$ÂgXnöØ=0¬}:µˆ¥Ç¤¦ä`a,lýWؽüfV £­uãËúçæ@<ƸÁºcLƒ·.Œc"~N¿;w7n!ÆFÁRü¼ÿ©»Ö±'÷ìnüb�Öåê£Í´ëì� }þuË­„·î3NV°á$¯Qx͉^:W�™#!øG0Ww[tÄS'?›Öiºñü…¿”bëèr¹” ÀrøóíÏvÞJÞ…"9Ö²¬IqtW,Ö ‘ê…™Kø-ðÚ–ô²\dàc‰?wõM‡šñQ,»d$ ‘IsûŒ…ç)¯ÜÂóÿ/›-jˆí_oÌèr¥ù@,ÊY.2bÌðL/‹&ˆ¢ÞIÑ]Œ‹W7úŠÈÆmÚÿvi¤\dìVÞG.¤)¿M¼Ò&m§«õ ȵ3þ.\@öp}§é%Yš>»ú_'„Otendstream endobj 105 0 obj 6248 endobj 109 0 obj <> stream xœÝ]Y�$ÇqÌ·…ýæ±Ûf—ó>`°%Q”hQ�Ä ˜¢�%W<̽È]^úõŽÈ32+ªº{v†^ |`oMU‘q|‘ùÕ�Xä�ÀÿÊÿ?yúàßþäo>{ù =½‘7ÿÕ~}ù૲üC”·o~ñ>PáFúEIkn~ú@–÷ƒX¬ŒñÆø›ºyøôÁ‡si¿ÂÁ;:|Cú©ò>‚F㢠Ô§Ÿæ®¤6CŸ×�ÀÊ/X†¢Dk@¹˜‰]¾z $ŽJ©Xˆ¦(Ñ`á½àˆÅùèo>†ÿ5ôc‚qš#3 VÇ`@ZÒ»=䮀–l°NHW_ÿè®­ô‘kÚ-í½¿a2Õáç8E|cÊGæÆ)…”iÙÍ"Qb�¥C›Á³$§FZ_> 7>ñ6à'v‘þq�ðùü,0ÐÔ åòGfÜ)`û.Þœ�bBéüÑ_޹• 47:¹øÀ.*¿�Ll<^ºPÃT@@·T¤y; ¬=H › J;v MÖYRÃ:‹2®O¡§ ¥4‘Hu¦Ž�Ù¸2zÑiÛë÷¸ìW4ûïM¦¸v¥º³ŒzP]Tdþé@kït46x2¸H�t¸E6Ê~×ËçM�}!ä yM‹pSѰZN¨:¼¼^ZFyÍzy-¿^&qÒj½p\÷°^iºoƒV²¨ã+MA••ïÝ ¨Q»YÛøgè+„xý¤*}º Ô¶3\»¨‰ø\Óî3hW Ûh3ß¡|kJüGG@„”“‚D}¤n-+çÆ’Þ�ÇbY“¸ 1BEŒ[ÀJ}SÍJ6Š0ÎþèQ”'ýÛüSiš€fŒ¥´²DIê>ë�»�¥"ßXxhÝF‘©“0æëhØÀlá |ô #è*¨5m(|0Ÿ€MÖ“¤]½"#„Ëæ]šÐ©´9u�!XŒj¤… ”ÍpÁHI|ÕõOîm²¢SyÖ×*/@�ÇÔ†^ õ\¤×šn]qD¶Q$Åtþ+¯}Ö4cV†FÛ[“Þ¤Àêd\\‚Lè°Ããê+/�ÖÛü߀þS8HX@áœ#Èê锥0ábš—�!š‰ tŠ�0,#ØOøöhíÂó%�f‰�ÉcÿV(CÙ½÷úÛ÷‹Pgå[z��Ë¥ÛÚkÌr2 íu�›KÄPïcú}}vÙ˜¬j½¶K%öbBÀèa£J¢­ùš€¹þ&YüWG8ƒÊvYdI8é ªfîXëEó55ÔUqmp~À¸™™À²Q�ƒ‘&à”Ù)ÒO9&Дaðw€Û¡Ø`«ÔÚ+K™þãöñÚçõÍi6ØŒhŸ±Á3JûG…&ÆÏ <µƒ. ÓZÈb}VL÷[€¡E; i°ÝBB�Hj%èŠx³—{"~R•âÇ“Æ@a¹£‰k�'Áí¢ó¢É{"c꿚†Ànj!=|ý<» ðÂwÙÏô^_j¦àÿU!´;Ë|ª�iíÁÀ‡‘õFã3±Þø×‹Y¯˜wYOí5¼ÃzL”eüât£B&ÛòV©êÊ®�u�¸vM÷q“ñ6GËWÔì”{wO¶!Y7»Úl+PQ:'i­4vû—#Ñ­ÿÙtT‡_ÁÍõf!O»7ÔólµÖ³<áDH„‚ú­*�4¸“ðª¾h~TÛÈé±ƾ¦�·�…zm`Qu¼Z3Ó¼C…V9 µéº�ôð2ÿÙì¸îuŠ ²Ñ¼b 1åñg;Í¡ÜZ9�À8ä*ê™záX—J d‡¸%ûã¦O•}êâ*`Eö‘UÛmtô1z°ÜsæE‘Ü;¾GÿfèßæÈw�fQ½¥·Ž§À6Nx g¦cý,-rˆ¶Jl?|Û.½cË'Ä%èQ‡´=3h"]»?šS}{DÊû=Àhàzà¿¢¥ÛïLËecÞs‰Ø¡Ãµd=O)Œ’ša÷O©ÛrÆzcn0¿sËf–×pã|ÝAÕ¼üù ùó³üùùó;òg'ù—´ n5žŒÊæi«!° 0ølDõ͹c·/«³˜Ô°5 6�K]h˜â9¯ûëVŠl¸T†õ^>ü{k“'ú:à�[I*¬õ쉎31³Wƒ1è0©¡(·í€õ=Ž’O±ì-ø¤@�Œyô¤‰²]¡§º7ƒ“b»WË�nßù*|ŽX½,…—‚Œsò•�ÔÁ]»èy¡¸žvƒ_'ZƤtŠž«’Ö0tœÉ€ÏX2€)'šêŒý�YSÅl*rýOǘ4Û~¬;´qqÕYE}ŠAÍ?a&ZKÌF¨OùŸzüY>3ý)ùi‡Ÿ{Š5Ëß´Q¾5ÏjZiJÌùóz�‹ZQújßûI­– \Èο ÙE6ì"óïê{µ&†"Lv�ñÚfÃF_u”äÌ´#6½¨Ff7½/~úu 7Ý[>JÀDˆ¶¸ K~Ά`X–g3 ì©ÔgÛgöîn\pižÙÊ I ¢-~fi)õF‚^ci“ÖF¶Ö]Yh@<…?Õ!ö§=}§êS´gXUHÌ)º?˯“îkÐ ”Ù®7…rØ<8™È�FáÈŸ•ÆZƒ_¤UÒgdM×ôwMoÌ\¨Uîp¥fgHé#Ey±1üµ �7©=­âÆm²©Q™Œû‰€ÁÀ(îí·”xÐÏØ¸îaÖ¨GL¼*éBØ”�+Є¨ÿÞ>éß?âÏîLàçSid¬i@¢¬åtã„ ¢¥pŸ�5=.íêºM½ù9´†O­ÝÚZþ˜äV‘�>º¥•÷j0H09d×0½š2õÝ¢�ÞÚºê™\y>6;8£!ŒñöyÁ±7’pV¶1¹—çU÷/žt†aá` pC¼fo‘‡[ ˜F\΂W½¥AJd†è0ýyZ#âb½ß‘Ÿè—¨ÿ¯òKí=¾o� ¢K �úTu1‰Õ˜²6‰ÇÔ¿�œFÐÈj=¹%º¦ZŸóH…»Ø#µòí]R�«&ní’ê캵)ÆJ�þ=‰6'FaJ†EÈqkþ9®ŸFþ©ë¬bc+¹üÈO8�µ±wß¿zŒýƒá3ªp¯wjKÌ?'Që´à†�B">sÀ¥ë³ÕÿÈæÍ °ÉIq@7·Ê'ÞÈmvsÀ¿NÖs Ï‹Á{{zDf“žO�É¿ly†ƒ(Ž)˨Å'ê àÜȦԥÝÁÙ˜ÕCR¦ŠÐ†ØJ; ™KUQͼª§H a»" Þò¦ø‡c°¸•­?’Y˜ZÄàü¼·=ï¾ ;ÞëõE�ùZDäs1¿fÈ{Ó<@‡Â§Û›O`µ�ñZ2±w}÷u�K,&ŒƒeG^ ¹Ÿb— `­h{¶ƒšZjXЋV÷2K€Óˆdr3âÔ±À aã% Ðc¶ý­ÚeÎÀ—uB� #ž `£AuöË>µÆD0! Ûp¡h ±ô…;¦ ‹l mD…>bÉÜŒL}¯ƒL±Ý¸&ň<(‚HX_˜ÏÏ º×$¬Éà]ôá!VˆQB­ŸtC²ÇÓ ^Qß4“ý¢ÝÕ0;2í ì§Œò—e ÎM"'·ó‘lÈÚd•�taÁ”†°Š…ç\ /³Í¡Ú“MmæžÉB›ò÷úþГ* •¯-† ¾bŠ÷«Â�¹ßþdÍH�ÚçN�@£f–ÏÞXŒX/½SA&Avƒæët(Ê· W“ô"–$O§Qï¼U†Ëíýd¶eDÙ±�ý@åøåŠ?�3Šœ[âh¥¸®Gj�ãsbN¡â]ZŸ²\êrá=•Iùxo;€jÙ-äÉmaSäV 6lÄz9;–‰´žo‹ñ×6ÓìªBŒã`fXÊòÊge ¥â7èH)�4uµÚ,Ûø”q:U³ÑôÌù ×ëBÂXë⺚�š=é­�Z>«•÷k1@2Gþní×òYLÃfãä ŒúìDi»QìˆæÁ­( mÐl²ø±^Þ‹|n© ¨¸íl÷!áÕH°KStˆ¸²«$‡¦ô8²]@†{•à†‘· 쪜s¾h“@ÑäW-Cb®cEI|‚ZLEŸò`–=ëSK¬á¿Ø‘½ÊÓ)h<0„…‘(Cw\†‚%@iuQÝGDÉËE¯°Õuyñµ’ôbnN;ŸÂIH…!œTúNÒX8 �§xRyù.ãIÙop—Ä“ò»Îò*�©Úå%zWëÁt Z.j›ï2~äqˆ¬"·KD2iƒ«ž¯ru8ǘÏŸ 4 a®çŒúv>¤Gi³‹h8‡ôU8'h_±€Þ_ÎAß è*®Ã9“’Ät]-7P3dÞŒO�CïcÚ?¬�\Нõ„±�E 3’A[}õ€€�„j‚îzFõ^ÕpÝ!Ú¨NɈѮËo¶è6uyŒæÍ®]ž|*@ž2–&>/’ãWe@õ �I»°„0Ùr²1[Ó»"Í=ìnè\ú˜¸x.}Lon‚4•>|Æš%·´�Ãf'¡ˆôìW» E×>ú”1w¾ÛôëºÂÇýnÇ.SóïO]b´ã/wØåz¦S•ÍŸ[·ïß·ï´_«8ï�À\—¿Ûí2 µ0�wz#@"j8-'€€R²‰—‘ßq¢Õ̉.}ƒº+�Þ#�gÃed¢ü–U4Ÿ4ݶo†à9 d%6*U‹RHòç„zñh ö·ÁBwÚixnüFz¬ epƒ_ÿ¼¶6IÏͽ&»]Êy}:at1QË7umýËÉØnáÅ™9·³ blÞKºCX,vÊkTîV„ÔY‡ˆÇ9«Ú Ýv¤=�3£‡ÂV¢ÓÔU#f&­´bkµ?Á ªÃ:«/‰{@ãn©WE�0úz�{°).Ȳ!B|ÚsªûCÍÿT¿šÅì"mÊö(bc.þÚ%Ÿ^Ç�ÌÁ¦KÍgÌüxGPŒ&cÎfªÃ  ÈXo]šùOÀ¬VêÀz0ñÆ#Tøˆçu¨µcóÁ�ÕÛiù±åÛ°¥f¡œçwÒ¥,tg¯úd@{€ ðcÅŸBm�_Ïxå¿iñÎ ±¥§“|§†n_šßÕÊÆ‘à !îÔg÷ª¢ÉMu}x>e~ý]ìÔj .»–%ï'p¬áYÞ&µFwËÛ;§b²Ìë’&Ò¶u;[®'Ú—ã*ù@9àîÌ0êQ‡ü0.‘±ÉPb¦¢‘´€ýîŽaÛ‰¦ §�=âqФ$Þg“�÷�°î…'H5™»DÀÌÉYpÝ„Æiô<ÅŸ$d† ²Ý#cØn› ÆL.=¡Þí]F²¸°pÖÒëöKcÞäžØ(GXJŽ[ uÞ�[1.Õ"=�°Ÿ?]¯ý³ÑñzÀýø6ìBE�x:ŸÕ2m�é,såÃÿÆéjµaê©Êƒ¡z˜VÉ䬿GŠIüpŽ2Q�jôîM¢`=N™ýH¼£zyD|¿ª—úÄx†üÍ`ñΩ<Åá£ópêM¥‹Qy‹lŸÁò›ä47B7ܘX†áF[⦔ÉK+'ŠeÉÆ‚ò¹Ån¸¡þ 9k;Ž;ìu«S@ëݪ ©”<^9f˜tX&“:2g ¬uÛ˜š s]PL.U½ë‹4 +‡Ù|ýÕ×Mì+Šr6Fâ§m¨H³µ[‰ôåh]_îà±`BÂLŽ|ð‹J¹~ÆÐ£Ûל'§â¦ýÒsLÚ¹Í-;pH–m© •–¦ÅoÌæã= ÷gVÿHrÉÍí.3Ûv¼6.Á¸OÊA’JÕ þ^û>�6x5T²²÷5Ök©"TXÇ ü�·†’û$G¤§°àÂìg$Ñ4¢9—x€}Ó†PzáìÃ-ø“Ëò=wEÖŠ_ç1NXÇc„ç«ò¸Ì£3/•jÛcÂN ¸²~(‚êG“÷\bö^§þâ sçÂÕ!Cy´R¶Ü¨¥… ˜ m¡ ànÖ`·“Ù³*ª“¤lå©–È7¦àmäIçD’üð92.˜êG®'c’šúÁ'˜öÜ{ÈY[ î¶”v;¨4ëÅ$:I‚RyI¢ÌvÉÏx@ÒÖ婃np˜è×npø€Ù†½ôÂVz{…o—HâH– %±"'ål¢ÇÏY>Ã~jϤÍÃ�¯½3ËóTZ§–ÔŠ  ž)ïÉîèšüK|?è 7ÎFSc䘽��…=œüÒmq^*/¤k†iY<^âé8¡Ào[.ìZH'õç]m Ρµ4‹õ‡vÌ|¶hÖn)€×\aðÖ­+”/õIþ€òÓVت`η´}rÍÌ™÷<ÙbÕÒ2jENxZ×4 w1&äˆx½²ÛY�s�¬ -•Ç Qáé_À`ñ66*Ünù½�¥í| –±¨è¹CVF/U±Èµ]I§Ìò�NC‹SÈ#g„>+Á}U6Ö%ëxèUO¿%îÈ€Ÿã%ƒÇÓnÒœ¸Vã™N;F©ÏùMËâæ ={eÒT”“tºÚ*ʹÄI$V–÷@z»�Àß4¡£Ñ‡¹Ä¦!¾•ÌuKnf®'rXH«¤<¨ƒh7°}•µõÁj˜r_a�~¦¡+ l9ÅË!‰kAj¥c�âÙ¤êt,ÿëGï5}èír¶„ã1r=iÌXöŽiÓG³:t‰N)%ܘŽJ.zj*Ù8sÍeʙѯ½fStEÏGÝ¿\íWõ§UŽw»Í}1t#û5®y;©œÎvs‚1õ›âI�u_%üþ�‡þÿýÖ‘Š endstream endobj 110 0 obj 6454 endobj 114 0 obj <> stream xœí]Y“$·qæóXá…ýà·¶Ÿz,N÷a™Š0K´E‡hn„Ö±Å5�]KY´ÿ¼3T!$ª»ggÈeÈRHlÖTP@_žøò yøßòÏÇŸ_½ñïþðñ×WéêAþuûõéÕ—W²ü‹(wÞzh¸"—h­:<øÃ•,÷±XãÁ¿(øËçW¿9~s ÷ïâñëk³ø¨Íñ£ë#ü�?¾¸¾‹3^[|šï”oÐnÐîøs¸wqRHuü¯k±D¯„uÇÏÒO-¼/?ÓÕÿ½¾Q‹rÚËãû×z ^G½ŽoýŠŒE?¼V~ NÆã·81·8gŽŸ_«%*³}˜ßªà Êl£Ž±yCž™Òÿ„S‡Ws|’F >G/Öi«Ž�Ó/iÂñy}kê ¸iEó÷¼n0*ç?l»ý'i6Á[ÏÍFâß„\·û]`w kçù©¸´2çNeØ™×áv) ™ã Z€?©d]E•_ÛUnú„:PrC­ $ïÞÖŸ;ý2%z?åUé”áÀ�Zhøi)_>Or[;üR JÂYEؾO+‰rý±M„Ù³U|\eé7s±€Ʊ@ ùà_Bo ÀPZ�œÒø¼röDXžÚ�ú¸À¸R/FÙ;ÐQÄÝŠÁǤ祒½²ÄüQºd¤¬[Bf÷¢‘ß0Sxˆõ'Í­ÎÃÝt'Èž>¯b}{?õŸeF’Ñ•=ðñû{š~“)æ=5 v_ß&ƒ›p£œI²)ɵ´ìåŰýÏ6¼ôdýÅÑ�Ò÷'Tâ2מÎ-6ÈD^'˜³„ÜX{Q2{F"].áòFz`jkÉ ªÌªÌEȉ�Y?Z/�C84•ég`ñ‘pYAîDÂqbÁûR @‚5,³vxºŽÅ²]ev>.Æ5´ˆW\µš µo6°—‡ °qOáÆpFÅ´É.ÃŒŠ„Õø¥H2Zkظ’ß·eÂ~Ä’[•¿[--‹ :·¨Pi=ÓÙRÙ=Ó :Ù ºŸì"©ÚhÙ �ß„½ŒPúì©ÌÙ«lf’ÆXØ aFSŸIk6Ú‡)Ÿ\ù#W)Ó`ƒŽð�.ÆYo�¿=’ë™òµn¨õ«îAàtã ;JF„wp5OTp°™ºSÊýh@ꔑ‡¥qð #“,R«Ž‘ÒUsüM½(ëKŵ_¼ *WÿþÛkò=`Ž`&®ë¼á‹GGR�BÖp»³•¥H2*nê Ú~ÛçdJ”±¡r»¨Íûl zСn¿ÞM¿<€É·ñ——Rr­Ð˜¯q›#'žÖÍò‘—+ij]�1ÞVc�éghàú ^QsP€xùRbK t¢:åýx#Ûç½¢þM4 =êÂ"|XufÇXÚødr\ïhÝÛ;žplZ™éY6K]ú~�Jè:!º)ßèftÆdmOë4ZºZÇþÇ)ݪVSÎé·GY’9-[;:i(c{½e`Lv¹…ó@3Ñ{dñûxË_#‡^‘À|•÷-�7ÂI¸•ëã ¿gF„í$�ûø~ úªêâ´@¦âUÔCÉ*Ö ¸Ýæðde(\Ëw\}põåÁ‡äݽ�µ;(‹ ß:X~õÖ{Wo¼÷þáÅWß|tõƯòê�_àÿ½õ«·áï½sxíêÝ÷ÌÉŠs$Ã8À_À½€W²ùoqº€3¦N"Ô²⛨ïAjk‰í3Yò  «æú‡ÞönÑ…"ËÍwŒâà{�%a—]· ¶Ý‚Ú!a}€v�¢²' þ€+$–½0idƒŒ5*V‹0€m„DX0t9Xöðoèܶ‹‘>9ðšÕ‹ùá&SjÈãÑöë+É8‡cbWÑkZ.¦á­'$TZ7ö¨.]{gýÅ~úP«‹¡÷KµÃÆâ�=kØ·×k,—u09GôÆóÚ‚:#œCžè¨ä¼í4¿s9$OÆø":æFœƒ.´ô¤ k#°ŽµËèQÜqSª•´ö!–®J€UqaÀw¸L|V�ëºn ¤žŽ`ê\]Œñ ŒÚ3v>F`1”[Y•b{[y§*¶"Øåq†YÒ¡‘\Hå)êtr öazïÁLÓáLSX8£ñqF9£.®”˜\)$ ú¥¿Ø^´O[ÄdOÑÍ:ç*)¦>hƒâH#À[°Ü¶…^Š ¨2§x­­:É-—W}¡Ûo¯ƒ]¤·)Véµx쎸NXÔ;jZÂ.À›Æ?ðE%Yގƈ�îøSAé$Òæå!Œ¶ç¹ëE4k}æu†ã€É’4tç÷»�þæSLçFŸékcW83/Ó5ÊÖ.^d |°”ì§å¤„@´Á_!–†ÿð¯boëªP_9ý7¶ ê’÷>ƒ÷j¡-»0®„�oˆýàAéÉj›ð£a†lpá-!Š“NÛÅuÞ€iJƒÑaQó² K ´Â?Í®(¡;mæ©¡ò‹H zÈž¬ÛýaËÒ`N{ÅDªˆ bÏ9]%uê×¥´mƒs‰½Ä&Êí?ÇA-Ø×š�-¯ÔÒ‘;âFLôôN19íD˜-7ËMF0P=ËLÄW��ÞøÐ0UãØA³Z?hÖ^Þ´0F#3†ÕF÷ÉM OFÎûFv�F7�l/ìè‡+žÃm¾_®€úrkš»A»D­:þ[G°ø U·¿hÄó@§Æß³›¯uºK°ŸuÉ4ü~… ˆê5ËÀ¨–tM’Ô¦ÄÈkÂEkØÄüŠÃM(¢‰�{P޵GBIhr%~¿±7û "ÍËo(êëÄ�`ü(vN6‰:5p 7ÑrS’%ÞÄ|X80Ùög&ÁÞ&&`D "ÃÏÉw²~Nºw-¡KÏÃB(uQÖDNc;ù!F¢’–÷¶À&…Ÿèïe£ §Næ?qæ–cÚÊ>;&•Çëd§\K`OoÄ²êæœ6@7+â€å/Y‘™Ð÷ˆT€Ó8Ï!quep FÀ¾ŠB—±GORb 3ž?U�Ò»èæiJðþ´pÁZ§•‚ Ì£ãd�[d†“=“­¯r�@ä{Z”(Òζè5TQDVdIUµè ¬�€.fßÜoE–=µvJÜêäœr`E(Ëçp¶jH;4ã©^›·1º�}WÙòLx½Z6Ùþ)NPf4ìVˆzçÀ2yì%‘îåÓ'ó*j}7_™™¦ÏªY?×°>ãULˆÊ¢¸)*‰ b¹±à+Ì�ý þ„�ê#U°ZÀ”ab´™4ø.¥ø<—Ç\Dî„ki1kü7ÙXуŠßEâ@ ¹.ã½ø†×Ñi*@¼d3"­š¿c—–J1Öí¹´hR7ãÒJoÐávÀ;;š •A¶YÓþ‡5¼‰ŽæmöûAñ'åYK-Ì.u _Ê”ûˆ¼ÉßQ^;³ 6ÊI‚NCÃøETmêÉêÇ®‰jë~†.�Ÿ £�á½RV.̧²RXòÔÜ5á 4f™ÐZɽ•A éìÂäF.‘´dÍÈÐ émì•„™RÝckXPÿÞô‚ì8ir®¡vb-œ¿À7Eg£Þåæýo–ç�c[ŸÒ9WZ¡a*…©b@-Ü‚|´f›À÷_L¡`97'ó÷Ò5O •CXÓ’ðóLK)`Ëv2LÊLz¦ó­™Î/ˆ§÷i$&gÐܬËG˜¬²Ve·úk@Ϩ6ªÎYs´æ]CÕÿMÝ:ðŒ�ñ˜S®b³N.ÐXk1†Œ'¡.ŠÕÎ|:e,ÌM–ÍNÉq»S¨0[Wçy³6c讌…Îj­]ó³lé9ËÃ9•f³Î¥ÂU�¾S.ƒ¥à¨VDLi¡%AfîßÊK’‹wQá3x ‰€ž¼üÛ’z¬5ƒNÖ|°³QÃ�—¡¾ç(*"߯�â�g|i†zÍ*^C×!gß3w:+ذ�î$–p¾‡ î¹ÄC5‹?¬˜»±ÛÈò��¥æ ò½ öZ8M$Y¹5VG²èz'æNf]N�³Ñ2ÖZu�ƒÈݼ²‘˜çÍy*m®8ÉgÍ�]ÛS�‹næ&^Blë>^â‰ëâDÆPkè’÷æ8Œµlñ�C5×¹‡±¬7`Ã`<€a0œ!Ó't€GÁ{„ÿr3ª âŠz2òñÔŸÞ ¢\²ZÇÈj.#ÅôÅ’L,Opgr<ÚD ™ ’7 ¹ƒtR€ÙÙ>ƃ¤©Œá`HÍò )Þ´â YÖœðˆ…¤Ñ}¼]|ÞólݦAïmS1cÓ²‚&8¦A‡76ÁØ6aöyÎ~3žªŠ‡'̶£˜× 楚 ×¶6�o¨ÚšˆýZ`1‰†Ÿ€Hmr,|òD&É»‘7¡Ï;Zób‡šçûM;²�—ô»J;Z O ›~í¦ÉS9ì¥*�±+†Tj.Ýè’!Æ#ŸâI;ýã˸P0V}Ã÷S�ªï žØz•œhe Þg–ðÁZÀ.¡lç›:íÇjÒ¼äÞÞ¸6GákD÷ô¬Y®U–¬À;Óp— ‚Mk¥1@&í¬øå$»68âÎ!ƒ[±nÍr)ó4n - �`ÂñËÀ÷³%ì›¶n(`/s”®ªN†ï÷bö6óÄ‚›íÖ;�É*WÌÚ�€ o®Q°�ðfÉ”W[ I–w Ê0ÄŒw“,Ïv]INw˜Fšœ,r•Ø�ÿi— ïNùa¸R\7—lgˆ ?#Nis�\’["þÙìKÍÝ;eb�—é¹të»ö#'ó­Ú2Û>ßj#&Ce¾ŒeMîsc;ïWm¯ÛeìXÓÖæ’¬È(r�·È(-R>ȽË(�l—Z«ÆÝ¯Œ)cå%äT,9ƒkÒÄ÷®¨¿W¾IµVp „nyä§»•SX$tv’Ç-÷=NÝýñ‡éîw´OÀÏúv½«ŸÚÌû5o¶�Ÿ8gç¢jrךœR¡ªý²ŠªµÅC*8ÄfLʾj žIl: êÇ.T¯´W»úã{êTny_ :¦ž5 zWÒtÁ»æJ6wt†®ì«z¦ô¤Z¡eÊ­±µp…ËÒt?Ê‘ÊÕé ãõ¯˜ç`ÅâE�?RXÖƒ§šâŠ÷7WZçý™úídó¹}êàý¡Kí½Øµ¥…èýÑ"¹f¥5õ¡T\»yR‚V>Emv<`Œ�[fïïñNµÌiH}©3%Ö`këjá#WNÞú›Rµx$ÑÞ‰ÃúéºbLWÈÕ_V&7q[Öèħ[û«Z À¦ðo/•·«9L ZX‰cªL¢Yý:À‚g§Òæ5?©V“ã2ýSã™™ýÕÇrRÿ¤�§ �­î×s¿ðôÏl¶£k©Ìø>YÑÍ—#¨ð@ŽX¾/ۻꜻõ �Iï{Jôó\=¿KI>fë¶ÍJëóŒÅòú¾·Ù�ì´çò,~˜àEõºÈ»[x'f9YÅ;!¥qÄ�*´Âònmu¸Wª‚1°Öó{óL”¿œc¡"þ¼w¹y"¾@nÚ ê~åf[ëñ}3T_¥:2T×>;y®±þ‡7ïÚŒ!—l¯uòŸ`KX“Í\eÍ}ƒ)õÞšü—óx! ¢.ޏ„þœÌi~p;ûù ¨lÜñ¯wû Äì‘*�ý2†KyROÖÄûx¿‘ak@Ð%ÔuQøNNJRï—íV'iÏv¥#ûÆk³ÄÍÍ)þέ»jaÚz×ï„VÉlÜ.©ö»Üûå(�î{å´n*3׫Þs½‘ªâJC®{5}/+j¿,Ÿ‚Ú[¯’ÑËnîÜéÚjeìoà^ ¥|"„òŠ Ò?kþ‡†JOhá¹$$½SþµµÂ–‡'4° ?På; €\ |ퟭ|¤xvWÖÿW¾iæFˆÔx³‰Ïÿ9àʧ}þ¤��çH•N³ª×ç:áÒï‚yÔÎNpH¹ó{'o%Wü¤?T9ŽÀ†¡®=%ô?^D›²�ëÓ¶ñn&ÊdÖÏ·J‘.é�¿¾Ø"Vz:ú$‘»1–ª�fÈ»HÎÎ팶ūÜEÅv¥Ñ6·yahy‰à¯¯+·).•Ã9¡[¼1Qj©½4NE{ÈãµT…’.Xn íôà”ýæLÂzXǦ�§Ü:Ŷ^-Ø®ª9“@U2&ð9µDØã� ®rµbMÕÖFûX¢°v/¶•%lÿæ:P:8ëú»NX: 1ì.ñ ”ö¼¡Ü1·„+CÈ®¦G¼ÉGK�W¤š‰¯'DßU9®'‹�B¬Ÿ°Mò:7®€JÕñÏ×£f4ß•ñi‚–é¾|‹ß2þv*©þó³Ÿ�|¼¥Å]y>^âÂvìHT´ j)4s–ÛšÌ3y Ú:!RÀœ1DõGuîTµn¡j¬ž€ ¼t[ÂT!ân[ÂáèF¶×WX ZÂF˜!ˆ¢VK¤Ó†fÂRÓ± Î ¨§ÓxôiNþŽû§yø0±�Lr¶°ÍPô!¥I9é ¡1â¬8}þP.Í"K»çå"ƒ,Ù,z¨Š\{Rëºëjâ~…êk}Ísk¸csÀíÞ]c:ˆ°Ô2íõãkôÆ€�³_6»&õe³Ú²¶š-ñô¦£]ª‘2wv B+$´KºÍ~XÒ.„ôZïêÛ÷§Xë ³ú|¢*9u¬žiRµvÎŒ11ò]MPRG<ǩ׃^§*¹[²ß~A1§)î´Eó¨(.‘I Ðð†ã15;Ž*£\ñ<·8#@l—i¨ŸMÚó«"¤ôB §U¤8Ãg Ñ“{¬Š»_ǧXH }C—¸âžžÔ/vV:žÆ¬,ïeYï$[NˆëI9'A�´’&Ž@5¡ÓoÖ_›Ã˜©1HéÐ 1SDMÎÇIˆZK<¹_/ãÚX~Ò +}“ßiô�/;�0˜¯`ý¾ Ž.MGnÅÑÉ�5ö©/ô5cm\81Œ„[¢ü°N®ëhï“®D¼éTN6�iøÛwp¥Á!!íf¢†ï}u‹bøÆÜL\V®mÒ�géÙ(mmÚ8Ë ];Ý‚�8áâuXLâe⎭ïûÂòZ½õcŸuÇ Í™koö7wð IùWø½0ý>ut;jkUq%†ä#NÂ÷MÒ�“Mßk�“¿ªK"ÄISû?=¿î�ÝÚÿËZ4m#Ï86ïÌaûŽ©#1°å¹ÕûXmJÊï¿Óò}½÷b¦|ß%¯î‰f„Û¡¥z<›¥´m{æË^‘¤óäü­ðí›VåƒMšÔb7Exî¤aøyá#Òü›íà³Ýþ7É4‰�õäƒüH'œž8eÛô;Ájf]úçý¸']ú‰¹sg]úº•ùÞw”²h:X¾û]uOÔcú޾]FrÔOÛ°ßa^–áài7Ó4ì÷@mZR\¾{"d+ß žË" hðY#ý—m3Év% Ø:×ù3:�Ù£!ëÂðlrœ<ŽèãzCYù�–9; #Q#8®uéHèV7‡ªš:ùÚþ«Õ¹—HÌM+(OØI²?Oô–ÝV/hˆJÛ–¥AtC;Ç„wúC=§ƒÁ/ˆí”`€þô¼µ¨óÓrØb÷«�sJå©öIEXÿS¶€„ñ§>ŸõÞñ�¼È‰¹D[žDnhæQ5g§£OÂèE©xö¹Qwæ´3î¸�3‚ëÓ[9oßœÁ¹z9b@3 ÛºÈÓ!©ÊMÉ»ERµv÷ŒFHS$Õ•ÂíÕFI¾¿�Òw׳œïï+Ôx0ù Ò©Ä}+ä´_f§uS¡‹3d2Ýî ¦#Ðæ…AÅÔ€[5‘Àö¼1¦ãZ:o ~åæõ²qˆÔ3ÒÏ>c¬ëj�›È×>ƒEx¨Ôê{ìn¬¸s¦zÌŒÍÃ¥XÏ™rZ³jœ…*]3ôò¢½£Ô.?gjë›ÏÈ/¦Ÿú¨b°YN×özmÑNƒ@ „ÔŒk†G@Dí¬¼?Ï0œuïšï�ýß™{±õxõ™¦Ûk§ëÒ)»:m6¸YÜå¶kXÏL/3M^�ªÔ†b¤Å|u¬¼ ¨eüšAl›F÷” ¥WÎé97¾E"H0€"a†„že½Ú°.‚¤$QŽèÖ¥JgÇæVû!Ì9Û«zîGîð?q¾0' ìöZÇþî¨ßïûN˜D¹ø¡ñº½Ïˆ–óqþ§`jêÕäi÷_@nö/rzŸíSšö;¸äümÑ;vMex’Oª`ÛÉH6ã¼.Á÷Í/YtË’ðȱñL¢êÖ±ñMûl’É€iz\¨“ŒYÎG[ŒGÌrAÈYä­µNžêv½Qq«-žÇâÏŠx%P¯ŽR\LÅA·Q�½ojS�Mˆ�iBÉžªWýdkXß6äqIuî°½U_9¿ V©»ˤÁeÌÇòÍÎÙ$¹-Õx&=‰Ù<‘ 푼WKúÇ܉”Í:y9e ¾¬LT‰‰êL¶eè3=v?.y0 ÙŒ«Ò��»�â$gIdÍT·p�il9.@ôéêOÓÀLPN2ªÉñÀ™­ñæ¬ÉogÆ4.ý[öÎp 1:ÕúÜWz ±YÍŒ³ v‘ò½[kF¡%£Çuz[Ö,™\š“VI~ù´®£d¬€ U3éœ"<Ðg }EÆÞ‘}ˆ£KÁI*„9Àr…­Òeøâ�ÜüÒá`áoCŽ³ÉœJ$RN‘s›d÷ØßF­‡óµ©æñ€þõÚã?®óóA°)ûè%Ç¢¦xªq´Zª�ü½¹uÅ:ÊkìNª&§Æ™4¡ƒÔ©d0?|ê¬HqÑѼ«/ÜYJpi,WÖ°×0«�@œ<s,{ÎÅÄ5l©ÛlM¤—m!—%gªT þ@c"uè¸:“¶§l³º©ßÂWÿwÿµendstream endobj 115 0 obj 7417 endobj 119 0 obj <> stream xœÝ]K³%GqÆÛAᕽauës�N»ë]ÅÃa�qŒ Æ+À3#4�^!-øíάgVuV÷9÷Á›…¯ÎtWWeå;¿Êúôf]ÄÍŠÿËÿÿÅGOþé—îæåçOâ¯7âæ?ê_>ùô‰Èÿ±æ§o~ô^Pð‹X‚1òæé{OD~Þ¯‹!Ü8í ÿòÑ“_Ÿ~sº=¯‹ÕNwúüV/.(}úùñãÛ³\¤Uòôùõw·j1Vyzþ=„Eqz–u†‚_í¢„?}p».ÁÉÕØÓëÛ³ZÃ"WyúÕ-LP;ø÷6Ô‹ú�y?ÏEÚ€C•ϪöÙßÜâÄâL ï•Ù¨ò ¡}lµÃÉx™) }èf�T§/Ê£›ÉÆî袬µŸI™v$QùVÓ¬RŸž—Ñé'ɪۓô£Ýøy€ßÕu¦ïÀ“¿}ú3à (oH'%�=ž¾ Üð_·r±6¬¶§üõ“ø—[Õé_Ëoi žÉ¤^´_Eéí:%î«v vö²ÏþøŠÏ.HôLŸžÂ²�rVžÞßÒ¤2¢ŽLÔ¢¬�-ËF‚Z (a”0äýÆE“}è95~ 6í�·JÃÀBí ?•ß·®ã¾LI)pVÄYßœ�"QYoRiÑÌ.´€l;u–n]Ví2o;˜sÖ \½ »°¬~ÃÐ~úôªýÊsäYZ·h+Ùá‰ò ŠÈ£`û¥ÉÛˆ§@C�!·öÔòBþðQ�R†Ó'UŠª4Oe—,Ö’©ä²ZgO_¥ï²‰0ùN"Êù#ü»·RI– /qt…\Ò}þý:»B1å·´�ãÒNȈŒ÷Ž/€xT×|U§Tõ°xäÔQ¦²H¢œVšã?¡–Õ_žýÑíYÅ„R… µf%WxTõ?¼=‹vÕf5¥l÷°m ÿç¸ �¨©àuy©¼„Õ_  =´J^y¤Í0>ñþöŒ•ÒN�‰*™üÜ©Š�¦J:I �ó?ƒ–Z’¨GKgý xB:¯ª%]ÅéË8ø@ù¨WÎ�JIPý¢ín~D�¿JxD@ù�vßÖ�ÿÀizS»®u3þu9ðnÈú5ýÓò«ßÁ–ãJ;.ñŽÿp 5jÏp [%€«šÈ ¶ÎwÖž³K´!í¹BV œÒð³TWâãN<‰ÔE5n½Ø0>Ú”à‡ŒÁݬ…&{ù¬›TýÐgÇ**’æÌLüŠJߨD¬ÿ­c³I.ÞnΪ¨Vc•åi}ãð»BàÓ¾< ´O�ã´€ËVÉî›Â-^ýM}ümÜ�¥ð$Æyõ:Äšù»=œäUSjYÁ^YÍ�‹ šè›kÆ} ãªUÅQ&:IÆÊ<»u(é‚% °EdèŽ0QõœjÖÙ‚gÄÖ"õjé«,ÀˆÏf,�ŸMŠË�$ꤤ™£mæZåUùKÉÎS¯,Í�8 `£b/ëT5}­Žú.ˆ4ý6È®’ÀîÎbö'â°+EqÆÇeótuR}djØ| 3´I*4èÐ|Oþäé?þQ r°áhÓÀ¹3Àð•àô"a"àq{à‡ �`RD²`À;Jz¤)Ìø'#ù ÄäÇ�ó— °Ó ‚ ÐŠÓ �j3Æ@ Òƒ+:¿ê�? b@?IÆ|† @)lö<ºxëUz`•6²)zÔ಄¿ZxËåï#CžªðŽûB@ÿ0ÎË*}8Àûm¨»ÁÓ…—p]°P §÷ðA¯+Ú°V(„_ÅØÏÑ_wïw´Š?~Žï¯œ‚<•5hK>Õ^¢sŠë_�Gòç•VàËâ R‚ð¾n¾ˆ‹r^¢+€¬ƒ¦ÂÙ¦Ù"Q”µ›éÅ×Ûô8�s΃�%L- øNõFj6¡yûÕݦr~Ö΃Ëf¯¥²—0à÷E¹Jv±šµ?j´ãD*‚mìÏ+n�¢ª·ßƒ‘¼B³& #F·W˜´hëãT7p“ÑhÈZøü'˜¸2±”],õqª>ë`V ØûføÜw¶-¬A°$2��¾k3!F_‰§v4.õê’Í4ÅÜØLÐtnc3 ˾$ -75™…(„íªGö üæ!ðS‚XÂgMwv�“y‰ü 2•� u#=5 bbøùŽ%D,‹0nã¯bÔ20?Œ$š«4Õá»ü1oæÞ/Á �É«NÌâš:d¦äÑW- J!ªVÑÒ�j�™:?Ç hˆeçÎ|2&/tv›DlM�¤7ÔêúÐèëª1ÞFŠ­‹“]JâusÎt¯……~‰¾¸µ:)1ˆgW1Mcà«ÃÒ'jº�¢<9$%>ÆŸÁ‚v£»e7ò\CÏn?®!ã«�ŸE¸*®&E!NY"Ș퀲û©Í—<§9â<>š»ÃLŒS}îíó[Nw€ÇhH˜`yµm£6Ô6È«ýB‡„ƒË£üÄé§™ŽAÃÔ£Ëv\ÁM¨„³ó íGFw1#:¸IÒpjFÀ‘Y¬ÑGfÜŒQãO£$pRɳ»–$ÜeÄ£¸Ëµµ!“¸ Œˆ^¥¢F„zêQ™È1gSt@M­áoR>‘™Å!úÃàEk»4ãc„§Þ QgY.¤£NG ^ª zæ>ì%ÞŸƒÊŸd-!ò/�ÈF(Ïêp£sØœ7V"Íòf¤ð¹{à!_Rý¨º†Hõ9šW æU©‰åÙ$q'y š ü|G{]“•Ý|‡ä#zs‘s¼²à‘a‚á ±[C<ä¬ûȬ0Dm²]!$ h›­iTÌVWû¶d~Tg�þ��{²5�©UEÙkÅÝy7$¯¾,^‹à¶Gç<ÍÖ¾MÝ¥Gä ꣫ᔾÓÊ2¯ë_/jª÷’ç,µIÙÔD�Q„Ö$BÔÉ·qÜ`AaÚ–€¥ÉŠG»i´uìñÄ̺“Miéâ‡vùUUãi….•Ú¼ ¹[:ûVùr¦=ÆWpžÎ-ÀîC5ÈwJ8ÚAÈjAÂÜÅL§ˆÞÝ~s“]B }‘‚÷U‚‘+*€ÑvXó±b±Âeð¦™è~Ôaó(ËQc€‰*úi¾JÞKZ-°ã$%]+ «!8kíï£k/tyÀBCP  UQeè­${A‘Ð%Ã4 t©Ÿ˜Öm,;¹‰�™™ü{f ȰvgØ—i¥ ÓÙqi™Íƒã+ýé�”hE#Þ²D%Ì6´<ÜR:¼bÁô xZ*zÕ57Ä–—©–ª =ºRnéksïanBQÅ~^3†°S[óH:ç»r=®N_®dvóÌÖ.ð  +LÝ‚âëåñ×�ês¦™Q_”jS‰U/5)�2i}Ô �Fí&,£�bÄ~Ȉã^2ÚÞýàÚ˜¢±ªN¢¼ÂX†ML…Ų«§À'¼24KÁÚ})†èc“±¡ >Š7@ÈÞ©@�áý†ÎÌïtLÉD)½W÷ÊZ’ØPñǦ0†b�E¦žº”JÂ^x?JB¬éV¶ÿ�KÃA²Â=3{µú6àðûÁ ƒí Ž7Ùš÷#ÁŒÁK WκóÅü¨‘’g0L]‚çéì¨�s„�ÄÅ?‘dW9Ú©Vk4ñ.8�þêüÁwV„] Õ|M x&.ø²Q¤}뮤bdZ+±Ñ|é¡Våa6úè&Aˆo½;¨½1Xi먓^ƒ‰‰X4~#?~}dÞæˆ´Ì…#øƒàЦ ó.µ+ÝÅG•¯7æ‹‘*_ ß’ÛÀùš=æí¥¢ëßÖÅŒÞB”š"–(…�IöH‘¢O_�U+e¢Ä�Þ±PÊæºm£*4ó• 8¹Uœød{�¨ñß«¦‹1„›ê b9¢&&µ�ï"0R÷(êiKíâ”UY¯W%D¯˜4Ä3|�{é4æc,ú8¾âát'DŸÔ¸gâ‰}”x¼�†"É€$»¦iÛJûhÒHUGö‡ÙŒ�µ·áÝç™Kœè�b§2Á3’ƒñœqjí¥ShÐ6Ö„!)×fußX§É ¾|HøÑ!îÔíPC�BÊBÂ3˜ .‹4èŒÆú¯8E‚IH…ps}ú)>)!j‰KÃêÿ̱&ÃÒ{ÇkÐÆ°mãJ�J Ø–¡NCÈP©5ƒ÷^§t’@þ‚9Î!ÿn×UQD؇¤ ¼`]kƒÙlçHÝ£/Pô¸™-x•¤¬7¢]Èàîy»^#XÒoªÖ£×¿)‘Då�ßժ°ØúFs0—ñ”6r¨�•ª¤±Zhlå³VVíWy�e~Ù4+§P“šôµ=q ˜²MQ0û¶©fÎR8 B� ÷!˜4G6·’Í+Ø<3%f�><�±€-ÊF³M­gÖW!R®(¤Ù$ŽÑ9‹ ü UÄãWý»CÞ_Ö,Õ•QÒñŤÖ5è:g3a„"ù÷ aÆ û8'ù¢TÇ5SƒFF!iî/zÁ˜ÀGŠÍõ�Ko`�¡· ¼´”ш€Ã°àšsH‚~ó#@*D ã™Y9"w ÃðÉ:ävR$·�3•B©Á†kþ̓œmN¼¢8 Ö¦R1ДU“Ó5Û¹$,seøçµÐAΙ|DàZþµEg¯Zt–òŽ«›â¹°�q©‚¯�&*±jå$¥Evåa;&“7¼·BЮ`/‰ß{ÎZµ"em6hMeL_Ÿþç’X¥N#Ö¤WʨIü«[oÀIƒwðœ�°Ù�’[®3?Ϫ¼:S�ÜÙ'aÀ­Ò[tv«zê¡Ö~ä6£•5véªeÏÆAm®zZ“š´‘’a•cÚB˜!·;žÙAnkùÞ-ƒ�\<¯Ç·úËXnß6°{¨ŠíLE•ma¸ú!‘%ÐY°]]š~²S©ÉÝIv6õÓZ_˜Ûý$²ÕMÛCµ0#pÛ¼ÛÈÇãJlPˆ¥}0‰M2�g´*ØšÊ.|ÏãðnV/s1A†!Ú �ûºŠ™÷�e ›Þh}™Jàô/²'‡ð" ¥K“‰álÕ)õèZ�üOu{Ê’Æ2Al�F9µ Á—[»†´/7&x pªøÀtgpX€‰üµÎ×Ãô:ÈΗ<ý¹Î�?öN{ý\‹ŽØ‡ÝmГóÓ÷¼°Ý‹±{ [šTúv�+|MºýÜ׃v ( ‰ O[‰†ît0ȼvðRE@9’'kBCRŒ¿Çæ¬ „XEÂéû•ñŒq÷ö ˜Âæž~ô¥·`öH4ÇQ×€;Z×—„±e|-©OGh)°KÈŸ‹c¸bŸaFa±!;ŸZÂ’ZÔ9‹[4Ÿ‚GHú¢:ö±Ü ¸hÓË»Meõ,ÐÇg1çà~Cœ š,r‹†}äxe‚Õ@^‰š�ãØí¢ç•ƒÈ  {˜ZÓ!McÆKåp%ë÷µCWo RDê9j�§…˜ÙxþäøÅuÌþ¸ÂXgNÊvŽšçUü¥}•LÛÇ &è¯ù‡t€È¹>¯;Ov… 3áÒ¢×Ã|',æ T†cû§Á¿.þAß°dë@ç ÆVU»NU:ÎOe%¾K§ô<¥2hn¸› Ò!Mˆ„—"&v7Tu­�Õ†·Ü©Å͉Ð#à^ß¶ÆÓãˆ&Y(×}O%ô'‰G•³QØWŸ¾³×îNŠ®EìaÕTlꢣ…aaûšs÷üì„l¼¶€p�cic͹;US™§Ë‡Uæ1—Häp–ã8© úÙs�Ñ‹¿’�0´õÊ�¡GG®c Y¯+–� ßbŒe I¦³†Ý‹‚OîÉ(� ð[  g ¯­.CÇûD5YÞ�¸×Ÿ©©ÒÚ»º‡Ö~÷ÛªLvE¤bOÁdЛº™O›iÌÞ„`Åá˜'%ÚT¾»?�`×:•oƒ¬hkìʪ²biu_‰M‘„4™³ð?�‘ fw¹5?ë^tòùƒÒ2¼>‡‘¥–Ž€`N¢ÚGÏK%㯚…ö`Ã>ý ŒÇfTK@¡ïÃ<©ÿÆ£2ÏpÖîûãY”¡2p >`—<¢èã+9Ë(,�´›Ø 7%“߸vëlw¼ŒëŒÚàÒ`>Ž-wÔãë8‚g9ë~�І»tè¬Wnœ¬)Ï|+ žÑl´Lš¥ŒAfG@àCà’j^@A<º�Û£bÁvB4 óÊ|µÚ¶ÓOo1?í`(ˆ^\‘µj?‡£³^š Ô«Ý”yþf5c*˧:±Äó¶|Å™Oÿ] FŽè·sÑÒØ:‰CKû‰gœƒY^/KrÌÿ2}ع^s}¨›ÒÜWVbMKeá�¯üó¨ÇGf¢g×¶ìƒCwWªþXêØ?|»Ô¿ß «†œÚá´£wÓÎO!åÁÄ'^}H¹´aÒÄ•·ÇÒ½‰â³×ë;�ÐíjA­OÅQý¿=y}ñ9¯Y¯¿³23Î$Ëõ j5F¦�J7ž¦¸I6ÿQ—™�“ø•T*¿&¡iÍ�rÄ8èÓ;·E Ý™²ý;õû8k_Ü@;¤l{µNÓn\�î@(½ZÂÌrnnÝñ«fŽù]êÎU|>¯}�+R¤4±aΚ2tGÚƒÏwɈrÌ\ù¡qgDnïókrq×äç£û¼2î�“ž‰›äa¢ršê¤Å¹®ñZ�.ØnÒJ¾¥‚³šOK€è® š×6®¾íìTu•x‡³;ú: y°Å`ˆ3ÀîNZZã0†ù"ñÆ39¹»_´Þz”›'?Ué»ZƒÂ´�zú·î5ÛùÚüfÓÍ…”Ã-lA�µÃ=oñ¯wêÝž»W´�éî®® “äÕñFMö^„ýƒëÜB�Hg¥W >ÃU%ð^eÔn1ýEù�]i‹épñSÊsÂ~ÅÍ»qÁhøì¤£Im=}io‹³ ²`ƒ4õŸôÊ·m!þSót’Û笻À{šYk´C}5òjeï„hÔNKQ­Ñî̃mKÙË}]³µ·˜±#-bw¤Ú:N}L®Îóº¡;ô|¼‹,©¢x±™¡ÍðÙËnØYÄÁÉ]/•¸âÆRŽ[7×ëŒj2§˜�`1ZLl Æ`n—;èo Ç°÷bQ*BõùŒe§±ã- ]Õxë‡ãÃëÎòÅ2o׬+¯Å9F›�çjû‰}>» {Ý yÀÓ¸¸ƒòt¹Ü{܇Yíe³Ú€|ÎÏz�Ë­¸¸ƒDY“,éìºÉ<({¯$Ó7c2úô¬‚¶6Þy:Àº1¼0±ûV¼Œ?«['7mq–’®W·:†Í2rà8k&µP3Ó‡RS¶‘#¦æoÐ;ê‹ú°E(úâ6Ä]Ñøv‰‡\܆gŠÛzsR¬Ç¹{¿¸@ï1Ô½A¸Æäô“ éÁˆtÃBÖ¾ŠÅ3_DÅî+zÕG!D;™œÿ°j óó),’¦i‚þV�É Ýeï1™Þƒ²áhzSÞ.wÞvÒŽö :§×¢Ø†CE�Âo’’÷*»W¦Ëã=´›ºÓâœwS‰þ¦5­}HÐÚ£cš[ œ‰!Øu܃¹æAͼAüQ ¹§Ñ¼òɯîºäý;ôXtÙ!Á¤–"Jß å¹enOX5¡?–VÝGsL¹$e%4U ÍXþöxf!Í·õ�*œéq¼­–â Ð ²£« çø0a= Ö^z¸Ã„$Ú¹4éHË׺|êÙòÞw�ÝkÝç’ØQg»ÇÞʹ¡ÎK‚¹*m¶` ôTþ”ûPæ9ô¾PJ*Þ„’qûNYUËñ,¤>û{|´ N5 ¿‰a½›ebsÃçî�GJ¿9š\ë�=š'öÿ$U»Ö;}Dß]ìz‡JÓZþQ‰3Ï“_’×ôƒE1È_××øã1�«kfÃÎd[Q}ک_“«„˜œ?(ï|xÙɼ‡¹��iÄvÆG•ñP;3ØäÁËI1ä†úÕÉ>?¤‡ü�‡§m;Tó7É;Ð<à.ÞŽ‡·d([¢†‡:ñB­æÖ Ûoe!å–{ÒÍþ/×0/6¹“ì%©\w�áÚÃÌ»ƒDØ*=�añ�ì¹ëIo�Ú?ð±0‰¥ƒß›Ç$Jvº‡$"(ïiê5H¢Ùê9–ËHüÝ|�‹G´D ŒØuiÒÚÔž¯'Ü]„¸{ú—´»{«þ¸í¼‘‘þ ±†D0hD$)ì­6Êïî½àš‚··ÆËÉš ›O¦ÇÛLV3)ƒ0 Ìx0 ›…HU _ä¼¥'Xæfý�`@ÑÖ­9¸ýI%ñÑϯF%}ùùUz çp€ûÍÌþ¾§oýÀzìvêÝÃÛÕ½¹"ñ­Çó±Â­ý¼¥Ë'µÖûç’.a,¼’è�±NK­rÑ«kMŠä,=•[êˆ}k·¾Ÿ@7]Wû[_"L �›}åÓˤ^i»¬ÞOž>ùoøßÿªÒ?Iendstream endobj 120 0 obj 7904 endobj 124 0 obj <> stream xœí]I³$·qæùÙGûâS‡OÝ&»ˆ}‘M…M‰6G6¢8vX”"Èá*ÎpÈ!Ç"yÐow&€( ªúÍëY”"4­z¨Â–Ë—‰ÌÄ·6ñÃÿ¦<ºyówöðùw7áé�þ=ÿúêæÛžþK­o߇$<á“×ZîvÃS{'&q°šMRî?ºùýñ/§3<2Rüáþoð-Aß:óÉ8ÆÜá,'퇇ŸÀ;}b“e’1�^R;yË8Ç—Ìdð¢‹m¿:Á»Nz›:P‚¶Uéû,6~ý„=z­Ü‘ŸÔ$só¸êÙ¨IÃp¹—·`05©ô‘¥ Y~|úl*ÏÒòÞ4…š¼abÅçØØ3ã]ozz2Ò;õ"¦È¡¹Õ¶7.&åÑS0«SК;¯Tw8»2ƒ>�•žöø¯'“SFv×IÃOŸÇöáñtf“Q^zßë†d7sóŸN@Ø@ü¶¿L�%rÜï_"éuZ"!Mwô0³²>žÊà�,¯öÇ{0/¸Ñǯa[�Ÿ˜¶ÇïIÓ/°�f@çŸBk'ø}üúµ^8%ÌZjq|~qظǑ!àkðÑùíO�‹üÄiøQlÈŒª¾ºQŽW Ÿ’F§Õñ)~T9q|²ÈŠi?áólbV’O¥yX sú4÷úÍü:.‰ð|‚¿ÿ|’°Ì°[´ÿø%èž¼�¾©%×]Jó ¦h< Ƭ[Ò�ær?À_7è@–l¹8X¸]�õ|Z*oâX{oøÊ ê¡ øÎM__CnÊÃø+ØjeàI—›lâ<jÑ$¿;qIØ4|6� &¹<œaoƒ„ê�WÔãõổ†ú_áB©îPLjºwIôIJ,Ë™¨»ZSiT:ðy5)²Cš[ÿâf�¾V´É‚¾n7úv!yØ«� i§<„94��ãVðÃ' Í'’L^D�w<ú)sø¨Ñ(q‘u„‡�8ø™ž BÕN¸Oˆ,í…’êøeØ\Æ@Ÿ|½øŽÏ‚*³ÞÖ¬û—<¦"µÞø."Ê«ÝäqçŠ\àTeŸ�&éÅÆŒ‘'Ô¦½éÍP[�BמIK$¥n¬9þˆ¤a&éÄ~–‚~=%­Ï?M�Aaukò÷r/V/ì1é3 «Ïqæ¡*&P“3¢o0 /'›­ ©¶Úõ¥±p�޹)-îCº·ÀaN*YááyžÃ7A\L\«åÜç­pÇ—HûÆ%ùÎ’ÚÚõ*m?Cã1Ë´LL¸ÑÊ&Þî yÉAʈ[¨°VÊ ¯{«^ÁÛ‹lê;CA>i®b÷ûlüufØŽ&ÆÍRq2e÷Ï�›A5ÃPÙPK"i'üIzZZaØeÔm2h¤qÀ‚¾—¨C0;°úžàk°*ʯp¾¤‡Ê¬” œ3½µ+íz"/Z±VCv:R—Y¬R¡Å.·ðU©…ƒªÝG①ɤ`|Ð.g8¯OùbîäãÌúDïP5GFûInûeOÚV+”ßÏ}ö˜É;ÎÞ5PgäžR̈K¹wË­ ³¢¯7}e}ÔuKhεàG®©y‘ñ#ßp^ډџÕó׈ª…­1¡eD]Ú¯H€PÌçó4ÿùãF´ð‡ô™¹x› #ã×:³ƒqˆgëa±T*¡|ª"FA…¤9�#Ÿ¶ß)ò§âº>ÌÍÒdäŸRµá»Ï²‰lâµ8vT ”ÊinaY@ݳ2‡u3“{G7p=ݽí…zz Üdµ·heŠâSÚoe’—žÅÊ\8B˜*vÇ£ŠÖÍÌ©,�+´¶jЇ§­)Þ Àl­!]K ˜™ËÆqí¬�ùÕCä]î|²WIœ">O¶Än\›¿Å×½Éd]�Aé;f:ã+­¤ñD¦–ÿqsÿ:д(]ÎãHë™ç]"SÆýl•¸4'BåÿTÎA©ËyžÒ9×›¨@ÓÖ¤š¨h£š(™]¡Ãfv:@Ñ—g†¨«Êg�áK½­`Ûž«•¿›g]õÎèÑéš%þÈ�¡vyêrR{aC½œf–¹lt$ê 5ªà.J¬L�eµ�«p€AÎI¤øðΟƒãÈs3(3ÛW`ÄD.…5â}À8~¹¾"á ¯Ûò§ H’å`ü’ Ê¿ ¦}Öø×…é``ÁÖÍGbìàõ Ù.ÔLÌÊ(#Î]OôÈ �/áÀâÄ_kjxï8-¾EÔ|>EWT¯\j�DÔç˜éÊ5�ÐOs¤7ôyt™ï’‹+Ìø¹\ÈÉW~ïk/”\Í|RV/Ôº%#“‘k³Ûܰl§ aÝp…^3÷TS¸“ÛGòBWÍ/Œçx¾æ°˜Í OǃÆ‚úªƒ×²‘Ñ߸üéUM}ÆSœ³Ãýd» €Ù!Qþ{^®ÿôdæxƒë[}€kÂq[îÙ¦ø›•»5q §U|ÓlÞ@ŒOÀI°nñj\0¾gxŽi¿ðÛ=åë˜Ðá÷ü ZWÔt¥ßÈfH¿[Ÿ¦nÄ€„È$ÁA¦(\-!€Ñ„ Èøc‹½Ð»ô,Kx!o]îI9\|5 º>_EgÍ­§{�˜®>O]q•Vyjvÿ•YoúÀbÜïÝ,éF PK¬éù óJI7YјW³3y¶&l0VâaŒ'îéE°‹“6ì�Mª”Kn2\s»ß9§G W‰dÚ tKpΪ3®ë�=Z‘¯2D(«q¹EôTãÞÕx.!CÏ =”E|F�®Ýž›À¢ËÅ·Fl}òÎÍ×ew“¹4`n˜Âñ"æRhD3])tÍ\îj]Cww.÷ª‹ k“ÒžàyV‘Ò•€Öåâgbo÷̋ˆ{„Ñ/N$±áÁ6餎Ã(¾ó/Á¹û;;q9Ó�x|ÃJÁ|o‘è¥ðýÒuŒï…’uß ¢•„Ù:<¥< “ãŽöß’ÌÚ9v@ØýÁ,\ TÝÆ€:ŸÃ8Œzwd½K2çeIƒ2“®¢_�S °º14}èiŽ kcIÑMîqA,ÉšMâÜ´\ ‡™fɆl;ÏT—¸¬Rwæl;5gÛ‰A˜ÒdÛ 3­äFžÒÝ(‹6X¤òˆ¾ë`A¤ÚN‚] °CÛ’ÁNÄ5²lI‰�ÚáôLõ]VUI�Ñ�-d7iÄ¥sè½67\D6`)›£ßÈãw1Û23ŸìÁŒfñ9Ç 6§}ýÀÑÒã² ”7Çû'39‰rX1 «L¬n"åAí¥-Q.?â§@ƵLnDV'ÒcÉóû�qm°«éñäãJÒH/&ÎÔ8tU1ؽ:âa·×,ʪ5è,ïGE©¥¬Ø ¹'Ý÷â㤰S7é,ÊÎ"ƒh`ØÅ:NÉÃÜ4ï…´’™—‡‰¬Œædebd7>¢«uV!çÐ’/ý8óáÈò+~\7 ³ÖÌýã œÓoO/4QÔñÕ|0~Æl/§×KbšÓ•�¬¢gè·â4äY Ú³‚I«à+vǸf™è)»‹h½?ºl 0¿ø-Ÿ’b¼±E–6 #fá¥Î§6Ä+§YpÝ‰Š‹á %A".˜Ř×K"¹%�g•~Y„nvä·¢% \YÑ Ì³´ ºdE$%…¢«PC”‰Ú«@\îV>�DææYbbô¬†¹x‡ñ¸JΚãÝ;QŠºQ€ѳÄ+ ʹN Yš$�Á™Úä�0_—Ç9±ÉEõò !’�„˜¤àÈ+]§ál‡až’mLƒ°Äµ. GèŸhŸ²H-Ï´tLW¾“ �Npæ±Ö›m* ´SAÀýJ3Ã`ø`2¾Ÿ¸%‚~[¶|zUjÍL`UqÑ�Çþºôóqú<Ëkch`¥™ÀŒÜcJÌÌ yHXMA±�’V(‡Á0°[ŽÓ)Âf(šÙÔ%a$m™ÄžLEž£’î6ÚAiô«PܧÈäÛAñ¶dÀ" ƒÄ ®á®›ò¸RI‹à½É«ø&cÈ¢+ŸÆÀ<¢Ç*E”íõ1$ϹÊî¡Í7=åù¤œäÐÇç¶‹¤Âv$à ìiÈ­¡Ü‘úëÆ@ôöÃZ2!@Ð�1�c[ö ûa„£Çz¹ù� -°!ó  “æuê`šÈ"ývÁú3öJbnEÂÔ~�<ŽqÙ’”cxNÔák0Q×.!÷ª(·pÊoÁ²Q5�èW3O׃ôX hmp„b& ^72;È‘%xAäú;€·.Èã\11ÏÜêhfúŽÅ ß®ÅÌBÅŽ™ [àKRÚü wù››F¡ 7�2Óõõõôö twå©BŽÉ”æÉýjZfq(Ęƒ‘¿˜T©`(u2¼D&‰Ã~YÂG†õ¨ðïp—>eÕlT‘¥èòiU€g9; ’�Ѿsÿæý›o‚Çtx†Q<î# òJk…<ºyûÞÍ›÷Þ;|ÿäé§7oþ×�ß¼ù.þÏÛ¿ýüsïׇ×nÞ¹wxÿÂrxÀ¡%'dšG{V¨> þ9Qƒ¶T]¢šOšUÊÒ\.Ñœ¿™²‘Ö÷Ò‚äFfÚGþwNW¦KŒfQȆW^[ͱѱÎy�~ÞòW{Ë×­=RWºgíq® qC1�Òü á;øïÕÜPèô=`\‹óBíDû¦M?¸žL½ Ÿ\À`z¡»VX+²ùNÝ�ðû™ªN)½Î¦_ÀT—åäÁë>y�^{vPg ©ø´ƒÂ_m¼ðRxV_5ÚnœÛ¾.}P:f?”Ëû8Ñ/h:�¬{A ×¶Ó‚Z–°cÓHS µ=L Nä|iaK.~p)¯tÝ¥%S× 7™*c.fÐ2˜Á›L%ŠÛ»­z÷ÅT½-6EÅ0˜kn LÈÙËBz<Ü¿ö"éÍ®ÈU¸ü¥…¶Œ¼J.s\æ{¹&U·¶>¯Z %¯J÷s•#$"¡š0¤ ßOà$9ju†Mȧ%O�UwÛV êâ;k¸ IVƒò5•c×5ñ„ EÓ&V„�ä…�¶æÃŒ1 6EÍÞ´®™¥¤eÆu2Ì™ÚýDíA¾[ÊA÷ô 6’û‘/ jï³&f�!ØXÈub��‹b–´{ñ•yÙè˜/²Q´ÌÀßS³ˆ:ɯçL`»QˆKN®—kEËù,¢DÆAb%Z*2’Iœ—rù£ ¯4Xã\mÌhùÖõT¶Â©Ä‘9ß]Ùf9Ϲàè¼4ƒ4ƒ c„d#|R†Þˆ¨õÔ$@ ²ÛLÅ (É]Eó�­î^LDIlXñ OºMè5|‘Ðkš²(%E­¬DcIVÙÛܲpëA��äÑn§*1,XÂj%q:4�³ç~‚öÌíò#f[ÜõmqB+ÛZµlWÑ…ƒ{A¶ÂΛu=>ºótî/7¬¨g^ÜGЋ¼®Ì&m+àdkÛìÌðÔ¬•>Q.dÒ-o…EšªÖ )OCD>-î&º_z;lð)]évØDy�j5s†4Vûhï�K:’u|+!?�mm&W•ÉY¹u-�YyÀºOcƒk G)Ù@*,xçöV? ÅPº©Ÿ–W0vuŸ%€`qÕ|kZS†­rrb^a&çÌOË+©û”>P±z�k£�Ë oæ~Í&23ÖåŸÜæºfš÷Ü‚}0K©4ð®à¢åI$xÙAà5¸l–aºësV´ ­–Xúb^ÔÞÕ£K4~¬ÎD‹º($7ÇßÎ-°*U«öÜ‹ÌKeLÒ>êßܼjÝÒZ;ý˜àl‹Ù|µ›Ê¥%@8øh™¼> ›ð1­GX ¸kªýJLs= |ÙãÁ’,º¡.lD÷']½‘‡P×­Á2%º‡¦§KŠ[µÂ„ÃfuM eº369{ .üÓél�Ò…ëãB³pA®¡¥)#íPî°<ÇF¥<µœ!ݤöÙº•»[+€ý­\Ž‹15±5¦ö6…J…ÎH7-‰÷RT*¼dýõòì6ú,ä²ä[[⣮ð§78Î<_Ø$§b¼ÚÅ‚FCÆŠÀ¨a]õKÇÂ…Ó—×TMvn’tÝc¼0ÞÛzTÿ@v )ªºÎçsØïÎê¨ÍùùŸp•=uÿsˆ›Iù ú=¨ãß î±V¨®{\°èìØ[±Å·A QeDýBAK9 H¡7ßLös!ßý¦/þ£6’c­V÷£æØc-'¼*ÑÀW¬<þbøScÚŒ m×G¥B¢‡&‚ªž)ëÎKÓ9ŽrdÇç *•ñÍÅ\×N”Yï<�`X“š,€@%·Ñ2¼da|£‡ñ})VjZY¬ŠFñWh°\^™¹ÇªN†úÄ({B #y¼â§_d“û:bâönlª÷NH)^»ãÛø K_9˜˜£•v‚Ȱ¼|bÝH J-Jù`Ë]Z½Éá�“DyývžËñƒ8?f�ïägÿ¹6S¡*ÈR�ëLI Ó+ÏØ¹¬:�î»±¶@^ör®¸à@x:z ñÈÇf= |¥Ü“4 €uZ¹$æžÖËÆö«^Rñ�Gº÷jJôcœÁˆuQ �\æ"XÑû=wE׫­€T­õaª™‚IuÄR 4šz� ‡‚‹î1Š:H,Q±ÍÊí;rLÑ{-zP­íBìÑ»'µW(޲pôÅ8SßÑ~–Ê„º^C#/¸„µîUU\•j©Y}%k°®¾nd)kÜj£Hž°:’‰– À(©k7EÏAÜ?vÃ)JЊã(Œzp§kS¿8T¾ÄÍ@r‰ÖâLu5e/õ!é(ÞB©b`÷÷à¡Ãàʃ�YoZߺh½Eä‘Öª<Ôò±Jè #¥…¦¾¡�Ã3Z52Ú”ÑHorÔðûò”T·“';Yc…9þ¡ {j1Xa¬VåøT1<æÏèÓÙK�žÓÞ…÷œ—HÄ?†@&ÜE=)±ŠºO—Kå¨Â(ñ„IADÎq ÝÏØXðOðŒ@ÆÈ:ŽÃqøÅ ã3‹4ûÏš<ø]\¸æ” Ç"°|ÒJ­ „Ë�Úïá(wçwÏyö�Œ/� [úÞG'¡CB”íyõ…ªí˸ˆà5ÅY!)ϰ2çЖk­ýÜIåÛÜñÓü«ê7/-é¬ôÐ&šÓi+•ïœ.µ" »~ç^®ý“T˜Ó¤|"5 .ßä¼Oø7X-ˆ·ZþTP7ní© ™Îaúç®�ê%#×É]ÑûÓ^(²Vœ+C/–:ì«’7ê Ìsy#ZÝþŠjž‡ûf®Xw Fr°x›VHx-çúl¸M1o÷;oÖ�,(…ÙÂÆ’(ÞZí¢“ ]¡ÌBÐŒ1Ù‚(&æSó::¯Oþ¬Ðü¿Oñ}ǺG4Ç1igùYÉ‹ºŠÌ[ãk=ºQ«xÍZŽ�ø ¯ä|Ž­{š‹Êí¿ö †=…gKßÙ*�(_�k¼ïæR—XÎ^\ŸÀ¡TÑëÞ”.òa‰ªK¤Û]nÝÝ�]ÞuÁv�¾}¥�»à³‹y6nzFùæŠCö^£y;¬ ¬ |œgˆŽ€Êì\L!ñ-9í’2ß¿ù?�C.endstream endobj 125 0 obj 6880 endobj 129 0 obj <> stream xœí]Y�$Çq–¡·�à'ÿ€6üÒ iŠy(X¤(вi‰æ2 éa/"wI®–”¨_ïˆÌÊÌȬÈêžÙr ¬aoUVq|qæW±ÈƒÀÿ[ÿ÷ñ³«7þÛ>þóUúõ ÿQÿúìê«+¹þ‡XŸ>¼õ^Ðð‹\¢µêðà£+¹>ÄbeŒoü¢à_ž]ýþø‡ãéZ,ÎxmýñÏ'³ø¨Íñë¼m¼‹Çg§k£Ââ¢=~qºV‹rÚËãGð«Ô‹ñ¡¼åñ+ø+8¡ÂúzPLJí•ä;OOz±N[EÞþÉ<ð߉śã_ૃ3ÇOòœd ¯o•&üñÁ¯q T·Z,ÆÀ.°Î毰Dm¥�Üàn©Ï•ÂaÓø¯`Ž2o²reGPfQF¨2È¿à!E%»K&ˆ(ËVx8ÎpãÆEéÌmÆ}ãja­çvßÁ[Ñ{²ûO@®ÞJn{¤XDòÖ{‡S‰KL#wT½Ö™9 9Ýx#“>LtÃ.p’ÇÏÛËùO!¤9~›ÇñNÓÈk/‰|Ü~®¼Q‰Èji͆xŠ|ÈTŸÁ~Ee@D€4аw^Æ"ðå—äåOðåÿ¥P^à… ‹}žþ0R×Ù½$“KÛç<¬‘~àùfûð,®•…mpRf1y÷ŸTÖÄÅ—0NXd/CžW¹ò¤ŒMN®ýëǸ÷z VRIø¶!FÊâ¢Pr$b-o˜ÖóÃ…—@.ƒ$}~‚ ι¶GÏNZ/ÂÀf>ÊS·"�Ã|�S‚Aµ£[„ÂY€P‚¾9Y»ð$’dæ§�´È�ðóV(CI�Êl˜2a<Ëm æìÕ-™íœÔÕ=»!1kœLÙ~"¬Jù%c�uP;)8ˆNŽ.§kåâ¤;¾‡ËVNò9î j ºì Ù7Ü »›Üè˜lfã�vnDxoÆÇcG¶°7ðú¯á7©´ôtÌö¡õØ�÷ùÔê}Øþ¹®©0±P–ŽI'BEí¯i �vÜQ_ƒ:RM,˜„}:”_ãHAY«5wˆ¾—ƌܱâÔþIß„¿€Ë,�ÁïëÂXÊ5H�¡ ±®Ã £yâÍ`$^o7ý H Nô¿vKm5Ø=lBåû?â6Pe1íˆQÈÚçv$,•“ÿˆÉ.@B~ÅR°ÉmŒTã–«qcn„¥îi7.„ o6>)Kaó±~åq�s¥(r¥€ÓÜäÊëãxF€�uT’ÐÖ-ÖR)÷eL=Î !�|0Ê"@ó‘óå“ÃÇáë¬>Þm^ÚfÝD )ÂF9`¬¿œ´�oXUöÎef¬¯Ëô3õö†32åc 9d·BG¬Ü¸‰ÀØÉ”?Ü~rÓG"î`z 0í×¥Bú• A~ª1ü|Xù wIrÅãÈé®ÔI�ؙѭR[FW–ÎúQ}{ËèeU‰Ñ1„ö}<Œ¿V P{±E�¿ÌæµA“™:ƒ@mº6f•ª¬c„ˆgT#Þ¡©µCœ«œü˜·Ⱥ9é}uµk|Ç,ˆ éae¥ôÙ(lt¼.— 6‰[™ý7BŽf/ìV® éZÙhGÝ$*ÔÇ_UÂLœ�æätŒmgü=Áw ¶­wT»¼‹ÃXÀ ì þŸû„î0‘�£ €¥œÝáþ$[}ñ=HÑy0)%W^æ&nQ;\ƒ,“N¨Ž2]d�Ü„2ïacvƒÝi�iÏÖ:[8Ø€®²Õ‡%x#ë+á`áoCö€Êìɧe]Õ¬Õ°Z Ât“»8>A .i¤—þ—�¦”`-'0½×—Tóv¿Qôµ~¥!s""ö’°u pxú†Õã¤RƒXtÍ]û�uò`|—~à †ÝÈÑa‘ù¬^ÇEª€G« };Ë2¨:˜é^8Ë-¶¸L¢�•Ü$¹ìõDÍÀùw�¿‡º¡ÜÁ§ (�¼Sþiç]¸–Q¢ív¸Ö!sæk¥s‚ÑìyÑj’P±7RµŸ]‘ª€‚ÿè^ÀÈ’§ ›žÔ߸ê¬�2Bé×RHÝ™$.¸a.œà[èóp®þ²�(Nõr¼÷.±ªYZ?Þ•Ø€ÜRÐîÒhì«Å^�³_›š]e‘l¯?…›Ñk™æÑ1ó?� {¥ ´î�}�ndB17j~»ÐKÂ'7™³‰|Xb—±ÁöÑ0öÛ(ïD´ŠõœM”ù=Lž{­}õ‹¸~¾ŽØ`”‹89(Ǧ LåÕ= åA«»™ lfåѸ�¯¢÷8²Ž¹ÞM�-R›­› ?JMö‰›ìqý,u–ÀÜ¢ìíFó^ v³drÜWÞÏw/ƒÑkì·H¥Îåý³h?9GµOífü”HåM=ö6}/ÇÆ."1WÛò!–t°Ø8 h�ø5â;wk!®M¾MúóFDo¼:~V}¬5¨ðEuÕÿ¥~®�¾5(&à+R¶Ü ôã1é?í¯õsJÊã1ÞÂüïz_cïuW¾.%qæ÷íSû¤º0×Džtõãæ”3 þÀ–X󻤌Víw^v:‡I™yÒ‚GCdWêE &i¦†,…ÙU9­wô×¥Â<éûáÕÃ<¬ptD:n ƒ»FI·ò¶Í ÈWµEâ°ÿjÂgIE2|fÔtR<�Ý30¼ŒÇÈB¿/$ÿdŒ>‡ÄC’W¯/‚~‚J‹…‹’Òû1ù1ù»rTp 8¡ihVDKÉ$_¦B uYLG—E síå}h™f™æD<ïgñ¨!Ü_2=q!c¼~}°�`úMÜd£žâø˜ÞjÜ63&Ç£1¶k|IHÀšÈÄçý²ÖT”’”È,‹•?#q]ƒ´ø~eg]y—e‡¹¥¸5w|b½ô5µ³Ï|âÀ InP®¾ÌF› Î,”oç)¦™„ã}¥ƒÌЦøq› :ñÚ\ŽÉfºâÿ#ûn"ç§·j]_Vá´Íë º+òAºÑ~Ág»Ò¡™ lI Sñ‰ð ž}1Úµ½f“ˆ@^7�v:°n—@¹-ÙXmÜ>Šæì"Õª•Ð…k¸¢©kmàà4“»tö@Ú1 »c|­ Ð¤¨ÎÅŒNÿ£÷äj&z3ҟƼtê"Š{Šþª:7¾ÞB�5}Kö™b„s¿Í)ÉÆwØ„”ް•æáãª{¸Œ²K²9„‘´B:Ûß 7(:oi•³#ïNòbË·ëÎm ³P¿@BªG¨ã#ãƦI]¢Ü³h—3åŽ4£¢†!væíÝQmƒQÑ¥�>*-$q…½$ú£G”©*¬s?-ˆy«F² y¨¢N€ÔHΔ%EX•lêàslŸŠ—‚ÜÖ²Q}ÿGå76%ódYÊ¥ºœ €œõX—+t˜º#†³]/�ùdQBÛSÛ mö¸$tÄØê*æ5>õoãÆ®TŽ£Þ¨1·#Ó+}üåÉ;LÓ ƒMd$ü‡�[ƒF9 †k.í×ÕU:™#r¨)oᘇ9�Þ„Àê[ÌÞN�&÷“SÃB>»÷ØJÅ¢Ùf&_¨¼X73•­èßh•µ8âÏð_WÌ3á”ç�“5ÞP$à°Ô·PÔo‡ìü–±ï…>þ¢üÆ©N¬f',Fv!'m\*»½'0 a`¡Lÿ â§¾lUŸäß'U6ìç[>+µW TdáÍ<' LIΚ}TŸ{A¸é F%í’ P'ÏÑ˵ ¡$47ßÐJ7€ÞËLà··wËLbWÄΕÎlkd;5sS´�‡a¦Ëø>“¯�1VÄ#õZß½©7ʘÔyðÚ¸' *F™%„Ûzã‹&3[@pÃ9¬[î·dª« ö4|P>I¶jUpÊ�±Ûyøg:‹B´Ÿf­§ô"]-�¹;‰’ €P=eÄKó¥ xw§¸{ä¢U«¸&š˜©aY £éD¡½_yç7•Ÿ>,¿±\Äk nå,n´XëýúÉßT%ðaýMî2³éŠÆæ#¥8vž)Qª êdÙ¦&�Y½¤6 ¨ÜÔ<Ü]qV_õPœÕ< @[)·µ—Ÿ­FŒJ‹„è9]Ö†áÆ×l%ù±5Ýçd´XVÛaZ <±¡1KDÔÚQ=ZÓ9‹D´®#™�sþÌt‡­ýçÊêmìMU`n»‚n%«{oÇÒ:cì‡-mánnÃ`h ótˆR^X›ý~9•m‚Ez#EæƒãM•t*ð<˜ oIœ>]r„ ð Öœ¶ŸY¶ìz©]ž)¬£ä�ðG… ˜òY™!gŠ=®– �]f@€48­Öý ,×ÇszüÆÈÍ8áaw²xŸáÃa±Þ¸¶Ÿ‰s ]#o¶ç®>ß1sH޽ZÍÎ.�ˆþ|6‹�ì|±"}‡1 e”(¥?Ãr=b_Ã�ß ë”àüDá!EA|“†<´ƒ¦4 >) �6¶34ñC8•ôºbûJ¼\©JéQ¹­š åßmÔM�¢ó¬­�é]]ã~ßR$de‡?¶1PA¿Çºë%> œv6Ä�þmŒRuÐËN³ø‡Â�ϰ® èµ}À˜žÖôÝúøЙbàÈ ¹QÝÑLúbª‚ÕÖ±œ‹©,X.¦|”K"<ˆ~›ÜzaÀèͦÂór@DrËÁÆ�ÙË ’Í$–b! yþŸõ@�,LÅü;ÝÚ&I$ Ûª í§l8§f#üšŸRÇKÌŠæŠgfÄØåU¦$‘¶94#o4úPž±Œº¹,1ÍYKH Mïó!*ËæÝOÑÖPó%Œ¤€aôùLxF¯3¹„Ñá_7µèFï›VÞºÕîr¦Œ>ÙØW`tQÝ3Œ.›2´daò›­bXšÑÉD!p˱Bó.�~9ƒ:è ÷˜ªê>Q釃d˜a=ˆî•Ÿ�µÅcim bP4áŽ.Ö€Æ.Ñ£o™Ó‰› ôfŒy¢Ã´ÃŒ1qñ|«Òò¶ÚijdtÀ\ÓIR"ߨô‹Ú§±�'w0<Ùˆô,VˆŠ”66†æ�'ß²•Xfè8·ØÎ'n4ÄLs¹ÖDƒa¨:+�¢Î‡¢’ÔÞÕ}Øõw-Ù‘áÔiã;Ù¼)Ñœ0›° ì¹»¨l ¦§ÄÚo�™ͯSxÙØýºüÀEï ‰XÁ½£õBÝ�£:oŠïÕÙÑ‘”‡`üÒ;àr@gr“Ü–ÝÀŒ›D®_9ºÓƒ?m8Vt]æ)ÿ}“ísK¥÷�ÁPw'ûRGì`kÅ‚ÁöUµhUe¿·¯˜[±ë½C\-c\â�ÃÝØo¥ÅPùʦyÈHŠzÇ½ÇÆ'ç©ü;4l‡šƪòd—n܇÷¾NÚvfä�Núþ‹úçg C©sù’íázm�ç=”è–ºŸ‰QY2é‹qˆfÌ– 7qݵÞJ‹¶·`tÈ�݆Ú�⎨d² °fÅɃ˺¢œïq±&QO»Åȵ Ôµ§ÏÜÕ‰�\š,Z}Ñܧ\zç“’–îÿO¦µ‹“û^%‡˜]ì±ÉXgļ,þR·ã ÖÏrˆþ ^ŒÚ‡¤‚ßypõÁÕWSÖ¹@;6Œ°ï\Ð:$WÏãgWo½wõÆ{ï^¾øúéÕ¿;È«7~…ÿï­ß¾ ÿóÞ/?¸zç½Ãó[kúÙåG˜cÝ3‚Ê—Ö¼¢glH%’9OȤK„À:øD¬¾Ø&ÿ.—Â¥×qzð$ŸiyÕØMÙÒ@Bš÷ܽ|ì< ¥´zÑz_<)ÃaÆ©pt}Gÿ×[@º]yqÏ“‹Ä§ÂB6­0+ñ~ŧÀϨÅ\(>Ïyãñ){oüOG<ß÷3ÔÆ¤.öJdíœÞY�~²ÆÎ›[GL®ãæ†èÈbF±÷R„ÅÜ»‘`sŠáä>¨|‹Ã�w“/4è²Ûª©ÜŠ4ûì§Òk¿u'n› ˾iªøÐf|èÀâA¹y mmÎAyÖ)ð¼¾ýdmqm5SľSŸtË~N|¦æhX8z9³DÖ©°ž\'IÒà øHðø›½Ôsž |W“Ù›¡³lz¥ò²ÀÖ˜OÊìÎæ ×îæ\2òç-9ˆ$ffBˆ›û@ð“c*�¶Ã_\Ú»Ú͉ë \^Œ^”>ÕØèì)_�ü�šYü /9¹ð^ >•÷Ö5éÉI‚ÿ¶¢f?±SÑ†nØ+]ı?�·w§ÁçvsåÓJÔ¦÷­zz ôlUµŸðŠò¹ÑØJ®FZ6|“±\XHaŠ0ã¦"vQª"OäòiKŠîk¿”pwp�oQFdÑ Q®á}Ð÷ Ô'QÏ•@Iw·.û_‚Žé®á[OŽ–ŽÌÓ_‡KôøÆ)}*†Ñ-·á³ ¸èØZD€MÚóïã‹i):¶~F»TGÊh×VwÒnªÀuã�šú·­@I› jìlqZ9Ä6âÂÌ”‰>^k6\ ò³äÖ’a¹\£­îŒ!7¦‘nŒ4‘ŽÔ’p7Ù.ÍõE@ûxoæZ y®üä;)íÇR?9I+Vtœ·"J>à.ÛzÈFpÈÐÿ_àò¤wý�$Ñæf°Y_æh¡pKhIž¯X?ИaYã`RNË�ë¾Ò=fnA�ˆa6¹·%(sn³'kAÍ&æÆ-.¬u“3muRK›Æú‚»PI$]E˜ÕQŸG8¤ægSF>”ô7FaNT½�ì\%ËôN;œµ•èË4¶Iß×ü%k| ží�Ø%䔦‡s›L€Q[5µ™Ü·¹¹D°…™nØ£QEŸ²«s1�ˆ’ê†ûn�šo ò¯X½”«fãšx  ÆÍÀ¶§�PÏ�¾š-½Òï’:8ˆíT—çöÛjÓ¼»µi2ØŸZ7}ým 9#±Ž¦3¹ï÷3é/SC-à4í¢’ü%b¨‚.Ïm$§R4EŒ½¹=8Â;?tçèÛÒ ¯cšGÇ8Õî[ª$üyGn6 Ç„•f8¯Jÿ¥-‚°³ª…ÊÐåÊmo¶™x[ ‘&§FS95ˆ ØÂØž\P�À®Œ .‘*³®aYía\g¸uU šäGLNé8£ä�r†©=j§r¾àyRÒ:i 0ÞÑ�ÆÚ¨óêhhKXïW.{§þõöÞE—XÔIŒû±)yºÄÜF’¾Éåe® W´ËṬôÚàf½ûž2×R£ ‘ØJkÎyvë:©6ƒÖàäÑV{µOf$.TØAâÙý–*o‚ãüt-�’dӬ̳Um¤®yƒ=>8ÔµŠÏlÅ]Ú9Þ�,®æ‡ã '›&^ %çœSJï°û‚7ÙÎwÂ`´"¤Æ6ÇÒ]bT•¼|Ÿ–Þ}š,í¶ŠáÁH칄ÁvgÓMÜõÏkøg „© ã“-î§'¤ÛhÓ�²ðU Ý$Ëà$€±ñâT¬¶ {XŸOa‘TÖÞ �ß’¹?�t’t\„ÎÑe‘ë˧Ð.ÿ4¹ðعîýü)Ý-æË6*€2‹3Iô…¼£B·Ø§ù[l˜oR‡�άoíÒ·ÈÚ^>jŸú<ÿ»P9z!ò%¢çv€ÿÀãÕöJf¾åƒJ9à>“Û¢Ét߈¤>m�>ξ ‡9|….ÓGâºOÛT×sóÑ5®E)Kwˆ�´æq�ÌsîŸ(-+)Ç�„…Öçe€ Só@v ÈÇÉácýõN»�[†ëU«ÿã‚›`_µáíª�˜…¿Nào>äiyÞ!6Ëüï°TžW»ðR{ƒvÂú¯mE»øÝû'샂mâFaëz>/§·-w$ÑÞ]Ϙ­Xlk­‰n…ìù“äRé~'ªõŒs“˜ý«³�šý«·vçèõ+µžw/ ™®)\kv{ÛÏ[$çÜM;½«:2öUÜC, wÓû.˜EîWžN)½(ÐÏ!_û2!)úH:ø4¹¡Ø �_N°ž¥K|gÅ[u/á2¥i3û1­P "2˜vöº¼ý„óK/éð|æØ¶ñúÍrÚ«ÿL}ô|UÇòßá�-£Ë�¯$=¤ =ã‹Ù/ȺÐò‚9Oª«¢¡>y8ãœ}Z½›vƒ¢3oøL?•‘€H÷g±äÖ[ãšEÙe€¶�+K¡>Þߣø&^SsÄ®’Aa»âªígÈæ¨îϰ\‹<Üô¸-¾6}Üù\2ì„=â{lÖ²½°r³u~-˜áÐ ¸“?Ù'eê–iq»|Ì‘\r}Ò vgÊŽé€è¤˜B—¤XI‹ÌìŒ}èî/…R ï뀜š Lr%§ºŒùâ0)•óÅ[NÉ¥Ì/È›2[{g£úlÖ>=îÇø‹›æ5vYÔ¦±µ·,AT^¿áèà%ØÆ´ÉbIÀ8ü…XRÓj‹ƒž+‹<— ˜KO…2e{çS¸¿½t‘€i��kÙ¿óýZJ€o_©poâhg¹c³ˆ*ŽÚ;wšï­R>(œ)ÞTx� Vð°£ÉhØ•U—�>åéˆ÷ÆøbŽWè:_pZçWÿ¶¤¤‚endstream endobj 130 0 obj 7167 endobj 134 0 obj <> stream xœí]Ù³œE÷ùꣾOéËŒ0½/…úÀ"…L–¢UÙ„$„˜`ô¯÷œ^¾>Ý_ËÜ{'Dªd˜éåt÷Yçtßowlà;†ÿ¤ßytñƧvwÿ_áÛßýiüôõÅ·<ýK­woÝ„¾áƒ×Zìn~qÁS{ÇͽßYe¿<ºøûþß5hé¹Ùy€Ê¿¿w�ƒ6’ñýÓÑ FY©mþV‹Üü§0t ©ãNtó.ŒúñA ÞX‘Ûª�¼eœc[7ǘÛùàbó¿à³�JÙÔ¾&Ÿ É›w©Úß:Å Œ´|ÿð]¬`Úì¿ %³vÿßÐThÒç_‡£bf°šö~|8Jï¡…ÞS¾¥“>#Ÿã¶9‘Û ØÀûñ#3Š~û8·¼U¾{ˆs±Ay¾’¦3Aw-¥ß?ÀMòJ°¼h®Üþθ”D“ÒÓ¢Ãú«ùa±°.W5x|�b`ÊÖ#|ƒmå`a úuX¬fB @8ªô°‰j°^À°ÏÇŸoçÅ”Ÿ4ËÇݹ3.ÆSÜ ŒKJò‘  â@@Æþ?ðÉ%Íþ²™`p¤�È9’C“™0î’.ç–ð´¿OwÂüdDrH›º—…äYGæ2Í’p“HñQÃ�,¨AE²3ÏÕŒp7J'w„{ÓïNZ—äFT2ÉFdò1,M2 ¬+c¦O +QHg6Nß~!Q¢/+üŸŽNØÃtïႸå �ºDBgéÝ™�´f0õÁ£&0~PÒÓìh‚"WÒ† ´ÎËÐq]b“&�N‚v7 šÀØÁ�ä®VÈMKÓ’k"Úírx£æ—ã@±q[ ò�ðÆÉ¬Ù=.²€BÉóükÔdŠóô£g"~G°Uð)J¸ƒ±£„ëÛ9è Ä¥NÊGIEY˜ÚÊåƒG_3´4ƒÓöå¨:nÒâÍþ» CÛ#Ëí€k¥‚‘¤ë˜º¨ƒ€h LaÓ®€A÷"®DZJ;X>1�ynMÄ*œM9‡Hc\)xV[è3( «BôõD@'š3|‹Ü kè#=Í*j¬ÌTà`NXftOãY˜“q³Sƒ„ã±ÏM [X+MoxÐC»cÕ|:E«½kÕ ¼Ò4wÓ*Ý’AGê§Z3lÿã"/™ÑëÓ“ €LtmèØ;Œh,ŒOL!•[2{&ڻƂÖs]æšœøQX˜AP»ÄÎhÕ�|#ÃDnüÜ.p«¤š H¨c•B¨šz–¦«J@ØÑ§a™É×伧ˬé�)ÁF¦�• JÊ Ú{Ãk%õo` ºçõùÁáªÑT?CÞôÌó>E3ÄÔ«Dý—Ú½>îho<`Œm'æq'¸©÷Í3ÓÕî°o”q‚ ç™ëoKïm´éo[«ÜÖÁÿìò–Õt´;éHMØ ‰ìÇÁÐdÉþ2xdxóyœ#WzÜÇtm`Ñ+DöVww:“=6ÿ,îTßÌiø±04œ¢pÀãà|¾/âÖÝE ¾hé¹:� "ùÚ²�qˆ8F®ö8Ër¯�]ü¼+0…cÕüóÃòRUr7È&E%Û^×úD´�ÅBã7[ѬFÃÉPmƒÙÀn<?='³@ü‰Ì6 mÁB‡­Üktª:û^‘¤ko-!­Ä%LXŒØ F ¢+½À�yhì¹¢×}e~VXŽ ™yYÍ~ÉZ:—O´…§ûµ"’ÍQov¢$§çDûÍN´­ ºÞó®¸üMÎ{o7LÈa5Çå“»Êޯɧq`æ€|KÂÒŸäs«|‚£1(fVŽD¨Êb- Zì³IOXû«*=­÷R ô4„�€hU@„Ú, ’W ½ìºäp®D/¦•l8à MD'÷ „Câ°ïYÂ(|al! ŒAÇã1኷F@¡ø ‹ñþÒÒ‹›¼€eWÈ%Œ –^µyg8ÍçÁrÌoÊIJ2å 8@E�Úˆ I ™™¼Ùhâû0‡#y‰wÀú2ÔMªˆÌ PêT«,É¢ªtðv›`]¬� .ºòWt~'JJ{éj¦œ`ts —ôÙ®pI§¨n”è.$'zJó´`2±¬p—ÖÒ�ªêyVpæ¡V7‚ˆ³w"¥DÇIÙäb·HÂýò1‰ž¹Í�ãw+�z”V4éÔ(RŠNnfÕïå]lRºœ„-Yê„è Œ¨¶-J©äeî$æÎá»/“—¯fò;ÓÖ\]²ä¥FÊjœ­l/¼*ûÚÌQªVjêFBÓ¿"Ñ^{Çd�s�Ð2¸òGÐæ‚‚-€S=‰’Á~ÓD+X`Ú|`n§¡±Õ.“j'R�D´¡Ð®g0óXuig¨× K� 肚L7n^Þ~àÿ@p ;ìÁô¤|�OÀͪI`•–^½¨“EߣI†ØF-c°KÚõˆ‡]4ý]T Þ•Í¿üùâæoÿ¾‚6âÒå&夃à‹y¨¡Þ2ÕsRÅÒž…ä/è€~®…Ý}S}ÆÆ}+²™6Fê®1Ê‘m%ÊÕj¼# ò¤º5‰U±XWÅqLžËLñlë´ß²é)Ÿ¬¸n&>J°B‘𔉇€�¢" h‘�^^’tÿjåÂè÷=î§¡¥DŸwŠ“Ì” ´nã‹ÑMËLZ c‹¸sœ¡ÄIe"7i�šB;Å´_ÜA Ô ^¢§‡éº�)p0ã-°&LöªiðþR‰µÐ°@6(ÉCèÃ1›'9ýx„Ÿ¹ÿ’ï? -],ƒÀ™{-+•X3Þú¤ 3Œ0£ çK.ƒª¶5VV—É¢ºõ00²�äègn!¥_³”åU ¨^´r½såci8fÒ±Hü@‹MiÔâaP�ÿFdÞ`àДoti!Øó¡I¿¢ÅY«Õ[WéûÁŠ­SoBé·èÇv"îÌ)„ÅZ˜ž6ºà[Ku¿üéäRÇ&Ï„ÂZÇ€ôÕ¼� ÃÆË E‰4‰™4^fÅXöllô6 |fú¬b˜I=A‘9Y‹Q5uBFï�ÌŒø�-PÙ°VíjûŸªàWÖð„Vs¹ÕXŸPõ! Öµp%SwAñ …Ð÷“À u´`Ð ú>ƒ®¶–90ˆôyâmÑùßÿñ€U“Êt+¼¬\‰åR¿ÚmiÆmÙÓ²ò”…ðà¶ ùCÉÿˆóàA¦{÷æÅ'ßîLÄ#ö&å�ÊŒ–(áM»·n\¼qãÃݳ§Ïï]¼ñÙŽ_¼ñ>þß[¿ ÿºñÎîgïÞØ}2ë®&1ݺÃkMð‹bàˆ©xéî�˜ñB´Ì4É�5 ."b$ÜÚ*r“Ì‘+}^†È�=áuý5BW^‹Ït%áU'®4â@´‰Iˆ²•n /«)feHÄN·0þ»ÈXS�rx¿Lªú^CÔ€h™.ˆV�"Ö%:…Ê­â òÒfà’‘Õä+¢·Ì¹ê @æ•å#Q5™ŽcÄxUE5iÜ?™Bž’O†˜™ÉÁŒà t�ÔÄq™ž¼îŠ&Ðä°Or�ËŠ”�;‡ß°à¶N¡"©eã—Ë%ä%§´EÇ3‡Q‡´X!sNîxI«Ç‹Õ³:~šÚ`Ø#¨~6¢�וÖUº.ñlAŸ7Ÿ`±%ë,kÕ²Z¯Xöuðà=¸ö r<4SýAy1p‰ó®_é¥Ã¹íWrAœff’”Ž&ÖÆ¥¥áí•ZUcù ‹µ&8ï­ƒ[$û7puÚɱõë '~yPÊ \T7ׯqå–ÝÓ*BÇ;€Ú8‚fd Ý—(ƒKŸÜãÖXËeöïƒl¤ÜÓËŠ9<é^ü«oä* &ÕuŠÝ6‚¸sWµ‘j« Ns¯E‹úA[ø¶Ð2¹Ü…·D) ùPÃp{¼��ItmàPzR5`RÎUÝ +�,ú4¬¸?æC;A&"½ [´61i zn=¹‹N*¼£==Ø©žºðJ{oUèmã¾AGr…e÷éÏ? j—kVa‡“‹ÉVºµ˜ã�àQÔWnOÒ»r{j¶Ä ôKÑd¸ãx™yK"Aþ_&ž”¡n ;Lo)¼ßò—Ðý�G )‰‘ü»iRøø6µÖ•&=N'%£–ý¿]F}7=023lôt×H&÷:MÀù8�4á Ü6Žö�¨-Œ„è:sqÊ~A»“�d¦6ýaÔúª�š6ÈzžvHÍWòÇDÍ1&B�¢Ò ôžäeÒ K¨ç$ BáT¹œ©jÆ’ç¹:‚?ét^—™¢j§æ˜â‚Õ»E�w©ñò¿oC›¹iû¦÷öèN<,¿çÕXúzÁÄrRX»óðJJŸ¼ì¬>�à|�¿h_™A洞î�"#\f’r†ý¸kæõxW¾¾e^4ÍPû¤µh ò´ûHÊ×ã¬ó`öX• ŒŽ$�GgÞ~„§ ,Hîú“Ûø½çPñÄÁ`Ïq¤À쟭¹šÓ#בnÓ s¦6)€Q•^«3Z9Ý%7®ÐF+×_aß—Ýê(ᵊF.âãXÕÊ1ú¶ø8_ÑïÍ}ËÉKÍ…K;ûÞTO1¢—_.Pé(N´HWØç9»"“Þå£)8Õ.<=Ûì Žu¬›É‘59À�Tí �üjœ÷û>f3§ùcNTœç˜]]'víÇ<ûr@ŸUßNÞŽSÍ=‡ž9ˆcI <9ÎÔ5UëwÿFŽ€ ÑC€*¯�m{ÕÐ[¹-×C×�“ñ²üùfø\ŸÂÄàïÚù++Ï:šý¾¥ª ®×ž ÂîéUò„5ˆCNÔOµ>ÀRŒi»Ïɺ>ön±£©‚‰ÈÙ¥\¿ykÚ¼„üc²¦Í5°fOVx\´�]Jje﫵 á“‹ÿ=0cendstream endobj 135 0 obj 5394 endobj 139 0 obj <> stream xœå][¯ÇqöóA?oò´kG}¿(PË‘m* ÉD@V’‡’lK¤D‰V¤_Ÿª¾LW÷ÔÌîžstŒ@€¸ÜíééK]¾úªºùíNLr'ð¿ò糯¯ÞþÄï¾øî*}»“»Ÿ?ýåêÛ+Yþ"JëÝ{�á ßÈ)Z«v�?¿’¥}“•1î¼ñ“‚_¾¾útÿÇýá(&g¼¶þ³Çೊ>k&ë„tðüãkhþ�‡£†NLijv~Š^H‰Mmê]íŽr ¹õ‡ØÚÈ`uißËîæ–:èH ëöߎÆûIȸÿ¾�mÿåž4^†ýshàÂ$ƒÛ}PSTF›ý“ÃQMÊi/÷ÏZOÎÛ@žÉýkáýþEב“Òûoæï^‘W>?À\�¶ »„OÒ„~ fòQ…H¿|™Ç¡\Ì/²B™ý¹×¨cÜ¿u8Z…íãþèÁêèêì‚"ï|Ežy^ß�ë(a¥Úé¼rÿ3¿�Û>ø-!ÂîXš¿/A¨Èí`¨�»}Ñ! 幌“O;>7÷�ªà¬á#-¬u U–Aß :g…ÃM2u]Úâ¢IX4körœ°£Ï)9™ d}îïa…aøQ®Œ‡¶ý“�Ú®_x¹:·ÓY[^@�ZØY³ºÅvSLšÕûÉôÒ[É­‡�„J·¥Æ°"BSñ{�º§ «î$ñ!ÒUT'ìÿ®~Gå,‹4|ÆÇáÇÉE»ÿž“É®‡'Mþiã5 É£½«v(µ&MH߸,G-Á4X43™ºjYóÕþs”¾hd(Uc!±3øcò`9à)-Á8)·¢òM»i_O#K_—&Aû0+{úa‚jüÛþ×ðd„¹ºý5g•ÚëÈ+ZË¿,H€¶–þüâ Õ$œ´ÝR—ÞùEkûü�–—‰¬îç¸ z¾š@�‡í)Ž»yÎ&/LÛ5¾6NJ¨21ëÖ^›ûBÚâélZ¿j¿ãLQjâžPlTô êU-醾âÇÿ,÷e£!¶ŸKÞP—ÇìúÊ•ÞÜì’ ì’›tTƒGÔ¾urU«ë`‹ ° d¹Ú¾Ç€ –ïêITùÝji“æ•5DÍK(bP¾âBámíÓ+¢/ÊO×ãÑ|â.‘)æ ÓZ1„È]8tõÝÂy{éÏ(ÞNO*Jâáûu¤à”Ýÿå  ÚcMv¥4ÄÉ ¿ÿ=<­¼Óš5ÍjòÒú'X’%` åŠì?›_ÛÆWç¬%§cý<ðõ®w /óâàìŸÂXÀ+X‘0‘v°Qð-oW”€*7ŠK±ÓEãÀ Z/' væqÂ<Þ)ºd¾`G_�Û¨7$GÂSPž íW¢Q�*×…èPÔÛŸÈØa™Œ8êˆ?„�‚ž@ ÞÇO^J¹ÿMýŽsÐ<7 Eá4÷2 ¸À‰Pè­Ž�àºvÔååÙIk²mPn2°3¯g½Ë;§Aì_Š�ZñU[›¯šú:ÒБêŒâŽ}~WZµxQsjÔ9Œžóéܶ{L¬wð ìïÝ꓊€¬Ô†`à )è4˜Ý¢ '¯d/lÁûó§Ëå¡!ãMy�õlØ$ÀÏ{ÂxÚëê¹w) ÞdVžhÉÉYQ|­¶f5àýiÞ¹ÜX…"Ÿ£šÆ6ç¨s’r‡cÔ`³~ÏK 8· Sm¢õ>è(€)†ÏÞK�³¼ˆ°ã P€‡4“}k„òÐ[ö‹µ/&ÄaA3Zß`-ºç^4\Vfð  éÁ n~Ÿ¤'[Ÿ”ïËÛ@’ÆsJw&o.ãQðâ/çÇP @¸%ôu=™Ð„'¡²œ,�:@#“9ט‚ÑWñã:±’ÊjðóiÂâ‘Y~Cg–ÖQéÕÎÊ÷Ö»ÿ ;i1jÞ­Èu’·÷¥G!#+ÍÖôñ\=þ§OAòS8.ÄP•-èŒ*1+ ¡w�»6ðµLA†ÒÉ8ר€W3•³Â6÷~æIÖOy?Bx•‘bÍçl^cŠœ3OOe”¢K)HA,¸#�/—õî· º�c-FL1ÿŒhœwß„XQ[éÙís-ÒÆ K99@Î`”]¢µçáVÆŸJ«Ü§Q4*W"‹Ä|n2HÅ ƒ¥‹52‘>b(3pÄ1€dò¿k\CÏ«ô=VÒæÒ^_à$=ÀÕĆ�…†Þ†L!H ÙÁú#ó`Ýì@@.¼PŽÛì=à’ˆÂ;|#C–A²“H�mIÃîâ˜ææw(à à=Õ š\¸k ß‚/’ÐëAŒ“º|“á³³’‚Ñrœî5†_ �¸©Ô_pfÉ(¢‰y~Hñ–õ–ç8ù °�0* Óîh‰·²©zCrÉzɦgˆˆµˆˆIÒw"BIZ-B€;Á7Ný,jPQ°A6VÛsi§§øÆ¬þgñ�¡�ù7]õ[¤>„=+‰€ž{$€¬¡øù †/"Ÿ[ÿˆºæP±hƒ%•££ÔjHAÍÅ,:&®õ�Ê@¹µ&ãmšŠ�9,ž—ÚÇÃ`�â„1)!|ægXa¤ì‰Ÿy„i �‡‰²<Ý<¦lùœ¨„k£}®gTÔlE±‚=jÉ–ëÚ}ÇV×_aY À—@Lh�:1"�†KiÀ©ƒk&V’e�ºM†‡@A}¨\©#dC±—1öüaµ’zqcj˜$n—ºl1) ÙM¸´§4NÁ˜½º¡îŸtËIAi¶!óزcª‘ÒC¼ýc…T½�‰A¤æQ?Âi+ð‘‰ô°©a”éº.dÝp5¬FÀ“ÅlêÓö ‡j Û`V9$#ÂÆý #µôìmzùŒÂAÙ舫>ãf@ìÊ�ÿ°|å©o—M¤ž Ó¾�fT_dL¨¢ˆá£f40×Có²¤aNux}?„ÓÆ÷„圌oxÙÉ7¬>Bò9 Š’]ÉV"PT2^õ)šãÖ®§>K<œ]·gN4®Ò¡ÚãyÙ÷\]¡aÈðª¾ÿÙJ/ ß¡+²ê?�‹<.¨ÀÀÐ4 Ä íý¯JºV4=%ö¹uÞÐ9§7g™B�ßG0P¥Tð¾õúYkPj…݈¡k&øéàðÜ\NÓFˆöòº†Å¹�qh—U¥¤НEtŒD­W Ö¸^’â\D+ƒxÖZäf Ñ{½ÖO-/1ùmªµÙ±Ts¨vÅ]”éR°ÔRÞHη„“/áH¼lâ‹kbJ\ô`£(%ù*¬€g¤zέãŽ@ÿ•'üíľfP í/åØMW••ËÍzÐ…Ó aK¦È¡ú®Ê½ FlQ-D^O(�¡dØ�W9O⥢&`Qz‡ïù‚×<ÒYÃdƒD #i=eJ ü±Ï®É*Q SUCÜzÊ̺©Þ×hã8<žXgµ˜“,0ù´ d$UØê×ÒöW0Ô$—ɾռ_›FŽØn |Ïb‰:Ä7¤l"Ò«j-psý"�Æ´•Q6L…�3ŽüÆJˆ6¹-îz-W²RCa«KùÁc÷Ì[›³Ç ˆ–û)e{õLe 3Ô—ÌP‘‚…q’ýî×VïtC=JCghz”µ–�ú\TÁ­ÚÕÍ Œõ]½É¸&½QôiÑkÛw_Ïb÷ë§ÿÜÒXÞX2ÖÔÆ‡…‘ËžQÛ à¶F÷—Sº²8ñFYœŸÚL1‚ùÿçQ Æð(cµ�¨Š}�Í©Ñø.îº0W……2ç媴]aýâ°å9A$Û/–F£ ™[¿³¹nG ±–²6ý“Ðx6×�/°tKh´*¶RE,–9ša� ê€!ê ‹øŒ&zÅ—¹œDv==ÀU¿Ñ3/”©Ð`•\ �±ÐsÝ÷¢)h¾—™’ L9§‹–}²l3bä�Èòn®[”º•Ûг9íqßQÔ&k)NЇ„EF¨È*ÆO¾_•¹äÆn§Þ6sl«ÖÖFbÿK¶ Ï)Hwj#+œËÛ]ZÌg.´Îàè”W›�ó9ÁÂ)§F¡Ì©ÃK>ºHlÆ/Ï–8Ö�Û7LpÏ^ŒôQær^ŸôºžL&•,E€âJŸ87¥D^›X',UÚþbÛÆ×f¿ÄÈQ #ØS}`³®�h׍ �rz»ÐÈôFvN•=IÍÿ·3E‚u¸oXE©V ªÔFAÕ»sAÕXÙ5ì˜É0ÏùI¢7D­!¾�eRQû“R$APļ½í”y{ÎGT÷]¥e"Ÿ¦[+Á9•HÍ6TJYÊ€Ç S\™ÆsÁç—£ÿ’'y¸‘è4]Eð›hœÜÿK¦+!Î$…u|nNw…Òw™¬�à6£§ÁhÏã¯Æàn)bG›0[bq޽íê1ªí(|�CÐÖÂuex™£·©°.,æóüC¬’ë8œSû�IQ�ɵïOè©HŸ¯™H7è]›ÀÆzæmŠë„$¤# }Ð1,K�F”68_rìÁ6`ˆ(`Q•>æt’PC9Öph‰‰åL1ÂD¥dYž‘Ë?wo@p v7Õh¤Â¦¤æA bW�3WHœ�™Jé„™aà™–„Œbø˜T·¹qd%�ýÊͲ:ª»Ø,Ûy£X�ÉÚn-Q4¥™GÚoƒ;÷õ�OØTl-퀭K–¬éán 7õ×\¯¥8aE¬ajrÆtݘ|Óv­¼«§55HiðKÊ´?ŠO†Ì tÁ™â4Kçq›+¾QJ†E6s1GÚ>¿²>¸ —K§ÊFÀÕ{™|Ì}§dÆýŒñ}ÿñÕÇWßî ÈK·Zav*Èt6UkƒõBxiÆ{�®Þ~ôáîûW¯Ÿ_½ý_;yõöïñï}ôøãÑ¿í~qõþ£ÝÇëhôΠ\ ‘˜s·Ã¨O¹|ÆÏà.¬ç»ÿjlZ1Z(:—üxÌì3µÕý’„ ��‡ð$Ö¦p§Lh‰¿ß(ñ7Z¥¬ÄI„H~d*ÉM¥ª6Ò£>„Ã!~£ "R ¥²$oñ]IÃϤ+†šÁn‘|ñ6#wî§\r’]©[\ù�Z.Nù¦5;P±,œµ¿×Äv“‰œ�÷£EíKèæ%°[)§ý1ׂºÀ”åDb‡cÃêÅ'’äËå_”T†Èͪ½îÕ Œá’ÔÌ%c}vË^×µõöj¾yŒŒdO½(ͺ†å½1'¨×Óµ7 '—Ô ÌõLê…¾ïhL˜bW,ÓŸ¨{¯a¥ÞÁ½Be›�åP`µUYLAGVª> e¤DV€-_!ÚéyâÓÙºF»d¤¡¨Òd]{C1 ³¥Þ­ØÂ…¨{D�‹~|½ÂaE}º…Avaàm‚®|¡ƒ’ì±ò¹&(K5*4¬7+,¥<�| aÓ¡³ȱ¼ŸÔ¤ÀD sàï_Ϧ¨©Ÿ×ª¸O/“6¥­Y ×ï%Y¤U§R™wQv%ðz㳩g.‚rÈ`�@w+Ä‚ìX¶ÝŠ-Xœ:[Kº�qÄm†0x HGiZH’—,ì²%‚¸Ï"{vEÄdˆuÌ+ù i»"�MjnEDÃ@ú"#Á¯Ù„Í•³ŽÙ­Ž=ö‘xi¡¸áEà‚TkEïÃý~à÷b_f:g®Z%<“ÖÄä—û{Þ|�ÆÉ{ǧ¶—je —"åYÙaO0ó9òeÞ²ÔE‡~80>d‘æ½Ëì`ºcMH’ß[OÙ.ih¸Uß·tº¹¨4Nä|Yv‡Ò¸‚?‘¹‡£H`ºóNär·vÑM»�¡%ë/º5j£ŒÊ’¬Û…·&ž²˜¼ï½›’¯D�5¿¸fSîl¦+)ÖKgº•bí9*Ÿ�ÿù0ˆw^wy´<Ùzä*£Ú¨=Ç냬eK³º@låŸæ‡·zLE�¨deŠ#fúü]©Rekù1 Ù0‡¹Ç‚drlÏïžä”Ϲ/]ØÄ'9 ?;r”Ú¤Dc«-zuÀ›‚l8T`Þn‰Ã- üË/_Ù®d –©.í rZ‚͇§Ì7šm9éê…cïqñHzÑxlu°�xñ çS‰8¨c×üþ*·º}�ÈCéÙz‡¥…V?Dî(!¼Ã¡Ô¶ÆZʰ!�ù.Î&M�fsR ±ÑV-ïs'Õ"T<>Ó= LJÌǨ\i1KÞc]‹X²¸ÔðØ5¿eÕ}�rÖ),Þ)� J­vjqª†6ŠT!¡¹&ã–jh¥ð9l¶¹<’Á°6Æ•ó—o cï1>ì+°j|¨LÃøóÙÄú™”»iÍæ¹År^K.*¦Èý:,ó¢ºó®È‰Œ$Ê—|ˆÀûÖÐÎê�—}@·,·ß> stream xœí][³Gu6ÉÛ�â‰ð¼ÉÓ9‰Ï¸ïÀTá`‚LLP%®€d ÛIJ$[2`òÛ³Vß»gõÌléœcQ‰Uemí=ÓÓÓ½.ߺö'¶ðÃ?é_¼õïöôÉó‹ð퉟þµ|úìâ‹ žþÁÒÕ§wîà Rœ8_¼Öâtÿã ž®çZ/Üœ¬²‹€>¿øíå\]óErÉü‡÷ÿoT'»xË8ÇÍâ¤wê׸ÓýGpý÷¯à;n¹I—³ö9z1áòrõï.¯®Ùb”•Ú¦º‰©E3bñò?_©Ejn=5¸YÊu¿»ººŽ/ÆóË·á£ð êòÑ\­œ¸üÃwL›Ëðó"Œ0þò“ò1¯ºá•\<÷þä ‰ø 7®®å"ñ{jözÑáÒëîžïã=œ)¦ÂÜÚ'ö/ÄÅâ å¥ÒZyI?mX«¿\ÁSŒ–Ú7½¬÷ÌѳÈ/±Ú³ƒó8gφaM{)�d¾ô Òyæ9õx^.ûvÙIÎUÞOÑ/�ÕÞÚf8 +œ�$éÂït Ê?*kôó÷ û¢Y&ÚÃ+ ³2Ž1wºînù0¸ñ‹±òò‡Ó�>*Ñ^{˜Š¥_„bæv¨AõWGÉ2Ìã5Ãdã=IÃíœ^�‘¤ŸàÖXétºÜ�4\nµ‹—óðz0Y÷ï‰ha‹™˜ˆpD¸HÏzé…TÞê—á‡úŒóùA­XZå•úV”äŠIê좢žë$ù‹¡^äZZÐw§kÁ` °…á–û0! Ã\~”‘½ó{x´‡7êòð¥°N:øR¢I-.ŸÃ-Ö çÓ'¸{¢Àžà@~Ñêòó+�ãI•––_¾¨åòËæs3îŒ3\RdË™]ê~ 7 l†û,˜äíf0'v„SsË;°Ì1A‚‡¬�·eÿ ø¸ö—^,̻˧us>Æo墸ÍÈ:��f°÷H^�¹Ë�2Pi6÷Ëõ݋4Õà p Ÿñ¹8˜`öò«<ì“üáa¡²ô�O[êŠ7‘bJ2ا¼7»kw'´ƒ%3<|Ž›—Ysù 1åÂ�âÛU‰< ³iïš,æ¯$H'§+Ëk^Aiݽçu£&ƒÿ' ãôW¤-g´,1 [�ßûŸq4-5Huj·@y“ÿ6wëLÍ€—^+åDÚ\…¬­‹"ýœ±ƒì îŒ»Ù PG þ ÂæbiT&0¼å†õc|ZÉ&¾Ìñ—ø»ò°u‚¶kº'?X³v{éü59":}ó‚%JN‰ˆÇŒ<뢴+<ÈÜ2ÆûÅj¾N Y ¯/4ðVœÈ iÉè©ü…ºô'Äwf@ð`írÞ6îWAˆ)›Ùþ)`Nk /jÉu~€±¶.Ü5¨“ÅiC¬pøøY«À„…Gº,î¬[|¤Öã<#ŸqŽ™Rž"K/Ò9Y9®’ÄÓÔ¬@Ý/sÿô î`fñÕêJ³m.Ô 8УVT0*!ýpõ?¢ˆ3^+Gúg@ØÂC²6÷¼�÷gi‡°fÕžÛD'Y÷²f2ó�ùbgÑ·¯ÀTÑήí!¤"u*—ˆ»Ë|ÞÄ}`Ê&R�füt-V:5›ÞjP`°¶‚EÙ­æŽÍà†ÅÿkµÎ6í§P‚¦Ù^œˆÑhEZt=1n:"b @Á3í µÒaé”>c¥��äÝXfž¢<‰~e‰J=pIÃ]Àú Š˜%yŠ/ŠV‰Æ<ˆ˜N…o³‚úªÈó Ši¦\ ÄÇ­õà r«ô^¬Øí³µ¼�·x–À�±0hÒbº»e³fðuy‡2¡Bá=7¶G;߇åþV3i£AÚ€f1FŠò„˜o±îjÿÀ\Š`Kì-ÖÊ(\¤GÔU?%Iæ¤EL £;|áìi70*:))¥>B±ÀËÀ°gÀ™¦8£öÇgv¶Œž¯ΖzËK Ïs#=·é2Gz}#™'Ù*<‹ÿ)^[2T4h£¦mdˆ€·¦ƒ { }RÁOœ�K‚À‚E$Ì"ÚòiqAµƒi�žGz”vèf ‰�Õ‚ÞÖÙ•fÿQ‰_§É q÷ BÞ×·¨¸‘~“¯)õ³a"³{°4µ^óyâ¸k&FKö4|p ÁŒj\L«í ¿á!ÌÌ�{ղ̶K[>˜mk}½$°fÑÌ4w�Nt�<$ñc3¥�âã�æ}€9¦Ô`ìFª�©þfMS´Â™Z]QØK…Kw‚YÓòá\Y÷÷¶µ@@�ùªÚÓï–O? ŸlqÍõö4ïìé½õ�ÐÏ� ™�·!§Àð~¶�©]ÉfF²‘‘À’W`Éï;’¨{eŽ'…;_Ôç÷·Dû6Žî ؇n-[C¶ƒfgéC® i Më{ïC"XMQ”¹ümýRWÖü' êEË=â(ž×~Ç‚÷bå¥LTtünñºü,wœJŠ]¸I%bË�CPIÙdÀ}ưõ&á>`ÒpÒžðMF!ýÜÒ4R`äR¡×Bo~„Îm–¾²sÚEt�¾ü €’0­6¢,aF~í§�4k!TXĆBÒ‘ÇþúÁQÌ`,¹ª½§Ý²…›¿am‰oÜBœ¤ÄK]+Ú(ÑR=[­oÔöcx‡ÝpYßô)>U. 9+�Et*œð§0ÞðL«Î'AÁÕy¾¾¯ ;KgW§RM•¯k\¢ùö«UáwÓðÊ}íõäY$êkc€»r–‚¡UTQ�OF¢m4m““ææë@jt¢¿Š�§ô¦”ø’ÜÃÐÍz5|œ§Â«Ê –ÏŸÉá™BOâ9‘¿@½t´^âW‡ aï]«y¥{[ða½ ³Ê–$’A4T�Á¶¢ä\7Îâ÷2dJ ’Cž£<3ô³(5xP�oöaô‹¬Î3½X)ôZXv·Ï>ÎÂ(œÔCD*)ZjMƒ¬!]³Í8ì?80�m`&ß�ÿ¦˜PÏŠ"maò›Wuc+Ï·í(ûŸVýþ¤r$Ì ³cXÄÁÀÖo„E,¬ )¶Û‡EÆØî ›ú gXx«—Å íR‡pH°°tÈ5âàž“LÄ®øŸ1Ç®�uäl¬ëcû8aéÅ Ú€Œ|µéø/| ÔÔT²w©sæß›¦¢?êšÅTc˜®m�Vã”É´-‘†¿™UéÝÂÉá^®Þ{QvΚ¯FùœÁ&g!\)¢wíëÎ/õ=dKøo“2Õ_-92^0$.ô *ØMÔŠ˜ä½¬+òàÊ¢+™“–¬^X+˜ á•û7ƒ9¤ÉµŠä¯r*Çä;Q»Êc˜8z³‡ ¤*&õ§2Xu¿"2Lþ„7ìá³%¸A €2Ší P@Dia_+±r§zKóY¬DÙ°Ð@l;@¯,¶Ãš0Û½J¿¨i wò{4ìGp‰¦Àó¸uFò™‹¯y•:@³5tþ¬ße´9Zÿc¿Ñ�^MçìÄíc":ÓË5,07ÎC4Å6ш6FÑ;sƒ3`Ÿ?D%¨eÛÅøˆÊ,áÒ&“�2ƒ‹'Ê,†¯e'°�¸èèG4£®dÎ]îG!n¹ÿË‹ûÿ�$°³ÊÓr³e:ÍÚ{æo†B�2n’­|~÷þů/¾8y¢á #/î$„Ѱ“' {Œ;öðó‹wî]¼uï½Ó‹/¿úýÅ[ÿyâoýÿ÷ÎûÿÝûÙé�‹wï�~=/ëé§žÊzì2S'­»XÖ³ƒ'ênf ‡üîKŒ2áùD†ó°öƒVsžåÄ}µr7Hô¤ùtù)B GçYˆ°ô0ºÍ½ ‡bôi  3U~3ý^6úxŒ™3J ÃWHßÐÔ@ázõy&!<Ó1¯È锊§×k:]˜3ÂJk°ª¨³™æ…Ö-”¼Û½L2D2²±�>·/D\°X4XÕK ‘ýÍ BDa:¯ð«m–9Ë„ºmÆëâ·³xG%0™¡šQ–ëpH ¶´¹qEæ<²Nî¾b0(‹=ñ5ê øXÑo87m/x&£ã ~ÎlLÚþ¹dÁ´À¬bƒŸw!_(ñ³T1ó­ó3†²´ +¿n•Ÿa<ÉÏé—#<��Ï£´•¼7E[Ch%Ö˜Á¤"¸mVƒçM~æmé¹K�~9¶Ô*0ñë°Ô+¯ÓOF¯Ó(¨d³ÌlsêY—³#Xs»€¨Öœ«nñìGã-Ùd¸¥ ?ÁÔ/s[vP•H·cU[ÙAÁï~ŒnªÏò¦îà˜S½üßãO0æÖÙs CÓ/Ù3¬Ä7Äžf`Ï@ åòÑ)8r§¹Ö¼–°yðñZhTú‰6ÿD–ÚæÐê4�ÝDFjÝ';|:¡­Éu3iÆx¿ûÁ ƒäŽVž¬ ¯~÷eê˜:ŠôƒB"øÝýàwŸÎyÐ ¯Öæc,ÒÐÞNʹêtï³i‘ö�v‘¸¥4þid»jŽ›gqééýÕ¢‚‘þZ |4î3“ŒÛôwÁ©2fcobºµÓÌQ/˜Ó­']F^m±WŸWËò¡ê›¶ØfXD1°ÌY=Z®…Àfbg9³óôøržaJô1Âõßpç–‘€º,‚I`¢¡^Ò¶¢~C‘ÎëõÓz#ê7ÀÖ{Oö�ãn·½7j ðI9œbÝYo©z¿ù}�x6Mù@_º„™hµƒ,<_ÎðÀŸ*lÛÎèm ” ¬âøI.f•¬Ð´½­‰d$íùœÇ:©Ö$~«>˜Gzç)CÍâ ø€åqð�Í,sÔ©H™pÇSB¿i§âž7;b»3”ékïÚõó.§3Ý™CÚÃÞV‹~«1!›óPi’š ™¡+„³!­`,!òF·#Þ%ñ )IéÇʽfb…•…{ÊDš2óI8=åc9 ¸\Ù=�ÃAâh3È@¤±3‰RÎro2Üì®nòF1ô¯Vi�cÉɪ|aÈ]e¼Ötãîç¥éNÍÎ †) ÀÄJ ¬u …äx¬÷©$]�"¤¬ ’†Û^xqC «B¥\³£=Ò3Yþó€é5Ÿ f6~óEŒv“ºV"#›Nkæ}žw.l9žW<ÉíËEK’yÖô[\–e�O‹“òd>-æI¾0¦†â K1>M¤AªÁ'µÝOImߥ[Wi€ ú˜}z>·ËE˜8CÙ¯�%4™€Ý$Äpð©8ê»™ÈÞ\LÈÞ¶“)£‹*íÇ=´�¤qtØíp¾±ê¬Ivb'V)�ÞÑrU48 :òè mZv´´žÈjÚ>¨&Õìdõ›À1þa_¡‘Eoê~ÏœŸ�ÚÖs3OÑ“LAôNê9¾Y”º™Ìã¦*NY l>ö™Q(i}+io +�rð¦NÎJ$J '�‚Ή€x~»5º\°ËŸHçqý¹™Õ×W»_‚ˆéyjåœP¨ ¦]«LŠ ¯],pÍ$ó�Óc&hMѦÂFŸå‹;+5Ù”~›G“avÂ=¯¼˜Ô éà1% [Á£Ê•Ñ$¦åFbú–òH!ɦl\JÛbø•?óAÏ“íDÆ÷\¶÷ vè®&} x4zð§±lÉk™k�˜œÈüÜ'€uÅgUØ>«é“ÌØ‰0ìŠÞb×™Üye(ª§ŠøìhÅ€z#g:5FyF!¼½¬îÇW!B-ìP9XC´I®ôPQj'U¡«‡åR½xS�ë öM»~b©ͬ‡`ÊÇ`µ¨ôÛj]õqÞù¦EgSð9T—Æ"¿£{6ômÛ½Ž *ÚÂ÷FÝ‘E©‘%¤Î†bâˆÚï¦zA3� 5¥ã¢7Å¡t”ä#Òi«Ñ™^Ö8u —Œl\•e3+Þ lgXönôËæ"¸IQj¾Â ÍT¢À2ÈFH´†% m '�ÿ¾(u_õh-°ÖK"ÁR뙄ƒìk ªáófâG“£Ø­o§÷£g¨-mP0WUtþ,õ0"˜½Â õ®˜îÙHõ’ŸU½]v¬0é�ØØ¢ïù—ªDip÷e²fMöõö¾­Ô¤LäuÕT�*™÷¥‘Ù–yó¼ØÂSèP�î ,Lpðèm-ZÊ/Fù×u=­°´<;~JEÍjxZXúq-l*B«tE’tÛêjiM…�S¯:ñ%m‚Ö•Õ¡J™’ØÙ…}¾¸£UU…lhíÖÑq _kÕÄœˆlõ>‚{¥F¡-ñÄ�–HS;Nô")‡’îÆ•g¹"ujS\·¯8Ó¤H4»¦†úEí‘tL©¢’êÒ‰|jP†¸ü·b{äÙ>Wv±7]ß3b¸rÕj!ι¨Ñ�}Û¾pÓLÚ,T®©MصEžænù6–óP{L«¢¾« õ°ªÙ€ æ’vŒ¦ÊpÎ<ýûа öAIuãn‚�76ãÚÁ¯™|ö“a`ŽŽ}5ã!@b'e%G‰Ó�?¿Âà±¢L‡ûÌ�@-�¨ñ�U8ÎÖðq=®…Ô\½šú8[ Òð&Á�$Ö£ÈÖQ311šˆA.b¦º8v1�Q!;ÙÅŒÿ_ 8Q“ïßÇã¶ }¤×îµ­ßÉCßn6,±_¦ÅVER|·Ô›Ö ÆF§®dŒ•mïh]Å©CÙÎ�EFÖFJÀOÊ·ÙûdÔ5í?°l¸n�èщ„:æ B¸�Ê ð7ò�¾Î~ÅÄÕ‚ê±*ï¤Ø¶»Fv¦Ùþ)K†Ÿ!Þ﬙ï/¹`o—cšíÙ/Çë¢4_´³C¥A m6ÌžçM{iWž7M®Ê*éj[‰ üª3«ÃžÉç´©£i:R]KEþZ]…rDô•á¢z]Ö¦þ0þgYØÕ'ÅÖ Ê覻~î7 †&QTSÄ?–!;áMœ%Óõé�1e?+ý_;ݱ†¬À‘ÓÝã—:pÞß—æò[”ðƒ�ZµÜøÆŽ�ºÍN{MÔ€„Ÿ`™Cæîí² òÇŒ p“³®sŠåü�jÆ<�© :ºû¤šÖ-EêFh|_}?]ÐMÞéœÚ0xmû�e0,màP,­±£0 ‘TiY×Á³�è"…Áí¼½HÆ1{(xÚD,�lµ¡£Îýïø–šßÌÙ]éa{©[+¯íüŽa{cŽG'¦6Ú$Ïsóõ† až$Ich¾æv¦H¤ñniôv¿4zûiùNçï(¦*mµ •U=iÀ ¶“ˆbVþù¨¸Ö&vüÁ£xÜ ˜'ñØ.÷ýUNâQ]ÕO9IÉz2 b;a±nÌÚ¸{:�Šqcö@ŸöÐ_Kfƒ¢­Ã~·4ª®È}Å­YÛ\—»Pú6÷qtس!im5 íÅËÆÀ:æöæ}{QðŸKw½lh,Å¢`˜‹+'æz5ìS|dÝz·Û³ç©Ã_L0äæáxxäB §ùŠÃàŒÝ¨…­VMZYŒ{èäðåÕòèZÆ%aªr=0�á‡L«?¾0:]ìy·×yÖÌwؤDvä•;½î”‡áY�½,=¨þ“«ŒÈùñX¡t=á0�n¥‡{ѳl C&=Éž4ê¹i ¿jÙ.|Ó ìý"ytÐ[MÖ�‹[+r³¡l�˜™§¶ O1IyéÔœ«=«É{ꛯl.±c(ž]™z�¡�M½j,|†×;é8™Ì“Ïa]�ôzûÌí¬dºzÌSi=tæî[žÈسcçw²B¡?öw·Ó[jVú7µ”ãñ`Aq7T)ÂlŽ rÉð|9@æÚ±Bä‚Dä 4°_'˜.!òíJ¯¦â°É¢Þ®-粺Ôþß]s¥'j�0ïáõŠ;M‘ìÇrÃäÁ•´ë†tP߉ÛI�e¡·Íɘ0çÛ:Ì—ò„—u8;­cÇ¥ß9{HŒ¹m=gïUb>JJ…~´ô&/Ùf`E ýABwèœiaˆå%z€e9NØQŸPíÓFTA!¯é“tû3ʇ鴼:Ì@ù~âMbãV“”!ÎÒµÔêF}ËŠï�µÕ³Q?¿5#­¥å6‹J¹¼Ô�×Gßd¹ùë%Wö�úLýWÖc²¶ì  �‹¸‹ýH˜C”ÙÑ®‡t’iùV,JÆ+HŸñð!½ˆ>“¯¯`² î—kî¶Wé»[¬¢`#ž =Ån[€QÐÔ‚Ôê TÐ’T`IøwÊèo®Bó.IË}°{6AÅ×Xì€Å&{ì�d™—âï®” ‡0mcXìe´Î˜}·šFWORÙÿtøI}˜b»"yè:Ô¹G¼Ä×ì(Òb™ø½“m}±÷š¾»®€Çq¡[ Ü…ö:ÔÀæ·ñ0ðÞ6Åv›¯ÀcÛ¸õgÈ�΂eL†òóe uëhV�Y»6'±Úµ —«Ú¾2Ì´}²jB™jöoA}ê!îžHBÓíò„^c� ?ôŽ9åE ‹-cdj$æî–W0äŒ%WÖàÝcÞj„Ö-pý j�­zÿ®ë¥ï¾Â3Ó§uÂûoƒÀg^�¤SªfβX|ˆp‹ÅäÔ7e±ˆN\$u¡é²Èe˪JºGœ2÷ÁZö�ÀÙv¾»ŸsÞ»ûóæbydwè Qqôä£|Ä}´KßõÓ%± vuÜxJN˜ô§éö|pMìt:êÖ(¥,®éª²}¼3w¢QM÷ˆó�’™Æ ûÌ�Ý“žû¦Ö›'=w¾aôÎ`yÃFåpÍù®Ž2HhG ùšdÐÅB Ž‹hB&/?ì ƒ\ÒñÎÇ=ò¾³÷v\Èg€ŽyYÚÁºM& ð…5©u¬ŒE•*ÈÊGN/ð'‡Öܽÿ¬pÖ®§úÌþgwßÉó%StëÜÊå@~á`Öó …�þèjÏ:âljÅÕ¢Ø'ˆŸþ\R®÷dVÖ$ ßtÈeèKw„|V?êŽê5 Ǻ³Áÿ¬Î¬Ôêÿñá¸PC®su ÿpÇ7£‘HÃÑx¶D“W@„ç»Ç’;‹'!íF$l§ûƒí4‚׉üd¨FÚ¯3£l^“�_À¨]¬dŒˆú°lê}]*vj¹éÿ#‘As¤úì+uIÍ6qKMߨÀ:·Ü½¸?·ùŽ 2xz-Ãþ‰Ñ‹›Ýç…œ‰£.}ñ¿/Ô/endstream endobj 145 0 obj 7441 endobj 149 0 obj <> stream xœí]Y�$ÇqÖó€�ŸÛoÝ»˜÷Aƒ†MY’—²RØ$>,÷ %sw¹¯_¯ˆ¼3+ªºk®ÉnOOž‘q|qdÎË›øŽáéßGÏ.>ü½Ý}ýú"|»ã»ß•Oÿwñò‚§Xj½ûä:·ãv\«ÝåÓ žÚ;6iîýÎ*ø�Ø]>»øÃÞŽ^ÚÉ)±ÿì“JîœÛ¿:Ù$•×Víÿ„Ÿ•†¹ý3ül-WVîŽbâN µÿöp”\Mœõ­ŸÄ£Y»s8òÉ[îÕþ 6N™gqÎè®ß‹ƒäÓœc ˜q»ÿ¦ÓcRáï'n´ä¹—b¦٬Ô8›b2Bv nfNë0ñ7¥Û ˜AM–ÃX�Ë—¯qz2ZìŸø¤•¶y�Šûv _^~ ”—¢¥¼Ðr‚oØîò1Ðú[œ•yXWj ‡ËÐZ`[ØìCFz§bŽTFû 'Ë'«½Ûu]*y¾kI’7Lœ§pžwßÿŒ³zí„ÉÇ ;)§tM�µRº™/�gÜSû; ü%`N�ñ¸Ø_Ô¤¥ç&�v* ½”5¨âeXÃõ3màp¯¹ƒ•“6ÎEÁ××+…œàœàÀp½Š3½[úÄÁ�Ø?*�ßàf °ôiæÉ ²¸1ÔOX¹ùöiœŠK¶C|“gx‚¿·“q>/E°2œhäžÔëÐÎ !|å£J;¢ë͆‹H÷˜G9eHn‚ÅŽH¬÷Ç}œ hIN‡`7¹ù�@w©¹%ÒL¥Ý°Ç'ãÅþcÜ¢AP©“ÚY %ãÎÃ4³Ôß=™O3Ø%ý.@€u ÆÔ‰\Yr-íQ‚K�¨ÈÉŒmô쳃”¹�”_ÅukÖêND”š:ÝžÀÓ¸ @ÀIâpR2Æ»Õs Yð™Êï+±2�ÅIQÜ"»Aê½Ú s•õÆWaû ²RÿáA ßÀO¨žÀ«½�GÍ`“Lîà¶8 åH• ¸¹ç�Âm:q+KCË*7õÔp¥`Ú�yÈá’ƒ÷ Zfÿ)|® ·í˜u¢U¾¿"×h…,A…%(‚ jÁd¤_dT zXœœVìæ|æø1ЕKúˆ§ÓùŠ#€»Æé Ø^1·`ç†m(¢+p ãGÏÊŽhFîLè|#+«ÔV¶  7 GƒN–Õ4 dðfÖì¨PNóK$üÔRÄœ ´WhvÓxÿŠ`dâX‡V\ ÜnÁÿïû¯ ûq•ļmçf“õ»Að¾…4‰ ¢S‹Ë3–æxD€t´õ#¨àˆ|£ò¾+Ú{Á¢S* Ô ¸Fa.)¸| ¦¯6MceÞ„ŸBx*ãmãP8O£¯ZÅø¦Á+�í+-ž#!üd„ì zHÀo‹z¡ÍíèXîÍÄ:°se (Ë€‡¡F»ßb©:míh Bi®füq (kÜ22–U Â‰Þ#oý»Wó=:GÛ«�kloáŸÈõÜwPÌwõ'¹ŒAÝüoåÓoÃ'ËHû!DPž¹s˜e�3ÓRÓCÿFÃ_oòŽz1,çÍœ ƒü4¸RÁZtÄ¢ÃIsYÁi Ʋ@>%cDx AÉ)zœÑ«'×ìö_ôsbŸ:S»¡9,�¤�#9³WõÛ Û° �0‚®ÙK $ü f�áªGã$¨�?Õ`ÂLž"²>JP”ÜÛ~?ˆ¬•Caœ¡—!°i“KA~Dâܵ šnq6+‚˽ªðd$_�M^•sÍy£´3ÐŽŸÒ’î7qpjŒM‰vQU�aà1ec«ÆhaÇøÔ[iÙ¬¨(õ¹ë¸±Ò£9§ŸGÍŒ:‹ÉÒ\äÓwuþWs¥×ý@«Úo)Ûˆ"€…¹E¿eªAJ9ƒÖÀÕQ¿¬ Ê ÅŠÃ \4i¯ª½iŒÌ¸Bp§Ê …E/}Kš?2tÖÑ@2çµFì«âœW#–ŒFGžGH^؅辘ÐsW mÏ”) ù ´*àÝJX+¯´ù: tfžæ´êÓ7_žÇ“M�cdê•k1mà=æœH’¤—S›Et5o Ú–æ5Ò´küËb{ßè… 4Á‰:LŠMð˜¸d]Òp“N‚!!œÚlæGHYåu”á1è@��'Ôy¼Š)ŒêŒ‚_V—èkZìšÁ"0àÎ�!‚Åêà�ðûÕ''-’L·L‘£$ÛÊÜ%ýéÁµ2„íf&}WÓ9 A˜!‚Yøê—1Sf ǹ¸V¬úî@ü¼�ŸCZ\ß{-Àg¬1R£Ö,$XÊrf&ôù¨£Ê‘KT£G@ܾ€Î±ˆ( ¶$%�mÈ3ë­8?Åì‡�“Éå[I,�I ÇÒ$–Gö²pçGƒ¹N™ûܼúEo‹aä;x ®(zôkR±…¶p$nfâ¢u§¤Å OPõì/VÓa‹¸…ýôè,É&¶ž�kÄßfÂÞ©.t>E Û8ï×9“±2"Ю4ÿçQ/eQ1ºªêtöëØN�öjJ7‡Ÿ·í¿Ô ápP[ZÏì?xÅÔ¸ »ÃÆJë�V‰v#Ô¸‰!úÐå‹â¥T¿&gžcMü  á§ƒÅbAɣߦXÅé‘›S²Q)tªrp]‚CÓœÕ�©ça Gð“®ï)0 «w0nt„ÛÓªó1Ép*±b„Ç9óÙD»J‘œi´yíN86­»Âs2 `S0K™[K~ÍŽYÓP(§ë€ÏK^~îâÕ)oíÅ‚{1;H¿7(â½7äU¤å�–Š>½ •0ø Ù¿[>½l[ÔE¿|ã3ÇixJ�\Qï †ÒøäÓ7“9%}äûüóàßw¿¸øõƒÝç‹o� R—Þá²Ý –u|yä”sh ¦B²Ž4·‹³œ"—¤ö�¢­Ñ=u†°©O³:,Db®¸Ù˜î’\ÎÓéÃõð _hɃßr¢þõmÊzž~�f …Ý„L2&Š’¡ÜÓ¦Èñ^5Ž£¾˜åÓ7åÅ”Ù+}t’pÿLËxÙ_Èv"CŽƒ=‹OÍ—¡Žæ½Û¿GeÛ«%i•òñ€êL+®‰ÚýÐâqc–šë œ¬ãŠ`kYCW¹Mú f¯aIðÂ�˜§¸csëû ÕÃ*óóýw.–o0(àTî{Åœ=f€3ãvö:\F3t}|KÍö*|ƒÈká|&­,«bL®§ÿßÐc{&e‘ÉiHƒÑYL+;K;C*Æ\zí|MËY’âTú» Ç+å}SsyÁè½"jù‚qW9—ë�µŠá¯«–ð:8ñ »­Â5¶ÈœÙxr±Vµë2¥w@}QHÑ0Ù©GYæ—ú"û¦ ‡®�9yW­óã�(›ô-^[ûC>ž[ìcü ÊvÕ;W»òó: G]�{¯åt¹^ë¶åEíZÉbÐ"ñ/HEC†ƒ´E,¹=Ýw7b¾\-Åë;Á1’~y‡M‡aOÎUr<3O8ÖËw•áXÝ'ÀÅ�:))kÄøÚÐxçxõµ¡£ žLÃûôÚYŽ…N¦÷åï.òÜ-YaӆР"&M�Ö,7;¢Ö6Ôÿ¸† íH©‹Ùß\ÂÑ�‰þŒÅ ÿóâòŸN•ëâæEJxm͈޾Ô^÷¥»^;±N&gñÛáV�m…ý—ÃÈ}•§×»·E^v!ßìäK–žœ| ó£“/,z·çäãõK¥vÀK  £—?næ-‡2¿8CzÌä+Ç\AÒíŒúŒ~Käa³Ç®û‰aO8ã6¨ôs�q~%¿ù�TÍ“™¬åªùÞ*¬WÍÛþž[—l’e± wž(Ü!òS¥ðþrݟǪ€:™Öm’¡”9W�îBåzÓ)†0Ç^ƒgÝõOV 8‹ÆÆ‡.âJlï�à\\çrýîé�¿ÎªÜf`úµ˜“w�º^«–¼.2ÀüçDèCëÝ0;+Ûúl¾™î-häáõTå#“ÞÉ1¢®8œGX¢Ý6G¼�vϬ¾CCu¶SÞ?�pÊìÓHíÀzoö—ŠÞæ?{£˜8w§ Å÷7}è 6˜{ì7!‘ø.,ýb}Zß…äË®óÜxUhÌÉ&…_î6?Óš_ý ƒîmØJ¥£]Xj6€LÉÈÚ@emL�x$sÔ[ùE"|qQžŽW4jeIeªË¥wzV«#úW1æÌâ+âé _ÁâÁJiFº‹CêÔ½˜m¢yÏ}�ðƒgÚ/¸vé~ûªÜÛÜmz:вò¿ê�}tª»rÅΛ¥uìšßÐþ6ä:¸%+zC,@o1¤wÆÃ�ÂÎ%•UŽë«7õ™ÚÇùYU`àð¶Õ¨ zï.kƒÕšÕa¿n`‚+]­»ä¿’Pý—£¥?� *¦ ì}Ü.XeÕ©Ø€ë®Mþ¿Ñ!ÿ}¡ ÉÈc5¡\ë^ë†aç‡yΣ¸÷9 s”˜:GlbZ/lÜP%:á‘H¼w¡K•ûic2‘÷ŽO„mgøLÛõ!Õ¬íòŸ'©)—üO¨M1n5<Ó3Ë‚âŪ\­Èk,¦ï X¾°sæ‚*ýa“{&™�´a+´Ù¸ä™DlaØ;üý°ý©«bwälÉ�ÒÄ©«…&·=«ømsØ|i…m¨¼i³Ê¾w-§²r}âÑpœeœÕ°J÷qU�U‡R7«/è ~•áoävߨe"¾é�»ü]Ó$Mcî6Šv'šfÜ(ª››á©AI™”ô•§îHUQY¾�ïU×-HR®¡èvýn”ß,÷ÌQauWÀåPÒkïúœ~ë.Ÿ¾œ¹.Ð" Hóç¾zÕràŸ_ü)\)endstream endobj 150 0 obj 5160 endobj 154 0 obj <> stream xœÕ]I³%GuÆÛÁÊfáÕóî>£[ÊyÀA„% a„Ûa`ÑêÖD�j©‘…#üÛ}NŽ'³NÕ½oèBèª^UVgüÎP_\ŠE^ ü§üûÁ“‹7ç/?ýò"]½”—ÿÖ~=ºøâB–ÿåîË·ïÁZ]J¹DkÕå½O.d¹_i½séu\¬¹¼÷äâ‡_^Åbµ:þéÞ{ø$ü}‰^H‰OÆE¡ôåQ.áòÞCxàGWn 2¸z» /²‹•1»ëÝ<àøÎDëÃÌÌb��f—nÿŸ+³h+=;¸[Ú}¼º:ª Õá§W09œ5Ü”Y”ŽáRÚüäSxpñFZ_î—îö6äùË4˜s´Ñ;—ºuô‹óB¹ü�æuŒ—0¦Kû”nÿ¯«ü|š›nÎQÙEå»?¿‹Q¨2#£†ù/!êÂÓbì¦=HØ+”vܾJ³¸´l]Oâã+µHeƒã¦dÛ úî]ÁžzŸ‡Ó©ÞûõŽ^Ox|3žLÚGóP/¯Ž(ƳÇ㟆þ¤¯iX·3ì Ø%ƒ�;˜hÉ�¬öNÏ … ·oZJÃr©]|&Û¶/«3VªapFßÂ6î û/0éè•°iSŽJ«(ÿ¨33å{þ@K-Ø�Òª7+ròÒñääÒí«}ðÚ²Ä}kq%‘ƒ•W°sxL�—!WôZx�²F-Ê)Ÿ¶ŸœØ1:±åe\Š”úÞÕ¯í±Î±Ý¯¦áÇ¥ÚQðü—@‘&­`xnx�TKtBµ¥_�²þzoqº‘íDæ0ˆ“×Jhù-PùÈÿ0lâ6SÅèŠÿQªÎâ|x›_L"Ô" ~<«¼QöKífÑ1N΋á1oOù-íãÑÓ{vçëêL_Ö·ÿØbÚ¸È4í&eŽÒx}øÉæO ?�š$Ò'ëúCV ¿Ìvl´Šå»XÎÚ#ä(‚â<3ÈqxämØP:еàB“gˤ îÈ$Á�áð¬Î'xU/Fúz‰HXg�d`y">J´=ÜëÓK�ÓË4#MÀp  4ð½8˜Ü«2ìÓúãA£²¯ø!ŸQêʱ² ï®°îöÔ^Ÿ& (\Ñõ‰‡·ywxކù"�âé®dž„ÙЧ66ó/Wäs°�å­,–=œE?½¤KFÊ~PƒŒ“†qÆ;Ê‘ ^Ž�Ѓ#¨ë> ê°^Ò«<­kÊùdx–„ ˜Å¬ý³&ú‚ó“àU ¹\¸Á«AÌ+y É sq‹v¦R>ˆBC�YÃÑ1>ë4“Wsü5þÝD87Å;†Ã›ï¯ùšÞº½L‰0Ÿ½{©’Ŧ nf@ØcCc@öP9n¹\ÐãÑ#Ùhaoc¥ª‰q?X-n“+÷.4åbAý#i¢“™_õa#¶}5ŸYéËvÃzyi>OÛ m™�døH½.ù·@®`¹‰3‚_.Â�þ¾]{¿þb]#BÖ‘Æ33¤„Ó¬&ë'Ö7í!Ô§À“ÿz6éÅêä‘XÈ÷ýý•»õi/ côâ„]E6À ±‡ßLÒ —ûu²D}ßO«¥­ã;ï;Å÷�[­*ý|DÕ b /ÊrP([YM:xq%–õ„QÛ=C^_tº³b'–‰¯ŒY!$ù[ƵñàѸÃϯ(wÈ’3ë<ÃqxüÿÛ…òûðpðºÑ/¬ñsx‹‹öaÔ;¶{¶É8TÙZp5éÞöÙšLòÑÀpš*™~ž¬~vå91×9æµ!9úQ–¦1°¯¶Œ[3Ê£üJ�Ý®ßù`žú>¤ñAôkž´³–0@`Š �Dv@%²I»õ„…&Ö}㋲ےn ù{§ïçõ�/!SŽºß9ê¼u⎹Ùs€+½Åçez‰-Ê‚“¶i^'g )ô²±I'tFdÚI'±ô¹^8.…‚Õó¯h,T·‘³C@'t=�€˜Ò†5«ï)jL©² kÅQëGƒ‚±BîøgÅÖú"¹ÉJr#½ñ׆Áµaœ<À €¤"ÜÍ Ä¾ù�Û³¬eí3|t„9§°fÚ�P£K�]üÎecÿføa9eo¼Èj sx ‡œ¢²@¿åz(°QA�)îùν‹.¾¸´àJ¦h5é¥r�ÇK'¼A_ôÁ“‹·ß½xóÝ÷/¿zñòã‹7ÿóR^¼ù+ü¿·û3ø×»?¿üÞÅ;ï^~°ÁÕwÌ'¨’ßs]!ÇP°3~¯¦ÐTޫ̬36ƒ®Ñq¸ý¼8ã.\¸Ž3·W½ü;#éPB©â‘–$8£2Ú$«w}=Ø`&øvw—kçõ\n½ÇG-Ð[9‚ ˜œ�µkŸ¥¥ÖÍqг�_œ|E¬±�gu–ÑDC<^›ÝÅFǽ-xj摘mvA�3ƒ Zì$5[O¨:£;ü¡_í’ðúÏ?õ|v©]ÿ..^I0~›NvÔ�'‹çý÷7p– T¢ßáœÍDRZ/×{ý›â ©éÕfC=oê–ºXÏ®`OÁ  FÍK4'Å\²¯a1Wdr6f}ûl=©Ú[ÁhƒÈÕòè6I’·p– Ï$›$ß”·Ûx8Pû†ÌM1 óñð”4ò:±ºJDZP ÑžFÞ‘`voEñFïÚªFc››uBÝý ÌÓ Vønå±m&†l¨®W�’ð1Y|ÌŸoýê V~)Å IIP#“h*ºÖhØ PÒ�D‚÷ÀƒÄl„Ô¿Ák0yÏCšNsÃwºÀ8®qL�…¹²v™`Î Ç—ÜñQ“RÝo¢ßÛ“þùFüæA÷0^v�˜AOâ¶®D†1Á�£“k­O´�Ûë eèü·òùç‰UŸßÎ>½'­•öÖÏ>?>s]Ÿ?i 0ƒ…�7irq› (­iNÖí…‚¢À,°ºu ï<¼ÓÐПïb rx¾x2¾2þô2påˆ (÷fÜ%�kïyÊÃU#+S¹ÌTŒøû§¼‘²òU{^Ù„?=m¬úU�!DòÈ÷S«³ #bfBI§0¢@^»Å� ^u gBó¬`CÍ#Km"˜1˜É& š� ”�ùÃ�—07ÐF¢ˆ‰6à YohV'ÚhîÁŠ6 ÓU}Å™´A > ~0ØyÄà;±Læ·Ðã:aMy�^Jyƒuö¤–Ýuʽ�§u¢éÑíÙÄ»+9UÒ€¥KUgKÕ'+òÌ�ë„«y�2–X "&j8·v�µº==è eã"”§®Äh3Á dA©¹kò]°i Ñ5˦›Ôd+‹©åÛ°˜2,5W‚¨Në‡,³�ºÑ3€-¯c¨s˜dCCÏûSýhXœL¨l;i¸ì7oÄ×øœ<ü"—\))µ¿(°¦#lÛƒRS †šŒ÷h;4‘¨RÄÙº¹N£ÜüOx³‡·°¨?Œ¬ð'pKÐɰdžTbUVÉœ×Ê=ä¼6˜Gáçž.ÚóÙz�óq9›Ðjá½—í2›¾9CÎDFÞNÈ A”™«�“Ø™…s$P^%ñ«Ý:Näë=U£‚E¶Ïz=3çObÂ�t”HK†° CÖ¡t¸såÙî I�d‰[š4á1€aFâ�9uíÜDÁ­ÜË=6êðï Õ«'²}[Ùå°/™2Ÿð9hµšnÇÅøš/ÔxeâücÙ‚ |®sMwþ¦1{¢«Ó5¿?Ñ€ˆrC½ s}¤ét¤�C$µˆ‰ÚB?Xaƒäÿ>×uš Œè0ž6ÌDÞAã¥ä¹5 ×¨¹ƒØò�ÖæºäÓe‘¾Þ¹ÑÀbÊ´ÖúZ(Þ¹µÖçNœÖs’gN€�¯!H�}o…嬛uPˆÅÝdëåÐ|£§èÚ¨¥vk¦š-(øŠ„+^IÀ‘ ŠdÁ¨aˆuM Š©‡ã‹#Èá¨sý3.Ly>�¡"˜ÕÀ«&˜È *>ظBG_SÕÖ¼Ó°ó~쇸sV\ŠÉ[Þv‡”ØÊÁGmÔBNþ›äUâC!¬Pb¡­=1T Ÿ¶«¥ø3`ÙòaP]à—DéV.¬Ç[u×¢S"íxÐþ#©ª7°v1|SXst»H6Hñ<’n†gâb7L|. ºDt]Œ+¶ÃÄ™üÑôS“ÂWÞ½"ã?jÞÙÃnf'VPGª–DÛ)ü°éÉ¡Œ T)ð‚ H‹Œ4˜`üÊŠ¤Eœ^Sªjb’°ØœðcËüVWº$÷‚ÑÛ´ Ho³'óïv@ÃÙ©ärþáûœsRèdÏC(·�l6óÙ Ù =‡ç^ûõVË|±{é7@¤ê䱋®5^¶Å~ÔŒB òràÐFäôéÚqæVŠe5FŒ%¾iY¶„žß·kï×kìRÍ B{‰6 ·;> ¼Gܬ0Æwƒ˜l>‚-²8I½†¶Èjw›7òØ$Í9ÃK5Ö)û}’AaáÕûÁ4lT7¾H±H÷øø’h\7úRžºiø¥àÐ=ìd 7\¦Îƒ7äsf¥’3u·b¸n·Ù†â[Èfm�bÀïmÒQ’E–±u[@EéÐ\šEn‰0¤ÀzDó3Ä]lꎷÌV©äNùæ­4A²û‰a?êáÒ|ádÜ’S׊Õìu.O�OAfKë9Zé׳´bñ©£�¤…¹µÅS]ÒÆž%ðÌÓOI–d®R*U$ Ù¿mfê±Ðð™ºfW¾VÞídêMÙ X÷³�X–ì{*{�O�¹‹Ryú|LÐp€W÷táýA5±v1�!þ87»µ°rj35d…¯hæ˜ø`W[¾uKKè9UÖ¡ÃPàwŽñ »Šd’RÜ‘ñÉ·r%'fPÇÒÊyÕ¬Ð�n¤¢{û÷6x ,Öâ>¯¤±º¦«ó rÕwêÊNÙrî‘SÜë¡Xóî�dŒ>rÜFxÇ.®½$Œ<‚Ó‰’ æœï‰XóqÔ9þ#bV‹��wTÎÖ8ßœNC Êlþù8І—n¦Y{Qø¶tÌ)|«1lhî”oY§È[9P¾åÚ65(‹Û ³ß5OÕq¯�� èqš�­d« ¾U>aÿš¼<ìÁlêUܬoR�“6xz¹ÌZ¥Vim-Oð§÷¶+£<2j>K,«3|&#H&•ªU`bÚ’?÷k�q$£”K©Øé·ÁR¸~ymZÊTºäï_´‡^¶_‰>eÐ9%;�€ÒõUéµyZÊ”—F!#Ù.ÖO=Ü[jÈÏZ·¹gŒ:bÓï8ä£e>�†yú˜-ö¼ÛU ‡‚t¸¾¢)÷Ív^œkæçúv®iÖ*4+rR(B=´'ævÃ,|àEüC9ßJË Õ`‡ö�ÕçPöR‘_Ï7ˆòG=ô ; ÈM�¿o'É€ÙYÌ*¨´“;U$F§ðH²³Z£�¯Ù†ŠµäŠ­³bµš:…®rWÆ•Œi¸«ë«/•\ 6n`ãèq,‡œ›ÜOæy`:¯ät`+4ë<�ܦöÙmæ2%˜•/±˜¹P“$»¤ ½ Zàiïøj)>È°Š `úÂKF&ô8V·ì†l˜#P†ooßàÄ<çFS:5fFZ¿˜­rµ©–/(V²¡la7cذâr dðkhaY&óˆvDm3<£¹�í0…9ˆ=žB#Ø\5þzï q-™žN„$pô�˜`²n³€a1aè·º*lÔ#p~ÞGFQ‡”¸÷p„ôkXŸÞ�âøvÞAñ¨lú þDÿ»’©v]Ü\Èäu˜ÉëÌy›Þ€óç«#"@ŠOü¨åį£ÿP;Í?• º#îÄŽh1“ÿ5‹B«oÿ‹e˜ÇƒžÿùµÞ·Ìd¼ûwSiËa¢F3:F o20*p“«ol·ã�.µ«vQFb[G;™�Á…›–«£Ç´x0¶ïq™½G˜è"ìÍ^3Ta‡õUŒÁoëWÙ*s•_óKß…i{°ÇNÍÍ. 8I@oÛ=µÁ&5VbOÑ0Å~o,c�`­Á“se¤AÈ@n5üÝ({ª€as@|»ë4Ö5Ñ,"rç¾ÊSºßZýµÊNBl^�…é4Ó÷Ý)›ýr·{�ΈÍê5]*¼wË—�ÀGÚgËb æ@')RÓH7ïhœ¿_u»¹a»ï¹õ— Øþn÷�iCÞA_ˆ<>¶…0ØÏW�N “[Á³ù¦ŸãÔZMM}r“�–Xµj²1};37ÙèŠvödLú°ê™¯pñy&“*z\O0ÖÑ[ćO‚°ù¼VG} ¶d�¾ÊòIÉr/IÞ¬¢¿÷u(%N³"lضÅoÓ÷óZ�5òçÄJôcÿo³Óÿ;­ FÈòߎ5=µŒŒº#ÿé—ÄFaä­5ÚΰV(~¾YMF(¬†�I`íK7ÐæF^+jµkC}kè Cý$>ƒ}”BáÅ8™ó¹…I2±Ñ üÙ9ôWت\Yþ[ŒfHÙßL˜5fZRA”·r£È‰mÔþ*:ŽfhÓÈ &óL5'²1øî£Ðr­à~ó^dQuÑÁ|´s.Ü6DpžæÞG¡6pÁWèSÝIzçk{[©$äl4ŽÑ»ù'sÚõœê|K~R»Æ jÀr§Ê¦7_ „#°ì.sP‡-«‰ÈÍ6I.Ÿpe¬œh�ÝýfY„ð(2©yÛd÷ÃAéç_§V™u¼W¯¾¹‚WíNVk™ ÿ*šdžÁ%\[ô¥FZIÉz…žmìL1%‰ßÀ›¿�Õ[¶²i§ŠøDýIJ¬ý¦ó¨&òa†¨�Ë` í·i킆FªL‚2ßPã5.¹`Ûcy"d‚&´�›qp´,=·OoÏcJúš’VNæÄ䯺Ÿ=ü”S†ßQ—F/DÎ \¾¦’½Û¼Ö››*ûÑ\{z™n×Ty”ó§`·sÊ|­é¨%V¤ÀJ+ÌŠ —¿è_]�•Nezðjp«1n÷$ç )ìN)Ùx?ìîä �Ú…é°¯r½Ê³g1õHćS¶–Þ±µ”ÄWñKÓ-÷_­Uä«�\ü?Wh¡�endstream endobj 155 0 obj 7233 endobj 159 0 obj <> stream xœÝ=ɶ$Åu¬ŸXZÖ¶ìU=C%1ís Æ6²&¤öÑBb!º$AOtcð×ûÞ2†¼‘™õ^UƒttŽú‘™qãÎSüóá¿Þ¸ùàÃÃGc  èÜ»àÿ„{ÐVs™ö vÍ8Ç·ŽLÙÉÃÃ>þ ÛŸœtÜS{v“:ÌCÖ=ó|°e!Œ}[†y¦Å¦%—“úøî-ìM8£UÚOƒªBÂ†Ò rD,øo@‡?Õè€8æÄñ1þ¡™Èßi–"EDõô©f)£ ³4ЕbB®½Y¤/ oð–k`¹. µ�„‚Ë,„âÎ øëå‚P¸r‰�`“§[<9­ùË;Õ¤ÿ7¿‚_ˆ[i‘Ìäd,<ü"§¢§øX\5ßLc²þø“DúÞU/½ÊŸŒ³8Ë‹À·•ÀƒŠg怳H5#ñ!l6a�ßáH€̳€~3�³‰ÌF €³ªW„%Œ]òøÕIp_…£T€HáˆÆ\K¸ÜñM’i®„s11¦Ž_ÝŠÉ %U óW¦`ŸÀÚÝÄuøxæsðIiáe€ñÓ™y?ÃÉ%üÇæâÊ¡—o>G27;ŸE}’åxÒøùGŠP¸…u¸½t¿h}аb¤—ðÊ_nOfT"|vÃ<:œüRÒ7Œ›ƒœ¤öÖÆWÞž—ZqX¼Âòü°;§=É)ë± Ç=SäwáOçÏc€„ô†Z6g¸‘Ǿ�§ �2ËSc R7Ø0ãüꩨv-ý±(Ñ‹öÒЯ÷"3Oç*¤¡O ‡ŠÃ xŸôNíc{2¾?@Z6+yàÔ��ŸÏ©•™$`LÞê›°U C½ª…àhcŠ3Ä�0 «‰1Å�YÃÜ +“Û$�€Ãyp!VÉ£¨þ†á-yDÍÆ9KbqÕ>jÞZn�irò59½…¢Üà¯è¦&æs;7ÍAä¬ì˜Æ �C'”d0ÙõpÂ�RÓàÄ›·'íAÙ0àæ*’ôv$²ŠuÜ-À¨�Ud@ÖˆNn.„m˜ÁçÂM`ñ YË~ùÄ ¼‹BO€èW‰ra­zxJœ�D‡Ó±¥‹œ’!un.�1XØðÅpL¤9Ð.Nèø–0úšlæA‰[/îMÔÝ@¤€ÀOê±Õ–:q�ºF‘;¼¨(‚›@Í,šËŸÊϵžAÚ^Ÿá¼€‰Lƒ’†úE¯ fÝäó™ÁSèár•ˆQ Ñ=¬ó?àm唘<‘�µï– )4‘˜ë˜�ôzÁ„LÇ=Zó,oÔÖÒâ°fo­=0Ä;šk'a (@ëKA%i3­çŸqÍ•æpô¤ƒÀ( ê�Ò _Äû©Æ!·qÒºÚYZF4è'K/OñÙ!Ë"<¤üB@ÅÀëøX‰±µ�3\y ë­÷OëÊÛgüSz÷Àøw(ßÌ.· :q™¨ÂøG3O bFÕgŸ½¯ÌÍ"BÏ„VÎKÊ×èE!ˆÇÌWÔ1?Nú0áOnAub ÐÁ "x"%2SaÙŸgFš°Ä³Z>=ê5�°ÌaX ÷Î`@­ìEhrßúxU…¿„ý�ÈäñüËràH¿ËÏH£³5@*Z‰Ô&£väëU¾(O�´I&KcÅÀÀªöC`rBÌzy+<`±ò9š DMåUtäY<Ë›t’�ºû$LoEŒ, ³”‘çÙÔ}EiŒ�ÉÈÀ¶Uý7`'@Ñ–Sà”¥p°w§ÝÀgŸ’ ¡Zä>Lñ€¨n¦?r-¢xf#¢„¿î„(²V Q$C�ÑáIzØÐ’�L8WPB ÔBÒ³^7a Ø$hÇd¥+xâžÆV¼À”ìõ2¶ÏhÆKàɯB³-o,’O"“9OÒ6b �ùHÓ³5˜ñ1žÂÕÆf�iY Fý»ŒK ²UØvÖsu¶a‘ê!®iUÓú‹ò4á�1%à¨Jhr”È@ç,,p¨â6ÚïB"‰®éй¿šÑ¶ QÔ VH;!'û�p�†EnqK”â>ìƒ<|•½™}̧4ÍP‹(kЛV‹’‡·�ŒHHÀҼƙþ/iOÃüò·(�²E‹ó ¬9Bl>nÝRÃã(.ƒÚP‹1× •Æw– $SaãÓZŸÊHö Š[�’‘V’Џ�=¼~D°à$e#þiB|1Z\N,D³p¬q7×X°Un ¨æ2Xóª Yó¤ý ó€IÎažbÀn¥�šhVý†��Ù´†&ßL`Cû щQìc–q[�Y_'~j[õiD,Íø¬ˆ ?håßÙf=eì›KN‘´Sc�ÇÔ—Žô³ã2qøUAÑðú*Ò bìÛ1f#Y­›ÎdçHæËbd޲Òà7ôohçÙ5ÑæA_¯vðS‹…&zƒÉÄ4´âz,LN¡¥»!z'jwCÖˆfÓ­óº ®pçÛ9f©‘´Ô`DtM°yѰ"« iAÏŠËz¬BOv#bÕ®!'¹ÔÃÛU´�‚6òT;Œ“†LŸÈß>5ïü &0>x=þøßgÂÓ1äb.¥{»‹N·ûž Ù9±v®báÁî¾Úx°/µ³�`RëB뢚oÌÞ• çÙjÌS¥Ðê\ŒÜZV²*TPíb#*48÷£añ9ßO‹¦Ä‚[+t¹½n ó bMpkËI;ʶØtQ8YË($Bõ1ÂÝ¢–t}ËÆ}ðü–Ä'†ªCïjPUNįþƒ~ðŽÈV̶È~%:y]¥…±np`3%–6/ß;¡Ð!ƒ¹uýJmô`>·˜LµBgÆ\ÐÂÞêÊ ‡mEr¯ù<ÂWŸÁü‚;Íj-G»©NE×Êa˜Hw©Tt2xóàçµ¶3åhÚ˜¤C‚1-êŽqÐÝÙë”=‚ÑE\¹ÑWe-èV3 |ÖH XD0�@ë ·‹DÞ=¤Ü¨ýB�ô«µþ¬‚]éòƒ“­xc^ˆddÃ�””¢úvX£úÍíÿ,¶È*H´ _=+©ÁösÄWö°"MEŒCŸ£¤/2XÀ¨Ê÷ÒÃdŽlË WYº0ñÝ \ÒÉg•YUÞ¯<ŶL×ìèqž«ò˜UC©Š†üŠt½+¬StE-=ÆmìŽðõ˪‡|�ó€�j�Ùù)™ìÐÚµðc•2QPù%ž ;tÛ4ŸîJD[ žc\™‚•©¾â#ÀGÈf™ˆ;ÂÛŒ…õwV| v¯ç ‚±¬}ñùmçgi½Äî™UíI¤²•[§‚e('(´öŸ$ l$� (ô²{8)\±'X��½÷UW&IºÄ¢Ë™øKôãoŽÿZ´“¦ð" yÝdÔbª+È.-t(2¹–�ç½–0�Ÿ˜‰BŒvß�{ ÉüR’`Ó rIfMª�‹ÉµóðÚu’txgúr«E¨pÎìõ¶u"ÝÀ;MåO|ž\ˆTiXr¯å>°`ˆ ã ‚ÎÊ4˜—Ð`¿],D�~äf¦ãçGÜÂæBL ãD¾9€D¦‚‘øæ ¡i´ÒØIÊ”^…l-8q{Íl-˜Ž…7¤Ùlu‰®Ë ÐÉ*úž«º†/–~á%“×y=¿ Ôj®‹";2˜ŒMà8⢌�¶û-¢mÁ÷n#�èå¹d;\ùtažÉ°³Nw¶ØQÑA´¢Í ÍQ«5u)¥�8L"ö§£µ]«&ãõ”i¥|­ ~YÒD^ªî¬Ô’x¤c‡T”ZÚëúB§CKE°�À0†:ñ.mT—Úê&ÜÙ…Ø ã]8/£lÁá+*|·‹U Ë9üKó´2ûsZž¥åd±úB6BŒÿ›> àTØ®/2 K˜é2Öà hýÆcdl§‚ I÷ÖÁ7Õ,z?Ñ-Ù2C›†Zò] òû´Ê>/Å/•·[vZj†áÖåQ1â3­m ©âÒr‹ò$oãÈ"N Gë™Ç­V ù6y_I ¬+ü›§UÑ�Í¿üâæá¿lU¬`XBî:à\ó5žŽžEõÖÖc¶ª}LxG^&B³êÖéÚm?][÷A+d ä£«œaò‡’•‘’y¬Â2V­"?ÝîºwqÓÞ@ÞÆ‚xo­àXR­àXä3çáXxg/Ž�ß ÅÁçÆ77"6˜§¬ÔÝ6ɬðËæ;m D¥NëŒýR­ªD• …Y1×ìÅ*‘0�œ±½Þ¶[•ÖDÉ[çÒY#wÕºd›lTYò'èT@*ôPwIú¶lÃ?1¡EËbKÑ¥ZYEÙÔa.Rß ào¥ÎaªSñ/ŠV¤¦-±b­E«*Û¥J’ï-Ò6@¨P[�U4…�ŸºœŒ½›ø?‹õ4eºéÏ¢&¥8‡4[Ã�DS OúTèà$~ZÈæ‘›Žã¢9•yê@ö" i°ËW~8{µZcû`É*¿¿ª¨ �¨Îeƒœÿ.cÖ?ƒ*¥Q2¹ö©¾æhËa "¼dÙnŠeîõ�­’â½ðö¹¦¸GàÙÒ5,fn[õŒLÌû@�ˆ/ù[U™éõ²F¿P±QšöXV�Vøýi»ûn×h@ίԡÆMb™Î;ªê²y±/”¬c]ŒjžÑÇT$ŸT¬ª¿[É{‰þ®×¤'ôSŠŸ]³�·¶)¼JÿŽŠ•ä³z½Oy¶J­b…Ý‹@gÑ€…+/eNJ`4´Ž0WAüÚ€)“9ɬF Ý!.•QÎD�Ê”–þ§Ç E…í* L®*—ÙJ±ñ°Na·qz¦ä¥Óª]>A»Ûxà¤u#´Â&ž†T-`æ û\º»âÀ¹sÇ÷gçφK0县+Œm«3À!.‹#2Ö¦%¹ ]ÒD²¯ClJÑ+X¾ a”2ª�æÝ6'”í…7®6ò‡òTñ[yÁ>.¦Û“sÅDãlJâ5ì³¢„ÛM¤žQˆ.wHn-Æd@e�>¹â¿ÅoU×äþÙJ¶¾ Åté ±OŽ`.\w©†‚¦¢J ƒP@£Lï@&>wj,”žaÄ0Àt�sÍ“ò²ÞÁÕçVÏmCíÈš4Ãoi¾Tú:)Ú8¯¤‚¼CÁ@k|ÑRðmv¤»£y]&Ï àVŠÝ²µ’2nÉEæˆR@¿A×Ê z¤&ûd9gçø h":åµ¢ª'³|é% îé[˜,šv-bi+i¬»&fñgÀ C·+ûFVá@ŠÙþ÷ DjåwçB7Æ«Ÿ»sSsì›@5]³u îÎkÙÏÂtÙÎ¥·yø,°[æÀ  ÷æÎD˜Jß;|2q8MÚ×eÏ¢Ù«l þ¬ûŠo¶÷9)Tךö%õnÎR›>Ÿ6{zU`»¶Y•¡ã7K#|éV[O1XÉesšTž ÃQ«UŠœ£‰s2¶ó§ô |Å0ÇÉrîÜð»gWVyº>/é#{UùÖ–ŸÝýÇ÷qçÌKºÞ˜w­vï\p¼è'Ü–øF­• Í~|×%±/x¹èxy[J�RŸ+x¼ÑðN¨¨A­LÔ%‰Û³ ª6Q z6¬'åWþô¸Õ1mT ú“ƒ0sW­ŒŽ^TýÀªZ xgU�y†Uõõ*àBNÕj·M5<Ò©'C¥÷ÞE«Ùž8Æà/·;,H ÅŒ‚w1­k2ŠdlÑGº´µÖU¬ ;ÛªŸÛlüÌÃx�'=H�Öáø¥¸nù.̃¥O’—úݤÃè¹�'¡Ã4ÎÀËZÖ/Z+ë­¹«k’ƒ¾­‚£Ö=DNhÅ·º>аXÕ h+Šß=tÒ£sÇ-ªèû«‡ê&5W¦�uÅ '_F;`­v�zµM@–}gÖšSÜ—o±ß:ë„¶øx—ô¹¾ˆ…}z¯v¤îÀ�ò舗Ì^ªWù€a¶-LÄäö*ÚñëdG Ðfvte evtжXÀEÐüÒŒ¨K.{í¶Ê÷Á�ô·_77"µÊëq£l�-úò·™Œzñß°Aæ1©ùúüæÁôâ 0ÕÛ=L•ê2У¡ÀK.fÈ)á‡ÐVR½h£î"Ю܂½>ÖXg8 ¼NÎt†câ3n”æK«=—¢bÅà\¢Â3~Í:Ñ$D…“s)ò½…è Q÷ôíDX´³Xû: Žýf@‹v÷•çyCXH@¤ž›„m9É ÏëÕ ¯ëC¹ ~õ÷Ú]¿t×zxKwX)Ø¡;\Ô¬º«6uQ’k‰âþÎð p_´Ï#7) 5Óìúºí6¥Ç?Ƶx£ý {�ÛŠŠl;þS`ÿC<�IF G쪯¤ÜçV•}©ÀÇý®›Ïç]çRÏJ�Ñ4ÏÉ7,�šW€ñ8 RX=º´îsØ1cfµl|GM¹f¹»½'Zk‡€,&,À;MÏŠ6ãÇ0ŸòL:{|  gȵ!o îZ}ÜÍå\°sT°p.u�©™Q‚ž›”Ð.3zO †æq‹ýl<Ýt+Kú´˜ßÂf€™ò'nx½“M n[>ï&§ÝœÒÚ:¿غ¢®� Óª‘÷ák¡¯ÛE/Q¡àÔNÍhËÛùÐŒ{‘ÎÑ9 mƒØ3Ñ…3PFáÚ¬4Ž�ùÊhóàmgáÅëјyÌÄjÄš�<ÔQlàˆozéÁÀ<è0) ¤ùHDXÂQYp› EçW釿¥ˆDÂT©ûÑ!ÜUoÐÈ–®ñRÑ›$?ëõ¥³\¾ }éL¸¤ë®Í³8`W6`B{µkcR¸]L�‰I$ù]�6޵Àa™Êª-¬j-Ô¤+ºü7gýÝÙ‡°J šôU� qŸÀ} wvj€bÕø4î¨6ü€b]‚ó×z"šCï?¥ãï‰yoãá–Ÿáê+3ØVéꘄ̛‹ó0éõ¨¼n‹÷ƒáÜ¢mÜp٩ε^iqB'½+ݨ蛺NJc;a½l Ò'3J½¿])€5Á¿=Ã:‰1%èšÕdŸS{ÕMcRŸ?Ó¶Œ<)cài“‘�Ou¸qŸ*0÷ü\¢þ}·^¨ó®§Û““"t«¤ûe棂µḬ¶ºœ�¸“¨“¡Ž ;>ì•�Å=vuyå†_çq¢ ö貋ºÚ«íùŽNl6ö‡q~²ÖÕo—ÞÉÕ\£ x`«Vj徿_/ïk>ŠüŒ”#lª[¡ÂÒ€e¬‹ÈFµ‰˜“â&†pæJ¶| tFK5mÛ”;Mvs˜¯ý´BQ´.±BH¥›m„½kz!tmЄ¦»'PÝ+F·ˆÃ’ÿ½j*âÿÃÕ·;ôM **îgŸo3¯~/Vy}×;¥>ý] *ÔÕŒúXdºn®D´7_eÁƒد‹Óö¸T×æí¦¤Î }?JRí%MšÅ& ¢ÓÖý¸’5þË9)@�DŒdÃì<âM¨…AÑ‚õñu%Ï ÂPO߯¤ïWÖH °òêK¨Ó�/;Dóþ�BÓðšÅV¼‹Ktç>r®•C}k’€¦[÷ -wHT±á>ªt4¿!î.þh>š_­^aíK“óÍ‹Ÿ–7(7Ls}¿X]†j¶kœ—.™ñ+…œÝÂtS'Wîvþõòn爺{àó ¢ “¬»(¤Õ邺|¡u ÑèC‰ðx²/Ë íæw8« À Ç¥ËmK[Äs¯W—°Eß\]UŠÁ?™ÕàL:Î4MBÇxže¤ô`ª´Ý€ 0&GéÂ�ow–Øf—´T U`›½´ö(Å¢YÖ÷!-ôê[¬Û·ø»eb¾ê˜ðµÑÛGÄ Î>#yX}Žˆ)ŽÐ”j ] ‡ÉÊEÚ•iÍ@Wر•,§ìW‰Áw¿ÜÞè.-¤HË€ ç q)ÊAº¢±ÕTD¶0Œ¨Ÿv„ØïqcV…úfbˆ¨ƒ¦T'¼ëÔø{·Ü\¿íÁ¹¦ÛTªD–jàÌädÇŠ�ßÎ÷6ú¢çQ[[/›KšÎé ¿×m«Â¿uÛ†|ëê»÷h=ÓÜ&Wð•ìЇ3n°c·Ja¦{߯µK›P1¸sQM…ù†wIÄÜÍ»tüžcàW)Öô…9E¼2á®�GÖù-7n?vMˆ»\à{›=¬Á¯8ܲ+z01‘Y…Û˸ºfÓ‡ê˜/Ôô!\wLÜ]²lúà<ðxßÊ lvá5¿K'+šû{7;AèöÎÑõN5Åö_&8{þÜbmJÙYÝ $vz ¯ý=uƒ@4RتÃÔfãFóÖzξDê¸Y·§Çn¢k™ÚÙœ¨¨-+»Ò›<¨Ó¶iX?÷œødþû™‚Ž¥¸¶˜ÅfKF�¼´g^-ÔD†½2ö’wÌÍ÷t—§Æ§JÖOsÏYž›v«|��á5¹ö÷ñzÕµKþ% uVx>R·>Å™,vi'½�ƒk*À}Ù(·ÂTšP'ëû­z$ºYÓBqnú%aé=¼ó9i>­ÁØR^צ¼zé;ƒ™—[ÈIC—&š§¯Y1¾®c¿XK²¿qy¹"‘bÙgR 8;Þ¥è)B�wÄ�ŽèY Ü¡!n>hØDÕG¸Å0áøTßp‡îê�88R²è\§x¹‰·•[§ºâ`~ÖÃ7Þ:5ÿ¶Š 0Èú6åçasLTöÑ€Ù¯9'bñȼŒ«¨¤õªÇû!æÆÔº’ÆÕ·=W¤7/«ð£ÇåK];´Ä«ÖÕàÕŸM ëŒÀÁDô®Àç&Ò¤$ÞùEÕô¶:àG7ÿMfÁñendstream endobj 160 0 obj 7885 endobj 166 0 obj <> stream xœå]K“·‘öy6Â'ÿ€>ö¬Õ%¼ëðaekwé•ÖŠdH‘­'I‘ÖÊ¿~3Qx$PYÕ=3Ý3ÔZŠ ›Ý(�ÈÇ—‰DâÕNLr'ðÿü÷gß\½ÿ?~÷Å÷WéÛ�ÜýwýôÕÕ«+™ÿ!rëÝ�áø§4“6Ní~%sû &+cÜyã'¿|sõé>\ôµ‰z?]Ì$Œ�~/¯Ñ›II³t}�“ñR†ý·×b2¾{”ŒVÅýÿâó>÷Oà[­­²ûÏÒïÁù°¿K;Yøø¬<þ7|&D)åþ{ì]8«%}è5~´ 2¿*w¥&å¥PðåA+·ÿCê0 r3”ßÿ€½;g�*O¿ÿ.OÓÂ$`@ž3ûoRK†§3j½Hý sƒçUœ<ô¬~ù×Ç¿Rk ¬œ¢µ‰Ô žÝ=þèêñ¿~ºÿä¾7ÞÅýÛúéiýs“3AÃ̰÷I9ÕšÊD9làµõ@11E¯„u0þÒàùµž¬‚Ï‘‘ĆÉ�+ÿø,óaRÎ ÷â'…ß\¿ûCùÄNÉOÚ Uz"C�ÅSÊM"(Xû4í%X©0EhÛoàQ) ïKœ€Êì¿N? ‘8*Ï…4lß}{­Õ$¼®D‰:ÆòNáL÷5y)¡+ŽJèlGíÏñ[5ù(».^Ô!>ÇÉ×kT¢4äÀLÁAgeXØýguл2r²ðð³òpGIƒP�>ò𠍽‡rDY{ Lë´&Tû:µ::_)³eöÎûºRðíLu²;?o­_RÄ�X”$5ét›Ét�Œ£EN)|ò8½Ýƒ¾è&ì<Ì9±Žv“”eì‚ãyYžþºýZÉ�¯=èh'³;€Â3ó«ç‡µV„…n IÚ€Ê\"Î>F ¡8Íd€O«Ü‘žÇ®£$o*=Sh�¥bþVwKø‚H34ð ´ž¬67ç<=T`£„Ÿt^œŒÓ‘¬?ËiøBë‘ô,Kþ Ž2:)K-yr|9+‡„bK­–ä¿“Ô"|h�¬˜<|üóuP`D’¦žéä"í–ê‡km&§�ŽO®¡a°.ìœTº)þÄ¥4Ñ\ÈŠLVŠªSŠÐSíêßQøœ&·4;�ó’[†ÉƒEõ;´hsó¯’ùÓVjNÝàâÚô×hUNsƒ�j2DÇÿ‡�Nq{˜™�U>ÿ²okÅunúæ¨ß%xËÍÑM6F'Ož£�d¢Imþ—kÂ8ïáÊ€9ö……;%Ò–ˆU�ÜT@KjÔLÐmG)ÀƒŸŽñÑE2äTPàŗׇªPžÈŠÌê$¶Ò³VØMmå€X�&Uf�à¬a¹íˆ¦PyæŸÃD‚–²¢—nâvòi@ÜĹAU‡u<ãŒÑ˜�¶¿Üœ)|ô¤üT$ÀBãùYÊA"k: Zj&ëúz—ÊÇ÷n¶z}Ï_ƒáå ?àFöÊSüŽ(¢ä5CiöZð�Åi·>¾úøêÕ.‚É™O%ìTÕ0]К}¥]½ÿè÷»7¯ß>¿zÿÏ;yõþáüñ7ð×£ßî~võá£ÝÇ«~Ó@Åì7ieäîÀä€a�ݦ»2X7qô.¿ð™U÷ºY9Û°[¡P1Pƒ8V¡Ž›�B^ýªMÙ°°NF\�ÒQØ>[P- ï¯±(àŒÕGÐC ûkbÍÑ °RÕñã÷W8ÐIÀøÍ¥@®Çÿ Æ Tv*¾D�ldY°XÕ@ÙežÁÏ|Ña¾îtiÜ€ÜKT®¸€ L‚ÖçY'¼Ô_¿@H• Q‡„f‚²š ¯7Ë!¥¶oK_Ÿ�еÿ™NƒÇAÄ»úÇV-È6Vqý£×…™Mo*31æ® µM ùÆ�ì 3xf8P!X䣜oÊâ^qÏ)+×c‚™R7gï€Ju¿Ÿ×ź˜Q«Ósp¼:pæ8?³}* �E<¤Œ@çi0Ÿ’%‘Ô :16h\„¡1áBSŒÀµ à�`dÕ:Â’pÆ·«Œ=F8¯I‚×da£¿_[ÐÇFúõõ–SZÛ~ƾ¥«ž‚ǨSÄdˆÇòíKÖ$;35¶Ê«ÿ5•CpF…w’[£äq4°ß^ûªFÞ2nÜL¬~©X��…ÓI›BvV2ÀÃÀ”ì©cÄë¥ï–Œà*#(áÛØÖù`;z3óuŽ3襜c õ•K6XyÕ©lP¼ÂËz'–Òªc ð>Xøu0Ù&‰uŠä’ˆœ´¦‹W�2äwŽ ¼]I#*g3HãŒ9(M…ôsìSOt}ÓŒ}K¡ÎuûÖÿ|cû†¾¼Œg°o@Ûqüì[ÂE’±o ,OX «ޏ«ç6p7„䃪;€…_¨µ™ã‘A‡^›çµùG%ÙLEºU„VS¼h@(Ä…ë�]}Oë‘ì�ààó°SC:žwŸ40õ&Óά²9üŽJ†ú“?¯j¯ÑûoJg”*-Sš _Q @â[ž I,šssDÞN#±ûW­å[î!2þ’y])“óˆ€mÍZäákóTU¨yDÉkþÿ›GäPPÛÆÚvÑG›yDqr]ПfYéÀè*ÍúA*�òKMø yDÅ=ë½y£0n°nÓŒ =ù‹^ã‚lý¾ ÉØHO�<%t¨Ê«éy9®�õÔ1H ÇÉæõè�àNœ˜í»æ ½—“:àg?KùÚbt‹2ÈŒäf¨½¼ÈÔ—LNK�wFYÜ$6ˆXÞœrcrÐbÌ("LÔªKøI>a°ƒQ1¾Õk�Ã4V'�ôv�ɯÌ[è«5€7H�u¨ŒXc¾Ä¤$á)Mnµw<`i¦hœôù6ev=âëqlâüÞ(–|œ–-G@äV¸ã„¸=�ÐBŽúû´‚dwÃý$ù4– ù]H9ocžš®cW†L†RŤ=Uvû˜ðmò#ªOX©± ”UAi67ဠ!˜ã)‰: •¾(ûþÔ[*zÏ‚hêWµ†££ûì¦î#H>Î)¿ ŸïjÓ²sQˆw€·Ôœ˜ÌÖ/Yn +’ÕÇCJäsðu-hÃ{Ž�s�K½Í¼.Y–ðwšÇhœFsœQ¢q6±�é8Öͅ#œ!ª ôœPjÎyâ¸fÂrÀ` Õ3è¿L9š@ÓÈÇqûÆ…diÒæV6"òÙt"Z‚Ï\DcdDÚé\9£0kŠ:  ‚ŒÀ9c?f0Ó¹¯‹<Ôµª ˜ïX– SI�Õ•a×ÌÁOBß@] šœ¶ÈsC‚…"»�›ÉF1sÀÉZVm% v][À&ÈñµùœÎޚ亶7̵Šœe—ý´ˆÕ6%´ Ä‘@5²ñ³ŒYõ¨$¥ÆœÂ…‡OcO ƒÃ7u€çåè$dÓ˜�M’és\F�xŠo½ŒBUzЭÁ¶i“áº{«1¶…Ô?ËŠ<ÛßTíðŸ¨þ0(²ßRcß áã½Èã XB½�ï…O ‰W4|°v%Lü©¦ŒŒxO€bÑ$—â»(¥‡èÆ7Ås `þoÛ3eq”ZÍs8’…ãA͵´‘ciÐNX»%šnMÀþE4÷îúñ— ùåÕG€—éÒÍ–ùBcöoáLÉÌ`Ëœ—“/ö·×°ÜÍìžÆÜú¥$~W:®ÑKº³Øí³>­;;?&˜!h ÝÔQa,ì*Øé¹ð¨Ã4œÿXþK ¿Þ†kà?#ô\s^—ÏæÓP'jÉ«Vfˆ$åÅõ•‘N#êEl.€O>s+ö‡–Žà2Õò¾%ÍÂYœZ:gÉ.ìp×aœ“Î DÞÅê:^S»ÕÔªþã«N3¹ÃËŽª¤3pí]-n^ÿS-.ǵgÝxvù)˜]=ipÉN5»œ½cdY¬{o VÃ,)S/š•C(l˜…ÍT•ݲzã˜ÀÝù¤|·�ØÑm>@—Î�¨!z8§ÕÔÝZL. È>)¿¿�ý è×ê5ToÀÀ�%ñžñÀF˲NÇÓ÷3'ææ¼ `†üð¼ñ#ô2*)úàw‹ÙÇp"Èðb2jLo[ÆÞ  ¥çHÎkª£É]¼?€oàH„�CÒl�n[Ô" ë,� úM†œ–ét·mAvдƒÆ é.¾ËW/a‘-¼KT•õ®‡s*²ûáícÞ�$ˆy[M‡®ÙôJ×cQØÂ žãYrʳœÐ³Ë�é 'Îûžé Ÿ•L }Ø>`„�ŸT*Él$Ÿ¥×� '#VÜåñ9T8èe„KÈýòÄn5¬¤œR ›®ÖËtÐö#üÚD°LÅlÌ‚ÛqÄ|&d�·qæaQbÀ³{¢ÏÐäHYº›Liõ¼Ø+@ñ+‰£ÈöÖs®U›ô󔏿bŰ³ÐÞÛ�ò$PÏàO•�0øÎDÃFÒJT1•øûV0j¤é^%-žPŠ"¤Ö�Ó9"?£"Ÿ 1伸E©‚üº�Êd¿‹G~ážÛt&”«1PÊn;¾�˜‹ÇúŠóyê’?t”OvسÊ&wŽãŸY6u r3ò Ø Ÿ¸„P O]$.è8f…R®œ˜kU)ö¼e§?sRˆ4­²ã$·€?UÉ~Ù£òØWÌѵ‘kgð€iw&%çYÏbs™…t•qéªáSÌy¦·5ÌÀ¦?d¯~Ïú ‹¬eB¤"ú”R‹¤TÉJ½ ¹$‚îÊ$mödT ½Â#cÄ\•Éc�2BP@^ž¶6ìLÐgŸÜrÃg%9�©FxâÂÝ“­/ƒýX :PïôriÛ—jÓ#ìÂL½�FŸì+é–#>øJ¥Í¾Òý83C1€9£X'x­ÎAß\ÎhÑ•�³!bI�ÙQîreàà=˜T®Aɹ\î„ZYœy‘ß�ÅQ�Ýn ÆïsÜv iÜ%=0“%æ~òÞV–§MÍñcɳ¼•»î‹uûLëíÙtÏ�yúnÊü 'c¢¢pâ ñ³ÂÑ.¤‚�—V8ð,TðŽ)œÛ-NÈgVî]áÜÜûï7ÜHÕ¤)Þw´bÑüjSO�ÖSªŒ ¦ö¹j8àùõÁÖýznxˆ,õáù™nA®$©®èèû ѯæ[E»¶C»ù¤Ž6+B"ï1 w%Ý9œží¬§ÀxfZ�dêÞM3$ ÙÞiÛ§›ªßﻕλ×¾™OQžš5d»ü£‡ìxѽðÝ ›\§›¶÷ÕF|Ïä�ß«øÞ2SX'çšM’; @8¹YIuL§!ç€ú“Ð<,¥¾TD-�ƒ=iÏ¿…E[A>7gQÙl#�&UÉ4Æ‘¼T×Ó\"’×§Ô´5d­ŒŸSêP:ix½¸g›�\Ý.ÖvúàÎR¬¦ëŽšf#]—Ö$>s\³nßrûþqÍõ$Ósš‹‘ÖÃŽÿ‰×:üóéõ;Ñ-¤{Pl œ’…ÒüÔóF7î±;9W©Ñ§@*ÐÅ\ò> ,ùÝN¼ã丆hYïl¤›TIy7Ý�AÇÎJ³”Axgƒ©ìÎøMUæ‰nS¼ÝœwJ:«JEá=§g4_teEÏ�lš �ªg6÷”ùø©o§¼¸ž1óõ@K=³¹ =“׃×3²47Ò3G6ýï#†šAÑÝõ̃FR·#,qª9¥çÂ]ó3�ÐÓPx´³µcÄÀÏi¥…u€Æ²sf𢅾§t«î[qX£½ÕgËuP.Ö^­ 'a”°R‚$d#§4¸På{¬1ù.#è�óȘ”ŠÙD&­Â_R òK>ºN¹'ž½ª,1ùœ³÷†ú3¹‚å·ÊIV9¹¼ïm¡íãµË›ûÆQÌ!ß.{öÖUýØ#¨‡®ï÷rŽÜÙî©1j f`+éÜŠð¬¬Ñƒ*ð™­ÌZpâa†<^ðca`ª„™†Û}Òa¤�hX:+¶qá�²Ë¨a+e×þpÑÊpí4¦ßhKOîü ߎ٤’TÛ¨96¾¿ÞëA~ˤ%%ÊÂé4 &ö‰­xhK¹�*½å¬Ý9¯sI‡´Üv}Ó[5�’E s]þ:—õ+€¸|GI0è42Œz2g ™ÏŒemýKº]ÑÛ›^Ü9WwOggs ~(ä·¼F©¿É9Ö§´ý•Ðs"©¶‚é(ß®áŽçe�ÏåÃÆ@­[&ñÿ + ¶ÄÃå +uï{ç[P[O"ãyÚ€“^+m;fáŒw%èîÜó³âb…1_îÜ ·G!·‡àWŠ3òiþ]!Ê<¬ñsÔ*÷ÔçþGŒQÁ {_˜).俉­Ê•$Ë äBÞ::T´ë÷¬$´7�ùšý}Àé‚@MHîhÈ«\™4«×ž*rˆ-/:Þ7ÞAU/©µ{v«ñ”;–—øµ 9& ‘ÕüÙ“ðþ˜¾‘-r~ô`ø³ ìž+dÚ¾[QÁeóTÜö¶€ôrßÝ€<‚g+ZMõî H;´ô›]0_ØbÔ(úüe¸õ¶Ea:/ú²?¦Ò•Ñ�'FÌï™�¼w5lgê¶û¦Ç‹6Wªí"aüÊíláo]ÂT5B–Ø?'¢7‹™¾"‰îJ1'œ”]$%Ó ƒ`êÜEw‘TB¾Ò� st÷X ‰j$O-Ê0Vé=¥(Cñ&꽟º‡…§Þ×ûGlq¾¨È<ùþ)5©áñûzwË”O,ÅÜœç²$ZÑ–¹×­ºR¹F³®U‘<­¢þšÏ|©-7¯Lª.áf p—&¡¦ËkœT›.¯ñxMÑÇõ»�Êw)”é’7;‘„y£¬÷âÊÁìiòÜ•F”ÇK¼Iéìì°w§³6vÒZLz¸˜xJ¼"p'ñö‡¥S’ å�ÙúE»¼œ®Ü,®`„ÑõWÏ·Jés€B Ú¥é¼uœkáΓT 1g¥•ûøêÿZ’n×endstream endobj 167 0 obj 6366 endobj 171 0 obj <> stream xœí]K“ÇqöÁÐÅ`oœu`šõ~x Aˆ‚ð…•ÍRK2A@Ñ’#üÛ�YÕU•U�Ý3³X”�À½Ý=õÌ×—™•ýó™˜ä™ÀóÿºñÞ—þì‡_n¤»gòì“zõã�ŸoÈù1¿}öáü@…3é'%­9»øþ†œßb²2Æ3oà™:»øéÆ×»x¾�ÚOÁ¨Ý­s9i oìžžëI:ãv?�ïÅä½’Aíþz®¦‚p»çÊN.ÆÝ3|¬MÎîþ‚×F)'Âî—ó½œb0¾µôä|¯•™¼ÖíÞ÷pOªIj[~¡¡Ñ©7¿=ר»]Gùç:”7ƒ÷»çéç^µq¡=µBØèö^ÒØNzó9y�,Ù“Ò@^ei ëà..˜™¬Ž®[eÚÒ£²·v¸]º-Ë£�%�l4ÌF;ઋK`"2Ô<=ø=¶Tæü°ŽŠ¼™—T´mš;ïÛ”·1ÿ=Ï)ذûú N¨Ð^|z®€‘-p]ž°wª>Ä1ïçA陵Lx#Ï•ÒòføF Aû°ÜU|u…€‡Ý@¢„ÝÐÚMÆÛî!tùE…‘$ÉøU“ù²B .‘¥†é;˜ÒPòó >X!ðü¦l\óŒ4IVâ[f�¶mm=NHЬèE¥Ên� Œ=ÈØÉôƒük%͆î¤ÃÐIG ÎÖûƒLÙ2L^ÊÆ}“°o'»WÀ6-Q\»šÔ5ó&Ü÷I!4]MúF[»ÖÂe2Ò¨V“p™%4Èl ã¯Ò¦ñà‚(�”»j—™+ò„‘+’vLó¦44S± äˆÌí¬ËŠäÍ¡0ò‚6®¬j÷YqÉHWUWvíVÏy!âî6^¹(üî~½×žÊúÔ”{œNLbCTšøfG6ê(ÙêâÛ"ÛœÄâiR xÓIdÿíÜÚ ›Z’7Y*!dÇßV®xÜžS!Tá›ó²²£~ Fã`ÞÁ½F�5“-·½J ýR¶àó´qøçnÚ8 ó¸SïÝ/÷X„?8sK7ë�X¢Fˆ#»ýüÚº�Ë?­Þ®÷.^ý<¹n?º¶n�ÜÁÎW’ªäÜwÿéÈÅpïÖŸžÔ7j¸qÊ©³ûU(Ü®÷>ºÆn�ìò•ÍôtáhË+e WŽ„£Ãóéðer¯C6j��B»uÙ0Å×oC6ÊhXÙøqeÞ^󎔼Úå­Í.ÃÑê˜[z0ê}ÔP—Ĉ_èÝ‘ßEíõvÉý¥Àœ‰ï…rÅ�noÀøsf0Ž �'j›i\ºy¥] ä½òq’ЗnÒ’ÆË] q†Q#ÍŸ+ÔyÑLÕú“Ó (0LàKÚB%·Ë6ÒÚS}˜—Òj\ȼ�ÑŸ,�Pd(%ÀK½ÎPÊK܆ßCA£“0=uW霮¾è5äšp<‰¡Üä�ÄÔqÝÞ=¡Û ·]LÂÇt!2~´±&ÄTô“õ Ã'6}ºtþš[²Ö“­ìô‘:=P§¡ƒN dòöå°X3ècSÔž¸¬p~&W@/�goÄBp éþ²¾ÚX!™Ðçl¡l),‡–;okò¡Â‰U¢þZÕð¯uóÛ½©^=¬O©WS½jOTÂÙ~ïõê½zõ?õ·�ë½õêGf­·'L{Ïë�™Ÿ4LÄ‘?ˆÍ‰½ lÙ±]�¢STñ¡U¶Ðó# ?È P ónûØ™QÑW�58Sh.ðÊsϖ΋®Ó⟉´¢ç bGÖ‡?äݵý"?ÅÁéɬh�¡ÅÙsW”:¹Y_=Ú¿�ÑêÄ(@d6¸7aуD¥¿F^^ÿhy×Ü“ì<¦Y…t”dݲfâ“zéwœ–OªÇ«®ÍOç°æÂØÀ»æŠ•nÍÈž(n “ð.»Þ?»¡ÒzÓuÓÌØçåê�ËO+Ö½Óƒ2¼ÇÊ·Ðy§n«Zñ4£/VK$ïxZTçˆO{^ÕØž�ÆC¿�UI^æÁðXâVDª[£•ﳊ{Ôá%u‚fðg´§;Bhwä²a#8쨷³Z�‡xœ&Q]èjøí~_¯þ}SÚ(&è’6Ê”�òKê'û$BO»Ã>•0îu2·ZÚ²jh—qR‹º» ?–8OpGmS67¶é8Sq/· �ˆßWô÷ñIÛDmöÙcµ¦;.Ó´ôöÎ’ úB±Æ9Pzql˜Ø?¯vé‹EëÊ \¨½†=ß`ý2(ò³o1´:) æð6xÖöò Ïæ(”ó6u<†¯)Ò[‚ÉÓÄÀúqLPöª2"·¯¬ ¯nâba¤œÑ=…ý´‡¹ÀÂs'NæÔm±£ÊIÛrDO¼fç#ClpçD=5»ß4Qê+Q´åÈl3µŽàY~û,t^vd“+×wï ËDžƒvâFˆ«g�Q;B¤„‡ [ÎlØ? adÆ6¡ì½A‹MMÑå�M½š·‡_o©ëÞ©:ëbð3 ¨ü²Þ»·ÅRÆB€(ýÉV'ÃÙ-kD‡l]g¼‘³bzOs6ÁÊÂŽºQ³ Xî.&;‡ÇeXui1Ÿ@¸d_®«ƒy<;�gá}#Y3šA¶‘©²|ûKŠWaÕN 8ðõSžÝ;9£N‰új6ti3q’t@ Tù‚WÕîã}[ð êÞŒÜF‡k�M¥¼ôLG*+Zi0Ô®¥³�&f¶:ûø¤Îòv³! @ÅFÑË•ã �r+*™¬pÇñÊ›£È`× Ùy¶ÒŒN‹A–["7Æä‚[–Y]6ž‰—ŒÉîðÔ‹ð«,™w"\�³’”3r4˜ ÖPàž�5´¦*•ýz €Ç$«êwÊ*ÉNJ…z8,)^q•¶ ô׬ÏåÒ3¢ièp–Só¼–AN{„$²SÒõJè €´­ôT—ò+7°n§²÷:ò§YÎ8›´Ï©r$¹àP.fïב•è{„ˆ³ÝÎÊq›uËE GŒi«!Š˜÷i-îWÜf8Á•¸Ÿ%qÃí‘|~ÂHŽŠYGX6ËhêjÎÏr¡¹T+7|[U>ÅÝ„¡Y¡ËÚ Õ gw ¬‰¦ïÖµØWüá2nQÓ• ¿#êüë6:Ó&"Îýä]‹æÏíù4Ài­Æ�û5`ó¢^]WNf½acprÒ„¬îVm¾¯dõa¯áÓÕÇËLŠ#ÉØìÏË9WùÑÐK¹a€K:ONFî h><@>�’ä¼rÚ—gÛ§æjÌ šõ ½³ '^ÖÌ·q"&",y•r“u¨htðá’8X’hJB°+@ÀIÍÛ¶»ožm%7.�`%¬ �¤.”?ZóøÏÛ’­®Ý,’sšP�³0ÄœWmˆïª�mbv§²[¼¥9ÛÕw%Å÷A€ÀŠDÑ®¨,©æ}К*ÿæ:&¿a›"…µË”†L£Ä3-ê^½ú >ýª^½ÏÜ»W÷‹÷†÷ú§Õ[K|¹ŸÕ«†�¿ÙÕËæM¼Ù³|~ñ|KÑHæ—'Å-��²jÚk>^ÝUÈørº 9™;’ì žŸÆÄü‹1#á §4R9ÒÙQ'ôwë¨>Ÿàáˆ-ªá¨KÙt†ózÄ«9�ºý(ñî×”Ä[QÀÀ’ o Üß;ÍÚÓ?lºÏ\'oΛÕøÜ�ƒ÷™D´þQ_]‹]Û4×ÃK~Z ÞFßsØÊQÔ¿žgÛø µ­Z¨F /–öï(+>tíW$µóx�îR—˜Ô!ºž˜;TŒUDݬ�©œå\ï¯iŸM[EO³>¹ónªr¬Aià«^&ú ÞkO›*”õ^Ë õiM\né¼,Óº.aŒ øáHWŒ‘Ç“ý9Œ\Ân½’#D^a6¡\s4§®OÚlñ¿ÓEµ=Ö?ñ¿ØZa;ÄÔ¥I/Ü #É.Å�µžÐüœÐ’—nDCVÏ�ìîV\ˬJÀD=1¬L�%߯÷d½'¶T¨¶€[›Ü`ùS H¼“ƒêm Š»Sïmê0XLC6‹Ï•Ý`j¥¸,ÿÁ3‘î}¾9Œ>�3©Ò”ÖÃ#Ç_òQ0Ð|ê56êY5æÐXŸ2†ù9:ŽÞW|xØx]�,ξ~Õí->ì= ¸ú”oTÛœõ½]„îÜÊ?ªANò@JX<Ð/õd”»fäL%ëH€bâ[¯À‰”dOò@ª‰IÍnÈf8µ*�{?Êí‡cÝ:#�×;YƒÕ´åi§!Ú9®&©ïÔ{›Àà](rvue&5æÀŠFßBÆÜðÚQ’ê½[õÞ'›NI��$ã”ÔWqJRîýÖ^ù Ó °l�=Et%‘Âê ¦J)v¶ˆð&Ÿ§š3C¥f"jCB%té4„ù9Ss΄˜,LöKYUÇý ~)+\ç:«É=‹´xꮈ‡uqz×øGa5†-GßSºeÑßðç8 näL "¢E �´*R#¶Ý½^c‚fö«ÔSUäRíØtu¥§_Õ{÷ê½vdª=}¯>ýˆá–ÏðÙ·7»£ÖòÜl §ÆÆtfP`Ž‹p,˜Û(�{ÛëuÕU`‚Ç&¯>«¶ÖŸzßXº÷‡zÕ¶pÓ&!sÀ.,uÞÁÓ4‹æ™œ­�PÂü¿æl¥©e#u£U¥ãª¿²·^ßHø.bF­°K|Å�<çNioÆï¶­×eŽëE=0õˆÄò:yÃ�">„�?îÌ,­åb8)v¬­:ãS)”žd-þãÙ³5#Srì·ŒŠŒ‰dÕ¨f öJ*^@°Û )ž�e»³~D 1¬ÍŠ«^ Ôï©„ÌJJy�.Ô×�; (=¦ï0‹_Æ”îò%{žSÈðƒ=4*�ý°ä‡‘#)_+fL'3݆y‹ý¯œ º^ÄXŽ(�Ñ]"Æ¡èBoDZˆ±7,NOYQs¸—Æ­†q pÅ%a#_%mžP`!ÎqZ¯í�f3�»Ççõ¤ñ›d]Ðýu¥›ÝÑLóê…̧ÿ¹ ÇT0h&Xø+rÕá̽BMµúžlì¸Èb^¬ÙÕôàFy¤”0-z,D]¢åSKgIWÍ.köñû› GuÔÉVõÈ¿3ñÌcŒJÊ´g2û~MÊ¿Qù×ÿ‚|í`J³+Á(úׄi8Ç J;vHs:ð¾kû@\­~oîÁOë´iïÿ``b3¤ßí—z0¤ï®Š„î·Ü Á–pÇJTâ—LgCÅŒÁB¿8ej µ8š´{·<½†©u»vl1�–ôÖp÷ûõé»õ^ m4añº¦–’ÂB”œ=€Ò[Õ ûõÞ6‡¿_¯ÞežDÙZʽ»…”Ošáe.C¨M� §ÈØŠ5xHQûå‹ÜÐ}ïI<]ÓËNr0|J¯ƒï×½®u{Çí!Û_YßÕ9\·ý• S ñ í¯,˜jÞç_Çõß óh¼{£„óÍb|…DKP§%…ŽHûª²ùjÆÜѥâ‰Æ~eL’ƒ”ó&‚Ì¡¬$á"×½á áyâ)$†[Œ”Cæ#g&{v-÷e®ÐÀ Ô0•2×`;“ü~:’8­ÎÖµ †å¶ØöèI `X™T¯ÖÎõrËOþ¥õæö­Vóè¡ÊpP¸Ïúk™€¯¿#¯ Ŷ_1ô:£hûE‰¢?f´Ò@ÑÜ0Þ¢èW‹¢‡Ì§W�¢Í[}U ¦…|U(ºµýE¿EÑÿ¤(º¹Ùßé·@ú-�~#@úzmˆ·(úŸEŸŽ$^EŸŽþ¢è«…£sF¡Ý¹9—̘×]Ea.töÛ¬¢@ÔôË”—~ù" ´xúËTœîGÒoi™ÍãÙÆ~WÈÅO˜°d†Ú!ÞMÖÓld†ìe¨G®bj¡iþã+\íB®rv:¤1X“ä«N…&#SmÝþëT+”­§Yõг,}ìêö·²GLA'b‰6�wwK½Ù�"©ÜªÍ$ð©Ü{°"`ÙÝ\H‚;õÔ�;Þ®!:´áѱ~Zw’zœæ*Ìï§YS©çZ ø•¬^ÚG—¾;8už³IKA¡•½ƒ Ý®Ë›+Ø^¦äÂ'n¨ÅÄŸâÒäç±e Ï…ãܲXñÐÔz]§ÕSn'Ôå+C å?•2%Më “Î¶Ù� Ø${±=þÝy9!Þ”æ¢ k+Ã0ïê|8Œ)»{èÌ{q©C(�lÕímÉeòž†6)g+mzY„tÎcįÈÌå|4ð[®mR�ù2éXÔ–ŠxÐ*Ø•*G+Šiñe‘S,¬\å$î<^êTZñZ-¬TÀ$lU‘Æ„×R§*בQ'XXQOã÷¬®db!ª{©p…éJþ¼„‰#‘Dã^ÕÄÊ�„T×k9¥ýñJ–Ó\)'.×6 õºùGœEÁÏÌÄΆz§æ«qÅË(6¨áàØ,öåw¥faƒóÔÖR>Z±§¸êu­ÿd/Â.I<KÑX¿$ XnÕ†LŸmqo¶fÀ¡¡ æàšo®Ý/‡ãæ¹[#:_oúËÐ`¶ŠÍ2ìbiê[kcq8úHzeÇ­M°K³y{q7ÙvY6qÌQÍÆ|ùËRF—j½« +ë{r`˜t“¶ò„ö 9ñe ª‡"q4Öˆì�|\�ÊÛŸídÕ•›\ꞌHU´r¼±ÅgÍêF~dÎhvBVŽõ�–]û@ÉìDNՈ˶Ž/Lú cf<„s´f¿7”`ÉÅš�åk ü0öŸrÝV´9.{A°Zt•~€»:ßRkªÿäÌÑ–eF":tFZ²½Ð½Z B&Z †;©¼4�ô¿¥ÊWæp�¹J”zM¶ŽcAЍ%u2+¤©õãÒâ«%jä²üdþ¾Çj©q|Lb½°jw*l}Ï94nj Ši°kéÞ“|™%ÞÌÙ¡ºL²æ£&*}(8Ö×ÃÀ 0”Tƒ#dŸ>—ò ’]®: ²–B„1KÕÑ·ËÜ�éÅmæ"I4ðÓGµçø®qøæ÷L¸ÕZù°M)£¨°Ö«^ûh�È8�§…EÎWj=éÓ½R‡~+gáî\;S¹ý5ßÕ‘ ŸìJÄ W\�å«ãƒ”¶›™_E˜ »!m”�Èë_ßʶ¡µÇšsìùj’tÍõQÇRÁ¾ü•’Cöø�YokUÔ¤¾-ùáY1è%k¾á§&ñ[”úµUéHZHà'Ú%ãèX|¸‹9iŠú?t"9]¹5ч!ò}¥˜!„ÖÅïê¯F‡Ó`'tî¾ \U H‚4á–ÕŸåÍÞ8LûèMgP&/ñk*•�YÛò=dåÒ’¯�ÛÀWê{/Õ̃Dл.9ëöÅ�/àßÿŠƒ`àendstream endobj 172 0 obj 5981 endobj 176 0 obj <> stream xœí]K³å6ΊÅýgyn×£÷#U,˜0  •d&° X’òàÿ#Ù–ÔzØ–Ïœö8©cd�kõ×ÝŸZ­×72Ð ñÿ™ÿýë×Ï>Õ—¿}÷0–^èåŸß\¸!r`cÁ“Ì…RMb.ZR=(ãõüåó—¯.ßû¿/žýñBžýÚÿÏó�?pÿ¼üÕ彇//ŸÄ¿úÛ‡oèüÈüåËó7îãT_ì`Sâòæ«:×§L R]´ w/¾~øÓõÕ#˜Æ^¿||r�Luýþ‘B(M¯w¯…‘D\ÿóøÄÜŸ4„]¿…~ó›‡o>qÂy�FÉ(—ƒºP%…—ÉÉÆ³G¶e‰LK$Fô Y&Ò›G¯ÕVŠëïÒãËéQ{}�J?‹�˲0-Í!²pj®öÉòñ>Y¸Qr¶9\Y„3šëð||4Bˆë‡©ô£Túº%Ë¢qmœAÞE˜¶Ûð‹fzlÄa®B¯ß>>ÉÁ0BŒ÷÷h¬å׿D—ù×#´`’Aßúú‘¹'Å{œ‡k¾�v*‰â 3Ù~?é€h¬ÌkÆ™!£ÞbÔ\a,ªûC¨ *|MvÍÑTÐ'®ÜÌz5ä†Þ•ɽ$Ö(·cUKßBnç”j`È-�ò­äýsMßc…�v90ãÖ€æÀÜŒvNù '±iô×7d\ Ò‹Vƒ+­‰Mlz4Ó£Ñþ‰*ëx„^e,œž,¥ _Óy9å5çÂEF„=úCB$µ“§ÆXX‹™$ êv…zOÍM@¢ç"­LÃB\3mj;Ïôš[l|dÓ£"£È9$ëu(OÌEF†[‡£“/\»Øº_1’¼ŠXs¯¤Ý·Ñé3´áU©™^dF�ëÏà ¶ßO…KG§A˜yuCy›>C¼8®!.tl‚Nâ.½_7º²¸³KTêuÍ%¥v‚A—MŸÑÉÌer‰žº«.Á»]B¹¸Ë[ žK¸Žæ¢Œ �éäÞÌ5ჵIÅ2¦\¬ä¢›¬p��ÅcË3Y<�'‘7˨0X|ó½I¿ô¾Ïâ±Å~¨›éÏäRÌú=‚J ÌK3‹UÎb�(ÔIIèd´¢ßh�B6ڑǕփbeð6»úøÈ[zLý•WéÖû>"Ç–x6ëZàœÚlË®�GÀ–8:¹5à€ŽÀ[Žò®Kïû[âèµ’sG¨t¨‹JnTh;BÝôÏJmp}À�®D*áqrpêçZ=&é©Ó‚‘ÛËý‚&×ÅÂÇ!µÊçMê(¿?ŠÁ–#DùPŽbꪎòy3Ê/ƒåÓîŸé“J Ü~0*¥hkž¯‹²–RûCulyFãÌ2¦‰,…ð«ü ­Ì4ÀáSntÊ/dnq]ÿ ›”×ܦ¡¥*Hº{S±s>²L�†ÍÜ4Ö#©¥š½æŠŒÇ<²x4—Cd!M=|Î^ÜR³×î‘áËÚ>òH<òÒ>Ê…t*�ii!ëu{Ç•ý“„R0d6ŸÂi.tn³×Ñ2èÏÈöûÎXYàM'‰SƒÛÁtz/2Å׋Ò0z‚id�c0ݸ˜Ö©Ce±¢âåKß ²NRr¢P—qÌ� ó›>ÖV/¥|]•�ZÌÂ5ó—K5{{d@¦ÅM�Dþ ƒ4ÉITK4�¨Xzßé$ÈòŽN’€m%À€Óf®³§Bé$¢ÙGôO�ÊñƒøÞAIË;Dõ"«Ò;UhXX{ÇRÍ^ï@dö€G2“i=x‡]ôh+õûNï@–wZÄÝÐå Tläîó ,ÄM?®×­b¬ö¦öV¥QWLî#œ%4܇WM“A+î“­ÎZuŸ[Öqa2a€ä‰Z—’•ƲØÙ.Õìà ãÆ0m@€#äAúƒÉä4vËÁòºíA ŒáÀ¼ZXqˆ›9* [™A;빌¼—jZlË·kvº6 ÁÍj@‚0¸Ÿ¦Y3Å€fOÍN7ÃÆ#ºY�z×Ь×F® ÞlTÌA÷Ôm»YµAoÇ´0ìÓ¢ÛÚ¹8à7‰â›¹¸¥š½† Hð°�¼ízÝÚ<¢öÔìõ0d<¢‡@hCoÐ)Ú‘b=vò^cšÙbÝÅŽ,.ñc•Íö¸™&¸çXÌnæW¬5—û}o0«2^ä%Þ‹9Þ¥š½n† Hp³�[ãE ûköº2ÑÍš€¨Ì·Â#ÛŠÁ©ÊFÖëÖ¨, !¤Áõ>n½Âă3~öøDÜ'©ä+çDÏ–ÈóöͲö5Cé<ÍÊ)&Ú=ÂÒzº›~$—ÙØ�1ÃüJaYkýïbz’úÔo/+Gu†H@l×�¶‹ì€Œ·ã‘Q #Ë3¢%-ÍNr¥yÅbGýæÝö³ä!ÄÞÓgÜo8uÐÇ¿e¤ëZ=CPI1u`ù@ý$“ "nU˜ŽpãJ…c¦˜á÷8Â�‹ñ”$A…º×4ÒÂ)TʧȡHoÒ)TÕ±gcéÞ#Ü<³d™�p«e¹ãnVÙCô"$ÉyëóÛ�†PÔ5â~Q›O1qK“ŸáFâ1nÁ�Ùy¾ã^RÄñ”Î+Å—Jꕨæ~® ?à+<¾H–øi*}ÕçUjŒn°ôçµéu }Ð ï.¡ ˆéØçaK(wN÷‰Ž[¾ùË�CØ–¼�g%˜I¡tJtƒP»ã¶Ù‰\�ƒỨÆÅ u`�Ê ­¯ñVå„m|ëŸ}êhþ];q™òïùßQ¡ÅT7oƒEn¬”›B9ж¾ÃÌ ¥5ÅwŒâJ¿Þ„¹®„©�YóÌç±õÁ´õþ—Ô‘ÆàIIˆ!Êx¿2¶AÊ&¾re,éýh}†ÂÖ‡ ÔY)d ·'�8Ž„À[üCQÓ¥’8SEÕ˜yØÔ‰à•N¶¿U¬7™•Rì<çJgÛ(;Ò}�Ò4¿Û¼k”¦DM¸pqEò§r±@Ys̺Þê5JrAj¸÷¸€LhoŸÊ Í™�˜¼AH)Y†ðKËFs(—Œ÷X4#� £è$ÁYM¥—«`'”…kà œ&s¼²Ù7K9X?ˆÆå8¯Ý±Ã'�‚¢uÉÕL Ò�XÖ³¾³@‡œ-Ð�¬‚¬Ž™U€6Z´’2jØq?aœi Y�–€>@óÝ„9ôÀ0Gu‡9ÛÆ£ {£¹¯‘zîð˜mx–Ìh2ÒqÎMŒ„ çÌH5šù à ˜¦<ˆâ¨@ç&FA†30J…g9‘V€H, +1=O¤Óxf ®¡f#è ÞH –<`9ìÌA²:fJÚÐ öHAv�SéâdA²:%}€ÙÛ䀡Õ�*ÈÙ9vëØRh�9¾ÅÌ Ï´Fµ¹Št’'±ãh�ž™Ö�Õ1ÓÐmÐÚqc·J'£5duZ«ôQÐÿ‘ÒšìÔ:¶ÇFó“ 0‘Qg &�²áYíµ«UbõLc7d8gFªÑ\X…×LýçûN=vC†30J…'Üt±œ¥#ºÓãÆn€ZÝ€"ì-ømd1ÙµçäåÀ.„ªæô™_4'ªo@f¨ÜW"³DƒW“ç¸ôÂo™CÆs¢—œyj¨¹Ã0Û©Ù§À�^Ø-s`ÈpÎôRãY¦†h"’öÁ3`¤6bJùp»ðCÙeçÚ3Å0Ûã(WUSÌÓŒ:qƒ çÌ05šK[öZã¬b“‰l8ÃTxBZY`D3€Q'I>[¿$ôÆÓË;h}'ü‹‘cd2ç<6¿‘bqãM²�=�¢aûªI$GÍb‰Bläý±—¦…üÎ#̸9@‘ÿÙãd@CüR!ZlòÙÝz€”o&>øÒ¿€˜I~=ᯯ£Ï�åhNBå× Ÿ7&A†s¦‡Í|§ì ˜¦¼¬áÔ¡2œ�*<Áfêr‹p{ q‰é™Ù¡%1ôvà¼Èhf)á,˜¥ºM®x)öK°ßš›ñXöo€ $Cä�¹6ûå/ˆ’û'¿DE= “´4‹øè¨DÓ-[Õ±�Ÿ&¿jà·å-’ZÝ”ç=Ÿ:!… û<÷Uã¾íÞ¢If �Ýž•/±?ˆâ:‚ŸÛ/æ™É‰ZÇwÙ³JNFŠíg'0äK>âØãÀ3ï&ÃÖÜÌnµæ¶kí­O§nb�O¾í [o�kÅm“F¦¤øÑÇ–ììcËþU×Ô°#˜U󛘵¹¡MþĬ#³"knfÖZsÛ‚µæäOÌ:3+²Þ³ÖŠÛ5=pàÎßó2ëBàÚ¿âœjBØ2çO óÊV;›ŽØ^¾qÔš­[ÆÊØpN¹»šù�ïõ‘ù!(ùŽg>Ù Ð9}W# O9Y¤›æ=+']³µï²²@ÒÜ þÕèK؈þ�KΫSVóë#@a>w{ÚYläçè©F~Ϫ‰ÖÙ¶ùÁ?s!Í,öÌóظ‡è§~×’óDGÞð±Xq~dÚmíp¶Efê_lî[sDàâ¯Ò+§—Ô‹ÝbÿZ.6?ó^l8çÀ¥FsáP%�B1P°w¶ÜÄ"Èp†°¥ÂsùäÇ Ñ“/5¿ý~ºÀ\ ÞÓ‚¹öÔ÷Óõ$?�“±áœ¢FsOœñÃ9ÉÎÀž{Çwt�ãbø°q/e ×뉄²x~Úu·^`%Fï¶¥}½ŽŸª¬�à~ª—å�2cé‹ìæ•RtÆäN3† Ôš"�ï~gHÖ$9jhüÕûÁ…›_´"4Öµ#r�ª�kº6® Ìnþ@Ç›5ÈÞðâ,pƒ�¿×go VÝx¼5qÎÌS(´·ð]æ ˆˆ-÷7C[ºðHlØ€ :õ»k€�÷ ½*ïTò¥{ ¼¼c¹ÃÀ¥vÀ�_4›ã],«è¡Še¯CY«MO”Ï›ON;ÚÇ !ÐMÓñ1ºÀ'ÿw´Ìaendstream endobj 177 0 obj 4798 endobj 185 0 obj <> stream xœí\K“ܶö)‡ùsœ9 h¼U•‹œM²II±Tkû�ÊÁ‰í$•(‰dçÿ§Al‡£]hìJYÖP àë¯_hâý^tr/âãç_ÞíîÞºý_Øõ­{¹ÿÇî=~éeg÷ºó±Ñ(ÝØK§Tg}üÑˇÝÝëý�þûÝîîë½ÜÝý6þõò‹ÏñãáWûÏv÷û7ÓM¿{¿“ã?ÄøàýËG|¶tûÐ Vï¿ßž'üƒŸVõ�ô¢ó°|·ûãáÕQv µ‡ïŽ'¼-ìáǣ괶Nþ†_ko„>üûx¼©pø65þéñw»ûÇÝ›~vqZRœ`?¹Ð9ØH�]7LnyJþìœèiN�Ç.­ F^çËûáÒ‰Pvørº\�Œ6Êv¾ÅdŒÁú…Éx­5Â6µ>äÖ×üd¨ÜYg:u�Üm–6ç°?B§ÆÉ|q<ÙNÈÇãÉ \Bø(WxéCP‡?OÂöÏ£èœI* øÃ»#t „�ËHY”lÙFì†É�‚N s{]CÒ_"|Ò ‹}˿Η_!¯¤„Λ…¿9ž”ô:vˆ­x·ÎÈØ a‡ÒLŸ–dá>·¾åäfuu{h±ˆÚêIBf«Ø{ZE7_¤¾C¿ŠêB‡3«he'L¹ŠÏ þ�[ßæÖ…¥”óRw¦ 傌JƒœTNüZFÜËUÂSÒæìøwOÆçÝA÷WAJsðS#~-¥·„¢§Í=MÙ˜z×SL�*7:üQЦ“ª¸}7iŸ|£ûAsIè—ñî­²å %øNh\€ÇoqJŸÅ_IííØ—®†ëe¢ï(éà�îÀŒOÞyîIø ´~ó£Dù(´ò¸N¶XñUÙxJmpV642SØR6Pò`‘´3ÌËñ2ä¾.÷-@×Ò÷-:@”ã:It!\9ÆóÈE‘¶ÎJ¿�JiÑÊu!Ñj&$ëÏ„�`dô ‹ÆŸŸ´r�PQƒr„¼†�^‚QOí ò2Bõúõ¬€Z¿T öfN�­ñ{OÕ‚ ÐI? ^ü>ÔRMÏ*s±Q? íá/Ó÷ç×#îÚEHÜåMDJ²jr9Hi-úZªq‚Åé@ù„¬ÄÅê¹ ¶S”ªÄfêÀ�WqˆÚ[Èá—jM%€p­T‚4�‹Ž:ººV !ú�p…©¹1÷”TœzʇB\á3p°…õâæ|mÖЖ¬/`ê±E{�á$µ¡¸~A˜Dp]ú™àÐŽà-í½]'øhîõ*·ehÅmŒ#®ævnT,·Ù "œµñ‚ÞÈ*ãþ11ºÓÛC‡ÌM·…›#4 ¸9@³ÀMŸ¹Y3và&É,Lrâ&ß¡p÷|tp² j„0¸ ê„0jg=Í*Ô„˜PhÀ0”l㜡D2�ÅP.ÈÂ:†œdMfö±ŸÙdÂ�šÌÏ´ðìi‰1\ÍKÉò2¤4Ÿ‚àËœ™ùtžpKCi.Œí*�µjÅc#—y¬8ë º+…:ñXýŸÇ‹x6àñ€ç��åq¡š‹\FÈ<ŽÇ¾�åmòØ­òؘV<¶ªç±†)�>yM�Ɔ êLTDZ·p~-CéÀut;·:tãÛn"ßBò hg¦Luth�PqEBZzU†•�Y¦#™Sáºm½þ¹®Ìú?§çêW™b�l³ÕˆN¤$kñ$gñ 7'‡t>s†˜Aš%ÙU¬ZNO”BÌÀtê’p•[«ˆp¤k@zÖ˜ÑdÙL—iSÇãmÜŒ+E–vÜà¡Ô›A=RuÏÎy¹m «Œq¡c¼ëSØÇÙ™yOTÙóœmÉ¡ ÕƒmlË&–Œ 4`ÉBi[f ¤”%E!ïgÏÌ ¿•Q˜ÍšÛÌÌè3„ �±™/¹œ!Ay†:A>y9Ðj!ÔÆ†Ø²ý”íBòÒ^cfÔàQ–p DS†‹í†õB0‘ÕÌ9¡”µ·/Îu•_«íÇÒð/l?·ýhªïgÛ�¡"m?ž�í4l<¯'ŠÖÿKô„1¨®f"údé¨)J‡´Pç ¡zyQB5R ÇH“1$K®)©2˜û«E`.ó¶‰i4ßCȺ©–ƒ ›ççò€MIeꎦ¼ ­`ö=¹Lû”6ólË܉¥´ß`”¯Û¶ Ün•W«�”4­hª¢p4S%cXîïj Yàh˜oÏ•Ðêf$Ûb02 HÖ#S’ŒšžD²šzÉ4éKÀHXkÒŠÖ 6›ƒø¾hÑ\p3ª­VÙ(°>¾OЀjÊD‰©cÇ1¶÷)V)]àb/Á0¼É¬\ÛKP?™ÒÛMoÄ®ìê�³ÆN•¦¡ˆ3 †e3V0pmÓ@]SKƒÛçÝ4�›¸:·ˆ«3JùV4Õ®¦©ÌP§@E:Þ‹Ì‚¼Rõzy ÜUÜÍã7ÊÝÐÜ-¹Ëêü΢ära+»�¿¡îí*F£ 7R÷¢Ì°”^­ÐQF´¢´éEŒßçÐ\ܘóQšc9 Eϱ<»À…l°·„ÛŒ)GŒ°tÀhyÃ0±”fr™\ŒYai ‹NA© ààVÒ»=ɲ6«54ÊÆJÃ&Ls2*¶ 54îÈT›M~ïSçs5GMÇp˜¥ëÅÑiÛ|nBº_¤ŠW[\ãÙøÔ‘Ÿ�$|²Ô­fÙ^ä�ø-žêF©ÛSË;Ï«µ7ÊéVü÷½cS:Ï:kñ)EèÛ«3ç™[]o"åU\ç¶iòVð°é¹ �o´/IE]1HEiÛU– �¥‚–ÜÍmûår±)<¾¦��•ŠM\‡†.|¸F¯¬V*)om›š>Ìy½2Êg¯.ÑMœ%QŠIÄkT —×¾øÍÖŸ­Š¤�ŠdYÅ0Aþ|«y}û˜‘M¯¨gmc~NÚæòM±s±Ìj­­‘ÎÑ¢¯Þäc™¥`gU,³}–)¯?d ×sþbV6‰Õ~Z»½èMÄQz~â�(-gæâÓÊ"&»7?c‘¸Eõq�ÊÍä f‡P¬×…i)ZÑ —i‘fþÈlA‡‰fd[z–1¨äyŠÁ²µÜ`3˜–Ƀ-ɾ„yÒ˜/$4»¹]§dÏäéÃîUƾ¾Ç¤Æüv²¥ù-ôÂj˜0mJ­µýîÀâvyrùÉ+´,ï’­å|t¶¬“Xêí–ö#«®·$ü 8;à±nh Y²ÊÙskÉвn1Í#RL®/õúXC»B/ÚÕR/­t+BE&Ñìl*¹ìêÄ�ÞL·ÙöK:qå̆؊‘ü$§ClâÛW¾ p-TYºl#é™[2ºKÊ.�¨ˆsëÚËáü¶ëìܧ92bÑÌñGLêx†¦lqĤF¿Íë½ z‚îÇ“@zK£–ÏÄ6ÚÈŸ19˼¦÷bÏ�ISOËñšÝw›úä4TìQ0ü‘=DöU>ºøžœ7Z¯ ø…OýK"�Š-Ãæ•×ì6¾HúŒ}@ç¬ÈÕ9jGò)íqUNΨœJ0(�A0ú&Ó ˆ³÷lêÀÙ°§Fò{ë>÷å_@´¬V©#¹™€ôºrI@êã ï§ÖA¡�¨ƒAVÅ}t@TX �›�øI•^ /ô .…–¬zmA`¨®³â‰�ÓUØ‚ÆØàMã‚]ö D<ÂH¢Q´6ÆÝ! îð ®U°¡?¶:hý©ÕÁ�06[­PYÛ‹Mêù±AOÓjwøüˆsPÁºþ`õñûxÂu4Çÿ¤{ÏùÕ,þVwø{ÿ(!¤>ü€wrA£M*îô/|>ò ÿ/[¿�‡i V�Ì»??9 Äá‹xârººï¯Ð+.¾ý2]�v�,¥Ò$·ûM9Àq‚ñ0ù`hnHä÷ܘ^Mcz ß:)%7¦S%_]vH’$ÑLcóÓå$„ovÿ¾9ICendstream endobj 186 0 obj 3007 endobj 190 0 obj <> stream xœí]K³å6ΊÅýgyn×£÷#U,’™! 0T&L‚bHȃÿ�dëѲd[>sÚc ŠªŒ‘}�ý}êþôè–ôÝ… ôBüÿ¿úöáÙgúòçÆÒ ½üíá» çR b,xƒ¹PnÅÀÌEKªeü_}üêáÙ«×—¿ÿ÷×Ï~w¡Ï~áÿóñ§ÏÝ?¯^\>xxùêò&ý꯾{ áÿ�ðæËÇoÝË©¾ØÁ*¦Äåí74}|R¡×ïŸä`!Æ»Š»4Öòë“ÿüý‘ Z0É £}ûÈÜ•â=žÄ5ß§;kŒÚÉú¶ßL5B´¾¾Ê5âl’*jÃݱèçùò —(÷û |’ŒwÕ夯GtÐÌŠâñ;�E쓎ڌ�˜;(nßõè¢ µ^xà“]ŽË¸õÿ¢9®¢ãk(ä„™&'íð=æZLYq$P¿Že QùRN—F_…cŸjG�ºòT8=i)•ñï]¡öO50Ûñd(ìpLdF˜³RÓ ¤üv k>d~R•OÎùXzr“�ä¶È|p35<™Ñ"$¼õîi\‡”Ãû¦x”*Ëçà‹øKEFøO®Áò6úD�f|UXh“F²÷ײܩ¯ÑöžðZûv0‘�ŒˆM| 0úL™X¼?.NÎ� Ø5ZcŸ·ì¾—u¹ŠWoß_Ç›Œ/w}Vß3iážËæx@­�—<›üâ¥É�†•Lžw›¼r�&ÿ/šçŒì¢œJVrà,€y�s}Nib¾ƒGtY¸&pÀ¢Ññ8Ö O´Xl<Ü:ÚÚpD†l—F°6R2ýFËÍ!Fë>pµŽï§£Ø€‚Ñ6É–ÑÚ–ÑÚ~£Età¡e]ÀM4ߨ£Íq|5XÒVOviûí’)†;å;½†êÁ¨jÖª5ia@=ƒY–g­–î÷ÍZa#³V Ä…9úÂ0¨g²}¿oÚ p0l€·9 TUdÃ.KKÃVƒ„j²³Ë¼©8ļ‰LàAHƒ5'! +&1çæ]Þï4odÄѼkÄ&êî²?—µ½u¿Ó¼‘óx54É$ØåŠþŲÍoÄñ Ív·ÐêŠÍKË[’N …ª'Þç>1D”÷;mq°ùâR’y °hÚüÒýN›G:ØmÀk¡—yÿY5 Šäðy$³Ù `]ýÑ8i ®MLné:�ÖÌuдF‰¶5JÜîŸF#G4u¸ñE#Æ4 7Ä£¡ÊÔÂÝ2l»ü@§p÷GÓ¤6È&ë^ãQ61âúÚUƒUãÌF¾ì^ì/æÎÉÜÏßá‹“Ñ!± N9YñÅifznK�Á]9þ~b‚útˆE9ìŠI¥j¬>È¡4]­Ïe.¦_ ±ñ5ÄÆ“ìOÃ2‡.Ú'«d¯cŒÖ“R ›æ${BEìf˜f+íbÓ ±QƒÌ(ŠøQ=¿G[ó{ýs¸Øx‚Af8Í-ÈÓÒÙ ËÒNƒì�yIÁÑJ?s×5³)[3›;LO0Ml<É4‘ñÓÌpŠù»†Vª¦VV¯`š myLr¢È&�Ì'í7ÑîžM€((: d¡È€‚…<Å\éqóÄ«²´S=û#]r|9~sNI/[í9mUávû—lFÚÍn kÁ`ý–ˆ c²D€‚µÄLr��OYÚi‰ý±-I”> æ*˜ZVª–"ùæ|�ÀûmФ“ø€’u"š¬â)òM¹m6åU̵єƒ¸O|JXqˆ‰:œq}b3µÓ–…S�…�&Š(˜($J­„éH©ž'@Ea§‰b &ÚÄFæ Be隀ëì�$ ñN-Ö­ónI+耂u¢JÖ‰ (X'ÀÓŒ €.¥iv4—æ�`ÒJ8ï2QMPWBGõ)*õ6óÐ!Dš´Ó/ï÷M³£ƒ f @ XÍE¨d–ÆR­Fªï÷ÍÌcƒ 1M²Ä­` ¾HܱËÈÚX,¤Á]ʯ\×ü"„I« òøDÜ©ä+ >“IÜxIX ¿/ÌÀœ¨+ž×ÀÊU·šVOk`·Ÿ\SÜbM06%Óšà#åJRxhEˆUjˆ½&déÉMB’ç"CFT«:-„T.“ž‡o³‹Ö Çן­YYôl!ö®õwÃý~"é·Œûi奙JŠI±å¥Ö^„kîbzê´eW*îäáà[æp1æxˆ°KÞF®R�( ½Í}TÛÌŒ¥{·ÌQrªjl,a˜˷̱ÊR/ ¨fXî¹g΢ Šš'h½ƒ’©ŸaÊMsˆBÜ7'º!;w×ÚëNcG¢ó› øRIý&(Œjî§.Ë�UvùY.}ÝçcÊCÈ\ êu„Š®¸7BnõÔŽb#Œ;E§û ‚­n~�K?ÚØgÉ ¹qV‚¹Ž£Ð�,¹VƒÝ±Np"nò¾Z~` ¿ôp‡¤yŠÛ[•Sb´ñ_ÿì3'œðwí¤9dAàÿŽºÑúôlù z„܈:N=%^E[ïaf�ÒšÙ{Œâ/*6®q’¦Š�k¶}»>˜ä(X¹_™k#÷”C”ñþÊØ&‰Öy¹Qïï^zW}D…®¿›-¼„ˆ¦!¤˜^¸Å?5]U’’Ô©rÍ0Ý®Á«:Ù~i'™Ef¹Ò>­pÏ®DQÒ4¿Ûˆk’¦D¬²*†CùìOó¥óÝ¿Æù×zXµ&IN HM÷�’´™xŸ ™Í H™ÌæU³p"X8O…ãX5'sÉ|ß�O™ùÜžô‹‚‚Ìg”L¨l ùßÂìHU�ª¢¨ÀL+ˆª"Ý�¢ŒÜ–Zd»§Ä�ï)õËruYªk£è(åÙCìŽRUx¥=Õ‘T ¹:¢ª�ú¨BŠ¥eè²ÆÏ%k¬{×°¨h¢hîm E:fž•“éAnÉ´¾ò¬%d:ƒ"Õl–«ˆWÈ,#—xý¤›™Î¨(Ÿóõš6C@‡SæÒ9§NZ6g)룇HBÇ”( \" ~S6Ÿ¬ ±;9ìÌ�äê’R×F¡¹ »“SÕÅÉ:9ÈÕ%©ª�Y'¢wrè¹:9;·ô‹²ÆœÞbNÁY£ÚA.R¦JY“ÿ—µQÖ�«#ÈZ]ïi’û첆\QÖ@}¨–¬™eíœc·ŽqQÑ|”âE#2Õ˜Ù—-ÏbÕí8›tÚ±2�A‘j6ˤVÈ,÷ƪ¸<ÙØ ™Î¨(Ÿ³%~`¯8vÓ¹ÔÌ8=h즻%¡cb”BÕ‘|æçDÊ/£Y9ä uSÏ9“縚 vj’& ó9iBƒÎr>§µ< %cÆ%ž&ð[â^ÈtM¨ùœÏç4“[Û{àOœR> >–Hœ qµ² Žƒöl}$‚9ØGH„ßVVU½†:ö]4tyâþQÍERˆ=¡Ü¨Øt…¨Ù,Ãà+d–Ý‹“GÆ±éŒ QñÙ×k¹tÎé f|­Oä¼qçØ¨Z߉ÿÙp-©„s›èߘ×pƒ<²0·±6ü0MÉ9*ttKW›yæ¬ÅüÎYŒºORå%4–Ê£8{xOŠƒÌ» Ü7× âwMVæeSšÀ€�d0ª³÷Tja? ŽeÚQª”¼[ÞøZGƽ…›*NÒ­T�ö¨è¨ŽÌ-ÓØt†ŽLÍf‘®-ºëÌwÙ=FXô  ؄ƮLÅè|%_ž]­Ç:^.攞`þc±'ÓŸÌ$?D„Lôƒ ¦úä¥ÙQ âÌò€Lg�‡šMSVÈ,gG*.Ï5;ŠMg‡ŠÏÙ¾±¥žu&@éœÓ3�sú3y™ ‡¨ç‰ÿf�¡Ìk+šÃVÞ›ffàbõ§ª/÷ d�f‡«#s\½¦¦ðê%8ÍBªéh*{~ˆqÁÅ6AŸEæ%ú, ¦#s“81Òr”wXŒÔn»üí‚G¿gȧ•¿g­ÓÊ›n�’~ßž8 »6‚ÒT•± 89 ù÷«ª8WvmD}›WÇLÞ¶¼•’sŠ�ÅMÚ.£úe#vUÙÀh~8å¼CSM " wö Þ“2!³”©"³P¦<>ÑÚ/ïÈ9Ö›¦B�ÙŒÊ2§syuEè<‹Ÿ�}¬ÓŸùʈ¼ûk1ju$OHGTz&E–bÃ@DN=g‚LüÒ©‰ßÆ%ZʲBz©6gŸ[A¦=DtjÞ·�^4ÌŶcÍsîÏ£K·ŸêĉZ§wYO±*NFº¡þ~ujîäæv±ogÎàÇ®¹ nuÍmã %KGÉ¢óNžê�]oQëŠÛ�Tsàš€Y·ï¨áM°þ\`jØʪùMÊÚÜ×{mÔ{PÖ[ŸØ5”µ®¹=ÀŽ[Du ²–çèìVVäz‹ÊZWÜ®9ý# ïIYoï¸öçQSM諯üΔq¿XÙúΦ#¶3Μ~„Mç4áÖ`³LV¬ww(÷Ó0…‘�yŒMh˜s«�eýµål¨1§ô<ƒÛú™þDjêOྠý«½/aû7&R÷ç"”×C”ÄÜ¢$È̇ÞSÍüžîEwžÃüˆŽcÇÞ"8ȼÇÞOMü®Dêæö‡õ¥W¦9÷gV¦þ¼iÿ5Gt\¸NõÔìÕy[©}ýoʛƦ3t\j6ö穎ŸzYÓ7u[�éŒÝ–ŠÏåýuê½ÞcÖtßÐæÆÓÅ¢BøÌ8ü%¢”¹ïQ}YR=É‘gÍ%À¦3(DÍæ;äS¤{úwI!�éŒ Qñ¹·ûp¶=7Ψ Œáz=Qþ<+êõi×™lQ•½[Iû¨G>UÅ‚““^ÍO7K_§€Ì¡3>(à ?s5cü z$3„¿3¤ø$9ÖÐøWFn¾aЊÐôl™BÁý –&bmœ ]œB�Î73j�-¾G’+¾Ç3f6ùvt0È·&ΙABÉÝÂ7™70ž—¼rO¸ƒdéN“°a.Î-Âdzm^ÏÏ÷ñ¥{§õu‘ƒŠ|æOáÉ’÷aØò˓ԹϜ·Å¹Ömú—�˜;ÒÃ]‰k?¥d…¾hãýʸÿ*’ø7î$Õ×/wN³¹¦ãñXV6žŽe5#r<ŒŽ3íþÒŽ«œÝ“Ì]~èjG÷õæúüQ ’[¥ÇƒéÂ}’–e‚‹ë¿âo~™ï~ïåW Í¥¾þu|!T\p¿¤­p~éþýv`ZÁÒoü¡]V°T[¶Îœé$ãxë¾Å}>ñ‡ÐÅ«—ã•&üú"•}¯BûXpÉIÆŸ&vZ/×wVÕùöç�oEäKHO ×h%a¢õM®�M�Áåghç•Έã™TöÑŒ"wÕú´'Ÿ�äC^OÜ ¼?Å!~¢M—ÉÞ<üK‰>-endstream endobj 191 0 obj 4522 endobj 195 0 obj <> stream xœå]K“äFæÄa~E{F[ï‡#8Ø»ëe�%lÇØÛ@€?øÿTIõÈ’R­êÞI�€ ‚‘%m«ò˯¾ÊÊz}wb?±ø¿ô÷OßÞ½øÌžþüÃÝx÷ÄO»ûî$¥6ƒo<¨Á�¸ôjîd5·ƒqñ_}ôöîÅÛw§¿ÿ÷×w/~wâw/~ÿï£O^†?o_�~r÷úíéÓò«¿¾ûÿ`é˧�Ãǹ=ùÁaÔéñ›;žÞçÊ .|PñA†ßÞýþüîžB)çÏ_ß?„K¡˜9ÿx/¥Œåç¿„ÇÊi¦Îÿ¼á'ç¯òÍ?<þêîõãݧÁ¸hÐh—z0'î¬Øh›ˆŸì·mÝ"‡™$„¬hLz¼ðzëµ:¿©—N—–ùó«z÷ór¹n‹p2û‰ÖÉÝ Íu¶¼¼Îi=‹\#·Eq>´¦|QKúz¼tJ©3¯wY½ûa½û ³jµ*Ië5ŸÄ,¼éP1NVØA‰É¬OîÌÀøùûû=8Á˜‹U%\:ïåù�¥þüýž V -`Eûö^„+#{j’´ò:•¸ÒcÜOì¶ývò³öü¶z$p’îÓÓñÖÇõò‹ø”™ðû+/¼)ä½Xåtô#¹ÑÂ+ÄⱜûZ*&µ™Úbéü`¤«Ç*Z¬¶+/¼¹ªâ éã_²Škøø.=ÙÌK%í¨{"´”²@à/ÝYÖK;]:¯8·:“_ 7§7=ç¼éã›Î Âw¼™nvTLbDD`)æ®PL^ËÎÊM‡áÞ¬7†ÇÚ››x”jKŒ‡tSâjáu¹ibõt! •Ð8×`Ç�÷ë/ÄKÃFóBƒ9úÀƒf|¾/.×Ájía¡ey¢Xå % ! ã+¢·C¬ 6"¶v̶7/y;ØS¸OmOPÛØcJ)Eõ�Êtà¹B¼òÜç›könÛ+CH�j¯ÄÊëª=zÁÒdPfôê -£GzFËnF›ſČ6A1ùËŒæ�™Ñ˜.l1šÜïkèíÉŒ¥¶GúnŽ�›“¹;Ùãp±�ø(G¯‡æ)üã)U?)�Ù…”ÖFÌÍ–˜�Î ¤©Ýd%µA‰•¨A(-%FKÛOKbƒ-�=sPÛ†d^¶wQ^&�Ôý”´Š˜’á3Áb£‹ÅÑ"ËdìŒézY‚ÜMΗX†JzwOPâB*â+ZgÑ”Ø4ÅlK X3ú¦U3ÓO#8e‡0SGËÁ*Ô¬±^à�¦M>³èI _E\øL(PxÀ"×\¢„J2dû¹¤1—¦–QñbQÓ‹¼߈[øEmPjQƒ,Ö¥b˜A È9bƒ2ç€A€h¾¹\pNúJ:×O:év!]èÄd“½Ô›h8vE'�Ú D:Ô �¤1ƒt?éˆ Já°ÇC_Œ}U㮚‚ó{©/»úBÓ—}ëíDVßOVai:/‘•ÛÁ™¹ è�¾ƒ„7{ÉJmP"+jÚÒ˜A®Ÿ¬Ä%²{,e¶§M¬ä¾šnI¼4ƒ}�×fýìäjv2�8S`Ît˜ò\ѳ¥6hÊ ®´È˜94ÍRUÈ¡ýÝšWÜd/±Á¹}ûy<'íb¡’6„ J¡¤Ý5‚¤eâÉò.Œi/‹É5%úè9di�°ö4O²’4ñC›!è‹ñ 鉙†Œ UgAx64Á±ñ¦©pl¼)6á(U‚Ž4b„ã4@6NOCF «uÄÁ¯¿Ð&؃ø›Y T¦þ!$í-w¦@‡€Ð»¹`,öD;<ý=8rƒ¦$0æêªðc‡ÁžËæy_ @mð¿àñ‹lÈš›¹ pGüÒ?\¤­Û…½Æ#Æ[Œ½cïv0ZØKmPb/jP«]Ëø8S`Ïu󼓽Ä'ö¢öz4soî±Ì½YaïŠ÷.icíþ˜ÜÓÚ |@·9ÁEBó ¶—=ecAÙ-Zv¬ùÝ$qÙSà ÊÞ—Ü_��ûG‡´V»pJ™ÛœÚÎNQ—}Ê/€²£é4Q·ðŒØžÌ³jO_þu�gýCIZ bžMÍoLÁ]Èm¡­o“Aïåµ=‰{˜=ª;µÕŸ‡¥¶'5®˜9‹LÝ<2lï^Ó¶öOiÉÌ7´ˆsÍ» Ĥ‰Cz JmP"(0¨tjƒýBÛ9Cû‡D© J Eäž ü[ªgÿ8–?NÏNΊñM¶kT˜|^ÑtS”؉Ø©[š ÒÐô^v”ægBƒ…Õ^@0¯¡|ݬõ§ŸšÅ¬Ô�L3 "Ò°ÂT­2 ÍŠNÐÓ‚oN€h¤¶“¸6)õ’�47"b0Ç7ë8[Š€yð2öõœ$—ß½¢f+uí"õ“âZÁßòA’œÕñ>'­†ÌÆÁÚ¨<û”j«åÆ-ETÚ]†pƒ «°è±îOñ4;½X> µ)R°ä,myÂ�^¼»¸EI?~Øò”[½¬V ÆI§r6¡È·×N/¹"1vå~P×V$Ëb mûøþAZ«‡ ‰obdem7i]:rò³z÷]_ý²cûBm¡ˆ³ÞÜ3Xj�£,j ›Ð¹…q€UÈ Áæ,¿™KÌú–-kPºðÊ-[Ä8ö+­ü[¶¤J$�¡�Â(®Ž÷�‡"5Û9Ôƒ9ëbá_|&Mó³QCYüñ±¿û“øïxè[Oï¶E°£Åó~±Ì’Þø”pƒÖÞÍ>åŒÜøƒAg5ÓLœÝ®ôÔÖ¾qI-ñÂ#í,ȵ›ÜHg%T@Ï?+pÍÞ�Q=ˆd‘ F$4‘ƒij�@ý `çC“ÁKÖì�c2ÇìÇbl;#˜á®‹`ex31¬]Uñ c´qÕ.4Y¬|²ï.‚Q3¬[AÄ‚ÐN@ØKL¯ ÄdV–bd9¨1°¼™i“k” ÅœöY_Úc‚€²ßÄE£ï¨­€ª-@‹ššÕ¤ª5±T»©&p°®c^w–ÃåÀ{’â81�€äj?MaÏ¢)›U h ±C²¦�`-j5b‰s!ûý± ²„éXþ(’Dì�,IËÒøCök;\„Ó1G?Ë‘ò{È‘â˜�]*×›…ùÒD4ĦiQo’b@³œ,]Kƒ/m‡?vÄó¦…Ï,}xŽùþÕæ�Ž“ÚÄQ¡c�Ei÷„¸�â¥øܤŽOø1ÛÃ"(ÄÉ‚²ôH£5f¡ŽOê�"HÄþÈ‚üaÔ)t›ñ‰ß+>qWõ™:ãdMzʬñ¤I¡¾qu!1KÝgyò<ç@ºÞ�Aúܽ™,+[Ít¬ÚÍ aô“MK¾ á#Ò-Òûuo@ÐBN¿_ö•Ú!Ya€G°$õŒ•f»á½üÁoȾRû#+ð&î@þfÑ­/ýós…–{H“ÒsàgÁË|¿ëõLìÑ{9Ä€fiˆ¢19¶ÁìÚÐ^Á‹»%x!Æ3KCžc˜²ô¹2±F‹×µ¡¢­P|m�Ó0 3ß„xeæÛ$�ÌBÇ^ß‘È\Ä�Ñ,KHÛ™µm�ÓM«ì†§¿EˆñÌâЇç(ø¾j͈MŒBDçŸ?r¸}ƒê,‚ö�â$‚#'´ƒÑ{9õáŽÙÚ� Æ3 ÄÐvØñžmæcG8oÊ|Ùõ¡ ξćÛ+x¸©cÑ? Vp»‡2°ùaÐí6«Ëù°ew²ÙvÖÓ©ÇËõe Æ3+ÃжøÛÎEjzo¹ù{†)Û‡Kdm 4kC l1·+Kà Ð]¤Áß" ý“QÓ;H÷6¿5Ù£I^!AÃÁÌP㙤a h×ÈÈòæŽpÞÔ© †3 CœöК/Ÿ;ö`IÿÜPîiOVOêàêÁê¨<€ÈàhËwÃ` µC²¼�`Éùš”ø?_ÞKí�¬Oþ‰Ž­Áq€å½ë�Kÿ4UîÄÒdåøgÇÝqÜ�Ý"MÄÉÒ´ôÈ®+ûš‰Ãm7¥‰ØYš€?°T•ê—&µ—4é›C§þ)«Ü|È—ÕpÃË–“ò9ô‰ï¨Oï×3£vHÖ§¥Gž)tRÇôGÑ'bd}þÀô鈫üúC§ëŽUÉÒϦ—&å/K“ÛOšv\„Ë$[j‡diZz䙤iÇÐé–¡*jdiþ¸e…ÏsHSÿ4—ëÎÔÉÒJ³ƒ4I[€Ç§¸a“³€^µg8ì5Žß"-Ä€fiY"êšµ& õE01ýàË|¨ñÌÒЇç|ÛÔ»3H¸ÎçöÓ�²XÄŸ"_ìÃE(N{ÐL,dÔ2Îñ�¬qŠF b@³X,u+ÇÀà«}SŽ8‡¨È1¢Y.ú]_8Côy°6vÝçBÐV{Á0�uÕñRY–²1Küð ££‚‚c`ÞÎ�kï¾nÎ5˜›.ä`@åøEðŒ *íÝlúaøwŽ5EÒ•dÅC¿0XÃxy·9ÓI2çÅѹÞëpÑ¢†[¸ðû �{Äx÷xfÆmpƒ¬žíªaüV´‹ Q£­ØäÕKh�'u¼ÃNعífÂu{Jæù F1Ñ‚„³üvj²0ñTެfè?æžèÈî„vSkÑh‹uQÃå�aŠ ¹= z-Cûñʉñ¬oÓ&ö#E0ÏŒDŽoŠpùAðŽ ø…¾ëË{5hé�ØJÏã¹@^(©ÎÿÊ¿ùe}ú}”^£¬Ôöü×ñSŒquþ!ü’õ*ÄTà—þ¿ïC'ØÀ»ßÄ#ˆ¼Å[¾1\¨“$g=†²„â³xšV¾úp¼²Lž_•{Ÿç«Ô06XJV«éÏ :ØÇí C­ïüúËί«&;ó%„'Á�4óš …•)4®¥®|Q>ù:^ÙP+‰s�X¹7‡(\aE{ˆÓlb:çAúÁËK ÉEdå²Ô…Oïþ,Tendstream endobj 196 0 obj 4386 endobj 200 0 obj <> stream xœÕ]K³7ΊÅüŠYÎTqÛz?¨bã`À$Nbç ;@œ„ž£–º%õõcæö¹—‚ÂMÏÜ链Oç%õÇ#ëø‘…ÿ¤ÿúáðì�=þí§C÷È�ÿ<|„�Ôê¨:n1m;)Žœ+×1þäùË󗯎?ÿøŸ÷‡g:òó߇ÿyþÕ§ðÏËß?9¼xy|=>ò³ÃÇOÿ‡¥Ÿ=>¿‡_æöè;o„QÇûïá»wð_ø—›Ž›#¢æxÿáðçÓ«3ï„RΟޟïàR(fN?Ÿe§”±üôwøX9ÍÔé‡ó�€‡:&N¹ÿÃáÅýáuß·Ð-.ugúöÑq~äFŠÎ¹ �kwÉÍö úÐÁWú>ÝŸïTç­×êô"_¾Ž—–ùÓùî7ãåbg¤¼3�QRv¾Ñ§ÔØ—p÷ó|wC_´âjÛ¬»¶/F2˜U±3î/s³‹.~�ï~9íâE¿J2qo:} ™6S(tÄ:—:õÕùÎtŒŸ~<ßi¸É˜ \�Kç½<};èû3ë¬Z”Lûp* #gFL0ÞI*žß©jÀ³6 X?0`ÜðŠF¿Í—„O¹Ó�l}áwç;©¥‚Éî €`òü iß仯VLô�v÷‰ÞÃ&µëŒiÌó 3ðˆ9ä¼í”¼üBω9‘ —ú¹þ»…ò½Éw7 ¡;A€œÖZ· Âp×YÝfnÎ�ÈYg;Þ×_ɇ®Ô )al9…ÁZÇ�¨ð{ÃŒã£â´ÇU*ÞYñ B2ß>«;î¦í;1LîD'ï:>²NöŸs |.ÆÏ»Q<ó½Qx¹èûüì�4es8s ¼ÐÚûwðûŸ„¿‚�1é»uÓm7~1?^ƒÇ¸@W9Ü\÷!åf\iT'|2Æö•àšñ¦BÀué�<‰è2fË›^æ¬[ /pt^žŸï§ø†»‹?¤*ͬÁ<·²¸o¶ *îaÕ.û¢ò%‹—†õ=îê0a¡Óyˆ|ù„<|õ€âÍ-C­’ŒZ?´:�À�V¾sÐyPU˜BŒWÜ@EFô+kzæï/1Ü—-KŸAÍ¢bPQረðÕ¢£ÝE¥“@RÌ '²Òjh­Íj¢«›—jb±©,vVQÑn�šTÈh [ I­Âx /…ÂTJ#X•Rô½SÌ ]0× S)ì E¬BJ*Í‚1¥kÖ+�æ é"Â+ù®=ßÁï.ù.§"f¦Gù.¾K*¾_L˾'0 ø`Jðò¤Š`j LÌ"s'‡Í>³žæœ›V,»…æ Pš ÚˆÑWÁÇ€¾Z‘ç¤^$qÍQÄžÀI̦$6™Áj‘Á–«ÞiÙŸÁŽU ¶yÒÕËã:ë}œyà608�IÀ`]±y^±çuÑáÆçÞ+övû¿B–€Ê€lkŤ ñ'Kƒ_ Ë4ÁÓ*]šæz‘èNR݇†µ¼�9¨8í1C}gï¿6}×Ò>AK@ûmåû×¶Æ…µŽù@ ß_ÑqÓ2žà%à~„·_ɵώ¥à,„ mÔýúºÁÉ·¥àa‘ÿ,Ž€ò–æUzØð]9c±ëÎ{Ÿ|³¨^退•·­¨k)vpØ u A»¿$h:PHl¶œpsµìÕ�ïþ:�à­Ì€‚º<;îu¢á¸'+ÕÜõöÖÍÁ>5ûL-"x°Ï.)‰`<%�·¦¥$ò¼:Ÿ€9j_%¹*0@K $Ú†’h ZL¤J²·E!jR®U’^%‰ðj …¿t(ê5>ŠŠ*� [éËÚhàùL¶…[T˜ DŠ ì:E°Wø냃7*‚Ù  ZEˆÐ6�cîCA/LͽaK|a€—@"¼­ìba[à:�Ûâ6¬0‘Ø´-’ˆøE‘œJD¤_'"~6’V®�� "bƒˆ$h D$BÛ(R˜>ã :± ÓŠèΉH‚—@D"¼•ˆL})"…ÊTDÐÜŽ "æ“ÔS¥.)Zb¢)•Bóî•™Ž"½¶ä 8DIØj%¹1W¹ÅIx(IijLWúéº×®qºq]¼.]y­W’0%��ˆi™±ô�{ Öê*Å;ú‹¶†[�ið*nJÏËD‘ü,b®<2‚þ˜F Œìb1=’×K¬âw]üj­ t]´Z¡­¬^59A;Ÿp~¤ÔèµVG‚—@6"¼3õLCv´.—$ÎŽÊN—‘š\ *`,• ýÛ*à°äˆ~*Œ«’#´*¡m0Ðh1À¸µÖ‰292ÀK Þm ]kÛ¥ï�–�®/F¿Ù÷°ÍJèÒ÷°Þ^ˆÊb‘¤°‡$g{õZ•,x@ãÿ%ã:@K *Ú†¨( ZQ)B•sR;f\GQ¹4RK6<†HO¼ïõ¤ˆe¨)ºíÔŠEDÄ®‘cŽ÷Œˆ$< D$âYÆ2ÜZ<]iyÞOZÙ5`K !=¶UaWÑæB!ŠÂ®ºšëBbè »\§ÞÇbÕ§ „F!¤îšÒÂãV³ó×…õ»ÇH‘¨�%Ð…ÙFšÄbÈnH“ì˸VºÊУÛ*ù,.EV…J‡:cQ�ý@q“—"¯®ÑX¬•Ò9š�)RÙNÔ;Srj¨Ìæ¥�“bçÓ�IˆÇ-�´Dh+m©丨}B…_×:. ^m‰ð¶ ¿ÆUÑ5â¤Å®³ñDšj³Z�¹�µût~–«šÐÜ«ÖÎÌ.V…JͨÄAû^Š@Æ(Ô"¦³��-ì+!;RfCè€"�DËPg�¢FPl!³w€óÊ é’”�H–΂¤ ;�JWŸã¾Aq•t\„ý­ÿ=ß)gEǦýï©[D ‹År±òRAE\˧«úÒ.1Â#趘¸ÔŽà¶Ì“͈ú@*ÄŒ°¨�nj!Üh±ºÌ±“Å2G%•˜H>“�žßù ÛëÄ$áI &OTL<&&x\5Žù“.�˜Dp[b¢ÏX¶�U_ÄD®“õLjI#–¹X©¤Ò4›,”�onÚB�ËÅ-ƒˆ Ù¦­ îÈ-�¸Dh§Ð ÅøË-¥ÐéZyIðÈK„·ËÄå¥@­(F0¨¼ÜûÍò"Vïß*¤e±‚R)C%-áÀÔ5ïáÒ Ò‚ÅR×oÏ K“ ÐHK„¶QçT@›KÈðh*ZÍG˜Ý$- ^i‰ð¶,Æ¢©êBe‚´¨õ– áÖÐg]]JËb ¥ÒŽJZŒY'-ó§DâÒòϯ %�–m#[”ggÆ#,7nS" žðHK„w®„2m57]KÁ\¹ÕüIî�Öeש�Q±LÑìøPÖu®µÝ|>žxëÛBèò½œBÒù´ƒ4g¬på±C+[ê8l T¤Çv&²B_•™“­ËU™Ê *N{Öͽ è"'¸˜vÅ,†�_ tU±õ€1Ñ{ŒQ¢;aUÍI$ëúØ©™M”O(P¾G¹Q‡MR¸…½u\ù?Üý­ã´5¼>\êN'*ÿâ|Ç`¬¹–í7C-ÍkLJÂ|¦ŠöÕq™žÜ™NòRŒêã„Êx`°öx.&rõR{xÜh@ÜO_bß_¦7È[°e^T/“Ÿö(Ⱥô#1~ Mp01¼¯%þ̱Šxðþ�~5H#ú�5Œ�ßͽåA¼ ¶mUÉݤàdŒ÷—º4ÆaS„tc2?‹saO†ØÙ’�“ƒ˜Ëzºmˆ�Rㇻ/Æ»[†ØN¿bŒA›WŒñäÆtÐ|y!PkFy©M£¬Ãï¹ ëêò2e¨8·à3›Iw¸4ù»¶îâ2ª±[š œq‚©à¦Óµ9+À}4Љ'†Ø_½ê®11Š%H³Ð`þ€K�„;àË‚ïÚ£¿Âî:ãŽ@Cß;²zð4Bs{z ÀÁàKËOߞæj'NßÞ ¦Íé}p�mgLï!‡o‚›HÝ)àYwúô¬:-½±§òçÎaqUR�þ=<ómþôǰüe¥¶§ô?ÅW§ŸàIÖ+XRŠ'ý+ü¾Ú˜òîw9 :γp\·gÁÆ®^÷W–ÉÓã½o†«dœUXJ–õã—#:Ø�[PD¿ö×?_ùë �ñá™oKx¼ïÂ…fBam"Û‹¹Ã/Õ圧F†}=ÞûrÒH¸Âšvçm8ÃÁ ¯=r£S54‘�—#^þÝ6yÎendstream endobj 201 0 obj 3754 endobj 205 0 obj <> stream xœÕ]˲ã¶õ* }…–RUÄÁûáªlìL’I<.Ïø:Y¤²°c;IÅÇ�üHT“ %±ï¸úìcøxõÛ㇗¯ŽoÆ‹þéðÃ�§?Xºññ£'¸7·Gßy#Œ:>}{ç^à|rÓqsäRwNŸÞþzz}æ�PÊùÓ7ç  ÅÌéç³ì”2–Ÿþ _+§™:}¾¸¨câôõPø·§?^>Þôµ Õ W6ýóÑq¨œ5NÝP¹ù*¹Å: .Öéé|Q�·^«ÓË|ø&ZæOŸæÒ/ÆÃfe¤áº•QŠƒ)áuqJ�u ¥ŸäÒ uÑÊ(š†�/:–ŒíSô±¯Ú¨/å¹ôs¼^µ;qo:}‹;mv"É:U�L÷Ùù•ä§Ï—àYŒ¹à.pè¼—§¯FúîÌ:«„¥³½; 82r¡Ñã=UxSªœÐ e£9fíéUn°K€ÜvJ–­ú»|øçp‚Ó�ô3'üþ|‘@ä&”J°H€ar‹‰ß}›K_¯°÷ø®}”Y,C'�íü•¹? ¹Þ5FälFN^#7u®·¹trpu†L€œÖbì–® ë{ ºþ„5Ð)&\_Äà~¼„­ Ø·l ì#¥é< û(Õw¬š�·D¬øH5ó�)ëÙñ� ²ü|ÎÓMŸïÄ }lèyÌPêl8âÖ{eáD/%´�˺‘=sÙËȼ\ôuñVšò±8S¡Ãfǧ¯á9>¿âÊ™tn]Û�'æËËôdÞ„ÃXØù‘\³²´`l&‚,+èƪªˆ°¬“êd´ �ÐéGžÃa—1[Ft™³n5º†»º<_ßOá ¥M|ÉH‹øjí:íJ#îŸZM�¸/5+N  ¯Â÷×X³õXûNÜ5Ø´pgŠ›†Ÿ_´¾4Ps 2^¹Ê)¢GRA]áÏ4††‹—�M-áø]ÍѾeÿ}²oŽp_ɇ®bwò¨Ð$ @³ä� ‡Íf�ÉDeÞ0S\'¶¬èxîã� ZÖhµ‘�ŽÈšÄÑ‹¸Åž&„�ÑÍ ¨s¡®x$¦KÊK—JBG+&0\—â Ô»ÇN6ÝY{*wó.ÝYflT>”ÙØ°@‘91ÛàÄ C'†«K !Ôµy¥Cž!t˜¥™µþŠƒ¸ŸÃ& `ì–%±Ee—ÕµY7ó>ÙÅóŸjôâ‰Â�Þ éÜI$l5‘ø&‘HNE$Ò?–H0ÉrçñM5ZXM$ b"‰ãi #’BÙ0�ˆdo")nzî‘$t ˆ$¢;C$ߌHt&—†t7‘è"±Íz|S'5ˆEIA“%4ï ¬TEñ ;=í*ŸkÎÓl �#yD[Zh¡Ç‹G�anÕBoÄ$L (#bZi¡EÚ‚­Í4Í�¢aœÛ™}WÎ�R(äÓ‚–’$#ê!ý”†î@x¤!0íC"‘Fè…¸áÁ¤B¬t‰Zo¾.”!«Öñ¶»'�Ü=‚„Ïn #‹Î‚ Ö*v¶Ö[c…„.�ãGtg¯ä·¬iLƒm4üµï”'‹�ýµ[7ó…±_;1ƒ©Õ níf&ä¯ÜÚ-N�äÐøý™  & …1®DHlÁPI kýΤpãÉ€.)Dt:€@'H6 ½ãÉò¢™1)¬§"gûÀ¤ –L{¥—}AMšeP+"±`™;Ï•ÜF, bb‰ãÄ‚&F3T™@…·½•‰[‰%¡K@,Ý"—ª™pQ˶‹ã ž£‰‚mĺ| ø �+š‰“.Bäþ0ü î_èª Š<ÕÁ-âáz¥‡ß¯\ v\<ÁHàâÆB?(²ò}>,Tƒûf÷ l<$$ Ü9"Y©:;t­hý2§Õ`&hfXJ&Íâ Ïø)ÑíL7¥U(îOE\Z@僊ŠÏ"-ܘ_9€»?;DpñuP¸ ˆ®BÝ�ö°75 B33S†%Ú4¤ dWëyðRf¢TÓjixP­ô[Xq½v­ÅÝ—b‡aÂènæeª’0®µ23€Kè7ÎF (0G�òŒ&y%ùãçgÕ$›i–2p 5HÝÍJ’W)¯ã¡‰$©%I2jP¨!!L@ =ÂVTsT8x–ðøVFHà0Bî&F˜®9! ’zCÐö8ArcFC3çRJps’¥ RÙ`n3šÈ#‘ˆC<'­Ü$HÐJ„O•ByÅ£¼‚ÆÖ{/¹•Wº¼Ñ�!�ÎtL§à§9—¨XD—*µ”¼=;ˆi¦_Jͨ8EûžS iCäÑ¢Dõ9lÍ�´±…7Œ¼a,TNE>ÕŠ©s£&N´š#’‘ܶ?ºævïµ2u ³67ª˜Bl&KJ’ÔIhÀòihÑZ6ÖYØá²å[F, bŠˆãC‡� ‹å¿ÐU¦º´Ñ� -4:fAÕ¢"‰�U¦[eº´u2f©sÄb±8Ùo}}Òå‚JJ¶¼c‹Jš & –qsÁi�h~M,Ï=U¸‰XºÄÑ�!–«ýæÅ›‰¥pºub+–w\+ÍŒOé §xÝsJ1fÛÁaý§,—CÞ3ÍBº¯Ý(ƒD@ñЕ«ñ-­žeÉú­3³ ]‰èS³cþ±˜H ¦¾1KK¸MØŠYÚ™(¤™Ê)½34K?³›��¹awlL9µ+IänåtKrG‚xIoX­î²½ôü,Cù[•Ó„îþ’Ð-8¤Èü*Ò;tc›ÛzÝz¡±êîjë,¹°Í­îð(¡™¿©8£òyî{Ÿ¯wÅ€ªSbjã»mpql°A¶`$ðë#î× óëbs,Ý�; û±-±Á€.�_Gtëí.‘í«mcèû\óB3—S AÅ ’Oyáέíé2¼·0D”€!" 8C\m¤2¿: =l�ÛH"¡KÀ]¼çÇs¾Q† \fwû�¡™Ý©$Ø Éò¥D?û0áòž„pÊ�òˆ ˆ#B\GNå,† ªDI¶x–´Î…Ë]âˆèÄá2q o\&4I‹P^ŸLQpF3íS)CÅiSà]e²¼Ï-œ‘ &àŒ´)0Ê­Wp¹F°A8‹º)ØHèpFÚ¸%U²õR%ᜦ×ôÑÌïTÚ)š¬ñм«èc9m|ù~ïãNÄô!n.8WU5²©/.8'¤�-¹[ºôÑÝr c•÷kZùbŸ‚8šIœÊ2*â°®sÓùÐì¬"Õk¬o£ÒÎEnèQlN‚¶^îùÜúܦÑH—€zp7½Ùsºñüpê�EqoŽýã2¿çö¸¹z `;åS9AEžu³Ÿ«LóåêÝm~1ÁFB˜€Pz„›»fUã$ÖxnycS¬‘À% ”ÜG*(GJͳQþšs哹ûkÎ5T-äp)UЏþê|aÀD\ËùWDÃå~ @ אָW݇\„îÆÖ=vaÕÃ÷Õbü¢‰2�„çqåAHË‚€�šö)¿¶¾x¯ýëxh™O¯¸¥˜‘ÜL¨~†Ú/õ”5™ÁÏ« Qw*„¦éw¼‹Þ#Ü‚›áÜza,caøz†fÖÑ'm¾?�¦6—`[FŒ3ùùñ‡& ýSΔËŠ€@æ&¯U�…Žys�.f[Ü)5¶x(}9–niq>¡ØuMìµ¢ÉuÍŠU›—Õ_Óèûó{jt­�àUéèC�[ÄaC«_¹ï ÕžŽ\áÙ›½ÞÆqR‹üdµ1ÝiíÝ-Æ0ÝaR¸NVOapc¨ú%ÍþÈ~IB ï¼Ö¢7öx t+.\ž36ÚÂÓÙÁ3hnO_ˆ�0ÒòÓWgø-„ §ï oÓæôMèj� LÌ“‚3~ͤÀf¬;}|V�–ÞØÓ÷ùûwçÐá*ˆþ;\óËüí�¡K4ÊJ0©õ·bŒ«ÓOp%ët>Å•þîC kÊÒos¸¬ÛÊWõ½ ;Úœ�ÏB=½é�,“§ODz/†£³TPJÖ�mÿëìæ Á¯½û'+ï® ýrwùe O‚÷ëp ™PØ3 ‘è\áþæ–sž-<Л±Œ�eŸGØ£]¼�Nt ›²��ãð|b<ÝàÍáÿ_oŸendstream endobj 206 0 obj 3726 endobj 210 0 obj <> stream xœí[[s»γ‹±oÙM±Ãè.�7Æ,Á`Øå„ªœ<æ’ `ŽÁäðïÓ­Ñ¥5£Y{Ír9©-ªÌX£Q«»¿¾Jþ}Ò6lÒâ¿ðÿ‹w{7›Éë�{~tÂ&OOÿÙû}�…_Ú0{rspÆ'Ì4œ)9Y½ÚcáÛ6Š971ÞñÉêÝÞ?§û³yÛX-ÛÖL?Ìæ¼Rr|-Ìiíô%*KMßwï…tÓ“üøïÙœ5Ìp6ýcÆ®¬fÿZÝÃ]Xº á§œ�¬îï­þæé:¡kõô6|f™ƒ¥^âf¸ZL?âªÎJ3}‘ÏðQHøH!Ù¶‘œkØã‡‡•¬1ÓOþ3«Ng¢aZjdAÀ¦Œ"c¯pÌ5¬e‘ªpnzî×4BMŸÏ@Æ[Ðï>6Î$ÔyÞžl¹¢qÂ�A%ƒ´h”â(-®aZË¢´ "Ǭ‹ h×H!�ZÛh [4Ó78Af�p‹[h•FÂèF dL6Æ Ç` ¢QZ(‚Å'®Š…È秨c®¹vžªªÆNÿ;²Ñ@òMc•8DòyùLòE;Pj[&AÂsnQšÌ/j J>,Ť�>ëvÒjVå ö/ðd5|:ŸÍáX)8!ÛÏÎq£ªåt¡ÄËóž{ÖlÚ»Cp�µóÌOdãû¸@æ§£3;Õ3Wª^5Ú8°ØÕ è1€Gkæy?=-ü“iÅt™ÆžÄ§œÀ:.x=m­FÝ4\ß”º2ŒUÁ¼ u[RF*÷ãÚ„òq{Ǿ;åå¶(W$Ž”$Jilµm¾çRA¬�±9“�,”>²ÛBÛº°[¥±å¶ §tËt!¿þƒ¯ƒ4v;=m ðW¢¾5Þ¥€(w!u¯ü[Û7ö!ï~ýõÔ¿¡ÞËõ õÛß�÷õÔïß@ïCÔ­§¾]‡Wá=…“žÃËNpkŽ~„úa¢´_êý' ¾%ÉwΞ3ïì})Ðó÷‡Éÿì§±[Ûö¸ºqu�{˜Ð·ŸÆ2õ-YÞ(õ£ õ§ß�÷~"‡ú?ê�}êÄÚñéQiy?Œúý«P‡:Ê«VB‘øNDzo’‘C="mAêo°ÎuP£ÊP¤ôª ¬x”††ÅE…’Ø�%]ÿêm®lÞfª9ý? «B�ñÊW�P}‹±úâÒE¢(0ÞäªX€Í@Å{ÇR}AˆÒåÿZÖˆ­n„PE�W:Š××yStÆ3ºWej %eS aΙmdËh’Y–´”ÐЕ’Yä4f¾¢ÐôÜ~HŸ_®æ•®¾Ö÷£`€Í•¿�Qw¬-&PÊ�<8w%:æ›+Jf‰?ˆÖ?­²Y¥”‡�¢ý(j—ëF‚DBÝ®:ÄÓ˜²H¼i¥áÈÎÊr¦kEP‚åpYðqq®q÷ MZÔ+(XjA«ö�A#“‚5â #˜ÎõØ«n¦õ¸xx¸ŠýÔ×ÄiË«�è”2A ÊøZ^H˜ ±÷dX¿w%½„—/to…­#¸E˱�«k�v'„–[o³Ä4‚´¤KÍ–Nü­h„SCŸ‚r§Xâ¸,a-¦™Í¥l1Ë€º}¦„––ÎE3>½–ë+¡ÄZÖ«¯²Á\®ÝrÙkbqJP�÷Hø^LÕïÕ‚³2#m±.Ô¸ÆÐ:=X?o‹NÓY�‚¾Ø¸²hˆc-¥áWÒcÞáu¯ •Q]º‰Ž¼fª ¿R½ýÇõ«Òg’âíãÍ¥…q®&-ž­ì´b«Ï“½Uãihïqxÿ!Í<ˆ-üE B9\#îã}ȸ­¬Jb?²ô¶ |èé¡Ðòù6oE'Œ0]ðš:1†ŒªÑœ”+û¶…I+HƒÀVGMZ�ƒöXÓ."aü½™of]]`ãF®aÿŒ‘nëÚÿ�3sL!�âk G$kí3 JÞ7ð@ýàAR¡aÔU­@bž°mZ¤w¼ÿm妧-g¢–Ð}Ê»|“³VB¢òã…ÓLd5K‡�†Èýy¦Tƒ*ë#VÐe¦YÕ¢þ®%#«ô¶ãüþc$¶�&ìcn-mÓCJT{¦þÞéÕÁø ÐÀ”œ€xË.&—íâ<½îXaìU�`ƒ¦‘RN›^œ”…·—ŠN›¸Ùßþ6#»¸Ž¬9P²úZá=Íúñ—+è2ý¨­`O¦ƒJ~|Ý'|�&ô&u¬†©ù„Ì,*2ØÃÚTÒqGiÖ]|��`´çÕ SµO«•ìBUsLô¢ö®k÷\¤idÎé^˜�*",�¤®o"sÞ€e« �ïõ‹"/cY‚,›\Ob+in¼q"7·½ËÃPD4÷ã[-㬽Dž,d¬gÃð³>œÁ©ð6�wò> 슌&ÿ‘J�:ÉèHÎ× R�²g—s½<�ÎGð½cƒì{_�û*åX~»(©Îç;é‹_/1Ÿɼ9d™Ê@¨M¼».ñõ rƒ.$º€ï€íHuEkûБU$*W[txr§-\}‹¾@BÉÍ8j(C!÷ eh+rg×^Ý=_÷¶š;�v´¤ªçû…_�  "®âÏzѧÄeÓu†7Ð~éw™ 6^ZǺŒ¾aô‚º�;Ø0C>xcŒAé€EJƹ?åAÍkIß#“ªkÑãB�W•°0kxç7VØ/—È1aD/ËÑÝàN �:¾Ù€Ñ`4o»¬.,²óÄ¢Ôa û{=ó§38¬çñkyî‹´Ûg3HP[ |‚êí^sÙâ�g:Xí=Úû}"…C燷S±ƒ7±Pm´ÆN¤vøÅÛ¯7{7G“Ogç/÷nücÂönÜÅ7�oÁ‹Û“¿ì,&�FoÂ2X�è¤V* ZÝMXpnüü8ÀKŒ–cb�¿?„55CÔjÑ©âA¤$Ø5D�$´wx{ŒÅ×^¨Å5ÑñYwž$ºtÕ�up˜äƒ<¼�ŽgÙu·F!Öø»Ž(ù8Û0M^�ÙMÐ]d¡Ë<21‡ˆk#s¼�ÅqëG‹ƒXò›™$rJý£;¾á O V³3,‘ Y:�cþ `Z;SNC§ÙN�NøÊYÄî”ÜLî^Ä|«¯ýq"OüÞÞ×ĉKŒN¬&¦b^TU©Ã5’ô­KØ ”³qö+ÔòæüüH]rª/|“íçÎ/ ãt•+&”益ojó2+Áæ„TÀ6¥û…�ªZk^ƒàŽÌ„ꧪÖ}zV? z¶…„¯´©;øã×-‚ÝóªUe×4.Ä*¶ ²Cö±‡‘é#Ùvýå�&U™:úN¾yQ¯$æ·CS8é%î�BB%÷%47¼}Ä]½¡›�÷PJÙ�ÏCJ§3�H4èÇ É À¶µãIo=¨úf’± O÷:êF^É’Yk‘aÑ9×ä0cük6¼²ØýPxè Eìq\Ä‚ $¼K ¿b{^‹ÆæÑôišs=}wœ<Žóº)�QÌ`ƒVãœø¸OßçÅâë;3ãíV‘…óë£4¸?³È…då¦âÄEHW5‚‹D�*˜¬ã�ª|•Ž �ÒŠ¥ªçaÚœ‰îa3³Ë‚Û™Ý6ÌN©+˜]VÂÎìþŸÍΫÔ÷‹2ý�Ù}µÙ]ÂÖj’ßÙÚŸÑÖ¼ÝÈÖn_ÂÖ²Pî–zθ[ãò^~,ÞÿÙ5¾,ÜÉÀ ,k³Æ�k>¨h|•VÜÄÿD>Ka·à�oS9\1U_I|DáCÂSáB†ÞyQÇ[Î=º©!´Akè�¯ÂHXîì°æÆ÷Á‘°2DÌr= Ë éÂ{ÌB%]„'*´€'"5ò¾peijéÁ„-¸°[;¶saWDÌÎ…í\ØÖ]Øe¹¬ÄÔqö€Êƒ€”üZ•ò~]qÄí'@ÖºWÁGub­âqŠ�É'ÕmèGîÔ,à0MqŠkK¬e�5–_;� €¢0-¢,{Í! ‰_ĩۈ¤5ŽûÅ«ÂpAµ°Ö/Þ¯øÅ‘âq¨š**•‰‡5Þ«�æ°B°Zþ­Çkái#Á³ÂðNeÅ‹»Uœ–)@Ï[ ¶–”dE�ÇyjæwÌÛ¢‹êëƒÚJ•è_A¹”;ÛËä‹;g»s¶ßØÙ^& Ý9Û�³ý‰œí2ÛŒà�³Ý9ÛïìlÓë]�õSÀðv†µÓ¬*¯Ë ‹Þ@€á> stream xœí\Ks·ÎyËÇä¾ÇÝDá��«r m‰"#ÉI%ªŠs�%YNü d[~ä×§�Ìììr%QKUÔì �hÌë%kø’á¿îÿgß-nŸÙåËþî’/ÿ–®¾Y¼^ðîëZ/?¹€¸máVã˜ãË‹¯¼{¡e�æÎ-­²�Ë‹ïÿ\}º>�«Cüs¿û£k³«Sü}”à>ç«süùÅ ÿ>Ä?wñÏ­ø3´9L÷¤üÏ'© ü�smkVÇù²xÞ]=É�ï¯-^)]ü˜¼Ýâ*T˜J¸w77ÌoWц0`«™\�ÐÅÅÇG•�Ó½ÓÜ0w~–Þ"÷RÃÓ4àaíñ­õ¿.Nµ�6ÀÔ‹çÀû•É�‰Ç†O Rd>àØN#³ã½;ù²›†’m¹Úøüœ®"5̓žOz: /æž.è:+عÈM臘g!âåëÔéyÐô€ËFk׺Ζ�O…ï]6ØîVd㘶Œ²qTë褃jCŠß¡lœÕdãl{ÈW…ñ(5¤ %Ê!X%ÀgÙ(€0µÖóÔð´JüóÓ:öàój°I°�M³ò!Ï ‰ë­@®Ð5Lì ݵ~£ÖÏj}®lddgÐÞ¨õ÷¨ÖïTdã Uœ¿{µ>×#ñ*üq„à tß;tÏ+Э-á¼6ôq º… íP4!Aq©a‡jŸhPlºïâþyTB¬ÃmCráê°€k\Us¯NfÃp t ásZCÅY»¡kÊ )¬ù÷Å ‡0<Ÿ^Ây}èž^,”ÙÔbjú 5݇^Ì€¼È@î�˜m£É¶ѪF-„�¿~aÞC±-b| Àl”2̬^¬¡™âB¬þ½�µV®~€†R5R¹ÕӵƟð~‰ÕKøù&¿ûÎÀkéæûµ°@N®W?­eÓ¶VÊÕ�Ø#Aáqhtyº–ž;bõóZú±9ôs ¼¯y�¼ƒÏ¥ñÏ¿ÂÑq"nu óú6N?]\®�`¿øU[çx^à÷¹¿—¡?Ó¬FHå @š÷»°¼õD�âò¬«�»&^KpÕp4W‚7.٭õˆT5LQªâTU¨r`€9\X`¨p�`J¬~[°Fa¬]½‚µ�’\æ×q.­nXËøZrîœîÃŽ̋F6§ûå¶ÏÒÌ€B(mA“g‰€‰”8‡;‹G‹×K%b³Á@„vÙ2è¶KÃ,oL‹ÙæOŽ·�,úáÍ‹Åí,ùâö=üóÉé§ðßñgË?,î/íšyÖ­ ‡ÌsôF²9çõˆÿS“ªHDÖ˜@¾‡ÀÊB"$Á1võe`ƒTÄP²„¶kÙ¯|€aí@´j>m_äññþ—™ å«(eJ€ì™Ô»’8…qQÚ åeèÛ0ÀM+VÿÉ’•{Ï,ͽ¥É6Òú^5èS+¨€xßÑH——¥ä5D¬ü=Hàæ®i#g‚©|¿|}EÕ]ÁØÊ’Ÿz5\±–|¿ô#jR*cÌû£"YGoYI jš¹Pã�’ÂA”†A,yü:èOi�¡¤F~Ì¢¬;5°ÏqA0†cà7dÜb�Ñ0ë5ä%´Øž—Þµ¼÷ÎÄB8h xb(÷*f‚¡ÿZŽ(5–£bƒ.yVуUCN (õJÀ=׺-Ð#€ÎŒëL†!ha±_—Þú:^Î_Xç�=¥ k0ì\Eb ç ©Î$`;ÍäÞ:„q*çáÒÐa}N'ˆ‚{Ü’”VO½3,@ODg8 ­¡‡n¦Â´¤³_ ~h qC7:šVÒMXXNÞÊóò>R7bÚ×é„Þþ¬ºHy®%åµfÿˆ·TŸ…„lùm�_Î(`Ý�JÞ¬¹’dÊo2Ÿ€­Á¹U]¿á0¢œ¸ZY÷W%›ƒ‰e*r‰¦i$2½Ô¤]¢ó…Òzý+¢¶Eö®8ÎFŽB¨:Pˆ¸Fð`‰Ï©¨D2~4Ð}Y9Ä …Qtzg¸tÌ–ÜæwH?„sùBê®�Â&Ë"4>£ØBíB@‚Ç]t®=Èó`u…ËÁ±´},w*·ªb¹Žô�NÍV‡‚€BHׯ—sóÞdXȵ÷þãk…Þ“Úëæªâ£âãC9E=§ë ‚ 5v6m©8a ÂUn#µUïÎ…SB@!+Øà|l¶U hʸܛ½‚¹z‡�ò LÄ8ß^ಔ·q"œ73óî2ÇYî‚3šã:¥‘=¶4Ô2‘e�š Rϱ x…‹•'FD5ȧ·V`·I„MÑ· p {QʳzÜ(…ŽKAÚ‹ÖR „þø;šN"¤ ¹Œ­ì…l9èR3e/¤3^1϶àY˜½Û ù˜ öBZíÂ99f/ø.̵ی趣èû©ûyÚÖbø!´Lê€9/{6HÖRÎÔÓ¸d7¹Ï°Š˜í§åBž' «+^Ì~uK%Å{’ÒÌG#ÚüfÊûëcG˜Fr–väI/Çîsç>ªÁŸÂÉaŸ‰ŸeX>G¡Àl›ÚÀ¤`¸0!áh}ˆêÈtÁ|·DËЩŒËe@ŸÇ ÉZv³ {7»Ñ`s­VTg_ép�©°ÜË{!š‘{•×FÍGÌ�æ¤kõ7ÑëÜ42lΣX¿É&[‚Q©#¥òÖ“ÃÖÈq›d+²¬é座¶cç¯òˆÕç·º X¾îk9Æ»M¦0|i†�t¯ª(#á¤O~ÿJò›™ÐOpø¥‚|¤õú¦ì<e\Á-“|$>7¿aCb7ûÛã2ÏÄ™¬¿¯#–þY/ê$¢© j—¢íyX�;Ç(á�ú“´)÷)Ä®µã~žuÞÏ#î-‚åG"”•>ÆìO¬W»Þ|ý6�ð;ÊqïYÂk@[m©Œ9&JE¡Zí'L\„�i.w# ê|Ôßn×îi"u13ÝôoƒtEI0ôNIy5k´üÖÇŠ£tÅw@ˆÓ$zc¬1§ÉXW Ö�YŠôécÒ£Gz­Ú26 IH¢HšçÓ(Ïû:‰D7ÊõÒ$±#b§?ž’\ð®­ß5¿¿¸ø3‘ØjÈʃlw\Êh©ö ¼ nn­C�® O¾^)Ø`’ó`@¢��.Ö´�˜ØBéôÝ6pFì:1­c–™®dÖ� ò nëšÆ¶®º‘’˪Y*ÇRµŸNAB©¦Z�Ù¹‹X"‡Å�W*nU¸Œý¸ £®B·¾ösÓ:¶¬pÊ{ õÊM\– ‚ËÆy:ŸÐUá�l„¦‰„×°kˆÝœYë×[ÝøœSÛÚíÅšd&Sp3?`)Q?RRÁ{å4óCÆ|ÂõîtÈ(G^ûˆAXÑ:ŸÅÛPdHuo ¬�ÀfW+uÅo»¼u úòéÌN7-9UB{†sPQœÙŠ*ÌÞˆ ª¨‹ ‡zF�\V+‘ªËlq"t³ËH±:Ž‹ªû±IÊQyŽû�Õ2_\ úDeb EŒõ@¹ F*€³�O·jå�VtbÂâbqi_°{P¦3¨¡¸?IëJî•Ú©ôb!~W-µ©²²ðâ_‘ì Äá:þe-A ÍîMA[`Ê®BóÖ”R;S,¹ 0D gzMDq~4‘ØbÉÓîê‘A­ÜIÍ[#7wöÖüžÂñãâ¸ný<1J†uc…uÛ(P¬â´©ŠÖ9}"�ˆj~%\#`�Ù›W+"öuÆEß8‡-öåBU´4ÖoË�W]Çêd–OtA¼¢LYÌÎ%Ä’éìrT‰ì|`¯¥¢Þ¤71R,ô¦ôöp“Þ”®1C5vòAkÍ�\9=È(o,5ïÿýªL5ËD8,�f-õc²½Ùnö;;WÂÆînþ|¶Õ�ùlà�Ã�dó1ããk•oÃâí´[µ!…/mÛËTä«ÛwXM~þ.‡µºùgèÚ+©B±sw¯5�Iz¿µCÓ}û\žÐ ¯õ>5°Ó�w,‚‡e\›ïljñGµ¼y²çİ.wOÉ+©Ñîê~O—…�ìÑ!f¼’_£ìþ|Òö¦7êÎè� ºÊ6©±.nû,�ÔÂ×÷nØ^Ö4‚FZ•ÏøfÕy4©Ô@Ó0’ÙÚ�"ÚoÜõ`ö½ þ5¥!�–á1æ2×Ý7VÊÙ±ùPKìÅÏyð4Êhò;ª"ù6óA½(ì@«}åƒÌðºßÒÕr?ù ¶ðÞ¦¿J[Eny.9Ê· õ›ä›”(�é“ï]`¢��á·SEã¹ xί(Dˆ4Me™pØ¢Ð�þ«6špÀ5²¬;1”H1Ú39ýÃaýOV`Üûù²‚¢˜d½Æ1Ý7•dòÁ’Ú,�qC‡¸Ô{éÃnoSí °:¢õÚÝ‚¦›lÓU²M b¶ê“Ç]4¤œöáhm�w±ÝCÞIÈâK\B÷øJ{ƒ|¿ŸÄý)Žn ŠP wLȉïL9aBéîQ' Ówy'ŸxB'»xaºÿëâ…õò8óFññÚàäÁ\_k˜¸.¾–k$�Ùž28³ ÖURû´é[Mæ|PÖdvÕ‰°?tÊÛàxf€&l†”M0.6Z“Ýv1‚ߺt>®üÐiNôàVfùi;¬²|"AB¾l| ê»ß¯h'ZŽ”\½ –%Õ4_¬ý±U=UÔ•·ë‰* É–Àf§µÒ>Àæ�%vH\•0¸•J—ø¶ÿ è£Åÿå7Êendstream endobj 218 0 obj 4163 endobj 222 0 obj <> stream xœí\Y“Åæyƒ1�3¶U÷¶#�±ÙB¬1¶@ iH\¿Þ™uteUW÷ôìÎ*$› BÌÎTבǗgõ³ ø†áéÿžœÜºo7< ßnøæ¯ã§Ç'ÏNxúƒ¥Ñ›Ûçð·¾<ó|sþõ O86hîýÆ*3±9rò¯íýÝ©ÜÞÃÞÅŸÿÞâ¿>|ÜíN¹ònð>þöøç?ç…EèNÌ1Xi0›ó‹81œg–™íW;5(Å…Ø~±ÓÛï` é!íöûÝ©†_”×á—v§j�Rù8ðÉîT ÆxçÒ Bªíó�œ³R’ïÈs?ÂäJ Zã)òHø’ÃWÖòÐW¸ 3h¥¶ç;§Á´ Ë~Y6õÝN ÖZI;dÉsiH&JEùÓL–Sî ólÖ3Rôïk)úÙγDÀ´«e§ãõö†|�d�ƒÒ‚ìQ=\h  ÃáȆ J:±ý‰®”ažÐêA‡üßä]ü´“ðÉ;qVímn OCvù´|\œ÷ôO¤qSáÐÏñO;p¦÷žˆ°ûr†\ók¦]v !/@—?>‡Æ8ïqOE7yì²”H®`8’;(wGµÄ¥˜‡ËÌ]8§1ÊDýúuRa¬-ç~²“l�BUôAÕ5†·*±‡¸–»JEO…ÔѤDã!…[á<¸èn:¥c £™Ê´ýnÇ ò§âX7x |Á¡pÆ;´Œc,‘—ƒ¼ÊKï{TäbS�&R{Y£A(DJJļ͈T’ÏÊk>íÃ)ô]”�ß Êót',< ÷gáçr\ÔZ•™ AÿÎäEÍöcøV"‹[nÂWé¼0qø5nÀk•`H`¾¬ãNŠÌF|äiY.ê8ãÛSØŒ”@P$7�B,‘pŸˆ¼W#W#­‚yàC˜õ µåý¬Bô£…_ÎÖê>8XÇÙÈCìZP]ÄØ>@:hüöW¢d`ßÀÒ�  RðPSiŸeÈUNþ´Ã~"kD—9 ÐÛK”á°/´ú矜ÿ¡K bµ¢�ž…g“¦ýãÑLWmxt/Ò`›¤”QM¯pðñ»ßF]ˆ¶¡';x,¦”u¢%ü¬I†žì�\ZoZðTÆ6à‰kИ$Z˜°:ÏqŠY‹ê¢€)Pueºø‰:ù‚jwR··ò¯}U16rUEÍêɬik„âOˆ))3a¹[98Ä_õÿÃò«ÚK<®¸scü憉U,_‚?ÿJÅS:sÞ2Z×Þ¶535§Z$òLp-©¿„á½Q"î_ÕN¾·Cëk´#1_ãÞ”Ft›pä‹ÚòW㯄ü~?¨b|Š>.M^2ô²D›Èe–θµùÁ‹¤@œuÑã097Awä"ÂŒÈFÖ[ð¥ÊD×jB+ز¸¼÷2{¦°8ó<Ü1JE`Ù# 4L�ÎÂ(ŸÖ øShØÿÁ’ñi!Ï÷Ńj¢þ*P�¾•UôÛB-òÔ‹Ö㬣J¢�•¦xÑ0ñ†›æköä-öl|’gÀ‡4¼úÑ]xV å—åht2‚h8%øâ Fué4Î@ìíEÉàq�8�µD›¾ë‰�R Å™ú ¼µ f�¸Rí0ìƒfJ-ˆKÆ•lƒ´^,E‚”š\£V4…1 û®•œxRŠ \7ótQk1¦™sÔŽÃqt•³ÁÚ5o~ªêÛË�„“;ÐÅŸñwˆ¼*`ŸGkÈîÓÍ)†K·ÌòZ¿ÆlT �Q�ܺòî&k‚q&¹‚�¾7fjÿ–<·«Aò=Ü�lJ%b–ÁðxZaD‘Ó¤ØFišž-\çy³—ô›÷Ö¨à,¶vÖÛ ›jÒDÍ8?X3&kW3¦r×!_JÒdòõà‚�ôÅÄH¢ˆô:HÀ¯‡7Ç¡ê:Äÿ²vûzÖôABøx4枈çÄå„g@È öÑ�èûèiñ&×2@¶~ØõxPEkÒ,Dko,†v.ŒgnYÊ�¥a®AÆu™B±_º¾;Ml¶6£v§/ŠuΧ(ãÕä¼D�¾<Žö­³ö/]ûšÁŠÉ®`ô-qâ*§»vì0ØÔ¶ã�DûÏ’ˆâd0¾(è”ÏD"V¤m^0h%ìõƒWRqR�©ÑOWú �žWé"¬VVnèáuíëH6ó“‚|…¶�j�MN:ó¾›WìÅ…sê4³”7L‰‚z²¹¨p<ÇlbŸôí�j¯ê_Çl1ñ¯kžGà¹{Cžà¸é•õ ËLJò2�wýÚ=y¦p_Og!ÔšE¿š>¬:ß8+J>¦N�›ƒØÞf«#åßÞ _SPôD,=èGqàLí9§£À°YÇt”À"-EØg¡_Lí!¼˜š—¸œ¡=‡Í��ä!” iøˆQøç ýšò“‰£RâcŠ] r ¡ë`6BÁË ˜‰LF”ÆDV’gëÅëBTÉö* [ð5TºãM¥»Sùëjø:ÎI+§]�ˆ•òÚTstMê¼2³-ô℺¸ëæ²{IÚ&%š±Pð`ëÂÇ;Ñ4nÃtBÙFdP ´$†±î—È!ñxZ_"?MŠB8ÿåN7© @7íÈZýK“5ýu÷„±‘�A¨ÆjÞ~A!=kkCµdò¯ ÿëB‘•ðÇ5¾]:—Ì£>X‚‡àÂV›>0éÝdæL@»g:ÎÔ¦mj REh¿5À�Æ,[¬�ꢉJƒ&òõÖÀÀ�Ì­²rµ)ø`Ÿ)°DÄj½VcóU×èP,xÙæèæÍA€±ÂHêÍËncT!R› \,æîëw;Jo¨ð=Ó0×WèxØõ”c›žþüÌ‘€_Xs0ð—õÌ$$$5Þ=é.S“©€ð÷P]^Õ§Î5#^^ƒÙ�» ¦ë¦„z _��˜Œ_ &ÇväIùv5BbÓ»k „7$'š‰™¾¼½ ‘²²PË–v¤œ¤ÿ�#ê&åãÝX¦Q)Žî�(æ íFåçP ‹iáWÉ�гG~îQ~¤ŒœÖ�Ž#@f^€òMèe¤Rb jzáÉžt'Geêñ¥šaÓ’žÓšÌP±œÙ8ñfÇy¹(Æå­ZÄ#"~Ò¸.Ÿ�ŸªKÁÑ*}�¤y-N7gïB>9Ç;1Õ+¥öóÀM#Í\¨ˆ�aÈÍuÓˆS>摕궇ù [y¥4ü±Uo×L¾-ãp)Gœ¬Yî&f•ß/ô80ɹOªéËî¾{Áµ»ï»ÈÁ—Ë ¹!\D†.„Ô3Øx%¦–plûÙëÄÔµû~µ˜z£u—©w^S¦.îûªLåcˆ¾†¯u¿|ÃØk]œ* Ì–]œ~-ª[¬ì>)gšâÐÀ�«wÌá/½­±§ÃQ3U9ÞÖc„OKn¹�¼ü…†Ý¹P©˜ÖO•u¡¤Ñí7O~´‚ÀU¬ùØ0E/Ïlîòqò¬ú^Ê(g£ÝëE,÷—½rWér¿Ýrþk)qÝ?â.ºW*ÙÈÜ™z¯Ê±P”ï)ß—ú ïIÇËÄ]ؘöj76¯•’fÍ%ý_q ŠÜÌ:¬ÊÆ ýžNd»µÀùФ:X'¸ÊS¡3{ö_·‡*«@Ì-Ýð%ÍóÄ,¡Ä¸0d a¥”ßOJ¨¼¥ÒéD«ŽN5E‘¼O�·‰w;qÉ£D.ˆ5&俢mî�‚@>]é§W6âþÙu—Û‹=U¶æbÒQ9«Ìtc,\§?ìN�Ä;Ã.Ãgá¢+Ж!ϦSª×4õpŒb„÷äîòoE©"—ÐÔÎlÓÏåˆ&£´…”öŒ`ODðq·ªn,ÄDg «x¯Í^âS$Úƒ R3T¹Ù[|<Ê~¤N�!O[vv Ñ¢%Úº¬Éxßvéõ øö ;#Ü�‰{Ñ™C] %VeœóÄ›Úh�›ÊeÞRú¥/?ƒ–º�¢½=…èõÝñ‚ ¦Îò•*2<ÂOŒhÏ�»HÓH¿÷næµåeu½*ç¿p…KHÀÁG»x!é:cÌ¢ñ�´R‡ w|ÆÐž¬qdâ¸tšr¼í•J,ïó|îæòÜÅË•á‘V…þA²ñÊ8×á4‘¤®ñ>N7Ë9-H|�‡ A¾ñÍ𥋪v¨byYH±ÐýYMEJ®vR¬0un ÅUÙà‡Å»õÖ{Þú®xíQ¯oÞš–bj}ï¤T yÝ?x¼÷Д6O�Ѻœ3}ÅÁD€Üºi˜ÕV§7� |¡ôÊßu_qS‹;RÜDßßq3n› ìñfŽÕUcG|ÎØù$`š—¼1¢N–O(ÍÔ£ªŠºÙ·zß§‘Rµµ(®Qíù÷n78C˜V`X�)‰Çww‚ kƒ1Ái\?õ”†þS#!´&žGWüµÙ7F¤Çqã MªwBLnU6¾Æ¨tó÷peÊeÂÌ±Ž À=¼~òÉɳ ˜ú؈à6ŽÁbX/ãð�U·ÏNn�ÝÝ<ÿáÅW'·þ¹á'·>Änßû üïì½Í'ïŸm>¹êû«BŒnâû«Â;rÆøÜàS‡^ƒºÆ;r$Ì À@z†«ßóCUTC-%ƒTbìvâáLÇïàA=ôö�œÏ_è]MíNÔFWÁZ§U¶’i¸Éðñ«'Z«Ò7˜#36]Ó ÛEÓ7¾i¦1æ½È�t‚uñ*·sBÒ}�aW÷.ª OèÁ¶UoCÌðˆUï;þsXzߙ߅ޱñ¾ãÏÅ\O£À\æjÕ¡| –i‹%�;Ý�Wxã�%Õ’Ø.2½/€a€ýW„T΀ c;ëq^¦–¢Ê‚ûÅë „Aq{'9 ÒÍ#LÂ=ƒïÀµšÆˆS€7ÑN&ãJ�öO=e3£ëWÚHŽIB0ç�9c âÃLÄRu÷D@§ÚÍvuö²º�ÄØÁlRç0†ÿŽ1-ÆÜy 1¦i±61Kw½—ÐI!¨wÿ‹àâI+M[îìÃõªKçm{¿ËK  „‘@ÛÑHêa2ŠDÊ # ”ÐãÇ1äúää¿â? ¤endstream endobj 223 0 obj 3927 endobj 227 0 obj <> stream xœí\Y�·Îó$?bgM‹÷! ÞCëMvG@œY’-Ã’|HŠaäϧŠÍnVw³§�éYmCÀŠË)’EÖW'9ûóš|Íð_üÿå»Õý§vý݇Uè]óõ«Ÿ×J9~ݩ­�ð³nmµs8æäruÿòzýñ—O¯W÷ÿ¹æ«û_â�“ǧðßåÙú«óËõ“zο­~^ñø ‹ë®On`in×¾ðFµ¾ùvÅ#½3…‘VT¶ððɻտ6�·ÜÞl^lwºpžiµù%4³±Óy/7ï¶¢Âj³y½Ýqh*f6·²PÊXN;«áÌýû毫ó›ÕÜ|÷εYs©aîÝ9üüÞûwìr[æÒ¢µa8}›«Ð´v|™zŸmwVØÂX1Lû8Kû(Ñž—MËüæ¦Mò´ghO�–k�¬¦´Ï&Ì›§=�@û(K{‘š_4yèòÛ¥ÅfÍCƒöºO<±� >O�[Š6À³C–¡�°_|ÞÏÉ/6I!½C»§è¾m¦èþ<¹´1+P—¦˜„Õ< šæjÚ¼z¡áŽÝ†¦A®Á£¦Ýd££«¬ö,EÛFc*Û.D‘»ø¼Ÿ“ß–Fth¶�G»_ÓÆ¬Ð§i)xœ«lóJšàTÍ-Ÿ´ç…©k'èÚHÚ€±íù¸Ýá‡^zÈBƒå›ïÒø²“+‡_o‘ g�”“÷'¯py %efR2è-Ò2ðízóS5ž|Ç[©›Æoâx¡¤"L}$¤ VëÞ[UX/œGá–zðÌs<ø‡“0kØH¹ºú—ˆ$‰�$I2 ûòüQÍD'rßb„Â*wsŽ_ RJƒþ€M­­á‹CÎY)7ßÃn¬µø#Ø¡1Îâw‘t¤pJ'Š·(2àÑ@Öá¯ß¯øõ íÉ”oð Hy¯¤�€BUó[£ÒŒï%áp"%ß|J¾+—1 ;ßâ4J¡¹'d¢—pÐJ Of“Õ¤[øÏVƒTŒpaËo+ªOÙ �•qÄ!ˆK*Ñ¿uvHó81jþ÷u+rl¹£k”"2‚!bqŒÖ~AÛG`ìOZ`^ÀZžKŠ*|PÍŸGY$Þq|G™´‘V0Æy^°!Ï}�qþŽÄBp ºÈ€Ëñq¤ž 'Ñö•´¯k¹ŒÂ!â$á0+Dðé ŽÔÿ±)Â9<ü&Y€e†Ê–ð‘˜{•är�l§{–hñ(v†.y’<{’Šw%íÛtàWróëmÓ’ì$J òæ`§w@©´0á8òŠ“vžÝ0¾-Æ$(•ÐËÍab…vÉ9 ì|Twf7¤š¨!>ɃŒ’*hb„Œ|±�Ÿ*}è ê! ÛB]´X¨¬��` <ü¦©ãÑt !1ÂrÒM!,ñ)͇CÐÂCüg™›¢×ÁÚê2V2z>ÊJV³{u± /Vûèæ®k•9…‰§z¸¯¶žQ#©¼H[ÁþoJF hÍ|es¡™µÞ/¢Õ[Ë€£W¹½¦� ¥«xˆ‚È:¼4ƒÝÒƒŽ„@'ÇÆjõv ¯WÉÕUÞZI´ÏÀ¤yíJ؈@ "`BË ó¸WËMu>"|9ú­ÊAß/«¾Ö0âÖêa/£[S�F±G+µô|a>ô|LUZÒ_ÖP±2ùJVZ‚�ÆdW�HZ›Î{&Õ LŒ›¦Ï.Uô=äx5¸›² è"Íœä†Ýæ7[ˆÒµbró Ã`;Ä]Ãç`{´l+ܯx2pþž§1¼·¡>ÅÙOM%#hh€±Ä<½i}t˜¢­ZÉuWsi U‡ `/Óhb~*]©’†† M§Q¯po?(iÁ{Lââ¨w•ð1ú±*½TRã[ûã6$ ‚Û¼ñM�Y§×4¾ÞGP™HB%È>ç8¡+!ﺡF0½b.€èëM ‚œ„7ÿ—ĆVÚ‘�íkœÖÒE¢ˆÊh�%ÄÕAs €±–I6òK[£j#Á,”Eb?kF³¥]â×Ûšdl°ÍËooÞ†¦È;©)B»®¦%BîÐg¿aËÁ~_Àç–û²6Ñ1¤‰‘2ŸàÎVu5×XÒ€•ðO–üw«Ë²Œ(÷G✊9¢„)ì3ü9÷>Âå×x…€I±Í{ \#ͲÏ]`µ\›L ô.(‰…ýV¢ïñå€RoyP›ÚÀ“À¹ò&ÚQÛÒÌ{IüMH4,•µø�È„0>,æP»<Ù¶|=(�„ˆIP6º%:N“ƒ†óK!YÈ™­ã¬F0†íx@¦C(‰å Ár#ÚÕt+ŸÕvŠ# íu�»ž§„öto ß1.©ânü»=‰›ÍÌ;zW©€1£Ò’¡|!›¶�ܰÅR�Å%8ÓS’¿¼M5á‹k‡ŒMÈRzN9Ôªº§,Ò)—Ï Nsê·¤jÒ‚7J!u�IŒ nò,KÃ.I.C¬N±?¦ÃÚ´Q€j_»å¨Îîr–ÛŒÒ+ÔsOõÊêKh±£z’Ó|UxjF;¡’÷`_pÁM”ÔÕêæÏmYÝɤ0ïI™°a8 kÖÕ0ÁW=Ž´t ã�ÒoŒ6ì04UÇøÒ-7ÝjÀQ¿DÞEpþ¢LV*Kž軦MoI/ëH]'—át’k¥Ì¤]+Åhð‰ GC¯|#¾¬ËiLë~i¦ø;6šˆÛ”µÒ»iœýi?Ò8›ið;it*G7sÃŒKÄ þÅÉÚC€Vä�;Vâi=Æe®ªµÂ¯ýp–�«¤ñÌà ÇF9‡s·£œšÕÜ…SÆSw‚œ/åZäf!Q’[¥¬¤VDÆ£6ÊIoRRܱ¨åuا Åõœ;½íN{¯@myeÔ¼=8E=$ �i¨ÃÏEôŸ ¹iŸz.°Q�!!×È?–~Ø»Á nßáô$üwØ ï¿³ÿÝ /â†oþþ�ÐÕKÁä^óY#ñ(Oë^:­Ç©ùŒžfl�î}i¡yóèj™W}³]mÌí=,oíËݪ_ÉÇ_rüŒód[æCôCÖÎÓ5ųHx�ºƒ>ºy/T>ôáÖP`æ�ìg\yµ/2�-ßzô©Œ1¥Ê J Ìïü›ÏA ‚RòÁ%È»Æò¶‚ûÇf/+Fi\˜Þ6îy�Èv#Æ\ßEŠ«¾©)«�·€ºX&:xrð–,ð 'Ðvz� ¸*ó&c^`Ù~Ä^Ÿ,ÄU¾¾t“é·©›õCû'«ÿ?ÃQÚendstream endobj 228 0 obj 3578 endobj 232 0 obj <> stream xœí\é�ݶÿ¾È±ß+üTÞ¤´@ì:AZ7±ãm é{�8i|åpÒ¤ÿ|gHQJ£ãë]·Æ»Z‰â1œùÍI}.y.ð§û{ùüì÷Ÿûó§?žÅ»çòü/ýÕwgߟÉîѵ>¿}/HwšV´òüâë3Ùµ—Î6îÜß(u~ñü웋íN7>H¡7ßlw¶1Æ ·ù îJÓX+7—[íc­ÍÏMk7/·vóíV5Þ{ - ÜVÚÀkÝÕ?/þçè$¬i‚nLäâ ŒüWY)7w·;Õ´m.Moæh Hâ„Êü^óV¢7^Óú ³y“|]æüãv'aEÞ©2O¼©�j¬s›Ÿ¶º ÁkMŠ}ü„�ûF´-߉¥l$Öz7�ñ5.éÚ§ô,“°B »ùy t‚I†Ø¸oñšé™¥²t²Q‹DÆK£Ã•U’¡²*Tþ%±�’¦ãƒÖšn²é HLã>†Ë ¤\O¨LkÛQä»­Ž«”Ýܼ҄HËõ2lšÜ+»\Ø>Ù8s¾“mÊš7Ÿá¯‡ðËaãvó þ�¿¸%Ûˆ¸dŽ® Ý8g\&¶Tj¼÷((/‘:MœÆ½GêU鎣¤ü€OLŒF¸<ÇvÎyg6¯Êþ¾.k/cöÒö¢4|ŠýN0.aÊò&ÓЦUŒ`´Á’¦;¸ÒZiE_*<ý”.å ’‹«'‚Vú+¯’•¾ßõÀ3²O|xqïìâwÃ]Ýä¶ ðÏ[D¢&sJ/<©ñ�PèqÙ‘^ 3�½¾ˆ´)ä#/âí´ –�r@yÎn(rZˆL¦°]êk¤ºFéÚü ^‘2ŽtDx…\öû†à§a«LÂJÒ$ó²j;Q�ºÈfø[ó¢é@2dÛ‚l›œlî·‹jzA­˜n„C(*@Z]&¨jÛHß´pmu–á"ð†²i†lª•Ø×Ú%X"Çê¦]o< ÙÄÆ—Áj`-;Õ�¥¼ßÄ Ç5 V‹-�«\f´X€(í¤ ¤®ÈºY„®àñÆÎxB®zƒ:ù@ò/FUoùÁ‹Šäܱ€k ¸zjÚ?2:ÕIq].åf†Æ82†ý[3óÉA±U!(WΗR0è]¥”“õžñHÚºr´@aµ°yqÁNÅM#lÓcká" ÒÒg/T·}È+;vß’™åúÂèF%ñžÞ+�E}Vo¾ÜÌ¥¬XF†©ÐP]Éè}ʹüåæ­þ& ”àAyçÎÂ;xçãþæ‡åæl†S ¬™ÍËür ¯é”{¡åªcv¯b•ã�¬Y·ŽÉß|…u§)ªC¡ÃÿMŸ#§çÞh‰JðÓ[7p½9?k†‹0½èVs`­„‘Fç8pìÄîèÑa%ØÒ¼°yä–(³X2¨À(ÌѳÓ`÷¢?u3°[»d¢Ætà‘¸º¥>¨­}N[N„e@¬ÌJ‡DíS!ðN #í§� ºª®�@w/aEZiÅx¯rØ¢ôA!SªIGüeU8þº¼ÍÕ¨g±sQ¨ûâþŸKB <.Â@¨'×DÔ®o˜Çê Z+†EêÔ˜]¨„{Ž‹ðx–£¶ê‚‹ ød–Á¿ûOeð§ÁðoÙt <&ˆ4¹‰#¶¬ã®uˆµ´&«z��ó¼ç7“AÖnë˜îÑPàWù>;W#÷l2èÊ�@í}°ŠÀÒ ŸŸ¨þeãøA™MçɈ \D_ï„_©­ã `Ÿ¨|—ë¢~ß;dbœ^Lm‡¹âi3Û¦�ýc“m41²y·  W0·:vrÝcx+Ó�;B4eÿ*ßzbÅ[–'ybûh¬…‚ ð®;›Í¶ÓQ•ƒ¼È±[íè”KYç\¹E¿ª~0 ÷A®±M%>5!×q¢¿&|·ùµåȿ”æS´ä­Ì¹ Ö´-"u“¢Ž±*¥ÎtG ¹ [-aì½£�éªë�Ø6C9>¯¼©TeWá Y© gD:ŸùŸ˜X"JÙryã«Ê§´T×Ä­`ÖìÓÅ{Óç¯M´Ȉü)ľ;ô Ÿ4µ6ÕX 2·³¦{£ÓôÆP©hzdÀÞAÎÅ2� ¶áÎíY9�Àpõ)C#Ñç°Q«Ã…$”}qçŠ� 3X'רô9AÒ….ç$ö¨É©N _+ù±HnªÔ JwrnÏÊE‡J-‡J––ss°48ŒN Ö1,)á€L1öê¢Ú�…¥Åœa©$ÛÑsa«ÖLã)ôì0Y2–xÎc˜¨“Ì£—öîeØáÚ�+‰ß #Ðy61T\sܾe@¸³Æ,ÕLr½^–4R}.‘ÀÜDi úuJ�€vgmær̾áτբ3×:è+³û ¦ ÑY•/Êø„ÕQÉ™ØB?|P�¥ Ôvç¼(•àåt˜iALú[ ;‹þFŠ¥šV] ÖŽu¸r0z^ô¸@ájŒ©l&’‚Hf?•°‡{å°T¬eÜ«bŽ"Hf#õá’mË¿véµOKÛñg†&H‹7ãðÛa~R�UÓ\íNä±>ļ3"ïH_‹z7öwW¯w¥WM×½&ꦫ{‡V!¬­EEµL•�‘+6xb¢ª =¶Õˆ+k£” ö>£+`"~Ýq“¨®ºül`ÓF¿pïmõìï¨õ�4í…Öžªit9ê½|» E™Xu˜–ãÀÍ Qß@ M0}°`\kdúZ ‰àΧŒÙ$ú9‘J»©XoqXvyN5¾¬Õ³©¦»âA(ÏRB°sÌÖ„üÑ,»›*¤~ÛëÂ>a4í è}N(3ñ-â‡3lŠ©Ç9�¬uFòâ¿ ¾ —/Üá4ÿ�ÒHÊyO}–ìþT>ÑNÃ~‚;°Ç·’È]òòæ =춘ÉAvóì7J2˜¥é�å/z>"�1ýbI­¾íHƒ2"¥NKlca¶Ë 0�n[aÔ¬ŸÚEhZh‚•'9Ürcìª,{xÜVŸÔH™ˆ{G r¡ÑËmE˜¬Æe‘åøÒÀ.©š˜9àÚøíÊI‘lÓ7×6¨,ÇMÚ¸+F(Éõþ»rƒè—g'�;>iŽ};SÅÆ&cye…‡‚^oÉ'Ï£†q%ª‡°êmZškjÉðð$=BŠÐ>9†h‡.  §èSêPlm Ï‚¨Æâ Ú$ËœÊC"& 7÷öÍ·ÜLû¦�Ô²ˆOгl;¤ëú½ ð;‰ ³ ü>ºvðë !Æàg0{h¦ SPH²}ÀÏTöƤ 1{œÄª‹x§‹KŒÆ6{å(#¢‡d䌥2ãÓe’@óKµ~ælÀÖ´lLëÈLL0i{\rIŒ‹@ߢÜRÿ%ÍB|FI¦¢É+²À\õ±B·�w¥¸ïÀ�ˆºSÞÅ¢¼ ðfö%‡zN‚,¹øpdA8ïuæÐB®Í;�;§À:†Àɸ …D¹çs§ÊUE0hÑàW�`í"¤ÄgV#J¬Vô–·ï2p´ŠX/³Q.ð+Gå‰#> stream xœí][“µN^·¨ü†yœI1�îRyÀ—u¼Ë¯‰«’<€ „cˆ1TòësŽÔ’ŽºÕ==³³¶—¢¨ZÚÝÒÑ‘tô�O·3?®XÇW ÿëÿÿìÅÉŸÙÕ7¯NÂÛ_}’Ÿþ}òã ïÿÁúÔ«;W��[¯:Ï<_]}}Âû Žuš{¿²ÊtF¬®^œüm}µÙÊõ§øç!þy˜�÷ëÏðßgðçW™T¤Ós wfuõ<ÈqªL‰õË�^·�µV®¿Ú¨N).Äú?›­ê¤T^¬¿€ßo¶¾fÖÏB!¤†Òe§µ_½ÙŠðÝ��[x†ù×?md眕rýÏ(Cy�9…�¶ëÁA§|(蛘˶Üв1~ý6)Û“\vªVáuÉA2Å‹NYØË(LxÞ)É©© žIßÖí…"¿ß -!-þ'TÎtBîl„gi¡J¥ï–» R,ÉkÕkÏ8dK=\Y�°®S`7}÷nÑ(œ3h,éña|TÒ¡áôo[æ"tçÑòzi†Ä ]@EXl"ïLQçuQûv¨ÖÖˆ¾y I|góXX 4¬Xmy0Ki¶Êþ šQ˜ŽƒíMµ£”¦Óªê£Ò5Ä0ˆª˜&Û==À™^ÿ¼Ñªå]HœS¼®ËƒÒš¯ÿ¾Î �ª�Fˆ²¡‹û§£Ý~ÙP"×C­=$ùû¦(õ <¢x^lï»òé { ~ ž”&Hã ]“Vâÿ½‘!#¯¬7«Óõb›F¶M@²åP+ÁdìºSÄžó@ë‹CQ Ì*í= Â_6ÂG�ªqIJ–šVöeݯ¤:`�»¿�QAÏ”Y) ¨Ýúæ4ÆUšÿû¼ØH=Nuy�b †Æ¡à3ÔY.²Ó$­Ûl­ëtº*–Ô×UXN`æ¶—‡Z«f ˜„ŒuÒFµhmRÕ˜ý�K Àøì@Žç}�¥'%ô é¤h[i*¢˜`›÷ñÏcüZ‚1ΛŸ$d,(ÿ„1€€»Æg®ãˆn ºÌ;HxŠEÞË<¼¾ã&îéuñΤ Ô,ë”AÒ–¡T9ÓÞº$xmô•˜dŠÅ ~(V¶ÝàhR¤<Þ±ÿ#P˜žþ„] n‘ÙiœwŽ&v+1 œ< z�Þ¦é!^a›–šäÜ4 !É:ో‰OM…Ô#¹ˆ#E–‘œZÚñ9ÔýØë‡™tzèã¿—;ݘ‹ãÎ0[h�*zOç8“{yº�Û‘¶G#!°M –T£eÚÏ÷w…&²¥PÙû ZÖ¡a`†}‡øåFBǪžáXh_'g É­z@>ðýàÞdÃñ¼JL²E1ŠÜ8QÚ¦ÆÒuÏíÁ€»÷î[ËŠQÊãÁf €Ñ…^}ß-÷ÊMŒ(DR“‚H:ÔzÓœº×÷‚*@¼ˆÉäa0—8Î^BBŒ%4†¥34-ü¢@€4•ýGM™] ™ì”±KF,FGlT*Òè(¨ör£ÔÒg˜¢º5ŒâY b{#‚i–ð•Ô €úúSp=ÙßA‰ã¢¾×y"S žL�>šåipf°‡º@%� ¾û£=8é¸sho'Ó�AÒP‡ƒv,‚·§;#’Wl®Áv¬çç˜_Ã`³eYÇ1ùxŽÉ7ºÏàXí«Yé‡t¦IeJ¤“,ièw$åÂ?#J‡E˜œ”C S*¿Il'èÇ:·’@<übâß¡ /}J/hz€ßKUÐÄ Ù$8¯ßVrœöNòˆÓAn*W1ݺë×âP¦{oƒR�vÔï |ùp6† ø0nÎ;Æ%M9íJj÷Õr¥\2ÀmÕ ë\=þhMešÓÄ]䤌Ñje‰j¥ ºjöߪÎ;K뻯_Ž½Õ �,ïù2ê/†@oxÃsÆ<Ñ â¿“ýï·þ5G½ÜÚ'6Lrñ§×¾@úü^ Âï'¸ þ8Q›_àR×ZàÂ54¾×ÂÁÄLŠV-s©ØÔ‡®3? óœØiäÅQe¸SÍÕ/;˜ á ŠØs—Ķ�Kx((À��ðtky(ÜÝ-B½�§5'ïÏÜn´T„ _ÒS>œÂ+ì)1i±*ð}ä)|qÄ; OΞídM>¤÷Áe‚á�M�î=z\8³ÔN1Ùqa'©]j¶kP»P$¿>µóa¤Ï1»`ï`é �'1ÓaLŠ'&Ð3é`d˜w–TÁ¤E÷ë‡ÖÛf³«£À La¡ïª¥„?ZR fr¿KÙàY´6=&GR›@›&ÝšvÁÚ¿œD¨ÑôØ )q<�“À^¤h»Úg-4üª ²(Q­yBæ×<û¶8ÖtN¼L(YfÚT»V=…K`Ø�…E½W×Û”�P ¹Eû�³^‹�³ÐkíìƒÁ¦D¡KÇ›2;¨¦FÖj‚Ü ‹Â†õ�‡E!w’/}(*ž¡=:ç==éÐîNYµèeÞNºŸv>—î)}ˆmŒ¤Ã¥_7]eAoºÀ$ö4“ÑHL˜ìxòHuß*œ WrÀ§r ºÚܯÿmI‡ýÊfí Ì’Š ö½æÂÚ„Ø F!„Ÿd]7€½æbìջƽ®iô1Ô‡§qðÎ g½Å·ù«³t‰'ªh…v‚Ò߉ª‚ñ­"ïŽ8”Èâ @ í­½1"kQ³mUÊ1¸ì3æ-€YÀhda_`ÕÕ”,ëyFö²cû~é½Ëòø8’ŸÎg»Tƒ^5+ÑøªoŒÔ²¹Š78ì¡`b;8íámgtXÕïŽdm*)£jbkR9Sz±lOU3Æ"Ø×Q1<(79c÷qW�8âŽR›{UÕ sá@Í“"š­Úd®)b.€píXè� 'Ûb¸ø8à’=®k½c�0CbÓL¥¤€r–ØöÑ�~[ÿšÇ&PÛ‹yÔöüÚ¨�'޲¼X»”/ïÛÒ Õ`Ã,iakåÁ&G¿°Ù,`ËèêŇ2œ ¶NñOYóÏÔ*çMfñt×:˜ ØØÃî®ÀÄZ;øz;<ÆÙ ä7¶>t€[uKvڊ܆hwK÷Šú¸ôÊRÏ4 {oi]êþÕÉ£“W 0´[C�Q°s+p$�ú<{qrçì䃳óÕOÿyýÕÉ]ñ“þ‚î\Þ…ÿ�Ý[ýîäþÙêÑÌé÷•‡¡ €ª‘Ãï\â|ez�=ijïŸo:Õˆj[X6ë¬gÀ:À1„cM¸:¡"Óè+‚ʇZ�{–Ü(LŽõPøÿcÔÃ5+b9\.×*Vä›w̆}oÊÁ…ÖjÆÕtx*êÉP¾ÅòŒÃã5ÓÕ¼_d<*oV2Õlg¹¨²ìÂ&©Ø±°©=¦ãÌR�+²ý˜>/ãﬨ}•ß¶�ˆkSp�é›À!¢³/:³¢3«Þr p ˜ª‡ è£�g{¥UH%ïuØ‘–ÃD†áDxwZò–3˜,1¹L��VïØ« ʸq®`¾ã6íß&ÅöÈWyx:qªÓÂ%1»Ó’ïóåfÇaZõ&ÌWÁ3»[ov*oH¶-ïÁrËcÖææ-§¶Æìay}—ÈýºÄ|3¿wOrîô Û£0:€4ï©Yʶgi½iŽr͛椎óÙó�iP¿ZÀñiéØñ oŸV"æ¬U:ã�e­mcx¶EZ°¢ÞXy™ä°üç‹‚¯ è-�îÏ�²¸laÒJ˜<3ήMzÊóLR6´y8‘s…Bœí‹óœë=Š“rwq*ÀÈA%"îì]¢ŽløW]ÇÛÔ‰•(ã¢LUrÝòàiª†Ø7\då²Â…Ű’æ;‘op'”út4sÚ»l8Ÿ}sØÐ¥ ’  Kúv“Ù2� ‹yžã[­lÂ’eÞ×[vÜÅí¥mUÒŒñ.×SyµXÏ�掷KpEö�×Óçeìw[ÏÛÒž·È>ÕmÐÓÆëE-=ÛP>V4úã±¢\¢è„¿™kÐ¥ŠNµèµz)O™,÷R§Ë½”Öî x)…šî¥Ìµ<”Zˆ»©Õ2ýöQ»ôKHúnêW<Ò»©ßÛo?qÛíO½Ëú�³`â0åm̵\,ô4)ØjÁ·ïaî,÷0Š©ݲŽF]ÃÃü6º]¼ý·yÐMy¡·­çoó #σ–z§_á<èÁr/%Ôͬ²•Ǩ™þÍ΃–ާ7Ëî–NÎѪE鎡•ÇÃο²¶:\+·K«·2ëz7Ûj^+Ï?¿ù ÂA�uó«J­‡Î$óx|ü¸-á 訵 ¸-n¬¯„óùiˆé´Ààc[Ñ h0< y•ád¬·‚éþ<0žïóxÐ ¥Ä+/²Y3*³%ò áÔ–3!èHÒ†ªD4ɹK1¯6ª³^ùæMÍ-7áúìõùŒùU¹Ä>ˆ§lYG=¾ˆ‘�È-s^ƒÄŽ5Õ•âÖíŸê¾\‰®�aÊÇ ô:ÓÃt'up] ï4É’$~8k]n"§ÉßÏ//óS \ŠÉŸÇ'Ðë[T%û¸ðKR¸6£™¬ËN /òçæ¥ Zvˆ: ¨æ­8œW9áã¶â©À|í–Þ´¼GÚ8É™Pœ”�RÞ«š¿4: v0•mƒz玿›%>©únp‡ ¯j\䤤wGz@ÒÖHQ!èì8¨`¾NõãfË:Á½¬.Ì–‹'�j}nò§ÓVžšI‡üÕÕÚ›ü}ÒòêïWÎm”§É$w´rè0îÁ¦!ÐMèNYVå\~Ì«›�Nþ�MûHendstream endobj 238 0 obj 4581 endobj 244 0 obj <> stream xœÕÉ’ÇUç ý}ìvhŠÜGøƒŒÇx€"BÒa`Àb „þv¿—Y™ù²*«—¡z‡Ã£¢:+——oßÞ.XÇ ÿ×ÿ÷üåÁµ{vqñî ¼]ðÅwùé׃·¼ÿëG/nœÂÜ›Î3ϧOx?Þ±NsïVÙNˆÅé˃Ÿ–Ç«CÞ9Ï4_>]ŠN)­å/§ÿ “¸jÖ)éÌtú8~(—7ñÏ·øçüéã<}K?ºó¸pÿéßq¬˜öB}$à°oÊ÷oÊÛá½VýÕãSžó1ÎÉáybÊGeÊ4Â8Š\øK<—†/Ë ¯ÊÏy±w+D‰C®]ÇÔâ�K8!fÀ„"èùl7æ�vËßW2 «E(^Ãx1 Åð»Ò‰(oÃ>_$|ϯWÒ-?lpœ�)éå~nØ¥ÈOÂ…H蚆·ˆ ñ‡\ãßú!Á;�TpúýÁé_Z^_ JºmÄ«×�ˆ§ï�T<] ß ¦àÿ! Œ ÷&’’ä²|Ž{pºcŽñŒäÀµ�¯â=Ü/ çC]Löë2öœB�“ �W¬æÛÓƒ»oÀžáe`öü¦d ˆq(Kn\;¾½xÿÛ‡'×~\ðƒkÿÄ?7NŽà?Ç7_|{¼¸»F®¸u‚Å8@)Ë” ÀÙ°yåÅñ/O@d�‰à»³ªxóË•D‚5¶æh VpéRH¸v�XÐ ò€ùZ�œnÈ•2ðñ=aý» sê‘()å%Èïo#–Hë Å7œ¸!.^$ÀQïpF`[JQZÀ_ã¡Ê\:+ð+Y—¼~Ý“½èi3pêzÅtœŽÐÒèr3fsßõÜå;¼Äë—½Ô¨k8ï+2x<”Ÿx£Àœ©ÐçU¯}šm�’�\ïM}äÊ—q` ˆf`f=Ë3l ä…þ6ßìÎÀ}ˆÀüy‰ñÀ¿W°' H о·´‘¢& aCš0-ÊL§ l²Æà'‘•kCµ ×qʦ‹!ËVò„@z@EdŒÉàû÷¶à{°ò¬Ç�ñF‰˜Ü=_GvcP™vbùŸ‚q…¡¬Å²(Ë�Œ²\GiÄ ˜"]íðOÛq6­m‚K'""<ˆVF0£ykôý¬È>\gF 4þõ¸€pÐŽ(*TÌëKâÃ:;ÁðÊÐú.›×ך³ép…QÈÁÒ%q6¹+¶ðªÏÆ6®Íp- Aµ[[±ò­qïÉr¯UopDv>¯—¢Ü^x  m‚÷Ìü Ø]ÿÏæ*Ó{@"X^,ò‚I‚H×'±‰‰KH¶Y°‰E[)aSp¹Ëp;kúíí…Ûq”¢{ýæ5ú,š]ŠE¢ J¨™¼ß\}Ñ·ÂF$`eó9 $Û´<{´ÐÿP ÅÉ@F’Ñ/ñ ½¶Cpntg\ÔŸ<Â_®’!�ÁV‚;ÃY@Ptfánu;^EŒñvI¢[$ãe6Z]C«.ÙX|ëM³1Ò¡©ê×Ëi,òd© øËatf5¯¾¡šNR9½æÊš<‹cÌ ˆÌµŠÀúxxV ˜[~½ä2^ ÌƒÏp³ÜÁu"Äxç‘Ó¦Ï8ؾhŸwÜ( —Ánuy÷4Ò6—=y'=Þ¦GQ,ñ éª]ÅÏ¥K#�µiuQ6­0ìWy9a¿”Vmï=` ñ²‘ˆœ@iƒ(×_(:Êž5¤È;´Âd°GY”-Åí5�˜Êº°ÒÇìž{‚³ºàs&tRfíñPi—øf¡¥C¥"nO!³Ò6˜V£™‰KˆD�ÙeË rb‡ƒë¤H�MݳZ ‹Mä§ÊØpøG™‚>áK<òFŒ76œ32k87Ü*’Ñ<BÈx�ñED lÜd1M ‚»¨©ç{ ÕÒ¤v°”€³FuZ¢!ß—Çãøˆl÷~.Y$q�+ᡊ/ •�Ÿ—ÙÂý/´…“ù¡8ÌE " ïÁ=D×®+ñÐM]s¼Ö„¶‹ü�píÓ¬Û†`âiV¸ª…ö|¢›�ßÜË ã†aåøòf…¯W¾üÑ—=ýÑ•�þþàïùô›–¿ÒÓ§Ç£ùÕxcnœ¶€¼òh~v½ëî\%n•Çëe 7÷&1z‘”ÄÌüŠëâæL"Ã$]ãhN‘J·SÚˉnç…ÎÏ6FçÑmÉ?¹=ÿò£ÓÆ•¯¸Ûbä{>}sùï/µ| 3G#¯-sèC´ PÐòCC5ì"Tȉšý¨`vMÄ}’g )¨ &;^ˆFNlýA–̤{¨•œ2˜`Á&æ>gœð*í&ÍWføºø”ÎÓÀíV >#v»°~À~H Ýh> ÙÕ™CÛ†Cë\œc�½cJI Õð}'”Õ»l‡5`'&#÷I ��×ÒûgÑ– >»K,?�B‚ni"7,òeO2ÿé'–oê§óŸ~øwFz>6¥Ïµœ‡H+Œ·°'=è3¶0†÷°~ {PËÛþƒ“Ú>Ú‡ÿ ;%²µ½'ÿÁäB{>Ѿ-è“w¾: zÃò{P'–¯-§+2à·_~ÏÀo.u¨76[þƒ=ï„WÞmyåÃùyåôÆîmÜÂí«ÜBmíÑ…1á?8É|ïnv>oÃɱJ�Ç�X¥òÒŸm»©õc°G¨�¼Õ #õC�U4Ò2쑬U‘–о|Gƒcc¤Žþ(ì j"€ùØ­+†ˆë¹¡‰¸6�?¬íü7âÃÀÕÆÌé0ÂHC;jä*ãWЇ\�°ð~ A)á\dzG¡™±�Òö™Z«�[ÙƒXG,§Fñk<‘nМðw’¤]ÞóœdUôáü€Â‚“UIåGÎÆ¨“'$7!°]i^oŠ <0@§¯ ž¤,¤4†Äh# GÙR£HfZši U1c²LUUk`Æ¿PrœñŸ#²Êø‡÷!Iäù˜.›þ”­Óó{LšÌ]õ"GEïdQv\Y<ÓB“HöÓ7¥Ìjj2&YÌ5ÓT·La|�g&²)âqª«/J‰™oáìAÒØBæNuÌ‘kHÀ'¥u²$Ûå"Èæž�}j�ö"�𘻤’ Ý^Zº?YÇ2q?5û#YVU%Ñ0[O+—r8£î¤ÖÍÔ)Í;ÑǤ[ ³Cܘ<ȵܚ™7Û¥Rtfv.ñVrJåYŸ%¡+È>“SÌÆEöršâŽÛƒ7~´Ü ©À(ª4üª9v¨à›+Ç6É�>ùã’–ù°ƒA_@Z»Àó$Y9VmSç²;ÓbgM§Õ VG‡ž:}ù­éix¨vËÙ´Úw-Ëþ¨FÛ[öU�H`¦‘ð\»ŽSË‚ w¯Ժи×ZîÍâ÷íLoºo&’TOrwª|`‚¹™|4‰yÄ{‰Mz¬ ŽfêÏΊi)zeÚ–Á=J\ê]àé÷äâø^_qDå©S;ÂC éæeö{�Ë»ˆÜuáYug–‹Ã¡uEa™,R)Š4T§±ùÞ*zœ.F¦b—Ü¿¡¦°Ôt©®jm�ì•éôpýQ[œ¸�þ\1˪[-G“åËbÔY41;êd%qS Tí/~Þ¸ÿ—Ñ„1.T`G%ÄY”m° t¢_Šªtåv©ÕÄNm¿g‘[[×Á  åá#k)y´õ_ŒÂ€ WN#!ÒÛ`A?ÌÈ~_"*²ýDâ J ÄZíV9„Ö*ã¤vŽŒø�r�aòÑoа¶¡¼ÿ¢ª¬MÎå.¬Ö®¶JŸ0ä¶èé…e­“Óô5¨R¤ÆSÔ’ Z¡ÙÚ?4½6$<8*àU&Èp³*õ”è‡Ý‡Ÿž6rîì›Ð‘¨N L%ª†UŽš‘�_EîJåkÛ8jI‰V@³]³Ï'»15É©Ù2®ÁFÊVh¥=W±UÞØ hŇ£²WúB•BÖDŸÔàì5«¶o±®¦“º¯¦›J m¸øë@\è5* &úé£Z9h õÇ +k$­\~S�ýjÉ:(oéßÞ-’ °+Êz!'ÇPk“ç—j­Y)UDŽKØ`­�4ÒyyÔ»oe7{¼dí͸õ›¬'ÍhZyåIΪGáã�J,žª [AõÈšGnÆŸ @"Ž£½N-Iï‘-rƒnŸ�MBŸHÅïû(T]øhƒ…A?M·Õb¼Jhë’òûK‹¿Q´Dª¡Bžx¨ ‹hû ¬Ä¦"ýí}ÌØú±ÜyÙ•—çùå»ò²Ë/ËÏgåçwë'ú3?]+?ÿ7¿|Q^~È/mÍ~–Ÿ^•Ÿ¯å—ïWáXìX6:Ä{²K‡�)U¨Ñ ?§Ç—a"¯ÉÖÚö¥+ê‚K „›öú´%¤)]°ñsÁ¢ËÄt‰j�aÏ…ÒZ×&7ðu^üdYù!rEn\¹àŸ—v~ §‘ˆ–�²£\¦ðnÚïZ- ~¦Ž¤dsC*�¦º!P2—üj5l>L‡ºÐÿ#_'_éÖ„®Ë‘·¿ §s¬^ºj(òGèÄ`,i^µ$³€Ž‘™‹�Fð4Á#>z¾b�tž ÛÚKÊâ«>íj]—8$òKac´jâÌØ–ˆ|´Û¹ŸÃÍâ%GÝðU`c·™ÑíÀÆ`Mß‘Ž$7�ôfm+Ä»¾Ca³e2)‚"9Ž;l?zqTÊ9ùç IpªðY=_~ßèHšò˶(ã½ ”¾…÷!p„±•=‘ª6íaõY!ßèu±NÞ)§M‹Ð¹Õ½¸âB¡½‰YJ˜Ÿåÿ*ëCKã2ýçö€ MB¬hÈúì¯ì!°�� p5d‘R;ŸFß°f]è[7�àÚ“N㺬16X²šxfû4”G�;ă@æ›KÖŽit€ééÀãFW$[³DË[¾ÜüîÏJM]ƒg"ôõ¯:ç4\ @ÏšñA„}C�d%Ú5ðæQ�yîtŒu½#b@·N~ÓJW®µóXD!Z|…ÞÉ™[BwØ= –¯;ãìfÈ'8ñ�)Ïö7])ƒÖ»M¼½D콈³JµÛcûùxšoƒtƆÁØ‚éÍ|ûáÏÔƒ1@4)Ù¢]F@Hîw³€H-^KÜ¡bvd£n Šï<²à!,¦€[tŸGðJ<”0Âø¥Ï�øqè÷àŸÓ2«endstream endobj 245 0 obj 4657 endobj 249 0 obj <> stream xœí]K³ä6ΊEÿ /»‹j_éè�*6\ Tfr�Å"!!EÁf’,ø÷¹mëáÓ²ÜnûÞ¡¨©šë‘å+YçÓyé|ž÷ kyÃüŸþç_ßÞšæÛï]kÛÞ7”k¡k8ËÖ6\JÑJÛéx Ö?õêñððøYóÇ¿9<ü©á‡‡_û¿^}þsüñø‹æ“ÃëÇæÍø[{xàý?X?róê ç¦q­Ó eóô·ïûsi°±1¶¦yzwøóñóÓY·Œ?œÎªµÀ˜=~×]ZçÄñ«Ç *&�ÿ<±ÖHPpüætÆÙ‚dúøîx¥…üËÓo¯Ÿoð%ý‹uoÈ…juíå—w´Úÿ¬Çëof©W†³’ñ«ýþ„«ìŒSòø.ŸpúZ©–«¸Ã/Ãåç:ü / èV ßj˜Q­p¾U0k[• †—VJy|Z߆ÖÏÆÖh ¯âD(†‚¹Ë’èТuÐ�­Ö—5ä#*D,]‹`¼pzδL&Ó“ª®»tÅf/­Öø+-®´Uè增ҹVª#Ûq{¸±M‡§ÅØh¨i²ìª»ÍÇÆðôëËnåЉãá­ÐÉB!l4.ÕÓ׸4Ÿø‡8kº¦¦aבÇoæ"OkòÍÂ|5Ë~nB[jnÒ¶V2Èf§¹�™]´ ¸ž%Ý ÑËÝ·úÇÏ LË5â‘ãT¿< eè À|Po\`Ð2†C‹º+..$ãlxÁ ƒ²â~‡L“ u¸¥t†ÇtTW™vŠga*tA"ÅPpŸ ø R¼0VáDœ…î¥yJÔc„¹�1bp 6ÄÄR mÔh¯4r…«‡ ¤¢Ëz�‡F–5fÒ·Yc…f’¨™äbÕæáʪ)¼… €ý쪉gºIVãN;[Úü^7iô\\bòSc$‚êáb â~¯š€‚”#„*céO;&¹R1‘&¬'«S JzŤêbÕÆ1�6z@Ä«>¨ D¤dcI/åŽN¦‚H7*È,²Ÿ”Cµ‰^J ^ÒKA?F†ð¹Lât=âŒØqZˆ±Tp‰Xdc qwŒÖªd �BdòÝq¬Œ8Ò››˜é—c M=ì4—ÞTm ;%Z|ÿ w‘³l’¸Ò8àNÄ�SokFý™LŒÙíjÿ›Ô¨3fŽiÅï£ul½ø¥Û^ü’�â[ÛQF\iÄO†MAÔ¦,jj?§�^Iü$d`7ñ‹úøËÕ‹_µer©?¸Qüœ’t ‘�ÓÝOZ˜Yå¦(Sç¼,~AA¯ÚÉÝt÷;B§ d‡—©A¨MÑЧ5G¼Ê<šíÄ`—‡bZÔ38§°¤g´~¹¨o0QëKhËáOõ2”Kš2sÉÊøœ»ŒOÎõÔZ„OYPO=>aÍ™ÿ¬¿ÛÙX2 _4Æ� “4¦â~G éæTç“A™¹A¿ì–}¾I½Ôç¡U÷âb…ƒ·| G°‚Ë F²–ó. —g‡Ï�T¤°%%ìüè¬&Ä–«ŽÁ a“G/µðÚ8¾ °ú„³2fced¥Ýˆ®Ä¸L}j¸ÒX—P$“ƒö’ ¯ä°OÜç­:lmz‡œæKßç¾>£­´2[µõνÂQ„MÌ¡Ÿ§¥6uäÜç�™âhAÏ¾Ž€%MzÉd¡€¢Fœq¯Â8d:g-µ/ºÙ[›Õ窕›bip­¤±Ä)!hÊuJóÌs÷/�”¬¾l¹[A²Á8!¡ó‚�á­ë wCAÉú@°T'pzõùj%9êÛíÕ˜9ôB.%‹• •yH3w‘…­î-Ý=så`0 KŠ–|�Ü�ΛvÍV˜õ™sBÒ9ù(Ìz}_�Ûe?ú…“í@–69 äQÏ$3_ßsÇí@†ñd”•ÇV™}ɽ€—²¢à±öã¹B¬ú³ ÅÍ.;WxºÈ)1ƒïôd½¾gïß’~i”@TÔœl"�ÄÚ,; Ï�ãlíáV¸tÙê‚óÅ4Ûòp´G «Õ0 ™Ò:¯R Dj¾¤çFÊ•ŠÀ®�mLg(2„eîôÌyˆ£Æ±•ø\ï×+»‰Èk )�ÜšVUC“Œæ¯¥}ô쵕æ¾vÄ25sù�[fÇgrßdÖ`’8}Ñ|$£úƒia,1b‰¶œaée£ž2–ñ‚ž…ÌÐŒ^*4No×a‰<Ãy6,Ͱ¤¤a ÙtKYRÐh$ŽÞÍ~r:3™+¡H',)©·=ÀáZžL�ô(Ò¬@$]ƒ‚S×j$IàêRQB+'õY7 â‰dñõ¼9Ã\D¬£°¸•…ñõ³Ó,.�‹AÝ?gYJ¦ ‡HŸv{‚1CŽÐ€;ôuùö«…­ÒpÝ&°]!”G‚ ëºa¢¯×mO'‹3Àhäø%. Fc}qOùt¨h;Ƨ3À”ö”Oè1iוÛbOÀK.?EÖê ¹×—9%ð1Ñ*�.Øñû“l�ëŽ?ú_¯Èþ÷3Æåñ¿�4ª]e°ëYø9bßïÂã¬â®_†û“ý×Ð5 ÿµŸ?®:6~u¸ÌÚèãú�¸8þ{xäCôۣѿ —}'œÆgZvLXR t±€á2Ëhð+ÉÌñwãÕcwe˜8~ᯠçüø‡¡-�V)x„ó‘¤d;YÒx�'P+»qØ8ÿJ’ݯžæq8y±-iÃ>€BèyÚ0÷ç—]«ðØÌ»‰6Lƒm¼Ûô±¸)­ú‚f¦Ìj#êJc‘áJ•Ž™22ÈÒ1W¶9äf^\{ù3¹‡üÁ©AþÁˆéˆ$�•W2ª¡Ð$¢æ#—Ó|E°�“,‘“¢�©ž!w€¨ —n0]œO¹Mw˼ôÀ¼�ýÚcRÛ�¿Òp1b¾Ü©ÄÔ‡ÙÆÁŠ‘É3ò«h”kCˆÒºÐÅ‘ó~^Œ�WRS,ÔgtAé�™Ð,H;bÁÄâÄž|”l°0óÅ1úSФÖ"©Œ3¹yª¦>Bâsú´e“UŸ£)·…ÄåCž ôHŽ/°WÁú='{õ¦|ë*þ)w®kk£—+�úÔ+ØEi€$>Ÿð±1P#ü¤j½.r…t/5C}P¡>s ^Ê›Ÿ%zªŒúeýÅ­ÍA÷²˜£Ë#ûg¤ŒÒ¶xælïs5Šo÷øë³ÚÜÊ�?æÐAÙhŠýrXŸ÷�òNtÏ•P¾�³¹”oclö(6°е¤PL¦Z…ͨ§�%¼ çÄ¡$àÙÿT"R§Y�:—òFÜj—²TP’bi!W³Ç’f{`Iõu›¹d9° ç^ͪ2˜ÔÒv@š!¤pPÛ²•4øèÙ«Ý�ÔSIÑì ÛžRp¨ÑÉühŽ&)^GÑ-�B¬HEI£ GSz7f[š¦›IƒO‘16Áó‡_–�6'lµHæüNÿ#c‘´‰xw¡lF—ÿ§lÞŸ²ùELÙÌezvpñÑÎ]s…`’¨SBí½7‡ÿ(š¥Äendstream endobj 250 0 obj 3337 endobj 254 0 obj <> stream xœí]K³ä6ΊEÿ /»×W:z§ŠÍÀ53\`A±HHHQ0„™$ þ=Çݶõ:¶åî–oפ+U�,·%�Ïç©Oó¡a-oX÷_ÿçßßïß™æÛïwÇÖ†7ÿÚ}h(×±áA¶¶áRŠVÚÆHÇ[°ÝS¯žv�O_4?|üñ›Ýã_¾{üM÷¿Wo~�<ý²ùl÷ú©y;þêïvv¼ÿ ëßܼzÆ—sÓ¸ÖiвyþÇŽ÷ý¹4ØØa[Ó<¿ßýuÿæð [Æ÷ªµÀ˜Ýw¼´Î‰ýWŽTLîÿ}`­‘ `ÿÍáG ’éýûà•òoϿݽ~Þ½ÅIv;Î� Õê†[ËOs´ºû³|ŽÓ3³ÔÔ€á¨d8µ?p•�qJîŸüå3_+Õrvø•¿üóR‡_ã¥ÝjѵfT+\×*˜µ­J^†—VJ¹í[ßùÖ/ÆÖ` 'q"CÁ\e IthÑ:h ÈVëÓò "ˆ®U0^9}­Žâx|'t´P�Kõü5.ÍgÝC¿º¾k¼¦æ(ÂcG®–cˆ<­É™ù9?J—ŽMhK�MÚÖJÉè4· £ Ö ×†£¤[!Át�?€2-׈GŽCaüô$ÌC˜.àƒºp�AËð5ZÔ]!pO‹>LçÊ Øn‚þ¾ò÷MÁý#2‡_�’Ÿ¡@h¢•Ž»+É\X‡ê\�8á ®�ÏÈBœt¢¸%Ê£(”ðNö§§D9B˜Û!Œ�!WQy�÷mÁý!”ä…JKý�Ç›xO¤BKt—lÕ%Ê J•§†ùâÊ‹'ÚKcS;5½‚›}—B3˜ £ ¬µ,¸ßC“4‡Žªi‘HC.æ•—žweåU‚’^y©r€XU ¦ÑF舤 $†±™!¹ÂÅCPB!­£Pè{ú” u*Ò)½$ѧ’è%>¯—R´&îâMè¥qºqFÔGœ–âD¸†¸èqq^�êð� Ô�$GJØ qlq†ú0Ìm!.´„¦všËÎTU…�-Î?Á]1�>Ñ8àŽô¶4!17/1/y©�93Gª�L'N™9¦»8­cËÅ/]}ñKNˆ_œ£vLؘk~C‰Z–ŠR–†h�&ËT5ñCyŒæÊÅ/Œª™~:ŠÜ(~®û éè[$ó¯ŸS_ åä’j‚´T _?é`GèU¿~×…Ù±ð9Èa2%hU }2RsÄ«Œ_?ÎÄM ’‘^AO6–÷ Ö/•ã­&J} m£#ë# ú'uΓ °RõD~óøä\çþÓ*|ÊõÔã2h.dÊChvióªŠê°35B“S22TD˜2Ù”Üï#v2#p’§t†ÓÆl!×<³�p$ýò›ˆÙ½63Îd�)ÏPkƯV=›�ŒÂi€&¼2‚‚+¸ßCÆ%"O\Jº"D‚¢DW˜Rý") VÌYê¥ê&s6ŒV*Áä6#à±uË‹jgr>èÖÔ(Kî+ÝfYIå˜+ÏA+c6Áœv#æì•07U'É•“ 0GúFYúcáØÊR‹¤ù}ÑDϼ›_žÛVZ™š…¹ÞÍWøaÓ-¡ô£�jpÞ§jxgõì÷ðYI“x$7"LUó˲F¢X!¢]¸È//T®ÄʳÖJ‰ªXœ,©F,‘/p²ü}/ÃÂýS#%«OŸÜ9!!©ö �z©¡N`¤ç¡§æÑ|“!ayæZIŽú¶>ô„¡G~ÿÁþr“\¾_zó»âP1Ÿ–ÿL¦J×+-·f˜í⊠‹sûf»ÿùñ›`Ì�ohMWŠúf•ËRØ* ×Ñm[ÐByD¸°îø�èëuÛóÁâ0ى˂ј@_¼£w:T´Gv§3À”îè�ÐcÒî¸�{^‚¿üe X«ODF\_æ”ÀÇD«4º`ûï²5¬ÛÿØý¼b ûßgŒËýݤQí*ƒ]D7Fìû�Á8ª°ë—þþ?ý`ÿ3tõ¯ÿº?®:6~u¸ÌÚèýÿúq±ÿïðÈÇà׃·ë/ûN87¼Ÿiyd½:�bÀ  E —Yz@C·’Ìì?^=¯ û7Ý•áœïÿ4´•€‡Uv²Na�êXÙmIÂ’]ogÌI8œÛ'ÇF3殺ÄN,aa\«äz–0On� ‡°„I¿Žd ‹T·'`AÏ–ðÿs.Þ$7íRl§e “‘Liæ ù¼%þg²«< húë:s'àj3ÒÛ³À)Ïßæ!k�,‹ m+zöÀ਽§a~OR]SÞÕð±”íê;ƒuyH2Wñëq´šF,´¬ ¡¾ì!Ð.%8d�]¾³3Vc‹÷ghÄdú„QâL«ºÉ3Ôí—¥“›ñodOMœ(ß½%º:YÕ�¦èœ ˜ŒÈãÆ­¨˜@6»¸ŠéÁd‚6}:/?Ì)%? ’x ¼©°ÀP¾‘JHV‚�ÇÜYÂ?y–°[rÜ��»Ó„ï4á#nevº`&g§Š,&o�%L:Ù¦‘jÖnÅQ>å[�“Õ¥N Ò�R½øÔDc!I˜Üã¦I¦úeXß9é“á_1­êbé‹$ap°Åa9`E€x;_~’Wìµ,Þï0rS®%ÄI`:‘qòžbo˜<<ì&ˆw—шÁ²ªg ôI0�òÊ“¤O”0,Ü•eÖô Öïš›mÈÓÃèí`ä®ñµ‰*´gEWšŒ¼y"1h[ýÀ è6›e'Šhå&[F&IõFq R¯:qº‹Ÿ$I½¶-; å©iPºúÑ€>ý„(åF²®´En­'3‰ÉýÌ�‘îF ë@}Ÿ5E �MæêÄÎMd–•gŸAʺ(9‘4AèñÜ�;1ø'N ›`䈹;1øÓ S'f”糡ÓÉõ«µþ ;+ýN ^e=o� ìzÿvÁ\Ò€±KSIâœø+§¥û§Æ#“)%¢9÷Òì%K#¥ôò¯€ñs 1˜;½ôðu#ôîÄ`â™;1xb0·r‹3¸Ñ#þÎ &ð~gWg#~¶8º†kI]CÉ„ñÒ?¬SÐ3óPÉ �á!kèäΞ…r©áË}«¹Ÿp’.W^¨àšm‚&éá5I¼Vœï9%ó7ä>Ö©žÁÒ}*¬`2ùXjÙ7aO°ÖËk(†-ÎAà’ç ,ñ}É ;²�+zÎ0ƒÉÄ4yP¦ïI2êŠc¢3,çÍ3ƒ»�o%tïr(M�Á]h ×õ¼)bp¼sÿ¥¡´@‚â ê’äNÄ`ÎåH$[Å æP·Ó3ƒÃñ‘N*iZ»¥ÎY¾¤#<¤Î|HqÒ Pƒ]««Qƒ³jN)p9¿Ò¿ñ9K FOI\…,îÄàšÄà?†ÄàT¦NnÙƒD¯\!¼è õ‚¡÷v÷r�'endstream endobj 255 0 obj 3075 endobj 259 0 obj <> stream xœí]K“ܶö)‡ù<ÎTj! ñvU.J”DIÙe)û�ÊÁŽW*QÉöÁÿ>�á69àjÀÝ’¦T¥å‚ ¢?ô ýqßvœ‰Ž‡Ãϼ9<{m»ï<œ[;Ñýûð¶“B{fÎ wйN(̸Î*/¸pÕó—‡g/?ë~z÷ów‡g_uâðì�á¿ç_ü¼ü]÷ÉáÅËîÕt×?ÞÄð žÜ=¿Ç‡ Ûyæ ÕÝÿó †þBËÎJÇlwÿæð·ã§;ø8¾;Ýiæ€swüá|è¼—ÇoN‚)§¹:þçÄ™U áøÝé‡ Š›ã›à‘‘êï÷:¼¸?¼Â7 ou~=!5¾©ðRàÍð�Á[mxÁå×rÔ{ÇQ©ôÕ>?á{ëµ:¾Œ‡÷8|a“"íðûxø%v0Z3¡:ü-fdhµÜj&}h•Üâ;šâixè”RDZõulýljMæp%Ró0™×˜DÆ1‡sŠÓO¢˜ÀP!c©ì6ož·Œ/ ï¨Î‡^ Ü\ßêl8oÁ1ƒ`S£‰=uÚh…aü¨ž|j”±Ñ"V”÷ìä<›–ŠHÇ‘\3¿»,z†#O›âšpô¢_¹Î’yöZšlδ ˆáÝý·8MŸ„«.Á¡o>¿–MÅÉ0a¤0af<÷ »�¯¬ã0Uåà®Qá}1:#Ü…ÑñlFPYáÊ3‰àÃåw@ˆÐ �䢿ÖQ dè,³É)Å<ë¹Ñ­q 4I$% Gº<Oo�¡ª= sb·U*gÀÌ w!wžB.$Ò[CŽë r™Ë0š�m¸¸Ú¾Ù2´—èÜ÷È 2òˆŒ .É”ŒÈ ³¯@H±Œh ­B껊‹*Ÿ�v'\e„Rˆ��ªÐüÒï´ 8«w…Ø·BÍ¡VŸíÕÖî5ã'¨M®o¿¦‚妭 OT·ÅEî($�¥N+´§›à/n3¸uü-Í'„¿¼>Ù¬�¶­÷¼4>BÎö¼“'N:™ùÊ}«–‚��_G`rË2˜oNT9I‰ÛU«?wq’æª>3¬µl¥ p�©aKmH%¢šäwͰŒÜFµ«P 3µ*}�ñ´Y—£îÈ+ÁõHaY}X+áXËm‡ÁüI9ákÚ[胰>1”Õ3Íf™„Òxl7ictS{aœº¦Ö7ü=Lç…m Ò+ÝÑu[Ë^¯›Îút¶¿ €} ¿3÷�ŒÓMöú-¡LîWh ßej¡<¨<”IPë¢îå¹®ÏÊkaÛ¢8Øxœ^]šxN™xA%i%èR\�þé·%i22vÙ gÞ”²'áQ‹Û÷÷7*º˜Û�³×ÜðÖûv((ffûvŽJ“ùˆ‘,w6_›"›‘ë'ê# –’îsåV¦fæ‘sU¢ž œ[{„õáF‚³úD½òª-Îzƒªœž –åÞF‹J©eÂ5•q%÷q2½5×;¤¸ž†½�wi¼UX$H¨OÌ+í5Ž• tº(ç(÷gÆ]Â¥ˆ.±o+ Š c¥q~ºªˆ„Sƒ|´lý2޲|#ek+Ç2k:…OM¿:Ýq¦œÐR“èÌÈ8Ê´Ý%È8Éðf¾Ý¼Æmäâ�ŸYãÈÅ18H‡fjEŸÓĬÃÄORÃ.–å>!kQ@‰’á“vú "Èr†�…2Âñœ•ƒ«6Æ2Ÿž×ç–|Hx†0cßY©¦ÚÀuô”ÄÁ¼F�âÀúS§$¢mPU÷'\ë½öã×83µHôp•УÒ<3 ½®M J@§ÊœýëÐÌYi�‡Ÿ¢$g¦çÌÜk‰—I¦ úAÇOŠYη×ÔpÎ…:þŒA-ª-v½“aŒØ÷‡ø€iTiׯãùÅÁþwìÿm?†eØøÍIâ4kŽ¿ òø¿ñ’wÉÝ“§‡^z?>Ÿc´–”aèSW�®7aÂLr{ü|:zq>²\ög­âø×±­<¼­»ȨÒãtº}Ù¨Š_¯Þb��š¾Û‡GG•(•–¹÷�Ž*Qukµ�ŽŠÃS-Óƒ¤‡Gd’tT2«*):ª+mÀÜ®ÑQwòç.Ü1úsÇ_OîZѵwÈ\QÆv‡SWÕÔ;ìÍiÛJš³�•ÆNìär¿x”ñÈì\>_ºïŠB“‹î;Y.A¦’¤“¢º’¥Àë›@KÔ«J>$9[…ü¤YJ£cÅv•zAc7Ë”£‹åÀYvp­èæB�.É=WéÍIíUº¿/·òBÑÃRµzÕàö$8ÕÚȰ…Òx[*In‰Q7/Íó—›y•¤Å*¯ž§½«òKdùÅãó*Ó´v}½‹T¼=ðQsŽ÷�]ùQ²+%¸ö€žþàÅ�^ù‘Ò+ñÕÛrzû­Œ‚GZï�]ùÈìJÉUs7x=Ê;[9s–‹ jõò™�œ B‡ÜJ·tH&¤Ï¦ª” ºeNúíô�…D�%‰² (>€|e©Ù¯äAµhõ `Ü…€PÎD€ÌÉW‰¯â ¹-Ö‘ÕáeÁz�ŸÚZ�‡”ý<ÈWI$"ôúÔ1hÓ˜žÛëôÖçz'çÌ­êCé’õá)“E~ïŠÖ $霤ã®ï�^ñ~Fëá5Øõ¹dPj�oJ€4éntÍ��® v�¨ j7ºæ‡Gפ¾XPŸ¾† –ï� Âl+ãF×|òtMà×û ü"88'ÀqiŸ‹¤k5…;Ó5I£* |̳[?ŒQ›K~¤Ø¬>£ŒaÄ_+ÎMøºÑ5otÍëÑ5…SmÉì€QsÑ|ã_óÆ×|¾&šÔ]`lÔã©Bª/Ÿ+aL¥@ù{dâŒÎ�,ýµR´+F¹ÌúoÊ�ìñEÅ9Mª>e/ oþ}¡�ø>‡¡>ŸDd.€’ùBÌ, ŠLÿøTÇ ¸>9�ØãsQU÷¹2Mz�œIfQ/ü¹2¯° � äê¸ÀL Ûò–zn¦j¢÷l"g¢¦hš¨¨)éø’uDº;Óeº&;sVÄQ T!®ôýVÙ™^0yn¦¾q3[r3ÿ’r3K™Þyè¤;…þ®önJ'Ž…ép‚Þ«ÃÿêZV?endstream endobj 260 0 obj 3117 endobj 264 0 obj <> stream xœí�K¯%7dzbq>ÅYöº»üŽÄfÈJ”.°@, ‚!äµàÛSî—Ýîj·ûœã3—Q)§Ó·nׯËUeÿ;ßž9gþÿöîôâ­=ýý©ß{çž¾=K!8SýŽGÅÜYha™sg«¼`àÂY/_Ÿ^¼þôüÃw?~uzñ§³8½øMø×Ëω?¯?9tzõúüf¾êïNßžÄø|¼óùåÞ\سgÞ€Qç§¿ŸÄx¼Ðši8[é˜=?½;ý¹ûüáÑ0.ºï5sÀ¹ë¾é7�÷²ûëƒ`Êi®º=pfhè¾zxÄÖ‚â¦{÷¸e¤úËÓoO¯žNoð!ÃõO(¤fæ,¼¶Œ‡gt/uà·ŸÌQ�\2kÒGûì{Ù[¯U÷:n>aó…LŠô€_ÅÍ?†”g 6ø5nZ0ÌȰ×r«™ôa¯äÎ1�Ý 7�Rª{÷¾�{?�÷&]¸É‰Ô<üÞ¢I:,v v!(fÌЇbf¡ÂÄRÙclž÷Lo5¯Sý¦Bw0ìu6üÝ ƒÈûéPÜI©ñHpÌ ÕzÞiâ‘nÞ‰[ˆ‡gJw|ÞÉæ×CQgëôìi§L›¹n›Ë.¶^ o«€Þ/Þ¢µÒŽBjMàæéKì›�ÂY_»ñØe§ÚÞ†ý�‹Npm(ÍΣ ª™åÆ)|/ñÍZg„Ûi�XX ¾mfì»°7œþ ˜0¤À¦p±x®-v�GrO4íÈî{·+€¡óêÉ�Æ÷ÈS@’J-�ý¨˜²‰yxì ÜD¯ ˜¤¥â9±£hÊ8AYrŽÏn^¡ô¡+�B¸h\ B™öÑú)Ú@˜ô¼‰ª a8IÖóÇý]øã|æ/ö·�üÅ�.ò'(þ\™?WfÉRî#2ë)Ã6æ�§w/ñç©G“ÏŠ¿Ô ªj�·Ð2º!4#ù�Áhq\ŒFEO2oÔæ©uڢĸÒ9lɃ¡n]=b{Ãàš!‘W{#]‚ÓwÁš „h^A9#;Q¶]ìì­¤Y,eh�ÞgíbÈÕÛ_ù¶öG¼”ÂÛˆÙþØx…�áúp§·µYf]“­£µÌÂFë± ©Š($ ”*Ú2PÆ8}qó>ÆöõÆ–V·¬VMÆ?ÛFcûhìå�³z±É§‚Ò�9ùÅ&OyÆV8®‰Ì½'%@^o|Ðm�?zzaññãÇL >6}§pƒ,ÄÌ–¢zÝb‡Xo¯ò“;i‚‰êÜ|9T¹¿³Ž²¾¦{MÞ$v(‹%ák§žò*ãwà‹k‚¯¤ w&EY+)è�Éö`9å­ GšB±;�|¥÷!ô÷VŒXŒ¯ZÎF}±Ùpq³™0š .¯½d`ˆ(3±Ý@„§ÿÞÀÐy3Db|fñln…zëÉÔ5·¦vx! :µÉp­ò “CÀøKüH}aX;ß–•!HÑN̬˜¤Ø¤@jáRÝ…Lqµ3‡&ó"T»—÷ª0Ü,ï5ÔS<“ºË&kõõ_mí]X3~f "k’ ˆwX#ÝV>c•¹³É"™Æ¬ñôÑJ¬‘åKxV¬máõufmð·å¬×ÞE޳^dÚÅc‘eMè Â>žB� ¬âÙ¤k,GCäŒ{5£Ís1ÒãÔ×|µ–w@é€$w‘ªðJõ¨1¸ÍósÿµW-¶hoNÙ›¬ü›"Aäb–êJòey_<äq‚ê+¶Z ÇZÎŒI9äÈ"5qxK‚ÊØevU8ÈÜÎ.ƒaøO jx\àón°Ê¨4¥Zúê+Íü]¸ÀÞ§ã+W~ÈYVK]PLäsï[²FÞzqܵ™h}¹\ {bCa«”ˆ.†Ò)B##«¤b¥)h’R…I/º†³\/'çSjCõëc4wÌ]Å:Õ�r¹æ†ßabmÅÌjbTQ£:ÆìT·U$Ýpy} Ú|«à½öùrÅ,,ÉÉú|u1ôêà­-XQU_$W^Ý…*§ ª.ZhD•4I‘­|^'íÊuNr¦¿z¾äÚºøE$Ô—Ä•ƒ»�`åLÂbùÂDBÜ©¨Õ?Ëc=]Rí ;×®ò fõå�VPìÈX”ååNGe,<\^i?)�~öðˆ-qBKM¢¸�±(Ó¶æ>ÊX’æ­²ìå&U,ätD 9÷F…7“Á—ª*«˜˜éx"•T£vÉrŸˆ›(|_;ég„~�Ü8`Ø™ŒÏs|ÑŠ`—ñ¬�{ê9·ä˜ Ój¤ü™ÚÀmü�Ä=‚y�^'5½ó�,%°Ñ==àÛíðþÝØ- ŒÄx5Èî<:Å^uç13Ð&Èî$`|dz‘€›&n~Œ6�œ™A`†ý˽–xšDÚ0Îé¾PÌzp¾û1\^sPãõ9ªû!¼#]¤¶xè£ mÄc¿‰7˜[•úEüû?bcÿ=oÿeh¿ÇðB»ÙXÓýw¼‘�ݦS¾K®žÜýë¸9á%4ÞŸÕ«=(91èS„YQ§"Ðz’Ûî³yëU¿e¹ì> [VÑýaÚ·€ß\“À£<„!Pñ¶á z¯³ôØ�î^ÊM)ú—‚ßn-Ær³Ÿ…MŸí é¦Ñ8�éãÒÍ0ùen¡Ý¤é�h•–µna\à[Z\Ôíæ`dlžj™Þ LíøVóhE&�cÙŽvSM+Ôžv“—µ›w Ûv®öîçsX–:^n¥ƒtÒ-רÔDá#8†¶]˜Ò®ÒØ\¿ë¶ž�ÉÕ°Ë$¥ZJ×±9¹�^ß”ìÕ„™“;•S¶¼¬~(en˜È'˜oVǶ=&tŠ#!F5&Äž%úï56fæ ›®søz‘"™Ø‘ å) Y>¬Î½0k¶—”ÓRô+Ä= )öª¤Ôw¿�Áù5©aiâxÁ^Íò”‘½0™ÑT#‹ì)I°Ç)öú¥+RaµœŸ]—Šv‰dY0?{ \U©héT+ýNÆò*éÍf"Ðø<_Á]³bdd@ñö à­Ö"iI1 #Žb l2Õ'—W“A UXnâtÄìt ìttÚ[kßø|œNÍ •8pí�¾8r*äM"i rŽ�”7çÅè;°'Êìí¬ú{ì•$Ž ÓX‹r;ib³ªøÀßbhª–ì"yµ7®ÇËVÐæ×*•Êw&GLÆÖ4 Mî«ÅÍó+A2U_FæïáS„s3V37ý<_üvÙª›o©Áøä�•3W˯ŒºJËFÊQ~}=[8ÕXø=`‹k!üÞ® ”å�·ÄöÿMþX‰íÕòÇ+#¸Ò¢ƒÍÁ»¾ö.,´%oaÔŒëÎD°ÙYy@ CÈ�['e ò›´dé¤væ…„¹ùú“½úV2èTCŽ,Þž  jgJµòÂ@î')d‰© ™m}¹MÐXc= ‹H�®KMº³¤‚$37òÕ‘�¹™Ÿ¨ çÝÂ6÷Ië çU�£ù¥ikþàWÀM¶ßYëA®5ú°�×ÏòïK i5ˆÝV+dlø<™j–ÔTj G¡m~”ƒ¤íK^™­•‘“„œ¤[|/p-—$ëVTM`CéC{o&‡´ÉÇT‚Òräyùe-‡TÉg~�("W‹%jA JÉ›ø¤¢"Ò &o¢‡´?é![ê!Ÿê!s›>z" G…Á«ön®þM •óæŒÞ›Óÿ9Þþendstream endobj 265 0 obj 3383 endobj 269 0 obj <> stream xœí�K�·€}Êa~Åg,—,¾ ä"GI”@�¥lìC�ƒ;F�(Ždû�Ÿb¿øèênöÌp$†o«·lÖǪb‹ûöÈ™8òðßðóïo�¯íñÛïÝÙ£8þëðö(…àLu'sG¡…eέò‚� w={qx|ñòøÃ»¿9<~y‡Çß…ÿ=ûü3üñâ×ÇOÏ__MOýÃáíA ÿàÛ�ÏžðåÂ=óŒ:>ýã †ë…ÖLÃÑJÇìñéÍá/§Ïφqqzw~ÐÌçîô]wè¼—§¿�SNsuú÷™3«@Ãé›ó¶7§7gÀ##Õ_Ÿ~xþtx…>¬ûB!53Gáµe<|£3ø¨߸üeŽú4à’Y“~ÚÏØËÞz­N/âá6_Á¤H/øM<ü"\ <µpÁoñЂaF†³–[ͤg%wŽéâexè”R§çñìëxöåt6éÂEN¤æáç-ú�¤Ãb·`‚bÆô}(&*D,•݇ñÎæyÏôRóNª;ôBèáÐ9{²(ay?^Š'“+õt’ã•à˜Aªuzûx¥ŸNò¡°)J‡›†“l‚º[¦wϛ驶œñîçýhЉãñ5J+í(¤Önž¾Æ¾ù$Ü%pØ ×æ�j;vÆ›óƒó(Ci6>MÆfºÊÆ)—8F‹Öá6ZÇã«°y¨ p´™¤áöPÀ„A 6…‹þNXgx$ðFÓŽ\à¾S»*¯Ž\› _ôP!¹ì$HÅ”M0IºQ+¦Å†¤ ”  $ß[T+g!}èʽBúö5eÑ¢®™p?ý6„Ðß$ëùãþ.üq>ñ'Ònùb›:þ\Æì”Q†‰v)µi3þxúéuü%ÝaÞ‹T ü¥JPUCh¼…–ÞÅ¡AÉ÷ F‰«È`<©)iëhEé•6·¸P§-JŒ·tÛQokyÞ0¸†·Mà�t=NßkF23WFÁ㲊/Ûf';é)O šS'!}ä\ú¶8ÙLeŒ¯i �öÖ\Q¾w $"t¦:+ï�Qsè,¥}DÔ>™JJ°Ùí�™u(#`Žâ¯VÄ­ùsÔW¼Ÿi@�´õ ¡ÂÏÖ jÉ8ÜDóEg„4>”:”ëh%ä‰U»gÒöÌ-ic»·C¹zù+ßVþˆ—Rø1Éߌ6 3Dz�UO¡É—9Í‹vŒâ#QqjÒ_¯öÒûˆçèHPD|=Òê–¬ðØa Gƒë'b% †ìä̃rrI­@FÂÖ»¤0«�t_/ë5/W¡­…ÊO‚¼^ø Û ÐþÂâç—A µ6PG=`(‘Nƒ–êu‹b½½Â HÞ$ &È&ñô‹È)[•F� Ì:ʺ8ï5”٠ʢFIøÚ�§|…hùøâšàKP|dL„™¸¸ä¼—œòVІ&ÑqÎÅ<ºÞÎÒ\âjˆŒÙ-,†¡V²Q€6\Ü,;F³¡Âãµ— Léyæã¼'ÂÓ¿ï4Sé,472#1¾�xa2(é’ “Òn�¯â…SO\ç8Z«2‰Ò^�Ô‹µómYé�íÄÄ í¤dI­µX ™Y 'Õ²¸r.öìžš¹° Yá˳Õ)1ò+ÚÌ…EöªÅlÄ"kõ1amí]X3~b "k’rˆÝ:kä„ɯ¸d’fó¥&¬ñ´uq—äÓxcÖ*çÜÑRNx}ìYüÙ>¦ñ-r– ãTFÄL–+!„¤Ê¤V‘iMú´ÔóÌD•�#uä{ Á,ªžú€°Öò.$(M� 𠯹ìÓ©IX{u‚¢²$TTNßf‚[�ŠŒîV«À«'aþªêC¼Z ÇZ¦ƒ&åD•‹ÍGƒFe©5�yÙ¥{¬ Å!í™#'~åJ’m0 ¿â DmF>ù‚;æÃ*�]°‹õ¡i þ.ÜÚ´ [2-K.ÒS—‚¶ÖCo‰­¥FVí¼æS‡Š¸Æ\ÓÖÇÒµ°w!6˜ñµYj–T�6ÒÙJÂYš‚&‰c”ɯ]ÁtR¥Ö¯iL_\E¹#–®¹áwȤ¢¬˜™eR·ÜøØÕ&ûþ[9oÔŒ`)>WRQ5é²]t2 ÛÄyË¡Tª”„ªúºòê.T9MPuQ~žŠwn¬¢&—‹�žÛz”ŒLUûñ÷›&$ÔÇË•ƒ»�`åD‚J%4’�-Åš/Ê#ßó\Jµ~X99ÿuU×R˜½¯ÅŠu/Êò�õQ{ë^xx¼Ò~,úÅù[â„–šD1«{Q¦m@~¨{Iš7³ÉóXÒXöBæB¢ÄU,{!ƒVÔìpxV†…mtÒORO*§>Ë+§ðÐrOAƒ3s•ØÛ_!-(„‘öæ©p(Ù4­#�OdMØË©]I™ÕD@}�|eh¢†š·ÁñìÛ0Ã]ŸvÑsK¾�Ù� ¯�ÍÉk‡Œ6p)ñŒ`^£:L™t> ¯$’?(ȧ3ª‡ï?}…ÝÂÀHt¤C¡GmÝÕzœ²h % ãfº$c¸ðÐÅÃOQ’3Ó—Êaÿr¯%Þ&q vúþ¬˜õàüéÇðxÍA Ïç\¨ÓaðÔÝÚâ¥2´¯ý.¾`jUzéWñ÷ÿŒ�ýÏxi|ýסý5àƒ$v³±æô¿áEBžþ;Þò.yzòöoãáp…—HÐð~nTWWéAÉ‘AŸŠ är�Š@CèInqÈ�GÏ»#Ë%Ž=<²BˆÓŸÇs<¨RL�òl³âmý,T«Gé±;ݽjP¥è¿Ý Œ…Ô.wœ~ÛE¨ŽûÝE¨!egnQ…JÓ!Q*-ó¸À·´hõÔž*Ô^ÈØ<Õ2î pÎÉ—šW”�Dï}4²äÚ»¬¤­__¡èW¶,b­ õ–þd<)¥uK Þ7îÞXt�úí*×’¯äÁ->:_£S3ÑhBkÜvaNg¦¥±SM3™ÕsqáÍRÄi¾p‡¬ãÔœ�Ày2{¡CcÙ”wþ$·*B…*N¿œx(¼Ý^⮜aJÉ 8i» 1qÕXÜö(Q­›Ù",# yæ,æ�Kµ®…”o¾¢|iHT‰ÊV):ºh—„ÿ FŠn6âyX²EY1¿/—£×,P¼=øªy¸¤БG1°>2É„ñÆ2…d4—ÑñfJGLJG®+RŸÖjÄ{*�šU6pàÚ'|-pŠ2x>ë�5ƒGn³âÖ�$S�ÔÚÀÆìÁ:{ej{÷"‡æìí­¹¦qÝ/Èí¼è×Gþ²¬™äItÒÈYz¹¾D‹ÌòñôåÉ{VìY¬Q êõëÛ«ÕPÍò–�®šS^�È\à=ù,| €ôN’ÍO6ê/I•¢ ‘–S©q1È K÷§`V™QP³d¤§<4¦ ›lƒ“#Y"$›ã\›ü½¢æÚ¤Áqq®M®èt„XyÁI!Vr§uwy©¶«”` vƒB—(ÌÔ…6óªÚÍ�ÇWî÷äX *÷¡@£G‡Ì¿“aAIEg]UJ�¶4ÛVínØ‚£2¸Cî{BÆ ÈxÄúº'Ra}å�‡—•w×xóqg «âæýô,]¬™)šq¢F “ ÚQ‹¨� u­ÔÉxbµWÝr¤E¡×‡‡A›Æ5½½ÞA~®wò:‘yx8�÷�¤§C‰_»±CV¢!½AÖk“Žoíúµ‹<Û‹LU¥g»nªêCÌ Tã=&z=!ÍT®&=¡£žÈ8Y èD�¯31Î))±-ÎV«W]º—de@GSc¡u@‡^/9ËZ-j§úˆ2H¸ j &Ô¦¨qçö ¨}Å›n9¢æÖQ»ºx³aü&ª6jƒúè5 Ü8{˜›oa@f0ÄFãc­Ü¼Ac‹Ajžú°2ðÛíö¾Hç Š"ÁF(mB.þ7ÌÏ lnX¹¹‘|'­níN¤‚b·õ⸈©úH1ÎïEÐY3áÜ„•›¬™�Ö¬¶îÒò‘ŸBåæhEmÿÂÊÍ+�âZåæº¿_ÚNµ­c°E…•UØ~l•›•Ø^]¹yå´a­rsqÚP†ï¼`�Â(bÛ2'l6!”6³�° øäJ•õ$ å­E¡ñR”Âèî,äX0¼= –6cYqé««8/tä~®â\cj¡B¸>\Ž"h\Þ›E$h(Ov1È(›Å©UnÕ }²Ü’ŒR¬»óä6ïÄî>¹�ÙYÀ9ˆ_š¶âzÜ(û¢x³W+yñæløŸVñæõ ÿíêMº^D€n[MdlØvM5ÝT–o(BÛ€üP0’¶/2äà±`die}<9ÿg‰¡!WcN£�,—¼«Ÿi\ÈIþ…›qEršdKãëk9m²EMÒÊÒ¡˜×rª¤{Ê9gš¼v …2Ï›¨ËÕrN/˜¼I1§ÿ¹˜³e1çŸÒbÎR¦zçìA¡_­½›“cCãá„Þ«Ãÿha*endstream endobj 270 0 obj 3480 endobj 274 0 obj <> stream xœí]K�ä¶ö)‡þ}T#«ø6�ËÆ›d8ð®'É!ÈÁ‰#H6ήíƒÿ}ŠÝ’HQ%‰ý�¦×Xpk)J¢XëÉOón/ìeü¯ýýÇÛÝã·ÿöûݱuûïÞí€úØð …߃'¼ß;@ �W½xµ{|õùþ‡÷?~³{üËv�¿‹ÿ{ñůéçÕgûOv/_í_÷wýÃîÝÚÈöÉûOôppû ‚E«÷OÿÜAÛŒ÷NyáöOowm¾84ªoÌzbßè¨'za ÕË= AhÓȾQôËÃõm!]­ó«»F_ô,N§a¤Ç¼<­VÀ£8ß�´ò‰"ÔÚˆ›§¯in>‰W-»¶ïpRÝQ†ÇŽ�¿¯$CeÙWKsÜ0ç§i]Ò-FgÁ/ŒN¦GÑðHAÑjëd[ãå¨Q€%@ EÂéJœÇ.Ê„\¤ ízÈE©£îs€‚”W¾°zévÀ¥Ù£¾!;ŸA"ÄóˆBãôyC¯b WšªV”:8È[�Ã{jÔÜH©QyO#e�¢ dpŸ J2/%Š/ʼnžÀ ž.Rõ‘aeˆ„£e–²‡È`â!j'²Y©1‚Åimϰñˆ\XÁ™¨'`Y૸Æ3ðXPN*Äù»\9á¼ròyÇçUN,è ÐNºz68\Óì·Ð³ä¼„òT.üó‘Ç¢,02cõDÈo9Y'ÒÍc'ÔjDƒ¸6ZÍcêÅïÍ&âw¶ÿÀ tâ‡!&Nâ6Î(ÖܱÂ*ÁS˜¸t#¨•굊æOÒ�™â©5v)žt¶tNm:«Ç:Çs:Gr:G΃ŽÕ U�kLbWœ4Ý�€Îç³5^:wºÜÚ¹zäYÐñwmä%$¢ÈÓ î 7ÐCô†�-ôÃ-]mæõ]¦Hæí©(âîÌ�¯—¿›È_#{‰êad6>K=5#ÌÒñ©�yxùë$\�¨—¿rfÍ,R‹[ ½ü�›E•bqäV¦X|ò|‹'ƒÅ3ã+®c“w@«Ræ|€\‰›„èh ‡V"e»—© šMŽÞž1Ùâ&›uÏfxþÔȉ":çÂuáóœmòFeìqŽ`zŠ{Éj§ý˜µ]K9µÐÃêÒÝ9êbî{ÔIÓ£Ž5ö’K–¨,S†ÅùVM±÷ÏR†¬!cÓÜÅõ3h1Üm%ZÖM&Eå‚A¦>Ël%ܬ6ãÙ˜ ÚRQyγ œg’g ‰+燰ŒÒ„u:׳­ pVõl'•G}2Ùø°.(„Òš=hœˆš¦ÅÇYĨ2ð䣠Ƴ2˜RúË�gŠ…;&Q7¿ìEYt= Ë—e!Ë“œ¨ê“¯Æ¹M­ Ì¢5Ü¢õÜ¢õ¤ß’·É&®ÒâgÃÚêµxY&Dæ¯6— Ü[Ô¦iV΄̻¸õ)`céwÍâS«/è)ª->õ(³ÃbœùÍÿP+¶¦XÆ*ãº@UÉñ‚„œöß\�w‰Á¨OÇ£Ö@«…´éÀj!ÅA�sôÙ¦]çªVO¹Y °ZŽÝ„a+½�LVoǸ:†¹È ©Oµ ^¬Ÿä7Jõ¨UË¥¥P5²ã–±2*·Â  Ìéy°XyÅ, ¦òF÷o"ëÓÆúXnM$’¡;AÙp8Ã,€­¥cYê‰ËŒœ¤ ‡jÍ 8×n¡XÀluC_dÝëSÞÜ&z8þ0ïqˆ¡¸C%?�õϲL‘နùee¥ë¬”vB-2üÄ32ÚFZ¹A ŒD%,Îìø ÃÆ ¸½ª·´Ë\ ±�!`w£–‘jE"‚ÝßZC\ííùj-“¡ª>c­ƒÞUÞÌ£ª¾°Êeög°*�uëæÓ�l‚»zóÇvéÇ õ‰híq$8Õ#ÁäëòT°püz®LVœ,6ÏY²íêÀðZ|Lú# íä™D£s $2Þ^›Ðqp~qx ‘x0ʰ¨H´]7-ÞH²á¥”=¿ÇP%þˆ™cr_:þÈrÏ�Ù,ùLN èÑñÄr˜ZÖ�“!£qðAZ�*ôúáÆ£ y�ÂËÁ(¢\Ú«>=¢^JÇ>A¸X×êúŽ24µÈ4o£’µ€†P.z"²´"€µ*éé@«ÛÓó›¯hZZEžk$¼Ò�G¾[ ¸ÁØHxSH®’=zñ'Ò¡L‡Ÿ’ ”öDí¢ù•Á(ºLÚÈåi¾?háúÐüoo$êöþR‚n~ˆkÄ’¶4Žº>¨8Fêû]z@?ª¼ëWéü¿Ò`ÿÛuM�ÿ:Ž?ÐÂDº‘¢i¶Î6?µÕü¯»ä}v÷ìéߦöGP„ öùÒê#0 VC.‚XÉö:ãLJ×|Ù½<9©šÏâ‘€æO][ x亞MËšT!Vʶ¥Mjy»ms´ÉüÝ~v¼IEBY3{Þò&•#ó¢ÏçMÒðôšáköòáen#«Ç›ÌîÁ¨1orªçoòƒ/6Ó,`±M¤Þ%WdE×-3·)ëzîlW–zÑi;{>ÛN4y~´ë1ƒX–$bclÖc*™°å@6+_¿Ý'QY½2DŽQ›"c7†HàâwÅÅïj~'BYŽ+DÍÆÒi¶¶»h��ÈÖ)k÷ÚnKªßÿ¢bÅcýʳҪ$õwÕ”29�\r¹¬Ñû�ÍrtŒaæúƒ¦cä¹éúý'JËM@ €áÇߌƒè8�²¶EÈ(Œ—d~^:»ÿ2Tî^9ˆ ý&¨ƒÐ£n øñ¦—Ìà gPDzzØFNõ°eÜZrév$Dv×] î2¢»ýUI7æ\³YàŒæ9ˆÜ)–­\VaÇŠ¤ªj¦¹Gß�Ñ;›ƒ¨¤ÞBüL'þ�/Ò‰À‰èÄ?l¬£ ²—8‹SY)ˬêf•�U(ˆpUñ· ôªXýi›À¸ÂÝåc¦X@iùwù˜åž]>fa'8—=ÉìVɨ/âøZ—™éR nEª=l»5­~;z¹2£ù˜ÛA‡óŒVàŠC+0®¼rVâ–E¶tÏ“ÎУtð‰lÌU¦ë‚ˆýú ìØk(ŠhýLzŒ›•F¸S\Ôæ¹¨ÍsfŒuN†XI³üšP¡¦æw•!‡žÍB÷ú­?1ÑØ-ȪH>=ûM�ì5ÇhÈ.k â|›]^øtTæŠfÊ9•;a+ŠlÒ öCh[‘U9£UŸm¦;­ ™Ó~j -s~óGŠb/ªú-*\yuŸô¾”ž ÇÌEv‡Fà˜‹S=1Âó0ËXûFÌÅÑ·©Åfl¿‰Nše.ê&¼EøÈ[\“·øeÎ[,eúðä =hrm Á»Ëv5ýa½×»ÿ@4àEendstream endobj 275 0 obj 3118 endobj 279 0 obj <> stream xœí\M“ä8݇úu¬ ¢ÝÊÔ÷Fp™¥�†bg¶�Áaa— †efwü{R.Ûúp–-W—Ý=CÇDL¹eÙ–•O©ÔK=¿ß‹ö"üë~ÿönwûÖî¿ûa×–îaÿÏÝû½�j nTãö Á6Îí­òР W½ºßÝÞ¿Þÿøá§ow·ÚÃîö7á¿W_~A?÷¿Ü¶»»ß¿îú»ÝûtˆîÉûWôp°{ßxƒFíþ¾ƒ®>hÝhÜ[é»x·ûóáËã�i>otãPwø¾=tÞËÃ_�Ð(§…:üë(«PãáÛã µ•0‡wG¤##Õ_~»»{ؽ¡— /Ö¾!Hݘ=xmÞѺՂw<ÿfŽ{5²±&}µß©—½õZîãá5 4Ò ¿Š‡ ”oP�©ðk:´h#C©V7Ò‡R)œktñ0:tJ©Ã],}K_¥IžÅ‰Ô"ü^£YtXêêBT�1§>„ &–Ê.ƒñÂæyßè¼y¡jÚC âTêl(´`òþ ‡Bkš¬&ºÆªçk<|£Ò5Ãð0ÜÕ‚+Äô–Ý‘àN»áèî4Z[sܾ%k¥E¨57ßPß|®v]ݼSmkö" ··ÇçɆҰ¯æ‹·Íô•�S4.iŒ­3àfZ—ô5��¶ÞF¡4\~ƒ 0H ¦8]‰ÓØE‘‹t¡Y¹(Tð}°!畬Üädhê=ªës£$ˆØ(<^Ó«hHÎC<ŒQ%gTY\]<‡l.�£v²0qØe%LPÐäRbxJtD žA ž.’õ~e€øv^bˆJÁ7ÑŒ¥Ò®«D˜yòÂÖþȦt8=fÆ@…Õ‹k¢…U¥YAúЗ»&œvM.­¸sWpM&‚Nq ƒÂ7©jèoqÍI¿ƒž¡ÐÅŸ�'Sã/G‹2ÏØ,^í¹ŠºYoÒ ÏÃΣº¢Þ4¸6:Ï£ëÍïô&æ·¦7?¤öëÍ9&NæÏ ';ÙÍ=&½ùxƒZ«>ÖñÀ´ã‰þ1q<µÛFާ�©�•›€Î¨±ÏqœÏœÏÓ cýGD•ç £Ù%gMûL@çÒÞ�gºt¶³õÈ3 ÂïÚÈÓ²˜­!s—À=ôòÂz’ƒŒfŒŸ3³L‰šœîÊ(ýÙNw®ÞþÊobŒý5gÏÙßGû³ò¹ÕÙ(jæ׺ÖþPÜpÑzüÑö—3ë¬Äþ¾ÞþÒê59¤n%nÐö‡Ôª‰û•8r£LÄ•øÙóÝJœ¥†1gD…ä*²Ö†J€\à Ö]‰«0Aæ³Däû—© êM–Þ¾t2 cÀ$Aq€ÉÏŸ 9S„à¼Üòy웸…“ç*²«k[ ½äŽ¢zÐr¶��žš‡ŽP7Cv§¨ Ì÷¨z@;–%G*ugÏ�äOöTÞ?‘%Ö Zª)CÃ5®v&{¼£²¡LtTÖÛdê9f#àj °‰ÈF{Ù )U²¨Ât`ö‘M^ØE6¾°h°r‘­Í 9Šl!ëò*ï!¸;>ad{ÖyÔ“ÉÚùu‘@K(¥è10 �Ú‰¨¨[\0—Ñš 4ÊF;Ö‚³AUáøô„©gîM}øù`Ê¢êÉX®L ©�œäLUO¾jk7´Æ3ƒVsƒÖqƒÖ]@¿Åh“%®âà—Ü5Õ)ɢ‘>¨.%™G&U�[™ ™që)`mèwý䓦§HW‚�MGÇ%œb²–R2!ã ²6’`óU+Ï�ÄØÕó²ZËM� 4ƒ–Ñ;¢³W-fº±Ô'°Ë2`A UŠídO€Š]±U‡#�^Ì\�Ôs®Z�kÖgûµ”ª€CÕ|ŽiTMóªùfì‹Jî§�gNOƒÅˆG¼ÁLÖà�ôüçÊzþX£_Ë]l�4Ï� <d&§[ÆÆICÇ¢ô—9KkÕŠA(p®õvk˜Ý˜·v®5ß>µÜ×sßì&~8ü0Ô÷x­!¹µ†Œaž%”‘怔p eÊk·‘k¸;>=EÀoE\@mkaĹ02Uc°Üt†YÞªD™Ìºö¼Ì-!f¨‚œ-!0»fYì6×ê´ê££=_íeTÕS×Ê«MPåô€ª™ es›;8Êqf£ëذnš‡d™îê] Ûñ� êiåp$XÉø—a«³Íg¡$²g.Šó£ÌÅæä%õ?=>ft$ÊŠ…z£¥:n¯´ï¥8?;ÞPKh©YTf:eÖåÇ;IÒ¼Èݧ®!#!{‰ž¶8DÉ|ÍlÚ,dM4)Ë$å›(‘¾È•Hth…ç@C«z•L½¿ ´8lè¦#·p”*f§B¶‘šoǦ–}BcC®¯;"sjÇ�6xÇ)©¯ÉM¦u>à_I�ã|8’rôüÃ×Ô- IñuPçyòâ­8ÏÓêF› Î“H�icöPóÃÏÉR4æ¤C£þ^KºLÒ˜ ÀìðÃQ5Ö£ó‡ŸÂíµ@ÕÝ_P‡ÃH6äÓµ¥ª72´‘ê~0´*­úu<ÿ�ØØ÷Uãã¿ í÷ä>�n$©›�5‡ÿvyøOɇäîÉÓ¿‹‡] / AÝó…Q­hÑ£’=}j‚�xw*CO {øj8ºk�¬�4éÈÀá}Y xĺñW'ñ”>$ö¶Õx*q½]SÏôÝ>9‘§$£¬Éñw"OiiTËEžÔ<µ&IÑMÎió’àö£0y²YKˉ<ÏÕœy~ô¹qê,vµÔ/$Í¢ëfÅÛÝOÒØAèËRw?±*Fˆkˆ³çG›4“û'TdOåztœøÿLJ£V†H»¶”4Ù�!â9–Ar,ƒœÞ8Q& S³ú¶r×d�™Z•ÆÚ‚I6›ZKrm«[ªß®#C^fýü¸T²ü�ë6E”:r:rÜÖŒX’å19õH¾¢[Ê]<+õHÊ ×o—‘Jl Œ˜ÿj’IË”�[d�Œ³óHµmWV¯±ÛE7üŒÄ*’I‰nÔ�P—~¼5'™ðò Ա"$¶�s=l²yå�‚h&Ù­fÏu—i&%˜-ÔºRرDœÍ7éÍI&¹�\¬¸ºÌ�IÕ¤g¸;®<éÍEÚI&¥P[˜½îÍŸ¥ÞÇ‘¶ç"ízÅ$»½ŠÔ²èЕù<ö)+›J”t±b=®jþŽ�A'‹Ñ73Œóð=ÃÆ˜±¦Œ|Ì|Íž�™Ù¸Î±'ìw¼Ê%[EÈ—â=·P7MÌ=\‚wñºúM'èÄÊì–ÛA‹Œ;�jÇzÊRoYê)óó§Âkê)Ù ¼FŽ¥¸ï&å ®Ú„ÌÞñ#WT¢q[ÿ1l©á¸øÙqñ³ã¦168a…´ç?~T¸©Z]7û͉5¦±\Û¾|d=»ŒÚl¡­EŠéÇHÈ¿6é�ØOç;vyæKWÉd’8V²]î×­H"Ì�k³Ë—ïú®g›éNëBæ´ë›––©ûEQ9˜ªž¢E‰+�GÅ|¯áEQé>E%§Å¯§ˆ1Äâëg§0U`ë�«ƒÐr L(â'TTêââEóÇsWT¢¸Þgɧ� #ð^”1J^}sE¥äPSRic„T1,Ñü‘+* õ[  œcüË‹¢r3A»Ú{&™¬k)*Á©u5ç§Ø¬ÔÁ/’ÊIåu$•ä·ø`Å|0ApÓ»æ¦wÍz¬øŒ§ <‡>vÇÈtz„EC­£}¹S=³ Fl‚�Šd|™(3\¢Ìd¯þIÉ)· õ–±•g”ºõä5Y` å6VôÄzê?ZÌI*Yj‘õi‘ù­*�‘ n³ìÊ’J�f �½; è̼#Ee’*Òœ¢²8ÿôŠÊˆ(–%{¦ŠJ@½®¨ç¤¨Š•{áË"I%àºy·I m_¤„Sß�Ñ¡cM%»:DNSy®f6wn©©,9¶óYà�ûxRMeg\IS™ŒZ\4‚BùU<礦ÒC#¯¢¨”/ŠÊ5•_¥ŠÊÒ¦7OÛ�¢X[¼{:³o¨è½ÙýX÷$endstream endobj 280 0 obj 3141 endobj 284 0 obj <> stream xœÍ›I“Ü4€sâпÂG÷¡5Ò{ZSÅ%0À@%•„‡@BŠ‚Ùü{žÜ¶%Kj[==îI¥*íÑbmŸß&émÙh¸ÿ×ÿþöfsõÜ4¯ßoºÔF4nÞ6(˜îv’ÙFH¥™¶�2Zù_ªõèfsuó¸ùðîã«ÍÕO�Ø\}ãÿ{ôô ú¹ù²y°¹¾iž�oýnóv#ú?xßróhO� Ó8æ4hÙì߈¾¼�ŽÉFiÍ¥¿ÙüÜ>Ýî4ã¢}·Ý)f�sÛþÓ=Zç°ýu+˜´ŠËö¯-gF‚‚öÕv'€äº}³zÒ(Ù»¹ÞožÑ ýÀº ¤A5Â:ÿ2?FîëÇx|d¶44àÐÍe4¶'[šfgœ’íMxÜSÿµRL¨¸ÀWáñÇ¥_Ó#‚c}ªv˜ó‰èÓ¶èÑJ)Ûë�ú<¤>S£)<ʉÅànæ°Ha„‡¸›A1¢P±Â8Á²^ïœõ¯�z‡ÔCG� 5ƒCª5­¤…FóŒcbToWÒ͸–�‰lü8Bã6Ô6c¢ ‰¡vx9„l�tÃ?]¾UÝj\=G=™'%º…Ù¿¤©yà+ iu_t:¥&äq‡©a’`¦82UTö�ºF’Þia«z×5E­(ËÐ/AŸèkïÀ�Û�þ‡‹CE˜xÀ–&‰ñõ°Ž^äJN’ò€m‘Zoa€†‡GZÊ÷ÙÊŠâêa AS�'º—�F]Ë¥Ô~žW3LGD ^L=‚ GÀ„C¬gõÊL’(%( ˜Ê £„JÊ©Hì˜sK²K #JÌéÛ2I¬aަ^žÁœ›gN”˜ã—cÎ, Þ9YÏH³¦q10GÊs`NƳ8൜80¡¨7ÃjٯĠ٦bP 4^Þ–Ð1)9Æó�•�KÄ•¡ª‡@ÀÊtÊ�K†rF‚²«ÈŸS†A‚á¤N¾¢!Ñ$¸$ÊPV.ýÙÊÐÌ ¦É‡r‚iÌ^0éz&9¿“ÒÁÈ$&Ë:(¡�¹ÛæÏ1iKLêP]¤Y­q¾¶�¶àß|LÒ�qæPÑTƒ)©ûk:¼=˜–¼j}Ï¡h±);¬®tFÄ©©VÌõc�N�|”ZC¸bî,Ld­oë 1ú„øFzBÒ°Á ÿŠùb9¿Î·ªò�>h'9¿Öµ–ÔÙ¢KÕ="I^ë„\R�ºz&µ\•É>LçC–‰ØòqºcÆÓ}ƒxeò’ú”’CœN•JÂ,È‘xäIí¼Å9™–@ xîÅÞ?’$ÇÔMÁÞa(58Ñ Ÿ¶wq+'%‰ŸMA6LâA„Ý6q�!,�U2Ùlim‹"NÏã¢JuêÝÊsUà".�‘²°C“"ù%HAI ߸žÌfn™ÉJ/åÏ)CQªƒ¥Ž¤¡®„¸ðò‹Ùñ A¯ât~vü1:ë·$¸;ÛŸœS‹ÀG<£~Ó7ƒ² +‰Lâ§”Ô¢N;*çŠq6S“«83/çŠ2¸¥óÕ"7õgÕb}_ ³*N½°ã–™Ô🲔öS.–òs×0rèŠÑ¦È5T“®Ìñ‚ó¼¤�¶“ÂZçëE\â%—<õ�wÉÕPA§TŠ{�¼¾:-?7 Š»ò Ž£,€¢&Ùu1(µ}ïÔÁR¡GGÎêÛÕh©qHqÑ“eÈq8-À¥˜ ‘hz‘¡¤’ú§YÜá•Ó�Ú§L.Yê#çhŪ¬ô6 aÉ|ÈDRË’¥r~ÉÁ¦)únKPª_|é±ì“­šÚ�¡ 8û9KõÁnÔîrÇÌäNÙ¢¹mþœ÷Vtq‚©é¡t�'Q9éžÇ¼71ï½…QL�ÙªÎÝ�÷æn©ë£í¨ ®z<Ò¡?Á€Ò2'3qTøÑ3.�”šX³E ¦îØY•ªò÷kB Ÿ—ê„Äê£`JŸw,ga§±xbMUvî~"õ�{”je¼Úõˆ7¦ýÌ·v]t'¦Y}ɹ¶©µ—Ô.qÇâ€Ü÷zÀ¶N6Ÿ¼ÑnNý6"ÊõwBäÈnñе,mL£÷KùsæCíÀañ”m`·x ²vÿ{íCahEËèþéŒÏpDˆÖïO ˆK *�ñì8Ç4ršï?È"¢Çòó˜ÝÔóÎw_è˜×_ÅËå"v)õ{Èݪ¤ š˜‹•lÇ-¢ä-KÂ)%ó-t7™ãºeŸœ^̳á±ßZ£î|¯úI wµÀ™ïô�zWK2¡°f¼îöÙvç/` …ªHðä¶õoåý®ÎYŠûY“!:^ÞüŒœ¥ôœvâ·&1ÅÛT:$DL/ZÁpDûâ}Âþ Ÿá.ºãWâ �it#cŸX˜O²GÕ½Âò©dd:Ò¤»¯„sSl�Í…ÊfÖG-É–<‚;‘vH)‚9Z  )Öù׃Ff{i·ßúø³"SäM£,#º»¨NZ订:C:Bû»¨†iíº==* ô(ÃãCU“æìpë’f›;…T ™Òdµï·’ÖµýëÙ¿Ÿs!Ûþ“ÒÒ 2Tt‡ÝL8Cvh`ìU\ôEÈÿ#töï¡hhþ¥ï¿#¯èE>°¯�nÿëØþ;Ty½=jýuxìK8$žúö¹–Ý]"]¼Àe$÷T”f’›öûñéº{2Û'þÉ!Ú†´^àNVuçàÇÙysÊ…k(C?Íø8²÷ló?†«<Æendstream endobj 285 0 obj 2055 endobj 289 0 obj <> stream xœí]K³ä6ΊEÿŠ^vu=z?RÅ‚!C¨PI¸À‚b‘��¢`3Iù÷¹Û¶$mŸ¾Ýò\RÔTÍõèʶ¬óé¼t>ÍÛ½èä^¤?çŸ{³{ñ¹ßóÝ®oÝËý?wo÷ZhÕ™¾áÁta/­u� {o¢L?é®—¯w/^²ÿþÝ_ï^üy/w/~“þzùé¯èÇë�öì^½Þ6>õw»·;yþ‡8¿yÿò‘^.ý>vÑ)gö�ßÉsic§ÝÞëÐùýã›Ý_Ÿ\'äáÝñÁvA ßö—!F}øò(;¬0‡Eç�²êðõñ�F«Œp‡7GEWN›¿>þv÷êq÷}dú°þ ¥¶�ÛË-=‚¾1¸ô“ÿ�—¿, OSÂwÅ—ýþH“}´æðzº|¤ÑK';-ó¿ž.ÿ”:˜Ø)s¡ÃÇt©�ì¤K­Î…4˜Ôª…§OtÕÛè2c¯¦ÖϧÖOÆÖl /âD[A‚¹ËBtxÛ©½W¦sî4‡r„CÂÚøëP|Ýè”Ð4)`tÁt¥´?6Ò•W¡sÔ•ž‘zJ×Y9=ÏÏcc7® —wœß�=2Ž�ÝÆF5^½:-U©za¼øœr>MÉèh¦¿¢©ù Ý%iÍ�û–Sê{ öÕÑ’5�™^áÞøipbsp†V%á¤�“aet¢˜0ÒN–ÔW6€tûƒÒ&á�–- EÈố«Ä„[E7º†¸•º×¹Ru¤¹zàš\øÒÑé˜5ºÔH(#U4¦ŽNcä© OýœMp´Žð›¯ò´ºvr„�ãÂ.û³ìÜ:ìÔé&ÍGœˆ› Nˆq!NæH75šeÄA…à*ôô�èºì×õƒÚ NŒˆ‹ËˆS軸#»/â CÑ6ì\ôª¥ûp†� ¡‹À@ÏQ—é¹B ¨ƒ3@d>ÇìÜÂz„:z£�&t=qž4¶Fè½1pÖ:–/þ`‹?�æÈŽ£•Si¸* ’†äÃöNY¯]Ñ)™Eš³šÌT@(y‚Sî)þÓdÈIJZ Õ€+[üÔÊRŽ)¯·€”3¤Ü)?(”JM,Y,¨& dº²¶-º×MÒh�´6Z²˜Åk¼sχ˜“¦í�–Õ�PµÕ+¾’BÈsH0D¦,hež¯\´Zª?¤Ç[¡ÌùùBHsø>­GªÑzêú Ó©ï·Ó ÆQå]¿˜~ÿ�i°ÿºN¯ÿ*�ŸÜjüòHÓ/œw‡Ï/’úðŸá–wÙÓ³·3]ž{Dãð~A^S"ùEeô€Â˜‹@ šf3AZ¥™þðñxõËþÊ }ø(]y)åá�C<¢­s¦DêH3¶åDq¿’‚Ndþi?=R¤&¡´LnŸH‘ÚSlo®'EÒèLÓÔCoõÀèJï¥ðÀç¤HØS#RäÅž U#ÝÍjœÿzÁm[yâä¶~>zeUדßf¨@(K0øÎ·&ÚÖï �!8?òba�DŠÇ”¢%t!Óœ:}ÑdÌ\Ÿ2=œ„lC•ªŸûKYcæ�Ã8 Æ{qQÌÐYc'ðIšÑ\ÝX§³RqÊ/ÉÐδ…È)>ÓÖêôZ�ûذVºÖ0Y³VÛdˆØ|@vr‹ê7­qæè´IÒ~GX gVŠZáN฀™¸PQk¦qô¢Æ�¹&~IHË" @­á—‚h#ƒ •‚h-sÞûµŒ@¨@ í NFWšè '*Üʔˊeå°ˆg¤Xø¥&Z…-0%㈩{Qa­|Y=4óM¡A`×ŠÜ ¯•ŠæzƒùªB–Æõ7QéÛ·à±Sä:ÐN‹¢Àù~šžlW±ù5·] ¤ˆ<^„³MPTé†B=…Ó§…ÙB€ŠÞ6 ]ÙŽ€ÈËËkmCÔT�•4j3ÐÚÝ])C‚n|ëB�Æ”>Õ&€ :;û`îí»§`ûÂ&¹ž‚mX�\o¢³*ea5ô²ú€ž»läf×7>­š_›¡‚Ø‚]¬¼\OHî‹Ï—ÜÏØ -É}Ê…¶8èÓ´*�a ‘áÙu°0=æ(š“û`OñOÓjq2> ü|­²n ¾¯"S9?p "ï$+’.2³ó¢è‰Àãf.wUÝb¯OÆ6>p‚™Œ]°ü̬2f0hÈßq¥bžc åÖaì3Ž5Ò·%AÞÆxSZ5fÊM(erYžsjÊw¹1ßk®‘0`¦hšYxR̲-o(+;há ”e~‚R)±UUI5r‹]+g‹Pï™1Øzâó#-óÓŠJÜïôè%$1"¡:Žõ„„ÂþÎ#¸r�kˆà4�Ü-9ΆF”=0Å=,û Ïü, Œn H¤I˜óØ%{Ót…NTS+—ÖÍÃÂÆúä•6Y$ÅÝÛ¨ÉOWÅŠЉn&³É`6àQKïF*¥� 99zqóì>¤›œ‰[ø_´*·à?KgFa­Ô¿C/ž}†,Kwhêá=¨8þ=À`F뙜·Œ™üü¢t¢-òNÅ_Òªy±þ`Q†â/¸-(P¾f*›‡';±O „aÐ2Eã¦ÓšžX–�ÝN�Q28ƒü|$-°-«’Ô�­–@��D z Oà^q|Ñq`슻�|\fyέÄ-©Ý&0HK!þÕEÒ�ÉÛÂA1,ýƒÁ÷èx¼ósåmIeÛN¼-)ÍÈ¸Š¸%Uãh¿7’þ·% 3_ðàChƒêBÔAb5zf÷fn•Êô lJy§ÿqj‘¹e§ïÂÛrÿçmµämý!çmÕ2}ˆêäö<òFm cQò0Ð0^ŽÐûl÷_CF;}endstream endobj 290 0 obj 3135 endobj 294 0 obj <> stream xœí]M“äFõ‰Cÿ »ƒMUf}:‚kˆ%¼ë166³kûàOV·¤úPv©zº¥ á�¬.I¥ÊW™Y/ëÉï:ÑËN„†¿}»»c»o¾ÛÏv²ûÇî]‡¡WÇwªw�ÔÚôà:«¼ 骻û‡WÝ÷ïøzwÿ§NîîþõâÓOèÏïº�v/º×Ó]¿{·“ÈáÉÝ‹Gz¸´�ï½£ºÇ¿íäÐ^jߣé,ºÞv�owÞz¸3½�û÷‡;Ý;Âí¿=:ïqÿåAöÊi¡öÿ<ˆÞ*аÿúpG½%ÌþíèÈ úËãïv/w¯é%ËßP¢îM'½×t zGgÂßöw<ÿfŽ{5¶ÏÞìdo½Vû‡xøH½—Fö(Ó¿Ž‡ ”ïA�ið:D%{iÂYc\èL8‹ÂÒ+šâitè”Rû—ñì›xöÕt6³8A-È07CV÷ÐYP½1§1”,ŒÊ^†âËziP˜Þ9;y)õ^L'Ýá΂ë •mOÒ5Vš^ƒoi9Ü3>¨Ÿæ†HÎ{T99ÿ�S½zÊc^žæ´Üÿ<œ”ÊHW4¥™®{t{œÎ ßÑ»VÒ�„ì¿¢Q†:@D]hÖD€ëA@BO>à3½4Ä×S4…h Aò»Ê^ŸÆ†×ó¿û“‘µ“Éï&þ~2„òVw�ÀKn•Ý?a¬Š™�»#2f†¹CŽ=4�a°ÄɈM88µÍØ­yl˜ ÄŽ(1ÉkžPÏãŸ.Âvˆ¿.D$œD²-­=¦ÓÂI²6™+44ÈOóh˜d¸€ƒ’,ðyögÙjV„¦Îà¢M E+¤€Epô‚b›YëPë=SyÉÌ× Î,#.õLªvÆ[X3r°3Îõ¾ uÈ¡ÎFÔe-¿63™=ãÀâ-³£©¯£§sž÷ò9’rù6g1‘ω¿{/Ü*ˆÍ*°8ŸSAKF"Îãà‡dslt PÈß(� ^�ú5BO8An0Yšv¡¥‰ÔïBK¨S¿Š»ÎÀdæsXÒ ŠàWeØê ë·VFඬd؃£³ÞÎðÛN\!oVœª8:M“L™iåYäèèØÀf¢£;‡¬Ñѱ׳„²m°xK}c*ÎRRk;:w±£k§¯µó›ÅÉ (lDD."bfèyDÔÙïóˆ˜×%؇ÎW“’™-*@a¹Ëíêþb ´ÎÚÚu�r¤‡´ñNìĹÈajÇ9·ÌÒq 9PIÞ¤nq6}k_¥cÒs 3s;Ѭ�¶”·4=gå-ä–ì e£ê`HŒ˜¬•XËnº²¶­§Äl¤ÐÍp¸!iæ �Ö7A‚Ò TóRZsKéæUPîL3pK0{ùÒ¨9\�ƒËA;‰«yêõ+�qÂAFÍŽ8À%Êl’PV g¾°IŶšw›‚7r¯ðAI¼J@jç�i]» ü@öz*}ÎѧÓqÑOB+ú$‡¾¼F0‹F.îYîr{ôÅuµl­\%á¯uÑôù…uõÜïµSÉZÚM€GëËð§¹ðg¸ÚÅ‚ÛcY¾…j¶æ®ÙÆíÅ‚<Ö�Ç~Ÿ©Û‹,Î̵FlP:£ ¹7µÒiæ…æQwÁï�#™çYxéíί™†¹ ~ ~�Í&Z'Æ à×H…'Èk§Â•W› Ïiy¬ãs Ž�ÝË‘‚¦@QGÖªõõ_YÒÝx«Ù’šã �RV6Á�Å 1s°\æå#| ŽìbÜqJèÏA&š:ß”]AëÕ¶[žåŒÊŠ •;—*2TO0TÚ�ª–ŸîáKjÔ,3I†2kÓÕ¡.—ôN×1äc M×§¾�e¹²D_dÉ.³×Lëb‰šç“\ÍC‡Vx-�e ™Èp‹_L¬èƒ°ÂqçN²½Ò”á Ÿ�øÈJ•^M]KÄC\/{k0½œÆn¸Ì‰ìí$¡p6\÷ñq6 aÙg„GHÃÌyÑ„Ñnã‘ÎÈÞkšøé„qþ|$Ünññ@^ÇÑzdÿ %%H~+Û<ù裮Í[Úa%tæÈŸ†–@‡6~”_aïQ½^#]†½6” í¿;¨Þzp~ÿC¸½ †û !Õþû0u ylm©é†>RÛoã¦^¥M¿ˆ¿ÿ=vö_cÓøø¯Bÿ)뢓_hø…±fÿãð ‰û�—¼Oîž<ý›x8´ðèýø|AÉ\ÐûyP8¢Ð§&Aì"¤!Œ¤°4ÃÆ£_�¬@š€td¥”ûÏÇs-àëæVƒ:=�¨ÛV©ÄívPTä‘é«ýôô‘HFY“s?é#Ñú^«Ëõ‘Ô;µ*#r ÆLïÜ™}¬>’%à%§�d[þïè#§'ík¤ºÁî4v’Ȳ+,ä¶™äiظ{à\¨ºŸŽU%‹6c:§ÄlÚÉò«ì� Jn¨�D£Ö…ÈiÙˆZ3*jѬ�\àMYÃ(îdIqi>·Ùà–‹ì ‰«ö=ßí;U0ÔnÖ/T£B^·?Gœâw�6’¥JÙò 6V¹UÖ¤).ó8)uÞ¾o•Xa»¢œTÙOPH² ú²Þ\œdË€å2½Át×*$q–Z}–Ž¥} ‚ÛSÒ§ƒ¸‰D’•°;´Ùݱå˜ ൠUòÜÌÙ°Ðì*…æ«$’ôî[èúiå:×õ/U™¶ÛUDH,òÚV8Û,Š �Ž`(à)Gj =mfÀ¥:mì/þÈ‚žß¦è˜_ó|%Žkë>V–8‚‡Mçp\V™—åô¸Ø¶<ްYÓ‘\´´�—ݺ]we¡÷¢²nê{±#8±…Ú,LÚWÏ�€%ØtddXiÆóP8j®kÍ9ÐVåü')Á¸uÑq$o!ìZšUó57˜–S8&-}jݹÂ1ié¸{þ$É[§�ÄA¡�Åm¶ÉÐ9Ø=µ‰Æ#S”Îwø°µ´€åéâ]5&‹¸Ö�³¬û1©JÔhçkA©MÀ€†‘È;.�õÜ D.¬@صo¹¸}Æ+�ðnÁ�׉öaecÆ@¥¶ ˆ,˜™X°s±¾’œ±öc¿§S�å+ÚJ�^øŒn»�¶+«,O³OÂ$³ÌÒ¢qöe‹¹¹+ÖÏDnÇ>|»í–ªò�¤kåv n÷yéÊÔb‚ã(FàØƒäYÈX…­––‚¶‚V¿î|Ù­yíÆ¿Vz{yrÞÎJo¶paÌ?ß�Ѐ…𮂃:ÿÌF,_È~[­Ü~»‹ô„¯?²¬ÅßíµÆN:µ²Ô7øiͤðSÚ cÚ€ÕâÙýâ-¦ ×ÈÒhVn!Ë–F1rÜ$_Ï4@sa�yáœmê¯å –û¹y¯ýšº4ökîz>�.m.iç¥ë"ï´ùKj˜�Ç–ýlÜüÅþî8¾Ùqæ0‘.ÊŠäN3 ³åzÁ€´Y9RÃËòš«7�ÁÑåI‚2š`[i%¹]:,Éå6¬ÃbÙ&öóO ‰/÷ý€æïHàøl´ÀiüòÔ“ôdÍ&0S¿$Ùº•äVº¾YNÆ/„…ù�šŠUÛ}X¦¥Xµ°�]‚^Wàp’“I©&ÀEz2 +³�Ç*HÚ=¶LžAk Aì·ðó–C„!W®çe˜IÂn¤*sÐÓ ó›ê›y}¥Ÿ‰"l5}YÙ‹›éËtù¦­3HÊý/²ªú2/{¼‰ºÌý_]¶¦ºì³T]VÚôÎÃ)9»S”3k玲ÓcGýt8Aïõî?ú»]endstream endobj 295 0 obj 3213 endobj 299 0 obj <> stream xœí�I¯$G€}âп¢ŽÝB¯^î‹%Œ`ŒŒ<Ãc‘ƒ�…`03¶ü{"kË-*+«»³Þ; K~åêZ²2¿ŒˆŒ%ý¡#=íˆûgúû·÷§ÇwºûöûÓp¶£Ý?O:N)éÅpâAô¦£’êÞ˜N K{fÜ]¯Þœß|ÑýðñÇoN�ìèéñ×î_¯¾ü þ¼ùE÷Ééõ›îíòÔßœ>œèôdzs÷ê ^Nug{«˜ÝÓßOtºžJÙKÖinzÝ=½?ýùüååAõ„ž?^do!æüÝph¬åç¿^h/Œ$âü¯ éµ`’�¿¹<@k™ êüþÂàHqñ—§ÏO¯ŸNoá#݇ _H¹ìUG­Ô=qßh�Þk~Úo/ÐËV[)Îoüá4Ÿ*Ús^ðKøw�°=+ü 5S½âçÏ.šhÙsëÎrbL/“—Á¡Bœ_û³ïüÙ/–³A®rÂ%qïч(ºº�‰^©±éÂBÅs¡÷a¼¯yŒØÞ yrlžÑg£¦™qê–“Ê�Ä �¿RÀII)<êL–“ý‚7 ï†#K© . Nšå$Å~ŽÞ8½geCw>¾ƒÞ?”Û^¹®}ú¾íw…i3]wŠî— iø"ca ¸B?Í_ȰO+7NÀ¼‚9–´NQ³Ñ:â_¥/ ``¶¨©KÜYwû¬‡I DQh ¡ã­¬ #=7ª–è '¼4e=HŸpf@¿Å_Ý×Zœ â~g¬ ¿ßÌlRt%vK8N „MŽ :¯eSÿØde6ÑiÇŽcSm°éxoâõTÛ˜ÊQ ²PÉÃ��bÃ,yˆMI J  T¸ 'ý#mr”üÜX ú¯0eèR žL�g‡.ˆ¢=e5ki*Lè)0xlªŠ©'ÏÆ8¦ª˜Õ’@F»ç“^ÌhŒ<zœsmÖ,Éɹݠժ>•�wÇaB²ž#!A«™úHB¤¥fâ“P%ư¡NÕê*(²vTË �!÷‚_�ª‡NóC Sb†N„S|†.–4tþJ]» QwE’&‘I¨‰�šm/ :Ž}Ú‹€.T|ºžô@çP?@L¹èg0Á–í�]‡(îv™t—ÜãOæ0¢µt´™ÏêAŸø)¨­Î ¬÷¥+Bï©+HAiyÏT*ãåH.µ‰JAõUÉ—žÂ•È.5$³«1«•]ñˆVÁÃí™8\vÕ;»¥±m±�u�ðº`ʘ˸/b–Á¦’ñ^š�Å�ÄF•Xèj+]àÕ'á"ÔׇPlY8qŒ¯ÖÞì¸GfÀx5`õ.m©õ!€)»&=`jL•CÍTp`‹4‚ñW½öº°j¯êûª¥¿±×Èk?l Pï.— þ¶�$Kx Ï"ɱ3'�$Çaû\û÷oh?TÑ¡b¡â@tb†}“Hrµ�ö’}›«b°Þµ.%?P!Ë€’�EªØt9Ùz‘Š:È ÆJNrO´*ª¢I‘¾`#aBb�Z;ô˜³jÌëýøRPÓ·� IÎÌ7r'ìJîDð鯓:ºÆk“°´ˆÑÉÑjÚZCŒUc�Lª—”‚Q¶)꣒ÙCXf îG”£%ëŒrDÃŒr´ô)yu4†šß“›èÏž¿ÃBð '•̈£íÚ ¯N.Jëƒ’ê¶øM 'Gáˆß"*U`@Q’Æ  Ë8HÂjÊ”E?ŠhZ-Ƽ<³y+º1¤ïß@€Ý'…¼3oGtCEˆ�ÂXõ*‹�J/†x8Îy TEßßR£¦‘±-4¤�.äÓ…Ñó†è™.L6¬9‰±„ʾèåù=©à>€¿ ù‡¦9(ÿV­¹�ê.¡ÉÎ*À½Õ]Ä=^H;Èýäò-1Tr‰RUw Õ6¾C-p¯ÂæeÑË<½@}‹»3£r7kQ¸3s÷ÌjÑÓÅwù„N%}𨠿ÇÁ çvAègÀ�a=ôC@ÓtŸ!Q+ܸLw}:pOˆFßÐkÍ�¯ÍÔF-™R±ûˆ<gho%¸pè�ud €M"ï馺�÷Ÿ¿‚né™â°pÕ¨äïPŒjažJåªQ9‹S 6¤»’Á¡õ‡ŸÂpÒ«±îú—XÉá6´�Ü9½¶ÌØó�îñ’01=Ÿ*Î?¸9¢@K —>p×F¸ö;ÿ‚¥Uá¥_ùßÿáûïùRÿú¯]û-LLâÐÍJ«ó§Q~þÏ|ËÇàéÁÛ¿õ‡Ó–AÓû‰C‘®e‚Ï Úpœ·×4s=I4@<ý|8Ò„ŸÿäŽ4¥ôüûù\�ÖGðH5ÈÒÖ^£ 0@†së"rGÕ4[9Kî—®³RÓ dGŸÖ²¦™ ÚSåjš•2®5cM³‹ºª;5¯ðÁaPZÆ3¨Ëüì¸í"öÔ4�C ­m]wÆùNÂæE6\`TÌÑ4 '}4½ßŒPšá@ÿ 8®˜yYÐÄãzsP�xÚmÒ‹X9r ,q1{ܳ³‘ ¿mæq¨kã$iV"mqÊVÍBdBt{Û<­M¥ÓÝbãIc�¾ØyRŒdW£‰­sŒ×ê|žÆh²2š¨§æe¡¹£æy¢R‰¶TR>¨{)*/cêP4˜ÏÆ­àBµ™J…Ö�¢é/ƒ_ LnAwMnÄLœ-‡ê†=‘މ+øfâjòÂ&â\Ü«eBÄDœà qQ"Tž­±½HŒ'i ®4lÕÛø meœ#€´:sÇmosSþ<[O”áç¨IÛš ¤1  ;Îé²Ó‚OÔ>KPOƒ,ëQY^~Òb¬\!U¨²krOgÁ"Ê‚Ea¤îIººQ°èjUV“i51ÅÌ!‚…ZdS™Õ Â$X¢J²’*CG5í±2å8F¹Û~jh×£¥tÏ£Ê vý® æ ;ªÚÖÎOØ=×Î눺¬T1ÎIžK5`ËÁ ` ûh 3ºƒLY·¡õXqÎù§Ëx'™®ãˆšT9qL¶¯òxM"ï„0¬Ò¼-Û~#žó"m-„],¶aåEÚ†½L±“¨9}M8éªEš7™uYÎhŒª=y–‡™Ì5A#”̲C 4<‡2ž›9”¸ç`íþJ‰Ý�•˧YB«ÔÅÉãUbÍPÚ;4Õ¬î‹ékr‹T‚Š&ÎÍS�ô„Ž!mwRµÓl©¤�Ò"Šê)¨¤�² ó…ºüÅ^hÎx´…L`>UQ‚–¶^x²µ¹¾ºjyBB™Æ›kŒÒÄ¥¯1Äb zs'kY\³8Aïçe‡î,–Ö$'S—d²z«O€mëˆD7Ž8Ж.9"q:ëÝäLªÆ5õ#�Ð ùÖ/$¢+Wvi„§ ì„§ÍWÆ”�GMv ØÏ¤(ÆÖ´êXË]WÝŠØc+ê­Þ}Í„hKˤÞ`BÏ;0DëêâöQÔ«·hM•¯¾¶üKÁê ÝGc­8~¯‚«p7+8¾[ÁÕ{˜g‡@ÁÄE½Í£«mž a�.×0Gdv. �nmXíSõG†éœý½ñLãŸyÅVèVŠèŽ@"l[¿‚6�ʦÿˆ]ÂõüÚÝëúz6¨´¶èŽ*—*±°‹–|%›#»�—¢³¨•e°“éÊ;±Ä1%Ü2:»áQB·9PrŠ:òvÒNä)ry’!ä¡™£ä±2yhªËSï`"’SùÙš> stream xœÍœÍ³5À9qð_1Gû`=©Õú¢ŠK ì¾¥²ER^8PŠ‚,›‡ýïi�Ç#͸m÷Ø™y.ªxy>ZÒO­þ�ô®ÑÊ4:ÿ×ýýáíêáUh~þcÕ–6¦ùuõ®�¤µÂ¶`‹*6Æ(ˆ�´ù/=õìqõðø¢ùóý_?®¾iÌêáŸùϾúŒþ<~Þ|´zþؼìßúåêÝÊtÿÐÝ—›g;ú¸ MRɃÇf÷ÓÊt÷侮ñƪÔìÞ®¾]µÙz¥ÍúýfëT­ãú÷ö2¦d×ßoŒÂè4®Ûh¬Ül�@í×o7$?x‹ßíþµz¾[½¤J抵54Ö)߀öùTGó_yO×,rUº­ª×¿7ÔÄ)$‡ëÇr¹#Ù dM}ÃåòëÍ6@PÞÉþ±ÙZAY—K=bRÔmiBeÃèktqý¼”¾*¥/úÒªORb4*ýaZ�e#úšKôSÜ·¡éAô¯¦'1f]…é–æÌjÍ+ E¯•íAR tZÏ ÝÞÿÄ=tŽ‹ ‰gÐÈuW¡*Æé2¨X± ª{¬”ÙÐÌ‚á j¤ÙB G¼]HT¼!UåC¥~Î(9̽àϸ¤¶àS§T6LËj>qìvæ)•õ>ÙØí“�ç®Qrò4¿tù+GÐEÎ3u7Ùq‰+GžÞ3-ºjÀ,—0J2:yÞ=.�óç¡Î7d©Üy¥¬¹¡cÔcgúJ-½ tµ÷P‘'Ï) ƒ´@V•벢ȥ¬ÄÎjõÄÈ|« §ÏN7ÛtZ:³²¼U6Ý8Í{¿3«<Á€¨AÍB�Zå> œÉŒ¸�uÜ]3'àÅù+vD\ôHצ<•§*O/ $­æÏe!W¡V©2°¨°V<Ãd§‰šžLâH‰çø3‹e²+”tT)^;ì2¨ÄñG¯´Z;¥Ó C†KÄÓó�<€&,BµLZÈ¥âô¸X:¦¡Ü9³¡uÅr ÖHtÞ fÓ¯ÒFòÔj·s6ùs¥=—÷ã…e#ç9æ¤ý6·qœ˜lVcì"/Âܹ\çyã^ž%°‰l¡9“Ÿ{‹ËFú:ôä WåÁ2vÑÖ…`J)»Õ¤¿�°Pš«� Ê’X³•Ù„Œ€Íý;vÝè»�]û‘l”“]=})ÄÍÓé?’MC±ÁŒ±µ¸tçoŸ„Nž°>-�× t·¥ØŽ§ G7ó’Ž+ «Ì5ÇA§G…‹Ëô´ù´"Ož°.LÜouÝ|ŠäVáÑ \W÷ÔÔëpY®Pì3̼¾ûÂövº]p �æë‡ö£¡Z7tèÇÁù\!‘Õ�Ò¡3«Sµ>œª•/ƒN &/ª.à|ºÙBE/å—'q;ÓXÑ0ÑXÒpxïŽ=2ìE/Zuˆ'%XåmŠŒ”vÔ@Qj—Aèúä0Ù�êÒ¦¿—‹6I†‚uáÃLé–JŒJÎÁp(¤–hÓŸm³Ûä…΄õkjÐÓž,—0B{°\  �Ï'ËÙöðµ¶Éò�àÛ>>\~B`³ÞmOQ£ÆÕÉYzÌR?’&Yÿ±AùMë¿òë�ìÞ¯µÁõŸyHz$›&ЭÛ4Gº÷÷ò�^ªúÖ×å÷_аÿ=ÜZ>ÿ&ËŸOAzQ^²áƒ_ÿ¿û�±ëÿy_½½úúÏå²»#Y§û¾&ã'¸—íÀT÷äƒ?°Ð ¹%uÖʇ«—íUЖ†!]C³Àe�Êtê6Á~JßO~�ß¿Úq�Ó£÷rõ7Ö’>£endstream endobj 305 0 obj 2279 endobj 309 0 obj <> stream xœÍœK“ã¶€}ÊA¿‚Gé Ðx»*—u6É$Ù”wK‰®œØq¥’�³kû�ïE Ø#55KŒÊU.ÄGøØèñ¡“Bu2ý7üýÇûÝÃ;ß}ÿã®oíT÷ï݇¢”Âô G#B§€€Ð90:ýÅ«^=îßt?}üù»ÝÃW�Ú=ü>ýïÕ—_àŸÇßtŸí^?vo§»þq÷a§†ÈáÉÝ«>\ù.ŠèÀ™îôÏ�ÎWÎbcç”±;½ß}½ÿòptBªýÇÃÑŠR†ýýaˆQïÿ~PÂ+Íþ?)¼ ûïG%Œtû÷”œ6;ýa÷ú´{‹�Lë{¨´®éÒ-°�:¤¿ü>>ݳ@u ð´¢_>àG­Ù?æÃÊ®P ­Ê~›ÿz8zðÂ9xâ„ߎÚÚ¦VgL8}k4BûêixŒ1û×¹õ]n}3µø$%J!?Í’l…O³ ç1TŒù•xá*†×IÊ ïfâé³xÁï%N«‡�¦ÕM�ƒáLúÝ)œMGÃÏb:ßú£¨”-î#s£Ÿãtôúü)èéá�v3ñQë°§oQâÏÒUÊ7œ;ïªïG¶?QM·xû€<(EÊžO´YL35*ª˜²ãÄâ£Õjá‹Óib,£‡QN­éò#€Æ+Ž Î×ÀeÔ@N Ùè4ʵ9hÁ×ï˜Ï ÙY# 4O�&)Ðl9ÿm@‹—AËи,&IŸ­èkš¿ *·ôŒþBͧ õ4ž¹m ÌÖ;´zØlê 2¤]1~Š‹X¸gN6á ¥8›i—å’éÖÛfšâ¬Pùj®}ólήè3RíÎÞµe#÷ùœ¹UK¦ãÆblé§Œ°!45m�iËè°WOE�å)s#W3lM[½&VZ­èP-ÓŽ¶ÀÕjžšvM@Cœ– Ù Ú̳Z ÉT1nrõdÝÚLcóÔZ±RÖËËy– ZàƒÆ·ˆm(G€¦¨Ø†ä‚–¡)´‚+�M…dÐØ±�‚©,œ§Ô\ÃØÆ:—3òiSЄ64 µ©#iÅúég²h ,IMc¾¹kE›â®Ÿ¤ö%-M±ZsBCÖk9j;JÊ�NÊm¡;Ç9L„ º˜3‹d-jÅ A53•qÍFí¶@Ç +(i•š:®–}ã@Ç€j6ý‚·+ ƒ‚7ƒ]ùTé  JΤYpuèÃe%7#æ¡2]P«Ã—Wr¤ÝIF ëÅ· yp‹’ã§ŒwM KOqµ§)‡�mÇ]‰ë�±šÍ—÷LÉ�Gí×Ü+ÜØ3}:~Á8Ó:ëè a{©äršá%¥÷|#íƒ,{ù…ªñ^ +½‡‚<~vÁXˆ›fJ›Îa‡Li ’Wì•5�?é¬�¾$¼�MÇv «€Ì�Ö­ûuø c䶨 JNÄÚ,º¾4çÂzsŽ †�K7œõl%—b QÕìÈ…Ú�e&KKi…Œ5 —�`HøÑQŠíSMuÏHý÷ëIˆÔÀ‘Ë�©Æýž‚²@‘`(Šæ4y.%µÜñÓFù&äáëè/ÔÍâ¨ÏÈÔùÌ*úɵUÚ�G 9ŠÆ†Eæ–u�Ÿ0Ò¶`NG727Úebày¡ZS½\:6N Ì^'sd†¬hhk]*ฬìøIÑÚ2÷y¶íuÀ§ç”€qBoM®¬x$½0rYbSöÜr´+é'ò !C.µÖ„²KåsÍ–d+:ÍïöÉuíal63˰;VF.IÙ?#ó†÷RÅ1+ZŬ 6n¬@icÇ-¡ãg´‹M s²Ôj–%t7ä£ôl¸–näúxS»-¹t*ªC÷»(×Ó‚<~j@[¿ò¬ÛÈ3èË›ZÝÊ{`¯±d™éËÖu÷dÉk,YŠ[p/–ÜRÝñSÚØ&Ði7A7ÏG�6”á¬Ê¾R ÙüJŽô$Ö‚´u)xVr…©@¦¦^¤œŸš*øã'´Nó¿=`þȺpvÈäJQ.9›Íò¡W”ÞÌ[_:ä •/55•äñóTò”r‘�ylï‚L,’ÞEV—î²É#? %?»Z_ úRꎟšÐ26�Nª ºÙØ.£uì/GI �$±^Ñî ºÂœ#MŽº—÷ÝÞ?5ÑÛéQQ¨Plj%•c{®â‰ ߸XmMÞ•¯_æq�•ªú¥Ô?7Á6�Îû :(gf„.”°¬ýj�¬v#?1i;lìfS}©ñ.«Ý èøy ðº tÎNБ… YC±5©È꣈£\‰à‘žO]¥p£Þ~�Í” pʉíS±`µÐT¾bK)‚–K©ëÚ*¶˜Üõ‘ØvQdòãYò«Ô†—O~®ueÛ%0qS® á¡ ^ïG%(«-Iýlã%”oã âB¾§¾Lº×†r?‰§6%:¿ EQÛ8�³­½|DUã8™Å†\_Ì6äJ‡^FŠ•j¯38¿>!€À›Ò.µ)š‰ø.Iï{"w{3‰VìÿEI Z8!¥®(ÈYïÃEŸ�/"ùT]RMçR©mΫ ­ÿ4‹»Æ%¢µ0bO´š6Ã9R‚U~ÿ Ž ¨½ê7¥‹&@¿']ô ­K›Òé~ß¶~ÈÒ™€‡�?Ç ÐIïö°áàÊh5^¦qQ“ì<á#zPûŸÓí­3Ü_Jeö?¥WÒ´n<žzL!uƒçþ�0IUžúMþý_YØÿާæÇ›äO¨Þ(•v8ïöÿ¤ôþã%‹»Oÿ>gD�ø Ï—hü¤½ú"=Ë€´?ˆÉ4CI™´òxô¶?òRïÿ”޼ÂUà/cÛ ²g“zŒp^Ò�Ê¡‡àη¶ÔäLè½Ýý)’Jendstream endobj 310 0 obj 2320 endobj 314 0 obj <> stream xœí\[sÅ~×kòÎãnZvî3¼I€ÇR‘J¶…±l° æ×§{®=³³{ΑdRI¥(ÒîÌì\º¿þú2~µ›'¶›ñ¿øÿ‹OÞbvW?Ÿø§;¶û,ÿöÃÉ«ÿ˜cë݇çÐ�Û3gJîο;a±½�'ÅœÛ ïøîüÇ“¯†'ߎ§óÄ­pVß�lRRK7¤§Z ?á¯B:e$}üb䓵֘á¢<$ïOÙƒšoÎ?…1sœÜìÎHMrwÊå$”³»óK˜ÇW0œ1F lTÃ7ã©òsã‘ÏÓ»ÓQLBpÁ‡Gè,˜ÒÃSh�?¹Ñ÷ã©°|â³þíµ–Z Szû^|+Ìð ¼5F+Ò÷[VJÆùð^Âê„€å ­®aZðliÛ#Œ�wÃ\½u³™uùàÐiðA;|9ºÙÏúàô¥ã0ÛØŸ—�æÇ7ðøEùnXi\ ~O9¬ÐhgÄ…$£� ß@K;\–p>B‰Ii Ç£H©aÀ›0;¡ ¬ˆ~¸™Ùm<_nH˜?ÈØÈ0K¦Óžæ™YQçí®ÇvAp”Æå½Æ½M`‚>}å…Œ9˜àmùÙWÃtsf±£2šÃ™À·¡+gçð+Œ;íWFƉcpméRÒ¾Kûú|‡£áûáï8ç¶òeè ‹Â:Ï7è”âõî”áŽÏ"qrƒx�Alȶ݌¾Ë¤~)ûý¢ì7 7Ü÷ƒdAì9à©áˆ¤HÆ7¢¡ Xˆ{OŽŽHvÂB´#¡�G ÛCìs¨Ã}  �9ž‡¹¨Là�L0¡„ñº�ÏM9"ÈÁ0!Ö`"Š`¾¡{ˆxê÷�õ©Â_PH;Œ`�öÛ€ Cß‹¼IÓ/—;ƒXå³­FfÚ¿<£ŠŽ4‡ƒA$šÜ0�gÈÁš‚ihJr@òÀxV6·/ÉœìÀJAP¢ _¾óud.™­ßVvwÂïŽ@V`�vy‰ä=(§UI7’©—„_LJ6’¹†ÛHæ}�ûQeJ!£îXÝiŠŒìòcCJ +óqºWõ”q02×Þ­¼ 2䬯„æw`âP8d^ìãh¢Ü'ˆ,Ö�E^¥3<‚ xé@êvv!e��¦t3vÝ.r”Q�ýÁ+NYmÆ‘âÁUàæIºÝ`³å肼p;i›ñ‡Qo¹½(+ Å;Ÿ(.jHSá¨?.G%ÇÙ. uµ~•ÙÒ$¤ð[Bäòe ODÄ*¨ ú ßË‹ÂÖ_{�ÐI"¨—º°¿ÄÁ}‡øªž 6$Òul¨YA´"�H­0$BÑ®üIu,bfXO~SFΰÏ@0Ó6XÂÉé÷ˆ½ $Ë� I쭆ϪeShInKã.ˆõ¢ µ÷…ã‹`o‹#·ˆ*Ä®‘¼0Àt*¿yè䨩À¥�1¥[qÖD㬱ø¼fai<·ÊÂàÌZŒQ÷ǘ´‰s•9nÐk"˜B[c ªŸrG`ŠÀU¹w�)žzðŒ)œyˆ¹ ¦Ì "éëÒÉ"-{”)ìð׿e›ÕUlËzõ]Ágïù®¢ýð¼¤ûÂS4ÐAT5rÓÜ’¯u‘&Î!ò±)ª=ˆs‘ÎU²²ª º¨ü´ç1®ßy‡4GhТ̱›4Ç®x}2âP�7æX¯O¯â j²ÒÎö‘3ÊÌHÖý®+õ^ׯx‘Ö-�QhnxQ¾½"àY èA 4Oz?$uÉš,1bV+ß`�ÙV&½KG‚Õ…®E4"ÐQð‡Rgy¬wÙ ��í•Màº�hœ¤H7b(ÊÁöz„ïÝýyRÚ]åúñé¥ÃYÎ=¹”ÂâÈ•~ûÅà¢2B˜b'‚íuÎL×9 �ëš%¥§,I,Òj¦F­ ÔZÙ ö&ú´IqŃƒ~*¾á9«”´Ì}¤,¸úøJÜ¿K¹«�õ>ãd„g\ä³y*$üMÑJ±u^¢àŠG 2X�¨`ëº&E$q6 ™ò²óÎ,³ŒÄM¤žÃ‹žˆýJxíž½†O8ÚUíàÁÃÆe~-¶ ¾›ŒŸ�gœ÷Ò£˜Y?þ\EEp½µÂûS’»†>•@gPÏ ‘®$öÝú€Êxƒ>û|¢˜•]ቔ´dŸ¨ƒ4ØÉJ^…ø{6»C6*å>jÂ%Oy«ylóVsì±BM–¹s{?%O¹¥”œ ׿«z�»VmÒö´µá#Û|Mm„þ˜ÎG Z<«Ê #’¿–|¬ð? 4âèäWÖÛœÊkn:•àuMJMÙ¹bbd�ŠOq›IÈO8k=�,_n J&o¦ù+"º™?Ô)©oGŸRAˆ³Ò¦a\ Xcؤ<ü�ÜëUk¸O^i4*稚®Úè ’¬‹S%j·œtr6œØì|H¯»z¯†‹qiÆÝBÃSVšcÆÝ~ ±Ðü•â´óAú%Ù&6{ʈ6U°p8ªã‘Œ›:�UýñOhn Ì“ÄI«P¸Œ^©–ú\g¡ê†æ¤{e°à^}Ù´r–û ¤Ò¾<ãi°×³&z½#‡å…aÔI›Zm)i@óF˜âÑ»Nk¶”À,ÈYH,yi1*A“-e78út+þ°¦úA‡‘zµ:¼´ïè0)�h(~PÌ*i},�мH¢æ¶†ïÛV4ˆKÓ„RV3–)5Ú˜�×!2Ì y±47£ÊcrG-ß“ÑçT4Gή˜!Ç�‡!~<õ!T '3š+„�ET"�òg r2'mÙRC8•°”•š–xîíÁ¡*ÆëÇIª³…>@¤=ûÂê¿ Äβ"`3ükÄ¡�Çx¡a³™®ˆ^:ÍÙûá’'î~)D9Û•j; ÜMúƒc_Jíu9«XÈС®<¥5Mo cX<«„2á%`(ÝðL™õ‘U(cki$Z‘BµÝpkþúåkT[w0Þ#I8º�&�õLRÆ›QØ âwH›£#"’6¶Õ3ªGÍØÓ¡2i˜.ö��ÂDF ´Æy{P•Б8S~Vv;ýŸÃÞP=»Xº*Dk¿�G7»n°! §B�ÂM9gÑÎÀ !.Љ·æ©iâßÜÔ¬¥”µ@ÛPwá×’Ù|î ®=VÅÇ<ÔŸ�Qt"–ï �½5qÁ,ÄlÖBc�Î8‚2]8ZÖŒ”ªwñUjd}¾ª4>…Z]b�Ø*¡&$4J"®�*íÍ à úõ‰Ra®tôtVCÓT mXP‘Ò>8y{èFAßÒ^<Û4�¹Xì]p:f¡üDZ ŽœK{•˽yL)¡.#JVÑ2»“<².*Å•ëYöøfH¿0kÚãû#_'5%~°‰1Ýìu_ò ÝÇèbðáºofF“EVµÁ‚ŽõÚoÐj¾`¼d4¼zí‚óNp –2ží!Xý ì‹õIõÛ0ƒÆY‚¢(»RÙ¶F²"Î1qw’ÐkyIy‚'÷ ½H°jà«Ô·:yCë¶‹s«¤È€û[U§—ß-+ Ù±ê D«nVed=Ó�2N¹X6i18ûêfXÖÓŸb !ßí« mÈ—fp꼎ØÄ«NõKêDðÊ[�¼ï·eÏK´¨É—Ôe.FïVyì;w¢K”X“¶ Å�«¦†þ×Ý HS¶O# ¬` yØD_°‚T~V ™?A§|QMlÃÙžOlû‰!Éb2ˆ`i‚°t'K?¡nQW÷¨Öa'5þýB¾4Š ð¸¬±»““ôc¾Ò;7ûb¾®QñäÕ'а•£(‰ì¨ø-eh}­þ8JæIÐñ) @êз ¡èØj*çB¦ˆKA¹·WËXªfǹ§öšñ*TF-Ô¿ ¦ÞIÓhD¦6õ4"›(ê‹Pw½–¼#ðS,#YdRnß�Œñ˜�õ2õ@w C@ÎÐ+MoËp1-¨á2dÌ^¬¥§÷A"ƒôÁƒ"ðä3iÛ�•ŠuÝ1ž)w²4žGk–zÍâvöÀ¿P-+Œ$æB襠gÝ( A`åß½Ügë8X1¼Ó½'‹# ¹CU¨Ï%*û*Dîs Éð5èŠF1è“ÔjK…¸å¾l‚<ݸݳ_‡|ޒɦ’!^ÅëßÞ°©Å mØÔ”}vhï$õ•¯;:¹¤1i±A+@™fÛ\ܺþËém¾.þ%í¸¯€¢jT�T‰Š­7ò!}@Ðï Ò=_±Êqš­Á?«Ê ?0~r¥Î) o†/³ô|„ͪÊq¾±½W0ýv+îwˆ�Fï6εF\w�µ ¿KêAj¯Fœf`àBp…+µ\áNø‹ ‡nU–a:ƒ€V¢Ns�/t ‹éE]QØê…þ×M��0@7žÐ”xb=‹m” &† ÝcbÑwë&£JÏ—K–1ÆÔÀæË˜Mˆ ‚÷—€B%¬â"�c¹€õ³&O£C°Èóâñ’rfR›GTìlÌ×%Jó,. ’¦qu ˆ²\'ÑùfË'|T†Ö<"¥Ý_ ’Ÿa•ž=’Rìc’R\åN�ä]ïUHò<Ö­œøÚ�˜çå°»H°ÄŸCk„´˜�*Vî¡{Îu°4­«î9@Á”ªƒ>05àx|ÀÀgªÐã±ê]C0«Ëxpä_¼DO BÿéDm Ç„ Õ3J)z Ä Þ¸{‡ÐÔE¾ƒ³+E{êdˆŒ ø_€!@ïHp+ý‹-M`ÈÓ³­Ì±}L4¡ö{‰‰Xqºqkj?&Úyc5ëÝðÐéÕÐjJôî+“íÞ,Rup&$_WøTE—[ §Â_â,©D*M^ÁLü—¡:E9{ Øý±÷ÓP¯x1ñ_RSìˆ&ÿI4;Ó�i6[*Ù$ŒŒM%ߙə™ù–(œN*IèT(ô`08¸¹B÷þÁ5¬Û‚ö¸ù3û?¨îUþ?ªï? o𥸠63¼ßvŠjœ ]ž9×\;¼¯Åüþû7µ­Ö{endstream endobj 315 0 obj 4367 endobj 319 0 obj <> stream xœí\ɳ^UßGÊ T¹}ËïVå]Î<° Å$`•À" fxÁ$`âÂÝî3öî7¼JYO¾ÜáŒÝ¿þõpîglåg ÿ—þ{÷É•÷oسϯ„«güìzùõèÊWxúKOŸ}x ^஬žy~vë»+<=ïØª¹÷gVÙUˆ³[O®|½ûz«µVîø¢wþ¾]Îu¸/wZÎÅî%ü{UJy½{´hµZ§vï-JëÕ{¹{¾œóUkkÄî6¼üt9WίJúøòš[¿ ­ ­ŠÝÍÚà³å\:ø­Ýîþ¢à‡û÷êýïóëwË]ìåÅ"W笔» èÏúÝG8 ¥¤rµÇ–s«°Gµûjñ,¼øOx|•RyQ›Æëwj—�óõûp�ÁÜàç˜ÊjŒ5* SHE1kõ.\ó°ÜJzûaíf#�ÿsœž‚õu»ï°¥ óðXœ‰s+t ôí­Ï®H¦V»|ëlêÓÚÄÝÒåEܼa¹£;£¡é4ËMX—8¯}1N‚q¨²¸}±ígõ‘Ú`m!-ƒä–\|�ÛªÛÚ¾•ÍaµÌ2–ûIK%,Ç%€Ågç\¬¼‚Lß0S÷¹lyö~#n¸(R®²ú@³”ç0´•yO¯þ°œ3Ô(ë Õ§N$«t�WW¸/Ì*`G>mY9—a*/ë*�&ž¶�?N/ÇW¾Ã±�i¿û=6+ìy¸CD”ì"i×VÿÊâ‘Õ¥�Ë$·Û»(8R”¸¶pÀbü¬�…ªŽ¸³ÂÃÓEº¿ow,·¨ôîsœ1\v"õ°ˆJ`2í-ù»›ŸEUÔÚ¤ð§p=# ~³+ïâFþ¾Yò­(£q*AL qFžÃVÏáQ)…‰%üe8‹ï Pqü‰(Þ,ð�»}Sø`$@CFøÆ�C£· *§~·ÍB+¤�´¤Î"€œ íÂqO”ÑM‹’é ןè¢ÊY·Seœº*E3V'aŒ€?·üx‘n;�“Ðb\h¬‚ô‡åZu›µ|5ÚyfYDÊ4@ï5X@áü|�/P ï´ØýHPáÝEy—-´$ûÉÿç2 2”*Ü®Oà¬�ï¼·è 3l•†qm@nèí›ÔÈj»-QhLÐé°èu?ËÒ ¢d [ H•ÿù°b 6îa–Î$lrv¨6Ö\q´æf÷)Îy)9´',¨‘°¤Ÿ¢Ý�-+š•Œ1uÊÚµWÇ ¾ý¸Èð Ñã\“CñÙËÁ²bKÕb<Á8*I6êÊÛlÔ%í|÷å"¨µêÇÁ¨Ì�éôù1v`ËòñËk�n´uÊö£{Ü,½2Æ�,€Fü· ø�1¿'�U)×^—Þ·íKêÆ!A—EB]|ðË¢"/ÒÀ;¼Qa|rÅ÷]X“¯’ª�ºª¬k‡–µ_)Ð�‰öMîØ GÈt LË*›w²C¢D;&(ï'6*M@¥Ùħe2ëD^´F(N¹åJ_�ȵȦ?œ‹òÁ¦|™¶¶‚®ŽíA%%-…ºš oGÕuî-¿™vмÒ�|p’�•¨!~uÖM|f)ÅÄLò·áå$þ2˜I`Wh&q1“Í�íìm.K] GøÇ·ˆÉ‰Ü‰¹Î]šPGÜ^2Àûˆ”°¯jíš·ÔÚÜÆC*Ì·üx…ì‡ÿªé=«Ïö`÷x\ VLÕàfÔQ½š¬¢Ýuç¬2�‹ÚªØã‘:¿9H´œ‘ÙIQ4 ]€ànͶ¨éÏâe…]3‡¼#KV…,¹ ÂX›§`w]¡ˆ¡`bî²Ú‹zRE·#ûiŽÎn8ÅuŽ[^Ö=$“x’ûírÁ“ìíº šši’Þ ’FÌ�"WéeÅM›àÿ‹Èg`չθ‰Šn÷§¸‰C¸%=ì,ù‰úpf)(ÞLV òÚ"Fä K§y5[mU¢>øç Š‚,‘’ `iŸÇ!ކDz6u8tØS¡TŒûHß�CJ�ôÝþRþ¯�>`8‰Oý‹Å$dZ˜9í˜8ºSÆÀ ŠBU?Õ‰Qm®±&ÜùÊ®-âõ˜ÎæN?›‰:zCÝrFZŽ3 ´y¤å(úåz} 4L€rráw€»0tCh} ƒ[\@·o„ÉÐ,.‡‹Å!)�MÃ}CÏÌꌬ-€G��Ö©e'4–TI!: g}®˜è�ˆg-.Ï (úÈ5öþ1x(ìϱ-¢”)@$}Hârv’}DÜ,Ã0ŽŸ±àÎØ ;¬Wm`,j3»®GŒ7�8›!ÞÔ8!€7 Hö�¥+oÀhÜ¥g«EBðjÚ%”6ét¶ÓLƒÞ }ŒŽleIÂîRH Í®eÿÄ—êm8O@P!maÝm´*›‚=+ÁäÄ~È·`?‚±) Ht•ì©$ó�©J˜Ú¼\JA* X˜K¦¤4Ç$$f)…¸J³<tX%¦¼Š¨Q¢h9Æxì‰^<2>e ò( ÈÓ¤Èú 3Ï*TÓ„ÿª¿�·* /‘ÕgƒA嬘ÛÎ Þ­-ÞOËoUÓ.ªEúêÂLF¯}r‚,xØ&Xð<.š¥{8ìZBàB€R|4�"g_«¦|±H¸ª’W‚QZy‡ö× ëR‰‰À@E�£¤Yþ’a$máiÀ¡Ð9 ãã+}x¡‰ iP-¼Õ08:òê:5úI¦x%¸¯¯iPEY6mÄ©y¸=@׳¨€�ØÕîï8" ÏÈÓ–h½�ÆlqÁYª¶Ä@2ñ’š �0E «ðP Ê5þó4 KR§§Æ{{b¹°ËQØéަ–iŒù ”*²Fç)ÅêW_XFh‰—x¯…­Vœx‚4—ãaY`M·Ca¨3ÜK1:<È ÁÙ•›ŽånsÙ,”•Üœ¡R#:§\�5SÀ5›�BÍÎ:%(Äm5Wâ­b -t6Kœ\ú™lH�Ù_õ¢í.©¥ª¢{ˆÄ~þ Z� þÊ0ÙÌߘ¿J†bˆœ3üDêFò­”­ŠeÌ·59}ë Ë\³S)¬ÞÂø¨”`Ö ÎãÝB;qFàE"�¡;]áÎ�TZ'NÂR¦¤ƒP'æÂÖÜ�áv“ÜkÌièélðôOœÌ8åƒ�KÃä_¶ÀS ür˜‘ÂqÂÌ‹(аcfhòµÜB„èû±••�ÑÆÂ“š˜<±N|û<JʀʜnäEÈiÛ¬ZåEeÀ!,ÚèP‰zTŸQFôm$º"VL·�*ÃpúTÑÍÙo€Ï4:¼QØõ8LE ]r&© a]Ù’7ˆÐ!r!Ù|RS˜qÅ%7•zÁ:é½l D§°¯Ø†�yÕ´ía€[/ùÔM½×š\7nöx­¡‚H7œ…˾•m]E£û  ï>ã7Ë’ÖÕ©¥ª¢$ZIkú¢äsJ•¦E:Û>òXÒ�;-°OŽŽF“%'Q®™wœ‚E@–„óÇ÷rrØÏá¦Ë+ä\@Ñå5m*˜ŒÃ5MùáÛA¢9˜ß"½–r d9�1ð?g–Õ-óJ&3©dÊ)ãV3lje[3fÞ“�© oâ *®†üUŒØ x7ÃC*ào‹i•élc &×:ä&´@î;”à”tº-0ë×ÄWH]P#6M]ò°i™IÙ…_�Sk¤ VÄjÏQàªQóF+`g CBBÄ�‘Û“øtô–€ãN’¶¹¿n®¤¢š*Ô"ÞM`'¬·{Â0õñý¹ÕÛítËõ ÈåPѾ"Õ•¦ B¨M§aÛÂ’´*“ÊCÅ÷T¢5�å‘Ê•1i‰oehw³œ¥ŒU©·ª]¥�´…mt—GýO.ÄÕš:½^½–κv5"�µYm ^[K0}‰&ÅBX€mDP[÷>Ô^éèÛÅ�Ó-£[ñ²™t¤ß·ˆòqcºZ›ÁbE+aÐüÏr Œ}RÒÅB :T6ôˆHpöÀ~|¸dâ9ËÇm¨Mæ ÔÓâ˘+nÜÃs\ è5ÚXEx 6åo” E¿ÂFu)šÃü›øÃ£.€”:{.5©I-m~¼L#ëë*b§"'çdR¶œ¤ÏFœ}bW>HÅ¥Ìs²pYÆ4¡6Ó Ùç‹¡5']‰Ñ˜F.cH)B<#eÙô=Ò[ŽÍLŒƒ~½EÏ ~U#^äêDµÚ P¢Í’Ž>_dg¥žÔ¸Î_¢u]± Óm8xmĬ+ˆÞ{ððìlçfÑyýžÔ—=bÁ>¿i–=”‰IŠÆ¾È„'µþäÈЋß¤‰‘ûT®X—�”2Ä"“’Åm0dô¤j5©¶@³p¿Æ:ÔÞ~Âû˜píNg¦ç> M+…Á¿=ŒíPqï¡ò´“J·’—“KJN,ÝʾS­?¹DWØ?à‚£�Fü@ŠîÐ7ð}�ù2,dkÆX´�É}#±�Žÿ®À�Ðůr}Ä…(Ø(—Õª—K”Û],{"�©ìŽØ¤ÒF›Po“WM` SÃ.ÐEr›ô8ÙÅL(¯OF‘fÞªš)È—ç�ÌNÃñ©ñ€Xº\RwáœúT3g/ڔܨÌ® ÏfNJ\ÉÏ\·—+%:e®‘»&© ¶"c²mÜ•¹Ù@Mg~xFl³�¥ |Ô(ŠScì¤>†Îº3ñQ±Jã)#›�+(^k‚ß)yZã7×Fú–Ã`€„–UŽõÅ q8Æq¥¦�îë‹‹ñ÷ãO0ß©àï×âþ¹ÇAöçî¼µ`šÎ5�HïÕ„Áí@Ö¸[ ãƒ2…¥cÏe†õ6Ùò&�¯‡Òá!áHt+Òv«&ùKa=,àX57Ô vµ^¯Žõnõq)HÏGškèÊ '§? ™Â0£Õ!FÀº­¨˜ÖÙ“°OãOÏT’L´ñ`5>„<¤ÉŒw\,‚ÞK2f'•‰S¹í:%É–¶äPeMz¿rú6Ì¡‘ÒV€ÕÛI”Á—DüÞc›ù *žƒµxãT$V^jžèj¨ÐëŽHG¦¡·ÆóŽf¹ä¿£)qæÑs¬žE+»÷°šsœ4Á¯È÷�Lë)dg–‡Ü&ÍåãrJm øG¥³MÏ}Z"—`5L+Ëí¬¥iiKÚ�_®Œ#újVD“ËOÌ`‚<0oÛ fLC†¼[’ñY.³Ïdu5¹¹ ª²Ü£•ÕN‹j¶1•1ºŸÿÜÿšÓMÕâÛÛ9É­œ¬žVªu'†ž¶ª°]©†)Ä› Óþ=ÒÇ|[ü4­·JAxŽF†È͵‚ˆ»—ê×NMlš„Z-™ô¤ÝF£1à'—áxH�t_´~%)ÚGû„”蘕[þ �–1­IÛÿÎðÞ«[–Mv=*—íSÝÁßÖm�ÔCö£"¾x±rÖ8GÝëÏ_©¿’6h©}ugH~Ò¬îápN2bsÆ™Ëák¹ïwÄEÓbœN Ú\á4JO¸ 4à”LŠ’;§yÀ™ËñXšFõÁm�™“ˆB D|e} ô2:ÐBÛùØÇ¤ºÛ²h-ûãÙ@¥d4ñ~¦t«ô�kÃ5'Ç«§ù™‚;g ¥%kÓEÕ°‰òo†®„g¯·Q�{“†În¿´oǃ�¬c¯Žëì„êÛtß]"x%bbJÍIµßn™žäãà’íƒjy ¨f*�c :W  ¶óÎÔ�í2<çxýz,“m²²,1¢’±ùÝ‘h;¤¢8FƒÆ¹�q2ø“7žOæp�ý~3_’dˆÊ“ónOªQÈíW Ü ¯\û1.o¿Å…³Þ>ÐT¢‰®¥º–S�iú%Ê6I'ÍYŽ˜œRºTtV_«$…‹GuÚ:è«-Š×Bè(¡¸Hz&]Šò‹,M$¸†wbÐÿèô=!–MõypÅ òÜ”sà bg›B� kõØ�;ËüP)`i_SU/Mø5{œ™Žþ(B�:•ªÿqhIõ¿B˯вZª§úÿ -®á+Zr~â$hÑû ¥us§Úê祚(Ö'K )ÆÆ”Ñ5|-îE¼ëÞÇO1Юþ©WÉxË%L< Œ µØÓ|,Ñmrô"…ëÊT:ÔÍ¿„2Ûä9mBh‡³°íWø´É‡q)N³ ¯I�`F•”«Tfô(÷��rÝÁØ­€Ù“sRZã¢wŽ“>’XÖþ¡‘,ð”&µ€�ëxÚG)¥u¡>íô*M’º /ù0(&Z{Úe|gr‚g84V¬ÓâÕ“>–‘3õ�è$Й|‰¥m}«–bøª&FÌ®¦î¤Ù˜f§l³iñá˜ü%?m&VóE»u[(ù›&]V°E ⎻¥èË5³˜Ÿ"-©ÕW§‰�Û­è³N¡ã$µa2­Ôâ€NÛiKgJž/ïñP¸º¹ÅXì9©Žê¶8Ô©Š)щð‹ùži´¶9›Ýe�òãå\Ö˜õ¡Fìý’�q€˜Ã¯1OáøUüŽ™OßcÔØŸ0Âx<Ž’~âÛݺòWøß©£ÝÏendstream endobj 320 0 obj 5017 endobj 324 0 obj <> stream xœ­YKoE¾ûŒÄu�3;ôû‘D„G°@‚ppì$F‰ Ìë×óU?«gg�ã kíñtwuUuÕ÷Uõþº‹Ü ú)ϯNÞäwÏ_Ÿ¤·;¹û¬=½8ùõD–D™½ûð ¤Ç›%Š(w§ÏNd™ÄbeŒ;oü¢Ôîôêä‡é‡Y-Þ{=éÙNŸç½Mãz:�£]”Vazwvò¢ž®1¼c¢�®æ½Zœ ÞMgx”f‰ÁNg�—ÆÙi©¢ïÍ{5$M`žŠ‹~ú¹ z…mDz¼ÖÓSšãkòæ)í£åtÑ—üTeÿ6ïÍ¢µ‰ F•6Óy{ú�„ùE†¢®w†ÍìÛ^r}ö˜Ïv{MR$T2Ó3’bŒ1i÷�@£à;ýÒ×°Ç¢£—kt˜þš÷‚ì£ë†0õδÅ\)­’R4òlþñôÓ=Žúô'‹q¨l½S\—³yЇM"¿K»X(ðÉ\½)$Ÿ’�‚ñY«h³¶ì�6í°XQvU.°Åçu—Õvi�…¤Fx qÓŒP^N/Ûú.éÅlÍâCti۹䜽òfQ»½Ô°'†ì¦¯g«0¤…›q¾y2/Ø�þ�`wì>¥”ƿڦÔy<µ•#ŸP>�gL³qêӘLJþî±.Óª½¥­‰•mRKØÑoë„Ê& 9íÇœþž|9C#L�Ó;³ña²™Û ‡YÆJÊÛO¡Þ"¥î9ýÆLHf~ÿp\('aHºÍ¦³*áb4vÑ1/æHá ›ÂæÃt/£ å´K<C¹�µ‡¿I1: 9uÖ=ý1k•íï@Àpä9&÷�²Ì”8Q d¡H°t¢¥-"ÎFU›vOÉr›’vÀ£”»Á-"Ôôía¶%ÿï€;ÖÊ[â¥Mõä|c+˜ÄW3ƒ@Âf¼ uHFK¬îR‹X»þ*¡ý â.úHOe¦VN!BŽuJ¬�¸E{™m¢g¡[|æ„a/³º.š­¾áÄ4ŽÝzÃc¼˜à„c™sÐ5è“£Ûöl]?Å‹ +XÝZ³¦‘B÷OxœYÀÉ2h~R ô•¶§?Yxݧ°Èüy�—{­2âdr‚,½«¦/IÜ9NKJ]å¤ð®fÄíÑÖÃÕ 6öu ω§<ž1Œk‘¬?ëÇJF×CQqMK¿ôI[ ÕRgäÅ>áÕ¸Q�ŸB^.E>P³P—,,!ɻ՗ã£0"ÊG®8Æ”÷~à“ø*�¼Ç„·â½c£‚¾;Ç(·9ÆÈÌ1ßt�—¹Äj½u]P²SÙ€ fì³UεwG„Ô}ûA°$î3™D«”{ˆUå³Ew`¦”eð”05ѨôèìÍG¨é–«·¨‰¿r6Ü!K¡†DÉY–­ÊÚNáH·Æ!çÇæÅv_¢nt óÉá6æšj÷Št™:ܵ@Ñàc W2`eÓC1l¾"K¼áR½P?KqVÒ¬Öu2 ¹³ïdõ‚�”ŒÚr—Ögט„V‹Iª«2Œâ4q”±öõâ 7I©tw®¡67>f`ʹöÄQ`¦ãëôf…!+W5ÞAeÊTÇy½ækR96ÖEmŽÙ¿Mã«}Fä·öÎ�¯¡KÅ"p…ìã Þ«tV{­z!") r<êâJ8vî]æxQÔô²³Ó€!¦%�ư{˜K` <9�œ%¬æu#Š|ÌÃ¥ÒHöÅžT››Šž·º¿«ÁP±2õzáè•ÔÑÜîvê| û—Å; N–H•Ã{¹ë€˜8è?g³›Veë‹U⢛ï¹bÁ ÞƒØÒ—˜¡±åM<Þƒ4 h UÛÆPß“¦!�>—5�¯‰"u*Øï! *s°úÙ̔6õ��m˜õE”>Â.„ˆƒàÒ N•S¨jƒ%㤠vsÍ,ëPZãYFv·µÙKðq}Ø[Q¤\ÉÊÎeô�8¢|€ó#Ôoü GZÞO;û™2ýAƒ«*4t$üf«KJ‹ò:‘ŸF« ²ëu?¿y]�]Ñ]dkY}J ðäྃ–®nB¶ê;ÖðÛm-bjŽ6.ß²ìB}hŸÕêª+Q«<ì MÞ½Ã\¶vIâÁ‡=Þ™]ìž«TÖ°€jâzY_yÑ÷@›Mâí®¼RÉÞä¦è¼óJw¨Ûu$K’ùp®Š‡ÔQMÛöD§ŽÜþæïiÂ.¶V—£¯iË@ÀPGÒhÙ+¬±·Øº×z“F¤ Fx>0~Ð�KYõ½É¬1h ƒ˜ƒÈ%Ñù‹¾»3ˆ-Ð?2ˆÛ¸Åzÿ‘; ²@úVºJd˜AßZÅ’…Ê)Ù#­ýèôäküü ó2dendstream endobj 325 0 obj 2109 endobj 4 0 obj <> /Contents 5 0 R >> endobj 14 0 obj <> /Contents 15 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 46 0 obj <> /Contents 47 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 58 0 obj <> /Contents 59 0 R >> endobj 63 0 obj <> /Contents 64 0 R >> endobj 68 0 obj <> /Contents 69 0 R >> endobj 73 0 obj <> /Contents 74 0 R >> endobj 78 0 obj <> /Contents 79 0 R >> endobj 83 0 obj <> /Contents 84 0 R >> endobj 88 0 obj <> /Contents 89 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 98 0 obj <> /Contents 99 0 R >> endobj 103 0 obj <> /Contents 104 0 R >> endobj 108 0 obj <> /Contents 109 0 R >> endobj 113 0 obj <> /Contents 114 0 R >> endobj 118 0 obj <> /Contents 119 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 128 0 obj <> /Contents 129 0 R >> endobj 133 0 obj <> /Contents 134 0 R >> endobj 138 0 obj <> /Contents 139 0 R >> endobj 143 0 obj <> /Contents 144 0 R >> endobj 148 0 obj <> /Contents 149 0 R >> endobj 153 0 obj <> /Contents 154 0 R >> endobj 158 0 obj <> /Contents 159 0 R >> endobj 165 0 obj <> /Contents 166 0 R >> endobj 170 0 obj <> /Contents 171 0 R >> endobj 175 0 obj <> /Contents 176 0 R >> endobj 184 0 obj <> /Contents 185 0 R >> endobj 189 0 obj <> /Contents 190 0 R >> endobj 194 0 obj <> /Contents 195 0 R >> endobj 199 0 obj <> /Contents 200 0 R >> endobj 204 0 obj <> /Contents 205 0 R >> endobj 209 0 obj <> /Contents 210 0 R >> endobj 216 0 obj <> /Contents 217 0 R >> endobj 221 0 obj <> /Contents 222 0 R >> endobj 226 0 obj <> /Contents 227 0 R >> endobj 231 0 obj <> /Contents 232 0 R >> endobj 236 0 obj <> /Contents 237 0 R >> endobj 243 0 obj <> /Contents 244 0 R >> endobj 248 0 obj <> /Contents 249 0 R >> endobj 253 0 obj <> /Contents 254 0 R >> endobj 258 0 obj <> /Contents 259 0 R >> endobj 263 0 obj <> /Contents 264 0 R >> endobj 268 0 obj <> /Contents 269 0 R >> endobj 273 0 obj <> /Contents 274 0 R >> endobj 278 0 obj <> /Contents 279 0 R >> endobj 283 0 obj <> /Contents 284 0 R >> endobj 288 0 obj <> /Contents 289 0 R >> endobj 293 0 obj <> /Contents 294 0 R >> endobj 298 0 obj <> /Contents 299 0 R >> endobj 303 0 obj <> /Contents 304 0 R >> endobj 308 0 obj <> /Contents 309 0 R >> endobj 313 0 obj <> /Contents 314 0 R >> endobj 318 0 obj <> /Contents 319 0 R >> endobj 323 0 obj <> /Contents 324 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 14 0 R 25 0 R 46 0 R 53 0 R 58 0 R 63 0 R 68 0 R 73 0 R 78 0 R 83 0 R 88 0 R 93 0 R 98 0 R 103 0 R 108 0 R 113 0 R 118 0 R 123 0 R 128 0 R 133 0 R 138 0 R 143 0 R 148 0 R 153 0 R 158 0 R 165 0 R 170 0 R 175 0 R 184 0 R 189 0 R 194 0 R 199 0 R 204 0 R 209 0 R 216 0 R 221 0 R 226 0 R 231 0 R 236 0 R 243 0 R 248 0 R 253 0 R 258 0 R 263 0 R 268 0 R 273 0 R 278 0 R 283 0 R 288 0 R 293 0 R 298 0 R 303 0 R 308 0 R 313 0 R 318 0 R 323 0 R ] /Count 57 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 12 0 obj <> endobj 13 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 192 0 obj <> endobj 193 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 219 0 obj <> endobj 220 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 229 0 obj <> endobj 230 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 241 0 obj <> endobj 242 0 obj <> endobj 246 0 obj <> endobj 247 0 obj <> endobj 251 0 obj <> endobj 252 0 obj <> endobj 256 0 obj <> endobj 257 0 obj <> endobj 261 0 obj <> endobj 262 0 obj <> endobj 266 0 obj <> endobj 267 0 obj <> endobj 271 0 obj <> endobj 272 0 obj <> endobj 276 0 obj <> endobj 277 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <> endobj 286 0 obj <> endobj 287 0 obj <> endobj 291 0 obj <> endobj 292 0 obj <> endobj 296 0 obj <> endobj 297 0 obj <> endobj 301 0 obj <> endobj 302 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 316 0 obj <> endobj 317 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <> endobj 347 0 obj <>stream xœ]�1Â0 E÷œ"7h¡…‚„¼”¥Heh…0p{·00üHÏö—ýSõÃqp6Éê½¾a’d�‰øô¯¨QŽø°N¬ÖÒX�âWO*ˆª?©p”yi泚°º6mÇ¥ÕlÒÞà3(�Q¹ŠC]Ã�:ó×ÚΆ‘–Éf ,Ú!BÆX´£}ÁXë‚`e n�•½T°Vî*^ý]R®(y¾çKýŠ]âЪd±ÿ|(.™%>†eà endstream endobj 40 0 obj <> endobj 348 0 obj <> endobj 38 0 obj <> endobj 239 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <>stream xœ]‘Ánà @ï|p“�J—îÒæiÛpªJPšö÷³M;M;<¤cãØÍéürÎË®›÷m�Ÿ¸ëyÉiÃÛzß"ê /KVtZâþ09ã5Õœ^Cùú.¨éÎÕß›�Cgä“­IqMx+!âòÕhŒçÙ+Ìé_È5cšÿ\e,xRð“ëÁ í}ÅL–Ô¶~´Gû–õè€v` ^¸2Xÿà(Ê›Xaè!d¥Ã¥Z*ÃC§;ê·“¾éTcOõÒ•›X�H+åõ’ë"©£> endobj 351 0 obj <> endobj 34 0 obj <> endobj 352 0 obj <> endobj 32 0 obj <> endobj 353 0 obj <> endobj 30 0 obj <> endobj 354 0 obj <> endobj 28 0 obj <> endobj 355 0 obj <> endobj 212 0 obj <> endobj 21 0 obj <> endobj 180 0 obj <> endobj 356 0 obj <> endobj 19 0 obj <> endobj 357 0 obj <> endobj 17 0 obj <> endobj 358 0 obj <> endobj 178 0 obj <> endobj 161 0 obj <> endobj 10 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <>stream xœ]�A E÷œ‚¦MuaØÔM£^ahXH mÞ^†Zc\<’?3?3Ÿªë�}ð3¯.i47œ¹óÁ&œÆ%ä|`¸õfþ¨òš§Ž¬êN:Þ_y@·ê³~bu­[QJr5™ÑâµÁ¤Ã€ì „:8§û×jWÃÃýLT– V„Ý‘¬U!wIÊFÚ&ËZªBî"Éì#ľ¬Þ–Дg;Ÿ›%% s ]BQðû/qŒäâöš8b¼ endstream endobj 49 0 obj <> endobj 361 0 obj <> endobj 8 0 obj <> endobj 42 0 obj <> endobj 362 0 obj <> endobj 41 0 obj <> endobj 328 0 obj <>stream xœuTPT×¾wwÙ}!@#ºÚÇîJšV§k&D01™€!ÔÈH L´­LX*,‹Y@XÂþ¸»‹²‹ÈŠMflˆi±jÐÑÁÕ1Lš©£Qc›±6‰“àxœU{(fúÇ›¹çÝï|ç;ç|ïQ¢RJ©&#ûÕuIÏÉÇ_H?¥’¨�”L¼S%FlŒ`QJ¥zOœ±Rÿ©îG’ù)2Ÿ'’L²šü–”�â ;Hù€%çÈ?Èä4‚Σº˜.§Y4�fTTÖZK-%6ÃÂŒE†¤´´Ã+åfki¡i“!Ûd+1—›l<(3¼QQXj¶Õ>kx¥¬Ì°VΨ6¬5W›­›ÍESB3*Ê+klf«!»¢ÈlÝT`5n4ÛÊÌÅ6ó–A�ía0YÖV93šNFÓH9ÍVY]S.‹©ØTTZ]Yfª­´VÕÚE&«yÓ$©Åj*’5óÓäÛ)²é×饖™r¦£G°i¦ô™ùé3.8h6ó¬œÙIBȼeK—¤$?¿n=©¤U åSsbçꡌz©�úiÝNwÐv AÚAwÒNº‹vÑÝM»é¢•·ª! ÈJb!M¤Ÿœ¦kè€b®b­bH1®Ô)W*GT+T�XqDý«4;�ÄŠÝ¢úDæ4ÄÐ+ªF)ôqHµ£¢Fƒ×3¡[=›_Üü?ü“‹µØ� ×9ÁùJ�ùÕ' {¯sHD'\_ŠªïŽPQõ=?k!>‹°ª‹ž^ðjÊ7·.ªÂ\&„o«¥ÒÚ>?ÛÏ|ÌßÒ.Ÿ'VÃOØWõA÷°ãË­—×÷×}’?°\èWc4 DˆX ¶1�Çõ¶ÇŶ°mÒï•Ä…CᱦFÖÊ<ñÛ‚l�.æ�êÞiYǰ5L¡KïÃbå„(¢Q»jc>Æéò¤ša Æ—}ü7ýÄIÍù?†8ݰˆÕyˆß·áuýý“šEÕ;Òûš˜ô\±¶WTµòYùž’DthY›Ûçöo8úڤؾjþžÝd°û¬†(øq0È{ô æ´ç­±7èžÁèU˜Å°šab?n€ù¸¢£ñüË{˜Ð`ú˜ »ˆ[x g•^äGí>æõv¼#U›ãÚwÉv:‚� Îæm­ºð®ûg°TjA½!T÷épÄã"·ñm�„Oj$Za·M�«.Ö2¡µÅípú\m.ý‘7Ï/?€KÞ}.ø3ö,ûyó3U‹ÌhÈyaÝÍÍÌÍÜ‚£Ý½=tâLW§î;ˆ>Y ªYæ¤%þÉe‰ãµ¸q¼õ˜²ÛþÉç°õÞÁ˜—úâ¥�Eõ™í!ÖÆ¼ñ²l»³¡ÁÉ7E{÷É2'Æ)ä*!ŸGZÈDãÄ1Wý(�ƒþ ƒDÕ~Ì-ãý14òµ(òRe s1×xÇY•R§8nÔú<Á&/öªýoprEzËþ¼Ù @<Ÿ1haRÄBdÀ«~?óË‹ja� næhÖÓ ¨ÏDËï1렃 —3l:ˆ½�„ö÷Š>*`žŽÆ®º@‹ð¸€›\ÀÒ{·ùȳ`×CMýîâ¿T÷¶ìp³&45³&g›ÓçÖ” çžEä]3†-,œ‰Q¸³ðu·Ûíb.¡)È:vùX ¨»uõ.èGÁröÂ2ÉrÝ/D"Þ=Û+>±Œ×-º¦Ïïþý¡‹?ʺ�Ź“ag:\b׳w?܆48v¯^=tˆw,›‰w\_ïfv»oàHb8Ÿ…ÓX8áßa´ãñÛŸ X:}¬‹ ]í²Cgוr®)¥>Ù¨LJH’ ØÇßz×| `c§›Õ3¡qºá-².ðá'ãÎÏð kîµàmLÃc/bbjªÉäv=j»³ËÇB!Ü€‘;R>“Òx¿ÊùÜwªzÅ'ý²µ¿VŽ»Å;uZyoo·ÿ„`^è¹ÉO½ LJgÒKG¥HXWF`îEˆüŸßçcmrÏv;÷¶[çñd¯Y� LGÏÊÇcÕ˜ìÀT†),9Ž…¥xëS4Þ„oŸ:¼žn&„¦¦0K�”ÿµR:.N¬æSˆü�‹KáÖJ0!aáXsÀãÝÊ„z‡<‡VŸKÿ_>Çy§PÏ?þSÇq‚…ÓYø¥ß„#q!^ù5Î}#ŸGâq»œò,¬+Ä!>�×{öô%P@:xnÀÐa8ÖÉHe�"ļգæŸF�f(rèI]¤ª¶"ê‰Áö¨(þDò?öØ endstream endobj 39 0 obj <> endobj 329 0 obj <>stream xœ=“{lSUÇï]÷¸BÅGh¬·ýGÐÄ,‚1ÎG`¢vee+[Y×»um·¾·®koûk{Ç]»¾Fk;Ö]2`›ƒ Çfˆ‹ÎD#`P3ÿPÀ0ƒ‰ñv^Þ�ñŸ“sròËù|EŠ‹EK+d²�›—wë kÐÂÚ¢Â:p5K?/U–€PÂâüÚâ[O³O±›Ÿ`ËŸD(úNåÁ ¢Ù¨UÕ7è¤/T¼(ݸuëéŽ&¥VU«ÐHe ]ƒ²I¡ãjé{D­J©3–Kw¨ÕÒýË­ÒýÊV¥Ö ¬{øtÑÔ¬×)µRQ§Ôj)U=ШhG�]H%ò*²y©FÊxZ¤ I¡åè_E_ ox€ÊÞGV=@§¢H'Sx†aW§¦“(+¾>xMÀÞ]*eŒq]³¦E£=nI3Ù|ßËý)¢BÁ  ©ôc3ÕÃÕÏäÄzåˆFÇ‚üÄ�ÏN–¤mº¶n‹Ç)1Õ¦»<6•­Ée&Ÿ¬¿|wЧýÞ°Ñêuµwãfùá½rÀŒŽp&y,–ð`h„«a ?üG¾Ã:n uÀHÂGù~ðIba:1Œi¡­ÍMú#ÌÙÇçYáV˜Çeÿñ‡Aˆ>;S=VÉ•¼Í­i了¢Q¥ñ¡¯f.],Okµ6�ÕKò4E7¤Œ~ŸD ý…?D½Œß?ØÍÒ¿cê}VO³[-ñ’ž ±ÎÞ?óãƒì�’þhÃïã¥-à§a·Kì¶ ^ŒôÙû£¾@.ˆŸcW O°"À~+M€Â$·æÞY±“p97áÚ^Xv“.·Û .Ìë·õæ0ˆ�AÎ7yÈ{ó0 9½@EûT(2ê5èÁàÓût~»�7‚W\àÃf™ÛQ†=te¹ŸæìÂÒK"å?=oóÚ½\±ClòڼЊY"¢Iw;xÜfNzoFì6ƒ <˜6鈅ŽS‰NGÆØ×hfÞõ�ªø;ÙAZ º°�3ÊÙ;#ìúÞ‡Q{ºM.¼³žØÆG­„‰¾8øz’’åÂp}Sæ :KÅÇF¦Î^š¸ Þ‹`gƒÓB€kÌ9£éSñ©‰Fæàîª�j?Æ?üDÝrĺ,jà—G F¯. qö{QÏ@è ÐXÚÔg$L-·¨NËãVs8÷·�C®Éæg'³YIb÷|WNA.™ÎŽE¿€l•o®Ù�›÷äu€©ÈS±HhŒÎI^Ñ‹\FðX-dò-`µuƒßާ™YI~úâéó€]M¼î”�Öžjò6O¿Én»cйE–[®Ö‰:»4`y(hh(3:]•‘ﬕ·wඬòÜv²ì]neÃÿ?J’ýñ›Ñ €]ˆ5µƒ£K-Ñ•ë_vÙ-Êz•‚÷˜]l4B�„^,×i#šô‡÷Ï>›NàIÅyb0vÅ×ìã'Eàt�ͦ·|ÍéO=éàˆ$2MÅcWB£=ÇS™h,“`ø*ä!mÁVRKÛR\.Ô×WÊÕ„ÊFV,¬ÄWoI ¡„Bùæ8iF endstream endobj 240 0 obj <> endobj 330 0 obj <>stream xœcd`ab`dddsö Ž4±T~H3þ�aú!ËÜÝýsÉ÷å¬Ý<ÌÝ<,s¿' }7ü®Ïÿ]G€�™‘ÑÍ;Ê9¿ ²(3=£DAÃYSÁÐÒÒ\Á17µ(391OÁ7±$#57±ÈÉQÎOÎL-©ÔSpÌÉQé(VJ-N-*KM[윟[PZ’Z¤à›Ÿ’Z”ÇÀÀÀĢ™´ùþ3×Üfø^¶‡ñ;ÃO æŸõßËDg,î^¼¤¤»VþÏ;¶Ú’î¢âÅÝ3äùJý´_Âö[x*û®Ü{¦óð00YM‚ endstream endobj 37 0 obj <> endobj 331 0 obj <>stream xœ•U{pTå¿7›ì^&*ÓYï Z JbdŠ4¼…€Je#›‡l²Éî†$$ûÞÍ>ξŸÙ�d7ï`@ÀURÅGÆ2Å*�HmQ�:ÔèØgZæ»›o¡ý’ð²3ý£óÍ�ûÝ9ßýÎïœß9¿CS©)MÓ‚‚í»^ÊùÅÔöQî§4—•Â=ƒ[…“ CÌæÁìÔ¾¬ŒUs¸BW@g¤¢éMÛŠ*TÚVOGÿÉÓï~0~ùZ�¼¶IQUQ©Ê^R°4;ç‰'r³×WKU/Kj²·KT•Òj‰Š|ȲwÉ_®’ªš–g¯—ɲwNý¡ÌÞ)UJ¥ûg�È«këUREövù~©¢F¢$û*årA¥D¡�7ì/“M{’ÔÖ*ä�Òºz‰L!Ù?uù´yÚF,µR…²¾L)UɤJåô© …TBîšÞWÕ”WÕT©š¤2iµ´FU#)“IÊå2™¼aæl�´‚–×(eee™DAœRõðsÏÐå¯TP)|ÞRQíüy?æ¬T<¼æEåP�S ª˜*¡J©jˆê í4ÐÚI»h7í¡½´�öÓ:H‡è05—džJ¡L´�ΣÏÑ7R,)Çy‹x¦T6u(msÚ0?…¿‹?&È|Èä0-³³ÖÍ2eþ;å·.ê¥Ҽǥ½O'²®òÐ÷‰uB¼pÞ“ ˜ç—Õ íðvWh8|üðZàkÂ�Ïâº_âJ»Õf+Óê±yb#�~öúùET;ˆ"Ì{|$@™¥‹6=�á“x�í@9“Âèi¤GËP>ÊÀ‹â Y‚ ÿ,…3ÞOlyŸ½Š²&x7…à!À³sKvíhÝ6Æì²ù{F;=l÷ø[—ÐÃÀ y|,ÈÙ‹·íÄõÊÏ>ú(0Ol»õt€[ì¯^[§knd5z½Š™ÚqýûÏý…�ø,úEçøi´íüeW�×Ñ㌻N…0ãµ; Zx–B/Ý ÿvƒ‡ ‘K8¤ì­©Q*kjz•CC½½Cl&gÅ®WÞËUEi$û˜‡Žsg…pº{û:;{zÇÝ‡Û ^&díâ•/ØX¼UË ¹N®V×Ön³0&“]¯÷BÐ.>e½z3x¯ž‡ªwÊOUÿÑø*0a?„‚fÐ;Äk=å#†ãÖ8á5=&€#pÆÔ|´µ¥ƒO`�™M@Mî"ˆ2â<´*!F «¡Õì­|�£QèŠÜ_ãªbwÀ.„àØ 'ö m F¯Ý ¸K­'J.Ø ’ÁÄw5¼èÔ·=ýaÝë:œ^@Îà-(€z¥¢©I¥Ühiµ[,`ftA^¿væ‚“E$ôoápÿ`$20pÎÍø|ŽàLdû\kbp�€çÍ"?§/sˆ—XŠ #]�6‚Zœ|“¯n„††.ˆˆgÎbÜvãb®�Ç­!ì "T 9�à… �Ñb1X\LV *Ö…lN#ˆôzƒÎè¶ bTD E¸H¯·šÁ,Ò A¿Ó ±¨xjáâ ÞK ^öB~›Sºíâ¨?ŽNGi.-Îã–¡�„h˜%FGøí#ÙnR³ø>*¸‹Åýøè½(¸ïîÿ�Oè8ãæ‘ˆêÞæ¡j¯;^{¢.lèÔø€i‹„û-AµOŒ�G ÎÜa/V‡5$ÓF‹ç,� ÕŽ6{�D͠Ѹ4ŒNÁ«ðœ M&iÔÚææ°9`£ù[ðüÍ‹Ö ͢戶�ªŸÄ>ç5ÎKkX["Ú ôØ#Læd‹"†‰£åqÄFéÄô¹ð0)Â6ýhå¨*j8h(QUjõ6h&™ä·Ü�ð+~þªÆB" ÚÚÁÑdÏücâ´r$ìò¢ÀßêÔ¹ðꑜö~­ë§Íaqµ‚ƒ´¶®Â/VŠ“_ÝIYûm ÆÆ¾{�<ôXb/!å^ÆL“ÞzHog-›7J¶Â(=²ydßàž×¶³býÆåõ>£/äêôˆ=W.yÎÂHõùÒSòw+?fââø7b¬I�™‚&�íP‹�mݹ½hÃÿwÉ·>½6oýnêVátó}šˆñ8ÑÍï„x—eñÛ¼„+iƒqÉSsu»Hó»-^ÉC€}çu´7¹Ù«vÚC "ÉuûÚ¹âÉ s=!‡C4"YÛˆ8/\‰—ÔkÄý•“ç?ûJæÆ{?ËY¼qmnIYÏ[¥bù«¥çäǘMû„ÒÍë`bŸ¿ûŸ¿>~éÊé7T{Gă²‘mƒUDCSÚ_%D�Ò7xÜè�tôWü0ÊBéߢ,aõ}$æÞ#9-À¢\1ZsŸ}g|§Eó˜™J%–Hý„NÄ� ="ÆOô„½ù ¿Ù F;Ø> endobj 332 0 obj <>stream xœ­X tTeš}EAñ�È"&£¾QQ·EiÙ � {X �ì©T*U©}¯¾Wû^I*{* •…-aG•vCq—vkÁîfû¯øÒÓóWH÷´ÛûÌœ:uN%9•ÿûïw¿{ï÷ÄÈ„@ -ÈÈX:'ùizâVAⶉۅ¼ãû· £ E)#;n›¼þ&›ˆ¶�Gó&"�`Ñò�[sò”–)$»ówIÓï^pOúƒ�=6;}~qžd÷Žœ’ôŒ鮼â)þ¡(}uéŽÝyRÅÌôùEEéYÉoT¤gåUäIdy¹C§/(-.«”æIÒ3Jsó$%9Ee»rJ*‹rŠ·çæ1õÙ’¹+”åI2e-Þ½º²à¹¥…ËŠräÅsŸ|bò¼±·ˆ â~b%ñ 1“XH<@L#2‰EÄjâ!â.âaânbñ±–XN:eô—äkcšnxlìØ±‡Ræ¥\½±hÜ’qgÇÏÿá„èįÝtÿMÚIs&17O½Ù3ÿ7AÆbÜßF¼é% žøk\�HM\ûºì�/�Œù!jgƒ*Y1k“Ñ Dw@…äU rujâí ´ÚlŒ†æÿm°Ë�ÇçCš\;ôÇZ:Q%jŽóFý±·Ð*ð“>£Ë¤cM*•?s?’_ $?Id°3ðÚ½v7‰ 1uúX‚Ž “^w]¢l4Gìˆø÷:"áSÀ5ÅãÇŽô¿ dOƒ,û¹^$ßHk À 2ëHiß7PzÈot˜´¬IÏP�åäæ©4ú›š¼�þ:²·�†3ä¥u= _·1¯„2�Þºg=äƒDª,ªÈÖo–4x¬ÞçlõPÁcu/²Õ-©TXäÆš5ªVYÕÊ¥¦ru¦Ue–€•”F�¡ºH0è¡no—«ßApa¾jù²3&èÿU-LÜŸ˜$ÞnÑAYÒj ¹N8ÏŸ_Ú²’ŸÊSø•~ß…'‘=ôñŸC>½Çlf³…zb&?@®Ù§¿þ»#/ÑýgŽ×íƒ ¶µ–àc„ƒ»†{öýÖÄÅþ}vß@6!Ö€‚æÅ¢2`@S5xãàk©%Î[[löbHão)4?ià¤A·vCyå6ͬµ)Ì.£ßÙ䀋ôûa|@:# êì&:Ÿ+vC7¸aàÐm‰ý©œèê r(9]ÒÂà ¸}‰D©œ�Ÿ2øò?qÂêЇBv.L¿"ú š�îðP©ÕŒìÕ´ÌÎ:À.»›s%‰0õÀu" ¼C‚¾÷„‰î�ûĜݎtY}ZkÃJ©ÕÖJVoEš: Á£`6˜�–*ªò7ærÙlCmIß L²±ü-<Íß}Ç«+ß}åô‰ú:ºnÑk,†šözkë{Â/€“t[=Z-k–˜)õsòu¹@J ÑXÔp„è§&oX´NVäféÁ“GÚþÒØO·Ÿ?vð0�¢Ok­’{Ìå´&Xý¶dS–¯nÊ@<ñ¦8x¬±ù¢ƒô{Ý!·Å«7ɘOÏ�ÀiÉ茚�ÍGŸg¡ Ô`‹UÉ�\–Ê›Qc ¸[“¯w+ Þ07 �Ú¿Þ©[QÜ)Ô9xÅ£äØ@²UœÓY›Äù»„,>pW\ðü×Â�Þ�ÇÄœÓîé1»L&†1©…ó ¡µïðcp5*^ÃòÕüÓ(u zÝ‚„¼wŠŽ 7é3; ZÖ¢c¨Lê[áS€¼3ýºOÍÅüžH_º|mïû@¢›NN¿Om•ƒ–Ö„À²;ëœ.eò;¿6Žî½>ÿ+Þžäo Yã Õ˜CŸÅåw:àmú"4$”¼lX ÚMàöyêÞì@cè�´3ÿ>b<ºMEwþqù…¹+7m/.¡eo.ýð¤K·èÖóO“:Qwö�-i…ÞZÁé‹J±«쑺½‡úšz€<ݸegezñ*º|ͦ­Ù@.V¾ç±ÛœƒÆõ³äÀc‚cýB´ÉÅ�p‰{>úi‡ãDÈ3k÷,ãGñ�>Ä/¼ó¥9hšuùOá�{5�OW¾t¦ÃwÈYK{câ=hܺO¹oÕŽüÈIv¹’Ð7 ã_†0F‚+B´Qâ@_ ÏßÏÙ=íœËák9ÐÚ²§½ËU¨³…µÛ æ�` +kU�m�û{Šº³oÞR&£ª..þeL~­úu{b]^Ü>á‚ý¸}¾Ø‰FÅÑNÁ‰O~˜þ•0±Û#F³Î Yè·€Ö“h/B#øGx5_Á+ñ{&"ø1艶.G`?Z6ŒävxøhìiôL�Çì1ê=c£dK3Ks`T„ÔŸ’üöñ�¹á*¼Ö„&ˆF\øôêéÏ€üÏËóù)k«x–ÏáIZ{¶êø2 ³Ö¯_o°F=îË ùzì Ú|Ø×Ý»¯¿¿¶l ‡‘ѰÏ.ê�£¾z½+þVô‘SYb½©œ¶YmFŒ� 4‘ ÃrPÏ£‚ëz”ædü-kÐ2TÕ“RÅC@νŒ\¾Î~ÒÐ]"4¶Kò¨ÌRrZë±xܯÖNÕ¡yœ ;Ÿ+-¬5èOºB„ZOØZº�u°¸9›•Ññiƒí©×Å”ü»˜64; ‘F”(jëa£@z’jª™Ìv)]æ`Ø*8p;#IYJŸCÈb¦8:CGâ7%ÎÒþÍ-“TØì°ÙsÌýE½+{|«táæzÓî,]&VÎñ"¤QŠÑøÎ+—à÷ä§÷\àiŠ?úsþñÃ�¬/Údçêé—°Ø·3îÿMì/ šÔI‡ÐdѱMÛÕ¦R‹Œ6–èw€‚œ÷»‚·?=ðM4‰¯Ž1XmTå¢m² wZcñ¸»ß§�à?œËí^›´^áÜ«XÍ�2ž ± ]ìýyAÛüʲ–ÅXÏ4˜„E¼‚Ÿ‹&ð£Ð»B_ùµ'±d�;sïtµUñ#Uì>>l„â/Ÿ½CˆN Œ7*k¤å%Å•5ʦÖö抟>(—-¶l¡EeÑB5¹qoþóW˜ˆ¤s·oÇbªÕºÚš=u¡NÚßæo ¿}MÁN¨%�ïè^?#‡O×\—·ßAž>܆/ö[Jõ6µ¾89,–’¾1£C€–½‰o þÔ,«ÕQ:My¡N›{öÙðzÌ'{ñ^”Ù¹Ûe¢ã»Ú�«» vh7µ›^QÂò‘GgN]Æ�­GÐàn¦8ÿ¨ Ž³jlV©…’?mU(XU&kH£Ûâñp\(@y¼68x´©øìŽ?c ïDc±+¥Võ”Åèâx�7;XâÉõIÝÅžÕõðùÞåË×¾x)›'*¬2°RZë rΚ!ûÉŸ1=Ñ …‰±H ¶È³,rcuÏ¡»¿h¨#OoíØ|÷v~Šö jý¼?Þ dħ—J RÍ.:gŠaä“÷¼]þâ¥Ãç\Nª&û�¢Ž@Ó~Oä©ÃRn¦4YÛ¯§ŽZ_—»…v·DÎ9ëü½œÛw·�`m©rkÕ•† S’]½¿-–ødˆª¯‘—ü æET­(./-—GäÍ­±VŠÏûëoĪ—­%¨œ,×q¶��lV„d%e’‚¼^ÉÙóhÄ^”ÒA}�¾wí^ˆ¤�Þº/sJÆ0 °ËE€ƒñ&E¸²¬Dš·ùXù‰ç{÷ï©£7–ÅÂ,8‡&ÆþaDtÕ’¬58aT4¬w7…ÏÐžŽÆÏ\ÑðÉî¾Cà‚VhP'í|ÏÅa˜ÿÑÓ‡ßÝl÷Û]ñ ýñ®Ö¸o}åæ ³T·…6•W/1—©V¦ZªMÅx~¼¤7}žúËÏFË7ÑúrÆòŸ}¦0''ïŸ),ÊÊÏØB?X^·6à ås Lç6Ųqf•ȪwWdë7þ¿<_¸kÚ h> Ðʘ­Œˆa™:+#ÃʰXªH£×ì ~ü>óJEÿÖ]U¥e¥ÑÒÞæH˜KºÜ¤§ÞÑðýêzÁ‹‰YÂDÞÀz1V-;8È�Þ¯QZµz+Åóÿõ„Y�Õ™IÓøõ¡gПtHáã;‰å ‰Ëõ‚ÏnlK„ÄA·Ï ¡¡¯2XÌ5Ôàe¾[‹÷pФ�Ægšø©!>È�ß ÜZ7=x EGáj´3 ¾°=KÜU/@ô�ØõÆ1ë”þêÝÆ5.†<‰'Õlš¤ÞŒÅŠk Qo;[ÿA­¦Ky>‚S¯:œ¿zÐ}žvºõš»Õ…wê4W£ß°¹î2K¶è(Ùœ$øšuiú¬¹,O*O«Ö”Èw™]ØòR«·ÃÝLÿ T9  Ýoð2êNÕx0€@jôzÍtâÄïa|’Ð:ìà %ÛÒY0ÌôþÑË—„ Ju-Ž&ƒwh±ÆHf¦Jï\ù$þ—,´ÔÐ,z†õ$Ÿ¢MÁŠs;?åî×ç÷ÆÛ-/¾O7>ñ‚¥ȳñÑ ˘Z™³›µ€§+G>U ~fùl žÁu[:>è®ù�#¯ÒûÏœj>§¡37´"²Ø8×�™T‘–Ð�Hé êÄ,œð¸dÂã ¤TÞc`«)=k5âå2©®�­ 6붘$”U^½ØªÎç§¥Z•¦œ×ÔpRÑW4êè7Ÿ¢ÛѸFt+æ\²Íòj]™‘ZŠcø¼iw%�,¼@hî¯$RÐ~qï¬óü쀢VRÍ@¶{!èbV­ [ü¦(_™x-Õ•�¤^j­ßæ²ÑõL”mʼÈ/IÝ7�ßÇ×éôz-¨Óªj5µápÀï£ÆÉ~ÛÀ·ú¿Í?zÏ ï�¥n9»>eLÌ™’Bÿ ¹r endstream endobj 33 0 obj <> endobj 333 0 obj <>stream xœ­zxTeöþ C†+" q$#z/RU@À‚RAé)¡%¤÷6™’I2½�é½$™I&=¤@ -ô)bAA±Wt-»ûM¼Ùÿþ¾› îþÖÝŸû<ÿg&ÏÂÜ{¿ïœ÷¼ç}Ï7lÖða,6›=béªU+æ>Æü:-2�¹XäN&mþÙݯˆ‚Q5¼ñþcÇEÖÝ�.ŽA0–5ŽÍ^¶2.>953W ‘«ôf[yUýÒœ\q~ZJjáć–>{âªøÂÔ¤¬øBü�̉rv§%Š�¸83sâz抂‰ë“ ’ò‹’‡–²4'+WP˜”?qUNbR~6¾¶0~n|fnj|¶ ÿ.Á?‰I™…ñƒÿ“”[�–™“�ŸšS�–’ŸŸ…Ÿ/È�Ï/L‹ÏLLKNÎÉJJ‰ÏŒÏJHŒg±X‹W.g/‘$nY½47ië yÉ/槬[V�ºþ¥´ ËéWeľ,ÌŒU”•°éÙù ÜûÜä;Ç�;zܤû&Üuÿ¢y,Ö,Ö$ÖVÖÖdVëEÖ|ÖlÖÖ:Ö2Ö³¬©¬õ¬—XÓXXËY�±¦³6²V°g=Äz™õëaÖ«¬WXO²amb­d=ÅšÁÚÌZÅZÂzšµ…µšµ”õ ë.ÖÖXÖ,/‹bØÀ6²Ml3Û¶²ml;ÛÁv²]l7ÛÃö²–àܱF°ÂìeÃF »À‘ _4| ê2×6âî—‰ùı;ž¿ã³‘ª; GÅŒ:y—vtìè�ÆÆÝýüÝo� E{ïÙpÏ<ó½wÜkŸ3-¦’/àߺÏ6áþ ïßÿÅr2ެ!ÏPljÃDþÄ´—<øÎ¤E“§MþpJü” Ss¦~6mÉ´KÓ§OoyhÕCçÿÎ^Ëý÷aþÇXÐÐÕÀ>yŸáD~ä9÷š]ŸQg‡J— ´ÂB=)ú>®&JˆäNðŸ¥Lj­”¢' ´*Rõò�/’ƒXfƒ ÙÈ­£Ñ^q ¥Å˜¬&˜ ›Æ¢1h@«'õÐ+E�ï £è…@Ìà–¾•Qf4˜Àv“Íä$F÷çCÚÝYd·ô?ÁAÏ!/umš0N'3(ĄڪµWt› ‚l€f}=6T:•F5Uh9 >›Û[õƒ\£”F…9Ï3DDÖf}±L†—ê[yÐåäiîYèÒ�°»ñ¶ Ýhp6ê¨ÕýÃõA­I|9¨õ )AK^à¡íèÓúÓ¨Ñg¿ŸÉ¢w]?ŒL ʃã˜Óë?5>úÏ(@çå&%¦m…2ˆ3Iš V0Ѭ­®9¤Å©e[7H=ý§ï¿@œzêÛÈ}F&J6¾¿Ì%Ui³”äbú�FŒ%ãG“#LO‹›°As²îtݵº«”»Áæƒ Ñ™µwëìdzªRkÑØ�F‹ÏB†oîíØ„³ÒódÙÒ$j+=Ò¡€˜yIp´¡ÍÙÞJ ÒµòÄÔ­|œÿåÅ,y02;ÈF�õ¢„^J@y&[ÍÑöæÚpKߩ×µ{}ÍÆRŠM)üަ”Ã_¶¢é6«Ö¢Vt Y8/iw"òbcs�»Ñ棂';Ñp8Mô¥v?ÿض•ùbRw:¡i'd€@$I§”¬-Á¬Úa4VÛÈÀÙŠÓ@T;гòDU&¥H‘§(R´"Ù�X•'Û¢Ä-ó{|6¿ƒ4Y�­Ö ½ÑÑho$ð&¾¸ŽAŒ.QgøÈ÷7s?ýedX„æ9Û-&¼t/EÁ ÅüùS芞ÂEÅJb¿{¾ Þ]ÖGG‘ô[\‘â÷�ý}ªƒ{¯ØFßpÑ,4ß¿¿ôè|EO¢oðè ¿â+¨5­å¢‘@SÎxb*=–˜é}�%?ç "_Ð{Ž} ò$Eßà8ÒÚt´»ïXm�Ïårëp%èUz­JCæï*(ʃ"�9Eá¢Iy6KvÎ)ÒÕN‡Ñb7Så‡í•‚ *¤Ø[ØÁVczblÜŽ„W6HÄBÑêUÉkA…«Fo³�;¨inoǹTÁüJAyQ3ßžBÑÕƒM®4hå:J°vmA"~®Ð^äÜ�A)ÈA -Ž9{àµ!à ´vÇ´¡—�þ¹<££ØJ¸ä 7lÕ4¤Ä Õ‹ ùz•#GîߣB®Ö+ :r5­•Õævl>æ�Ñô4ú¡‡Î¬»tòÐ�=õ”kí!I#4B¸¢¢-Ðâ; bm©–”®­L"[_´@È^O­vñ4Зˆ9;wm"¡°½÷d^ÙIµ\9Ô†!ðºw~d©A�30ì™ûn“ÞžþœÈ‡‘˼êê®îvw«™ï6:�P>¸þ²R=”‘ ÜlÈ4å¡ÂħpÌT£¤ ™R*,¤tm …N«}¸ºMüÐ~“Çㆠ·Ô¡$$ÍáŠAd’ Ý€Á×§¢ÐI¡±ôGF�Y:>è¶Ò[tre®\óŠ��(ñÇÜ`®™ ’B#¹ÒW`fòàÛª@² ìn»£Ù¤ÚÐ[LN.dÎØ{~!òþãœ~Qämžû@ ñ3aöËñr´ÂÍ ‘Ça˜ŠM%@¨Ëðc0N©>½¥Ä€ëXWBG lŠ¡Ó# ª€Á(ÀyÍ2U�{�µz&mͨ+ÛZP´BÇ×È b¹ ÌÁ.ŒÃ\”ë}C$ꔵTº1Ãmà09M4!ÒcÃqµ(�bà³k™IíÄH5š-åLѱŠúg7°�¾Ïé/ë…çT�^¯¹’\ötj߯–Ex=™t!�C—ÑÏ¢;&£iׯ´9C}üfí-\.N%è5n/Ûé9ô„EÓ�xpö%4©Ù…– (4ž:yþ«S_c2vdÎÔ<�´”/Ým4VXH èo²Xô« hö>}­ºÀ9@GóTYZ%[™Dz£Òíõ™ÀKà† Gì9ƒYÙ®³;<Ýh‘­šrçÔ%ÃωB£Ñt4ý‹M½»ªDF)�&Öî†l(,%a\ýO èï­ì½Í€:¹VLõÉxöúú†€ÏíÚS¿ˆ®àÎMq9tTþ&*?v{Üv ^’}d1›F+Ã*g.ãzDùA´0Èî~š8è%$åÕÁ%ÓáŠwìg ‚èJêX1‰ž1“^6©oÉçèþ�þâµá.ª3 ò•§fJ“€XŸÕý–jüç)k�w=úµóBWc^Ò$ú ˆgª§r šú9 ìÓý“8ýkû'òlv« \„Ý`,$ær Á`P‹7ÒËct8Ý '´fµÝa²x-d;b¹ŒÃÑy†;Ðý7–B¦Õ‚Œ¯´B%yž[�5ƒ­â Ê‹1šMöÁš·ª•C¾’Œ§y;ÒK€ sG÷ŸÂzÿÖ÷8hî[¼!ùAüFÑW¸hÚ‚’Pšòä_éÉÔïòû;æ_;Ä0îWm¦É-BzÉ#ô0*'ýùeôü0îïj“¿³÷Mþ´ì»€LANdUd)“”F™˜’*"ÅÝ™u»ðþ�ÚŽwuT‡(£¡lké–ÒÍ|EŠ"K Û |Ɩʦ³û*Là£~àúqù‡ôŒK Òm[V£Ñì¥ôÈüßûãjFž¯G$ hÖ�Ê »ç&º~“Y™Æ :ï.¦æs+ô½áh¶…CÕµ¸„.E¢¶,$„Ð_Vl,ßÛ_½sW|F¢�§ÊS éñÄrî¯Á>Ï?š@N”€/àJ-â¿þý[ˆû]Ï»@ütåiúÞÅ©´‘^‹yCÓSÒ·ˆØí±[e©EE¡™^Jq¦ y*tµµì>êNÛ¢¥AÍ�©ø]¦Žâ7S/qÐQôïî;6Iv©¾D#`�¬ÁHTY´8ï–€…<ƒJ¢,:› #Y¢%‹ ‹pQÌá^@ž_�|Ý]‘ü‚º<Œd})n4ÿÉÙÉØ'UåȽÎa}6LãÃ�X ·û­&‡ÉÎðÍëÏà&tæ:šýú±à¸ž5ÇУ=;®Œ�þ‰Ð6^¹®Nm3xµÝÅGdæÌ§‰¢Eæ“B²Cl‚*"Tâ ²%;Öö%_G3»Ñðc~¨Ïh&óÃÖX7ý—\Û.g÷}ÁŠ«_wî/Nq‘;õI†¢JµÓWïîìL:°�Ÿ:%áù·Š«5Ld¯ûM ¢§*±·iù/*=uà­”!¾ \ë*÷zÝV²­ª"¾»Œ• • Ý}׆lÒ†Dš-XóŸlÒ³Éñ»‡lR­§Ùâ¦*wcwpfÐ&­ß’»){ØW/³ŠB§‚è$64uoîûh|tadøo†æ*÷£óy 7çÑÓéíÅEñe<4¶îÖuøˆxwÁUš"éð¯Ê­ï_œú2àª~_e:nûßÕàp1·:¨‹¨**º�â~]±&]Š™&�’m×a-K¼p&ýâ�Öï|v�Y­Ôã7YðB‚8ˆübwwØó9&ÖvìCðæÚ¦$fÎð­Xä¡Ò†ÈCXç}©jäô—þ³Ô{Fã¶&Vówáæ)Å’N èlZFÏCÜÑ#W?¿v”r'UåÚÁŠ¥£Œ&G«µ"p>ƱÇâ³7ºöšÌ'�„…i�rÐIDzÜáb¹ñ°Ó„Eœ¢ Ä8Å` j¸ï�RjMeQI®â9úî´øbͺ…¢¨×®~yä, FvN›]¬@É?«ÅÕÄmtM¸1î�S‡Níž3‚ÚÐdÞoÙΛ“�™Ž•c‰¹±ÎÓèn¤ÂçªñËì°W@åô¼Òt¥€JyôisÔÅêâÛxú¢ M³“ÑS”Ï_V!(Ìä凔žºêÚ*:[ç2"zn-ëEº^Nÿ˜ÛÑÕ Ò2R­JØd0¤_XáŽÇ¡�¦GÐXŸ,êÞyDB¹µ½Å�ªž¯6$°h‚…°�xôÉÓçÍiÅêÂ6»H0­`",z«RaÐcîÙLǃA[ ¾Â&‹Ñè÷�� ¿Â)Çv‰ƒÇÃ6ùntw§¼=©�* ‰­³ÃË+fq@R^†âæ‡}ýíÁ53ó4¹ %ñ]ÌN£9À˜3ã%†/`mpÛÒÈ"å9[L®7€¨p 9,q‘D=’+‚"f6¥*û߈_Mk¢è“Ü>¤º”ÿÇ/ýOÅ‚½¶¾ò÷Šå2jŠB§¸’›é$½Z–U k D™â�^Ž38k9¬ÁaÒŸ{ÑÒÞñÑ×ÐWgxÞ ‡ËÂÐ áP ¥¼ÍÛ æðÃâeâW1­dÁoµÙåê¤ìuö:[½ÿŒ·Ç{Â^ƒ[§™`æJÙªü|5)OŒ¥3T©Dt·!qÞ’ ›äÝí§ë¯×^¤<ÍV/‰™íqÿ˜íÛ‹-ˆ+€�98TÚIß©I‚,bêµâýç[»ÂA¦&\÷2Ò!òÃ`Q”ÞD…½Û«âGt…g €«º3»šwL‹¥§©4­ ÷3—•ì¸u´ ß;ä–¥Ÿ™w‰oÛ°øZ(‘+l­¬„ð 2È+d%tIö_þ¼çO5¸ Ð}ýóx5E޲\\R�¸ —A-S ?eÜ0«…îŸÃ‰<‰¡c ›œ~‹Ã´+\âO‡´ ¥Ú$u2e(‹Âa´¹À0“ èE““‰w6!9ÐuÛʬÆVÆ Çœg 4�mÈÊt¢»B§ˆ‹Ü° d:,kÄ}ß@‹¿¯ù TƒMmW'kKò@8¨ßëÂÕÍ …�;6îH|öR^–œ”\BŒîŸ…Iù¾ö¥«œˆIx©X‹óf±tëá,Ðè�<ð_0”Z•­‘POÐ?êdê\ÈåÓÃÞ[€Øß£á×Qti/w¶Úê\m¡OìµÞ£ž£Þ£ÞcŽ=ŸXp½9ÀI0à±JÈmÜU�a2üÎ0tÚÆ¡=ð8«(xñ눼�}ý;N¤)ò3ÏÑhr"0´LíP‡Ý8Øaãÿ¹Ã^g:,¨´Å=b`{ÞÔå[〟q�²ãƒÕ`bOmCC@ÊÇË_^ylçÕÏ¿½üu˜aÁÃßýÊ‚éóžú¡©ö��îA·ÎòªÖœ“í…w ûõúËÕgÚQ ôg3mŠÛhµjIç Z!-gVѶœÕÉ»7ýÁqçÁg«¥œêD ¬Ag+Xø·9±€áÄxz¡V •€ ;’‚Œ$ƒ^&+–`ŸݳÞ.o¶wu£;)OÓ Cþàk>Ù×Ö>Ä�(’줶ÑwË ‰˜ô‘¨§¼Þè`rrÞVLûV£öÿßcT:™^ Åü-í»{öTU5Èò=¾×þi6úk/hö ÍFGGÜ8”÷3fnpN;‹¹èÎ?>Gð÷ñ†Æ´Ä¿Ži£¯­u’4Nø¿µÕf·se¯±V9ÚÑ#Î6°Œ�ËP¦–éÊž«ÞþI ìýk8‘¿G.óZN4…{,.#†S–6…xÆ™ YÌà{Àjv1>}ØÌtœ¦À»¨à†7È®¿‰ÞÀF=;2“—¡.+Àº—)ôÆPm]g\eüê´5"Yøö*¼bj,=^0èÐM6‹‰jAœ‹¡ º�ñuaYUüŠVZ²Nº&{ã«ØvæC‘·ÍîhÏàœ¤ ¯(#þ�èÀá–½ûCd`íQ!Ô'ÐøªÛUê¨ÜÇ×%ì"UT»¿Ê¼Nyz�»Úý}-]q㪇P)#³7‹~9Õy¼Å÷¢´w°ƒÛ\Ù6ªtèÊâ”Y¢Åz™VªÎÃ~‘™4Z«ÛœdåÛµ?úÏšǰ’öÿÃç,�MZ»›Ô�H?°ƒm+ÅùCGCÿ÷`ô¿?b‡ÖþæžDò Tü‡ëN¥ÌÖŠÉ‚òÝëi¡VÌ×äƒJ‰©§_½€4 =Œ¦2ÓÝMÛv E¤k`8/#5üîseÅÊì œ·xMŽÞO/ýÞèç¨<í6Þј¨óçç Ì9ľªö>›“9„0D­Ó«ô°‚Ì‚LSöM+44«q;-Õªäºv ?&%Rwå)#ßët>šÔd=¤P›¸R›¤·{üƒ`Xm¡Ì)´g .9â7Ô\2òÝ·�,~ï"ìˆÕ&ªkàg£Ä¨öß…Õ¾Ó�z"1í¾_ÿh¶:|LÌÇ °èØZt‹�–9h“–wFt !£8O ðç¶xݧ“4™°uÂ%štõËë^¦deƒ£b�Ucu\{ � ‡n·Øßâ •‡y Á‚laAAvXn†Ã̾r°hsèç Aö‰ÈÝœÈâþí<0ÚüØ¥xäv¥F%IòÿƒA�…¿Ì¥ràà†ì ßô[Y9¡ˆ;È~?ò§z¤˜Wá0Ù1+¹•™˾r`/m+õ*¬(@eTW*"ø1^µÉ`Â:ÎápÛôv±ƒð y¾ãªûYtFˆ� 6.ÄéEÛ1ÝÞBSªx5…íŠ8]ª›\¯vµþ�³­jg›½‘r¶¹Úœm–Jw·µÂvÀŸþíŒøEºI#}i1¿L’»ˆ âý‡¨è0ØêºÑòk¥£o*Pê,UtÊÁ¡†A£WãMI=rƒ­ºÞNº;ÕB,“ˆ� ñ*�FàÈ0›Ø‹L1¥6½Q��­J®,sh½j*â¦åZ!T,¥]î1�6çÅуÚ.øViƒìŸzªB‹Or"jáU\3ubxYŠÆÍ™·Šf-~軸³B2�^´.g}üü´dL"K }ÁjkØÑJÙjlUöFg‹¦ˆ±üÖ .‘³Û² K’Dää ­T•CiŠ4­D¼$F™ %PŠv´åì)è6�€ŸÐú4§ZS¡µa3Û-v•Qj¦f×òmÚ|.Žsñ°uå†u²Mâg™�eß>ew\DÝç9‘ÝÈÆ»µñóéñø5™žôĉ?œ{+Ü÷éÛДsˆu§¼Ø‹ëp_ÅT®È/‘ çÏR? Ña4Œ·±tb-Yº3oáªyÄÊy�/X Hâák‡TýÐt’ÚåTS7·€Ž~:ß�ù�£Œ©½O^cAcdDûø%ô1fýÜÈRžEgSªf) RRf�ÿ2å:dVÉ´ú2ƒ–|œþKsBC†¸>@3ÛИÚxˆ_�Æ`¬1ÀÉVåªôäZ:‰~€Ków20yè4‹~5„ž F¢‚¾ ²ÇEÒ.IO��þ9’y˜wyÇ8G\Ýtb!}Í¡'Ðüt’ž9ð“^ÉLæùX¥»pž*¬ä¨=*zÀVäOiÈïJ<‚m"�& h4M8›wdw•åç庱B°² Û õÞzð4SMÙ�„ â.Ѥ/ç$Ä%ÆñTìk7k,åÞc”ï˜÷¸÷8ý³³-|ëÒ¥`åéÓïq¤6=®DNßùÂ,¬Å<“Ñj1�ÇRf`Í}j‘RŠ‘‘Zc©… gsciûx‹§‚ìîWå<ÂAëŽðÖV§uÃÛ€ø½‚ƼQ!©lékÎBCx‡1Cˆ…d¥öb]ᇠ‹ïö×_Š!Y©€"OIk°’ZÌû�Ï3މ½Úf™W³¿d_)ÄÙE‰ÉÂ\{M>©µèM,vôJ½ü@ÒÑó]�]YLöPg#oòüv”C3˜ AM–ñ8*�Ù™•ïÝÃ* ö?ÑÈî8ócÍ·¯s�7²œGß“9›æ}1ñêšëhäuôâ2™|hÍ58L”{»š*e’FÒ©®.õb_î*¥æTµÍU‚Û!y¦n­Yß²‚r‹x{ø³àeba<=÷±Ä µ_^hGëÐým 7Ÿ]ÉÔýÛ�èí {/jëåDÖD€÷CÆwó°ýy˜>HçnwѳÿŒîG3Ñ>$$éSôƒ<oèfÇ{úZwa{P•3#E·%›N©²xù­LY™½9uö™ùáï..a„õÚS¬¢(–ÁáÄìÚêúj¢0q5—¶0I©= "ûæü,�4•Êô—UCqîÛ¶OËÛ ³“´iÍ:;¯×S±nï2zøƒË'‡ Ë˨uéi±°•Xvnã7(æø'>æpO£×©µ¤L”·›¾ˆUóo´Ôô\h¡š<¼:g-¦Éz°êZ‰wR줊AheÒÑ?â—ÞÀ¨²±È�ÓD/æ 11Á0±ßçòÙH‹³�jFc‚[Ú‹ö ž"߃&¢}ùø²Ç'ÎÁUD¡QônÞK’÷<¶š¯Í~ cò[««Ìš„µ›s’ÄSYË6mÙ ƒBVÇPç{ïT×ljX#wñ¼{ ¹JÄ ò¸ô#4‹~–ùÔÉ>C#qÑG£Gö)öì¡è´osò¾Ë}m(M?p¸è¹Ôâ§S×Q)kcÓw07gÓ³èôPäÂëYÁq•UèRõøèk‘Ñh4OD-é3áÑ´ãÌqí˜åôÜ<…ÌN0y­TèÜù#—ñ¾¨ =û¡•ª"µ�­J§ÇB¡4+~çž7þÄÖeí ¢»ÍáÓhÞ{h®=à«Ã5d4Øú¡¯�éS_ÊzIš&Ü‘þ8³˜Æy,YˆÙ)š…%^Þ'šÏým«õÜBHƒí[ó²3^Åáf¾c7šmVòØûÇ ˆ¸“éo4Ìð@Ç—ÙK‚MÖ:¿™!ù៲Šê"Kƒo^¿fï}ãÐM¤»Ì‰lEóÔ§R/ÎÅû{�ž‚ÙþñÕ�ô eÙ÷èzM™�8˜÷¦î¢£s6A}«¿¹¼ 6jÿ[ïØë€øäÔ‹ôðWD‹åÉ-£oðf¿ÕÙUÿ£¿�ò6žþþ' >-ˆ]ü2]H?ÊØáø,ùëè¯AEpœ§å4 ÊŽñÑ7Ð~4…>å; >" ·ª„ʼ4)ß¡—è…™[wìZRÈA«¤V¿ÓêáÀÍ+?8ҫΪRHr KÉeôÚ)�NÍýþõÇ�6“ÑGVYSNM@/\BÇ><™ï‘ N‚¨P‘/‰'çá=³óvY?P3Qzv&KêŸd�qй~/ÿ�˜H µ äJ6û”_ïѲ]¢éc8ʃA©¤½t ¦¬L©ÄšºÄS°¸M6ðcê_ú9bÕ.lžÝô´Uj-ñ•ºŒ¹!*¹;8,£ÖB)ܪ ­‡�Eôó!ºÖåvsé]®U#/ÜIŽþtpÔUöQ£X¬ÿ,²|J endstream endobj 31 0 obj <> endobj 334 0 obj <>stream xœµZXT×¶>ãÈœcO4'‚1ç`b –¨Ø»‚Ѩˆ±`Á‚H…¡W`¨3³f`èu }@CT,¨hŒ±ÄhŒš5‰‰F�1¦ÜìC6É}û h̽Iî{ï{ï¾�ùØ{Ÿµ×ú׿þµªgJ"‘Èœ—¯šè(þ6RxI" í!¼,õÇ™¿w$Ù@_)ôíY?tD¿�°çQÊ4ù9ª§D²h™»‡sPpL¨¿ßöpûלì'Θ1Í~A O¨¿—§Ü~¹gøvŸ@Ïpò!À~u�—¿OxÌëö ìW‰;ÂìWù„ù„Fúx[Ÿíîj¿<ÈÛ'T¾Ð' Ü“¢(W—1r¯åN±AÞ®ÎÁ>+†ø¾õF¨ß¢°í«‡û¯~3bÇš%‘;Ý–Fx®�ܶnÔkcÆŽ{}Ö„A·ÌqŒŸ4yÊÆ©}§õÛ<}׌™’>ý)jõ åN­ R¯S¯R©·¨7¨ñÔpj%µˆš@� VQ‹©‰ÔHj5õ&5ŠZC-¡&Q¯QnÔRj2å@­¥–QS¨ÑÔ:Ê…šJ�¡ÖSË)'jµ�r¥œ©éCõ¢zS}©~Tj5”zžRP©xŠ£Q Ô K½HͦS�”-%§æRvT5„zI¢‘ô–ô¡V�XP41ê3I¨ä=VöøFê-míÉõ,±iS(³—%Ê®Òóéý Çh™öòííÒ»µÏ¶>÷û6õ[ÔOÛïvÿ¼SÀÏmîÐóž¿6pÉÀ²Aîƒ _à_Èg}^öbÁൃ‹ÿ`ëj[j{ÇöW;Î.Ìî§!£†„ )ró¥/åušøò¨—ß|ù}nwŠ÷æSí{Úµ¯´¿9ÌaØ7¯Üú§dÑ6ªÿ?{x�§ÀÒac‘ ¡7¤Â”ËFÈ”£âñ ì Ìd™‡:{/¼M7è nsµ™\= ¶C 8B˜Ž‘›èËJ_¾³†öU)�¹(¹2ræ­žäL´Õ",4I„Á.lz�:K P«ÒvaŸÎ¶ŠmA!Ë4Œœ~O§ƒ=P‡¡JÍXhOm¨™|Ê�¾ð ²³EzÙ [€ ˆ6õ™õÑ…1±‘J¹O£ïñ“-GÎVñÄ$¾ƒ¸Ej’ ê<ò:/V¢tîAMønùÞMYþ0|¦'G1šdxh¢�œþ 'Å�Çô–DXJ.^¥k'×¶@{—¯–%@+�\éŸ.ž{ËÉÅõÎ`‡—aGòµ{¡ÉxZ‚¦ßC¯¢ù�•¨Ô¤¥ðIxfÞ Ìxõ>ÔŠö¡·\þékG<ÚÄë@ULd˜ºY¯µ ñ&a\™äÇó¨äš©ñ ¶+Ý�hCh‹÷9‚úñCÄ¢Aã¾Å’I›\ÒUüó"k\ÊJñà;wü)ÌòX0‚6¿¤¶õˆ± ˜«§'àž¸ÏâÉsä…Æ(>¼<Î5¿SE°9[¡–|F* Bql™Œ�Ýîã~X6i8~Û~?IQŸVD™³Ò2S“Õiij>dÚ›ážÀxެA x#­5²9hâ—†ø²ð0­¿ä=YÞ1»Lô¬ß=iÇ:ô5‹¼ðXäˆ�H®9àÉØ{ 1x"rF‹ÑkhÚÌáëø;Û~ƒr‘ñ·î?B/MÁi¸?ZôÞ7gŸ@çåë‹w¥ûþ4ÏÑ24 A£Ñrä†_BãñL¿øë+]i,ìëJòŸd·à}¯–%­ a$xÁj͸U vx®Ø6Íš!b�y'’"%„З ËÙ(™ïë1MÞ'æTôxu¶Åƒ�JÚT¶5ðxùß‘¹ ÊfagŒ<<ÜÏ×G̼·îçö½ôÙ•ëû¦¬eÌx±†ô² ,RF$gï^—¢ùÂHÙX0�zÉî<Ø’S¬N-àÒ5¡I gÂKv•W””T4úY6¾1Ûm‡{Í‘‚o<1£Fwj¡>ì¦R'u~ƒèÇbG‘2÷U óVW¢÷¤HŽΑ¡^?_üpô—ø%ßyJëO}+«ÐÝ$÷ª…›Pñ;;«‘‘E•]~½/CSÛlõ,ÃÓ~ÚY j¬ur/“v ´J‘00w.|ðqurÓÎÝüÞæC ‡LñG­LOSB"£ÈK(É1èË Ššíë¼wÆ)¸Àòí…„£'¾¹xîªzß¼$>!.FÞ°²>4'msüf?XÇ,º¿ @}¿Z™òîŠ:n}Õ˜®�1Fe^’ÌPšUšWÄtÅ%M›Ú¡˜ŸŽ�ºÞ¾cwR.ïWœµ¤ 0Ë©N3uæƒw�$ëõ§MΆ `òAoxVï‰5ô¯$ßðZª`4è{Y{[qÕiþ¿Ó|=.P‘f¡“&tÂ2PLæ}÷¾5/ÌD÷ØG埅�™‡ØæÎác’ÐåÖ„¶À­gåÊ¥"‚e/4&V½í‘°fCÈ�­ÅqûÂOóIámsä&*!U©áÓVȃwÂfPJ>®ÉNݯªLiKßX—˜R½¦˜WÀ➨XåP`ÎÌÕÖ‚ ˜èÀc&oZ†_õ%iç"-(Þ"¼f­Æ³nH;xäÎîÍÔŸ³–ðE¤-Ù “!˜”ð:úËŒ?~MfprÈl¼â0ÚKªîÊ—nÿè‚ߨât‰¿W]¤¤Ÿ­éò×c {/!E{")B^h©éK?¼Q~®‘7ìܳ#˜È*á»h„¨±!4Ý$ùá<Z&E³E>fÁÃ�K„L3ÎoÌõ9®£±ôJøñ³{Î\æÞ‰XC;Ë=½ýRŽœ2 SD ÓŒ=Y]Šœ„N¶*²<($"28°"º¢ÎPUÆa»v.7•0OåïÌs˜Ä&NÁÛÖv(]¿—zÒ]ø#Úebµ¤ýº|Jм…)ìúÂ-mp޹tòì'hzžº5‹#ú#=¯µh‹ÕªtˆOáv¸n<³¤ÀƒxB:ÓqÄÆR�F/¾Þ»>éØú䊢ÔCáun°š™¿váô-Ëó÷»s+�¥_Öìш²ëI6m±fS–VW�Íeæ˜sмÎúAôKÏP�÷Â[ƒ÷ð¾­[ò½óž*?RsP£µ!EÇHOz_ø‘íVö²0õ �“8Ïx¶ýÄJ|Œ„ðo×ü§ú„ è6üýš§²ø¥§ùŒÞœžŠâÅôÔ- çÏH;tœCŸÑx˜˜Î×@åÈãÑ4,¿Ú!- G —솷-–ò’&  5‹6D©CÈ¥B`=„‹G–j ’`£á0i«m„HúO©^Ldñº‡¡æ)Õÿƒ>wò�YF¹InW™� &F‘IWꎵ±Ÿ4“ûÅÅÁäÖA-ÝD’~HWúü£ZéIJØ~ìŒq+^mFΜðÂH”þ4�˜WÐ Ä_GC¿ã„þô{[}¢v#=’ÜžvIÁ|"Mïý $X$G¡1×¥ÂsÂÏ"'_°:×™,ßñ”“¿9¹ÓƒvÜô–[ä[9§¹Ú´Z40»*ýÃC¾ Ï/¿ýٽӨׅÒî0w8J…ïI˜ËÎЕŠ.UÇ� ËIÔÜDKZÕÁ HIWŽÇŶ£P �2ìjÁL Ro#«w>™÷4A¡:?^ŸZ°#;j*VÙŽA•i…b_nW½ŒVÃ7T‘õ.âú£ù;Ñ@‚ŠÌÄŒ”|Ò@ê3ô%ß¡&Ûïp“~—^• vù�‘�™Ï; Ð¿Ú¹ÊOÒüD¦¨= UdG8AjÐï;ÚI9+ðAî�¿Ùêã2Ós!GÌüb4S(±E³:KôqzUŽ8§ÌÌÔwç¾ðšÍ':n‘IŠ ¿²Úmăf.Z””$N²™4}š>÷ú$;Þì%�Ž 6FÔVµ\—¤Ä™æ_Ö˜$ß¶KÑ'˜ %t±¥£¯F3m´öéWÔ;/W4�ÉJÓ¥ÇÏpvpçÖ� ·<‹pŸcöïâ¾7—’3S¯Ëâÿp0Š&'×# ×”è¹Õˆy õ�q>˜ô4uª Ô¥±üw#O‷^» Ï î­ì²=U¯Î,¼yùÛ#ÜÑï˨o÷4g®57¢rúo�RáU´‹EY‘ ÆXBOØ"~CL4ÄÆqØ‚-´"b¢K¡˜Gä“L1¢YŠ»õ0vëò¢3ñâºtöLä^ï'Ž*ÎÏÖgqZRz(Ò–…¬ðØÌ§«4jHïòíµ+ˆZ´�B+Û%ù¨PŠ*ÐJ¶ºÑÝýPrû¡¹a«ÃÍ¡ò¨ðÐÀÊèòê2sÍ,@J²î;²Nôï c;{±°ºÎO5¯ÚúðìKWP¯FÕ÷'ö³³2õ\µGš:†˜$-×PÎ5©°}Ä­´~×¶Ýr.s‡•°Pî;=ÈE¹0£³�î�w1ìQ@mÇ,§®ê¾…S ÞŠ¯°;a©!IOÃ5Ò�ß„+%ï–^8Z'Rשpã”ÂU¤[ o¼D×hÜÃ%z»8³ rÌh‰Ñ´D*H;°%…¤yÐ3†ØâXEjJb2‡ûà±úT}ZVš]×Â`Í–dOÐE)jé`ÙrÐFqaÁ|‡É‘rRÁNT1�ÚO•0‰ �˪u î�o šPJ=IUðd"4›o– *’"µÈ&ƒñÐ’8$ûÑÃKŠmº�„¸FäÐ(iï&혆>fŸ‚¨ó ÙSÐ_íû§é¶úCôË}Dtç‘ûhÇ-©à‚f³2Ulòå®”¤UD÷0x¹¬ºü½sUh,²?y ›ð1Á:³øµ)ë@†¹ªxwM´1(I gü ýày`>?¶püT÷«–‘îGÚ„ ºûn—îJn¢O¤ÂËcY¹<2j'Ñ¡ŠŒsTATa8øBDè¦uE [‹ÅlÚ ¤®¨ê"M ¦ørh„²ÊCǺ#YýÕ·hDêw÷B…䃻hý=‚>„ÙXMº’¥žˆ±ƒ²Ï›Þƒ/Þî¾qFùûr~wšER–HSPXˆÂÇñ+'q*ûåÝÇ_/¸<¦”»]yò#ø„¹>ãÔèQ \�¼ê’‹Íŵ»ÃŠ"R­wkúà>è�Ùs>Î!ZµZ¾•ôðW‘Úöˆ³‡ß—¢_;xÖzE² \Ú;ýlä¨dí«V:uÍ º^ÐýáõÌÝÇ–‘ô¡ÛÙ§ÓOnŠè/Ñ*â¯æ›$�«Ñ.Ò!¼ \b÷+ê5„¸�Íå[E™j}*!þô$~uØFU,�M¦èœ” b60É�º‹Çm¤ÉL-Ðkµy\MË¡Š6ñE€{Nl©·Ö�HX´%ÂÏ;Ôƒl^Úó‘^�¥!—-­Î{»&º$4&$É{êâ󾄢{ûÌzôÊ*�Р¾›2ql” ¦QŠ2pÛ8úLJ�xÈoqOï! 7}}³¥BÒr¥ß”¢è1‹²Ð€æö††Ä@#—àÛ"Š£«*K‹-Ç|ŽNƱ-fq0®A}—Ž$÷ ‘Ýë_�rÜ17HÉ£øÖO&™“ª”Gàs½áÑ�_ÿb®Ä—è®­¤¹ØíºÑ/ÖëÉëQ65£ŸÕ‹#MäC”ç‡Â"6”µøEêƒ{!Ù÷·›ÞÍ;¬ñ¯å˜¿�ÇÕ·Î:‡°zÈ,\ú°€àg!ÉÄ  [ŽSiÜÔ…éF&B€7‘Þ3Ã�{¦0?'ë*Q\ Ú.†Ç{�ÄÓ¿e—^-û`o!×Fr¨@Ì¡ ÏÜÛ‚rK»o-,#¬’¢‰LK Ò2ü `0¯Ú¯þß¼šÏ߯ÀÕ¨ƒE6ôƒk­Õë ¥‚Цk4‰IÉJò¤äŒØÒ$ϧÿžÞ<ã;’X<Ä÷áoŽ£}ÑÙðt À9ˆ¶HÑQô+ÛVýÑAøŒ¹=íôø×æ8MðÏó¯ñçò㵚Klxœ˜a�—|�¤÷nþô½sëœÃz‡�Ïõª‚#ÌùZ.\>·ÎÙÕÃ}åNnÑZ¶:æÂÖꘪ؃àÊÌ›»nÖT§3·>yçìùÚî‚„rMRA�rYS§"ê)¦›nÞ3 #Ÿ`Zè�°8ñ÷ak3êC¹,Y¶º! ™²8cHÈ®Ø�åmž·Ñó¨²C�¨ ÷¼0 ÷=žàÜöÞÄï®4µ5qø…©ÖÁG“Œ»šH›Û 'ápU‹¡ºÚÒï€eC^¸É¦B3Íg̤'s±® üð/*0¾ÝóOÊ·Uw_ì°1IvøIç6¥H�© |¬NOQàÛ¿N·U«Ô©D.¤j5&®cŽÌ¤Õfeª³Ô|§­ðˆEU�m6�ûÄÿ$˜5ö÷W.cÞg¿&]îRqÈ'³`õ’}q í@qQš*ë__º4l¯ÝàåÊ…4®Ö3÷\7쿉Bïÿð’W!$ÂðûÏ›Ng€H œ–Mn›«(NM�#’3‘d<ý´ ù;XSåöÿ� œVíä£ê=M€yÓëíÿo2ê@'�ûÅKÿx§¡½®Qjâ<Ôþɱy»JRyM É÷xÓtÒAÌ3ãªb”'Þù´¥÷ù>\ïžÓL}{™rûö=_Ò·Eý‘ò endstream endobj 29 0 obj <> endobj 335 0 obj <>stream xœmViTW®¢éªQÜJAM7®Á5.$¨¨È¢²Øì ˆ"«²5 ‹ØâŽŠð\E   Ê "F·(6* (6B„‰â21£Iæç5“y¥˜ÌÉÌ9ý£«N½{ïwï÷¾ûÑ”¾EÓ4k§ðôœa)þ� Œ¤…QzÂg„z”=+¤ÈH‚ŒôÏ�2æÕA°Ú¦¤$4½x©Ÿ]L¬*.|mX‚™¹ÝD³sæXšÙ(CャÍ� a¡ÊÀòeæš šffeæ!žˆ7ó��[ò1·]Œ261!4ÎLMQÔTUt°ÂvcLˆ‹]l¨ýº5nqkãÃ<“¢}6(ƒ¦Î˜9Ëâ˯Œ,gÏ¡¨1Ô Ê•²§¦Qc)?Ê�ZD}A�£Ü©ÅÔxʃZBÍ <)Ê‹r¤fQÞ”5‘ò¡&QË)eKYR¾” eG  SC¨¡O £†SJÊ„2¥FPÓH“(–r¦¾¦Zi3:�~¥7VO©W'1�øK¾ÑçõWè_Ð+�)]Éôg☳̿Ùyl›ÁÞfŸró8oî ÷Þ`²Ávƒ'ï Çî0|×oj¿íF¬‘ŸQN¦ÿÞßé9‰Ô€ßõbwP(k‹< Ç‰ÿ’Á©½NR-Ó þRÈgZ°¿ôƒA6�72WÁìØ¨äÔÌ� <×c˹¿Óç�Qxu½p5�¾lùùÌWX=-Í—Kgö\[ Fa߯“¹ ,ÒÙnS&ûïÞnšè¹ %£T©^›½ßѤpwážã¨]GU`,†|Þ.–%hèV-8k%ÂT¨äïnêÄRçÀˆðY½­n‘v³wO>lzžé.ÃeZ–+xO¥Ü…¶»t)9à cyt`UÞÖ½9�hâð°ùXŠlôl4^-(*—ïjˆðUy#ÓùË›^>,íþ¹ºd[T•|Àï’Yͤ‚žÑyôO„õí!U0à·†'¹&¯LY;wW¤.oW~ò�g¶—l/ÆæÂllÐëôDèQ3(ýÐj ¶]“VúÁóƒ' eŸ3Í:Sغÿ4§Öáö'Ì1dë*(T§4€jèßA[»äC¯d°0êí?i�Ú°A�†](Ò¢ËÜ»ðg2<×ð€€eßçãèê¼óòÑø9§À”ªÓÁf‰­– ôa…êAs‡.‚_%B?a$_Ž_¸ÂP6å¨s×Ì`„;¥Aðk=ÅnE[Ó·"n©Œ~<]ìf»†>¥…£¤¡.ÁÃÐ)?c}ÌN‡á!o¦€˜W?Á@Ƴx{—Z �k¹|ç~ãJò™ÔÉÛQþqœ)hÓÀ¶<2Hl•SH\ÇD-?鉸évæx ØbþâAUYþI¹¯–µ†<ÚŒ6EÅ&mŒOI@œ·ýEèƒ;ʪËΨ”ù$°^Îð¾)=�O$ êϫʤØXD/£VPíÝñÍLSˆÐ…_#ã§ùº^&=}çñÔCA/LIˆå÷©ä{Âë{t}—D¸ØcÉ»�\–íBØâˆ‡âØ{ ¼eG.Ý“ï)E‡öMÏ2u]¸Åž|5n6L„I0ëG0“ÊoSêûãeù0W�ïÒ�µ¯•ÀäJ¾4²rýUĽìxCÁÐõ—/}]UkýåU6½R-+Ó?˜söB5I��…ùg‡¤õûŽ%ÉcO¢\t„룷æVÿKCŸi�„‰0bxTšv/òfØm�£ˆ;k"‚vO¶²úðùër´7­ ]�2ö” ½~!^[‚‘3Z|kès«ùÃÕßÖ�èÍiÇÇ�zE¿. 턈Oîé'"¦³0Ã4po<,ðl9žÝ;˜Úa #Þ`cl‹­¦`C<ò°—~À.LÈ´]˜Ô}«jæ“aÏ™†‡ãþ&üpéfîåJ9NÓ²6ðwmAª¨u);“BgïÕúì�÷šn—zŠaå>¢$üR k5ô«V Ì8þŸµã`(Ór+§$«m9/k`öÅd&"n𓵹|Òb÷:®•ƒÞ²ÃâáüZ¨±Áõv <…K<ýôô€šú “ã-½N]p‰!£yÇwÃÖvÉÊØHއA…x:“‚¼€~L²O„p½zp÷y×À:§»F®]ÆuØë‰ÙÄ‹ƒªaü£Ûu°¬–¾Ó–-Ù-Á�tÁ#}Ŷà Eáû£-í,½Ïe¤ÉUqÛc‘…‰ËÞ¼,rç ´�³ív0ì¾Ó 2Ü/¿ãYõ‘¢³W×[Yxm^'¿€üÉ¢%Šð…ÖŠÒÊ}¨þ�ØÛ°dñ¦wÜ¡KšÁªY�…é¼[ñª %ÃWq&€^â™]òª7¶#_n©Úì•}ÞW¶ÕávDõö*d Æ%�o_‹)Ý�+�(Úš9çØæŒÙ¨’»}¹1iÓ)Ùiº(­­ øoY_-ƒV›^§ÿ£ëzþJñè5 þ0¾¢Ç2hç3Ô0ý–(ôµéëÉÝxœ 'ô:=…føœìÜ,íbtS„<†á, ©´s÷¶Æ&"`Ï,psíû<úÕ# X.Á°Z2ic{l<Ͻ ïg</j¸^uäD…,¹.~}ôÖ(dº:­¦�œ¦:OˆL0̓q]‰¦öLà--»˜Ýxo£³me>)Ôkà<§.h!âÒB®“%®Á-Pc)R­ZpgÓ§�µ ËûcÝ‘5j�O36ÞJÇ]ßÈ Ù?fçŸ }p¶íàõ[2ß<ÓkèS¿g]°£“°bòmÙ ¤{X1ヶ…F�I]ašÎ¤�Ùø0æõr°3YÌøbë8‹ 6iÁä}j]ÈvøÃT“ù ÓÙð-,¼¦™�Çì³Âðf“çÌ'üb^¼¹(ä½N"hºº[¨Ñ7@VG_|®Šœç_9ÜŸ±Ú/%ÒK¶ß±ðøåÓ‘é�’…<”Å»?_…æqA…s;s¿Ë¸\+[ÓJ„ß„G*¯T­Û‘¶q¾áÅçšaú�µü“e³ ¢_™Ï`]ÂîÍQ_ìŠ$(R.D¾Øx sðÄ$ ¤³8HÜŒXµhS>6Ôǃ„H-ÌâɸL–ÎdÀ‡àÅ8Ž| ƒÀ†aûõ^ þÓŒ,’ž™„¸�Û±þBÿ•ÑI2ÕÍÀ®h Iˆá>™“ºmK7rŽIü—Gö/;ñq+$’ 1ñc+µ•Ì…5UÉäz¿yòœëo3—z®‹��g¸ñÅ%'*W×@ôv°Õ¯¿. âëÀ¥–΂L !¾ _‹3ÝûD Õ [j«H‚Û$PÖcÁo`¼=—¦8§qîìiõ•Œ+ùœ.ºCC-6üt¦I(»Gâ˜ÙÆŸ¾tîô¹â³eWQ3z6oñ`sŤXYֿܤ#IÝ%µO÷ýÕE ¾Xdïã#wsswõTpÎB¿&¼à“»ø\Ýg/’롤 b44¼% žm|óêÔ�ù«]ì<ç·úËw†¡´Ôø+‹µá͈¦ëõ¯í^ åwJ+êÑC®kAãÔ/|´© îvE#âjÊÖøx…¹ºm–§"Å®”t®K>LÒæ¤§I·k¾[3]˜7‹Á;tó¤.€°u;‹3`_ûX"uØ?JmÔ€õ=úÑ#ð"ÅN^ð�v·è¤�ÌñKe%d¯W^&|2¶_»ÌÙ­üÖ:y¤g•ýã˜;D¹î·`Æs_O ß-ÿ#æ; |¡¡Ë;AE4mD�xL™#zUÜ�‘¸XÅÓÊÊ#×/Ë+n«@m t½éŽa«ÃdY0ºáåkT„Φ–oäp�ŽåÑA´O�Ë=©l~tåd\ÔqY~ˆz B!($!xCT\¬š‚’Á4õ¢Øß·Ud«‚‚83ÛgÞʪƒÙC–Å5Ã9¢<ÒµXÙ›'Oýíë¯wï8&kdS2öÇ#n¡�õ$¹ùËöƒoÌ6Ñ0¶CJáï|ŸÕ–Ác±Õ¼á®ƒAÖ ‘ð,äîëF.ù³Ó%XOºÒ*âéªxmaùTǽ´ê?zÁìî\ÛÖÉ&†*­‘‡õ^Ìø ô¾ÿ¨†�æ™çdgxÿʦ•�õׂmíü‚–Êñ�ú.å?¿o:íֽРcÖÿ9„ixOÒµƒªSÒTÂÇŸOÐ�jû#@ —ñ +J¿5òÕ^)+�Z’XìwAqnK9ªCu§/^߉GºLœ…Ö¢èìèS1æ¿ðê�ÄΤr–~Ž‹VÅŸ,QÉËÓ/ ‹¨].¾œ_RTP‰~D¹x¤:ˆ�|´Çé(.Í�ˆ£ Èb5†Ú~2C}UŒ‘AÍ>##íA£þõ.÷iÞ endstream endobj 213 0 obj <> endobj 336 0 obj <>stream xœe’mlSUÆÏé]{ë(Ñâæd÷-B¦8ÄÀöÁ—­R´¸�ÂvËzêÛ:Ún²L˜Ñ×ý{•n _öR&]elv3u6’l*j|‹_Lø`DcD%îËY2o!£9_ÎI~ç<Ïsþ%9B)å®òÚ�d·v­€jw´Õ°]™ÙL¥,XrÞ¾æ[‰ÛnÁ’›ñþ„£ÔùÄ^‡¯µÃï=Ð×9Ö‹KK·ˆeͲßÛàn]î`£Üìê‡&±Æ×à•ƒIJ¦&±:{# VËÙß.{nH;|Í­mAÙ/º|ÙßBáËZ<­²÷!kÈ“d+©"NRAö³î˜ä�.ò#ÝM?2l2tq·iˬK\U˜€ŠÅªV1HµºL©-ôFøXü>ê`‘Å…¼P'„}=þž—  Ì’éMeÆà4|ñ°YåÛ@ßñ—c (¯¤qU™>aÅÆû$Ó¸ò LÂ8ü#:x/Ͼ×:mhf)#;l²fŒ j¹IŠR¬CÊi£8gûyÿ{Ìàp5>ê-ìEƒ‰=ô¢Qâ?î�À¾tJ|\ùFõuCÛ‰^Éwé‹ç†�²Óÿx]¦;©Ý‘Ä�³t-Õ…ðJ¦Üö÷«u|Û@ý˜ÌlÍÚMLdwýºó?œHN »ytF�*ï Á” i<£‹—mîµGèô À[?›�÷‡'…Ä…¹hRp¾#YoÖÙ.íIíö zU�E ‡gY‘͉O™FÚÎûçÁŒ«.áZ,Üð+¨¬}ö™áž•ýu±ÿ¿IœZÊvîÝôkS`þt®’å1»£öqIži¬KºƒtO`Í>œ¤ =ä ?qZ-´Å£0r&ôí¾Á=]s²Jw]¼ÙÎV2ñ�b,¢wþ|ýÕç »³·çH·p°b{û^�°÷bÁa,GIE¦†&ÆÏ«°1f‰ì1[—hÉóÙºh³¿áÝ�W9 d8[êé„g“W–ÞÔT2‘*d�±íúÏýkn_è�…‹pJ‹K+âuÛUéì[×TŠ—ôb`þñ“±þK�¯ò5á0x¡$ð)f‰:Òû ®_‡Ë�Óª)Þ­Ð ;¯_ñX̪Ù*vO×áP¨ò%~^Q ¡uF³5=Ô~¬/‘¾~á ‘cF·d:¥|®›:éëÌVÞÚu"S~‚õŰ~ÐÄöõñj.Òe…¹9[-7½³X�Æ-Ë#+!ëÈÒâ endstream endobj 22 0 obj <> endobj 337 0 obj <>stream xœ5ÎkHSað÷ìèΩ–™v(ÉŽ§ j¥aM-»°ðC5ÐE7‘j¹Ó¶¼lÍM3Ô2»�-˜t¡KÔ¼”;‹ Hf¥–Ie &}1“úPòžñ¥”ßžÿ‡çÿÿQ(D…(Š Õé Ú™c•²”R¢UÊ2J”¦àÆPÐР ñ¥¼y!NZ€ÂMQ;êlöR‡Õlq ñºÕBRjªVØ^ :¬¹ÆBAotZÄ£s:ä {l¹VÑYºVØžŸ/f>ŠƒX$:ŠEÓÌ®ÎV`w9E‡ ·™DG!B(4i}òÆ„"P$âÐb…ÔÓLÄ ½èÅS>UúêÌ7öG•z�¬4Ê�½v¤ñ—`8wWª¶ñ»v'^> ¬™i€×ð¬™�r3Ç¡"ŽÍjO5^pÅm€#.Õ_fe‘‰ƒ›÷cþ·}Æ“c2Õ7‰«&h¥ïä¬êK®Ê̊ʪó[ X²[ýkÌ×ÜÛ1Ø3ð ÆY<ù YDµÉë<ºp­¡¥NöœóíçÛÞ¾©ïöGgzZ²>#ÏCΓ³•gA[”’¨žÅãE²’=­¢•&œÂÉ„V Ìp»N_„òJž|š:jÆ©ŒN§ñv³:PÓ_#ƒú¥€ÄÊv& n´ÇŒ2éJ,7¥"uÌ¿æ’{ ×<2îk¡º¾cÏ7'àF݃^¶wuùû¡Vyí©ø²Ž:Wk«ÇÛÒmìŒ'«HYBòÈ –ŽU8lr /Æ‘±_ÉœM‡÷rñ8š¼á‚©¥øqYkUzÙ‰î#OÚJ�5ò bµ²ÀF»©È’w2ØYO�ž¶ôâ�§4Æø77ô ÐìDlgQ%éÖäÔ[=%¼§Ø}±Ç²§(~/¬` �=VãÈŸ1zmzžÕÎWÔZ¼åµ,ÑŽs'nÙí{ï74�½cýÊC’$U_=Çë2¸çy50œÓT(€Lv[JΆu›{FŸ½xwŸ+ñ·zIã-\xMMŒ×yîð<~nˆÖ«™Ó\«Ñ ßÖÌGè/géd• endstream endobj 181 0 obj <> endobj 338 0 obj <>stream xœe’_L[UÇÏmAÎfÃtñšÝm�Q“-òDæŒd’lŠ«2pÊp(•ÛÚK)t”Ëm)-¿nÿݶ (·­Ø‚ ™Lˆ“Ìi�†%ÓG“)‘ÌGrÛµ ¶bâƒ'9ç—œï÷ó99*“ ‚ *ê”Ê7ª_*mŸÍ>EdŸ–d�K¡=WŸ«/™deé‡pT<÷¸XsD<õ’Ĺ ï×õôukiÅóu/(ªOŸ®QœíÖuí*ƒB©¢µšn]> endobj 339 0 obj <>stream xœ­XTTç¶>ÃÀ™cÃz"˜¼s¸‰±D%övíQDT¬€(MÊ00CG†`~z‘Î 54[b‰]ÁIÅ`�±¥iˆ11yfŸÜŸûîýf¼šµÞ[ë­a±8œ3ûß{ßÞûÛGDY[Q"‘Hâäêá1eªñÏ1Âë"á +á¿ÄÌ ûþ\iƒŠÑ@ëÆ7F͇Bð`˜<„‹DËVmv ‹–ìö—9Œsï0eΜY‹÷øI|½C\½eþ~{¼eä"Øa]¨o€Ÿ,ÚÑaqp°ƒ»ñî~~Ò(¿�=g;…î ‹”ùI\CwúIC(Šš»jqˆïF×%1¡«�üÜ–®yOºvY„¿ûrYÀº‘ÎAëWʃ½=]öøl;nüÄIŽïNž2ê´„é3fÏ¡¨IÔ›”µ”šC9RoQ›©5Ô»Ôhj5™z›šB�¡ÖQS©±”åLM£ÆQë©•Ôtj<åIÍ Þ¡VQ3© ÔFÊ•ZBÍ¢&R«)'j6ÅPý¨þÔ Ê–L ¡†RÃ(ŽN� ¶S,õeO�¢þNrIIÈaWDN¢j«±VzñLq‘øŽõVëv› 6¹6�éôEÉ;’«Ì2æV¿µý„þIý ˜;àîÀ]/ š8H6¨ËÖÛöè`çÁYCì†$µZ=ÌzXð'à /~u8Á�ðÑ4âŸìböƒ×¾V7rÈHÕÈçvÒYYR¶Ý¿‘^PêE@@eÃbá {Ž.©C á(žÇïÐña($¤•ð-]Ê@ó•@Ñ-yÍü]I9ª D‘ÑÜJ¬’ôÚk½0H+ªvˆáSá!«<(G2ŒSS‚ð�®÷íe&C?Ñ%õä´Ì×�µ ̤밵MpÄ‹·e(�ÇjXÀæ5¶BRÎ)&ƒÎ’•¬Fš³8Ú®ïÐëzÑOð0ˆ…™p‚ýyë‰9Ë·û)b¸C¨Ä—s¦ãÉÑ:bôn÷1_ÁXsÀ>àL?i?vA_èÎáXÉ«Ÿ¢{ŽTéáž^tÝŠÛba ˆØ:)RÊR•ñj.ÒÃK�˜™N�Ï6€FÖëÒ5|^z†©³|š4¹ˆ©ª,­¿2mÇ =°Ã,lûx, „Qž–ñ/@sn³Ä‚¦¢'aăI=HÔ¡J~vœ Ž6åµ&ç&š#ÓÒ0+°=ÖÚ(Ìÿíì DŠä|'ly†·ØÄô¢ÚiŽQN[:ÑÞ•mbøHàØŸØÍª@FC+ÏL‡Òôì¤j9ŠAŒg�Gµ¨ŽïRJÂ¥&‹7{|–¢p^�gHrƒ³’Švwà»LeAh*Båùù9¥?@ *aº"_ýE¥¤®Ö¸'½©•áLè±zðÑ‹~0@¬A|I¶;N£…š.eD/a‹yØKƒøão¿êð2Ì+çÏ”]<…®2×ÖÜÅVŽËYð�!’{5®»·ì\=‹Ç>ÊB,Œ”üª�àåç:µh׋NàaÙ:AÄíËÎFLK$Rpø!¨Tò¾’h$knAU•\5äJpþ$1)5EÛV¡Jž÷ÔÎYIEOí(¸\+±ä”Þ:ƒ‘SÁ, �ü”¸CM‡‡âa�&üñÇ£Ÿ`‡7ãÙ¬“ëÍÎÇ_\úòË/œ'¸.rz�8?´AÁÌM¸Î&î—£(Ĭ¤ã¤&Tu)#{(Q‹Jù_ÌÌŠ¤¶’ Â+6Âø®ÙvEZT…˜Æ¢¬Ã¼PP%1q'ŽknU] �¶/¹.ú¬ —D½P¦}h€ íb!D¸Ë–¡ªÐhuRJ*—¦TF§¥øÜZê�Ì:`/Ç.`…_‡aÐïëÇß6E¡ÄøXuL:¯ÄCǤn9ÎL€ �úáÂÇ;Þ-á³" TZÄ´  -ß—7‡Vx]/jk‡ÊKba:x°ºJtú9ÿHÇ8ŽÅ¶xدãa0°'¿«ËM¯ V¨RâT¼tíJµÍFΟ'Ýb2ZÙâ†3Ÿ£_�nfö¦¢i5@=Ád;èY8U��±sT>†�ëÂÀœuõpŒÃÛp;EÖ$�H8‹¾GѨcß©’ÖÆâ»è+ÔœXâY´ÍG«‘+Z�´>icd„#b,Q»k€rƒø³^"w—q—RnÑ®6ÓÀ>„7a*LŸ °=�mºÎ°‚²SÌy’MZCb™ë®ÔÝÓI‹Ÿ, ¡�ùòÑw��¾Ã4�ƒÍPÖw)ÃÌW0ÀLŒ0ZPZ?§:öž§û¶“ø¿õ5ˆÑƒo·};×Ý'aÁŽöGŠ–fT]ÁÝ7ñ\áÏa;ð…t/º¯>.IšT…þŸ¿rAÑS,_›‹Åk%–Õ °ê¶‚a- îw<ÈÉEš.k÷ûiyˆ©.+¯:æ]¶i…ûžu[ùzÎcÎçMܾÐ"»s |Ó!æuÏ{pÈ�0"‹=©-þ° #÷ º‡3/³¡¤eqÅÒF×ial¾±€*ÊPenôþ¤JK „M)IE ĤÐñÑH¡ÎHËRóGæå$# ÒØ§k41\,ýJ8�|bïit�GŸ ŽÂÓûôUU?¢N¤“í[[è…"O„ä ²Xs7 ÕCˆ^ôÌoN(þ�,¼ñj(Þ€ÈxŠ.ksò»”{,Øð–97›_�z(Õ‹…Ù˜îB�PÉ4œoÍV$'>+rv€OMè~ßÝ ¾›ðAÊ�äÁì ðwtñ®½Å©KÒöICœ’ó£%±(òý¢t¤”;áw.­ 1àŠ``áïxˆns?­Ô­eꛚìÌÞžÉeÊ+ÒŠ^hÝ:˜¿�àÞ¥¥èRþ¿¨�DýVSþ‡=4€‹á”aäðx ÙÖæÆ èsoÉ}ÜŸÃ þª ƒÈ¢ C(=üäWtjBÍ¡ÕQD=í@ï¡�Ê€²ðº8’–KÚ+µÉÅ{Ò#’SÒ|£ÃÐñ‹í(wo-ŸÐ¡M,`0ÓÄ.��kô£ãn^^ÛÝÞå{Ý„¹z8¥2@ÉÏ*ðgµu¦c±øGhõê°7ç fîÒ~ßÇ;Ï¿:uÞol1Ÿ%­D…¦¤ÃÛ#ä1ª$u—Øè[±Ùãþcðëx%v}†í¡ß±£‡öóáÝ$ÔUr}̹®ÿMÛ]½ÓUƒ…~,Qfí9ó.ÝCVY47g¦Ä$xJø‡8‡vü"àê…§õÏÈl B‘QœÆÍ}¯ 1óÑ™ËIýÃ÷"ØKŒ· _°µr­T*—K¥Zym­V[ËáEø s—ý·cÚ‚ìMfWÆÁº›5–ãàìgpä3±àlnQéJïDÎë˜{ž?bþ¶pá´5væªø£Þå©ÿ-½SžZZY(E¡Ìúnóf8úVÍiJ5å{LÌÇ\7õu™ùG‹¸ÖWRŽêÛt|óÝ—;ާeó¾GÙcjd¹; ”™>¥�ÐGÌù3§¯Ü8ë;³˜ËRd&¼ÿŸEУ‹ý È‹ˆ®¯¢ûf7Y oìƒýÁ§ÊÌ=r÷ÅÐXðDZ‘)Ñ¥½*4’¶@¹¯…QìKÕ‡÷Ðs–Gn›‡6qPóruâ"úÝOBo}z¸¶\Ëí®AåÜ¥—k¯gvÖ`”ì ÞÇH¼`ÿŠæ6´G¡9›ÚiÕ¥ÜlQÚ3^îr&%i²üÌ‚¥UfWŸu)ß¶h$Uæ§Þ¦-8 ¶zÑD˜€|2ˆ¡¿M£…¹1æt ñLìh¿÷¸¾Ú|ç£.å6‹´�1ƒ²í>}û: ÀSm‚z7(°6›ëkUB¶^tà Q½ú,F1~BcÑÊõ<]Z�âàI½ä/žû�¨Ž{“ž>½÷# â,¹ù5,#‡Œþ�Cæ›u«k =m®*&qSfc8—“›U€ ]le„,:.Ô¥}Ë£ûwÎ?6ÙTëàO½¨TPˆOÒ/jj_Ñ·NÒ›°ÞFC§ÖŶímŽ6¤¢ ”ší"_ž’MV—  ·9iá�uïòRÂçú—¥U#ûPf¾öJÁ�²Ö¬z²of$ä„êhWd&FåH‹ò1¯ Çå‚ã±D°íRb[‹ëÏ,ð¶5×É\ýs¢^É2IÒ5±7Ýïà×½ßAËÂ*ãªr[2�fp('#C—Y”QL§j´µH†¢P²&}mª«|SŒËn´œYú¹ÛãæÏržã´�gÒ#¦¦¦ç´pyfn<¿òK†I”�Â?f JCÌšÍG>þc? 2µŽd�pX/ª¤ba5­©Úäªiå¬A�ü\|3acÌ{*{ ­ú éèÞ#“á_v�5æåÔk5y2ƒû®ê‚Ý:"�ì«HÖ ö¿�µ‡¤jà,L‚ 6 ½GÍ2' ïÂ:Ði%})›@ÿ…0þÉby%šç`€Ç96 ½÷¯öÜ�@RK¥ :ߌñG,l‚6¶ �õ4ÿ€Ø]aœª4òðf´ ‡(“5ÍQ(1{z#kâq»$(Òdù~�e æa•äþÁóÇßÏ÷ßÂa¥¤o³¾öz¤�wz•L¶QW÷²ëñR`lrÆÁÚÀÕ„ iCÌóÇ�0Ïúù­%[·ïMæq?ë‹mm†«ú%S&,_¾tÑ®g8K¬÷ Iba7Á:¯Á„àbs5UÓ;ð­÷dW�A[ݱ6¢Ì”:)J&Ÿ(”•š¼ {©W�ªÒÔ§—¨?Ü(Œ¶³&&S (—�áj—6Kž©Ø�ì ‘TgæžyöiR]Ù[Ïá˜ìäB¹QYìG™Ú¬ QÀ ƒ5dŒ×éÅP+hÙŒdül�nÜœ˜’’Šâ˜Ø²øݳË`{Ë¿Å/8NQU_�™‘‘mŠs¶îOQ Œ“Ð�EÅ)Ùñ…˜ë €·ÐÔÙ £ÁáIIa^6*f ÕeÒÅkWnåÖÍuDèxtÍ —k«Éˆ­É)/à_°ÙL€yBVBt[ñ«Ó“€‹/“‰.SÅ$'æ©+IñÏ8�G!lƒ¦„à±ø­q ÉJ5J`’scªk¯ë '8ýݺÑwLߪýÁF ‹¡!‹UËý¼b’ÓãÔHÁ$”Æ”Õ?= ÔùÀ£ÛwÉCÂk#šró22sMa='jÆÛG[ÜŒš[‚�=æ2�„‚›š&âOØ 6b¸Üƶ„Õ„I¥A{êÂê^HÙEa´XØðç6+/+å1º˜¢¸(eÌ^5‡¿þ窴”4…}Tyb©.¿l_Î ú茑|ï4®Ë«Ç�¦°h<…]ðê§d ¤@ô3Œû’•yÞ*ãaü•_®]»2�ÇãVaÛyæ×¬þɵ’äú¢ð[ŠêBbTÉ *N±#ÐÓ35N•ŽÂ™˜ÂζcG3³¸®ÅÓ$æù¨2³qš©ÝÂ&Ã7Ñ!a•XXÏØâF’«@£0zBÇ¢À &TÄÃ3<‘-mA-ÍÁ(‘ÇÐ {H[ˆ ês‹Ì·³_C%qëWcKŠ~}ˆ@Ì=éŽñ•Â鳼¤åVT•ÔW¦äª³¹’ó'èóà†×ôùkÜÖoáq^—”œ–†í�®rðŒ®Ê%]²”Ñ™µ¨«ú¦6äÛȺõ5ä‘3 àûû‰%ë�׺N»íBIf¡<Ÿ�—•o Qò„àé�.` Ã|ßy6´cÚaîÓÃõŸ sÌ�EˆxþæÅ�µ{ËŒ.–) P×xøJf9bÚÏìÞ¢˜ýf ¿+=6=ÉÓÕ (ž ÑùÕãŒ� ýD¡Ó¨- "ñ%qI)êd%§Ñìð‰@J¤ÊIÉkR…¡¾W)UÈbP4W_º//§ ŸËÈ8v¤å£\už²>¸2±Þ8Ïê ók+«ËQ…y£µÒ ƒ ö—Ûć!…MN@éÄŒqj=éØÊÍb®.57°ºa¾Zÿ [Rò8�ÔšDƒçw fÉþû› þMÒ—Ýô0K/ú¶û=‰`G¢yNÓAJe0�µ’x$m,ËÎ)Ìç/;‡˜Û§–.�ûÞªY€{ì�š�Σ6æîìÛ¸î7{þœµ§6Ü’qc‚ü–¡uÌøGÓ ž¶�>mÝõåÛÍÜ¢vÞºÓZõ§nÝÒoöXïî5ŸÇ—¬g¬úôRÇå‹wïÜV¼·rí,óò÷÷�á™z¨º.ÈšÃîÅöóÆMB(4+ºÜ$¿*ãuááq Ù¦ƒ›žÙà€OÈÆ’Og�"ž‰âþßLÿ½µMwüC�V±ó=.õí•�¯Ý{zHŸ‘†Ò³"2T™ ¤bV»¯›ÇÙ& P„= h�'Ñ÷7 àú[G‡ì§8Ð0pEý·×¾o endstream endobj 18 0 obj <> endobj 340 0 obj <>stream xœ­ZTT×Ö¾ãÈÜkWÆ@Í[ì»’h5öQ¬ ½Ho#M`†){fè½Ì �,Ø[4_Ôg|j¢Fc{‰ÑÄÄœKÿË. Ékyo­ÿwÖbQν÷œ½¿ïÛßÞWÕ³%‰$‹×8N›*|7†*â‡õàß{bÃ/Êö$+è+†¾=†�½gÍO„ÔÐÌ�TO‘héªm®‹CBcÂwúúE·xüðiöös†;y‡ïôt¾Æ=ÒÏ;È=’ü8|CˆçNïȘ)Ç; WD wôŽðßåíÕùìÅ!A¡òHïðákB¼¼Ãƒ7ìô r§(ÊqµCL°ç–5‹bC¼¶®]ê½mÝ’0Ÿ�> ÷]áç¸,rç†årÿ�+v8­Œ tß´*:Ècó¸ñ'MžòîûSK§ÍŸ>cæ¬í³ûαq™gÿž¤OŠšL�¤¶Që¨%”=5…Em§>¢>¤Þ£Þ¥FSë©¥ÔûÔTêÊ‘ZFM£ÆP¨åÔXj#µ‚šA�£œ¨•ÔLj<µ‰ZEÍ¢&P›©ÕÔlj"µ…ZC-¢æP“¨­ÔZj15—êEõ¦úRý¨þÔj 5ŒD©©xÊšâ()5˜b©·¨y” •LQ¶T õeG…PC¨¡"­¨·¨µ�ä…¢©ÔQt«Þâ‰âs=—÷,³’XeJ†HÌ4K—0³�Ù×kX¯âÞ’Þ‘½Ÿôqêû~ß½ý\ú=ì_1`ñÝ€'�ƒæ *¶îaeý‰t�ôÞà-ƒ³álÓ[Ëß:jdû®í+»„!öCò†ü4tÑÐä¡EC�}5lý°ËÞ¿=ämÏ·k8®Y6Pv\voxÀpóˆU#ö�x6²ßȼ‘õ£æ�Ú5êÞhó;Å¿ŠÖ8QýÛ­À‚<�à"ùIÿö$rÛ­~…QT×î æG¶¯fSó5™qjej<öìøÆ6f‹çn'-H—éèÁ'4uZÆBo ¯¨4èrtzÙadc…@rOÖ©ôJPÙm€P.�n4\…}pk[5Œ%†^ñ™Šz›ùYá[VX.éÿk�ç)ìn.¹ÇË-¢Ò{b~zÈV^<®+ò”HM°6bÀY/ב=X´E±{´šÔÄ1Xk‹ÅȬÊѤAš]e”r:L»B ¡à© Ò“ Ž@)ø¡ "ÛÔ„xe‚|cÈÒU� ‘]bIË2CS]%OÚÑê{ìbËÙ³åÙÕDÞªUn¶F=.®¾‚¼¯ØHëQôŒÅ&z‡–“6èŽë« ’„d¯’å 8$C«é¯�¹t1×É‘Ãñÿfåfrm-ƒ6Ðp,��ñÅþÆõ°œÝBÖ0Òë?Ñx„Â*�¾š•²MÖÿWÑÑ0JQ�êŸ4UˆöÞE›Ÿˆæßb=ÔÊ H`ÂJ¢ª+�ŵŸ-Øÿô.¦ð@<øù8Ä !u¨oNÎP'iTJ žM2«Év†UóöÕb´»}:›”§ÕE“´|X#)£¶P[¦Öi!šé(ýCÌÓé©:mš’ŸÔñÌ6;Q§Í¦2KeüQº Ú^’Ýúi·iüÁ¶éý„ýçPYÇš¤æÚ\JniŸl�yɇ֊Û'·Ïg‹!S¡RAb2·ÕÁ§q˱‰`‡×áYxvÞh6ž†Ö¢9ß!br 3AÊ=ZY25Ü‹€Y‹·ìEÇÑ ´yï$z8�1Êôñ .¦ &Yð& šdæíZÃ+¬_]AEwm¤_¢Åè[sühÍq`®_˜�­p¿ç8xzeñ&Ð�‘ÙØ3=®Õé/à}~ü±H:á9î9ßÝU%“>»Ü�žk™JWY‡ßkíÞ«;¡¯„*8Þ³.•ŸG¿Ñå ZÔI€¤Ë„Y(Ž5ÀôÜé?óîhòuÈO�úBâÒœd}j’F™¬‘ù�ž{`+xÖF6�ËÐÈèLl¯b/0/sðP/᨞Ã(ØËÿ�„—׉ùƒíÃØÌ\r’L¦H Q\ÇFÂ[9ám&²ªýÍ%çš&é°ëÀ) ÐB²]l:˜8Þ�×Hˆ›ŒeÑ“ñ‚�¹¤ðŠ{�§ä•ís+„̹¾·{£',rÃI‚Vâex2ž‰=°;š‚§¢¥h%šˆf þ ÍNÄC¾F(�ùìî4j ÎÆ%øí9ï Æ_¿Vaî>/}!nh_Àþ ûÑC‚æ!�C!G<Mà dxðÿ g»l̾.M|!ù®È�/9ðQö,bd°8z�ﶨPÇõc:UAp]0˜Ped¡ˆé/ù�X¼ì�²ÇŸ•ÓÞS­¤Ïª<.¾?3#'à·ð gcsµå@�Yf@�,AC@Lˆ<"!> Ô˜Ek’,ö¹z÷ó/Zgn4uZ—G° ™÷²Ì"Ôóò“b´”Í"‰÷BŒäë#G !¥�KTÅ$@8YUUSh,oò©ßôáìM#8LÏ ¼�o¾Þì~]›¾š¡ š ÝwÑBa!'­ž„öU¢‹�qEÇ^ŠQºÂ¢ùÔQ_¾ønÜ×øm~õ»2ñZB Ÿ“‚¹n@ÃoÅJ�ŠYTÖå‡4Flsbfüö´óT¿·Óon«·ïô›áxJä"¼� È®»ÎÑÏrfË*PI¸d–"p7 ¥Hº*+A“¡jc–1’$·ê8ÿf¦7Høœ`Q¤²¼±[¯.¿ºo#=„ÞbÑRÃþ%SZ=§ÖF%BbÚm.©È«« ¬q[ä»Ü-ž“ÞD=h,ûM÷MN^�=Ê�ã¹{eʬ«ODÝ@‹n4œ°‘þŒÂÑBv&¼(«ÒÕVȲòʪ›�yc#Cµ»Ãeɉ‘!žÀŒËb÷‡´¨K�yzåÊͦ¸¦ð2YãÞÆôAßÁ U¨R�ÈÄæ'å”f–'ÖyE¹*=Ü9÷zwƒ˜)K—~àjö®Ø%KØã~Œ´ó½-QëbÜÀ“Yü|#ê�zÿxüVCüñ-Õܦêõ°–8F7HѤí²@¤AY±‘ARü+;féñ“‡÷54È>–ÜG=a–Ó’­ã…4êÎ il³ Ã]iÜX�F �Cû<¶ãð?'‚å©4-ð¸³ÖøÓ“ ¿A†´÷éos^'xÎÿ‰Ü,”Ñ�à¾4*6aŽ$˜dQKôÐÌÏ.µ®/‹<‚âÈéCä…6±fÕ�8XÌlñóœ?Ç÷ìWÑœ:_›¶˜H‰‘a[:RrÓuºÒRN¯}IéA÷CZQ3úðŸþ|2¨61Oæ_ç•åžÅHonÈ]žnHCeË}Ô#}Z žÓ%e“À3ù�^*ûžjOª8µjO’Jí]í» `û{/ßàWR%—Õ…U+ÿϼ1ù�¦B„z_Ì» tö÷¦|¸®‹óe´è{Éï¼EGñÿW@¶ñÕ0Jn&©:iF'ˆA$üÖ"«/¿­´‘Æ¢HôŠEy4”wmÈÑ×€˜G¨§ ¿³4â=høx#ÿ ×ÐxÀÓÄÆkÕ×.qgÃ7ÒAÞ>Ëáq1é Eìù.‘Bý^Yßxõ!± OчüZpñi¶’h�ùu¶ët§ôåÄ<6te{…*}¿Lú}¿�­ 7…ÊCÃBÍa–ê S]w»I\ÔÔjë3•a—Ðg—6‘Ü_G?ð¶,lYSèu ÎÙ]=uázߌçîÈàtJPævc¹t†#E«MLáüƒj(& ÞÌÄb8½#iÖªÔHÈã ÓŒPÅTÆCBb¢Â6Ÿ 9{ã“K�9iGû”ž5åÁÁÁÁå55ååÂSƒMPgoBM¢Æ ”õe‘z<¥Ýží@’èN÷W€fÖ£‰¤w®„�I ˆdHwBüHÎ3PÒbø“ÏKh!ò¤GBÁ^¡_%ZRP’–KT©Èå…þxV—’ïöÚÅ {(Fr!©†ÜÛ\¥�°y$]^0¯3a•ômCwÂÔŠy\˜�ŒÛ$ûávg2Âèyê®d³¦0ñC,¢R>^ÌÏD÷Ùì²â—uo†<à¢�š‹&mn$DC’F¥R¼ƒ³lqOT§Ì'¯·«Ü%D>‚´4‘¿ y.Bš2?�ÆÈ6#^Ÿšù�–�–ÓmIðèÖ*zuYŒšQ«Õ§f€Ò®�Ïɺx¼Uoö¬N€Òv®ÑÇ {(Õæ( ¢â“SðÜß–�¤ÿ¥ü׋QµÐ¬mÖ¼–ÿ—ô¥Ó7G´n€»èXU4YU­ûXo‚¨ÑÖ«|@Þ'…f’�Þ¦‹<ía¨Çâ‘ÞŸäŒ{W GŽôxÒ�Æ#ƒÉ ýè)’s#dC3ƒ®ÓõpHèÜ|µÛ5;Á¶ë}ßtn$0¢¯IÍ9‡zò»,¢Ô�¿/F§Ñ8öÝ­6)—Á9_îD^mecˆ1D¾3ÞÕáÚº‡?\¿z#W¦Ë"‰ØËðÑ-p‘ÜßUã­u&}ì ð&k¤¿ƒ?Yl»ò]"ŒEÙ’c–ü!Ör’o9Ã}´°¥F­9†ü¤MjÂTœm;Õ©ò´B«\µŒäÁÚ-š‚à®t7A‘&'!]™”= §ÚNBÆÔÜÜVÊ¥ ¹ìXzÒâ�;¶y4;ÝzÙgpÐLí#÷Ú·‹ÛEü¶ ©ªæ3]÷Ô"ŒÄ¶{jqBk ƒHHV+5J¼ªc—-ÞÀë•�ä«9 �ƒ‹¥‡ÛÁ­ PŸ Vo´»ãÛÌètu>ƒ>=½€éj0~4?‡EË‘CVÖÉã_ “Å0uá°/8ÂήÉbF$$AÜž=„r—ñ [tíÿX%ÓˆA=Ð lÊHÊN€D» /Ò3 #Da0Ýû:Gˆ´ìJ :ø›ZXYDy¤Ù&Z‘ÈÖîÛw´¼ÒÒØRØ&D+LÔ­Múáì&MVÄ‘-'¤*×Ì·�ÿ}’0âɰƒÂÂlcçzí Mìg]¨€Ä« Ó¶­{ŽY[çu qvܾþ#Í. ¨Ô[t•DZ5å˜ä†”|(sMý…?×xe)öoÍRädž$%토µº3z3ij÷kk»N£�¬BîàôOcëκ×ðÿ5¹þ¿Î¸;ëÿÀ!wÇ›y÷�˜wwn…‘Ý9î{u•Þµ‘E ù~,ºúw:ü´‚Öé² ªÚéîÈÂÖ­Ÿ}=ØÿKæ»9ÇÄÉ ¸ˆE4Á©.·hÿ™ÓYåpÃʽ+= Žà>šuÁ;vzû; 3Àòˆ¦x)%$œ=Åç©.â”ü!þe!NÉÙ9û…q_�&PK$ VuçOZ£?)ZJu2!΄[<“OЦi2ˆŒÕžƒÊNâ,ë±›ÞC¸â,˜ Ï×ü¡-–u8àY¼BkÐf‚á߬¾i©y>ȹ£ÝÖ�dØ“„“™iùÈžO·EïudtýÒ®ë·L—ëÅÓ/Œ¢ççÄèNaÉ¡ô±Åx²@ë�´æhÑ>´ @ƒòù40™*ƒrÏ´eXú·÷HÄb’­ù¹¸ßilu¸¿2˜Œ4C¦ìïîŽâÈí[‘�…[ Ôo#²Z‡Ìú”´vJ•J©MiŒì»qgñ ÀÞ€øà%x ¶NH ¨eš*#çÑgHú1wõÈCb¸×­sMèP3:lñVÍb~2ŠeQ�¤ ŒÆhˆ—á:T/)€Ò¨(ˆŽçp=®§ã£!*Š(‘ ‘Ÿ$ñm4BiA·kÇN&´ð•­0‹Ñ²"V§ÓƯ Yëê,S*µZP1)éªô¼Û·})¢ÅÓ/&4,¬8´±(/#+G¸Á' ­;'ÊE%bTƒÖ±çpÉzº»P¼Ý%FO²ÿìÜxuw„Îð6b~e»3›ž/¤€ÉMÊVÄ«öìQsø¯[”š@\·ÆN‘�”[�–“cø»-£�îðýÿù Ñb–x–ù«R’;Ã)#÷Ï_ ¦Fó¹Óëc¤ëA§ã2u¹ú¬L†lJnn·5‹ößEYwżºÎ©_ø}îò­}‘;¬ƒEaS–¦Î‡÷aaÚ´–Þ»uNÁ_L¿©»’~ n3Ø_g½à£Š˜oçá | —àrÖ©RÔçFvÔÃå˜Òq9`¬&z½L±j÷$Ç  <›Ï?y” ¦7*#™Å½¯ÄG!›w�íñF+aA¦‰4j"ä�ÖŠù>í}Ùì̬\ÈcJbJbv+J‡ûâÉÅ1ÂZ¢sM–ƒdqèçbÔÖ>˜-}$·fÕ $ÕHöu¢’é m‚:q ‰ÐL>:‹D=M�Û$낲kFSšEgÚ'‹Û£/ØÂ×HëøVÒ�¬Bÿ ÞÄvcp·¬ã¯’ݯ1'ìæ&úé§ï-¢c?!×ÇbÞ -bÃ%©A)®{v§$¯ ~�ÁË%¯^¢©ˆ; ^Ø!É´/plåðîô ÇÀPÜ�×RSé—¬­š+ûôTÓ9`xÏþý­ó6®‘á�Ø_!¼‹‰°ãi᥋¼ú©m£ËPïï?©°nE=gÿ€Þ²à¥�Sèú‰½Suî*ÉÕ�g&ŽY°n�¿9ºÆb4×s†ÝœåèåüF`ZN˧%jÖ‡¹Ê‚¶ïT‡k“µšHÖ¦ha#íP(2¡˜;(¹Ó´l<¶4ØÕmañÇ~²†T‹ö1�¡Æàˆ€xשOW êÿøñwVßeâ:ƒ†Xxw£5j»¹äš�ôûjdÏ¢Ò™Âë3n—ÐŽœ n§Nv¶#Ýc¹/héSËX~;É\F\’ZèíñùŽ�V¨â-¬– 5ß˪óà¨ÇwhµÙܵ>ö|»E?´‘þLâí¢>ö/0µÝ-ÎÏ—C›i£²>…8&4àêãü uzŠ–P$U•´-j9x‚K¦³)Ù !!eö@rœ ¥c ¹ SoÈHãr‹šN} ' Â%+¦ÈGï[é/ÄC¯‹p�ðò s!•ËñdìǢؤ ¯/®(/�­ð�÷Kq™ue1ÓÌß"©¬›È†æ_&5Ð7‹Q6°Í~™ô¬¿ý·Ýtçqø‘ew7“>B^OV>²‘v [ô%[N£ 4°ñxy«r§™Ûí ;Ëw›‹j³÷Ÿw=2ÆC1‹ÃdÒ_°1Kž"ñ7%×I§‹ÅË|¶l�âP|ƒ] Aç•…1mð©g·ê^<*: k,\‰l�mÄÃm�õ ZçBÓNv^~!zùâé 1råeË£*ƒBäò�³¼ºÖXYÎ!§·ªåæ� ¨°ˆcXmµÙ\ý»å–d#¢6 ã[´ú‰ÐCwùÑìáÌ.û#×Ì‹il�§%ÿÀNCÒŒô.î�¬$Ïï7RÛ¸'ÒÈyh”!ÇøW&”–•Õ~¼±Õa 8,ù»ú¿zºÙkÿéÍ<"KžˆùPþ›-”=ƒUÜ4ùªR&\â�=HCm(ʾ˜Ÿ—™q‹ô ò”(âæa‘Üê�eð�̎ÇáPwœ†Ó†ÓY§ÒÊ îüDèèø}›fª«@#*ļ{/ö°G‹“£—›ëÖƒÞÇO·4á&­`ÝBJ®28PíâåöhéCÐ2£=‰Åo{>ûÛ¤ žèí.Ö· H9yUŒm½výÒæÅŽ^Û×ùqæÝìŸ›Žž€ËÌ“ég§Ž}ÏaJŒ~G«3—›Ø^ËH®žµaÜ�?,ÿ Y}s÷çFÅ!ïV.Ú—³ª™ëÎVǶ ¬Žn ‚µŒÃÂÍö³r÷\Ý¥¯ÚŽ£,³x•˜W¡,ÖÜ¡’w�¹ñɽ2~´æ•O�×#�™bt�  qÂ(—õ±Nú½¡ÜÁ¬šbKD¡<.(Ékù)�¯ˆYëOúׂedÆôgÓ7n‹ÙáÆyìˆt‡… ôõxÔóBKë¹2ü€�¼ÓÇ@(Km¦¦ªcûòà0Ôï,Þ‘�¶\˜¹;'Ìx=°ûãŠoýÛ™K+ÿ³EÔ.­ó ºÍfç@š0ÞW¥«Ó°;:j‹â$h>ó5áé¯ßnœ�Dh R†ôøo8 —ï[m§È�BŽ?!©F «pI ~Y(žFÊA�ðŸ_–9u¿BJ7‹s|.?} æ7 £IÚBÀHi;ô/_!5úíÝð‘«·*• nÚ� Ì$ÌlƔ쿢òùÃzÅ"+úÙ�ÖO�VG§Ž$J]xU’:�ôi‰ ¦éß:ŽNþ?©ïä¿ïk 8®àü¯5ÀK½M• ÛUvÒ{”VCT`è–€Žž»c¸ÈwãV`&ã^DþËøþGÅXaa±?ÙÀ‹û?.oH ©â¼4Iò¼¸’T¦?1R ̸ªçJ°Gmé}¥×»çcß^æì¾}¯ûö£¨ÿ‰@z¢ endstream endobj 179 0 obj <> endobj 341 0 obj <>stream xœ�X TSW·¾1äæ*8Þ Öw¯ÿ«SZœ¨ZÛ**-T´*‚u@E‘1 !CÂ<d–’0 (Å:[i5j[S«¶¶ÒAiµ¯ƒµµÿ¾ýÿZï„D’ë½?+YpÖ9wŸs¾ýíoï}E”ÃJ$IWøùûÏõ0ÿ;MxZ$L!ü—8ó‚þw_ r#'‡ŽIn³]àº3„Ž�q”X$ò^½eELl¢<<4L1yÆŠg'Ï]¼ø…ÉËe!òð];£'ûíT„…Èv*È jò†˜]á!ŠÄç&/�Šš¼ÞüDüäõ!ñ!rUÈnËÞ+bd±JEˆ|²_Ìîy4EQ W/�ÞµÉÏ+iÍŠ�µ+ßXµÎ;>lý«Š ¯)ý}"7úª£v¼.›ñìì9Ï=ï1wÞü” =_X´˜¢æPÿM­¥VR‹©ç¨g¨-ÔóÔÊ›ò ¦Rs©iÔTå—¦7Ë‘1,'Ò£.~P+�TY-öÓµ-Ä¢ EòB\¡´rÛUì_œR®¨)É*ͬʪBÕ¨¦¼¼¦¨ô+(­:ÇÆÑû°VÚ¥·ÞpŒrµqŒå„*#]¾5�Æ´…ø]€„¾àLeð‹Žô™ÉO¡ac {Õpü,ºÌÜXÓ�ÅVÑZ3J-¨ŽoÔÒ®�cíXQ@ƒäÒÀmÓ–÷—4ò>¸ŠÅ® ŽþªÃ+hóî7ðOØ&ê5Á“XØ¿³z]aªg*Q‡Ð™™ü6iRìFz× {¥ø}Ü«Rä¡$÷pj䄱´¡éP-óž´H©Ô\6H‡ ð T÷õÂÇlêMQ,b^µàÜLÞ2¨•ÛF¿YÀŠ'• 1…4¬Ì««+hEîUE‡x¡´E:¼â6:´ Ƙ}�fÊ�¢Ã&¸vI,$·Ù:Ô"KÌIÏÊáòsQ~Š<¢}›n‰:;à‰Ø¿ä/<Ì×߈Gi �Ïg=»$>1 ƒ™ðìÝß.]ض¤†/JÚ›Ü�3¼%f&]‚ñFÑ…�¡ñºXX X}#êúõñSØqÖt<�ùy°àvê›sD%fæ%dñÊM3bÐ2´ìtò×Lá%¶æÆÅ !âXyÅfø}&h#n ƒ÷X8ªjÇ~ØO‹�á£úXðƒÕ†68Êá`\ÎÎGr}êéÔ3è.º€.£k•'«/vVõ£[¨;£Ö¿j+Ùi òC+Ó6¦mˆSÍC̰gúMÐ`_€µò¦–7 j•ôð‚i˜p&ÃBX°fbwKO±‚ö{)HúHP2xä:rK±•M«��gñÊ' ¼òÍæÆ7,ÿKy¬°ÅuÇ Vf·k‹Z-h~£¿?æ°Ã{ñ³Å¸ÒÛ‡”q‚é„i+‰’ý`dílü!æ¡7ÖI]A ¤Á(¹û 24r¬ÓÉÁžÛ!?€&ø igö¾pnp¤Ý9Í»c^ÿO{§¼ˆy¶¶5–ªßJ3ð™Õ‰³ª�74tWÜ)=�>D'™¿z¬º Vr¥)ç¦ïÍ-O­Du„…ãaIÏEêöôógÐ5tõ¡O÷½S}Á »�P{R¥oÅ&ô*ÚˆpˆZ«Ôl¹ë–Q[P¨FL­MD 9…yE9Vì#Ì_Ñ#L"ðˆáhgaý·×žPô7×v¶�y`Paçžçl�H?É.!Õeœàú3œ�rVQ¬.’—D¿Z…ÞfZ»:ÿç‹Y\W˜´7©Ó6&©9"ãsµYùÜvýv”@PxQ±8ôùÇI÷µ¼ëƒÞÌÏS&îÙá±uCåm9—Ó�[‡³3ù™Òd$﨨+ì©âzCÏå·#æu}ñί˜ÕG–XQ¸fÉý‰›^�“¬-ÍÁË5í3é öÿȤÿAµˆÎ›Vô]îšÀÇ´Ó¤#äL"áÓ÷�¿±esÐ:~ þ‘ì=�Ft„ùú•~<ŠÃ«ì%Œáðí”"h×Ó·éFÔ�ºb *¤D;‘/’5FÖËÚ“"æJ󇺈x¥+�¬€ÏÌß“ƒNž»‚Ê3š¸Ôý ½¶Ò¢*0ßÇIB6Aë�Þ‡°Íæ„;T9ÚDø(�Š6o @Ì’W€‚é0çó_nw_Q`ªžß›TšÚjõ%ðCÎT夅k¸°Ž]µ;‰3�¦à§±^ý+vÇw�v4éx%R[(háÍ5ã/:Ì1Á<ÂR¹@³°ÈvW¼¨ŸŽÞÅ ,¨›¹‡óèY×Boܼsl éÃ" TI\�ßzrgæet¶…¢›.g߇º÷CÞŸàúz¡�mÏþB�0�;ÞX³¹¸m·³-÷hACA}AC¤•XØmˆY†Òš® î°Ì˜|•0‹ùøÞÀÕУ©Õ|ðáØ²—ן—4ì¬ éF§ÜÏô¾sFÕΉ*劔•Ùº'€¸YØ�“$Ëä‚»7V@ÄË–z¾vÒç‹x¾¸àEMž}¾„Wø¦´Ø�`猄à è�³ÿiT†Uv¹õ³–ö7çÿ'µfü«‹-ŒÔ£ÄÜ ëZ†˜¡åƒ ŸþKØàpRfÎ]’¹èâ é¯�…+èY¦øGŽìkïá†N« ÜMàFÚ\߸ý�=m©:¼lUÇ9pÔJmYþ'1²þ OÌR¶\‚Ù”¨A-¦ìƇìÖQÃÕ78[#HÁr˜HŒ©¤ÛnÝsvm�=ñl <¶œÜ×uï v³ðvâ¹ùýùMpÄÏ[š‚!¯�²™�²1$‰Þ2Aš9JÉ…:žxƒìÏÚe&ü=Ù'00À÷ì?9ø®CJÌüݪŸh<öîóÞ½c¹aû×À›ØŸõ'û>¶'ûŸ£=ç$dnA­Ñ\qIq ªcštr…R¹úƒ­îœÿÖl0WËM 6Šê„4±°�„t‡¹Ì�G‰¤\ ㇊üF¾—~Ÿ‘й­)'S�$^É« Cé$¤)ó²va.WMêñ@8#éµ´P ”0ü¸uð—ð@±¢Hs¹FE Æ–{…5E¦�. ìÁ#‹3«’PêAEuÅæÏ¬ø�òžg§öO:°vã~»{j8@æ].˜v € •0¢‹5D½Sp1íK-¿3½¤(“‡(éõ�_â);¦"/™>¹¹¶½¢§�Cå……º½5…Õ¨1Ÿœ�ZÉ»žÂ«òðØ7gMô¾âû¨çrYç). Ö°/HI/©Ú�š„2ã|ðíÞ¯{`j±YÙ2õÂA£¨AÐXñ–ÞꮩoéQ7ÿ2¾˜�ðJÖ÷:§;·>£g¦àîÖý—•o™¬ßR‡ö#÷6Ôˆ*zlh Ú0ü%C»Ä ˜o~Ö’üp(n”@£AZû$N·67!Cµãðè!=¼F îô “q‘d¸e¹e™'7Ÿ_œ[Z°—±ëÏõ�£ù;Áõˆ„©l~‡%"&Òv |Yª²žêžÅ”Š4ÝðªÔµwàÈ©#M5I¾ÖJžäí[Xôÿ.É‘êÐódÁ)»c8ÍÁ˜†‰dÚx¥ù˜‹õ¿Ç“$¶Ü¬ÝYT›UœX…Ç}¹ Ü8 ‡‡€‡‰ßÖU–“¶¨ÁC,,†f¶ªuw‡¡T_§SÃPXX7ªª±Ì¶·‚³n_f{d­‘!ò¨¨=q]‡Z:;ÍVéWèDï ³ÅBÐïcÙ²ºB„Ê™M½Z™¥IÉæðÿöÎJ.@(Ó=±6Ig(«­.冻žÓ&x› mîzÖL… xv˜>Ôª­yDÊõàð&q[é|^ò%W�ÓL?ݼñѳx:žá‹G½d}õ0Æøˆ šCP½jm²SSs¸ÏÀ´„üäU>Šaä 9µ�GJç—xHm™´Ø¦ÖC4óìԚľÇfdfç -cæ1÷-mG«µÀNˆáp}ñÌ÷·Ž¾Òwò*úœ§i·ðÅ¢˜dE’Z­D‰Lrmr]eiIi×ÑÞZWƒö‘r´:µ:E§:ˆÚP{]S½®v¿5X£ž2 #‰»nö‰A›‘‚ò ]#*²:9(Á”Ÿ]‘óšÍ5~@ݶ�^‚Çô�¬òp.†ŽG9)jÒZ 2,Èá‘?’Z í4ÂBR#˜ À ,tîlÚž¬d`=dÙ^/`‘•ÉãFi"Rt5—ì+çÚºŽ4¼‡×Çý'¼|_\¹ö…˜×Ë/ÄËËŠûu*�,c÷¢/W�8ÿô ˆ~ùGRè[öî¹ ‹‰´}Ú�À¡—<ãà[¶þñ]ÿ=tÕ¥•ä�O6Á.¾AÝÚ¢«ïè =?“p"�ƒ8×Ç8¼~Ñ�_‚ÐóðˆÀÀ¤à ŽèêÖíîUóK Jɯح°¢ ,¿•¹_¾tú“;ç^[¾ÐgýŠ¡sè…£è¸é]e£I.ÁËñêp‹ðF‹"ºëë+÷s%ÐsÀËxQ×°w/ªaÌx�¸¥³ë͹))ø�Ö­±Ýz»½FØFHkò7A“ÉÛZd½üNô�í{ç³Ûïn \ï·Ý‹ÿ,Šý¼íD/z—é÷¼�±Ó K—¬?ùægqœë/ËT¯¿±lâÌóÁ\îßûá–ïÅåzn)îbùô™Œï]ùöþ»«×xûlXd�”Å—¡‡@j €”Ûæ8™­l:÷ÒŒY(…ªêŠKJJQ=Óœ¨‹“«“d‘ +a<Ñʱd‡ÍSÈÆbÓl,ž¶ˆ€Lß›#Ξ­?r‚ÃSŠÙ%Þ¼{½ïãcí ußQµ e£ü‚|”ƒrŠ“Qã¿qý"nLZ¥•xC�ˤÆQ&Gn”CbŒÓH£““Éi4Eý/0 ¶ endstream endobj 162 0 obj <> endobj 342 0 obj <>stream xœEºþCMR6$øøø‹‹ø®ù-‹ ‹ ®÷´÷0÷-÷*FJYCopyright (C) 1997 American Mathematical Society. All Rights ReservedCMR6Computer Modern2ÿ ªÿc‹å÷ç÷ä²Ó÷÷•ðø®÷Of‰}�I|€„…:‹}‹ûO¨¢ÑŨ¢­¦ä˪©©©´¾‹Ò÷ûÔûû16-X¶…–¤¨�¯¡~«_¢¾È±Ð‹ôÃ=:D\BEKû�ûm��ŠŠ‹løGv ù? û¥š÷o•ûa–² Þ  7Ÿ «’ Þœ ¨€ endstream endobj 11 0 obj <> endobj 343 0 obj <>stream xœ…W 8UÙÛßÛéì³É¥4»¡fΡÌD÷’BåÇýN%·Èˆˆ"!2•ËÒE7i”J”.*]gHTH‰d¦L÷û\{÷™ÅÌ·vifþó}Ïó=ǃýœ½Özßßï·Þ÷÷ÒÔ0Цi‰�‹—×´é¿ÿáÇÒü'*ü§"„·*o*3ÅH]„Ô‡UÂ-Ô†?GB¢LA‰hÚÞy‘Ml\rüË"WéÚLЛ6gŽ©žULxüa!+ô\BVE†Ç„¬"Ñz^±a_„¯Jž¬g­ç)¬HÐó O�O _úþl›Ø˜¸Õ«Âãõ\b—†Ç¯ (ÊÖÙ*yE˜‹õÚØ¥®6qán¶+#Üã—Ù'Dz.Xõ…×joÇÄåò¤è_§51¡~†Œ'Nš<õ£QӦϘii2KÝtvÊœfš5‰G-¤Ü([j25žZD¹SvÔÊ€ò ì©©Ôg”'µ€šFyQÔç”7åHÍ  )JNͤ|)ʈò£œ)cÊŸr¡¬)Sj"@¹R6ÔlJ•R£Ô) J“Ò¢FRÙT¥M�¢>¢8JŸM}LÅP:”.K�¡ò©±ôpÊŽ MIÈVÔê=‡ÞIÿ¢2I%I¥U$ùˆŽ Ó5옘ÛŠ7‰�3‘L¡D,±”l‘ݰYÒ²ïûî§[ä‘R|¾[B–ÕL¢Ö·À«ºš¬ù (.0Â�bgût½ü¾æñ›¶C)+ÎÈ ®y�ÚáŽt±t.ÖÄ þèÉ8P¿ØPPsY†¶dWæn%!ˆ<6‘”ú%ôó~s� ˜”÷ðƒyLá˜5`yâsös¤æðÅ·Ù¼�?z”rÌ0 ñ.r¼Àë-·>� �]´îøº“ÉõhsÊ)²µJÎ} 5À! úi<ï=%›Êa·ô~ôêÁÌNƒ¯d Zu¶ 5²�>»‡õ¥Ø7p€@Kò¶ß×ÑÎÄC_†Gà] pwmììÌœñ0A¡¢�BÍÐÓDHTñcø ÜIü“;Œ• ‚¼Äv3¸¿‡ñ*Íx¼$¥ç¦#v–@ã³~oôán8L ‚8Æþ‚%XÍHëâ�ßj/NŠ£°gã 5и}¡µã†VÅZ¶Þ²÷®WÀKÄ•2 ³KÄ›“­ðY&ð„_a0b'Îý �Æ\—Áóã /Éü»%óA�KŽŒB¬«Íyº÷kOV%E•‘-Uª}†yÜ?B¢B´!J*�Ù™ô-¦JÂ`倿h)åó©\&³Ä¨¤ò•Û©D¢ÿúz¿ˆoQZp|wº#»‘¬,±?ö�ÑØ¼îÔì>Û)ÛØá¼xiŠ9Qˆá 0†)`þd {¬%+ }(;ì[ ¦ xÞBß醌nL>Ë�>�P�Øý/áÐp•É¡Në‚üdç­µ»%üÁaûŽž(;…Ø.…åÄÏím¬b×ì*L–Å—e£¯Ø!ù*À¦Ôô‘Û°¡IÄÃj�Éj^^Úa·c ˜š6žà¦óÂØs—÷’Ýš]‰6çæå”¡­îîbÐ<䨑ó›_ϵ�¯kB•¨#­H_€¡s6•ØÊC ]ßÏ»ô‹”Sà‘ئãYØ ëcŽ—Ágx ˜ÀÓ \Š›ˆô0;F‚8M>"`ÞâaØ‘G‘+$ÈN¥Îލšïm ßãÇÜ=~/é]0‡1DOðúä &pp|/I`ÌoDZŽØ ‹ 0÷¿�­~‡,oÎ/䬜˜¸Êà#®ˆ�0Ë�Á£ºÆ?ë©;··P†sº%VÐÏ¡5(7#5.4bAÉÒýÎÓŸo¶w^­”‡ ÛOê Ý‹ôë.Xñ£¹·�˜u¦ýJÁ‘êÊŒMÒë’ ›£vDi.°6’M³ö¸50º‹”•G…ÂXÚµBrÐÖ+‚pšéó׿üfô"ÃÙƒò~8ÍÀ§ðª�v–®˜‘aÔ ˹N8Z }‡>b9ôc÷õGyl›dj®¯oÜRö�ý€�p–pqÈe0¼Ù|›èæ°é(¾!‚g¼”ChsN^Néæ²-ÇÑ´•çd4ë¬A r—G Û–„Ø™vÖ3–íŽ*‹‘­Z¾1% ˆÂøÝëü£ÒƒQ,kýÜ4AóES7èáY(T:‹I Fue[óówÊŠÒ�¬­AlgçãcëŽ'”Zø  ÃÝŠ+kkcæO÷JŽ–�Æî\¨ û@û¨¹sí*/nA׺ö'ê ]P@þ5¡Çð1ÐÁ)ð%ØœPwrIݫ֋A‡~è IòjÍ�Mô‘pìÁCÞ’s:ì“· ±«° áÑAûcö¦ÉŽE—ojJ?²¡1ù²ösQZ˜Çî“>ÒôÛ²ÛCŸ ]à*ï4}]•µMq"&ßµ`Ùvÿ]èÛrí©;�_+ýG;ªÑ¿;Š}àÒ˜)´X Êÿ�–¢’8]Èë¢ ßqßÕ+ÜÉ^èʦnÔžÑûA(΃ò{p¦2à‚oˆû™�ù¼… /�&'ŸX[@)ï )C¨€_„J˜r.s8Ì >ÆÌÒu‹¿ %w\×�”s0EþŒéþ6!è[ÙÞ>›n»]HIrÆcñ\¼ç€ÝåÛÇ»�‡ìý¡ñm ý¦Só‰ÄAÚˆ¥0Ê�2õø—1{ì;ÚÎíûªRšÚ‘EzpÐÆóÕd5õØC€èó˜ÐÿN¤Ó•有I?³Oà¬Ü»ƒ SR‰mü�×èú8Ú#â)'s¡e§“�ÇÌ4þÜöLà¶M²‹G3¯¦ÜO,̪Š*JÞ»E²öžN&Ös+êÝ¥©f�Ýdžx{üDW£/¬.—^ŒØåP´ (>uéºÂ¸rt–m¾ÜôàþÙ¨ådžè[™×ú›;b1æã“Ì|߹݆µRøn>î—Øì[øÝ¡Þm—›¥ï®íWBJ?µÓPK©¡”p˜Rü¸uà™3è0C-ñÁ ¤_¥Úô¡ó›Ô?dpÞÁCò¦¢!�ム+ûð§kEèoŒœNuÒåÔ3S`—Î\æ ¸£D–Þ;´ç�["(‡̆ùâ) öÁ�bÞÏzP~ $ݽ0'ˆ¿V\M!*Qj”Ðpឈ'ÝŒ38ÉxÄúÎð >P/M³lŒiH¯Cº¿^oy+Ȫ0ãCtÊ"¥”Dg͸ᠴE±“²‚u‰ÙŸÒ–Øé‰:öLŠgZPÜÄd—“ìsî×ukÚléÌg` ‰¹‡9Ú�à™ƒÍc6‡–Øl_Õ‰·è<`>ˆä]*Búù \P}«Nè\¾£Fº¶’ÆÂ9î…ý�ÉnKÒbJók«Î7"Ýs5Ö²PÉ’·l·$‡UK#PtÀìþå_U—Ft0†CI(!*)níÙ©ˆõ‰¨8Þ²½Í²Uˆ �ÿC¤T'!ÌgðH|?L/ëd,$¹fžY~/á*žÉ[éLc ˆx×G‚v÷Mþàî‰àwÞT¸�‡Ä“üó€XÌ‹M… œHŒéÜøñ“ÿ"ñ^"RÉ’9°ƒåbSk“vù1ÌÏb@Ž—‘,þž)¸Â8ì*¾G‹§¿-¬¿ð#Rº�šÓ‘|«ÎZì¾:UšÜê]ì‡æ `ßµ‰lÇ�¥½~ ÷Ö“mÎBýù×£ä_¾êNdvÿÅC÷Yæ\ÐÅŒjÄ>ÿAðZŽ@M^á´1ÀE¶Ù•+>t¬â"b›o´FÏ v}ï=J³ŠQ‘`wwó€ý]Sôû'dOkf*î[m�r’t×-JõÈZ&Hüôêþµ ¬Æ[ëÌbLpë†7¼bƒœàžu2þeVQ0ÌÔ1…+0þúï™gð´üá ø4¿N7�A¹ÛýÏãù@è½�ª ðÖÒß½I2$“¯•™ñ¹cÂq¦ÛžÁþÄ‹p¬‚YzÌõN$ˆã®Š#¸ð+´µ°ÿµ$’-¼•#s‚˜"° üp¬srYóÜj,>8}×d4á ã°�ƒ‹`Š”Û¨y¥PsN‘Mþ8.âÇC La1*þz-J•á á '¯AkS¥¸WHÒ’Qòš"´Wä‰ICÉÅ_£¢½B±Ò ðÈÒ_úèç}¤„äqwÍÌÊ%ñx¤¸FH˜LcàÓHï†="Ø>\#Þã!y¿ -éãÌÌú†Üx¢‚ïRЧºa¹Qޤ잕�Á0lî>_$GÎQQ¶Í� ÂôN—*»ÃŽWÃÚÑuÔzìhÇÑÎí·Ð+á„ äÙ5Ô\|E¶¿³v?q¡ð®Sœ�c²‹,ÎØ+c%bßʯ­}³�î†G"~šRŸscˆÇÓ"^IKìF4ŽÍÅÍCÑñûKA›`¡¤+¾¿‹£É÷Š¡ïQ#ŸÙt–¼}G畳¹5LJʢŘÊaÓrs“ea’ftnoéNv`/Öô€Û�XsÈ¡vþL wE[9g~l;¶ÿ0¨è1>}r­±ëZk z‚hÞOXSÞ¶“ã¤Ua(ggzùÛ㻈•ip0ñKôpp”}ÀN( ý á¸_ô�ßÉ•_m>Ó†Øo.¬�;zû¤Ë6å:oZŸËºuJ~.Ÿám¶ÐÕÆÉ¢êf ,ÃýÚô)IÓR}ðü·ÿöY²'N¶¡ël¿Ù5#sÛ ÇpéPà¥`¬JÔ’‘‡Kî¥Âˆ7ŸÆà¼s±`Ë^ .„T®â›“WOß-Øw ´Ðqv@È\°ë� ¸O~Ñõ·½ Q·Eü…û\*ÊA_f%fú®¶'½Ö«Km 6 E �ö¥³+íËe9y‘û– ÖØÄ˜p0ºßøÅu`¯€s.ìÄ+Ȉ3‰|‚ñ0&ÞÞæMÏÅs§dXþ‚ó ¸ñâù¥Î+W.ÙO °õü¬» 0o¡{;!˜ôB#þ»ZpßÀ°kLù•ZaŒ9_‚‡cm›0oÇíËeQ>×'=Ût�À¤öò5Fš¾úOXDj|ìß{(`æúô÷�%ø(¥ºwŶH’ÒXR–d¤’ÖÀH¯^Å™ýçNÊÎÖžG7‰L�žjåµlI„t7v>}�ΠÊõ,>60‚C;О¼íì�šïû�TeTHËÂòÂÐRŠ‚c–$Çů\ˆÆ£Tø<»J¸êà †æ€y}d€Â‘—ÒéÝ…ËÆóÞ¼_pN’F¬ šŒ¢ªø`YÙ—ë ¥í’¤6G#ÖÊÓÖH6å¯éàÝÐ\Êß"6È\ß$þ7d*Èpáf‡­ðb„ûØ>Áž·ð¨�bÔ:`¼@ò/Užê…Íd°¸o¹Ö¯—‰·|fzW«˜ÍžjÙìÝ’,5‹óv@æ¬ÞÃIÂÞÿâ×»Þmf¥‡9‹àº«Ýõ§Ûn^Zbí`)ï†9x\xööæ±o:–Ž7r]â<Äd+H7Kñi�Í)ÒÜþcšþ$ÜôBNŸ¨³œ;y*£–$1 †“©&ʱ¨c†MHTH¤l‘g¦/òd1wÓ�o5TŸ?!ýëÉ §Ô£÷Ä`IoUryÐz´��l1{mjŠ’®9–U�êQmÞéÃg÷–¬ªG/P»y!ûÿùÞZ3d:ßWF¨*Žä �,3\Í™õõ‘àEcõÿ9ÚÁÂw¬*Ãþ_VïOÍÙJXMܾñ/VŽtIpù_/ª3v8V™‚òÈp˜¹%v{ bM\­&ʦ~ ?±T)/Åû÷‚)ƒCvKjÝÃ¥jÃLKÔUëóÕÕ»w©kPÔÿ<*}ò endstream endobj 50 0 obj <> endobj 344 0 obj <>stream xœuR[lE�ñÆÎ*1-Xªiñš*®BAÐD¢iHiRYJ%Ò’ÒøI­dýPü(Þ ‰Õx½k­ãºSÇ�ÚÎ:m'iÒV<Ú~!·UAêG…„ˆJøHÅ_ HhÖ#X Áš‘æÎœ{ÏÑ=w hСÁ1pêÃ#õÈ®î…ê>�ú2…ÈØv´:¬GF æ·Gwãs»°¯�<hûú?r'äž ‡¼noks¼jkïêê´÷³!ïˆ3`pòÖï䵋Ïv*8âeùð¶ã>Ÿm¨^ÁÙ†XŽ }ÂŽþ-ïúÏŽólÈ6eC'§Å^nL«÷øXŽc?wú¼—7àåì�õ³>Àº5ö`€ó99 è¨Û;° nÀ Á‹0g­u tà (Ã#ð†®S7¯ûÎô'õ¶ à‰ Üªî¥ªïã si--�£S{dˆŒ#ž_D%f'O.«þˆ©JÄ3fìÆîb1•A9‹"„X"‹Y‰»¾°[,N§dd$Iˆ¥ùƒÝÄS‡D1Gq‹P�”\&U,Z±«NDÜE1›Ì"‹R((¹dF,jªºzÁçeõ%MU\£ðg˜7¯„ׇ¯…WÂ)t Ñó³—çæ£Y)͈®Ht÷pëúžBZÉ¢«t6yÍc%ö¶9üZêÊù¥ ²„Qdj&BK�säub~"äã(¡½FÏMM*ñB‚Á­'Ik¿”âhÒO…¾°bûÓ)rH?ݘ�óü2ZEéÅäzÇ r¬‚»ÊêæÂŽwÃUhžÍæ³H¡ëf$’(.Zk?’[YŽ£¨E Ó…iõ1¹µG‘S(�èz£%)#e˜Ú=¼ W?­-þŸû D ÝQ›ïÀ¯®o¯Sêm¼j>±qù—¿¬�¸—Á=ÿÂ�È~DLÏ"ØN›ÈXyû9mðmê Uí¨¾eÎÍj®ÍÐÅØlDHÈ‚l­ÿPå¨6Ãó1-)霒³š¸åjOÙ@v_j¬4m5WæŒFþ†LÉ endstream endobj 9 0 obj <> endobj 345 0 obj <>stream xœ�V TWž18‘jíéx°Ò µ®V×¾­m·Šºb�y(QPC€„÷+y'¨‘´Q{ jŽt"‘7:HÕ…—•ÔíªRZ2û€>KÕìƒ&3”éªÙ!‚ŸÁÔ«î°¶ÑeNƒUõ·xãDj¯Ç²Ûü9ÙÆˆx%?Ÿ1WC˜é¦È—¨©PC®J¯{§êÖÓFJw"òþ®ï’/×J�N¥òÒ µÔT\¦cÑæ¡ÅEz�^;¥ .{G(Ä�ªFcÑ™ œh]‘¾ ¨b�©”­,8k¨ô<œ@žÖ½´€ÛÏGÀÍ{ � ôòñztƒùçήßMÛñ‡”|‰ñ$u¨¸.RK) 41ì�‡Xa/h—¡:lÕ­,Jß½ÐuºÏ¦ “àâxKN×è« OÈû_šèÖ ²ÝU7â$öÒC5m2Ø´¥Ðj%Ù¹á‘+€~}tÓüåã+M9‰ml•¦ ÊÁe•\y™ÕÖf¨,.϶nw&ÚÖ�gÍ[‹ýñëwÞF¿oú€k¹Æ¨å8° hÈ›r>CW>#›ùy"þ-þÆV]f†:úhdKð *_ Ñ1‡ éÐÍ28ĶSX�?Ôæt�3EÖ õt�ªn…öŽH’n1€”�ºÔ+ ¸7@6 Å»�Ô"5ƒ–¯¼ƒ—á•o-ÄKð²;«‘ò»;€–Kp)^È`¾þâs¸÷/DÀ¢7߀¾¬›kÍ€P É.JP(š"âK_b†Ž¡¢µùJgŠwtK- Ð�€C¶EEÛŽvWõt³15Ú–Q~±Ïç dCaRfZŽÊPô øöúux€<ÞoÒf8…õD/¥ ½|ÅA~ƒ&ò$š(BýƒÓ˜Œ#‰.aÏièCwC›ÜUy''F†6È‚¦ÜyúP<¼Å÷‡œF±çÔ„ú{¾õ{òš)|nðU¦Ì*¨×•F.¹RV»­f‰ÂŠÇâ©8Û‘¡¼[]¶Ö+lÓpÇ JwÚXc´ r€RÁYùš¹2g±ðÑš„¦?¨Aþ(ò/Ý*E7[!hÙ `6™jGt‹·4 ¥.}]È :ƒ¤�Ìqé9¨)…œ<h3Ü’«`Ûól±ÉnÔgž‘1ÏyØm‡»�~ÌaÏ�rÀ/ⱪ,ke›^/Èo�K[O†»7÷ òqI�AQH$âýQÓ¸�;Ž˜Mwð,¼ø ?</¸ùuœ7¾Ê:íT�Eÿ¾ÑZÚlä ‡�j´�a›Šã�…‚{ú�hî cºä¸~¾€Úͦ7]«û’@þäA'(™ŸÌôQUmÐÖ¦€6 ‘Ô~8rå�£p·Cb)r±CWƒ­ŽíÃ^#kIªÈ€\ ßÆ^Ùx6»Rœ¡…¢œ,þÆ ¾ý©QUË]á÷è¡@¤°Ò”ÍÀÿv^.ßÕì§{Űd%¯Öb"\b¼â„øga´ß‹#Ð8Dö  Md7z™‹Pø·Œò ¯ª´<»öƒ…+ã*zS/BÐGÑ"@+.¨[ íl=´B—¦Ü`1˜€¶š+,庽[ºʲ ¤Ѫðæ­å»€–áE€WÈíÒŽ86%¢@»+âRrK¶fÁ;�P»õrÒùÔkÆ^ /¢`@ÓÐü à©l)òdÖê;Î�3u~ò‰):$Dµ–=‹3™›Góë1ñr_ø¤·]ÔìoveØ×Ÿ’í? ÿñ¾èú[³êämÊ ™5Ä&·B'ÝuØÚy­-M½_bÓþ*½ê¶ÔhÊåöx.èø%À¯ns&6¥³­ñ�Åç5ïëNÂN:<ª8jgpu¸DgÖ›J@ †Bc‰!¯ Hø›õgg<—Ýõ@ŸB/”£×ØŸe·+O~ß3#Ö%çIŒ¨‰I—gìþ[òÛepAÝH}Gˆ�éÈ�XŸ‰>c.×>ì¦�¤8vHpñ³ÅûFŠ×!‘-ÇGjÒíà„))G=d‡–¢¤F“ňnˆÌ Å]LWÎv1=0€Dò+4Y„’ÅßûIñ o¹‘$¸[®kbE·AëÀÔŒ¶]WƒºÓ’zó…=𘠖’�ÃPQ(HÃh,)Ñ¥¨e@§çÖ_Ö#ž˜\ì-q|�^ÖýãÁw˜øœ9!Ž·å·KNS}ÐÐ+\ÛÙ.ÜÁüœEüŸ_8hŒÜ‡P#’oü§Pj*D“D¨‘ßȨÍá<}ûvYKÿÉüí'$u¹œ±|$Æjïz�¦ÕÈ¥U¯i 4‡½ÏÏÀ›Ö´G¼—ÉžÚÚ«½‘ÕŸïÔ93mÚ† ˆ¦ç.ÑÇ-[Ýr\*)¨2aR:½>7w±·¡H=dü 0®eœ5ì2pöƒkh>òXþåÌÆÑùs‰÷þ¹Xøyn`ò‘á£(ƒÖ—Ôœ‘ ñÈ+7æv±ï…Äš>…Û½’T·T~J� ¦‘Qó­0 PÑèL {V§žòu?ÕM>¹wðÑ œ_Íè¸ ú¼­ê·vâ¹AKÑïgqc„�c*ÈSæîÄ«”xÜJÔæ­mÑØ#�ΤvCè“zÑ»:b?ìúÕ ÖZû‘Æ[m‚SNsœwEÐ1¼°:Ü®0ï> ôŸ¨n°UÙZèQ ¸¶í¾ŸFñ3Û~šmNa<º*¤ÿd´ÒE_ú˜A ñN.-M^/É(ÔéAÅ›¹"®Ä¬³æ7 ¿îã'� Ǻ¸@V)VâZž¹¶ÕW-×m÷²™Ï�‰}~dæÍ½,¥­ãà$Â(�l¶úµáÖ½é¾Dƒ½#^_ �ä|·Ô$ƒÝ ƒq ªÌøâ\úÿžÞ¾¾Ôq¢Ïž±Ååþßøê™§³÷±w„\\g�ôÔ ¢Œu æ>@A8p…4B[Ț˜ꪃ�=@?‚ùo¯‚9ØC–¶¯FãÒ•p8G¡dê! ež¦–RŠûOP;78±½žÂ‘UâžÈg¼ÄÓc™Ãkò±{=ÇyM ˆÿB6D• endstream endobj 43 0 obj <> endobj 346 0 obj <>stream xœ]SiTSg}�Éãöqy‰K´V¥ªb[¬ UÑ ‚ð"¬ƒEÙ¡ aU£¢b5"*ŠÔí(­â®Uë©Ë±nÕNâgµ�£þhÏüùæÜóÍܹw†¦lm(š¦íüæMî~¸XÒ–A6–Á �µÐšm2d¶;Ù½qÄ`œÚÝûR MÏø*ØO•�š½\)(ÜüF(<¦L™¤˜™¯”‘qa‚˜Ä*UÑ‘BêÅ´ØXżîIŠy‘I‘‰êÈeÝ�ýTq ÉBd¢"@µ,21ž¢¨Þn#F�óøb|Æ„O2™¢zPö”Œr )žêGeRQ5•r¢¼(gª�8%¥B©ƒ´=­¥»lØØ\dB˜f¦Ëv…m¾�Ó[:|$Õû-]5�":ë@=ýü ƒ·‰ŽÛT%yù¥r2¹hœ 8°{âÀCæ²Òü|ØÈn\_¸&-xavO…Šø‘4ŠýOYÌëžDÓP€ö‹î�»ž ìšÜµëÖƒ¶$SŽ â¼�| d �=¤'´0$##/Ö±ëtk‹*ZmÞÄãT4 ? L¬ÎxFQà xÊŒ§õ´e€™±øc ‡$eÕ`4&ƒFN`‹¤ ª’5ú#JùÎZ£i›`\‘ Záþ,%è|ÿÞ“›³.}R-¿ÚÐq®±×<Ú‡)<çzGÕ¦ÕmÕW76­(KÎç÷½¬«¶îRÎðéñaš4y\¬ �½~U^Nd°šÍPÉð�L–PÑÔó oÈéa“ZÜkÍžœaƒ;&‹†fyñBŒä–n´‹±n‰† R¯Üâ&ùÍ—¦!R‹÷ÚŽJÅ«r.^•ù•ÂLc_3ƒ5ⵚ]^)žš‰ë›té‡ñ-Î ×ïí©£÷=‚ òø7 /ì<±¥õPó)Ѓ9ר Õ®�†,6θº¦ª±x×Ï¡=ˆœ !ýI,©AGÿG-‡KÚÏïÙ½}/ÜaÑÉíaü–†,xäÈEn>Ä4¥7ûµç`û¸­ërë–•ÊyC„ÂB1–¤,_¢L]Ò½áÿ§íeÍæˆkÈÓ7 —t•| mµ)·ãñVoá?ܱús­p…}8²mÌ�‰¾££J£kãùJu�öä2Ò7(ÁYbƒÌ7HcŸÇ7_žŠÞ›Vɯ®ÈËŸØÆ’±¸øÊ¤FØÁžêÜóë•Óó§Ï ]4'ž÷à ´(™^™U‘}x|Ëzy.ž2ÞûÄ�‹Ç::·ñ½Õ«·�Ô•£ªHBŠ¥&ûK=y{ÛIzY�†�2Ù¥ Y/Šú Ëä¹ endstream endobj 363 0 obj <>stream GPL Ghostscript 8.54 PDF Writer V999-07.dvi endstream endobj 2 0 obj <>endobj xref 0 364 0000000000 65535 f 0000322328 00000 n 0000408826 00000 n 0000321833 00000 n 0000312040 00000 n 0000000015 00000 n 0000014088 00000 n 0000322394 00000 n 0000339037 00000 n 0000402603 00000 n 0000337695 00000 n 0000396134 00000 n 0000322435 00000 n 0000322465 00000 n 0000312208 00000 n 0000014109 00000 n 0000032095 00000 n 0000336405 00000 n 0000381836 00000 n 0000335876 00000 n 0000376535 00000 n 0000335326 00000 n 0000374124 00000 n 0000322506 00000 n 0000322536 00000 n 0000312378 00000 n 0000032117 00000 n 0000037616 00000 n 0000334505 00000 n 0000369035 00000 n 0000333793 00000 n 0000361284 00000 n 0000333076 00000 n 0000352058 00000 n 0000332522 00000 n 0000347116 00000 n 0000331748 00000 n 0000344203 00000 n 0000330933 00000 n 0000342163 00000 n 0000330119 00000 n 0000339834 00000 n 0000339401 00000 n 0000405643 00000 n 0000322610 00000 n 0000322640 00000 n 0000312548 00000 n 0000037637 00000 n 0000042374 00000 n 0000338594 00000 n 0000401343 00000 n 0000322760 00000 n 0000322790 00000 n 0000312710 00000 n 0000042395 00000 n 0000048026 00000 n 0000322910 00000 n 0000322940 00000 n 0000312880 00000 n 0000048047 00000 n 0000055666 00000 n 0000323016 00000 n 0000323046 00000 n 0000313050 00000 n 0000055687 00000 n 0000062299 00000 n 0000323166 00000 n 0000323196 00000 n 0000313220 00000 n 0000062320 00000 n 0000069518 00000 n 0000323316 00000 n 0000323346 00000 n 0000313390 00000 n 0000069539 00000 n 0000075420 00000 n 0000323466 00000 n 0000323496 00000 n 0000313560 00000 n 0000075441 00000 n 0000082253 00000 n 0000323605 00000 n 0000323635 00000 n 0000313722 00000 n 0000082274 00000 n 0000088446 00000 n 0000323733 00000 n 0000323763 00000 n 0000313892 00000 n 0000088467 00000 n 0000094988 00000 n 0000323883 00000 n 0000323913 00000 n 0000314062 00000 n 0000095009 00000 n 0000102962 00000 n 0000324000 00000 n 0000324030 00000 n 0000314232 00000 n 0000102983 00000 n 0000111110 00000 n 0000324139 00000 n 0000324170 00000 n 0000314404 00000 n 0000111132 00000 n 0000117454 00000 n 0000324291 00000 n 0000324322 00000 n 0000314578 00000 n 0000117476 00000 n 0000124004 00000 n 0000324432 00000 n 0000324463 00000 n 0000314744 00000 n 0000124026 00000 n 0000131517 00000 n 0000324595 00000 n 0000324626 00000 n 0000314918 00000 n 0000131539 00000 n 0000139517 00000 n 0000324758 00000 n 0000324789 00000 n 0000315084 00000 n 0000139539 00000 n 0000146493 00000 n 0000324910 00000 n 0000324941 00000 n 0000315258 00000 n 0000146515 00000 n 0000153756 00000 n 0000325073 00000 n 0000325104 00000 n 0000315432 00000 n 0000153778 00000 n 0000159246 00000 n 0000325236 00000 n 0000325267 00000 n 0000315606 00000 n 0000159268 00000 n 0000165036 00000 n 0000325399 00000 n 0000325430 00000 n 0000315780 00000 n 0000165058 00000 n 0000172573 00000 n 0000325562 00000 n 0000325593 00000 n 0000315954 00000 n 0000172595 00000 n 0000177829 00000 n 0000325714 00000 n 0000325745 00000 n 0000316128 00000 n 0000177851 00000 n 0000185158 00000 n 0000325866 00000 n 0000325897 00000 n 0000316302 00000 n 0000185180 00000 n 0000193139 00000 n 0000337540 00000 n 0000395506 00000 n 0000326018 00000 n 0000326049 00000 n 0000316476 00000 n 0000193161 00000 n 0000199601 00000 n 0000326172 00000 n 0000326203 00000 n 0000316650 00000 n 0000199623 00000 n 0000205678 00000 n 0000326324 00000 n 0000326355 00000 n 0000316816 00000 n 0000205700 00000 n 0000210572 00000 n 0000337106 00000 n 0000390348 00000 n 0000335501 00000 n 0000375222 00000 n 0000326432 00000 n 0000326463 00000 n 0000316990 00000 n 0000210594 00000 n 0000213675 00000 n 0000326555 00000 n 0000326586 00000 n 0000317165 00000 n 0000213697 00000 n 0000218293 00000 n 0000326678 00000 n 0000326709 00000 n 0000317339 00000 n 0000218315 00000 n 0000222775 00000 n 0000326801 00000 n 0000326832 00000 n 0000317513 00000 n 0000222797 00000 n 0000226625 00000 n 0000326924 00000 n 0000326955 00000 n 0000317688 00000 n 0000226647 00000 n 0000230447 00000 n 0000327047 00000 n 0000327078 00000 n 0000317863 00000 n 0000230469 00000 n 0000234424 00000 n 0000335046 00000 n 0000372867 00000 n 0000327170 00000 n 0000327201 00000 n 0000318037 00000 n 0000234446 00000 n 0000238683 00000 n 0000327293 00000 n 0000327324 00000 n 0000318211 00000 n 0000238705 00000 n 0000242706 00000 n 0000327392 00000 n 0000327423 00000 n 0000318385 00000 n 0000242728 00000 n 0000246380 00000 n 0000327515 00000 n 0000327546 00000 n 0000318559 00000 n 0000246402 00000 n 0000250337 00000 n 0000327603 00000 n 0000327634 00000 n 0000318725 00000 n 0000250359 00000 n 0000255014 00000 n 0000331170 00000 n 0000343696 00000 n 0000327704 00000 n 0000327735 00000 n 0000318899 00000 n 0000255036 00000 n 0000259767 00000 n 0000327862 00000 n 0000327893 00000 n 0000319073 00000 n 0000259789 00000 n 0000263200 00000 n 0000327996 00000 n 0000328027 00000 n 0000319247 00000 n 0000263222 00000 n 0000266371 00000 n 0000328119 00000 n 0000328150 00000 n 0000319421 00000 n 0000266393 00000 n 0000269584 00000 n 0000328242 00000 n 0000328273 00000 n 0000319595 00000 n 0000269606 00000 n 0000273063 00000 n 0000328365 00000 n 0000328396 00000 n 0000319769 00000 n 0000273085 00000 n 0000276639 00000 n 0000328488 00000 n 0000328519 00000 n 0000319943 00000 n 0000276661 00000 n 0000279853 00000 n 0000328611 00000 n 0000328642 00000 n 0000320117 00000 n 0000279875 00000 n 0000283090 00000 n 0000328734 00000 n 0000328765 00000 n 0000320291 00000 n 0000283112 00000 n 0000285241 00000 n 0000328857 00000 n 0000328888 00000 n 0000320465 00000 n 0000285263 00000 n 0000288472 00000 n 0000328980 00000 n 0000329011 00000 n 0000320639 00000 n 0000288494 00000 n 0000291781 00000 n 0000329103 00000 n 0000329134 00000 n 0000320813 00000 n 0000291803 00000 n 0000295446 00000 n 0000329226 00000 n 0000329257 00000 n 0000320987 00000 n 0000295468 00000 n 0000297821 00000 n 0000329349 00000 n 0000329380 00000 n 0000321161 00000 n 0000297843 00000 n 0000300237 00000 n 0000329472 00000 n 0000329503 00000 n 0000321335 00000 n 0000300259 00000 n 0000304700 00000 n 0000329595 00000 n 0000329626 00000 n 0000321501 00000 n 0000304722 00000 n 0000309813 00000 n 0000329705 00000 n 0000329736 00000 n 0000321667 00000 n 0000309835 00000 n 0000312018 00000 n 0000329780 00000 n 0000329811 00000 n 0000340329 00000 n 0000342385 00000 n 0000343889 00000 n 0000344616 00000 n 0000347425 00000 n 0000352486 00000 n 0000361793 00000 n 0000369369 00000 n 0000373093 00000 n 0000374353 00000 n 0000375460 00000 n 0000376943 00000 n 0000382349 00000 n 0000390768 00000 n 0000395713 00000 n 0000396573 00000 n 0000401605 00000 n 0000402876 00000 n 0000405949 00000 n 0000329855 00000 n 0000330552 00000 n 0000331316 00000 n 0000331403 00000 n 0000332186 00000 n 0000332954 00000 n 0000333574 00000 n 0000334344 00000 n 0000334961 00000 n 0000335787 00000 n 0000336312 00000 n 0000336956 00000 n 0000338199 00000 n 0000338329 00000 n 0000338876 00000 n 0000339745 00000 n 0000407502 00000 n trailer << /Size 364 /Root 1 0 R /Info 2 0 R /ID [<2275F163D31ACCC3B4E288CA3BBECF50><2275F163D31ACCC3B4E288CA3BBECF50>] >> startxref 409018 %%EOF stevengj-nlopt-88c424d/src/algs/mlsl/000077500000000000000000000000001521061417600175225ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/mlsl/README000066400000000000000000000016631521061417600204100ustar00rootroot00000000000000This is my implementation of the "Multi-Level Single-Linkage" (MLSL) algorithm for global optimization by random local optimizations (a multistart algorithm with "clustering" to avoid repeated detection of the same local minimum), modified to optionally use a Sobol' low-discrepancy sequence (LDS) instead of pseudorandom numbers. See: A. H. G. Rinnooy Kan and G. T. Timmer, "Stochastic global optimization methods," Mathematical Programming, vol. 39, p. 27-78 (1987). [ actually 2 papers -- part I: clustering methods (p. 27), then part II: multilevel methods (p. 57) ] and also: Sergei Kucherenko and Yury Sytsko, "Application of deterministic low-discrepancy sequences in global optimization," Computational Optimization and Applications, vol. 30, p. 297-318 (2005). It is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson September 2007 stevengj-nlopt-88c424d/src/algs/mlsl/mlsl.c000066400000000000000000000355341521061417600206470ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Multi-Level Single-Linkage (MLSL) algorithm for global optimization by random local optimizations (a multistart algorithm with "clustering" to avoid repeated detection of the same local minimum), modified to optionally use a Sobol' low-discrepancy sequence (LDS) instead of pseudorandom numbers. See: A. H. G. Rinnooy Kan and G. T. Timmer, "Stochastic global optimization methods," Mathematical Programming, vol. 39, p. 27-78 (1987). [ actually 2 papers -- part I: clustering methods (p. 27), then part II: multilevel methods (p. 57) ] and also: Sergei Kucherenko and Yury Sytsko, "Application of deterministic low-discrepancy sequences in global optimization," Computational Optimization and Applications, vol. 30, p. 297-318 (2005). Compared to the above papers, I made a couple other modifications to the algorithm besides the use of a LDS. 1) first, the original algorithm suggests discarding points within a *fixed* distance of the boundaries or of previous local minima; I changed this to a distance that decreases with, iteration, proportional to the same threshold radius used for clustering. (In the case of the boundaries, I make the proportionality constant rather small as well.) 2) Kan and Timmer suggest using fancy "spiral-search" algorithms to quickly locate nearest-neighbor points, reducing the overall time for N sample points from O(N^2) to O(N log N) However, recent papers seem to show that such schemes (kd trees, etcetera) become inefficient for high-dimensional spaces (d > 20), and finding a better approach seems to be an open question. Therefore, since I am mainly interested in MLSL for high-dimensional problems (in low dimensions we have DIRECT etc.), I punted on this question for now. In practice, O(N^2) (which does not count the #points evaluated in local searches) does not seem too bad if the objective function is expensive. */ #include #include #include #include "redblack.h" #include "mlsl.h" /* data structure for each random/quasirandom point in the population */ typedef struct { double f; /* function value at x */ int minimized; /* if we have already minimized starting from x */ double closest_pt_d; /* distance^2 to closest pt with smaller f */ double closest_lm_d; /* distance^2 to closest lm with smaller f*/ double x[1]; /* array of length n (K&R struct hack) */ } pt; /* all of the data used by the various mlsl routines...it's not clear in hindsight that we need to put all of this in a data structure since most of the work occurs in a single routine, but it doesn't hurt us */ typedef struct { int n; /* # dimensions */ const double *lb, *ub; nlopt_stopping *stop; /* stopping criteria */ nlopt_func f; void *f_data; rb_tree pts; /* tree of points (k == pt), sorted by f */ rb_tree lms; /* tree of local minimizers, sorted by function value (k = array of length d+1, [0] = f, [1..d] = x) */ nlopt_sobol s; /* sobol data for LDS point generation, or NULL to use pseudo-random numbers */ double R_prefactor, dlm, dbound, gamma; /* parameters of MLSL */ int N; /* number of pts to add per iteration */ } mlsl_data; /* comparison routines to sort the red-black trees by function value */ static int pt_compare(rb_key p1_, rb_key p2_) { pt *p1 = (pt *) p1_; pt *p2 = (pt *) p2_; if (p1->f < p2->f) return -1; if (p1->f > p2->f) return +1; return 0; } static int lm_compare(double *k1, double *k2) { if (*k1 < *k2) return -1; if (*k1 > *k2) return +1; return 0; } /* Euclidean distance |x1 - x2|^2 */ static double distance2(int n, const double *x1, const double *x2) { int i; double d = 0.; for (i = 0; i < n; ++i) { double dx = x1[i] - x2[i]; d += dx * dx; } return d; } /* find the closest pt to p with a smaller function value; this function is called when p is first added to our tree */ static void find_closest_pt(int n, rb_tree *pts, pt *p) { rb_node *node = nlopt_rb_tree_find_lt(pts, (rb_key) p); double closest_d = HUGE_VAL; while (node) { double d = distance2(n, p->x, ((pt *) node->k)->x); if (d < closest_d) closest_d = d; node = nlopt_rb_tree_pred(node); } p->closest_pt_d = closest_d; } /* find the closest local minimizer (lm) to p with a smaller function value; this function is called when p is first added to our tree */ static void find_closest_lm(int n, rb_tree *lms, pt *p) { rb_node *node = nlopt_rb_tree_find_lt(lms, &p->f); double closest_d = HUGE_VAL; while (node) { double d = distance2(n, p->x, node->k+1); if (d < closest_d) closest_d = d; node = nlopt_rb_tree_pred(node); } p->closest_lm_d = closest_d; } /* given newpt, which presumably has just been added to our tree, update all pts with a greater function value in case newpt is closer to them than their previous closest_pt ... we can ignore already-minimized points since we never do local minimization from the same point twice */ static void pts_update_newpt(int n, rb_tree *pts, pt *newpt) { rb_node *node = nlopt_rb_tree_find_gt(pts, (rb_key) newpt); while (node) { pt *p = (pt *) node->k; if (!p->minimized) { double d = distance2(n, newpt->x, p->x); if (d < p->closest_pt_d) p->closest_pt_d = d; } node = nlopt_rb_tree_succ(node); } } /* given newlm, which presumably has just been added to our tree, update all pts with a greater function value in case newlm is closer to them than their previous closest_lm ... we can ignore already-minimized points since we never do local minimization from the same point twice */ static void pts_update_newlm(int n, rb_tree *pts, double *newlm) { pt tmp_pt; rb_node *node; tmp_pt.f = newlm[0]; node = nlopt_rb_tree_find_gt(pts, (rb_key) &tmp_pt); while (node) { pt *p = (pt *) node->k; if (!p->minimized) { double d = distance2(n, newlm+1, p->x); if (d < p->closest_lm_d) p->closest_lm_d = d; } node = nlopt_rb_tree_succ(node); } } static int is_potential_minimizer(mlsl_data *mlsl, pt *p, double dpt_min, double dlm_min, double dbound_min) { int i, n = mlsl->n; const double *lb = mlsl->lb; const double *ub = mlsl->ub; const double *x = p->x; if (p->minimized) return 0; if (p->closest_pt_d <= dpt_min*dpt_min) return 0; if (p->closest_lm_d <= dlm_min*dlm_min) return 0; for (i = 0; i < n; ++i) if ((x[i] - lb[i] <= dbound_min || ub[i] - x[i] <= dbound_min) && ub[i] - lb[i] > dbound_min) return 0; return 1; } #define K2PI (6.2831853071795864769252867665590057683943388) /* compute Gamma(1 + n/2)^{1/n} ... this is a constant factor used in MLSL as part of the minimum-distance cutoff*/ static double gam(int n) { /* use Stirling's approximation: Gamma(1 + z) ~ sqrt(2*pi*z) * z^z / exp(z) ... this is more than accurate enough for our purposes (error in gam < 15% for d=1, < 4% for d=2, < 2% for d=3, ...) and avoids overflow problems because we can combine it with the ^{1/n} exponent */ double z = n/2; return sqrt(pow(K2PI * z, 1.0/n) * z) * exp(-0.5); } static pt *alloc_pt(int n) { pt *p = (pt *) malloc(sizeof(pt) + (n-1) * sizeof(double)); if (p) { p->minimized = 0; p->closest_pt_d = HUGE_VAL; p->closest_lm_d = HUGE_VAL; } return p; } /* wrapper around objective function that increments evaluation count */ static double fcount(unsigned n, const double *x, double *grad, void *p_) { mlsl_data *p = (mlsl_data *) p_; ++ *(p->stop->nevals_p); return p->f(n, x, grad, p->f_data); } static void get_minf(mlsl_data *d, double *minf, double *x) { rb_node *node = nlopt_rb_tree_min(&d->pts); if (node) { *minf = ((pt *) node->k)->f; memcpy(x, ((pt *) node->k)->x, sizeof(double) * d->n); } node = nlopt_rb_tree_min(&d->lms); if (node && node->k[0] < *minf) { *minf = node->k[0]; memcpy(x, node->k + 1, sizeof(double) * d->n); } } #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MLSL_SIGMA 2. /* MLSL sigma parameter, using value from the papers */ #define MLSL_GAMMA 0.3 /* MLSL gamma parameter (FIXME: what should it be?) */ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt local_opt, int Nsamples, /* #samples/iteration (0=default) */ int lds) /* random or low-discrepancy seq. (lds) */ { nlopt_result ret = NLOPT_SUCCESS; mlsl_data d; int i; pt *p; if (!Nsamples) d.N = 4; /* FIXME: what is good number of samples per iteration? */ else d.N = Nsamples; if (d.N < 1) { nlopt_stop_msg(stop, "population %d is too small", d.N); return NLOPT_INVALID_ARGS; } d.n = n; d.lb = lb; d.ub = ub; d.stop = stop; d.f = f; d.f_data = f_data; nlopt_rb_tree_init(&d.pts, pt_compare); nlopt_rb_tree_init(&d.lms, lm_compare); d.s = lds ? nlopt_sobol_create((unsigned) n) : NULL; nlopt_set_min_objective(local_opt, fcount, &d); nlopt_set_lower_bounds(local_opt, lb); nlopt_set_upper_bounds(local_opt, ub); nlopt_set_stopval(local_opt, stop->minf_max); d.gamma = MLSL_GAMMA; d.R_prefactor = sqrt(2./K2PI) * pow(gam(n) * MLSL_SIGMA, 1.0/n); for (i = 0; i < n; ++i) d.R_prefactor *= pow(ub[i] - lb[i], 1.0/n); /* MLSL also suggests setting some minimum distance from points to previous local minimiza and to the boundaries; I don't know how to choose this as a fixed number, so I set it proportional to R; see also the comments at top. dlm and dbound are the proportionality constants. */ d.dlm = 1.0; /* min distance/R to local minima (FIXME: good value?) */ d.dbound = 1e-6; /* min distance/R to ub/lb boundaries (good value?) */ p = alloc_pt(n); if (!p) { ret = NLOPT_OUT_OF_MEMORY; goto done; } /* FIXME: how many sobol points to skip, if any? */ nlopt_sobol_skip(d.s, (unsigned) (10*n+d.N), p->x); memcpy(p->x, x, n * sizeof(double)); p->f = f(n, x, NULL, f_data); ++ *(stop->nevals_p); if (!nlopt_rb_tree_insert(&d.pts, (rb_key) p)) { free(p); ret = NLOPT_OUT_OF_MEMORY; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (p->f < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; while (ret == NLOPT_SUCCESS) { rb_node *node; double R; get_minf(&d, minf, x); /* sampling phase: add random/quasi-random points */ for (i = 0; i < d.N && ret == NLOPT_SUCCESS; ++i) { p = alloc_pt(n); if (!p) { ret = NLOPT_OUT_OF_MEMORY; goto done; } if (d.s) nlopt_sobol_next(d.s, p->x, lb, ub); else { /* use random points instead of LDS */ int j; for (j = 0; j < n; ++j) p->x[j] = nlopt_urand(lb[j],ub[j]); } p->f = f(n, p->x, NULL, f_data); ++ *(stop->nevals_p); if (!nlopt_rb_tree_insert(&d.pts, (rb_key) p)) { free(p); ret = NLOPT_OUT_OF_MEMORY; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (p->f < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else { find_closest_pt(n, &d.pts, p); find_closest_lm(n, &d.lms, p); pts_update_newpt(n, &d.pts, p); } } /* distance threshold parameter R in MLSL */ R = d.R_prefactor * pow(log((double) d.pts.N) / d.pts.N, 1.0 / n); /* local search phase: do local opt. for promising points */ node = nlopt_rb_tree_min(&d.pts); for (i = (int) (ceil(d.gamma * d.pts.N) + 0.5); node && i > 0 && ret == NLOPT_SUCCESS; --i) { p = (pt *) node->k; if (is_potential_minimizer(&d, p, R, d.dlm*R, d.dbound*R)) { nlopt_result lret; double *lm; double t = nlopt_seconds(); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; break; } if (nlopt_stop_evals(stop)) { ret = NLOPT_MAXEVAL_REACHED; break; } if (stop->maxtime > 0 && t - stop->start >= stop->maxtime) { ret = NLOPT_MAXTIME_REACHED; break; } lm = (double *) malloc(sizeof(double) * (n+1)); if (!lm) { ret = NLOPT_OUT_OF_MEMORY; goto done; } memcpy(lm+1, p->x, sizeof(double) * n); lret = nlopt_optimize_limited(local_opt, lm+1, lm, stop->maxeval - *(stop->nevals_p), stop->maxtime - (t - stop->start)); p->minimized = 1; if (lret < 0) { free(lm); ret = lret; goto done; } if (!nlopt_rb_tree_insert(&d.lms, lm)) { free(lm); ret = NLOPT_OUT_OF_MEMORY; } else if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (*lm < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else pts_update_newlm(n, &d.pts, lm); } /* TODO: additional stopping criteria based e.g. on improvement in function values, etc? */ node = nlopt_rb_tree_succ(node); } } get_minf(&d, minf, x); done: nlopt_sobol_destroy(d.s); nlopt_rb_tree_destroy_with_keys(&d.lms); nlopt_rb_tree_destroy_with_keys(&d.pts); return ret; } stevengj-nlopt-88c424d/src/algs/mlsl/mlsl.h000066400000000000000000000032721521061417600206460ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef MLSL_H #define MLSL_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt local_opt, int Nsamples, /* #samples/iteration (0=default) */ int lds); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/mma/000077500000000000000000000000001521061417600173255ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/mma/README000066400000000000000000000032171521061417600202100ustar00rootroot00000000000000Implementation of the globally-convergent method-of-moving-asymptotes (MMA) algorithm for gradient-based local optimization, as described in: Krister Svanberg, "A class of globally convergent optimization methods based on conservative convex separable approximations," SIAM J. Optim. 12 (2), p. 555-573 (2002). In fact, this algorithm is much more general than most of the other algorithms in NLopt, in that it handles an arbitrary set of nonlinear (differentiable) constraints as well, in a very efficient manner. I've implemented the full nonlinear-constrained MMA algorithm, and it is exported under the nlopt_minimize_constrained API. I also implemented another CCSA algorithm from the same paper: instead of constructing local MMA approximations, it constructs simple quadratic approximations (or rather, affine approximations plus a quadratic penalty term to stay conservative). This is the ccsa_quadratic code. It seems to have similar convergence rates to MMA for most problems, which is not surprising as they are both essentially similar. However, for the quadratic variant I implemented the possibility of preconditioning: including a user-supplied Hessian approximation in the local model. It is easy to incorporate this into the proof in Svanberg's paper, and to show that global convergence is still guaranteed as long as the user's "Hessian" is positive semidefinite, and it practice it can greatly improve convergence if the preconditioner is a good approximation for (at least for the largest eigenvectors) the real Hessian. It is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson July 2008 - July 2012 stevengj-nlopt-88c424d/src/algs/mma/ccsa_quadratic.c000066400000000000000000000506151521061417600224460ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* In this file we implement Svanberg's CCSA algorithm with the simple linear approximation + quadratic penalty function. We also allow the user to specify an optional "preconditioner": an approximate Hessian (which must be symmetric & positive semidefinite) that can be added into the approximation. [X. Liang and I went through the convergence proof in Svanberg's paper and it does not seem to be modified by such preconditioning, as long as the preconditioner eigenvalues are bounded above for all x.] For the non-preconditioned case the trust-region subproblem is separable and can be solved by a dual method. For the preconditioned case the subproblem is still convex but in general is non-separable so we solve by calling the same algorithm recursively, under the assumption that the subproblem objective is cheap to evaluate. */ #include #include #include #include #include "mma.h" #include "nlopt-util.h" unsigned ccsa_verbose = 0; /* > 0 for verbose output */ #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /* magic minimum value for rho in CCSA ... the 2002 paper says it should be a "fixed, strictly positive `small' number, e.g. 1e-5" ... grrr, I hate these magic numbers, which seem like they should depend on the objective function in some way ... in particular, note that rho is dimensionful (= dimensions of objective function) */ #define CCSA_RHOMIN 1e-5 /***********************************************************************/ /* function for CCSA's dual solution of the approximate problem */ typedef struct { int count; /* evaluation count, incremented each call */ unsigned n; /* must be set on input to dimension of x */ const double *x, *lb, *ub, *sigma, *dfdx; /* arrays of length n */ const double *dfcdx; /* m-by-n array of fc gradients */ double fval, rho; /* must be set on input */ const double *fcval, *rhoc; /* arrays of length m */ double *xcur; /* array of length n, output each time */ double gval, wval, *gcval; /* output each time (array length m) */ nlopt_precond pre; void *pre_data; nlopt_precond *prec; void **prec_data; /* length = # constraints */ double *scratch; /* length = 2*n */ } dual_data; static double sqr(double x) { return x * x; } static double dual_func(unsigned m, const double *y, double *grad, void *d_) { dual_data *d = (dual_data *) d_; unsigned n = d->n; const double *x = d->x, *lb = d->lb, *ub = d->ub, *sigma = d->sigma, *dfdx = d->dfdx; const double *dfcdx = d->dfcdx; double rho = d->rho, fval = d->fval; const double *rhoc = d->rhoc, *fcval = d->fcval; double *xcur = d->xcur; double *gcval = d->gcval; unsigned i, j; double val; d->count++; val = d->gval = fval; d->wval = 0; for (i = 0; i < m; ++i) val += y[i] * (gcval[i] = fcval[i]); for (j = 0; j < n; ++j) { double u, v, dx, sigma2, dx2, dx2sig; /* first, compute xcur[j] = x+dx for y. Because this objective is separable, we can minimize over x analytically, and the minimum dx is given by the solution of a linear equation u dx + v sigma^2 = 0, i.e. dx = -sigma^2 v/u where u and v are defined by the sums below. However, we also have to check that |dx| <= sigma and that lb <= x+dx <= ub. */ if (sigma[j] == 0) { /* special case for lb[i] == ub[i] dims, dx=0 */ xcur[j] = x[j]; continue; } u = rho; v = dfdx[j]; for (i = 0; i < m; ++i) { u += rhoc[i] * y[i]; v += dfcdx[i*n + j] * y[i]; } dx = -(sigma2 = sqr(sigma[j])) * v/u; /* if dx is out of bounds, we are guaranteed by convexity that the minimum is at the bound on the side of dx */ if (fabs(dx) > sigma[j]) dx = copysign(sigma[j], dx); xcur[j] = x[j] + dx; if (xcur[j] > ub[j]) xcur[j] = ub[j]; else if (xcur[j] < lb[j]) xcur[j] = lb[j]; dx = xcur[j] - x[j]; /* function value: */ dx2 = dx * dx; val += v * dx + 0.5 * u * dx2 / sigma2; /* update gval, wval, gcval (approximant functions) */ d->gval += dfdx[j] * dx + rho * (dx2sig = 0.5*dx2/sigma2); d->wval += dx2sig; for (i = 0; i < m; ++i) gcval[i] += dfcdx[i*n+j] * dx + rhoc[i] * dx2sig; } /* gradient is easy to compute: since we are at a minimum x (dval/dx=0), we only need the partial derivative with respect to y, and we negate because we are maximizing: */ if (grad) for (i = 0; i < m; ++i) grad[i] = -gcval[i]; return -val; } /***********************************************************************/ /* compute g(x - x0) and its gradient */ static double gfunc(unsigned n, double f, const double *dfdx, double rho, const double *sigma, const double *x0, nlopt_precond pre, void *pre_data, double *scratch, const double *x, double *grad) { double *dx = scratch, *Hdx = scratch + n; double val = f; unsigned j; for (j = 0; j < n; ++j) { double sigma2inv = 1.0 / sqr(sigma[j]); dx[j] = x[j] - x0[j]; val += dfdx[j] * dx[j] + (0.5*rho) * sqr(dx[j]) * sigma2inv; if (grad) grad[j] = dfdx[j] + rho * dx[j] * sigma2inv; } if (pre) { pre(n, x0, dx, Hdx, pre_data); for (j = 0; j < n; ++j) val += 0.5 * dx[j] * Hdx[j]; if (grad) for (j = 0; j < n; ++j) grad[j] += Hdx[j]; } return val; } static double g0(unsigned n, const double *x, double *grad, void *d_) { dual_data *d = (dual_data *) d_; d->count++; return gfunc(n, d->fval, d->dfdx, d->rho, d->sigma, d->x, d->pre, d->pre_data, d->scratch, x, grad); } static void gi(unsigned m, double *result, unsigned n, const double *x, double *grad, void *d_) { dual_data *d = (dual_data *) d_; unsigned i; for (i = 0; i < m; ++i) result[i] = gfunc(n, d->fcval[i], d->dfcdx + i*n, d->rhoc[i], d->sigma, d->x, d->prec ? d->prec[i] : NULL, d->prec_data ? d->prec_data[i] : NULL, d->scratch, x, grad); } /***********************************************************************/ nlopt_result ccsa_quadratic_minimize( unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, nlopt_precond pre, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init, int inner_gradients, int always_improve, double sigma_min, const double *sigma_init) { nlopt_result ret = NLOPT_SUCCESS; double *xcur, rho, *sigma, *dfdx, *dfdx_cur, *xprev, *xprevprev, fcur; double *dfcdx, *dfcdx_cur; double *fcval, *fcval_cur, *rhoc, *gcval, *y, *dual_lb, *dual_ub; double *pre_lb = NULL, *pre_ub = NULL; unsigned i, ifc, j, k = 0; dual_data dd; int feasible; double infeasibility; unsigned mfc; unsigned no_precond; nlopt_opt pre_opt = NULL; verbose = MAX(ccsa_verbose, verbose); m = nlopt_count_constraints(mfc = m, fc); if (nlopt_get_dimension(dual_opt) != m) { nlopt_stop_msg(stop, "dual optimizer has wrong dimension %d != %d", nlopt_get_dimension(dual_opt), m); return NLOPT_INVALID_ARGS; } sigma = (double *) malloc(sizeof(double) * (6*n + 2*m*n + m*7)); if (!sigma) return NLOPT_OUT_OF_MEMORY; dfdx = sigma + n; dfdx_cur = dfdx + n; xcur = dfdx_cur + n; xprev = xcur + n; xprevprev = xprev + n; fcval = xprevprev + n; fcval_cur = fcval + m; rhoc = fcval_cur + m; gcval = rhoc + m; dual_lb = gcval + m; dual_ub = dual_lb + m; y = dual_ub + m; dfcdx = y + m; dfcdx_cur = dfcdx + m*n; dd.n = n; dd.x = x; dd.lb = lb; dd.ub = ub; dd.sigma = sigma; dd.dfdx = dfdx; dd.dfcdx = dfcdx; dd.fcval = fcval; dd.rhoc = rhoc; dd.xcur = xcur; dd.gcval = gcval; dd.pre = pre; dd.pre_data = f_data; dd.prec = NULL; dd.prec_data = NULL; dd.scratch = NULL; if (m) { dd.prec = (nlopt_precond *) malloc(sizeof(nlopt_precond) * m); dd.prec_data = (void **) malloc(sizeof(void *) * m); if (!dd.prec || !dd.prec_data) { ret = NLOPT_OUT_OF_MEMORY; goto done; } for (i = ifc = 0; ifc < mfc; ++ifc) { unsigned inext = i + fc[ifc].m; for (; i < inext; ++i) { dd.prec[i] = fc[ifc].pre; dd.prec_data[i] = fc[ifc].f_data; } } } no_precond = pre == NULL; if (dd.prec) for (i = 0; i < m; ++i) no_precond = no_precond && dd.prec[i] == NULL; if (!no_precond) { dd.scratch = (double*) malloc(sizeof(double) * (4*n)); if (!dd.scratch) { free(sigma); return NLOPT_OUT_OF_MEMORY; } pre_lb = dd.scratch + 2*n; pre_ub = pre_lb + n; pre_opt = nlopt_create(nlopt_get_algorithm(dual_opt), n); if (!pre_opt) { nlopt_stop_msg(stop, "failure creating precond. optimizer"); ret = NLOPT_FAILURE; goto done; } ret = nlopt_set_min_objective(pre_opt, g0, &dd); if (ret < 0) goto done; ret = nlopt_add_inequality_mconstraint(pre_opt, m, gi, &dd, NULL); if (ret < 0) goto done; ret = nlopt_set_ftol_rel(pre_opt, nlopt_get_ftol_rel(dual_opt)); if (ret < 0) goto done; ret = nlopt_set_ftol_abs(pre_opt, nlopt_get_ftol_abs(dual_opt)); if (ret < 0) goto done; ret = nlopt_set_maxeval(pre_opt, nlopt_get_maxeval(dual_opt)); if (ret < 0) goto done; } for (j = 0; j < n; ++j) { if (sigma_init && sigma_init[j] > 0) sigma[j] = sigma_init[j]; else if (nlopt_isinf(ub[j]) || nlopt_isinf(lb[j])) sigma[j] = 1.0; /* arbitrary default */ else sigma[j] = 0.5 * (ub[j] - lb[j]); sigma[j] = MAX(sigma[j], sigma_min); } rho = rho_init; for (i = 0; i < m; ++i) { rhoc[i] = rho_init; dual_lb[i] = y[i] = 0.0; dual_ub[i] = HUGE_VAL; } dd.fval = fcur = *minf = f(n, x, dfdx, f_data); ++ *(stop->nevals_p); memcpy(xcur, x, sizeof(double) * n); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible = 1; infeasibility = 0; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval + i, dfcdx + i*n, fc + ifc, n, x); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } for (i = 0; i < m; ++i) { feasible = feasible && fcval[i] <= 0; if (fcval[i] > infeasibility) infeasibility = fcval[i]; } /* For non-feasible initial points, set a finite (large) upper-bound on the dual variables. What this means is that, if no feasible solution is found from the dual problem, it will minimize the dual objective with the unfeasible constraint weighted by 1e40 -- basically, minimizing the unfeasible constraint until it becomes feasible or until we at least obtain a step towards a feasible point. Svanberg suggested a different approach in his 1987 paper, basically introducing additional penalty variables for unfeasible constraints, but this is easier to implement and at least as efficient. */ if (!feasible) for (i = 0; i < m; ++i) dual_ub[i] = 1e40; nlopt_set_min_objective(dual_opt, dual_func, &dd); nlopt_set_lower_bounds(dual_opt, dual_lb); nlopt_set_upper_bounds(dual_opt, dual_ub); nlopt_set_stopval(dual_opt, -HUGE_VAL); nlopt_remove_inequality_constraints(dual_opt); nlopt_remove_equality_constraints(dual_opt); while (1) { /* outer iterations */ int inner_nevals = 0; double fprev = fcur; if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; if (++k > 1) memcpy(xprevprev, xprev, sizeof(double) * n); memcpy(xprev, xcur, sizeof(double) * n); while (1) { /* inner iterations */ double min_dual, infeasibility_cur; int feasible_cur, inner_done; unsigned save_verbose; nlopt_result reti; if (no_precond) { /* solve dual problem */ dd.rho = rho; dd.count = 0; save_verbose = ccsa_verbose; ccsa_verbose = 0; /* no recursive verbosity */ reti = nlopt_optimize_limited(dual_opt, y, &min_dual, 0, stop->maxtime - (nlopt_seconds() - stop->start)); ccsa_verbose = save_verbose; if (reti < 0 || reti == NLOPT_MAXTIME_REACHED) { ret = reti; goto done; } dual_func(m, y, NULL, &dd); /* evaluate final xcur etc. */ } else { double pre_min; for (j = 0; j < n; ++j) { pre_lb[j] = MAX(lb[j], x[j] - sigma[j]); pre_ub[j] = MIN(ub[j], x[j] + sigma[j]); xcur[j] = x[j]; } nlopt_set_lower_bounds(pre_opt, pre_lb); nlopt_set_upper_bounds(pre_opt, pre_ub); dd.rho = rho; dd.count = 0; save_verbose = ccsa_verbose; ccsa_verbose = 0; /* no recursive verbosity */ reti = nlopt_optimize_limited(pre_opt, xcur, &pre_min, 0, stop->maxtime - (nlopt_seconds() - stop->start)); ccsa_verbose = save_verbose; if (reti < 0 || reti == NLOPT_MAXTIME_REACHED) { ret = reti; goto done; } /* evaluate final xcur etc */ dd.gval = g0(n, xcur, NULL, &dd); gi(m, dd.gcval, n, xcur, NULL, &dd); } if (verbose) { printf("CCSA dual converged in %d iters to g=%g:\n", dd.count, dd.gval); for (i = 0; i < MIN(verbose, m); ++i) printf(" CCSA y[%u]=%g, gc[%u]=%g\n", i, y[i], i, dd.gcval[i]); } fcur = f(n, xcur, inner_gradients ? dfdx_cur : NULL, f_data); ++ *(stop->nevals_p); ++inner_nevals; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible_cur = 1; infeasibility_cur = 0; inner_done = dd.gval >= fcur; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval_cur + i, inner_gradients ? dfcdx_cur + i*n : NULL, fc + ifc, n, xcur); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } for (i = ifc = 0; ifc < mfc; ++ifc) { unsigned i0 = i, inext = i + fc[ifc].m; for (; i < inext; ++i) { feasible_cur = feasible_cur && fcval_cur[i] <= fc[ifc].tol[i-i0]; inner_done = inner_done && (dd.gcval[i] >= fcval_cur[i]); if (fcval_cur[i] > infeasibility_cur) infeasibility_cur = fcval_cur[i]; } } inner_done = inner_done || (inner_maxeval > 0 && inner_nevals == inner_maxeval); /* update the current point. If always_improve (the default), use an aggressive strategy that always accepts an improvement even if !inner_done, otherwise only update the current point if inner_done (= outer iteration), more like the original Svanberg paper */ if (always_improve ? (fcur < *minf && (inner_done || feasible_cur || !feasible)) || (!feasible && infeasibility_cur < infeasibility) : inner_done) { if (verbose && !feasible_cur) printf("CCSA - using infeasible point?\n"); if (!inner_gradients) { /* evaluate again, this time with gradients */ fcur = f(n, xcur, dfdx_cur, f_data); /* don't update *(stop->nevals_p) -- hope user caches xcur so that they don't actually recompute f */ if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible_cur = 1; infeasibility_cur = 0; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval_cur + i, dfcdx_cur + i*n, fc + ifc, n, xcur); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } /* recompute feasible_cur etc in case the caller has changed the objective function for an outer iteration, but don't change inner_done in that case */ for (i = ifc = 0; ifc < mfc; ++ifc) { unsigned i0 = i, inext = i + fc[ifc].m; for (; i < inext; ++i) { feasible_cur = feasible_cur && fcval_cur[i] <= fc[ifc].tol[i-i0]; if (fcval_cur[i] > infeasibility_cur) infeasibility_cur = fcval_cur[i]; } } } dd.fval = *minf = fcur; infeasibility = infeasibility_cur; memcpy(fcval, fcval_cur, sizeof(double)*m); memcpy(x, xcur, sizeof(double)*n); memcpy(dfdx, dfdx_cur, sizeof(double)*n); memcpy(dfcdx, dfcdx_cur, sizeof(double)*n*m); /* once we have reached a feasible solution, the algorithm should never make the solution infeasible again (if inner_done), although the constraints may be violated slightly by rounding errors etc. so we must be a little careful about checking feasibility */ if (infeasibility_cur == 0) { if (!feasible) { /* reset upper bounds to infin. */ for (i = 0; i < m; ++i) dual_ub[i] = HUGE_VAL; nlopt_set_upper_bounds(dual_opt, dual_ub); } feasible = 1; } } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; if (inner_done) break; if (fcur > dd.gval) rho = MIN(10*rho, 1.1 * (rho + (fcur-dd.gval) / dd.wval)); for (i = 0; i < m; ++i) if (fcval_cur[i] > dd.gcval[i]) rhoc[i] = MIN(10*rhoc[i], 1.1 * (rhoc[i] + (fcval_cur[i]-dd.gcval[i]) / dd.wval)); if (verbose) printf("CCSA inner iteration: rho -> %g\n", rho); for (i = 0; i < MIN(verbose, m); ++i) printf(" CCSA rhoc[%u] -> %g\n", i,rhoc[i]); } if (nlopt_stop_ftol(stop, fcur, fprev)) ret = NLOPT_FTOL_REACHED; if (nlopt_stop_x(stop, xcur, xprev)) ret = NLOPT_XTOL_REACHED; if (ret != NLOPT_SUCCESS) goto done; /* update rho and sigma for iteration k+1 */ rho = MAX(0.1 * rho, CCSA_RHOMIN); if (verbose) printf("CCSA outer iteration: rho -> %g\n", rho); for (i = 0; i < m; ++i) rhoc[i] = MAX(0.1 * rhoc[i], CCSA_RHOMIN); for (i = 0; i < MIN(verbose, m); ++i) printf(" CCSA rhoc[%u] -> %g\n", i, rhoc[i]); if (k > 1) { for (j = 0; j < n; ++j) { double dx2 = (xcur[j]-xprev[j]) * (xprev[j]-xprevprev[j]); double gam = dx2 < 0 ? 0.7 : (dx2 > 0 ? 1.2 : 1); sigma[j] *= gam; if (!nlopt_isinf(ub[j]) && !nlopt_isinf(lb[j])) { sigma[j] = MIN(sigma[j], 10*(ub[j]-lb[j])); /* use a smaller lower bound than Svanberg's 0.01*(ub-lb), which seems unnecessarily large */ sigma[j] = MAX(sigma[j], 1e-8*(ub[j]-lb[j])); } sigma[j] = MAX(sigma[j], sigma_min); } for (j = 0; j < MIN(verbose, n); ++j) printf(" CCSA sigma[%u] -> %g\n", j, sigma[j]); } } done: nlopt_destroy(pre_opt); if (dd.scratch) free(dd.scratch); if (m) { free(dd.prec_data); free(dd.prec); } free(sigma); return ret; } stevengj-nlopt-88c424d/src/algs/mma/mma.c000066400000000000000000000405761521061417600202570ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "mma.h" #include "nlopt-util.h" unsigned mma_verbose = 0; /* > 0 for verbose output */ #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) /* magic minimum value for rho in MMA ... the 2002 paper says it should be a "fixed, strictly positive `small' number, e.g. 1e-5" ... grrr, I hate these magic numbers, which seem like they should depend on the objective function in some way ... in particular, note that rho is dimensionful (= dimensions of objective function) */ #define MMA_RHOMIN 1e-5 /***********************************************************************/ /* function for MMA's dual solution of the approximate problem */ typedef struct { int count; /* evaluation count, incremented each call */ unsigned n; /* must be set on input to dimension of x */ const double *x, *lb, *ub, *sigma, *dfdx; /* arrays of length n */ const double *dfcdx; /* m-by-n array of fc gradients */ double fval, rho; /* must be set on input */ const double *fcval, *rhoc; /* arrays of length m */ double *xcur; /* array of length n, output each time */ double gval, wval, *gcval; /* output each time (array length m) */ } dual_data; static double sqr(double x) { return x * x; } static double dual_func(unsigned m, const double *y, double *grad, void *d_) { dual_data *d = (dual_data *) d_; unsigned n = d->n; const double *x = d->x, *lb = d->lb, *ub = d->ub, *sigma = d->sigma, *dfdx = d->dfdx; const double *dfcdx = d->dfcdx; double rho = d->rho, fval = d->fval; const double *rhoc = d->rhoc, *fcval = d->fcval; double *xcur = d->xcur; double *gcval = d->gcval; unsigned i, j; double val; d->count++; val = d->gval = fval; d->wval = 0; for (i = 0; i < m; ++i) val += y[i] * (gcval[i] = nlopt_isnan(fcval[i]) ? 0 : fcval[i]); for (j = 0; j < n; ++j) { double u, v, dx, denominv, c, sigma2, dx2; /* first, compute xcur[j] for y. Because this objective is separable, we can minimize over x analytically, and the minimum dx is given by the solution of a quadratic equation: u dx^2 + 2 v sigma^2 dx + u sigma^2 = 0 where u and v are defined by the sums below. Because of the definitions, it is guaranteed that |u/v| <= sigma, and it follows that the only dx solution with |dx| <= sigma is given by: (v/u) sigma^2 (-1 + sqrt(1 - (u / v sigma)^2)) = (u/v) / (-1 - sqrt(1 - (u / v sigma)^2)) (which goes to zero as u -> 0). The latter expression is less susceptible to roundoff error. */ if (sigma[j] == 0) { /* special case for lb[i] == ub[i] dims, dx=0 */ xcur[j] = x[j]; continue; } u = dfdx[j]; v = fabs(dfdx[j]) * sigma[j] + 0.5 * rho; for (i = 0; i < m; ++i) if (!nlopt_isnan(fcval[i])) { u += dfcdx[i*n + j] * y[i]; v += (fabs(dfcdx[i*n + j]) * sigma[j] + 0.5 * rhoc[i]) * y[i]; } u *= (sigma2 = sqr(sigma[j])); dx = (u/v) / (-1 - sqrt(fabs(1 - sqr(u/(v*sigma[j]))))); xcur[j] = x[j] + dx; if (xcur[j] > ub[j]) xcur[j] = ub[j]; else if (xcur[j] < lb[j]) xcur[j] = lb[j]; if (xcur[j] > x[j]+0.9*sigma[j]) xcur[j] = x[j]+0.9*sigma[j]; else if (xcur[j] < x[j]-0.9*sigma[j]) xcur[j] = x[j]-0.9*sigma[j]; dx = xcur[j] - x[j]; /* function value: */ dx2 = dx * dx; denominv = 1.0 / (sigma2 - dx2); val += (u * dx + v * dx2) * denominv; /* update gval, wval, gcval (approximant functions) */ c = sigma2 * dx; d->gval += (dfdx[j] * c + (fabs(dfdx[j])*sigma[j] + 0.5*rho) * dx2) * denominv; d->wval += 0.5 * dx2 * denominv; for (i = 0; i < m; ++i) if (!nlopt_isnan(fcval[i])) gcval[i] += (dfcdx[i*n+j] * c + (fabs(dfcdx[i*n+j])*sigma[j] + 0.5*rhoc[i]) * dx2) * denominv; } /* gradient is easy to compute: since we are at a minimum x (dval/dx=0), we only need the partial derivative with respect to y, and we negate because we are maximizing: */ if (grad) for (i = 0; i < m; ++i) grad[i] = -gcval[i]; return -val; } /***********************************************************************/ /* note that we implement a hidden feature not in the standard nlopt_minimize_constrained interface: whenever the constraint function returns NaN, that constraint becomes inactive. */ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init, int inner_gradients, int always_improve, double sigma_min, const double *sigma_init) { nlopt_result ret = NLOPT_SUCCESS; double *xcur, rho, *sigma, *dfdx, *dfdx_cur, *xprev, *xprevprev, fcur; double *dfcdx, *dfcdx_cur; double *fcval, *fcval_cur, *rhoc, *gcval, *y, *dual_lb, *dual_ub; unsigned i, ifc, j, k = 0; dual_data dd; int feasible; double infeasibility; unsigned mfc; verbose = MAX(mma_verbose, verbose); m = nlopt_count_constraints(mfc = m, fc); if (nlopt_get_dimension(dual_opt) != m) { nlopt_stop_msg(stop, "dual optimizer has wrong dimension %d != %d", nlopt_get_dimension(dual_opt), m); return NLOPT_INVALID_ARGS; } sigma = (double *) malloc(sizeof(double) * (6*n + 2*m*n + m*7)); if (!sigma) return NLOPT_OUT_OF_MEMORY; dfdx = sigma + n; dfdx_cur = dfdx + n; xcur = dfdx_cur + n; xprev = xcur + n; xprevprev = xprev + n; fcval = xprevprev + n; fcval_cur = fcval + m; rhoc = fcval_cur + m; gcval = rhoc + m; dual_lb = gcval + m; dual_ub = dual_lb + m; y = dual_ub + m; dfcdx = y + m; dfcdx_cur = dfcdx + m*n; dd.n = n; dd.x = x; dd.lb = lb; dd.ub = ub; dd.sigma = sigma; dd.dfdx = dfdx; dd.dfcdx = dfcdx; dd.fcval = fcval; dd.rhoc = rhoc; dd.xcur = xcur; dd.gcval = gcval; for (j = 0; j < n; ++j) { if (sigma_init && sigma_init[j] > 0) sigma[j] = sigma_init[j]; else if (nlopt_isinf(ub[j]) || nlopt_isinf(lb[j])) sigma[j] = 1.0; /* arbitrary default */ else sigma[j] = 0.5 * (ub[j] - lb[j]); sigma[j] = MAX(sigma[j], sigma_min); } rho = rho_init; for (i = 0; i < m; ++i) { rhoc[i] = rho_init; dual_lb[i] = y[i] = 0.0; dual_ub[i] = HUGE_VAL; } dd.fval = fcur = *minf = f(n, x, dfdx, f_data); ++ *(stop->nevals_p); memcpy(xcur, x, sizeof(double) * n); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible = 1; infeasibility = 0; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval + i, dfcdx + i*n, fc + ifc, n, x); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } for (i = 0; i < m; ++i) { feasible = feasible && (fcval[i] <= 0 || nlopt_isnan(fcval[i])); if (fcval[i] > infeasibility) infeasibility = fcval[i]; } /* For non-feasible initial points, set a finite (large) upper-bound on the dual variables. What this means is that, if no feasible solution is found from the dual problem, it will minimize the dual objective with the unfeasible constraint weighted by 1e40 -- basically, minimizing the unfeasible constraint until it becomes feasible or until we at least obtain a step towards a feasible point. Svanberg suggested a different approach in his 1987 paper, basically introducing additional penalty variables for unfeasible constraints, but this is easier to implement and at least as efficient. */ if (!feasible) for (i = 0; i < m; ++i) dual_ub[i] = 1e40; nlopt_set_min_objective(dual_opt, dual_func, &dd); nlopt_set_lower_bounds(dual_opt, dual_lb); nlopt_set_upper_bounds(dual_opt, dual_ub); nlopt_set_stopval(dual_opt, -HUGE_VAL); nlopt_remove_inequality_constraints(dual_opt); nlopt_remove_equality_constraints(dual_opt); while (1) { /* outer iterations */ int inner_nevals = 0; double fprev = fcur; if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; if (++k > 1) memcpy(xprevprev, xprev, sizeof(double) * n); memcpy(xprev, xcur, sizeof(double) * n); while (1) { /* inner iterations */ double min_dual, infeasibility_cur; int feasible_cur, inner_done; unsigned save_verbose; int new_infeasible_constraint; nlopt_result reti; /* solve dual problem */ dd.rho = rho; dd.count = 0; save_verbose = mma_verbose; mma_verbose = 0; /* no recursive verbosity */ reti = nlopt_optimize_limited(dual_opt, y, &min_dual, 0, stop->maxtime - (nlopt_seconds() - stop->start)); mma_verbose = save_verbose; if (reti < 0 || reti == NLOPT_MAXTIME_REACHED) { ret = reti; goto done; } dual_func(m, y, NULL, &dd); /* evaluate final xcur etc. */ if (verbose) { printf("MMA dual converged in %d iterations to g=%g:\n", dd.count, dd.gval); for (i = 0; i < MIN(verbose, m); ++i) printf(" MMA y[%u]=%g, gc[%u]=%g\n", i, y[i], i, dd.gcval[i]); } fcur = f(n, xcur, inner_gradients ? dfdx_cur : NULL, f_data); ++ *(stop->nevals_p); ++inner_nevals; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible_cur = 1; infeasibility_cur = 0; new_infeasible_constraint = 0; inner_done = dd.gval >= fcur; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval_cur + i, inner_gradients ? dfcdx_cur + i*n : NULL, fc + ifc, n, xcur); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } for (i = ifc = 0; ifc < mfc; ++ifc) { unsigned i0 = i, inext = i + fc[ifc].m; for (; i < inext; ++i) if (!nlopt_isnan(fcval_cur[i])) { feasible_cur = feasible_cur && (fcval_cur[i] <= fc[ifc].tol[i-i0]); if (!nlopt_isnan(fcval[i])) inner_done = inner_done && (dd.gcval[i] >= fcval_cur[i]); else if (fcval_cur[i] > 0) new_infeasible_constraint = 1; if (fcval_cur[i] > infeasibility_cur) infeasibility_cur = fcval_cur[i]; } } inner_done = inner_done || (inner_maxeval > 0 && inner_nevals == inner_maxeval); /* update the current point. If always_improve (the default), use an aggressive strategy that always accepts an improvement even if !inner_done, otherwise only update the current point if inner_done (= outer iteration), more like the original Svanberg paper */ if (always_improve ? (fcur < *minf && (inner_done || feasible_cur || !feasible)) || (!feasible && infeasibility_cur < infeasibility) : inner_done) { if (verbose && !feasible_cur) printf("MMA - using infeasible point?\n"); if (!inner_gradients) { /* evaluate again, this time with gradients */ fcur = f(n, xcur, dfdx_cur, f_data); /* don't update *(stop->nevals_p) -- hope user caches xcur so that they don't actually recompute f */ if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } feasible_cur = 1; infeasibility_cur = 0; new_infeasible_constraint = 0; inner_done = dd.gval >= fcur; for (i = ifc = 0; ifc < mfc; ++ifc) { nlopt_eval_constraint(fcval_cur + i, dfcdx_cur + i*n, fc + ifc, n, xcur); i += fc[ifc].m; if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } } /* recompute feasible_cur etc in case the caller has changed the objective function for an outer iteration, but don't change inner_done in that case */ for (i = ifc = 0; ifc < mfc; ++ifc) { unsigned i0 = i, inext = i + fc[ifc].m; for (; i < inext; ++i) if (!nlopt_isnan(fcval_cur[i])) { feasible_cur = feasible_cur && (fcval_cur[i] <= fc[ifc].tol[i-i0]); if (nlopt_isnan(fcval[i]) && fcval_cur[i] > 0) new_infeasible_constraint = 1; if (fcval_cur[i] > infeasibility_cur) infeasibility_cur = fcval_cur[i]; } } } dd.fval = *minf = fcur; infeasibility = infeasibility_cur; memcpy(fcval, fcval_cur, sizeof(double)*m); memcpy(x, xcur, sizeof(double)*n); memcpy(dfdx, dfdx_cur, sizeof(double)*n); memcpy(dfcdx, dfcdx_cur, sizeof(double)*n*m); /* once we have reached a feasible solution, the algorithm should never make the solution infeasible again (if inner_done), although the constraints may be violated slightly by rounding errors etc. so we must be a little careful about checking feasibility */ if (infeasibility_cur == 0) { if (!feasible) { /* reset upper bounds to infin. */ for (i = 0; i < m; ++i) dual_ub[i] = HUGE_VAL; nlopt_set_upper_bounds(dual_opt, dual_ub); } feasible = 1; } else if (new_infeasible_constraint) feasible = 0; } if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; if (ret != NLOPT_SUCCESS) goto done; if (inner_done) break; if (fcur > dd.gval) rho = MIN(10*rho, 1.1 * (rho + (fcur-dd.gval) / dd.wval)); for (i = 0; i < m; ++i) if (!nlopt_isnan(fcval_cur[i]) && fcval_cur[i] > dd.gcval[i]) rhoc[i] = MIN(10*rhoc[i], 1.1 * (rhoc[i] + (fcval_cur[i]-dd.gcval[i]) / dd.wval)); if (verbose) printf("MMA inner iteration: rho -> %g\n", rho); for (i = 0; i < MIN(verbose, m); ++i) printf(" MMA rhoc[%u] -> %g\n", i,rhoc[i]); } if (nlopt_stop_ftol(stop, fcur, fprev)) ret = NLOPT_FTOL_REACHED; if (nlopt_stop_x(stop, xcur, xprev)) ret = NLOPT_XTOL_REACHED; if (ret != NLOPT_SUCCESS) goto done; /* update rho and sigma for iteration k+1 */ rho = MAX(0.1 * rho, MMA_RHOMIN); if (verbose) printf("MMA outer iteration: rho -> %g\n", rho); for (i = 0; i < m; ++i) rhoc[i] = MAX(0.1 * rhoc[i], MMA_RHOMIN); for (i = 0; i < MIN(verbose, m); ++i) printf(" MMA rhoc[%u] -> %g\n", i, rhoc[i]); if (k > 1) { for (j = 0; j < n; ++j) { double dx2 = (xcur[j]-xprev[j]) * (xprev[j]-xprevprev[j]); double gam = dx2 < 0 ? 0.7 : (dx2 > 0 ? 1.2 : 1); sigma[j] *= gam; if (!nlopt_isinf(ub[j]) && !nlopt_isinf(lb[j])) { sigma[j] = MIN(sigma[j], 10*(ub[j]-lb[j])); sigma[j] = MAX(sigma[j], 0.01*(ub[j]-lb[j])); } sigma[j] = MAX(sigma[j], sigma_min); } for (j = 0; j < MIN(verbose, n); ++j) printf(" MMA sigma[%u] -> %g\n", j, sigma[j]); } } done: free(sigma); return ret; } stevengj-nlopt-88c424d/src/algs/mma/mma.h000066400000000000000000000044601521061417600202540ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef MMA_H #define MMA_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern unsigned mma_verbose; extern unsigned ccsa_verbose; nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init, int inner_gradients, int always_improve, double sigma_min, const double *sigma_init); nlopt_result ccsa_quadratic_minimize( unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, nlopt_precond pre, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, nlopt_stopping *stop, nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init, int inner_gradients, int always_improve, double sigma_min, const double *sigma_init); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/neldermead/000077500000000000000000000000001521061417600206535ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/neldermead/README000066400000000000000000000112471521061417600215400ustar00rootroot00000000000000This directory contains Nelder-Mead and variations thereof. Currently, I have implemented two algorithms, described below. The code in this directory is under the same MIT license as the rest of my code in NLopt (see ../COPYRIGHT). Steven G. Johnson November 2008 ----------------------------------------------------------------------- First, (almost) the original Nelder-Mead simplex algorithm (NLOPT_LN_NELDERMEAD), as described in: J. A. Nelder and R. Mead, "A simplex method for function minimization," The Computer Journal 7, p. 308-313 (1965). This method is simple and has demonstrated enduring popularity, despite the later discovery that it fails to converge at all for some functions. Anecdotal evidence suggests that it often performs well even for noisy and/or discontinuous objective functions. I would tend to recommend the Subplex method (below) instead, however. The main variation is that I implemented explicit support for bound constraints, using essentially the method described in: J. A. Richardson and J. L. Kuester, "The complex method for constrained optimization," Commun. ACM 16(8), 487-489 (1973). implementing the method described by: M. J. Box, "A new method of constrained optimization and a comparison with other methods," Computer J. 8 (1), 42-52 (1965). Whenever a new point would lie outside the bound constraints, Box advocates moving it "just inside" the constraints. I couldn't see any advantage to using a fixed distance inside the constraints, especially if the optimum is on the constraint, so instead I move the point exactly onto the constraint in that case. The danger with implementing bound constraints in this way (or by Box's method) is that you may collapse the simplex into a lower-dimensional subspace. I'm not aware of a better way, however. In any case, this collapse of the simplex is ameliorated by restarting, such as when Nelder-Mead is used within the Subplex algorithm below. ----------------------------------------------------------------------- Second, I re-implemented Tom Rowan's "Subplex" algorithm. As Rowan expressed a preference that other implementations of his algorithm use a different name, I called my implementation "Sbplx" (NLOPT_LN_SBPLX). Subplex (a variant of Nelder-Mead that uses Nelder-Mead on a sequence of subspaces) is claimed to be much more efficient and robust than the original Nelder-Mead, while retaining the latter's facility with discontinuous objectives, and in my experience these claims seem to be true. (However, I'm not aware of any proof that Subplex is globally convergent, and may fail for some objectives like Nelder-Mead; YMMV.) I used the description of Rowan's algorithm in his PhD thesis: T. Rowan, "Functional Stability Analysis of Numerical Algorithms", Ph.D. thesis, Department of Computer Sciences, University of Texas at Austin, 1990. I would have preferred to use Rowan's original implementation, posted by him on Netlib: http://www.netlib.org/opt/subplex.tgz Unfortunately, the legality of redistributing or modifying this code is unclear. Rowan didn't include any license statement at all with the original code, which makes it technically illegal to redistribute. I contacted Rowan about getting a clear open-source/free-software license for it, and he was very agreeable, but he said he had to think about the specific license choice and would get back to me. Unfortunately, a year later I still haven't heard from him, and his old email address no longer seems to work, so I don't know how to contact him for permission. Since the algorithm is not too complicated, however, I just rewrote it. There seem to be slight differences between the behavior of my implementation and his (probably due to different choices of initial subspace and other slight variations, where his paper was ambiguous), but the number of iterations to converge on my test problems seems to be quite close (within 10% for most problems). The only major difference between my implementation and Rowan's, as far as I can tell, is that I implemented explicit support for bound constraints (via the method in the Box paper as described above). This seems to be a big improvement in the case where the optimum lies against one of the constraints. ----------------------------------------------------------------------- Future possibilities: C. J. Price, I. D. Coope, and D. Byatt, "A convergent variant of the Nelder-Mead algorithm," J. Optim. Theory Appl. 113 (1), p. 5-19 (2002). A. Burmen, J. Puhan, and T. Tuma, "Grid restrained Nelder-Mead algorithm," Computational Optim. Appl. 34(3), 359-375 (2006). Both of these are provably convergent variations of Nelder-Mead; the latter authors claim that theirs is superior. stevengj-nlopt-88c424d/src/algs/neldermead/neldermead.h000066400000000000000000000043561521061417600231340ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NELDERMEAD_H #define NELDERMEAD_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result nldrmd_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, const double *xstep, /* initial step sizes */ nlopt_stopping *stop); nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x,/* in: initial guess, out: minimizer */ double *minf, const double *xstep, /* initial step sizes */ nlopt_stopping *stop, double psi, double *scratch, double *fdiff); nlopt_result sbplx_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, const double *xstep0, /* initial step sizes */ nlopt_stopping *stop); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/neldermead/nldrmd.c000066400000000000000000000251541521061417600223060ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include "neldermead.h" #include "redblack.h" /* Nelder-Mead simplex algorithm, used as a subroutine for the Rowan's subplex algorithm. Modified to handle bound constraints ala Richardson and Kuester (1973), as mentioned below. */ /* heuristic "strategy" constants: */ static const double ALPHA = 1, BETA = 0.5, GAMMA = 2, DELTA = 0.5; /* sort order in red-black tree: keys [f(x), x] are sorted by f(x) */ static int simplex_compare(double *k1, double *k2) { if (*k1 < *k2) return -1; if (*k1 > *k2) return +1; return (int)(k1 - k2); /* tie-breaker */ } /* return 1 if a and b are approximately equal relative to floating-point precision, 0 otherwise */ static int close(double a, double b) { return (fabs(a - b) <= 1e-13 * (fabs(a) + fabs(b))); } /* Perform the reflection xnew = c + scale * (c - xold), returning 0 if xnew == c or xnew == xold (coincident points), 1 otherwise. The reflected point xnew is "pinned" to the lower and upper bounds (lb and ub), as suggested by J. A. Richardson and J. L. Kuester, "The complex method for constrained optimization," Commun. ACM 16(8), 487-489 (1973). This is probably a suboptimal way to handle bound constraints, but I don't know a better way. The main danger with this is that the simplex might collapse into a lower-dimensional hyperplane; this danger can be ameliorated by restarting (as in subplex), however. */ static int reflectpt(int n, double *xnew, const double *c, double scale, const double *xold, const double *lb, const double *ub) { int equalc = 1, equalold = 1, i; for (i = 0; i < n; ++i) { double newx = c[i] + scale * (c[i] - xold[i]); if (newx < lb[i]) newx = lb[i]; if (newx > ub[i]) newx = ub[i]; equalc = equalc && close(newx, c[i]); equalold = equalold && close(newx, xold[i]); xnew[i] = newx; } return !(equalc || equalold); } #define CHECK_EVAL(xc,fc) \ ++ *(stop->nevals_p); \ if (nlopt_stop_forced(stop)) { ret=NLOPT_FORCED_STOP; goto done; } \ if ((fc) <= *minf) { \ *minf = (fc); memcpy(x, (xc), n * sizeof(double)); \ if (*minf < stop->minf_max) { ret=NLOPT_MINF_MAX_REACHED; goto done; } \ } \ if (nlopt_stop_evals(stop)) { ret=NLOPT_MAXEVAL_REACHED; goto done; } \ if (nlopt_stop_time(stop)) { ret=NLOPT_MAXTIME_REACHED; goto done; } /* Internal version of nldrmd_minimize, intended to be used as a subroutine for the subplex method. Three differences compared to nldrmd_minimize: *minf should contain the value of f(x) (so that we don't have to re-evaluate f at the starting x). if psi > 0, then it *replaces* xtol and ftol in stop with the condition that the simplex diameter |xl - xh| must be reduced by a factor of psi ... this is for when nldrmd is used within the subplex method; for ordinary termination tests, set psi = 0. scratch should contain an array of length >= (n+1)*(n+1) + 2*n, used as scratch workspace. On output, *fdiff will contain the difference between the high and low function values of the last simplex. */ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, const double *xstep, /* initial step sizes */ nlopt_stopping *stop, double psi, double *scratch, double *fdiff) { double *pts; /* (n+1) x (n+1) array of n+1 points plus function val [0] */ double *c; /* centroid * n */ double *xcur; /* current point */ rb_tree t; /* red-black tree of simplex, sorted by f(x) */ int i, j; double ninv = 1.0 / n; nlopt_result ret = NLOPT_SUCCESS; double init_diam = 0; pts = scratch; c = scratch + (n+1)*(n+1); xcur = c + n; nlopt_rb_tree_init(&t, simplex_compare); *fdiff = HUGE_VAL; /* initialize the simplex based on the starting xstep */ memcpy(pts+1, x, sizeof(double)*n); pts[0] = *minf; if (*minf < stop->minf_max) { ret=NLOPT_MINF_MAX_REACHED; goto done; } for (i = 0; i < n; ++i) { double *pt = pts + (i+1)*(n+1); memcpy(pt+1, x, sizeof(double)*n); pt[1+i] += xstep[i]; if (pt[1+i] > ub[i]) { if (ub[i] - x[i] > fabs(xstep[i]) * 0.1) pt[1+i] = ub[i]; else /* ub is too close to pt, go in other direction */ pt[1+i] = x[i] - fabs(xstep[i]); } if (pt[1+i] < lb[i]) { if (x[i] - lb[i] > fabs(xstep[i]) * 0.1) pt[1+i] = lb[i]; else {/* lb is too close to pt, go in other direction */ pt[1+i] = x[i] + fabs(xstep[i]); if (pt[1+i] > ub[i]) /* go towards further of lb, ub */ pt[1+i] = 0.5 * ((ub[i] - x[i] > x[i] - lb[i] ? ub[i] : lb[i]) + x[i]); } } if (close(pt[1+i], x[i])) { nlopt_stop_msg(stop, "starting step size led to simplex that was too small in dimension %d: %g is too close to x[%d]=%g", i, pt[1+i], i, x[i]); ret=NLOPT_FAILURE; goto done; } pt[0] = f(n, pt+1, NULL, f_data); CHECK_EVAL(pt+1, pt[0]); } restart: for (i = 0; i < n + 1; ++i) if (!nlopt_rb_tree_insert(&t, pts + i*(n+1))) { ret = NLOPT_OUT_OF_MEMORY; goto done; } while (1) { rb_node *low = nlopt_rb_tree_min(&t); rb_node *high = nlopt_rb_tree_max(&t); double fl = low->k[0], *xl = low->k + 1; double fh = high->k[0], *xh = high->k + 1; double fr; *fdiff = fh - fl; if (init_diam == 0) /* initialize diam. for psi convergence test */ for (i = 0; i < n; ++i) init_diam += fabs(xl[i] - xh[i]); if (psi <= 0 && nlopt_stop_ftol(stop, fl, fh)) { ret = NLOPT_FTOL_REACHED; goto done; } /* compute centroid ... if we cared about the performance of this, we could do it iteratively by updating the centroid on each step, but then we would have to be more careful about accumulation of rounding errors... anyway n is unlikely to be very large for Nelder-Mead in practical cases */ memset(c, 0, sizeof(double)*n); for (i = 0; i < n + 1; ++i) { double *xi = pts + i*(n+1) + 1; if (xi != xh) for (j = 0; j < n; ++j) c[j] += xi[j]; } for (i = 0; i < n; ++i) c[i] *= ninv; /* x convergence check: find xcur = max radius from centroid */ if (n > 0) { memset(xcur, 0, sizeof(double)*n); } for (i = 0; i < n + 1; ++i) { double *xi = pts + i*(n+1) + 1; for (j = 0; j < n; ++j) { double dx = fabs(xi[j] - c[j]); if (dx > xcur[j]) xcur[j] = dx; } } for (i = 0; i < n; ++i) xcur[i] += c[i]; if (psi > 0) { double diam = 0; for (i = 0; i < n; ++i) diam += fabs(xl[i] - xh[i]); if (diam < psi * init_diam) { ret = NLOPT_XTOL_REACHED; goto done; } } else if (nlopt_stop_x(stop, c, xcur)) { ret = NLOPT_XTOL_REACHED; goto done; } /* reflection */ if (!reflectpt(n, xcur, c, ALPHA, xh, lb, ub)) { ret=NLOPT_XTOL_REACHED; goto done; } fr = f(n, xcur, NULL, f_data); CHECK_EVAL(xcur, fr); if (fr < fl) { /* new best point, expand simplex */ if (!reflectpt(n, xh, c, GAMMA, xh, lb, ub)) { ret=NLOPT_XTOL_REACHED; goto done; } fh = f(n, xh, NULL, f_data); CHECK_EVAL(xh, fh); if (fh >= fr) { /* expanding didn't improve */ fh = fr; memcpy(xh, xcur, sizeof(double)*n); } } else if (fr < nlopt_rb_tree_pred(high)->k[0]) { /* accept new point */ memcpy(xh, xcur, sizeof(double)*n); fh = fr; } else { /* new worst point, contract */ double fc; if (!reflectpt(n,xcur,c, fh <= fr ? -BETA : BETA, xh, lb,ub)) { ret=NLOPT_XTOL_REACHED; goto done; } fc = f(n, xcur, NULL, f_data); CHECK_EVAL(xcur, fc); if (fc < fr && fc < fh) { /* successful contraction */ memcpy(xh, xcur, sizeof(double)*n); fh = fc; } else { /* failed contraction, shrink simplex */ nlopt_rb_tree_destroy(&t); nlopt_rb_tree_init(&t, simplex_compare); for (i = 0; i < n+1; ++i) { double *pt = pts + i * (n+1); if (pt+1 != xl) { if (!reflectpt(n,pt+1, xl,-DELTA,pt+1, lb,ub)) { ret = NLOPT_XTOL_REACHED; goto done; } pt[0] = f(n, pt+1, NULL, f_data); CHECK_EVAL(pt+1, pt[0]); } } goto restart; } } high->k[0] = fh; nlopt_rb_tree_resort(&t, high); } done: nlopt_rb_tree_destroy(&t); return ret; } nlopt_result nldrmd_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, const double *xstep, /* initial step sizes */ nlopt_stopping *stop) { nlopt_result ret; double *scratch, fdiff; *minf = f(n, x, NULL, f_data); ++ *(stop->nevals_p); if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; if (*minf < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; scratch = (double*) malloc(sizeof(double) * ((n+1)*(n+1) + 2*n)); if (!scratch) return NLOPT_OUT_OF_MEMORY; ret = nldrmd_minimize_(n, f, f_data, lb, ub, x, minf, xstep, stop, 0.0, scratch, &fdiff); free(scratch); return ret; } stevengj-nlopt-88c424d/src/algs/neldermead/sbplx.c000066400000000000000000000201421521061417600221460ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "neldermead.h" /* subplex strategy constants: */ static const double psi = 0.25, omega = 0.1; static const int nsmin = 2, nsmax = 5; int sbplx_verbose = 0; /* for debugging */ /* qsort_r comparison function for sorting indices into delta-x array */ static int p_compare(void *dx_, const void *i_, const void *j_) { const double *dx = (const double *) dx_; int i = *((const int *) i_), j = *((const int *) j_); double dxi = fabs(dx[i]), dxj = fabs(dx[j]); return (dxi > dxj ? -1 : (dxi < dxj ? +1 : 0)); } typedef struct { const int *p; /* subspace index permutation */ int is; /* starting index for this subspace */ int n; /* dimension of underlying space */ double *x; /* current x vector */ nlopt_func f; void *f_data; /* the "actual" underlying function */ } subspace_data; /* wrapper around objective function for subspace optimization */ static double subspace_func(unsigned ns, const double *xs, double *grad, void *data) { subspace_data *d = (subspace_data *) data; int i, is = d->is; const int *p = d->p; double *x = d->x; (void) grad; /* should always be NULL here */ for (i = is; i < is + ((int) ns); ++i) x[p[i]] = xs[i-is]; return d->f(d->n, x, NULL, d->f_data); } nlopt_result sbplx_minimize(int n, nlopt_func f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, const double *xstep0, /* initial step sizes */ nlopt_stopping *stop) { nlopt_result ret = NLOPT_SUCCESS; double *xstep, *xprev, *dx, *xs, *lbs, *ubs, *xsstep, *scratch; int *p; /* permuted indices of x sorted by decreasing magnitude |dx| */ int i; subspace_data sd; *minf = f(n, x, NULL, f_data); ++ *(stop->nevals_p); if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; if (*minf < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; xstep = (double*)malloc(sizeof(double) * (n*3 + nsmax*4 + (nsmax+1)*(nsmax+1)+2*nsmax)); if (!xstep) return NLOPT_OUT_OF_MEMORY; xprev = xstep + n; dx = xprev + n; xs = dx + n; xsstep = xs + nsmax; lbs = xsstep + nsmax; ubs = lbs + nsmax; scratch = ubs + nsmax; p = (int *) malloc(sizeof(int) * n); if (!p) { free(xstep); return NLOPT_OUT_OF_MEMORY; } memcpy(xstep, xstep0, n * sizeof(double)); memset(dx, 0, n * sizeof(double)); sd.p = p; sd.n = n; sd.x = x; sd.f = f; sd.f_data = f_data; while (1) { double normi = 0; double normdx = 0; int ns, nsubs = 0; int nevals = *(stop->nevals_p); double fdiff, fdiff_max = 0; memcpy(xprev, x, n * sizeof(double)); /* sort indices into the progress vector dx by decreasing order of magnitude |dx| */ for (i = 0; i < n; ++i) p[i] = i; nlopt_qsort_r(p, (size_t) n, sizeof(int), dx, p_compare); /* find the subspaces, and perform nelder-mead on each one */ for (i = 0; i < n; ++i) normdx += fabs(dx[i]); /* L1 norm */ for (i = 0; i + nsmin < n; i += ns) { /* find subspace starting at index i */ int k, nk; double ns_goodness = -HUGE_VAL, norm = normi; nk = i+nsmax > n ? n : i+nsmax; /* max k for this subspace */ for (k = i; k < i+nsmin-1; ++k) norm += fabs(dx[p[k]]); ns = nsmin; for (k = i+nsmin-1; k < nk; ++k) { double goodness; norm += fabs(dx[p[k]]); /* remaining subspaces must be big enough to partition */ if (n-(k+1) < nsmin) continue; /* maximize figure of merit defined by Rowan thesis: look for sudden drops in average |dx| */ if (k+1 < n) goodness = norm/(k+1) - (normdx-norm)/(n-(k+1)); else goodness = normdx/n; if (goodness > ns_goodness) { ns_goodness = goodness; ns = (k+1)-i; } } for (k = i; k < i+ns; ++k) normi += fabs(dx[p[k]]); /* do nelder-mead on subspace of dimension ns starting w/i */ sd.is = i; for (k = i; k < i+ns; ++k) { xs[k-i] = x[p[k]]; xsstep[k-i] = xstep[p[k]]; lbs[k-i] = lb[p[k]]; ubs[k-i] = ub[p[k]]; } ++nsubs; nevals = *(stop->nevals_p); ret = nldrmd_minimize_(ns, subspace_func, &sd, lbs,ubs,xs, minf, xsstep, stop, psi, scratch, &fdiff); if (fdiff > fdiff_max) fdiff_max = fdiff; if (sbplx_verbose) printf("%d NM iterations for (%d,%d) subspace\n", *(stop->nevals_p) - nevals, sd.is, ns); for (k = i; k < i+ns; ++k) x[p[k]] = xs[k-i]; if (ret == NLOPT_FAILURE) { ret=NLOPT_XTOL_REACHED; goto done; } if (ret != NLOPT_XTOL_REACHED) goto done; } /* nelder-mead on last subspace */ ns = n - i; sd.is = i; for (; i < n; ++i) { xs[i-sd.is] = x[p[i]]; xsstep[i-sd.is] = xstep[p[i]]; lbs[i-sd.is] = lb[p[i]]; ubs[i-sd.is] = ub[p[i]]; } ++nsubs; nevals = *(stop->nevals_p); ret = nldrmd_minimize_(ns, subspace_func, &sd, lbs,ubs,xs, minf, xsstep, stop, psi, scratch, &fdiff); if (fdiff > fdiff_max) fdiff_max = fdiff; if (sbplx_verbose) printf("sbplx: %d NM iterations for (%d,%d) subspace\n", *(stop->nevals_p) - nevals, sd.is, ns); for (i = sd.is; i < n; ++i) x[p[i]] = xs[i-sd.is]; if (ret == NLOPT_FAILURE) { ret=NLOPT_XTOL_REACHED; goto done; } if (ret != NLOPT_XTOL_REACHED) goto done; /* termination tests: */ if (nlopt_stop_ftol(stop, *minf, *minf + fdiff_max)) { ret = NLOPT_FTOL_REACHED; goto done; } if (nlopt_stop_x(stop, x, xprev)) { int j; /* as explained in Rowan's thesis, it is important to check |xstep| as well as |x-xprev|, since if the step size is too large (in early iterations), the inner Nelder-Mead may not make much progress */ for (j = 0; j < n; ++j) if (fabs(xstep[j]) * psi > (stop->xtol_abs ? stop->xtol_abs[j] : 0) && fabs(xstep[j]) * psi > stop->xtol_rel * fabs(x[j])) break; if (j == n) { ret = NLOPT_XTOL_REACHED; goto done; } } /* compute change in optimal point */ for (i = 0; i < n; ++i) dx[i] = x[i] - xprev[i]; /* setting stepsizes */ { double scale; if (nsubs == 1) scale = psi; else { double stepnorm = 0, dxnorm = 0; for (i = 0; i < n; ++i) { stepnorm += fabs(xstep[i]); dxnorm += fabs(dx[i]); } scale = dxnorm / stepnorm; if (scale < omega) scale = omega; if (scale > 1/omega) scale = 1/omega; } if (sbplx_verbose) printf("sbplx: stepsize scale factor = %g\n", scale); for (i = 0; i < n; ++i) xstep[i] = (dx[i] == 0) ? -(xstep[i] * scale) : copysign(xstep[i] * scale, dx[i]); } } done: free(p); free(xstep); return ret; } stevengj-nlopt-88c424d/src/algs/newuoa/000077500000000000000000000000001521061417600200515ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/newuoa/COPYRIGHT000066400000000000000000000022661521061417600213520ustar00rootroot00000000000000/* Copyright (c) 2004 M. J. D. Powell (mjdp@cam.ac.uk) * Copyright (c) 2007-2011 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ stevengj-nlopt-88c424d/src/algs/newuoa/README000066400000000000000000000031121521061417600207260ustar00rootroot00000000000000This is the NEWUOA software by M. J. D. Powell, which performs derivative-free unconstrained optimization using an iteratively constructed quadratic approximation for the objective function. See: M. J. D. Powell, "The NEWUOA software for unconstrained optimization without derivatives," Proc. 40th Workshop on Large Scale Nonlinear Optimization (Erice, Italy, 2004). The C translation by S. G. Johnson (2008) includes a few minor modifications, mainly to use the NLopt stopping criteria (and to take the objective function as an argument rather than a global). The C translation also includes a variant (NEWUOA_BOUND, when the lb and ub parameters to newuoa are non-NULL) that is substantially modified in order to support bound constraints on the input variables. In the original NEWUOA algorithm, Powell solved the quadratic subproblems (in routines TRSAPP and BIGLAG) in a spherical trust region via a truncated conjugate-gradient algorithm. In the new variant, we use the MMA algorithm for these subproblems to solve them with both bound constraints and a spherical trust region. In principle, we should also change the BIGDEN subroutine in a similar way (since BIGDEN also approximately solves a trust-region subproblem), but instead I just truncated its result to the bounds (which probably gives suboptimal convergence, but BIGDEN is called only very rarely in practice). The original Fortran code was released by Powell with "no restrictions or charges", and the C translation by S. G. Johnson is released in a similar spirit under the MIT License (see the COPYRIGHT file in this directory). stevengj-nlopt-88c424d/src/algs/newuoa/README.orig000066400000000000000000000046761521061417600217050ustar00rootroot00000000000000 This is the Fortran version of NEWUOA. Its purpose is to seek the least value of a function F of several variables, when derivatives are not available, where F is specified by the user through a subroutine called CALFUN. The algorithm is intended to change the variables to values that are close to a local minimum of F. The user, however, should assume responsibility for finding out if the calculations are satisfactory, by considering carefully the values of F that occur. The method is described in the report "The NEWUOA software for unconstrained optimization without derivatives", which is available on the web at www.damtp.cam.ac.uk, where you have to click on Numerical Analysis and then on Reports, the number of the report being NA2004/08. Let N be the number of variables. The main new feature of the method is that quadratic models are updated using only about NPT=2N+1 interpolation conditions, the remaining freedom being taken up by minimizing the Frobenius norm of the change to the second derivative matrix of the model. The new software was developed from UOBYQA, which also forms quadratic models from interpolation conditions. That method requires NPT=(N+1)(N+2)/2 conditions, however, because they have to define all the parameters of the model. The least Frobenius norm updating procedure with NPT=2N+1 is usually much more efficient when N is large, because the work of each iteration is much less than before, and in some experiments the number of calculations of the objective function seems to be only of magnitude N. The attachments in sequence are a suitable Makefile, followed by a main program and a CALFUN routine for the Chebyquad problems, in order to provide an example for testing. Then NEWUOA and its five auxiliary routines, namely NEWUOB, BIGDEN, BIGLAG, TRSAPP and UPDATE, are given. Finally, the computed output that the author obtained for the Chebyquad problems is listed. The way of calling NEWUOA should be clear from the Chebyquad example and from the comments of that subroutine. It is hoped that the software will be helpful to much future research and to many applications. There are no restrictions on or charges for its use. If you wish to refer to it, please cite the DAMTP report that is mentioned above, which has been submitted for publication in the proceedings of the 40th Workshop on Large Scale Nonlinear Optimization (Erice, Italy, 2004). December 16th, 2004 M.J.D. Powell (mjdp@cam.ac.uk) stevengj-nlopt-88c424d/src/algs/newuoa/newuoa.c000066400000000000000000002065301521061417600215210ustar00rootroot00000000000000/* Copyright (c) 2004 M. J. D. Powell (mjdp@cam.ac.uk) * Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* NEWUOA derivative-free optimization algorithm by M. J. D. Powell. Original Fortran code by Powell (2004). Converted via f2c, cleaned up, and incorporated into NLopt by S. G. Johnson (2008). See README. */ #include #include #include #include #include "newuoa.h" #define MIN2(a,b) ((a) <= (b) ? (a) : (b)) #define MAX2(a,b) ((a) >= (b) ? (a) : (b)) /*************************************************************************/ /* trsapp.f */ typedef struct { int npt; double *xpt, *pq, *hq, *gq, *xopt; double *hd; int iter; } quad_model_data; static double quad_model(unsigned n, const double *x, double *grad, void *data) { quad_model_data *d = (quad_model_data *) data; const double *xpt = d->xpt, *pq = d->pq, *hq = d->hq, *gq = d->gq, *xopt = d->xopt; double *hd = d->hd; int npt = d->npt, k; unsigned i, j; double val = 0; /* first, set hd to be Hessian matrix times x */ memset(hd, 0, sizeof(double) * n); /* implicit Hessian terms (a sum of outer products of xpt vectors) */ for (k = 0; k < npt; ++k) { double temp = 0; for (j = 0; j < n; ++j) temp += xpt[k + j * npt] * (xopt[j] + x[j]); temp *= pq[k]; for (i = 0; i < n; ++i) hd[i] += temp * xpt[k + i * npt]; } /* explicit Hessian terms (stored as compressed lower triangle hq) */ k = 0; for (j = 0; j < n; ++j) { for (i = 0; i < j; ++i) { hd[j] += hq[k] * (xopt[i] + x[i]); hd[i] += hq[k] * (xopt[j] + x[j]); ++k; } hd[j] += hq[k++] * (xopt[j] + x[j]); } for (i = 0; i < n; ++i) { val += (gq[i] + 0.5 * hd[i]) * (xopt[i] + x[i]); if (grad) grad[i] = gq[i] + hd[i]; } d->iter++; return val; } /* constraint function to enforce |x|^2 <= rho*rho */ static double rho_constraint(unsigned n, const double *x, double *grad, void *data) { double rho = *((double *) data); double val = - rho*rho; unsigned i; for (i = 0; i < n; ++i) val += x[i] * x[i]; if (grad) for (i = 0; i < n; ++i) grad[i] = 2*x[i]; return val; } static nlopt_result trsapp_(int *n, int *npt, double *xopt, double *xpt, double *gq, double *hq, double *pq, double *delta, double *step, double *d__, double *g, double *hd, double *hs, double *crvmin, const double *xbase, const double *lb, const double *ub) { /* System generated locals */ int xpt_dim1, xpt_offset, i__1, i__2; double d__1, d__2; /* Local variables */ int i__, j, k; double dd = 0.0, cf, dg, gg = 0.0; int ih; double ds, sg = 0.0; int iu; double ss, dhd, dhs, cth, sgk, shs = 0.0, sth, qadd, half, qbeg, qred = 0.0, qmin, temp, qsav, qnew, zero, ggbeg = 0.0, alpha, angle, reduc; int iterc; double ggsav, delsq, tempa = 0.0, tempb = 0.0; int isave; double bstep = 0.0, ratio, twopi; int itersw; double angtest; int itermax; /* N is the number of variables of a quadratic objective function, Q say. */ /* The arguments NPT, XOPT, XPT, GQ, HQ and PQ have their usual meanings, */ /* in order to define the current quadratic model Q. */ /* DELTA is the trust region radius, and has to be positive. */ /* STEP will be set to the calculated trial step. */ /* The arrays D, G, HD and HS will be used for working space. */ /* CRVMIN will be set to the least curvature of H along the conjugate */ /* directions that occur, except that it is set to zero if STEP goes */ /* all the way to the trust region boundary. */ /* The calculation of STEP begins with the truncated conjugate gradient */ /* method. If the boundary of the trust region is reached, then further */ /* changes to STEP may be made, each one being in the 2D space spanned */ /* by the current STEP and the corresponding gradient of Q. Thus STEP */ /* should provide a substantial reduction to Q within the trust region. */ /* Initialization, which includes setting HD to H times XOPT. */ /* Parameter adjustments */ xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xopt; --gq; --hq; --pq; --step; --d__; --g; --hd; --hs; if (lb && ub) { nlopt_opt opt; double *slb, *sub, *xtol, minf, crv; nlopt_result ret; quad_model_data qmd; qmd.npt = *npt; qmd.xpt = &xpt[1 + 1 * xpt_dim1]; qmd.pq = &pq[1]; qmd.hq = &hq[1]; qmd.gq = &gq[1]; qmd.xopt = &xopt[1]; qmd.hd = &hd[1]; qmd.iter = 0; slb = &g[1]; sub = &hs[1]; xtol = &d__[1]; for (j = 0; j < *n; ++j) { slb[j] = -(sub[j] = *delta); if (slb[j] < lb[j] - xbase[j] - xopt[j+1]) slb[j] = lb[j] - xbase[j] - xopt[j+1]; if (sub[j] > ub[j] - xbase[j] - xopt[j+1]) sub[j] = ub[j] - xbase[j] - xopt[j+1]; if (slb[j] > 0) slb[j] = 0; if (sub[j] < 0) sub[j] = 0; xtol[j] = 1e-7 * *delta; /* absolute x tolerance */ } memset(&step[1], 0, sizeof(double) * *n); opt = nlopt_create(NLOPT_LD_MMA, *n); nlopt_set_min_objective(opt, quad_model, &qmd); nlopt_add_inequality_constraint(opt, rho_constraint, delta, 0.0); nlopt_set_lower_bounds(opt, slb); nlopt_set_upper_bounds(opt, sub); nlopt_set_xtol_abs(opt, xtol); nlopt_set_maxeval(opt, 1000); ret = nlopt_optimize(opt, &step[1], &minf); nlopt_destroy(opt); if (rho_constraint(*n, &step[1], 0, delta) > -1e-6*(*delta)*(*delta)) crv = 0; else { for (j = 1; j <= *n; ++j) d__[j] = step[j] - xopt[j]; quad_model(*n, &d__[1], &g[1], &qmd); crv = gg = 0; for (j = 1; j <= *n; ++j) { crv += step[j] * (g[j] - gq[j]); gg += step[j] * step[j]; } if (gg <= 1e-16 * crv) crv = 1e16; else crv = crv / gg; } *crvmin = crv; return ret; } /* Function Body */ half = .5; zero = 0.; twopi = atan(1.) * 8.; delsq = *delta * *delta; iterc = 0; itermax = *n; itersw = itermax; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L10: */ d__[i__] = xopt[i__]; } goto L170; /* Prepare for the first line search. */ L20: qred = zero; dd = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { step[i__] = zero; hs[i__] = zero; g[i__] = gq[i__] + hd[i__]; d__[i__] = -g[i__]; /* L30: */ /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; } *crvmin = zero; if (dd == zero) { goto L160; } ds = zero; ss = zero; gg = dd; ggbeg = gg; /* Calculate the step to the trust region boundary and the product HD. */ L40: ++iterc; temp = delsq - ss; bstep = temp / (ds + sqrt(ds * ds + dd * temp)); goto L170; L50: dhd = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L60: */ dhd += d__[j] * hd[j]; } /* Update CRVMIN and set the step-length ALPHA. */ alpha = bstep; if (dhd > zero) { temp = dhd / dd; if (iterc == 1) { *crvmin = temp; } *crvmin = MIN2(*crvmin,temp); /* Computing MIN */ d__1 = alpha, d__2 = gg / dhd; alpha = MIN2(d__1,d__2); } qadd = alpha * (gg - half * alpha * dhd); qred += qadd; /* Update STEP and HS. */ ggsav = gg; gg = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { step[i__] += alpha * d__[i__]; hs[i__] += alpha * hd[i__]; /* L70: */ /* Computing 2nd power */ d__1 = g[i__] + hs[i__]; gg += d__1 * d__1; } /* Begin another conjugate direction iteration if required. */ if (alpha < bstep) { if (qadd <= qred * .01) { goto L160; } if (gg <= ggbeg * 1e-4) { goto L160; } if (iterc == itermax) { goto L160; } temp = gg / ggsav; dd = zero; ds = zero; ss = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = temp * d__[i__] - g[i__] - hs[i__]; /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; ds += d__[i__] * step[i__]; /* L80: */ /* Computing 2nd power */ d__1 = step[i__]; ss += d__1 * d__1; } if (ds <= zero) { goto L160; } if (ss < delsq) { goto L40; } } *crvmin = zero; itersw = iterc; /* Test whether an alternative iteration is required. */ L90: if (gg <= ggbeg * 1e-4) { goto L160; } sg = zero; shs = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sg += step[i__] * g[i__]; /* L100: */ shs += step[i__] * hs[i__]; } sgk = sg + shs; angtest = sgk / sqrt(gg * delsq); if (angtest <= -.99) { goto L160; } /* Begin the alternative iteration by calculating D and HD and some */ /* scalar products. */ ++iterc; temp = sqrt(delsq * gg - sgk * sgk); tempa = delsq / temp; tempb = sgk / temp; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L110: */ d__[i__] = tempa * (g[i__] + hs[i__]) - tempb * step[i__]; } goto L170; L120: dg = zero; dhd = zero; dhs = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dg += d__[i__] * g[i__]; dhd += hd[i__] * d__[i__]; /* L130: */ dhs += hd[i__] * step[i__]; } /* Seek the value of the angle that minimizes Q. */ cf = half * (shs - dhd); qbeg = sg + cf; qsav = qbeg; qmin = qbeg; isave = 0; iu = 49; temp = twopi / (double) (iu + 1); i__1 = iu; for (i__ = 1; i__ <= i__1; ++i__) { angle = (double) i__ * temp; cth = cos(angle); sth = sin(angle); qnew = (sg + cf * cth) * cth + (dg + dhs * cth) * sth; if (qnew < qmin) { qmin = qnew; isave = i__; tempa = qsav; } else if (i__ == isave + 1) { tempb = qnew; } /* L140: */ qsav = qnew; } if ((double) isave == zero) { tempa = qnew; } if (isave == iu) { tempb = qbeg; } angle = zero; if (tempa != tempb) { tempa -= qmin; tempb -= qmin; angle = half * (tempa - tempb) / (tempa + tempb); } angle = temp * ((double) isave + angle); /* Calculate the new STEP and HS. Then test for convergence. */ cth = cos(angle); sth = sin(angle); reduc = qbeg - (sg + cf * cth) * cth - (dg + dhs * cth) * sth; gg = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { step[i__] = cth * step[i__] + sth * d__[i__]; hs[i__] = cth * hs[i__] + sth * hd[i__]; /* L150: */ /* Computing 2nd power */ d__1 = g[i__] + hs[i__]; gg += d__1 * d__1; } qred += reduc; ratio = reduc / qred; if (iterc < itermax && ratio > .01) { goto L90; } L160: return NLOPT_SUCCESS; /* The following instructions act as a subroutine for setting the vector */ /* HD to the vector D multiplied by the second derivative matrix of Q. */ /* They are called from three different places, which are distinguished */ /* by the value of ITERC. */ L170: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L180: */ hd[i__] = zero; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { temp = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L190: */ temp += xpt[k + j * xpt_dim1] * d__[j]; } temp *= pq[k]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L200: */ hd[i__] += temp * xpt[k + i__ * xpt_dim1]; } } ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; if (i__ < j) { hd[j] += hq[ih] * d__[i__]; } /* L210: */ hd[i__] += hq[ih] * d__[j]; } } if (iterc == 0) { goto L20; } if (iterc <= itersw) { goto L50; } goto L120; } /* trsapp_ */ /*************************************************************************/ /* bigden.f */ static nlopt_result bigden_(int *n, int *npt, double *xopt, double *xpt, double *bmat, double *zmat, int *idz, int *ndim, int *kopt, int *knew, double *d__, double *w, double *vlag, double *beta, double *s, double *wvec, double *prod, const double *xbase, const double *lb, const double *ub) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, wvec_dim1, wvec_offset, prod_dim1, prod_offset, i__1, i__2; double d__1; /* Local variables */ int i__, j, k; double dd; int jc; double ds; int ip, iu, nw; double ss, den[9], one, par[9], tau, sum, two, diff, half, temp; int ksav; double step; int nptm; double zero, alpha, angle, denex[9]; int iterc; double tempa, tempb, tempc; int isave; double ssden, dtest, quart, xoptd, twopi, xopts, denold, denmax, densav, dstemp, sumold, sstemp, xoptsq; /* N is the number of variables. */ /* NPT is the number of interpolation equations. */ /* XOPT is the best interpolation point so far. */ /* XPT contains the coordinates of the current interpolation points. */ /* BMAT provides the last N columns of H. */ /* ZMAT and IDZ give a factorization of the first NPT by NPT submatrix of H. */ /* NDIM is the first dimension of BMAT and has the value NPT+N. */ /* KOPT is the index of the optimal interpolation point. */ /* KNEW is the index of the interpolation point that is going to be moved. */ /* D will be set to the step from XOPT to the new point, and on entry it */ /* should be the D that was calculated by the last call of BIGLAG. The */ /* length of the initial D provides a trust region bound on the final D. */ /* W will be set to Wcheck for the final choice of D. */ /* VLAG will be set to Theta*Wcheck+e_b for the final choice of D. */ /* BETA will be set to the value that will occur in the updating formula */ /* when the KNEW-th interpolation point is moved to its new position. */ /* S, WVEC, PROD and the private arrays DEN, DENEX and PAR will be used */ /* for working space. */ /* D is calculated in a way that should provide a denominator with a large */ /* modulus in the updating formula when the KNEW-th interpolation point is */ /* shifted to the new position XOPT+D. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xopt; prod_dim1 = *ndim; prod_offset = 1 + prod_dim1; prod -= prod_offset; wvec_dim1 = *ndim; wvec_offset = 1 + wvec_dim1; wvec -= wvec_offset; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --d__; --w; --vlag; --s; /* Function Body */ half = .5; one = 1.; quart = .25; two = 2.; zero = 0.; twopi = atan(one) * 8.; nptm = *npt - *n - 1; /* Store the first NPT elements of the KNEW-th column of H in W(N+1) */ /* to W(N+NPT). */ i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L10: */ w[*n + k] = zero; } i__1 = nptm; for (j = 1; j <= i__1; ++j) { temp = zmat[*knew + j * zmat_dim1]; if (j < *idz) { temp = -temp; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L20: */ w[*n + k] += temp * zmat[k + j * zmat_dim1]; } } alpha = w[*n + *knew]; /* The initial search direction D is taken from the last call of BIGLAG, */ /* and the initial S is set below, usually to the direction from X_OPT */ /* to X_KNEW, but a different direction to an interpolation point may */ /* be chosen, in order to prevent S from being nearly parallel to D. */ dd = zero; ds = zero; ss = zero; xoptsq = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; s[i__] = xpt[*knew + i__ * xpt_dim1] - xopt[i__]; ds += d__[i__] * s[i__]; /* Computing 2nd power */ d__1 = s[i__]; ss += d__1 * d__1; /* L30: */ /* Computing 2nd power */ d__1 = xopt[i__]; xoptsq += d__1 * d__1; } if (ds * ds > dd * .99 * ss) { ksav = *knew; dtest = ds * ds / ss; i__2 = *npt; for (k = 1; k <= i__2; ++k) { if (k != *kopt) { dstemp = zero; sstemp = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { diff = xpt[k + i__ * xpt_dim1] - xopt[i__]; dstemp += d__[i__] * diff; /* L40: */ sstemp += diff * diff; } if (sstemp == 0) return NLOPT_ROUNDOFF_LIMITED; if (dstemp * dstemp / sstemp < dtest) { ksav = k; dtest = dstemp * dstemp / sstemp; ds = dstemp; ss = sstemp; } } /* L50: */ } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L60: */ s[i__] = xpt[ksav + i__ * xpt_dim1] - xopt[i__]; } } ssden = dd * ss - ds * ds; iterc = 0; densav = zero; /* Begin the iteration by overwriting S with a vector that has the */ /* required length and direction. */ L70: ++iterc; if (ssden < 0) return NLOPT_ROUNDOFF_LIMITED; temp = one / sqrt(ssden); xoptd = zero; xopts = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { s[i__] = temp * (dd * s[i__] - ds * d__[i__]); xoptd += xopt[i__] * d__[i__]; /* L80: */ if (nlopt_isinf(s[i__])) return NLOPT_ROUNDOFF_LIMITED; xopts += xopt[i__] * s[i__]; } /* Set the coefficients of the first two terms of BETA. */ tempa = half * xoptd * xoptd; tempb = half * xopts * xopts; den[0] = dd * (xoptsq + half * dd) + tempa + tempb; den[1] = two * xoptd * dd; den[2] = two * xopts * dd; den[3] = tempa - tempb; den[4] = xoptd * xopts; for (i__ = 6; i__ <= 9; ++i__) { /* L90: */ den[i__ - 1] = zero; } /* Put the coefficients of Wcheck in WVEC. */ i__2 = *npt; for (k = 1; k <= i__2; ++k) { tempa = zero; tempb = zero; tempc = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tempa += xpt[k + i__ * xpt_dim1] * d__[i__]; tempb += xpt[k + i__ * xpt_dim1] * s[i__]; /* L100: */ tempc += xpt[k + i__ * xpt_dim1] * xopt[i__]; } wvec[k + wvec_dim1] = quart * (tempa * tempa + tempb * tempb); wvec[k + (wvec_dim1 << 1)] = tempa * tempc; wvec[k + wvec_dim1 * 3] = tempb * tempc; wvec[k + (wvec_dim1 << 2)] = quart * (tempa * tempa - tempb * tempb); /* L110: */ wvec[k + wvec_dim1 * 5] = half * tempa * tempb; } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ip = i__ + *npt; wvec[ip + wvec_dim1] = zero; wvec[ip + (wvec_dim1 << 1)] = d__[i__]; wvec[ip + wvec_dim1 * 3] = s[i__]; wvec[ip + (wvec_dim1 << 2)] = zero; /* L120: */ wvec[ip + wvec_dim1 * 5] = zero; } /* Put the coefficients of THETA*Wcheck in PROD. */ for (jc = 1; jc <= 5; ++jc) { nw = *npt; if (jc == 2 || jc == 3) { nw = *ndim; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L130: */ prod[k + jc * prod_dim1] = zero; } i__2 = nptm; for (j = 1; j <= i__2; ++j) { sum = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L140: */ sum += zmat[k + j * zmat_dim1] * wvec[k + jc * wvec_dim1]; } if (j < *idz) { sum = -sum; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L150: */ prod[k + jc * prod_dim1] += sum * zmat[k + j * zmat_dim1]; } } if (nw == *ndim) { i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L160: */ sum += bmat[k + j * bmat_dim1] * wvec[*npt + j + jc * wvec_dim1]; } /* L170: */ prod[k + jc * prod_dim1] += sum; } } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = zero; i__2 = nw; for (i__ = 1; i__ <= i__2; ++i__) { /* L180: */ sum += bmat[i__ + j * bmat_dim1] * wvec[i__ + jc * wvec_dim1]; } /* L190: */ prod[*npt + j + jc * prod_dim1] = sum; } } /* Include in DEN the part of BETA that depends on THETA. */ i__1 = *ndim; for (k = 1; k <= i__1; ++k) { sum = zero; for (i__ = 1; i__ <= 5; ++i__) { par[i__ - 1] = half * prod[k + i__ * prod_dim1] * wvec[k + i__ * wvec_dim1]; /* L200: */ sum += par[i__ - 1]; } den[0] = den[0] - par[0] - sum; tempa = prod[k + prod_dim1] * wvec[k + (wvec_dim1 << 1)] + prod[k + ( prod_dim1 << 1)] * wvec[k + wvec_dim1]; tempb = prod[k + (prod_dim1 << 1)] * wvec[k + (wvec_dim1 << 2)] + prod[k + (prod_dim1 << 2)] * wvec[k + (wvec_dim1 << 1)]; tempc = prod[k + prod_dim1 * 3] * wvec[k + wvec_dim1 * 5] + prod[k + prod_dim1 * 5] * wvec[k + wvec_dim1 * 3]; den[1] = den[1] - tempa - half * (tempb + tempc); den[5] -= half * (tempb - tempc); tempa = prod[k + prod_dim1] * wvec[k + wvec_dim1 * 3] + prod[k + prod_dim1 * 3] * wvec[k + wvec_dim1]; tempb = prod[k + (prod_dim1 << 1)] * wvec[k + wvec_dim1 * 5] + prod[k + prod_dim1 * 5] * wvec[k + (wvec_dim1 << 1)]; tempc = prod[k + prod_dim1 * 3] * wvec[k + (wvec_dim1 << 2)] + prod[k + (prod_dim1 << 2)] * wvec[k + wvec_dim1 * 3]; den[2] = den[2] - tempa - half * (tempb - tempc); den[6] -= half * (tempb + tempc); tempa = prod[k + prod_dim1] * wvec[k + (wvec_dim1 << 2)] + prod[k + ( prod_dim1 << 2)] * wvec[k + wvec_dim1]; den[3] = den[3] - tempa - par[1] + par[2]; tempa = prod[k + prod_dim1] * wvec[k + wvec_dim1 * 5] + prod[k + prod_dim1 * 5] * wvec[k + wvec_dim1]; tempb = prod[k + (prod_dim1 << 1)] * wvec[k + wvec_dim1 * 3] + prod[k + prod_dim1 * 3] * wvec[k + (wvec_dim1 << 1)]; den[4] = den[4] - tempa - half * tempb; den[7] = den[7] - par[3] + par[4]; tempa = prod[k + (prod_dim1 << 2)] * wvec[k + wvec_dim1 * 5] + prod[k + prod_dim1 * 5] * wvec[k + (wvec_dim1 << 2)]; /* L210: */ den[8] -= half * tempa; } /* Extend DEN so that it holds all the coefficients of DENOM. */ sum = zero; for (i__ = 1; i__ <= 5; ++i__) { /* Computing 2nd power */ d__1 = prod[*knew + i__ * prod_dim1]; par[i__ - 1] = half * (d__1 * d__1); /* L220: */ sum += par[i__ - 1]; } denex[0] = alpha * den[0] + par[0] + sum; tempa = two * prod[*knew + prod_dim1] * prod[*knew + (prod_dim1 << 1)]; tempb = prod[*knew + (prod_dim1 << 1)] * prod[*knew + (prod_dim1 << 2)]; tempc = prod[*knew + prod_dim1 * 3] * prod[*knew + prod_dim1 * 5]; denex[1] = alpha * den[1] + tempa + tempb + tempc; denex[5] = alpha * den[5] + tempb - tempc; tempa = two * prod[*knew + prod_dim1] * prod[*knew + prod_dim1 * 3]; tempb = prod[*knew + (prod_dim1 << 1)] * prod[*knew + prod_dim1 * 5]; tempc = prod[*knew + prod_dim1 * 3] * prod[*knew + (prod_dim1 << 2)]; denex[2] = alpha * den[2] + tempa + tempb - tempc; denex[6] = alpha * den[6] + tempb + tempc; tempa = two * prod[*knew + prod_dim1] * prod[*knew + (prod_dim1 << 2)]; denex[3] = alpha * den[3] + tempa + par[1] - par[2]; tempa = two * prod[*knew + prod_dim1] * prod[*knew + prod_dim1 * 5]; denex[4] = alpha * den[4] + tempa + prod[*knew + (prod_dim1 << 1)] * prod[ *knew + prod_dim1 * 3]; denex[7] = alpha * den[7] + par[3] - par[4]; denex[8] = alpha * den[8] + prod[*knew + (prod_dim1 << 2)] * prod[*knew + prod_dim1 * 5]; /* Seek the value of the angle that maximizes the modulus of DENOM. */ sum = denex[0] + denex[1] + denex[3] + denex[5] + denex[7]; denold = sum; denmax = sum; isave = 0; iu = 49; temp = twopi / (double) (iu + 1); par[0] = one; i__1 = iu; for (i__ = 1; i__ <= i__1; ++i__) { angle = (double) i__ * temp; par[1] = cos(angle); par[2] = sin(angle); for (j = 4; j <= 8; j += 2) { par[j - 1] = par[1] * par[j - 3] - par[2] * par[j - 2]; /* L230: */ par[j] = par[1] * par[j - 2] + par[2] * par[j - 3]; } sumold = sum; sum = zero; for (j = 1; j <= 9; ++j) { /* L240: */ sum += denex[j - 1] * par[j - 1]; } if (fabs(sum) > fabs(denmax)) { denmax = sum; isave = i__; tempa = sumold; } else if (i__ == isave + 1) { tempb = sum; } /* L250: */ } if (isave == 0) { tempa = sum; } if (isave == iu) { tempb = denold; } step = zero; if (tempa != tempb) { tempa -= denmax; tempb -= denmax; step = half * (tempa - tempb) / (tempa + tempb); } angle = temp * ((double) isave + step); /* Calculate the new parameters of the denominator, the new VLAG vector */ /* and the new D. Then test for convergence. */ par[1] = cos(angle); par[2] = sin(angle); for (j = 4; j <= 8; j += 2) { par[j - 1] = par[1] * par[j - 3] - par[2] * par[j - 2]; /* L260: */ par[j] = par[1] * par[j - 2] + par[2] * par[j - 3]; } *beta = zero; denmax = zero; for (j = 1; j <= 9; ++j) { *beta += den[j - 1] * par[j - 1]; /* L270: */ denmax += denex[j - 1] * par[j - 1]; } i__1 = *ndim; for (k = 1; k <= i__1; ++k) { vlag[k] = zero; for (j = 1; j <= 5; ++j) { /* L280: */ vlag[k] += prod[k + j * prod_dim1] * par[j - 1]; } } tau = vlag[*knew]; dd = zero; tempa = zero; tempb = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = par[1] * d__[i__] + par[2] * s[i__]; w[i__] = xopt[i__] + d__[i__]; /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; tempa += d__[i__] * w[i__]; /* L290: */ tempb += w[i__] * w[i__]; } if (iterc >= *n) { goto L340; } if (iterc > 1) { densav = MAX2(densav,denold); } if (fabs(denmax) <= fabs(densav) * 1.1) { goto L340; } densav = denmax; /* Set S to half the gradient of the denominator with respect to D. */ /* Then branch for the next iteration. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = tempa * xopt[i__] + tempb * d__[i__] - vlag[*npt + i__]; /* L300: */ s[i__] = tau * bmat[*knew + i__ * bmat_dim1] + alpha * temp; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L310: */ sum += xpt[k + j * xpt_dim1] * w[j]; } if (nlopt_isinf(tau * w[*n + k]) || nlopt_isinf(alpha * vlag[k])) return NLOPT_ROUNDOFF_LIMITED; temp = (tau * w[*n + k] - alpha * vlag[k]) * sum; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L320: */ s[i__] += temp * xpt[k + i__ * xpt_dim1]; } } ss = zero; ds = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing 2nd power */ d__1 = s[i__]; ss += d__1 * d__1; /* L330: */ ds += d__[i__] * s[i__]; } ssden = dd * ss - ds * ds; if (ssden >= dd * 1e-8 * ss) { goto L70; } /* Set the vector W before the RETURN from the subroutine. */ L340: /* SGJ, 2008: crude hack: truncate d to [lb,ub] bounds if given */ if (lb && ub) { for (k = 1; k <= *n; ++k) { if (d__[k] > ub[k-1] - xbase[k-1] - xopt[k]) d__[k] = ub[k-1] - xbase[k-1] - xopt[k]; else if (d__[k] < lb[k-1] - xbase[k-1] - xopt[k]) d__[k] = lb[k-1] - xbase[k-1] - xopt[k]; } } i__2 = *ndim; for (k = 1; k <= i__2; ++k) { w[k] = zero; for (j = 1; j <= 5; ++j) { /* L350: */ w[k] += wvec[k + j * wvec_dim1] * par[j - 1]; } } vlag[*kopt] += one; return NLOPT_SUCCESS; } /* bigden_ */ /*************************************************************************/ /* biglag.f */ typedef struct { int npt, ndim, iter; double *hcol, *xpt, *bmat, *xopt; int flipsign; } lag_data; /* the Lagrange function, whose absolute value biglag maximizes */ static double lag(unsigned n, const double *dx, double *grad, void *data) { lag_data *d = (lag_data *) data; int i, npt = d->npt, ndim = d->ndim; unsigned j; const double *hcol = d->hcol, *xpt = d->xpt, *bmat = d->bmat, *xopt = d->xopt; double val = 0; for (j = 0; j < n; ++j) { val += bmat[j * ndim] * (xopt[j] + dx[j]); if (grad) grad[j] = bmat[j * ndim]; } for (i = 0; i < npt; ++i) { double dot = 0; for (j = 0; j < n; ++j) dot += xpt[i + j * npt] * (xopt[j] + dx[j]); val += 0.5 * hcol[i] * (dot * dot); dot *= hcol[i]; if (grad) for (j = 0; j < n; ++j) grad[j] += dot * xpt[i + j * npt]; } if (d->flipsign) { val = -val; if (grad) for (j = 0; j < n; ++j) grad[j] = -grad[j]; } d->iter++; return val; } static nlopt_result biglag_(int *n, int *npt, double *xopt, double *xpt, double *bmat, double *zmat, int *idz, int *ndim, int *knew, double *delta, double *d__, double *alpha, double *hcol, double *gc, double *gd, double *s, double *w, const double *xbase, const double *lb, const double *ub) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2; double d__1; /* Local variables */ int i__, j, k; double dd, gg; int iu; double sp, ss, cf1, cf2, cf3, cf4, cf5, dhd, cth, one, tau, sth, sum, half, temp, step; int nptm; double zero, angle, scale, denom; int iterc, isave; /* Note: tempa is initialized below, initialization here is only used to avoid 'maybe-uninitialized' warning */ double delsq, tempa = 0.0, tempb = 0.0, twopi, taubeg, tauold, taumax; /* N is the number of variables. */ /* NPT is the number of interpolation equations. */ /* XOPT is the best interpolation point so far. */ /* XPT contains the coordinates of the current interpolation points. */ /* BMAT provides the last N columns of H. */ /* ZMAT and IDZ give a factorization of the first NPT by NPT submatrix of H. */ /* NDIM is the first dimension of BMAT and has the value NPT+N. */ /* KNEW is the index of the interpolation point that is going to be moved. */ /* DELTA is the current trust region bound. */ /* D will be set to the step from XOPT to the new point. */ /* ALPHA will be set to the KNEW-th diagonal element of the H matrix. */ /* HCOL, GC, GD, S and W will be used for working space. */ /* The step D is calculated in a way that attempts to maximize the modulus */ /* of LFUNC(XOPT+D), subject to the bound ||D|| .LE. DELTA, where LFUNC is */ /* the KNEW-th Lagrange function. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --xopt; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --d__; --hcol; --gc; --gd; --s; --w; /* Function Body */ half = .5; one = 1.; zero = 0.; twopi = atan(one) * 8.; delsq = *delta * *delta; nptm = *npt - *n - 1; /* Set the first NPT components of HCOL to the leading elements of the */ /* KNEW-th column of H. */ iterc = 0; i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L10: */ hcol[k] = zero; } i__1 = nptm; for (j = 1; j <= i__1; ++j) { temp = zmat[*knew + j * zmat_dim1]; if (j < *idz) { temp = -temp; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L20: */ hcol[k] += temp * zmat[k + j * zmat_dim1]; if (nlopt_isinf(hcol[k])) return NLOPT_ROUNDOFF_LIMITED; } } *alpha = hcol[*knew]; /* Set the unscaled initial direction D. Form the gradient of LFUNC at */ /* XOPT, and multiply D by the second derivative matrix of LFUNC. */ dd = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { d__[i__] = xpt[*knew + i__ * xpt_dim1] - xopt[i__]; gc[i__] = bmat[*knew + i__ * bmat_dim1]; gd[i__] = zero; /* L30: */ /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { temp = zero; sum = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp += xpt[k + j * xpt_dim1] * xopt[j]; /* L40: */ sum += xpt[k + j * xpt_dim1] * d__[j]; } temp = hcol[k] * temp; sum = hcol[k] * sum; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { gc[i__] += temp * xpt[k + i__ * xpt_dim1]; /* L50: */ gd[i__] += sum * xpt[k + i__ * xpt_dim1]; } } /* Scale D and GD, with a sign change if required. Set S to another */ /* vector in the initial two dimensional subspace. */ gg = zero; sp = zero; dhd = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = gc[i__]; gg += d__1 * d__1; sp += d__[i__] * gc[i__]; /* L60: */ dhd += d__[i__] * gd[i__]; } scale = *delta / sqrt(dd); if (sp * dhd < zero) { scale = -scale; } temp = zero; if (sp * sp > dd * .99 * gg) { temp = one; } tau = scale * (fabs(sp) + half * scale * fabs(dhd)); if (gg * delsq < tau * .01 * tau) { temp = one; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = scale * d__[i__]; gd[i__] = scale * gd[i__]; /* L70: */ s[i__] = gc[i__] + temp * gd[i__]; } if (lb && ub) { double minf, *dlb, *dub, *xtol; nlopt_opt opt; nlopt_result ret; lag_data ld; ld.npt = *npt; ld.ndim = *ndim; ld.iter = 0; ld.hcol = &hcol[1]; ld.xpt = &xpt[1 + 1 * xpt_dim1]; ld.bmat = &bmat[*knew + 1 * bmat_dim1]; ld.xopt = &xopt[1]; ld.flipsign = 0; dlb = &gc[1]; dub = &gd[1]; xtol = &s[1]; /* make sure rounding errors don't push initial |d| > delta */ for (j = 1; j <= *n; ++j) d__[j] *= 0.99999; for (j = 0; j < *n; ++j) { dlb[j] = -(dub[j] = *delta); if (dlb[j] < lb[j] - xbase[j] - xopt[j+1]) dlb[j] = lb[j] - xbase[j] - xopt[j+1]; if (dub[j] > ub[j] - xbase[j] - xopt[j+1]) dub[j] = ub[j] - xbase[j] - xopt[j+1]; if (dlb[j] > 0) dlb[j] = 0; if (dub[j] < 0) dub[j] = 0; if (d__[j+1] < dlb[j]) d__[j+1] = dlb[j]; else if (d__[j+1] > dub[j]) d__[j+1] = dub[j]; xtol[j] = 1e-5 * *delta; } ld.flipsign = lag(*n, &d__[1], 0, &ld) > 0; /* maximize if > 0 */ opt = nlopt_create(NLOPT_LD_MMA, *n); nlopt_set_min_objective(opt, lag, &ld); nlopt_add_inequality_constraint(opt, rho_constraint, delta, 0.0); nlopt_set_lower_bounds(opt, dlb); nlopt_set_upper_bounds(opt, dub); nlopt_set_xtol_abs(opt, xtol); nlopt_set_maxeval(opt, 1000); ret = nlopt_optimize(opt, &d__[1], &minf); nlopt_destroy(opt); return ret; } /* Begin the iteration by overwriting S with a vector that has the */ /* required length and direction, except that termination occurs if */ /* the given D and S are nearly parallel. */ L80: ++iterc; dd = zero; sp = zero; ss = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = d__[i__]; dd += d__1 * d__1; sp += d__[i__] * s[i__]; /* L90: */ /* Computing 2nd power */ d__1 = s[i__]; ss += d__1 * d__1; } temp = dd * ss - sp * sp; if (temp <= dd * 1e-8 * ss) { goto L160; } denom = sqrt(temp); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s[i__] = (dd * s[i__] - sp * d__[i__]) / denom; /* L100: */ w[i__] = zero; } /* Calculate the coefficients of the objective function on the circle, */ /* beginning with the multiplication of S by the second derivative matrix. */ i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L110: */ sum += xpt[k + j * xpt_dim1] * s[j]; } sum = hcol[k] * sum; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L120: */ w[i__] += sum * xpt[k + i__ * xpt_dim1]; } } cf1 = zero; cf2 = zero; cf3 = zero; cf4 = zero; cf5 = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { cf1 += s[i__] * w[i__]; cf2 += d__[i__] * gc[i__]; cf3 += s[i__] * gc[i__]; cf4 += d__[i__] * gd[i__]; /* L130: */ cf5 += s[i__] * gd[i__]; } cf1 = half * cf1; cf4 = half * cf4 - cf1; /* Seek the value of the angle that maximizes the modulus of TAU. */ taubeg = cf1 + cf2 + cf4; taumax = taubeg; tauold = taubeg; isave = 0; iu = 49; temp = twopi / (double) (iu + 1); i__2 = iu; for (i__ = 1; i__ <= i__2; ++i__) { angle = (double) i__ * temp; cth = cos(angle); sth = sin(angle); tau = cf1 + (cf2 + cf4 * cth) * cth + (cf3 + cf5 * cth) * sth; if (fabs(tau) > fabs(taumax)) { taumax = tau; isave = i__; tempa = tauold; } else if (i__ == isave + 1) { tempb = tau; } /* L140: */ tauold = tau; } if (isave == 0) { tempa = tau; } if (isave == iu) { tempb = taubeg; } step = zero; if (tempa != tempb) { tempa -= taumax; tempb -= taumax; step = half * (tempa - tempb) / (tempa + tempb); } angle = temp * ((double) isave + step); /* Calculate the new D and GD. Then test for convergence. */ cth = cos(angle); sth = sin(angle); tau = cf1 + (cf2 + cf4 * cth) * cth + (cf3 + cf5 * cth) * sth; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { d__[i__] = cth * d__[i__] + sth * s[i__]; gd[i__] = cth * gd[i__] + sth * w[i__]; /* L150: */ s[i__] = gc[i__] + gd[i__]; } if (fabs(tau) <= fabs(taubeg) * 1.1) { goto L160; } if (iterc < *n) { goto L80; } L160: return NLOPT_SUCCESS; } /* biglag_ */ /*************************************************************************/ /* update.f */ static void update_(int *n, int *npt, double *bmat, double *zmat, int *idz, int *ndim, double *vlag, double *beta, int *knew, double *w) { /* System generated locals */ int bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2; double d__1, d__2; /* Local variables */ int i__, j, ja, jb, jl, jp; double one, tau, temp; int nptm; double zero; int iflag; double scala, scalb_, alpha, denom, tempa, tempb = 0.0, tausq; /* The arrays BMAT and ZMAT with IDZ are updated, in order to shift the */ /* interpolation point that has index KNEW. On entry, VLAG contains the */ /* components of the vector Theta*Wcheck+e_b of the updating formula */ /* (6.11), and BETA holds the value of the parameter that has this name. */ /* The vector W is used for working space. */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --vlag; --w; /* Function Body */ one = 1.; zero = 0.; nptm = *npt - *n - 1; /* Apply the rotations that put zeros in the KNEW-th row of ZMAT. */ jl = 1; i__1 = nptm; for (j = 2; j <= i__1; ++j) { if (j == *idz) { jl = *idz; } else if (zmat[*knew + j * zmat_dim1] != zero) { /* Computing 2nd power */ d__1 = zmat[*knew + jl * zmat_dim1]; /* Computing 2nd power */ d__2 = zmat[*knew + j * zmat_dim1]; temp = sqrt(d__1 * d__1 + d__2 * d__2); tempa = zmat[*knew + jl * zmat_dim1] / temp; tempb = zmat[*knew + j * zmat_dim1] / temp; i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { temp = tempa * zmat[i__ + jl * zmat_dim1] + tempb * zmat[i__ + j * zmat_dim1]; zmat[i__ + j * zmat_dim1] = tempa * zmat[i__ + j * zmat_dim1] - tempb * zmat[i__ + jl * zmat_dim1]; /* L10: */ zmat[i__ + jl * zmat_dim1] = temp; } zmat[*knew + j * zmat_dim1] = zero; } /* L20: */ } /* Put the first NPT components of the KNEW-th column of HLAG into W, */ /* and calculate the parameters of the updating formula. */ tempa = zmat[*knew + zmat_dim1]; if (*idz >= 2) { tempa = -tempa; } if (jl > 1) { tempb = zmat[*knew + jl * zmat_dim1]; } i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { w[i__] = tempa * zmat[i__ + zmat_dim1]; if (jl > 1) { w[i__] += tempb * zmat[i__ + jl * zmat_dim1]; } /* L30: */ } alpha = w[*knew]; tau = vlag[*knew]; tausq = tau * tau; denom = alpha * *beta + tausq; vlag[*knew] -= one; /* Complete the updating of ZMAT when there is only one nonzero element */ /* in the KNEW-th row of the new matrix ZMAT, but, if IFLAG is set to one, */ /* then the first column of ZMAT will be exchanged with another one later. */ iflag = 0; if (jl == 1) { temp = sqrt((fabs(denom))); tempb = tempa / temp; tempa = tau / temp; i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { /* L40: */ zmat[i__ + zmat_dim1] = tempa * zmat[i__ + zmat_dim1] - tempb * vlag[i__]; } if (*idz == 1 && temp < zero) { *idz = 2; } if (*idz >= 2 && temp >= zero) { iflag = 1; } } else { /* Complete the updating of ZMAT in the alternative case. */ ja = 1; if (*beta >= zero) { ja = jl; } jb = jl + 1 - ja; temp = zmat[*knew + jb * zmat_dim1] / denom; tempa = temp * *beta; tempb = temp * tau; temp = zmat[*knew + ja * zmat_dim1]; scala = one / sqrt(fabs(*beta) * temp * temp + tausq); scalb_ = scala * sqrt((fabs(denom))); i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { zmat[i__ + ja * zmat_dim1] = scala * (tau * zmat[i__ + ja * zmat_dim1] - temp * vlag[i__]); /* L50: */ zmat[i__ + jb * zmat_dim1] = scalb_ * (zmat[i__ + jb * zmat_dim1] - tempa * w[i__] - tempb * vlag[i__]); } if (denom <= zero) { if (*beta < zero) { ++(*idz); } if (*beta >= zero) { iflag = 1; } } } /* IDZ is reduced in the following case, and usually the first column */ /* of ZMAT is exchanged with a later one. */ if (iflag == 1) { --(*idz); i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { temp = zmat[i__ + zmat_dim1]; zmat[i__ + zmat_dim1] = zmat[i__ + *idz * zmat_dim1]; /* L60: */ zmat[i__ + *idz * zmat_dim1] = temp; } } /* Finally, update the matrix BMAT. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { jp = *npt + j; w[jp] = bmat[*knew + j * bmat_dim1]; tempa = (alpha * vlag[jp] - tau * w[jp]) / denom; tempb = (-(*beta) * w[jp] - tau * vlag[jp]) / denom; i__2 = jp; for (i__ = 1; i__ <= i__2; ++i__) { bmat[i__ + j * bmat_dim1] = bmat[i__ + j * bmat_dim1] + tempa * vlag[i__] + tempb * w[i__]; if (i__ > *npt) { bmat[jp + (i__ - *npt) * bmat_dim1] = bmat[i__ + j * bmat_dim1]; } /* L70: */ } } return; } /* update_ */ /*************************************************************************/ /* newuob.f */ static nlopt_result newuob_(int *n, int *npt, double *x, double *rhobeg, const double *lb, const double *ub, nlopt_stopping *stop, double *minf, newuoa_func calfun, void *calfun_data, double *xbase, double *xopt, double *xnew, double *xpt, double *fval, double *gq, double *hq, double *pq, double *bmat, double *zmat, int *ndim, double *d__, double *vlag, double *w) { /* System generated locals */ int xpt_dim1, xpt_offset, bmat_dim1, bmat_offset, zmat_dim1, zmat_offset, i__1, i__2, i__3; double d__1, d__2, d__3; /* Local variables */ double f = 0.0; int i__, j, k, ih, nf, nh, ip, jp; double dx; int np, nfm; double one; int idz; double dsq, rho = 0.0; int ipt = 0, jpt = 0; double sum, fbeg = 0.0, diff, half, beta; int nfmm; double gisq; int knew; double temp, suma, sumb, fopt = HUGE_VAL, bsum, gqsq; int kopt, nptm; double zero, xipt = 0.0, xjpt = 0.0, sumz, diffa = 0.0, diffb = 0.0, diffc = 0.0, hdiag, alpha = 0.0, delta, recip, reciq, fsave; int ksave, nfsav = 0, itemp; double dnorm = 0.0, ratio = 0.0, dstep, tenth, vquad; int ktemp; double tempq; int itest = 0; double rhosq; double detrat, crvmin = 0.0; double distsq; double xoptsq = 0.0; double rhoend; nlopt_result rc = NLOPT_SUCCESS, rc2; /* SGJ, 2008: compute rhoend from NLopt stop info */ rhoend = stop->xtol_rel * (*rhobeg); if (stop->xtol_abs) for (j = 0; j < *n; ++j) if (rhoend < stop->xtol_abs[j]) rhoend = stop->xtol_abs[j]; /* The arguments N, NPT, X, RHOBEG, RHOEND, IPRINT and MAXFUN are identical */ /* to the corresponding arguments in SUBROUTINE NEWUOA. */ /* XBASE will hold a shift of origin that should reduce the contributions */ /* from rounding errors to values of the model and Lagrange functions. */ /* XOPT will be set to the displacement from XBASE of the vector of */ /* variables that provides the least calculated F so far. */ /* XNEW will be set to the displacement from XBASE of the vector of */ /* variables for the current calculation of F. */ /* XPT will contain the interpolation point coordinates relative to XBASE. */ /* FVAL will hold the values of F at the interpolation points. */ /* GQ will hold the gradient of the quadratic model at XBASE. */ /* HQ will hold the explicit second derivatives of the quadratic model. */ /* PQ will contain the parameters of the implicit second derivatives of */ /* the quadratic model. */ /* BMAT will hold the last N columns of H. */ /* ZMAT will hold the factorization of the leading NPT by NPT submatrix of */ /* H, this factorization being ZMAT times Diag(DZ) times ZMAT^T, where */ /* the elements of DZ are plus or minus one, as specified by IDZ. */ /* NDIM is the first dimension of BMAT and has the value NPT+N. */ /* D is reserved for trial steps from XOPT. */ /* VLAG will contain the values of the Lagrange functions at a new point X. */ /* They are part of a product that requires VLAG to be of length NDIM. */ /* The array W will be used for working space. Its length must be at least */ /* 10*NDIM = 10*(NPT+N). */ /* Set some constants. */ /* Parameter adjustments */ zmat_dim1 = *npt; zmat_offset = 1 + zmat_dim1; zmat -= zmat_offset; xpt_dim1 = *npt; xpt_offset = 1 + xpt_dim1; xpt -= xpt_offset; --x; --xbase; --xopt; --xnew; --fval; --gq; --hq; --pq; bmat_dim1 = *ndim; bmat_offset = 1 + bmat_dim1; bmat -= bmat_offset; --d__; --vlag; --w; /* Function Body */ half = .5; one = 1.; tenth = .1; zero = 0.; np = *n + 1; nh = *n * np / 2; nptm = *npt - np; /* Set the initial elements of XPT, BMAT, HQ, PQ and ZMAT to zero. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { xbase[j] = x[j]; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L10: */ xpt[k + j * xpt_dim1] = zero; } i__2 = *ndim; for (i__ = 1; i__ <= i__2; ++i__) { /* L20: */ bmat[i__ + j * bmat_dim1] = zero; } } i__2 = nh; for (ih = 1; ih <= i__2; ++ih) { /* L30: */ hq[ih] = zero; } i__2 = *npt; for (k = 1; k <= i__2; ++k) { pq[k] = zero; i__1 = nptm; for (j = 1; j <= i__1; ++j) { /* L40: */ zmat[k + j * zmat_dim1] = zero; } } /* Begin the initialization procedure. NF becomes one more than the number */ /* of function values so far. The coordinates of the displacement of the */ /* next initial interpolation point from XBASE are set in XPT(NF,.). */ rhosq = *rhobeg * *rhobeg; recip = one / rhosq; reciq = sqrt(half) / rhosq; nf = 0; L50: nfm = nf; nfmm = nf - *n; ++nf; if (nfm <= *n << 1) { if (nfm >= 1 && nfm <= *n) { xpt[nf + nfm * xpt_dim1] = *rhobeg; } else if (nfm > *n) { xpt[nf + nfmm * xpt_dim1] = -(*rhobeg); } } else { itemp = (nfmm - 1) / *n; jpt = nfm - itemp * *n - *n; ipt = jpt + itemp; if (ipt > *n) { itemp = jpt; jpt = ipt - *n; ipt = itemp; } xipt = *rhobeg; if (fval[ipt + np] < fval[ipt + 1]) { xipt = -xipt; } xjpt = *rhobeg; if (fval[jpt + np] < fval[jpt + 1]) { xjpt = -xjpt; } xpt[nf + ipt * xpt_dim1] = xipt; xpt[nf + jpt * xpt_dim1] = xjpt; } /* Calculate the next value of F, label 70 being reached immediately */ /* after this calculation. The least function value so far and its index */ /* are required. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L60: */ x[j] = xpt[nf + j * xpt_dim1] + xbase[j]; } if (lb && ub) { /* SGJ, 2008: make sure we are within bounds */ for (j = 1; j <= i__1; ++j) { if (x[j] < lb[j-1]) x[j] = lb[j-1]; else if (x[j] > ub[j-1]) x[j] = ub[j-1]; } } goto L310; L70: fval[nf] = f; if (nf == 1) { fbeg = f; fopt = f; kopt = 1; } else if (f < fopt) { fopt = f; kopt = nf; } /* Set the nonzero initial elements of BMAT and the quadratic model in */ /* the cases when NF is at most 2*N+1. */ if (nfm <= *n << 1) { if (nfm >= 1 && nfm <= *n) { gq[nfm] = (f - fbeg) / *rhobeg; if (*npt < nf + *n) { bmat[nfm * bmat_dim1 + 1] = -one / *rhobeg; bmat[nf + nfm * bmat_dim1] = one / *rhobeg; bmat[*npt + nfm + nfm * bmat_dim1] = -half * rhosq; } } else if (nfm > *n) { bmat[nf - *n + nfmm * bmat_dim1] = half / *rhobeg; bmat[nf + nfmm * bmat_dim1] = -half / *rhobeg; zmat[nfmm * zmat_dim1 + 1] = -reciq - reciq; zmat[nf - *n + nfmm * zmat_dim1] = reciq; zmat[nf + nfmm * zmat_dim1] = reciq; ih = nfmm * (nfmm + 1) / 2; temp = (fbeg - f) / *rhobeg; hq[ih] = (gq[nfmm] - temp) / *rhobeg; gq[nfmm] = half * (gq[nfmm] + temp); } /* Set the off-diagonal second derivatives of the Lagrange functions and */ /* the initial quadratic model. */ } else { ih = ipt * (ipt - 1) / 2 + jpt; if (xipt < zero) { ipt += *n; } if (xjpt < zero) { jpt += *n; } zmat[nfmm * zmat_dim1 + 1] = recip; zmat[nf + nfmm * zmat_dim1] = recip; zmat[ipt + 1 + nfmm * zmat_dim1] = -recip; zmat[jpt + 1 + nfmm * zmat_dim1] = -recip; hq[ih] = (fbeg - fval[ipt + 1] - fval[jpt + 1] + f) / (xipt * xjpt); } if (nf < *npt) { goto L50; } /* Begin the iterative procedure, because the initial model is complete. */ rho = *rhobeg; delta = rho; idz = 1; diffa = zero; diffb = zero; itest = 0; xoptsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xopt[i__] = xpt[kopt + i__ * xpt_dim1]; /* L80: */ /* Computing 2nd power */ d__1 = xopt[i__]; xoptsq += d__1 * d__1; } L90: nfsav = nf; /* Generate the next trust region step and test its length. Set KNEW */ /* to -1 if the purpose of the next F will be to improve the model. */ L100: knew = 0; rc2 = trsapp_(n, npt, &xopt[1], &xpt[xpt_offset], &gq[1], &hq[1], &pq[1], & delta, &d__[1], &w[1], &w[np], &w[np + *n], &w[np + (*n << 1)], & crvmin, &xbase[1], lb, ub); if (rc2 < 0) { rc = rc2; goto L530; } dsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L110: */ /* Computing 2nd power */ d__1 = d__[i__]; dsq += d__1 * d__1; } /* Computing MIN */ d__1 = delta, d__2 = sqrt(dsq); dnorm = MIN2(d__1,d__2); if (dnorm < half * rho) { knew = -1; delta = tenth * delta; ratio = -1.; if (delta <= rho * 1.5) { delta = rho; } if (nf <= nfsav + 2) { goto L460; } temp = crvmin * .125 * rho * rho; /* Computing MAX */ d__1 = MAX2(diffa,diffb); if (temp <= MAX2(d__1,diffc)) { goto L460; } goto L490; } /* Shift XBASE if XOPT may be too far from XBASE. First make the changes */ /* to BMAT that do not depend on ZMAT. */ L120: if (dsq <= xoptsq * .001) { tempq = xoptsq * .25; i__1 = *npt; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L130: */ sum += xpt[k + i__ * xpt_dim1] * xopt[i__]; } temp = pq[k] * sum; sum -= half * xoptsq; w[*npt + k] = sum; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { gq[i__] += temp * xpt[k + i__ * xpt_dim1]; xpt[k + i__ * xpt_dim1] -= half * xopt[i__]; vlag[i__] = bmat[k + i__ * bmat_dim1]; w[i__] = sum * xpt[k + i__ * xpt_dim1] + tempq * xopt[i__]; ip = *npt + i__; i__3 = i__; for (j = 1; j <= i__3; ++j) { /* L140: */ bmat[ip + j * bmat_dim1] = bmat[ip + j * bmat_dim1] + vlag[i__] * w[j] + w[i__] * vlag[j]; } } } /* Then the revisions of BMAT that depend on ZMAT are calculated. */ i__3 = nptm; for (k = 1; k <= i__3; ++k) { sumz = zero; i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { sumz += zmat[i__ + k * zmat_dim1]; /* L150: */ w[i__] = w[*npt + i__] * zmat[i__ + k * zmat_dim1]; } i__2 = *n; for (j = 1; j <= i__2; ++j) { sum = tempq * sumz * xopt[j]; i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { /* L160: */ sum += w[i__] * xpt[i__ + j * xpt_dim1]; } vlag[j] = sum; if (k < idz) { sum = -sum; } i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { /* L170: */ bmat[i__ + j * bmat_dim1] += sum * zmat[i__ + k * zmat_dim1]; } } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ip = i__ + *npt; temp = vlag[i__]; if (k < idz) { temp = -temp; } i__2 = i__; for (j = 1; j <= i__2; ++j) { /* L180: */ bmat[ip + j * bmat_dim1] += temp * vlag[j]; } } } /* The following instructions complete the shift of XBASE, including */ /* the changes to the parameters of the quadratic model. */ ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { w[j] = zero; i__1 = *npt; for (k = 1; k <= i__1; ++k) { w[j] += pq[k] * xpt[k + j * xpt_dim1]; /* L190: */ xpt[k + j * xpt_dim1] -= half * xopt[j]; } i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; if (i__ < j) { gq[j] += hq[ih] * xopt[i__]; } gq[i__] += hq[ih] * xopt[j]; hq[ih] = hq[ih] + w[i__] * xopt[j] + xopt[i__] * w[j]; /* L200: */ bmat[*npt + i__ + j * bmat_dim1] = bmat[*npt + j + i__ * bmat_dim1]; } } i__1 = *n; for (j = 1; j <= i__1; ++j) { xbase[j] += xopt[j]; /* L210: */ xopt[j] = zero; } xoptsq = zero; } /* Pick the model step if KNEW is positive. A different choice of D */ /* may be made later, if the choice of D by BIGLAG causes substantial */ /* cancellation in DENOM. */ if (knew > 0) { rc2 = biglag_(n, npt, &xopt[1], &xpt[xpt_offset], &bmat[bmat_offset], &zmat[ zmat_offset], &idz, ndim, &knew, &dstep, &d__[1], &alpha, & vlag[1], &vlag[*npt + 1], &w[1], &w[np], &w[np + *n], &xbase[1], lb, ub); if (rc2 < 0) { rc = rc2; goto L530; } } /* Calculate VLAG and BETA for the current choice of D. The first NPT */ /* components of W_check will be held in W. */ i__1 = *npt; for (k = 1; k <= i__1; ++k) { suma = zero; sumb = zero; sum = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { suma += xpt[k + j * xpt_dim1] * d__[j]; sumb += xpt[k + j * xpt_dim1] * xopt[j]; /* L220: */ sum += bmat[k + j * bmat_dim1] * d__[j]; } w[k] = suma * (half * suma + sumb); /* L230: */ vlag[k] = sum; } beta = zero; i__1 = nptm; for (k = 1; k <= i__1; ++k) { sum = zero; i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { /* L240: */ sum += zmat[i__ + k * zmat_dim1] * w[i__]; } if (k < idz) { beta += sum * sum; sum = -sum; } else { beta -= sum * sum; } i__2 = *npt; for (i__ = 1; i__ <= i__2; ++i__) { /* L250: */ vlag[i__] += sum * zmat[i__ + k * zmat_dim1]; } } bsum = zero; dx = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { sum = zero; i__1 = *npt; for (i__ = 1; i__ <= i__1; ++i__) { /* L260: */ sum += w[i__] * bmat[i__ + j * bmat_dim1]; } bsum += sum * d__[j]; jp = *npt + j; i__1 = *n; for (k = 1; k <= i__1; ++k) { /* L270: */ sum += bmat[jp + k * bmat_dim1] * d__[k]; } vlag[jp] = sum; bsum += sum * d__[j]; /* L280: */ dx += d__[j] * xopt[j]; } beta = dx * dx + dsq * (xoptsq + dx + dx + half * dsq) + beta - bsum; vlag[kopt] += one; /* If KNEW is positive and if the cancellation in DENOM is unacceptable, */ /* then BIGDEN calculates an alternative model step, XNEW being used for */ /* working space. */ if (knew > 0) { /* Computing 2nd power */ d__1 = vlag[knew]; if (d__1 == 0) { rc = NLOPT_ROUNDOFF_LIMITED; goto L530; } temp = one + alpha * beta / (d__1 * d__1); if (fabs(temp) <= .8) { rc2 = bigden_(n, npt, &xopt[1], &xpt[xpt_offset], &bmat[bmat_offset], & zmat[zmat_offset], &idz, ndim, &kopt, &knew, &d__[1], &w[ 1], &vlag[1], &beta, &xnew[1], &w[*ndim + 1], &w[*ndim * 6 + 1], &xbase[1], lb, ub); if (rc2 < 0) { rc = rc2; goto L530; } } } /* Calculate the next value of the objective function. */ L290: i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { xnew[i__] = xopt[i__] + d__[i__]; /* L300: */ x[i__] = xbase[i__] + xnew[i__]; } if (lb && ub) { /* SGJ, 2008: make sure we are within bounds, since roundoff errors can push us slightly outside */ for (j = 1; j <= i__1; ++j) { if (x[j] < lb[j-1]) x[j] = lb[j-1]; else if (x[j] > ub[j-1]) x[j] = ub[j-1]; } } ++nf; L310: if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (*(stop->nevals_p) > 0) { if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; } if (rc != NLOPT_SUCCESS) goto L530; ++ *(stop->nevals_p); f = calfun(*n, &x[1], calfun_data); if (f < stop->minf_max) { rc = NLOPT_MINF_MAX_REACHED; goto L530; } if (nf <= *npt) { goto L70; } if (knew == -1) { goto L530; } /* Use the quadratic model to predict the change in F due to the step D, */ /* and set DIFF to the error of this prediction. */ vquad = zero; ih = 0; i__2 = *n; for (j = 1; j <= i__2; ++j) { vquad += d__[j] * gq[j]; i__1 = j; for (i__ = 1; i__ <= i__1; ++i__) { ++ih; temp = d__[i__] * xnew[j] + d__[j] * xopt[i__]; if (i__ == j) { temp = half * temp; } /* L340: */ vquad += temp * hq[ih]; } } i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L350: */ vquad += pq[k] * w[k]; } diff = f - fopt - vquad; diffc = diffb; diffb = diffa; diffa = fabs(diff); if (dnorm > rho) { nfsav = nf; } /* Update FOPT and XOPT if the new F is the least value of the objective */ /* function so far. The branch when KNEW is positive occurs if D is not */ /* a trust region step. */ fsave = fopt; if (f < fopt) { fopt = f; xoptsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xopt[i__] = xnew[i__]; /* L360: */ /* Computing 2nd power */ d__1 = xopt[i__]; xoptsq += d__1 * d__1; } if (nlopt_stop_ftol(stop, fopt, fsave)) { rc = NLOPT_FTOL_REACHED; goto L530; } } ksave = knew; if (knew > 0) { goto L410; } /* Pick the next value of DELTA after a trust region step. */ if (vquad >= zero) { goto L530; } ratio = (f - fsave) / vquad; if (ratio <= tenth) { delta = half * dnorm; } else if (ratio <= .7) { /* Computing MAX */ d__1 = half * delta; delta = MAX2(d__1,dnorm); } else { /* Computing MAX */ d__1 = half * delta, d__2 = dnorm + dnorm; delta = MAX2(d__1,d__2); } if (delta <= rho * 1.5) { delta = rho; } /* Set KNEW to the index of the next interpolation point to be deleted. */ /* Computing MAX */ d__2 = tenth * delta; /* Computing 2nd power */ d__1 = MAX2(d__2,rho); rhosq = d__1 * d__1; ktemp = 0; detrat = zero; if (f >= fsave) { ktemp = kopt; detrat = one; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { hdiag = zero; i__2 = nptm; for (j = 1; j <= i__2; ++j) { temp = one; if (j < idz) { temp = -one; } /* L380: */ /* Computing 2nd power */ d__1 = zmat[k + j * zmat_dim1]; hdiag += temp * (d__1 * d__1); } /* Computing 2nd power */ d__2 = vlag[k]; temp = (d__1 = beta * hdiag + d__2 * d__2, fabs(d__1)); distsq = zero; i__2 = *n; for (j = 1; j <= i__2; ++j) { /* L390: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1] - xopt[j]; distsq += d__1 * d__1; } if (distsq > rhosq) { /* Computing 3rd power */ d__1 = distsq / rhosq; temp *= d__1 * (d__1 * d__1); } if (temp > detrat && k != ktemp) { detrat = temp; knew = k; } /* L400: */ } if (knew == 0) { goto L460; } /* Update BMAT, ZMAT and IDZ, so that the KNEW-th interpolation point */ /* can be moved. Begin the updating of the quadratic model, starting */ /* with the explicit second derivative term. */ L410: update_(n, npt, &bmat[bmat_offset], &zmat[zmat_offset], &idz, ndim, &vlag[ 1], &beta, &knew, &w[1]); fval[knew] = f; ih = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = pq[knew] * xpt[knew + i__ * xpt_dim1]; i__2 = i__; for (j = 1; j <= i__2; ++j) { ++ih; /* L420: */ hq[ih] += temp * xpt[knew + j * xpt_dim1]; } } pq[knew] = zero; /* Update the other second derivative parameters, and then the gradient */ /* vector of the model. Also include the new interpolation point. */ i__2 = nptm; for (j = 1; j <= i__2; ++j) { temp = diff * zmat[knew + j * zmat_dim1]; if (j < idz) { temp = -temp; } i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L440: */ pq[k] += temp * zmat[k + j * zmat_dim1]; } } gqsq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { gq[i__] += diff * bmat[knew + i__ * bmat_dim1]; /* Computing 2nd power */ d__1 = gq[i__]; gqsq += d__1 * d__1; /* L450: */ xpt[knew + i__ * xpt_dim1] = xnew[i__]; } /* If a trust region step makes a small change to the objective function, */ /* then calculate the gradient of the least Frobenius norm interpolant at */ /* XBASE, and store it in W, using VLAG for a vector of right hand sides. */ if (ksave == 0 && delta == rho) { if (fabs(ratio) > .01) { itest = 0; } else { i__1 = *npt; for (k = 1; k <= i__1; ++k) { /* L700: */ vlag[k] = fval[k] - fval[kopt]; } gisq = zero; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { sum = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L710: */ sum += bmat[k + i__ * bmat_dim1] * vlag[k]; } gisq += sum * sum; /* L720: */ w[i__] = sum; } /* Test whether to replace the new quadratic model by the least Frobenius */ /* norm interpolant, making the replacement if the test is satisfied. */ ++itest; if (gqsq < gisq * 100.) { itest = 0; } if (itest >= 3) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L730: */ gq[i__] = w[i__]; } i__1 = nh; for (ih = 1; ih <= i__1; ++ih) { /* L740: */ hq[ih] = zero; } i__1 = nptm; for (j = 1; j <= i__1; ++j) { w[j] = zero; i__2 = *npt; for (k = 1; k <= i__2; ++k) { /* L750: */ w[j] += vlag[k] * zmat[k + j * zmat_dim1]; } /* L760: */ if (j < idz) { w[j] = -w[j]; } } i__1 = *npt; for (k = 1; k <= i__1; ++k) { pq[k] = zero; i__2 = nptm; for (j = 1; j <= i__2; ++j) { /* L770: */ pq[k] += zmat[k + j * zmat_dim1] * w[j]; } } itest = 0; } } } if (f < fsave) { kopt = knew; } /* If a trust region step has provided a sufficient decrease in F, then */ /* branch for another trust region calculation. The case KSAVE>0 occurs */ /* when the new function value was calculated by a model step. */ if (f <= fsave + tenth * vquad) { goto L100; } if (ksave > 0) { goto L100; } /* Alternatively, find out if the interpolation points are close enough */ /* to the best point so far. */ knew = 0; L460: distsq = delta * 4. * delta; i__2 = *npt; for (k = 1; k <= i__2; ++k) { sum = zero; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L470: */ /* Computing 2nd power */ d__1 = xpt[k + j * xpt_dim1] - xopt[j]; sum += d__1 * d__1; } if (sum > distsq) { knew = k; distsq = sum; } /* L480: */ } /* If KNEW is positive, then set DSTEP, and branch back for the next */ /* iteration, which will generate a "model step". */ if (knew > 0) { /* Computing MAX */ /* Computing MIN */ d__2 = tenth * sqrt(distsq), d__3 = half * delta; d__1 = MIN2(d__2,d__3); dstep = MAX2(d__1,rho); dsq = dstep * dstep; goto L120; } if (ratio > zero) { goto L100; } if (MAX2(delta,dnorm) > rho) { goto L100; } /* The calculations with the current value of RHO are complete. Pick the */ /* next values of RHO and DELTA. */ L490: if (rho > rhoend) { delta = half * rho; ratio = rho / rhoend; if (ratio <= 16.) { rho = rhoend; } else if (ratio <= 250.) { rho = sqrt(ratio) * rhoend; } else { rho = tenth * rho; } delta = MAX2(delta,rho); goto L90; } /* Return from the calculation, after another Newton-Raphson step, if */ /* it is too short to have been tried before. */ if (knew == -1) { goto L290; } rc = NLOPT_XTOL_REACHED; L530: if (fopt <= f) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L540: */ x[i__] = xbase[i__] + xopt[i__]; } f = fopt; } *minf = f; return rc; } /* newuob_ */ /*************************************************************************/ /* newuoa.f */ nlopt_result newuoa(int n, int npt, double *x, const double *lb, const double *ub, double rhobeg, nlopt_stopping *stop, double *minf, newuoa_func calfun, void *calfun_data) { /* Local variables */ int id, np, iw, igq, ihq, ixb, ifv, ipq, ivl, ixn, ixo, ixp, ndim, nptm, ibmat, izmat; nlopt_result ret; double *w; /* This subroutine seeks the least value of a function of many variables, */ /* by a trust region method that forms quadratic models by interpolation. */ /* There can be some freedom in the interpolation conditions, which is */ /* taken up by minimizing the Frobenius norm of the change to the second */ /* derivative of the quadratic model, beginning with a zero matrix. The */ /* arguments of the subroutine are as follows. */ /* N must be set to the number of variables and must be at least two. */ /* NPT is the number of interpolation conditions. Its value must be in the */ /* interval [N+2,(N+1)(N+2)/2]. */ /* Initial values of the variables must be set in X(1),X(2),...,X(N). They */ /* will be changed to the values that give the least calculated F. */ /* RHOBEG and RHOEND must be set to the initial and final values of a trust */ /* region radius, so both must be positive with RHOEND<=RHOBEG. Typically */ /* RHOBEG should be about one tenth of the greatest expected change to a */ /* variable, and RHOEND should indicate the accuracy that is required in */ /* the final values of the variables. */ /* The value of IPRINT should be set to 0, 1, 2 or 3, which controls the */ /* amount of printing. Specifically, there is no output if IPRINT=0 and */ /* there is output only at the return if IPRINT=1. Otherwise, each new */ /* value of RHO is printed, with the best vector of variables so far and */ /* the corresponding value of the objective function. Further, each new */ /* value of F with its variables are output if IPRINT=3. */ /* MAXFUN must be set to an upper bound on the number of calls of CALFUN. */ /* The array W will be used for working space. Its length must be at least */ /* (NPT+13)*(NPT+N)+3*N*(N+3)/2. */ /* SUBROUTINE CALFUN (N,X,F) must be provided by the user. It must set F to */ /* the value of the objective function for the variables X(1),X(2),...,X(N). */ /* Partition the working space array, so that different parts of it can be */ /* treated separately by the subroutine that performs the main calculation. */ /* Parameter adjustments */ --x; /* Function Body */ np = n + 1; nptm = npt - np; if (n < 2) { nlopt_stop_msg(stop, "dimension %d must be >= 2", n); return NLOPT_INVALID_ARGS; } if (npt < n + 2 || npt > (n + 2) * np / 2) { nlopt_stop_msg(stop, "invalid # of interpolation conditions %d", npt); return NLOPT_INVALID_ARGS; } ndim = npt + n; ixb = 1; ixo = ixb + n; ixn = ixo + n; ixp = ixn + n; ifv = ixp + n * npt; igq = ifv + npt; ihq = igq + n; ipq = ihq + n * np / 2; ibmat = ipq + npt; izmat = ibmat + ndim * n; id = izmat + npt * nptm; ivl = id + n; iw = ivl + ndim; w = (double *) malloc(sizeof(double) * ((npt+13)*(npt+n) + 3*(n*(n+3))/2)); if (!w) return NLOPT_OUT_OF_MEMORY; --w; /* The above settings provide a partition of W for subroutine NEWUOB. */ /* The partition requires the first NPT*(NPT+N)+5*N*(N+3)/2 elements of */ /* W plus the space that is needed by the last array of NEWUOB. */ ret = newuob_(&n, &npt, &x[1], &rhobeg, lb, ub, stop, minf, calfun, calfun_data, &w[ixb], &w[ixo], &w[ixn], &w[ixp], &w[ifv], &w[igq], &w[ihq], &w[ipq], &w[ibmat], &w[izmat], &ndim, &w[id], &w[ivl], &w[iw]); ++w; free(w); return ret; } /* newuoa_ */ /*************************************************************************/ /*************************************************************************/ stevengj-nlopt-88c424d/src/algs/newuoa/newuoa.h000066400000000000000000000005711521061417600215230ustar00rootroot00000000000000#ifndef NEWUOA_H #define NEWUOA_H 1 #include "nlopt-util.h" #include "nlopt.h" typedef double (*newuoa_func)(int n, const double *x, void *func_data); extern nlopt_result newuoa(int n, int npt, double *x, const double *lb, const double *ub, double rhobeg, nlopt_stopping *stop, double *minf, newuoa_func calfun, void *calfun_data); #endif /* NEWUOA_H */ stevengj-nlopt-88c424d/src/algs/praxis/000077500000000000000000000000001521061417600200615ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/praxis/README000066400000000000000000000011671521061417600207460ustar00rootroot00000000000000praxis gradient-free local optimization via the "principal-axis method", downloaded from Netlib: http://netlib.org/opt/praxis The original Fortran code was written by Richard Brent and made available by the Stanford Linear Accelerator Center, dated 3/1/73. Since this code contains no copyright statements and is dated prior to 1977, under US copyright law it is in the public domain (not copyrighted). Converted to C via f2c and cleaned up by Steven G. Johnson (stevenj@alum.mit.edu). C version is licensed under the MIT license (which is in the same spirit as public domain, but disclaims warranty and is clearer legally). stevengj-nlopt-88c424d/src/algs/praxis/praxis.c000066400000000000000000000763731521061417600215530ustar00rootroot00000000000000/* See README */ #include #include #include #include "nlopt-util.h" #include "praxis.h" /* Common Block Declarations */ struct global_s { double fx, ldt, dmin__; int nf, nl; }; struct q_s { double *v; /* size n x n */ double *q0, *q1, *t_flin; /* size n */ double qa, qb, qc, qd0, qd1, qf1; double fbest, *xbest; /* size n */ nlopt_stopping *stop; }; /* Table of constant values */ static int pow_ii(int x, int n) /* compute x^n, n >= 0 */ { int p = 1; while (n > 0) { if (n & 1) { n--; p *= x; } else { n >>= 1; x *= x; } } return p; } static void minfit_(int m, int n, double machep, double *tol, double *ab, double *q, double *ework); static nlopt_result min_(int n, int j, int nits, double *d2, double *x1, double *f1, int fk, praxis_func f, void *f_data, double *x, double *t_old, double machep, double *h__, struct global_s *global_1, struct q_s *q_1); static double flin_(int n, int j, double *l, praxis_func f, void *f_data, double *x, int *nf, struct q_s *q_1, nlopt_result *ret); static void sort_(int m, int n, double *d__, double *v); static void quad_(int n, praxis_func f, void *f_data, double *x, double *t_old, double machep, double *h__, struct global_s *global_1, struct q_s *q_1); nlopt_result praxis_(double t0, double machep, double h0, int n, double *x, praxis_func f, void *f_data, nlopt_stopping *stop, double *minf) { /* System generated locals */ int i__1, i__2, i__3; nlopt_result ret = NLOPT_SUCCESS; double d__1; /* Global */ struct global_s global_1; struct q_s q_1; /* Local variables */ double *d__, *y, *z__, *e_minfit, *prev_xbest; /* size n */ double prev_fbest; double h__; int i__, j, k; double s, t_old, f1; int k2; double m2, m4, t2_old, df, dn; int kl, ii; double sf; int kt; double sl; int im1, km1; double dni, lds; int ktm; double scbd; int illc; int klmk; double ldfac, large, small, value; double vlarge; double vsmall; double *work; /* LAST MODIFIED 3/1/73 */ /* Modified August 2007 by S. G. Johnson: after conversion to C via f2c and some manual cleanup, eliminating write statements, I additionally: - modified the routine to use NLopt stop criteria - allocate arrays dynamically to allow n > 20 - return the NLopt return code, where the min. function value is now given by the parameter minf */ /* PRAXIS RETURNS THE MINIMUM OF THE FUNCTION F(N,X) OF N VARIABLES */ /* USING THE PRINCIPAL AXIS METHOD. THE GRADIENT OF THE FUNCTION IS */ /* NOT REQUIRED. */ /* FOR A DESCRIPTION OF THE ALGORITHM, SEE CHAPTER SEVEN OF */ /* "ALGORITHMS FOR FINDING ZEROS AND EXTREMA OF FUNCTIONS WITHOUT */ /* CALCULATING DERIVATIVES" BY RICHARD P BRENT. */ /* THE PARAMETERS ARE: */ /* T0 IS A TOLERANCE. PRAXIS ATTEMPTS TO RETURN PRAXIS=F(X) */ /* SUCH THAT IF X0 IS THE TRUE LOCAL MINIMUM NEAR X, THEN */ /* NORM(X-X0) < T0 + SQUAREROOT(MACHEP)*NORM(X). */ /* MACHEP IS THE MACHINE PRECISION, THE SMALLEST NUMBER SUCH THAT */ /* 1 + MACHEP > 1. MACHEP SHOULD BE 16.**-13 (ABOUT */ /* 2.22D-16) FOR REAL*8 ARITHMETIC ON THE IBM 360. */ /* H0 IS THE MAXIMUM STEP SIZE. H0 SHOULD BE SET TO ABOUT THE */ /* MAXIMUM DISTANCE FROM THE INITIAL GUESS TO THE MINIMUM. */ /* (IF H0 IS SET TOO LARGE OR TOO SMALL, THE INITIAL RATE OF */ /* CONVERGENCE MAY BE SLOW.) */ /* N (AT LEAST TWO) IS THE NUMBER OF VARIABLES UPON WHICH */ /* THE FUNCTION DEPENDS. */ /* X IS AN ARRAY CONTAINING ON ENTRY A GUESS OF THE POINT OF */ /* MINIMUM, ON RETURN THE ESTIMATED POINT OF MINIMUM. */ /* F(N,X) IS THE FUNCTION TO BE MINIMIZED. F SHOULD BE A REAL*8 */ /* FUNCTION DECLARED EXTERNAL IN THE CALLING PROGRAM. */ /* THE APPROXIMATING QUADRATIC FORM IS */ /* Q(X') = F(N,X) + (1/2) * (X'-X)-TRANSPOSE * A * (X'-X) */ /* WHERE X IS THE BEST ESTIMATE OF THE MINIMUM AND A IS */ /* INVERSE(V-TRANSPOSE) * D * INVERSE(V) */ /* (V(*,*) IS THE MATRIX OF SEARCH DIRECTIONS; D(*) IS THE ARRAY */ /* OF SECOND DIFFERENCES). IF F HAS CONTINUOUS SECOND DERIVATIVES */ /* NEAR X0, A WILL TEND TO THE HESSIAN OF F AT X0 AS X APPROACHES X0. */ /* IT IS ASSUMED THAT ON FLOATING-POINT UNDERFLOW THE RESULT IS SET */ /* TO ZERO. */ /* THE USER SHOULD OBSERVE THE COMMENT ON HEURISTIC NUMBERS AFTER */ /* THE INITIALIZATION OF MACHINE DEPENDENT NUMBERS. */ /* .....IF N>20 OR IF N<20 AND YOU NEED MORE SPACE, CHANGE '20' TO THE */ /* LARGEST VALUE OF N IN THE NEXT CARD, IN THE CARD 'IDIM=20', AND */ /* IN THE DIMENSION STATEMENTS IN SUBROUTINES MINFIT,MIN,FLIN,QUAD. */ /* ...changed by S. G. Johnson, 2007, to use malloc */ /* .....INITIALIZATION..... */ /* MACHINE DEPENDENT NUMBERS: */ /* Parameter adjustments */ --x; /* Function Body */ small = machep * machep; vsmall = small * small; large = 1. / small; vlarge = 1. / vsmall; m2 = sqrt(machep); m4 = sqrt(m2); /* new: dynamic allocation of temporary arrays */ work = (double *) malloc(sizeof(double) * (n*n + n*9)); if (!work) return NLOPT_OUT_OF_MEMORY; q_1.v = work; q_1.q0 = q_1.v + n*n; q_1.q1 = q_1.q0 + n; q_1.t_flin = q_1.q1 + n; q_1.xbest = q_1.t_flin + n; d__ = q_1.xbest + n; y = d__ + n; z__ = y + n; e_minfit = y + n; prev_xbest = e_minfit + n; /* HEURISTIC NUMBERS: */ /* IF THE AXES MAY BE BADLY SCALED (WHICH IS TO BE AVOIDED IF */ /* POSSIBLE), THEN SET SCBD=10. OTHERWISE SET SCBD=1. */ /* IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED, SET ILLC=TRUE. */ /* OTHERWISE SET ILLC=FALSE. */ /* KTM IS THE NUMBER OF ITERATIONS WITHOUT IMPROVEMENT BEFORE THE */ /* ALGORITHM TERMINATES. KTM=4 IS VERY CAUTIOUS; USUALLY KTM=1 */ /* IS SATISFACTORY. */ scbd = 1.; illc = 0 /* false */; ktm = 1; ldfac = .01; if (illc) { ldfac = .1; } kt = 0; global_1.nl = 0; global_1.nf = 1; prev_fbest = q_1.fbest = global_1.fx = f(n, &x[1], f_data); memcpy(q_1.xbest, &x[1], n*sizeof(double)); memcpy(prev_xbest, &x[1], n*sizeof(double)); ++ *(stop->nevals_p); q_1.stop = stop; q_1.qf1 = global_1.fx; if (t0 > 0) t_old = small + t0; else { t_old = 0; if (stop->xtol_abs) for (i__ = 0; i__ < n; ++i__) if (stop->xtol_abs[i__] > t_old) t_old = stop->xtol_abs[i__]; t_old += small; } t2_old = t_old; global_1.dmin__ = small; h__ = h0; if (h__ < t_old * 100) { h__ = t_old * 100; } global_1.ldt = h__; /* .....THE FIRST SET OF SEARCH DIRECTIONS V IS THE IDENTITY MATRIX..... */ i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = n; for (j = 1; j <= i__2; ++j) { /* L10: */ q_1.v[i__ + j * n - (n+1)] = 0.; } /* L20: */ q_1.v[i__ + i__ * n - (n+1)] = 1.; } d__[0] = 0.; q_1.qd0 = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { q_1.q0[i__ - 1] = x[i__]; /* L30: */ q_1.q1[i__ - 1] = x[i__]; } /* .....THE MAIN LOOP STARTS HERE..... */ L40: sf = d__[0]; d__[0] = 0.; s = 0.; /* .....MINIMIZE ALONG THE FIRST DIRECTION V(*,1). */ /* FX MUST BE PASSED TO MIN BY VALUE. */ value = global_1.fx; ret = min_(n, 1, 2, d__, &s, &value, 0, f,f_data, &x[1], &t_old, machep, &h__, &global_1, &q_1); if (ret != NLOPT_SUCCESS) goto done; if (s > 0.) { goto L50; } i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { /* L45: */ q_1.v[i__ - 1] = -q_1.v[i__ - 1]; } L50: if (sf > d__[0] * .9 && sf * .9 < d__[0]) { goto L70; } i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { /* L60: */ d__[i__ - 1] = 0.; } /* .....THE INNER LOOP STARTS HERE..... */ L70: i__1 = n; for (k = 2; k <= i__1; ++k) { i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* L75: */ y[i__ - 1] = x[i__]; } sf = global_1.fx; if (kt > 0) { illc = 1 /* true */; } L80: kl = k; df = 0.; /* .....A RANDOM STEP FOLLOWS (TO AVOID RESOLUTION VALLEYS). */ /* PRAXIS ASSUMES THAT RANDOM RETURNS A RANDOM NUMBER UNIFORMLY */ /* DISTRIBUTED IN (0,1). */ if (! illc) { goto L95; } i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { s = (global_1.ldt * .1 + t2_old * pow_ii(10, kt)) * nlopt_urand(-.5,.5); /* was: (random_(n) - .5); */ z__[i__ - 1] = s; i__3 = n; for (j = 1; j <= i__3; ++j) { /* L85: */ x[j] += s * q_1.v[j + i__ * n - (n+1)]; } /* L90: */ } global_1.fx = (*f)(n, &x[1], f_data); ++global_1.nf; ++ *(stop->nevals_p); /* .....MINIMIZE ALONG THE "NON-CONJUGATE" DIRECTIONS V(*,K),...,V(*,N) */ L95: i__2 = n; for (k2 = k; k2 <= i__2; ++k2) { sl = global_1.fx; s = 0.; value = global_1.fx; ret = min_(n, k2, 2, &d__[k2 - 1], &s, &value, 0, f,f_data, & x[1], &t_old, machep, &h__, &global_1, &q_1); if (ret != NLOPT_SUCCESS) goto done; if (illc) { goto L97; } s = sl - global_1.fx; goto L99; L97: /* Computing 2nd power */ d__1 = s + z__[k2 - 1]; s = d__[k2 - 1] * (d__1 * d__1); L99: if (df > s) { goto L105; } df = s; kl = k2; L105: ; } if (illc || df >= (d__1 = machep * 100 * global_1.fx, fabs(d__1))) { goto L110; } /* .....IF THERE WAS NOT MUCH IMPROVEMENT ON THE FIRST TRY, SET */ /* ILLC=TRUE AND START THE INNER LOOP AGAIN..... */ illc = 1 /* true */; goto L80; L110: /* .....MINIMIZE ALONG THE "CONJUGATE" DIRECTIONS V(*,1),...,V(*,K-1) */ km1 = k - 1; i__2 = km1; for (k2 = 1; k2 <= i__2; ++k2) { s = 0.; value = global_1.fx; ret = min_(n, k2, 2, &d__[k2 - 1], &s, &value, 0, f,f_data, & x[1], &t_old, machep, &h__, &global_1, &q_1); if (ret != NLOPT_SUCCESS) goto done; /* L120: */ } f1 = global_1.fx; global_1.fx = sf; lds = 0.; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { sl = x[i__]; x[i__] = y[i__ - 1]; sl -= y[i__ - 1]; y[i__ - 1] = sl; /* L130: */ lds += sl * sl; } lds = sqrt(lds); if (lds <= small) { goto L160; } /* .....DISCARD DIRECTION V(*,KL). */ /* IF NO RANDOM STEP WAS TAKEN, V(*,KL) IS THE "NON-CONJUGATE" */ /* DIRECTION ALONG WHICH THE GREATEST IMPROVEMENT WAS MADE..... */ klmk = kl - k; if (klmk < 1) { goto L141; } i__2 = klmk; for (ii = 1; ii <= i__2; ++ii) { i__ = kl - ii; i__3 = n; for (j = 1; j <= i__3; ++j) { /* L135: */ q_1.v[j + (i__ + 1) * n - (n+1)] = q_1.v[j + i__ * n - (n+1)]; } /* L140: */ d__[i__] = d__[i__ - 1]; } L141: d__[k - 1] = 0.; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* L145: */ q_1.v[i__ + k * n - (n+1)] = y[i__ - 1] / lds; } /* .....MINIMIZE ALONG THE NEW "CONJUGATE" DIRECTION V(*,K), WHICH IS */ /* THE NORMALIZED VECTOR: (NEW X) - (0LD X)..... */ value = f1; ret = min_(n, k, 4, &d__[k - 1], &lds, &value, 1, f,f_data, &x[1], &t_old, machep, &h__, &global_1, &q_1); if (ret != NLOPT_SUCCESS) goto done; if (lds > 0.) { goto L160; } lds = -lds; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* L150: */ q_1.v[i__ + k * n - (n+1)] = -q_1.v[i__ + k * n - (n+1)]; } L160: global_1.ldt = ldfac * global_1.ldt; if (global_1.ldt < lds) { global_1.ldt = lds; } t2_old = 0.; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* L165: */ /* Computing 2nd power */ d__1 = x[i__]; t2_old += d__1 * d__1; } t2_old = m2 * sqrt(t2_old) + t_old; /* .....SEE WHETHER THE LENGTH OF THE STEP TAKEN SINCE STARTING THE */ /* INNER LOOP EXCEEDS HALF THE TOLERANCE..... */ if (global_1.ldt > t2_old * .5f && !nlopt_stop_f(stop, q_1.fbest, prev_fbest) && !nlopt_stop_x(stop, q_1.xbest, prev_xbest)) { kt = -1; } ++kt; if (kt > ktm) { if (nlopt_stop_f(stop, q_1.fbest, prev_fbest)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, q_1.xbest, prev_xbest)) ret = NLOPT_XTOL_REACHED; goto done; } prev_fbest = q_1.fbest; memcpy(prev_xbest, q_1.xbest, n * sizeof(double)); /* L170: */ } /* .....THE INNER LOOP ENDS HERE. */ /* TRY QUADRATIC EXTRAPOLATION IN CASE WE ARE IN A CURVED VALLEY. */ /* L171: */ quad_(n, f,f_data, &x[1], &t_old, machep, &h__, &global_1, &q_1); dn = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__ - 1] = 1. / sqrt(d__[i__ - 1]); if (dn < d__[i__ - 1]) { dn = d__[i__ - 1]; } /* L175: */ } i__1 = n; for (j = 1; j <= i__1; ++j) { s = d__[j - 1] / dn; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { /* L180: */ q_1.v[i__ + j * n - (n+1)] = s * q_1.v[i__ + j * n - (n+1)]; } } /* .....SCALE THE AXES TO TRY TO REDUCE THE CONDITION NUMBER..... */ if (scbd <= 1.) { goto L200; } s = vlarge; i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { sl = 0.; i__1 = n; for (j = 1; j <= i__1; ++j) { /* L182: */ sl += q_1.v[i__ + j * n - (n+1)] * q_1.v[i__ + j * n - (n+1)]; } z__[i__ - 1] = sqrt(sl); if (z__[i__ - 1] < m4) { z__[i__ - 1] = m4; } if (s > z__[i__ - 1]) { s = z__[i__ - 1]; } /* L185: */ } i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { sl = s / z__[i__ - 1]; z__[i__ - 1] = 1. / sl; if (z__[i__ - 1] <= scbd) { goto L189; } sl = 1. / scbd; z__[i__ - 1] = scbd; L189: i__1 = n; for (j = 1; j <= i__1; ++j) { /* L190: */ q_1.v[i__ + j * n - (n+1)] = sl * q_1.v[i__ + j * n - (n+1)]; } /* L195: */ } /* .....CALCULATE A NEW SET OF ORTHOGONAL DIRECTIONS BEFORE REPEATING */ /* THE MAIN LOOP. */ /* FIRST TRANSPOSE V FOR MINFIT: */ L200: i__2 = n; for (i__ = 2; i__ <= i__2; ++i__) { im1 = i__ - 1; i__1 = im1; for (j = 1; j <= i__1; ++j) { s = q_1.v[i__ + j * n - (n+1)]; q_1.v[i__ + j * n - (n+1)] = q_1.v[j + i__ * n - (n+1)]; /* L210: */ q_1.v[j + i__ * n - (n+1)] = s; } /* L220: */ } /* .....CALL MINFIT TO FIND THE SINGULAR VALUE DECOMPOSITION OF V. */ /* THIS GIVES THE PRINCIPAL VALUES AND PRINCIPAL DIRECTIONS OF THE */ /* APPROXIMATING QUADRATIC FORM WITHOUT SQUARING THE CONDITION */ /* NUMBER..... */ minfit_(n, n, machep, &vsmall, q_1.v, d__, e_minfit); /* .....UNSCALE THE AXES..... */ if (scbd <= 1.) { goto L250; } i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { s = z__[i__ - 1]; i__1 = n; for (j = 1; j <= i__1; ++j) { /* L225: */ q_1.v[i__ + j * n - (n+1)] = s * q_1.v[i__ + j * n - (n+1)]; } /* L230: */ } i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { s = 0.; i__1 = n; for (j = 1; j <= i__1; ++j) { /* L235: */ /* Computing 2nd power */ d__1 = q_1.v[j + i__ * n - (n+1)]; s += d__1 * d__1; } s = sqrt(s); d__[i__ - 1] = s * d__[i__ - 1]; s = 1 / s; i__1 = n; for (j = 1; j <= i__1; ++j) { /* L240: */ q_1.v[j + i__ * n - (n+1)] = s * q_1.v[j + i__ * n - (n+1)]; } /* L245: */ } L250: i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { dni = dn * d__[i__ - 1]; if (dni > large) { goto L265; } if (dni < small) { goto L260; } d__[i__ - 1] = 1 / (dni * dni); goto L270; L260: d__[i__ - 1] = vlarge; goto L270; L265: d__[i__ - 1] = vsmall; L270: ; } /* .....SORT THE EIGENVALUES AND EIGENVECTORS..... */ sort_(n, n, d__, q_1.v); global_1.dmin__ = d__[n - 1]; if (global_1.dmin__ < small) { global_1.dmin__ = small; } illc = 0 /* false */; if (m2 * d__[0] > global_1.dmin__) { illc = 1 /* true */; } /* .....THE MAIN LOOP ENDS HERE..... */ goto L40; /* .....RETURN..... */ done: if (ret != NLOPT_OUT_OF_MEMORY) { *minf = q_1.fbest; memcpy(&x[1], q_1.xbest, n * sizeof(double)); } free(work); return ret; } /* praxis_ */ static void minfit_(int m, int n, double machep, double *tol, double *ab, double *q, double *ework) { /* System generated locals */ int ab_dim1, ab_offset, i__1, i__2, i__3; double d__1, d__2; /* Local variables */ double *e; /* size n */ double c__, f = 0.0, g, h__; int i__, j, k, l; double s, x, y, z__; int l2, ii, kk, kt, ll2, lp1; double eps, temp; e = ework; /* ...AN IMPROVED VERSION OF MINFIT (SEE GOLUB AND REINSCH, 1969) */ /* RESTRICTED TO M=N,P=0. */ /* THE SINGULAR VALUES OF THE ARRAY AB ARE RETURNED IN Q AND AB IS */ /* OVERWRITTEN WITH THE ORTHOGONAL MATRIX V SUCH THAT U.DIAG(Q) = AB.V, */ /* WHERE U IS ANOTHER ORTHOGONAL MATRIX. */ /* ...HOUSEHOLDER'S REDUCTION TO BIDIAGONAL FORM... */ /* Parameter adjustments */ --q; ab_dim1 = m; ab_offset = 1 + ab_dim1; ab -= ab_offset; /* Function Body */ if (n == 1) { goto L200; } eps = machep; g = 0.; x = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { e[i__ - 1] = g; s = 0.; l = i__ + 1; i__2 = n; for (j = i__; j <= i__2; ++j) { /* L1: */ /* Computing 2nd power */ d__1 = ab[j + i__ * ab_dim1]; s += d__1 * d__1; } g = 0.; if (s < *tol) { goto L4; } f = ab[i__ + i__ * ab_dim1]; g = sqrt(s); if (f >= 0.) { g = -g; } h__ = f * g - s; ab[i__ + i__ * ab_dim1] = f - g; if (l > n) { goto L4; } i__2 = n; for (j = l; j <= i__2; ++j) { f = 0.; i__3 = n; for (k = i__; k <= i__3; ++k) { /* L2: */ f += ab[k + i__ * ab_dim1] * ab[k + j * ab_dim1]; } f /= h__; i__3 = n; for (k = i__; k <= i__3; ++k) { /* L3: */ ab[k + j * ab_dim1] += f * ab[k + i__ * ab_dim1]; } } L4: q[i__] = g; s = 0.; if (i__ == n) { goto L6; } i__3 = n; for (j = l; j <= i__3; ++j) { /* L5: */ s += ab[i__ + j * ab_dim1] * ab[i__ + j * ab_dim1]; } L6: g = 0.; if (s < *tol) { goto L10; } if (i__ == n) { goto L16; } f = ab[i__ + (i__ + 1) * ab_dim1]; L16: g = sqrt(s); if (f >= 0.) { g = -g; } h__ = f * g - s; if (i__ == n) { goto L10; } ab[i__ + (i__ + 1) * ab_dim1] = f - g; i__3 = n; for (j = l; j <= i__3; ++j) { /* L7: */ e[j - 1] = ab[i__ + j * ab_dim1] / h__; } i__3 = n; for (j = l; j <= i__3; ++j) { s = 0.; i__2 = n; for (k = l; k <= i__2; ++k) { /* L8: */ s += ab[j + k * ab_dim1] * ab[i__ + k * ab_dim1]; } i__2 = n; for (k = l; k <= i__2; ++k) { /* L9: */ ab[j + k * ab_dim1] += s * e[k - 1]; } } L10: y = (d__1 = q[i__], fabs(d__1)) + (d__2 = e[i__ - 1], fabs(d__2)); /* L11: */ if (y > x) { x = y; } } /* ...ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS... */ ab[n + n * ab_dim1] = 1.; g = e[n - 1]; l = n; i__1 = n; for (ii = 2; ii <= i__1; ++ii) { i__ = n - ii + 1; if (g == 0.) { goto L23; } h__ = ab[i__ + (i__ + 1) * ab_dim1] * g; i__2 = n; for (j = l; j <= i__2; ++j) { /* L20: */ ab[j + i__ * ab_dim1] = ab[i__ + j * ab_dim1] / h__; } i__2 = n; for (j = l; j <= i__2; ++j) { s = 0.; i__3 = n; for (k = l; k <= i__3; ++k) { /* L21: */ s += ab[i__ + k * ab_dim1] * ab[k + j * ab_dim1]; } i__3 = n; for (k = l; k <= i__3; ++k) { /* L22: */ ab[k + j * ab_dim1] += s * ab[k + i__ * ab_dim1]; } } L23: i__3 = n; for (j = l; j <= i__3; ++j) { ab[i__ + j * ab_dim1] = 0.; /* L24: */ ab[j + i__ * ab_dim1] = 0.; } ab[i__ + i__ * ab_dim1] = 1.; g = e[i__ - 1]; /* L25: */ l = i__; } /* ...DIAGONALIZATION OF THE BIDIAGONAL FORM... */ /* L100: */ eps *= x; i__1 = n; for (kk = 1; kk <= i__1; ++kk) { k = n - kk + 1; kt = 0; L101: ++kt; if (kt <= 30) { goto L102; } e[k - 1] = 0.; /* fprintf(stderr, "QR failed\n"); */ L102: i__3 = k; for (ll2 = 1; ll2 <= i__3; ++ll2) { l2 = k - ll2 + 1; l = l2; if ((d__1 = e[l - 1], fabs(d__1)) <= eps) { goto L120; } if (l == 1) { goto L103; } if ((d__1 = q[l - 1], fabs(d__1)) <= eps) { goto L110; } L103: ; } /* ...CANCELLATION OF E(L) IF L>1... */ L110: c__ = 0.; s = 1.; i__3 = k; for (i__ = l; i__ <= i__3; ++i__) { f = s * e[i__ - 1]; e[i__ - 1] = c__ * e[i__ - 1]; if (fabs(f) <= eps) { goto L120; } g = q[i__]; /* ...Q(I) = H = DSQRT(G*G + F*F)... */ if (fabs(f) < fabs(g)) { goto L113; } if (f != 0.) { goto L112; } else { goto L111; } L111: h__ = 0.; goto L114; L112: /* Computing 2nd power */ d__1 = g / f; h__ = fabs(f) * sqrt(d__1 * d__1 + 1); goto L114; L113: /* Computing 2nd power */ d__1 = f / g; h__ = fabs(g) * sqrt(d__1 * d__1 + 1); L114: q[i__] = h__; if (h__ != 0.) { goto L115; } g = 1.; h__ = 1.; L115: c__ = g / h__; /* L116: */ s = -f / h__; } /* ...TEST FOR CONVERGENCE... */ L120: z__ = q[k]; if (l == k) { goto L140; } /* ...SHIFT FROM BOTTOM 2*2 MINOR... */ x = q[l]; y = q[k - 1]; g = e[k - 2]; h__ = e[k - 1]; f = ((y - z__) * (y + z__) + (g - h__) * (g + h__)) / (h__ * 2 * y); g = sqrt(f * f + 1.); temp = f - g; if (f >= 0.) { temp = f + g; } f = ((x - z__) * (x + z__) + h__ * (y / temp - h__)) / x; /* ...NEXT QR TRANSFORMATION... */ c__ = 1.; s = 1.; lp1 = l + 1; if (lp1 > k) { goto L133; } i__3 = k; for (i__ = lp1; i__ <= i__3; ++i__) { g = e[i__ - 1]; y = q[i__]; h__ = s * g; g *= c__; if (fabs(f) < fabs(h__)) { goto L123; } if (f != 0.) { goto L122; } else { goto L121; } L121: z__ = 0.; goto L124; L122: /* Computing 2nd power */ d__1 = h__ / f; z__ = fabs(f) * sqrt(d__1 * d__1 + 1); goto L124; L123: /* Computing 2nd power */ d__1 = f / h__; z__ = fabs(h__) * sqrt(d__1 * d__1 + 1); L124: e[i__ - 2] = z__; if (z__ != 0.) { goto L125; } f = 1.; z__ = 1.; L125: c__ = f / z__; s = h__ / z__; f = x * c__ + g * s; g = -x * s + g * c__; h__ = y * s; y *= c__; i__2 = n; for (j = 1; j <= i__2; ++j) { x = ab[j + (i__ - 1) * ab_dim1]; z__ = ab[j + i__ * ab_dim1]; ab[j + (i__ - 1) * ab_dim1] = x * c__ + z__ * s; /* L126: */ ab[j + i__ * ab_dim1] = -x * s + z__ * c__; } if (fabs(f) < fabs(h__)) { goto L129; } if (f != 0.) { goto L128; } else { goto L127; } L127: z__ = 0.; goto L130; L128: /* Computing 2nd power */ d__1 = h__ / f; z__ = fabs(f) * sqrt(d__1 * d__1 + 1); goto L130; L129: /* Computing 2nd power */ d__1 = f / h__; z__ = fabs(h__) * sqrt(d__1 * d__1 + 1); L130: q[i__ - 1] = z__; if (z__ != 0.) { goto L131; } f = 1.; z__ = 1.; L131: c__ = f / z__; s = h__ / z__; f = c__ * g + s * y; /* L132: */ x = -s * g + c__ * y; } L133: e[l - 1] = 0.; e[k - 1] = f; q[k] = x; goto L101; /* ...CONVERGENCE: Q(K) IS MADE NON-NEGATIVE... */ L140: if (z__ >= 0.) { goto L150; } q[k] = -z__; i__3 = n; for (j = 1; j <= i__3; ++j) { /* L141: */ ab[j + k * ab_dim1] = -ab[j + k * ab_dim1]; } L150: ; } return; L200: q[1] = ab[ab_dim1 + 1]; ab[ab_dim1 + 1] = 1.; } /* minfit_ */ static nlopt_result min_(int n, int j, int nits, double * d2, double *x1, double *f1, int fk, praxis_func f, void *f_data, double * x, double *t_old, double machep, double *h__, struct global_s *global_1, struct q_s *q_1) { /* System generated locals */ int i__1; double d__1, d__2; /* Local variables */ int i__, k; double s, d1, f0, f2, m2, m4, t2, x2, fm; int dz; double xm, sf1, sx1; double temp, small; nlopt_result ret = NLOPT_SUCCESS; /* ...THE SUBROUTINE MIN MINIMIZES F FROM X IN THE DIRECTION V(*,J) UNLESS */ /* J IS LESS THAN 1, WHEN A QUADRATIC SEARCH IS MADE IN THE PLANE */ /* DEFINED BY Q0,Q1,X. */ /* D2 IS EITHER ZERO OR AN APPROXIMATION TO HALF F". */ /* ON ENTRY, X1 IS AN ESTIMATE OF THE DISTANCE FROM X TO THE MINIMUM */ /* ALONG V(*,J) (OR, IF J=0, A CURVE). ON RETURN, X1 IS THE DISTANCE */ /* FOUND. */ /* IF FK=.TRUE., THEN F1 IS FLIN(X1). OTHERWISE X1 AND F1 ARE IGNORED */ /* ON ENTRY UNLESS FINAL FX IS GREATER THAN F1. */ /* NITS CONTROLS THE NUMBER OF TIMES AN ATTEMPT WILL BE MADE TO HALVE */ /* THE INTERVAL. */ /* Parameter adjustments */ --x; /* Function Body */ /* Computing 2nd power */ d__1 = machep; small = d__1 * d__1; m2 = sqrt(machep); m4 = sqrt(m2); sf1 = *f1; sx1 = *x1; k = 0; xm = 0.; fm = global_1->fx; f0 = global_1->fx; dz = *d2 < machep; /* ...FIND THE STEP SIZE... */ s = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { /* L1: */ /* Computing 2nd power */ d__1 = x[i__]; s += d__1 * d__1; } s = sqrt(s); temp = *d2; if (dz) { temp = global_1->dmin__; } t2 = m4 * sqrt(fabs(global_1->fx) / temp + s * global_1->ldt) + m2 * global_1->ldt; s = m4 * s + *t_old; if (dz && t2 > s) { t2 = s; } t2 = t2 > small ? t2 : small; /* Computing MIN */ d__1 = t2, d__2 = *h__ * .01; t2 = d__1 < d__2 ? d__1 : d__2; if (! (fk) || *f1 > fm) { goto L2; } xm = *x1; fm = *f1; L2: if (fk && fabs(*x1) >= t2) { goto L3; } temp = 1.; if (*x1 < 0.) { temp = -1.; } *x1 = temp * t2; *f1 = flin_(n, j, x1, f,f_data, &x[1], &global_1->nf, q_1, &ret); if (ret != NLOPT_SUCCESS) return ret; L3: if (*f1 > fm) { goto L4; } xm = *x1; fm = *f1; L4: if (! dz) { goto L6; } /* ...EVALUATE FLIN AT ANOTHER POINT AND ESTIMATE THE SECOND DERIVATIVE... */ x2 = -(*x1); if (f0 >= *f1) { x2 = *x1 * 2.; } f2 = flin_(n, j, &x2, f,f_data, &x[1], &global_1->nf, q_1, &ret); if (ret != NLOPT_SUCCESS) return ret; if (f2 > fm) { goto L5; } xm = x2; fm = f2; L5: *d2 = (x2 * (*f1 - f0) - *x1 * (f2 - f0)) / (*x1 * x2 * (*x1 - x2)); /* ...ESTIMATE THE FIRST DERIVATIVE AT 0... */ L6: d1 = (*f1 - f0) / *x1 - *x1 * *d2; dz = 1 /* true */; /* ...PREDICT THE MINIMUM... */ if (*d2 > small) { goto L7; } x2 = *h__; if (d1 >= 0.) { x2 = -x2; } goto L8; L7: x2 = d1 * -.5 / *d2; L8: if (fabs(x2) <= *h__) { goto L11; } if (x2 <= 0.) { goto L9; } else { goto L10; } L9: x2 = -(*h__); goto L11; L10: x2 = *h__; /* ...EVALUATE F AT THE PREDICTED MINIMUM... */ L11: f2 = flin_(n, j, &x2, f,f_data, &x[1], &global_1->nf, q_1, &ret); if (ret != NLOPT_SUCCESS) return ret; if (k >= nits || f2 <= f0) { goto L12; } /* ...NO SUCCESS, SO TRY AGAIN... */ ++k; if (f0 < *f1 && *x1 * x2 > 0.) { goto L4; } x2 *= .5; goto L11; /* ...INCREMENT THE ONE-DIMENSIONAL SEARCH COUNTER... */ L12: ++global_1->nl; if (f2 <= fm) { goto L13; } x2 = xm; goto L14; L13: fm = f2; /* ...GET A NEW ESTIMATE OF THE SECOND DERIVATIVE... */ L14: if ((d__1 = x2 * (x2 - *x1), fabs(d__1)) <= small) { goto L15; } *d2 = (x2 * (*f1 - f0) - *x1 * (fm - f0)) / (*x1 * x2 * (*x1 - x2)); goto L16; L15: if (k > 0) { *d2 = 0.; } L16: if (*d2 <= small) { *d2 = small; } *x1 = x2; global_1->fx = fm; if (sf1 >= global_1->fx) { goto L17; } global_1->fx = sf1; *x1 = sx1; /* ...UPDATE X FOR LINEAR BUT NOT PARABOLIC SEARCH... */ L17: if (j == 0) { return NLOPT_SUCCESS; } i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { /* L18: */ x[i__] += *x1 * q_1->v[i__ + j * n - (n+1)]; } return NLOPT_SUCCESS; } /* min_ */ static double flin_(int n, int j, double *l, praxis_func f, void *f_data, double *x, int *nf, struct q_s *q_1, nlopt_result *ret) { /* System generated locals */ int i__1; double ret_val; /* Local variables */ nlopt_stopping *stop = q_1->stop; int i__; double *t; /* size n */ t = q_1->t_flin; /* ...FLIN IS THE FUNCTION OF ONE REAL VARIABLE L THAT IS MINIMIZED */ /* BY THE SUBROUTINE MIN... */ /* Parameter adjustments */ --x; /* Function Body */ if (j == 0) { goto L2; } /* ...THE SEARCH IS LINEAR... */ i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { /* L1: */ t[i__ - 1] = x[i__] + *l * q_1->v[i__ + j * n - (n+1)]; } goto L4; /* ...THE SEARCH IS ALONG A PARABOLIC SPACE CURVE... */ L2: q_1->qa = *l * (*l - q_1->qd1) / (q_1->qd0 * (q_1->qd0 + q_1->qd1)); q_1->qb = (*l + q_1->qd0) * (q_1->qd1 - *l) / (q_1->qd0 * q_1->qd1); q_1->qc = *l * (*l + q_1->qd0) / (q_1->qd1 * (q_1->qd0 + q_1->qd1)); i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { /* L3: */ t[i__ - 1] = q_1->qa * q_1->q0[i__ - 1] + q_1->qb * x[i__] + q_1->qc * q_1->q1[i__ - 1]; } /* ...THE FUNCTION EVALUATION COUNTER NF IS INCREMENTED... */ L4: ++(*nf); ret_val = f(n, t, f_data); ++ *(stop->nevals_p); if (ret_val < q_1->fbest) { q_1->fbest = ret_val; memcpy(q_1->xbest, t, n * sizeof(double)); } if (nlopt_stop_forced(stop)) *ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) *ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) *ret = NLOPT_MAXTIME_REACHED; else if (ret_val <= stop->minf_max) *ret = NLOPT_MINF_MAX_REACHED; return ret_val; } /* flin_ */ static void sort_(int m, int n, double *d__, double *v) { /* System generated locals */ int v_dim1, v_offset, i__1, i__2; /* Local variables */ int i__, j, k; double s; int ip1, nm1; /* ...SORTS THE ELEMENTS OF D(N) INTO DESCENDING ORDER AND MOVES THE */ /* CORRESPONDING COLUMNS OF V(N,N). */ /* M IS THE ROW DIMENSION OF V AS DECLARED IN THE CALLING PROGRAM. */ /* Parameter adjustments */ v_dim1 = m; v_offset = 1 + v_dim1; v -= v_offset; --d__; /* Function Body */ if (n == 1) { return; } nm1 = n - 1; i__1 = nm1; for (i__ = 1; i__ <= i__1; ++i__) { k = i__; s = d__[i__]; ip1 = i__ + 1; i__2 = n; for (j = ip1; j <= i__2; ++j) { if (d__[j] <= s) { goto L1; } k = j; s = d__[j]; L1: ; } if (k <= i__) { goto L3; } d__[k] = d__[i__]; d__[i__] = s; i__2 = n; for (j = 1; j <= i__2; ++j) { s = v[j + i__ * v_dim1]; v[j + i__ * v_dim1] = v[j + k * v_dim1]; /* L2: */ v[j + k * v_dim1] = s; } L3: ; } } /* sort_ */ static void quad_(int n, praxis_func f, void *f_data, double *x, double *t_old, double machep, double *h__, struct global_s *global_1, struct q_s *q_1) { /* System generated locals */ int i__1; double d__1; /* Local variables */ int i__; double l, s; double value; /* ...QUAD LOOKS FOR THE MINIMUM OF F ALONG A CURVE DEFINED BY Q0,Q1,X... */ /* Parameter adjustments */ --x; /* Function Body */ s = global_1->fx; global_1->fx = q_1->qf1; q_1->qf1 = s; q_1->qd1 = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { s = x[i__]; l = q_1->q1[i__ - 1]; x[i__] = l; q_1->q1[i__ - 1] = s; /* L1: */ /* Computing 2nd power */ d__1 = s - l; q_1->qd1 += d__1 * d__1; } q_1->qd1 = sqrt(q_1->qd1); l = q_1->qd1; s = 0.; if (q_1->qd0 <= 0. || q_1->qd1 <= 0. || global_1->nl < n * 3 * n) { goto L2; } value = q_1->qf1; min_(n, 0, 2, &s, &l, &value, 1, f,f_data, &x[1], t_old, machep, h__, global_1, q_1); q_1->qa = l * (l - q_1->qd1) / (q_1->qd0 * (q_1->qd0 + q_1->qd1)); q_1->qb = (l + q_1->qd0) * (q_1->qd1 - l) / (q_1->qd0 * q_1->qd1); q_1->qc = l * (l + q_1->qd0) / (q_1->qd1 * (q_1->qd0 + q_1->qd1)); goto L3; L2: global_1->fx = q_1->qf1; q_1->qa = 0.; q_1->qb = q_1->qa; q_1->qc = 1.; L3: q_1->qd0 = q_1->qd1; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { s = q_1->q0[i__ - 1]; q_1->q0[i__ - 1] = x[i__]; /* L4: */ x[i__] = q_1->qa * s + q_1->qb * x[i__] + q_1->qc * q_1->q1[i__ - 1]; } } /* quad_ */ stevengj-nlopt-88c424d/src/algs/praxis/praxis.h000066400000000000000000000007041521061417600215410ustar00rootroot00000000000000#ifndef PRAXIS_H #define PRAXIS_H #include "nlopt-util.h" #include "nlopt.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef double (*praxis_func)(int n, const double *x, void *f_data); nlopt_result praxis_(double t0, double machep, double h0, int n, double *x, praxis_func f, void *f_data, nlopt_stopping *stop, double *minf); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* PRAXIS_H */ stevengj-nlopt-88c424d/src/algs/slsqp/000077500000000000000000000000001521061417600177155ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/slsqp/COPYRIGHT000066400000000000000000000046771521061417600212260ustar00rootroot00000000000000Copyright (c) 1988 Dieter Kraft Copyright (c) 1994 Association for Computing Machinery Copyright (c) 2001, 2002 Enthought, Inc. All rights reserved. Copyright (c) 2003-2009 SciPy Developers. All rights reserved. Copyright (c) 2010 Massachusetts Institute of Technology All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. b. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. c. Neither the name of the Enthought 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 REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. C http://permalink.gmane.org/gmane.comp.python.scientific.devel/6725 C ------ C From: Deborah Cotton C Date: Fri, 14 Sep 2007 12:35:55 -0500 C Subject: RE: Algorithm License requested C To: Alan Isaac C C Prof. Issac, C C In that case, then because the author consents to [the ACM] releasing C the code currently archived at http://www.netlib.org/toms/733 under the C BSD license, the ACM hereby releases this code under the BSD license. C C Regards, C C Deborah Cotton, Copyright & Permissions C ACM Publications C 2 Penn Plaza, Suite 701** C New York, NY 10121-0701 C permissions@acm.org C 212.869.7440 ext. 652 C Fax. 212.869.0481 C ------ stevengj-nlopt-88c424d/src/algs/slsqp/README000066400000000000000000000051501521061417600205760ustar00rootroot00000000000000This code implements a sequential quadratic programming (SQP) algorithm for nonlinearly constrained gradient-based optimization, and was originally written by Dieter Kraft and described in: Dieter Kraft, "A software package for sequential quadratic programming", Technical Report DFVLR-FB 88-28, Institut für Dynamik der Flugsysteme, Oberpfaffenhofen, July 1988. Dieter Kraft, "Algorithm 733: TOMP–Fortran modules for optimal control calculations," ACM Transactions on Mathematical Software, vol. 20, no. 3, pp. 262-281 (1994). (I believe that SLSQP stands for something like Sequential Least-Squares Quadratic Programming, because the problem is treated as a sequence of constrained least-squared problems, but such a least-squares problem is equivalent to a QP.) The actual Fortran file was obtained from the SciPy project, who are responsible for obtaining permission to distribute it under a free-software (3-clause BSD) license (see the permission email from ACM at the top of slsqp.c, and also projects.scipy.org/scipy/ticket/1056). The code was modified for inclusion in NLopt by S. G. Johnson in 2010, with the following changes. The code was converted to C and manually cleaned up. It was modified to be re-entrant, preserving the reverse-communication interface but explicitly saving the state in a data structure. The reverse-communication interface was wrapped with an NLopt-style interface, with NLopt stopping conditions. The inexact line search was modified to evaluate the functions including gradients for the first step, since this removes the need to evaluate the function+gradient a second time for the same point in the common case when the inexact line search concludes after a single step, since NLopt's interface combines the function and gradient computations. Since roundoff errors sometimes pushed SLSQP's parameters slightly outside the bound constraints (not allowed by NLopt), we added checks to force the parameters within the bounds. Fixed a bug in LSEI (use of uninitialized variables) for the case where the number of equality constraints equals the dimension of the problem. The LSQ subroutine was modified to handle infinite lower/upper bounds (in which case those constraints are omitted). The exact line-search option is currently disabled; if we want to re-enable this (although exact line-search is usually overkill in these kinds of algorithms), we plan to do so using a recursive call to NLopt. (This will allow a user-specified line-search algorithm to be used, and will allow the gradient to be exploited in the exact line search, in contrast to the routine provided with SLSQP.) stevengj-nlopt-88c424d/src/algs/slsqp/slsqp.c000066400000000000000000002376241521061417600212410ustar00rootroot00000000000000/* SLSQP: Sequentional Least Squares Programming (aka sequential quadratic programming SQP) method for nonlinearly constrained nonlinear optimization, by Dieter Kraft (1991). Fortran released under a free (BSD) license by ACM to the SciPy project and used there. C translation via f2c + hand-cleanup and incorporation into NLopt by S. G. Johnson (2009). */ /* Table of constant values */ #include #include #include #include "slsqp.h" /* ALGORITHM 733, COLLECTED ALGORITHMS FROM ACM. */ /* TRANSACTIONS ON MATHEMATICAL SOFTWARE, */ /* VOL. 20, NO. 3, SEPTEMBER, 1994, PP. 262-281. */ /* http://doi.acm.org/10.1145/192115.192124 */ /* http://permalink.gmane.org/gmane.comp.python.scientific.devel/6725 */ /* ------ */ /* From: Deborah Cotton */ /* Date: Fri, 14 Sep 2007 12:35:55 -0500 */ /* Subject: RE: Algorithm License requested */ /* To: Alan Isaac */ /* Prof. Issac, */ /* In that case, then because the author consents to [the ACM] releasing */ /* the code currently archived at http://www.netlib.org/toms/733 under the */ /* BSD license, the ACM hereby releases this code under the BSD license. */ /* Regards, */ /* Deborah Cotton, Copyright & Permissions */ /* ACM Publications */ /* 2 Penn Plaza, Suite 701** */ /* New York, NY 10121-0701 */ /* permissions@acm.org */ /* 212.869.7440 ext. 652 */ /* Fax. 212.869.0481 */ /* ------ */ /********************************* BLAS1 routines *************************/ /* COPIES A VECTOR, X, TO A VECTOR, Y, with the given increments */ static void dcopy___(int *n_, const double *dx, int incx, double *dy, int incy) { int i, n = *n_; if (n <= 0) return; if (incx == 1 && incy == 1) memcpy(dy, dx, sizeof(double) * ((unsigned) n)); else if (incx == 0 && incy == 1) { double x = dx[0]; for (i = 0; i < n; ++i) dy[i] = x; } else { for (i = 0; i < n; ++i) dy[i*incy] = dx[i*incx]; } } /* dcopy___ */ /* CONSTANT TIMES A VECTOR PLUS A VECTOR. */ static void daxpy_sl__(int *n_, const double *da_, const double *dx, int incx, double *dy, int incy) { int n = *n_, i; double da = *da_; if (n <= 0 || da == 0) return; for (i = 0; i < n; ++i) dy[i*incy] += da * dx[i*incx]; } /* dot product dx dot dy. */ static double ddot_sl__(int *n_, double *dx, int incx, double *dy, int incy) { int n = *n_, i; double sum = 0; if (n <= 0) return 0; for (i = 0; i < n; ++i) sum += dx[i*incx] * dy[i*incy]; return (double) sum; } /* compute the L2 norm of array DX of length N, stride INCX */ static double dnrm2___(int *n_, double *dx, int incx) { int i, n = *n_; double xmax = 0, scale; double sum = 0; for (i = 0; i < n; ++i) { double xabs = fabs(dx[incx*i]); if (xmax < xabs) xmax = xabs; } if (xmax == 0) return 0; scale = 1.0 / xmax; for (i = 0; i < n; ++i) { double xs = scale * dx[incx*i]; sum += xs * xs; } return xmax * sqrt((double) sum); } /* apply Givens rotation */ static void dsrot_(int n, double *dx, int incx, double *dy, int incy, double *c__, double *s_) { int i; double c = *c__, s = *s_; for (i = 0; i < n; ++i) { double x = dx[incx*i], y = dy[incy*i]; dx[incx*i] = c * x + s * y; dy[incy*i] = c * y - s * x; } } /* construct Givens rotation */ static void dsrotg_(double *da, double *db, double *c, double *s) { double absa, absb, roe, scale; absa = fabs(*da); absb = fabs(*db); if (absa > absb) { roe = *da; scale = absa; } else { roe = *db; scale = absb; } if (scale != 0) { double r, iscale = 1 / scale; double tmpa = (*da) * iscale, tmpb = (*db) * iscale; r = (roe < 0 ? -scale : scale) * sqrt((tmpa * tmpa) + (tmpb * tmpb)); *c = *da / r; *s = *db / r; *da = r; if (*c != 0 && fabs(*c) <= *s) *db = 1 / *c; else *db = *s; } else { *c = 1; *s = *da = *db = 0; } } /* scales vector X(n) by constant da */ static void dscal_sl__(int *n_, const double *da, double *dx, int incx) { int i, n = *n_; double alpha = *da; for (i = 0; i < n; ++i) dx[i*incx] *= alpha; } /**************************************************************************/ static const int c__0 = 0; static const int c__1 = 1; static const int c__2 = 2; #define MIN2(a,b) ((a) <= (b) ? (a) : (b)) #define MAX2(a,b) ((a) >= (b) ? (a) : (b)) static void h12_(const int *mode, int *lpivot, int *l1, int *m, double *u, const int *iue, double *up, double *c__, const int *ice, const int *icv, const int *ncv) { /* Initialized data */ const double one = 1.; /* System generated locals */ int u_dim1, u_offset, i__1, i__2; double d__1; /* Local variables */ double b; int i__, j, i2, i3, i4; double cl, sm; int incr; double clinv; /* C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 */ /* TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974 */ /* CONSTRUCTION AND/OR APPLICATION OF A SINGLE */ /* HOUSEHOLDER TRANSFORMATION Q = I + U*(U**T)/B */ /* MODE = 1 OR 2 TO SELECT ALGORITHM H1 OR H2 . */ /* LPIVOT IS THE INDEX OF THE PIVOT ELEMENT. */ /* L1,M IF L1 <= M THE TRANSFORMATION WILL BE CONSTRUCTED TO */ /* ZERO ELEMENTS INDEXED FROM L1 THROUGH M. */ /* IF L1 > M THE SUBROUTINE DOES AN IDENTITY TRANSFORMATION. */ /* U(),IUE,UP */ /* ON ENTRY TO H1 U() STORES THE PIVOT VECTOR. */ /* IUE IS THE STORAGE INCREMENT BETWEEN ELEMENTS. */ /* ON EXIT FROM H1 U() AND UP STORE QUANTITIES DEFINING */ /* THE VECTOR U OF THE HOUSEHOLDER TRANSFORMATION. */ /* ON ENTRY TO H2 U() AND UP */ /* SHOULD STORE QUANTITIES PREVIOUSLY COMPUTED BY H1. */ /* THESE WILL NOT BE MODIFIED BY H2. */ /* C() ON ENTRY TO H1 OR H2 C() STORES A MATRIX WHICH WILL BE */ /* REGARDED AS A SET OF VECTORS TO WHICH THE HOUSEHOLDER */ /* TRANSFORMATION IS TO BE APPLIED. */ /* ON EXIT C() STORES THE SET OF TRANSFORMED VECTORS. */ /* ICE STORAGE INCREMENT BETWEEN ELEMENTS OF VECTORS IN C(). */ /* ICV STORAGE INCREMENT BETWEEN VECTORS IN C(). */ /* NCV NUMBER OF VECTORS IN C() TO BE TRANSFORMED. */ /* IF NCV <= 0 NO OPERATIONS WILL BE DONE ON C(). */ /* Parameter adjustments */ u_dim1 = *iue; u_offset = 1 + u_dim1; u -= u_offset; --c__; /* Function Body */ if (0 >= *lpivot || *lpivot >= *l1 || *l1 > *m) { goto L80; } cl = (d__1 = u[*lpivot * u_dim1 + 1], fabs(d__1)); if (*mode == 2) { goto L30; } /* ****** CONSTRUCT THE TRANSFORMATION ****** */ i__1 = *m; for (j = *l1; j <= i__1; ++j) { sm = (d__1 = u[j * u_dim1 + 1], fabs(d__1)); /* L10: */ cl = MAX2(sm,cl); } if (cl <= 0.0) { goto L80; } clinv = one / cl; /* Computing 2nd power */ d__1 = u[*lpivot * u_dim1 + 1] * clinv; sm = d__1 * d__1; i__1 = *m; for (j = *l1; j <= i__1; ++j) { /* L20: */ /* Computing 2nd power */ d__1 = u[j * u_dim1 + 1] * clinv; sm += d__1 * d__1; } cl *= sqrt(sm); if (u[*lpivot * u_dim1 + 1] > 0.0) { cl = -cl; } *up = u[*lpivot * u_dim1 + 1] - cl; u[*lpivot * u_dim1 + 1] = cl; goto L40; /* ****** APPLY THE TRANSFORMATION I+U*(U**T)/B TO C ****** */ L30: if (cl <= 0.0) { goto L80; } L40: if (*ncv <= 0) { goto L80; } b = *up * u[*lpivot * u_dim1 + 1]; if (b >= 0.0) { goto L80; } b = one / b; i2 = 1 - *icv + *ice * (*lpivot - 1); incr = *ice * (*l1 - *lpivot); i__1 = *ncv; for (j = 1; j <= i__1; ++j) { i2 += *icv; i3 = i2 + incr; i4 = i3; sm = c__[i2] * *up; i__2 = *m; for (i__ = *l1; i__ <= i__2; ++i__) { sm += c__[i3] * u[i__ * u_dim1 + 1]; /* L50: */ i3 += *ice; } if (sm == 0.0) { goto L70; } sm *= b; c__[i2] += sm * *up; i__2 = *m; for (i__ = *l1; i__ <= i__2; ++i__) { c__[i4] += sm * u[i__ * u_dim1 + 1]; /* L60: */ i4 += *ice; } L70: ; } L80: return; } /* h12_ */ static void nnls_(double *a, int *mda, int *m, int * n, double *b, double *x, double *rnorm, double *w, double *z__, int *indx, int *mode) { /* Initialized data */ const double one = 1.; const double factor = .01; /* System generated locals */ int a_dim1, a_offset, i__1, i__2; double d__1; /* Local variables */ double c__; int i__, j, k, l; double s, t; int ii, jj, ip, iz, jz; double up; int iz1, iz2, npp1, iter; double wmax, alpha, asave; int itmax, izmax = 0, nsetp; double unorm; /* C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY: */ /* 'SOLVING LEAST SQUARES PROBLEMS'. PRENTICE-HALL.1974 */ /* ********** NONNEGATIVE LEAST SQUARES ********** */ /* GIVEN AN M BY N MATRIX, A, AND AN M-VECTOR, B, COMPUTE AN */ /* N-VECTOR, X, WHICH SOLVES THE LEAST SQUARES PROBLEM */ /* A*X = B SUBJECT TO X >= 0 */ /* A(),MDA,M,N */ /* MDA IS THE FIRST DIMENSIONING PARAMETER FOR THE ARRAY,A(). */ /* ON ENTRY A() CONTAINS THE M BY N MATRIX,A. */ /* ON EXIT A() CONTAINS THE PRODUCT Q*A, */ /* WHERE Q IS AN M BY M ORTHOGONAL MATRIX GENERATED */ /* IMPLICITLY BY THIS SUBROUTINE. */ /* EITHER M>=N OR M iz2 || nsetp >= *m) { goto L280; } i__1 = iz2; for (iz = iz1; iz <= i__1; ++iz) { j = indx[iz]; /* L120: */ i__2 = *m - nsetp; w[j] = ddot_sl__(&i__2, &a[npp1 + j * a_dim1], 1, &b[npp1], 1) ; } /* STEP THREE (TEST DUAL VARIABLES) */ L130: wmax = 0.0; i__2 = iz2; for (iz = iz1; iz <= i__2; ++iz) { j = indx[iz]; if (w[j] <= wmax) { goto L140; } wmax = w[j]; izmax = iz; L140: ; } /* .....EXIT LOOP A */ if (wmax <= 0.0) { goto L280; } iz = izmax; j = indx[iz]; /* STEP FOUR (TEST INDX J FOR LINEAR DEPENDENCY) */ asave = a[npp1 + j * a_dim1]; i__2 = npp1 + 1; h12_(&c__1, &npp1, &i__2, m, &a[j * a_dim1 + 1], &c__1, &up, &z__[1], & c__1, &c__1, &c__0); unorm = dnrm2___(&nsetp, &a[j * a_dim1 + 1], 1); t = factor * (d__1 = a[npp1 + j * a_dim1], fabs(d__1)); d__1 = unorm + t; if (d__1 - unorm <= 0.0) { goto L150; } dcopy___(m, &b[1], 1, &z__[1], 1); i__2 = npp1 + 1; h12_(&c__2, &npp1, &i__2, m, &a[j * a_dim1 + 1], &c__1, &up, &z__[1], & c__1, &c__1, &c__1); if (z__[npp1] / a[npp1 + j * a_dim1] > 0.0) { goto L160; } L150: a[npp1 + j * a_dim1] = asave; w[j] = 0.0; goto L130; /* STEP FIVE (ADD COLUMN) */ L160: dcopy___(m, &z__[1], 1, &b[1], 1); indx[iz] = indx[iz1]; indx[iz1] = j; ++iz1; nsetp = npp1; ++npp1; i__2 = iz2; for (jz = iz1; jz <= i__2; ++jz) { jj = indx[jz]; /* L170: */ h12_(&c__2, &nsetp, &npp1, m, &a[j * a_dim1 + 1], &c__1, &up, &a[jj * a_dim1 + 1], &c__1, mda, &c__1); } k = MIN2(npp1,*mda); w[j] = 0.0; i__2 = *m - nsetp; dcopy___(&i__2, &w[j], 0, &a[k + j * a_dim1], 1); /* STEP SIX (SOLVE LEAST SQUARES SUB-PROBLEM) */ /* .....ENTRY LOOP B */ L180: for (ip = nsetp; ip >= 1; --ip) { if (ip == nsetp) { goto L190; } d__1 = -z__[ip + 1]; daxpy_sl__(&ip, &d__1, &a[jj * a_dim1 + 1], 1, &z__[1], 1); L190: jj = indx[ip]; /* L200: */ z__[ip] /= a[ip + jj * a_dim1]; } ++iter; if (iter <= itmax) { goto L220; } L210: *mode = 3; goto L280; /* STEP SEVEN TO TEN (STEP LENGTH ALGORITHM) */ L220: alpha = one; jj = 0; i__2 = nsetp; for (ip = 1; ip <= i__2; ++ip) { if (z__[ip] > 0.0) { goto L230; } l = indx[ip]; t = -x[l] / (z__[ip] - x[l]); if (alpha < t) { goto L230; } alpha = t; jj = ip; L230: ; } i__2 = nsetp; for (ip = 1; ip <= i__2; ++ip) { l = indx[ip]; /* L240: */ x[l] = (one - alpha) * x[l] + alpha * z__[ip]; } /* .....EXIT LOOP B */ if (jj == 0) { goto L110; } /* STEP ELEVEN (DELETE COLUMN) */ i__ = indx[jj]; L250: x[i__] = 0.0; ++jj; i__2 = nsetp; for (j = jj; j <= i__2; ++j) { ii = indx[j]; indx[j - 1] = ii; dsrotg_(&a[j - 1 + ii * a_dim1], &a[j + ii * a_dim1], &c__, &s); t = a[j - 1 + ii * a_dim1]; dsrot_(*n, &a[j - 1 + a_dim1], *mda, &a[j + a_dim1], *mda, &c__, &s); a[j - 1 + ii * a_dim1] = t; a[j + ii * a_dim1] = 0.0; /* L260: */ dsrot_(1, &b[j - 1], 1, &b[j], 1, &c__, &s); } npp1 = nsetp; --nsetp; --iz1; indx[iz1] = i__; if (nsetp <= 0) { goto L210; } i__2 = nsetp; for (jj = 1; jj <= i__2; ++jj) { i__ = indx[jj]; if (x[i__] <= 0.0) { goto L250; } /* L270: */ } dcopy___(m, &b[1], 1, &z__[1], 1); goto L180; /* STEP TWELVE (SOLUTION) */ L280: k = MIN2(npp1,*m); i__2 = *m - nsetp; *rnorm = dnrm2___(&i__2, &b[k], 1); if (npp1 > *m) { w[1] = 0.0; dcopy___(n, &w[1], 0, &w[1], 1); } /* END OF SUBROUTINE NNLS */ L290: return; } /* nnls_ */ static void ldp_(double *g, int *mg, int *m, int *n, double *h__, double *x, double *xnorm, double *w, int *indx, int *mode) { /* Initialized data */ const double one = 1.; /* System generated locals */ int g_dim1, g_offset, i__1, i__2; double d__1; /* Local variables */ int i__, j, n1, if__, iw, iy, iz; double fac; double rnorm; int iwdual; /* T */ /* MINIMIZE 1/2 X X SUBJECT TO G * X >= H. */ /* C.L. LAWSON, R.J. HANSON: 'SOLVING LEAST SQUARES PROBLEMS' */ /* PRENTICE HALL, ENGLEWOOD CLIFFS, NEW JERSEY, 1974. */ /* PARAMETER DESCRIPTION: */ /* G(),MG,M,N ON ENTRY G() STORES THE M BY N MATRIX OF */ /* LINEAR INEQUALITY CONSTRAINTS. G() HAS FIRST */ /* DIMENSIONING PARAMETER MG */ /* H() ON ENTRY H() STORES THE M VECTOR H REPRESENTING */ /* THE RIGHT SIDE OF THE INEQUALITY SYSTEM */ /* REMARK: G(),H() WILL NOT BE CHANGED DURING CALCULATIONS BY LDP */ /* X() ON ENTRY X() NEED NOT BE INITIALIZED. */ /* ON EXIT X() STORES THE SOLUTION VECTOR X IF MODE=1. */ /* XNORM ON EXIT XNORM STORES THE EUCLIDIAN NORM OF THE */ /* SOLUTION VECTOR IF COMPUTATION IS SUCCESSFUL */ /* W() W IS A ONE DIMENSIONAL WORKING SPACE, THE LENGTH */ /* OF WHICH SHOULD BE AT LEAST (M+2)*(N+1) + 2*M */ /* ON EXIT W() STORES THE LAGRANGE MULTIPLIERS */ /* ASSOCIATED WITH THE CONSTRAINTS */ /* AT THE SOLUTION OF PROBLEM LDP */ /* INDX() INDX() IS A ONE DIMENSIONAL INT WORKING SPACE */ /* OF LENGTH AT LEAST M */ /* MODE MODE IS A SUCCESS-FAILURE FLAG WITH THE FOLLOWING */ /* MEANINGS: */ /* MODE=1: SUCCESSFUL COMPUTATION */ /* 2: ERROR RETURN BECAUSE OF WRONG DIMENSIONS (N.LE.0) */ /* 3: ITERATION COUNT EXCEEDED BY NNLS */ /* 4: INEQUALITY CONSTRAINTS INCOMPATIBLE */ /* Parameter adjustments */ --indx; --h__; --x; g_dim1 = *mg; g_offset = 1 + g_dim1; g -= g_offset; --w; /* Function Body */ *mode = 2; if (*n <= 0) { goto L50; } /* STATE DUAL PROBLEM */ *mode = 1; x[1] = 0.0; dcopy___(n, &x[1], 0, &x[1], 1); *xnorm = 0.0; if (*m == 0) { goto L50; } iw = 0; i__1 = *m; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ++iw; /* L10: */ w[iw] = g[j + i__ * g_dim1]; } ++iw; /* L20: */ w[iw] = h__[j]; } if__ = iw + 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ++iw; /* L30: */ w[iw] = 0.0; } w[iw + 1] = one; n1 = *n + 1; iz = iw + 2; iy = iz + n1; iwdual = iy + *m; /* SOLVE DUAL PROBLEM */ nnls_(&w[1], &n1, &n1, m, &w[if__], &w[iy], &rnorm, &w[iwdual], &w[iz], & indx[1], mode); if (*mode != 1) { goto L50; } *mode = 4; if (rnorm <= 0.0) { goto L50; } /* COMPUTE SOLUTION OF PRIMAL PROBLEM */ fac = one - ddot_sl__(m, &h__[1], 1, &w[iy], 1); d__1 = one + fac; if (d__1 - one <= 0.0) { goto L50; } *mode = 1; fac = one / fac; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* L40: */ x[j] = fac * ddot_sl__(m, &g[j * g_dim1 + 1], 1, &w[iy], 1); } *xnorm = dnrm2___(n, &x[1], 1); /* COMPUTE LAGRANGE MULTIPLIERS FOR PRIMAL PROBLEM */ w[1] = 0.0; dcopy___(m, &w[1], 0, &w[1], 1); daxpy_sl__(m, &fac, &w[iy], 1, &w[1], 1); /* END OF SUBROUTINE LDP */ L50: return; } /* ldp_ */ static void lsi_(double *e, double *f, double *g, double *h__, int *le, int *me, int *lg, int *mg, int *n, double *x, double *xnorm, double *w, int * jw, int *mode) { /* Initialized data */ const double epmach = 2.22e-16; const double one = 1.; /* System generated locals */ int e_dim1, e_offset, g_dim1, g_offset, i__1, i__2, i__3; double d__1; /* Local variables */ int i__, j; double t; /* FOR MODE=1, THE SUBROUTINE RETURNS THE SOLUTION X OF */ /* INEQUALITY CONSTRAINED LINEAR LEAST SQUARES PROBLEM: */ /* MIN ||E*X-F|| */ /* X */ /* S.T. G*X >= H */ /* THE ALGORITHM IS BASED ON QR DECOMPOSITION AS DESCRIBED IN */ /* CHAPTER 23.5 OF LAWSON & HANSON: SOLVING LEAST SQUARES PROBLEMS */ /* THE FOLLOWING DIMENSIONS OF THE ARRAYS DEFINING THE PROBLEM */ /* ARE NECESSARY */ /* DIM(E) : FORMAL (LE,N), ACTUAL (ME,N) */ /* DIM(F) : FORMAL (LE ), ACTUAL (ME ) */ /* DIM(G) : FORMAL (LG,N), ACTUAL (MG,N) */ /* DIM(H) : FORMAL (LG ), ACTUAL (MG ) */ /* DIM(X) : N */ /* DIM(W) : (N+1)*(MG+2) + 2*MG */ /* DIM(JW): LG */ /* ON ENTRY, THE USER HAS TO PROVIDE THE ARRAYS E, F, G, AND H. */ /* ON RETURN, ALL ARRAYS WILL BE CHANGED BY THE SUBROUTINE. */ /* X STORES THE SOLUTION VECTOR */ /* XNORM STORES THE RESIDUUM OF THE SOLUTION IN EUCLIDIAN NORM */ /* W STORES THE VECTOR OF LAGRANGE MULTIPLIERS IN ITS FIRST */ /* MG ELEMENTS */ /* MODE IS A SUCCESS-FAILURE FLAG WITH THE FOLLOWING MEANINGS: */ /* MODE=1: SUCCESSFUL COMPUTATION */ /* 2: ERROR RETURN BECAUSE OF WRONG DIMENSIONS (N<1) */ /* 3: ITERATION COUNT EXCEEDED BY NNLS */ /* 4: INEQUALITY CONSTRAINTS INCOMPATIBLE */ /* 5: MATRIX E IS NOT OF FULL RANK */ /* 03.01.1980, DIETER KRAFT: CODED */ /* 20.03.1987, DIETER KRAFT: REVISED TO FORTRAN 77 */ /* Parameter adjustments */ --f; --jw; --h__; --x; g_dim1 = *lg; g_offset = 1 + g_dim1; g -= g_offset; e_dim1 = *le; e_offset = 1 + e_dim1; e -= e_offset; --w; /* Function Body */ /* QR-FACTORS OF E AND APPLICATION TO F */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ i__2 = i__ + 1; j = MIN2(i__2,*n); i__2 = i__ + 1; i__3 = *n - i__; h12_(&c__1, &i__, &i__2, me, &e[i__ * e_dim1 + 1], &c__1, &t, &e[j * e_dim1 + 1], &c__1, le, &i__3); /* L10: */ i__2 = i__ + 1; h12_(&c__2, &i__, &i__2, me, &e[i__ * e_dim1 + 1], &c__1, &t, &f[1], & c__1, &c__1, &c__1); } /* TRANSFORM G AND H TO GET LEAST DISTANCE PROBLEM */ *mode = 5; i__2 = *mg; for (i__ = 1; i__ <= i__2; ++i__) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if ((d__1 = e[j + j * e_dim1], fabs(d__1)) < epmach) { goto L50; } /* L20: */ i__3 = j - 1; g[i__ + j * g_dim1] = (g[i__ + j * g_dim1] - ddot_sl__(&i__3, &g[ i__ + g_dim1], *lg, &e[j * e_dim1 + 1], 1)) / e[j + j * e_dim1]; } /* L30: */ h__[i__] -= ddot_sl__(n, &g[i__ + g_dim1], *lg, &f[1], 1); } /* SOLVE LEAST DISTANCE PROBLEM */ ldp_(&g[g_offset], lg, mg, n, &h__[1], &x[1], xnorm, &w[1], &jw[1], mode); if (*mode != 1) { goto L50; } /* SOLUTION OF ORIGINAL PROBLEM */ daxpy_sl__(n, &one, &f[1], 1, &x[1], 1); for (i__ = *n; i__ >= 1; --i__) { /* Computing MIN */ i__2 = i__ + 1; j = MIN2(i__2,*n); /* L40: */ i__2 = *n - i__; x[i__] = (x[i__] - ddot_sl__(&i__2, &e[i__ + j * e_dim1], *le, &x[j], 1)) / e[i__ + i__ * e_dim1]; } /* Computing MIN */ i__2 = *n + 1; j = MIN2(i__2,*me); i__2 = *me - *n; t = dnrm2___(&i__2, &f[j], 1); *xnorm = sqrt(*xnorm * *xnorm + t * t); /* END OF SUBROUTINE LSI */ L50: return; } /* lsi_ */ static void hfti_(double *a, int *mda, int *m, int * n, double *b, int *mdb, const int *nb, double *tau, int *krank, double *rnorm, double *h__, double *g, int * ip) { /* Initialized data */ const double factor = .001; /* System generated locals */ int a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; double d__1; /* Local variables */ int i__, j, k, l; int jb, kp1; double tmp, hmax; int lmax, ldiag; /* RANK-DEFICIENT LEAST SQUARES ALGORITHM AS DESCRIBED IN: */ /* C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 */ /* TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974 */ /* A(*,*),MDA,M,N THE ARRAY A INITIALLY CONTAINS THE M x N MATRIX A */ /* OF THE LEAST SQUARES PROBLEM AX = B. */ /* THE FIRST DIMENSIONING PARAMETER MDA MUST SATISFY */ /* MDA >= M. EITHER M >= N OR M < N IS PERMITTED. */ /* THERE IS NO RESTRICTION ON THE RANK OF A. */ /* THE MATRIX A WILL BE MODIFIED BY THE SUBROUTINE. */ /* B(*,*),MDB,NB IF NB = 0 THE SUBROUTINE WILL MAKE NO REFERENCE */ /* TO THE ARRAY B. IF NB > 0 THE ARRAY B() MUST */ /* INITIALLY CONTAIN THE M x NB MATRIX B OF THE */ /* THE LEAST SQUARES PROBLEM AX = B AND ON RETURN */ /* THE ARRAY B() WILL CONTAIN THE N x NB SOLUTION X. */ /* IF NB>1 THE ARRAY B() MUST BE DOUBLE SUBSCRIPTED */ /* WITH FIRST DIMENSIONING PARAMETER MDB>=MAX(M,N), */ /* IF NB=1 THE ARRAY B() MAY BE EITHER SINGLE OR */ /* DOUBLE SUBSCRIPTED. */ /* TAU ABSOLUTE TOLERANCE PARAMETER FOR PSEUDORANK */ /* DETERMINATION, PROVIDED BY THE USER. */ /* KRANK PSEUDORANK OF A, SET BY THE SUBROUTINE. */ /* RNORM ON EXIT, RNORM(J) WILL CONTAIN THE EUCLIDIAN */ /* NORM OF THE RESIDUAL VECTOR FOR THE PROBLEM */ /* DEFINED BY THE J-TH COLUMN VECTOR OF THE ARRAY B. */ /* H(), G() ARRAYS OF WORKING SPACE OF LENGTH >= N. */ /* IP() INT ARRAY OF WORKING SPACE OF LENGTH >= N */ /* RECORDING PERMUTATION INDICES OF COLUMN VECTORS */ /* Parameter adjustments */ --ip; --g; --h__; a_dim1 = *mda; a_offset = 1 + a_dim1; a -= a_offset; --rnorm; b_dim1 = *mdb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ k = 0; ldiag = MIN2(*m,*n); if (ldiag <= 0) { goto L270; } /* COMPUTE LMAX */ i__1 = ldiag; for (j = 1; j <= i__1; ++j) { if (j == 1) { goto L20; } lmax = j; i__2 = *n; for (l = j; l <= i__2; ++l) { /* Computing 2nd power */ d__1 = a[j - 1 + l * a_dim1]; h__[l] -= d__1 * d__1; /* L10: */ if (h__[l] > h__[lmax]) { lmax = l; } } d__1 = hmax + factor * h__[lmax]; if (d__1 - hmax > 0.0) { goto L50; } L20: lmax = j; i__2 = *n; for (l = j; l <= i__2; ++l) { h__[l] = 0.0; i__3 = *m; for (i__ = j; i__ <= i__3; ++i__) { /* L30: */ /* Computing 2nd power */ d__1 = a[i__ + l * a_dim1]; h__[l] += d__1 * d__1; } /* L40: */ if (h__[l] > h__[lmax]) { lmax = l; } } hmax = h__[lmax]; /* COLUMN INTERCHANGES IF NEEDED */ L50: ip[j] = lmax; if (ip[j] == j) { goto L70; } i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { tmp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = a[i__ + lmax * a_dim1]; /* L60: */ a[i__ + lmax * a_dim1] = tmp; } h__[lmax] = h__[j]; /* J-TH TRANSFORMATION AND APPLICATION TO A AND B */ L70: /* Computing MIN */ i__2 = j + 1; i__ = MIN2(i__2,*n); i__2 = j + 1; i__3 = *n - j; h12_(&c__1, &j, &i__2, m, &a[j * a_dim1 + 1], &c__1, &h__[j], &a[i__ * a_dim1 + 1], &c__1, mda, &i__3); /* L80: */ i__2 = j + 1; h12_(&c__2, &j, &i__2, m, &a[j * a_dim1 + 1], &c__1, &h__[j], &b[ b_offset], &c__1, mdb, nb); } /* DETERMINE PSEUDORANK */ i__2 = ldiag; for (j = 1; j <= i__2; ++j) { /* L90: */ if ((d__1 = a[j + j * a_dim1], fabs(d__1)) <= *tau) { goto L100; } } k = ldiag; goto L110; L100: k = j - 1; L110: kp1 = k + 1; /* NORM OF RESIDUALS */ i__2 = *nb; for (jb = 1; jb <= i__2; ++jb) { /* L130: */ i__1 = *m - k; rnorm[jb] = dnrm2___(&i__1, &b[kp1 + jb * b_dim1], 1); } if (k > 0) { goto L160; } i__1 = *nb; for (jb = 1; jb <= i__1; ++jb) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* L150: */ b[i__ + jb * b_dim1] = 0.0; } } goto L270; L160: if (k == *n) { goto L180; } /* HOUSEHOLDER DECOMPOSITION OF FIRST K ROWS */ for (i__ = k; i__ >= 1; --i__) { /* L170: */ i__2 = i__ - 1; h12_(&c__1, &i__, &kp1, n, &a[i__ + a_dim1], mda, &g[i__], &a[ a_offset], mda, &c__1, &i__2); } L180: i__2 = *nb; for (jb = 1; jb <= i__2; ++jb) { /* SOLVE K*K TRIANGULAR SYSTEM */ for (i__ = k; i__ >= 1; --i__) { /* Computing MIN */ i__1 = i__ + 1; j = MIN2(i__1,*n); /* L210: */ i__1 = k - i__; b[i__ + jb * b_dim1] = (b[i__ + jb * b_dim1] - ddot_sl__(&i__1, & a[i__ + j * a_dim1], *mda, &b[j + jb * b_dim1], 1)) / a[i__ + i__ * a_dim1]; } /* COMPLETE SOLUTION VECTOR */ if (k == *n) { goto L240; } i__1 = *n; for (j = kp1; j <= i__1; ++j) { /* L220: */ b[j + jb * b_dim1] = 0.0; } i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* L230: */ h12_(&c__2, &i__, &kp1, n, &a[i__ + a_dim1], mda, &g[i__], &b[jb * b_dim1 + 1], &c__1, mdb, &c__1); } /* REORDER SOLUTION ACCORDING TO PREVIOUS COLUMN INTERCHANGES */ L240: for (j = ldiag; j >= 1; --j) { if (ip[j] == j) { goto L250; } l = ip[j]; tmp = b[l + jb * b_dim1]; b[l + jb * b_dim1] = b[j + jb * b_dim1]; b[j + jb * b_dim1] = tmp; L250: ; } } L270: *krank = k; } /* hfti_ */ static void lsei_(double *c__, double *d__, double *e, double *f, double *g, double *h__, int *lc, int * mc, int *le, int *me, int *lg, int *mg, int *n, double *x, double *xnrm, double *w, int *jw, int * mode) { /* Initialized data */ const double epmach = 2.22e-16; /* System generated locals */ int c_dim1, c_offset, e_dim1, e_offset, g_dim1, g_offset, i__1, i__2, i__3; double d__1; /* Local variables */ int i__, j, k, l; double t; int ie, if__, ig, iw, mc1; int krank; /* FOR MODE=1, THE SUBROUTINE RETURNS THE SOLUTION X OF */ /* EQUALITY & INEQUALITY CONSTRAINED LEAST SQUARES PROBLEM LSEI : */ /* MIN ||E*X - F|| */ /* X */ /* S.T. C*X = D, */ /* G*X >= H. */ /* USING QR DECOMPOSITION & ORTHOGONAL BASIS OF NULLSPACE OF C */ /* CHAPTER 23.6 OF LAWSON & HANSON: SOLVING LEAST SQUARES PROBLEMS. */ /* THE FOLLOWING DIMENSIONS OF THE ARRAYS DEFINING THE PROBLEM */ /* ARE NECESSARY */ /* DIM(E) : FORMAL (LE,N), ACTUAL (ME,N) */ /* DIM(F) : FORMAL (LE ), ACTUAL (ME ) */ /* DIM(C) : FORMAL (LC,N), ACTUAL (MC,N) */ /* DIM(D) : FORMAL (LC ), ACTUAL (MC ) */ /* DIM(G) : FORMAL (LG,N), ACTUAL (MG,N) */ /* DIM(H) : FORMAL (LG ), ACTUAL (MG ) */ /* DIM(X) : FORMAL (N ), ACTUAL (N ) */ /* DIM(W) : 2*MC+ME+(ME+MG)*(N-MC) for LSEI */ /* +(N-MC+1)*(MG+2)+2*MG for LSI */ /* DIM(JW): MAX(MG,L) */ /* ON ENTRY, THE USER HAS TO PROVIDE THE ARRAYS C, D, E, F, G, AND H. */ /* ON RETURN, ALL ARRAYS WILL BE CHANGED BY THE SUBROUTINE. */ /* X STORES THE SOLUTION VECTOR */ /* XNORM STORES THE RESIDUUM OF THE SOLUTION IN EUCLIDIAN NORM */ /* W STORES THE VECTOR OF LAGRANGE MULTIPLIERS IN ITS FIRST */ /* MC+MG ELEMENTS */ /* MODE IS A SUCCESS-FAILURE FLAG WITH THE FOLLOWING MEANINGS: */ /* MODE=1: SUCCESSFUL COMPUTATION */ /* 2: ERROR RETURN BECAUSE OF WRONG DIMENSIONS (N<1) */ /* 3: ITERATION COUNT EXCEEDED BY NNLS */ /* 4: INEQUALITY CONSTRAINTS INCOMPATIBLE */ /* 5: MATRIX E IS NOT OF FULL RANK */ /* 6: MATRIX C IS NOT OF FULL RANK */ /* 7: RANK DEFECT IN HFTI */ /* 18.5.1981, DIETER KRAFT, DFVLR OBERPFAFFENHOFEN */ /* 20.3.1987, DIETER KRAFT, DFVLR OBERPFAFFENHOFEN */ /* Parameter adjustments */ --d__; --f; --h__; --x; g_dim1 = *lg; g_offset = 1 + g_dim1; g -= g_offset; e_dim1 = *le; e_offset = 1 + e_dim1; e -= e_offset; c_dim1 = *lc; c_offset = 1 + c_dim1; c__ -= c_offset; --w; --jw; /* Function Body */ *mode = 2; if (*mc > *n) { goto L75; } l = *n - *mc; mc1 = *mc + 1; iw = (l + 1) * (*mg + 2) + (*mg << 1) + *mc; ie = iw + *mc + 1; if__ = ie + *me * l; ig = if__ + *me; /* TRIANGULARIZE C AND APPLY FACTORS TO E AND G */ i__1 = *mc; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ i__2 = i__ + 1; j = MIN2(i__2,*lc); i__2 = i__ + 1; i__3 = *mc - i__; h12_(&c__1, &i__, &i__2, n, &c__[i__ + c_dim1], lc, &w[iw + i__], & c__[j + c_dim1], lc, &c__1, &i__3); i__2 = i__ + 1; h12_(&c__2, &i__, &i__2, n, &c__[i__ + c_dim1], lc, &w[iw + i__], &e[ e_offset], le, &c__1, me); /* L10: */ i__2 = i__ + 1; h12_(&c__2, &i__, &i__2, n, &c__[i__ + c_dim1], lc, &w[iw + i__], &g[ g_offset], lg, &c__1, mg); } /* SOLVE C*X=D AND MODIFY F */ *mode = 6; i__2 = *mc; for (i__ = 1; i__ <= i__2; ++i__) { if ((d__1 = c__[i__ + i__ * c_dim1], fabs(d__1)) < epmach) { goto L75; } i__1 = i__ - 1; x[i__] = (d__[i__] - ddot_sl__(&i__1, &c__[i__ + c_dim1], *lc, &x[1], 1)) / c__[i__ + i__ * c_dim1]; /* L15: */ } *mode = 1; w[mc1] = 0.0; i__2 = *mg; /* BUGFIX for *mc == *n: changed from *mg - *mc, SGJ 2010 */ dcopy___(&i__2, &w[mc1], 0, &w[mc1], 1); if (*mc == *n) { goto L50; } i__2 = *me; for (i__ = 1; i__ <= i__2; ++i__) { /* L20: */ w[if__ - 1 + i__] = f[i__] - ddot_sl__(mc, &e[i__ + e_dim1], *le, &x[1], 1); } /* STORE TRANSFORMED E & G */ i__2 = *me; for (i__ = 1; i__ <= i__2; ++i__) { /* L25: */ dcopy___(&l, &e[i__ + mc1 * e_dim1], *le, &w[ie - 1 + i__], *me); } i__2 = *mg; for (i__ = 1; i__ <= i__2; ++i__) { /* L30: */ dcopy___(&l, &g[i__ + mc1 * g_dim1], *lg, &w[ig - 1 + i__], *mg); } if (*mg > 0) { goto L40; } /* SOLVE LS WITHOUT INEQUALITY CONSTRAINTS */ *mode = 7; k = MAX2(*le,*n); t = sqrt(epmach); hfti_(&w[ie], me, me, &l, &w[if__], &k, &c__1, &t, &krank, xnrm, &w[1], & w[l + 1], &jw[1]); dcopy___(&l, &w[if__], 1, &x[mc1], 1); if (krank != l) { goto L75; } *mode = 1; goto L50; /* MODIFY H AND SOLVE INEQUALITY CONSTRAINED LS PROBLEM */ L40: i__2 = *mg; for (i__ = 1; i__ <= i__2; ++i__) { /* L45: */ h__[i__] -= ddot_sl__(mc, &g[i__ + g_dim1], *lg, &x[1], 1); } lsi_(&w[ie], &w[if__], &w[ig], &h__[1], me, me, mg, mg, &l, &x[mc1], xnrm, &w[mc1], &jw[1], mode); if (*mc == 0) { goto L75; } t = dnrm2___(mc, &x[1], 1); *xnrm = sqrt(*xnrm * *xnrm + t * t); if (*mode != 1) { goto L75; } /* SOLUTION OF ORIGINAL PROBLEM AND LAGRANGE MULTIPLIERS */ L50: i__2 = *me; for (i__ = 1; i__ <= i__2; ++i__) { /* L55: */ f[i__] = ddot_sl__(n, &e[i__ + e_dim1], *le, &x[1], 1) - f[i__]; } i__2 = *mc; for (i__ = 1; i__ <= i__2; ++i__) { /* L60: */ d__[i__] = ddot_sl__(me, &e[i__ * e_dim1 + 1], 1, &f[1], 1) - ddot_sl__(mg, &g[i__ * g_dim1 + 1], 1, &w[mc1], 1); } for (i__ = *mc; i__ >= 1; --i__) { /* L65: */ i__2 = i__ + 1; h12_(&c__2, &i__, &i__2, n, &c__[i__ + c_dim1], lc, &w[iw + i__], &x[ 1], &c__1, &c__1, &c__1); } for (i__ = *mc; i__ >= 1; --i__) { /* Computing MIN */ i__2 = i__ + 1; j = MIN2(i__2,*lc); i__2 = *mc - i__; w[i__] = (d__[i__] - ddot_sl__(&i__2, &c__[j + i__ * c_dim1], 1, & w[j], 1)) / c__[i__ + i__ * c_dim1]; /* L70: */ } /* END OF SUBROUTINE LSEI */ L75: return; } /* lsei_ */ static void lsq_(int *m, int *meq, int *n, int *nl, int *la, double *l, double *g, double *a, double * b, const double *xl, const double *xu, double *x, double *y, double *w, int *jw, int *mode) { /* Initialized data */ const double one = 1.; /* System generated locals */ int a_dim1, a_offset, i__1, i__2; double d__1; /* Local variables */ int i__, i1, i2, i3, i4, m1, n1, n2, n3, ic, id, ie, if__, ig, ih, il, im, ip, iu, iw; double diag; int mineq; double xnorm = 0.0; /* MINIMIZE with respect to X */ /* ||E*X - F|| */ /* 1/2 T */ /* WITH UPPER TRIANGULAR MATRIX E = +D *L , */ /* -1/2 -1 */ /* AND VECTOR F = -D *L *G, */ /* WHERE THE UNIT LOWER TRIDIANGULAR MATRIX L IS STORED COLUMNWISE */ /* DENSE IN THE N*(N+1)/2 ARRAY L WITH VECTOR D STORED IN ITS */ /* 'DIAGONAL' THUS SUBSTITUTING THE ONE-ELEMENTS OF L */ /* SUBJECT TO */ /* A(J)*X - B(J) = 0 , J=1,...,MEQ, */ /* A(J)*X - B(J) >=0, J=MEQ+1,...,M, */ /* XL(I) <= X(I) <= XU(I), I=1,...,N, */ /* ON ENTRY, THE USER HAS TO PROVIDE THE ARRAYS L, G, A, B, XL, XU. */ /* WITH DIMENSIONS: L(N*(N+1)/2), G(N), A(LA,N), B(M), XL(N), XU(N) */ /* THE WORKING ARRAY W MUST HAVE AT LEAST THE FOLLOWING DIMENSION: */ /* DIM(W) = (3*N+M)*(N+1) for LSQ */ /* +(N-MEQ+1)*(MINEQ+2) + 2*MINEQ for LSI */ /* +(N+MINEQ)*(N-MEQ) + 2*MEQ + N for LSEI */ /* with MINEQ = M - MEQ + 2*N */ /* ON RETURN, NO ARRAY WILL BE CHANGED BY THE SUBROUTINE. */ /* X STORES THE N-DIMENSIONAL SOLUTION VECTOR */ /* Y STORES THE VECTOR OF LAGRANGE MULTIPLIERS OF DIMENSION */ /* M+N+N (CONSTRAINTS+LOWER+UPPER BOUNDS) */ /* MODE IS A SUCCESS-FAILURE FLAG WITH THE FOLLOWING MEANINGS: */ /* MODE=1: SUCCESSFUL COMPUTATION */ /* 2: ERROR RETURN BECAUSE OF WRONG DIMENSIONS (N<1) */ /* 3: ITERATION COUNT EXCEEDED BY NNLS */ /* 4: INEQUALITY CONSTRAINTS INCOMPATIBLE */ /* 5: MATRIX E IS NOT OF FULL RANK */ /* 6: MATRIX C IS NOT OF FULL RANK */ /* 7: RANK DEFECT IN HFTI */ /* coded Dieter Kraft, april 1987 */ /* revised march 1989 */ /* Parameter adjustments */ --y; --x; --xu; --xl; --g; --l; --b; a_dim1 = *la; a_offset = 1 + a_dim1; a -= a_offset; --w; --jw; /* Function Body */ n1 = *n + 1; mineq = *m - *meq; m1 = mineq + *n + *n; /* determine whether to solve problem */ /* with inconsistent linerarization (n2=1) */ /* or not (n2=0) */ n2 = n1 * *n / 2 + 1; if (n2 == *nl) { n2 = 0; } else { n2 = 1; } n3 = *n - n2; /* RECOVER MATRIX E AND VECTOR F FROM L AND G */ i2 = 1; i3 = 1; i4 = 1; ie = 1; if__ = *n * *n + 1; i__1 = n3; for (i__ = 1; i__ <= i__1; ++i__) { i1 = n1 - i__; diag = sqrt(l[i2]); w[i3] = 0.0; dcopy___(&i1, &w[i3], 0, &w[i3], 1); i__2 = i1 - n2; dcopy___(&i__2, &l[i2], 1, &w[i3], *n); i__2 = i1 - n2; dscal_sl__(&i__2, &diag, &w[i3], *n); w[i3] = diag; i__2 = i__ - 1; w[if__ - 1 + i__] = (g[i__] - ddot_sl__(&i__2, &w[i4], 1, &w[if__] , 1)) / diag; i2 = i2 + i1 - n2; i3 += n1; i4 += *n; /* L10: */ } if (n2 == 1) { w[i3] = l[*nl]; w[i4] = 0.0; dcopy___(&n3, &w[i4], 0, &w[i4], 1); w[if__ - 1 + *n] = 0.0; } d__1 = -one; dscal_sl__(n, &d__1, &w[if__], 1); ic = if__ + *n; id = ic + *meq * *n; if (*meq > 0) { /* RECOVER MATRIX C FROM UPPER PART OF A */ i__1 = *meq; for (i__ = 1; i__ <= i__1; ++i__) { dcopy___(n, &a[i__ + a_dim1], *la, &w[ic - 1 + i__], *meq); /* L20: */ } /* RECOVER VECTOR D FROM UPPER PART OF B */ dcopy___(meq, &b[1], 1, &w[id], 1); d__1 = -one; dscal_sl__(meq, &d__1, &w[id], 1); } ig = id + *meq; if (mineq > 0) { /* RECOVER MATRIX G FROM LOWER PART OF A */ i__1 = mineq; for (i__ = 1; i__ <= i__1; ++i__) { dcopy___(n, &a[*meq + i__ + a_dim1], *la, &w[ig - 1 + i__], m1); /* L30: */ } } /* AUGMENT MATRIX G BY +I AND -I */ ip = ig + mineq; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { w[ip - 1 + i__] = 0.0; dcopy___(n, &w[ip - 1 + i__], 0, &w[ip - 1 + i__], m1); /* L40: */ } i__1 = m1 + 1; /* SGJ, 2010: skip constraints for infinite bounds */ for (i__ = 1; i__ <= *n; ++i__) if (!nlopt_isinf(xl[i__])) w[(ip - i__1) + i__ * i__1] = +1.0; /* Old code: w[ip] = one; dcopy___(n, &w[ip], 0, &w[ip], i__1); */ im = ip + *n; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { w[im - 1 + i__] = 0.0; dcopy___(n, &w[im - 1 + i__], 0, &w[im - 1 + i__], m1); /* L50: */ } i__1 = m1 + 1; /* SGJ, 2010: skip constraints for infinite bounds */ for (i__ = 1; i__ <= *n; ++i__) if (!nlopt_isinf(xu[i__])) w[(im - i__1) + i__ * i__1] = -1.0; /* Old code: w[im] = -one; dcopy___(n, &w[im], 0, &w[im], i__1); */ ih = ig + m1 * *n; if (mineq > 0) { /* RECOVER H FROM LOWER PART OF B */ dcopy___(&mineq, &b[*meq + 1], 1, &w[ih], 1); d__1 = -one; dscal_sl__(&mineq, &d__1, &w[ih], 1); } /* AUGMENT VECTOR H BY XL AND XU */ il = ih + mineq; iu = il + *n; /* SGJ, 2010: skip constraints for infinite bounds */ for (i__ = 1; i__ <= *n; ++i__) { w[(il-1) + i__] = nlopt_isinf(xl[i__]) ? 0 : xl[i__]; w[(iu-1) + i__] = nlopt_isinf(xu[i__]) ? 0 : -xu[i__]; } /* Old code: dcopy___(n, &xl[1], 1, &w[il], 1); dcopy___(n, &xu[1], 1, &w[iu], 1); d__1 = -one; dscal_sl__(n, &d__1, &w[iu], 1); */ iw = iu + *n; i__1 = MAX2(1,*meq); lsei_(&w[ic], &w[id], &w[ie], &w[if__], &w[ig], &w[ih], &i__1, meq, n, n, &m1, &m1, n, &x[1], &xnorm, &w[iw], &jw[1], mode); if (*mode == 1) { /* restore Lagrange multipliers */ dcopy___(m, &w[iw], 1, &y[1], 1); dcopy___(&n3, &w[iw + *m], 1, &y[*m + 1], 1); dcopy___(&n3, &w[iw + *m + *n], 1, &y[*m + n3 + 1], 1); /* SGJ, 2010: make sure bound constraints are satisfied, since roundoff error sometimes causes slight violations and NLopt guarantees that bounds are strictly obeyed */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (x[i__] < xl[i__]) x[i__] = xl[i__]; else if (x[i__] > xu[i__]) x[i__] = xu[i__]; } } /* END OF SUBROUTINE LSQ */ } /* lsq_ */ static void ldl_(int *n, double *a, double *z__, double *sigma, double *w) { /* Initialized data */ const double one = 1.; const double four = 4.; const double epmach = 2.22e-16; /* System generated locals */ int i__1, i__2; /* Local variables */ int i__, j; double t, u, v; int ij; double tp, beta, gamma_, alpha, delta; /* LDL LDL' - RANK-ONE - UPDATE */ /* PURPOSE: */ /* UPDATES THE LDL' FACTORS OF MATRIX A BY RANK-ONE MATRIX */ /* SIGMA*Z*Z' */ /* INPUT ARGUMENTS: (* MEANS PARAMETERS ARE CHANGED DURING EXECUTION) */ /* N : ORDER OF THE COEFFICIENT MATRIX A */ /* * A : POSITIVE DEFINITE MATRIX OF DIMENSION N; */ /* ONLY THE LOWER TRIANGLE IS USED AND IS STORED COLUMN BY */ /* COLUMN AS ONE DIMENSIONAL ARRAY OF DIMENSION N*(N+1)/2. */ /* * Z : VECTOR OF DIMENSION N OF UPDATING ELEMENTS */ /* SIGMA : SCALAR FACTOR BY WHICH THE MODIFYING DYADE Z*Z' IS */ /* MULTIPLIED */ /* OUTPUT ARGUMENTS: */ /* A : UPDATED LDL' FACTORS */ /* WORKING ARRAY: */ /* W : VECTOR OP DIMENSION N (USED ONLY IF SIGMA .LT. ZERO) */ /* METHOD: */ /* THAT OF FLETCHER AND POWELL AS DESCRIBED IN : */ /* FLETCHER,R.,(1974) ON THE MODIFICATION OF LDL' FACTORIZATION. */ /* POWELL,M.J.D. MATH.COMPUTATION 28, 1067-1078. */ /* IMPLEMENTED BY: */ /* KRAFT,D., DFVLR - INSTITUT FUER DYNAMIK DER FLUGSYSTEME */ /* D-8031 OBERPFAFFENHOFEN */ /* STATUS: 15. JANUARY 1980 */ /* SUBROUTINES REQUIRED: NONE */ /* Parameter adjustments */ --w; --z__; --a; /* Function Body */ if (*sigma == 0.0) { goto L280; } ij = 1; t = one / *sigma; if (*sigma > 0.0) { goto L220; } /* PREPARE NEGATIVE UPDATE */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* L150: */ w[i__] = z__[i__]; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { v = w[i__]; t += v * v / a[ij]; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { ++ij; /* L160: */ w[j] -= v * a[ij]; } /* L170: */ ++ij; } if (t >= 0.0) { t = epmach / *sigma; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = *n + 1 - i__; ij -= i__; u = w[j]; w[j] = t; /* L210: */ t -= u * u / a[ij]; } L220: /* HERE UPDATING BEGINS */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { v = z__[i__]; delta = v / a[ij]; if (*sigma < 0.0) { tp = w[i__]; } else /* if (*sigma > 0.0), since *sigma != 0 from above */ { tp = t + delta * v; } alpha = tp / t; a[ij] = alpha * a[ij]; if (i__ == *n) { goto L280; } beta = delta / tp; if (alpha > four) { goto L240; } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { ++ij; z__[j] -= v * a[ij]; /* L230: */ a[ij] += beta * z__[j]; } goto L260; L240: gamma_ = t / tp; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { ++ij; u = a[ij]; a[ij] = gamma_ * u + beta * z__[j]; /* L250: */ z__[j] -= v * u; } L260: ++ij; /* L270: */ t = tp; } L280: return; /* END OF LDL */ } /* ldl_ */ #if 0 /* we don't want to use this linmin function, for two reasons: 1) it was apparently written assuming an old version of Fortran where all variables are saved by default, hence it was missing a "save" statement ... I would need to go through and figure out which variables need to be declared "static" (or, better yet, save them like I did in slsqp to make it re-entrant) 2) it doesn't exploit gradient information, which is stupid since we have this info 3) in the context of NLopt, it makes much more sence to use the local_opt algorithm to do the line minimization recursively by whatever algorithm the user wants (defaulting to a gradient-based method like LBFGS) */ static double d_sign(double a, double s) { return s < 0 ? -a : a; } static double linmin_(int *mode, const double *ax, const double *bx, double * f, double *tol) { /* Initialized data */ const double c__ = .381966011; const double eps = 1.5e-8; /* System generated locals */ double ret_val, d__1; /* Local variables */ double a, b, d__, e, m, p, q, r__, u, v, w, x, fu, fv, fw, fx, tol1, tol2; /* LINMIN LINESEARCH WITHOUT DERIVATIVES */ /* PURPOSE: */ /* TO FIND THE ARGUMENT LINMIN WHERE THE FUNCTION F TAKES ITS MINIMUM */ /* ON THE INTERVAL AX, BX. */ /* COMBINATION OF GOLDEN SECTION AND SUCCESSIVE QUADRATIC INTERPOLATION. */ /* INPUT ARGUMENTS: (* MEANS PARAMETERS ARE CHANGED DURING EXECUTION) */ /* *MODE SEE OUTPUT ARGUMENTS */ /* AX LEFT ENDPOINT OF INITIAL INTERVAL */ /* BX RIGHT ENDPOINT OF INITIAL INTERVAL */ /* F FUNCTION VALUE AT LINMIN WHICH IS TO BE BROUGHT IN BY */ /* REVERSE COMMUNICATION CONTROLLED BY MODE */ /* TOL DESIRED LENGTH OF INTERVAL OF UNCERTAINTY OF FINAL RESULT */ /* OUTPUT ARGUMENTS: */ /* LINMIN ABSCISSA APPROXIMATING THE POINT WHERE F ATTAINS A MINIMUM */ /* MODE CONTROLS REVERSE COMMUNICATION */ /* MUST BE SET TO 0 INITIALLY, RETURNS WITH INTERMEDIATE */ /* VALUES 1 AND 2 WHICH MUST NOT BE CHANGED BY THE USER, */ /* ENDS WITH CONVERGENCE WITH VALUE 3. */ /* WORKING ARRAY: */ /* NONE */ /* METHOD: */ /* THIS FUNCTION SUBPROGRAM IS A SLIGHTLY MODIFIED VERSION OF THE */ /* ALGOL 60 PROCEDURE LOCALMIN GIVEN IN */ /* R.P. BRENT: ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES, */ /* PRENTICE-HALL (1973). */ /* IMPLEMENTED BY: */ /* KRAFT, D., DFVLR - INSTITUT FUER DYNAMIK DER FLUGSYSTEME */ /* D-8031 OBERPFAFFENHOFEN */ /* STATUS: 31. AUGUST 1984 */ /* SUBROUTINES REQUIRED: NONE */ /* EPS = SQUARE - ROOT OF MACHINE PRECISION */ /* C = GOLDEN SECTION RATIO = (3-SQRT(5))/2 */ switch (*mode) { case 1: goto L10; case 2: goto L55; } /* INITIALIZATION */ a = *ax; b = *bx; e = 0.0; v = a + c__ * (b - a); w = v; x = w; ret_val = x; *mode = 1; goto L100; /* MAIN LOOP STARTS HERE */ L10: fx = *f; fv = fx; fw = fv; L20: m = (a + b) * .5; tol1 = eps * fabs(x) + *tol; tol2 = tol1 + tol1; /* TEST CONVERGENCE */ if ((d__1 = x - m, fabs(d__1)) <= tol2 - (b - a) * .5) { goto L90; } r__ = 0.0; q = r__; p = q; if (fabs(e) <= tol1) { goto L30; } /* FIT PARABOLA */ r__ = (x - w) * (fx - fv); q = (x - v) * (fx - fw); p = (x - v) * q - (x - w) * r__; q -= r__; q += q; if (q > 0.0) { p = -p; } if (q < 0.0) { q = -q; } r__ = e; e = d__; /* IS PARABOLA ACCEPTABLE */ L30: if (fabs(p) >= (d__1 = q * r__, fabs(d__1)) * .5 || p <= q * (a - x) || p >= q * (b - x)) { goto L40; } /* PARABOLIC INTERPOLATION STEP */ d__ = p / q; /* F MUST NOT BE EVALUATED TOO CLOSE TO A OR B */ if (u - a < tol2) { d__1 = m - x; d__ = d_sign(tol1, d__1); } if (b - u < tol2) { d__1 = m - x; d__ = d_sign(tol1, d__1); } goto L50; /* GOLDEN SECTION STEP */ L40: if (x >= m) { e = a - x; } if (x < m) { e = b - x; } d__ = c__ * e; /* F MUST NOT BE EVALUATED TOO CLOSE TO X */ L50: if (fabs(d__) < tol1) { d__ = d_sign(tol1, d__); } u = x + d__; ret_val = u; *mode = 2; goto L100; L55: fu = *f; /* UPDATE A, B, V, W, AND X */ if (fu > fx) { goto L60; } if (u >= x) { a = x; } if (u < x) { b = x; } v = w; fv = fw; w = x; fw = fx; x = u; fx = fu; goto L85; L60: if (u < x) { a = u; } if (u >= x) { b = u; } if (fu <= fw || w == x) { goto L70; } if (fu <= fv || v == x || v == w) { goto L80; } goto L85; L70: v = w; fv = fw; w = u; fw = fu; goto L85; L80: v = u; fv = fu; L85: goto L20; /* END OF MAIN LOOP */ L90: ret_val = x; *mode = 3; L100: return ret_val; /* END OF LINMIN */ } /* linmin_ */ #endif typedef struct { double t, f0, h1, h2, h3, h4; int n1, n2, n3; double t0, gs; double tol; int line; double alpha; int iexact; int incons, ireset, itermx; double *x0; } slsqpb_state; #define SS(var) state->var = var #define SAVE_STATE \ SS(t); SS(f0); SS(h1); SS(h2); SS(h3); SS(h4); \ SS(n1); SS(n2); SS(n3); \ SS(t0); SS(gs); \ SS(tol); \ SS(line); \ SS(alpha); \ SS(iexact); \ SS(incons); SS(ireset); SS(itermx) #define RS(var) var = state->var #define RESTORE_STATE \ RS(t); RS(f0); RS(h1); RS(h2); RS(h3); RS(h4); \ RS(n1); RS(n2); RS(n3); \ RS(t0); RS(gs); \ RS(tol); \ RS(line); \ RS(alpha); \ RS(iexact); \ RS(incons); RS(ireset); RS(itermx) static void slsqpb_(int *m, int *meq, int *la, int * n, double *x, const double *xl, const double *xu, double *f, double *c__, double *g, double *a, double *acc, int *iter, int *mode, double *r__, double *l, double *x0, double *mu, double *s, double *u, double *v, double *w, int *iw, slsqpb_state *state) { /* Initialized data */ const double one = 1.; const double alfmin = .1; const double hun = 100.; const double ten = 10.; const double two = 2.; /* System generated locals */ int a_dim1, a_offset, i__1, i__2; double d__1, d__2; /* Local variables */ int i__, j, k; /* saved state from one call to the next; SGJ 2010: save/restore via state parameter, to make re-entrant. */ double t, f0, h1, h2, h3, h4; int n1, n2, n3; double t0, gs; double tol; int line; double alpha; int iexact; int incons, ireset, itermx; RESTORE_STATE; /* NONLINEAR PROGRAMMING BY SOLVING SEQUENTIALLY QUADRATIC PROGRAMS */ /* - L1 - LINE SEARCH, POSITIVE DEFINITE BFGS UPDATE - */ /* BODY SUBROUTINE FOR SLSQP */ /* dim(W) = N1*(N1+1) + MEQ*(N1+1) + MINEQ*(N1+1) for LSQ */ /* +(N1-MEQ+1)*(MINEQ+2) + 2*MINEQ */ /* +(N1+MINEQ)*(N1-MEQ) + 2*MEQ + N1 for LSEI */ /* with MINEQ = M - MEQ + 2*N1 & N1 = N+1 */ /* Parameter adjustments */ --mu; --c__; --v; --u; --s; --x0; --l; --r__; a_dim1 = *la; a_offset = 1 + a_dim1; a -= a_offset; --g; --xu; --xl; --x; --w; --iw; /* Function Body */ if (*mode == -1) { goto L260; } else if (*mode == 0) { goto L100; } else { goto L220; } L100: itermx = *iter; if (*acc >= 0.0) { iexact = 0; } else { iexact = 1; } *acc = fabs(*acc); tol = ten * *acc; *iter = 0; ireset = 0; n1 = *n + 1; n2 = n1 * *n / 2; n3 = n2 + 1; s[1] = 0.0; mu[1] = 0.0; dcopy___(n, &s[1], 0, &s[1], 1); dcopy___(m, &mu[1], 0, &mu[1], 1); /* RESET BFGS MATRIX */ L110: ++ireset; if (ireset > 5) { goto L255; } l[1] = 0.0; dcopy___(&n2, &l[1], 0, &l[1], 1); j = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { l[j] = one; j = j + n1 - i__; /* L120: */ } /* MAIN ITERATION : SEARCH DIRECTION, STEPLENGTH, LDL'-UPDATE */ L130: ++(*iter); *mode = 9; if (*iter > itermx && itermx > 0) { /* SGJ 2010: ignore if itermx <= 0 */ goto L330; } /* SEARCH DIRECTION AS SOLUTION OF QP - SUBPROBLEM */ dcopy___(n, &xl[1], 1, &u[1], 1); dcopy___(n, &xu[1], 1, &v[1], 1); d__1 = -one; daxpy_sl__(n, &d__1, &x[1], 1, &u[1], 1); d__1 = -one; daxpy_sl__(n, &d__1, &x[1], 1, &v[1], 1); h4 = one; lsq_(m, meq, n, &n3, la, &l[1], &g[1], &a[a_offset], &c__[1], &u[1], &v[1] , &s[1], &r__[1], &w[1], &iw[1], mode); /* AUGMENTED PROBLEM FOR INCONSISTENT LINEARIZATION */ if (*mode == 6) { if (*n == *meq) { *mode = 4; } } if (*mode == 4) { i__1 = *m; for (j = 1; j <= i__1; ++j) { if (j <= *meq) { a[j + n1 * a_dim1] = -c__[j]; } else { /* Computing MAX */ d__1 = -c__[j]; a[j + n1 * a_dim1] = MAX2(d__1,0.0); } /* L140: */ } s[1] = 0.0; dcopy___(n, &s[1], 0, &s[1], 1); h3 = 0.0; g[n1] = 0.0; l[n3] = hun; s[n1] = one; u[n1] = 0.0; v[n1] = one; incons = 0; L150: lsq_(m, meq, &n1, &n3, la, &l[1], &g[1], &a[a_offset], &c__[1], &u[1], &v[1], &s[1], &r__[1], &w[1], &iw[1], mode); h4 = one - s[n1]; if (*mode == 4) { l[n3] = ten * l[n3]; ++incons; if (incons > 5) { goto L330; } goto L150; } else if (*mode != 1) { goto L330; } } else if (*mode != 1) { goto L330; } /* UPDATE MULTIPLIERS FOR L1-TEST */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { v[i__] = g[i__] - ddot_sl__(m, &a[i__ * a_dim1 + 1], 1, &r__[1], 1); /* L160: */ } f0 = *f; dcopy___(n, &x[1], 1, &x0[1], 1); gs = ddot_sl__(n, &g[1], 1, &s[1], 1); h1 = fabs(gs); h2 = 0.0; i__1 = *m; for (j = 1; j <= i__1; ++j) { if (j <= *meq) { h3 = c__[j]; } else { h3 = 0.0; } /* Computing MAX */ d__1 = -c__[j]; h2 += MAX2(d__1,h3); h3 = (d__1 = r__[j], fabs(d__1)); /* Computing MAX */ d__1 = h3, d__2 = (mu[j] + h3) / two; mu[j] = MAX2(d__1,d__2); h1 += h3 * (d__1 = c__[j], fabs(d__1)); /* L170: */ } /* CHECK CONVERGENCE */ *mode = 0; if (h1 < *acc && h2 < *acc) { goto L330; } h1 = 0.0; i__1 = *m; for (j = 1; j <= i__1; ++j) { if (j <= *meq) { h3 = c__[j]; } else { h3 = 0.0; } /* Computing MAX */ d__1 = -c__[j]; h1 += mu[j] * MAX2(d__1,h3); /* L180: */ } t0 = *f + h1; h3 = gs - h1 * h4; *mode = 8; if (h3 >= 0.0) { goto L110; } /* LINE SEARCH WITH AN L1-TESTFUNCTION */ line = 0; alpha = one; if (iexact == 1) { goto L210; } /* INEXACT LINESEARCH */ L190: ++line; h3 = alpha * h3; dscal_sl__(n, &alpha, &s[1], 1); dcopy___(n, &x0[1], 1, &x[1], 1); daxpy_sl__(n, &one, &s[1], 1, &x[1], 1); /* SGJ 2010: ensure roundoff doesn't push us past bound constraints */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (x[i__] < xl[i__]) x[i__] = xl[i__]; else if (x[i__] > xu[i__]) x[i__] = xu[i__]; } /* SGJ 2010: optimizing for the common case where the inexact line search succeeds in one step, use special mode = -2 here to eliminate a a subsequent unnecessary mode = -1 call, at the expense of extra gradient evaluations when more than one inexact line-search step is required */ *mode = line == 1 ? -2 : 1; goto L330; L200: if (nlopt_isfinite(h1)) { if (h1 <= h3 / ten || line > 10) { goto L240; } /* Computing MAX */ d__1 = h3 / (two * (h3 - h1)); alpha = MAX2(d__1,alfmin); } else { alpha = MAX2(alpha*.5,alfmin); } goto L190; /* EXACT LINESEARCH */ L210: #if 0 /* SGJ: see comments by linmin_ above: if we want to do an exact linesearch (which usually we probably don't), we should call NLopt recursively */ if (line != 3) { alpha = linmin_(&line, &alfmin, &one, &t, &tol); dcopy___(n, &x0[1], 1, &x[1], 1); daxpy_sl__(n, &alpha, &s[1], 1, &x[1], 1); *mode = 1; goto L330; } #else *mode = 9 /* will yield nlopt_failure */; return; #endif dscal_sl__(n, &alpha, &s[1], 1); goto L240; /* CALL FUNCTIONS AT CURRENT X */ L220: t = *f; i__1 = *m; for (j = 1; j <= i__1; ++j) { if (j <= *meq) { h1 = c__[j]; } else { h1 = 0.0; } /* Computing MAX */ d__1 = -c__[j]; t += mu[j] * MAX2(d__1,h1); /* L230: */ } h1 = t - t0; switch (iexact + 1) { case 1: goto L200; case 2: goto L210; } /* CHECK CONVERGENCE */ L240: h3 = 0.0; i__1 = *m; for (j = 1; j <= i__1; ++j) { if (j <= *meq) { h1 = c__[j]; } else { h1 = 0.0; } /* Computing MAX */ d__1 = -c__[j]; h3 += MAX2(d__1,h1); /* L250: */ } if (((d__1 = *f - f0, fabs(d__1)) < *acc || dnrm2___(n, &s[1], 1) < * acc) && h3 < *acc) { *mode = 0; } else { *mode = -1; } goto L330; /* CHECK relaxed CONVERGENCE in case of positive directional derivative */ L255: if (((d__1 = *f - f0, fabs(d__1)) < tol || dnrm2___(n, &s[1], 1) < tol) && h3 < tol) { *mode = 0; } else { *mode = 8; } goto L330; /* CALL JACOBIAN AT CURRENT X */ /* UPDATE CHOLESKY-FACTORS OF HESSIAN MATRIX BY MODIFIED BFGS FORMULA */ L260: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { u[i__] = g[i__] - ddot_sl__(m, &a[i__ * a_dim1 + 1], 1, &r__[1], 1) - v[i__]; /* L270: */ } /* L'*S */ k = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { h1 = 0.0; ++k; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { ++k; h1 += l[k] * s[j]; /* L280: */ } v[i__] = s[i__] + h1; /* L290: */ } /* D*L'*S */ k = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { v[i__] = l[k] * v[i__]; k = k + n1 - i__; /* L300: */ } /* L*D*L'*S */ for (i__ = *n; i__ >= 1; --i__) { h1 = 0.0; k = i__; i__1 = i__ - 1; for (j = 1; j <= i__1; ++j) { h1 += l[k] * v[j]; k = k + *n - j; /* L310: */ } v[i__] += h1; /* L320: */ } h1 = ddot_sl__(n, &s[1], 1, &u[1], 1); h2 = ddot_sl__(n, &s[1], 1, &v[1], 1); h3 = h2 * .2; if (h1 < h3) { h4 = (h2 - h3) / (h2 - h1); h1 = h3; dscal_sl__(n, &h4, &u[1], 1); d__1 = one - h4; daxpy_sl__(n, &d__1, &v[1], 1, &u[1], 1); } d__1 = one / h1; ldl_(n, &l[1], &u[1], &d__1, &v[1]); d__1 = -one / h2; ldl_(n, &l[1], &v[1], &d__1, &u[1]); /* END OF MAIN ITERATION */ goto L130; /* END OF SLSQPB */ L330: SAVE_STATE; } /* slsqpb_ */ /* *********************************************************************** */ /* optimizer * */ /* *********************************************************************** */ static void slsqp(int *m, int *meq, int *la, int *n, double *x, const double *xl, const double *xu, double *f, double *c__, double *g, double *a, double *acc, int *iter, int *mode, double *w, int *l_w__, int * jw, int *l_jw__, slsqpb_state *state) { /* System generated locals */ int a_dim1, a_offset, i__1, i__2; /* Local variables */ int n1, il, im, ir, is, iu, iv, iw, ix, mineq; /* SLSQP S EQUENTIAL L EAST SQ UARES P ROGRAMMING */ /* TO SOLVE GENERAL NONLINEAR OPTIMIZATION PROBLEMS */ /* *********************************************************************** */ /* * * */ /* * * */ /* * A NONLINEAR PROGRAMMING METHOD WITH * */ /* * QUADRATIC PROGRAMMING SUBPROBLEMS * */ /* * * */ /* * * */ /* * THIS SUBROUTINE SOLVES THE GENERAL NONLINEAR PROGRAMMING PROBLEM * */ /* * * */ /* * MINIMIZE F(X) * */ /* * * */ /* * SUBJECT TO C (X) .EQ. 0 , J = 1,...,MEQ * */ /* * J * */ /* * * */ /* * C (X) .GE. 0 , J = MEQ+1,...,M * */ /* * J * */ /* * * */ /* * XL .LE. X .LE. XU , I = 1,...,N. * */ /* * I I I * */ /* * * */ /* * THE ALGORITHM IMPLEMENTS THE METHOD OF HAN AND POWELL * */ /* * WITH BFGS-UPDATE OF THE B-MATRIX AND L1-TEST FUNCTION * */ /* * WITHIN THE STEPLENGTH ALGORITHM. * */ /* * * */ /* * PARAMETER DESCRIPTION: * */ /* * ( * MEANS THIS PARAMETER WILL BE CHANGED DURING CALCULATION ) * */ /* * * */ /* * M IS THE TOTAL NUMBER OF CONSTRAINTS, M .GE. 0 * */ /* * MEQ IS THE NUMBER OF EQUALITY CONSTRAINTS, MEQ .GE. 0 * */ /* * LA SEE A, LA .GE. MAX(M,1) * */ /* * N IS THE NUMBER OF VARIABLES, N .GE. 1 * */ /* * * X() X() STORES THE CURRENT ITERATE OF THE N VECTOR X * */ /* * ON ENTRY X() MUST BE INITIALIZED. ON EXIT X() * */ /* * STORES THE SOLUTION VECTOR X IF MODE = 0. * */ /* * XL() XL() STORES AN N VECTOR OF LOWER BOUNDS XL TO X. * */ /* * XU() XU() STORES AN N VECTOR OF UPPER BOUNDS XU TO X. * */ /* * F IS THE VALUE OF THE OBJECTIVE FUNCTION. * */ /* * C() C() STORES THE M VECTOR C OF CONSTRAINTS, * */ /* * EQUALITY CONSTRAINTS (IF ANY) FIRST. * */ /* * DIMENSION OF C MUST BE GREATER OR EQUAL LA, * */ /* * which must be GREATER OR EQUAL MAX(1,M). * */ /* * G() G() STORES THE N VECTOR G OF PARTIALS OF THE * */ /* * OBJECTIVE FUNCTION; DIMENSION OF G MUST BE * */ /* * GREATER OR EQUAL N+1. * */ /* * A(),LA,M,N THE LA BY N + 1 ARRAY A() STORES * */ /* * THE M BY N MATRIX A OF CONSTRAINT NORMALS. * */ /* * A() HAS FIRST DIMENSIONING PARAMETER LA, * */ /* * WHICH MUST BE GREATER OR EQUAL MAX(1,M). * */ /* * F,C,G,A MUST ALL BE SET BY THE USER BEFORE EACH CALL. * */ /* * * ACC ABS(ACC) CONTROLS THE FINAL ACCURACY. * */ /* * IF ACC .LT. ZERO AN EXACT LINESEARCH IS PERFORMED,* */ /* * OTHERWISE AN ARMIJO-TYPE LINESEARCH IS USED. * */ /* * * ITER PRESCRIBES THE MAXIMUM NUMBER OF ITERATIONS. * */ /* * ON EXIT ITER INDICATES THE NUMBER OF ITERATIONS. * */ /* * * MODE MODE CONTROLS CALCULATION: * */ /* * REVERSE COMMUNICATION IS USED IN THE SENSE THAT * */ /* * THE PROGRAM IS INITIALIZED BY MODE = 0; THEN IT IS* */ /* * TO BE CALLED REPEATEDLY BY THE USER UNTIL A RETURN* */ /* * WITH MODE .NE. IABS(1) TAKES PLACE. * */ /* * IF MODE = -1 GRADIENTS HAVE TO BE CALCULATED, * */ /* * WHILE WITH MODE = 1 FUNCTIONS HAVE TO BE CALCULATED */ /* * MODE MUST NOT BE CHANGED BETWEEN SUBSEQUENT CALLS * */ /* * OF SQP. * */ /* * EVALUATION MODES: * */ /* * MODE = -2,-1: GRADIENT EVALUATION, (G&A) * */ /* * 0: ON ENTRY: INITIALIZATION, (F,G,C&A) * */ /* * ON EXIT : REQUIRED ACCURACY FOR SOLUTION OBTAINED * */ /* * 1: FUNCTION EVALUATION, (F&C) * */ /* * * */ /* * FAILURE MODES: * */ /* * 2: NUMBER OF EQUALITY CONSTRAINTS LARGER THAN N * */ /* * 3: MORE THAN 3*N ITERATIONS IN LSQ SUBPROBLEM * */ /* * 4: INEQUALITY CONSTRAINTS INCOMPATIBLE * */ /* * 5: SINGULAR MATRIX E IN LSQ SUBPROBLEM * */ /* * 6: SINGULAR MATRIX C IN LSQ SUBPROBLEM * */ /* * 7: RANK-DEFICIENT EQUALITY CONSTRAINT SUBPROBLEM HFTI* */ /* * 8: POSITIVE DIRECTIONAL DERIVATIVE FOR LINESEARCH * */ /* * 9: MORE THAN ITER ITERATIONS IN SQP * */ /* * >=10: WORKING SPACE W OR JW TOO SMALL, * */ /* * W SHOULD BE ENLARGED TO L_W=MODE/1000 * */ /* * JW SHOULD BE ENLARGED TO L_JW=MODE-1000*L_W * */ /* * * W(), L_W W() IS A ONE DIMENSIONAL WORKING SPACE, * */ /* * THE LENGTH L_W OF WHICH SHOULD BE AT LEAST * */ /* * (3*N1+M)*(N1+1) for LSQ * */ /* * +(N1-MEQ+1)*(MINEQ+2) + 2*MINEQ for LSI * */ /* * +(N1+MINEQ)*(N1-MEQ) + 2*MEQ + N1 for LSEI * */ /* * + N1*N/2 + 2*M + 3*N + 3*N1 + 1 for SLSQPB * */ /* * with MINEQ = M - MEQ + 2*N1 & N1 = N+1 * */ /* * NOTICE: FOR PROPER DIMENSIONING OF W IT IS RECOMMENDED TO * */ /* * COPY THE FOLLOWING STATEMENTS INTO THE HEAD OF * */ /* * THE CALLING PROGRAM (AND REMOVE THE COMMENT C) * */ /* ####################################################################### */ /* INT LEN_W, LEN_JW, M, N, N1, MEQ, MINEQ */ /* PARAMETER (M=... , MEQ=... , N=... ) */ /* PARAMETER (N1= N+1, MINEQ= M-MEQ+N1+N1) */ /* PARAMETER (LEN_W= */ /* $ (3*N1+M)*(N1+1) */ /* $ +(N1-MEQ+1)*(MINEQ+2) + 2*MINEQ */ /* $ +(N1+MINEQ)*(N1-MEQ) + 2*MEQ + N1 */ /* $ +(N+1)*N/2 + 2*M + 3*N + 3*N1 + 1, */ /* $ LEN_JW=MINEQ) */ /* DOUBLE PRECISION W(LEN_W) */ /* INT JW(LEN_JW) */ /* ####################################################################### */ /* * THE FIRST M+N+N*N1/2 ELEMENTS OF W MUST NOT BE * */ /* * CHANGED BETWEEN SUBSEQUENT CALLS OF SLSQP. * */ /* * ON RETURN W(1) ... W(M) CONTAIN THE MULTIPLIERS * */ /* * ASSOCIATED WITH THE GENERAL CONSTRAINTS, WHILE * */ /* * W(M+1) ... W(M+N(N+1)/2) STORE THE CHOLESKY FACTOR* */ /* * L*D*L(T) OF THE APPROXIMATE HESSIAN OF THE * */ /* * LAGRANGIAN COLUMNWISE DENSE AS LOWER TRIANGULAR * */ /* * UNIT MATRIX L WITH D IN ITS 'DIAGONAL' and * */ /* * W(M+N(N+1)/2+N+2 ... W(M+N(N+1)/2+N+2+M+2N) * */ /* * CONTAIN THE MULTIPLIERS ASSOCIATED WITH ALL * */ /* * ALL CONSTRAINTS OF THE QUADRATIC PROGRAM FINDING * */ /* * THE SEARCH DIRECTION TO THE SOLUTION X* * */ /* * * JW(), L_JW JW() IS A ONE DIMENSIONAL INT WORKING SPACE * */ /* * THE LENGTH L_JW OF WHICH SHOULD BE AT LEAST * */ /* * MINEQ * */ /* * with MINEQ = M - MEQ + 2*N1 & N1 = N+1 * */ /* * * */ /* * THE USER HAS TO PROVIDE THE FOLLOWING SUBROUTINES: * */ /* * LDL(N,A,Z,SIG,W) : UPDATE OF THE LDL'-FACTORIZATION. * */ /* * LINMIN(A,B,F,TOL) : LINESEARCH ALGORITHM IF EXACT = 1 * */ /* * LSQ(M,MEQ,LA,N,NC,C,D,A,B,XL,XU,X,LAMBDA,W,....) : * */ /* * * */ /* * SOLUTION OF THE QUADRATIC PROGRAM * */ /* * QPSOL IS RECOMMENDED: * */ /* * PE GILL, W MURRAY, MA SAUNDERS, MH WRIGHT: * */ /* * USER'S GUIDE FOR SOL/QPSOL: * */ /* * A FORTRAN PACKAGE FOR QUADRATIC PROGRAMMING, * */ /* * TECHNICAL REPORT SOL 83-7, JULY 1983 * */ /* * DEPARTMENT OF OPERATIONS RESEARCH, STANFORD UNIVERSITY * */ /* * STANFORD, CA 94305 * */ /* * QPSOL IS THE MOST ROBUST AND EFFICIENT QP-SOLVER * */ /* * AS IT ALLOWS WARM STARTS WITH PROPER WORKING SETS * */ /* * * */ /* * IF IT IS NOT AVAILABLE USE LSEI, A CONSTRAINT LINEAR LEAST * */ /* * SQUARES SOLVER IMPLEMENTED USING THE SOFTWARE HFTI, LDP, NNLS * */ /* * FROM C.L. LAWSON, R.J.HANSON: SOLVING LEAST SQUARES PROBLEMS, * */ /* * PRENTICE HALL, ENGLEWOOD CLIFFS, 1974. * */ /* * LSEI COMES WITH THIS PACKAGE, together with all necessary SR's. * */ /* * * */ /* * TOGETHER WITH A COUPLE OF SUBROUTINES FROM BLAS LEVEL 1 * */ /* * * */ /* * SQP IS HEAD SUBROUTINE FOR BODY SUBROUTINE SQPBDY * */ /* * IN WHICH THE ALGORITHM HAS BEEN IMPLEMENTED. * */ /* * * */ /* * IMPLEMENTED BY: DIETER KRAFT, DFVLR OBERPFAFFENHOFEN * */ /* * as described in Dieter Kraft: A Software Package for * */ /* * Sequential Quadratic Programming * */ /* * DFVLR-FB 88-28, 1988 * */ /* * which should be referenced if the user publishes results of SLSQP * */ /* * * */ /* * DATE: APRIL - OCTOBER, 1981. * */ /* * STATUS: DECEMBER, 31-ST, 1984. * */ /* * STATUS: MARCH , 21-ST, 1987, REVISED TO FORTRAN 77 * */ /* * STATUS: MARCH , 20-th, 1989, REVISED TO MS-FORTRAN * */ /* * STATUS: APRIL , 14-th, 1989, HESSE in-line coded * */ /* * STATUS: FEBRUARY, 28-th, 1991, FORTRAN/2 Version 1.04 * */ /* * accepts Statement Functions * */ /* * STATUS: MARCH , 1-st, 1991, tested with SALFORD * */ /* * FTN77/386 COMPILER VERS 2.40* */ /* * in protected mode * */ /* * * */ /* *********************************************************************** */ /* * * */ /* * Copyright 1991: Dieter Kraft, FHM * */ /* * * */ /* *********************************************************************** */ /* dim(W) = N1*(N1+1) + MEQ*(N1+1) + MINEQ*(N1+1) for LSQ */ /* +(N1-MEQ+1)*(MINEQ+2) + 2*MINEQ for LSI */ /* +(N1+MINEQ)*(N1-MEQ) + 2*MEQ + N1 for LSEI */ /* + N1*N/2 + 2*M + 3*N +3*N1 + 1 for SLSQPB */ /* with MINEQ = M - MEQ + 2*N1 & N1 = N+1 */ /* CHECK LENGTH OF WORKING ARRAYS */ /* Parameter adjustments */ --c__; a_dim1 = *la; a_offset = 1 + a_dim1; a -= a_offset; --g; --xu; --xl; --x; --w; --jw; /* Function Body */ n1 = *n + 1; mineq = *m - *meq + n1 + n1; il = (n1 * 3 + *m) * (n1 + 1) + (n1 - *meq + 1) * (mineq + 2) + (mineq << 1) + (n1 + mineq) * (n1 - *meq) + (*meq << 1) + n1 * *n / 2 + (*m << 1) + *n * 3 + (n1 << 2) + 1; /* Computing MAX */ i__1 = mineq, i__2 = n1 - *meq; im = MAX2(i__1,i__2); if (*l_w__ < il || *l_jw__ < im) { *mode = MAX2(10,il) * 1000; *mode += MAX2(10,im); return; } /* PREPARE DATA FOR CALLING SQPBDY - INITIAL ADDRESSES IN W */ im = 1; il = im + MAX2(1,*m); il = im + *la; ix = il + n1 * *n / 2 + 1; ir = ix + *n; is = ir + *n + *n + MAX2(1,*m); is = ir + *n + *n + *la; iu = is + n1; iv = iu + n1; iw = iv + n1; slsqpb_(m, meq, la, n, &x[1], &xl[1], &xu[1], f, &c__[1], &g[1], &a[ a_offset], acc, iter, mode, &w[ir], &w[il], &w[ix], &w[im], &w[is] , &w[iu], &w[iv], &w[iw], &jw[1], state); state->x0 = &w[ix]; return; } /* slsqp_ */ static void length_work(int *LEN_W, int *LEN_JW, int M, int MEQ, int N) { int N1 = N+1, MINEQ = M-MEQ+N1+N1; *LEN_W = (3*N1+M)*(N1+1) +(N1-MEQ+1)*(MINEQ+2) + 2*MINEQ +(N1+MINEQ)*(N1-MEQ) + 2*MEQ + N1 +(N+1)*N/2 + 2*M + 3*N + 3*N1 + 1; *LEN_JW = MINEQ; } nlopt_result nlopt_slsqp(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, unsigned p, nlopt_constraint *h, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop) { slsqpb_state state = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL}; unsigned mtot = nlopt_count_constraints(m, fc); unsigned ptot = nlopt_count_constraints(p, h); double *work, *cgrad, *c, *grad, *w, fcur, *xcur, fprev, *xprev, *cgradtmp; int mpi = (int) (mtot + ptot), pi = (int) ptot, ni = (int) n, mpi1 = mpi > 0 ? mpi : 1; int len_w, len_jw, *jw; int mode = 0, prev_mode = 0; double acc = 0; /* we do our own convergence tests below */ int iter = 0; /* tell sqsqp to ignore this check, since we check evaluation counts ourselves */ unsigned i, ii; nlopt_result ret = NLOPT_SUCCESS; int feasible, feasible_cur; double infeasibility = HUGE_VAL, infeasibility_cur = HUGE_VAL; unsigned max_cdim; int want_grad = 1; if (ptot > n) { nlopt_stop_msg(stop, "slsqp: more equality constraints than variables"); return NLOPT_INVALID_ARGS; } max_cdim = MAX2(nlopt_max_constraint_dim(m, fc), nlopt_max_constraint_dim(p, h)); length_work(&len_w, &len_jw, mpi, pi, ni); #define U(n) ((unsigned) (n)) work = (double *) malloc(sizeof(double) * (U(mpi1) * (n + 1) + U(mpi) + n+1 + n + n + max_cdim*n + U(len_w)) + sizeof(int) * U(len_jw)); if (!work) return NLOPT_OUT_OF_MEMORY; cgrad = work; c = cgrad + U(mpi1) * (n + 1); grad = c + mpi; xcur = grad + n+1; xprev = xcur + n; cgradtmp = xprev + n; w = cgradtmp + max_cdim*n; jw = (int *) (w + len_w); memcpy(xcur, x, sizeof(double) * n); memcpy(xprev, x, sizeof(double) * n); fprev = fcur = *minf = HUGE_VAL; feasible = feasible_cur = 0; goto eval_f_and_grad; /* eval before calling slsqp the first time */ do { slsqp(&mpi, &pi, &mpi1, &ni, xcur, lb, ub, &fcur, c, grad, cgrad, &acc, &iter, &mode, w, &len_w, jw, &len_jw, &state); switch (mode) { case -1: /* objective & gradient evaluation */ if (prev_mode == -2 && !want_grad) break; /* just evaluated this point */ /* fall through */ case -2: eval_f_and_grad: want_grad = 1; /* fall through */ case 1:{ /* don't need grad unless we don't have it yet */ double *newgrad = 0; double *newcgrad = 0; if (want_grad) { newgrad = grad; newcgrad = cgradtmp; } feasible_cur = 1; infeasibility_cur = 0; fcur = f(n, xcur, newgrad, f_data); ++ *(stop->nevals_p); if (nlopt_stop_forced(stop)) { fcur = HUGE_VAL; ret = NLOPT_FORCED_STOP; goto done; } if (nlopt_isfinite(fcur)) { want_grad = 0; ii = 0; for (i = 0; i < p; ++i) { unsigned j, k; nlopt_eval_constraint(c+ii, newcgrad, h+i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < h[i].m; ++k, ++ii) { infeasibility_cur = MAX2(infeasibility_cur, fabs(c[ii])); feasible_cur = feasible_cur && fabs(c[ii]) <= h[i].tol[k]; if (newcgrad) { for (j = 0; j < n; ++ j) cgrad[j*U(mpi1) + ii] = cgradtmp[k*n + j]; } } } for (i = 0; i < m; ++i) { unsigned j, k; nlopt_eval_constraint(c+ii, newcgrad, fc+i, n, xcur); if (nlopt_stop_forced(stop)) { ret = NLOPT_FORCED_STOP; goto done; } for (k = 0; k < fc[i].m; ++k, ++ii) { infeasibility_cur = MAX2(infeasibility_cur, c[ii]); feasible_cur = feasible_cur && c[ii] <= fc[i].tol[k]; if (newcgrad) { for (j = 0; j < n; ++ j) cgrad[j*U(mpi1) + ii] = -cgradtmp[k*n + j]; } c[ii] = -c[ii]; /* slsqp sign convention */ } } } break;} case 0: /* required accuracy for solution obtained */ goto done; case 8: /* positive directional derivative for linesearch */ /* relaxed convergence check for a feasible_cur point, as in the SLSQP code (except xtol as well as ftol) */ ret = NLOPT_ROUNDOFF_LIMITED; /* usually why deriv>0 */ if (feasible_cur) { double save_ftol_rel = stop->ftol_rel; double save_xtol_rel = stop->xtol_rel; double save_ftol_abs = stop->ftol_abs; stop->ftol_rel *= 10; stop->ftol_abs *= 10; stop->xtol_rel *= 10; if (nlopt_stop_ftol(stop, fcur, state.f0)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, xcur, state.x0)) ret = NLOPT_XTOL_REACHED; stop->ftol_rel = save_ftol_rel; stop->ftol_abs = save_ftol_abs; stop->xtol_rel = save_xtol_rel; } goto done; case 5: /* singular matrix E in LSQ subproblem */ case 6: /* singular matrix C in LSQ subproblem */ case 7: /* rank-deficient equality constraint subproblem HFTI */ ret = NLOPT_ROUNDOFF_LIMITED; goto done; case 4: /* inequality constraints incompatible */ case 3: /* more than 3*n iterations in LSQ subproblem */ case 9: /* more than iter iterations in SQP */ nlopt_stop_msg(stop, "bug: more than iter SQP iterations"); ret = NLOPT_FAILURE; goto done; case 2: /* number of equality constraints > n */ default: /* >= 10: working space w or jw too small */ nlopt_stop_msg(stop, "bug: workspace is too small"); ret = NLOPT_INVALID_ARGS; goto done; } prev_mode = mode; /* update best point so far */ if (nlopt_isfinite(fcur) && ((fcur < *minf && (feasible_cur || !feasible)) || (!feasible && infeasibility_cur < infeasibility))) { *minf = fcur; feasible = feasible_cur; infeasibility = infeasibility_cur; memcpy(x, xcur, sizeof(double)*n); } /* note: mode == -1 corresponds to the completion of a line search, and is the only time we should check convergence (as in original slsqp code) */ if (mode == -1) { if (!nlopt_isinf(fprev) && feasible_cur) { if (nlopt_stop_ftol(stop, fcur, fprev)) ret = NLOPT_FTOL_REACHED; else if (nlopt_stop_x(stop, xcur, xprev)) ret = NLOPT_XTOL_REACHED; } fprev = fcur; memcpy(xprev, xcur, sizeof(double)*n); } /* do some additional termination tests */ if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; } while (ret == NLOPT_SUCCESS); done: if (nlopt_isinf(*minf)) { /* didn't find any feasible points, just return last point evaluated */ if (nlopt_isinf(fcur)) { /* invalid cur. point, use previous pt. */ *minf = fprev; memcpy(x, xprev, sizeof(double)*n); } else { *minf = fcur; memcpy(x, xcur, sizeof(double)*n); } } free(work); return ret; } stevengj-nlopt-88c424d/src/algs/slsqp/slsqp.h000066400000000000000000000006731521061417600212360ustar00rootroot00000000000000#ifndef SLSQP_H #define SLSQP_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nlopt_result nlopt_slsqp(unsigned n, nlopt_func f, void *f_data, unsigned m, nlopt_constraint *fc, unsigned p, nlopt_constraint *h, const double *lb, const double *ub, double *x, double *minf, nlopt_stopping *stop); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/algs/stogo/000077500000000000000000000000001521061417600177065ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/stogo/COPYRIGHT000066400000000000000000000061301521061417600212010ustar00rootroot00000000000000The original StoGO code is: Copyright (c) 1998 by S. Zertchaninov and K. Madsen. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------- The StoGO source code on the authors' web site has no copyright or license information, but I (Steven G. Johnson) contacted the author K. Madsen for clarification and he gave me permission to distribute it under the MIT license above. See the correspondence below: ---------------------------------------------------------------------- Date: Fri, 24 Aug 2007 10:46:09 +0200 From: Kaj Madsen To: stevenj@math.mit.edu Subject: RE: open source license for StoGO software? The MIT licence is ok with me, and so is your copyright suggestion. Kaj Madsen. -----Original Message----- From: Steven G. Johnson [mailto:stevenj@fftw.org] Sent: 23. august 2007 22:23 To: Kaj Madsen Subject: RE: open source license for StoGO software? On Thu, 23 Aug 2007, Kaj Madsen wrote: > Many thanks for your mail. You can definitely consider the software as > open source, please use it as you like, however please refer to us if > you publish results based on the software. > > I am now in a heavy administrative position as a Head of Department > (has been since 1998, therefore I never really followed up on this). > The paper was never published, however I am attaching two fdf-files, > one with the paper, one with some descriptions of the code. I hope > this makes sense, otherwise please don't hesitate to contact me again. Thanks so much for your response! To be open source it needs some specific open-source license to specify the permissions in legal terms. The simplest open-source license is probably the MIT license, is this okay? http://opensource.org/licenses/mit-license.php Also, I need to know who the authors are for the copyright statement. Should I list it as: Copyright (c) 1998 by S. Zertchaninov and K. Madsen ? Thanks again! I will definitely cite it if I publish any results based on StoGO! (It's one of the few public global-optimization programs that is able to exploit gradient information.) Regards, Steven G. Johnson stevengj-nlopt-88c424d/src/algs/stogo/README000066400000000000000000000016151521061417600205710ustar00rootroot00000000000000This code is modified from the original StoGO Global Optimization library by Madsen et al., downloaded from: http://www2.imm.dtu.dk/~km/GlobOpt/opt.html It was modified to allow C-callable wrappers and some other niceties by Steven G. Johnson (stevenj@alum.mit.edu) in 2007. StoGO uses a gradient-based direct-search branch-and-bound algorithm, described in: S. Gudmundsson, "Parallel Global Optimization," M.Sc. Thesis, IMM, Technical University of Denmark, 1998. K. Madsen, S. Zertchaninov, and A. Zilinskas, "Global Optimization using Branch-and-Bound," Submitted to the Journal of Global Optimization, 1998. [ never published, but preprint is included as paper.pdf ] S. Zertchaninov and K. Madsen, "A C++ Programme for Global Optimization," IMM-REP-1998-04, Department of Mathematical Modelling, Technical University of Denmark, DK-2800 Lyngby, Denmark, 1998. [ included as techreport.pdf ] stevengj-nlopt-88c424d/src/algs/stogo/global.cc000066400000000000000000000165311521061417600214630ustar00rootroot00000000000000/* Multi Dimensional Global Search. Author: Steinn Gudmundsson Email: steinng@hotmail.com This program is supplied without any warranty whatsoever. NB The RNGs seed should be initialized using some timer */ #include #include #include #include #include "stogo_config.h" #include "global.h" #include "local.h" #include "nlopt-util.h" // Timer stuff double StartTime; double MacEpsilon ; int FC=0, GC=0 ; int stogo_verbose = 0; /* set to nonzero for verbose output */ Global::Global(RTBox D, Pobj o, Pgrad g, GlobalParams P): Domain(D) { dim=Domain.GetDim(); Objective=o; Gradient=g; // Initialize parameters stop = P.stop; numeval = 0; eps_cl=P.eps_cl; mu=P.mu; rshift=P.rshift; det_pnts=P.det_pnts; rnd_pnts=P.rnd_pnts; fbound=DBL_MAX; } void Global::FillRegular(RTBox SampleBox, RTBox box) { // Generation of regular sampling points double w; int i, flag, dir; Trial tmpTrial(dim); RVector m(dim), x(dim); if (det_pnts>0) { box.Midpoint(m) ; tmpTrial.objval=DBL_MAX ; // Add the rest i=1 ; flag=1 ; dir=0 ; x=m ; while (iminf_max) { done = true; break; } if (!InTime()) { done=true; if (stogo_verbose) cout << "The program has run out of time or function evaluations\n"; break; } } // inner while-loop if (stogo_verbose) cout << endl << "*** Inner loop completed ***" << endl ; // Reduce SolSet if necessary SolSet.erase(remove_if(SolSet.begin(), SolSet.end(), TrialGT(fbound+mu)),SolSet.end()); if (InTime()) { if (stogo_verbose) { cout << "Current set of minimizers (" << SolSet.size() << ")" << endl ; DispMinimizers() ; } while (!Garbage.empty()) { box=Garbage.top() ; Garbage.pop() ; // Split box B1.ClearBox() ; B2.ClearBox() ; box.split(B1,B2) ; // Add boxes to Candidate set CandSet.push(B1) ; CandSet.push(B2) ; } } } // Outer while-loop if (stogo_verbose) { cout << "Number of outer iterations : " << outer_iter << endl; cout << "Number of unexplored boxes : " << CandSet.size() << endl; cout << "Number of boxes in garbage : " << Garbage.size() << endl; cout << "Number of elements in SolSet : " << SolSet.size() << endl; cout << "Number of function evaluations : " << FC << endl; cout << "Number of gradient evaluations : " << GC << endl; } if (axis != -1) { // Return minimizer when doing the AV method tmpTrial=SolSet.back(); x_av(axis)=tmpTrial.xvals(0); } } /************* Various utility functions ****************/ double Global::GetTime() { return nlopt_seconds() - StartTime; } bool Global::InTime() { return !nlopt_stop_evalstime(stop); } double Global::GetMinValue() { return fbound; } void Global::SetMinValue(double new_fb) { fbound=new_fb; } void Global::SetDomain(RTBox box) { Domain=box; } void Global::GetDomain(RTBox box) { box=Domain; } void Global::DispMinimizers() { copy(SolSet.begin(), SolSet.end(), ostream_iterator(cout)); } double Global::OneMinimizer(RCRVector x) { if (NoMinimizers()) return 0.0; for (int i=0;i //#include "function.h" #include "tools.h" using namespace std; extern "C" int stogo_verbose; typedef void dom(RTBox) ; typedef dom* Pdom ; typedef double obj(RCRVector) ; typedef obj* Pobj ; typedef void grad(RCRVector,RVector&) ; typedef grad* Pgrad ; typedef enum { OBJECTIVE_ONLY, GRADIENT_ONLY, OBJECTIVE_AND_GRADIENT } whichO; typedef double objgrad(RCRVector,RCRVector,whichO) ; typedef objgrad* Pobjgrad ; class GlobalParams { public: nlopt_stopping *stop; double eps_cl, mu, rshift; int det_pnts, rnd_pnts; }; class Global: public GlobalParams { public: // Problem specification int dim ; Pobj Objective ; Pgrad Gradient ; long int numeval; virtual double ObjectiveGradient(RCRVector xy, RVector&gradient, whichO which){ ++numeval; switch (which) { case OBJECTIVE_AND_GRADIENT: Gradient(xy, gradient); return Objective(xy); case OBJECTIVE_ONLY: return Objective(xy); case GRADIENT_ONLY: Gradient(xy, gradient); } return 0.0; } Global(RTBox, Pobj, Pgrad, GlobalParams); virtual ~Global(){}; // Global& operator=(const Global &); void Search(int, RCRVector); void DispMinimizers(); virtual double OneMinimizer(RCRVector); virtual bool NoMinimizers(); void SetDomain(RTBox); void GetDomain(RTBox); double GetMinValue(); void SetMinValue(double); void ClearSolSet(); void AddPoint(RCRVector, double); double GetTime(); bool InTime(); protected: list SolSet; list::const_iterator titr; priority_queue CandSet; priority_queue Garbage; double fbound; TBox Domain; void FillRegular(RTBox, RTBox); void FillRandom(RTBox, RTBox); double NewtonTest(RTBox, int, RCRVector, int*); void ReduceOrSubdivide(RTBox, int, RCRVector); }; #endif stevengj-nlopt-88c424d/src/algs/stogo/linalg.cc000066400000000000000000000104641521061417600214700ustar00rootroot00000000000000/* Temporary implementation of vector and matrix classes No attempt is made to check if the function arguments are valid */ #include #include // for sqrt() #include "linalg.h" double eps() { /* Returns the machine precision : (min { x >= 0 : 1 + x > 1 }) NB This routine should be replaced by LAPACK_LAMCH */ double Current, Last, OnePlusCurrent ; Current = 1.0 ; do { Last = Current ; Current /= 2.0 ; OnePlusCurrent = 1.0 + Current ; } while (OnePlusCurrent > 1.0) ; return Last ; } RVector::RVector() { // Constructor len=0; elements=0; (*this)=0.; } RVector::RVector(int n) { // Constructor len=n; if (n > 0) elements = new double[len]; (*this)=0.; } RVector::RVector(RCRVector vect) { // Constructor + Copy len=vect.len; elements=new double[len]; (*this)=vect; } RCRVector RVector::operator=(RCRVector vect) { // Copy for (int i=0;i0) os << "," ; os << v.elements[i] ; } return os << ']'; } /*************************** Matrix Class ***********************/ RMatrix::RMatrix() { // Constructor Dim=0 ; Vals=0 ; (*this)=0 ; } RMatrix::RMatrix(int dim) { // Constructor Dim=dim; Vals=new double[long(Dim)*long(Dim)]; (*this)=0.; } RMatrix::RMatrix(RCRMatrix matr) { // Constructor + Copy Dim=matr.Dim; Vals=new double[long(Dim)*long(Dim)]; (*this)=matr; } RCRMatrix RMatrix::operator=(RCRMatrix mat) { // Assignment, A=B long int Len=long(Dim)*long(Dim); for (int i=0;i using namespace std; #include // for sqrt() #include typedef const class RVector CRVector; typedef CRVector& RCRVector; typedef const class RMatrix CRMatrix ; typedef CRMatrix& RCRMatrix; double eps() ; /********************* Class RVector *********************/ class RVector{ protected: public: int len = 0; // size of array double* elements = nullptr; // array of values RVector() ; RVector(int); // Constructor RVector(RCRVector); // copy constructor ~RVector() { delete[] elements; elements=0 ; len=0; } RCRVector operator=(double) ; RCRVector operator=(RCRVector); double & operator () (int i) const {return elements[i] ; } double nrm2() ; // Euclidian norm double *raw_data() { return elements; } const double *raw_data_const() const { return elements; } friend ostream & operator << (ostream &, const RVector &); friend double norm2(RCRVector) ; friend double normInf(RCRVector) ; friend double dot(RCRVector, RCRVector) ; friend void scal(double, RCRVector) ; friend void copy(RCRVector, RCRVector) ; friend void axpy(double, RCRVector, RCRVector) ; friend void gemv(char,double, RCRMatrix, RCRVector, double, RCRVector); friend void ger(double alpha, RCRVector, RCRVector, RCRMatrix); int GetLength() const { return len; }; // get vector size }; /******************* Class RMatrix *************************/ class RMatrix { protected: double* Vals; // array of values int Dim; // dimension public: RMatrix() ; RMatrix(int); // dimension ~RMatrix() { delete[] Vals; Vals=0 ; Dim=0; } RMatrix(RCRMatrix); // copy constructor RCRMatrix operator=(double num) ; RCRMatrix operator=(RCRMatrix) ; // (needed for template stuff) double& operator()(int vidx,int hidx) ; friend ostream & operator << (ostream &, const RMatrix &); friend void gemv(char,double, RCRMatrix, RCRVector, double, RCRVector); friend void ger(double alpha,RCRVector,RCRVector,RCRMatrix); int GetDim() { return Dim; }; // get dimension }; #endif stevengj-nlopt-88c424d/src/algs/stogo/local.cc000066400000000000000000000222401521061417600213070ustar00rootroot00000000000000 /* Local search - A trust region algorithm with BFGS update. */ #include #include #include "stogo_config.h" #include "global.h" #include "local.h" #include "tools.h" //////////////////////////////////////////////////////////////////////// // SGJ, 2007: allow local to use local optimizers in NLopt, to compare // to the BFGS code below #if 0 #include "nlopt.h" typedef struct { Global *glob; double maxgrad; nlopt_stopping *stop; } f_local_data; static double f_local(int n, const double *x, double *grad, void *data_) { f_local_data *data = (f_local_data *) data_; double f; RVector xv, gv; // hack to avoid pointless copy of x and grad xv.len = gv.len = n; xv.elements = const_cast(x); gv.elements = grad; f=data->glob->ObjectiveGradient(xv, gv, grad?OBJECTIVE_AND_GRADIENT:OBJECTIVE_ONLY); if (grad) data->maxgrad = max(data->maxgrad, normInf(gv)); xv.elements = gv.elements = 0; // prevent deallocation ++ *(data->stop->nevals_p); return f; } #endif //////////////////////////////////////////////////////////////////////// int local(Trial &T, TBox &box, TBox &domain, double eps_cl, double *mgr, Global &glob, int axis, RCRVector x_av #ifdef NLOPT_UTIL_H , nlopt_stopping *stop #endif ) { int n=box.GetDim(); RVector x(n); double tmp, f; x=T.xvals ; #ifdef LS_DEBUG cout << "Local Search, x=" << x << endl; #endif if (box.OutsideBox(x, domain) != 0) { cout << "Starting point is not inside the boundary. Exiting...\n" ; exit(1) ; return LS_Out ; } // Check if we are close to a stationary point located previously if (box.CloseToMin(x, &tmp, eps_cl)) { #ifdef LS_DEBUG cout << "Close to a previously located stationary point, exiting" << endl; #endif T.objval=tmp; return LS_Old ; } #if 0 if (axis != -1) { cout << "NLopt code only works with axis == -1, exiting...\n" ; exit(EXIT_FAILURE); } f_local_data data; data.glob = &glob; data.maxgrad = *mgr; data.stop = stop; nlopt_result ret = nlopt_minimize(NLOPT_LOCAL_LBFGS, n, f_local, &data, box.lb.raw_data(), box.ub.raw_data(), x.raw_data(), &f, stop->minf_max, stop->ftol_rel, stop->ftol_abs, stop->xtol_rel, stop->xtol_abs, stop->maxeval - *(stop->nevals_p), stop->maxtime - stop->start); *mgr = data.maxgrad; T.xvals=x ; T.objval=f ; if (ret == NLOPT_MAXEVAL_REACHED || ret == NLOPT_MAXTIME_REACHED) return LS_MaxEvalTime; else if (ret > 0) return LS_New; else return LS_Out; // failure #else /* not using NLopt local optimizer ... use original STOgo BFGS code */ int k_max, info, outside = 0; int k, i, good_enough, iTmp ; double maxgrad, delta, f_new; double alpha, gamma, beta, d2, s2, nom, den, ro ; double nrm_sd, nrm_hn, snrm_hn, nrm_dl ; RVector g(n), h_sd(n), h_dl(n), h_n(n), x_new(n), g_new(n) ; RVector s(n),y(n),z(n),w(n) ; // Temporary vectors RMatrix B(n), H(n) ; // Hessian and it's inverse k_max = max_iter*n ; // Initially B and H are equal to the identity matrix B=0 ; H=0 ; for (i=0 ; inevals_p); if (nlopt_stop_evalstime(stop)) return LS_MaxEvalTime; FC++;GC++; if (axis == -1) { // Skipping AV #ifdef INI3 // Elaborate scheme to initialize delta delta=delta_coef*norm2(g) ; copy(g,z) ; axpy(1.0,x,z) ; if (!box.InsideBox(z)) { if (box.Intersection(x,g,z)==TRUE) { axpy(-1.0,x,z) ; delta=min(delta,delta_coef*norm2(z)) ; } else { // Algorithm broke down, use INI1 delta = (1.0/7)*box.ShortestSide(&iTmp) ; } } #endif #ifdef INI2 // Use INI2 scheme delta = box.ClosestSide(x)*delta_coef ; if (deltak_max) { #ifdef LS_DEBUG cout << "Maximum number of iterations reached\n" ; #endif info=LS_MaxIter ; break ; } // Update maximal gradient value maxgrad=max(maxgrad,normInf(g)) ; // Steepest descent, h_sd = -g copy(g,h_sd) ; scal(-1.0,h_sd) ; nrm_sd=norm2(h_sd) ; if (nrm_sd < epsilon) { // Stop criterion (gradient) fulfilled #ifdef LS_DEBUG cout << "Gradient small enough" << endl ; #endif good_enough = 1 ; break ; } // Compute Newton step, h_n = -H*g gemv('N',-1.0, H, g, 0.0, h_n) ; nrm_hn = norm2(h_n) ; if (nrm_hn < delta) { // Pure Newton step copy(h_n, h_dl) ; #ifdef LS_DEBUG cout << "[Newton step] " ; #endif } else { gemv('N',1.0,B,g,0.0,z) ; tmp=dot(g,z) ; if (tmp==0) { info = LS_Unstable ; break ; } alpha=(nrm_sd*nrm_sd)/tmp ; // Normalization (N38,eq. 3.30) scal(alpha,h_sd) ; nrm_sd=fabs(alpha)*nrm_sd ; if (nrm_sd >= delta) { gamma = delta/nrm_sd ; // Normalization (N38, eq. 3.33) copy(h_sd,h_dl) ; scal(gamma,h_dl) ; #ifdef LS_DEBUG cout << "[Steepest descent] " ; #endif } else { // Combination of Newton and SD steps d2 = delta*delta ; copy(h_sd,s) ; s2=nrm_sd*nrm_sd ; nom = d2 - s2 ; snrm_hn=nrm_hn*nrm_hn ; tmp = dot(h_n,s) ; den = tmp-s2 + sqrt((tmp-d2)*(tmp-d2)+(snrm_hn-d2)*(d2-s2)) ; if (den==0) { info = LS_Unstable ; break ; } // Normalization (N38, eq. 3.31) beta = nom/den ; copy(h_n,h_dl) ; scal(beta,h_dl) ; axpy((1-beta),h_sd,h_dl) ; #ifdef LS_DEBUG cout << "[Mixed step] " ; #endif } } nrm_dl=norm2(h_dl) ; //x_new = x+h_dl ; copy(x,x_new) ; axpy(1.0,h_dl,x_new) ; // Check if x_new is inside the box iTmp=box.OutsideBox(x_new, domain) ; if (iTmp == 1) { #ifdef LS_DEBUG cout << "x_new is outside the box " << endl ; #endif outside++ ; if (outside>max_outside_steps) { // Previous point was also outside, exit break ; } } else if (iTmp == 2) { #ifdef LS_DEBUG cout << " x_new is outside the domain" << endl ; #endif info=LS_Out ; break ; } else { outside=0 ; } // Compute the gain if (axis==-1) f_new=glob.ObjectiveGradient(x_new,g_new,OBJECTIVE_AND_GRADIENT); else { x_av(axis)=x_new(0); f_new=glob.ObjectiveGradient(x_av,g_av,OBJECTIVE_AND_GRADIENT); } ++ *(stop->nevals_p); if (nlopt_stop_evalstime(stop)) return LS_MaxEvalTime; FC++; GC++; gemv('N',0.5,B,h_dl,0.0,z); ro = (f_new-f) / (dot(g,h_dl) + dot(h_dl,z)); // Quadratic model if (ro > 0.75) { delta = delta*2; } if (ro < 0.25) { delta = delta/3; } if (ro > 0) { // Update the Hessian and it's inverse using the BFGS formula if (axis != -1) g_new(0)=g_av(axis); // y=g_new-g copy(g_new,y); axpy(-1.0,g,y); // Check curvature condition alpha=dot(y,h_dl); if (alpha <= sqrt(MacEpsilon)*nrm_dl*norm2(y)) { #ifdef LS_DEBUG cout << "Curvature condition violated " ; #endif } else { // Update Hessian gemv('N',1.0,B,h_dl,0.0,z) ; // z=Bh_dl beta=-1/dot(h_dl,z) ; ger(1/alpha,y,y,B) ; ger(beta,z,z,B) ; // Update Hessian inverse gemv('N',1.0,H,y,0.0,z) ; // z=H*y gemv('T',1.0,H,y,0.0,w) ; // w=y'*H beta=dot(y,z) ; beta=(1+beta/alpha)/alpha ; // It should be possible to do this updating more efficiently, by // exploiting the fact that (h_dl*y'*H) = transpose(H*y*h_dl') ger(beta,h_dl,h_dl,H) ; ger(-1/alpha,z,h_dl,H) ; ger(-1/alpha,h_dl,w,H) ; } if (nrm_dl < norm2(x)*epsilon) { // Stop criterion (iteration progress) fullfilled #ifdef LS_DEBUG cout << "Progress is marginal" ; #endif good_enough = 1 ; } // Check if we are close to a stationary point located previously if (box.CloseToMin(x_new, &f_new, eps_cl)) { // Note that x_new and f_new may be overwritten on exit from CloseToMin #ifdef LS_DEBUG cout << "Close to a previously located stationary point, exiting" << endl; #endif info = LS_Old ; good_enough = 1 ; } // Update x, g and f copy(x_new,x) ; copy(g_new,g) ; f=f_new ; #ifdef LS_DEBUG cout << " x=" << x << endl ; #endif } else { #ifdef LS_DEBUG cout << "Step is no good, ro=" << ro << " delta=" << delta << endl ; #endif } } // wend // Make sure the routine returns correctly... // Check if last iterate is outside the boundary if (box.OutsideBox(x, domain) != 0) { info=LS_Out; f=DBL_MAX; } if (info == LS_Unstable) { cout << "Local search became unstable. No big deal but exiting anyway\n" ; exit(1); } *mgr=maxgrad ; T.xvals=x ; T.objval=f ; if (outside>0) return LS_Out ; else return info ; #endif } stevengj-nlopt-88c424d/src/algs/stogo/local.h000066400000000000000000000013251521061417600211520ustar00rootroot00000000000000/* Definitions of various variables used in the local search */ #ifndef LOCAL_H #define LOCAL_H #include "tools.h" #include "global.h" extern int FC, GC ; // Results of local search enum {LS_Unstable, LS_MaxIter, LS_Old, LS_New,LS_Out, LS_MaxEvalTime} ; const double delta_coef = 1.0/2.0; // Initialization of trust region const double epsilon = 1.0E-4 ; // Stopping criterion, var 1e-4 const int max_outside_steps=1 ; // Maximum number of steps outside the box const int max_iter=50 ; // Max iterations = max_iter*dim. of problem extern double MacEpsilon ; // min {x >= 0 : 1 + x > 1} int local(Trial &, TBox &, TBox &, double, double*, Global&, int, RCRVector, nlopt_stopping *stop); #endif stevengj-nlopt-88c424d/src/algs/stogo/paper.pdf000066400000000000000000003233611521061417600215200ustar00rootroot00000000000000%PDF-1.4 %âãÏÓ 63 0 obj <> endobj xref 63 46 0000000016 00000 n 0000001866 00000 n 0000001946 00000 n 0000002075 00000 n 0000002279 00000 n 0000002625 00000 n 0000003368 00000 n 0000003521 00000 n 0000003958 00000 n 0000011249 00000 n 0000011728 00000 n 0000012117 00000 n 0000012476 00000 n 0000012552 00000 n 0000012961 00000 n 0000016041 00000 n 0000016680 00000 n 0000017307 00000 n 0000017526 00000 n 0000017911 00000 n 0000018193 00000 n 0000018403 00000 n 0000024458 00000 n 0000024793 00000 n 0000025184 00000 n 0000025397 00000 n 0000027955 00000 n 0000028365 00000 n 0000028799 00000 n 0000029197 00000 n 0000029521 00000 n 0000030115 00000 n 0000030349 00000 n 0000030643 00000 n 0000030735 00000 n 0000031081 00000 n 0000031209 00000 n 0000032616 00000 n 0000037419 00000 n 0000043183 00000 n 0000045368 00000 n 0000045610 00000 n 0000046166 00000 n 0000046373 00000 n 0000048864 00000 n 0000001216 00000 n trailer <]>> startxref 0 %%EOF 108 0 obj<>stream xÚb```f````c``Ib`@� Ç$A†ÍW¹³¸‹¸«¹÷ó¿ãÞÏ] Ô›µ�å‹óæyìNlV�3Ò:¯+EÞ˜W±¹Í€`lW˜pÊ×5Ì´LÀåI“4ŽÉ49kl  í�m´<W;evƯ7“4Þ:$žP1é5�¸zÃåñ©Ü岕ßrÖKoØ'©¼MÅ ¨ËRù2X—NØ­MÛ�²‰@]Eœ<‹Ž"¬X­Ýæ±x Ð(#° òí¬S§€Yy,Þ*tÌ9��+¡Éá‰L³3•ï”>¿¹iGJ—5Èp°â7k–Þp^×n²FÿØS È$»SOºîè{òÔ?�ßÚ•ßbʼ“@n€ùÈbµö¡?y?Rº.Ÿ†xh‚ Ш×@·­*æ ^jƒ‡Ã�u .Ð_ZÀ'JJJj@®¸¤u4 .P¤£ÁªVKKKG2vq  B�R’‚‚£h( ¤•”4�Ü"Ñ�³iiÈV+U ;EPÁeò`†r4NY@e† Œ Ö@Zˆ�À}xW(0ÉhnPk]Þúp2ç · "WïqœqyÐϹ¸‘·tCcËAÍM\‘M-ü�ÌLÒ¼\éêÕ2 _D>`‘Š>èÅq!QÊ…ëÀ ¹ü[00ö'i& YlÇÀ8/äv ¾`‚°àÄ endstream endobj 64 0 obj<> endobj 65 0 obj<> endobj 66 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 67 0 obj<> endobj 68 0 obj<> endobj 69 0 obj<> endobj 70 0 obj<> endobj 71 0 obj<>stream H‰¬•yPgÆ»fz¸fðh•nÒ=‹WÊ n‰'àz “a€10Ü0€ ÌùÊÍÀ #à® YtÕÕ5$º¢.1^«.”[ù?Ôm¢©ÚÝ?RZµUýÏÛõöó<ïï;Çìí0Ç]Öú¬ôY¾b¦¯Àì9#/&ÚhÜ6ÞÞæîhw‡·†gà=°_b_dßcÿ”/âkù—ó§‰1Ä!¡§0_8ì�åpÄ9f:>w wºä¼Ðy¯Ë—DÓD¹â¹b•«»«ÙuhTäè飯�Y2¦eìä±·È-d+ÙCþ<.yܽñ‹Ç;aÌ„t··.ʃRÓt¸;í^æþó©g »�­‘ˆ%§'ê'¹MÚúúÕ #zýºeŽ XmVXlŸ_„ÜäÙül$X‘:þ~´ýhU¥Z[Ìhô‰J9•\�Yo®®67G7…KÓ“™–„@C<=Ù5‘EÄBù t‹Øœü9QØx4ÑMí@×ÈZ‰UÛÁ1Þ‚ÿÙpšk°\ºzÖšFøèÊšYÔ! ùÄà݃çw©V&^�§ØFe”dU©Í6��C!B$ ~Šïø%ºô"^µ-#U¹z½ŽÕët ‹F�/ì?x®ô„^ÖÄ„icräælc�¹|ï©MÇy"Ç „½[èÙD[qöY~£Ífÿ6•–ßf²­ò#õù©jÍE*R³²�IO–¬ŸònÆÒßl@84ëqï±î… ßÌ€�^Ïä(ór3©¼¢ £’AKÑklÏðÀÿãž±"[ÿûAó Œ�û†=�f ¢g!bƒäÿ1Æ»>’32ïóŸš;÷¶ä&š˜�,/£4³ZÅêó�.›B!²M«ƒKžàÐÕ™xPd{I䨳©,ðÙ²eŒR tZJmPJnö@Á…äÃárEJB|mJ“¥¢¶€�ãÞ§]ôú•Šçü«ç2Îpé{r ƒ—KÐŽºëMøÓN¼�4d(Ì02S¡ ¥à—Çá|(„ŽLi (,¢ŠÕ…šl/ßéÁÌ�d Ss*‘S‡„AÎçúüÊè†Âbö¿d¡‚Ó= ÉÞ\è… t^ëu)‡Ö¨u*-Ð3ØzœA^(”B_nBó‘92¹¿äVt;*ú®==Éœ¬‡t¦¸í$/w]T·ÀVNúU Ï6f’Ð*¨¬5µ`‹¬#¨IW€Œm ²"+‘•ÒFPÅB®d�ôšZ`¬zË}ñ†Ÿ/Çï+ y!õPįŒªÊvŠ™¢¢P@‚,õª„ÏC¾f5Z½Nójo$Fd¸; ®ëÄË`šá:²U|A¼‘Oðþ'<¸ú$iI®K”§%'ÆîQÔ[v×52¢TÓeÂ[{á®^žm=ì&o«oEõ2··øî¦×-•Ï‹dãVçú#Œš±Ó§y)³øÐ÷It{ÇY+Û|½ðéY …¢ò¿ˆ+؜󠷋ê=Õç˜ËÆS{�ÐÏ&\ËV€Ë©`qÎÙ)V+¢iw"[�rã¾çÁÖ!’¬iL|RPäZNÔ·ƒ†Óìp ¥Ý>—‰‘ -OÀ~zÿ?€ÎÂZcˆ¹ÚòfV®Â� ߊŸ|·ÞæÙVÃdŠ@›‘·>7S¨Ì±4òXêÿò׳~%g:žQ�ðü�[báòio8 Šêªö5*jã”: ×2Wj;Û.Ñw;–~ôI°wÀ*mF©ü$NˆR-÷žÂß™¡ËýËfüÊ}¸á!‡"2C¯Ñ+©\¨aÚwþa&¿<:x£WýwrvŸÚZÓLYSMqI YÒ9÷| :ýxà�÷µ™F¦Ï™îÔM¯³3¦z¯ñ ß›WUg®jÚ—T™¢z“åà#` ÷_Ú6]¡ ”‡²±!2m¼^È‘ƒŒÕ¡;ñ¾bÉZ`ÈÊÓ‚íy êŽâËaµ'©ËõaÒ8põ7A#Ýø··ÿ_mi {ÀêA¬´¹�Ã.H32$~„&È^/3á˜y‹ÇںȬ#ôe4ä_»]¹CgPqw¤FÉ&nÔ&Ð+7™v)Ø¢|.)�T™,j'Ò�ªÜPPP^Ê´67·ÓjÎØÅ# ‚¥”Ämf¢R"Cè•~ǺÓY�¡Xo �–Ò?6*ªÓ”Ÿ\™Áâ?{ Ç@§ùÏ&„$Æ%°\<ÛÓƒ¾V3ÞÚ5}<(†$,†âÃ�ÍÍ9±µÌv)Ø’R¥hØc¬²vHOý�F‰âQ#tö¿ ñ‡�á8è6ëÞÔ9[Åå²PŒ®�«cÏÔ)YeCîÉ.êfó³ŸN[#eULu$ ¥6€Í )³11*#œ¥ÖÙº®–s°—r,n'둊@.ºŠZ ›"ˆA›ø»E5%*ʄŻ®ƒJF &¢ùñhZKå€ðÖoÁ¡ ¦�€ÓÍPxü2wê,Cbnš6ØÖʃ§àK²ÝÒÝv‡êÿôüGÓúxÊJe�2¦,»@ß,œ±9h…5q`å ä=ìû× ï±…'ôo¾«4*Š+�¶]Õgœ¸”Æ.R¥FE<Ê&hÔq9D•Á 2‚4´,–F¶î×ÍÚìB³S¸2"FÄÝ3îQ™5ˆ\‚ËhŽ:~Õy�“yÕ-hŽÆÓÝ¿ºÞ»ßw¿wï}e—‰3URžÿnßÅösË=ø/ åæù15›/ÖlVToùvã"åg3—:eö™Îë'Ïž¯“p÷Þì1‰÷2)öƒ'Œö÷‰ôK¯ßÄeQÙÚ†¬Feù¶RµzëµwÛšn…å¸ÿEÜÏa!÷ƒ§'ßï=vØÄá¡S˜…‡Kù­{Qëå ÔZ½�«)©ޱ'…•Q¹¼ÉMÙ¦t_7Á…ëõ#м´$qÈ›ž„»û¿éSV×®Æ7Ú3�’™ÝáÓg¸–.ªÏ`Å.¼èíÿ�M–H#ê Ä9&r«6/dòSµY±l¬6mk �×YÄ~®^ A"ø´�øMm+ÒV“^£ßTV«ÌB†Ìî[!‡Lê8v’gÆK!¶m’BÛ&´v«Ðè/6£}±<.ËPà.9ÞF|‡Ðóÿ’ š;à~€®{²ýæÏ•‰nO׬ç-µôú4�'‘­ø ˜»Ý;fÿˆðJ.�»ªìríÄÃ9<_aÀ@ï6d·p0˜zÒàæëµÜËøqø ÍÞMB|è‡mî3§-ú|¼Ô·‡Ó²Á‚~y(+A£KIâ±K"VÌu`çâ¥ÍpšaqKû󟜱ƒ‰�7 ´|¶¥›$¼ÀË‘`&Æ Þ‡Ý“5¿µIxJ‘`W‚xƒ/fažÆãa¿Ž¶5!6ÛZ|Nu^òÚǘƒ>R.ÕMüûçÜšŸ¯ÝYô7�BèYwÚ�}ø—Ë̃ÁHROŽŒœƒg°Øž²qRq�~˜·Ñ�/‡âhÊ-aãn2¤Q6GPðÉΕxL_N©!RnÙ§2Q¶j«ûFrŒLð·ç”@ÛÈ׸¬\&~GØ´Ô¼¹‚2TÞ!÷¸úÛH+ðBíª%¡†ÛôýÜw[îš�‰œ 侬cc?<ª�ÔAº‹ö>#@œ ޳NîÓ™™¦)#ó'ÐZõ<p¡®ÈÁ«vÒ·Óãƒù4¦ððíê騧šÈ„–´\î~¶Ï­æ^M4ôï¦ß ZtÜ‘Å^Ø;á5dú.dú_\é¨8×ȇ–ìÉasPVñ+�'| Öö�tÈÄûâ3¦1=·�3 ”6r*R±aS‘!’ï8Öà#ñ]�¼:„³›H`ën"me_^A Á%ï|„XËUÏ÷_:{’_a¶ª®rå¤a*ÌÕ YN_}9‹‹–öë’®ÛÝÖý¢éY¶ý~ÛH‘ä>ýTŒì?† äíð}ñ…DþE‰üMž¤‹�^òïHä[hçU‹}cçœ ãêRêHöWn­Ú¥Ž]?ç¼w÷­žC?«•ÍŒzU¨ÈŠîLQqScqpðamí ƒ‚l¯ŠG«YõbdˆâUt™®$1Z¹-)1:†Ã§p«~ å¡[R¯³IßÊCþ¼¥’öO@î’%½N힀ñ0›†@ƒ7®ËHÎH2¤Œ0¤êS’•áÁh«uÅÈŠjòæQOVønÉl •¨¸våç×*¾hØ'š8<{²®6}‰{èC~7WGèV¹ °aÎoŸ°ˆ¤£ýbúó—;ò•âŽïe°ÅìÈ”&éP‹'õIIOG UŽR]ÕG%s=j³cGt°†÷ëiHþõÏò„Œôí¹¬Ñ�Y”ÅCªy \o¹Jõ�•ŠICÂï®?bmïaÄ“¨h�î›í ^)î�§ä!ƒA)´¡*«[~Fê ŸosË3Å(¨ˆ‡8‹E›iH)d õé;² ¤]Ð{6È¿È~$ÞdŠ[S›2P‹þO{•Eqåa'“™ÆhÜ­ho¹ÝV·”Y³žÄ‹xcÐD%H¢‘¨ADîc�†sfÞÀÎ=Ã1 †[�¼Ac—%È*9øƒ/A¹ãƒXdž?è6€àb,úƒOÉyêìBZ“—{ �…‹9-\2¨Å/óäºP­Æ/_à¯kX¯îq?�]ÛŠ›iöS&å§£²™öÅìSÈexo[†*‘ìd)ró)SyníP‹Ì´ÊÙå…¹ÈÌBº+@[^þEŸr‚§¢¨†…~˜¾~?|ØøØ´pi|®z`©)ªª4 $2ƒÞÂT',öëÐ�†ó…ƒ“1�Ǫ”†û\¨…:öo®ñnÈ‹F˄εåÖý6·Ž]êø0å’uÓ›Û_‡¨'ÉÄ‹ÞÀÜÒHD…ô?™;=RÂq2#L2”}{ÒÈk¹wœéîíOÐHvƒÆ€¦:Ô¿4€^äíë%6H-V�ÎÚ$»Ã!K»¾‘n;<‡ÝI mr�÷–SKÿ}êëÖÆvã§¶‹šiÓñÒkìѸO‰ 1éÒ`Ðu€ñê §y†mÿ|Gm;œ—׿0ã&ËŒœ›îjä=ê…ú>>\2àE"6U &¾Ñd`žk&ÔšÊNu�Kˆ¥9ø4 ‰ûý�„ãgÝCü�~Ñ�»Ø_lØsök™Zk‹­ƒ®zœ‚6®‘ƈØð„�á[hßКŠ$vŸ ¨u¾�¿ÎO”™¡íÛn3¯¦úßàÃ'œ�L ;btIV‹¡ÔvöƒöÅhôì)è-4áŸÓ N¬‚c 3€‹»àL¸øû¦Îú#ÉAö¹Vp\}/v9¬½³ EØâ·×øÐÈå�ihw|­¯¥ÓPÊ~H@×"��X�^ÐÁr¿^ƒ—H �Kã˜Ð˜â-tU?»XÜh>ÈÚ��öNº§Æo[œ’g EàJ#¯ª¦÷ð¹ñ0™4çÃ}ß;èM$œ÷6ú#šø`:äÃ1­p”)?K�™®ÈÊR°ïE­‰ ¤§VÂ÷Y¡Âª5Gó£¾’þ5¹îR9¬£É[Gn´ æy�×{ë*®à¦’P`C-¼ÙÖÖ¤9 È,f²•Ñib*V»×bÕj­u"ÛÖ–úþ…A£—‰ÿ†®þ©ÀËa *�`CYqaX¼<ûkÙq(Ð}�ü`‚9&Þ©sp幆\)\K†nûé›g¿¹R‘^¿»šml8 òhuP¨YYv–,•’¥h5ú<³^Zº)hw²”±ì - ¦ç¬Y½|CMHQ›’,Qëk¢5Y̶}ÛD›¨ïl€€c~êº\–qâc;S¾y X@ûdƒ„•¥L”._WTÊü$#ç�û=hÒU°6CU‘‰þL�•€IØÙ&î‘ÅÓ’3<;ŽirêËÙRs!8O߀0ÿ?7 <ºIC�€£ÎÀ�gøÜz˜MÞ•±ÕLƒØ/½`§W¸”UÂÂçAoWy7vQ¶n§‹ú(´²Ð‡x|îhOOéf¥¼úà–hP¥d�ÿ>.Á¥ŽïwÜzrƒdy¼%"*.>r�5Ñj×—›Ä ŒÔÓ…™©eÏ®ª“Øþã@ñé•�×Àr¯NH íFí5N:w×�[8p\cˆ‰ˆ�‹Œ2Ç•W¬V½3ør¡£©·‰�©ï¯W„ƒÒX¦—ËPÙàý!P #?¾„Š…�íe¯H}ÍÞôôà… Ø¦=¢I#I�õÈ‹¤ÉÏ×üï(þ¿Ô8œZfææ[UŸ €a$$§=D.hìLWAÿ< áý÷à[ Cþdˆ¿¶CÌF¶*O¢êÁ){+Ó\Ù¢­¡I‚*Xû6àB…‚uQ~ÌÖˆm‰Áô¸Éè3t3r³Ì¼Gg K�-"�UzÑú¦ D‡7ÏÏ;[Ξ×ùüŒv0ìUxpE¤¨°0µVuêéË'ßE¯£1«ç/—ØXK²±’râýY X;´xÂqëÈaÈlA½$èˆ�^›2 MDã±ñº[Ê:kY´î?Œ×�»%âØX&D,O¦=>¹ƒ¹ìùï.]=´`“ÃÎ:¯ôQﯘҗ@)ÙßxëŠ&(ÕLzöÞÌHJlIÕ�%U‘•ÛÝÅn‰™Œò…ˆzÕ ¿ŠÕ=–cMt×ó¶BI+^ç–�ŽM =1.-ƒ) ÏßM£7Ek7¦‚ÐúP¶:⋌¶´#©%ò²}rI\µ=zë¼µ[ëŽc²õ@¥T¹¨Ù@>¼LZòT*“ŽÉ+9´.~õÝ@G?þêøÕî°ê´BVd�Ì_[ì²'ß³ô$e7µÝ„¼üÙá9Lºªä:·ç00Ê(\hä=<'™ùp©Cã\mÈzÇ •³D3Þ•»$|�ìâ_Šíê=Øs‘9·‘X) Z nëœF†áyxŒóÑþÕ„»ÿª‹²w1ð;¹:ØäsY4�XDUaL”µ)åKZW l˜j-Úz@Í! ;â 7L‹2Gc³ÏÅò¹™ðïd¡Y×|zˆ ÅRNÿ‹éò}i*Œâxslmº‚¢AÞK÷!"AA/éEo‚¤ 0³(-Z†óÇÐeÛ ›û}÷xwïæv77Ýî°Í•²6Ñ~ˆE!ˆø² —ýboî­G¨sïFôæyužsÎsç9ßÏØSÄÞ�Ÿp•áÝ„ü3ª ÀreÐÑaÄ…j &Fº��ìg{Ì7ÁÐÑ'ðoUë'ÉX”Uµ¾Nõˆ¿Îhå]ˆ˜ß|ÃΪGœq\t‚‹·LÒæ ÂÈœ¤Nãt«ôJH*Â}¡‚D%àð}PúV°¾ÖÕ3!м?Ù{r‡Žž”žë)ÄrDqeÕüº!¿a0ïPØ%´ ´tòssŸ@ÆùH†§w¤ê®êÆAåÇI!8úßî0–4 Ù§l·¹T]ý” ïVÖb‹d R�ðÝ ¾SLÆo'\·ßK]>ßþSâüñåç^L©‰Üü¯P²ŒM¤%#>¥cÎ"Bím“TOg�»7l€)¨²è5 óq4LÏ™Øt"E¥Å¥•ù— �Š}Å>ÃìcÀ0Âë·…Õé]‡é]‚K_àÒ '»8ZìØ¹o²»¤É~ÕÊmÒóvqm*KÖºm%íõjV˜¸Ý©tjß‚y¬…júgPtŠ(”QNEÇ[,Ê‹¯�ùçéÀ@Š–ÚözŽ#&èmtÙ,wÉÇ¢Q™+óŽ”Ó569d©<ü¸±²¾Y jååæœ¦(7håCr«9.( |ÈEámÀ–³€-»ÑlEÒ�’A�—÷Žéœ,ÊSÒw –…Zô×mܯ?yAÄ…´4œÐã{Â~J¼èܧùc2–·šrq“i+c:@]JwõrG(Kcòªù¯ˆ”s endstream endobj 72 0 obj<> endobj 73 0 obj<>stream H‰T‘?oƒ0Åw>Å�©:ؘ� 1$Q¤ ý£&Ínì#E*Æ2dȷ囹:`ýüì»w<‹Ýqtíâ=ôæ„#4­³‡þ B�×ÖAªÀ¶fœwÓj:íAPñé>ŒØ]ÓCY&⃇1ÜaqPÏò Ä[°Zw…Å9ý¼�pºyÿ�º$TXl±{ÑþUw‚Ëþ´óÝ#¨iŸÎƽÅÁkƒA»+B)Ue±¬�ý–¬bEݘ/’xó°•²"Î"gÄ™%–2Ûç‘sæ +™22rQ%ä3wÜüö�v¥Úð¥bê@LBÍFaËVÜ&ÓÑ�çX¦Ä¹œb€‡Ì×q Å÷Ëë(�}¹â’uì±â’"›àJçãHœ ?Ô#^s �’Ÿ^s ˜£m>Ü÷ž“ä/ù`™È™× endstream endobj 74 0 obj<> endobj 75 0 obj<> endobj 76 0 obj<> endobj 77 0 obj<>stream H‰ŒWI“ÛÆ®r–Ãü )î‹oQ©âØ)•šäÅ CÂA5’bŸsuUþpÞ÷^7¸ÌHN©jöòö÷½¯¿üú�Y¬7/oo¾ü‹Y˜ÅíÃ�ÕyQØb¡é_ú6ÆçÆ. òzq»½Ñ‹õ�εÖvq»¢_·�7oÕ×ýî®é³¥­‹Ü¨ïöS·í>6S·²¥ÓVݰ–Ï—ÙÒä•›a•Y—;µY6Ãýòåî8Ügßß~KÖX±†;_X¶&}›*äe±(ŒÎ[C–KÞª¿5Ù²0¹W?�&Så¥z�AAsha‡õ¤—ÎXú�tÑ™"êM;®�m‡}Mÿ”ývœÈ¼‚„mš¡v™µ$é]4Љ�E^—®bûâ§§c¶"ól Y¦þ“Ýþð[n‘¡Å"Ôöä–õâÖ«Œ\VmfóBí›qÚ’3¶$'¸`(Þ;„4¨øhãuæél3mÚ-å`%‰ñä‹lÐqò¬P÷mß#-ð‰ÂVZ» 9ÖnqûŠßfœ†æR­Dçfy¤Xý=Ó$sèÞe¬UÎ�Šy­º É-Ô$�r%6z¶Ñ”$^Ñ�aÛŒ?ƨúŸ2·&x‰Oü6ä'âCqu~Î{!2$ÚXdí› sx …G«¾V¤÷þ¸âj¼,0“×!ÄLÄï¨ÉWE® hZ²*'ª^7CæP&ð+pÚUæ,ê$E†J°D™Á}.³ ‘¿ÕnØm»~×dÝ>Ã긻ëÛ­d€Š±0è= >7X-:¸8žÙ ”}E_wä[É ¢…‚lyØ�ÛÌyu웩åìgH¡.��6@:¨Dø\\¤b=›´L6¡,Œ°ŒÃ¡+1m?îÖc³ÝJs׸º—/²¥·PÑåmN}é©1$*†=ªJ:<‰xP£aIÒrxª§v"[®³’4i©ŽÃyRCÄ0l¬�qäþ{¸è?�ו+e_}%[!mä…¸õJ¶ŠX+¹¥ÎHÙqu`øS_üîB6{î*g8bú,b.HÄ7íHŽQÚ+³óÊêpnõµ~rÊ&ý¶,ôÔï£þRN•CÚpAÇOSÖL`,N�4\BÒs�@HëžŠÜøSÄÄSF=Wý?2’¸DCP§Y4:ÜCÒ(E2å•à¯áz£�:¢ÕœC¹s•IÂøº¦.ø\&�‹™fólœ›=šAù›ÚwhÕš¬�ûhWûú¾èàêl‡!›¡ÝQ–¨>?qdè?ˆx?¯´±mª\×¥R©m¸¢-`rÚì™ç¶©¥É>é'2È‘æÌ"ÎŒ-ŽÆ–¡/`2à³À{Ìd‡+U-#?Fœ 8;4Û–ív„¬)!¯¶Mß'%ˆK©vCûÕURHJ0%|«MiŸ¤¦úT!ZÒ�B¤)\rA©/. ü™´•4T ýµ|åíjr\}žžœ‡«Þ :çuôï«¶ÚD9OJŒfrl;õ/uuÍU&–Ÿz}-X“®eÖ\€ÌÏ׆óµ÷W·*çÒÖ¯nÕÞ=�ZtËÏ·~¹ìy XU�æ�aˆ"'M28$PcVÀc Ö¥ùÿsnÐ"Úı�rþ9Ü¡Z¶ W—¹¶'܉\¨;HéÖÔ¨T«o^G˜Á‘R­E:áW©ýµƒoÕšÈj´âiÍÙÇÎq{ɨ¥lΪ+‚KÃC@/ÍXÈür˜_‡­2@:ò �liàSk¥£Mº= h_–5¶2àK�(Úƒ°n>ÕLSÓ És‡Áj}Kð|=ª$Îñr<÷e€&4®¢á~†²‡ËPR,tqJJ_“…L¬Œ3¼×ñô4¶Î»0G1,‰²'h™fÍ-¬ôl%H“eR‡qÁÔ‰æP¤—qêx"£N­ÒH9L#¨•šD˜™ÌšÈOâïãoD6�]q–ýDǘ$ÑÝŠœÞ6LþˆgÈ(å%íT0'öS:5ýȸíþ81 ĶàL˘Ũö,:FšxV†R æÄ(%¥�Ìæ7dŽÃ$Ý 5fŠ…ß.ëc3‚±Z”[Ëõ%ï%ïTÁ(SºÔ‡Óâæ$‚Æs{ÜšdâÔ¤Ê £ä#Ãn’ºªy~U,ÑYj… o�–¦<\€§š.Ñö»~6Ž–*yÏAÊ]®G.�ý:¾�ðÚ±o£5ÐSÃMÔݧÐèç  ŸiÊ‘Yx%ñQ|I˜ ¤Ò¤gŒë3�7©ˆ#³*™±·ˆP”nfBH_ |»Ë˜«–8¿I{@˜ íøMjN6ˆeS"üqubÒì*,mc4ãëFÇçÛÒfÜrñ8KX‹„.1?¬k”$.îžÖwz|Wžº§TüžB]/mÁO-äÊI.Jôþ*‹)\B‰s`k¤çèZ>‡Õ,Œž™uºu-ëY)IªP'9uÉmO‹GJRjKIt`Fk˜»2Û{Ä^`ÚL¬–ÛLÔÓ€"A8–”EÝÀx[  Þ4°�×Ñ1VŸ…äù2$ÒÈaír‚ké¿ï¨‚ôŠ;0°itQ‡ôp�RÐ aleê4g/Fr,ížœççF·‚5%õf·åW@®–�šÐrè~â·î1C[·üBà¹:·ET»í– M…-ÿ…`…�x€(ÅLÌq�îhÜ·‹3ꢉ‹·?»±�"eÀQD6Àª»4±µ°z5¬i´ctúxó 2ºøÁ&äºõ&ãÁ8¥ÓÝÐ=&Dî¯�°Ü¼TG+™£�s] a§ ÑóØ«#xärØp¡ÉTr˜J> L]¦…íx<µe€-˜Ÿ÷|§e¿Ékþÿ‰ÄÍ»ŒÃýq/Å\Ã(éŠt·Ÿ:‘&*>òíF‰Þ–ƒpá”w™7Ô‘„1ÌðcëW°‰vì•R2g-?÷~Sãç�ø £¢ %âõ@žÁxfi-&h h‹ƒ¹Ø¥—ê¼Ù£ÿŒjã:*§22µù)‡‹�Û*þŒï\ÃìgFîM™Y0¿MX¾b€�'�byŸ \cTj#'Áý3.ká t®eÿØTö:‰džÝþé²ÕQ ¨W–däñïçs»² aà4Î&ÐÑF*ÁUHØ–gÎ<—) $ ñø3sLŽ*Ú¥å<¿o¶û–W$öAü£iuL¨Âc…>Ù*e–—êvŽí§ÚÇž!1ªB­1¯ï’SµJ¹U‰Põ–š |â{þΟVÞ[õ ð¼®y� AǾÙ3YóQ `E[°#Ïn3.V³JÆ‚ =Ye¸s#;‰{;ñ‚[:½ð¦g‰»½ð;½Ù<Î_Y©T)õŠ•Øy¾YXJ+› ;¢%š³„!sr��Jý•ê±ä¹ŠD}ŠOj“‚—ƒ+]ò¾–Gµ aMN½g.Á bg�‘‰=Ž[•nvŒªfÛŠ·Ù[ºÛŸK¢AÌE”ué�•æøÕÕ®Û0 w}…Çd‰MÉzx-’]´H¿ Š ®Ñ¡òùíÜ‘LƒÀ‹ è(‘ÔÉT¼ ¾§05]iú®NEsWU�¼­.®‡ E¼>ô0QIúæ�ÿ-nÇ©¸;†ß 9orTÑðá*cëÕ/�uš0ë5´ ­ 2uŸsè_gé¶Kx /GŒ‚ÉFAxUSS¼/�J)ä1æ¾Ù'Ä+'Ä~/ƒá %ÅùRª8è�âL+ÎÖëÛfǸ}-®8àKUÄÛ†ºz_SÿüôçKXoÓï£ùˆHN9Guò¾17^Ž€=‚# rr`Émg± endstream endobj 78 0 obj<> endobj 79 0 obj<> endobj 80 0 obj<> endobj 81 0 obj<>stream H‰T‘MOÃ0 †ïý>qÈëǤªÛ@Ú�±Á=MÜQ‰¦QÚöâÐê‰ý:Ž_³Ýa°ý ìÕ�úˆ3t½5§ñâ5B‹çÞ‚�`z=/§ø×ƒrÀBññ:Í8l7B]gì-$§Ù_aõXÜò`/Þ ïíV'ñþÇ‹s_8 ��CÓ€Á.c»'åžÕ€À¨ì/vº:Ïbi<œœÒè•=#Ô\6P›²´æ.E*i;ý©|–¤RldxM,«‚8�\â"2¯ˆËÈòž¸Jš5ñ&²(‰UÒß·I“ë¤y Ƥ¡¸à)Nwæ¤á<ß®Ò=‚ÞÖŠßÒ{h²ÀûÐ+ ¸L"~æJsÖ%5.MT–ÛE™rä ­ê×`}ñ>x÷-&s{‹¿+w£#/é˾�ÏšC endstream endobj 82 0 obj<> endobj 83 0 obj<> endobj 84 0 obj<>stream H‰ŒUipÔæ–,Kv  ,‡”J ˜+„`Àmjsù—�„N ¦¶ñ…½ë]ß{kµŸ´·×Æ`¯� ,— '¡�f $�¡�À‡‚ …⦞dÒO›ÏÅÕ¶ÉL˸3é�¾™÷ýžçyŸçŽEGa8ŽÇ¯ÎXž±,kFæªUËgωœL“Y\ÍÞËŠ%sCÇ!ç÷�°‰„ †ÃâОÐõ<󇑉ãDÌÈ76–æ—krÊJsÊ4ù9…Ûò·oÏ,)­,ËÿužF=-sºzvJÊËêô¢Ü²ü­9ÅêU9š¼Ü¢�òQ¨^[²5?WSù’:½°P½&RQ®^“[ž[V‘»í@ "ÆcØ0 �a†Ûql"…Íİ$›K`)–AaY8¶*[K`ë |èx,_·{ _C¬Çr¨|¼0ºŒÐØL…2ƒIØAì žˆ—ã½Q%Äâ�è¹Ñ�dµ9fb̩ر±ž«ŠK�ûë�Ö¡û‡-Ö¿8þ÷� FJX˜p~dʨ…£žŽ^«¢:2ægcNŒÍ—2î»ñÇiÍÀÓåÙ¯Ç L-î3¶ÉQâðÎ)6ÊÃT�¤JQtUÆ<º ìd[Kë7�,ÍlépÏK{Àgm_±0šj:·ëA%‡º)M>ذ‘ÛY¼ãu+mu ¯èô¸Ùî>û˜s”6­,9eÆš«�`¥+Zlþ�ïí®Fv÷ï�Ôp"6ôâ÷{ ¸ò}U¨^°ç`1Ø”› _#ŸOvPí¢¸Û™°öæP…éå�0]JÀ3ð–ê uÃSU\'ÔÚ´Ä6�¶¸x¯Otív±ça-é²{, â*žM«ÐU$3IÔ§°ñGÄ4Z¶¿bZûN±PÇÿoÄÅÿb%l\kPj�$£½Chgü� % ´Ÿ/x›Ý’OŠðÀ° oU„`]Hž¦˜õK¹ý ®ûo¿þÜæÓunÛ;~ÿæÍ †AH‹Š•M’© ð…Ïv\<ÃåÚK½nÑ)2¢äët·ì¾4ÎwĵË{°á¸äüHŒu)›¢Áì\•^¨d²©œ_I[S½òS2ú€ƒÞGÝæ‡~оˆ[›;_³šYˆNÀôËpf/$¹Ï/>:ÝÃÀ¸®)³¸j^[ûŸvÌ÷oËŸ’» ™�¿Q÷;z˜ý^åRà9�FÐ1ˆ¦ôZIϘ ƒn€g'½.2é/÷Ì'%·äqÒ›Ëæ°%“ÿšõ±swlB$ZÀÌ< �V~Z±7¤V4,DU¨ÍþV 'Ãí°Dy,lÿ¼þeª”ä 0éá8½ûo\ϵ»¿¹ÌôüiJœ“‹¸e/r“3’ÞJg”îåêkŠýº:à?­ö ¦Î<*‹ÉÞm­ke²Õ{í½®Vkë gmgÜÑY뺬¶]µÖŠ/*D)‚$HB ä�{o’›7 yÜ„‚D¨È‚«Rß»­‹#:íZDZíêìîæ:�ý\gw¶�q¾ü—™ïžïœß9¿3­þÚD*è×`-àø77_ãfÜù ¼“Ÿñƒ!2ˆ9ž†òVÊì&+æÅûŸæÁ·ü¿œ/]/ª~;+‹�É÷æ¦Ã¥Ä‡xþön[y"fÁY˜ÎM7ºî¦•ŧ?Kçëü»Eëv‰¸×¹,‚ãñAŽRf5=¿‹Þ\{�#p.¯H`…¢�û¬X™þé¦-D ”Àú?"ϰn¡.m7;ˆK ÌKë3ø[ ªƒZQ“e¬‘¢G .Ý:ö­×®·è4$üáK…21&®t÷FjïÁgZ;iÆ�ÞØÖ’[›pç*ÌðUM) cGS'þÔŠR(q�V˜IQÈXÁfwÆ¥q?厷¾w¿œpF+£ÚÁ*�!$A=[¶]ñÖÒ×פÓƒLÄâÂ-&«eH«FM‘0 vq9<ÊPM¡jmfL¦:XºØ:x�¼È§îc@wÑËàånUgn'Q’YWF6Ô™‘û«#íèÄ�»¾9µu.Ò—·Xœ&‹/i�5_9¡=¦µ§D&ÓSãoÅÿ%°EÌÎ:1;Úèö]Ÿa�Â�«û„ ”içT‘ª_bâ)å¬DC£¹éü†&²s» rZZ´ŠvÖAå1s>¤mN¹|=5nr7?ŸCÖ,Ç~»çôm†Žº{ˆoâ¯òÚ�f×5,à‚Q¦¦u„¬œ”bÜ |i9ô6¬TÏH§-ÖˉÕÜcž±FWR‚r?ùëZ�òw0}¤ âv¿ó˜­ÉÕúÒÞè¨ð x>u´}É 0«ÎDÈð*Y…íãÿ¡ÐLaºÄÍÚNœ#™2ª¦�†*Hî´%õ÷§²§ar(5~$þ¦`98â‰D™ZÓ\›ÛäOb”W�rìþ–ýð"�*éGÏ£*uàE®e㺠ë6üfnÞÁìÜw ˆ2Ù³Œ&­÷Ö™½X¿õÙ‚Ùat»´0d*ÌÕn꯭mŽâl¸ˆ …ëÏŒ„Ãÿà¨9&’QÁ’È I\WCÉTPJ"Y·àIÿTß‚ •Øj"­òNn¸0§óÄé�î^—«¾Áé:Ù;qËŠ¸L.Úÿ”$!‹_˜o>œ W¦²S6ÂGú5R”")-©ªQÎ�ɹUl|K±³ccàÃQh¿!ð¢@/§É*)rD²?{&,ë=ÛÇ¿›¸ÚÞ×Ñ…}æY£¡ŒÕIÔ�4Ö”Ä21˜¦3¹ÅÜ’%#\>Ûw²í(‘öÅ6WŸ<ŠE#�Žák÷þ‰Iöl5¥Wðm éûB¬˜ldë-ngao°†ÍH'xÓÙaC½5nE¡&_I&*½Û4q% ÅRN�ª±TP9¹J`bÌ6+ !©<#)Ã唂”QH)©¥d(¤Ï5H«UZM±A†—.UØÎUdsõbZ^�.úãÎ1€€à °èë̱õ™û²+¤¸ëÉtAa~äf›%¸JX<¾‹Œq˜G¿ºŒõ°û3÷áxâLâ#qÖÞ,˜â߇ó‚*t�÷²)±K@r'5ŽÅg`f+«�¾FQ‰VÔ)ƒ‘&6v:«3ƒ{ž…Ü‚ÕCk�ywÿé±Á>n¤(µû½eŠ\,Crnà˜ÿaÇe¢¯qhèæ9Kf³pÉ¿€>{~R¢Ô8ý¿ÏßÛÊž/žz¾ƒöö›Ô°ŠC�ð-œ�÷c*=ŸF ²%¶¸ž{. î¡+Ù�1 Ö±)½Ÿ_K*ø=,”M—Í�ÓÄçÍö‘Ú“Û¼€[ºŒËXpný¤e{QtCÝEÂÊ ÀŠ“êZ±ž¨(w·šÎI|ævý..›eÇãòf°üV�Mœã©ñíñÅÖ-=Iüš|ì½æhE"¶P}# ©Õ.â AY,OŠÄFýÇ»sê÷gç¬Àeùª¼2îdÿY¥¸È—­råeó‘Õrņݘ±˜ʈA†î1¡¬¢VZQ$ÏÍî‘t=êï ¸ñÀý h�"Þ•ñb¼ÏÆg'<˜�¥Ý÷@šÀPIªÈNaŽô0Vp¸ñÊ™(˜î%†›{cÝ *u„±ŠW7,h®>Ò¹ãR¸YÜ«Ü /ìºx¦¯› i÷å›`^—WíЉóò¡0—–`Eb³CL´:GݨOé“”Š* „'*ïÁ¥ÛC¤Æwð,µ´ÙœôXiUE‰1á±w‘eSC†Ýšýùpßpöí´8è SÓ`”ëñt‘ðp¦¬²D›j£î(9_bqØA´»èøž•Ÿp‹4FowšØò'"Çc]˜ÓOŠª 4"oMJGt•ºJúqKÞé¯;Àb;žöš&.Ô)’2‘D$ij›êà L¶_¸!uñGIPÕ l4+�ê1¸*`|´—AG²[?^ü·X«g 6þ.+þ06Ðr ¹kòK�*ƒŒXöä%Þ;Ò}îÀ å´KJD¬Á`$IŒ¨TR$쑟¸ro𻈠“k åe Ä¡¨•…!ŠÆ ¢¥EÅNΉ¥ô�¦ûó�!±IqnÖ-Üa¤¦ÝÝy`°-nñáþ6ï…ÿ¶Y†L¶óVD·z§lWÓ©4)G øÕ(ȇ৅à”Àlkè„SÜØîëÂbÞ¢p¿+ÿÍy•7qŸÑºÆ®˜LU%ìÎì¯é@i§ÐdÂtÚ´Ép$™Ò!>¨c(øÂ:|زdY²­ûòJ²vu­´’lY6¶Œ-!cl|O�™RRgÚ0Í„6½ “Ì�tgJW2´™–´3Ý¿öŸ�}ï{ß÷½÷U‚þ£¸IY¡m•í7«8Æ^}‡és«|cöȤ ÞŠþÕw™]d‹l ù|î«2!“')±¡CŠßMÀ�Ä¿¤þaW]­U+,ñ¨'>è§æÒð©$Ó�Þ{°\T*À.ššRûÐ+ßèìË&þé´­«O$=õ}ÅF$Û‹%B`«¾àê4q(Z%lškšzu½¦Þ(SUz8ºU¥!Ôã%|ÌjwNØirÌ1FfGçákŠ–GExqò?«?á3…ÝåŸÍå¥.‘@˜ã2ì#¼€¾”„›–s\rø± üÍY£<‹¿äÓø/ûO-ÿ¿øÿ~39±�æ¿–ÿ ÆxÝ|�y–ù*³�yn×ÚkÀml<ÜŸÃ/sŠw¬núÆìÐýØ<¸�^ŠÎ ¦¯ ¤_ƒƒü7;„Y×¹ÛšbŽŒÂç7 ó½+°èJ~ŠáòZuF-U² ÅlѺåµRhª0´`¡DötÔáò*éð¤á>"ÚÝ#ÂEÀ§áN¸3k�‡Ê‹úT`^+Œ þ§–£•QñÈXlÔïå¸ÜgbSÿé‘?RÝ´Yl8gq'÷÷«Cðúº7+g~‰ÝÐÛìæµè "j½±ÈÐX¼%vLPÕS\‹½¥°@„Ý­%�×÷–>$ã ®L£C¤¼í¿Šâ’4�Ù øm"b!{˜]K~esŽ\sÜžhdõûM* píûï«é•uøüÕEú™…÷ ‹ð; Õ7¸ƒ2XÉ ˜Fôć2¦HKûŽtŸíR76m O‡‘PŸ»[Ò&¯.ÍÔ­Ã]i¸iчǚãXç�Ø^îæp?>Iœp¦úÔÛ&gõ.¬Æ,�õNoÌ�LŠR¯0[¶ó÷þB1d‘T¹Žd#Ù(<@çe2ù°Šu²»…ÁljfÇì)LÀo zq+‰øû�ýÚ.S³2{ vÿó ïþ˜ hLê~¤ò̉¥{Ù]Kmz³7š±öÑ)8ǤU¯F[ÍÃa ´yØŸ?üÖÁ.öç;h5ýÌG«ðÕUîmøû^5§BãC¡q?LR«¶'¬¯3TÄær%9BŽ1ß µ@]ä�ÃÙ3ħtõ¶é:;õ˜ZXÎ4ë8Üô€ð¥èQu:±[�^ž¸�¢‘TK¢âßläÎÐÙ©)ÔågmDÕÖ+5Ìfƒ¨Ùq[1ó³‰sCtöL:÷ç{�Aœ¡–î¯BÝYîüãe^IxM5…þ2}õz DVðÙUär ¡KÄÝJRg7bNMôäQ¤±}·´+n¯E¹¿.ëIÎŽ:' _.°Óìëc â,…Z棄c”ã*¶u›EfL¥RÈ[PîÂËø­@œ<—†›�çt–Ð|ñ·Ãg'9B\*¯•Ì—Õ|òõ;²…@¿9�%ôͦ3jÚÿ¿KÑy±ßÀ›ì¸´=ØÅkÖ+ŲܸŒ…¢#ÉŠ`mqc‰LƒÝê*ìAw”3[%¹9±ƒVóǯ…FÑ´³V,Ñw)+€â�±·ï0§¤·íÍ#(›„))˜$cž\„wH›kÏËRsãS3!¬Ô?ß�@ï_„[Ã�”ÖšÀž“‡ùÕhƒ,:ôû¯Ï,õ–+ÁÉøÆÏÍ¢ÖÞʶï;-ֶϯŸ¤ÈÜ{í«¾%îGÐÏlâ‰N �£Ê ël/°Ùq+:FG#™£WÑ <þÓTÃò_îÝ…ù1ö\D ,v+Aä*¯‘[µØ~漡7kUÛ¸hïnj¬@Ë —F–Gn�¼ Ü£„÷‰å~Cð¦�þ9ÎlÅ›ÄÈ®ŸKæG'�‰ Ì2Ð[ª6߯b¿ô«Ôk ½4µ–—zðÝ|È}——º0qz>�YŒ{}œ×'VˆC‹›uf£Î€�èK;P©Ê9$ÃRy  =Pó‚ÔdÑ;Ù@BÚÀt`Ž ¢!Z§ Å”w¡ä ήÄ&ayE5ÿP™¼§[Æ).ª+Õ!z»™ ,‰ ûã‰ré:i ¤qôOK� ÔÚ£ÚJ%¥b!*í&�Rà¨ð~T­Â�ð´4ôÉÞu¹Ý…Ì ×°Ð«=ŸË{¸å‹á§®l“[¶`;êØÃ¯|Bñþ!ÀoÌH endstream endobj 85 0 obj<> endobj 86 0 obj<>stream H‰TRËnƒ0¼ó{LÕƒ�¸Hˆ m$}¨I{wÌ’"cràïëµiªÀãYfv5 kÚÇÖ °77é#.Цs8OW§Îx ¤ºA/Û-¼õ¨,0/>®ó‚ckú ª*aï¾8/n…Ý!¿çwÀ^]‡n0Ø�Ò�OO¯Ö~ãˆfu ö kž•}Q##ÙwZ-‚÷tkº‡ÔãLF›”*æ<ò¥™ò<šÓ`IŠ()HR”D¨H”DÐX2z4› DIRn‘!·‰ãŒmî–·¾:çWÖ§¬ƒ·?ÀN–¢¥'ù`O9�o endstream endobj 87 0 obj<> endobj 88 0 obj<>stream H‰tU{PT׿—e¾P‰·&wͽˆ4>¦#øˆ‰+QɈ¯Æˆâ ¬. ì..÷½Ë]öÞ}±oØQ�5VÑ&é›ië3vê-±�¤jÌ$�±í¹›³Ñ^4:�Î9Üsß÷û~ßw¾sŠ$'!(Цl]ÿîúÜÍ‹rò¶ïÎüùèŸìk(;3™øË&^áä$vÑäŸ)žìøáïñV>ž ¾žÓOÍš41™Ž¢S^ž»deÎæm…”õz+sã–D¥–*eªƒu¹´ºFvH"—*Š¥Ji©\Z«ª)RIÕr©JÅAy™R*ᬟ}K”ÊJ�RVV®–)Je ™ºN*—VHj…´L¢–U*Tr‰ª\Z+ãøjÇZQ¥®ãض•*%Åêe�‚3*’(KŠäJI‰¬X"Ï©¬ª{Ƙ¶ gaZæÊ•Yië*8qÅEZÞ¨ƒ™¢L&pcï(`hr˜ÅF£É`vQ> öpÀ¸‡o4Ú¬VÜà7ù½G @€‚Ñ øF¿Çæ½¾€·Éa�)iç"Vÿ𠬬:U-2ÛtÍâP8Øê¥üÚfλÒ¯ñ}® §oÕuT£Ýl `êÒ0XÎ1öN¥¸A§Ó9Iƒ0 _‡©÷ù>ÍXÄ:­¾¡!hõQ$˜� goä›(½µoëC.7ã夥>ÐÂl~£ð°-¬‹�Ñ�a;™BÇ@w œï@Y~ŒÇ.W0Ð'·Óµ´–„} WÐBG4ºNKÀØ/ÔÖÒM;&A?ì†ý‚ÿ¬ÙGãý)ƒ1°tt¢Ãñ%3îÅsØ5XË <ñè…_ É~“xûÉó0™x(8<Ævaáÿõ “)ðÕQj–Š¡#1^|!û`ÌÀ7à8 ®„«Á8¬ A÷8m�¸ €ˆA˜’À6ÿø.6–ItÌúy¤{²a/žÍÞÇü.¯+ô¬MlM´Õ@$>�-|c£‰Òáz£�"Ø�¹Ö€ƒv‰>_ hqê=d" >ëMhÆ%h5ÿ•ÒX ,pó¹üî 2¹Œn"ñó›uM´Ml0™ z�-då”B&Ñ Üf�F7øL—ƒöö4,ø?qØWoF‹è@ãß�zìí²Í¸Ékk:<.Ñ2Ð÷Çï‡DA�ƒiÆ›­N;±óhþ©¢û"Õä6ˆ-f›ÉÜŸý§ä�~Áá:޵�ÛDŽÕÐǾ҇Gã_Fy¬ÅrïÚ™švѱƒ[?\#†¢· 'BÞ (äŠ>÷+° "¯®bìÑZQUßo%_ˆ�è@ÁDÀÛ„pœ» .¨Ñ‘Ý娵ӷþøâþfNfƆ5Y{‹:/î#+Oìû}å€èû±�Ò·Ò!_<{ç㯿¿ñÅ—çϨ?8G—ŸÛr\&JyЬ>Ñ_õ£93ã;Ä%=ÖUk`VL|f‰Áòq]’%€Ëá\˜×ÀU NY$X1]Ó ðÀõdJâ1”G~˜Ê�n’¥xñIñU˜'È8\\ùBZ£Õª·‰]O¾Uoo¢p‹Gö{EÐãrõp×Ì›‘“Ñø¦è`:tt]å±/Å•ãnež5ìa›±ÆJØmƲ&«È£?ØR*Þ¶©bm)Y²ª1s)þ ·üõm¢v#¥kzÖM-NÔC0Nÿ Ã#Òuõš�‰Aò¯^h#»o8GnⶃÌ7îP‘x„¸Nƒ©ßàwéëá?Ú/õžwt[kºÉÞb¬?Ÿ†¢Åøzz�>—H¯Û%Ý%V«¼Ém�*û«š( ¢wN€Ï¢èpï­¾+#`Ú�½ߎ…,6Z'.„DíäpÅî¡÷Ä÷çå—tU÷(ÈOvÒõ¥x®ùý¢êÆÓmv¢Ùî5èíf‹�Yûé¤=JŸ}ç2QvÂ~$ˆõ]¼pþBœGÀ¡††ù¹*I讂pµ{½n«§‘Ò76Q¤Û´X-æF›ÓÂØªÞb¶º›í¤Çéq¸"µ¯/ë¶øo— 0ò»o…!mw�;£b´"Fニ­&ÊR‡ç]Üu•ÃÂíDç‘h[çQk˜aœ¸¿ÞÝD)kõZ¢°œ¯ Vÿ°Åå à§Œ Ývžˆzº½`Â5‘Çépxp†vXD–sÚŽS»UFŠÐÖÑub˜ñ¹ DÕûÀK—ØÉØMnòy³×ÄØO;Ðá«à.ô±¿ÃÂt;w×j‰O_�³ -†éçN°<á&Âù`þ;`&7æßóˆ”4茰¥]¬ŒëkùUd?ÃnÒÑ®£D[[g× —È͸\<`¦õËÞÏi"àfạº’Ðj«ª¶P"‹Ån4zh¿�> endobj 90 0 obj<> endobj 91 0 obj<> endobj 92 0 obj<> endobj 93 0 obj<>stream  PBIBHM+CMSY8(øøáJ_ ø mþO¡ùŸ÷H÷O÷T�ø’ diasteriskmathprimenegationslashCopyright (C) 1997 American Mathematical Society. All Rights ReservedCMSY8‡¦06—Ñ0ÿ@­ øŸ÷€Å÷¬÷t¥yË_¤yy¥�‹“�—›š�‘��€�s–û»÷$Ë•�˜‘ž‘‰¤hû%(š÷+œ�ˆ¢oy}|}Ž�šû,ûå”~…‹‡y{|x˜…•‡÷$Lû$K�‡~…x…�r®÷%î|û0†„‡”t£¦�¡œ‰ÿ 1h´ øqŸª÷‡÷Ÿør���––©o£mc�jˆûüFЉ‡}Š~ª‚’‘��–�ûk ú Ÿ÷(ø¥ù2ù5’—‹�Ž–‚—}~‡„~„üoýø„‹‡ˆ€”™˜�’˜’ÿ:fh÷w¹äùùP÷w™¡‹¢¢u‹}üÓ}u‹tt¡‹™s£ù? û“¹ ä ¹š endstream endobj 94 0 obj<> endobj 95 0 obj<>stream H‰T�=oÄ †w~…Ç«:�°ô†ˆåª“2ôC͵;NŠÔä�!ÿ¾ÀEWuÀÂ�ýÚòÔ?÷äÈwvÀ£'Ǹ„•-Â'OÐ*pަݫÖÎ&‚Ìð°- çžÆ]'äGN.‰78œ��ÍÈ7vÈž&8\ÚϯÖpFJЀÖàpòôbâ«™dÁþb—-"¨ê·ûààp‰Æ"šºFièŽF’ûŸêF\GûmXÜ*•jŸ´¨@ù+-2·W”e­»»2g�u÷*§ñ„÷óÄËÜòįik endstream endobj 96 0 obj<> endobj 97 0 obj<> endobj 98 0 obj<>stream endstream endobj 99 0 obj<>stream H‰¬”kLSgÇÏi)Ô�av©3ç˜s:§Ëœf‰É.^’-ÚÌ�„z¡r;)ÐöÀZÚRJ¯§§=½žÞ ])¶µP¤8¦Â&²¹ΠdsfY2³™%î’-ËvŠeaEü°‹û¶››°˜µ&ã;f#šY»ØÏö˜ºŸ…Oj™™èêCcsd þ:7~݇]"äï&Ú¤ZÂ*FO’F›²Yl$…,��S?kâi4Ns¾¿™K^gÒÓ 9œ~E/&n‘ŠÚ{‘èé�’yn‘Éi+"ð¶7Ø¥AÝ UŽ6|øÃÍõQZR§Æu²;v¬V«í±gÐ7ˆR1*æy°Øîˆw°šª?SñB]†ÛÕã4º|E"wãïǰŸ2´jÌ*�ÍB §€Lm<}û>•ò.�Í3Ó[³X!eH*·ŠeÙ@"�"á¯pJ”•{K`…ÒfÁÑÁ€-æ†侎–6I“0%™ý„fŒÒù ä}�Ez­®4Ss¶ì™â  p"s‰éé)8ìU5©LÙÈ206½–ÒÄéswqZ8 Ò³7/Ϥ'¶p,VÒg�ìF·ÚØlÂ1䀑ՎkÌrHå'¼}�‰À r$³~ñS–QIèÍP§_v ùm5ýÍ3ΞÑ_“ñ!aÀ5ˆ© W Ò‰Ú�Æ£ƒ!2�ê½â€VLÕË�ˆ K\(€Åúþ˜ÏâµGP‹ÍÖë�¾Ú¬p"©þáa¯�}if2uöyMzHGÌP{Ÿ²?–è–Ž)+¯áó‘2¾¤[¡c,1‡æ•÷\Ø1gŸgÒz‡ P£d€¤VÊjO^�H²£ÃIWN½Û~TªÇº«Q�¸³PߦܿÖЩ ,¤õ^¯!®a{8òíÚ•Kü—K$ɾ˜>stream H‰”UyPWŸfè"N¼Æ£[û±&Z¥)o]W°Äe‘¨«\”Ë „™›éyÝ3L÷Ì ‚``@�Á+¦6פüAt˜<5zbvÞ¿0’hæ‹hÅØ“S'ï§ #ˆßmX£Ë/+Ø�•]3kÍì˜Ø¸¸7bVåfìÞ•–“˜V”�‘›V¤üɉ٤۵;£¨l~̪œœ˜äЉ˜äŒÂŒ‚âŒôÇ�U„*ŠPiÕô0ÕÌpÕ<µêUBµ:R•¨QÍU�ªÔªÍªVÕßU÷sØ”°&uuøÊð»ä9ê5êdDu$Y•𨼣¦ŽªŒž]1zÌèFMœæÃç�‰sx¬jlǸ%ãÞ;þЄu>ÐOœ?q`RY²ÆŒ�-÷Sš 4ë}5Ú�k´,n¶¼=uúZ�<µ¢JÖãáyÍCÑ`Ø”ºe;‹7àm›qt¢'ißz2±žqÖò"ø¡äÍSjä µ4q�õàÌâœ7é×3‚sp#.e««ívmçÍÒ¾þ3G{Y´Å¢z´šþ¾+?g5É(ù4ñ‚jt%k›èuÁå:à¢=&XÁâdª„ƒzà,–R m�`«‰�ß(ü?j”uVÛYä.×åäç¼ÓPÞÖ~øP7«�>”æ“×(ð6 pmNŠ®è�ÖH½Ýd/§ (°mí¡v÷.#zá·‰·€B¡ªî]/ís7° ¾ãC ¾HTIyñ"¾BÈO´O©2ÂRå¨t÷ =Ý=ÜaÆU›¼f¸w›U|—;‘d‹Ýî¨bªl–j3ÀyÁµZ”ŒFZñ©y@LÉkQ@]iF'|„üù 5ª ¬Ð–…ŠŠðÀ¡Xa�6Îð´àŸÉl£Å´‘yøR™ A MCˆúîjÒË<àû–Û7nÓƒ)—1Áb Òö#'Ùça7ƒ¢¨áƤ´×–ÎÄÀ øÚ<;ïuBÁY‘ŸD+¨«·N_4û7@ƒÞ/ö^ñ)®Vz˵¼ƒ—Úm†W�fvýòÜž­�뜊³q6àå(l�ˆá«¢¾i¸­|n‚S�Ýhcñ¼Tµl>³ îšÚáE+¾E4¸òáW—¿f�¶ƒ•\‘­#Œ¬õ|ƒ“UˆQåMPˆ¹èCþ."‹öj�n(ð´ÇmV´ÙXŽ3•Xõ‘˜NÙ™Œg3XCý0ÓÔE~I Hº2³Ž3¸-¤°³Žwîs°£’wò.çÃrÕv[•�]QRVÇ,¦úOq‹üa�¥P´wçF#,±îVÎ`¥õnX[M¶ ­%‚ä ½&XηPå�eùš 6ÈÕTÌ�=­™œN5óü~ÐÁZî,­(XÌ,¥.£ú'X#¨{m¹ë le¶"ÀUAÎöóX×?Ö�£ýÇ„¾ã'¹cŒ[ C(qÀB¥çÀæG+½u*©Ø‡öúäY!³\S^EIÚ}§yþ4éqJ^É,XÁžlîíô�BcÔ?æ@¤úz`IMÉìÊ|°=?>s-³ú¥÷ÐÂán´èæðÅàHß•Ÿ5Æd#ÙŽK¾›ƒ&ŸúgýÐ9�/5gy§ ð<Åÿ²b(ñIÀ¥äȲ¶Çí’ú™F·Y#´‚ìL.+3CÈbLú§¸»HÜA�GVòù=Û­GüBoïQî#=¢µr”Ü@Ø?„ºIÔAÅãƒÏuBâkyAQáÁÈðWÐ }D¿¼D-k䀶Gòˆç™IùØk@f:—™‘.d†ð•éEØxšõ´ÔT„d÷“YF‹ySexÜ­÷¨àï;Æùu3ÃR]ltAAp‡L;2m¨›A�ÒaÑáæ§b'<Àôß�sˬ8 ïP¨zIÙ—±íÚÖ�Ò.¨ªÀ2ee†î[er6Ô›ØÔß“C™«`ƒ£pŽÄÑï;{ÓAKQ“õJI]Íñj‰‹ëK­Ç¥º·.r …挺;ÈÇËŸ|6ä¦�¨T^ÀÔrB­A ¯FkÈmWÄÎÀ>ŠÖ]¥ŠQ´j+Q­ƒnQ[Q(£˜FCã2l,” #_ _!cö�¿98èñõáñVŸØ�ö;ÛÚjñ†nÛ4Ä '&»R9öÓrn~Z¦¸Øh¯qרñSZ±<áõDô´ú®m¢lªÀ¯z|þatθ_†kT"59ü°Àhá“€u�üÐtFm5üµLËÓ`»$T�F¢©¾º B"V¨e³º‡*É#ŠEÈ�/%]…\PÁ«`ç'™7~™šs–ÇÃԫߢ�L õ[\Æ«-:Kµ%¢ß2¿tíiÌ=}ŠA~·<+?§ˆ‰«CwÆ %믃sw)�#��4¶¦Œ[‚°] ³¥×09–ÝOF’QäKäîèù„ÀwîQg”šä*�F"ÅŽž~³(MaùfG›Àú®i|Î;îF —‰tè�+OP9�µ]Í×@”j”ØIRBí°Û²ž»µúÖêZ<©‘Æ’%üŠFÌöªp•€ú�¶ü2~ (¼P ø´np’Q¾Ü¾“;I<š<3yô£§qã!ÜïH–;GŒ­–~Üà¤�Ÿ[耻ˆ±ƒˆ1['zÑêf‚kÇ29K„pëÄ n·£«ŸîÎy™MncÈ0F=þ8Øà³áÇV)U j /~{¶¨*#U²µ!Þk¬i7!�KeiiE½·tðÞˆ;°ÈaX”uá g :Øö/mB©�S©Æ4án1Û›‰¾w8šŒÙ7‘ø»Ë¾Q£/$·Q™¢soBE ÂZŒ»ÌfgR+©/-gWžëç-ýíÎ�e'&€—L�4þp2š¬^²]jÔú>üj³Ï?‚ΙÊÕ…ZòÔ|,Oº¦×–À ýï¢T‹á„�1«÷¨*¡Æ?¡¹ª¡Õà1ê°`¢u¦À‹EG‰ÔÊ¿!7W¦á¶RÂAÒ;ήt‚=5¡iQñ•CŠ=…ò¥Fw“µÃäÄ=·¼+3ÈåÒñÃqÙ¹Œ"xb…ŠÃn‡�ý“°ð€BkX++ŠyEeõR»³Éá�G⪑&-#„$±ŸÓõé>Rû.*ªÒ7yêzã¸sÊ9Õ8anÖ™ˆ¿ …¾¯€Ü­�#¬¶º®ë4yVfPÁË+ex$+v>ø~{ØÊ•9_»>käD­j©j‰JÄGN{óG½Nwkæèª»Q¼'J!‡ V)ù*IDš°2�ño+øaH#„ûP€&Úÿ…Ó©yIyØMy†;MLc¦æá>³'--gqpn®0A�Hõj³U«u°Y{ã¬õª¸Ê2Û��>ªR@h”H•©Êa«7:�˜ÎÒ~dhÖ» õ®ˆ^˰q™Â+‡ŸTàï� T•z)"2 n‹£ØBØüpÚ´� ¢Ûú?£ËÈ;S€=?¢µòùcÛuJ@:i�›yó‘ü’ëÞO^‘p�w‚Œ$H-›ÑssMx¯÷úÛ{Q¿'ãݬ’Z˜„ËIa磑+äé6°/ûW×("·Ò˜R™ü*‚IXjTëqO›®¥½3˜šlP“äDEY1a7k�cà8ζ4ç�¡ ¼ö‚è Í/N¦ÀÇ%y.Æ3`å(ùøo+i¦ùûW¾l@'ä�WÌ8”¥Çe>ô nà -t»ê•5 i.ƒÉÃÚD%½iO™BO�³Û‹k5Â4q6?~» ™PÇi"„�S»W×ÑéUw<…,”ñk€ùÝáŸë¨¢uâ‹`ñV$oÏ"èA?ÍVíßþÕ·ÎWrùl„ÕÀÑRÛãÛX”y®ì½\lV’eg=ç,4³ŠL윿 ^»>é »}Ä�SQ� ´<¥ú¼NwƒÃ;z¶/ŽÜœ�•ÛÈ1‹±^£bXѬðW%!¬’äú¼Ôº1vIG ê�‹&¡”®LŠŸÎÿ=Ø1(S«O·b,CžÉ‡x\7ï ¶q �XäÏàþ  ��ØUÇ íê�Oìêçá –ªÕiÍÁÛÔÎeKÊàjÐÉXêëá�ï�{áGÉAª¢œ¨R"™-ÙW>Ÿ»õÁE‚)T¤À˜Uô=¿FùcW(1E‚Mk“ÿÊtã$% |�VS£b¯2 ‹¤l� ;JQ5„X­À²Ësó3Ñ3_×\÷gîë¸É­¯u"%}i¯2È]ò'bÚnò|6ƒÚ¬Š¶¸˜“ˆî¦Ð‘ØÙ’ñ¡nç@'F·vpºŸ1Ô­¶0°wÚ1 ¶Üèš¿¼¶‚Ëæ–Jt È¿›U�ËCŠ3I¹1E020ã]qÏc¦¦g,ï,IQæ!Ñ‹¼!phüÃõJùèÕ™†É�¦ÁÛðÝMà0Mv^S"EÌŸ$'Š.{Gf»>Åìƒ5–gz§ V”‘‡ì¹]æ÷x s=X‚k^Þ‚.ö¿¿Ð‚Û‡À®9ä«pÑ wðs±dNa:Ì{]«±¥v7¶;n™Ú" ÍÖ}¨[26¼3‚tÙ€øŽÍæ_S‹”=ð2­L.¬(¼-cIÖ ©Ìë1»SÑ]©äöò`ÝV­®^�/º/]EÝn^z©ø¬”‰+Êþ¥ÌßÒ�Í™ E¡qÒm¥Ý3+åWLž´x:¸�SX^Z�¼½ró–Õ˶.”+ž¼4î¸ôÛ}ß%çƒã´»³ªMÞ½,&$J:±uçÜ“WOß#?qáÔ-“–sܘ7ÿÆqé ºkçÊó�¶Žö]Ù‹'5‚ýçô{7kNsrp0eépÛÊ…³gË5Æ×GdDpÄe§—eHäÏØÐ"¿»·˜eg5Ì,oIî ŒØ”µï󣯯ƒŠ…ã³æŸ9ÖqÆïNß5DÝÝ㛥š�vMíî™>Inñ¬e×JO�Ñ�½P¾hÎÌÊUÒ/�µ÷¢É­½Í ]MòîÅAåùÒU5gÈÏήﮗÖ’�-ò›vnݱc3Ç«¿sÌ•š l(4vuÕµÈÅÔÔ–KW7NZR)¿¨ºv~¶´s’^ÐsýÀXš ,b§­�·Bzþœ¦Ö™ò囦vÏ—.Ì©©iläà+[ðÓ~Áï¥S¿÷²ýN˜Ê.·À¹’�ñ?ç ®SÜó§ððÈeµê‹Ó@€�œ endstream endobj 101 0 obj<>stream H‰d”yPTWÆß£WZlDyßÓ÷Ú%5HÜG 1NDA¡\ˆAÙ¡A¡YÒ (4—”¥YµAi‘nEih#¢±â‚74n£)udf0蘉ç9× Ó8©©©ÊŸ÷Ö9÷»ç;çüHBhG�$)Zé·rõšO¼×® ñøãø Ç3$ï,ä§9¸ãòiÂôw»E p§³ÓhÅdÂŽ$Wx§¤ªUq±;2nÞsžžK^I1ª¸èÈdÅÚÈŒ1I‘¶C¢bCJt\L†z¾Â+1Q±~<#]±>&=Fµ+fÛošIHž$ä$á$#1SJ̳#<b‘±” VJ‰Gâs»�ÏÈ?“µäIò†Ýb»�v/Y‚‹ÂPá‘—èŒx¡8NüB.ùNê#m”¾µ_gÿ7YˆL/š°mÂ[‡@‡‘‰¥�/’w8:;f;¾˜8Éì”ì44yÚdËäçS²§üÅy±s3%¥"]ì\”.µ.¿|TæÊ¹rýyl,8Ÿ��‘kò �•[Am&ûÀötÃí^ÿŽS;¾Ü¶ukÆaL‚,ügéॡƒô…Ä»^ËçbûÀz?ã6S½yk–Z™œ¶‰^ô×@?¾f6õ±êc÷¶Œ2�îõ=Öq‘âEžšTfc¸åT7x­ùèSp©il8| ZÚTkA=ŒU¢]§E1Lª?Ò¥s’ªA¤).Ú«-æÞK:©¤ûèz}ÁÔ×{¶F©Ò ”­ÁlI\TR«ÄvÔM<õÁªŽ4i¸Ÿ¯6‡ñÌ{myÚmnªãä \nø÷ÆC$Ã^†÷PåH—ÕÄb!#@ JB¿�% «×—––Óz Ú·[‹v¥±x6–¬ÆØ—Æ7ðj˜‰¥ìÎVªf*ôHÿOç àè(X«ñL�²ÍiZTÀìÓ MÒTs ÄB+Vb%�C7ã%XˆE¬FSRRDkô¨¢J‡ ­,ÌÉu_Zþ¡- &õ0 €k ¤†ñÀ‰ç"˜M>�ÙȺMuÅ·oÛŸeNìì4·w±ò&�™5“=¶æ�ƒ€¯ƒÛÔ‚½8 \èþ ÂȇüRÈem—ýTBz­!“SÉi } VžcGënhfLWr—ÖqU!è³u4ÎÏÍKJb33S Òy²òeÖ[Ýy Àè; Õ¦E ¬¿ �LVÄAñ‰�ýµî}3¶uQ×ý/ÔÇôý‚´ÝœO—ØòAƒ0µßJ~ S!œ¼¨Hqñ®Â Üiážå(—Á ħL/~¨¯‘‚àñõþdŠ[Ø‹Üýç[s[Ú; §» ‰åìiË@¹�îYá½<Ø;*‚ÃI8ST°iÕt6ÿ©MPcé&ŸxÎÝä}°ƒµ0Cuð„!šŽf`b—_Ùñ0ÎZUß~ŒîJn‹ŠLNŽ\ðj8‚烯¾Qý/0²ÏŒ—¯< ïz_Åz}Ú™ÓÚvâàé–‚ã[°]Ý×Ñ~æ9Z•”TôUB——¦�ÑjJ2KŠ´Ò½Å¨°ˆÎÞ�±ã‚ØÊ¯±yxHïÔK«;ï%>RR®RkQ®†Å/ߊ"à$cÒæbÛ(ê`Ž�"­‘³ºK0ɧPøFª»N0ÏüDúñ9? )à*€ù|µç¸Õ3‡/¢®ï¹öƒçz[è ¤×”hѾ6ç«Íù˜õa5�[8]a±®˜Ñ ‚l÷H²Pþ¡j]iu%[§ïèù‘Fó>÷F³°ãö€º‹qÜ@­¥¹#͸=)^½åO–˜ÿò9Lù§Oñôè°= Üø§›Ïƒìh‡�'Ĭ„_©ËeWŽžg»›û;¯1;ŠU‡¹˜¢œ”T:Ö˜aj57ö\о<;áåËq�/ÂõP®?Ý(Üïà ™þhI4 $¾Dù«ÎWqyfô°ŠÇ�sß�¢epCËf�/�Á6ø²q/6€LÀ›ùªªéÌ4Žâ9: §*×Öh«¥‘âxŒDÝb[­7k¤û«£üÄXŠg|�“$ ÂÒÝ›iß~Ty¤®öÀ¶¶é{h˜W«wǵ,üs[‰áÒC?‘Rg[¿=yŸ~³ “xªò ÷MÆÀ;ÛX, ÍZõ%�%¯6€+¸=}R ÷…e±ï*³&¥ÅL?|«kùñL¸_”:b}<‹íSíê{ÇÔRs–5=„^¶Låí¶aàÁPïé3ÆʇAvÁ ¿Ž;<vŒ¯ÑGp‚òA6d-LŒ­lØÅ¶í7LtGjKBZ|öVŸ !ol‘óCÍ÷jqfç,ÃÓ17²ºÏÖß2±XL¹¡G?� §@¶¬Ï/窓tkãiŸd·¥ìù ÿÇ ^ú{ááïÁ46öf€°å ì;Íä��é¾oc´@3õìâàÝ^ÖPÛk¤Á+Q,vñ_ëu,«Ídl>ÙXhެdOv]Ô53/‹ݨùZ�ÍyÌGÇÐ ’] ªd ¨ÂÀõã/(K‚)::!!:Ú”`±˜L›8éa?Û¶q ?lþΓj*ÔV¤3*í>u!‡Kß¿-ÌAÚ”â©Åª"ÁÔb]ë%ÔÆ‡�¶…³JvÆ š®¬ étåàâ ñU¼P4Ïgz‰N1¦"íÎ:W‚Ÿò9Hq—ç‰åcĘòˆM÷¬Z¬$|lCÉ(¯ú ¨®+Î »5ڌ̫uŸyâw0…‘’D¿‰ZÑ �hXD\X�}wäsÝ]PY]QvELüBml«ÕQi R­J±K*Áó6w�ö®8¦i§�éÌûëͽçœßïœ{~çüÆzwÎe®^?…¸š��»�ž|û«ëd„ÁøC ]mòžàNÄ“•ä*KÉYÄ<3ÎZ³ ~ŠÈò'¾„h†Ö�õ‹“ß#  Æ\D€p#Ä9(³~¢ÖîéT9ƒX3.Îà?š'=V7‡#ùä—dI q0…L „#aXM�6[¥Â»D¦æ6j:XûÛH”ÔœrxùÓª[mí|ÇïúÊNs0"–ÌoDy:=ÞÏ™±®Qzg]œO5¡—b>âXбùGŒ! ¬€Éû§ $Ság$‘ˆ£Y±ÞaÜHŽ:†,q†µ„•“¡ÙQIëø˜¤°O§s”½ó½jÊžÝÕ§Ý–!Ö*0S¥ S” ³È\Ž€ý²ìIY܇È�tÄPÅúóP 2Úà […ì²M ’º¾§áôø)œRw^ÌV·e ý^Y¤–‡9g±®GƒÇd: Èð1îÜ#¬ù‚ÊÖ°\`žìÛ0wÐÍÜü þü °À8ÖÏ%#*©JDäù[4ÑqÔ`fÐFìTÁvöŽC¦IóÅ)ÜÒEX·)Ào£Ä›7nås2SU±ÜòÉ•·– øÖ´¯à ù³š­çþ;á°‰ùßy½öMÕ¹”räbZ1·—U»Sôk¿0ЏÕµŽAÄ�îÐÒœ£ÙÚ&_œÈ%úbÝ&¤ µ¤jè4ö“ßîdRzNeÈök,Èá­ÐIZÿã7CŸ{ÞßW%1Î-F ÔxQO‰“p,; ë) ^®^âEoÛú°�³÷a��RíE¯{äæýº¢hœÞ/“ªÞAf�0Η–Îjkí ¼ŠK ²ã/ÑËC†™Â^]žÔ&ö»% |X¢�J�yyXÉ‘dzüš,C¶ìæ5Y™B—NSn¾ƒ¸†o^¾ùtæs .NC›öZ“\¼ e Þõ\ºko‰ª†«))+ß‹ Ñ9Dªu»•éõã#Ü‘þ—êì'ö8H2£¤®ò^s?¦M,hó‡s&[®´™ÙòÿFbeÄ|×cin¹V¨àêp‰‰w“V{p¯«= ­åÌ”™ôYx3·ù¬KG 3sH‡‹ê�e·VÈ�»fºé½ïu—VCU3œ|³Ð枇,p‰…Ù2xÿñýgà1õ> A®©ƒÄÊþ-à {Y˜†C.ÂÁd"ιÀDCk®Ué€cV°9F½4Ý ~>ÙâAxÌg³Þ­0\v¢)w‹ 5&ãŒ0yŽ;“Ì'�íLÜß÷wWÖäçlÔ9ZS˜ªÜÌ}¬¾Ö“� Ωo+Uî, 6j‚‹C"VAä}42×ádNH®tínO(³“ME7+åg¬—{{¬#£�¼² ª#ÅfŒ—f«‹U¯X+5n]süŽŒûp:‘„ÙÖUîDg£ úÓû2ökLJïŠËæÕr…òâHP#LÌçk\œÉ)qQ:ívt¢RW•jµú2¾¼\_Q_ïs©+ç7\øë’n"©§uâñ´§…ÖÉó¸ã.úxªS/&É2‰ŠN( Ñï»ã¹»®‡ÄŸ’ÖùŒÜWÄšNúdüŇ� ŒßL†è¼<£s¸CâLrz°%{Êns5´0Rçá|nóü—…Á˜Žá] ¨p'‰u%‘TQ%}LO¤øÓ ,e2ÖmEŠn,/†K3õz¡š«.ÃF½;Ì! �+Ä‚ «äxBœ{‚UÀY¶gîâI†Ç6ej´› êÚíå¼ÞZ‡ ÜZ> Aú‚7Ïðμþõö“PV|ÇŸ‘÷a“1ïD‹µ¸Ú,'’vöÝଔµqÖS�ÃO÷ò# ¬¢Ü +ÏHúû¡Ü=;Ä;ÃY2'_ª`®”âxäúÎÎÔj Õ¼W�¹°ëüÀ=ª»o½ÛMÞŠX·�Žä{£ÙÓGÏÖÚ9xŸEëñò´�ºN•Â-L8mÚIþãæ.�›8Ú&i¦{ÔBwÿH‚¡ìþ]XµCr ùmêÏæqÄÃÔÖËZ £K/k AШ¨('{«<öÈözcsE[aJV’ÐtždÈØo§Á$˜~¼KÿŠÛG eúÜ’9ˆƒ¬g ,¡y{b ñ%ãþ6Æ\h3X�£(BK¤f‰G¢HW7»4vuN"GÞÄàsµ ijFí‡/—˜¹–“Y¬nD÷¯],°A¤f[%‡©Ã¼Oq5laÍ%¸¾QÝӆ챑˨œÎœ@Fßgàþ­5UÙ¸`‡P”S€Â·,RFsd‚\;²xéZ´Ç�6ï&ÃQ“ƒ{®'o¬ÑºäAËH³J@Úÿ¼=á3qK·2ü™¬ÿjµµ\'hJølUÞv¥|cSÖA“­êdK¢}~ñü„xóæ(n“B©*˜;h´ÜÅš:ä¢{‰i‚=M�sDr¸ ÒJº<áçÎn9ÝN·à/|}ãÌ&[n²T×í©ÑyíΑ++·Q 0�Qø\ï�3ÝÅÙ›xþÍ¡"áZIvCûn¼Ö¦<¿ ƒ óÞ]DÇ&ä¦~Áv¾Ö –ÉFr'¨ÓǺìßÑ—»cñÄÌ\’�”ä:•Æz›ðUÀ!²äj¸õÔvÉúP¢cdžo–áYüMG��?‚“Z;,g:1…¾Y‘@¬"Éc vÒÑ«º! ƒ~<ÕýÓÉ…›xâjùs—’§OÿàIk+̦Üføôaò‹Tû÷É’ÝûÜ5':â›)"åü°Š%(t$F¯“Ö‹öp¼-¹©Í¢Ö«0滛óãÂ(^[”é@É—ŒF[¤Rk¥öŒí¦Z‰f4q:|;»EͪÝeôñ’ã»å²OB@N ûà ÆQ¦7씤WV�ÝÁ|UGì8yÔÒçàxœ|:Ó�[Ë&Q˜ÖUJ£«VU�–]¾ œPlŠØmd |KBÇ*nÒâ'L¿61Láéz†Í€qr‰>818X+Ýyµ�Óní¹Ñ×~¾�é’Ǔ˔éi«À•ÃÂ&“£4øŒ[ùr�%�a›W.×4œcà¯$Š|U¬brÖ•ôçõ}ই1,”ÀO_-µ1ƒÜ£vr”GÄ•rþTµ¹ÂÒÃ3NŠ$ÓX×`Æit©Uz W³ÈU" !Îñâ7ì¢ÓWc&›ÔCÂ¥Ä^«Q}˜¶[Œ¬` Óë¹+çGÕ˜ËÍyÏéøÖI.Òz`Ïšbv::ˆHØJ\à¸Xì8ÿœMê&ËKT”HËË*³Ô2�V¥×2ah5ëã=QØ85•¼1œ;0žØg®P¹è*pXØgøÂBv"ÛZ…¡p•›jÍì0ÆÁ{PP '«¬–Û|‚q:  Ó“€1'XçT«tø§cç¿ ýˆ¶¡ˆÊu‚Áu† 5xÆgù…*U(�[ó’´Ð_·]&Õ½9Ì`0[ØÇ�€bDr¬*ë¯àîmîL"a@ÝÜe�ÈÅ�])÷uÈTaéåRh†aa8 ´Ú2½–Çâš›,²¢ð!’+`ÑK˜�™êÂütuáäÍ9©‘´¦˜ŠX£¡ÙÖ*sg9•iY9Š�íòK·Îöµ;¯G¹q˜Å¸�ÅÜ n6… f4ÉêŠÁ^ý%)BáX?0¹Ú¡˜¾'A-$QRt*Y®8nœ¤n ä’i¥Ùq(€‘øÚú?³!³nqHÐ&3É8—ì%záëã EãŽX}}¡è°¯ŸÁ׿Ÿ˜À¬]¾…ú[€gòôx endstream endobj 102 0 obj<>stream H‰´•}P÷Çw9¸=©µ¬±·º{IĪÕA#øF,¾¾¢Àq^Ïã•ÂÛ)/·wpp¼zÇÇ›€P+ž€eˆF%¦N´¶Ž/©FÑIûþHì‚1%�L§´³;¿™ÝÙ}~Ÿù~Ÿß÷Á1[ Çñi›|ý}W­[àèî1þ‚¶R¸õ[ël‡™q¨àÕêÑ,;˜ó ðüeïì)_ÎÀlp|Íz?Y¢boltL²ÈÅo¾ÈÝÓÓC´Rµ7V"Þ# 'ÇDIÅÉÜC‚(H&‰�JV¸ŠV&$ˆÇÿHF%EíÝùfG Ç1l.†¹`˜†ùò°u6X€-ÄÃB0l&Ljƒ•â.x¶Ít›d›!ž—­­íAÛÏì¦Ú�á/âk{B&˜.Ø&èœÂ{ýýÄqb…-Ýx!ò@[ÈnTF8¾ÆœS‚Y3 ëá´‡YWàá0ïܨ)'®•±¡ÌØq"4“]CËá)Nw>|àù¥¨˜yRýÙà-á]Ï{ˆ¤‘ºI‚ŽhÓh»hpâ?ë^à³ÁaÌ»è)É×¶1ÐÄ˳n¾¾�g¸]¢O¤š!Íl�oÆOݲ®â�âB/Ð^¦ÍD~Ò6‘’} VG1òfâ/šÌhÆŸ@6hfv‚3úà:Tr—×çOÁîÎ|ÄTÓ6¿„*c5²ƒJ}8W¥Ê8D‡yØ]Þ¹ñ˜7…|Ðb´E 1,D‹`ÕW·›Z˜ˆªF™–ÒªÕ†q¤¨ÑªTÃèrÃ8�ìoô}xL‚ÍWä…¼‘3rCa( Þãþ_>0Ü`�†ÐCñÑtàCdÂìG#‡Y ÑÇè0úlÃ8*õ�ª7Þ¸­Ç»>…ËWŒA99Ķ‹;éÖ�ÂKc©�þ5çUÔêëSÊææ¨TyÌ•šó†vêl_˜FlÊ_¥ ’ þ£Ø%ô~°ÏÒ×Û2`¢Ã4�’nªÆRy›éW•éì¹nzk¹4 ,xGdÇ©æ Ë…£ô™†¾Â£�£H©·þN²üY/èyðÛÑIdŸi''.–aÆžˆ¦ëv»š>‰¿@=¹³ÁÉýë÷Ââ"¥Œf;i` *kèK�ýÚjªùe*ÚŒv¢©™I ¡åâ™ÌjΡãë× •”0]6à­ƒ ¾Áƒð’L‘±1²ZeEqSAûõµç½ã>9¡_íö¦·QV¨*8tH¥JÏe¼ä�©õÞÁ÷]ì¼�lb&ÁsUõ½<è™èÔ p”Nhs#½¨w]ÜÐ,ôÎãÅßÜë*Ö2¾LÓÙ™‰MÙEgë+bëØuRªHL>@KccsR¨=s�@lA¹ùT‡<º–©ØÏæ)„Ž(¼ vw?¨ÙeÜØUR !Ïtñ€ëÈ´êÖƒ]Ôí«—ïš•]Ò¦¹ñDi-UXÄæi™\Uvnª0½$»âˆ®´¢:Í/‰I‘Ëèiti<µbmÀ²ÀÖèÒ,FÃFäå¥Qmûémé’B¿¿måºÈæYï0¹°Þɬ:‡NÐîol–°¦jý(�\Âf4rËýû,Âà–%Œ}KÎ[cék©j2陪úRö*uø¬kðš­ó8ÙX³U4!Ûˆ"-<ë {³î¢©žÿ¸ ZÀŸÜ-DTnÎzZNhêºY3eîaóë3±>·°“�`âQÿµÏ‡uþ!4Rþ‡¹È)¼ô’ÛÙ¾æÜÁ_pn-¶Ž‘&Euò¾Eò>CJ­©ÚPK£)h3ça¿nÜÃI;ÂÖSu'ØüZ®à¦ü¢cŒ•O¼­9jß1QpÑ¿õîOÀë)s÷Ox°#Ë&”x#w;-]ÆIq6ûÏÈ~í®Ý[´Š'c“!ˆZ±A’ƨFø\s¿-�þ'ºü÷Š&ÁNòl�þ 9* Ö¥z¼ašyV?ˆ#ÁÉõ9Âî:�;¨3/ðÇO`�BQ8¹KÒØ™ÌìíÉëïžÔœ3÷ЭÆÎ£½TÏñ½1uLË.Ö?A™¿11„Þ- O‰¢Eh›Þ×[Ý ø3 Tr铈> ß@n$ÄM'-?dÎŒ¥Oœ7Ș›Äd‡¥?‡¿ÖZDV²5�t¡¶­ù,uó’Éüõ®+¢#«NK™t[¤çbé{몲7šrÙG\å²2É''|Q\¬Ê+¦Ù}‡ä¤ê¬#å¦âÆ£ñÆXŸ¸•1YÜéÀùHð³RŸâšzÙüNA¿ ¶g¼é¿KÏæRjY%^ 2�ñà²Õ‹üa"¥eÐy¹ÙYy¹‚¶øPõA ñ$›7»¿Øßt˜¹’nÊ­Q*2Lû¢…â¤-‹—& ÝWЕy¬ZI)Uª r&jU7­tZº¨äH]Q© ÑØ.ï§žYÎÿ©7±!½œ‘¶Ä‹u‚àòÕ•Ÿ Í•}#ÿ(š¯¡sÔZUUÂT1oDà|¦ÍàiÄ¿±ÍÍ£VDf$‚?ß9Æý÷ù‚Ô¿¢6"…E¶ ¸Øva˜Pkw‹÷HŒé‰$žó6Oà´õ_1ü!áê»ÒóÐÏÑp‡@ÓÆ…ëj`%jëØp³ŒN¯¨—ß îµÞ¨Ñ1jW>ØÿÏðŠx3=XøMFø–ßY�ºRV£–ä²  ð³Ðb;ÿiqÙI (pä£Î±¹v«U54\ãWÂ:;ñ”éÛ‘#…œøŽ©úQ=2•ƒLÇGá%]³¶´²âµÃóT‹½¾ÔÁÁRá0�^­�hñÁÕFòŸ ?�Ç› endstream endobj 103 0 obj<> endobj 104 0 obj<>stream H‰bd`ab`ddä pòtr÷Ôvö Ž4 ¨þ�fü!Î"÷Ћ9ž‡é‡ �XÍ?o–'?±~Wáÿ®.8÷G”#£›·s~AeQfzF‰‚†³¦‚¡¥¥¹‚cnjQfrbž‚obIFjnb �“£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š± ˜€.š¬Í÷Ÿ‰û|Ìï„ß­oüà»þÝv>ã÷âÌß—ýH�Û9±k]#GÖÙ]Ó¥WÌœµhAÍœâ’ÂÖÖRù´†öîòÎÞ…=Ó§í嘴zÂê…RÛ³ºÛjŠ[Só'§öWÈM ëié-ªìmíɘÊ19§¤¿Bº¸¦ª¬|Zåêù‹&LZ$¿aꤞ¹½�¥]õ ‘-ÙmÙ¥Rñkº'ÌZ> endobj 106 0 obj<>stream H‰¬–{PSWÇ9ÑYÒJönÛ{™{ÓŠ‹¯ñµ®Jwk bëc± ÈCˆ B¢‚<"’Ü“ ’ðÞ`‚<‘úîjué°Ô±À®ZÝ:Sk-{.½NÙ ­í;û×þsfîãœóû}Î÷û½—Ïóõáñù|ÿ¿„®}ó‚°�QK—Lß X‚ϾæËþæw\9gùA÷ÃN?D¾‚ÞžÕ836€çÃçG|–™•«J“+ÔÒ¹aó¤KCBVJ×fÈTi)É{¥“Õ YF²Ú{¡”Fg¦¤ÉÔ¹‹¤k•JiÔôŒi”,G¦Ú'K}±%�ÏóçñóxàñVðx¡<^¸o3ŸíË‹åó0o‘<À[Çû”_Ÿô1 f T‚1ßS~ËýÌÂW…*á-`â…"ëŒÅ3ʦ~|³M<õã©+�\Œ ­™à£õvZW�™LtÁ™›ã)�ަõxi…¾¢fl �ë9Ý)ŠÜ¬ìì†,O}Í᪣¤͆Ì$Ÿá£@'â üÉeXM1m:@p«•mºFš®£}fY0>ˆT“{ÀÜN´i7Å€ ØßJ±  ¢ÌD—ëØ…Ï¾^tÄDWÁJ+Å€VØÿ„d­ˆ5¦é±f“‚R‚'0>‹zö.Oñfiì�Açíè€ÈqD#¿wŸ|Ó"ÉCj4�¡à€5v i>Ú‰ûÈWÏ͉Èy››K}Wˆ=l½:Šà ïpÁ$÷™²I8bÖÊ©gM@nÔ®&s”B‹gv�ÃÐࡘ°ÚXí¡Ða ùa}LsS'åP‰¿Sºe¤¼û¢î81ÚpËyVjaq)M½§S䪈ؒ³ ¨Âä^�mßj}ÃËNÃL¾6Íîšdì:ˆqoÍÿÓÂxnf3Š"ÙYÀc®!›¡A±ÊÙhñöÞ^Tè¸7‘ˆóÎGàþ$l -�ðHŽn€vØ÷™<ΘF(âÌ&ùÏÈÄR­=�A{l­÷ÏØzFâ¾F+‡n4KjÑøXJykr?a»úÑ?©Kªh°E¥Ó¦ëû*Hz`§¼ƒìLÝQG„DįÏhÌkqkl©)kßi¢Ü­Õ.bàrê2j·—Œv»!ܰ!C´&Mõa"þöCÕµÁÓ]ýV²­Â‚Á°´„Ø]î�/öÜF!‡I±Ö®éaß°£Ý='n#ë $Ÿ}õ"¶ àj?„—TPìSÀiý”àïU¥±§’ÏÞ¤–‚›ùÖ<ã$ßÎEÂë}'\ͲùrÉ µyd\F‚&‰H�·œÌ¡²» —»ñó•¶>’±�l¿@¸{òª:sqñÔÔÎì«Úf”aC¡v¾ó6*°¸÷Hìh{ó�›Å‰yGüûù qX�–˜ËŠ�º#¤X ;RŽw¨©Œ3pЃ›lšwøNó âÉQŽH¥¼V¶¬‚ ëÇ åwªì|ä;øõ—ÁaHÈp3�HøÕ™3½–:XZGés U¸º~k[]cSÇîömá+¶½IràÏÊ1n$haä´‘:ûÍN¢«º(fX;­L±”Ûå@QŸÜq èpžÛ…ÞtŸ“ü©Ðl9üÎÑjrÕ5S5Ugñ% VgÑ{òUTQ‰:3…˜[…evv¬Äƒ¡¡‘Žƒ*uÂã©8F˜+ m¡´ú2mžW[TÔZéh(r¥îOÔíJ&Û““-bQDÄêD»¬yU˜Ÿ›®À%“ÊZ³ŸÜœ·'){´‰Ņ̃gGÝg·;Iç¶-p¡J‚¦RjOù>Æ…—CGC#‰$Üöûˆ³çOŸìèµPŽ#_øÇ˜÷vÌ£Ä^|ÏuÂG>CH6$`w¢ l2JÙP�Þ¸…X™¸Y~�¢Ñcá¯äò¬á%0÷Ys+ÑrÎHŸð&O¤öQhx:|éúµê˜(’+øï/~¨‚ÇiêEXNŸ`òŸ¸9>(y€ÂÙM'�ÞëoGt^iÚ_.áº`n"ÜîK¬×WtR’ÇåìIÌ¥²e*5YÙYölÆÙls‘âçkjìÈçÚ†é¾$íÈ=Ä8Ûÿ¥n ~�(4>ic&%¹ñ½7>^"òÆB3»ä¹î�ß°{P:†~<Áùs³æs|¯ê±§ Ð äÿø[$!¹l.KJ´�΢T½ðªï„šzÉÓ­ý¶.¢÷”&©…jI‚[d¸ÆhÉMâÞ„×`sæçN''Æ%}hÍ(†�G=÷¾¨4CÚLèýEÙx¦-ß~¬¹ÆåR¶%…Ê#“ HÉòõKØþ§¦¦x½lgWXÚê3è w�ÜC©hf×ß:†oW¤¼³R~ùî²Ö@—" ai.Žò`iu…Édµ’f34³Š’{ûh�ÀéÏ>?Ÿq¼¨†Jw¥V%W‰$#ÑÕ‘µŸàî–îqäS±Ti&‹MG ™¨…Vê1h€•Ú2#,*$ úCÅzƒÈ)Ûó N,‹ŒVÔg¶j(W¶S÷y�È[뜯,ÞÜ nD™ ZÕÈ:„ðfZ;� ³n6Ú Ò!Òyz‘æ.׸Wy†�Ã×É˪­Àû+±;þ«á§õë xa É–Öô2C½¼à‚�–Ç­ ]©ï?G¢»?=…†e7¼— …—z�Ÿ¶‘Þ;®jm,Îð­l�€]ŽÆ±#ކSƒ&Œê½´šÈÙi6åy¿1tµú^lÔëµä®ŠóE.?]-4›ñ–Nxì?UI¹Á�%ÒÉ=½¹@å§ú[sfÈWùý�µvboÛ éýS¦öËClü�¸pîý¥@Kï3ÿ0þþDôÔÒ}=³¥aVVÆôö”ÍXÕ5»ªHª±«³­^Níw×oæï YÛ§vö÷K-ÝÐ=de¡ggÜÊÝóº3fÊ×úÃØVW›ÕZ'Ršïæ-ÝVÒ=·B~Uÿä…³¥–VÌ.)/­Ë�Ûš¾÷Ô–#GËAj‡î%?D€Yä'°bø¡*:eZwo¿ÔŒæîJ¹ßWØ~›².aû8qÞ†ïLÒßÙØ~¯þÃËÚÔÐÝÙ&U; èŽï÷Øæ|÷g-bûÍÕTÿ›Xs±ñ•.üi¿ð÷²9ßó¦±ýNšÎ.·À¹’�ñ?ç*® Ü §ðð\˜ÏÃ+ê/òã³(@€ƒâød endstream endobj 107 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj<>stream H‰ìWË®ÛÈ‚ ‹ûwI,ûÅÇì2˜L’A��••= Šâ•S¤Ì‡¯ÇIþ!@~8uªš”(ù:’e`ØÙìîzœ:uêÛß¿V�‡ááûí÷?êGõ¸}zP*Ê�Ó�1ý™+úa’Ç$·‘N·§‡øñ𰉣8Žé±¤ÇíóÛà946RAnŒË"ì»öŸ#tä‚:ŒéUEôVE:¨Ú=-§ñüÜácº#8„åÁTôÅÍn³Èãq¹g±§k¦±îZ¼ŒýmR2é ç¹ ›Úý+z—¨`7yË’ /謯ñ4 ?Æþ—yÿx±¬ß·?‘˰'¶îqûÃGB#o¼]IJGíèÖŒÂa¢ŒLaLªèáÌ Þáoµ]ƒ�i¥ˆƒ¦[§eC÷„3 ½+䇕© þ‡Àð-ð>Í):Å)Ä×äph4¢uRÉ;üUòùy İh8-t,…�¼ø€¿³y½qYŒÂ�ËT°¥|dÁQnžBMç WAS4Æ�2×Q³”rJ\ œgx§¡Ì»©V^åWbNÿWeýäE—v¡N(ôÏv nO%¬±d”?£ a\w"—%÷QªOÞŒ‚‘é.·�]_°hò`¶õ¹nF¾ZÌ¡�w¹ª•7 Þt‚ÈŒG‚8ýÎù*@ŒÑ�¸²c–ìª[d;3Të°S'ûà,ïê¦[*¤~Êrê‹’‚£Ó„,¨´Ã¯¾zÏO„<Ô}µÇ7ع“r[öœæÄ›$¡/ƾØ×%ptû�w/÷Šó¹ï Ž7壢R¯}Á¼®Û’¼±€6ÂðŒ#lS¼(òÅÒýÃP—þgƒ¯M°6 ù”ÀSÝÖÃX—´�Çô…—*%yf‰É–¸o¨hÄh/7™`W “ŠKa/;W–Mð fqÂc‰°1^ÿ!$vH$P†òÜ×ãñT‰}IF1<†i!U±™Í¼Œö€!11QÁ Ô|8W¡ ÀR6FÑSYVÃð$Qš`…A ½¥zB@UL&VÑë9Š5I˜çŽËâ|ÓþŇïè!Ï…žñ É“àw!\oöþíbÚ ÿb¨ÚW³ o¨$°²ô³<½ a¹¥x<Ã„Ó2æ53œ_ôNýKœ’JØÚêU“¡È�J-PÛúý„æ á4¯s8î?DDtŸ‡â´ü>TmÕƒuNÙ…Àu¨RÀ–FäLz6åówÜP¨)[D*þ׎ÉBâ WÀ60 Î=•C}n*ô©ÌÂ�Jçà§gÂQ7�5þ¾;šI¯)•¤‹�\ô:˜¨ÞO#˜ ÎdÀ(ñÐÒëyÑ›Lo¤�Pb0Ïå•fÙÊãLÓaÌÀ†‰�ÂÉ�ÈpôÈ?Ñ øŠX£¡§&ˆ&baÑ6ÔÒFâËvÐm6ó„&æýHö\LlÔ]X|åS^×>vçA-J�»«CMÕ�ÕáîçÁS×K|,¹¤9�Å�™Y¶4ó©%ËNòáõ�ƒˆEEÙÔï ˜!�¦A~,©¹]˜fógòŒË”µMs—c7/•€çbÖ2¨2†S(8cýgiå)ËpVgn™‚ÚtAmêÙAIjA­1Ð.ƒç[Åk@,M¡Ÿ¶ •N­é\„�Þ4ÝŽ#Ç'’‹dd}ª?U½o!›ùø[å¥äÈP«g“¥ 3Þ`7W©ú?v»c÷.=_Â.MNÀî’Ÿ[ì’fp¹µ/É€ë.<¹a¡Ñsÿ4)áxîŸgèzÖ hwýjIôd“ ãJ7Y¬¡Äï›7x˜…‹†8¢v8K€úòûS(-•o‚:DËdM¡qDÉ ÝêüY Ô­lƒØ²y´œ¾xæíäÞ ÿ¦¶î–UVmÑ4k@o¿ùÚîJÞÇ”›PÈiÊ‘µÙœù{Å©²÷2…íˆ"ùæ^»{ùc˜&23‘ZD—åÉ‘³³æBˆ ¡%Ûtw2/…¬*G6hkXŽñY’‘å™G?Ãð!P£^Å–Óô"–;|,—ùýChxlåÙŽ³uò³XJ¦õÝtà1Ž6ÉäÅÐÌš,É7^ï’2q+ަ`èLK0Ε/–Ñéç� ®hÇšr•s²6³î3Òjag•Yûï'$Œ=2ð8-Ä{w:¥Ÿɘúp\B-¯¼O=á¯jês}fýCe‡(&˜íÎ~ÏJ*Yê–lÊóq‰a9'¢ë÷u[Œ—ø¬‰�£Æ—å÷ªÓzžöUËsLÊ–Š5Fª\"–KDHú¦Ù•$³™o;ôAÌ ý†%„ƹ«ÎümH“­¥+ò`{”Ò‡Äg-~¥d T y75{¡w‘ÕôBe´wVòÅ»Y¦chÙ~=¾cdi”|½ü:­?„ 3 m.¡åãÇŠ5K0Âa‰^—^Eó ÑÛû‰¶YH‰y˜–Íð”+€F§Ó¹©zr>U%ìÀQ=¡¾?uýrÂeB‘çyF±:çñ§¸A2u›˜•F|º�2Ëç+(« ”­".”­’Rµ<ɯ2WüÐKê3w0í+)?êw—8bB f÷UÑÔŸ$%ÍŒfá’¢ Üó^£Bv‚“ÀoðÃô{Ý–£¤r£¸8±¬éÙÞÖOZ�4óJÆ\è ŽÄÂTQº?‰ð.§ÓOK…ïõÀ,•„Jn­•"¶8ì^�~;n­ÄU(Yc‰ça'u'~çFc"çZ _p)Y"¶Á©îx|OlšcV‚ÒHÇØúßÝ8 Áb 'ú,ÿÈ G”÷‹< œÕfM(úê; üQt;`/_W8O\‚ôôXa NRÖ2Ý�S?RZK­Ët9‚THŒb©6,»êùaè·”ÞBN=?ŒÝ4)Yæî~|»�IÔv=lOÃú±g¤a÷¸BƒŒÉ¾æe´¶ˆP '³¾Y!…éöíû ùÚ�¥Þ­Ôn£�\‚-4™JDå ”o’sè»Ýµ%äŠ{üf%Ý ¸K®ú$"#]÷„'Ñä[ ¬\È@-ÂÁ7 pç�s.¥ËÛ£ä†ý/TRz&D�iwÜáÂ].Ä–×$±}¿HEI׸F½³Ê�zª�ïÀ`â¤rçg@¿‹°�¼Ó,ª w0:ÌQ“¼vÂëL(¦Y¸á9!ÚÊÞx€áHSf¤¼­j:žð"ƒÅè?ˆ®d»§Fˆä±#ì3 {Y£·{ôÜnûrü¨ãûý½¤[PR "Û¶ “t.»j+‹~­BÄÏ{õß_![xÝ{d‰K›�ÐûsÜa] &ˆÊ§¦ùDÈ"„&ˆT3úâÌô‹A"#�¯)“5.vK?1m^/¨R§»J×M‰y™o¿ÛÒE¨N_�üdœa°‡,+ÔB£Gqþñ§²¸9º[5´F}Ô| FŽÐ–¢ØK#¡Œ÷Œ\¸³ǧO7ó ÉõÀZÓãõ[¼YšÊà°¦©óùÙCÔ¶sç™ m‡ •?acñò6öúÍ Ù�£ïDÊ �Þ»�’(­=JiÌUmú„½Q1°Ðö'e±Œ8�fG ¨­X%®m¹åJ°\-K�µåæ‹ÖU77¯Òuð­�}GìK[u…÷äH‰æÝì˜"¯ÍiOBéYa •¤ÿQø¯=|?ÀäÅM£ÆþÐÙöq“¶‚šíq s_·µvOúUýYNÎÊ/îïµÏÂôhtü¹[”¾E=ÙÏ’†d¸³ñŠ!n)E!a¬Éá"<§óåöÃ_>”§ã endstream endobj 4 0 obj<> endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj<>stream H‰¬WËnãÈ‚LðWhY,N½‹Þ8� &‹ @»‘ÝY¨%Úf"‘†ý@§!›ùáœ[U”HZ–¥ž�¦ÈzÜǹçžûÓ_ÞˆÉýæêæöê§ŸõDLnﮄ+¥0zÂñ×= !Je'6èRÚÉíêŠOî¯xɹœÜÎñãöÓÕ;&‹©R–šÝªtì¡*¦Ê†2°ûª©Ö³Â”’-é�/-»)8~æ·Í¼�ž=Ló¯Åô¦Ý5 ,ÕÛߤ¯Õ _ «ŠÝþæÊl®(ƒ12™›Ÿ;s­+ƒ's§d«Ðdì;ö� Üë4°öS½yÀ³lÛÒ;2áWº] ¼"/´ u÷°n-Û³%­ÃelU˜T7õªPw«l�ÉÖÙÒá`ÛíkŠÓüŠÝ·ÿÆŸÀBÇE´>?*ìñëd©Ètö‡´þ„»JÚR÷¼�Î&_g›ä‘cŸ EÿªB#øËerÊöÌè¥ þ<SéJÁÚº)”ÂÃÉÒl3ô-”‚«Ðwíó ®i-J¯/òMQê±s\%ïîÚuJ„‡{éx¨ç…ÒìahèTzœaÕdмsmžä"ßÏ‘+)“Cì=KßL÷My¡ó·—ü¡�XƒŸgº)* Y7ª4ž’GŽJä�™ï‹Wc€4nõ% {.4ÉÚù�I<—ü;V"òŠPñ6–À¦@TW Õ P£Rí( ɰ¦�øÔngÛºm†ÙAM Àh*K¼ü͹ùçh›JuÛŠôÍv߬‘]Kél¬öÃ×Q¬�1þH¬¿4‡mFŠg ³Òäoÿ�ØÛöy´Ë+Õ}úÓhWÐÊ d�èÛø..r}ËÒ(o¢û׿ñùã(~Üt,Á^b,ò`º€³Òï™L™‚R¥¶–°!¹WÝ:®{å¯$5¥vÒN¡±4÷û u"ë»!ðl¬ §2P–é;5éBº·ýX;âx©éªá±²äÁ 2„$|ÚŽåܤcs¹xøñkjÝ~X¢éÅwžÍg =<~(ˆÒˆÌóú;¼@Ú5Ú�«ïâþål[-º=3ZâQ§Sja¿e¹l IGøN.]G—(ì%Ù+Íé¾éÇÙO´.]pÇÂù,)ál¤`bš¼N s/É °]LîyÒÉÜ^Õð…¨|ãÈ‘.å¶Ë�bõ볈ÿÞ2=æ­ž-óÞ¶oƒmS��Ànµ�ë�ŸB?…‰äáâž�¼|äÄ +ÐáçÅý-Ä … ´çÕÀºR9¸§âú}¬õzt—�ºËÆ †üÝ©údS¶Áª‹”ÞÑØçS IÃ^†¨ %×]|ª|êžt§.è‚È�èh½j×Õ5Ép B‘v$ÒQn¿Œ#1‘¦—‰Äâ÷&~?ÚójS«�‚ùóˆ$×¢G’bÀùQ^Ìè�T߯M½�·"°jK¶¨Dû$ØïÒ: SÜØ}À’‘”¥r ÜôíÉ€sÏjYÈi"/�«Hù«‡p8&fa¡BÎß/… P×õ(�WÊ cØ+1V'ºS'ƒf‚¬ G-±,ËýóãõpvšÂ®�¥¾0&‚�tÊÚ»Ñ]Bt9Äè�3«Uß–œ3ê,á�®>RCr‡v'b»³hw�±¯Ä͆ۺç þ‚/&È«ÐËggKzª�ÞÉ:ÙgБ3‡áH†ÈäR½IÚBGB˜Ø”‰Ü"ö×Ï£!P˜}B?“ªÉpmÑ×í™y€“Ľ�jŸ“‚50”̦ÅÔÆ £rÝ´»Ã oºÕÕŠtȬ^eÏÁ6m²XðpšÅ÷ž¡²Óëj±›Ó †èç-î6ì ~ZbÍx¿`ñVC/V³ÿP+”l¿£¦žc$b=G«CÄû˜—¬ãbýÁšXLi„s—7rËØ‰Fà½=S¸)�ò.ã<åÃ&×ËbjÅð—˜Fš1¬H­3°5[CÑ_T›ùº~Œ­<®€P!Õ›+°ÙrI[¨óï61>!eZ¦ñ,¥dÌ¥·�Ô/X“%Ãf4^ÈÑ´ö÷ê�µ ¨U.ºZ}¹¾5j®º®þËÓìóàQ1àT×á¨-ß3àÐuX=ìÇ4"(y‰f‘‡_hê‹ÚÏО®³ÇPkuq¼ô¤¶ºÞÖ±\Ì}“�éö‹Õ}ÕTëÉ6º�Ö²8ŠôNj¨ Å¼“8ã‰~”j ¶o^ÒkòcΟ@ƒhèþwBƒÖâÒàkí�?3iK Šíš–¦dè,ž4KJ�¢*‚QýJ‹gèÔK6íÈŸ¸è„*Ç€Ñùûdú;|:1ý½X3˜2ᲨÂÙE‹B÷Øâ³P�E¼tNþ6«_¢ªZî/³ZrŸ<íÌFk‘Ò¥Ü~û±°þ×!ìQ ÜùKP/µ$>»Ì0h2žÖÉŒ´,i+¶=í¯IÂý‚­Fgø2ˆ°‚Q§Ñf~´Ù=aj•˜‹0¢:%sê®›¡š=’‹D¥Ê៌q/çB9êÝÊ¡ýÉãØ¶r ³²ú›m6»UÝܱê8wÕB†Cc¦­ËjEïBâ<÷6mC: àÛ®ë�ÈÉ�ÀþVð4ÜX4ÿ¸Ú÷�­I2*Pû,7yAS«|B=�ðˆúÔyÈ‚-© o°êiS/*RAígD`×ÿ’"Ù¬€£j³¥Ÿ�¶¼gI[Ô¤K|Ô£mƒžvmªf³ÿ±N+«åŒÔ0öÓêx9f<™/‹+ï’äÜ5ó,xâÁ‹(…fÉ’å®Ú E‘¯ü ðežœNÜœbrLÓ;%@æ@¼¢Wr¶V;B£¸½¨Ú!€1~( 3Ïíï˜]��s�J$Ô�ìnÝ®pGð„W' –«,g³Ð'‹Èë/x”QÃgÒ�kjS–AvÇÿ„"@]Áb¤ƒaŸbC«·ínÿî#Þ…¸¬EÂã‰PS§ 0‘Ò¶šó¨m Àw1à@mSHÖMí4÷¥½Á c@¼·QûÃ^‰«Á,%%Ør6¯®Ó¼¤ØC,”�T²ËË?v®¯“JV„ºæÉXà‡J÷¥¼+Hh*‰�ö̼+L¨Dr*dft4:nv$ͨ$‘5€ÞE¬M¡&‰GcZ¬! O…¤ŠŽnë8E(zÇ KÙ†\­�¨½uÚ2B§õ¤¬8*§§²¥k�]*"À�=ÖÕ¼ÚP¾�Šùžò˜gÜ8C9'¢ûB¯M´ñí¦Å)R\TtÆ”�S šÔ�[tVÒd¢0™¡ÆÏ±WÄÄëj•QÔNBu3>Q�<@ä¸õÏi¿Ó¥˜štqÄ.UG¤'Ÿæ]hVÏ*T`ädM´•hòÿ¬WMoÓ@•8 įàhK(Úï®Ýœzì .i›´‘ìºJUHðßyov×±Ú¦ˆSÛÔYÏìÌûÂÜ�Ì“‘¥p|z·zHÞ+â‚sã÷Bø0È7qa™t�bn`[2GžÏ­ø5¹KßX¼)5ÛÄfšEpÞšA’͸Åty?;ùŠ=N�æ¾8FŠÌµ&S[°ÊŒu´‰aýÑ*s.³LË��d.rHH©�ãåu†Qáp\☡ëÉéôÑè´ÜkÉRßJ(U]ì·Hü|Œo´"Jš©éú'Ó[v›«4½€Yª�À¤’?ÜnWŒ¦¸E“@mË>¼¢ÞñÄ%”nzí~QãÞS#<)]Öú²¬²~?6“½¼íxéFËŽ¹@jwr{ž�@�\¤ßÕ|Á]óœ M¬ÜYüW3ü«ÊnéßêVõ¸p Öò."Òûû{re!PqDR»é6ù�u¿�6Ò 2Ø R×±ÚúÉ Ç7h`\„´‹7/R�&£ù´HY�¯�îJ'[š€¿¡í1†äÒo£’™üL—e‚ÇÅàÊbÈýzÞZP>³è‚¦k;/ù* R�ÁOë0‘<¨ùÔiÂU'fHXS4Œ¾ëSù8¨é%@øôõÞçȃQ×& å§u©éåºA¥?® Ç}i‚¸é2ÚïÙZ�GÆx@D30³\vºì/5oaÆ¥¥WôOÿ‹ú—šlQÊAMñ 9Q‹«I;²%Eƒ#©W”è­Z4 ²û<¡ÊÏõñ¼n¾3ð áD\ÇØiy=ʹï¬`ÉÕ:Ú €‘5‡Ü´ýå²�$ZL›Žµ7 ’Å-¸nL6|>ÿ}wÕî?”’�;<µŽúØ·¢¸±ÇÝœËêªAýØÿ¦6CýVxŸåÌ’hð~žŽ£ñÁyqþyfÓ+çªÿ6,$Ò� 6Gø%:q;›?[ñkÞ¡ËîìåÊ@“Áü¥8ÿLqM½¨ªqqog4•͵}™•}ØOá—â÷»ÉX?ë_EúV.+Äx–ÿ™¬ó 5ia^�rv¨S«Æ"¨u%®]+äH@@+1‚%E¤™s8Þdï% si—\œ'9ÂT`¹ùvÐÉô¨%Dz$0;ñ["MBŸDãª�„CKrÓoáJ‰O-ø07:ã~Œ‹l©ÏÕRYE£—Fño¥g”4ƒ‹¸ŽµÍÙoIWg‹áÝ|ö Œ¢i“«!€zôÏ— i¸ |'8�7Æòb¾^¼ÿ#ÀÛ×Ô endstream endobj 7 0 obj<> endobj 8 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 9 0 obj<>stream H‰´WÉnÜÊ ƒ¾¢—ÅĤk.Ö"YØ~$ ÙÈ^P-Ê͸›Ølïáý@VòùC‘MR¶< �‹MVݺu‡sÎ}ü§—jóæxñäòâñs½Q›ËÛ ¥ŠèœÞHø7>+k o7>ÚBûÍåáBnÞ\ä²�RÆÍå~^¾¿MÛ Mµo~¬³Ë‚AÏM½ `íò.Ü^ˆ_ðw—,tiËô½�Zk\t%ž>ÊreCáÄm–—¡°â:ÓAt™†â”)|ÕfÚŠ›ìõåŸÁ¤e“¹+´�n“ÃJiZ&o™ïwÍ>ù˜.­‹(åÙ)yaÛ +Wƒñn¶LѲãÐÝñ:;šS2$st°´ð¦[œšÛB:öRͼ”ŽÐ׸,Þò]fð–uf %òë,×eD}ÌlaÄðJ¤Û'/]aKiçº8V!èÈßÅ«l‘,YøR§ÞÏSó(ž,/R äýxëñ"7§m�g¹/JÑõéá˜iøÿ·1zÓ¼knêõ]àžvô‡ïòd}—ø}w™×œ9‡<3ºðà›‘PbÚA˜÷™RbÀ÷¥À’4¼…’ ’q�9€=]Ý1F36$Á{2ýëŸVLI-ýõ×å,ø±ž½Œ‹þyQïy(d ±®dEçˆÛ®_¹ã£7ssÏø{àZ (=jéŠrã5\Q#þˆf…Oa–Vº€?^ëBòž_-œ€ÈYã–AµS¼£UóöåpAûæ¦4¢¹])„hs^o¸Ýÿòd•aëÜ¢/¡Ú—.™R¥_IŒPŸˆÉ8nä:&cËLx§íTN¥6|ó?ÞÜj¨€`€b…_BUaÑ„hÀáÒB%­€Ø6úpL«ØÞ°ËêÌÑÞu4u|¾Ýð]�"^½ZÝ:h¾2îÖFŽá:îöóqùS†ö)ÜÅuÅüQ·7K8…H#·Àß2-MÄ�êðo€>&ݶ;õÈB ¥YBf†]½Ì�?�žUçº+§¸·©s®Rªò#$©C5ÔtÐH( ~ CFàì¨à¡­“/\ €¼J�(:\”¨öï5ƒ¨ hÀÖG8 ž—òyl£ê·H}AìøzŽ®V°zÞÃB/vÝžîîÁF·nL¼StŸ¯¥9ÊÂE•"\\f.¢;økïø«áï‘1Ð>éï Œ¬7õ]F‹às×Ó f¼èZ|’ÀêtmJ¢ 8]TC…/,#2R{Ú§—YŒÔ‰–ë›"Ë­FÃϳtŸ>€ÁþÐõ5°”öÀ:àuNïq?’Tnà¬vÿOá®ÅÏu}ö—R{ÃoKýŽ× òbOù>êíi¨¹Ù/—@Ï%qU·ã8õsˆ~&š"Çèö:ƒV²¢;µ#jèQ1¢\‰±+±«°F¬‡À�"=4þQ5™y‹5!q˜®ª}ß!b|Du…ÑóZ|Äq D9·p®lærn,“† TÊp¼…ƒ°5!@§v;49˜ŠŠs‹Të¨�=¾êAJ ÷�ßÍ84 Çb¦dC“@t0š,# �½ü„ZL¾Tû=–¢ˆX±ç?‡LSRË “,I€åÚyÌ&eö¢yæ¸ñ^E%9Ò§b1‚›@‹®¡“ )U7•›â’4 m5W*~ߥз0Sl÷§#ER;‰„™V:`®ô]�õ� µ›Ž>dxSIwHÈ-DJŸ}<ýrÛÔKÇ 5(Ø¡Ðóö¾mÕ÷@{„<ÐÎc�½ �"•@Š1@dûém;nÉ 5 %fËdV$ûð]æìheOuà±¶^²š–qK1-8 ¢Ý긬s˜Ž¼Rߨ}ʪðµ2å–?•Ÿ¥KìŠ�S"49ŽBüåf=°%îemiÏoV,¯ ñËó'<˜?=äö‡õ67ÂA’D9V�žwÛ™°¯ˆ;c+l&�i·ðç㲇É&ÃË+UR3ü€>}¶r·´féî”p(¯Ý7æÛ«òž>`tCuÒ‡E&%‚É;ÄX Ž™$ì<æ�æ€ XR3À´®<8 5Ž(õ–+}jM M`8ªØÐÔh/1zT†fù6ŒìyÄ¡BÝgä¤`/wxkP"]WG€cø�¡“ óßt}3ìøZb·šó·iã2¼~,‘[”tâît½oŽ; �u4 "°~׿¤õCó_8„ zñ­sHŒØs„a!¿Nž])ùŸÈÞïºÑƉlÇ3)2&MlÀÅ”ôté&±¢bø §†¦SP5 ¹Ž ¢Ú31áÒj�’L3OÀ¸³e4=�âO‹»=ïå_ü¾ºò¯q�¨a^´ç‹ä³(Ìøk,Œ�U17¿¡‚À�åX&©È’ó`© ´Ãnc�å¸ñHcÃÀ6ûþe ÝÝL½÷üµâŽæzO䨑Ë|œ³çOkÚ–*}¿_±gð:‘šx´â\kGE$þµÞ5�ƒíúíj×Ù P iÄ£Ç+јÅ(úózµ£Çs¼ây1 (ÖÙ9Y¨q[䑿€eÇ|ë‘›imŸaaŒC«ƒ ¸ò^gèq‚€B‚�HÐ4Vƒ#s�¿ïöi)Ía„“X¾%Êõm—lôõñåO–z”º[GÇ\‡ïÆ%uŸL|VÓ� bøŒA’«-Iš]ZöÃC‘)‰²&à;cÃUAg<Ï6Ü)Ã)¬‡ªîM.¬xºS>ñ 9qoîJx24m�x$ÃÈOÄnÙp[í·§=Ô6áš²¯ÁXšöt È@2á® Ü“%<‡¤ŒÄ½�ÑŸ (rŠS£œóúÞ°*Ž“åøf‚S_+󿨗?¹íÜ WâÑ6ƒ”{cKÇ»!ú¯;þþÔ™ ˜ûðûníO4Aÿý1&mCzÔ*ÆûšÆŽzØ8÷ú€òŒzÆ",H˜gïîöM z8÷%–Ò%Ôt}‹ú¦K+™\�=¬Á§¿Â˜Åz:³œÖ$ã{\€/È—i™vX±�¾ ^_—cT ÿÎ�ízµÍ*å¾%áâÑõrðü/íU²ÛDD%@ü>Ž%2Lõ>‡\"ˆÄ !åèK”û�Cþ�¯æUU÷xf¼EJrŠítõRË[j\i·Ú5Q$sõñ½®Šûý¬¯7e‘âÅœê«F³µÓÕBf§)ËܬÔlF‘+$ЋŒF¾­ª KÊݠuÓÄmU“J¼"�@sbLeašc,~ æ~¹¾Q¸á5Œ�† Ĥã°Jmš £ZhZÜ$³&�/æ’ÙU¼D¢^A‡0Ñô±g½ÏXö—;>*ÄxîÌ?ø«ªqˆ ÀÒv ›ÎǺi£Ù!ÈÙ8¬5�h³! ‹ù [ØÀ– Í8Cè«  ”ù¿£[æ’Ký[ž�Ø–‚ë+Êi�’  Á�}•ºO1Tˆù‰Eþ�œÜ‹›n½àõ�öȳZ¨ÀDíöÈdâCéE€KO¯—7�×}àÇ$> endobj 11 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 12 0 obj<>stream H‰ÌWÛŽÛÈ’—@_¡Çf`Ñì+» ø!޳¹ X ȼ�ý ‘83 $r–¢<¶7ûy �Ωê&‡äŒ/k,‚؉bߪN�ªSýü�—ë›ÓêÕÅêùwv-××+)ó`­Zø?<+#ó¯]0¹rë‹ãªXßàïbG÷+ñ*»øvPi‡¼( V_¼^‰—qÄ�#F‡4ôcJǹ-ä0t5[Uä.àØ8ôOúÃÅꇕÏM�’-ݹñkåKè‹Â®Ë¶xôëÝqõüÏG¹~Ý®þöeWi‹2˜‰³ƒ9e\Uæ¡L§¦GT®°@åÆá'-©ç~?uPðyPÓc~3XY½ä“hérc~® Zé\ù_ÊSäþ >+­mî+)±HæÚ•ÁË'bõ9û�YØÿÓœˆ2/Ýà@‘ã|Kœo„“ÑÌ�–¹2®\oT.aSšV(ž¶mö 8B9›É/ö³ãŠm²·Yá½H‹§ía8rÛÕýí±êëÞ¸¿îº6Sh½Ë4>ë}uŠ GFr‚Qa£Ûsß·q'í±ÓHœµ;ðº%\tÀ™-¢ ÙqhGj !DÅ :ŒZòcKáò‚ñá…ç; ¤<…¶ IWéM'Ÿ›=ymðb<ïúÜì¦çwÛæ¦"ni[Ëcêkv¸˜²á!É.cJ¨²D´ï3C öý-½Ay$çhñ˜‚6Õ4I�{*o"w[ra@6Ð Ù“§%¶«Žž==�Ônè ìž’êÀ¬R¨_V;+�²¯�)ÕzšåiR"½»»2;½èÈïcdL:)!d“u3ΦÉ4ØEC&k(€y$DÀ9å#"‚ÍT„ÀK©–™ÈK*ñGGa4�²¼%N ïƒ8d”~Û´-±Æ:²€òépŽK‰'¼í2d¥U[9�Ùý¢l–Z•IeÞˆEW€äz‰WËeažºÑKTv®¸RÂBÇ1Ó‰ÕHÅ@.ŽXF€RØ(`ÚДݖ‰M�¢\œGpÛc£0?ˆsͳ5ÍŽ;TUâ¸+?vC<¤AãԔú—((ãŽuVPŦÂ�Œå¢b(Ñ1FPiÁ¸&óïöŠË�$R¶ñÝ\¨?EAQ9=r̪Tål^‚תKqKË4B·fƒ\Ç(†’*ÈÕöTﶇÚA/öÕĽC{7BC¿÷bûs ±2Qü‹dÅR 7‰.âß5e&Z &0Á.e‘•âí³Ë ú-‡¸¤_�ûáñ”ÂV%Yñ\æyNä(4G˜ tu->ÄÓ4¥M¬h—jÛíbZßV”¥-¡·Û¨Lï†êÊG †G®ñÓ!Ä }r¾xTæY¡“pH‘“Øj¿#„ îÚ®=ßPEô,²Õi×Õw)عÄ,ÚÎûz5­'‰1H …FÛ�¶#™".Ñ9n¨ÛT”JÊñAD‡xÌãwàJÆv7ßÂó̓ÊÁ–eÌ¥ŽE¡ïúS �#á§4T˜IihE5ÔžI]âh=λ4oz!¦Xœ}•LmÒøæ$ÝÕw‡qJM�Ž£L+2å �sõp1Y k&*27‰É‚(¨lklçDuQN —‹ß¦È¤nƒ4\AÃÕD]×ᨮøeéìmGFë�-T.öç]O|SŽÎ¡mˆÌ푦yˆD‰B‡rÊ Of Lìj(œ}*@–»å(¤s›¨ÒÅ tX  �+ñ,â@¢E~“/d@ÓåÁ]²üu©ßÆÚY‹ým‚ †þÉ^à2÷(ýÔCg`àÆ¾úOC@R+ëcõ�¢Æ£L ¥$¤á�ÙPF6X.„,Ò†üLqG¿ÁLÕ�Ûç¥.B¿µ.§¾~·ô§|ðç›`À´ F]„­�lFCHb§`©£Æ·d'f‚±åçìƒj9óT�@UœÅ¸ø%v¹‘]ŽÙe Øð>‹SëÓ,^'Rº€m£(”aÖM²q× lPê Â?ãs£À}›T¬%hÞ¡.vGTÆù‘*þ Ì´ƒñš+;_Á’Ô¡nW%V9î_µ§¶¹¯šé[°ÓGvºÈfÐsŸã¹ÙMH8êÐy+šjÇ]QìlÊqá‡ÌaèÒˆk‚|™•�Àž'Ùñ›ŠËC¿:n_øvʨÉÝ‘Ðh�R¥ž”4:æÝ÷CÓÇ] ÷ê×íáÀ-°0sN)Î&ä±N ŒnjTênk:¦z1'ˆÉªý” ¿_ÞJ¬2ùerã�‡~\PÇrz=[…etb¤øé“«ÀÊÄûëÌ—®2Y–$éž3¾ åÞjÑ15”¯Í̱—³Ã`=áé}+VõãöýÂË ËY}ÆÕo¬‚¯Ë&E1˜ 7Y–ÐKØøæÖ$×JÛEiÕ ·Õl3ä‡Ë-Oú×lGÜ ‚ž)/k>²x��2Æ}z%sR,Ò¥îtŽbƒî;#åªßÕûjE„×û´wÈ¡}‰/g(è~&=P¨f9±‘èó�ô”Á—fÑÂQí`3Ãè­5ƒø�töØ6mŸár˜Q'ÕTóC ÁMV™TûÛÌñýÊRmJkÒI(C*L ;H:µH–*û‰¿‰á\í$µqVñMk†¦b@'h€ç%U*ðþ�xõø"ýÍE*|Õá[‚Ô±ÆÎÌŸ‰+­I�à÷™å2Èç}Ïeªm6]fSy ԫаhýx¼fPÛfnšDþ_0¤mÀÔ‰ï«ûþ°bXR.‹q¬-Œê”s°çAž'ðSfX¾2E493¦¦Ô³9äÈOSïW‹"§œ)çȸµÒÙÅ:=*´Xf­=šÄõÅq%ä|/d‘µŠ Ï"\ø5)péiÍCÙϾxž–�¶É�Ñ5Cè©SUáùTtìÊÑÂ_8àlÆ‹¥Øig¿V¾Œ´+sC·¯„Z•°ÝMœþYP+�Û¬z8pµûÌ©è®K59u�00Þ"ÎLkìWϱºKoA�TCĵwÔ¬9qË “dT/¸¥,J¾ nø"I 5‘Ô7i:��ˆ/i~sC]_ûÚ§ ºÃ]½»zÉ]½–Ôž¡¯×to¢¾ž÷ËÓÜNK?K»$üþ“T§[ ¢‡¤öŠqüõ¼Íz*¹hŽô0.·Ë“_Ò• æR¯ÙóÍNzqC·\‰¶ûºb÷þKy•ä¶ ÁCnyEŽT ä,\rÏ läbä@“c›µ€¤£øùpªº‡e |£F³ôR]ÝU,P�†ã¢ ¬´²ûá?v;ÌòÕ;ív˜ãÝÊnÁƒ¶ÜãÃη42-ýûQìs˜ê1*!ã2g[ö™ÝnY#cK•·\ 'ĨDr�Ãô…¨@ÓONõcЉÛ%N¡bÀ£[�w¹ ¬®�$ŒˆÖ¾í b?·_× f-í(ý(Õ�ð½ÓAhKXþeBJw…¹¯¯¨´ËÔx­ÖpcåܺÌÜZí’±¥~ÍTº9tX1´5´¶òBž†ûE�Y.»”}ü€F……¯iÀU,& ´*Ñ �Uç“_a¤v3Šfà�DðüÞ8ÕŒ¨8Yáç½>ÿ"&BcQÖýÏå,Ò-ç8èÞ´ÚÔÌÂ$µ�Fà8Æ´‚.Y)^$©¡½ŒŸõP3êþIE_�2ö´ÓÓîºçgP€£µâw–±]|2 c–Ò5‘ÝÌÎ ËÂb’xK&c|ŠfƒeÈS]®Ç©k(p©v¾oÀá€ð0^éU8ÛR±á.¹"5’À14SÇô‘–±hSÎR°i3t÷¤XR!÷[î¯ñ‘y„Æ�ji. l”f�nà]qÍ62ÚŒ5Hº“Ñ.Š¢¼qä�6­'z†s©ˆ¼-Yø�ïòbÂ1«FJø~Z6’!‚Ã%@GCxðÐÆßŠÀr¾ðùÐÎOŒóñ°×bÛÎæ½.êˆ)a™Ü%¹ú "�Ÿç�‘.µDݳHHÈKd°¹ÄÆ¢5„1H}eêÔÎÇ:v©‚¤sçõèp�w $„ ÎÑûMª@^b„£•YÍÕzõ’e›g‚äm&ÖøRa.ÖóæœqŸ›&Œã »xšµ’ûË­²ßs7û†­ãÛñ7ÆOì«4Cžó˜õtXÈs}}ÁN®)Ó:u„›ÄßSÖä{GoÏx£UÃA%WB1⣃–À»–�< $Ï•€”¹äCÓi*©ö‚7ŸŸ‚DJî™æG„)åd}:õ]Sß÷ÌílîY؃ç†ÛÏÑy¿"$ç+EÝ>â’=Ö Î,m·ÇÀ!λ‚m¦S¥4òPlakè"qÈãû…»Ká,Ù¾î{`¥™"hqÈi‘œž‡“”A¡1E–—ÿºå–µó_¿é”ËiÁ”«à¢9á¼ÊñºDR¥Ë†“Ö4ÔSxd¸sJ6R¨E~XÌ–ÄI¡,3–GÝ+è ÀÖaÎÉ@B:¹à§ï5ÓE|mÏ¿XjÇéIa —å1�1ï.x7Älw»À’ŠåÀ‹ó¹Fy”ª¤Ñ!^aˆÿÅ &4rZUA…ÁlWUöÒ =»ð·Û�ã;µÆ endstream endobj 13 0 obj<> endobj 14 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 15 0 obj<>stream H‰´WËnÜØf ú -ÉÀMó>yi`6ƒ‰³ Ü@£,¨nJÍ™nRaw�dÿÆ|I¾&¿“:U÷RdË{°Ø÷Q·§ªN½ýÛGu}¼úa}õö½¾V×ë»+¥ŠÚ9}]Ò¿ô­èÃøk_ÛBûëõ᪼¾¿Z•EY–ôsC?×�W?g]ŸU¸ìÔŽ¿åÎÒW³ÏWÖÓåìОvC¾2&Ûb©,lvwî7§nèé·+éHÓO[÷ùJu66Û®íó­ÿ~¥|a+eH©õ�ñi�§ÎN¸¤ ŸmrCW›½ü=çªÙ¾Á Gðϱû<­œà\efr±¥BöÐt[|Õ0ç˜?íšV5É~Ì�%Å&Q{ˆÒthe¢ :¯²ÝtJöØ Uvמr]Óê'œõ´2Üá vQœé3ÆH%Ò"Nª$fÏÎ,Ù‹jæE%Nœ0ÄQPÙ»|å*Xð £—È“žPóGW$œ\XDÀ2uIGÎôTMw°mjl߯ˆ&?œû-ÜTWÉŠ`—`-!hlúûçÎmš¾N—awH£M|2Ï„Çv;³rŽÝ>åпٜöŸò`³7$Æ#ÞäIø×Vô}€kB9z¤ .5Þлò¾Îàý6èxž åJMz¾Ï+G‰Œ‘¤�‡alñœƒ;÷ݯðd`9®æ�Ñ/§…Xä{I%ß }!ß�ÅåçXyŠ˜ÌàøÔÙ ë¿,…E3C Çlᄹá”À+lצã�ªS{Œ¹¸9IÀ\QëzÎ’TSt]¥2.ÕN\Pgûs”j�àl×±ÿ©ÑC6øÂÔWRmT�XÀì{{»þ>ò¡¨È lÇjwŠD‚3´BáàÆü«™õD‹M¸¿®#3«²Èg*IÌ:Ñ“ìnØï™W¡Û@’ïïßÅÈY‰ÜjT ÙØR‡E-ÉÙäߨÝ|!d•ƒš ˾OK0�á”Þ >Þ)'ß­sï<{Ö;éšùÑmîµ¼ä+„á)ÊsI^Y†*ʃ¨ì‡|ý íW²O‰V•ŠézüÔÔ½©�:tÙ¶NÖó ÿ:Ã׎¬¤+®0råOr%*AáÕV‹ÙGÙJóBQ;§åÑ^ø]1ouYÇÜ,–Hmé,A¼œ‚d–*õ’Æ8‚ß[çâÎèÞÂÙm|¡gQ7y:u'e>Ñ5A#UfmýËÞS›S‚›)¸¶¤DDÃê˜j謋(ÐplûâkPJ‘ÛíyÓ®†qu< l¨4v¿uÛv‰z0øyꆈp%…NüËpØ ܵædXã2¨QôjX£Ø3²ÀÆ„dŒfÞ§)ƒA­Ã¸€uÓ)ɽÍÆ Ë›i'&0ýx|·¬¢+1fæX¤#Ã=  n KÜð/ü@Z7wDj8ïd< \\$¢`u÷<(.[¬Ób„õq4œÀ^~1ç¯mr÷B«cubÑÒF);»9]9.sTQ%0•›'éa‘$¤´3)(DóÜ"3(åöt­ZóTœ8¦3ÅMÒ5�aàd5Ìq%O‰6´J&ëJÚ‹\åÕ»¥!+âtw‘)‹¢3SLשÈQÁñI1êk¶f§�pÿÅäWëÿ‹£’>ðμÜQOµ*Â)û�l)õZñTDºIAK½ÚX®„ Wþº¾ú7ÓHÕ¤`Ø@G©öé@gIëJ£®7‡«·êúÇáêW?¬¿(Ÿ‹³¥qƒ 䛯gE³(Y`«ªp¢ÓŸ/ã|j9T/ctõíþ|Ý1šÝÃX*€¢xWM~.}Ì�ì—¥8Ú«ýe|ôëkC­{fð¢ Üäod SÙ/ß+|3Ú‹uL#=ßôodvSÜ$P*Æv DÊi£®_vÕç®V%×|Ñ Kkêoõš©ôÌel†ã¶@ÞS@ý’#hv›¹A4ýïEÃdÉ3;go,³ Tf‘x¯‹ùºY– 4û60ô—`ð6Ëo¹‰7sÀÀ­$kˆ‹/£4¡tfæe>Ô•Yô–HÐ+´­¸œ2g ª‰¼ìê&qú-SH~!Ó>ëQz=È�¤­Ã–·T…ÏÂXÛQæKMÄðÔRMtpÓýÎ]¶†@žBv>á¸M‡xœ$ òì�<á±Áƒe¿ÂêÃ$Ÿdžä³zLiL P°—…ÚN»×d^q¼£—Çp÷>¯<ˆØH.CL@J˨ê¥_K�x£±l)y"È0KR¸u;iÝ6¶îxà$´f‡KõÌlÖ AâA‰‡ªéëô|^Ú¤-Ž?2ßY¥¡‡ŽòØç…}×O‚QúNÆ4Ïý¹Š‚¢A<<ÕLú�4€ØîK¦À‹åËÁ*M©Сµˆ«åÑSƒº�Z@®�‹™÷€ F”àIGª@d‡©øù´ÒŽ"¢Ýð¦ÎŒ‘³�ÅEùq#Ão—òÇm;)9\0(Z…ðÇÀ‹œ(ã·¢+uEdùQ‰m~@‚#=NÜ8Å0Í�=uG¶¤QâÀqüF�= ÑY×� ˳/ô“f4„’±ªbVZ!X84n»þY°fô,Ù#ë42²ÉO_ñ(ƒ *¿Ä;‘6ÏÞTQC�*ª¨(詊š9jPÍó4R`dôšR6(oí#_GGöH•·9QË:û./§1öU¬ÂT93BLÿº%–ƹjnÉ›§ ô�„äj:¦'N±ËsšorSÕ2&Y™:„Ó¸ÜÇc”Ás.ÁmnºÖçPOÇ<åjWó‚Oÿœ»û4yÁîוJuà¼WM�E= !įà8#í®ú»g�@Á!—À!7r™ØÞì{œŒí,áãpÈo¦^U÷|y½Iâ´;îîêªêª÷^YnZS�"Þ˜H'ôòb!½¤+{!æ…B8¯ãKŠÕ¾;Ð4Ú7Çvåd•F«¤Ujo+�g*À䚘j=|&b¢èàc…èG¶Õôï°SAŒ¤‰,yíϹ69ºI]꺴í–U©jo>�ªÌÀTT&äÓ´±N;Ç0�Tê\éqåš šÂ>´ÜÓ KòÝ2nY¥¥¾'lÄ�NXfØÊŒãXªîH Ž–é]ƒæ¯]â'#KPÄØ”e‹„x»”«ÖNB¤²’÷oËÈXÇ“Ñ×b3CÑ<¬‚�sSµ$Ú’‚îB™PsL_-Õvs<6àAYˆ8áÞ@…ÌIÒ£Ê5ÍúZ‰i/qð†�%¹ÔTul PM²"ŒGçPJVêz¡Î‡`»r‡|b\.S“ޤ=ÁÐÇ‚¯"tÄ‘pãÇy&H¶Ð~%cFÃ]A<ñ¼L2* {E¦m.H$Ær ¥:BCbšq\o³¥Mß2¶sƒ.;G“ÈS1N à‡Y,xãà«3µ!Ô*å=Í#”}¼ ´ufÚŠ©WÍÀ¨ÖÁñ€! ±‘þG 2×¶‡¼•TjËkQÀhä^ø5ïNôˆÏ«'±ÀzKøm•™\pFÓm^Ã\YÙâ'¼o ú¦ÆÒõ'„¬ª„¾è ´j:qU‹R*²T&íT‡sa“a±ß¬O+QqŒ¥ÀVby—Ä-á-„Ì€�<‘û5'šøMi‹Óæ�¡Ÿ¢$ßl³3 ³˜ƒ�u»ÛPºö]¾7Y<ˆÚ³ò �—Sç^`ø0Å;\‹M„7)�uêÁ³*s©8žÒÝžn¸'•!)‘Y�2Öá�-®±Åçµtà€?1‘Ìð"ž”Ë 0'}ø5�Z1diN®â¸.°Ö3ãpûJN¶„(“ËŸ7%\9•H_#›Úë§ræž> Û�V(´£¬õô+óf¾™€/aß,Å œXglûpÿ–�á¼³â�20™LÅÄRr�ϼئÒK9:«¼¤·|—nš.Ðnš!¦Ý5Ò]Õ…Ñ’dS>Ž®“Â�71VŒŒN¼yÆÞñýɈfl À¿!£³ä׆“Ç#É×¹Pí0ˆÅ"5gzUËc�Ç'¾f¹]1à0 xlß®-¨êuZÛ‹Á6�?ÊÅè5ÒÃ}Ýà€4¯cXcþ°Þ¥Ï!‚trø¾JÜoéuè�=Ky“EqG4â“R3$ž�‘¿³üô„%f¾B8çÑøŠK¦*äw;JÓ¦o “K.¤ï�F�â%á/û@%(IŽ~�ƽWî1PUÞ> é’j�U-_‚—À£›-Úu�—Á–,ôQ]ǹõ�·ÞœS¹kpŸ÷œ “* Œ­;jcAyOüaãLF‘‚«RH¯é1‘azŠš"èÊ ØUná+ µÀ›:AÙõR eeU¹©ÊK�pÞªòí&ÂUI§¢'õ•͘oFÌçMÍx~sXõ-“Ž —lKy�¢œ¿ÅÐáx'˜ÈÂøO¸ƒ™ËÔJZ?ßñ,³…0»xtÇÚ¨éÖWÑ"Mfç’c½•ƒ!?ß�eYl»—øžJ_'ñZ�J‹ƒEn7ÍZ\ŠÌÉr¬¡C_6¾yS¢ôN›nµA'ë=(&) hÝMÿ’¯·Ú‰½JÔ`šÁt²ÔìðC�2\œ›„:›G³è ç#cñùB*×Îú [ÕN_ìÊ-w/À ˆS¬&Ò4)_Ç ­H8êÍ##Þ¤‚ùQõ´I®SžKÐÕo¥Ø4„QVj qû.ïãéÄÔ€O¤µ.¦“,ï�äjI®a2gW\ÑÙ|'%ÀÏ„‹zÙ$·@=zž~!%¯5¡„ õÙHõ!M©ãر 3ëØ€Ä#±ðjv!� UÔÓ¼þ¼ÌkÈcÑ7³ ™®ü±(¯² >++†rYýµ`ýÊÙiíh3 ÉE0åZÂaML)œkH‚R5¡Ÿ�ô„&)BÃ,~Í*aËßz)‰GÕ QF^E ÔwLÖîk„“Ì ,ó TY¨&¡ç’Ð zÀ¦QêYfÚƒ •¦‚­Ïäp†ªnqR› ö¯sÇ#ANƒN¹õ[ŠÑ)�ä„èÕZz�®Èt”cÔ¶Ôö! í'øë³5~AcK äà�Ÿ|ù`û½¿‡eÍ®l?Y8«é–Û÷8`øþj¢\’¦÷wí }é(®•0ÊPÊuú|7‰Ù½Þnhª{V©ã³>Ûmšî�ª#d«#Õ*ú\Ñ´;ôÎs*Úe+ õÎNZ~ÂâÕÕÅÚKzÑ61Šø‹Ù S R¼Zžr¦úð©néK° ZH4Î šŒÅŸË8ÃÐ׿˒Öbꨰ¦¾JÿB±Ðº¢š£þÜQâ 9³9§‚Ÿ•ÍÑZ²ëÏËÙ9Œ¡�RL¥¡�ã‡)~�£i%zö&ÿo*Š"†›È®ü½L”"i&·í–‰òC¢rC>l¥Ýœ#/çã“q”,þ›|˜ËÑbB$}7œÏ �‚ñ^™TsZùvI„biI-¹Z祛E‡zb±À \x¿xîò´ËËP\|v¿pÀ9?›þÕ‹áÂÿõ"ŽžßO^dÌÅ/8~íœ�!0>jE¿1MÔ$Ä¢ E ‚Ê‘Üøã³/ÿ`ñ1´Û endstream endobj 16 0 obj<> endobj 17 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 18 0 obj<>stream H‰ÜWËnãØÝ;ù/y�‡÷M60‹tLÐÉf dÑž%Ñ;2eèawçñ³íž:U—IyœH� ÐB$ï«nÕ©S§¾ùÝúúþpõîæê›÷Õµ¾¾¹»Ò:¯¼7×ýúgM6\‡Êå&\ß<\×÷WE^Ey}³¢·›ç«�Ù§¥rUn³µZè\gíS»nÔ�7¿§Í�lnóªt%í|óV­®²·êæ�{/òPÑ <ž½“¡´”v4ÎÈÐgkƒ >fíA-¬‰yÈÖ|"�n]‘û¬U4Ïd�²E^eGUf;µ.�ônJ²õYYKs‡Ïõ°[Ûá6:n|,i—÷löOÊÓÕ²š¦Ñü-jzxÂæ?´».O®prŸ…ÏËB‡kÚÁγGèV¶’[}P‘¬{§ ²é6{w«ÞÎ=+§Gî(‚,ü“*M{-®w: �l¬É6ÇZœA¶;²µn·õr; ¶t²Ëº»Ýþ¡>’õp@…+'Oé¬9[m—¶¼t'»“yòžF½!·.Õ‚<É�0´ß©[÷[�Ùné–0\‹�ø®ÆÊ]ïÔ‚I{¬ÈD<‡¬ß\ËÐ1µ|ÞžšƒÄ0Â2Ϭ¡7¶Ìa\€FJ˜ÈqO?'Ïû!A<™9ñ©²jÏ­ ¥X›S4`r£`¢Ë6ʲ+ZÄ•YX‘EÃë:�ïè!êÒ{S§‡;~¨†Û´´ÿ§ï¨~N'”8GÀ´Ð†ÌóÕƒì_«ùZ¿9NÍ$A) ÆNîþ8»{¥­{–[ÆM¶ª)9œ”Î:Ñ›©‡Cn� ãC>Ë!ZË„˜W±ÐLQéÑñw¼O EI#kbo˜+‚OÌòiº�U!]*»U“ ¿D‡&”tÝÖÑá Ä\‡*²­o>ÍxËZ߃Á9Ãù�}«§§ï;&7ñÚ‚Läy>!(,OÁBòP:‚Se¤‰ ˦)AþÐå?›Î1YX+çJðŒrÉHˆ×Ì Îkä&ý;¦®Éq �PÆ ØJ51Í"à�ŸX÷íÌù…ë1=†ÿUžúy1„ ,ÿ:+^¾Ð=Œîfð•1=²Ù2[ê”2ÿ躤ÚDØ£ Wþ{€n~èº"¾4×Ár¡¦&.!üxÓÛþ·¹7‚ÑS;Îp zêá`J¡óËœðÖÇ1'ÂeNH¨þ>�Ç*rŠéY*ÿ èõŠþQfÈ£ÄÑö;ζ Áøq*¦BÕWJ:SUI)ž ?!7mvà2¤Q*Ä‹ž.”V¬Ú¯,i˜·å+Š+W5™ÚÛ¾–a¸™B¼CiEå´DåG©mîeU³§JäœÍ¾ÇÙŽ :Í.MÑ”Σª;¡ú!ö1öI�ýjžQ¾Ï¨KÅ©‹Œ8rÓt“=Lnl9¦D+ôúa. �÷n’×Òë5Z2¥–nÕœfäü¿Ì&øœx0Ñÿ4?˜¸ê“æÿ‹J=‰x�ʲ=43Jªÿ*HÏà+ÂXx9?ýzfIŒSŒæ2žº)çÙTŠrzNÝŸ/)Ê¡—;äî$k-d­�´']KtÄ F‰þ±yÆc$ÿÿA±æ8nv,ÿ Uú‰ˆy¥ëô¤éb‰SG|ñ1»Ù ñ#:&îìå?$2«Ë=(µæ°Ú·ËÄšhH€I?ç´4r2í™·‚*-ˆªGc³çM»RÜÑmúý[馒 KÙ¦#@ËD³Ãò‘müŽi:5 ©;œYŸÞÑßhAú†¨¸Ð<&õ‹¤y}# •·R,ê6t–‡�i˜î±°ÑÙË_š—>6ÜwÞË·/ز’ªƒ÷;¼TªÓ¾O;§Q4`RÑÈ{ÞÿÓu?%Á7!pQ¶ŒsŒx‚oÂNŒìDÇN´apIäíýèý$5ŒÛKHÅF!,Ÿ‡ò¹o›nŽ_Dà�ëKª†ìý�æ÷!ˆIÙ.zó.$f2R°G ’Ýï›ú¸ý‚ÈEòI« ©÷Ô¶Ý=ƨƒå{ÒâÍ`Šl–>§NUYKAØÔ“1ÊŸ—ó°(û<¤£šûdñD‡§Š½Ù?µÝ×®=âp[¢Ûáq0ÌÕ˜ñL®ÆŸaI• ïFHéê ¦;¼óÖ»Óñ3ܬ­”áÁu»®ù8ƒå‡zÐaí Ž¹!hñ%™ºMgÖŠAýåð 8Љ}ÈÙÛÓšÓ,Z¬8S) ]h·^8ÕÌ\wÃ?©ÉßÍk²³ú³èsoè¾UÅžHÄ0äû³bŸ4‰ù‰`zƒ$A³mIÙ%¹�×H!ÁŒ§ë}fùÝ G´‰œ¢@ÛzdñžwXŸVÍB-b_$ˆhÖ‹D5´s(Í¢tÊ1bYt \Ó`qûÔ®\ç(P(ÿ#ÿm܆„ƒ^gáV½Á,dÉò„1ÀÛ> ÕP‰c´åÙÏ^§Š DzÇâŸ]ìÀü®‡fÉô"‹š€±$éK÷¹ÚÁ©Û/‚LbAök #Q31ûAîj™Z j›ÔWF22z(˜sH•ÞŽ!5×eÔ¡•¾ÔŒh«W7Ò“�zŸµ¡8²~½²*ØS ©aŒP i· JñCA´‚z_ï—õúž»<øL¯³ÝvKExÇý#~›Ð§1r‹V�ñ•‚Tá€&n£"eô1�âÁ¤êÖpÅ:=>n[®ÊFj¼Ï5J>ðÍRæóò¶»Ûíˆ~w}iMg^Ô”tÝçDoý6LBN*™?¿Û�ºµ4¼ÄXËžé�l[à¢[Õ'@+Ϊ·åÝví\kw‚2QÕ+ñžŠòbè=r©Ý>û^‰"ãØ'Åàˆ‚]Í5McN³õkγ‡°÷î« ú.ÐÅ„Õy÷ƒ¢˜É9í)=éj¯í\Ð*õíž’Î«î „nW},~·=Sé ÒM í%|™×þ7µ—4àüT‚¹6WsÝL©4Û - #†MÔäšÍ[%,øëîíÿ E"D endstream endobj 19 0 obj<> endobj 20 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 21 0 obj<>stream H‰ÜWM�ÛÈö�sÈo˜c30¹ìv“ Þ` A.+ Ïd‰’k¤YQòx±Ø_±8õªº)’3žd7·À€‡"û£>Þ{UõõÛïôí¶¿y³¸ùú[s«o›­‹¦ªÌmIÿÒ³)뢬o}ã ão÷7åíö&/‹²4·‹ýZ<Þ¼W§v}Yµy–û¢VÇS|è3Cÿ_>d¹- £ÖݧnÝÞ©ìûÅßèÒJ.­‹àLE7.þŠÓV7êM¶ø×Õ¨²�i仺Ëä›Oß|�öª¯äSV’Âx ­)›0NáÏ“óó@òŽ]Ôâ¢zû›¼{û¿{ç¬8·]f®¢üž2ÎÆ‡ÌÊh|¹Î(Ÿ�Ú¶SGmQ7®zÆQ¥d–A›q2…+šW·‡5Ö/þ(o5SH=îº};1Ù�.ëñ=SÇ5Ü8QêjL:>Åð¹õ˜˜\µ±Z>‰©Äõqrfn m´§PV›•û£ä“P£Í×jNv[Øšdä©cW²‡È¾LöÚ%ŒL僄Hë)½Øð„ñ>sÄв¶Rûx‰˜ÍM÷Ee;¿U§^0ý×êËÉ�'wFùø¿Q�D¦¦µ¯þ—r:¦¯I® oÖ1t›&\ϱQ»– ”Óêf‰~÷{†D²9ÚäÈÏjD–§ 6ɹÊ7~­”Ëòý‘Ž7\PÈtCÈ£Ÿ¨THxº¯ÚSO¯¬'öl`P­NÇ{z£kZtÎèÚJ±Å6p�Ù_§£W™%¥R»åäk·šm:-ÏíöG¹ŒŠÔ»5%ëÌǬŒ÷d¶©Õ#m ª£ÈhuØ ©=˜¯¢4uT…Ö„†v°‹‡Ì—tÓ93b…µêõ4¾å-ÅéæàTÜ`;{ô¦¦S¥Ÿˆĸ7ÔøQ‚lŒûë,wAYpZ%å%z Ñ“ÞÜã]…wD}ò1j²¼‚ŒeéE‡¬iÕKÖÐäFß®‹hH3 –Œù9’ËûãáxÎBnÁZ‰[4d7 ÙI¢l ÆÐ ªçêø ˆ' -¡HŸ­Ñªo.û=â ��–‡�b²Q‰zl’QŸ±�àxZ15Д…ŸW'm�ã\¶¢p[-9ÕHBwèå&/2å­Ú·Ë]–=aYYS¶¢ƒN­–Ñ [†”u‡î^àr�¦PøŽ½‚>µ yÄ�Ê5Oši(T¨#2v”7›©XšmRùeD„ˆÒ0'¢Ïù~FÈHªjRj"ÅXŒ�z€ÃSXï²Wb‹ÿ˜ kÛy�ƒ½ÓÑ4Ò„fœŸÍ¬¥i¨rŽÌ�êÕõ©h@ÅèUcß}Ä´c˜e5*>=3¬}*\N*’Å@R±ŒU”Æ#‹T,>× –Z–$ŽénU¬[ùÍ{kʧ�^ Ñ£�¢p»•¬±.}fl´ýLÂS›î¢Ûÿh‘䆪`Ž�_]òlVŽ€äXR¥oqC�?aè%bt+jÊëzœák­ò¹Èl¬UŽ#Ð%ÛihÔ†;WR£HõíêÜA©gÛN˹võ²±p©^å4©pEnѸ%²§ö8�ä‚=”®ó.}[KУ#¢¼çÃ%ÐNÔØ–ƒ[+œísŸú‘nxt-„øZÊÉ©ïD{ùŒ�|¶©EÙ×äû¸Í%Öûv›Îxjt¤ˆSïëÌ“ß/¨ƒ[IÛºK·-%~{¡5?ƒ•RÈ—¸Dt¯|Ú©F½h—(lÔk0h¡Ÿ«£¼9 1"(�âoÈ•�FÇßì°`Xlü Ðý¹}êÑ®–š1^ÞE—óÎ#IÏ;:ÒxtžKH¼áöL£;Zž…csSÕ\Å+|ù�ž=Zzä�ßøyÅÏò¦±±l{”‹¨-½ ñœ&ôͬP¸ÂU¶þòl5cFc'`p˜Ì$$¾Ö¿â =’4šs�öõø…½FÀJå* éë-ײµ]žXÖ+:c;“säp©(Nöà/*ð;–óMŠÙšcŠ<ç!Ê(¥îtŽ¥ e8èg†¤è€Ac% h)¥R9NyÎZZ±]ôܘÔ5Ok¹Ž µ(Q®”QˆW�LuÅc@Žò×hätm°¡o¸´‡U˲ª®†|-8N ߎ Â�•ô|L† ×놅‚/¼gâã[ƒo/ú7�Q.èÒ�QòYP⇺çÒ˜§~7z¯ša %%”õÓṮêV‰anlÅO“«hf+uºjn`U™@õó¬f×Þš/ M\HGï¿€ðŠº�ftJ•N9¡¤™XÓÀý :RT þ­çEŽSϵ¤ÖdÔÆókuåì—|ò(…É'ÿ¢O>ùô›Xk+kÖj¾öµ"{DúA13 p›i²àÝ­R’6Y¸Z ·\é÷‚´;„Ù®¼Ìë,¤ÇôÕ§ÕCË=-y Ú³ûM§gçù€†Ý¼S]ÐMþðø¸hÈi$Gßo¥:RldùëŠ56²~ßË�3¢É$½Wâæ-�"`vÚûƒ²œñn¹]¯Yçá‚öjX\£÷†¦´|�”È8û \QŠÝ0\¿V×�·$+:ÔÈFÙÃÿ+ ¢öºòZÎÞ.åF8’v¯ú)9{ƒ$$pÐ9Î!}gµ �þ MèéA)È&¨”˜—¦×YNL;/JŠL둤Ç5ÍFÿ¼“A+äêr¨?Ã^­Îôþÿ\¤5îRo¬†Þ0®lu‰7¨ ì{£cL—>ÌF?F‘Vf4¦éÈ *!ˆ| xTaÚ¸Pk;¾ÙŒÞ~ܨñûíèóèݬsìÑýk°…?X"táÿúlßz*”g”Â4û"ÑtÊ~T Ýbÿ©ˆ9o:鮾ÔôK®þ”éPnèÜžé¯ûá‚Pp‡QT)S�%6*¥eõ툥u0¹¦VèË$Pï” ÔVOmyä c¤Â(Vj¡�Ï“†Xg¾ZÏ¿­Ëhb]örû¸á•Ê1쎊°&Ò]tŒgÌó‡5OÝÊê?…ü…P]ÞÈ Vq+J-Z¬x~b–—¹euv“AÀ³kšƒB¯SÁ��„ WgM¤�³A€„ñ€ÇO‹6—×-a‡ìb µ©³à/ 6üuÐ*§/ÃJz F(ÊÂj( ï&†;€Õ„:‚@ÝÖî~Þ¦ïÛ 9—Ž&¿óô¢]òC,#Öijþ�÷¸`Á%UîJ°\> endobj 23 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 24 0 obj<>stream H‰ÜVKo1¾~Äm©q=c{lz â!Poì�réÒ¦JÒªI ø\ùÌ׻Éz[!�@(‡ø5ó}ã=|ñªóÍ丞>Ç ªúý@Eç°ÒüëÇÀCE«�ªz5ÑÕùdª•Ö†mæ<­?NÄ“ÍævÕÈú’�¹ìÌ(�&²§úi:4Ÿˆë¼ßÓ*‚±y¿õ§)�z#–WrjŒ˜Ï–rjŠ•DeÄb½XÍäÛúÕ>)c9»A�O9@>àUôÚuC´Q¡å åÏùJâTd+ß§f5¹ìU\–y/Rw-q*‹+߇’V†ø) èÛ\. DhÓEå(c{èÊŠ"™l�Q;�SðZy¡”Ú�¯;´º¨ Ø"팭3Œñ…äu3‰Žg¤AeEû&-¿ãÂhDÓ¬ÓR*J[,ÇÅâŶ9ëwœ۬˂£aX°ã+|ĸÁiße8“ÖNf-­C¾Ú™4 @,y > endobj 26 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 27 0 obj<>stream H‰ìWËn7²ôW̪à ÃË7h“æ�vÙhQ@ñÂqåTn,§–Ýý„|u‡œÑ %Y²c§Nx¡É{î¹�sùäÕkªÞ-žMž¼ÔU““r\’Ñ•À_ûLD\ÙÊÍ¥­&g¢zw ¸dªÉ1Þ&ÿL™®GDRòÀ~·ìü¬Öxûpuy„Ç.ë‘àÄæç‹ôþ¾)+ñŸ5±�ê‘ôøïìbžö͵Ħe}8ùå€4WÚÊ+?·°¬æ&¢EHÂEH@éÁã¸g“Ú;®Ùl Êi@;©#’«Åñ%Ðd ă1ÙB~n-hÉUgARg!Û0@û¬®Øy '4ûC^²¢=‚Sùë ,—,ÿ,Óg k¼Ü`ÿ(®_Ày%gqåü(’$ÿŠ,ZvuôûÅQûõ8š38hyuÖ8#*ã� ÕäyBM>¢fÏçg³ÅN?­'§ˆºIQ‡~‰¸\4 é»Lß÷VÉü�K'U³h¬Òªœ;ã…QѶÚ¤Å+Â~†O1°—³‹¿k«ðtTÇ,Pþ´�ÝáAD�ëÃùmÄ;­K8S6~Ã�3‘À)~Ãs‘mÎüä…ŸØž>³0`HpÀaúô¸Ø¤5Ùü‰¶ïÚjª!)1*‹ýÎJßÇ»Ýt s³hZbßÿ”*} ^¹½¸»{‡ÄŽSJSû�×oêai —jgú¥Ý :¤Ì}‰ÂG{5ì¿½é ¥�ªcWx�e�ú u„_Q– %:ÂBåõŠ•“ª 21C¥ =TžrE¡{ÛL׸ô”\|S�Ó2¢´Îñà5ý3?’…Ó•q®×ŸµL¹•JÙHàÁJÛlÎ�„¶7çæžz”v¹í!,¶`n¥bó!HøiI¯â•�Ó°¿lÒ�pPT½B4-h첡ñV¥"ˆý}Ø¿t0¶Ÿ¿m8ì†p|*ÂᜠùSYû¤é5¹�ô-)Åüã®ðJ u”`Dr§c¡¶œì&SjèVŸLÖÖKG€]®~*ûPhûзO²ÂD/ÖI–;IV~´¿!ÉyàÕíî_cÚžÐmRŠº¶¸ÆAȾxš ,lGÝ�Í]¹õ`«TîL9í$¤p�rLíÌ6�6¯l?ÛwBKŇàÈf‡hæ5¹Q¦Ã–ê)�ý¯ÞŸ¿mfe/!žgó.*ŽØWµ`g­lv¢ƒ)e1í¼ m�h5Æ^Ïš …Å$çvÈ-ì"0oè‹ÆçÿÎ.–kf•Òn=tk)ë]7sß`j+«¥œÚö;em~‘\8L+#Å�Ñ {º Éæ2Õf¿Ö£xË:_ÆkLœ^Þ^€ ©9Æ`ŽO&ª 8Cdۛؽ» “í¾»°ñtÐ�åB‡þ)ÛûãÝ_PqÎÒq÷+MZì[¿Zâ¶jÛê½£)8`¤ÐiĦÁûš‚[ª¦Q0FÒ¤Á8>�'pê˜ÂÞa%ïž­<¼©´œt¿5ÚíÔÊ`¹Õ•&D=íÙ.X»(2ú¢ñãí Šç8ïú{Ý BçeTÛX®ytœ[JÓ×ÛA“ØAiɶxD@ð‚¼¢˜LcìiÎm¨²ÛQæLj{AÛƒ4A¡oÈ�GsÝ@Ïî²S("¥¿‹ær‡ÉD»&wr%w*É{ ܆ý…΂±øò6¶¼Í n’]D‡=¢ÅN¾ëÜW©sJÇmtN¢¢Ä]ëœ�#½‹´ˆø½êœôäò½b\ÄÍ «7Äm;•.ûÒé¶ke©+ð`¥mväGimì�¸Òµ[í²�Ø`ÀuºṖ½~[Ò«<ÈÎ�›‚Ö(b�äDÖ®ü2;a"ÆöF(±!æÆ æi ­'l�Ùqó Ê,Þ“ cóˆ~º¬�E®ÍkǕŰ¿½²¾Zï¯k©SÞ'O‹ü±Av¥ÖÓ`ª%fõm�͹®G[ùSÖa6’(êù:•uªÙ‘Ya?níkÞhKí§R#¤‚˜:Y�N•&¢[ȪÝ&«{5B©w4B^œ‚<];DX©C(��:HÈ;–qJdš!R©ÞŒÞf™ÝР¶Álá½”ss/Ç�ÓÆ Ï�Ș�È>.€­”äþ€M3²x¹ðS¦»RØN|¥õû¥ËÃe©Tñ›²„õ*ÐWÇÒ†©¤•™[[ä‚Nj$=j³WÆûœ*û¼0å(}óUö`YzPUöåXº÷*à ϯâ&Õ N¥­òbº¿Á‡T:ÊÒ!ã5w�ÃÁÎp ·ÇãÛf^ëñª Èàc7zì1ÜÜŸÇ÷�Ò„I–Œ�mÏ †¶“ƒÿ¾ó´ endstream endobj 28 0 obj<> endobj 29 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 30 0 obj<>stream H‰ÜWÛnÉ 6›ÐWÌc5ä®-²X7z o6ÈC€�‡$?(‚´Ã’ì8û ûÕ9}ïê¹ôèf(�Ôƒî*’‡‡äá?þL‹_ïŽþ²<úá½,h±¼:"ÒÉ9^üuÏ„ë>‰f¿X^™Å¯G¥ÑÆ/–ø¹ü÷Ñ©MZŠ’ˆ�úgÁ¢½:/¬ÕQ})Œ¶ju¾^¥M¸L]}^_ܯnÖŇåßq¾$�O‹å»öÞXݫޭ®/×wøìm±ü]ã£ÓI˜à >7õ‡ëæ=7ï�ŽÞrû^s`[}tªN¨à`”©�ö—^GãlåqÍ!c` >ôÓº°¢“º¿¼ýRx‹§ó"¨O…Õ¢Þ¶7µ~‰v.ŒÝú%s‹4‘-n�Â- P8¿ŽtH>»OOÂäСP9\_§^rœßòfr‹ùæ½JÙQ¼JÈDóêÛ)¥Íg¡ù,è ÕdjÙ JynņK£@B±- +¢$I †ïoŠôtêÿƒ&u]”ŸuÖȶY·¿Œ»‰¹³ŒwÓ6»eV˜CqAmJ´:²ë똻ö~LEµÅ*YO�açÓƒ$&£Ïü$Øš0ãÏ4ñ&üé‡3FZ„JFCL éÆé·Ô•r%ƒëƒsãkN($»!,�Àâ3 K JX@qU²Ö nvDë{ÓhVìFB…§©.SìŸQ¢½c#%úbŽ�ª`¢%åÊHg€OÆLqöñ0¾¼^”è‰( ;âø?‡Ò¶­Fžf=:Èëд¨cÌ8´¼Qí>©Êž–&e��ÿï«ìÕ¢ôªªìÛ¡ôâU´÷ù„Ì´ÓÔÖT+b0/áU•¥ié�‹¢Cðd_ ‰üë‰ø±Ìë"Ê€\hœmGz°úz@Ä/Lé‘¶Å àt Í\-µ�ú3í:![(€ 4„•½üòhÀ„µbÚ[}^_ܯnÖ5F¦*“(Ðú½�Œµýw«ëËõ>{›Å�L8ƒ`= &ú¾œX͉dÔ Ä»Ý�i¼çvÑA�´sÎ×ÕMCuwÍOë b¼¿¼ýRx‹§ó"¨O…SÉ;î§êêæ0ÕÛкxü6'îJ’­D¿L|¦ ²ùé$rkò[Û'ÌÎÕhŽˆÙ-šÏÂbÇÇŸË‚]Ò¾ÙU·äxÛ2GxÀžÄXuS»ãlœuNzdm…,hxâÊ0AW°é†ýèz±=ºq'ºt(ºÊí.ЃÐt³`¢Z±²8Í›`Ê<˜Ødm¬V…Y‘¯†ó=öºTÁTSЄͮô¨;ì¯ebÍ`{™,úà9þ5¬Ç„®&±ºÄmýö²´‡h$K¿N�¹¾- =ša[œd7 9%ßf±i6\w·jA!Ú&y€k)iö˜<ÏÌ@U�Yé¨Ù‹;‰p$´±¾é…ß�õ.!ÇÈ(ðw2xG³Þ±© nì1Q‹ÞñÃÈkðÄm7ø»�0Å\>…»8.R•�aj�M:yöµ±ö‘) `Mkê»Y‘µÔS«©yëI†ºjIsrj8û1jÙµ‡¯»�«�2Øyë÷¸!èŽÜØh7Ø<íb£ wS}7ŸØ'ü#ØÎP@92#up†$—ÄŒžqœwh€U—–lÅŠ‡{j)6%óôºÜ™T+\5ÒiYÆÃãyZçsdhµ&åJxWèCÃŽÖ+J’lE› )F�2ž®gyj“Ï[à O[-ž¶Œ�^›2†up†Eq­;¥Œxš6ËeøY(#ÑAjlPf^ vÜá[Ñ®¦ùRX”Ðée:é 5áþº<ú¯­Â2 endstream endobj 31 0 obj<> endobj 32 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 33 0 obj<>stream H‰ÌWËŽÛ6º«¿ÂKª‰¾fÑ4´@E¼(0é"x·c�Iš¢ŸÐ¯î¡(Ù¤lY²¥A€X‰¼÷ž{xîá“W¯ùüÝÃìÙbö䥚óùâvÆ9õZ‹9ÿæ™ãAš¹ñŠ 3_¬glþnV2ʘ°óÅ þ\|š]“WwÛßßÞ¥t‚:²^mVëBrªÈÇ‚‘õÓâ·ÅOˆ#b6/9Léùâù¬Ú*ìtMn·÷Ø�{ì°)¹RÍ:×Iê½òH., KÈÅâ�d_j­hÞ‡meõ‘àñ+Ý|å�´é.´µ‹°ü`�m‡¥¡LUÕÀ“t«Š š\éÒ¶ QÔq{~!|šB”b2~X÷9¥uÚ•ªÃ\Å’^/? $k¨'Û¢ää6ô™¡Àu!¨!¡Ù«—÷­6/¾ëin©„Ãú7¤Láõj½ÃÈ8žV÷¸U�RÜÄ÷¤ ŒòÜÕ¯F­2GVu·Šøî ‡´ÆêÀ±7EÅ2G-?›e¢<"êÛˆjj<1jìoÜë1zjQ¡”>Î[ȱÄÈ´ “c¦Æb:‹ˆÙžÐ`™6v^J4%v³=E9µ¨ÀŸÁbKn~ØÞ¯W7…°øãÏÈpEn?nn>¬¶› –J·°±ß#èª$ž¯ÖËÍ>{š£©W"£ð¦U‘3R4% [—t%N'Óò@3ëîý¸)¤B³?,ïÿ. $’¼-,¹+$²Ú>RZgzñk–§Ü*ÕNçš\�N€°\ç2v¸œ'ú|‚8�}&ú’s�°CýÖÚÀájÊu‹Îû¬NT)/M˜Ù:á6•¹¤ 0§B¨aÕ�—�d‚à-ÿº( ˜…É[zA¨Pz ™}‹_vH ï >dNîq¹m%«½¨‰Ä%¯QâŒÕïþi/Ó;þS�™Wíý¦¸ÊvHE&žªjd�‡Õ¦ÅOiuvœ¤Ây|g©·ŒWÖ¦~ÒR¬  cÓ0´‰vÄ …©„ŽújÅ£Îy< <Î*°/úì5ûøÀTÔ ô¦xÔkŒÍgJؘ¹CDLwJ’iŠŸ=$ÿµ!ñÃ!‘Y;úñ�vi;š£s"‚”ÁÍj�Ti”S%*–EiŸþ¤Â©5®1 [~¤c§@sPr‘“(ÎòH´¤,\á9ªÅuN»þÎ+!2Ú¥Eð\?E°ë(8‘¸äú2ôæRóÃc/iRH&žxÉìò\¶l:‚êåÔ>&RªÌ4R²›}‰®ž(˜�+X+Ës-¨ÒþØàL�9²UbsvÚ9U{LÙ^ÑcºÊcjòúýòÏB¢{dY°8’¥Ç8C‡ÂÿÁc¥ÆÓ ¯9ùÂvS}evón2 :eÛA¶0ц™·¤yœÕÐvŽ=¢æá¨Àä5IÁSÝ*Äñ5�?.,œÐ˜¹`¹xè‚–@ñ˳½¿÷Gý}7”p( .Vˆ è¨þ;­ñF˜jIý|�sX"š%ßôQÁ¸I¨4�C|•�Tn¸Ú3¡.ïjÀp”W$ƒ­Ýž Õ‹Ù_X¤¨�[g±4\¹9¤šYo&•ApÇpé¼YÏžü¸æóçÛÙ/³g‹ãŽ.¬ aá+Mô0ýM܉_¢p¹íâ(zgJ¾ï�SrÆo°F̤pžÂ‰{œ¶$ïê cjÔоuâ: ÉÜUo!‡ÆœYˆ”©¬E_chˆâ¨Œì[ôG±šº,ʉ›ÃM_|ˆG�«sÊl” ì�IWãDê¨TŸÞ/¡QXO¥Tþ`4}~¬%ìR˜lЬÛÊ.•HΟ©•½(…E·qžÊpz1E@ŠðÄYK˜)2õBê}¬ïûü$&nÕS†³5ÐÃjÑp™ÁØ©íä~�Í0ÈZµç‘g6C¡{Õí@¦^•Ì>Õ�y—²q¹ ßôÞ Y¸c�ƒ¥€ž²'`ºÆj°V:ÕltÁÈ-œ \»æU/!`'’ LPe¦úè FÐÁ_D1’¾EIµ•çÑAZ_”á`Jg«i}æ:ˆ¡t0ÙÊR(ªÂȦ•GÓ:X'„3�óè¿xF¡ÎafuSƒ� Æ‰»ÊÔ«R—<•Rœ…f-œh…©I v¨XôQB� „¾ˆr$%äTjqœµ\ƒsŒ^Èn½`çê…TÇräP½°ª¾!'‡Aw9.Z•�ÃM¦ç ÙèE ç× ûÜ`½øŒ”¸l„Œ¥D{„\®çÀÙèÅ8Çè…�P/p-å±5T/´¯ó89Ìr˜‹ÈqѪ„f2½8ÍF/R8'Ð 5V/ö5øÁzñ)qѽb4%Ädzqœ�^�sŒ^èn½8û>¢$5¦*GÕ ¥¯›r9ìEäk>ídzqš�^¤p~ z±«¡ )ç- º"û‘zjz¸@{@>˜'Ý Èe3hr&v&8íàªUêÒ&JÏQÏÑ3>�b©F±À�¤ X\†äžÇ<…�lyu·ýýí]QJ'¨#ëÕfµ.$# FÖOk™¸›§€Ï¤y|›G«?Hä± Ŭ‚½^~@$‹k#Ù%'·!.£’¬ A ÁWÿ.ïš°¢ +¥ÊÊÅ«¸¦©_:Ĉ|Û‚F3îëW±çšjÅü¼4”sáÚn·š/³ÿJÆ endstream endobj 34 0 obj<> endobj 35 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/ExtGState<>>> endobj 36 0 obj<>stream H‰äWËŽE•"’W|‚—Õ$®©wUGÊò`‡âR&‹�gÜ0¶ƒÛ“ |[~˜s«ªÛݶ'NAB(R¦ÝU÷}î=·Ïž¿’ãëfôÝttöÌŒåxz5’’—Öª±À¿öYâA»±+ Wn<]ŽÄøz4\ÆÓ~NïF¯™á¸_L¤T†;ö¼\±M=¿+Tà�U«_Љ.÷ìª�øÿv5ÛÖëUñfú4L$Ö•ãéÓ¤YFÍìi½œ¯\{\L†—6yiyi”„‹¸.âÅU:Wé\ðà´Êç\y¥éÒköDÊ &¢Ñ.æ‰ãAXM>(al¢ÐËU¡ /Ùv¾yW8�§ªðì¦ÐܰÇYSöËpk}ß­ŸnI.½1ûn±'¯Ó-×ÞÒ”}-ìç½jÏÉϤŠ1È‘äÆ[ÛWóhO�1Ò¨ñB¼I÷|ºçyé…Œ€È�ÊX8‡z‡„‡^ >HFg Q©KÄóül]L1Ë6øë¹dËbâPIv‹ß `ºÁ_ hUø+öS¸ˆ´Á–»�¯öB¶¥Ê°`çl�.Áu�¹6ìý¾˜íÐÆU�>ê>/žœJ”…(âÕ¾kœ^¢dV_òÒ)åò£2$Ôv{p²Ž+3vRq£¢D�-È.6'Í®Ô9tÃ0G*¦œâh$‡–Ö»ÞÕñÈ^’XÉUòH b@¿ ^–ÚÇl×§ÝðšûžìlÊ%Æ>”�h["w–Bÿy¤³îM­V˜K¦WÁÓÅÓ2pœöê÷å)#Òs÷yê§µŽÐèêGCÛEéÙº9ŠÅ èW$AÁÑ_œ6 àÐŒÐÀ�‰1½?•W¦¼¡gÌ. ßOG¿Ž¤á‚ª™€x¥1lBj„ça �v<[ŽÎ^.åøézôc"6÷!'w19e4øugöBß–'§‚”J‹j�JÚúPBH…żtÒráR6»Bß_o#ò{%`_ I嘱€‰úeW*Ñ{(cz¢#s‚B•;þU> åç7ë‹ ƒW…I¼¬Wõ²Ð@†²`Ëvwî£õ\¿¿ÄÐX¾@D+Ñ&²7ÉØ«ù–¼Å‚ $¦7ìü`…¹OÆëßç›æÀ¬ÖÆïÚ#üœ‰½ |·œ ÄÑÝ€I'‡ÁKO+ çüÑÐ)É]éôÁLçÅ0%hú }O4ÿ胜ÐV%E\«,8ðE}½˜\¶[UÆ èŽ]®Sæó¯SúÔ:%ÿ³ë”ÚG@‰2}ò6¥O/SÚqïÆVèL•Ÿ¸L™€,ýû0©¬ q�òÿú:åŽ4P¿nývÆ9w^Ù½Ö︭CŠ®ÂáíýDEÌ>6gbëéi64‚ö!CkLŸ �d„¥‘XO´§úT$Ð^à:l»[Vjy@EG�%)0Ö#Ú–tbùpïÛa?÷§“â" dîq=‡Z+ÝlÄd÷X_€C]Bàï‘“»�œîŸLÞ;þß“R¾­ÜÙÉHøƒÏÊÿ;Ûa�ÓÆeäç<Ç´÷yNúl�V‹Ü‡ ö¬˜€©X½iRâXµý¡Ü—)sSMŸÄsÌEÍ®€$]« 0‹x!ÚÁH$¬ÔYI½¬Ò‰§JÀ'¶¾M'�•aÈ÷Ïd ›<b,mþ^ÌArÉób¢ 6VvGLèý¶ô{ý ß  2Mge4\A@”øêâ¦'Ló}�˜�’Y¡iš/HÖh6‹z°hŶU½jH ;a«hÑ©AnT€…d¹�RO—VO®îÞÞFS7[ÒeÑí‡îãyº ƒIð’¬�?Ȩbë.®íÎþuªß¥­ ÉõÖ˜£‹"âÑ#L{ÞÇ@JrgCà mbMåb@ó GoÛM©á€“!ÛSò†>?bzTβ¶ô¢nè(°íšÞ ‹u¡\L?½Ç�Yõ¶º¨oêm�T› ¾aîÐ= 䎰e‘×9]$ß�.EØ[7;á-õLˆQ—TȤl³åÙ»ú²“î9žjð¡<øô›níyAö6WëͲZÍæ¨öU¨ýöI¼½&Ø ö.µ�+<\$Cìá5åßOP¶ÐJäX r©à©ÃUw6�Ž æáâm‚>n#�±‰=�oÓù¢{q1pš€§"?µÁD`Ö45áì8ÐEH ¨¨ øºÍ¡Qàw ä#Zìbߨø^Óû¨F}rI %wNCËHš(š† MAMã0U#ªÜäûUƒ/‹Ôñ=!•]RÕ5»¨WUìÒàÛx})+�`v0â1D|ôzð™‰ÝÒ|ï ‰Bê¼ôü%ÀÌfå endstream endobj 37 0 obj<> endobj 38 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 39 0 obj<>stream H‰ÌWMsÛ6½ûWèNCßrì$îLÇÓKÔéÁé�±å˜­D¹"�ÿ}ß�øa%ñ¤NÍÉL,î.ûÞ.Ø×¿¼‹OíÙÏ˳×çf!Ë›3! oŒ\pü;üJ^.¬··f›3¾øt–ó‚sáË+|.ïÏ.Ùy– Í ÇöYn Ëš«®Þ6Yî”Ä×Û,WðÈêL°MAR¸eï²ÜsÕ¯}�3… Vâo—ñ°j‡å²PøLþŽ+ꃪí²?—¿ŒL`\!Lieù–b¼:cX¶ü«‡Ë 儎pT‡Å7Ê'Õ›É*£eò ”®¯§ë¥Ón´w6ò¡M4ˆ\Ê`vQÇØ“w¥žŠ\–…sÊ-rXpÀ ÿzâ_{‘–²b䕲I#¾c‘,œOñ 5Zo #´ŠV¢(¹ŽVM3r¥½<@—¥Rdt‰Pr-�Å_ìÄÔªbÇJH¹7¨¯©œŠ-²0®òyz 2¤ü¯dp.d(aqmÆÏrÂþ†þ óÌHœ9gu¡™%�‹:[%3°—�È/MŽú9Nˆhõððrä‘°bBŽtĈ§Þd4PèÑÖðÙ•Î%Ó¨î3O]ôy«èQB«H‰I‰`?»*2O«¢'‘£½Ô…dÂÉ)5%I”w¸#�×vRDÆÌ°ˆ˜ÕÏ×ü‘©¦äDI¬Ö‘6pC’ùQcžDÍ“ºO_7V›icö呚‘6–�|k½ø‘²öùªÆ©QrÚm7GjFÚ@ içW5åóU�èñb¶LZ7½Ð£Hx^¢W�õñP‘hvü”?äÁCWÏô\ ®ªHäü¯*÷ŒÝ¸'G¬›?’ß>à¯Ç¹Uî—òÞé[³Rå£þ#úþ3Ô¦þs(!Јq,Yce?¦¸oëæi�‰äjµëªº¡OÎöM}³ÝmêÀ�‰z?Ði®38,Y]eJ¢Ün©* ÛýÝ…�g.½íÑq÷®vÕ&SðµÂÿŽuäX§�]üh3Ã^Á�ñ�5#óuˆÈà%]Ú]1ùÛOÄ¢óˆD1„()þ†BV¬kA)¼AE†R:Z'©Û®Úuô!æwUíšÝ>�©¤øg¿j®Ví«P¿ÐW D5×ä€ì®ë¶ú¸Žñ*r¿&È aJ Ãû |‚�ù¥ ?â‡'†££}ïiÕvõ¦êêmsˆ¡ê•7dI;‰ün]wy`€ûK„ntD÷ŠJP€Ä6£os¸©(ZÍ>g!ûGe¹¾%�õ@u³]¯·Ñö>`VÎÀÛnÕî×±¤¹d÷·u`S›Ê#Wëõ¾ívUG~Êàø6ýDµf´EÕ÷¡:nWMyCÐGKDIrÒ£6�K*j0êE± AX,Q:‰e%}ÈT0 †5w0 5M5· >BMÛô±‹-­'"êLôûæïLc]–Ê@·¦r!ß´W·�»˜Ä€¤C¾Ï¨Ü4rš6(ƽG oÆHœ<¾8üpâåB£ä`³×ú9îlME¸ÏrêÎÍUÄë1öûŠ7âØ$§]ÆUâ@HW¡”�Å>½ÃíÁ# Ó!xÓ«¢»]pNÕ™‹Ð "’ÔEY(£=$tÐlÒ²‘s�Zöù¨¹Š‚kå“êÍd8}kJwÝõÔ^:n´y6r}ˆ.Z» c7öä]©¿†ù!0psËáÿ»D'ςÅF÷˜¢¦Ö<¼£r�øñËúÉ]hñ*ð¡eСI_c Ÿº}a¤yÉÕï`ìü^e,�¬zzùG‰Wgì´vŠöežH“ÇÌ#´þˆÖõÙ•'²K2¯ ®)U¨úÝÏ©$œ_‚õ²ïÖ1�N±æj‚:JbŠOkç—bóÕ—ýÌSêéÄEB[Cz��’¥óCm�¨õ×�±šVv”¤c|R;¿šîÑšÓhFta!øÉ©/Õ7Læœfûàifõå£L‘ðϘƒ~ :çœìò«˜5fÌi‡ ¢„9éǘƒp~y.¿y+Ç{J‹)bôxq|…¤¯±…˜!^÷Ôö%¦)Ž’Ô¾NjçWÑþÛWrªi¥ÅôGQªé¤×tÔ˜Œ„ ¨­¶ò8H°ÿq»Ú­Â#ž‰ 4�•†¦¼Ã¦@´ayœþ$Í–4)­0b„ÑP„I& š,$hŸhL³˜A0Í"oÀ¸Ú…`ù°c &Æð–Æ6ƒ-çiæÓaLQv�‘¢Þ¬š{VëºË¤c·ChÜE·ïh½‹Á‘Ed{Œ�gëæ®¡Zo3šLØ}F3+f\ 3šµ-74lNØìsfhi™XïWq“V·]½©‚ýiØHX¢>L«ïi5ñ•G7ØŽˆ(aj:„Î;¶4,äBjì×Þ´‹@�ó D$�”ã‚d"œ‚w˳›)NB endstream endobj 40 0 obj<> endobj 41 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 42 0 obj<>stream H‰ÔWËnÛFÝû+´œ)JfÞ3ô®EãEÐE­¢‹¤ Ú¢m™JTR÷+ ä‡{C‰¢œÔn\´…‹óºsÎ�{ïœyñí¥žÝnϾžŸ½¸03=›ßœi]VÞ›™‚¿á[Ç ³P¹Ò„Ù|}¦f·g…*•ÒÕl~ Íùû³×ⲯeSÄF¦ô¢—…5¶Œ¢À�XV¢•VÁøNªR‹µ´W0ˆÍVYgË$:¶rƒ«¼x›Çsï2Ûè·ÐoSéDßÑDøÚ~ ÀVؽF¯qç$îpC„�‡Ý5íu³•?Ï¿JŒ(çgóo2U�T_‹ 4âÅRˆj³ÅM¬o„„q>çáEn¾‘wɾÐè Mž¨ÐäS•vðƒèˆ?9b×^÷Ë®=_4›å;é�¨{øµA³’¸–ȸ^­È/± Ù/¾>´ ìTà¢{Àëe»¤� ÚzD[%¦ýªæ…8¾ç‹‹�S`N@ ' °C»ðK”¢�!b…‹пᳩð»§a9³Dd–žX¦K»gi,µX�À<—ÄÓ^Ÿ°bŽs™ êX®Whƒ� Â^£¾mjâŠ|�k"¨<²áÐÚÛº!ŸÃð-·WÝÕÁÒšÂaÖmþEޏ!à¢gK9˪ÈN×Ùé:Ç‘!·‡Áíûå9¨4»ºwƒ×¬¸Ý£"7½¸p¹8€Ÿ]ÈÅ!çâàœ†Ãâ@Ø c‡9�iñ•,|‰p :\:‹Õò÷eîÏXpÄ„§ ›zÝôÍf›!üu}òÁçú4vªÍü²ËÕj·í7u�A¥øè®“½•x�˜9{ÞÕ<aˆ'Ôí6ò‰³S¡#û»½¡µÄ#oú;ÜÌÂ^èZ�Gµ�PàÞfÛ†¯Ž0£kq1´ƒ�·0{O¿,KpˆÃÚò“L†›�¥ªeÆ»­ÄšƒæLâƒ6˜_“ ÑU`àãù`BRá¼ Y€Ír'›ŠvÅå¿I,(ylM!haúŠÇË|Z>ŸV™RÔ3˜­m:”ÒÈ@/e€8Ô0I®E?È"Y¬e?ȽUc€:¾(Ÿq\Ãø+iÄK˜£0Ž¡Îj§`l¦äíå`*Âq  ÞSû€5|þË<äDÒŽ'€A—ÊÙ*�OVAHêlÈZŠC¼ Ž ˜äÒÑæòÈ Lð.òv¥×ácKUŠîoÓðÿ�jŒÓªYˆ•ÊPˆ £Žö‚œlbI9Þ«m�ö ¥ŽöÈäh·â"j¼qMŒ'F*‘0Õ,Þk•Ž~2!¦à( �ugÒÓQÞ?ÊmšLð1ÅS”OôeÒ,[Äýsø2@𢄠}F”ÏáKLpÁ« JñYM@zÿ|a¦Q¤ÚƒLöÄ•ÑÛðW>å£\ùQ”Îá•­ƒOØ y?G;àð˜ú$Ò'†æ¿äÏ'†ægû’O„4xWÙüH F¾é�ƒB- Çíb�2—®iY(Q€l‘(»–¤½�nX ÄA �*A1X 8�B¯\6¶Á· ë zXìFÆyÆ‚…A,l€G{^Yoúe{ËØ¡¾¥¬KÒô Ã%(w>-!@àÛ*?J¤¦7È€èÑÈÅ%~¡Ì»ÚNÓÃC+|:l¥¦'ÄD€¼³>ýWU@êQWG‘ §T¹‡ ‘/uªÜiL&'1“ªŽý\äõ£Tmu?Ù*Dm¨Ì±šÄ¿õ§ÛÐÚ#FI=\ ž‘Ò{}.§"Â!'3NVÖánŸ­.ëÖüt0,Èmäf”ƒ‘rÐs U‡…÷ø&MâKÉ-„=kí£òD…áIpÙË`H¸Ã�,°]ÂôŒÔrL(–eÀ·lÞJϳŽÆ—>ªø_M˜|ÒÿWÙ õßT¡'á8 ¼„¬ Âíâ¦Pª^:ÎNï!�i~ôlÌÙÑ ñ4!u2“5:b�­ŠªÊ…é·U9ô¦yàõ÷�4‘.zôj¾] ](:Q_,Wù‚‚�ÛÜç øÙá,̇›n³Æ^ T¼+,gVk~é‚ÅÛ¦m6tÏÅ)‡W_sÝ­×M»¨1Õð}k è‹1÷æd#¦ã]GïEç=øâ2Žž¹x•Õëâ!G6}³á%Ü> endobj 44 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 45 0 obj<>stream H‰|WÛrãÈ }÷Wø‘LYZö�—×ÔîæR[›‡x+Þ<Ð-qB‘^ìL¾"U“€¦¤ñÌÔT�©f  ~øÓßÍýaºûããÝ?Û{sÿørg̶ ÁÞgô/>zpù}^ù­ÍïOwÙýá.ÛfYfïwôëñíî)–1Ý8k¶y2¥!Y‡&uÛ’Ìé&Ûú¤ú‰ö¸|ë’¡Çîjk’ùØà±Ø†dÇ_ 'úc’ó2×3}Rwø&£1øï4àmº±¥®Œj^¾“µ>u–Ž™q Ç�o©óÛ*ÁYgëÔ–´ý5uak/ëâCMæéå8¶bn½–y›þóñ¯wfëóî7fk3î¼ÛpN*ää)ù â+2:xWO0^”í…žrÊ#_$¯mÀ;O×ëKßžøCÏ{?§H^àSIowHKÜ<ÑÀ3½¯8Êm‘ ç¹=µÿiö´R¤(Eg|a)ò)Ê%tK_uM=Æ ó±ž9ÚÍU¸FÂåh�D;¥’[Gß×#¥9;ÂnE.^¿ýl¤Vï© {ÂóŽŸeEv“Ë>ã[M mØ«í®û”–�l>¬é•}<¬Ó�¸±PÅGñõxÊñDHI¤Ó&#§« O(Ø>~4ôë² mhQV°’mº Ê*ùsŠÄ~-Îj‘,n™ÌÞAÆ8Ib7¤6§òyCú`¦«ðÆ­·€ý^rCðŸè‚kAƒ7𦾼ÔÈßzš±‹S Cç®�gÆ�7¨¤eZ8­´©LNõ¿pz¡§O²ÚN $Ìg�;M¿k( yPþ65«§íÄ�>þ�bz›ë2–+Ì¢Sx)8Ïù/-N—Ý oñH™Gl ÝQ’fBä9Aœ/µðžÜ¥•Üï‰PØ(—5I²8~šëQ“Až�Õ²šjõàyŸ½ ›ç]òFÜE÷;ÿwºº`s}ÁZ%ý0  g”Jb×LS=~¨ä UÏ Ñ*®$Ž"Æá<@0 ÆOt—ýáA"Èå»x~ 22 à Ά_š7�Ç¿'Ñ›æ—Nþ(«Å¿gýžÆmk²¾ŽãH}gå¡Aˆ,\è$4ïˆ!˜ñKЏçênš}×}¦0qÖS†?s<.‹h�O{• ÝÜ¿ãâë¼[Íû/ åÁZÀlAõ2åY2f ‹†£�Ú=l‹ÀY²t³°0¨•YØZ øŠ:6'X͈ã6†Aá²øìdó å̃¬”‰å~µëêij˜_²ó ³xIÀç‘‘À e70ª >(©Û^Z�G½Ä¸¤V878å ´¦�‹ä¿¢§d2ÈÇ£L€ 0/DéB`u«3€¬�ߌ.ÏòN%¹ ,)·,Ý>É€EÊC­±V´ê†›Šr±¢vcC€Û_Zþ¥Ù�ÚÕUÙr�Èl¡Ê=âàÅáÔ8šIôk‰Au¯àX¾jÇøI{èÛÏ»ú¢"œ—XxŠ=9jOb°ó÷鿼ÐìÞ†'�lmž¯e|Ýbi¡�›£1™@‰LIë“ì Ò LìÞ˜u«VŸ®,5óQˆÞ&:×ø÷­l<ó˜vKÅßÕ�z“+%!ù´ùz"{Hý}æ9QÄ&'ú 9è¿.¥¨¨_’wͤláYK/¬c†‘JAñÉûteŸø®�â±-¥¿ÙãUê–ßãI�H1r»žeþbÊÅ-ÿ"uÇ–BöùJöNIO;��dÏ¢ö.œÏ¨”UݾBܳþ>ʘØ�×î¶–ëótՉ׫ vR—�­ØÆôš£:(Ëáýiç÷²é‰lVÜ „ I ÒZ{QÅVlK/3"Y3Õ¢øp=’g~=QÕŠ\¦oTçF¡lâ8WÆqŽ*ßMY�„ %©–ås.òÙ Sá¼Õ¬ØŠSªzpÖou³Œ£FÆQƒÑj¢¬tûúŠÂçÂIˆSÜ•þÅ*Ë5(à�ÿ¹=xŠ Vuf­׳ŠÁ¸Kv*v I¨ì /‡ci”wqÄ*]Y}¥cÖ<ú‘oFõÐ ²¡8|>“lIÎDq㢸Qæ9L'µÃœoC!òJ¬äªó$þݯó»zULœÇ þT1_A·E{—0ª‡:jtÈ|ÕìÐ~¸ûéñîÿ ò$0Š endstream endobj 46 0 obj<> endobj 47 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 48 0 obj<>stream H‰„WÛrÛ8}÷Wø¬ 9Ä�ö-™xl'ëd*VíÖ–3´DKK”W—d’�È7OŸnPR${·\e‘Ð@wŸ>}ðËå­>Ÿ®ÏÞŒÎ~ùÍ�ëóÑÙ® £½;/éoxÖZ¶:¯¢+Lu>Zœ•çÓ³¼,ʲ¤×1½Ž¾žÝ©Om–ÛB«‡ô»J¿ý8=¬³?Fïh+“¶ÒEôÞÈVéYcOw^Uu¶âm´Å6wêNÿ‘å.²õ.££ŠYîKC�oðÅ«¦ŸÌÛÕ+újMaÕ'líT1¬K³ºvÕ7㌦8õØa¶ÇãmVõ~ò¯™%³¶ÇÇæ0±ÝU»X´«uqªÁF•ê'˜ iÂû�™›f²n{v^^ûú<§ ¥ó磷gðÏÀ=õYéýç,ýIAŠ$[”µF:ÒT]K(.æmæ�qVªMæÉ§UF>Dµ\4Ó¾•OùSÑ”ÜV”Bõ1£�µzJƒ‹î{“—=Íñšœ¿È ýÿëi¾ìÒX?Ö¿Î|Eë§Ó´U»^w_Úaôö‰N¤(ª|®Ýç²bUó”sòä" %ꉶ(Äë ¨‰Nqúú"s´íð?·¶"Ó£,àT+öµé×Y… ZzÚ\S GÊ!M[f<ü5³žL5òö%#{rrò³"ÞÌZ^·\}ƒQOÒ†ò�@„ÓÌ B‚uû=e±üÏξÎeBírCT¢s„ S”¶®v~û„{Üבœ½Èpø§åéŠ< â4 ¶¼3RYÖ4øY‘¯‘PUB•Ô^‚U,Œu Vw”W %r=Euh5_Þ#‰ .ÉîÇFÙŒåó²ÿÒ2‚š¶ý‡�›@›W=`ãT»úÒ`�嬈�¾™“Q™ `Z`d`Òœ-3 dTöê�g/W8¼Ž!V Yä²õ!²8†Zbø´Ý0lhgň&´G°Q¥÷Ø”�±í'y‡ ì&"˃ìGàx8͘ãQ>¯“ó%û“�-Œ�öÓQÎõæz·%^I^­rÚçŽ>ŠgÚuí_D‡}§ð":ôÿGGELè¸ä¤Ì¥nî¹Æ9 Ê%s‰Ýs‰M\By jK‘¨ÔzN�‰Lj…¾FØTtЂšBWªn-F [VÎÚÁÖb;ßgÞ…p̪C„±®fÄ5émŸ>,ûas+ˆ"_·?§-e(õ>ke²ùa» Þ˜ˆyé´žqiá°±¢á¦ˆFн™ÉlYÙlºÇ¡ì¬ãÄ#ƒÆÕ¹©Ë”øXøè…Ü3‰wÏ$>ÄÓÃ>éÑœ&ÝUÜ�ÿGÒ]‰Õ‡¤gˆÙAæùéw%*j+™w%úÊu)ÿ)óö^gÑÛç¿[GÕCÅgSñ°"H‚à†B s«q;—ˆ™ºð�Tʆ¼½•<2-? û§fÀò`QË×Ã~ÌcÅîó™üUZAPÿɈÂAMb1õ§Œ-ñh(zOÍT F†’NBà…Ìú]fß %CLÉî.ÔÉQr� 4¸OoušÞ«pÀ?N¶ú”±òi…r9Éܶ‰á×[*BçQÉœ=#Ù3Cö0Äâ6‰¸k5Ù­{i;��\râÑZd'b;3¥HžÄóIªnâÃ@ à £ù¡›n‰ÃY†8’õ3t¨óÇPTpê¿s®ä-½€wÃÏ=´¡Q*Sá3ľA«3@ó†kœÀV‘Hf—ýƒ,\¥õcþÁ,‹Y?²öd²L™ËÏýŠö`†´Pª9ÑÞ~UnfÂP¯Ho·ÚÌ&¤Y‚bIRqbó©Äçc>L5Ã^™Q °á`•CVi”uQÍ•Q©ùüGÒ6–ÎïјM-sÕM¦2)Uˆ%aÎ¥?OjÉ1_=A½JP¯¡Õ èÌ™é`/$X‹—€ _, $sõÔéqª™¯{Q´-õ—}çñÂ?øáÀ,„ŽuBE5?ìãe=àÉÑb°ˆ(C+"9Ð�ùU>R7C䮚ù<…¬RÚ!‹0�…e²ð;² G°ãþŸzW¿AWRy1‚êùj²jÂDL¤IšPt�¯7ø>ù£Üªí_Ý:MêÑ]Q Ò –ôdpŒõr¾ý¹u€84š»|^ÊÌ”êD}>ïú–Û‘d š0r²Ô^<ìˆÃ×$Ž‰Ã†D-šúqŽH¬¥•œÐGUÆ,•)·×¯o…A½[nW¢%±AbDhA­~ÈX ¡í3ϲndRgdh‘SK_sDÕ¬%,¬‚€�$jUi�W”q‘–ïNÚHj�w!!ƒA� %ïøw¹–«�AÉW|ºHœlDôWº”–RC&–'(¡l»Ü"ˆ~vꨜ¬Fˆ¬\X:†Hh¥Å ™KȬ˜"õÚÉb1÷]jPŽ€$jÖ€Žê˜›bq$+“ùqEI‚º©¥þ­ˆêQˆÖðfŽI!€?â Q=¥5ä‡Z d�•rf20üÔˆÕÕXðŒÙ�þE:T-“¢&ÿÿAâ�ìÁ[›ð}o»1ÚP%¬l•Ìœ±ßÍv¿íŠcP#mè ¢B7,NŠfÎr™¡'“̲ü­Í–_Yâ1†ƒb¡B9¹áµs§Ë„5­nV+uû¸W) +DKr0ô;Ñ_&Ýu‹Ú�Š…º®ÜA§KÜùërñÄÍI«F~D:#ŒT� äbÊÚL¤EÝlE7ëÝ­‡‡~Ë*È»m?Þ­{æÚc£9¼~¦Öõæz$ò*rkn>ºÒÇ)2BÔ5]6úóL“æô¤�énYëÊîæ±ÛJטs1:û[€ü¬ endstream endobj 49 0 obj<> endobj 50 0 obj<> endobj 51 0 obj<>stream H‰P[´®¡8Œ]:Ú/éÑÅ\gÖêϽö:ßÙ{çlJ0ÏE@Q”l‡ÿvÿ?~' xç{¯1r°”cÉ<‡§lq1þ|ÞyXìBðòö]$p¡¨À÷RR³Ó” µÜ+à·rŸõë×É·$Å¥)cc’åÁ1jE\RŒš*yhJ¬2N�½Z¾E¥’ï|}"]¾3.=.M·ÿ (�+%� ®$,ä% $‚pÁIÁ+*ƒtñriwq kç­œwTä*2ˆ®ÍÍE€Æ]NŒ–ŸCÍÔ³q!< Fº¢×”JÕräM •ð¬a æ;2ˆêjKJÊ™òâc9ᇠaˆ<…CÔ3$<ßA¿ ?ñéÇ9 74¹ö»l¶@w¤¨ëkò8�“¥]䲚!½d>ñ �B‡ EL‘ñHUýðHeäVã>GùþþË-py®˜)3(tA& CâºFÜÔ”�µ»¸7ªÕ8C‹ˆ�Ø%Ú ¬V7â:x$Ö⌦&ÜX‡Ü5V§›•ê{M�„-\§ÊO¼‚¾ß³¡qKE­JÑr þz¯ÝÌvãoìD[of�eíLO†¹îëÆGã¼a2N+ëŸk¸üQ�žZîTµ°_L\kæjváÍÛ˜Ø'/½¥ Ô&²îØæè²�âÃÉ»+„«NºM_’Šb÷…¥{³‰’¶s¸í"÷²J¯ËóFŠD±±ï`b]gSH¼u5Ýœ;¾?>ÿ·�:ûÔ�…pöÒõ¦~[}�ôÒèØù20ÿíÛăÈ6®õ�üòH�¥ÓÔs&ç¡íW[N³?Ø7®[îïGÜÈŽ,"‹EyùXŸÆ88q;l©ÄºÌˆ¼,iáQ?œÃ’@±»¦ã¡çÙÅVêæSØ÷!|é»Ã!o�?LJíÚl>«àN¶4ÙºÔMRSÆz? 1,ýaúÇûÛ'W6rw­c×¾e¾õ].ßâß’ÓÚinlï>P—Q‚Î÷ß6g[' WlMŽÑæpI*µþ£bi–¡ÐpˆÑVâÄGKlŽh>³ë·„ädi3®ÐðE[€Èõ—±¢D8ñŸXþ&¤æ›*Å£ìh)ÖMq6µd“®º›»ÿ¶L²Ù!¢_ŠÈ1 oèù´=Uc¦~²�~ZrÇ]\Û[ÐÏ‚Çä÷¦ê#Æ"½ær÷Gå}Âîˆ4Õ¨¸ò=6°‡p~6G%Ù8¯¾ÂXVQŽL5=#Sì…¶¨¬J®!¡4j?oø$eJÊŠU…±ïÐ7®æ ÆÏp km<ÞÙ�\›™} `¯Ï�µ �³ðH×=#nÍQÆq¼<ÇRëwÓ½­Ô©Y(›‚Ð÷�Ý8ù5îé»ÌšuŠ&.Z_¬Ìg’š6o¯îù[ôi‘eä×DEšaQЬýLíW¨÷Ë/ú2°ÄkšöFEªÐä–ØmÍåÔúk=Ì“s7ow|ªøYâqt8Ž÷d& ¨OÙ{Xw�Å1v�� Bf„£ã]Y�KrLœ¦*)Mãv—*uõR•XID�âRSõD]…´¼ú6± ¯ HDÄÄ;�ønd pÔШAv ¬h·Óãü?ìpºñFGáâ°¦à}¡íÚðæñïέ^ö®ÿªøZeK2jДé/í—’7v¥ú‡2Ä„ ŸÜqYÙŸÓ€ÖJÞ='%kfèä†ôöÌå‰Þoî\ Û¹#ùÓezomÈ—Ö>sàcfÓ†¿¬÷õûúÞ­ c]¯5tÎÞ³:7² endstream endobj 52 0 obj<> endobj 53 0 obj<> endobj 54 0 obj<>stream H‰dPL¾+´=»‚£ÂŽãî`ȲΈR�鶬Ȇ›d¸AÜŒ;ZJc�®-S J;èÝõŽ�¶ØXœ.Ñ F’‰h¶Ôl˜E�1YÔé“ÅÅÅ�øŽ¾nXâ�øÇK¾÷¾÷ò½ï#‰L A’dv�õkíž�UµÕûK]ž«E¤š—©ò1 Fûî∺„ÞÕ0¸æBRÊ!(’Ì¢¶Tï9ã±ymnG³ßêrÞÇ^—³åïf…ø/ãôu´¶Úü®ö6»ËçqÛ:=Þv{G“¥«j÷tÞ_åKª6𥕕åüöV‡×ÕdkãkmþÇòm“ÍÍïkor9ü��ðÛÝn~ïò…�ßëð9¼‡ö;i?ƒZ2c5É“ûIBŸvL艡’AM–&¦¹½tOf¼Ù<³X4Áè~'¡æZ†ú:³h6‰r,)8«S¢‘Ø� ç|¯áÓZÐPH@}H¢Õ:È�Q¨‚jVQ$E¦ã!©÷¨ ûYs%�ÜtR/c¾-¸™ÆÀœ€Rìfß²¿P¤ã½£]Ñõoñ_Òâewo™`ª®àè`{N6à› N„éhA _  Ê7Ù’¨¿Š ¬ŸB Ctjñ4ÖànV„p˜Ĥøˆ,Ecìü÷8©¡ð,<:›Y84Á¬RÒ’}73f¡Ë¤Hò±av#POBnpæÁìó�T­´ºõÕ%p�½k¯�aJVdyhÙnw· +е{¶ ­(>Ž3�x‘ò¡%ˆXN§ 3©(Ãyök4Ïcáïë©`,"ž*–âÜ?¯¨�73ÔKLòY“jxQÍÁ2˜gŸ³ KîPÑ~1r¤ '¸À€æ~Cê{Ì�EŽ‚<œ½„É”•Nm}!eÀ¼Î>‡k·¡á1$(Q¦³ˆJ£c²$Ël$rõ³oAV‚™i¸H½–(T@9�½¤™«˜c’áLæ“Læí46A|£õêìë‹v¢¾•8¼áÖ¤néÔê¯Úᨬ§eI ÅÙTóâ­:­úç!Æ%‚7Ž|wà\×—�“›©s:Ì‚I-ƒu~Q<æÄ°ôZ­¾y·%5–º£ ôJ"Ý“N³é7¶(O¥¥ŒÖ˜ Á›Ôó°)#É0h6íz¥óÙµ#¡Çuî�>ç’—õ_¼3 ùl‚A_ƒÖ½ýÒnîÞeýÿ™Ì3êy}ö«ã:;ÇõìÄÎøèÈ’ñ�Ã̪©a£1]Yl'ÝÜ<žËzvo3ý%ÀT"áÏ endstream endobj 55 0 obj<> endobj 56 0 obj<> endobj 57 0 obj<> endobj 58 0 obj<> endobj 59 0 obj<> endobj 60 0 obj<> endobj 61 0 obj<>stream Acrobat Distiller 7.0.5 (Windows) 2007-08-23T21:01:44+02:00 2007-08-23T21:01:44+02:00 dvips(k) 5.95a Copyright 2005 Radical Eye Software application/pdf paper.dvi uuid:95f26a86-9547-4033-bc7e-367a35527daa uuid:1bec38e8-e050-4f6c-9d4f-acc564f4b367 endstream endobj 62 0 obj<> endobj xref 0 63 0000000000 65535 f 0000049105 00000 n 0000049231 00000 n 0000049363 00000 n 0000053149 00000 n 0000053275 00000 n 0000053428 00000 n 0000057201 00000 n 0000057327 00000 n 0000057521 00000 n 0000061262 00000 n 0000061391 00000 n 0000061575 00000 n 0000065391 00000 n 0000065520 00000 n 0000065694 00000 n 0000070591 00000 n 0000070720 00000 n 0000070864 00000 n 0000074720 00000 n 0000074849 00000 n 0000075033 00000 n 0000078775 00000 n 0000078904 00000 n 0000079028 00000 n 0000079897 00000 n 0000080026 00000 n 0000080171 00000 n 0000082006 00000 n 0000082135 00000 n 0000082290 00000 n 0000084543 00000 n 0000084672 00000 n 0000084847 00000 n 0000086929 00000 n 0000087058 00000 n 0000087233 00000 n 0000089131 00000 n 0000089260 00000 n 0000089353 00000 n 0000091269 00000 n 0000091398 00000 n 0000091501 00000 n 0000093317 00000 n 0000093446 00000 n 0000093529 00000 n 0000096297 00000 n 0000096426 00000 n 0000096529 00000 n 0000099013 00000 n 0000099230 00000 n 0000099500 00000 n 0000101257 00000 n 0000101419 00000 n 0000101695 00000 n 0000102755 00000 n 0000102892 00000 n 0000102927 00000 n 0000102951 00000 n 0000103011 00000 n 0000103138 00000 n 0000103246 00000 n 0000106739 00000 n trailer <> startxref 116 %%EOF stevengj-nlopt-88c424d/src/algs/stogo/prog.cc000066400000000000000000000157111521061417600211710ustar00rootroot00000000000000/* A simple program to test the global optimizer. */ #include "global.h" #include "tools.h" #include "testfun.h" #define STRLEN_MAX 80 int main() { bool AVfail, AVflag; int testfnc, dim, axis, i; double AVbest; Pdom Dom; Pgrad Grad; Pobj Obj; cout << "Global Optimizer v0.1" << endl; cout << "1. Rosenbrock (min=0)" << endl; cout << "2. McCormick (min=-1.91)" << endl; cout << "3. Box & Betts (min=0)" << endl; cout << "4. Paviani (min=-45.7)" << endl; cout << "5. Extended Beale (min=0)" << endl; cout << "6. Three-hump Camel (min=0)" << endl; cout << "7. Jacobsen & Pedersen (min=3)" << endl; cout << "8. Poly1 (min=0)" << endl; cout << "9. Six-hump Camel (min=-1.03) " << endl; cout << "10. One-dimensional (min=-23.58)" << endl; cout << "11. Kowalik (min=0.0003075)" << endl; cout << "12. Hansen (min=-176.54)" << endl; cout << "13. Shubert (min=-24.06)" << endl; cout << "14. Griewank (min=0)" << endl; cout << "15. Levy4 (min=-21.502)" << endl; cout << "16. Levy5 (min=-11.504)" << endl; cout << "17. Levy6 (min=-11.504)" << endl; cout << "18. Levy7 (min=-11.504)" << endl; cout << "19. Rastrigin (min=0)" << endl; cout << "20. Trid" << endl; cout << "21. Perm(4,50)" << endl; cout << "22. Perm(4,0.5)" << endl; cout << "23. Powersum(8,18,44,114)" << endl; cout << "24. Schwefel (min=-12569.5)" << endl; cout << "25. Shekel (-10.0)" << endl; cout << endl << "Select test function :"; cin >> testfnc; switch (testfnc) { case 10: dim=1; Dom=Domain_OneDim; Obj=Objective_OneDim; Grad=Gradient_OneDim; break; case 1: dim=2; Dom=Domain_Rosenbrock; Obj=Objective_Rosenbrock; Grad=Gradient_Rosenbrock; break; case 8: dim=2; Dom=Domain_Poly1; Obj=Objective_Poly1; Grad=Gradient_Poly1; break; case 7: dim=2; Dom=Domain_Jacobsen; Obj=Objective_Jacobsen; Grad=Gradient_Jacobsen; break; case 6: dim=2; Dom=Domain_Camel3; Obj=Objective_Camel3; Grad=Gradient_Camel3; break; case 5: dim=2; Dom=Domain_Beale3; Obj=Objective_Beale3; Grad=Gradient_Beale3; break; case 4: dim=10; Dom=Domain_Paviani; Obj=Objective_Paviani; Grad=Gradient_Paviani; break; case 12: dim=2; Dom=Domain_Hansen; Obj=Objective_Hansen; Grad=Gradient_Hansen; break; case 13: dim=2; Dom=Domain_Shubert; Obj=Objective_Shubert; Grad=Gradient_Shubert; break; case 11: dim=4; Dom=Domain_Kowalik; Obj=Objective_Kowalik; Grad=Gradient_Kowalik; break; case 9: dim=2; Dom=Domain_Camel6; Obj=Objective_Camel6; Grad=Gradient_Camel6; break; case 2: dim=2; Dom=Domain_McCormick; Obj=Objective_McCormick; Grad=Gradient_McCormick; break; case 3: dim=3; Dom=Domain_BoxBetts; Obj=Objective_BoxBetts; Grad=Gradient_BoxBetts; break; case 14: dim=10; Dom=Domain_Griewank; Obj=Objective_Griewank; Grad=Gradient_Griewank; break; case 15: dim=4; Dom=Domain_Levy; Obj=Objective_Levy; Grad=Gradient_Levy; break; case 16: dim=5; Dom=Domain_Levy; Obj=Objective_Levy; Grad=Gradient_Levy; break; case 17: dim=6; Dom=Domain_Levy; Obj=Objective_Levy; Grad=Gradient_Levy; break; case 18: dim=7; Dom=Domain_Levy; Obj=Objective_Levy; Grad=Gradient_Levy; break; case 19: cout << "Enter problem dimension "; int rast_dim; cin >> rast_dim; dim=rast_dim; Dom=Domain_Rastrigin; Obj=Objective_Rastrigin; Grad=Gradient_Rastrigin; break; case 20: cout << "Enter problem dimension (two or larger) "; int trid_dim; cin >> trid_dim; dim=trid_dim; Dom=Domain_Trid; Obj=Objective_Trid; Grad=Gradient_Trid; break; case 21: dim=4; Dom=Domain_Perm; Obj=Objective_Perm_4_50; Grad=Gradient_Perm_4_50; break; case 22: dim=4; Dom=Domain_Perm; Obj=Objective_Perm_4_05; Grad=Gradient_Perm_4_05; break; case 23: dim=4; Dom=Domain_Powersum; Obj=Objective_Powersum; Grad=Gradient_Powersum; break; case 24: cout << "Enter problem dimension "; int schwef_dim; cin >> schwef_dim; dim=schwef_dim; Dom=Domain_Schwefel; Obj=Objective_Schwefel; Grad=Gradient_Schwefel; break; case 25: dim=4; Dom=Domain_Shekel; Obj=Objective_Shekel; Grad=Gradient_Shekel; break; default: cout << "Error : Function not defined" << endl; exit(1); } cout << "Dimension=" <> params.maxtime; if (params.maxtime<1) { cout << "Warning: time limit set to 1 second\n"; } params.maxeval = 0; cout << "Use factory settings (y/n) "; char str[STRLEN_MAX]; cin >> str; if (str[0]=='y') { params.det_pnts=2*dim+1; params.rnd_pnts=0; params.eps_cl=0.1; params.rshift=0.3; params.mu=1.0E-4; AVflag=FALSE; } else { cout << "Number of deterministic points "; cin >> params.det_pnts; cout << "Numer of stochastic points "; cin >> params.rnd_pnts; cout << "Radius of attraction "; cin >> params.eps_cl; cout << "Parameter rshift "; cin >> params.rshift; cout << "Parameter mu "; cin >> params.mu; cout << "Use the AV initialization (y/n) "; cin >> str; if (str[0]=='y') AVflag=TRUE; else AVflag=FALSE; } Global Problem(D,Obj, Grad, params); RVector x_av(dim); if (AVflag==TRUE) { cout << "Enter time limit for each coordinate direction (seconds) "; cin >> params.maxtime; if (params.maxtime<1) { cout << "Warning: time limit set to 1 second\n"; } params.maxeval = 0; params.det_pnts=3; TBox I(1); Global AV(I, Obj, Grad, params); x_av=0.0; AVfail=FALSE; for (axis=0; axis(xy.GetLength()), xy.raw_data_const(), grad.raw_data(), my_data); break; case OBJECTIVE_ONLY: val = my_func(static_cast(xy.GetLength()), xy.raw_data_const(), NULL, my_data); break; } if (Domain.InsideBox(xy) && (val < minf)) { minf = val; copy(xy, bestx); } return val; } bool NoMinimizers() override { return minf >= DBL_MAX; } double OneMinimizer(RCRVector x) override { copy(bestx, x); return minf; } }; } // namespace int stogo_minimize(int n, objective_func fgrad, void *data, double *x, double *minf, const double *l, const double *u, #ifdef NLOPT_UTIL_H nlopt_stopping *stop, #else long int maxeval, double maxtime, #endif int nrandom) { GlobalParams params; // FIXME: WTF do these parameters mean? params.rnd_pnts=nrandom; params.det_pnts=2*n+1 - nrandom; params.eps_cl=0.1; params.rshift=0.3; params.mu=1.0E-4; params.stop = stop; TBox D(n); for (int i = 0; i < n; ++i) { D.lb(i) = l[i]; D.ub(i) = u[i]; } MyGlobal Problem(D, params, fgrad, data); RVector dummyvec(n); Problem.Search(-1, dummyvec); if (Problem.NoMinimizers()) return 0; *minf = Problem.OneMinimizer(dummyvec); for (int i = 0; i < n; ++i) x[i] = dummyvec(i); return 1; } stevengj-nlopt-88c424d/src/algs/stogo/stogo.h000066400000000000000000000041431521061417600212140ustar00rootroot00000000000000/* A C-callable front-end to the StoGO global-optimization library. -- Steven G. Johnson */ #ifndef STOGO_H #define STOGO_H #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif typedef double (*objective_func)(unsigned n, const double *x, double *grad, void *data); /* search for the global minimum of the function fgrad(n, x, grad, data) inside a simple n-dimensional hyperrectangle. Input: n: dimension of search space (number of decision variables) fgrad: the objective function of the form fgrad(n, x, grad, data), returning the objective function at x, where n: dimension of search space x: pointer to array of length n, point to evaluate grad: if non-NULL, an array of length n which should on return be the gradient d(fgrad)/dx [ if NULL, grad should be ignored ] data: arbitrary data pointer, whose value is the data argument of stogo_minimize data: arbitrary pointer to any auxiliary data needed by fgrad l, u: arrays of length n giving the lower and upper bounds of the search space maxeval: if nonzero, a maximum number of fgrad evaluations maxtime: if nonzero, a maximum time (in seconds) -- REPLACED in NLopt by nlopt_stopping *stop nrandom: number of randomized search points to use per box, in addition to 2*n+1 deterministic search points (0 for a deterministic algorithm). Output: minf: the minimum value of the objective function found x: pointer to array of length n, giving the location of the minimum Return value: 0 if no minimum found, 1 otherwise. */ int stogo_minimize(int n, objective_func fgrad, void *data, double *x, double *minf, const double *l, const double *u, #ifdef NLOPT_UTIL_H nlopt_stopping *stop, #else long int maxeval, double maxtime, #endif int nrandom); extern int stogo_verbose; /* set to nonzero for verbose output */ #ifdef __cplusplus } #endif #endif stevengj-nlopt-88c424d/src/algs/stogo/stogo_config.h000066400000000000000000000007061521061417600225420ustar00rootroot00000000000000#ifndef STOGO_CONFIG_H #define STOGO_CONFIG_H /* Compiler flags to enable/disable various options in the code */ /* To obtain extra information on the global search process: */ /* #define GS_DEBUG */ /* To obtain info on the local search process: */ /* #define LS_DEBUG */ /* Initialization strategy in the local search (INI1,INI2 or INI3) */ #define INI2 /* Use the more pessimistic strategy for lower bound estimation */ /* #define LB2 */ #endif stevengj-nlopt-88c424d/src/algs/stogo/techreport.pdf000066400000000000000000003537211521061417600225730ustar00rootroot00000000000000%PDF-1.4 %Çì�¢ 5 0 obj <> stream xœÅ\Y“Çqv„Þ6ü"ÿ‚ñg,L³îCá‘TH°-[V¡CzvqQÀX` �¿Þ™ufUgÏ.Û ‡ÌAouUVVž_fõÛ�XäNàÿ•ÿ^¼:ûú~÷ìÝ™Øýþ÷ììí™Lvå?¯vߜà°SbqN¹ÝùÓ³ü²„1a1aç‚_DØ�¿:{¸ÿÕá¨b\|0ûoG±¨`¼uû_ào-…·øS µhá÷¿?ˆ%¼ß_ã©£Qfÿ:ý>¸°–;Xcóˆ<•&×F5ü~’W’ÖïŸÔ„j˜üº Ðaÿ›C¥ï%Ámm�–yœö#…–¡.Ÿfy™gÁíÿ«oóM-¢Ônÿžþ"Oï”Õ±R«U}œWý)�wÂEUWŠÂÖi¼prO©¼êTþåüßàäà ¥Y´q �Îù%ÊwGm‹?Î/áÔÀî•wñÂ\>³g‰QÁž¥ŸÚj»¿Ic½±ŒõAy¤G+¹„÷ÿ�cƒwÎÐd²÷ýçÅAY`˜RûçiZ‹[x”36ÓÂfÆJEŸ¾>À¢Ò„ý�‡#¬®¢‘e×j—òj’Àª¸¸�QˆÞç-ÿìp´KÁs\‚_Àµ;¯°t]ÂCéëÜþßá©0"åp¬S ȾÝÿ€#@%€5¿1TB2ÕeŸêÝA.ÆÄ()ßòR©jvR.ÑÚDèQ)»; ï •©üNí,r÷1,ç¼U03H¹Ú ï ìIÀáÀ‰5ÚIÔ&³+@%/½¹ÎC 0±³¨¯l ¼Ø�º*üsq"Âb6«aI`�ñÚâI�€, 5ÖÐé pè0¡ñY¡€8¯­÷_ ­ðJXš£2~ÑÞì¿�§A€¨élÊ`2ÛUZ¬AYÕÔUáÑw¬‘–}ã’G|Ý_¹©#Ó»`f Ê…Òž:8uÔ ;¿¬Óp"ek°ÍØé)}ЬT‹wÛfI�7Ò@!Gך?Ý�‡ »Ö-ÙBŒ¨š#|0ª$îý‚�ù´ÇåVÝN‚¦ä’zÊ®õ”àê°‹œX-“ÿÊÁ…þBëñf ¡ªÎÜ nx½éä]_3ö¬¦ˆäáS4¥t_mË+„SK€(éŠÑ—øgtÙÕ+{úˆ£fü)¨åf™Sg›T`<ÛäÀ5ë¼;'UçãõRc´CÀiTF&½$¢Ü�u�¸rŠª+*SWÕÊ9íÿ^ªœÔÒCÑÔfb“6EN@™éUµÄ9d}Iu¥J3ž"ø2㙀]óþ`½èê�O[¤tÈ`FM{š5#oxt¦D!ðA³MŽÌ´ÒéçMó6Ý41¦"óÕ`#48#“A–êlnư*�$†=¦nëÔñ'”_ƒ¸½«£ 7Î�pz# í’E…µÊÝÒ„Ù¹å“ÛF aX7+7œ¶]T~âËàqÝËÖxÕ ~¹­BÜùÓÌ-©OøØÊ.6ój¶àÿÙ‡¦ÐKëÉÏdiĈ:¥n#X 2lÝJõV©¡àñ¸©’ãF虌÷úñ”оràm3†7œïÊÞbUÍ fkFj¹J\P¬]XGTÂ`dnš¹ØJñ'ùNïFh .3ÞΔ?á=…r0T €Õ>@|+¥2‹¶ûûðº·� £À–X01ï1>sF¥³²‚ÌRÈÿ£Õ lÀ˜Î ùíg�‚¬%¼À_Ò«¢-RŸÃ‘ü�|¨ d ‘ï#'Ä� _r¨3q2pò¨ŠöS!ç “†ôhÀéöMGÑJwòJÍúÐÕ+\1.ApáÛ”¢7ê4Q)’«g�r ðq$P,Í–›^1«Le³¯ƒLð0eœ3ˆ0 b�žÎpUû.UT)mËBÊm `yÅWŽ®½Õ+C0�§À„™°¨»ÉGY­‚WU¬'¤[�C°0�«ÄŠ… ¡·4)/ ž­³áe÷û›¸@Ïl‹ˆÈ5$ c³�Î$�>:Bù=õe„Ì5K+°‚µ zV®ˆ #@÷Â�=ëœQ’•gÏjæD»®ðìÖÀô3$¾F£gQƒ×X8_·ŽVŠ”MH $±VØíÌ®NóF'‰ ¦y� Pÿrv]ÃÌX#5–ßw8ÿ!—iè|z˜ïŸ/2 –¾þ7e‚„Ír„AZ’[ì å6ì›A‘àþÂQ H�$Ù`¡®…ÿ”ƒjíCrØy”&)‡*$ò0¥Ñ�òTCMþ¢5Ëò¼¾g4x‚�÷ ¶(½‡êqŒ/úV·„ÒŽbzl˜ÑȪÕ=Þ ר' æÈKïpÍ~‰Ä8ÎB¦åÉaC´²hþšÝ´\ “Eéöã¦io®ø°lÏK¶è4­¦Lj&àÿÖˆ¸yÙ"8ÎïÞlòlŽ…?"‰p–PL6¢ÊVraíÀòåö)§k‘Ú …zžõÇÝ.WIÒ±¼‚ –E€Vi"£'­ ô.ïÊé�px(u¢î5»•®ô¡%ÅJè,¥B$ô†ZC,-Ãáʲs, ®à¼I!nggÊùÅ@€Q'v¥17< èå`rÛ"Kˆó¸Õ k¢SåÕÄøQšÎ€ÂVO�{³”°)§EÂÇ”B½¡îî]èU1ñNÎg ˆøÅ)2ÆS“"n»ü|ja#i$¸Ã6æŠKH;ƒÈ^áÙ�ä`n`&3²âguN©è[ Šè\ÿ-lGù krczޤ×%¤ ÃzÉ4å½RšEð›…Öª“cͦ\¨ÔTI|w¿]ã,�z—U¤ÌÅ©Ê9”†R¶®4§AiIH˜GÇW±®À“5teM& qk{B#åY—ú_°ÔJÅ�…ÓÜû£G5]ÊšU+Á…Ê€U;´÷¦„?Ußß:a˜ð "p‚Ú«>ü�˜4šŒ$ªÅõ2¾B¤ø55r9¹¢vZ•دÚ_­âF3G¦›¡äÃVöCáæf¯á„lscÁW[éÙ©]ßf­ù‘iÕHELMBe8¶ù€zjË1™w^˜›–­ ÆÊï2²r*<Å&±:ä!JäÈýÑ{@¤ ÇUZAeØâÆX\§®À£JîYñ~‹—fˆä¦ž EÅYZö¸ê‹àR® ¨~~oÍDåN­ÓèÞw‘š-XãƒÀ¿ˆ‹RÛe¦!…PÃ838åt•¦œ&‹Úë×¾«ÇÐMcòµõ!fú ¡?t†G]€8eUYá”uôiut +¢MÿäP{×”wªR±ΰlXkpSì.4¢Òµì�ý¯Y7Ìã×õT­­Éžó��Ìx �Ñ;è0ÏZ€Gós5K�ÞÊîo¯3]�ä„)³3L‹©‹éuÔĹÇ<{�³[kƒy¯8‘‰´³ŠÄÞ9àvØk9!\\ÍÉ;dñœ¼kÉÈ;ÌžåÝ ¡fy7°œŒŸ"ïäß?áOТ˜ 6Uã®óTp‰ãe«aiJ1BòGP™!ôÙ*0¥ê©¼˜{ܰÆ7æBªJNU¤”úntz<áìÜ8„ÜGCP*ï[Ibç�f-ʳEuÜ£…=šÑë<*8#Ĺ«.¿±ZÝ«Ñ-[‡Þ…GóàÈÛ ËO)E¢SLN Ø‘�‘wØÓœm­!D“=zjú[ Ýñ‰UÔêhé¦uÇÞl‰²á´Þl$"£IHäȸΎ‚|CÈaädþ±‰ýÐë•32½‘L¶/`•ˆf ƒÿP¬³‰Û -¾ÍPþ¡â‡Å ÓŠ CwƘü ÚøuYxB»JŽåÇÚABİ!ô’QmyÔ´Žž!œDç§ ê�¦gsCÆÇÂåˆ�䋱-›w³×ê°ÀØ–x]ܦscËc†¼-©°b«Äb#)ÿõÚíIr.)Xø!¬™<©—ÈnA|Ø]ÀUÊZÊEY»W“›Uã×T4Ê !~ƒö6U­xÙƒÖʵ0NAkF›ý‚Û†¯6˜n¨|¹c7‰÷X66.&[kr=‹Ñt®ÛÊ+¼ GSÚa-ñ k s¨ÛµÆ'¿ª´YZéÿƒB½ƒˆ¢\rà5GÆŸ•8·=¹x³³ äuyÙÛ/–×Ì"G£Õ�Ó˜è¨Ö m¯À´ìí ² æUZžp³D1º:™’ï[�Ñàoڱϗ4‰ŒvâÁÒ² ‹n[† ¶\D¦îÝÛLß‹G㢤þ:W_†Îw$ l©0së{¦#ò¡ÐŠŽùæÄL‡rÔØvÔu$Ry¬ÑYÈŠ0: „ýARLy…ksÐé!þb®À0�ûiÏ'«…‚Q2˜%aÏg–G>Þ£ì|,�tMè*Ã$½—A«µù%«©0W¯™öôå^€NzÒ뺺z“9•å„ÛоÿJØ] ÌÏ‹¿­í=7Lsm»xaîÞFæžÑ��’Œ­#Ll~ã+|Y@êgƒí×.I#þ4ÁvÿuêÜ]Gex”‰K^³4æ;+xå�&ß,ž²Úј! ™Ì« ã00â'¦Ü96§îRÂ?¢NõÏc±¹ÇnyÊ(†—VW­\Án�\?õªp˜)›©¼ºSC@H5'ÈBÞY�7›x4ŽÕÿ+!¸3¬Þõöœ' 1¥žØN¹®;ì«ë34Ì�yS‡¹q4 äá|-UÓÊ$ƒ¯^œËY>#lm8Ûª©<•Ñ~t_½<ÙvqSב »\Í ÑTÚ…ÖŠ0@éÂÚÁ�i?Ù8¹Q57à•’:"¯°­¸§Ò¡³\ P2Üñ˜âŸJœ…¬=¹ê’ ; “˜úøå¡ÝÛzœµÙå¤ÂAÝû�†ê:_%¬/¹¡�n‚¨*�Ýn›½[M.JsD¸æË²ó[wk»{ÿuáÖÝFš�kI¯°§ïÜŽk—ÞmÛ.Ïße£øNërŸ`Íä.¹Û7ýŽkÊzkó¹1ÛvÓbØùç½ë‡kdmà~6E¥»}£/œ1ƒŸt3yñùºIko_u•óÂ<]wæRùLa®ÚZŠzªò— TüÂÔµz—@z$µ‰äs¢Jö2[?<>u·˜ Ü,뇟ï ß.çÚ0&‹+q)¥-å·|Ë(à-3ǧ¢ó ‘%L×ÈÿÆñ#÷ì·;ð´�”l7Õ&~èÏþAº<îõßÓÄâ¥,{0¨~Ü ©À,Ôj7Ó�å²P{¾£¿ û|Zwß%ãóÛË_ѳ-@Übd&½n{çM�ÑÁl”@PTÐ'!›±»æÓ…Í.þÔe`oEM{2y—½Ö`Æ.bÜøHû]�òè¾,R¼é5óµfÁ”vfyæ‹Þµ˜0g@étÆ~ÌéJHí›œß XÙ•k©Vi<Þš[ð²¦àõ�ª*O ®5ÿ©„Å]¸Ð¾h�÷AX •Å`sAs]^>¾®;-vúPVŸO™ø @çÐáy,ì >¦«Eï#ú®:cÆ�¿Š¸ŠŸ¢N îì#ØØâöªñ*é™ÊrhÐñ6m°¸Ì*ÿjÇ�…¾t1å]J*Ðî°–Ï¥–h.£ÇMŸ,*þ7´Åv÷Æ)õ”ˆÅ¸äf£úvý@‡–lÐIܱ Ò)Hs&‰èŽ*\º¹ðâV½ñ¤$é6ÏY¥Kà l ‹’O+»z3!rƒqêS­œ2›!ÌSLm£Ÿ A’I_÷Zbg÷F“ÙÁBåó7fô ö—�à$+®4„ÁP±XK©a?¯3¤¶Òr÷ƻ·bäWå|ƒþrÁc�H%Hz°¡åö$Þ**3½?£¿Íž¥Ö;F¯ 3Çܦ曆õœ‡R®chtÑ2 ¼�(¸×ùâX*m¬Páº@F’M»[ˆ:² %“ΊL…9VÝÔ¸ÙÛ/^q µÍº0}(‰–òîp#al“L¬úçÒði³·‚—ä¥b @F˜&ÊÁ´ÓÖ+¤xÐÌé÷ì¶„:8\�x׉Ê8 M]穲2ÒÇÞ™ÚBy«á¾Üs²½\l½ëm þ"ÁØâ�UÔ&˜”�� l# ç]/«²sÆ…•ü“Mùë®ö´´…Ä)îÈ'¶û3m­§ÛÒ’«ëXà îpÑÎ�“ÒmàÒ‰(hHúhÃ3f ÃgPLUnûâUþP �R6 r ¢$ŸÑÙþ¦dvóC˜®}ãÎkæ;˜FÊÃ@îI¿BUfân3sß’b¡–{ƒ§øõùÙ÷gow2$O�w�ð�K­Oq'…K÷e.^�}sÿìëû¿Û½¿¾yröõŸvòìëßâÿûæ÷ßÂî·û‡³_ßß}¿ù]dÐ9‡¡b°Ãu Ò ZC¹‘/2à—\!=+—/”£Ÿ¨­—Tðã­­½Áâ…›Ë^}ùÜ=å�ÊM.JAÄg†E?ÔÐñ{¸Q肯#:Ž?6x�^'ãSÂÈPf1ê„R)Ò°¿�SJkÓi@ò& yŸ¼D¦B WªhõïïøQZ_¾`á!ž�6Rt!ä†,� ñüwü^ŒH2lÓ–Ï“F¼yGÍó[“£Ò`ÅëëXœÎ?±ÑB°+S™ôÁ¤ÿ„‡JV¿™úS_üyZ¼–Õ2y �#]õ1h=™èu:„Ô¬ˆú ´H�&ù#Ãõ0§M”o°‘{BcÊ´%ûó·2ð £ëµÈº¯T” ‹üc#çªm�žÄ#øäPÚf =ÊæC‡ª}é=&�¿Uõ1ïL8®cþè3‰~‡[J·xê·iHÍ=éå÷gÿÆ.œáendstream endobj 6 0 obj 5950 endobj 31 0 obj <> stream xœí\[�\Å~_ñ#6o3‘çÐ÷ (ŠDnJ„Vâò`¼°&Yïlà×§ª¯Õ}êÌÌÚËC¤!ÏΜ¾Õõ«êªóý¥Xä¥ÀÿÊ¿Ï^\|ø™¿¼y}!.ÿÿß\|!Ó—åŸg/.?¹‚‡àO)—h­º¼úö"�–—Î/áÒk»høúÅÅ—»¯÷ð�ñ.î~lŸ~شűf÷vo«£t»ïöb‰^ ëðw±8´»çiTP»ûýA-Êi/ËLðNäàsTu ,íË/ÃîxÀøÅ›¸{Eøf¯ë´U»ïaýà„ }R²~Ì‹½Z¢ÒZ‘ïîöZ-Âj�öà³óuOQǘ÷d…2»§ù ŠÂºjžËx5LÐ×zE¾}³·ž��N{‹d‹v–~K“WB†p¡ÑhS–•& ’ñÏð @âh`”Ö‹P0ªó5Ð~ŠºóJƒLüëêoZªÅ+�š«k�“Ê)§éž_Öy^6òÝvB¥]8Á.p›¶VF;ï‹ìÁh2¦ŸgÙ¬–‹fw•¤Ð;@Ú;x�è`P\3ÿ¦  ´ïê*oëÔxäC9óAšÅässÂÄÈ2, {Óx gTa‰b�Ö×ø­[¬�DP:}̦}ETlHFàoºêý 5¬ß~»?àÖ¤°T7_áÊr1>!zÚo$*ß gêü¸"Xw�åø;H–TŽr²ÒCÉÂ}$7™´@ɸøö”8S#“æ HãÎÿtdàùW;"³ æ�ÿÙkŸ5JŒó`m±2 ˜üãt|$N\5?Þ Öhš’ í–g21/3ƒ|0µÚ³ÍWmÇQ÷Œ]élÖŸŒ`2|¸+» ’Îô-z"½(EiÐwú&)¸ó–غωY^,‚›éÙ)×zß�Ùt¼Ì–ƒQˆÁîþŠ¿* B{‡›ùó»ÏG_ô�‹ÙÐ6.F„�Â�:‘é-Þ9Û½^dÌw"ù›bÀÜ¢Œ¤^¾ŒzÚg%tšÞ5cÔ�Õ† A:[À;–X«>Q·[Ïf†¥‰ÈžÜø�ÿ}¢�úhúeÑy!t6Xà‚½“Ôbñ®]�ÅK µñ8èÂ82°8GýX¬AÛc@`œ´E]…1 л�cö!<&yÊ2üvD"°apuàÃ¥§Ãò‘PÛfŒ—Dr†Ý£ÏPÙë0pŒ€€³©|Wµ –wü¦¨¯MB�VÈÙE‚VáÁˆ~f4ìa½ª'ÔTøgÁÓêþ-2[ °¸v÷~+…o¦çí+�©:@à‰]5òšñLÇ)=xú¦‘§“�þ$Ï ­I4Ó \2XþÏå(Þ@H†TœÒ&ëwµ�  ÷–J6 û"" -ï÷ b]»z‹S92õ0Õ}^ÁŠ 4p-4åãDÂí×yãM7Q¯Æ¥êox~:3Y‹2q" ÆèAÁèøþ.¤ÙüágÒЄ�ò€Íª¸ÿçò:*°àå³WR–qc¢Á-.ˆæPF‡pÛoQ¹¥!º|Ó°8Ùõu£ze‹•Äq°*Ò¨O)SÛÑ�Mƒ õ µÔ“�c®FÕËþ�´ƒŠ 8™Á\BYì©™Û®w”ÁýÑ f®zÀ£Ö w@p¢À¨O/®~û%")•ϼû#nlP2’ðÑJtr‹vR¡d�ï ìUÚ­E,†JßJ†„Wë¬/v&ùù>¹˜Ø"³Cý2øä|4¸·ì0ËèçyJ“…Ç# Ð�U€ó˺O8Z££¦ƒpv8op)lÈ_r" 1¹B‘-Dùb`Z/r„NK&JÎo9¤ö‰Çðy;í•&Ö’õå}±g3ôŸ�猈nþŽ WÐň¾¥/ÖY½båò³A�Þ‘K|M†n—¶(®f˜³üІ1jEI04A؇ õ¢O®ót®[S”åèP HPÞàÙRŽƒÈð¶¡ÑPÀ \%[…ÞHˆEßÂZÑY.—|ëNüº.¹ Ý|kÁ°}"zà�AÖI6Á*v¸ú¨ª›(dذ`ô1\ú€}ŠÃL`ï×Xe9ë«RT_�“$Zf2D*«�²“­@лdλl¸\ðIIô„0²¦4è>6ãÅÙ X7’uI΢"P™\¢ÓîêQ÷ˆF0ê(tn`T¬\å5JÐ ÕWQP|§TÉ mçal„¨#TéÓj¸Áу’ÄFŒ;�%- d1l—`‚œ·îŒä7yâëãÑÇw�“É&^àäøÌ"'^ȽÎc! O¥ä§,P.°ÎÀ#$‚I¤Çj �£1Ã#äˆ a4·°Cá„áåÙ–šë†xÔõLc³t"N˜¤2 ›=#Á$ñ«\œá¦xb‰Â7ŒÉíL8‰ÊN¹o š¦Iú„ÃÑ4èýàç5ØæÕ½ð ÄÂxÇÔóÎ~ºOŠ€x”yTÝ…xi1n`F$ ¸wsÊgý`µbÿ 3¬à€¬™üOZ$˜3œ³çœn‘šègto“îTtÿܤ5ƒ`.œn/Ù÷jQ…û9#�õÄÎ1�Årwu$Ñ”p~‘¿º«‹hD6¢ˆtgÂà�ƒŽhÞ£e'òÕŸ#éJ¸Lêd Ž÷¨í&n´+˜eÒ±…wHn/jÖxCd�6Ì󤢛ùR A… Dt¹K¥Žv‰G¼žU‡Œªkv ŽMúSè‹Ûw#½Ÿý3"FŸ¡ÂLÇç|QCáðAÊ93Z¨SRMÓšL®ê ¾Þ—õÍÖíqß%:5�<œéÔ&ŽÎÿ%pÚ Âñ�$�åCJcãs7%7Ýz@ÏAb‹Wþö+#x×Ù»9Ub¯ˆ'Ø«be/ÀøŸZBOu�92 ɸ•Iø ðOõF…\y5 ?_ûn$†÷¾ÞÁtnǦÈV¾ºmš}úZ‰@¬*¢£WhL¶ §x�Ã)Õ:,©Ùå�sB±Ú¸&AO¯óʶèóÕ¯K_g7Ažë[Œvr»ˆ%ôþqµ�ï€6Ž2ÚunºþK jP:Ì'+0�š« ›6ÆDAxg¤ šQ;!1=º†– ‚³™Å…�eÌlÓí´oš ¡{X™×rÌ%ÉÏ#…}4Ö•@¤Õ%JSl¶÷ä=âUËóÁ8§—0–©>1ÖC ~DÚäwxõ‘®C&ý¿Üã�Ÿ�2ïVu<Ú® טÔ,e;Åýýº„ØÜ›M�Æo tðÀÇ@ !îWN¸'¬Õ œFõì]Å ¾¬S X Ã]áÁ)´arÌoó(/=‡œO©¹€Åñ¾MŸ`…QyÃi¼>$†±“i˜©<Þjš!¡v]wuü2B(2œ÷@¡©|×ø#‡)q·Q’“ ‹ä'wnõïeZ6äwÈS®-ò›§¡Ùò�[“£O“ˆ}@à”dã‡TF9ÒëTi6½ðM qAó%{  ®:0@ç bÓÿ­ ØÙÅâ6§´‡<' žmÈLæ°úxÖ_xÚmè/åÉQ”rˆh«„𔋧/&ŸMöÜ$¡î!OtÙ¦$9.¹|ò¿r‘Úk–LN|•07)z%îinI*ç'¹E­-–ˆb&Q“¹9/…æA8c"‰ÓnAÙ"Æ“è>�Î!­ß'â›,ô Æ¿0J ºW˜‡®ìÔb1jŸ¾ÿ\Æøéñ :äB^ ú<Üî­ •˜,Œ!VmeŽÜ‘‡O˜@0Uäá/÷©€Þù}¨‹PÞ“cÜδì—D7G÷r€°ÉWãØõ·¸T'X‹ú>$]Íük�ô}äMøÎ ¯ŒØ&ïˆ=¤Ê¬D\›Nj“Xõd ɦs±Ç¯áÖO0àÓ­'Çùžý”�ž˜ÿ°Tõc;ijö�;i§¯¸Haw_6¯Ì‡ÔVúôâ‡)Áᆫ›ÇtŠ>vê� Ì#˜Ø–³ÿß뼳י̢ô“Ç9a±pKùè`H×C¨ qV¢÷fïÉ¥�Ê …6¤V‡”õ�o±¬ÇGkúåÓ^°q‹D�ÚkCø?šcªxÜ®èÀœ3Ѹ®Ì\á›’+À½�˧–~î3}�ß:¬µÝj #5gLýë¬*Ǽ ÕGQ¨ßêˆmÛ‹ïØ©—çsËQ>]ظòÜȯo¥êYq�hOŸáƒ‰Ó}ûH6ä)¸ÞâbÃ’r’•ÒþÝFÊñç}°`¾¤l�Ç`±zÝ}]Ô¢�¬Þ%¬ô)O¥1séå@?þÖÐMŽl#…‘ï ¦8Ö‚ Ò0b �ÍùyXlZíÔM~ÿýIiÓr­»cñjkzšÐ¯×}/•Ö\óÆ0eö|ðèXÎ:TŸUŸu4¼*wÍEnlmM0/`RqÈlòÈýŪçn®ta yBrñîh�w‘¯vÓɪm-©pf,adpµbæ%+Ö«j¬u©S®”±vVg�á¢~P'­ÎÀs¥~RzsµÝ¸9/jÓܵ;Õðæ ðÔhÐK23ű’�Bȹñe*E{Ó.åøB¿ÞœÒ®'¹·rðnsýÙ¹�,½°­j*VßÄqµ>ŠM€T’�pôhÑø_ŠWU_S7Y­ŽµøG‹@p“´)_H+¹‚ÖႾ¯3”Ö _°Y~Ñ+·}×Éuk ·º\çt»­×Ý.·+d9'`“T•Z /“"c÷�wï£~ MX—| &Ö>¿ík?,Ó‹æ]ab¾L·ç¬‹øÞîj¨žiû� ¥<â4L¯0›ÃaÁ*޵mO—2ÝdpêMùó©ýRãÔ9­K,›äö»WXœÆ<èý …É«€)kr7Ù~c‚®m÷ù²Þ8¾&mã2x} Û¯™ÓÃ'Þ¦Ðл¾@c ¼Iö–D…l€Ç¿>ah6M3Ù¹†ÁÐsq¤†�Fq2*‘}q™©!8iJµÎ�"vû®¦EϼÃÛzkÂúm1Nù%¦Œ!„ «À [T+7„äŠÂò¸;‡ÆæHˆhBz�Íctñ¦É¼"ˆÊÁï1õ’Ž®141þˆCL=º1ñVÍ7…ÊoŒ?Kll ¦‡þ¬]2nÙ+ð$µí×LUà©~HØÉT÷ÖÕCðxb¹û³`ÖÛÌÍAª� 5(®ÇyªpE–º�bùI~°édŒ©Ú¤c¨#åuiV�ÊÇÐá ¶ò ƒ:ôø&�ÀÛ÷l§ÞzŸ“ f™ßÏÀ ¼+Ìâ›4ú[DØ0!Uè­Ÿ[dHjRÙúQú,îÄLÔO±ƒqXËȽ?‰ ÿÒæ‰˜ß4¿JÚ{•vgÞð¥v5xع=w[R�W UrÈ|7>È ·0â|L¡‡`oY8ÉÇyë,aЉžš‡=¸  Á܇1sn.ƨ é 6*~Uvá8F«öWòîTagù±§õB˜€æv‚qhM˜à/Ía &޹œƒ{ƒQo‡ø¯æ-û‘æ×3:OúÍÈà–C)Wé¼#ûi´O© †RTêc Dý™/élV}•Ò¡÷ç½'Ü R˜ä)®#®£g:ù‚CLÇ‘›l ÒöëT˜~È3Þýô¤¾Ê‡2 %„Þ‰qF8Ñ©N(Ž˜äÄ8 Åñå¡­uÑ“­�½P©[qÊËd�°ÃU3;3÷ÿÔ—B!K�¡NÔ`²ÎÐ~Îz`]ªa½ÀSGÑ“ƒ«žÔfÐÛ}æNx¦�£%|tR´)š{HoÁÔÁY»§%ÚšJ(7:6òŒ•Ž9õÕ‹6zÚph#bRó=Ù1¾»5�ž…©ÒÛ®;4ÇÞÔþ«9DZ¿@BxBËs\J]3·©â{=Átjì·K2Ò ‘ñç?]]üþû/„DœÚendstream endobj 32 0 obj 5104 endobj 36 0 obj <> stream xœÍ=ÙŽ]Çq~žþ†yœA4G½/ rlG�Ä ?Ø~ HŠ´IJEÊf¾>U½VwWß{gDE�!ëêLŸ^ªkßη×â�×ÿWþýäõÕ§ÿ察w%®ÿ<¿úöJ¦×å_O^_þÁJyDkÕõ£¯®òÛò:ØC˯½†ð—×W¼ùâÆ)éìÍ×øËxo¾»5‡�:Ê›¿ÜŠ#z%¬»yšÿ,ÃͳÛ;#Ã!”½yw{'g`Bóbà�ÃÍ?¶‡oÉоÀ;ª]+o%¨º§4§>¬ÓVщþüèßñ°f8,Lg œ÷ÑS8Þßp°Õ^ T‡óZZXJZ{wóªþx†?¢ò¦L9ÀO‹Ã#ÜÊœw°ç#X§àõ¶åonï´:´“ªC9�|CEÅ­ÅCÙ8B‡œ±F+…¸+Þš¤·ƒ0‹Žn¿®¯ÝJž°�‚’Ž¢¤ÑY•Õ>‡±"(­9ô�€ B´��!A ¸¦³$ø4 ã��â/@Ñ'ˆÁ[Ë8ée!A�8»€gQißf””D‘%0Óg,TkŒ*ëYÕeÎ÷ðÃjçeÔ�C„nèÄœQ{')nŸåxp½J¹C8Ä)Æé¢¨€§ÒûpqÒSÿ†ÁqN} Ï‚SšÈˆŽW_ßïÎ�ÔE�‰ ö+ÜE¾aϋʿ ‚y$�¶O$‡£ËÏAF¬Cô8“‚ßVØ¢¿LL¯“®ùIßßûu!Ž@P€îR¹‰=8coþg�N‡V±fQ‘¡�D”Q‘Ò2žÃ$d6:3Í(¶À·šÁˆëÐ$Pg¢6‹ôLLG³QÀ¸UÀYŒ‹§tஈ£ÞéWÕß7á”5šQˈ@º¢‰ö2½íàmx�J¤ö÷†äÙ»ñËP§'œž’IÉß|È;—“ØIdÀ'@ˆaeéI†À)â$ÍPyaF;!ÇJj«‘¶OØQáoðŠþî¹cçMd¸‚$<«i&±"tÅCªn–…?A¹ v €g(ÊKP§‡¼„µ~ƒÃï4Žs�ÝoCé0[&À[›ùÚ êMÛÉ«.ÞF°6 ©ÉèK,ÔFͤKVpøU7Ö‰;h�n¦n‹œÔùѬœ· 7R�wMdúɰ ò£2`Øx—ò””^0Tó¶Á’‡Yd�iÞ½¯Xò.+íÃŽ¯|aПP÷£Í‹xó[|ËD!¥ytÚ µDÓ#Jo‰ˆ�—ɽàµKÈ|'QgºÃAUãÏÅÚ)P¤#ðÄÕ凞òþËBTÊN`©GyÑK"DáºòÅY¶ÊkbœWûs¶h©f‹Ö$…`t* “E ø¦lØ[´Ù¿´X´NÏ­µÕ¤�Þ“g£M‚³¬M LQªî­%dÅ™¬/«B5˜p£_@©Á/ ½=¥›ÿÆ©0¯Ä`«å�Ž4ª+Ü^%ÛKû¤)ÁSŒRI .ï>ǧ :ëz3®ËðÏÐÇ G<tPÏNâÌ7ÂÆ/×É`æ+HDœÎ)FÎe�ŸÅ\Ü‹ (@ä½Ó@ƒ†wx‰3‘bÎ]ÇyžÏm…d=®ì*¡�$=0a°§È¢„öóœJm„Ýrñ7¦×óUxÖÇMím†ã8ïG’78Èü+ ˜¨¾/2.`+ªd duöb&˜ÓW¾ÊlLÇ&o2€8òT~ÒÙd¡Í�ÚØ¨–åÓHk¨²u*&äºû>œÐµ²ßSË¥ ¡õ]î€Tp`[8B�M‘0•uKõÖ@C‘Öfòd¥ˆÁcß®×»šCžO`Ï Y·Ýž¬ŒPå6/Ôþfš¢a±÷Q�Ÿl””ûèÁTª8�0ÖðÝuËbUº=°ˆ�0ÀëÃ:/¿Ú4M»oMdÂãfW( Uƒú†ðtrwá� Ø:ë–k ÉôPŽÈZéÝZÉä¬u:�Š ½Z»áÝÏgƒž½ãÂѵ/ÐPk>(È~5;’æõ–W·šÒÝ©å´bÖ 6‹š™Áˆ–¹ù%xÝ@5{Zg&í|HnªôC͸Fí⺹0€üÄ%<0CwfÖi£þ„•ÉBECöo…û‘qÏÜvÔµA=RNü\E &ǦdùÓþ¥d_JP¥¢ÛÆ‚ÒI�ÝÛÉ•¥%¹Šñ¦ÐÁêeÛ]ñi%($¢„nþ¾rì‚Þê¡(;c:µðåÖ®¨j½X¢Q¨¤WÙOl—D@„Ö¸@'¢�uGv4N’Ãä“k% ½\€v wÃËrªÄt¤#<ž^¡>d"@øÂX¦ žÇ=¶kpµ|°ÿ·0—.n0˜2áȃ(<]ˆ%øÂ6ÎnŽÌÞ)`d  [g9�VÐ{b« ¼šå9NK覢š”[j(ƒ ¸8Vh %‚ÈFsʪUò�â¬Ü>iiÏm½Èñ4‘4¦Ìp¦ØÅ.±´˜"‡PÕٳȂõg-(­&Ò�„ðÞϳ;±¨Ì¸)¡(G_<üi§{¼4¾; Ìzó Ù�öôºšhê–C8mä2€�RŽ¤ÑŽÛéœsaWXã^WÀš©L\h,6£×øX‚Á;(ųÛ€’ë¤ÉýLŠŒ]�ègõ:�  9î+ú3»C�^=ÿÓè®gÞ¼O@¢þÀƒ¤MA€ ÕlõäÑykE‚t³ð‰àmZNçØL08j²§$äè1è@+ÁLž€ŠxÄÇÔ"ÅÒ­´�¤Ò6på)Šó’¡“9GÛnL»ì„ý¸»éˆCîiúMÿ‰Jë µÔF.�†P#1¿ æªQët]M&çn~} $…›"ͼè×"›M¿n.®{8Ù_´WŸŠ�ÏJd÷˧i;-:€Û0ñ÷TÒ%<ŠÛJ>}ø@0™©ÿ½K3Þ¶äÓžvyÒm,èúqPÏÐ¶ðŠªø…ò‚ Áºwh5 a$}H†—ò“æG¦OqaïÉ×�Z{ Õ‡ÏúKßáOcÊ.)«²Ùt#5}v{ç�8Ñ5yU´ƒ#\âû5 £ '-mB“tŒ‚=kÞà`‚g4ÖºÐãê‡!iem'¯‘¾À‰Om�ÿÙߊž5ãi8ÿ!ÞfÌ›ƒÀ ópÇ-€  ¦–àdN�®ÄÃa¶ßÙËK<)L$g+0 /`aÂÇQzU�¹ +R’èž°nßwŸqvïTªî뤩T@ën�2¥ñ¡k¸ÄOŒ[šÃÁ˜Tåå6zJLzÀoÐÃr<�¤¼ü`Ɖb_„À)â„}®‡1A ÆD¢÷Ŭ‚-{5{˜‹iéˆuÐ 0ª˜tÛ~ˆ=1ÁýšEãìšS¶òT1ý샒�ãÀOžÙSY,É%a>ß#u“Ë�ÙH¿ªàMšMrfk2ôeKÞ$#ßëÁfVJÅ„ÉIéZxGö¡˜õšQEªÑÇdb\’óÓ÷5û¸9u{SýkE—tjêIN''²eHpœŒfÑ�RŠÐ5³KŠ’еÃY)¹8šü}ȦÍW’õ¾"�½+9ê�ÿy{‡�îœ`Ùà}l ~„ž ä.Âs&¾š?¾šŸÑMſś4]Ode_6Úp�8Dme2kùÊ”œÜWbø•óûèH&&qÌ,þy#–±Pú|ô!;®�1“ZvÔèÄ͆úO¡‡Ý�É�ü |ªðˆØkdôÌq¢ŠTƒš†4U¼`f'a&‰L�ÆX’Ò¾)¬�-ÊÁ€)gc/ˆ!Ù'$W:A¸ ŽA$✕Æ$˜½ÁèÜ‚¦fíÆ“�ÉF•Œ3þ'Çl€‚�óŽQŽ—ù1V°qN‘,Ñpåa˜“cóžý2YÌÑ*Ö…ƒv)1à2™¹|Î�õX�5¦È�B—"—SjÒ^¥ð-ñ-lGÓXÊ»‚4�ωD”q(Mü6.5Øæô�,�˜Ä^±ˆÕÑ[Âa�zþt3¨¾é~Ý^¶2ˆ”Á¿\É`ek€ˆœÿE�άIêï–c‰è«ÿ>bJ3º÷¥¦Ž?âAù>»HƇdè³úwµ¬dîÞAÖe0ÜOµ]:ÏùÓ-�ß'˜ƒ"«¶u=‰¤Í\&ž²Á¬a ÊQO”È©ƒ‰ª@dýAðÓÐÄ™е_uk—k9û�“÷sþm°‘Ö‡Îæ ˜bζ<Ë>àÒÆü¢¡pÉ|C¦N·„>ÔÌÉ¡î૜OXòÖXÉ6 ɪ°&FîŒâj3p¾ü£É?Ž˜¤ÏW=ê ÿoK¡;)`»8RIÁiæ>Õ2‹Çó~Éôw1‚©£_ÒÀ‹ÀêºýD�‘ ©yÁ>é@ Þdë…Ý�†MòÕ¹øqýˆ †È�åFTµ7âjã_˜~›ÛEЂô�pe¼·Ã×?«ö7áìŸ4‡Ðq, ÝË´¼ V'àÙå&㯩~[³S»­ÙÿØùÍ&¯(e%Ú¥²È,ÅczíÑ •”�.PÊÏ0ZÌe£‹M”’¦œ¾˜—4¼BM[mÀPôxÝê:*9ù·-Lƒl9›­Ö[­xM¸˜›éÌ„>ºPÊŽR¥ùÄB:�ðÙ«èÓƒWŽR—OpÈEHŒ (ì7ˆ”N 9 \"ÌìV¬)ÉÛáf U jJ&UŒbð¤ú¡:vîÀm†Cq·,¶Rs}>4æ]œ•J4-«Þ÷!Ë5{/±FXûCkœ|*4@d¹iT¶ÊZsº¢�²÷�¡Õ^/×à:� ‹Ñœ¡¨V]—Go¬"¶ ;“Ã{£a†×fhIÑfP´5)ÆIì[Òƒ0;ãiÿI¼Ïú[Ä 9i¥€Þéˆi}Ÿ”׊_5^ ¢æ·€Èó×k†?H…{T} yIõ-Bï𦙿%°Ëâ{@ …§âh¿çž.KX¡ô•š=Þµ,bÓo¨Æ:¸Nb”èFÑ<ïé Ôõ^µ¾ÏJU²žÒ pCz/³ôˆ4Æ¥Âkx§ËÍÎä`nhäû‚e•ÐhG€]qýÖ¦fˆˆw÷OIÄøÒ¶›ÃÐ.¾¢þç^¸Î9±´üR¹C˜P,U¦TËÎoÎy[h¼q^Tê†8·¬ Ì€j<¤96Ü«µsŸ¶b+º�Ño¡g)Ü9‰ {Ât\Jï³±a‡bʈÚäfíÒ·¶uÁxÆxß²®ÁEØ»À+àdgU2òPŽŸrsj 2­^øRŒ\û#�ðX㋠ƨÐ\Ï[øt«SvVu¯]X­Xl³Ï­ŸÉ 2ÚYhÐh"óv…'Õ"»4kwÄŽü%ÎØL{ôh+}:*9�žá­Ð�tì´zëõ§¹Š8йRÞ‰™�Ñ;”)|Õ4*n�—�‹”žŒÓ Ç Hׯɮ×`Jó�²PÌà2`†µ´!!–ݪ•MqñNÌ ½Ñ;¡ÍWÏ_.m¶w²•åt·PÔÈ *�O}ÐÎ@¢4üsÙ,6$e'œðàB0´qSqÁÍ®´K´b Ü1!`W¡ ¼ÎëM³‚U-=Qbz¶�$¬$Á{¿×&4Å#y´/GÝ'Å‘pE¶ò<és@Ö|Ñoº¶›¡Z3œÖ{árB´KY3ù¹gß—&f’tá>k‘¿*ñQéèBíjœPbSÞ|ᛲ/" J?¼w-íUÛõçG­®†kÖT¯Y²É™'] QwW|ÜØ–=¸z²FnΙ[/pâ=|fÂæ˜8G1—†Ò°=†™"¢âæÔ6nÚÈ bµ8¦Ðåä/+×xAx"Sž§"Ò¦·äñuC›åßÂôR#•ž†[ú;&x`„ñƒ>¾m�Ù Hl”3T@¦Ì“fDh7d3mbƒ”;RË3ñT¿Ø9ÅûÕ$ŠB¬iÕf[ÄUi¿t³ÉÚ �´��éŇ޶íØ:‰b|ª Ú`ÝåŠNUŒ.9±¼{q�Ñ{Yƒr§‚º#]ý˜=ýKË L9ÞõªÅŒ{M� Kå~O‚Nöà2²ºSñ^ìÐnp#Iˆ;{íÒ1g/—ÆÓ©ñ…Ò÷)bËN»µ˜ UÙš�¸úXUl,É£-ï~ŠOu¥Å‚ìÒŠæ¶µôiÒ’°àP:ñ~£jš&–Ÿuøl*Λå°Èi@¡ĸBr8m`‘ÔúšÝF¾"2ö©@#ï伓¬Gpæ&Îòæ·©IlæÄ¼ÑÿQæ ×ÿ$%ýl‹RƒE€ÈïÒW[p àBU7¼ /*j‚ݸÛG…!z˜[ÔÝþ"ùÂè–Û±úþz{çSkD¶½…ô–Ê”ÊfrX},ð<Â•ïæ´�>ÝËl²òð{Ey‹í3YàñËQÎ =Ñ“¤›U@* 3þÂMgyÓ0 “@uü'&¯[7@a¹O Z¬ ˜6§Æ³´Cÿ |‘W¥Ñ�ÜՈ׷X„…½cïÉ€¡‘v°Ôà æԱ¯JI§u$j}À¡÷¸-‡>¶.õòaά´ÖÓ¸¥X¨b1®{h]´7üî�ânujoXNḛ̂·d¿ztõû«o¯¥÷ù›S˜õ€tïQMn‡èŒŸªúü‹«O¿øÝõ»·ïŸ]}ú‡kyõé¿áÿ}þŸ¿„}ñ¯×?»úÕ׿¿ç'¬4(x )º}ÀJ5Y‰›“>Ö1–‰4²Í”XqyªǺkÌýV.‡ºd‘è8ÉŠÙŽŒd�‘m~ª=bæ.´BDn¶MU~øÆs‹©’tT&Ô0Ø/ÅRÒqnËŸ 8ä\WZcµŒõ½ïk)“�­l–Õ©ŠAôjèx¹µ9öD»Ó®Ýò§˜Å ¸Ö´P’) ó„Ôýç^¾•dNš}îêI«Ü]>J=øùv!.5­×7¿Fî©c¨ieµ }u²¶X©Èv©{Ëh 9‹�msÑ^Õ³áyv0a“ާ\ÕÅx±õ§â�š8/´íäŸ3rû\AŽßƒ XÓçmnY/1Íߣ5€ÜT¢ÇëkÀ=-ŒµU¼iÃ20Y(9mt¿m¼í4~ÄÛZO éÑì“´P˜�¤äu“þcÇ2:Û›_5c€¤ªmºÞ,6Ð^¿¶Ÿ¢ê„¢ül¼7ø->Q¦½É&ñ¢ñ‡ê/¬þ.TR/Ôœ*Ð0aª–:ù�ªÐ .G›‘ïäÔÜ�6q¡ukóïÞ ì²;�:´¬—ºkî‡Ô¡Ï˜¶H”Ø/ðÂbe•kDÙR0¦ÓÇ¡¼8ÂEœ/õÍ‹û:»1g áº×.�’ÿ> W™±`ßtÚ+ëIåÒZ›…ðÎ]3ï™Õ—>áqΖ?éР’7¬…^=g'ÚGr Ý;s±%"ÏËDKs¶²6㜿¼Â#Q>ضÇ,ë×(�oÙ‡-å;©µä,H’ÇV0ÔIIQ�¤4®Õ—¾¶;,_˹•f˜³¾ó·¼Lø]»”éˆûÔñ#SB©�L•-2�ÅÍí�¨•äl+¶á^£ _ÊŠ×G©£c›ä øOÚÔm”N>z—EÔ.ŸÏ{+<#2÷ôû„%!•/³üÿõë.ª¥»JÒF0òÕùDe{Õ™äùÚ½6+ÛccF¡Rg9¥VÌa=¾NœM-« [knÒÚ)ÿü“Yš™qcç—EÓêü‡(öŸ«B„Éœï–bm'ù$óž€vy¿—9Žñ—0äuó±ð;å|ú†Ï_ëšÌ33yizÔú�ðöq”(?äáø±Eæ#ác Ò›žÏC�Ó •JŠôK©©ó E²öbK[€¿ îs†­Voº/þÐÏð¥É�eÕ<Œ¾á—®I©vȯMˆz$4Ñ*è-)máB ��‡ï‡ ÏÐéM<®o­vó› ^-#“n´‚à)œR2yªYaÊ,Vóà,2*éf”ôØ Ë ÆŒ°ÔFv€â,¤b\;¼ÒOYLLp*/š²Iл,í;}Ëaøéw6%‚ �ÍV9Ûï‡O>Îâ�’’6%m­´ù]£y¢åÔí‡�ê4|N¥¶ú>ÛÅlŸ¡”ݤ¡-ˆ;õîÎUØžîÕæ,u8ÔÆ1Ý?öЬ�ò�bîô ;ðre‡Ù’éiÐ=K’|°¤§¡ �ù*"ÍúzÆÊ«m&¦ä²ÔÁ&`ŒŸŸQ¿[*®—DKš9 ~êfÔgr —üµÚ€Õe³ëÃÁ¶‚¡Ó~R’ùÃ<"w¨¡›éŸ‘{5B'_3.}ª‰Ë =—ÎÈ.—ýÔ˜-Nã÷›s?È=Ç?gl½Ö þ;×1 ô´–Š_V¸ _1Uíƒ<�™´ Çwè/§-¿ÑÇ_/ïÂ…ë¤ÀTšiÍòøÌ&Îd{Z×sþÿ™®ÇªÀRYôžàçGZ ±G*[Ôõ÷Wÿ #‡Þîendstream endobj 37 0 obj 7542 endobj 43 0 obj <> stream xœÅ\Y“]GR~þýx/Cj_ìàÅ,3a˜…Ž�†ImÉmÖblÿz2kͪ“uúv«B¡ÐÕY«²2óûr©óÕØä•À?åß篟üíýÕËOÄÕ¯áïË'?<‘é‚«òÏó×W_ßÀEð_)·h­ººyñ$ß-¯‚Ý´ŒñÊkøg^?ù�ÓoÎp�’Ξޜ¯µ‰›öòôñ|-6gà:ú/0^†Ó·x�ß¼‰§g³ù¨£„ƒz³N[uzÞ~½=_«M9|Ò›v÷-Ümáñ!ž¾?‹-z%¬+çƒ"ö'¾ïÃøÏ›ßâ´Ì0-¡7c`f7·0‘ÿÁ‹­ö"H³Úœ×Ò«䦵w§WõÇ·ø#*oÊ#Ii±y”PyæõùÚlÁ:··!Ãì´Ú´“¾NT¹xzW¥ç«ô@<1KÏ ešô¬<½ì·=í?ÉlOϪXÈùr—pùYž%MY Rírƒh3ó|¹Ûà\¾Jšpz BŠÊhc/o£ëNîî÷ÜÖ+·v–]o¶èªß§�ƒÀL>¼ÝlB oAˆ u+¤>ýxÖrsÖ«|]Îr‹QõÙmèï‰ÐË S•‡ÎLâw3ÊÖ‚l»8Òa²ÿ}Ö0=¯©`ò2À¥8àkíÕÌÕµ4›Éã¬&ÑÝå7¿xú386iAýßž³°?áy·9¡N/Î×x—vPbh¯áb6Í�õF¿EöË~Û¡þám{ÄÛða†éÂJ�P0Gïo¶Ž® DXsOîþ¸ŸUYšú‚E4aÐrÔû¯…a3.¦¨’£ª¤ŒÚšù.A¨È)]ÜL"Ôk·óµÓ¨ËòtS°:º*ì È@Ñ©F˜ªq ·�*D2å<)0ݪ¢éHºéƒœM;ºÍƒj4%ìfAüVºÇyø_”Ò£ Àj„±£â£1E�n+ƒÓœ-˜€Cu~‹K §A)ÞMNË�/¤ËWžjÑ/�ö¢¬ÜB öò,�Å9wú® NøÈ;šM!ëª|—&…H. À€eǤìX€ê‰Âu+ Ð`s£‡AS˜,/¹% îõe¿m7Í>&Ý�/TÕÈ ðy†à0ŽNÂÙ”EJS ¤ªQ]§~ëi§ýêIt]3z�Ĥ,Tük½Ö u"âŒi 9òSµß�gä•^‹þL» ßAP�<¡YÔÈ-e„óv\0°Q8W¾Q œ« qåpÑõ(]éj2 ¼N)ñWÝ|_à“4ÈÞ.�˜á·8ðlm3 œë|`®%ó~›ß¥…#+Û�F¶�‘ÃÓã&ƒ¹xYt¤Ö±åo@jBwÀtðTÕŽ)À1¥Ü„cxTºuÏó©=ôY7XÎ8lKEœÎ-R'0zP 1q�-ÈG0 —šd÷‘>é‡öÊO“Q oz•½…ä¸êÞv|Ì2 ¾B¡E(l‚>£:GµúpÛ²IBŠ>¶/vÿÅm/ÐgŸêæÕär#(Ü7±Q¿ÇO!÷:H`³XNÂÈ0x†™‹ãïæÀ+Æm20C�pà­‰Ì5#4® ÆZñÅ›‹ñ¥¯Ê§aqóÙQgòäÝLÔ3áÀÝ¥ÙGbad·3>…6PÉíï¿+X¬›ßÚ#ΧÙ:t€x¸EÛÙÝ 5X&½§±ÊW(m¤"š=*(�ÄHã�mõŃ댤Y�VèÍYO;Z,!ÏŒ �S„8jf ¾êWþœ¯´ …»¤J^¨1 £ÈŽjH´xÛ¿��ÆôÍà^Òû¡ðdð`~g�A#å¦787ï×ÑPÍòþ® 9ܢѵ©ŸÞ»Š ¿:Y½O�púb¤Aˆ©Ñ›?beBÝÔßC€ãÕ Áïmc‚œ'~ºSô#MA á‡Ó0Y!@³©{ˆ>¿¼S—Â%4|r‚Ì4ë(v€#VpÛ´|°‡#Ý¥¦ñ¼Nè¢dØ�-_–‰�ú¨=.dBîïÉZk 6%/’¶k=¨ìPl6sËz�üÚ8Ñ'„.4¸�ËćþĤݕ™¹´óè#„§‹$GC‰Ç“(K2ºlÌx9ñÉ£ã…äŠ>#XR›¯6ÔiO–;’Œê€^°°kÛjªäi�¼ˆ(Ú>"ŽPˆ1Rï1ÏŠBàu=xÕUw ,4_ŒaÖ]í@.jÅ ˆ! Ã³É™t›ÞQãaõ™Í �…ü8`kJɆ#}.ë[õÙ®hÍ2‰Ùz;éf–‰žt&MÓÒ¸„ÍßG¤„gXk�= ‰VôÚ‘ƒ£Â` ØR è¼LØŒP¸RÖïXB¼øˆÊNÑ0µeûlZM”[ú >ŸË¢¿'0Ã$ÊÑŠ&¸Ç©5ÿñlí6QZbÌŸx$É2áùT­\YÌk´‘DDsD“ÙÔ\WêK˜SªmY@ñvBDeç`>�(j~H;HLŒSe>�ŒÁL ¿¢ònýy(a² Ž.ÌæQñÈ*ø„}cÝ…/0°Í("Iõ‰<‰–*ŠøçŠJ93ÀƒPROÁXËŸ7Ý'ÖÅeÝë¢HK/ KôðEG¸È!ü\c¨«0oÀþ˜Ê¼Øÿ»’û ¥gßt Ã…‹E4Çœ’oÆ‘¥z…‹.6%âØ”ØuæQêþ9IìO«º?È,ȹ@˜§ugñŸ˜ ùùÀ¢ {p¸ÆÀè@ÿ‡•Ã/ <�-Š–85Â1 X^¯Göœ§éÝH!¸ò$Å¡œqhé=—<9ϹáazÕlˆµ0u Ô³ýFm˜dióLv¹…„ý×J¬Ò jÐÙû œÆÁªªÛŸÈD”7j†°µŽÎš]æCYrhöY õ€€qÀÝ<ö•æ�¥íÓⱚ¡öà¶g—¶ž[R¢Ê‚"ù@Ê”ýî}&Ÿ4äЈEU�ñ0£ÿ='™j9i*#¡-TÿskÖíõ¦Õ’ÄS³È©2wMó¥û|Fz,ÆœQ¤”æUbú3ØÓ�Í.ﺵW°GÊdJ2 5F�u¿u¦ŸOQ·lq/m©Ö$Ãü6¿ÉÆ{ÎÎMûe ê¨á,ãÞª€Wi_’ÅÝ©`IãÚ5�q¦ÒvIž®ë$õõ—äMó| æ|Ñ �J´²ò¤e ßÇ‘Ê�v4´@ÜÑ]i:+ÿ¯ \; �’C�|Hê¤z?14|"Drf¬o¶[¸6F�/08æë`ò Á®7—®! �Ê`êè7p³·=„‹@�ŒËlÀI'7ƒô*µË)puÔ°_I¾9+ Ø� Û�:o�É?íȱïó¥.³�›}&QðJ£8¹+—;¤n¾yró×”»Êœ>b/‹¡SHLÐ$š"D†;Ì]D%3Ž¡g`í’I# ‡hÈq”KTiløû–¢þŠI´çWç7hj+(žxöL‚v:8¾üK)¾—ùe­^Tpçúdëô™³ ä|#Åkç�Ä(/“czØüê¿�¨¬—¾E†bÙ‹I*«ÜÄHVä—æ9‡Lhåý|ñ /€ð^:´¯qM ”ì:ÓŒˆçäêHµ D…ªçÓª?R߇Üe„£«•ª(-æ ‹Òz›ôWKXaÈËyMš;5Æ€ṗC §Z€?ÑÛRÞó©U(õR;‘‡Þ:DzÒý;ý…�¦‘ýuÎ?Kø bdZm0‹Š Üi¶Ö-³ XÕú]S ³THsÓ?- ¥®<ß8ìú|˜>ئ‹“^äéJ.‘Pký83eY»^äK‹¤ê-’…_$ Ì©CKpl§NOõ_ØÕðY%ëtQ:ܽž‹TÃmŠ”=MZ¦uh™Ü†l4øä¡»}áé÷< ƒÚ%ò?. >L;%ü<;üò|í@4Ök>->–L ð/øçm>í"�ž;ˆ¼ÛÍ‘í”á¨t¡ÜÚ‚;ªF²ÈX�©g’5òQ¦4ý;© ®uË÷c,y‡ ƒÎ4ýŠ&¶[ÕÒ��¦Að`v©‰÷t�Ø)´ŒÁa–ì@O³™êõ!ðý­„n Ô“Çè {‰é %ôåDn•Zç�‘÷Zû Þæ”�Eù=Þ¾-%L-ðM§3ÇèÂ@ ø,ÑQŒ"_á#DØ)z.1 ÎQk:ѸÎXÈNõò÷±±² ah¥ihÆã �»¹ú¼kõ&p¤`tnOCHÁ¦òÄ4Wæš`ղ僱Õ{Q^bš:“ðý=ˆ5ÊÝ™šûq$üB\â´-T‚_sûCÕ}¸�Ëö쫯ÁqÕ×^OÃi¦Óó|ÁVˆ†Z+( Öqo‰½ríÚCë1Ö³õظ½Ol$ƒÎ…Ÿ`Q�9mJËuAÐqÜ.³Þ�`Kü”ÆæŒí’½Mõ­_ ;FfMRÀj:¹Z .jŠTqðË á‰r}À_p,zò“Ý, �¤{mþ:ÏÖ¤ð*m]rê~À›uÆ�Îð»ÚE…“~ÕÙÃpU½$™×4{�?H«ûçTPuƒ9Ú4Å×+xÜ:Páa#ßÀX¼Xêc%+ê~B&]ÌUªºiô_)Æè ˜™<0ÓÒÖú¨Pta+.¶-cêœD�}ëp3ÀccD,<3b-íS_èE�¯M°€«=ªúý·æº>ÂDITôŒ�Nþ¥6jÌ”îD�ïëviÆ#�ëm%�B®üÜ>{ëbl¤Ø |Ü48Ve ò[ÆæïЈÓ7ð*©£•Ô$.mbHYæ¾qº´Á¢™Ðð:祄 é>Ynû lþ�5È—3l�÷´�»=JXf±CŸqù\v3}xH1 pÐ ÎÄm82 àï¾ß¦ôŒ‘vi Î;Ч‚ ÌÈÏ]»÷9(A’Ä`Ñ?à27ÐàìWÝ›½YxJvl‘iOhU�ݾó¤D÷‹ÑöÕ¡n‹óÖ€¢»>'LÊ_B�z#X§@“'˜Èc�±Ò-ôžÙ ^Õ”µËÆ×Í )ßÊ„s‚n‘Øãb©úVð ½……E*à˜’Cª?�=Ⱦmqýó)i$Œ¤N+‘·¬>‡ESE|°D<¬ U}ï))ô”aG8<ƒöeL:„Ú•¢°©äp &{*¢vóh»Ì%´u@p“Xø"íœØ–­áá4mN|GmPq’úÒŒÏ|2¦Ûÿý2�g\!¹:<%/ÞK>÷õ+�ýÐÜð Þf¢ÀrÒ¾\iÙ�®ƒƒÎþ°À™EB¼J±•qø/‘LQÛUôhaÚ§Ô÷ «°Dî¶•Šüc•khªù^›K´MÆÈ…Vg¨‰`-ÕÊ<~¨"7ãX¦Ü°ù^FwIÊ­Öʸvâ~lÌ{#¸ªi7ùŽ¿�¶Ö µ$œ‹é$ÅXæ C—îœ ©�Eÿ ÞвŒ #‘·B¢h?ç)èp´4¶§ˆêë;wˆ�ÝlµfdZÔ|YÚÁHK ×pydààÿ nÞ èúÐÜÿ~ˆ*(+„ÅÁ8³xPÇx­l°š¶]¥²²#¶Ò19mûZí'H]VZX üоkrI÷R"˜ôàâµ¹&côða?¶‚XøWÊŸ¤Ää˜â“,3ð§¡K!c­�%ªä)QrIÅ»½Ñ<ãðƒåls®hìnV <ä"¥-öy¦8Éõvæ§ç´îé#•õ³‚í×-Î=÷XTH.™ærÙàW»®ï ëø¢��ýB"ð1]¶ÒV¯úyÄOµ¡ûÙôÅÄ´¿¤üx~X«ÔvÈ»}9qÃoCüÓ9õA15&X%ŠRý׿Ãà”jä'a?¯Ÿ_uýlViŽâ�‹Þ?Pj©W-““‹ÀÁ8÷¹uÿÚÏ9u{ !+ù‡dhî(C÷s0Q[Ó™l%ýã-;…É—Ê'ö$õíeíÕÁ‚!Í�IŒ%­ïa—5©rà·ô/ù¬JI)¿Ý01…À¨ÐᎱL>üt¡,�©k“ AÀ™Igd¿£Ö­+Œ^¢üK³¬.Åþm®1Y[´ÐÑ…z`æwŒ+Òf½KW¤f¬Àñ‰a„)]¤ôNø ¨Ë`¼È‚ÿœ$1® rWÔ¢@01q׺£ºÃ‡aÄéÏ'þj^Ä>O‹·w‹—††ô³ì/Þ&g…Ë$Û'ý@uÙoÔõ½™|*’¸â Në=@L‹L·ã×Ç_2|º}ŠÚâã®êÏ?ä>›PðËó¿kùßµJ ¯õÇAQæBâ~7ö…ŠB%�Î2 Z>X(mòÓ—Ðq­šþéÃý]ßÐq´ž÷wN»õ,­k-70–!ŽrG…fCÖ.“ xà Uˆ~ŸÜš÷S1ë=ås²ûRI­`–í�¿Æ”�“B®öáwâøçk]¥ÇÏ÷I×eKNng<)wi¨ñð„zJ¶g—/pü×½øÕ δoWÑ}´Ù2[öñÁ×c»KR›cRÒ‚ÍáÛ´ôÿʵ$þ2eñ•=ý®[&Éúd#ÔÁ|†¯®J’»¬¢ÉG9Ïx—’p qÁGòýbUª>ÞlÅç©kn[4aÖÈä^=&ß—¢á¶ôYsíùMØÔÔIŠUá5JG{…a¶Jé|�2þñæÉàÏÿ}NûËendstream endobj 44 0 obj 5842 endobj 48 0 obj <> stream xœÍ\Y“· ~ß_±�3)O§y“ñSì8®¤œKÞ¤ReçAÚÕK+YRb)¿>O��žkwË.•J£žn6 |>€àüx9OârÆ?ùßë׿~ä.Ÿ¿¿˜/¿†¿Ï/~¼ñ†ËüÏõëË/®à&!/…˜‚1òòêÙEzZ\Z7ùK§Ì¤àòë‹ï6Ï·;1ygDø×Õñ±™>fá¡«¸íóí<'Œ¶xÛÎ^Œ >}ýû­³S˜­ßüg OkgÃæ¶~ºÞªÉXeäæÃv7OV;oÝæeRÎÆnÞlwr’V9Oí” “tnóm@ø|«šáâÿêXOã'i6Á%HXƒÛ<Ã�A‹Ùl®¶^O^y½y—_ªL÷ÒÇé¥&øª]ý~Cîþ~ ³18¢ïFy:.È+W–îewëm¹ø†RvÒ #òæ×[9©•.2À‹q 3K O+9ÍF)|‘ÒpYzç3TMÂZ2Rš�€9³£ÓÙ}ÂQqRšJ¦Ì9!Bv@’ÎL³ ïQàfžŠ> i¤%Õ«O·ÚãG‡S@¤¡žµ[QÞåÞküh=Üð¢Ýû¸}|‡S´Ê{5“cq«@õÎ<˪™´2 B$ËÍ: *„ª%W/7‘þ¸TY­ltkù�1ß ˜Ã¤¼è^ö/Ã= Ñ¡'àòxàµ~6Ñ•ò Ÿp¹zÒi½Åž$1§ð2Örl_?Ùî@=Ò(±ùw3�ïÎr•,vÆŠðójRF�¹iXH&žî(ÃfÀyÓ+öÎ$ éË'ÄfÚî,(]I¿ù®S kÚD»w¢^ÁEYmšÌ›zQS>LFºÞ àé0ip&o9#GEJP¯y8T“âMy†õíå8É`''8uã@MoA2~éÝEF·Ë•½Ü"FHÉêb Oª{I¢žg¡#<<ÀžÉNTÎn`”+¨=¹•Yñvm´èj¼� /ÈHMÖi´ó<ã&„ô¥‡×üMm–>¯'Ì2ª\‚ÊÅ¿…g¥OÓ>&ÛH gMãÑÁ‹jš°qÁð¸—U"ÂØÑ•à#Ëð6¾ o$Hp4Z”w_#„A2zðEÄè›ã½jÒr%€‰Ó ³ùoéeƒy¾s?Eü@²ÔF±À™6óäæ°ù².z陬sœU§Å:+7_ÀC~·‹B…ùz Nê#ÊԂ㣓Â燅#�§`Å`dœïº®Æø¦ÍŽ *‡«lqµhFΊ8†,W+ÉÞ¶ã×YòΚ3þÐûÂèw=PËåçMcU�ò¬ ðYFHuÍ��O†FJ�i‡Îw/NõC…Ñû¤4=S7CÁõÃVé)@,ŽkRnr+¾tá°26#< DýT!ǰ2*»ßtîX�î¸Z¡èß\\ýê»D¯"Õ‡·‚x‚ÈÐŒ‘ž½ß!æ4]?qÌ D ñ©ò¿öÎ-P£²�`ç(<¡òH“Ü•¡ˆw~6f#ÝzЙ#«#¼…¹B$‰¤?ä4åR]åËòẒIvmfroÊÚzáîd6œ2Y{vó�­2êj[P§ËH ”›GxUõ2TáDÏ/hPû¼8Ö°Ù%×1 ~Qhguìdà?t2ƒë—àú•Ysó‹9¢ç-æåiÈó›C#©i%B¼¤LeA‡P?  é÷§™oðf!è$ͤ `ÑÜq} SàõA\H‹ÄÛü,:@Ùÿ¾‚yI»` ÒÈ#S‚ÌòPÎuRn®å­ç œ2•÷Â7çØJUqþC*E«+·îÖybDºæ9¦Ž1z¯Ä”–fbÓþsÍzš >ÖD‰‹@Œˆ¨ ¸E‡~R`ËR•®¬O‹PÖnQª@ûÁ2Ímã«ì cKª½‹žm[´µ�‰Q¢{XüÒÞ­ð1¶¨‚J „ÆÇp±—ÄÔÚ`tCE†%ªN÷<ìù q ÖñµÔ*pá„©%±%A2ô© ø†Éµ¸d’­0pÉÕ-Kx%}Ø‚qiàu0Ÿ;9K?�¶pîܱµê«†r -³<¨°·Q âÕ§f¦ÍÙsBiẏ¥—‹º;Iµe„˜ÆÆÂ'OU��• à!Ö¶ÚÄÈÆ”p‰ÛõÒ Ÿ>¦¼µ,¯š0.ïeÝ�ȶˆÚ(AØq«2*è\[�CgÉtO :mœ9»äÙö8O$æò¿=S�à S/%ß{ëZGˆI¡aF¯¹ù{†h܇t×Ê| lÕ]5Þ±0Hkmö(#®­¼7 F!  hÌâGfØtÇ'39‘Æ ÚBÅ¢t‚ XÖ<Ú«Ýeñ�­`/Þ2ƉéŸkLtóáÄlè˜(|б¶0� ¬”ä+ ·5:ŸælAdKgËwcélQZªdo˜‘BÀ¡=³’ÃÞO å”xfâŒL˜T�Î ÒË„Bš•„âˆ×ê|�ñ¸£G¸Ä`�€·Jm¾JÒ7s§´ÒšsºIWÚÅm ú„’|[YrÝ�:—°1‘úÎãŸÕaün»3Ó,•5|ùaRв¢Œû€o8­Sëê"06$¹hãb\Ç=”ﬦ+Œ°ÖÌ¡%S™�:O÷ö;ðe)å>””8SAªstº¡ÿÁ~Œ ¹ºí h�‹„Ôì©«{y¬›=¹ò³â›*n‰ß¨ààÒ䞯öåí²®'¨ìÆ#––µR¾ÄFVYe×([AŠXÖ<°ÎÜóu°t™[¬ÇÍjÙR>b)û�TíJ÷µ¼8/\)[È€`’¯ÿw†ÞJ2{v�ðÓ«6¿=°ˆrAa±_µ‹i�Mg ´w(„qìŒíÐèÑ‘û˜íKrRN×\ž{Á,²ÛX¯C‘|khD‹JŒŒ. ¥+€£ï^v¤%;È£{@–�@Ì8ëà¹öF&›LéÕ¤=ãn»ŠƒÝ�ç¶Pž·kl39W¾>œñY{8Ÿ?+a÷ôÇÅŒ»Æ/й/:rcø))×LÚµj-;QÛÞë!šŸ-ó�±Ñ^Ík¥-�ê˜TGö00ɤôžar,jêm_¯ôú.#Dzôh³šâÉZGf‡Ÿ]þ®�ŒŒ¨DÁ0@ÿØv¶¿e†'ó(ŒTª“Pä$EÑŠ09ßÒ”eÛð¢­çù>Ôß–4¸k?"]ÁÄ}Þá ØpL/6ízŽù³Y«Š¯Ú[_‡FJ³ä ãÞºÊ÷¬«[¢:äÙ…š‚”ãY³ `×¶¹b†¡Öêìeå²#y/[µã@}®ž«‡OUR4D½@gä;nåµmÔqÿ >Ÿhž4æR¿zžk·€ÝÂDyi_«.æÖÆÂð"À¥9�ˆJ�·8”—'¶+ Ÿç®®ý._tÔ#ú,-ä+zÔ­ÆäžTָɑY×_“fmVƒ\W܃) ï:8…öiã7<%Ý/¸’û•÷°�ŒçÏ�g ÔR]�îé8¢Aú…2È(;‘YOš%¬•ò N3UV[Ù~’©Èî@0• > 1˜¨”³¯�'©F‚šr )Éñnœ&5G }>± ¦W¥¼¥²0± hb"šŠg³ãäÌÊb +«àdÆ…)¾ˆsÄʰlŸòXŒ:¶rÓäy�íGO ”VÜå(�A#Ézݪð-þšÃ¾ý �K÷kMÆ‹}*tþ7é½ZXÒ ÊûÝ�ž=yú\ëáú•³õL ôw'»¥D¹#ªýÈC™JÜÛv)¼õqnýçg¸ ÑÞãùIijüÅ´º°a�0Y²Å£'¡ÑôÞÅ@ßìÑ]�Ô=?TÙÆéó¶^ñÇ4D ôŽyvp´I5ºxM} ‘GvŒŽÖ¡PC4¤Í™ÆÍÊÓÀÓþt�†Žî;ñÇ—ÄJŠ—m› \äGHÜë|bÜ`ˆÇ`äOh0�Ý :�/3˜ˆ¬ýzGœfêj �<.UsµòcFÑPëP´–ð¦Pú¡‘æôsØ DàÔÔ"MÃÑ9n‹a2&5�y )È"ìl!&†¬\ëú–Úø³-˜’Þ’ézâ8ÇÚNÏ0žUw5/-䨀ÖG)�Oí7ÇÕÌÁ÷A"FI ³n9Ú@@ñguÓƒVšçrJÄD€A–‡tk Ý�=5CÌO% µ¤µ®�2ý¶8\ïg‘fêÝxÓWWƒ?ÿ¦¯qÚendstream endobj 49 0 obj 3831 endobj 53 0 obj <> stream xœÍ\Y“\Å•ösÇüˆ~¬Ó—Ü—!æÁ`ÆÖ„™¦ó€çAêFFÑBø×ûœ\Oæ=·–VA8p—ª2ófžõ;KÞ®Å"¯þ¯ü½{}õá—þúÅÛ+qý'øïÅÕW2 ¸.î^_| ƒàŸR.ÑZu}ûü*Ï–×Î/áÚk»høúõÕW»?íoÌâ¤�j÷õ^/Öi«v?îoÄâ Œó»Û½†VÚÝ/{³'|ܽÙߨ°Hï ™ô·™õ·=¬+Ô"­Ý=�ïWÏڇݻ=ìÔ5 ý.}éeؽŵÜâíî{xð¢œö²üpÛ7:À±b¤??‡o£^ŒtõIQÈ—8Ë eÒ´èøŽÃ<>ïTš°»ïOª›ÿ—úÕwëßîq·qqBïže:Y`k öh]ØýŒv‹ÓHã` ™¶ ¾h +Áaù»¶›rFáLø[˜í£ qàÜÓýõ^-Q ewÿ¶KôJX‡‡»©§»‘f1ù„°*ΗÖ5!J»2?îæEubTyb梅 ýŒ[à»ÊyÙ84û91YêÝ0Î  ½lƒp÷'o,TŸs×6öýÌmãÕ@¡§]p¾IôBú¦Ñ¨÷Ÿ£©jååËϯú<¹ �‰¢Ã"‚¯ò�u¢�žNdÕÜø;¬/†=�r�6Œ¦[$‡î‚O§!W‚ª"­’_½�U Úiîó\t•}B 2ÚØ×M€Š•&ó¯Pë'ØŠÕÞmæe9.ˆWßvòÿGó]´ä»‡5×qW¯&-(§#Zð† [Õ‚¼/iMg�ì �[[·X 7'Dy×d�üzߌ{W-0BÖÈE¸Ýì½cáªgÀqm½;ÖM‘µ'[åYù/˜¯|Ðô‰Öêv@QMWIðÌ L{ÈÁù}Cáw�ι�/kê`†'‘¥6®ÜPW®4ê*”¨#‹4Ñ%s+h�2mD ÙuÒ3#Â`?š;~ּ嫮<�|Üæ€*ˆæ8îÁZ:oQˆä¢µ…¾…¯nhG¶ÎíWI�ùØ”…v }À� Ë‚¤¿\»ßücæÛ|*J(H”“‘èã1Ž8”\¶ôx1™.ç�ž¬2¢:AÓMŸŠ+Ó—ç³nš#ó��t×"•ˆ,X n“gYY(³ m_u ‡}ÁtP’èÙÓ®P?²Xî~Ÿ¬ œ«OzµRH7i¸ÀO^2ó$ <9ïgG”�j�ÅÙ±: fj€—DÈu,¹öý>¸ÌVÿ’õˆ*ÆE‚#Ê. q+�ƒëµƒÜô-I;ž�0ò¸o‘d«Êó*WOÑÊ[!�1ø•†Hµ +W¡ûÁäT8š04#ÜG Éè x[…NêIè$�|–ârS|¢†mL˜™¨+´ÑÝö¶`Ì cÀêeM ´vá0IÖ�wkÏØ6¯¨¢òQÝÓ• › ïŠÀ¥yft1é�„XÑL.ñ“LJé*~3j6á®5ð÷÷HH¼õ,®±pún�&é“"éKÎð4áCåvº ã]tI@šœØ»yÛžéaãà~n�é˜ �HKÍRH*« �8µ…‹¼V6î œ 9ª¡‘ŸÕC\îj$ÆÃ¯p«bÑ’¦R<=x¼_üœœô"Áoúœ£hàHô6»[D‹UJîfæY4pÄ_�*œ¹8Wñ¾ÍÎ+‚³§®k+�xH‡º{ß°Ýèõ,Þ ÜùìúLJw__}ø¿×òêÃ?ãÿ}üù'ðçɯwõé“ë/¶Ëa¬tkx¬Nƒ¤(s–tŸFb©QÃÁÈ¢ â%�ß—Œybß׉buÚ¾ÀEÅq_§Y€Ï‹v‡é5Ê ˜:xRÀ¬ ðs%Ì;Ómç,G©dÌWGŠeö +·:~Zƒåà€epÉÁà£Uпàg�Žj÷1j®pÎhºÚ}!Âhñ/{Ö)Wüòü°Øb¶¹ò“+"F-a>&\<¶.„÷�HJã1áר<›+Fªè8„ɵó«AùTЊvíø1äþ)¡‘SC˜h¬J¸v¨³®ÓØßµœÃ}a¹—j7ˆL�ÜNä¥òl�ÇíøÁHy.Z¯…®ºe6#ˆº•�ÒR*Òg5¾‘A£¾8¿ ×K…§þŒp”×)&\ëƒßŸÑ ¨¸� :à7ˆgV½Ûz„) d_Pþ .¥¤³­Hå߸zŽs0.biƤl{ÐkLµ Xv ,kPMëíN—�AÒ|Í”êµi‰K"ôã)ŸFˆæÁªw7ý;ÐpÐ|Soa“<Ī©4|/: ó1M“y(.K@¯Á¥p±|zØi¤µ–¼?èv@ª$)pL±P*VÆ3k8XF”X�GQw©äM4m] ‰‰˜)¥„îÆY L}ÆH‡Å¬jœe5ÎJsgÃòV=Ø›¦*‡“ýYÛÆdÿÜ„³bi«,XI L—ÏR¹žf"#ÿ1åÕqÑÿÎÙ9g Õ ÁW_ÑCìh´|”ÜÊõR…9БzæÉ¾šÂ滳‘´º{Æ^ ’:âÊ2ìâts¿”= ´Ì¹{A‰§îpRœnJPtӣܷHbC*vÃG©4PíýÛ¯÷ a)éþ}WÉç}(R¾Ž½kŠü²�%šü€œxyT¦q’�a3ÑjÆÿn6„CŸa%83¡‡Æ¦E èøCí×éN“¸J¾­í¾–{GŸô}÷¦¼Ó›ÈÂ0{»ŠÒúó3ldY”Ua}uÂC‰¼‹|ªh¯:¬`¯*Ò ×JÕ¬p) ˆÎRGâ¶xoÔ}mÏf¡£Ó.ÀøÌ¶å=ª‰üZ�‘ç´ì¯¥N ~jj±Æ +Œß�MP©á‰¯‚P|ø®É/;X›IÔÚÚ`wÛ òâJ£µIp²~64Iëf;€Ar‡Ú1í'f¹!­ûM*ÞPèEw - V™+(©[ÏéS 6.VÕÙz´Ä‹UY�"V6‹ ‰@j$1’-8ì¡›ãÜ©×gç¬Î4 êrÛÐUö´¨ )IÚž´y¿*ƒHóø^¤*ãµ!ˆõG°µà’�nó]Á!YÊ´ûòÙRÚÕçø½¦ �F�´Ð"æ&*J-{rê4ªÁÙÀx»ÛzôV#Õ·cúØ{æx½¢Ü6½ðÕX¾1–pVGÊ¡«î ùEŒyw¥k…ù.ç&«ô4}ï2î9üö‰ÍÒ‹!WyIh_å…+ÔßÔ玅‡çíH=N†jW¹¿¤'J ÆRÀ¤µl¨Ð}TzÛ ¨¾É ì”_J›ÇAS›"˜G`ö¼¥sÿåêö_¿b¶‹ík72«ë]í» ;¾EolƒD‚ÛIˆÉ•ÍtJÐBóŽqÙ¦þÆçG¥­UÄNæ÷ˆšÑ¢zþ&2I§p½íCèY›‚�†÷�O«¡½Ôb•ˆ••€Ï{ÇæMêó6‰¥õûYûªŽoꇻƒKmó#X³u£Ì!çw [²îÝ”¤HEª«ÜýMâjŸrBJ­¦Ê‘—§#7Û)ãß�¨kÎ\òòœ€¢Ê^ÖJ_‚²¼åoíð…Øm2Ü4:€ªÄ&Ý«[¿“mê� ¯øRò&Q’¿‘ÑÛ¼sÍÿ€JÆî -˜9`¡ãöUdv‡IXæfót»àÀkÆ\](9z'°Ü>;£ë¼ø©l|²«:Æ ?ìë}ç.Q-ôX¹ô¤oHJ¦ÒyGè<_k~,› õFdkIÞ4ÚÔį\¥ü¶nlÌ ûÍÈAÃ+�AjG{ÉÇLkÛ·âÙâ|̉�%Ôxä5»Š$]ѳÃÀk*&2×eÄVn¬<á0A¶>–�_âá¥D]ÚŽþñæ{il”«c5*¶ñT±ßÿ>eRë‹0¡ ÎcúKéÃ(Õš´KEÌËg.kÞ;·ø¬DC¹46XRù—\$®†%):p {³õ”9mH*ˆ§”(æ+ðÄ:¿pwÌc5ŒÝ¥®!¸p =éyƈ÷ë˲!OÒ�¹yÍ«@5PS[Þò ~”ûø[%ìKkâØ”ù8�í´G¸¾O"ík~ß“8‰Ãø¢µSY{ì•hcb÷_"b*ý5 ª@üiN¸Ù1eVÙhN¢mÖJþ>!—B`_ŒE<Ýo7árÔ䣪é´g¬’ý¤N±Á´„ zRŽ{ÒGÙ�÷í˜8Ø:_[Ut<žÛ9j=r5PõëòsŠfJ{·Ì š“ž­yé£fR8ì¦lðEïåÞDýëØœô¾E}ãÜ‚=îãŬ8¹•±_U·s"§½ýˆ ì:uQ*³>‰Âì(<¬ 5b|£P™ðÆ®₯´<Åú•6ÎÁ V齿ú$h $Bò:5ÛT,f}À¦b…™Õ`Á†‡TðuBbëÛv#íc[ÜJÅ:Ÿ•äÊN´•øÂ�VržM%B).Øß6• 0‰½Ð;EÚW§ø"õñ~|›ß÷Åë´�6´ -ÆÇ ­ÒrRev¿”  oD'„*†m©³:GsÇ´\èËéšÊ¿-‡Þ;z8S»ê*‚m!¶[Õ—Ó·zuîú&�rnMIó¹ƒ ¶æ­À·»s‡«Y äÌ‚ªGo�®tÓ²uã‘ïBÈ»ž¶°Ÿí_"AẬž¯ÈÕ=1úÖÅ­NÆîI+9À’�Ú–/ÔŒÝÞÉÛüš¾ex7épuáä×BÖfCkˆúö¤üO�xýü­^"ÄÆ6³ñšîU)žy�ÑœGo*ú¦ãž)T‚K:÷¨»\�-¶r X@hþÕ#ü•¼|zÇ5þµÞŸüN>Ûz7o}Cj¿2øˆþŽ)NL7óÎ耜h 37^AU˜ã¼§¼+>h#ë3Ȱº·qwôw_vg[gºéWv”a¢›éNÞTI-š¡ö97�b”îö^S6/³":ŠO½G$Ià÷¤>Cªlö%×¥½Ž~êm`êH T˜:7½ÔnÔ~³{zQLº¬Ë¿¢°d3䘲?rÇu,#¢.XTøæ z£‰ÉÜ4 Ѽϳ ƒ±ãôvĬˆÀmÛàŒ `GvÄ”×ó!R°:E}[6¬¢½®P O‘üJùÖ¸’í%·)d>™¥÷v|qõO÷Z ²endstream endobj 54 0 obj 5180 endobj 58 0 obj <> stream xœÝ\[sTÇÎó†±oÞ¥¼‡¹_Lå!ØØ&e'Æ¥WÙy@@ �ÿûtÏÌ™é™3gµ»»\X«=gnÝ_wÝ3£·K6ð%ÃÿÒÏ'¯w~´Ëgïlù ü{¶x»àá…eúñäÕòÞ¼¿r>x­Åòèt[󥱃[Z© _¿Zü¼z¼ÞˆA)V¯×ðº²Æ¯NÖÅý`¤Z�¯7l0 ZØÕY~õ"¼êÄê=yübÍoÓf슻ÕÓµ´‘Z¬ÞA§Â N˜ÕézƒÏ9Ó¹OËq(ÅÅÀ½[=É­—ç/Cÿ’Y›ž ]&ò² žšXHšž“֥酿¯ÇVÏ`H)çÜ8'Álé4¿Wæ“zôÒ{ºà³2æk\'Os:“ÜU–­XÝ¿£B~·VƒõÂ…É+ íµ†FéÍ"ÎóþD~]k=0 m¦b ZbŒ+xWªÁ;ë¡[˜³˜Â/ÿ}ô·…dz°stR0‚]9_L'U&ÿ9ôhôÑ‘‚âœB,Iž1Iňhð ÈéÕZ ^0¡»MßÐë³òxFÕ-@ÝJWz|^/„+‡"Ø$l¸T”ÕSZ4ãiÑÒó$›Åĵ2•ðÁ¤4ŽE€ßµ¦7Ù„º�ü&Üê>Ü„EIÉÔ(Y? †§ ÕIÇ.oÕh¯ž`�œ§š'úÅ�”v°Ô’κÀyYšŸ­8$ ù/HQKo¨|‘Û BÀ¥)êÒP“ŽñåÑw‹£Û?ƒ�npéšãX|€¹ +PƒÓŒa§àYbª|J}VnDj¹÷#ð�¤œQ«@$0Ù9ñ)d}ÇYzÄOAF K)Ò¨‚Žº‡%X;ÍËéÍÖ®ÂÛ›…'|dVyVÇO‰*ùÇW_ÃÇl�ëÕ=xÁ1k`ÕÄû6vy5Îà¹^m"ƘVDkÅ/Q`øØ¨”sì –., M�ÒâBWš‰êËòfå«6R±A‚cÙ§w—àÝ…]mpvt�¨Ò¨êˆÝÓÝ—¥ßÃPÎJ/ûÁønˆð†*¬,¿ŒH=]Çëi”Ä&f¥Ë^Çÿ™V ‚œiWa»‰ý‘¬$uŠ‹‘—Wƒ D~¦¼/šÊ�Q?}0®¨"âÑÏʉÎ@µ4e¤¬ žùë5Ȭ]½uµ[k)+Ç?ô´‰Ñ„9�Þ5Æ�öe�Çн¸fTEçiJ^´¢„fܘƒØÌ“<|R;ƒÕ“xÐbñ2f·uÔÔAÆbku{SéWë x!Á§íW»ÉB[í¨^ª\…´@ÎØÉ 0ÊÈ>ºÆ;�ú€YDâ$€r|‡}+Ï9¨ã~Žô·GðÕ�8 ‡„EOÜ9?=IšQyë±ÑÝ”ˆ†û>¶0¡žlºÄR>× F¯Ìp!¢› <9ö,ñ.LZƒz‚ 4V»D©@y;ú ¸D¶‡®„uÒQ6RÜ|-Ù`;âãH¶ÍHpÉ�yö¨ì>[ÃÄr“ÑŠ”î ´6VEÑa.defˆ_«‚‚ÔÀ•7hÆ@y½°jäÁÊŒÏ5Z\y~:Íó¨h%Xº'ô·æß…�yy§`2¾ô¢xÑ®süÎG“µ#ö¬S‘¡�À¼–é1d|mrµMQ㛿¬Eÿeݸ×`|•{%©Øh–øÒÂr&å*gyX‘LMë2)—hó²ë‹t²h'â¾ê v“·y«>ßÜ6U䎔OFq™OOò�ÖN Ú2S¹šýÁË„/ñz…(ì,þðuîÜRù—L{&â÷ýþ(7_OÎR�¼aÍ4QýWLô « T´xÑ8êX\ŒÁ&IŒ)å(|NÂúI¤³ÁKU Ÿ:)û¼¤¢I¨D¥Ø2ÔQÖßÑÚÁ²¥Ssšìg¦#FÂÛ‰îÙ0Xy»ÇRôa¸Üa ÿ9)üÈ€šFÑò�?ªÌâàÀø¼¨²×ë¿ÖŽƒ§ãÄ/÷ÓÀ³>çÛw0hÄØ+î‚ïðÜ‘äÌãOzÇùê3ìÉXè,Ë]KPÂO™—¶PܤêúÜ”‰¸ÚûG‹‡‹·KiÂN·Ì[ãRI«ãpÓêÞƒÅ�ß/ߟ_<]Üy´ä‹;ßâÿîýð%üxðÕòO‹û–¯¸™%8(Éà0q/kWkáÎʉµ(¦�Öòѽt´’QÈáåÚ4B5WùÙ} PòfrÓ„ ’K?ŸO]¤$huœ¿Ê›/Æ%“ên蘲õs%¡h1?¡‚›T\7FÉqïÛÕÿ¢ò$ˆ´zÞ-MÊð… öÓbÍ}Ã\*];‹š]#ø0C /©ãʹMÒ€ ç®[¯È©ÚM׉‹ª÷¶e´=ޣÞ Êp¨Â€ÃerTAX5t91³Ï0zÒM,ô8FöNçë<ãדÔÄTíŒë:+®«)륭ñv{"h=¯dO ¤�Çê*üo£ ZUíIª åd:;"¨Ó´›‘@ç²ÊqGf�]ÃÒË­ì.»Š™/<ážy»©§BœÓ>ˆ‰Ñ|À¼ø¦;ä·u-µã­&È p k¼rÆVW/Îô™DsW’�}%’>SxØžým‘àï%Ï۟ܯ‘g}€ ˆi÷øè^™ã'Á£8?# œ§‹�²5‰­‡°³™†+p”�Â<Ä.…á ©Âa-úY ÈVY·`Ñ©ë`ñf²˜O‹[¼Íl¾RÓöF‹A)Üð)qø2t—s^y:Ól¡:OFOÝT,eRµŸ”Ðb'@åºÍ\„� A°A(N‘p5®Ÿ�ôNº¹ºQJ1͇°º«Æž¿fÝŸLµPDKÔ¶÷ýRððVosר÷+u¤áIÅhÛý³9”�Ä«ò©ô¥n`ï¡б{¢é1êÜ“5œqÊOßOœ‡‚îÉ©íûnh^õÆ[?ûï²{ú*É¿ò&\Vnwb�Ô¤ˆ�È´JòòAÓ~Â>9°•OÁù}WŠ�ö{HïR½·§ø„¯JºÅ—oχfO@4¦Aå°³ÚK¨¾È*8ŸZr3TíµCÖÍ÷X€i ðÀjºÎAÙíkãà^5vˆC|³õ‹:s¸=ð߃�çÛxÊ�™ëòëÂ!øßlÀ-Ú#^çZ×ÞN^�Tœã€c¡ææ29ºW°dÖzûý€9š´ËnI ü&PÊ´áÞX¥íŸ&�^Ý�zº×ûlëå�<ÄÝ Ç�B/ùN >~>Oh[g3#6$çÏs¨«ÓÅü �ªpTNdâe/fqƒm×û@„†Ìܨ;£ñ/ÞìâÕå¾ST¯lgV¡V›&E•Ý×a¡’x¥�ƒmÕ±þõ¤OÞÐ()KïA`sî¼=Ô'ŸSSÃȨoÆ™tMŽôKðx×�„¼N >Ùo+!}sE/%KŠ3˜�¥Wëšè�› E(ïÉ&닲ùºõl5^A3žf,]Z#:WépS%(‰ãÉ3©ð¨¬¨]F#D ë›q…;”HÚÍ `!;$^î,œ°Sç¯o»y„©sCìȇ,zædDuŽ1lê ¼Ð­LÀÁì}Wé1ã—ĉMý§à�ö´°�a'aÄK´ršš á#$z‰ûlw]Ú®·ÁJ·Û�Øà“&q䪸ý`š:ÞYå†ÿ•©;Ñ\Ñ5,«½‡›6�I¾¯ˆÔˆvk©Å&¦ï†[šz‘ÚÌ 4ó«æÐØž‘ÕõFh¾¿Šò öS®x?máÏ8±$`³ŠË‰!pP˜ôÝÈ1S&ŒË³2æYò,i‰N·9ytÈíÉ屦 I¼ݰmƒ/jÞ¦5€L!HÍ{²uÙ¸�/3"É�¦ìÕbŠ\zz@·q§S�äéf"ÔäTuŒp±U¹ì�“U£Ýì�¦ –è êp/u E’‚±êvqJ©eæ¨".¢²a¶gĤóN 'Ê£¦t·²qôŒ¨˜Îx1[Ñ{™müôiÛ½Ê6 ëû-E‹1ž*Q–gª«7ã£r^�¼ø~ iº•ŽýÄr´d2 °©�<¥s¼ž'»áêJŸ²¬Q³‚ÏĶ^IeÀÌ ü¤,  HEWï6ÁEGט|¤ô¢J0up®\‡öF¨°§Æð%äçkÍÁ!ËÇ+:ÇøÑ8ƒãc¸‡€™kú} PD+ ¹äñ¾¸TßÏ/Ü`ñž#7É{_A{³²CŽ»Û¦¹ê×D¹<ÀÑ _561<‡oOn½SÊ÷§kƒ›0�@ô¦œ#å!ÒÀÁ’žuÉ&£0õe¤ØÒBõ£Æ a©Ò€p¼Þ¾s Îò§š¿–è§ n=Æ|nPN]Oaƒrý¿~q2NXï ÊBàí®}@ÙI‘Œeö‰ ;}”¦{ÍŠ¾�"¢GÉgr»=ªú�•Ám\N¥…ÙIó1(c°->þI‰p~a,)تxÎ=<\üu2> stream xœÅ\Y“7röóØ?¢Ÿݶ¦X¸ûÉÜËthíwÂûàõÅ‘(†È!E‘«¥½3q&P‰>f†v(¤iuW¡€D_~™¨Ÿvë"v+þ“ÿ¾|{õä¹Û½úùjÝýþ}uõÓ•ˆìòŸ—owOoà"ø_!–`ŒÜÝ|•î;ë¿sÊ, ¾~{õ_ûO¸H;ö?ôâ‚ bÿú°.Á £íþ®þüêp­…Z¼Ð›+åjìþíA.Aj¥÷ïÓ=Âïß´Ÿ¿ƒÛW·ëö·õ÷t»Z�ÛÿÆôv•Ý—íÊïj1V ßÁ<Âb…áúÛÃ5|¶&(rÓüÒj˜s ߦÅy¹¿š>'-Rú°_×6xâþ¾3 ×ðC¹µÝð'fzq¸–‹´Ä–Ÿ "wM� ޙŻtÿju«”!‰Õ¬Rg±®+<©=þc·D˜Š_ÖÕ‘AÉf�ù¥eÂmðé¿oþíJ Ń®ÜÜ‚vPq¤Õ»ÿîö‹0kŽÞžCÿT–Öž’¦VVˆ¥õk!è Q˜«]¬Uûï×xÁºª6^»§=7 À(ÐŒ(^ë`°þI× ¸œ~IT×�p-ô¢“n« lÊyв—9³¬Ê!¨º/^¹Aß•^‚7q³”v‹³Epür¿+R‰7¥ß¥i‚à7uòÌwmл¶3×JÙEÃ]䙃Ö*ó«fFÌý ½l~¡)ËÝAÉeuÊZKl\™°¨`zC�‰À·Ò‘¡^4Sé(Ø:˜þùJ¶ŠÖÙ,˜¶v+Úùþ)<ȯÖj¢fq±øÐ›×»j)AKiË$ûðcÜd+TÛd…¿+˜¨öû(+ãôþ f……Ù‹ ;m±wû_pBÕ’Lh�Ksƒøé6ÿXm–Llã#QµQ‹\QäwÕÞâö€m aüöñõ0Ž[ÐMÐá`‚A‹Dx7mq«d€:”åê4 sSþ±�,jÑRNáÚ^ ÂÉu1 Q,¿¹•éYWcÈ6÷6ÉxÛ�ì·8zÁ«ËTF»gIÌûÜ÷€ˆ>tÆPïÿ6ÙÅêA;²Yœp ¿-\@ÅÁeÇ�*xðé¿>\ƒ•Êü(Á¥‚ UM$kûÀoAò­NÙA Ä�Öd!oᣆø)\ v²»€îý%%‰«G 1"„$„fðh%Õ" B0ªÝ" ˜PêŒ^Q1òfxpv€�uC†(ù±­Ftƒ7I¸É¸q¨ü-±’—#Úˆ³¯vBÆ'ûÞGõ8AXÞQׇþlX‚ú þ¿ �‘Õ�>4gýž|×¹§|Ï+Ÿ½ Ф_V‚û+\ÚWâ¿ÆtX­T=Ó G+üb(ªœ1©Æ¸ý‰[ÃŽ·†ÑójP+¯YµJ.Uƒ¯Æ8à hØ-Ô¶‹œÀ™pÔÚYØ/§Àö�]@‚~Dx^nuî<‡›¦1 Mx”è:~U׸Ñãøœæ=‰×úóžÈûÏ2ðWÉ¢g§"ì ´ÃTði*ˆOM…¸Jâ@ˬâ°Ã¬àñöüÙ\Ã=‹7²x8­ h.. OX‚|ß´4²mbže°Ñœ~ssõÍÕO;eczŠ�ÙïëìPŠÌ‚ïÓgWOžý~÷ñçﮞüi'®žü+þçé~žýz÷7W¿y¶ûæÂLX¬rQñ1ËêS.¼fèV„­…™¼Œ?†—¥C š“Zƒ¨+½”µ÷•€´î�XsЫm3áû‰Òv1«Ùfoˆ§‰ý¶ñïŠê3_¢þ­ËŠÀ4lõí¿`–y›aÿwœOm¡ᾆ+D6¦‘‹°Åާ°#%æ �0éŸÊô}Ó2ÙO[T·±nñä1[œâ+$·Ô%’ “‘ƒ÷tÒov�²7’£ëŠ’Zf?ZÅ€Þr­%\«rææŒgA~ÎëäÿXì©ø÷�Ð×kXlÍœp¼÷yŠ-¥™aç×Mïïj0Ëô—ó¾W²( °ÀÂþȲàïÚ�ô ÇKÝ ÓJ&˜ÓÏ*Ç~Ö/ÎŽÆÉåÀKºUg¹2K$ÅbI”À….)¸Ó~¼5SD9?ÿ±’}cØ­íêh‡ÃVzYv’¦/šJom¢‘§íñŽ‘_ï’þÇõO¸E)I �CY(ñ¨6Ù„Tëm><˜�[z[´7°$K„¶„uDïÝ— #ÕþR5çL„:>óAOžKI·_¡}ÃR+þâÂáýǃ‹Ð&ò-°�ÞFô"Àù«5Ú£‹ÔkeqØÄ¡ip�� ,APYT°fÐlœÈÜÈËb†ÿËÖÈ^wME!“¿p'}yR–°Êª�ð˜‘V§$ŽDYÓOÕìº3€K >—‰#&ðnŒ[‡�â;eZa"9!�A.Œ¡`~§Ø�®$ÑøÆb*à�Œõƒý¿Ã—ÒyÕ½‘Íò¨ÏoÀ3¹¨ €6¸íÆEÜ´ ³bi‚3sÿIâ`ôŸ08HÄÑLvƒ.  vœkäTµÐÕ™¬¿ [™ŸU`SÁux­§Ïãð¶.0�»m_!*¬ª\¼ Å Y`ºuñ…4ЀóÌPˆÔ îç< 5]�…X¡Ú�ë ¶�æù-œÛ@I¯Vi2Ïš„@⃰$)Þ5kiAib,¯9 h‘W¬‹îxÂï¦Ìãµ † ›¬Á Äô²òÉèñøjŒ,ÍîXtF¾L4³$­·‹´ºë)ÄN!n�$”½ñ¿?`UA±Z�'W=KCdàø»Oñ¼ÔñÖ¢aá(3øÉWWHê‰#äáÓýGÐbËu·Làj¿¢‘`†èÅO¤›cÕ "�¢*;UQšNµ:ðÚ*Éâ:Q—«Á,ñ—€ küÄh=¾hœQª|\˜%‰�ì©‚þ!È—mÖ‰ªß=¦nñR…7áÿ¥Æ¡fä[*zZ"Á, ܉ðÕ¯���ìû\+í'ò×A7šô;”Т¼¤dñh½äÙÍ.¯Mp] ¤4&œ¨)<…×Ò™â°Ü²Ž“8ŽIª”*é"ÌãŸFr@Ý»T3‰�z…lÓ0°/£‡,Qñ9Zb” ®µYÜ>,ùʉ¡Òkßov’þÚ+õˆä=®,Tçõü`ËMPûÏøIT¢â îÆvøVH%Ça›(crÖé6áÃþ™ÅϘŒMÔä3�eKÒ|ÑÙæ»”á„C@à¨AóŒ‹q�‰¶>Æ r=7SƒÎlå1G°.x ¬6K%-/o÷;3_¹È#ZfÓ·ìÄ')y!b䉎–䔣àX�;iÙg/JžZÔH¸ôuŸBãˆ>ßÙŒý0GRé ' Í6™„ö1%)æo3 ð¬j#A¨Ì2Íà?xUº®˜å)®Ý°7e‹´+GœeN/S8vYÒ>Ñ{_mŒ�v'VA@ì$P@r`þ~ÿhRÒ£§Ì qž&g�yŽKk0¥L' �½§Õª\¹©Ôk¾Ê…Z¯Y§> u€ÖT3Évæ8ÆjmÇÝàÍWGȆ uMŸÁ·Ü%"΀ËÛïº.­?‡Ñ»^ÅR¥f Zâ�ÖòFråòDªEç[V;ܬ©VáU,ÞJ�`Ê[ØrUpT£¬":ÄÖ¿-kïZRf¢¨n‘~’®ŒÅµ4œIéÆÙN8òÏiºÊßÔƒOJ–àLw±Œ£kò&xÚŽ3f¬haUJâ‘ÛFóãïS¡ëV¥°èÜGÈÂÉ›mr:R;¹‡‰Ò0l€œär·±{§k=_ ëH&h4q’hImœ%»YmO÷+Iê´º™ÊK�ý òBMpá:(�Å«ÇÉà·nbI¥kZ…{ PŒMKÒtÁÓL.I}x”„ô¶Só¸w Qú6õ ÝʉùÈ §G'“-‰KŽ,Ö¼[2÷¹€Â.ò%ûI%ÜI”ö!ÁsoÛï-Ýã#ðô‚ä_]Kº_˜ô¯µÐ‘[,á3¨ŸÇBD¸¢b)Wƒ`I”âqjƒ¤¯¯ª—”8ZEì«i:¿é•ŠÁsì•"'%bÀ¢½R°~‘à™HÝŽ¡nRe¤‚b!æ{†þóÊ>ÄÄÀ²a”sj‚ÉnÌØdƒ°KdšW0ØHܧ±[O†zÄî’´¬5N�Ï"÷pfõ†3!P,MLˆÉš¬Heëb-¬ ±ÕM<í³ÒS óZù‹\+F�z¦ÕÍ$oNQàîû!Б:â¸ñwiÌ}lÕ·R@ôì£J)¶w]–˜÷Ø ¨yÜ1(òsžD£º‡–®šNªÙ€#Øp–ž¤\Œt�Ûú”Ǽ�NæQð5©¾G8Š4 n� ?¹é§ ƒÇ†¶‹TXcËÙG¦Œ�6ïUŒøcÕÅ7Vë"=-÷ÿ˜¦á¤ -�é8‡¶«˜çzQr‚/¾¡ã¤1@rº?V"r<Ùza<+ÔeñQ˜Ø?Ã擄¦ÆgÉ">tÉwŸ´d¨µ¶0Gã&Gðd¯Rn<6úi%Ä)8Ghɱ¢']Õ,ƒªñQB‚§�bOÍ!¼ò¯¤&W²‡uú—°ãBÜê° ˆ�1�U$eÇ)eŸØG|°ì 79Ë7aÒª5Í*T®�‰¢Šß]½²]Ê“íAÿ¿i Úô»g †ô;’Ž–& /ÍÓ µÈ¦µ+³ê`ó¿Jíµx €?fÀ6“tgŽbNo»6‡’“k"]ŽúкMÛÁ¶·�O 7` LÊzº‘ö€?7DÄ£ >=P¬‰¬�orÈç5�Û›Úí,qÿ=2ÞðˆRP„Âá×Í1ÅáÂÿ©{À%ªçhºØQ‰$Õ¸®Ù×ÐOÝúRÙu–HœÆó=-°=•3œJí`P5¨VWn>¾¢­”9É>d<:™XOMÄ"Û‰û¶‹@1UæÙ² »™�ò3㙦腻{ŒêT<‹©¶Éxd »d|¢$p¬hx«Ý"ë*¸#ª�Û©ü6\6l<̽ìÜY”Äv3ðtl`ÚF:dÀú¾Ë7ͺ÷I ‡öܱ©q¢hÏl‰asOjeΞ)†©(ö¤:•#¸ ÈÁ{ò…~>‰úéÅ ÇìDy‚žH¨<'û14ZçSÒ®õÒµÄ4R~)­LÛé¬Õ$5¾£†Ó†Ç{mÓ¥žÌ@°9¢vñŒtø"j÷à\¥¸*KŽ[�êठZkçp›iìΩ=ž*6Âò>¤ Ÿ®´äâÞP’˜ïX^OÇÞµ‡'&DM½õ†õŽ—*9r®G”܃’[^ÇÏÈ;S¡CjQ¡èž_p’^’à��î˜4›{UOÛäxˆ PÙj1ŨŸ2°„í+_Uùuùðòx/›Yið§Ô|5ì!¤r¯­\Øò¡Í+¯[OqÿƒM2ãÌ´›èôÆ‹Ù!;9víø>¢M’†XÀw {n-n–nÖž“i§¶×4*} ÷ãªWãñ=$›7Kä†Ó9�I7[_+Ж*¹+–Öè!vÒ�9Å@øãàÍÒ@­µ`ìÞÌwÑ' ¯Ô¹Î"èÌŸâ­Ú±öÁïÈòÂ’îÝ\[`Ü™H…ÅÇc£ó—J¹N•�?û]-eHtÑ\´yäÐü¦T–ÐmM /Ž—�ËÛWðFr > stream xœÍ\[“·qÎóF?â<žMiGƒ;?Q¶ã0e»,i«ü`ç�䚤#’¢È%eþûtãÚçì.WÊ%ëhv—¾~}~>ì›8ìø¿üïg¯/¾ùÞ^¼¿Ø¿ƒ^\ü|!â ‡ü¯g¯ß^ÃKðŸBlÁy¸~~‘¾‡ 6ypÊl ¿¾øËñæ^ÒΆãO—Wr“VÂÏé¡ðǧñ——ÇW—ûœÜ�=þíòJI·Y/Ž¿»¼Ò›»�ðTmÆ*#�·—Wûf5ÌâŽ�.•Ø”sº{J¿K¿½rþø¤-á;Ü÷ø‚»1Ç¿Éó¿^’Q~…ëÛ7)Åñ Ú ßÏóÂ¼ÖøôCÙë;2ò›òð= ¥ì¦­ï†ÊKޭΤ„WÿiµïB§1Í.uü–¢�§”~ŽOÕ&”¡›gh'[Lœh%´ï^þ{ã™ðMYÐ_ÿׅЛ>\ÿþâúßþ’_F[xGÉm×.’G½ çYMxód˜/ŠR%Ï#ø!�SöøúRnAj¥ó”Nö²qšÇ xì¾8�‘GÊåYgÛ'¯/•²À(Oa~f÷y¤=Œ¨4¼*Õ‚Á îÕÙ+�Èç¯ñsÚj�oÛ¤äÂåLCÕ‹ÁûK½¹¿‘á_„ÑŒüóÊ“¿ÿ³åmÕóÈ¥GõÍÏã´Þ7µËÆiýÿœÓ‰æÒ÷šL´‚.Ÿ¾B,GUÔã ä ̽»/"à$u W°h}¸[`D‡ëð 0% <È_tÎÄ‚+‰¯ýªŠ¾veWà”ÝeúóuŠ ìñeõ2�Y…/ÞºêRÀ¸’ÍT“éÊnèûÆ%}Jo*¯Ø7‰ÇJ¤€EõTË/¾h3V÷¶š3*V?á 0;xœf‹ÛN«b³2‰£+·¹¢Dèñ²w%qÏP(­ßü¾üÃRË“E;óªÉV··òê ~6 ³>Gö-w×IêOm0´K£/\†Uÿ Æ‚QÝôÇ:\ʉ°Û*C�LMkНØ@ÄtQÔVý?i�û®È:7Tñv\ »Ë´tðêË&#d$4ÈÀ�8¬Ck$düÖøj$Žrá Œø�"�ÑLixheTмÛ^¿ˆ .k•�>E »�Oûõ Du©Ò”•\)Li…:~ cøÝZ­Êâ ..ÿµ˜ÙhY‹™�R¸]^p;˜ÙÇ8�6Oø§# FŸéž§¨nÅt… �TßWqRܹy—e/[$ÝÁ[o6ø•Eê]|W3a%?ƒtˆÎ$p\ Zˆ¿`qÏ’•CH×Þ»‚µƒ÷Ó8å¾�ˆIãéˆéïÒàJÁÔ† DÇFÙp(02OhP‡al…bû~/�#Ïêku œÉhUÕ™·œy¨Ê>¨‚Ú”u‹QþJ€-Ž?°ês4 Ó†MÖ�í)Êâ¯ï®!ˆ¤K»Ù¼�º¤%Š. ߉{õ·#�¢úßž�Õìµ#òf᎚ N½ÉzûUUõ&Ûì÷ezÑFšMÔWÆT½+ µÄy�%S¼ÌöÝ��‹æU/–ÖL1–UUÐ:Y_0WºAža~~ ©ÁŠ_T%·š�)J̲–Ü ÚÆ¢2œÑÙêâ£tÉ`7a©týPaKf³’É6! TH›Pè[胬µ ˆäI‚¥Î�AŸ4�¸iü†ÁªH´/¬Úy¤Å›B"½FYa–4Zè£}Ü!Üø`š?Ñé"f§³ÛìtpÏÅëĉÑëH+6«ì=Oþëרîû¶÷ŠYV-ôJö ©½Ÿc„({ÔÒ½¡³¹=ÆQEáKÔ0 O•÷‰CRœb-Äl1�*T·c…·l)èÄ*¼ô£W#×âÏ¥ïNÓ€†˜žuUä£Eä2ñµüG2Ö`k¥€OÓ£7U·À4j6 óN‚Õ³Ðñ;¹C¾�ØØ¦gSÀ© 8OeGë ¼é‰I ÷¶7ˆQ@mZlt�W'²÷µ§z\Ÿó^#zÊ|p’p-Fˆ0a»á[m¾µÌà:Èu ÔÝ«P”ja­>^* "n4ù¾‹ Â3�(ÂÍ$à˜¢8+©�{®&ÌœèÁ~çvµ“`�Ç@NIþóvˆ?¡ÞtÒ„*²$ý ÄàL é„§2Ýy.·Rµžá�‰ü¹›p7GçB´`ÁÔ+1b¤8W Ò=³|^#'¢@ (PWÿæ�‘Ù}$8,»œ…@}WEåûKƒfODKP =zJFŒ]Ÿ>º”z“2$K_º…õø}ׂÃßà^ t©h¢jÑ"iû$Ó¶sí �Ë/Mq™8þùÒKQ¸ Öƒn[S<•1B‘‡·³Y˜ã¯hö¶þ&#uЦ íÄŸOëŒ GKÌÕ*/ƒpà‹h ¨´îÒ8Í‘lÐ�‚k €NÖÄÅ c“]0AèÜ-D4¨ 9ØKQŸ• i”°ÒÑ�õ VrB¨`޽†¹wBüx>Cgò A'?MüŠT(¤Uj¬rd­çò�ïx^c‡º¦E”«ZD}p西BM±HÃÑ„áSê,“È`lùUóAžJ âô1Jø.»„&“ö5)#Áhß+lßðéF9ÀÅÆ÷/Ü—*&qZôƒ{Æâ—â £æiI͘œúPukŒcaÐrºIOrpMö{Ö…äàx´‘I]‰/+Y¨¶ Ô‘<ïM��øÇÅvj6`éK#˜ ‚È9�Vizp)i“QJ‰.ÒÌJ+Ìî�ל…]bÁ{?¶×‡¶Â%öû{Kp}ªf޼'Á"AEwF"ú7©ÍHá²í�A“SvßYx[fM‘>¬Môñ¯òð9ˆäƒR«tT6˜¿;q°‚ðš¼ðÃìCfGw¿›9§�C†Di¹OÞ?ÒÑ=¼ÂT¨.ƒî¦dè¥'ž¬Å05tØ£HåÏÅÃãÖ¬èûšN¢q�ÖÔ“‘\SpsZ©³Î”ò{÷¦ÊT³|¡ù@3Œ�Í€±7m45DÏ1,ò÷@DÝr…nÁG}ä×ÎmXý OÓŠ»ÃpEœÌ/Çí0 :pûœ]+Œ_»X«`påï�Á)ü¹×NG|>÷p(àvW‰1ààžÉb~Œ4Æ>‡N´cfK7ä\>á›Rk³’ë˜]À”£NØ‘ÇD€ß1QJœCæ¤T3'� ™“°˜ÓŒ„W[?6ˆE#?#¬áþˆCàE}c#GouÛó[+ø/�—ëÙ4£7ûˆ~ë+.MÞ—$@%ÝÉXÆŸ@Ò¤¸²™j›ÜåÌøš§Ç€¥xËè:%;9ë(Þ DŽ59‡}9SOÄL“ý>Mp�A÷q'<…=ÁD£ƒ~‘}D¿¡†ü¬ÊX„,bíЫrm�ç_—n17ƨ’7™r�·»*BDJšjÓ,‡ØòТÚ9ü‰%àØŽ$´Š¡+–¦‚íÃu©,ɱá¬%=='`‰ˆ°D†iÝ>YEdità@guaýnÓ^,BÑÕE%¸ÁÏaR}¦»bÕåžK %æNä̬ºd[`í,Rqº´"ÌCQ‰D«5ЬZý! qŸ�zG�r°húÆ ^.F�„3z +¥šÍ»›¡nðL‰e+DÑ-4¤ [ð›OÁRd–©¡™ÜÕ¨:-�;†bBª³ú³µá»w‘¸’•pªJµÌš²€Xñôž�›jÏÝÔF¡>$ܤÿZqþܶ±ÈH ÏaQÿ”ÀÈ�ùmò¼�©ÞàŽ­»\!†(qɺ`c©EŒl`§}!†Øý£tÀŸI/jâÓ.»êTS 6KÒ9°Þ«äý·ò¢J?—,­õc×szÌp KIó'ÛæCã–(HÖˆ…žðÙ›˜>¡ejòñ±w•»¯ 3e±[VBÞb“ã4W—›è¸1ëOaé¢L,œW—šüöSÍ© °ó8h¶”U`v –°ÖŒÍ¹ õi†HÛcæŽÞF3ìh|rë*è(-"$2ÿì’vâ„–# Ž ô«¥tq}ÚzØ/@TAÛŒ,žNÜBŒÚÌÀRŸ±ýœ­Œ Ì1˜Ó}å`£w�ÊW÷èÒh'[74f6‚K­jÖ»sÒT˜1xå-{=«Û§Kl9ñ^±1ØžµwÆäYŒ`w»�Óð<&ƒøMX;=}ƒo~Ê9 5—䦅»'0Sö»›óÀŒOu ®ahb#€?'16Žðs2ÆñåWâœNDœ9×^üft`'�g B¸³Îˆ rH=W»˜Ð;µ¤Üù¢wßßáAe<ï‘HSd¨kà"÷—]¾7¸ê´këai;´Ä£¹ç)3 öHô˜$�ØTÛʹI6;9ç5¯Â]3C^5ä\Ýž¢O(%-'ð�H‹Þë9ÇÍ‘£+6DêfÄ“Oåvç—9*׿žˆ±d9:MMU¨@[:û*«Üö:/\˜4r”o‚ÑsÀþ”ÄSÉÂÇœ…˜*1g1�[Km‚Lt•åvÕ0v€Œ¥eì éz[¡ÓF 1OV¢]M cÔ[ ÈØy’ÂsUH½¡hU'’Š";¦a4AÈ+i<,—ö™nå¶¼U¡šÄ{ª.¶Ç8VÚ)¼uØ�v*ä·SÕç®’­êžZ"˜w+Xô1« ‚kÑ� Ð+1ãàÂi`ÚÛù>¬ÃD'ìªÓ‰®o[á…{DC‘�†S�bZå.Ó„’–ö¢G‰,=ºOòDoÓ\PK �?U²*Á'džsFI ÝÇ?9›yÊ¡Eؼj=§É´ògá~®=µ]ô©ñˆ‰Z÷qDûlÌÊÒÖäA#Ê™~Ä…´�>Ç5JÁXqïÐ&J˜2Ë£°$휬F¬™Æ¬À©‹ o»hœLgžü�äìô¹(ˆ±·ZÎt.™…˜hVl‰ò¾ž¡�CCn­ “˜šš€A�œtu‹Ô‹hd’RFºiê×Ï&éæ%—®\Ü“•÷pVåãá,HÚ8Q�&Ò5]Á{;�âÓvÃ^³ÿ‹®(.2šíåâ̰¯°NËÖRªV-¥èc y}¬C,t;Ñ×çÜâÔ†ç^íY‚¶÷ôGÝȵKŒ9I÷0—XN€¨–@¹§sÌÍÁ Dz€sä[ä±}¤ï©‰�Ùë*§Θù„fˆrÖÓ­üÙ¯öf=±§rçYƒn¯º*ç:J‘ÍiÊ)YYïxr[ŠTZcÚâèvVÕ­ªï¢ÝŽ? _ Nž­ù�ŽÕ¸Û¯³åiÍS°çÓP•˜O¯¥£Ï¢FîÛ!ëÊid4sßmì{Xž +jÉwpç �ŠàtŒŸÙ‘ L9sÙDÁ'l[û>˜ÊGM¬¯ÝT¾›ly‘“}ú¶UíçS7锤ã IôÙ9ãò”1ÆÍ6Ôû'Dënüçs�¹Ù΃Ï•‚o¤‰¿Öƒ\1"OˆÂ·„7h»ïªƒT·Cðw*àÆ¹¤XGse°E[Oo€ÄnÇ ßñ�D¼�»Ò0æ®5”¢Üvt2¶«‚ÂðКTñ`ŸŸh‚Ñ ' ý qQæôMçîêQÅ¿CÀ Ħbgh:æ©KåÏ™œÎ.2ßeýÊ.ooÐ`cœ´wë8Õ»�éé;uœúêumõ˜í``�d{¸Àz¸C ûË^ƒZÊÂhƒYV]ѳ–$/�.m`ÜÅ•YðŸnŠÕ`(µë9–;ê)]ÓK»fü³±g{ÝÆóˆ¼½fމŒÆŠñê�ŒÔâìvÝŠ×ÚI#ý�qM�úy2"ù1•O0'¯`6Ï$DbS ÇÍ–ü\Yh�>Z£\ì„ÝSÓú©†nœÜÆ`¶®dÔ`¾ðÍ[.„ét…\ã´€‚¤–ĦüVW˜°-Í·s ¥�"Èá˜Bî7º×E9\TC¯Ç‰aeÛ—ëqD½£žñ^ŽÑZ¯Š´.¬v ¯Dôâ‹dGAñ®«Ÿ�v­PÙ­,òîÇ br”íN™ìÊO Š–•ö}©]F ^Ø!JS“q�æBűΟç©âÂóƒ¯öå÷H Æä“à{ˆ§b¾è%1&~_ûM\+W `Ø7ÍÑÛ†šå§–©?&z¥ŠõÊ}3>ÊñíV,8U?Êh· `�\Ò¯Jx}0sÂŒÿݹSµS Zá¾ú3RÐ|7mB ézZŽÉŒH.ÐBö"RÒUÔg?/|‹ð> ¹šûðáÜQ�Ñ<¦êÞ3�©Š 8=“¾ÏÖv<û”˜tË`¯47‚O-ÑýÍ…µ‹†­œ@�ùVšrˆ?íWž-n8(8ÝÍ–9:¼6ÙBÙhhþ©tkætÊ’x!d+Ä% ÔZŒæCõ–¹ùã>¤©7M/Î;1å.üò·×ß]ü|ˆ—î¬=€ÁÖñ@a±ÁÊã¥èß>¾øæñ·ï>üíâ›?ÄÅ7ÿ‰ÿ÷íŸ~ ÿzü›Ã¿\üöñá»{^–1v8Â4èãué„+?Tërú6MNDA­ÆŠa ʰ“Ç™£ß±H`û:ï‚Ñ$TŸá�‡�wÄ~ Õ�¾�÷˜è4«Ì÷�àÅ™0‹Kf+_hrlWl’{7oÛå'ãU�†½Ř4{Æ=¦¹Ò:]ÓÃ÷5°ÊÕØÈ¥Š9âd««‚¹¼]ܲÚ||ãû™ÏÇë¯Qi•¢‡K†ÔwNŒõ‚|­îý.gÊ~yˆ5_|Ëuï/Óz$È’ûŽ°ËˆØ"ÛB÷F4ß]ü/ž»�ôendstream endobj 69 0 obj 5553 endobj 73 0 obj <> stream xœÍ\I“[·¾+ùs$SæóÃħ¸¢¸’rªG®â$�µÄZÆc�eç×§k¯ArFã¥T.sH>,�^¾þºÁï.ÖE\¬ø/ÿÿéëé.žÿ`½ø þ{þà»"~á"ÿïéë‹OÁ—„¾b ÆÈ‹GϤ§Å… ‹VÁ_8eŸ¼~ðïÝÕ^.Öiv7ñ•‘»'õ­W{±(åìîeyñt‹‡ýý 'ZéD0®³«„É]ÂØܯKpr5¿|�úâ ô¢Ó‡�öz1*»û¾æWkµÚ½ÝK·xìîGøØ[¡vŸï뢃JÁ2p@µ:·û>wAú°{·?( k�a÷,S:¯üî ¼ Ú ¿ûf¯cì«yU?|Õ|»?ÈEZåÄî§´ÄäÈã—õ©OpÆu‘AìðRÚe5DƒßÚï§¡V«ó:|y^¼¬Biïå¤�»!sÃàn±^å…Æ§Òë*t‚ª<T(ë$æÏ<úÃÏ#臰WX |¼YX|ùT(H­4}³�Ét¿GdMEý¼=O†¢Çö„íóv,(Y’…©n)Yé— BØ ÷‹*’¼¯œG­RrQÄ÷´î®í3MÏ1½#ûh£¦™<,>¾'‚3ÝŽß¶�>ô;n®MÚç£öñ8Q°n÷wxÏ;Bhqì^!ç]zPÔªÓdìWM®oÓ€sQN-`z½¶À�«vý”›QãK²÷nT¥íÏõë=ä'uµxÞÚ.>º-O=WUDMΔ¸�º„vºïˆJÐC»)_}: ¸hQn¥Àõz Ç‹{°à�J+Q0ÀUé¨Nx¹U ôX¬J¤7%˜ÞyÇoaÅÜñ·Á¹ ßòüÓÞ›EX×�Dgßx›n¡1àÔ³Ë!'="Œô Ö…‰ ·Í_ Ne+²/]…è>¯íÝÎô¥ŒnP­Šª_ dÛe ”Ç£Ù]¶o~�R°‹vú61>kѪӵgÉô„E]=€Çfõ9äësÈ‘J À‘ 6=CŒ4ÄhÎ ÜÿU´ @%0¡.| ¢‡ð- ˆ!~ä1.^K‚ýOq3ZÑ÷8K(�} ¥üóþ`–U*kè^þŠ'+¼ùŽUU* ¢­4Ú¾d±O ÒÇ•QBL–¾WÆt*b¶ŽÛœ QιWd$èù½cU›£/éf�iĨܠB™­34«Ômm�õ|ôŽÐ ã wS•)\À�½.Ùèƒ}pá—Ї÷ŸPñ•Ç;ÓKaÙE[Ê9Æ9A€E¬40ܤ°´Š>9eÐ7ÕëcÅžäª>@ü …oð‡RÔ‚~IA£·&’>Š’ÒÀ@{_R­ýª‰´Ùcò@瘼Èþ³ýA/V¬Bnåר �¬öǪè)×u�ìfíj*·ð‹Ë üž¦¡[(5BäÓÖ�Úmý[ÚX”3$´¿©Sk¹ç]Ì+ŠœCÊ÷zTg™WŒ;3ÚæœcBÿ¯qBc0aɪ‰±ç ®º=wßç’ÝQ(Örš÷J‚1JUÁø »ió”ô§ÙçeÃw4߬ö¿ž=ÎÚf¨½Å£äÙeâÙ}œëmì�@JºÂ:½Æ/{pþtì£C�¯dæ[Ræû€'BÓºç‰(æˆr[²ËOêQÇüÐ^¤YŒ >}ü‚Q/‚'аA-N©nYÞk5ÑÌ2ôj×\M±!&#ÃÈq™3†1f‘Ô_À ~1�æž„ ‡OÃZrwª1qMi3,í =&mv÷ߦ Í,7L[!2Št&Œ2j™wKX·´Š´ã³¹Æ%Kun`ï‚]ðL[þÀ¤TQQM¼Õ"Ë5gSm¼w[3È;Óþ%wc]o<¿ºBn”¶fLož›¤»’D¸ÏÐWÚ�¢Ëxio‡ŠÔq‹ÚÌyëˆE0àyQ=@ærõT ³‡«álfÈPßïøO³†ãwIýè�²a[ñH;ûøKÙy X|½œâø˜t@ÑÁK+¼6œçÖÙJl¼}Íg•²{ÍœMb-Äb}Ä7`ü,ž›>º¹üð©òÒe«BVcÁ·­:Jò´M3€ôÖ¬‹[q/ªIÝÐóQ�ŽOYšFàÅ£“žF„öÅA úe&‰ I,Ûˆ<4Œ ! <ÏSÖ&šý«Ûš’‰:–ô˜[ šOïÆpaÍQÂ:Xe;§RõRž÷­=W)¬`Ä—ls€€’!DlÐ'I¥d-¾«›Ï-«çF+mÏo\‘xØ"k¯u ZT˜©“únÉS‚! ½“©ŽÞÉF¨º)„ÌÓ‡€”¦N-ôr+–ëŒoí˜ßÇ œ¢ðjƹ+*¸¨÷ Œ[a�Ó�× N&%æÔA\jC M+Z8Ÿ—N&ŸM9‹šÑ¤¢�L^~«ô$Q›ö$õb–Ø%I?7,P)âòÁò‰(7ûÂÐ7œAˆp:‚$]ßì»%P¹dûá»�6Õñ>¼ÜZÚˆÁ¿Éõ~¤%_0Á •ëýb¹1²¾ç!’bÍ1Z\«¾]oB&îÜ›óýÁ½ 9ÇÓM!$4XUö®Žö–Øa™coIïüGѼ [y�`z¯à/@)½W)Ú§ôÞí¾«ùõ £[n$waDžQIjï�B*tÓ�Á`ùji�\‘ŠIüf ¦ýxÞ?] ;Á߂Ԩëîˆçœë°¼$Àp¿å ºm¨þ.ÃJ-*&62±ÿ- `ÑnÏBžC$ÆŠ×yÄÔµ®¨,s\Q€æ_fÃ(PSQÆu“´º²’›Æ¼®ORs5»Áµo<–QÂ×Þ…öÔxefý™t„ÆnªÃç=@ͽ"šKêj\uIO.ˆé UéúPE™|Âc´¼ƒµ†ñæFõ¥¸Dá{Ê„àýd}Çxñ�u}[ÊØ¤üÈè·ÑÔ¼­²!LÂ䙦¿3^ÙÁ* ZHíTÊ÷o¢Ê8Ì›Þa–º.[&éšB¶°_©3�­”–¥×ûl,–ö×—Â8ßûj˜Ã(g‚Iç{KUHõÚÒ7ø"H§ÙËJqCe-·×.6’ù€Nð£·j†:ÇñNpÚTÁIë e“o3Ç#³ÆßƒÈ¶*†BÙ¸Ã#Õ¶£}Êü=�ã}ÊG®ul¤¦Ñ;¯ ¸Ž³)kM“J5;²õÂ\ù¢@,½ÇI¢� Q¯•Û¿Ä\,Ø`»Àö°jà'UkXs‚XêÏo<èï,uÈ_Cì„0J²èŠ¨ŽžÝL�]Þß@?�ëè�³íµ­1ñŽc¼× iœ#zN�èxAzg—Óî$°º‚æ ¢« á([�W�£Í÷Ö 5 ‚$^�˜«UFÁê>* Ô™4“õVˆ&aä1õsåÍìù� .ë uø©äë9Ö¨Oàq>ÉTÁÇûF?_k2aL óòï%�ëÑY9þ²?ÖVá¦Ñó\?V*èÙþö®y&£3³6@îÊ2¹ÑIޝî2ô7/YZåEþ²gnéû®ö=ïÆ¹Žèÿuåå¼Üó.Þå…�&7Ó¥|¸¦¯{u}3޹ċIù¸úq®ò´v§¼m•�ŽuÀ—p[@5vmµ>—ëBh½–=¢ÊcU†ÃÁ\2DfVCÚ¢u½9ÞX"Ëd�‚›wdä€ãÇbïp ¿ƒx"›ý!Ãfü«�a+�î?»£²h 8æ†#QvúçøV¬7ƒÛA[AÌ“ï�C’BŒ2‚½!IãIjÙ’‹‘ @~—éR%&ÞžþSÏ­žl³å¬ mÈcŸ`Õ²é/×Ã\D~ä¢Z>uV‘Eº°¬A3ˆ¸öÕ9m•™:�<› ×Éï„Mµ ñ˜÷%8‚x·êB‰g‡�rƒ$æØ�\)ZŒösö/;u, Ûw†\vn76åævûÌo„…™ÒP‘¿õwà ¹�&w-æ$t©¬"³¼©ã°­S�¾lÚÈ…¾ƒEJø „yw,ûFy‰v*k}‰ß~øèÁ?àßÿ�Ei'endstream endobj 74 0 obj 4614 endobj 78 0 obj <> stream xœÍ\[�\ÇqöóÆ?bü6hŽú~‰�–%' lGR8€í‡•(‘ŒÈE‘¢”_Ÿª¾V÷©žÙ¥VI`Èœ�9§¯Uõ}uéþî 6yø¿òï—/®ÞÿÜž|%ÿ ÿ=¹úîJ¦åŸ/_>|Is�r‹ÖªÃ£¯¯òÛòàü^ÛMÃ×/®þr|v-7­½;Þ^kµùàíñõõÉlÒ ©ÿöè_±%1´·(c„Ö=†÷?º>ÙM(íìñÛë“Ú”S.?�V£’.5&6g‚öáøÕµÞ¬ÓV_åoa þx“_Ó^Ö‡Ó×ϮŽÞ׆ñ‰[lØxŽ=’‡ÿzÝÿ(ƒVtЧ:ê“4›É#ÿúú$7˜¯Œå�qÁäæt ô…¶T__«Íx+<»>róN¨º>Ã0“æ$­qd…ò”‚:>º6›ÕÁ™2w%¬;¾€¾¢ÒZ‘Õ»×ÔmØÚ`þëú¤7å´Ñ?²“ÐUŸÄoúx˜qÿ¼Š’ 1ÛhC¥¢ìzÔ1‚ɧtŸMúšÎ¦ý�¿p{ä¡ß:ÄW©í¤�QÀ>EåM‘d�:¾�9¯¥¥OÞ¦/ù%0r“d ~-…?þšVÞi}üÍD!¥:þ{]‰�aþ°L ²´öAüìf²0YÃÔä§ùiåÊÎGéŽÂ{A8g4,œeµ°?Â^i·i ™W…äeÊ?¢t«l<þGtСoYõÇ´B…þêó¾ÛDó^±=?®/mé%!`ŒŸãKRD«ËƒÒ„A p^NÅã×ÚlÑIú\^€à‚%_~ƒôQ…8Ì-8´Á°ª�4úW�þþ!tºŽ(¸º.Ê’ÙrR>zxûOmoò.yíÑ¢ŸMæ"Ìk¥2›×ÿê0ÔB! �êñó·†3L¯ç5 Cs ²7wJ+"D<þ~rq1\ÁØlÑïš!:*HÆ—×Zo.À˜¾Iš¿Ðùòk�QBÐOÛŠRu|¯+ì9û0ˆ#µ­U �5ôão¯5JŽ eB$üQûÔ�àßú+ª�«ôñ£«Ï®¾;h—¸ˆ^8(�=˜ýÁÁ°Ð �ùð“«÷?ùãáõ«7_]½ÿ烼zÿ_ðÿ>üôwðÏ'~uõñ'‡ÏÖ4Gp4G �ÍC7›™è4©ìkH…¶O§O×HƒàGíû뜙|¶Û€´¬û�®lìøö×­¦¹á7î‚^)%7a(‡)ب4 Õ+H ÖUm"Æ$¥99!W¶‰®Ùü*t�#_vîvÓ9/°�Û£ÛYê‘�A7 WvP -v?Ü]M.­6.YëjY�ÝQSlpfÃï`‚;]ü…+FX¢õi‡d:ÿA#Ò,3¶j›‰É“™�rà7�Ã(Ú¹K6v6õ+$,~óÂݾ|EìXß·�=Õ„Á²ÞB²¾DHÌKø`ùï鋌4HƒV’lÊ=4ö´‰ko–1ôßûÖmhÞ“ó ¨ÐD�µÆÁ�v„U¬ºÆ@‰:5ÍxŒãŒH8†w8:6óó4åŸ çgRÞ*Ï¢ð’ŽÊ‡…|¶c“Ã8³$À£ é'ãÄæ¡ªé0Œ{‡F ®–U õYæ‘Û¾ƒ,Öí5ÊŒ�°©ÒãÒ pRÞžåá)[‡R­ü¢›Š;*‹Ã,¯[ aÉGÐ>VT Hm@†É!2I ’Ià+^Z_àÃa3z >ƒ¼Â0�ºV(¹7³»¨A&~ùãÙ Ïzƒ­cÄðs¶Ô…‹i7jˆ jpy¿WD;ͺ¸£°ž¸J+í°1yT¼o±ðZ)B¥€�r’¿ £¸ò“6i¡‚7+Ï9É/X—Ĭ’¤üpmí†X¼C†xÓ5á †Êô%}´9Â…bã=ìÕ ç 8AÜKóiuâ#/É,¾µLþÉ‹Är²ª ª~ËX~tÝnÚ£g ?ÚæÞÍð{·9�oÏø{\u�•(é{e�¤{o’ÛwKî• �wD#FUM}˜¨�š¡)œ¡Å–™Æ§^_(+3À$;fg´éÙ>�où¿‡�Š dcâP­ŒÅV“]ƒltÉj‹ó¼/ž—V›‚¢ù&#Ho9/戩ð@¶öºŽÓoûåf‡+%cYð5‚ @+îÐg§0NµwÉ ñ°•¦ÌŸ ,‘@=cþ»N\à˜AR�ø:¿lÌ…PÔ°çF€8³ÂƒÆÁú¸  !ºÔúäj»1`¬:km€rDuO~©�Zlj_b·Ufü(œI§2CxÕ+œ™Â( á]7ý÷AT©PáÂzcX¶Ç–o‘©T�¤'‚p€E#ÄôM}²ÉÛ—óV�ex0$h3즚$®FB�î=ÝËs1¢�èÉ(˜Z÷Úö„+‚(è�p¾d< p‚Á0Ðzo5QŪ‰Ì[ý› Oºº0ÑP!‰P¿inÏs>8³ÓR˜ÊœªR+ ƒjõ¼S¯7”Á6!g"¶`óŽ»�ަyòÊ—œ'm)ôÿ¶I´ÿ) nN±¬¿ê¯“ôg4( ŠgȾÊ”¹v˲߅l wÐùë�(�³Â‘jCW࢞1Å�ÃÝLÁmiKš½×4 [•(Æöo(YâÐep—¼�ÄÅ]Òtå QŒ:c‚"{a­”2¥ºº. ®JpŽt›ô;""4j†XÌw•;½™å3k€( ´t3]Ó §_c—`Åz0¶ãÈ.v9„âW±K0&ÂÁ*°´ê—‹]bóð t³IwïØeb?˜EXiPÝÔÛ °û¥c›)ŽZâ¬îV(R4ØÀ$™ÞðŠ_CËJ25˜µ—'š™ÝWÍ{ia7£X´{8L 22¢±s#d̾•MÄ7#”0iª‡·MѺrùc¢›•‘ù³ŽÉm7ü|�27v“n ^Mpℾ#Ü´·rF;¤?:ÿ® c{{àQ`)1ËíYzïg¢¸ôEļèŠú%M*›uÐ��MÈÇ,GΕi´þ]›¬rqØ“¾½AäU`¬œ0KmÈ`¿ÔØS�A½c0"›²Q[³Šî º›Œâeö©G¦…˜j&Pïøœô „W-1?%tV-&zVð,éy@îV4®ëU€/8šõ¤ {…F{ψÆóá;¶üþÚ»-bܦ#ïšÂÏlt(¶9�üÃ*„^òe{ŒH­fŒðhÜòn›à‰M„ˆä÷Œ)#4ãÍ“½�74ºÅèØ8Š|9^$•—9ô�òØ#2ç£ðh�L Bè�<š&æ¢na3~,s?áéd�jà{�;)µ +GZÅn´<ñt_6”'Ë2lMf¬H+c}¯ØA+Éj,9ýŽVwx~ñ˜óW¬v¥h´`{÷gäÄ‹ÏfdŒõ^3;Õ°ÛE¸J¾^î€sYðB­ç³§IBkJsíJ¶ÀmÚ´U“ÂÎþ6*Û=µÕÀì×§°¥ÑøÇ]+õ&gêÑ‹ žýÔÓxâC†d-B:y�ó™æeŒJŽL€˜‹·Y/rÉ€¨ž~UÛ^¨†ˆdвÊ{)]w¸J!™0c4 Ð/!Ñ �aÔÚˆu;%¦æt¬áX�´úÙ°`ãåd`\gn´Ú ŒªP̬@yÆaÁ³Î/[z%Ý!´’u¤»U³Vi©o©]ìp˜�^ä0Ýï÷Àe0Lw&ñ�LòÈò³ƒé©q¹ ¦·�À8'08 V³s«Á‘à¦< )‰ÜÂ> K"Rˆ~‰O@Æ÷;jˆ3ŽtS‹¾áçç9fΓMÏ?õHæB¨�²f8ÀYQ³„¦²ôá]øuÊnåû–0Hš>Ñ“}œ­ö`ÜXqÒ5ŠDAøÈTÎ1º5.�´ß×D>CËÃÒ+^V¦íÀ¦VÕ9'í@ûÕÎwJùÍÍåmN÷evÆ©íJFM›x3á¼㦜\Io5Ó\®s™*­ÊJË0—ù`Á‰\`à{9fK³¯òÚ;á!îÁ8$+õß-$@çœ2è íàƒ‚-÷g®üD ƒs¦Ú¦1ïÒÀÆÒŒ\lQÔ�:óq Lšj¹¨HÈBh†ª�)ƒ2LÂÏfaègQåðw¸fÑÙƒ™‹†H˜„@Q2cî~ü/iòΛöÎÜ’ÄQ¿_bâºÍÒ©3õHF$©s@@²gižBàôN„TO¿�"´Þ1Œµ+,\&�³ƒ–‘jOÀ"g$Ãm6𨅶h¥!¯õø)~H3J¶gfXœÇÕe–¬‹S(VœweÉLcsÆ·HÔ>(Žj2‡´JP<‡´ì٤ή²yž(d(Á}$U˪§’} 5Õ¦±™L�Ò˜ªíûBˆÍmÓ€'9¹�¤x�*�&ÎRŸË×�6|Ùàfà&i$ë�{]òªÞZ”"å(h¯NL~.òaè¾:]@V£ö6T ûš4éá“çm!V©ÛK‰Øy#GÒÜÆ[<ö ¢¤%‰©í "ºÀ#3DÉz<{4í2eòS±¬qkeÃظ P¼²³…c¼«…Ö% ‘­Ë\U ›’ÌnÕíÎC4w‘2kÉeØù9˜d×g¡ööÛ�ÆÞ,¦MÂ~w®‘±âug¬°ÑîôÜ=™£æ{«éà ¥íܧ„>£9rUžl̽—~òeqäÈàÉX±y)W¦°ˆŽF¨.åm©²œ¥Á¨xÝ»Z8ôç"[C4 � øOFYêУEª„c F!®-ââ®ÂóSx‚—8R80½M®Ž8Tâ d\´ë>¼Ay¹ÁÞïòkiÌ u!âZ×LYƘ.Ï*Lƒžhã¯êš�S˜•ˆ÷sê]ň¥bˆ�Τþ+21å`yd˜�;‰‰'rþ”Ù’_Y)VîÔÆ»åb” Àõ—d.­Ž~×0ZN¥æ…q‰/ع)Ÿ¬ßGŒ…ä|—E¦2|¬Ú¸g]7‡ÜsKçÀ/á”çÁï\¸g.Í$â;R¦Ã)ÀWßr±«IÉ«pçÉDV£/;& Ó¾˜â¾¹3NÙ\ s sè «Š{ìŒâb)#âK}úqÉ�Jc ëÝwãYÆm$X*ÚJ° 8ŒG” ì�gÊòñË1��ÑZ7”b¶È& `B(mˆXY]„øY÷¼åž~]¾uã]X<µs_~5DÝSY<Ÿ2)g|¼=Yv1Cà·¼gìÍ©…bЙž=ºŠ£zR B‚ÛÈ5ãŽiÆz•�ÊråÆƒdE„†æ—�ÔÜ£°­¾‚±q O€Øýù:(,óñ´R¬�j8@ä™WÅ ››Î×éöïų8‹J .ʺÈN¤œ"5m‹ •¶4 óÎ�sm“"{½�9¼èÏ÷iáê{<ØëIÁY‹»^¹LG²ÓÔÑ{9Á‡åýŒNêľö) )wW3¼ûj r¸ � RÇÞ�¾<! QçY«$Æ9¼åq=ª–|Ãê!ÞŸªçvÑ9ä–‘Žƒ©¨>­àßcùo/PÁm Ú žõ¥£ ýÉ;ß�QF¤å™CØ;”¸©Õ�L©Vßå ‘½ ²6òy­Çd'Þh¶œŸÇâ…_ö¼oÜ;–€]À‰8kžkš÷Æ«7)#: ™L:å|Š;W"³`HXä1ñvx¸7ñ-.­°þl`Å™'‡{9wx”îì €³1˜;ã‘‚EBÖúPVX»‹¡n`¹ •À ððfyï†Hà1ä‰ÅöâÝ _4æ C@ÿA!iq•™KP ¼ÃN:Áþ;Ñ£ÓÂz†£4Öà©*ü moQ²¸ÚøÑ]a«`u1›w 9&Óiws¨æ» é�¥ÖKê.›Rq›Û”£»h«zZÄ~nA R :å#¦y8Á,†TOá­‚$V=ÔŽ©ê¹Æ”ƒ¹»_åÆJ…Åt2 }ƒ­8§"{ó\Ä#ñÁð¦m/r°ÀÝ«¼ÁËí‚ÍÒ*ésê/ ùMŽÙ¬—Î'[Ïš  »Ð¤4-/ͼ9ŒØå<ú­¼÷�.6lôB࿜H�îlkûÕzãÖÈ<»¹úÛwHüOJç[>KyP­‘£W•¤["°^á�’­¤NÇê¯oýA.¯æÊWU4~f¦L@$½Ñ–Vx¶¡8�û�Ëï?f‚‹XQfOõœˇGäþðH6Ö :¨áŸ‹Ë1ÎÉçFc ¦÷•yà@<8#u=ÎÊœ¦Ê‚Ûél‚è^12]dƒª£ÓI$TmuÆH/R¸ºþZ0ÒIþ®LÓ4å~ 4�/4ZÜO‚§îÀ*&#Šè1öÆfÿ1~ØÊ#+þëôwÖ… ­nÐ.¼Fn/¢nx,H #qA*D¸Ô /Ó ÖÈùxwœ»sA½ˆèîUxæè:ވĜF`nqñöa2Sí�zÄÕúíM»È�&xÚ©K¦3á–g¾wUµ´§º²}tšOsÐŒñ÷~bh¿N‰ÓÖLr¯äÏåë–†B¼×mÌ\ž ëŸ5ÕÕcúìõ'pZ®\ÓðËåsÔôócÅ#ãJ“Óå$êßbýûûÞ¥n¦‚7}ÐËxLÉdï«óæ“ xìW„T@øó‚× ¡»?™")gâî[ˆa 3˜ðê²<2Ó£O9“n6ª²X‹ßÆIxIr­ÅEXLØß�wæ¤6JÃ`'˜¼ñ¢\ˆTId~…)ÀVêÉ)ÔÝ%lUcB ʃÊèÌç �øìê vX˜endstream endobj 79 0 obj 5843 endobj 87 0 obj <> stream xœÍ\[“µ~wñ#¶œ*꜔�¢û*È­HBÌ&/Àƒíõ…”/kp~}º%ͨ%õœ=‹ P.—Çs4©¯_·ºç›3)Ô™Ä?õß'—÷~÷0œ=}Ožý þ>¿÷Í=•œÕž\ž}xƒà¿J‰äœ>;v¯<­Î|ñ,' ܾ¼÷ù)(gýîë½ÑBÚ wßîRx ãÂîº^Gv¯öbbŒ»‹=LnƒO»›|õîÉÞç�Ó»§ëU¦âNì.*¡•ßýoÂ…ƒWÖg_ï­IÇÔ½»ÍóhÐB{Ly0! -®g¹û ïØ–® Âw–YMRu›F†ÐÞù‰Fxxi�^Ãv^æ‘Z:_/¥TöËó¿"I}GRa@Õó  ã§ûlÎgêØžüø©–ÁünÉ"êmXzªKÏ zÕFä]8©-}ìš<övç½p&í®`DÊÉHg óλ¿F’zä­¬Uv�@z;ËK~êQðÕJ¿Ft*…�ÃJVæ>*õÖí× èï× ÂΆÝmƒÏ�øÉJiè¯q\¡%ëç9Ý~/Âc•¢?ß�3y†Âf‹"qPQ åÕÙAYa‹4%jd©2k‰:]!!úZ©â�ꩪ]‚M+ª3 ãB?˜é»½±"y ÙS|& ó=ÞôÞjz³©QS­çmÃÏÛ{¦mÀ3¼B/ëÙ $E::#TŠ[27 Â…‹YÊ€vÚ+ᕞy “ß૽Àk�@rU©áô²®n’gxO‹ØkÍ‹U1Ÿ®¸„‘6Âf LiQd} ëþv�bLfÒb$^T é•Ó¨ÀmÒUºðõy�`ûˆ&¬v¹ d#i]±3Ê•…økéI”ל€Âßí�ƒ¼lÝôTï×fßjx•Ô»ó¼õàu¡>A^]IRgeYhA”e–(tI׳5ºÑd�È,2l› žòá5Ò٠ú�^vS ŒÔãl½/âÏjˆÓkÏTÆ(é(Û{^6…ìO”,#H»Pv4VYÖ¨å§×m��× æ×†Î¹×à”µFw±ÌÚ ™¨ ´† 8ï@ˆ+8Õl‚L ÄX 2ñÁÞ(€)Ð5wv9ë�4†tܹ>À E¢ÔhâbNõìš_kÛíÅŠN#�AàºdêàÄŪ|�Ð/ŠŒ,ž¢•N÷Ê^¤ïÖzõuÑE«*¥P«œJ©¬š$f/VôUç½(4m˜’p:É‚{Íšwê\z tÆl»+azP«¦uWœ†ÌÌSÕëhBœ_uZ â»bˆõˆ‘ƧøxL0eU…µ Ù‰wºDĨ0¹]�8ééèÞ+æZ g·6Ä…"Z ,@‹ ?CýTefè÷�íx…7U·nÑ«�za1+ØP/ÕŠYuš0kñ�É1WX$9n»glŸº/­ˆà¶"˜ŽeÒªD�[z<B¡P‚SAS¼†w5ìD¦ ¥ùf}å c+øgPi®x—&í2uÚWBÔÕ,8  úéaý€W´ãQç+Ö%¿½x�¯÷"·�¬z«klKÙ�ùù®Ý„f (À|˜à�å­”�¬g¦i&ˆÀmµ‘MaÕ³©ô¢=œm¹¨«Fhò(‹ >U#ªÌʸ\Ÿ~…+30’”ÏÇ7ÚP¬gƒ£jR ,ò_öÕû"æE8ÀÎ.¶»)yM"pH�.ŒÑ“ã¨Ô8…†�F7¨j/¬5~‰ÙãuÀ#î&¡Ï–¿ÁàÀ�‡ySÞjâàŠ2ŽˆFÃiՙ¢Ñþš$àï Î^ {Õÿ¿{�÷çué0 ãLbˆ ©T./ ÄFºXj<â`Ckò£YŸcY—|)ÆŒ=SAh3Lª–‰°Þh¥.ó[pÓJ[ø3ÐÝàq(tN 8ƃñD7K6DM¶¤EÐq;0x7¸(ËË ¸„бx �6Õ“§^”¡y÷TP¦fM©&Ÿ}Xù=Ó8 ¥+´V2†9+%µêF<ºªg\•¥R\R ø€3œ�rïü·ŸwYµ‚DW=¢»¬­5ä̆:“äŒàŠx�%BÎöi„Œ±Õ¬[£šqQ—Ф±^ åu†xújp-_¢>§M§¸€…ÖØ`ÓFÐ+`y™>âft€RŸîGÙ˜‹{+D-Wœï"ºL\Àõ*iËø$ÌP€(Í�N¥ÏãáÔÉ tÓ¶ìÙu b¥í·Žùã0ejðÇš)p)r™‚•Öd]„Ãk¼tM“ç*»'à­Q¸Â½�H¡ù¢æÉºØ ,e>¥ÛÝÉ‘mH1Æàâõ”‘(v7Ð)ˆþUkìmõŠ W|æè%5üY7|ÌvÞ„Yè éT­ÐsoK;x�>ººá$´bû:Ùá×{ô†åEÌ¢Wƒ'WFµ+…T› úÿ›•{S¨„Œj–��ã¦A³–Âw ãýÆ�-ÍËÇ#°î,¤µ† Dãä‹õ•÷W¢à®Wœµ½k½\57IÜø@*¥Š>ŒŽ‘W¨e!C+”M^ןU‘S˜Ôø¬õÙ=‹ÙˆÁzÔf)¬„ ó?Zø�÷¨1b²U6ü¬Cq…9Që3Ž ±àz‹bé-çÙ8ùe½í"ðÙÄÃý ˆƒB¿ßg TÈyªâ½ÌÏG¯‹…2„Z7˽ÇËÅË…Bõm�%KMó¸¬ì�ðœ,Ý;"†ÅzF0 ÿÞƒ vIÙ[±`¯çëT_ìɘ‘ÔÒã)bŽ´4ÛÔ¶w ö�E<†4�&¸læ²O•t[¶‰à&ïÍ*ao"7lKÙÖ³¢5 ÇÜËè[Þèaáñ‡°¹(Á˜jÌA,óÙ˜·¡†ß™Äó׳Ék†ª£ÒMÔ8vOÆö²²e·BÛÐ[-S4?,è:9.69îâ²�ÝFeÝmê÷ùŒ7F—ÐÏ,k”í²Å+Ë]DyïwQLañ¶-�?=M>Á=Ø$!,âO$Þ†TÏè,X¡™(ø Y!U/ 'ø¸ÔèBfœ.Ñ•n“YÍsFÉàImÓÞÕ:£ K¨M¨�ÜrRY¡º»õ²©9º¦IÜYËF¦îM†­‹ŽøFeËŠ)‘ÍùîÌœCŠNý”ÏjL‡®S°òã “�i~`#¢lC9+1¹­ÑB+¡Fé_© _!ø»… G!à/AЇ5óæ¥wD;äCе£b_µ)}”^Ç­Å/!’óQàHÀ\¡Bˆ!˜p@¶>¼a=�jG¤Ìÿ:HFpr¦Ø#P½ÏVòð§ßW'‘Δd¼U'LÔÖˆî@Ì·�Úfml§VH‘U/ j~‰WÇaãNßnöãϸe^æsñ©°�HÇÝR#§P qæ§0#LÓ’«yì™IæsGzDˆ]!Ûø¨Ä­ÚÇßš�òdÏO&n÷»w Õ¼;/ÕryÚ‹Þò#!3N†1ÏHN†ÃäéÑF”‰>  1˜º¹b&šàÝP¹<Á;oLŸøoð.ŸXr¾Hé±üO¹åÉV´‹÷f¡jbZ¨sVU4sª˜d¿¨imˆJ›1ì6ŠÊ§}}w¬Zhgoöl§ë¤êƒ•¢$í0ŃTñóÌ¢Ä"‘yXIÚ¨ºù–É„1 ï#iM­ÇlFf&ìù¶y>CÆ3»;ÌÔ±ýÝæ¦)ø¢€^±ˆÅe•ÐÖÚÂUÛÊP—¨ÚNAühÞ‹h@Þ>påé¹`ìË6Ó*š^-Ü»¥kÉÈöò\*�WdH‚?ù|„MÓ2F>ÝÓ¶y—ˆŽ$ò[vŸ¤üW˜ØeüË=¢µæ�¦$1_›ñ_«�úx%Üû]>ëÀÌÛ­$LÛèiËJ??1+½ž»áC]™�QIh»ø›\P0¶åö†z4¨¶±ÿrnÇ”,Ôc83hÓÝúƒšÑíƳK{Mº–=m�•B­ûæÄÊ Ñ®ÚØõÞ� t%ßFa”FWNÊ\Š `Ç“²p÷R —"׌h§ñ”{™“•Ÿˆ¥ð+rl% /÷R Œd)ðÄR¢à·Z)~DûÎz½Y¼¿K�Þˆiùiëà2AíŠ,b,­•ECýV“µÉç’Þ±2€Ü¾[]bÞ¼Qã=PˆgÙoM¸B®g‚)„Xo‰u|m ð<®%·ïûj~ªz�Ò+½}ßPB°"àäÐüløðsÎnÀµ€yOj#<)šÚjBê¥Þ‰Ò@ë�†¦µÈT ž ¾œi ÍviÍQ%[Y —žxÜÁd²S€^Ê,BзªçPNeJ™,”Æ O"ÅÉí{ÅûÇq¸~'ízXd¥rëþ¹š‰émøßÁ½Ïάe´³€Šgö�–ÛzV¡LŠq&šôZðeûMäV‘õ½z•b6cGW^«íZò‘uyÊ+ò;W,»Ô˜Ô5掅ÓX´!ÃÄ2 NÇG®6sa�f“ |¯Þ4 Az\¯-õÈC­cvÙƒ2[ sÊ~ld(¾®«Tk)YTûÒ¦)Ê…ô‘Ö�r>y‰MüXç[„/ÇìÚ+ˆÖrÌä:‚—¥¤Å‘wݹ]/)GÚÙ‡jÖL⛈ϙ ¬óÝÆQm}ëanì"ýçybÚeÄTÂ-ýì?ÞÀUž¯m  Œuð näj_&C;.“3Š4$êR¶•Ss«óÂÿEjW­Ô}�í*K l}g²èý×jÍîÐÄVtkÍ->]VH“º$_WĵŒN&;™Aàc`±5ÇÒW1YŽÞ·¬}–[e¶E( .yE‹˜Ù×øž";ô "…&mµB—@h©dpµ$C«®ÄAà—9\aòú׎J¶8ûùvž9NË! ‡/ª¬m�¼­î(ž‚ÃÃù…àá­Ã>«’`É )>,gg!dÍZ,70™„‹Òý. ÈÍyXÏÙ›bb?º€ÏèÏÇq·…’Í<¿.R@ÔZB9ú‰>º¥úxðC ½7½ï _1AàðÏüÉ�þóȲTlœ„7ƒi¢Ašç¾ç £H ‚àÜI�hû“„òÆ<8¦¬Øp|×&5 ÖróË4GQ“8ñƒ8‹, øð@Ÿèó@Ãu?/½KÊuò—;¶hÍ�ØÇÚ='÷’™À‡ÌqÐØ-M S–"¯GG… ñGíTÝRB½ñ£ŠD�Í !· –ìûÔR™�@°ûÖ!jÛÀ Õ¢º.Àï?,€k÷Ði�z±Æ£V”ØßÈ—¬w€›ughɃ'4`„“ÔÍ‚ô?fÃó5Â68ÉtƒEžÐeí±uæö>¹òÍ#£Ø´ÝÆçNHаtfëö¡�­ÖlÜq¢Ë7©’] ù¯¡#“ŠÞ#d{Õ3qOÑ�,sZé �IëÝÚ £s‹@Èv€CŠƒt7üãó{ÿ„?ÿ$ìt�endstream endobj 88 0 obj 4547 endobj 92 0 obj <> stream xœ½]Y“Çq~‡ñ#öÍ3L«îƒo¤I;¬ iXZŽ�ü@ X€8(C¿Þ™uf]=³‹# gºëÈÊãË«ö×+¶ñ+†ÿ¤ÿ>yyïwíÕ³·÷ØÕ¿Â¿Ïîýz�‡®Òž¼¼úæ‚ÿå|óZ‹«ë¿Ü‹oó+c7we¥Þ$|ýòÞŸoŽ'¶_ÙÃÏG¹i#?¼>«Ê?û]‹ÃÛ£Ú¬—*}%ôáæ(ÅÆ”‡wä�·Ç“4f3Ì6_ÿ‡çÞ?Ie7«|ž¾üéx›0¢›F�ž1öð*>!-?üG�›þð¤¬~‡åHkO‡©¤=ü –¯%WâÙ[šÒKïÃ;Þñ*¯?|ÞÒL¨ò€ëßk)%œ/ËW./7ˆË×°|ÃÓòyý�uxy›¸»×ð¥Û¸‘œ¾3n …•®Y3…6›VbEßL ÍÏ�ÿsýû{RðM(à›ë§À)e¦çG¶yËW͡ƯÓ†Nð¢~0þïð÷°X]x 7ý4�¿OšÃ£úð|%¬“ KÐM½ÏïPâ§g�µtvòñÃÑé ¦t‡ÈŸl“^Ô¡â‰ÁPdmdx$Ì)QæÄÕ¦"uâî¹V&3½v�9qT“έðO+ È¿VnF;ä ø`áS•šÄÞ¸ŠHBJGEIç¼yIÀWÊ`ÿ°@'Í0©�¹„ͼ¦ƒØtDϦ� f)3ÒSx‰£¹Måƒ�¤ÿ& “ªhýTå…ry¶‘X˜‡…É^aó8áqÚjH%£27®ù}4<½º—&u(RmÆ ‰²‚ú)é ë@-å�âF¸Ý4÷>l$|{ù7_p£Ãª¬šëËÇ`8Š‹,óv_x–L‚¢>X®Q²è#¦›ñjž„waÝg94«¬®š×�,®ôX#”¯ê×9�«#Í Î �“w;Ö;œ�ä©?ò5e¸,&ïíÞk̷ɤ‚‚Mj}ebéW°!`*c’r¹)é‰ñz7ZÄ^E'¶‹<5z‹·¢ABÌ—¥) ¶â�`ÿD»AAHóeVq¼ß¨ÙÄ¿ùG ”e`6u'rÒoR-$.òxÄ¥ÒlÊj2úÿ œá…›ZåR…”pX†LFfå¡#ßJø’°Ò·Ú ¢OŸµæ w!é£S@˜çáâðÛQëm�¼Þ�j/SÀÉ&K‹ÇíÊ lVf÷$.HTÆ~¹^2$ß%�ë)k÷òŒþš¼ -Vö½Ù7@*Àt²ùö&[¡ DÁžT™Ó S¶§�':áq§”È9Jš( q·­e˜°då{‚�£ |mÒyÀxtƒ/*ó•g0¡)P%jy°R›�SÄ8P¿$\Ge줜ߜµ�ÁW¾ÕA™(§à4üÂåiÏBzp¢ÑA…&ž#¼'½.ºáU5|´)n×…É« ¾BB‘o¶Úy²Ýöª%M¯<Ì érYŒ¢¡6‘%ã-’Ë"£NðÈm‚rýÝC!¨7“qúw\„wÑœqUãøÞ€š`Ø^á—Î*ƒ‹D¯Ê;&�ÝJçd¾ �ÆÊªRTuÿ°< o~ù_†w9¬„ °ét}eѳ•œ”0[cT>K¼BÁg¡Õ`Ùá¹úÕèç8 °iá̈Ý(,ˆâ&ÛÈ¥ŸÓàWÅÐÅ. Q}”¼ß:ùÙbë[Ž„U‡õûy�S!å(™á‘j†·!Ž2Ö›¹˜ÂT1š²*›Ââÿ‚ìâMôªi!P¹À°ÿ(çÿ‹áÜn&3>²Û>£iT «Ó„C(&2ÿÌš ÛDAyùÉ@u8Í1b ‰û62‚à�󆯃®(éE�©üœc*É!Ũä$3ÏÍhjÔË:ì¸ð‹­Þ'<ñ÷ÍB†,@f6©©óÖ2ZÿºÃWOq%~ã Q­©Ëë«¶òÍ\ºÞµxwÒ«?�¨l·�׿"ø^]døØh8ÿ»A³@3{Æ h—ùõë#0°ÔàŽ?9*·iT!OŠL¼‡¡™f�Sƒô ‚"ÒQÜ· = ·´ .ás$åt¹¢yÿë"¨�åØÓ5=­‰Ù¨y‹_*ïü|©+ÏSM<©ûE>wœA«®Þbú]€qÖR.bZi�:Š%`<­û°�Üe“6÷ž¨óz Kå;<Öª¶ë§>HÌÖTÕ£-§ÀzsΖM¬>Z(ý¼çpì¬ å ÖÀ+Öœ®‰Š*=�Iœ1a%ýEñ¿° ab\µ[ƒRu17ŒdªßPa€æÐä¥iðM´‰~ÐC\Ænýï�'�QkبÓrsKÍÒ8Y3ùT`)Xbs¿A-Ä w–Šè ÎÊ€ ‘Ö™4‚7«ˆ4ÞN‚É$ï‹«‘Jƒû×hñÕÕ¼;«4�¯wW ¡7Ssù¬È‰Eæ³ -¨Òä¢5�:Y(4@ FŸDßHÄ ‘”‚ÿñ|ŽïêP$€Ÿ”rð¶@•ZæéTmàZ®Ïóp'. úßÞÉ”)PÆÎM<ФP€6,êDVÖ}�–¡Å:÷É8QĨ"ˆ‡9Q�d‹TSJ‰,›¤ÄžáäÀŠœ@³7.Oa9@�À¿~f– 9ìûzq�úAG}\�¢(ìoέµæ;ˆãƒÎjÅ]£%˜Œ›¿_øþ¦—™ „fP~àiaZÔ˜�z×õîpç³*5m³¦`-å©M"‘“jŠ×Ðó™êáœóæãŽ@蜤^7:S�¢7K\Ž»à) rÈTƒò‚ó:\éúûlY€)�is9�œÍ,hŸ•Ng3.é;c‰îx‰‡)ïi®�;ìÒZàq¦V¡ãq×¼Ž'„njâSxúÉ\¯“ëÜ„@Ó2æˆ�{�½H£Ç=kWö,ü\)iÌaùÆ4…FÊ H÷ÕÌ– ;Ù«Ø ¹á VßÍA`Ÿ¹Â4¤›& ¬�ÈÆ´¼u#4nŸÜOL„R˜žƒÈþñ踌ܖì¸Ð„QkRh–óm]Òœ>¾™ðR«¸Rr•jµ¹4¢ó\c·‰N–ⱚ>Ó;%�pI‘æŸ;÷ fœªØ2§I ~‘^þ€ia²—}&*±ÉåNWsh¤r¥‹æîÆOç MR…FØ7’Ñ8ˆIÐ ˆF} ‚»&ë3dQüÜE]§& Yóºe�_ö,U­š’çsÇÓdÖí—%ST"E0�ß&àä‚Åë˜È2€•Rs€Fòü�êOÉ´š¥Z€¤K"=1µÆ%uT#¬c  ý¾ÑœÌ0<Á•d‡]­Î*üH¢,1kv®¦cÈA3‘�LÝùÉ­ÅÄj3VCMŸ2n\ÅS¦O¶h͸i\ê¶!ý\â`Æ%4ýø-Øõ� iÂGœŸÛÁL¦U=™jµi™Ã\mÄŠ!iÉ^gIóŒïBÇa Œ~+w]@+M³‰œõN†Š1¹:œ—A'ž8j¥&…PöÅÌXVáÆe{³Y– …ú�)z�~Ü¥‚�¤LƒºM7Þ�%Hç7ͨ’©_›sî'y>cB ^í!÷þNÁÄ ŠmÑÔÓÁXÎù/O£×� ˜£“ÊOؘ&çh¬k!‹"‘¤™ô¢M™]SJ=ÀX,Û4€i’V'îV ¸yÝ™q'­ZA €à?~+=,3Ÿ� ½”뻀âÑÁ´kÉ5]ÇdñÑ0F´vñχÁ2IÊX˜Iø&­¢r´°;ùIbxH9œ¬ßþùHf}€/zXý2+-À4ùØ*¶ê¥V$çIN”<Ç t\‡øYgÞßás°27x}íþ…ñ3‚ýƒ ¥ø™mãg'@c�tTY|@�K=«o ‘U„ӠƳ´”íÎ2&¿…r"!›*éj…¥ŽÂé0ÿòãFbôu°�Á»$(Ý©(? )RÅQ�ËÍq;+ëëðw<�®–åµ4pö #½õ_ ÏÁ¤ùUôÅ×]—ÇŒ"_ˆaã'E ù…&>Ñ~…–¥Ç¬ÑB�¯¶¼ŸyÄXU�0³µº7°ñ¹º–¿OlêƒTÑëL oµUúÑ�žT Í#v�ÎǨWûØëh‚5~Ž ¬ éßD@ÍÑ,ÄA­î™Áž• Q´�Ž¢c7ïΈ¨Ôš®šW3P¥Â%˜«U*D3¬ØÉ@!ëO]Ÿ §E«¡+lö£ü�’ßÅD ŒÙ¦0¥ÛÉ6ÅVýEAVõh./0’)ÂþÑ62ŠCG€ÑN§=[‰AÍ›|~ÓeÝ$ÊRm †«„�ÅE%ꪸݢ *Všž1Im‹ènÙuyý2èlm³0ƒGò‘νtQþšrN#ròÚ†(Û^ÂFnFþ|î i íÑÐ-Õ*óeµ®6ÎGÜ5\ˆ³²´ôf¡ø½¹ÍÖ¥?Ÿ3^$³‹±…ƈ»u­ˆú‘UÎXôEÂ:þ\”õL{Èhy^;ºÒRbkYñ# ŒÒvðV¢MÊ ìšX•Öt ¨ßB§ƒªYö‹*D‡É»®MdUŸr'´‡²"ºyz¹GF] }�ŒPFrÞSŸ5A5oIr^ˆUÉ>  ïÄø:æÖmJ®cÏž^¦C;w!ˆÈû‚ÌHŽiÞ;ø¥ µ¢ñ)qϼ/s×Ì1öNŽí×iS‹HûX£Ô§ŽC—«ú˜ÔqH¸ªýYdã`K„0¥Î.,*PÂù¶h–L¤œMg,B_Í2Ç6÷³˜•v"ÚqVaºEU¯âÀê™ã”éßÌwźA»§V½´û™c &i„ëi95è7 ©Ýpo¢€ô"hö»f XA;í”›„!›Ÿ@Û1nÆ;(9S;}!n…�&$¨“›þ÷–{ 9vÐÃzÖ|è€Ûî�BŒ_ÖðЧ+Ð�§„»ÞŠ}=Ť¬ný�ýÀEÉæ˜âpÆ9/$Qb`.É©ó^d…Ì"%<�…-·Ieи ÖVº¹ä¤Œ€hoGÈxÒSßiæÏµÝ. 6§=°4ÃÚ)ø*ÜyYœeM`³cWþgè"†­4Ú“&L…AiÚgw¦µmþÃÚhÕ+†Ð·ÂûújIJÜâ“B«U¯P‚¦™×A¸ þ,‘ÀrX;îhŒÛþ&!hÿ~!j)}yóèP8‚×ü}®¯ìŠ++ÒÍÊBòbš”ÑÏÄž5sGk>Þ�ЕeV»>i››^º��·—Å�³v¦yQŒv9W{ŸÂ:l› Õ^_X߇ˆ[äm»î�(¨Ø90w¼´Â¬îC ÓG1hnf\¾cÇÔ˜EîiùÛ¨:%™ÛÞ1®­îîý`sôÒ§ÝÌêÌ Á8«5›è+Zbº†Y%¾ûE6-O%= ��и.!Ór³(p"1Al³ #™�±…›OU¤}2ŽìöL�¿; p¨çâý1� ÌŒŸÖ�Ü»î¿u#w ‘™y¦8 5§È¹±> àÁ¸Ï–¾°6¤oIqIUûP¥ ÓóH¥É cÊV8À-¾¿Ù7ÊÅ�}ƒ0ªÓëš‹|T}k‹9"8ÖZ!•GêÜã ¶Ï’¨=  � m.5€áCeÙú‚–�@cËŒT£Hc6m¼tl_�ã-ïËnÂnˆÐ¼N²‚åYX*Éþc íÌarÃÐMTwœóq—9ÉŸ6yÇkXR&NͶ`\§ JÌ´þ¯[;½„&;˜®§xÑï•›šÝ½DMŽœ=,KÊPõ$‰­ÙO$eÍbj,Qç[Ÿ¦y&™æÐò%m§,¾¨Áª"F4ü/ÕìÜ5EÅ`Öz9”_u*Ö’`/³ÛÖgŽL,‹¡;M „šødjŽ>+õsI^•¬&ÔGø¢2mº+¢o‡�xë èèeaúÔɼ©·»¦a#�¢62ä.¨WŒÐ V5õšûmþË@ÉåŠæ®Mðþ$4TBåj·uy‚„ 9«‰%›{Í5ïzI:·š l‡Æ«A.8漓 iÂÛ�6zBúÛ_X€‹’ý% EœMi_r·`WÞšÎ^�·ÒæÕs/‡¨¡%²çZ >ðC¶Et¦àc&¢m ÏAé|û�¤¯Ì/ÕÄVÐ- Bm-$°mt³u{KHd"‹f5 e{ôî0R“@,LJ"Ö�§›Ù4ÇlÔ‚·Û»8à cëO~}kü©�}ŒcZå¹[2Zèþ·¼c´è’gåಸî4ŠZ"ä' °¾šC²} ‰ÄK œn²üQ ©K ·çDGÖ¶ýTíÅ€±ŠÍ�áª(n·¹é%žD¹§Eo¿æ«ÁH9Ceÿ8^‚±€·}ƒS�ã$)¦«Îî{•‚H‘©÷‚ý5 ‡­··*ºt^Äòxý²n©¿tVy>†.¼íºw.Š‹±óòž ì0ÐXGS E�1¤}p ~(Ã?"8‘#•‰ª²ÞÜMòÿ·Ëz–‚Å3Ñá/WÇׯy¨ßKm–Ÿ»šqÖ’ëøLg„SÏüŽ›o’ÍK’ ,È›¤1gí’SÛ›TG§Õ“èxIw”Ͻ¿sÖjÛ|D͇ìzoC¡pˆè‘·:§I6ò¤fͳ„ýîTj¾ÄÇ ê&!šœóú:«|šõÀœÔRƦVq¬F¸?ŠÙÓ|´½[Ÿ¯t¯×9ߪtµm¯ ÷ת›ËGBuŒëbY‘Úná Y?íõçç}ÞiîC&JòL²pÖÏÞœ‘’ÇIÔt-Y(¿.í51ñz-X´&éQ�ËÕZ_Øz£HÁ£ªÍ©Q«ìQ!uy©7[U‹|Š ÃObcñi³ÿ�Öá… €ß(éo‡_þëÈñBòæz¢DtÎT|ñ]4X€{±;$¢as_Õö¤3¨ÔA™M.pM;›°¡¨�70³œmD€_`·â‹îVô»Uy«UêÆ�¹ûþdT¼óñT�rä ¼éšGjk s^аKLMª»¯’‘⨗ Œ{+ã�š'x¯KÌÞÝŸƒg<í——r¼=¥\?ÖÃ) ¾�éE/¡„ îH|ÌkÍdôÔ¬VÕU£ÅWœÚ¢©AmÀnEö%ÛèÞƒëK]ºðh²¥Õxˆž÷ðÎ�…/¿‹û×~ˆJ†~� ŽÂþ�]Ûoa‹·tŸº¥‘KÒ[2­¦''”²èxq&Ÿ_çU.™Eˆ*"}ÐFx0še‡?12ëj$ñž1 Â}{‹M<¸¦ˆÞá",þ—´�˜¥ {ÁåÕŒ¥¶·þ/tåtöÙ?T3({Åm934™~Û’�Ð7T’á.¿Ý39Ù,vþ0X^éÙ¿ëÅ÷®Â˜ÍÊ›Ør[Ïg ›^%³ån|ßÞ–•ÓZ…ª‹ûiò£ã_|‰­”]ÃþP.Jkù[-w�x» ÆôÕ Œa2&äÙ«ï®ïý'üóÿ�3ˆ×endstream endobj 93 0 obj 6214 endobj 97 0 obj <> stream xœÅYMs·½oåšûVN3)-‚ï�£]QœØŠãØ›Kd"R¢‹¢´¢¤’}^ çcÉØNUŠ¥Òphݯ_¿ßî¥P{I?õÿ‹›Ý¾ û«w;¹ÿÿ®vow*Ø×ÿ.nöŸ1¿*%’sz|±+³ÕÞ÷Á8aðúf÷t¸Rx‹Wax9b‚ > ÿZho‚¢F*Bnë[=¼Ï#£Nõ«÷Û2[EzÙlÖ9F¯ºQ>‚­uƒÇ…Vv¸¥HAKç‡w´†ÆëáíhEôÊÔ Ðbl ?Ësš„—�F8¯lœ–’Þ¨!阆O©`Þ©É@2)ÖH#L0ý´e¾Oæ]²“Q:áëià%}NBk¿Ø_qålÒ«> ŒÎ éì¬hŒƒ@‡1ðlåˆÌǾÿœAx "AjÌ÷2í»Ô$Í«â–ïˆü-¾›u™Ñ&Ÿú,ÞË®fDÕ–Z×o¼¼Ý~Çøœç ìŽÕÊY &aí÷Ç'»ãïŸߎZx}Ì|•"þÖB%o|{élYÌ‘Û,ýš�5–’Tƒ ‰x—x¥uÝÎL»8°£T@š¦â$UÛÓ|Ìöƒjhû�NÀ0ÃW´([§……;‡ײºý+‚A?ŠûµÓdsu+¥ñ ǶÏß=@ÜW¡ì¨¹.%S¥8ü�Ø&Ž=Oöfén]þ"ƒÂ’h2¦®»Îè/«â@¡úÐ…À÷3¯:3¦n–=ÆþøýØ÷X‚ª5ªvt˜‰6?+ —H²¯áw…ÄÎB w‰p2¤óçˆ0¾“=�NQ9ÍΨò±`M¢Üú‚µ<ÿeÿ~ G£§3³.Wc•t|ÙÛ>à=""�LnaÀH-R*C"i~–;‚üíø®nG…�¢Ê³5´–M¥Ay|ÍÅF¥É$¬M“(N¥TÜùÖ€H‘Y|a8D¬å6žÑr6¥À}ðŠrG‹úû�&*�„yÓÐÎCŸ´3M‰ jøï?Ñ#LÃ'Õ¶ñ~{êí¦ÿE°ÅJÁ£M’þ…À ‰çj2ðl:PÌ¢³Ê�Â`_!PfxL[Q1|COšj©6�½�q6Mö·®?>ñ( —þˆG!µÁ^{¿iÉwFÏrv¿ã& eŠ&І.T¶�&‹¬î¶Öé=™ïKž‘ÎLK^4…Áƾª|<±­K¡ #•¶t «Ç×]¾p¡Ú�;ÓêLŽÇHáÑ\dða¥¶W§¡³Ní`œD%‹Ã?0ÊÑL³»°Î¢ãÃh¬HÑ¥3ôß+1›t7BgÀ’Ê�˜…I,Z&Pƒ‚ÄÛDS§òUÜ–¸ú±i–GD­èÎ<·9ÕN4šã #½Ê* ø’ª¤ û„ÖBä”õ§¶ÖVŸe{´¬ŸÆèÎóž,ö°üï*Æ“(´�¶9h Å!õJLèŸ%&ÀS€uúeb¢zãIwT{$éÏ– ó¡ WDE@+üŸd²^(öND»$$ŠÀg9{·† ~µ\¢‰[r)B‚“ô•¼ÀÛ¼õ\à“‰zUá�”Ë ¯aHºµÂ[é—¾h“ë®=¨ÂcŽJ–¿­u>–zr¯�Í:_ïW~!^²¨‚‚0äØIK0ÙÀ´][ SÜÒ…ò]¢Þ†zî²{…!�­ë�-…¡�I�1ð€ÈAñðvŠõw [£ðlƒÿXnÞ�IóN$2Ñä�­Ww/°[¤+.bν¿ObnÐX,� q^bF‰{PbÂô\¾‰Møµó QHIœ«f«Bô zEÿrœ6Òn^Òè…ÎGKb¨ã»mWIExo¹€™Ý,Øž®'ÞÉ1ŸÚa´¦ŒlB+×¼¿Å­ Cl°ͺ z´?·í6†£ øÔáäÅ›#Å%MÏ7¡gÛ¢¾u[”/VqVše¦¶hÞ™'º¬ƒÜ?kŸP€¬ñgøåyî“¢Ÿ1Éi Z@/AâÞ‘”}ÛNÒsÿãÄz±ÜÐÕ±[@…Ža½Ð¬p,¾0àïz¨¿n’õ}»qÜê)N÷éûÅÝû«Å}¹£[ƒŸ÷Ìè(>wkE��OsåTnÍz�Lí8»Ÿ£ t­¨ c'œÝß­oú¶Šüó¥âŸŒ›ÜÄ2Í 1=Öç·»ÅÓ¶¤aT}Q/÷0ÿqëF7.×-[v³Äú„®Íz›ÁpÀÔõ7Ô!IúŒ˜ÚÏ{e¶l;Ô–ï eÑErÿcÕúïrÙ?Õ;ó�8AwêA¼FUãÓÖย3ß»w kÞÙ£íCŲgT¤A-ô7€²™õÄ*&wÇÏ2½0(endstream endobj 98 0 obj 2217 endobj 4 0 obj <> /Contents 5 0 R >> endobj 30 0 obj <> /Contents 31 0 R >> endobj 35 0 obj <> /Contents 36 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 47 0 obj <> /Contents 48 0 R >> endobj 52 0 obj <> /Contents 53 0 R >> endobj 57 0 obj <> /Contents 58 0 R >> endobj 62 0 obj <> /Contents 63 0 R >> endobj 67 0 obj <> /Contents 68 0 R >> endobj 72 0 obj <> /Contents 73 0 R >> endobj 77 0 obj <> /Contents 78 0 R >> endobj 86 0 obj <> /Contents 87 0 R >> endobj 91 0 obj <> /Contents 92 0 R >> endobj 96 0 obj <> /Contents 97 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 30 0 R 35 0 R 42 0 R 47 0 R 52 0 R 57 0 R 62 0 R 67 0 R 72 0 R 77 0 R 86 0 R 91 0 R 96 0 R ] /Count 14 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 28 0 obj <> endobj 29 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 16 0 obj <> endobj 114 0 obj <> endobj 14 0 obj <> endobj 115 0 obj <>stream xœ]�Anà E÷œ‚Ʋ�JÑlÒM�ª¶À0D^#â,rûÎLšªêâ!=>#àw‡ãë±,›íÞÛ?i³y)©Ñu½µHv¦óRŒ›–¸ý˜®ñªéo¡~Ý+Y>@ùá§p¡îÃûA·üc(®‰®5Dj¡œÉì�Ã}Îh¨¤ߥsþsTð€¬=*¬«÷¨Œ^PØ�¬ ‰ò"³='½¦n':£Â:ˆFTÀûÈ:p2h �uQqnšE'TX“h@…5ꯞϗJUÏfl¼µFeÓ>µ/©i)ô[y]«LYÆ|ÓDwb endstream endobj 12 0 obj <> endobj 116 0 obj <> endobj 10 0 obj <> endobj 117 0 obj <> endobj 82 0 obj <> endobj 118 0 obj <> endobj 8 0 obj <> endobj 80 0 obj <> endobj 38 0 obj <> endobj 26 0 obj <> endobj 24 0 obj <> endobj 119 0 obj <> endobj 22 0 obj <> endobj 120 0 obj <>stream xœ]O1à Üy…@ C—(KºdhUµý1&b¨A„ ý}I:t8K结ϲ.û òž>)ƒólÍaIH0ÒäY( ÖcÞY�ø6QÈþjâë V¹�ßÌ›äC馮ÔÂ`iŽ)žH´MÓµÎu‚ØþI{`t‡óÔUh­ÎÕ(%ZJ7—”ˆsmZ›”žé÷L ±¤`…ø(FS# endstream endobj 20 0 obj <> endobj 121 0 obj <> endobj 18 0 obj <> endobj 17 0 obj <> endobj 101 0 obj <>stream xœ•XyxSUÚ¿iÚp�~±íàÜ[eSÙÕEDZ€ *e/[Yº…ºÑ´i–¦M“4ë›}OÓfiè’–Ò–R(PvÚ* Šâ ¢óÍã6~ó¨�3'õvžùNhGGÇÙšš<É9çý½ïo9—EÄÇ,kŠôô—–<ûwNt+ú`\ôì"&ë[ÓÈæ˜Ì†Éñ‘?œŽôÓкûÑâ©›ÅZµ&sEé1_~AEê#+M]²téS©ËŠyü}¹Ù%©éÙ¼âì ü¦(uSiî>^…xaê²¢¢Ô�±_”§nä•óø•¼¼±½W”Tðø©é¥y<~ A¿XS²-}yiÞŠ¼ö®çç—¿X±o“ °([Tœóìob±ŽXJ,$f뉕Ä,b±Š˜M¼H,!6«‰ÍÄ#Dñ2ñ$±…XC¤ˉíÄZbñ3‚&(\41�³ â$ì-ñññ™ I nÎι iî’å÷%Ýw~bú¤&Ù'?6ù›ŸuM±Ü?áþCS‹§ §O›¾czû_YéÄ”¿ÆÕ?N@ÛHBëDô}v”ýšëè19ÿÈø�µ Vè@H3?çˆ@`©¬‘Üõ¯‚²V*�”ffŒVèä+!E$q­tt3'ƒ­ñ6Ú—l´­`"­j³Z¯�ŽÒéA§>±›I`žr§ðR†ZƒÞv°­F‰Ï¶ºŠ�¢‹,ôøÊb£t‚k´<ÝÝÑîô²×[œ»1‡á3hE¹ºÄäîöüSŸFs­�Y¥Ðk%jªb)/7Hy•¡ã +bõÒ� }(.‘ÃýÏ?¾s _Li/å´ï�Bˆ$ûÄùÕë@CjÌj›Ý`h²R¾W/õÙd¯*ÈóêŠhE¾<_‘¯ÕîV‹ëÊjw‚š¬vÕÖ»½Öz;e´8[¶ˆ=b‹à"Øó›Æ>8rž-�>Æ]€J=áˆÙmH±º .¨$BHè œµ°Ç¨ÇËïAì4ËË�4šÄ´¿ðÜòç–?Ÿ’Ÿ—Å[¦‘é•€+Õê\Þz#x©“œ8¬kÒæ†Fg�AE �5.ðAƒÛÝ „΂¡¦sƒ¡Ð7Œ>Ù 3ËA �¸PGªjõb¹, #4Ð(ŽÓ~]^É…»/½Î ³Hº™dt9¹ûè©Ó}ýNgÓA‡óXïÑ÷,Nƒ �Ä%hª¥:¨¦vq ¡ÀXd� Är›ÞJût JéuÉú:�¼VC¤wå8"ßîb›ý3×ÑitÞÒïÀ›Ö�ˆf&sø ××V�²Fo%§E¯kCz(ƒf*G¤ø‡ñûŸQ›,³B°Z›¢•é%µ0Îñ žâx¡Aç+Æ!7hèý†B+t� f/¢¢§’ œþÂ2•´Hq�ÅnqDçŒLÅ3³Gßùû™v€u¢‰œÆ ²Ç R€t-Ø�<´v�ì'wpmèzõµM�~y÷ÀI‰ŸF㢠×Ñm6â�EpPÌS<óÌ,&™ffqP•’‹X�?¾Ÿ�ï®f(æÖO‰9–�øe�iÆw,Cà h""¿|Åégì4ó0ó—™ñtº�'£õ4˜8å¼'g3SñiYo÷�ìè5Ôy�݉Z¹Ÿ§ß\Ì$30³˜‡æ¿öÂÇ(qÑ,ôÅx™Fîö½½7N„¿j=M÷ß¾Ø|È�žÜ•¹•©¼µtÎêÍe˜fxÙÑËcË¢}½¬Þ«hÓ; #K¸3– ‰ÇJ§ß¡Ñ«)‰^ªëùº:=g¹¼…\¥SêµÔZFSÛ| w+îy3…™Ã<òÈà†7.œ{D6ò ×Q:�äJjÕSÛ;Ó𑊘 ¦”‘1Ï¢ûf¢9wnt Ò¿{«ù °“%hz¹]ÌbfFÚ\ Zôz¸Ã‰–£”D_¸òÙÅÏñ Ä ,ž]¦€†V8Áä2ÍÆîų¥ -Ó½§®¢ô«ìcL"·®X£Äuɰ4è J—Çk}Œ„3º �VL|WHvimvw?J³6ѮҖ¼³xŸ4ÍEs?Ùz5핌ôêZZy:¯9J ¢ZÄÃZ·öZW?ä׺r­\#¦‡k¹¶ÖÖ6Ÿ×å<ÔÚäñÀž­™¥L+ÍÏØ•¹ Èk?2›Œvƒ%6Qƒ×që?€ž °ú_G¾v6zI¹-ð†ñTã;m¶Ah$�óz_z˜™7ŸYõððò�уýÉcUY4Z½^¡ ^ùÕ|)È�Åý·¼p°þ m p�¡…Ÿ×wà½#e¼‡™'!›ž2r~LBFvü–�–ÜâŽq•üž78h7ÚŽx¨Íú埙™ôOÒêÓwÄŒã|öÑ6†Ú.d–?ÆÄÑ¥ûŸ_ÅL’áü´9±~×D0Y�À�¨¤ -xÏ`�¹‹îÜeG7Fçpv, JÓÏpü_{oÚ;¬á`S3!¨p*ò4²��Âz™?ièéËnÚ“•]˜'¤Äòü &‰\Íù®Œ+ñ¦²"Uò¤tùvÐⶉýgÌp d@ê ‹%¼¬ã‚#_õ¡WN»¨ÆÛÈo‰ÙNœ05&D}atƒ4ë.  ›\ôk¢õâ¼ûÒMf:ͼöO¤æGÒçÇÒç§Ñ}?–>ÿ÷Ò·NosZ 6Üzô`tàoPþ‘óökåie5¿Úµ‹–ˆ3y‹1Šq0d'–ò º~Çsôa4£•]À-RU @@–û•ÞÖ¦p¤£¨u{î.ñÚlªî\.žÔ<Ë’|é:ì³7©ÃþA<©a›¤ä_º²Ëo X)“½ͳ6YBÖ %döš}&�ÉÑ2p0äv57ÅVéÓz±¶¾u'ÖV´&�Ц7Þå_MJ| }Œ¹š*�¦Fš³%[„ nQóõsê§Û.ö÷öÝ“­­N¨¿È­i+íÞŽ«f1S™_0�μ¼íʹ“}�F:ñSÉjЩ+«7«øù99<@1ð�|{‡ÃÞ .Ò'ó ÊË„ûsŽV}ˆ¸×>8ï¡;ºÙä#S¼µ.iyµð€6¦¯?�©6x-zýl`ú™ÕgÑÂ3»o$%~‹Dh'·AÛ¢²ê=šþ*È$‹JŸaÈÊ4Ó!Õ«´Cˆ V»„‚ÉîõÃ{ï ùý(þl=´vPüp¹%ÃE&þé€5ËÑÿó@㛟÷­ÊwR{t<}¥_åð¶ºúúxÇžc’ få<«ªI�iÏŽß�UÕ´EÁÂùA4a�ÔüP;ŸVÛ…‡óšR²Z²@Š¡ÙϘ¦–YŠ8¡ÇÞü8|ù4íâ…ØÀ“ FûaK£ïJ²ý�Ùk‹8{Œ¦ Òì¾K´‘³+ƒ“�VEE,mØôôAÎoA)Ջ戊iÞ¦_W¬ò7Ì´^´ìZ-ø%Зßüt§[4±o΢*�ª(¿ÙΘu=؆–XÃÃl´ ³ùŽß‰åU…cðœn4ÇìÅͰ¥øj5Ê m¡’ÊcžHXÀƘ„C3ý{ÎKLƒ²@+‡š”�‡².~yͱY5&†û‚ÿÕUUnßµr�źƒ!øMî˜x®%Ç}sÆ{Óß¹xòbNQÔ…fr¿³e‹sŠöc¨6EZÜW„¿Ö„_&» '7²¯¸gÇ¢½ÌleŒ'œrÌTønO/&¥£A_XV³_) ó‚nßbU•ªj<.Ò…ÏG%ÎRFÜzY£ ¢LPÆ*Ý-MÍ!ŒIÜŽ%1K\ÒÂB«†�vˆ=rÿxk5z½TF©êr¶êõû¯¾äÊÆ}Md&0$“�Ö¿g@B»4CU‘º3ÕMP`V*`'¹ð—óæ.]|û¯9lrR`2XÀHšu¥B¯“h¨mL6è55 OQØÁh6êÝ”/P�_áü³¹ŸâÎqqà™†¦õÉ»yÝtePlY^ݨ0‰}’†š0t’w?üèóÿ;±n~™úh(¼ŠÉa0ùbÝ�[°:ðì€<0ý›!´b()ñ6úl�ëÙtJ†}� ]ž!|Wù>PˆW‰·äâFÁ!O“Ééì£m-¶kký çŒç¼í Y/sJKêø|%ÏË` ë ÈÄ~}ÞÒå3¶Êû»/µÞi¾F»;,�ÇŠº3Ü �Žô`cuúpƒjK¤¯� v{.~³4UªzkåÊm@ kœ=~sÈ\O›ÁnÚrh‘»+ÔuÄ[éÊ‘ŽÐV•MµWS]Â{ßnêh«ˆìÞ¼;ïÙ(¹l/oouLxg¶ãG’{Y'ñEÏöß6u´N[«SBUÊöîÜ3‡B¡vÕpÈ{ùÙð»VvxDzᔨ+Æö˜ÐßË©I‰ýè<šôŸÆúaîXL%ÿ1¦&Þ^ïÄAuÆ¿ªM&—ãm;h ÙÛºÑcŽ.°’1©/TÈt±¹�¿cã{•¿ç °ZØ9K¢ó¹…*Y9ˆîÁ 6·ôeú³×î['RPo§›Å@ÎÎ`’÷,Óh5éNľl²ß‘].PUÈ2éªW4Òê Òu%›·€øPéé²Ù#à¾.ÊË* ³OŠŽ�êì9¤|ëO »�üêOž»‘jÄ)j>H †œ}iËUD¢ÉèQ4;–ó·îÌŠ(çh<·° üî!“¿ñmòø®˜=FûÐïßø©�Ovÿ(ÁdQÚ,´"ÀF[5ÜAѱœÂª2� þ@§Çev8(£;3�F¨VïW½¼áeºV†ÕDGª-j‹ýö-4!6­#¢4uXïG?c�ÌE"®ßa°‚ ¬:›Ø>ÚƒŒÉ5V�A‡]¬N®”Ù5u1òQ7£À&Z‡ÕIi“»�ƒÕKM© Ž<dš�.‡ÉrNM¼:‰šÿT`ò}!ÛäÉñÿ{ëʹ endstream endobj 15 0 obj <> endobj 102 0 obj <>stream xœ�W Tg¶®¢—*I¢)•Q«pA�K\OÔ¼gŒ‚à†Á .Ý „MV‘m�îKƒ,‚‚@ƒ‚­ˆ@‹Ë Ñļh—D_fÔ˜cf2Ž&qðù™“ù bÆ1sÎ{gÎ_}NWõí{ÿÿ»÷ûî-–Q;1,Ër^~ §ÏP¾Ž“‡³ò'y¤ HþOž=»4àªWuˈÎ Â/ášpÚ‹ŒŠe}–yÅnM�� Oô˜àõŠÇô¹sg{,ˆ��ÖÇxøéÃC£õ‰ô&ÊculpDhbê« ¢¢g$ŸªÓÖZ?€z¨ƒÏ ÆÌ;¸$…Ø’¼b°Zó;qÈ0´i/“iš):m£õ4C#ü‡©ádŽÜ—· È“V Ù¡uëÑ€Cv±³¨B7!«’�à%á;Ã9âäåþf„hA'-™·[£ã>,„‰\÷Ñq5ÖOá]ý±}0‚Cævç•¶„ù"©û­ç&çd5ÉC›ØftE_tQÉáè,”î„Ìí‹1[4¥l]<x2 prû¥\ŠC /™³-‹Ù"åäd¤C<¯?–vØÖ¼ÿÌ]¬%>‹O82⻩8§7 _(ºýì4c'CãüÎÎ6Ð8¥èª’ë0VÀáS’édö¬1dÚ5§ãìûq�H¬d¥@†:ß=¿¯l’ª[Ú+ð4m=[ÄÏH)PYvê×vô¢€B…�z OqÙÄ%Un®÷¡‡=n&ñ c¾†îÎTÚOJúhœŸ NJ²Ì¶÷A¿"0#ŒZ¿8øc½ºYj¸x© ZáTª}3O’uô´+°=¦É) ÇÁãd’àƒk´‡“NÅ<Ž|òŽCñÕ¯ÉpÿÀm‘ÁÒyŽ,ø5Y½EÏçÂGnNœí,? üG—üÉ0âé¸L§«>%QøØ>\]�oô#¸«K%bœPS‡�šnm<#éÛVï_Iw=í5O2ˆxü8 'á¤öîƒeé�µÝ’“‘%Å-]’D-<-8ü¢T¯¶¶æž´5U6¯vÀ(&®¹ëyZð›¼iÁË,ŽÅÁò¡jVÀìî}0J'Ïåp NÀðL&“ñâ/ÿ¿ä8‘»×#NÔ*ß"qNß¾qñ;Ó�úe:"ýäÀZÓšÇ_#¯ÂhÙS@­ƒ øQûøãr{‰Õb.Ó3w¥A2ܘZ[ÝTvª5¬Í{Q…^ô\ »I~êCîÅ­îÀ!Zų8êþʦŸ/�ÿ¨¸Á$Á^ˆ3ÑYܱӔ©¼Ážvø°ý`kGÀ‘ ÿŽðÑï  RiÉœçô¼k¥vÉÆFœÑu«3ޱ w1¡»à® ‡àRálÜE(£é/|~½#¦É¸Oª/?”К“Mõ ƒO>�R[{ Òv(µQ¯3$§&‹†C!Å�4 âš7Eí3´EHi)©áºš-¶í Y~‰°Š÷ÿh1.Ç×ï½{ë«•õñ¥bСe0“jÎfÈÎÕ›¡ŠrËJöó8 @˜×NŸ†k÷ïƒÏÆ�à3KºH‚„Ï®g„‡¯¤u4,ìbó•ËPFˈ=ÛÉP®xe›¯âö«*y <_¨„Âô,3ìJ÷äì4eçÄ–o) åM&2_LjÈ–ê²íYùв«%ôüÓ 9pyùƒX1«Ê’›|2ä$J„ãRÀTVh…ò*±¶²=ü]¨÷ øR)ºŸ�³o«� Ç" Öî[VòV œå?úl¨*Xos3Š xäÕHOUO!ó¿¾qo{G+iû«öY.½ÿ ßÏ*_‘1Ú“xÂŽMŽAJ¹c3Ž:8]®Å?Qmj² ïò�Fß#~b¯¦ŸÚzëch¢ëoPOýŒÂÜàv m�FcuÜÑÚÓeèˆ8~×R ü¥ß8¸;/#ÅbʰHÙ룒ca˜>ÙÝ•ÕiºI;ÕÖ*�8cõ‚³óæú¯±Ì"ÿ¥d«­O39ίb X lSa˜Â˜±2Wëµ– A&äðïÜ! ܨ»‰ŸÞQ�4ïßJàÿiÀ=;Z=~Œ%Êœò\š¿oãV¬,¯êXwag‹Ò »ï¡'Žœò é¿!%Ò í ŽŸ=_ÑF{Èà%›`UÂ)*hCf$øÂ–³;ªù~±#ù¶ŸÖT±ÈÐáÆ…ì ¬)D�jzƒr­?‡¯¡5¥¥¹¹�Ï—!{—’ãD2–p¾d9�Å@–_#¾8šðµIVØüÞR(•þ5ÀÎ.ÞA«¸Ü}ÉhäãªÍ� |¶Œ{À\™*¡š¨Ä”kýÛä5¢&£Ñb�=¼±ö[ÁV+R ä®ârÀż›<½»ØRìTáGè-t‘Ω¿Ì4·yŽS4ìÔ¨ða'Ô›!R\°Œ¨”7†]¥ö8t´ìç{«‰¤ãÚ¬ƒ3tuC›¢6#ŸºA¼‚îö"º£?¾¬’­)èµ9É&ÿôÌݦy�NçŠ©ÚæÆoÿ·¬U_\퀿ðèâqƒNš‰Ë&¯s¤×44ÙN·EÙ¢òÅ–Ó�ù6à»N½é5o�—A'‘h²-s�T÷4yÎ/Q�-'QÄAÇïáËmMìÐ ýp” à=ª—0&hŒ"Lò’¼cA’£¸¬Žò­1õ}LŒ~ꣵtNœûÇo�‹ÿŽL­¿ªûŸá�ü-¯ËD"ê¹þ¯¯?¹½¶þxåéšÌc Ŷ֫Pü×à½g#­›¸ˆ8s¨ÙhÙfÙcÎÊ…>­ª~“Â1ö3Ö¢óI;û!ºœmûƒR�5X-ÀWï]¹ÕnÛß^WxB3F†,ó[l8šRßXW}â É®/[O¼g¥íùÏyÁë×3RӤ鯂'„ò‘œ5³Š”yd¯Mê ó…–ÈÆààÈÈààÆÈ––ÆÆñiZé䪼â犄-ÂéÂÇDy�ö°%?>Õ éF‘<è}K£ÃDKX¥·=¤�í<„:š×‰ôeCŽÈ œ›±´ga)),ÆÍUZ²±�s¸ ;@tQÏ®ru>VìêŠl�ëÀ\W7†ùJ(¬Ö endstream endobj 13 0 obj <> endobj 103 0 obj <>stream xœU”PT×Çßcq÷‰™�£oR5¶†–h µl%Q2E¢M]à«ËûX`±»ì²çíOvÙ»Ë/ƒÄ@»�‰˜&�!Óš¨ÑN;­Öq:�FB'þ×û–KLŸ¢ÁÎ{¼;ç¾s>ç{îý’DzA’¤¨¼òðÑ¢ŸÜÿÜÌ=MrÒ¸�ÀRá5�)€Ìô± ¢ù\4÷šÈF9Ä÷HòßdZºžÐ©ÉéÊ›[t*yC£FúlùViÑ®]ÅÒ½MŒJ^+SJ+ešF¦I¦á éáæZ9£ÑJ÷*ÒC÷ÿPK1jFÕÆÔ­P”77µh5ŒJZÙ\Ǩ”2•ª¹ýAj¦U+o“)e-#Sóäê“|ÖFS¯`:ÔÚ5£aL£Ô0M-¿Ô*åÍJ%ÓÀ×nVª2uc�LUW£8T¯’Õj´*‚ ²êO4ùOrŸñÍ�'Ëâ-â×ÄÛÄé$�dIé&=¤—ô‘~²ŸÈæÕ"Òˆñ YEêÈ«iEi—¥‚xzuúXúÍ5ù¶,Î�Ýq®~”“ÇH¤¸,@Óܼ®Cbtlhhdô �—õxÀG XÀ¸åù#å}4> ‚ç «µY¯oi9h§¬V§Ù샠SrÎq» ¶PøW"¨ù'õçš>³œ*ÔA˜YI™·þÞiǸà= ýP“ðq_Ððù�ñº”q®Ái*ë[RV5Só¥=Ðç5eµ8z,ï–üå5É7Aa·ŽO;QÉJùé$*¼ÿ’s©ç©r®LýŽañCTÂ}µüÔ#ºnÉò‚°û·ˆªã^|Œ›sœ�sëùÁ´þ^€"H'žn�n™i õ ü@…#¡Á~{Pï—àMWPÁ•€'äƒÁ¼A}ÈÀ‹i1Ñ8·0‚v°açˆ òºÀ`p(“(‚·ãÜ/ `­�gлºB¶€]‚ò+pþþ»Ñ]y]c˜?‹ý4ʽ£Ç%kzEŽîˆ1#ÎÈCåñÆû�sv^ÿ$/?wgµ ›Ñw2Z‡à•¦úÝu¥½EP¯>øÏ=ûíè£L�ž�¨;˜ðѬ;8íò�&-€ÒჅ¡ ã_¸oñ÷þNTôÂm +—Å'®ʆ¯à&\�\¾sqòCˆÁ¸m\KMÖŠß­LÁ6x ö+tÕL5h@ݯŽS+Úh“ܧ1r.É)“î¿ÜW¯ð²@„ópþ[?Ú† Σõ4'­Æ„"¼mÞ‡¾Ï?›¯£MtVÄ—²ù'áì‚ÔºT©Øb]À_>[Xo¶ÙŒ6z¹úa3:ûÀžgõ"AŸ/ä{hLä©$ú1ï#{R5<Ä_¨­›¾·CÔ m¼� EhôÆR‰8 q>¢ã¦Œw‰Gi¾•k%„6�ì‰gÐ|‚œ›üëÔç·PÎ-w5uXl ;ÀÇÓ]¿ÜÚ4wtöU ö¯¬ªm}G)ùÃëÐ õT…åHMkïo†œ´ßÙo2:-V'»ûÓ€rÇÆàܾÏè†3ÎS¢f§>ºpþB%ÞD㘨pU…Z¾©¤=Ãýý^›¯×nìí³K¼Ö�Õfµô:ÜVÖAÛ;­›·×ï”øÜ>—×ÐLÿ ¨_D$–|ýQ˜÷Z—ÓådÕ¬žmàm`ƒ»tTåGÕ—Ã.ˆ Ó#§C#§#, n*Øéí³«:ŒzúXc{¨õ4¼ŸQoá0cFŽó ßx?Z{Åçv¹À,¸lTq»Økfœ`?ª6Û�µë@ÞrMa˜í˜›Z@OÆ=àÖéí¡²´‰ÔÏBœã%3n¯£3Ò‹c™k“ÑÌL‚ø­…Ç— endstream endobj 11 0 obj <> endobj 104 0 obj <>stream xœµyXT×ÖöGæ»ÑjÎ`–¨X°Å v,¨i¢0ô*e†2mÍÀÐ;3ô EPìŠÆXcM4ñªIL4jŒÑ$÷îC6Éýö°äÞ$÷»ÿóýò<gïÙ{­÷}×»ÖQ]»P"‘Hâè´f¢½ð¿‘ü ?¸ ÿ¶Ø§ýÔ–h=ÅгkÝ`;»~ü¨7Pbôn_J,-Zæââç»=ÌöG;Û‰Ó§;ØÎ ðñóô�Ù:y„m÷ð#?øÛ® ôôó‹~×vž¿¿íaE¨íïPï�o/ËG;…‡y‡Ø:zy‡È(ŠZ³|^´Ìs£Óü˜@¯ŽAÞ.+û¬Zâ»(tûšÅa~kßß±nIÄN祑þë—ElÛ0rÔ;v£ÇŒ2îÝa3'Lœm?i2;eèæ©=zm�6}F�Þ5ŽJ¹P+©Ôtê]jµ™ZE-¤ÆSéÕÔ"j&5�A­¡S©‘ÔZê}jµŽZBM¢Þ¡œ©¥ÔdÊŽZO-£¦P£© Ôrj*5†ÚH9Qó)j,µ‰ZA9RÓ(šb¨nTwªÕ“êEu¡zS}¨®Ô`ê ªÅQý©7)–RP¨Hjõ@YS2jeC ¤‰º‹zPkIFÈ&›©/D!¢¿wY- nèj×5®ë×VîVßI¶JîÓ éúãÂ\é6­[Uw›îò>=®õŒí%îu¡·{ïªÞí}êû®ìÛüûFâŸô[ÚïyÏþ‡ß {s/;�m°ý-‡·~²ö³yg`÷�N«uT<è»Á“Ç ÎÜôvÊÛ·¸Í\5÷Dê*}nû¾mì�aCò‡:wèíaÃn CÃ#†ÿ6ÂaDÛÈ'ÿ-ÚFõþgÏ‹˜Û¬Ì"4ø¶˜¿„²Øp‰bT<î��™,qÓdì‘òÐõúÜ{\�Y"ÓL‚íöªgdFúzªÂGÚ^Mû¨Ž\¤Œ ÙónW²'r7ó Œ"þ­¶å¬*W“q Q+waïöÇÖqÛƒ—i}V¯‡=P ‡¡RØi]ˆ‰ü”zCÞAdc� ’“x¢!4 ¶ Ø!œŒ.Óß"�TÃu(–,…hˆkfp _Ê"e…c…3týˆÂîÆâ›¼Ü,*¹!æíÐ=¶êÒ!] �52Mì„0²ëZr ºA“FvIÔ(UŠØ`�Ũ"%ŸœBgSYFÎLk\ ¼É‚5‚Ó�©ÌóGví]¬Ý†€F•äí ŒT1H¡.­®<*/:&B!ónð9qªùÈùJ)9’´�„…l!ê"ò¼(æW# ¡:l·lï–t? ÞÓ’"í�öl^r`ŒOX«·fÞ�•Û,´JïËäÞ’R·Œwb#%>ïF7z�œK ÖeØ8l�û“ #jm©8Z/ÅNUæ–£ vFËÂÂ|}¼Õ±ÀÌ]õˆd¬çÕ/>½µoÊA¦ÆŒªk73J'VtþÁ-1z�É"+3¦Q7Éýƒ›3 4)¹œJ’2&¬pWYyaayƒ¯yóÂYÎ#8Üm¶ìs|ûÅ1ªõ'¡†”•k�ú<_“S/ıÀ^Ðá}åè¢%”èäC1’!¢ª³%¨Û?n={2úk’�`+wÀìðêÓΛQC­àÐ�K©¸­ŸÅ¤…â ¡ ðlšÁ. •= ¿ËñŸ"-E…á’)rÿ1ܤ–tH½��‚ÚMx8S* F¡VíÍ/Xù²r´ Ú{¦Ó¦ütþ$ˆ3Qû¤éÁg™zЦqIª])ÄÈÊä…Fc^UMPµûTÙø¨N‹Ä<ð\ËŸÄQ(ØÃ„œO~eBz“èìäxeïÂB´„=äß9ÀÜ¿tù³ª¤Æ�»¥{›�Ò„o�B¥T€œ‰ËN(Ì,6”ÇUoßàµ36Ž (ÛžG„âû‹ç¬©óÉN”&ÄFËÀ V×…d*·Æoõ… Ì¢GkPÔãé‰É­¬å6Vn‚)°’!ºD‘�X&(J/ÊÎgž*ØI𬬚‹ª¤%æšl0_ÃȰhØ$�’("€©Âˆ3ÿȇ™ú½�•ÒÒü,¸ Ì]d“WÍÝ2^Ú»­?IÞQò¯#yëJÅüe¢½íUÿ{ŽoHœêàk0“8Г5¹õR¤ÿš~”½Ã¡#§Šã¸I(»3§oHÐp0¯ÏÇCHNID§ ånj±hÏ}@Œnó3-2Ÿž˜ÌùWø§ïê¯ï’urØÞ¸]º;ðƒäƒ‰'åyêŠÈâØ¼pdÜC6OZ²¹ñ‡pNU :­N“¦50rPFKñ`:”Ù�ÎTÄ2@_Pظ¥•X-æçã§oµîØ�˜%õ­ J_’�>?Î0µ¦ƒ÷‘(ý]=§KÊ€T`rÀPüº óŸ™á)à¹4ΟѢ璎’`ÁU»éÿÎ w¹’KE˜H†NÑIs?�Ìû~oz«cž`«»x8‡�ÿ¡Ë,„6ÃÝ×=Ê¢û".h/4È«?ð†X³ ¸Å½ v_Ø)`>Ï»gJ‡,¹RZ©r¥,h'lÅ¡¤ÚŒ”ýêŠä£ªÝµòœàªu̸\wE(ƒ\SZ–®ŒÀÜFo3yË2<€„SLšÞ3Š7óïXJüÌÛâ6)ra÷¦.X|Á"Ò°í„ÉD|A-ýuj‚¯tMæ­¤àYxåa´—”òÕ-Wïý´/¬äôòW¥)è×�‚¬~ÅɱD½—'0‘!O4‰…¥×n—]h�ïܳ#˜LH/”vȱxÍhšQôãE4¸TŒf z<ÄŒ‡ åáí8ß1ÔLä—¸–ÆâOÃNœßsî:÷aø:ÚQæáµqd—>íR˜&Ôÿ‰ êb4Ÿog+#ʃÃ#‚Ê£Êk‹+K9ÌáÄÖ]ÈJ!ÊSñJy“ÜäÀiøÀÒ(ª {¥|WºÄM¬µžF×O‹‘?…ݘçz.0WO�ÿM+ÅSÝÓ9bjTÙ�¨E®–H¨UŸÌíX±ùÜ’\7 ñ û›‹Ü<¥u^u‰×¢ë’NÆå§ «u†µÌ{ëLsuÊÙï­>®º®Ý£¼Ü 6¹ZØ”®Óçfpi™¦†Ì‚zÏó~_�ÐõöcÔålØ� =RŸ®9^Ù/í$©9¨ÁÒª£ã¤[ÄÿÄv¶ ’PÍtÒ,Àô×s¬ÀÇI ÿò™ÿTŸP1:Ž‹ÿú™—^{ÐK>£ùù/�öbzªë‚÷¦+�àÐ4"Ðù&¨í¥x4 Nà[³£<¸9áÑ’Ýð�Ù\VØDÇi$}éÁOwÔxÒÔþ��³Âïî‚7‚ˆšÐ’ÐÀˆð àÒðÊš’òr�² âF– Ãéuòy«5þ�ÆU2K ˆ)‹) ‰‰ÝÜ|üúGçp¼¼Ó)“D} B i›Á¶?‘D[<\>²ÏªGöPL´$ScTë Œi7Ó~gÇùÊ$»õ?’fd/ü»I`|i;Èÿ@Ê›i¨Ðg¦eêÍIJ’åY¾ùؾC¯=f½6zAɼÁ• ‰šBÒ@(+$ª”¾ñ*QïqáB¾")¨�{–$„Óïu&�8/…‰dóab~,ú†Í*-ÚA×9òð'R […î`ŸÆraä¡L�s¬‰ÆÔ)óµ@ºïÊF(&²¢Ù@ºõ°+„§ [•ë�†á_¬ qze.d@º>£¨ÓïŽJv£Ð&âÄh*fA—œIŒpêùÖÌÌ+gZt&á ‘š`r©`ØØ1(Òæ&Â.&22ZËáa¸ŸAÿ¡Ô D®{ª_Jýßé §>œY"3Êl "2äÇDÇ)#ÈÃú#Ämì'ê~áá rëÀæNÒì Ïß«„aW ‹mÇN·rXräø7ÿQzÓxb†¢þHz þ�ã{Óg?³Ä*XãL/8¿l½‚¤½yˆ0žý‘O0‹Ž=Ecn‰ù¾ü?M¾d ®#y|ÇKMþFÐäv7Ú~Ë*çˆU™§¸eM1Ô3å»*ü‚ã|\tº÷ÅÃ3¨ ×�ÒÎ4·Ù‹ùç$Í¥ç[ôEBˆC4ÑäÂ2’5gá$4¹AZHV)ÆãëQ¨ž¤N©6Õ `" Ôl#Oï|1 k„ –×\ËŒkqÇŒëB�'Šoo·°,òA—ÚÁ²6‡×µƒx¶ poCaâÐÛÕÕ·ôŽ'€+áת~™´Å‰±É‰áø4>l�nÒGrà ËǾpú‹ ñ/§]äàÀ Ó±×5žv�ái'ÖœFN¸&-%-Y¯´Ñ«tJHa}a—eÍ'dM%ÉY�°Æb ;¿R‡nfQ6Ÿ,hƒœ57îk-15<”±[ƺ[‚&ÌV7 gÉÓ¦@Ä$ÊS’–Ͱžý£:-% 2l ÝP\Óñ�¯ Ó1(ј‚P7<ÎZ¯IK!vU=ÛNïæì&wF}�z¢ÐH‚~T8Xhªª€Dµ0#3;¯À´§¹¼¶z{•o•oQ8Ù0’’v «* «aYuFXµ¢õ¡»…áøünˆ+”º6�±®ÓÀcå.¯¸ÏœK—ÿ›éþ¿øÝ×ça?�GÅ7Iw÷/|\J§eVMË(óÙïýû �xÝ–?©Þ™%5PŸSX^ßb>LÍÏ xÝû �P_i¤¿§ÿ&"‚ÛëbªâM¤]€+~Ú¥“/E¿¸‰yƒ¿Ã6�ê:SïFëÜóÚâ�„/Ju’&�m—Yã©:þuÝYSÃ=áæ;´äëÕ4|_õ®@¤¨’¤‘>A®!Û|Wû{«”1¦hÀVÔ³²úÛ§pƒÉÖ"fúŠ…ÎC·d-®XÄé“S;©V*5æÃ lÄéÄËÐÂÜn¬«?™69réô‰¡Ü¶¹lÓ„�í.,pZ½"YFÄ1ðþÙÊ´}U R]êñ3³:U™Ç„Þ#{‘QŒ𿲺dÂíxˆƒ‹%& ŸÂ( JCÖ­O‘ä\X“§,*<8¨$¼¦*¯DÇu˜}œfúe�Qô}«}Ž RAS4êÙZ4�; õ‡ÐLÄ îÙYBr˜t¥^?ÝÑÎ…Û82Ìp°ÏÇ=ŽÛ~„{ÞYJZÿ4ƒ>]ú»�QÙ¹éY¸©@}×"fê9ý¢•R“¢MQŒô‡‘§ðtÀî€×oÁ31ƒ»+:ΞbФåݹþýîØó2DêÉtÔtÝÄ4Š. _Å(“ÏcQßñ¹‰ÂtÕ&?7§°@‘–h�â¡W�í•Üô¬4(°)LȉS+!1�Ã}ßÍGSuyÚÒP°‰…ø„ÔxFAçã©¸ï· YZ]2ØÄ%ÈwÅf«²”R4t¶]”�’¨‚X›]¹òüTdår¨ïÃ8<ÃJI«ãò  t¥Ú¼NÐÍ1¡¦ÔL.þ[ƒ˜†v±È,É/†â’RÓ°Yø Š££ &–Ãfl¦ã¢!:ª ¤ˆü$‰ƒèbbt :›(ìÜ‘`G’à *ö\Ä^¯9,ÈÉ0¤s©©:â×=Ä)—¯tÛ*U©µPu¤ý槈~Ñ�=¹kâ�¢{OÄhyÛvwPAD„œG*WßÑFÙdƒ>UWÌÔã±lexið c^m*­vY´�B«[E9(OŒÊÑj¶ç9Ó/vïØø[f ‘E†…TD•U•šª¹íÅëMèB²k@E­mÄ|âXøZd¼%{‘�šóÚ¯&I>GGÒHG :›œ¤Lyœ:^¡æ¦ãóVxåŸÿ)Pò*¤Þ/lg…ç¼ö«I’Ùø°*Ž­�<3)'?5/;•»ƒÎY¡•ø'<=e-g[eÙíõÌ ¹ùäæ|ÿ¿zL{7¶Ã‚樓×X’’qõSÔ­A}ÎåEK2ÒÓ \®#Œm¹B™7Åü:ô w•·}on»ëXê«a�ÌgZàr…` Fg̯_°wî•Ðã¤�8zÜ|ºþ†þ{8Í`wü)»–G!‘ü Ü„«Ä|ZøQÑ¥cµB==V2%o Ì"Öå}˜+_…»,�Ú�Ä"5²ÉÜBÀxEŒšÛX¶ t‘\hÐ&Ÿá@ô®Œø„“•L{1í«N˜ÄùË$Uú'¤Üî�ï Š-z’:×2n%L@œ�p’í!â6ôû2¯í_½Jÿiøþð/�º†~y„ˆ}:òí¸+æ—£Yl¸D“´N±+9q ñB v’T•�½PYŽÆ"ÛSÇá)©~>#2Â,~gÊÆH5U쮎* LÔ€VÍ•\n=x˜/�/?ÕeÞše¤¥ÇV¡¼ˆîÌAÕ7ߣå¨×ƒKå¢ËÐÆ‡$½³1Z•…�´%_6.ƒßZ¼Ýeóô²�eÒÝJ³`ûÍÆÀÐà8oûoæ /&¾~ðìÛy×Çq÷*N}Ÿ3·¦Ÿ=jÞŠùžµI¦ò‚šÝ¡ùá)–C5^~`ö\Œµ‹R¯•¹KÜüÔÄÑ¼È â̼IËá�Åè×6)[†¸$5$$q¸µÝ×J† 'Ð>ÅüŽéVÇ‹öß½¡|ðÌ<’^Â÷bÛ{aUçMù’:ÔÍ(zZ†4eb^B,…fòòM+Iq[y\ó%)Ñ»¼øÙçÂ5ý3æEtý5ZcDÒ9Fѳ*´‹ôÀoòWÙýquZR�Õõ»ùiC ±ªDéÚÐÍê`X[ŒQ™É©äªÀ$AÊ.)>JGCJ®A§ËÍæª›•ÞŸ¹dÆyé\ˆ©ô†5�®á¾^!ndñÒÑŸ4éZ ¢ªìª£ C¢ƒ½¦^ÞþX=}L:»3Ÿ]ãÜ ›…±¯Í!ÒÙû¿­�hÍ€ÿ¶– š�Úð‹}ƒ1 b”ŠSنѿØ?iÀ‹}‰-~¸ñÛ;Í墿;HuGŒú g,JG}šZëëå%\‚7l /ˆª¬(*0÷>6÷ÃÖ˜ÅA¸õtú‰>F�ͻߌ²ß1'P!E}ðev9œJ4%V*ŽÀUæVýÓû'Í>~\¡égÜIÓîå²Ù7ÆóÅ»UÁÖ7¡>_Ô ¯ �7éè®ñ‹ØPh5¹1ƒ»!+Éó{�eÖúÕpj¹¬<¾¨¸<·öØ–s&àî›0%Åô¿¼yù÷öÝFéƒéñÛ¤¸ê¯ž³Ì÷,2ñW¯å¤/ dl±e8…ƽ@“§*!ÖÌo±*•¤g�ËËÉL¿A:m— Ácƒ¼Fâi€WÙÈÁ³yìÍãŽÒ€ìÊsèÒk÷6£¬¢Î[óËà“µÊA›A™ê—绀f»nøÿòjÞý®Bm,²¢ß<ðI�’Ë9�J«•'&)È'%¥Æ%2ø=ú÷àéNÀ3¾-‘Å}žüf?Ú ”¼O[œƒè`³C¿²G«>9_0÷ÎŒgöü ~Ù~Õ~\N¼N{Õe´ë¦÷a>3äÙ’çHüðÎÏÏÌ>ÌáÁ÷Ùø,ÏJ8Â\¼Ü|éú… Ž+Ü\Vïä­g«¢/¹WEWÆô‡ÌÜ9fN�îîçž¿Xó¢6U5ÞyhäG¾À.ßµ°X>ÔeeèúÔº.]’¡©O‡¦4¶$8xWL°ÓQ�{è Ô Ù TŠ»^š„»ŒOðlýpâŸ6¶3røÍ©¾AÇKv5Âa8§àpesqU•¹>ó¦ì0£ L…XÆÁ{̤—NÆRtŸüIÑÅ÷ºþ�é2sì«×Œ$ÿ^翽%æ— ƒm‰3¨›ä«–£-ùJuú¿¾h¬ß^³ÉÓ;:4„ nXkf îºaÈÿ!^ÿáÅ$®DH€Èó/Ïd´@„™ R&EA,ÄdŤ¨ˆ?9a#ý²ƒýs-0¾÷_’wþÚ À�ÒÈ:ã&`ÞÅôFÛÿ´ÿToß/.ýÓýúÖÚEˆ‘sÓø%Ådï*L‘j“ ãLÓ½I÷9ׄ+ P`¶{äÐæî{pÝ»:{v3fõìy±°g/ŠúPï{ endstream endobj 83 0 obj <> endobj 105 0 obj <>stream xœcd`ab`dddwöu�041Õ~H3þ�aú!ËÜ-ó«C†5»›µ›‡¹›‡eÙ÷ÛBßÝ¿»ðw``adtó‰ÎvÎ/¨,ÊLÏ(QÐpÖT0´´4WpÌM-ÊLNÌSðM,ÉHÍM,rr‚ó“3SK*õsr‚@:Š‚R‹S‹ÊRS –;çç”–¤)øæ§¤å—æ‚ôæç¥dä$V2000F00v10�ÛÿŸÑ7”�ï?ë’B +ɰ|ÜÍ(Ãò ÈýÎûý k[в¢ûoöܲ6ÍÂß!ÝÞ³ý˜øãå¤É½}Ý$»{»ûZ¦þIû)(ñcÛw©îgµS:6?ªº¹¤ú|ÜZ+Ž%l¿y¿¯e•ù�ÄVÒÝÕÕÑÚÕÑ]ÑÝðcéß ‰?³þ|n¬ïnëî’l˜Ò=Wޝ|>›ÌïÊù컸vqËq±TæópnžÄÃļ >숃 endstream endobj 9 0 obj <> endobj 106 0 obj <>stream xœµViPgîf »$‰¡³ZšîɆõ""¬ºh¼ÖÅ€†E¯((ç8œ†ä˜yAnšápäR‚ ¢±ÄYñXcY˜CÝrÕÔ.k4è*ÙŠõÎÔÇ®Û#îÆ¤¬Tí�ýÓÕ_Uïõ<Ïû4MÙÛQ4M3Þþ�ž^¶·–i´eº�åm�Pk¦u‹8)Àɾ{úœŒñoàª×ÐýuJAÓ>~Û¼Õ š¤˜¨èå,ïÙJÏÅ‹½”+ãUI1a»•þa)Ѫø°ù§Ü ŽˆQ¥hÜ•+ãâ”�¶ÉÊ@U²*i�*òyjou|BjŠ*I鯎T%í¦(Êeåîtµw‚*`纤(ß”˜¸°øp7Šú%@Që(Wj=åCyP¾”'µ�ZMÍ¢6QRþÔ卑”7åDñr_K­ ·Ðgì<íúÓ©Š;ö>ö�Ù Ï3G™Çl·ˆkáFŸÑs‡)çgvÇ×Q`ÂX“e‘‘ÆgV_¾°V»?rA[\˜E¢ÇMIÛ‘ \"+éû B´j9¬/肨ԗé˜qö¬g.‘åeÙ …¢© ¡�&$²íú³Ð &83~e3h «‡#õ–“<:“G¤˜q~Fÿë¶\ƒEi GÍiVXæãy~ ÷.™¸4|mD¦ eÈćDöbå¾ ‘t²ª¢B?9x«¾_m‚“ãÁýŠJ{EÜÈÞ¼öùõŠ5AÉÿ¹/å¼Õ!H¶¼Fü^�ÿ´¸ñU =WY�œgrÉ<‰)T}YàЙ!½cï:ì-Ñ5 x�©ÃÕ&Ÿ(²>"ÎÀ[/ŸIT¾dY` ]Áö+ ‹7îâÑÅý ¡ í>“¸�ÉÜ�FúÁCœ,�$”†ˆ¶”Þ¤“ŃÐÇõgM'�‡{»äb�&µFwȃHm@B�z{hš 85C •a²º™èS7-ÉF…•¶.á%]ɾ"�.»@ñÚv9à“å0•¬ óˆ '‘8�ÌÁßâÜœ†l”æåCqžNÌ'Ê™ ܯˆ×—X‹uøþç�ÐáÎl"6ŠzÊJàªA/‰ã(‘-&\h°xHôc3Ö]Q`YÆ�Ï=€m;ž`îÉè0NÇÉ ºlÛ¡¿b‰ãÁ‹%$¾–<ÔASoOY鑎3À}uɃ0„ñs_Ùði¼˜Õ ÀÀ�c–/aj=®z>â™.o`6_Z*WÅ}·éo„yÇky�¼5âöíûŸ6•ïm�N›]$¤únŒÙ¡ÚšÐ7áS®¤ž/G×?uõÁœò+!ö¶é]§2$ëÉ6]õM…u!>à1ŒÌDwò>YN\‰ !!8ƒÌÅ%¸ßE ÈUò /ý:2˜‹98ýþèSœòÙKö‘7‰±³ÍðÍAÓ�MøÁPµ�þnàþ�çZfñȘ‡“˜»ÇÏž¨­/*¨òµ{ ‰K4æ×Õ+LG£Z"—¿#Ç%‰&Ã?Œñ”<Äv€C6f{gÃI9�]Ê›ªO7á�‰Æ)WðòMnÃë<.`�ÿöë‘‘yÃä"¹˜È\«†âØQvGø<¬Yl'˜¡ÝÏ'GާÅVÛÙ#ú²>aT¾ß³r‘GÈjâlk(\ùBº��•›™ƒ9üÃc÷n”—ëŠËH-HLnÌ­¯i.oëŠ5Ƭص2:WÔ!Íî•‚~U36I‘ÐÜÞ¯Õ—ic_e ]<ݧ@®æ3§÷wkèò]S~_|§ØÖq¬ªJe”éòŠ ƒËªÌ«­¯¨ªmÌ4ÆFD§%ª…øCQU±À-õõ_x8ª*WŒ�†p(„Ä*Õ‘=[²Â#`+ç=²YÆÒîñÀ œNfÁò”p()âÊö´A7TBsc3w?“ŸH�òcxõñÇòc¾h"ßó3}Ìç:Ú› âÁ†*™^ÜdÀ}£Ïæ™6„nxË ÆL“eöspU1ñG÷—]Ll²v$€–•¨J¸Äö/úœ(q +Óè­¼8W²ì Y©/kUxY«˜ËþÜ.Ã÷d⮺}«ý|§ØÞ¦.®¬¤Dz§¼½.6Ò7£ )ÐÍFO¥‰(Ñ_Ãh]£=£å2þJްi@ì‘»xäÂuá¼fë“°=lw„ñÁùe=hc…c¾}G&¹çYÆøfMcJjš&%UJkin”Z2�¬çÙÁŠŸpà„l1­p ZlX§=ð‰haØÿµ:ö<�8×ú!ÿò^ù‘)”YÔÿãUo[ËÌ0¿¼e ûþˆáæÛrocXÃÃUèëÝy8´*FæC ÿš�Úµ-mÓªÓ‹ uºb±é³?HÝÀ�9â%†È%­ÊßÿûhÍVPqËï¥šÏ tžoô!mýÀ5™ën‰ƒš@vmB~V8œí6·ò üC6n�ì9ÕQk¾Ð%œ>t®´K//…½ËËÆgó>ë"ÙûÎä}M}ƒ·oÒ:&ûÎ:i,…ðµ™ÜÿÇ ÿ'Ó”m ß`ùµÕ=6Ñd˜ó0žHlûíÁ'b/ÀÔq;pñüv†È®ÈxQÿì¯kê½4XÖ\Ç?2Èz²Mî*9nGÍ…X1§QÞäÒ‹5ìׄmÝØ.ÿšŒt+,“0“G‰©k€)2E"ÙNÐ�®�ŒL�HDb÷¦CºÆõ"Ê'f/¤7H`¨œ3 ÖÒ\ƒê †„V²¦‰fGa¢½Fí4ÁPåäd®ušDQÿZ­Ö� endstream endobj 81 0 obj <> endobj 107 0 obj <>stream xœcd`ab`dddwö 141U~H3þ�aú!ËÜÝý#þÇ>Önæn–•ß}7ünÄÿ]O€�™‘ÑÍ'Ú9¿ ²(3=£DAÃYSÁÐÒÒ\Á17µ(391OÁ7±$#57±ÈÉQÎOÎL-©ÔSpÌÉQé(VJ-N-*KM�ØìœŸ[PZ’Z¤à›Ÿ’Z”ÇÀÀÀ¤kÇÀÀÇ ²‹]¿ù?ÓT>0ù}éÆC?4˜}_*:cu÷ê59ݵò¿Ï±Õewgg­êž)QwdÁ�˜ù•>ß—‹NŸ4iZ÷ôî¹ “š'ü¾ó=U¢¥¿ybS7GMe}Yå´Ö©-òß·ýöù½í·ocKCkw¥dÙÜúYr½=“{z»§M–䫟þãûôß!SØ~WNb?Êu†[Ž‹¥2Ÿ‡ó(Ï^ûºO endstream endobj 39 0 obj <> endobj 108 0 obj <>stream xœcd`ab`ddduö ²1T~H3þ�aú!ËÜÝýsÒO]Önæn–u?ü…¾› ~×çÿ®%ÀÀÌÈèæéœ_PY”™žQ¢ á¬©`hii®à˜›Z”™œ˜§à›X’‘š›Xää(ç'g¦–Tê)8æä(�t+¥§•¥¦€ìuÎÏ-(-I-RðÍOI-Êc```6´5b`b�c;���!˜a#ïÆ$-¾ÿL Ýk~¬^³}>ã÷ú[ÌßÏý]ÖÙS —”V¬Ó͑ž¬û`÷Ñe¦²§uÔëÈed±mé{ؽuoéàX“Á®Ó1}ƒ<ßf«4†ï¼;¿[íd<ö3œùgþ÷‡¢³æw/ZTÜ]#ÿ—“­¦¸»¤d~÷,ùŸ¼¿3Dg-Ê”ƒdÙjÊ�2‹�2PÝýþþËÛ5Œ¾|/yÅü}Ý÷ÑÙ³¶®™=óä‘c‡ºŸq|çV¿ñ[ð7���QÔ¦–™ VÍÚ¸?²»^nÅ•sKöts¼Ømc®ìdÿ›ë7¯üo¡ßbõ Ý�ÝE’?äÙV|wgÍaë(oެ¯hm¶ï®îæøíÆÆW¶à§ý‚ßKg}ÏŸÊö;qû®ëÜr\,æóy8—Oàá¹>›‡—�²Ád endstream endobj 27 0 obj <> endobj 109 0 obj <>stream xœ­VkTgžÈ h%Îâm'´µÞê±Zµè®­"BÁkÁªÈ=0‘K2oÈ]nI  ˆ ˆµÚ­•eK­Ç"Ûj­¶úÃ[kÝoØa�;¥={û³ý3g朙oÞ÷yŸ÷yæè€ñx<�裂%‹íws˜™IbEBLT²×¦(¥Dœ¥ä¤^Á²˜±2}‘—�Têdÿ"Õ+Hœ*VìÇŽÿÚW–”¢RŠ^›d±bE2†a3Ò“c2d±›SÄëâñ©eBpbàÞiTÒB Û‰mÁÖa»°0?ì-l+æ�½�½�cØ6, ÁÖc˰ Øl;ö¶ [‹mÆÜ°™\§ŽÕòðhÞ‡‡«ü]üÛŽþŽÇ�f:é2\„7â�ˆõÎÎç^—Å.G]võsÍ{ÆÛ‚¹?sxùSŒ�2×ÞdT6^ÝM>³Ý!­—ûõÕ@Øp¥.™VB:„TzBŠÛèê PÀAZ—§žÃÒÓX>2ç—é ¡pºµê(.§u�1ú$÷Á¨ƒ#´`Œ7-/+317KµMæ¿ò@ ûjm…%f¨&¬ûª•iª¬¤ðîø�.w]¼Ø@qU½Y€��qêV™=�Ãå�CH<ä)lEè>Éšðp PR¼Mßoh+œÕ£¹b4Ð#Bñ'W. \. ¢ØÌÿòæv® ú(�‚q¸6i{fM¢q+¬…°HÙ&Bxõgœ}Uã$Å¿(ÉÙ)rÆë“c j½Ûaá»�¶ßå#–ù­ÍM‚,B^›Öd5Öý|uç{ì”·XŒ}…�úp"ÐŒäZVv´Ùºü\•¼h½:ˆÐ¥'ÑräýM÷¹ÒËt|ÛóóÁÂL5óšg>3ƒyƒ,-•‡ �b¯ 4ìr'‹àð�uÈ$°-cnÙÐAÞôÌbxtCPƒ¶8)Ù¬ËÞ–‚u¸3Z�…YÌ{½Ágö DM�û”uc§,`yì–|ò&rFn� !ÅÊÙ02"L)§§à´C'œo8Õxº×tNÁI•5Ò [A ñ¢ŠP…G$ïbbT³ª›™nFqÝ@uƒžÂÌ+“�8š[îdÃý÷‰˜'8;{UVŠ ûÚ“#­!3Y—׿³$+|0 z޵XDÈäÈFáítšŒ¤]áªH‡xkêqy—ö"tA‡áÓæ“íxëyhƒî¶ðò ‰tÂ}4l£<ÍjbV6ñÑ�Ñ·Éì Z¿�ƒã=i³  Œt]¯ÕÓ°�«ÃS lö89ú ­Ð }º6;9fCo£ˆ©Á‹òôta.³pìþ´Rµž.â׉˜>¼zâ¸.¡wê!v$öåø ÂRDc«ñ HØPZhf¦w+,O‡Põ Oá×È}O6÷÷5÷qõÒRÖ‰uóóö‰»RD™&Ѓ‘ØæX´¿;ä+nÈ/=y€H$\ð�u|7*B•&Þ|Žà•âÜјä¹�éϬÐýõO¬Á*|’¸I&´vœÙƒ»Ð~Ò\¦‡!÷9oÍæ®3~^€päÞƒøue‡ yÙºÜC:‘dö8; 樲#é B;¡7‘‡Ñü›–c@üTÆÎŒå¸ëÀÞÆžƒNÝb„�øm£«Ii>lÐÄ‹Æðx�æ=*UÊ8Ð*D¡yèÄÎDKØÕ"vê?¼È0]q«ˆ9Ž·Š{©G‚Ï`HÕ¿îä¥Ëá]`ùû¶ÄïLK Ú:ÇN4Þ’ M°¡e7KÌ<ä8x÷;>ògf“H`c�!¸}æÌ©‚*È©¢ÔùéY  ”Õi�ÍUÆ†Ž¸ÖP¿wB_¥X|•t„~�\§¾×Ð' Nh Û^ÜGWÞn_È|Û¤ú<|zËS؃Ö\'Ñ"üa÷�¯Š @(-�¦9!30×Z*ZZ¤Í‘kã"3)á0rÀYÑ/L7ýï¿1Z6º}r³A½GÓÙ´khíµ¶³žÂ¿!ZC.ƒGõ�ú–*‹¨¤¢¾éßÁ\e ½ç€BtH­”Å1¯„ì”ui뀸744ܱ¿CQ/j?Ö^TËIHКü< ¨‰ŒJuuY]q}�º%6-"7:ŠŠj�*P±Èßÿ½³Ø²W”u =$„p¤•b[Ú–Œ=‘Cø>܆ܑ˓þëm™ý6Q¡M[a3' ‘�£ßS¸×-Põ5F Ùgäÿþs§�wœ*ýIp 9Âò�u;æÛ1¥9.š™wêJ[I" rÒEì4<rÊ‹ôúº:Ê`CmÝ©¨ÚÄm~ú/_žK:ª®%¶Ä–D•Âáàò€ÊOf´Y»n!‡¢%R¥Ï.å` *¡¨Nô¯�bMžÔY”6ÿ`v¾VÜ 8qpKªe�*Q‹¼)÷ËLbÒ�ÆE�‡ìÄgv£"ò׎á [öÇ4z,ø•¶�ÕüVÅÁ–sÛ¾Âs�HfC+Œ¼'Ch†…�|ì¬ÝƾŽ6*ôÊ$¯ùù„ê[¶g_¾§n¿Òte€º¨Ø†s¹%.~¨á•G~:ÁiäöÔãÚS?N£ï!?f3ÉzÙ ÿsi.GUó‹rZôç œº¶M”˜_Ô)>.dŽ“- “LªJ‘§˜å¶&‹©å¹Y«l£‹›<.Xåèó�P«§ð*ú‘™F²Sm›ªbÏÃ'Ó¿8é:ú£™]~˜ÒçBnùó¡ ÝãSÉ¡iu% JjŽîz¦³|說®8·özЍ<¿_ýE!¼×˜s4§)Î$/ã4—X·Ã×;yuQ_(µõ¼v€n§Ë�öeÂÆ)S¬7”S /(h=gKˆ¿ÃQÆù¯�ãÀo¼�¢ Aá¢Oõm&u•˜»g^ÏáòwgÇe¡—áRû@½ððìåò”P)§ª �G ‘°¦e²ô4ùö ²‹×>ø�Ž�.rlNmHNNMMNnHmnnhh¶Ÿ0ë…BκÃG*æG²½ |„²Úí*ÎNcaH ©)x.šZÍ*J.´ŒÀqΆG � 9¾J;.OöȦ113¸¼Ædò™eèYZ_srP?ØRa·!ÃîIt9—´€ ùš7Ø’i¬#jÉ­ä6Â0ÝÚ µœ‰%ÑÁ:å/�í2æVJÑlM;œiÈ«„J(,-,³{+7bÏñ&Ш�ÏŒp>¾¶à� ÃX ¢˜)x»¡|˜j°·åõ%†5ãm½ð7.T!‚å@ø÷÷� †*0B)œ ÐU¼zì†OïÒ%€vâ' õsGyÜòùÈot=ù—­UÎ` gã“Ëf�@æ ÚcjüþŒÙ£{x×]ä=tÕâ)ܯA·¾" c£z�0]:òµè‚"ߪÈÕ$æ÷Q( ‡nèŒïˆíÜQ½ ˆ•þa�IÆ kS­ÑZ‘׺[/jlë+o¢ïbìÛ¢8\ø‘æC­ŸvcÒšÅvˆ þp_qyðô‰Þ:*­ çâ }ÂwF·}ôq÷ ´ò0G ¾OÈ¿%Üñ�Ûö[…Üÿ7ÛÅ-Cœù�Oyød4¾ö¯Ñ˜› bBkžòP ™�Þ¯&õz:sƒlsD˜(7—¦!ŸÈ)Ê/ªAø@jWŒ$=E.¯Ii¯®8\RF¹«Ì£«Ílc J.°Ñ¸Íeè%ÊÅÑÛèêl.uu2ººaØ?d… endstream endobj 25 0 obj <> endobj 110 0 obj <>stream xœcd`ab`dddsö Ž4±T~H3þ�aú!ËÜÝý£åG*k7s7ËÜï„¾Û ~·áÿn)ÀÀÂÈèæ•æœ_PY”™žQ¢ á¬©`hii®à˜›Z”™œ˜§à›X’‘š›Xää(ç'g¦–Tê)8æä(�t+¥§•¥¦€mvÎÏ-(-I-RðÍOI-ÊK,²3‹³�ú3™»˜™æðýgò dX»à‡Ô|Æï3O2ÿÈþ~VtæÄiºçr̬Ÿ[ÑÜÑÙÒ(÷[Î`Öw­Þ¬Óf——7ÔÔÉÍùmþ[öYÝä¶žönÉŠúÊÚÊim3[å¿køüÖð®mmhë®”¬�^9or_朗rßeŸUÿ6g­›V3þ´ÙÓ'V}×íî—[Y±5o_æ²ÊÞîIÝó¦Ï�9¯vbkŸ|Ĉ 8øJý´_Âö[x*û®Ü{¦óð00?¦‹ª endstream endobj 23 0 obj <> endobj 111 0 obj <>stream xœ­XyxSeº?!m8 TE£ÄåFeÓ˪¨Œ Ê" ”¥(;-]é’�îMÓfONÞs’fíÞ´)mÓ�îP¶ l‚¢²£ÂÜy†q®sÇqf¾ÔÓ¹3_Ú‚8Ãõa®÷yúG—çûúå}Ûû ˆ „@ ¹04|Ù¬Ù�o'ùŸøŸá^(ã­ßÇôk‚aŒÆ5<÷\ø8tøq´ýQ4ó1B(¼¿|ÓB©,[žŸ6aÊ©fÍ�ûÆ„÷’cä ;"S&„F¦ÅÇ$G¦á’&¬‘îHˆIËž>ὤ¤ a�©ÂbRcä1ÑCÿ{¡4Y–ž#Ÿ*�Ž‘§1}ù{Ù);BäH£WÈbV.Ú»j±<îýÔø°%i k–¦‡/ËX›™¹.+9jÊÔiÓ bñ±‘XI,"¦/›ˆUÄbb±šxŸ˜IL$ˆ%Ä,b±†XJL&‰eÄ«Äb-ññ1•XGÌ!^&Ö¯D(±€xƒØ@¬ £ˆÑDñ(1׉"XÁÁG#ä#. ëƒæý!øýàoDe#CGî!G‘šQÔ¨®Ñ ™öHÓ˜ycGŽÕ‡L~tÄ£›ùØþǕ㢞óÄñ'ç>Ù!Þð”ä)xú¹§«ÇGJKÎ?óÒ3©Ï4e`±…¡[^þVpˆ_Êo÷ô|vØãŸ�Ÿ6íxE¯ÐÏøŸ[‹�+Y’ïÌ“êäJ#µ€?¨MÚ±f H¶jº›úö|í=K;¼Eà!;RÛ6ÎLà'ë5N((d-ÅVÊQ_óõ ݆T¹zWÆj:qv^D“³N¦Ú[_UZJ©·åGÄG$n�ˈH‹t­9¶8²DUœ©ÛÁ¬ŽhßÙóÝí¿|]M…ø¨ßçÓ[u\ˆXT-¶UEOþÈý°!'t?&g#­‘5�AnjHî¼Óˆ¦Z�0æ›M¹FJ“ ›µÈ\­Ý[ínpxèšÏšïÀ òHÚ¡y¡›ã¶î¤LÝI-[ v©3¶gÅæ­†Ô0N7ËzmTÉÉŠ“Í@Ö@J~–1ݨ¤ðÝF%˜Á(Éwä—{]åeVüÈujêºt—qÄYsUè_à%–›Ó³ •”Wœ®V[ï�ÈÖ|?Žÿ?eâ©•×Ñc7ÿXl×:ô&³Y£¥Ö-|Wd„¬ûäþj4¢é8ÝÜw¨y/Øào"Cþ.Lº1ŒèþÿñûÅÎf›ã4�eÎÁŽçÐü(Q˜@­àï |2~­ÿ SefSAÂ� "øÇð~jÀ“³t“ÌH js¶Æa¶Ö5pà£ë¡�ñaÝEa2+µC381&Xô¬¿m<+:1ð=—Å™ AR–G‘dþ5ÿÂÀùûãK3†æºZ™=CÀvi!w 8œ¶€åäh �}Œ‹‡yzå¦öÏ?à¹`#úD„žG#‘è/WWzÇEÿµò×7á×ä'áçxÅëù‹âÓÈêl³CHÐ(ѵ²U‘¯½=‰Ñü2þ?ÅŠZ�³ÓŸ Ö`4_tµ*4â…9SA‡ø_R÷•xP±§¤O€ )â%K¶¾ZR‹î¶ÐN•T×¶5ƒ Š *±L^œÝä'¼=§U™M�º$,S 9�k“%–æC>îŒ tLûþ®î¿º…H('ZÀÕ7çé(Ùæ\e&(@mÏÞ­ð*=‰@.Œšž…Ieu³œËJ»ë›+|à�2M±¾=Ó…¿Û•”›«V“!~ÓAÈ+<+ôëQ£ø»O¼{j µ�Ñš�Ô*^£l”û¶cä ø‘ü4~ÒìË/tvÖt·ÑîÝj/´ƒÇWä+ÛSx èSÍiz*óͬx)�é†ÊŠ¢‚:K^!ÖÉVÎY ä:æjááF4º´ƒ®9ÝݳÈS¶é&Ú¤ ¾+°ƒ´ˆñ_—žî²·r$.[™_-Mf …N†$.H–y u;Ýjö¨ 4¦|³žÏà¯5”˜Ù üjÑ=¾8kA__÷¿Ï•ñþêñ(zà;k> Š,¬µ,PU~�Í’´¥g„¿æŸk“tzlB*5diíLA��ƒZ|yãàåA×Cvú.(q²öh9í’ïŽ?$`ðOGoo9÷þòõê ´æP\UÂC Y†1—þUŽØÑpêæ1 [*b×­IàÏŒ¤ãGI“€ Õÿ޵`‡sÐCÒ&÷ w0ÂDg�¡YˆrP®xZh\wlÛªyz"¿hRï¯~,hô° -Ó\kÜg¯sµÓ6�¸½ú�«È¯4aÿKH¤Cú5Þþ·«hÒMÜUa±?LŒ&¾Ž‚yŠßÂoã5¼‚é„(´E¢\”O ¼0°J<{õMrʋ޼�FÒçw£ë,�_\XÆ?ͯçi¾“_ЗÛwC@ÿ»—„Èõðâr@„BÑj�²Ð”¹_ó!4¿x©ØÙfÃý%¿!Áá·^^-åç,…Ž˜÷Öšé@¾t¿ëû×ýÐåAòdùçˆY+köZ`´´± I JåKmÝäý4iiñìi¦YsÞFudî ‰r-0šÉ¼a«¯oæ �nÄVßðcd؀㜴9‚0èvýòK~µ½v±Ê#�]AŸ^¢ÝþIâ«Cé(à&óEν¶–²ëÎ}îí˜ò»¡$+A§—�ŠÌ*V—y½åMíÑÞ¨WäüS :*ƒ/åÜ­ÞIÑ¢aþJF£X!QEæoŽ#ÈÙ¼òV»µd…Ò•“––½3º5­óÆ,Ls(Ü«ÂA/èªFçp»½!D'ÑE1š&B�£ñD£¿XvfÍ·?ÈÌþ©�¸R{Z9hÁÎÓpÇ}ÎCs%Áèy¯xÈÈÛ¢›í;Wfk¦E¬¡�¦m›fâ~ŒÝ{ÍjmôÏByb«§"–t©Ád0�ÉD1Œ6Ó  矉 ã§âc!¢LåcÔ|[tÞ¡�f뤌–†1‚)�ö¬…¬µÈBý ɇð \ˆ£ŠÒDeÎÏN� 䛢ӈuî±³�ظ¡1î¨È4$Ò``Ô` U�¨–r U�f)X$8ÒæPëïõàhÕ&`p`áŸèø—$-òËÚJp¬”©u%ºüY1V¤©—…¨µ‹-…ÝèÑ/¡ê J™kÌÊ9™Qª-)¯-jéYb—n‰I_KiNn/‘ýŸ“SEé`rÂhtúG�bÀÂ0U¤þqb –KÝڢ촼Œ†2‹Ô^yó Á“üD~Ҍë?:Ò½ßn§ù§TI1ó $À.w•Óé�b²HSš–)ÏIŒiW\ùöÒ¹kJ‰ÂÄÚ�+æ­r-s¥ð`= .m£wcvì²Ï1GϘ Œ& yƒ­?Œ¿¨]):ãÊ•*ô2“*ÐIþœ�¸9K±…:�TÁw{h¤²ÞUÈßòmÑ9T|·‡#E®N^"7e›ÒhF ÂÿÞ¢…E­´Ñ�°—éÒ9p­E'�g‚�ã9õ9zíl¯GðùUôá!¡œ?Hgd’ÁHªìJ�·¬¼yÿ޶ù1ñ·ÇVd8ÕT™¢Â°W½ÛГá¤,õU~D܆â*ê �€^™íÈÓFÃW�ÿM؇„Go-*Ýä¦d¶8t“5Untú2íÔ�âõÁèÞƒgc"@5ü¤�¦<3.“$Ï™_Vg«±s¦„Í‹3ÖïAò³cÿ‡‘± Ò€âœN!2*q«åAÇ|ãüŽ‹7Ÿ~"ׯCwÄè1ß—_À—äõ÷Îó!o}8Ùin ¼m�� ¨:ø‰nDà$º.V¡MÐÉi�T ™ä;gäG¯×çÄ(2ªÌ F‘b½4~'�‰Œ¯®Þ~ÄÚ@WÐ Åp6jÏÖrrn¡x¢è#Tæh´[œ¬ÄÎÕã9‘<ý-¼’màWñÛþs7‘áCy>ÿŸM¹.ì­õ²l/–0«ÃíÐq†Äxvâ8*0kTÃÚ`ál›iÌœš+£e›–Æ.rÁ‹ûÐìkMhÎßÒŸ|u«ícœ>Ä…<½-—I3åÒš‘ŽÆ‹ } ™prp'qêEO££>x+ñdDý8Zmåãù4^Í¿õ——Ñøîß_Àüv§þýdm„I°4]ÀÒÉ¥ÔBÕ£ežt�•XG ˜E¸ÍÅ ~ùx ÝP’±¸XÖã £©UÕè9 ›E^0êôé8V›&V«~$ùCÌt‚cÿ!Ðá0ƒÇ—{˜Óù¢P° .‹S³PŠ#ǹ±$ëÚpt?íKèñ÷‹Í.{�•Ü,•±Ñ ÄÒ1ÍÅb![e‡²“ S1 7*OhÕÄéuK@¢Tµµ¥�ƒVº :˜Öá¶ê KšeCùypÖlëôãå½hìÍ@n+îÉ,ÊÎ’g¥i86H¯Ì r×¾�¡Ü×q¢ùŽ÷å¨~è–îà…Æ8�’/+ºÐ/÷£¿Õ ³“ÿ¬Ö›/‡&Ù3]¶û&YYRzH9ó&Y&ŸÑÏæ¿ŸÂ�œüâ$ Ã6tÜòZmUôû'þ{$š:@i! r%üèË~ƒÕ`Žà£|TH?u·>'Êz¿:Ž–à �Fóĺds*hIeÒkW«Ž4ï+;Ùô[ª¤ÓêzÈŠìœ¥Ú qäÔÏÓ{jšm}-TÕÊSúZ¸ íçk?-éìB“¡�|P :qBnlÆÚÄM�ÍnF�½¶¨—¶×—æðÙv»÷AÁ}kÌdQ{úÇ× îJ#?½ÎN#ãXFcRár¬kŽßßìñÖSåMÅç0ñ°*Œ:Ðã|j2æš4ysV&Ü¿Áøa9Cük²MÔEe6gH(”ýœeÉÓ×”‹õ»V¾þÀÙ¯Ï>[gÆ�ÞGgTö¿€g¬Dÿ±ï`µï˜ÍÅ:X( Ì6LºŒ�4J)Ü. õC0+ mæR _«4ø#0~½¿Œ)gjO±’’aTíÄi"�N„.iè ¦¼ë E—b¡ûþÆesÆ"�gq‘ƒL+ù©/z=WÐÑËB´ÿqº>/¢»“Æ�pwʆ¤(Y.¥jJÚ³ÈÉxIfHn–+- ½—ܤ׫ؔ¦Þ¡M¢ é ü³ŒV• _» �ÙÅ>‡½ gÎ]™é²û²;:k»ª(GjÍV¬&ßô ‰g°®ÀäèŒ%›ÃñL©ß_^éh,+3;ž™Õ9ŠNmo¡Ð<´ôT hü5 Þ½‚sëŸPX¯à+BÔ‹çL~¢ÅÍÙl` ¨„‚âÃD™�ÉOÅèõY T¬ Òø/ úƒÅ�×§9s¤I²¤ôÒœêÚÆÝMTæéüJ¾Æ…R9¿Ý5Ò7úÌ#Ôè 7> endobj 112 0 obj <>stream xœcd`ab`dddsö Ž´±TH3þ�aú!ËÜý;û§åÏxÖnæn–¹?4…¾ ~÷áÿî!ÀÀÊÈèæ•Vìœ_PY”™žQ¢ á¬©`hii®à˜›Z”™œ˜§à›X’‘š›Xää(ç'g¦–Tê)8æä(�t+¥§•¥¦€ívÎÏ-(-I-RðÍOI-ÊK,²3‹³�ú3òRÓ�¦äçç$g00001›10v1v30322ͺÄ÷ŸIØ�aí‚Ró¿7eþ¾æ{‰èÒÊÓñK*—VövOîæ˜;}ö¬¹õûå&OûÍ´û»Êi‰©ý3&vÏã˜Ø¹$CƬïÚ½s:åwKVv×ÖôÕr4²Ïú­ó[ôiÝ”Öîv h}uMŌ֩íòßU|~«x7¶×µvWH¶ö­“û®ú®æ·k{{Ë”’ÅÝ˺ûvÎáàû�½à/ÐM?–2ÿ4úi*:izwwÇ´¦éµuí-u-ròÿþh©ß!Ù0¥~æŒþI3&Éñ/þi¿€í·Ðdö�\O¸wÎâáa`0­Ü endstream endobj 19 0 obj <> endobj 113 0 obj <>stream xœU�mh[eÇŸ›d鵆:•|ØÔ{¯ Ã ªàV'ŒÚ‘¹u“m±°fíµMh^zs’æ&5Mš—žä6I{›4µ1ML²´é¶Êt:Ö¢Sd8±•�àA‘!̉ŸÄ;©ÙË98ÿ‡ó;?©ˆ µN¯ï:poz¾þQZQFé•û+�C;@£�ªÚØ|¿ñ8~õ1üÒN¤$ˆ·t6»›3 ñÌ º½L{GÇ~¦ÓÂr¦~£•Ñù!Öbä›a˜9në7±¼ûe¦sx˜é¹·á`zXË9Ù�û—u6‹}”g9Fo`9+BHe=j2#ôjGÝè0ÚÑÄD-è1Dl+&· ý»¨m[<�ü•:]!êOn%n*q/> ³Òš˜�ÿ b…Zíê•Ë?y!ïì=a”Õ.í3Ã$øÈž+¶Ïþº„™ŒƒãÑ ?B9:Œ,�ž€T(Ì,IÓٵ˸¾&:yA÷úIk¥‚×άœ‚Aàxϰ£×¢äD*<“‰M—RTúêâ·ŸYJr£î�+`¦£áhØëé Žx�……IÂ$Ÿ d³étŠ“3«‰<ÙüaiA ¯TñõÑ辣ěø{-îVãçð¾¿që¯7e--ßR»}àòf`¡v<á©©ˆ�–wß]�x?:ñ&ìâ?WXôgrÅx,GßPÿ ¥H Èä<äæ}0qC|ŒvÆ£"ÌB"žŒ%H¼»þ¹vv5&^+Ô¿|çèô…^9~‚„÷ؽ@Ê/ªÛ¶ ÓúÁXûñûVíG%Þh¨´Kž~Äê°Œ.x ¥sÅ*%﹫ÔÚ» j+$„ÆaŒ4¬ ~yçÿ‚ùƒgÏö9>ž(S‹™eZ*K幇=[H/ÇäzÿùSûŒ2ã{à5)‰Tåöå*�óRÈæŸòú-tkõ"’û*õßîs ·1SYoo‚儜Ã2bqe]Åj©R¢döß×´ÂC÷ð€0�-g§Ë0KݧÕΙًÜ7×±b kªÔ-ü�˜ŽÏ@v×µ3Ÿ{Vÿ�b.&fSTukccÈ|ÚköFšE·9ó�Cy¹$ÍÍ©å>©e¥õçG©VÕþ�4�T¦5„þPɉ* endstream endobj 122 0 obj <>stream GPL Ghostscript 8.54 PDF Writer 98-04.dvi endstream endobj 2 0 obj <>endobj xref 0 123 0000000000 65535 f 0000074943 00000 n 0000117978 00000 n 0000074792 00000 n 0000072469 00000 n 0000000015 00000 n 0000006035 00000 n 0000075009 00000 n 0000079246 00000 n 0000101337 00000 n 0000078332 00000 n 0000092164 00000 n 0000077686 00000 n 0000089984 00000 n 0000077002 00000 n 0000086274 00000 n 0000076588 00000 n 0000081803 00000 n 0000081582 00000 n 0000115508 00000 n 0000081206 00000 n 0000114727 00000 n 0000080566 00000 n 0000109090 00000 n 0000080328 00000 n 0000108401 00000 n 0000079967 00000 n 0000105165 00000 n 0000075050 00000 n 0000075080 00000 n 0000072637 00000 n 0000006055 00000 n 0000011231 00000 n 0000075209 00000 n 0000075239 00000 n 0000072799 00000 n 0000011252 00000 n 0000018866 00000 n 0000079786 00000 n 0000104381 00000 n 0000075315 00000 n 0000075345 00000 n 0000072969 00000 n 0000018887 00000 n 0000024801 00000 n 0000075454 00000 n 0000075484 00000 n 0000073131 00000 n 0000024822 00000 n 0000028725 00000 n 0000075560 00000 n 0000075590 00000 n 0000073293 00000 n 0000028746 00000 n 0000033998 00000 n 0000075655 00000 n 0000075685 00000 n 0000073463 00000 n 0000034019 00000 n 0000037473 00000 n 0000075794 00000 n 0000075824 00000 n 0000073633 00000 n 0000037494 00000 n 0000042902 00000 n 0000075889 00000 n 0000075919 00000 n 0000073803 00000 n 0000042923 00000 n 0000048548 00000 n 0000075984 00000 n 0000076014 00000 n 0000073973 00000 n 0000048569 00000 n 0000053255 00000 n 0000076079 00000 n 0000076109 00000 n 0000074135 00000 n 0000053276 00000 n 0000059191 00000 n 0000079595 00000 n 0000103751 00000 n 0000078999 00000 n 0000100671 00000 n 0000076174 00000 n 0000076204 00000 n 0000074305 00000 n 0000059212 00000 n 0000063831 00000 n 0000076313 00000 n 0000076343 00000 n 0000074467 00000 n 0000063852 00000 n 0000070138 00000 n 0000076419 00000 n 0000076449 00000 n 0000074629 00000 n 0000070159 00000 n 0000072448 00000 n 0000076503 00000 n 0000076533 00000 n 0000082085 00000 n 0000086593 00000 n 0000090310 00000 n 0000092700 00000 n 0000100896 00000 n 0000101589 00000 n 0000103970 00000 n 0000104598 00000 n 0000105433 00000 n 0000108645 00000 n 0000109422 00000 n 0000114992 00000 n 0000115728 00000 n 0000076914 00000 n 0000077384 00000 n 0000078090 00000 n 0000078864 00000 n 0000079147 00000 n 0000080472 00000 n 0000080976 00000 n 0000081471 00000 n 0000116656 00000 n trailer << /Size 123 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 118168 %%EOF stevengj-nlopt-88c424d/src/algs/stogo/testfun.h000066400000000000000000000330071521061417600215520ustar00rootroot00000000000000#ifndef TESTFUN_H #define TESTFUN_H #include "linalg.h" #include "tools.h" #include "stogo_config.h" const double pi=fabs(acos(-1.)); /* The Matrix a and vector c are needed in the Shekel function */ static double a[10][4]={ { 4,4,4,4 } , { 1,1,1,1 } , { 8,8,8,8 } , { 6,6,6,6 } , { 3,7,3,7 } , { 2,9,2,9 } , { 5,5,3,3 } , { 8,1,8,1 } , { 6,2,6,2 } , {7,3.6,7,3.6} }; static double c[10]= { .1 , .2 , .2 , .4 , .4 , .6 , .3, .7 , .5 , .5 }; void Domain_Shekel(RTBox box) { box.lb=0.0 ; box.ub=10.0 ; } double Objective_Shekel(RCRVector x) { int n=x.GetLength() ; double R=0.0, S; for(int i=0;i<10;i++) { S=0; for(int j=0;j=0) grad(i)=-( sin(sqrt(x(i)))+sqrt(x(i))/2.0*cos(sqrt(x(i))) ); else grad(i)=-( sin(sqrt(-x(i)))+sqrt(-x(i))/2.0*cos(sqrt(-x(i))) ); } } /******* Difficult multimodal problem, PERM(n) *********/ void Domain_Perm(RTBox box) { int n=(box.lb).GetLength(); box.lb=double(-n) ; box.ub=double(n) ; } double ObjPerm(RCRVector x, double beta) { int n=x.GetLength(); double s1=0.0; for (int k=1; k<=n ; k++) { double s2=0.0; for (int i=1 ; i<=n; i++) // s2+=(i^k+beta)*((x(i-1)/i)^k-1); s2+=(pow(1.0*i,1.0*k)+beta)*(pow(x(i-1)/i,1.0*k)-1) ; s1+=s2*s2; } return s1; } void GradPerm(RCRVector x, RVector &grad, double beta) { int n=x.GetLength(); for (int j=1 ; j<=n ; j++) { double s1=0.0; for (int k=1 ; k<=n ; k++) { double s2=0.0; for (int i=1 ; i<=n; i++) // s2+=(i^k+beta)*((x(i-1)/i)^k-1); s2+=(pow(1.0*i,1.0*k)+beta)*(pow(x(i-1)/i,1.0*k)-1); // s1+=2*s2*(j^k+beta)/(x(j-1)*j^k)*k*x(j-1)^k; s1+=2*s2*(pow(1.0*j,1.0*k)+beta)/pow(1.0*j,1.0*k)*k*pow(x(j-1),k-1.0); } grad(j-1)=s1; } } double Objective_Perm_4_50(RCRVector x) { return ObjPerm(x,50); } void Gradient_Perm_4_50(RCRVector x, RVector &grad) { GradPerm(x,grad,50); } double Objective_Perm_4_05(RCRVector x) { return ObjPerm(x,0.5); } void Gradient_Perm_4_05(RCRVector x, RVector &grad) { GradPerm(x,grad,0.5); } /******************* Powersum **************/ void Domain_Powersum(RTBox box) { box.lb=0.0 ; box.ub=4.0 ; } double Objective_Powersum(RCRVector x) { int n=x.GetLength(); double b[]={8,18,44,114}; double s1=0.0; for (int k=1 ; k<=n ; k++) { double s2=0.0; for (int i=1 ; i<=n ; i++) s2+=pow(x(i-1),1.0*k); s1+=pow(s2-b[k-1],2.0); } return s1; } void Gradient_Powersum(RCRVector x, RVector &grad) { int n=x.GetLength(); double b[]={8,18,44,114}; for (int j=0 ; j #include #include "stogo_config.h" #include "tools.h" Trial::Trial():xvals(0) { objval=DBL_MAX; } Trial::Trial(int n):xvals(n) { objval=DBL_MAX; } Trial::Trial(RCTrial tr):xvals(tr.xvals) { objval=tr.objval ; } RCTrial Trial::operator=(RCTrial tr) { xvals=tr.xvals ; objval=tr.objval ; return *this ; } ostream & operator << (ostream & os, const Trial & T) { os << T.xvals << " " << "(" << T.objval << ")" << endl ; return os; } /********************* Vanilla Box **********************/ VBox::VBox():lb(0),ub(0) {} // Constructor VBox::VBox(int n):lb(n),ub(n) {} // Constructor VBox::VBox(RCVBox box):lb(box.lb), ub(box.ub) {} // Constructor RCVBox VBox::operator=(RCVBox box) { // Copy: Box1=Box2 lb=box.lb; ub=box.ub; return *this; } int VBox::GetDim() { return lb.GetLength(); } double VBox::Width(int i) { // Returns the width of the i-th interval, i between [0,...,dim-1] return ub(i)-lb(i); } void VBox::Midpoint(RCRVector x) { // Returns the midpoint of Box in x int n=GetDim(); for (int i=0 ; i::const_iterator TBox::FirstTrial() { return TList.begin(); } list::const_iterator TBox::LastTrial() { return TList.end(); } void TBox::GetTrial(list::const_iterator itr, Trial &T) { T.xvals=(*itr).xvals; T.objval=(*itr).objval; } void TBox::ClearBox() { TList.erase(TList.begin(), TList.end()); minf=DBL_MAX; } bool TBox::CloseToMin(RVector &vec, double *objval, double eps_cl) { // Returns true if 'vec' is close to some of the trials in the box, // in this case, 'vec' and 'objval' are overwritten by the Trial data // otherwise 'vec' and 'objval' are not affected. // // Here "close" means norm2(T - some trial in box)<=eps_cl // // NB It might be better to accept Trial as argument instead of vector int n=GetDim(); RVector x(n), y(n); list::const_iterator itr; for ( itr = TList.begin(); itr != TList.end(); ++itr ) { y=vec ; // NB Should be possible to avoid this copying x=(*itr).xvals; axpy(-1,x,y); if (norm2(y)<=eps_cl) { vec=x; *objval=(*itr).objval; return true; } } return false; } int TBox::NStationary() { // Returns the number of trials in a box return static_cast(TList.size()); } void TBox::split(RTBox B1, RTBox B2) { list::const_iterator itr; double w,m,tmp; double fm1=DBL_MAX, fm2=DBL_MAX; int i, k, ns; int n=GetDim(); B1.lb=lb; B1.ub=ub; B2.lb=lb; B2.ub=ub; w=LongestSide(&i); ns = static_cast(TList.size()); switch (ns) { case 0: case 1: // Bisection w=ub(i)-lb(i); // Length of interval m=lb(i)+w/2; // Midpoint B1.ub(i)=m; B2.lb(i)=m; break; default: // More elaborate split when there are more than one trials in B // See Serguies and Kaj's tech. report, page 11 // Compute the center point of all stationary points RVector center(n), x(n), dispers(n); center=0; dispers=0; for ( itr = TList.begin(); itr != TList.end(); ++itr ) axpy(1.0, (*itr).xvals, center); scal((1.0/ns),center); // Compute the relative deviations for ( itr = TList.begin(); itr != TList.end(); ++itr ) { for (k = 0; ktmp) { tmp=dispers(k);i=k; } } B1.ub(i)=center(i) ; B2.lb(i)=center(i); break; } // Split the set of trials accordingly for ( itr = TList.begin(); itr != TList.end(); ++itr ) { if ( B1.InsideBox((*itr).xvals) ) { fm1=min(fm1,(*itr).objval); B1.AddTrial(*itr); } else { B2.AddTrial(*itr); fm2=min(fm2,(*itr).objval); } } // Set minf of B1 and B2 B1.minf=fm1 ; B2.minf=fm2; } void TBox::dispTrials() { // Display information about box #ifdef KCC copy(TList.begin(), TList.end(), ostream_iterator(cout)); #else copy(TList.begin(), TList.end(), ostream_iterator(cout)); #endif } ostream & operator << (ostream & os, const TBox & B) { int n=(B.lb).GetLength() ; for (int i=0 ; itmp ) { tmp=ub(i)-lb(i); j=i; } *idx=j; return tmp; } double TBox::ClosestSide(RCRVector x) { // Returns the shortest distance from point X to the box B. // Warning: The output of this functon is nonsense if the // point X lies outside B. Should we try to detect this case? double dist, tmp ; int n=GetDim(); dist=DBL_MAX; for (int i=0 ; iub(j)) { isect=0; break; } } } copy(z,tmpV); axpy(-1.0,x,tmpV); // tmpV=z-x if (isect==1 && dot(tmpV,h)>0) { done=true; break; } } i++; } return done; } double TBox::LowerBound(double maxgrad) { // Lower bound estimation double lbound=minf; double f1,f2,est ; list::const_iterator itr1,itr2 ; int n=GetDim(); RVector x1(n), x2(n) ; #ifndef LB2 for ( itr1 = TList.begin(); itr1 != TList.end(); ++itr1 ) { itr2=itr1 ; while (++itr2 != TList.end()) { x1=(*itr1).xvals ; f1=(*itr1).objval ; x2=(*itr2).xvals ; f2=(*itr2).objval ; axpy(-1.0,x2,x1) ; // x1=x1-x2 est=0.5*(f1+f2-maxgrad*norm2(x1)) ; lbound=min(lbound,est) ; // cout << "est=" << est << " x1=" << x1 << " x2=" << x2 << endl ; } } #endif #ifdef LB2 for ( itr1 = TList.begin(); itr1 != TList.end(); ++itr1 ) { // Use also max distance to border x1=(*itr1).xvals; f1=(*itr1).objval; est=f1-FarthestSide(x1)*maxgrad; lb=min(lb,est); } #endif return lbound; } stevengj-nlopt-88c424d/src/algs/stogo/tools.h000066400000000000000000000054571521061417600212320ustar00rootroot00000000000000 // Various datastructures and functions used by the global optimizer #ifndef TOOLS_H #define TOOLS_H #include #include #include #include #include #include "linalg.h" typedef const class Trial CTrial; typedef CTrial& RCTrial; typedef CTrial* PCTrial; class Trial{ public: RVector xvals; double objval; Trial(); Trial(int); Trial(RCTrial); // Copy constructor RCTrial operator=(RCTrial) ; // assignment operator friend ostream & operator << (ostream &, RCTrial) ; }; class TrialGT // Predicate for Trial (needed for remove_if) { public: explicit TrialGT(double val) : _val(val) {} bool operator()(Trial& foo) { return foo.objval > _val; } private: double _val; }; typedef class VBox& RVBox; typedef const class VBox CVBox; typedef CVBox* PCVBox; typedef CVBox& RCVBox; class VBox{ public: RVector lb, ub; VBox(); // Construct a box VBox(int); VBox(RCVBox); // Copy constructor RCVBox operator=(RCVBox); // assignment operator int GetDim(); // Returns the dimension of the box double Width(int) ; // Returns the width of the i-th interval void Midpoint(RCRVector); // Returns the midpoint friend ostream & operator << (ostream &, const VBox &); }; typedef class TBox& RTBox; typedef const class TBox CTBox; typedef CTBox* PCTBox; typedef CTBox& RCTBox; class TBox: public VBox { public: double minf; // Smallest function value found so far list TList; // List of trials TBox(); // Construct a box TBox(int); TBox(RCTBox); // Copy constructor RCTBox operator=(RCTBox); // assignment operator double GetMin(); // Returns 'minf' bool EmptyBox(); // Returns TRUE if Box contains no trials void AddTrial(RCTrial); // Add a trial to the (back of) box void RemoveTrial(Trial &); // Remove a trial from the (back of) box void GetLastTrial(Trial &); // Return a trial from the back of the box list::const_iterator FirstTrial(); list::const_iterator LastTrial(); void GetTrial(list::const_iterator, Trial&); void ClearBox(); bool CloseToMin(RVector&, double*, double); int NStationary(); // Returns the number of stationary points void split(RTBox, RTBox); // Split a box void dispTrials(); bool InsideBox(RCRVector); int OutsideBox(RCRVector, RCTBox); double ShortestSide(int*); // Returns the shortest side double LongestSide(int*); // Returns the longest side double ClosestSide(RCRVector x); double FarthestSide(RCRVector x); bool Intersection(RCRVector, RCRVector, RCRVector); double LowerBound(double); bool operator<(const TBox & x) const {return (minf>x.minf);} friend ostream & operator << (ostream &, const TBox &); }; #endif stevengj-nlopt-88c424d/src/algs/stogo/tst.cc000066400000000000000000000025451521061417600210350ustar00rootroot00000000000000#include #include "global.h" #include "tools.h" #include "linalg.h" #include "tools.h" #include "stogo_config.h" void Domain_Mine(RTBox box) { box.lb=-3.0 ; box.ub=3.0; } static int cnt = 0; double Objective_Mine(RCRVector xy) { double x = xy(0); double y = xy(1); double f = ((x*x)*(4-2.1*(x*x)+((x*x)*(x*x))/3) + x*y + (y*y)*(-4+4*(y*y))); printf("feval:, %d, %g, %g, %g\n", ++cnt, x,y, f); return f; } void Gradient_Mine(RCRVector xy, RVector &grad) { double x = xy(0); double y = xy(1); grad(0) = /* df/dx */ ((2*x)*(4-2.1*(x*x)+((x*x)*(x*x))/3) + (x*x)*(-4.2*x+4*(x*(x*x))/3) + y); grad(1) = /* df/dy */ (x + (2*y)*(-4+4*(y*y)) + (y*y)*(8*(y))); } int main(int argc, char **argv) { int dim=2; Pdom Dom=Domain_Mine; Pobj Obj=Objective_Mine; Pgrad Grad=Gradient_Mine; GlobalParams params; params.det_pnts=2*dim+1; params.rnd_pnts=0; params.eps_cl=0.1; params.rshift=0.3; params.mu=1.0E-4; params.maxtime=0; params.maxeval = argc < 2 ? 100 : atoi(argv[1]); TBox D(dim); Dom(D); Global Problem(D,Obj, Grad, params); RVector dummyvec(dim); Problem.Search(-1, dummyvec); cout << "Minimizers found\n"; Problem.DispMinimizers(); cout << "dummyvec: " << dummyvec << "\n"; double val = Problem.OneMinimizer(dummyvec); cout << "one minimizer: " << val << ": " << dummyvec << "\n"; } stevengj-nlopt-88c424d/src/algs/stogo/tstc.c000066400000000000000000000020441521061417600210270ustar00rootroot00000000000000#include #include #include "stogo.h" /* has two global minima at (0.09,-0.71) and (-0.09,0.71), plus 4 additional local minima */ static int cnt=0; double tst_obj(int n, const double *xy, double *g, void *unused) { double x, y, f; x = xy[0]; y = xy[1]; f = ((x*x)*(4-2.1*(x*x)+((x*x)*(x*x))/3) + x*y + (y*y)*(-4+4*(y*y))); printf("feval:, %d, %g, %g, %g\n", ++cnt, x,y, f); if (g) { g[0] = /* df/dx */ ((2*x)*(4-2.1*(x*x)+((x*x)*(x*x))/3) + (x*x)*(-4.2*x+4*(x*(x*x))/3) + y); g[1] = /* df/dy */ (x + (2*y)*(-4+4*(y*y)) + (y*y)*(8*(y))); } return f; } int main(int argc, char **argv) { int n = 2; double x[2], l[2], u[2]; long int maxits = 0, maxtim = 0; int info; double minf; maxits = argc < 2 ? 100 : atoi(argv[1]); l[0] = -3; l[1] = -3; u[0] = 3; u[1] = 3; info = stogo_minimize(n, tst_obj, NULL, x, &minf, l, u, maxits, maxtim); printf("min f = %g at (%g,%g) after %d evals, return value %d\n", minf, x[0], x[1], cnt, info); return EXIT_SUCCESS; } stevengj-nlopt-88c424d/src/algs/subplex/000077500000000000000000000000001521061417600202355ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/algs/subplex/README000066400000000000000000000024751521061417600211250ustar00rootroot00000000000000"Subplex" gradient-free minimization code, based on a variant of Nelder-Mead simplex by Tom Rowan. http://www.netlib.org/opt/subplex.tgz T. Rowan, "Functional Stability Analysis of Numerical Algorithms", Ph.D. thesis, Department of Computer Sciences, University of Texas at Austin, 1990. This code was downloaded from Netlib.org, converted via f2c, and then cleaned up a bit by Steven G. Johnson (stevenj@alum.mit.edu) for use with libctl. Unfortunately, neither Netlib nor the Subplex source code contain any explicit indication of the copyright/license status of the code, and I was unable to contact the author. However, it is listed as "public domain" by the Starlink astronomical software review (http://star-www.rl.ac.uk/star/docs/sun194.htx/node151.html). The original README file describes the algorithm as: Subplex is a subspace-searching simplex method for the unconstrained optimization of general multivariate functions. Like the Nelder-Mead simplex method it generalizes, the subplex method is well suited for optimizing noisy objective functions. The number of function evaluations required for convergence typically increases only linearly with the problem size, so for most applications the subplex method is much more efficient than the simplex method. stevengj-nlopt-88c424d/src/algs/subplex/subplex.c000066400000000000000000001466411521061417600220770ustar00rootroot00000000000000/* Downloaded from http://www.netlib.org/opt/subplex.tgz README file for SUBPLEX NAME subplex - subspace-searching simplex method for unconstrained optimization DESCRIPTION Subplex is a subspace-searching simplex method for the unconstrained optimization of general multivariate functions. Like the Nelder-Mead simplex method it generalizes, the subplex method is well suited for optimizing noisy objective functions. The number of function evaluations required for convergence typically increases only linearly with the problem size, so for most applications the subplex method is much more efficient than the simplex method. INSTALLATION To build subplex on UNIX systems, edit the Makefile as necessary and type: make This will create a linkable library named subplex.a and a demonstration executable named demo. EXAMPLE To run subplex on a simple objective function type: demo < demo.in To run subplex on other problems, edit a copy of the sample driver demo.f as necessary. AUTHOR Tom Rowan Oak Ridge National Laboratory Mathematical Sciences Section P.O. Box 2008, Bldg. 6012 Oak Ridge, TN 37831-6367 Phone: (423) 574-3131 Fax : (423) 574-0680 Email: na.rowan@na-net.ornl.gov REFERENCE T. Rowan, "Functional Stability Analysis of Numerical Algorithms", Ph.D. thesis, Department of Computer Sciences, University of Texas at Austin, 1990. COMMENTS Please send comments, suggestions, or bug reports to na.rowan@na-net.ornl.gov. */ #include #include #include #include #include "subplex.h" typedef double doublereal; typedef int logical; typedef int integer; #define TRUE_ 1 #define FALSE_ 0 typedef subplex_func D_fp; #define MAX2(a,b) ((a) > (b) ? (a) : (b)) #define MIN2(a,b) ((a) < (b) ? (a) : (b)) /****************************************************************************/ /****************************************************************************/ /* dasum.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static doublereal dasum_(integer *n, doublereal *dx, integer *incx) { /* System generated locals */ integer i__1; doublereal ret_val, d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ integer i__, m; doublereal dtemp; integer ix, mp1; /* takes the sum of the absolute values. */ /* uses unrolled loops for increment equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified to correct problem with negative increment, 8/21/90. */ /* Parameter adjustments */ --dx; /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += (d__1 = dx[ix], fabs(d__1)); ix += *incx; /* L10: */ } ret_val = dtemp; return ret_val; /* code for increment equal to 1 */ /* clean-up loop */ L20: m = *n % 6; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += (d__1 = dx[i__], fabs(d__1)); /* L30: */ } if (*n < 6) { goto L60; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 6) { dtemp = dtemp + (d__1 = dx[i__], fabs(d__1)) + (d__2 = dx[i__ + 1], fabs(d__2)) + (d__3 = dx[i__ + 2], fabs(d__3)) + (d__4 = dx[i__ + 3], fabs(d__4)) + (d__5 = dx[i__ + 4], fabs(d__5)) + (d__6 = dx[i__ + 5], fabs(d__6)); /* L50: */ } L60: ret_val = dtemp; return ret_val; } /* dasum_ */ /* daxpy.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* constant times a vector plus a vector. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*da == 0.) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] += *da * dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 4; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] += *da * dx[i__]; /* L30: */ } if (*n < 4) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 4) { dy[i__] += *da * dx[i__]; dy[i__ + 1] += *da * dx[i__ + 1]; dy[i__ + 2] += *da * dx[i__ + 2]; dy[i__ + 3] += *da * dx[i__ + 3]; /* L50: */ } return 0; } /* daxpy_ */ /* dcopy.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int dcopy_(integer *n, const doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* copies a vector, x, to a vector, y. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] = dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 7; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] = dx[i__]; /* L30: */ } if (*n < 7) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 7) { dy[i__] = dx[i__]; dy[i__ + 1] = dx[i__ + 1]; dy[i__ + 2] = dx[i__ + 2]; dy[i__ + 3] = dx[i__ + 3]; dy[i__ + 4] = dx[i__ + 4]; dy[i__ + 5] = dx[i__ + 5]; dy[i__ + 6] = dx[i__ + 6]; /* L50: */ } return 0; } /* dcopy_ */ /* dscal.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, mp1; /* scales a vector by a constant. */ /* uses unrolled loops for increment equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified to correct problem with negative increment, 8/21/90. */ /* Parameter adjustments */ --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dx[ix] = *da * dx[ix]; ix += *incx; /* L10: */ } return 0; /* code for increment equal to 1 */ /* clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dx[i__] = *da * dx[i__]; /* L30: */ } if (*n < 5) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 5) { dx[i__] = *da * dx[i__]; dx[i__ + 1] = *da * dx[i__ + 1]; dx[i__ + 2] = *da * dx[i__ + 2]; dx[i__ + 3] = *da * dx[i__ + 3]; dx[i__ + 4] = *da * dx[i__ + 4]; /* L50: */ } return 0; } /* dscal_ */ /* dist.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static doublereal dist_(integer *n, doublereal *x, doublereal *y) { /* System generated locals */ integer i__1; doublereal ret_val, d__1; /* Local variables */ integer i__; doublereal scale, absxmy, sum; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* dist calculates the distance between the points x,y. */ /* input */ /* n - number of components */ /* x - point in n-space */ /* y - point in n-space */ /* local variables */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --y; --x; /* Function Body */ absxmy = (d__1 = x[1] - y[1], fabs(d__1)); if (absxmy <= 1.) { sum = absxmy * absxmy; scale = 1.; } else { sum = 1.; scale = absxmy; } i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { absxmy = (d__1 = x[i__] - y[i__], fabs(d__1)); if (absxmy <= scale) { /* Computing 2nd power */ d__1 = absxmy / scale; sum += d__1 * d__1; } else { /* Computing 2nd power */ d__1 = scale / absxmy; sum = sum * (d__1 * d__1) + 1.; scale = absxmy; } /* L10: */ } ret_val = scale * sqrt(sum); return ret_val; } /* dist_ */ /* calcc.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Table of constant values */ static doublereal c_b3 = 0.; static integer c__0 = 0; static integer c__1 = 1; static doublereal c_b7 = 1.; static int calcc_(integer *ns, doublereal *s, integer *ih, integer * inew, logical *updatc, doublereal *c__) { /* System generated locals */ integer s_dim1, s_offset, i__1; doublereal d__1; /* Local variables */ integer i__, j; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* calcc calculates the centroid of the simplex without the */ /* vertex with highest function value. */ /* input */ /* ns - subspace dimension */ /* s - double precision work space of dimension .ge. */ /* ns*(ns+3) used to store simplex */ /* ih - index to vertex with highest function value */ /* inew - index to new point */ /* updatc - logical switch */ /* = .true. : update centroid */ /* = .false. : calculate centroid from scratch */ /* c - centroid of the simplex without vertex with */ /* highest function value */ /* output */ /* c - new centroid */ /* local variables */ /* subroutines and functions */ /* blas */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --c__; s_dim1 = *ns; s_offset = 1 + s_dim1 * 1; s -= s_offset; /* Function Body */ if (*updatc) { if (*ih == *inew) { return 0; } i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { c__[i__] += (s[i__ + *inew * s_dim1] - s[i__ + *ih * s_dim1]) / * ns; /* L10: */ } } else { dcopy_(ns, &c_b3, &c__0, &c__[1], &c__1); i__1 = *ns + 1; for (j = 1; j <= i__1; ++j) { if (j != *ih) { daxpy_(ns, &c_b7, &s[j * s_dim1 + 1], &c__1, &c__[1], &c__1); } /* L20: */ } d__1 = 1. / *ns; dscal_(ns, &d__1, &c__[1], &c__1); } return 0; } /* calcc_ */ /* order.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int order_(integer *npts, doublereal *fs, integer *il, integer *is, integer *ih) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, j, il0; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* order determines the indices of the vertices with the */ /* lowest, second highest, and highest function values. */ /* input */ /* npts - number of points in simplex */ /* fs - double precision vector of function values of */ /* simplex */ /* il - index to vertex with lowest function value */ /* output */ /* il - new index to vertex with lowest function value */ /* is - new index to vertex with second highest */ /* function value */ /* ih - new index to vertex with highest function value */ /* local variables */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --fs; /* Function Body */ il0 = *il; j = il0 % *npts + 1; if (fs[j] >= fs[*il]) { *ih = j; *is = il0; } else { *ih = il0; *is = j; *il = j; } i__1 = il0 + *npts - 2; for (i__ = il0 + 1; i__ <= i__1; ++i__) { j = i__ % *npts + 1; if (fs[j] >= fs[*ih]) { *is = *ih; *ih = j; } else if (fs[j] > fs[*is]) { *is = j; } else if (fs[j] < fs[*il]) { *il = j; } /* L10: */ } return 0; } /* order_ */ /* partx.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Common Block Declarations */ static struct { doublereal alpha, beta, gamma, delta, psi, omega; integer nsmin, nsmax, irepl, ifxsw; doublereal bonus, fstop; integer nfstop, nfxe; doublereal fxstat[4], ftest; logical minf, initx, newx; } usubc_; #define usubc_1 usubc_ static int partx_(integer *n, integer *ip, doublereal *absdx, integer *nsubs, integer *nsvals) { /* System generated locals */ integer i__1; /* Local variables */ static integer i__, nleft, nused; static doublereal as1max, gapmax, asleft, as1, as2; static integer ns1, ns2; static doublereal gap; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* partx partitions the vector x by grouping components of */ /* similar magnitude of change. */ /* input */ /* n - number of components (problem dimension) */ /* ip - permutation vector */ /* absdx - vector of magnitude of change in x */ /* nsvals - integer array dimensioned .ge. int(n/nsmin) */ /* output */ /* nsubs - number of subspaces */ /* nsvals - integer array of subspace dimensions */ /* common */ /* local variables */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --absdx; --ip; --nsvals; /* Function Body */ *nsubs = 0; nused = 0; nleft = *n; asleft = absdx[1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { asleft += absdx[i__]; /* L10: */ } L20: if (nused < *n) { ++(*nsubs); as1 = 0.; i__1 = usubc_1.nsmin - 1; for (i__ = 1; i__ <= i__1; ++i__) { as1 += absdx[ip[nused + i__]]; /* L30: */ } gapmax = -1.; i__1 = MIN2(usubc_1.nsmax,nleft); for (ns1 = usubc_1.nsmin; ns1 <= i__1; ++ns1) { as1 += absdx[ip[nused + ns1]]; ns2 = nleft - ns1; if (ns2 > 0) { if (ns2 >= ((ns2 - 1) / usubc_1.nsmax + 1) * usubc_1.nsmin) { as2 = asleft - as1; gap = as1 / ns1 - as2 / ns2; if (gap > gapmax) { gapmax = gap; nsvals[*nsubs] = ns1; as1max = as1; } } } else { if (as1 / ns1 > gapmax) { nsvals[*nsubs] = ns1; return 0; } } /* L40: */ } nused += nsvals[*nsubs]; nleft = *n - nused; asleft -= as1max; goto L20; } return 0; } /* partx_ */ /* sortd.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int sortd_(integer *n, doublereal *xkey, integer *ix) { /* System generated locals */ integer i__1; /* Local variables */ integer ixip1, i__, ilast, iswap, ifirst, ixi; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* sortd uses the shakersort method to sort an array of keys */ /* in decreasing order. The sort is performed implicitly by */ /* modifying a vector of indices. */ /* For nearly sorted arrays, sortd requires O(n) comparisons. */ /* for completely unsorted arrays, sortd requires O(n**2) */ /* comparisons and will be inefficient unless n is small. */ /* input */ /* n - number of components */ /* xkey - double precision vector of keys */ /* ix - integer vector of indices */ /* output */ /* ix - indices satisfy xkey(ix(i)) .ge. xkey(ix(i+1)) */ /* for i = 1,...,n-1 */ /* local variables */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --ix; --xkey; /* Function Body */ ifirst = 1; iswap = 1; ilast = *n - 1; L10: if (ifirst <= ilast) { i__1 = ilast; for (i__ = ifirst; i__ <= i__1; ++i__) { ixi = ix[i__]; ixip1 = ix[i__ + 1]; if (xkey[ixi] < xkey[ixip1]) { ix[i__] = ixip1; ix[i__ + 1] = ixi; iswap = i__; } /* L20: */ } ilast = iswap - 1; i__1 = ifirst; for (i__ = ilast; i__ >= i__1; --i__) { ixi = ix[i__]; ixip1 = ix[i__ + 1]; if (xkey[ixi] < xkey[ixip1]) { ix[i__] = ixip1; ix[i__ + 1] = ixi; iswap = i__; } /* L30: */ } ifirst = iswap + 1; goto L10; } return 0; } /* sortd_ */ /* newpt.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int newpt_(integer *ns, doublereal *coef, doublereal *xbase, doublereal *xold, logical *new__, doublereal *xnew, logical *small) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; logical eqold; doublereal xoldi; logical eqbase; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* newpt performs reflections, expansions, contractions, and */ /* shrinkages (massive contractions) by computing: */ /* xbase + coef * (xbase - xold) */ /* The result is stored in xnew if new .eq. .true., */ /* in xold otherwise. */ /* use : coef .gt. 0 to reflect */ /* coef .lt. 0 to expand, contract, or shrink */ /* input */ /* ns - number of components (subspace dimension) */ /* coef - one of four simplex method coefficients */ /* xbase - double precision ns-vector representing base */ /* point */ /* xold - double precision ns-vector representing old */ /* point */ /* new - logical switch */ /* = .true. : store result in xnew */ /* = .false. : store result in xold, xnew is not */ /* referenced */ /* output */ /* xold - unchanged if new .eq. .true., contains new */ /* point otherwise */ /* xnew - double precision ns-vector representing new */ /* point if new .eq. .true., not referenced */ /* otherwise */ /* small - logical flag */ /* = .true. : coincident points */ /* = .false. : otherwise */ /* local variables */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --xold; --xbase; --xnew; /* Function Body */ eqbase = TRUE_; eqold = TRUE_; if (*new__) { i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { xnew[i__] = xbase[i__] + *coef * (xbase[i__] - xold[i__]); eqbase = eqbase && xnew[i__] == xbase[i__]; eqold = eqold && xnew[i__] == xold[i__]; /* L10: */ } } else { i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { xoldi = xold[i__]; xold[i__] = xbase[i__] + *coef * (xbase[i__] - xold[i__]); eqbase = eqbase && xold[i__] == xbase[i__]; eqold = eqold && xold[i__] == xoldi; /* L20: */ } } *small = eqbase || eqold; return 0; } /* newpt_ */ /* start.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int start_(integer *n, doublereal *x, doublereal *step, integer *ns, integer *ips, doublereal *s, logical *small) { /* System generated locals */ integer s_dim1, s_offset, i__1; /* Local variables */ integer i__, j; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* start creates the initial simplex for simplx minimization. */ /* input */ /* n - problem dimension */ /* x - current best point */ /* step - stepsizes for corresponding components of x */ /* ns - subspace dimension */ /* ips - permutation vector */ /* output */ /* s - first ns+1 columns contain initial simplex */ /* small - logical flag */ /* = .true. : coincident points */ /* = .false. : otherwise */ /* local variables */ /* subroutines and functions */ /* blas */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --ips; --step; --x; s_dim1 = *ns; s_offset = 1 + s_dim1 * 1; s -= s_offset; /* Function Body */ i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { s[i__ + s_dim1] = x[ips[i__]]; /* L10: */ } i__1 = *ns + 1; for (j = 2; j <= i__1; ++j) { dcopy_(ns, &s[s_dim1 + 1], &c__1, &s[j * s_dim1 + 1], &c__1); s[j - 1 + j * s_dim1] = s[j - 1 + s_dim1] + step[ips[j - 1]]; /* L20: */ } /* check for coincident points */ i__1 = *ns + 1; for (j = 2; j <= i__1; ++j) { if (s[j - 1 + j * s_dim1] == s[j - 1 + s_dim1]) { goto L40; } /* L30: */ } *small = FALSE_; return 0; /* coincident points */ L40: *small = TRUE_; return 0; } /* start_ */ /* fstats.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int fstats_(doublereal *fx, integer *ifxwt, logical *reset) { /* System generated locals */ doublereal d__1, d__2, d__3; /* Local variables */ static doublereal fscale; static integer nsv; static doublereal f1sv; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* fstats modifies the common /usubc/ variables nfxe,fxstat. */ /* input */ /* fx - most recent evaluation of f at best x */ /* ifxwt - integer weight for fx */ /* reset - logical switch */ /* = .true. : initialize nfxe,fxstat */ /* = .false. : update nfxe,fxstat */ /* common */ /* local variables */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ if (*reset) { usubc_1.nfxe = *ifxwt; usubc_1.fxstat[0] = *fx; usubc_1.fxstat[1] = *fx; usubc_1.fxstat[2] = *fx; usubc_1.fxstat[3] = 0.; } else { nsv = usubc_1.nfxe; f1sv = usubc_1.fxstat[0]; usubc_1.nfxe += *ifxwt; usubc_1.fxstat[0] += *ifxwt * (*fx - usubc_1.fxstat[0]) / usubc_1.nfxe; usubc_1.fxstat[1] = MAX2(usubc_1.fxstat[1],*fx); usubc_1.fxstat[2] = MIN2(usubc_1.fxstat[2],*fx); /* Computing MAX */ d__1 = fabs(usubc_1.fxstat[1]), d__2 = fabs(usubc_1.fxstat[2]), d__1 = MAX2(d__1,d__2); fscale = MAX2(d__1,1.); /* Computing 2nd power */ d__1 = usubc_1.fxstat[3] / fscale; /* Computing 2nd power */ d__2 = (usubc_1.fxstat[0] - f1sv) / fscale; /* Computing 2nd power */ d__3 = (*fx - usubc_1.fxstat[0]) / fscale; usubc_1.fxstat[3] = fscale * sqrt(((nsv - 1) * (d__1 * d__1) + nsv * ( d__2 * d__2) + *ifxwt * (d__3 * d__3)) / (usubc_1.nfxe - 1)); } return 0; } /* fstats_ */ /* evalf.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ /* Common Block Declarations */ static struct { doublereal fbonus, sfstop, sfbest; logical new__; } isubc_; #define isubc_1 isubc_ static logical c_true = TRUE_; static logical c_false = FALSE_; static int evalf_(D_fp f,void*fdata, integer *ns, integer *ips, doublereal *xs, integer *n, doublereal *x, doublereal *sfx, integer *nfe) { /* System generated locals */ integer i__1; /* Local variables */ static integer i__; static doublereal fx; static logical newbst; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* evalf evaluates the function f at a point defined by x */ /* with ns of its components replaced by those in xs. */ /* input */ /* f - user supplied function f(n,x) to be optimized */ /* ns - subspace dimension */ /* ips - permutation vector */ /* xs - double precision ns-vector to be mapped to x */ /* n - problem dimension */ /* x - double precision n-vector */ /* nfe - number of function evaluations */ /* output */ /* sfx - signed value of f evaluated at x */ /* nfe - incremented number of function evaluations */ /* common */ /* local variables */ /* subroutines and functions */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --ips; --xs; --x; /* Function Body */ i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { x[ips[i__]] = xs[i__]; /* L10: */ } usubc_1.newx = isubc_1.new__ || usubc_1.irepl != 2; fx = (*f)(*n, &x[1], fdata); if (usubc_1.irepl == 0) { if (usubc_1.minf) { *sfx = fx; } else { *sfx = -fx; } } else if (isubc_1.new__) { if (usubc_1.minf) { *sfx = fx; newbst = fx < usubc_1.ftest; } else { *sfx = -fx; newbst = fx > usubc_1.ftest; } if (usubc_1.initx || newbst) { if (usubc_1.irepl == 1) { fstats_(&fx, &c__1, &c_true); } usubc_1.ftest = fx; isubc_1.sfbest = *sfx; } } else { if (usubc_1.irepl == 1) { fstats_(&fx, &c__1, &c_false); fx = usubc_1.fxstat[usubc_1.ifxsw - 1]; } usubc_1.ftest = fx + isubc_1.fbonus * usubc_1.fxstat[3]; if (usubc_1.minf) { *sfx = usubc_1.ftest; isubc_1.sfbest = fx; } else { *sfx = -usubc_1.ftest; isubc_1.sfbest = -fx; } } ++(*nfe); return 0; } /* evalf_ */ /* simplx.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int simplx_(D_fp f, void *fdata, integer *n, doublereal *step, integer * ns, integer *ips, nlopt_stopping *stop, logical *cmode, doublereal *x, doublereal *fx, integer *nfe, doublereal *s, doublereal *fs, integer * iflag) { /* System generated locals */ integer s_dim1, s_offset, i__1; doublereal d__1, d__2; /* Local variables */ static integer inew; static integer npts; static integer i__, j; static integer icent; static logical small; static integer itemp; static doublereal fc, fe; static integer ih, il; static doublereal fr; static integer is; static logical updatc; static doublereal dum, tol; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* simplx uses the Nelder-Mead simplex method to minimize the */ /* function f on a subspace. */ /* input */ /* f - function to be minimized, declared external in */ /* calling routine */ /* n - problem dimension */ /* step - stepsizes for corresponding components of x */ /* ns - subspace dimension */ /* ips - permutation vector */ /* maxnfe - maximum number of function evaluations */ /* cmode - logical switch */ /* = .true. : continuation of previous call */ /* = .false. : first call */ /* x - starting guess for minimum */ /* fx - value of f at x */ /* nfe - number of function evaluations */ /* s - double precision work array of dimension .ge. */ /* ns*(ns+3) used to store simplex */ /* fs - double precision work array of dimension .ge. */ /* ns+1 used to store function values of simplex */ /* vertices */ /* output */ /* x - computed minimum */ /* fx - value of f at x */ /* nfe - incremented number of function evaluations */ /* iflag - error flag */ /* = -1 : maxnfe exceeded */ /* = 0 : simplex reduced by factor of psi */ /* = 1 : limit of machine precision */ /* = 2 : reached fstop */ /* common */ /* local variables */ /* subroutines and functions */ /* blas */ /* fortran */ /* ----------------------------------------------------------- */ /* Parameter adjustments */ --x; --step; --fs; s_dim1 = *ns; s_offset = 1 + s_dim1 * 1; s -= s_offset; --ips; /* Function Body */ if (*cmode) { goto L50; } npts = *ns + 1; icent = *ns + 2; itemp = *ns + 3; updatc = FALSE_; start_(n, &x[1], &step[1], ns, &ips[1], &s[s_offset], &small); if (small) { *iflag = 1; return 0; } if (usubc_1.irepl > 0) { isubc_1.new__ = FALSE_; evalf_((D_fp)f,fdata, ns, &ips[1], &s[s_dim1 + 1], n, &x[1], &fs[1], nfe); *(stop->nevals_p)++; } else { fs[1] = *fx; } isubc_1.new__ = TRUE_; i__1 = npts; for (j = 2; j <= i__1; ++j) { evalf_((D_fp)f, fdata,ns, &ips[1], &s[j * s_dim1 + 1], n, &x[1], &fs[j], nfe); *(stop->nevals_p)++; /* L10: */ } il = 1; order_(&npts, &fs[1], &il, &is, &ih); tol = usubc_1.psi * dist_(ns, &s[ih * s_dim1 + 1], &s[il * s_dim1 + 1]); /* main loop */ L20: calcc_(ns, &s[s_offset], &ih, &inew, &updatc, &s[icent * s_dim1 + 1]); updatc = TRUE_; inew = ih; /* reflect */ newpt_(ns, &usubc_1.alpha, &s[icent * s_dim1 + 1], &s[ih * s_dim1 + 1], & c_true, &s[itemp * s_dim1 + 1], &small); if (small) { goto L40; } evalf_((D_fp)f,fdata, ns, &ips[1], &s[itemp * s_dim1 + 1], n, &x[1], &fr, nfe); *(stop->nevals_p)++; if (fr < fs[il]) { /* expand */ d__1 = -usubc_1.gamma; newpt_(ns, &d__1, &s[icent * s_dim1 + 1], &s[itemp * s_dim1 + 1], & c_true, &s[ih * s_dim1 + 1], &small); if (small) { goto L40; } evalf_((D_fp)f,fdata, ns, &ips[1], &s[ih * s_dim1 + 1], n, &x[1], &fe, nfe); *(stop->nevals_p)++; if (fe < fr) { fs[ih] = fe; } else { dcopy_(ns, &s[itemp * s_dim1 + 1], &c__1, &s[ih * s_dim1 + 1], & c__1); fs[ih] = fr; } } else if (fr < fs[is]) { /* accept reflected point */ dcopy_(ns, &s[itemp * s_dim1 + 1], &c__1, &s[ih * s_dim1 + 1], &c__1); fs[ih] = fr; } else { /* contract */ if (fr > fs[ih]) { d__1 = -usubc_1.beta; newpt_(ns, &d__1, &s[icent * s_dim1 + 1], &s[ih * s_dim1 + 1], & c_true, &s[itemp * s_dim1 + 1], &small); } else { d__1 = -usubc_1.beta; newpt_(ns, &d__1, &s[icent * s_dim1 + 1], &s[itemp * s_dim1 + 1], &c_false, &dum, &small); } if (small) { goto L40; } evalf_((D_fp)f,fdata, ns, &ips[1], &s[itemp * s_dim1 + 1], n, &x[1], &fc, nfe); *(stop->nevals_p)++; /* Computing MIN */ d__1 = fr, d__2 = fs[ih]; if (fc < MIN2(d__1,d__2)) { dcopy_(ns, &s[itemp * s_dim1 + 1], &c__1, &s[ih * s_dim1 + 1], & c__1); fs[ih] = fc; } else { /* shrink simplex */ i__1 = npts; for (j = 1; j <= i__1; ++j) { if (j != il) { d__1 = -usubc_1.delta; newpt_(ns, &d__1, &s[il * s_dim1 + 1], &s[j * s_dim1 + 1], &c_false, &dum, &small); if (small) { goto L40; } evalf_((D_fp)f,fdata, ns, &ips[1], &s[j * s_dim1 + 1], n, &x[1], &fs[j], nfe); *(stop->nevals_p)++; } /* L30: */ } } updatc = FALSE_; } order_(&npts, &fs[1], &il, &is, &ih); /* check termination */ L40: if (usubc_1.irepl == 0) { *fx = fs[il]; } else { *fx = isubc_1.sfbest; } L50: if (nlopt_stop_forced(stop)) *iflag = -20; else if (*fx < stop->minf_max) *iflag = 2; else if (nlopt_stop_evals(stop)) *iflag = -1; else if (nlopt_stop_time(stop)) *iflag = -10; else if (dist_(ns, &s[ih * s_dim1 + 1], &s[il * s_dim1 + 1]) <= tol || small) *iflag = 0; else goto L20; /* end main loop, return best point */ i__1 = *ns; for (i__ = 1; i__ <= i__1; ++i__) { x[ips[i__]] = s[i__ + il * s_dim1]; /* L60: */ } return 0; } /* simplx_ */ /* subopt.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int subopt_(integer *n) { /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* subopt sets options for subplx. */ /* input */ /* n - problem dimension */ /* common */ /* subroutines and functions */ /* fortran */ /* ----------------------------------------------------------- */ /* *********************************************************** */ /* simplex method strategy parameters */ /* *********************************************************** */ /* alpha - reflection coefficient */ /* alpha .gt. 0 */ usubc_1.alpha = 1.; /* beta - contraction coefficient */ /* 0 .lt. beta .lt. 1 */ usubc_1.beta = .5; /* gamma - expansion coefficient */ /* gamma .gt. 1 */ usubc_1.gamma = 2.; /* delta - shrinkage (massive contraction) coefficient */ /* 0 .lt. delta .lt. 1 */ usubc_1.delta = .5; /* *********************************************************** */ /* subplex method strategy parameters */ /* *********************************************************** */ /* psi - simplex reduction coefficient */ /* 0 .lt. psi .lt. 1 */ usubc_1.psi = .25; /* omega - step reduction coefficient */ /* 0 .lt. omega .lt. 1 */ usubc_1.omega = .1; /* nsmin and nsmax specify a range of subspace dimensions. */ /* In addition to satisfying 1 .le. nsmin .le. nsmax .le. n, */ /* nsmin and nsmax must be chosen so that n can be expressed */ /* as a sum of positive integers where each of these integers */ /* ns(i) satisfies nsmin .le. ns(i) .ge. nsmax. */ /* Specifically, */ /* nsmin*ceil(n/nsmax) .le. n must be true. */ /* nsmin - subspace dimension minimum */ usubc_1.nsmin = MIN2(2,*n); /* nsmax - subspace dimension maximum */ usubc_1.nsmax = MIN2(5,*n); /* *********************************************************** */ /* subplex method special cases */ /* *********************************************************** */ /* nelder-mead simplex method with periodic restarts */ /* nsmin = nsmax = n */ /* *********************************************************** */ /* nelder-mead simplex method */ /* nsmin = nsmax = n, psi = small positive */ /* *********************************************************** */ /* irepl, ifxsw, and bonus deal with measurement replication. */ /* Objective functions subject to large amounts of noise can */ /* cause an optimization method to halt at a false optimum. */ /* An expensive solution to this problem is to evaluate f */ /* several times at each point and return the average (or max */ /* or min) of these trials as the function value. subplx */ /* performs measurement replication only at the current best */ /* point. The longer a point is retained as best, the more */ /* accurate its function value becomes. */ /* The common variable nfxe contains the number of function */ /* evaluations at the current best point. fxstat contains the */ /* mean, max, min, and standard deviation of these trials. */ /* irepl - measurement replication switch */ /* irepl = 0, 1, or 2 */ /* = 0 : no measurement replication */ /* = 1 : subplx performs measurement replication */ /* = 2 : user performs measurement replication */ /* (This is useful when optimizing on the mean, */ /* max, or min of trials is insufficient. Common */ /* variable initx is true for first function */ /* evaluation. newx is true for first trial at */ /* this point. The user uses subroutine fstats */ /* within his objective function to maintain */ /* fxstat. By monitoring newx, the user can tell */ /* whether to return the function evaluation */ /* (newx = .true.) or to use the new function */ /* evaluation to refine the function evaluation */ /* of the current best point (newx = .false.). */ /* The common variable ftest gives the function */ /* value that a new point must beat to be */ /* considered the new best point.) */ usubc_1.irepl = 0; /* ifxsw - measurement replication optimization switch */ /* ifxsw = 1, 2, or 3 */ /* = 1 : retain mean of trials as best function value */ /* = 2 : retain max */ /* = 3 : retain min */ usubc_1.ifxsw = 1; /* Since the current best point will also be the most */ /* accurately evaluated point whenever irepl .gt. 0, a bonus */ /* should be added to the function value of the best point */ /* so that the best point is not replaced by a new point */ /* that only appears better because of noise. */ /* subplx uses bonus to determine how many multiples of */ /* fxstat(4) should be added as a bonus to the function */ /* evaluation. (The bonus is adjusted automatically by */ /* subplx when ifxsw or minf is changed.) */ /* bonus - measurement replication bonus coefficient */ /* bonus .ge. 0 (normally, bonus = 0 or 1) */ /* = 0 : bonus not used */ /* = 1 : bonus used */ usubc_1.bonus = 1.; /* nfstop = 0 : f(x) is not tested against fstop */ /* = 1 : if f(x) has reached fstop, subplx returns */ /* iflag = 2 */ /* = 2 : (only valid when irepl .gt. 0) */ /* if f(x) has reached fstop and */ /* nfxe .gt. nfstop, subplx returns iflag = 2 */ usubc_1.nfstop = 0; /* fstop - f target value */ /* Its usage is determined by the value of nfstop. */ /* minf - logical switch */ /* = .true. : subplx performs minimization */ /* = .false. : subplx performs maximization */ usubc_1.minf = TRUE_; return 0; } /* subopt_ */ /* setstp.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static double d_sign(doublereal *x, doublereal *y) { return copysign(*x, *y); } static int setstp_(integer *nsubs, integer *n, doublereal *deltax, doublereal *step) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Builtin functions */ /* double d_sign(doublereal *, doublereal *); */ /* Local variables */ static integer i__; static doublereal stpfac; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* setstp sets the stepsizes for the corresponding components */ /* of the solution vector. */ /* input */ /* nsubs - number of subspaces */ /* n - number of components (problem dimension) */ /* deltax - vector of change in solution vector */ /* step - stepsizes for corresponding components of */ /* solution vector */ /* output */ /* step - new stepsizes */ /* common */ /* local variables */ /* subroutines and functions */ /* blas */ /* fortran */ /* ----------------------------------------------------------- */ /* set new step */ /* Parameter adjustments */ --step; --deltax; /* Function Body */ if (*nsubs > 1) { /* Computing MIN */ /* Computing MAX */ d__3 = dasum_(n, &deltax[1], &c__1) / dasum_(n, &step[1], &c__1); d__1 = MAX2(d__3,usubc_1.omega), d__2 = 1. / usubc_1.omega; stpfac = MIN2(d__1,d__2); } else { stpfac = usubc_1.psi; } dscal_(n, &stpfac, &step[1], &c__1); /* reorient simplex */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (deltax[i__] != 0.) { step[i__] = d_sign(&step[i__], &deltax[i__]); } else { step[i__] = -step[i__]; } /* L10: */ } return 0; } /* setstp_ */ /* subplx.f -- translated by f2c (version 19991025). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ static int subplx_(D_fp f, void *fdata, integer *n, nlopt_stopping *stop, integer *mode, const doublereal *scale, doublereal *x, doublereal *fx, integer *nfe, doublereal *work, integer *iwork, integer *iflag) { /* Initialized data */ static doublereal bnsfac[6] /* was [3][2] */ = { -1.,-2.,0.,1.,0.,2. }; /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ static integer i__; static logical cmode; static integer istep; static doublereal xpscl; static integer nsubs, ipptr; static integer isptr; static integer ns, insfnl, ifsptr; static integer insptr; static integer istptr; static doublereal scl, dum; static integer ins; static doublereal sfx, sfx_old, *x_old; /* Coded by Tom Rowan */ /* Department of Computer Sciences */ /* University of Texas at Austin */ /* subplx uses the subplex method to solve unconstrained */ /* optimization problems. The method is well suited for */ /* optimizing objective functions that are noisy or are */ /* discontinuous at the solution. */ /* subplx sets default optimization options by calling the */ /* subroutine subopt. The user can override these defaults */ /* by calling subopt prior to calling subplx, changing the */ /* appropriate common variables, and setting the value of */ /* mode as indicated below. */ /* By default, subplx performs minimization. */ /* input */ /* f - user supplied function f(n,x) to be optimized, */ /* declared external in calling routine */ /* n - problem dimension */ /* tol - relative error tolerance for x (tol .ge. 0.) */ /* maxnfe - maximum number of function evaluations */ /* mode - integer mode switch with binary expansion */ /* (bit 1) (bit 0) : */ /* bit 0 = 0 : first call to subplx */ /* = 1 : continuation of previous call */ /* bit 1 = 0 : use default options */ /* = 1 : user set options */ /* scale - scale and initial stepsizes for corresponding */ /* components of x */ /* (If scale(1) .lt. 0., */ /* abs(scale(1)) is used for all components of x, */ /* and scale(2),...,scale(n) are not referenced.) */ /* x - starting guess for optimum */ /* work - double precision work array of dimension .ge. */ /* 2*n + nsmax*(nsmax+4) + 1 */ /* (nsmax is set in subroutine subopt. */ /* default: nsmax = min(5,n)) */ /* iwork - integer work array of dimension .ge. */ /* n + int(n/nsmin) */ /* (nsmin is set in subroutine subopt. */ /* default: nsmin = min(2,n)) */ /* output */ /* x - computed optimum */ /* fx - value of f at x */ /* nfe - number of function evaluations */ /* iflag - error flag */ /* = -2 : invalid input */ /* = -1 : maxnfe exceeded */ /* = 0 : tol satisfied */ /* = 1 : limit of machine precision */ /* = 2 : fstop reached (fstop usage is determined */ /* by values of options minf, nfstop, and */ /* irepl. default: f(x) not tested against */ /* fstop) */ /* iflag should not be reset between calls to */ /* subplx. */ /* common */ /* local variables */ /* subroutines and functions */ /* blas */ /* fortran */ /* data */ /* Parameter adjustments */ --x; --scale; --work; --iwork; x_old = work; work += *n; /* Function Body */ /* ----------------------------------------------------------- */ if (*mode % 2 == 0) { /* first call, check input */ if (*n < 1) { goto L120; } if (scale[1] >= 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xpscl = x[i__] + scale[i__]; if (xpscl == x[i__]) { goto L120; } /* L10: */ } } else { scl = fabs(scale[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xpscl = x[i__] + scl; if (xpscl == x[i__]) { goto L120; } /* L20: */ } } if (*mode / 2 % 2 == 0) { subopt_(n); } else { if (usubc_1.alpha <= 0.) { goto L120; } if (usubc_1.beta <= 0. || usubc_1.beta >= 1.) { goto L120; } if (usubc_1.gamma <= 1.) { goto L120; } if (usubc_1.delta <= 0. || usubc_1.delta >= 1.) { goto L120; } if (usubc_1.psi <= 0. || usubc_1.psi >= 1.) { goto L120; } if (usubc_1.omega <= 0. || usubc_1.omega >= 1.) { goto L120; } if (usubc_1.nsmin < 1 || usubc_1.nsmax < usubc_1.nsmin || *n < usubc_1.nsmax) { goto L120; } if (*n < ((*n - 1) / usubc_1.nsmax + 1) * usubc_1.nsmin) { goto L120; } if (usubc_1.irepl < 0 || usubc_1.irepl > 2) { goto L120; } if (usubc_1.ifxsw < 1 || usubc_1.ifxsw > 3) { goto L120; } if (usubc_1.bonus < 0.) { goto L120; } if (usubc_1.nfstop < 0) { goto L120; } } /* initialization */ istptr = *n + 1; isptr = istptr + *n; ifsptr = isptr + usubc_1.nsmax * (usubc_1.nsmax + 3); insptr = *n + 1; if (scale[1] > 0.) { dcopy_(n, &scale[1], &c__1, &work[1], &c__1); dcopy_(n, &scale[1], &c__1, &work[istptr], &c__1); } else { dcopy_(n, &scl, &c__0, &work[1], &c__1); dcopy_(n, &scl, &c__0, &work[istptr], &c__1); } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { iwork[i__] = i__; /* L30: */ } *nfe = 0; usubc_1.nfxe = 1; if (usubc_1.irepl == 0) { isubc_1.fbonus = 0.; } else if (usubc_1.minf) { isubc_1.fbonus = bnsfac[usubc_1.ifxsw - 1] * usubc_1.bonus; } else { isubc_1.fbonus = bnsfac[usubc_1.ifxsw + 2] * usubc_1.bonus; } if (usubc_1.nfstop == 0) { isubc_1.sfstop = 0.; } else if (usubc_1.minf) { isubc_1.sfstop = usubc_1.fstop; } else { isubc_1.sfstop = -usubc_1.fstop; } usubc_1.ftest = 0.; cmode = FALSE_; isubc_1.new__ = TRUE_; usubc_1.initx = TRUE_; evalf_((D_fp)f, fdata, &c__0, &iwork[1], &dum, n, &x[1], &sfx, nfe); *(stop->nevals_p)++; usubc_1.initx = FALSE_; } else { /* continuation of previous call */ if (*iflag == 2) { if (usubc_1.minf) { isubc_1.sfstop = usubc_1.fstop; } else { isubc_1.sfstop = -usubc_1.fstop; } cmode = TRUE_; goto L70; } else if (*iflag == -1) { cmode = TRUE_; goto L70; } else if (*iflag == 0) { cmode = FALSE_; goto L90; } else { return 0; } } /* subplex loop */ L40: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = (d__1 = work[i__], fabs(d__1)); /* L50: */ } sortd_(n, &work[1], &iwork[1]); partx_(n, &iwork[1], &work[1], &nsubs, &iwork[insptr]); dcopy_(n, &x[1], &c__1, &work[1], &c__1); ins = insptr; insfnl = insptr + nsubs - 1; ipptr = 1; /* simplex loop */ sfx_old = sfx; memcpy(&x_old[1], &x[1], sizeof(doublereal) * *n); L60: ns = iwork[ins]; L70: simplx_((D_fp)f, fdata, n, &work[istptr], &ns, &iwork[ipptr], stop, &cmode, &x[1], &sfx, nfe, &work[isptr], &work[ifsptr], iflag); cmode = FALSE_; if (*iflag != 0) { goto L110; } if (ins < insfnl) { ++ins; ipptr += ns; goto L60; } /* end simplex loop */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = x[i__] - work[i__]; /* L80: */ } /* check termination */ if (nlopt_stop_ftol(stop, sfx, sfx_old)) { *iflag = 20; goto L110; } if (nlopt_stop_x(stop, &x[1], &x_old[1])) { *iflag = 0; goto L110; } L90: istep = istptr; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__4 = (d__2 = work[i__], fabs(d__2)), d__5 = (d__1 = work[istep], fabs( d__1)) * usubc_1.psi; /* Computing MAX */ d__6 = (d__3 = x[i__], fabs(d__3)); if (MAX2(d__4,d__5) / MAX2(d__6,1.) > stop->xtol_rel) { setstp_(&nsubs, n, &work[1], &work[istptr]); goto L40; } ++istep; /* L100: */ } /* end subplex loop */ *iflag = 0; L110: if (usubc_1.minf) { *fx = sfx; } else { *fx = -sfx; } return 0; /* invalid input */ L120: *iflag = -2; return 0; } /* subplx_ */ /****************************************************************************/ /****************************************************************************/ /* front-end for subplex routines */ /* Wrapper around f2c'ed subplx_ routine, for multidimensinal unconstrained optimization: Parameters: f: function f(n,x,fdata) to be optimized n: problem dimension minf: (output) value of f at minimum x[n]: (input) starting guess position, (output) computed minimum fdata: data pointer passed to f old args: tol: relative error tolerance for x maxnfe: maximum number of function evaluations minf_max, use_minf_max: if use_minf_max, stop when f <= minf_max new args: nlopt_stopping *stop (stopping criteria) scale[n]: (input) scale & initial stepsizes for components of x (if *scale < 0, |*scale| is used for all components) Return value: = -2 : invalid input = -10 : maxtime exceeded = -1 : maxevals exceeded = 0 : tol satisfied = 1 : limit of machine precision = 2 : fstop reached (fstop usage is determined by values of options minf, nfstop, and irepl. default: f(x) not tested against fstop) = 20 : ftol reached = -200 : out of memory */ int nlopt_subplex(subplex_func f, double *minf, double *x, int n, void *fdata, nlopt_stopping *stop, const double *scale) { int mode = 0, *iwork, nsmax, nsmin, errflag, nfe; double *work; nsmax = MIN2(5,n); nsmin = MIN2(2,n); work = (double*) malloc(sizeof(double) * (3*n + nsmax*(nsmax+4) + 1)); if (!work) return -200; iwork = (int*) malloc(sizeof(int) * (n + n/nsmin + 1)); if (!iwork) { free(work); return -200; } subplx_(f,fdata, &n, stop, &mode, scale, x, minf, &nfe, work, iwork, &errflag); free(iwork); free(work); return errflag; } stevengj-nlopt-88c424d/src/algs/subplex/subplex.h000066400000000000000000000006271521061417600220750ustar00rootroot00000000000000#ifndef SUBPLEX_H #define SUBPLEX_H #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef double (*subplex_func)(int n, const double *x, void *func_data); extern int nlopt_subplex(subplex_func f, double *minf, double *x, int n, void *fdata, nlopt_stopping *stop, const double *scale); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/api/000077500000000000000000000000001521061417600163765ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/api/deprecated.c000066400000000000000000000157371521061417600206570ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nlopt.h" /*************************************************************************/ nlopt_algorithm nlopt_local_search_alg_deriv = NLOPT_LD_MMA; nlopt_algorithm nlopt_local_search_alg_nonderiv = NLOPT_LN_COBYLA; int nlopt_local_search_maxeval = -1; /* no maximum by default */ void NLOPT_STDCALL nlopt_get_local_search_algorithm(nlopt_algorithm * deriv, nlopt_algorithm * nonderiv, int *maxeval) { *deriv = nlopt_local_search_alg_deriv; *nonderiv = nlopt_local_search_alg_nonderiv; *maxeval = nlopt_local_search_maxeval; } void NLOPT_STDCALL nlopt_set_local_search_algorithm(nlopt_algorithm deriv, nlopt_algorithm nonderiv, int maxeval) { nlopt_local_search_alg_deriv = deriv; nlopt_local_search_alg_nonderiv = nonderiv; nlopt_local_search_maxeval = maxeval; } /*************************************************************************/ int nlopt_stochastic_population = 0; int NLOPT_STDCALL nlopt_get_stochastic_population(void) { return nlopt_stochastic_population; } void NLOPT_STDCALL nlopt_set_stochastic_population(int pop) { nlopt_stochastic_population = pop <= 0 ? 0 : (unsigned) pop; } /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_minimize_econstrained(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, int m, nlopt_func_old fc, void *fc_data_, ptrdiff_t fc_datum_size, int p, nlopt_func_old h, void *h_data_, ptrdiff_t h_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, double htol_rel, double htol_abs, int maxeval, double maxtime) { char *fc_data = (char *) fc_data_; char *h_data = (char *) h_data_; nlopt_opt opt; nlopt_result ret; int i; if (n < 0 || m < 0 || p < 0) return NLOPT_INVALID_ARGS; opt = nlopt_create(algorithm, (unsigned) n); if (!opt) return NLOPT_INVALID_ARGS; ret = nlopt_set_min_objective(opt, (nlopt_func) f, f_data); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } for (i = 0; i < m; ++i) { ret = nlopt_add_inequality_constraint(opt, (nlopt_func) fc, fc_data + i * fc_datum_size, 0.0); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } } (void) htol_rel; /* unused */ for (i = 0; i < p; ++i) { ret = nlopt_add_equality_constraint(opt, (nlopt_func) h, h_data + i * h_datum_size, htol_abs); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } } ret = nlopt_set_lower_bounds(opt, lb); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_upper_bounds(opt, ub); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_stopval(opt, minf_max); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_ftol_rel(opt, ftol_rel); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_ftol_abs(opt, ftol_abs); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_xtol_rel(opt, xtol_rel); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } if (xtol_abs) ret = nlopt_set_xtol_abs(opt, xtol_abs); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_maxeval(opt, maxeval); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_set_maxtime(opt, maxtime); if (ret != NLOPT_SUCCESS) { nlopt_destroy(opt); return ret; } ret = nlopt_optimize(opt, x, minf); nlopt_destroy(opt); return ret; } /* don't emit inner deprecated warnings */ #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__==3 && __GNUC_MINOR__ > 0)) #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif nlopt_result NLOPT_STDCALL nlopt_minimize_constrained(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, int maxeval, double maxtime) { return nlopt_minimize_econstrained(algorithm, n, f, f_data, m, fc, fc_data, fc_datum_size, 0, NULL, NULL, 0, lb, ub, x, minf, minf_max, ftol_rel, ftol_abs, xtol_rel, xtol_abs, ftol_rel, ftol_abs, maxeval, maxtime); } nlopt_result NLOPT_STDCALL nlopt_minimize(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, int maxeval, double maxtime) { return nlopt_minimize_constrained(algorithm, n, f, f_data, 0, NULL, NULL, 0, lb, ub, x, minf, minf_max, ftol_rel, ftol_abs, xtol_rel, xtol_abs, maxeval, maxtime); } stevengj-nlopt-88c424d/src/api/f77api.c000066400000000000000000000121421521061417600176370ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include "nlopt.h" /*-----------------------------------------------------------------------*/ /* wrappers around f77 procedures */ typedef void (*nlopt_f77_func) (double *val, const int *n, const double *x, double *gradient, const int *need_gradient, void *func_data); typedef void (*nlopt_f77_mfunc) (const int *m, double *val, const int *n, const double *x, double *gradient, const int *need_gradient, void *func_data); typedef struct { nlopt_f77_func f; nlopt_f77_mfunc mf; void *f_data; } f77_func_data; static void *free_f77_func_data(void *p) { free(p); return NULL; } static void *dup_f77_func_data(void *p) { void *pnew = (void *) malloc(sizeof(f77_func_data)); if (pnew) memcpy(pnew, p, sizeof(f77_func_data)); return pnew; } static double f77_func_wrap_old(int n, const double *x, double *grad, void *data) { f77_func_data *d = (f77_func_data *) data; double val; int need_gradient = grad != 0; d->f(&val, &n, x, grad, &need_gradient, d->f_data); return val; } static double f77_func_wrap(unsigned n, const double *x, double *grad, void *data) { f77_func_data *d = (f77_func_data *) data; int ni = (int) n; double val; int need_gradient = grad != 0; d->f(&val, &ni, x, grad, &need_gradient, d->f_data); return val; } static void f77_mfunc_wrap(unsigned m, double *result, unsigned n, const double *x, double *grad, void *data) { f77_func_data *d = (f77_func_data *) data; int mi = (int) m; int ni = (int) n; int need_gradient = grad != 0; d->mf(&mi, result, &ni, x, grad, &need_gradient, d->f_data); } /*-----------------------------------------------------------------------*/ #define F77_GET(name,NAME,T) NLOPT_EXTERN(void) F77_(nlo_get_##name,NLO_GET_##NAME)(T *val, nlopt_opt *opt) { *val = (T) nlopt_get_##name(*opt); } #define F77_SET(name,NAME,T) NLOPT_EXTERN(void) F77_(nlo_set_##name,NLO_SET_##NAME)(int *ret, nlopt_opt *opt, T *val) { *ret = (int) nlopt_set_##name(*opt, *val); } #define F77_GETSET(name,NAME,T) F77_GET(name,NAME,T) F77_SET(name,NAME,T) #define F77_GETA(name,NAME,T) NLOPT_EXTERN(void) F77_(nlo_get_##name,NLO_GET_##NAME)(int *ret, nlopt_opt *opt, T *val) { *ret = (int) nlopt_get_##name(*opt, val); } #define F77_SETA(name,NAME,T) NLOPT_EXTERN(void) F77_(nlo_set_##name,NLO_SET_##NAME)(int *ret, nlopt_opt *opt, T *val) { *ret = (int) nlopt_set_##name(*opt, val); } #define F77_GETSETA(name,NAME,T) F77_GETA(name,NAME,T) F77_SETA(name,NAME,T) F77_SET(name##1,NAME##1,T) /*-----------------------------------------------------------------------*/ /* rather than trying to detect the Fortran name-mangling scheme with autoconf, we just include wrappers with all common name-mangling schemes ... this avoids problems and also allows us to work with multiple Fortran compilers on the same machine. Since the Fortran wrapper functions are so small, the library bloat of including them multiple times is negligible and seems well worth the benefit. */ # define F77CALL(a, A) F77(a, A) /* name + underscore is by far the most common (gfortran, g77, Intel, ...) */ # define F77(a, A) a ## _ # include "f77funcs.h" /* also include g77 convention of name + double underscore for identifiers containing underscores */ # define F77_(a, A) a ## __ # include "f77funcs_.h" # undef F77_ /* AIX and HPUX use just the lower-case name */ # undef F77 # define F77(a, A) a # include "f77funcs.h" /* Old Cray Unicos, as well as several Windows Fortran compilers (Digital/Compaq/HP Visual Fortran and Intel Fortran) use all-uppercase name */ /* Digital/Compaq/HP Visual Fortran, Intel Fortran. stdcall attribute is apparently required to adjust for calling conventions (callee pops stack in stdcall). See also: http://msdn.microsoft.com/library/en-us/vccore98/html/_core_mixed.2d.language_programming.3a_.overview.asp */ # undef F77 # undef F77CALL # define F77(a, A) NLOPT_STDCALL A # define F77CALL(a, A) A # include "f77funcs.h" stevengj-nlopt-88c424d/src/api/f77funcs.h000066400000000000000000000114331521061417600202130ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__==3 && __GNUC_MINOR__ > 0)) #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif /* Fortran API wrappers, using the F77 macro defined in f77api.c. This header file is #included one or more times from f77api.c in order to define verions of the Fortran API for various compilers. In homage to Fortran 77, we stick with 6-character subroutine names. The return value of the function is converted into the first argument of the subroutine. */ /* nlopt_minimize_constrained */ void F77(nloptc, NLOPTC) (int *info, const int *algorithm, const int *n, nlopt_f77_func f, void *f_data, const int *m, nlopt_f77_func fc, char *fc_data, char *fc_second_datum, const double *lb, const double *ub, double *x, double *minf, const double *minf_max, const double *ftol_rel, const double *ftol_abs, const double *xtol_rel, const double *xtol_abs, const int *have_xtol_abs, const int *maxeval, const double *maxtime) { f77_func_data d, *dc; int i; d.f = f; d.f_data = f_data; if (*m < 0) { *info = NLOPT_INVALID_ARGS; return; } dc = (f77_func_data *) malloc(sizeof(f77_func_data) * *m); if (*m > 0 && !dc) { *info = NLOPT_OUT_OF_MEMORY; return; } for (i = 0; i < *m; ++i) { dc[i].f = fc; dc[i].f_data = fc_data + i * (fc_second_datum - fc_data); } *info = nlopt_minimize_constrained((nlopt_algorithm) * algorithm, *n, f77_func_wrap_old, &d, *m, f77_func_wrap_old, dc, sizeof(f77_func_data), lb, ub, x, minf, *minf_max, *ftol_rel, *ftol_abs, *xtol_rel, *have_xtol_abs ? xtol_abs : 0, *maxeval, *maxtime); if (dc) free(dc); } /* nlopt_minimize */ void F77(nloptm, NLOPTM) (int *info, const int *algorithm, const int *n, nlopt_f77_func f, void *f_data, const double *lb, const double *ub, double *x, double *minf, const double *minf_max, const double *ftol_rel, const double *ftol_abs, const double *xtol_rel, const double *xtol_abs, const int *have_xtol_abs, const int *maxeval, const double *maxtime) { int m = 0; F77CALL(nloptc, NLOPTC) (info, algorithm, n, f, f_data, &m, 0, 0, 0, lb, ub, x, minf, minf_max, ftol_rel, ftol_abs, xtol_rel, xtol_abs, have_xtol_abs, maxeval, maxtime); } void F77(nlosr, NLOSR) (const int *seed) { nlopt_srand((unsigned long) *seed); } void F77(nlosrt, NLOSRT) (void) { nlopt_srand_time(); } void F77(nloptv, NLOPTV) (int *major, int *minor, int *bugfix) { nlopt_version(major, minor, bugfix); } void F77(nlogls, NLOGLS) (int *ideriv, int *inonderiv, int *maxeval) { nlopt_algorithm deriv, nonderiv; nlopt_get_local_search_algorithm(&deriv, &nonderiv, maxeval); *ideriv = deriv; *inonderiv = nonderiv; } void F77(nlosls, NLOSLS) (int *ideriv, int *inonderiv, int *maxeval) { nlopt_algorithm deriv = (nlopt_algorithm) * ideriv; nlopt_algorithm nonderiv = (nlopt_algorithm) * inonderiv; nlopt_set_local_search_algorithm(deriv, nonderiv, *maxeval); } void F77(nlogsp, NLOGSP) (int *pop) { *pop = nlopt_get_stochastic_population(); } void F77(nlossp, NLOSSP) (const int *pop) { nlopt_set_stochastic_population(*pop); } #define F77_(name,NAME) F77(name,NAME) # include "f77funcs_.h" #undef F77_ stevengj-nlopt-88c424d/src/api/f77funcs_.h000066400000000000000000000151251521061417600203540ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Fortran API wrappers, using the F77 macro defined in f77api.c. This header file is #included one or more times from f77api.c in order to define verions of the Fortran API for various compilers. All of the functions in this file have underscores in their names, which means that they are treated differently for name-mangling (thank you, g77 and f2c) than names without underscores. The return value of a function is converted to the first argument of a subroutine. */ NLOPT_EXTERN(void) F77_(nlo_create, NLO_CREATE) (nlopt_opt * opt, int *alg, int *n) { if (*n < 0) *opt = NULL; else { *opt = nlopt_create((nlopt_algorithm) * alg, (unsigned) *n); nlopt_set_munge(*opt, free_f77_func_data, dup_f77_func_data); } } NLOPT_EXTERN(void) F77_(nlo_copy, NLO_COPY) (nlopt_opt * nopt, nlopt_opt * opt) { *nopt = nlopt_copy(*opt); } NLOPT_EXTERN(void) F77_(nlo_destroy, NLO_DESTROY) (nlopt_opt * opt) { nlopt_destroy(*opt); } NLOPT_EXTERN(void) F77_(nlo_optimize, NLO_OPTIMIZE) (int *ret, nlopt_opt * opt, double *x, double *optf) { *ret = (int) nlopt_optimize(*opt, x, optf); } NLOPT_EXTERN(void) F77_(nlo_set_min_objective, NLO_SET_MIN_OBJECTIVE) (int *ret, nlopt_opt * opt, nlopt_f77_func f, void *f_data) { f77_func_data *d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->f = f; d->f_data = f_data; *ret = (int) nlopt_set_min_objective(*opt, f77_func_wrap, d); } NLOPT_EXTERN(void) F77_(nlo_set_max_objective, NLO_SET_MAX_OBJECTIVE) (int *ret, nlopt_opt * opt, nlopt_f77_func f, void *f_data) { f77_func_data *d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->f = f; d->f_data = f_data; *ret = (int) nlopt_set_max_objective(*opt, f77_func_wrap, d); } F77_GET(algorithm, ALGORITHM, int) F77_GET(dimension, DIMENSION, int) F77_GETSETA(lower_bounds, LOWER_BOUNDS, double) F77_GETSETA(upper_bounds, UPPER_BOUNDS, double) NLOPT_EXTERN(void) F77_(nlo_remove_inequality_constraints, NLO_REMOVE_INEQUALITY_CONSTRAINTS) (int *ret, nlopt_opt * opt) { *ret = (int) nlopt_remove_inequality_constraints(*opt); } NLOPT_EXTERN(void) F77_(nlo_add_inequality_constraint, NLO_ADD_INEQUALITY_CONSTRAINT) (int *ret, nlopt_opt * opt, nlopt_f77_func fc, void *fc_data, double *tol) { f77_func_data *d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->f = fc; d->f_data = fc_data; *ret = (int) nlopt_add_inequality_constraint(*opt, f77_func_wrap, d, *tol); } NLOPT_EXTERN(void) F77_(nlo_add_inequality_mconstraint, NLO_ADD_INEQUALITY_MCONSTRAINT) (int *ret, nlopt_opt * opt, int *m, nlopt_f77_mfunc mfc, void *mfc_data, double *tol) { f77_func_data *d; if (*m < 0) { *ret = (int) NLOPT_INVALID_ARGS; return; } if (*m == 0) { *ret = (int) NLOPT_SUCCESS; return; } d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->mf = mfc; d->f_data = mfc_data; *ret = (int) nlopt_add_inequality_mconstraint(*opt, (unsigned) *m, f77_mfunc_wrap, d, tol); } NLOPT_EXTERN(void) F77_(nlo_remove_equality_constraints, NLO_REMOVE_EQUALITY_CONSTRAINTS) (int *ret, nlopt_opt * opt) { *ret = (int) nlopt_remove_equality_constraints(*opt); } NLOPT_EXTERN(void) F77_(nlo_add_equality_constraint, NLO_ADD_EQUALITY_CONSTRAINT) (int *ret, nlopt_opt * opt, nlopt_f77_func fc, void *fc_data, double *tol) { f77_func_data *d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->f = fc; d->f_data = fc_data; *ret = (int) nlopt_add_equality_constraint(*opt, f77_func_wrap, d, *tol); } NLOPT_EXTERN(void) F77_(nlo_add_equality_mconstraint, NLO_ADD_EQUALITY_MCONSTRAINT) (int *ret, nlopt_opt * opt, int *m, nlopt_f77_mfunc mfc, void *mfc_data, double *tol) { f77_func_data *d; if (*m < 0) { *ret = (int) NLOPT_INVALID_ARGS; return; } if (*m == 0) { *ret = (int) NLOPT_SUCCESS; return; } d = (f77_func_data *) malloc(sizeof(f77_func_data)); if (!d) { *ret = (int) NLOPT_OUT_OF_MEMORY; return; } d->mf = mfc; d->f_data = mfc_data; *ret = (int) nlopt_add_equality_mconstraint(*opt, (unsigned) *m, f77_mfunc_wrap, d, tol); } F77_GETSET(stopval, STOPVAL, double) F77_GETSET(ftol_rel, FTOL_REL, double) F77_GETSET(ftol_abs, FTOL_ABS, double) F77_GETSET(xtol_rel, XTOL_REL, double) F77_GETSETA(xtol_abs, XTOL_ABS, double) F77_GETSET(maxeval, MAXEVAL, int) F77_GET(numevals, NUMEVALS, int) F77_GETSET(maxtime, MAXTIME, double) F77_GETSETA(x_weights, X_WEIGHTS, double) F77_GETSET(force_stop, FORCE_STOP, int) NLOPT_EXTERN(void) F77_(nlo_force_stop, NLO_FORCE_STOP) (int *ret, nlopt_opt * opt) { *ret = (int) nlopt_force_stop(*opt); } F77_SET(local_optimizer, LOCAL_OPTIMIZER, nlopt_opt) F77_GETSET(population, POPULATION, unsigned) F77_GETSET(vector_storage, vector_storage, unsigned) F77_SETA(default_initial_step, DEFAULT_INITIAL_STEP, double) F77_SETA(initial_step, INITIAL_STEP, double) F77_SET(initial_step1, INITIAL_STEP1, double) NLOPT_EXTERN(void) F77_(nlo_get_initial_step, NLO_GET_INITIAL_STEP) (int *ret, nlopt_opt * opt, const double *x, double *dx) { *ret = (int) nlopt_get_initial_step(*opt, x, dx); } stevengj-nlopt-88c424d/src/api/general.c000066400000000000000000000232331521061417600201620ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nlopt-internal.h" #include /*************************************************************************/ void NLOPT_STDCALL nlopt_version(int *major, int *minor, int *bugfix) { *major = MAJOR_VERSION; *minor = MINOR_VERSION; *bugfix = BUGFIX_VERSION; } /*************************************************************************/ static const char nlopt_algorithm_names[NLOPT_NUM_ALGORITHMS][256] = { "DIRECT (global, no-derivative)", "DIRECT-L (global, no-derivative)", "Randomized DIRECT-L (global, no-derivative)", "Unscaled DIRECT (global, no-derivative)", "Unscaled DIRECT-L (global, no-derivative)", "Unscaled Randomized DIRECT-L (global, no-derivative)", "Original DIRECT version (global, no-derivative)", "Original DIRECT-L version (global, no-derivative)", #ifdef NLOPT_CXX "StoGO (global, derivative-based)", "StoGO with randomized search (global, derivative-based)", #else "StoGO (NOT COMPILED)", "StoGO randomized (NOT COMPILED)", #endif "original L-BFGS code by Nocedal et al. (NOT COMPILED)", "Limited-memory BFGS (L-BFGS) (local, derivative-based)", "Principal-axis, praxis (local, no-derivative)", "Limited-memory variable-metric, rank 1 (local, derivative-based)", "Limited-memory variable-metric, rank 2 (local, derivative-based)", "Truncated Newton (local, derivative-based)", "Truncated Newton with restarting (local, derivative-based)", "Preconditioned truncated Newton (local, derivative-based)", "Preconditioned truncated Newton with restarting (local, derivative-based)", "Controlled random search (CRS2) with local mutation (global, no-derivative)", "Multi-level single-linkage (MLSL), random (global, no-derivative)", "Multi-level single-linkage (MLSL), random (global, derivative)", "Multi-level single-linkage (MLSL), quasi-random (global, no-derivative)", "Multi-level single-linkage (MLSL), quasi-random (global, derivative)", "Method of Moving Asymptotes (MMA) (local, derivative)", "COBYLA (Constrained Optimization BY Linear Approximations) (local, no-derivative)", "NEWUOA unconstrained optimization via quadratic models (local, no-derivative)", "Bound-constrained optimization via NEWUOA-based quadratic models (local, no-derivative)", "Nelder-Mead simplex algorithm (local, no-derivative)", "Sbplx variant of Nelder-Mead (re-implementation of Rowan's Subplex) (local, no-derivative)", "Augmented Lagrangian method (local, no-derivative)", "Augmented Lagrangian method (local, derivative)", "Augmented Lagrangian method for equality constraints (local, no-derivative)", "Augmented Lagrangian method for equality constraints (local, derivative)", "BOBYQA bound-constrained optimization via quadratic models (local, no-derivative)", "ISRES evolutionary constrained optimization (global, no-derivative)", "Augmented Lagrangian method (needs sub-algorithm)", "Augmented Lagrangian method for equality constraints (needs sub-algorithm)", "Multi-level single-linkage (MLSL), random (global, needs sub-algorithm)", "Multi-level single-linkage (MLSL), quasi-random (global, needs sub-algorithm)", "Sequential Quadratic Programming (SQP) (local, derivative)", "CCSA (Conservative Convex Separable Approximations) with simple quadratic approximations (local, derivative)", "ESCH evolutionary strategy", #ifdef NLOPT_CXX "AGS (global, no-derivative)", #else "AGS (NOT COMPILED)", #endif }; const char *NLOPT_STDCALL nlopt_algorithm_name(nlopt_algorithm a) { if (((int) a) < 0 || a >= NLOPT_NUM_ALGORITHMS) return "UNKNOWN"; return nlopt_algorithm_names[a]; } /*************************************************************************/ const char *nlopt_algorithm_to_string(nlopt_algorithm algorithm) { switch(algorithm) { case NLOPT_GN_DIRECT: return "GN_DIRECT"; case NLOPT_GN_DIRECT_L: return "GN_DIRECT_L"; case NLOPT_GN_DIRECT_L_RAND: return "GN_DIRECT_L_RAND"; case NLOPT_GN_DIRECT_NOSCAL: return "GN_DIRECT_NOSCAL"; case NLOPT_GN_DIRECT_L_NOSCAL: return "GN_DIRECT_L_NOSCAL"; case NLOPT_GN_DIRECT_L_RAND_NOSCAL: return "GN_DIRECT_L_RAND_NOSCAL"; case NLOPT_GN_ORIG_DIRECT: return "GN_ORIG_DIRECT"; case NLOPT_GN_ORIG_DIRECT_L: return "GN_ORIG_DIRECT_L"; case NLOPT_GD_STOGO: return "GD_STOGO"; case NLOPT_GD_STOGO_RAND: return "GD_STOGO_RAND"; case NLOPT_LD_LBFGS: return "LD_LBFGS"; case NLOPT_LD_LBFGS_NOCEDAL: return "NLOPT_LD_LBFGS_NOCEDAL"; case NLOPT_LN_PRAXIS: return "LN_PRAXIS"; case NLOPT_LD_VAR1: return "LD_VAR1"; case NLOPT_LD_VAR2: return "LD_VAR2"; case NLOPT_LD_TNEWTON: return "LD_TNEWTON"; case NLOPT_LD_TNEWTON_RESTART: return "LD_TNEWTON_RESTART"; case NLOPT_LD_TNEWTON_PRECOND: return "LD_TNEWTON_PRECOND"; case NLOPT_LD_TNEWTON_PRECOND_RESTART: return "LD_TNEWTON_PRECOND_RESTART"; case NLOPT_GN_CRS2_LM: return "GN_CRS2_LM"; case NLOPT_GN_MLSL: return "GN_MLSL"; case NLOPT_GD_MLSL: return "GD_MLSL"; case NLOPT_GN_MLSL_LDS: return "GN_MLSL_LDS"; case NLOPT_GD_MLSL_LDS: return "GD_MLSL_LDS"; case NLOPT_LD_MMA: return "LD_MMA"; case NLOPT_LN_COBYLA: return "LN_COBYLA"; case NLOPT_LN_NEWUOA: return "LN_NEWUOA"; case NLOPT_LN_NEWUOA_BOUND: return "LN_NEWUOA_BOUND"; case NLOPT_LN_NELDERMEAD: return "LN_NELDERMEAD"; case NLOPT_LN_SBPLX: return "LN_SBPLX"; case NLOPT_LN_AUGLAG: return "LN_AUGLAG"; case NLOPT_LD_AUGLAG: return "LD_AUGLAG"; case NLOPT_LN_AUGLAG_EQ: return "LN_AUGLAG_EQ"; case NLOPT_LD_AUGLAG_EQ: return "LD_AUGLAG_EQ"; case NLOPT_LN_BOBYQA: return "LN_BOBYQA"; case NLOPT_GN_ISRES: return "GN_ISRES"; case NLOPT_AUGLAG: return "AUGLAG"; case NLOPT_AUGLAG_EQ: return "AUGLAG_EQ"; case NLOPT_G_MLSL: return "G_MLSL"; case NLOPT_G_MLSL_LDS: return "G_MLSL_LDS"; case NLOPT_LD_SLSQP: return "LD_SLSQP"; case NLOPT_LD_CCSAQ: return "LD_CCSAQ"; case NLOPT_GN_ESCH: return "GN_ESCH"; case NLOPT_GN_AGS: return "GN_AGS"; case NLOPT_NUM_ALGORITHMS: return NULL; } return NULL; } nlopt_algorithm nlopt_algorithm_from_string(const char * name) { int i; if (name == NULL) return -1; for (i = 0; i < NLOPT_NUM_ALGORITHMS; ++i) { if (strcmp (name, nlopt_algorithm_to_string(i)) == 0) return i; } return -1; } /*************************************************************************/ const char *nlopt_result_to_string(nlopt_result result) { switch(result) { case NLOPT_FAILURE: return "FAILURE"; case NLOPT_INVALID_ARGS: return "INVALID_ARGS"; case NLOPT_OUT_OF_MEMORY: return "OUT_OF_MEMORY"; case NLOPT_ROUNDOFF_LIMITED: return "ROUNDOFF_LIMITED"; case NLOPT_FORCED_STOP: return "FORCED_STOP"; case NLOPT_SUCCESS: return "SUCCESS"; case NLOPT_STOPVAL_REACHED: return "STOPVAL_REACHED"; case NLOPT_FTOL_REACHED: return "FTOL_REACHED"; case NLOPT_XTOL_REACHED: return "XTOL_REACHED"; case NLOPT_MAXEVAL_REACHED: return "MAXEVAL_REACHED"; case NLOPT_MAXTIME_REACHED: return "MAXTIME_REACHED"; default: return NULL; } } nlopt_result nlopt_result_from_string(const char * name) { int i; if (name == NULL) return -1; /* Check all valid negative (failure) and positive (success) result codes */ for (i = NLOPT_NUM_FAILURES + 1; i < NLOPT_NUM_RESULTS; ++i) { const char *name_i = nlopt_result_to_string(i); if (name_i != NULL && strcmp(name, name_i) == 0) return i; } return -1; } /*************************************************************************/ /* get thread id, if possible, for use in nlopt_srand_time to ensure that different threads have a different default seed even if they are called simultaneously */ #if defined(_WIN32) || defined(__WIN32__) # include # define my_gettid GetCurrentThreadId #elif defined(HAVE_GETTID_SYSCALL) # include # include # define my_gettid() syscall(SYS_gettid) #elif defined(HAVE_GETPID) # include # include # define my_gettid getpid #else # define my_gettid() (0) #endif /*************************************************************************/ static THREADLOCAL int nlopt_srand_called = 0; void NLOPT_STDCALL nlopt_srand(unsigned long seed) { nlopt_srand_called = 1; nlopt_init_genrand(seed); } void NLOPT_STDCALL nlopt_srand_time(void) { nlopt_srand(nlopt_time_seed() + (unsigned long) my_gettid() * 314159); } void nlopt_srand_time_default(void) { if (!nlopt_srand_called) nlopt_srand_time(); } /*************************************************************************/ stevengj-nlopt-88c424d/src/api/nlopt-in.hpp000066400000000000000000000542141521061417600206550ustar00rootroot00000000000000/* Copyright (c) 2007-2011 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // C++ style wrapper around NLopt API // nlopt.hpp is AUTOMATICALLY GENERATED from nlopt-in.hpp - edit the latter! #ifndef NLOPT_HPP #define NLOPT_HPP #include #include #include #include #include #include #include #include // std::move #include // std::function // convenience overloading for below (not in nlopt:: since has nlopt_ prefix) inline nlopt_result nlopt_get_initial_step(const nlopt_opt opt, double *dx) { return nlopt_get_initial_step(opt, (const double *) NULL, dx); } namespace nlopt { ////////////////////////////////////////////////////////////////////// // nlopt::* namespace versions of the C enumerated types // AUTOMATICALLY GENERATED, DO NOT EDIT // GEN_ENUMS_HERE ////////////////////////////////////////////////////////////////////// typedef nlopt_func func; // nlopt::func synoynm typedef nlopt_mfunc mfunc; // nlopt::mfunc synoynm // alternative to nlopt_func that takes std::vector // ... unfortunately requires a data copy typedef double (*vfunc)(const std::vector &x, std::vector &grad, void *data); // OOP alternative to nlopt_func that stores the data inside, // hence no need to pass (void*) data // functor can be a regular function, C++ lambda, a class with `operator()` // defined with the following signature: // double operator()(unsigned, const double*, double*); typedef std::function functor_type; ////////////////////////////////////////////////////////////////////// // NLopt-specific exceptions (corresponding to error codes): class roundoff_limited : public std::runtime_error { public: roundoff_limited() : std::runtime_error("nlopt roundoff-limited") {} }; class forced_stop : public std::runtime_error { public: forced_stop() : std::runtime_error("nlopt forced stop") {} }; ////////////////////////////////////////////////////////////////////// class opt { private: nlopt_opt o; void mythrow(nlopt_result ret) const { switch (ret) { case NLOPT_FAILURE: throw std::runtime_error(get_errmsg() ? get_errmsg() : "nlopt failure"); case NLOPT_OUT_OF_MEMORY: throw std::bad_alloc(); case NLOPT_INVALID_ARGS: throw std::invalid_argument(get_errmsg() ? get_errmsg() : "nlopt invalid argument"); case NLOPT_ROUNDOFF_LIMITED: throw roundoff_limited(); case NLOPT_FORCED_STOP: throw forced_stop(); default: break; } } typedef struct { opt *o; mfunc mf; func f; void *f_data; functor_type functor; vfunc vf; nlopt_munge munge_destroy, munge_copy; // non-NULL for SWIG wrappers } myfunc_data; static myfunc_data* alloc_myfunc_data_with_nulls() { myfunc_data *d = new myfunc_data(); // zero-initialize all pointers if (!d) throw std::bad_alloc(); return d; } myfunc_data* alloc_and_init_myfunc_data() { myfunc_data *d = alloc_myfunc_data_with_nulls(); d->o = this; return d; } // free/destroy f_data in nlopt_destroy and nlopt_copy, respectively static void *free_myfunc_data(void *p) { myfunc_data *d = (myfunc_data *) p; if (d) { if (d->f_data && d->munge_destroy) d->munge_destroy(d->f_data); delete d; } return NULL; } static void *dup_myfunc_data(void *p) { myfunc_data *d = (myfunc_data *) p; if (d) { void *f_data; if (d->f_data && d->munge_copy) { f_data = d->munge_copy(d->f_data); if (!f_data) return NULL; } else f_data = d->f_data; myfunc_data *dnew = alloc_myfunc_data_with_nulls(); *dnew = *d; dnew->f_data = f_data; return (void*) dnew; } else return NULL; } // nlopt_func wrapper that catches exceptions static double myfunc(unsigned n, const double *x, double *grad, void *d_) { myfunc_data *d = reinterpret_cast(d_); try { return d->f(n, x, grad, d->f_data); } catch (std::bad_alloc&) { d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; } catch (std::invalid_argument&) { d->o->forced_stop_reason = NLOPT_INVALID_ARGS; } catch (roundoff_limited&) { d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; } catch (forced_stop&) { d->o->forced_stop_reason = NLOPT_FORCED_STOP; } catch (...) { d->o->forced_stop_reason = NLOPT_FAILURE; } d->o->force_stop(); // stop gracefully, opt::optimize will re-throw return HUGE_VAL; } // nlopt_mfunc wrapper that catches exceptions static void mymfunc(unsigned m, double *result, unsigned n, const double *x, double *grad, void *d_) { myfunc_data *d = reinterpret_cast(d_); try { d->mf(m, result, n, x, grad, d->f_data); return; } catch (std::bad_alloc&) { d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; } catch (std::invalid_argument&) { d->o->forced_stop_reason = NLOPT_INVALID_ARGS; } catch (roundoff_limited&) { d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; } catch (forced_stop&) { d->o->forced_stop_reason = NLOPT_FORCED_STOP; } catch (...) { d->o->forced_stop_reason = NLOPT_FAILURE; } d->o->force_stop(); // stop gracefully, opt::optimize will re-throw for (unsigned i = 0; i < m; ++i) result[i] = HUGE_VAL; } std::vector xtmp, gradtmp, gradtmp0; // scratch for myvfunc // nlopt_func wrapper, using std::vector static double myvfunc(unsigned n, const double *x, double *grad, void *d_){ myfunc_data *d = reinterpret_cast(d_); try { std::vector &xv = d->o->xtmp; if (n) std::memcpy(&xv[0], x, n * sizeof(double)); double val=d->vf(xv, grad ? d->o->gradtmp : d->o->gradtmp0, d->f_data); if (grad && n) { std::vector &gradv = d->o->gradtmp; std::memcpy(grad, &gradv[0], n * sizeof(double)); } return val; } catch (std::bad_alloc&) { d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; } catch (std::invalid_argument&) { d->o->forced_stop_reason = NLOPT_INVALID_ARGS; } catch (roundoff_limited&) { d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; } catch (forced_stop&) { d->o->forced_stop_reason = NLOPT_FORCED_STOP; } catch (...) { d->o->forced_stop_reason = NLOPT_FAILURE; } d->o->force_stop(); // stop gracefully, opt::optimize will re-throw return HUGE_VAL; } // nlopt_func wrapper, using std::function object static double functor_wrapper(unsigned n, const double *x, double *grad, void *d_) { myfunc_data *d = reinterpret_cast(d_); try { // since functor can be a callable object and contain its own data, // passing data as (void*) is not needed return d->functor(n, x, grad); } catch (std::bad_alloc&) { d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; } catch (std::invalid_argument&) { d->o->forced_stop_reason = NLOPT_INVALID_ARGS; } catch (roundoff_limited&) { d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; } catch (forced_stop&) { d->o->forced_stop_reason = NLOPT_FORCED_STOP; } catch (...) { d->o->forced_stop_reason = NLOPT_FAILURE; } d->o->force_stop(); // stop gracefully, opt::optimize will re-throw return HUGE_VAL; } void alloc_tmp() { if (xtmp.size() != nlopt_get_dimension(o)) { xtmp = std::vector(nlopt_get_dimension(o)); gradtmp = std::vector(nlopt_get_dimension(o)); } } bool exceptions_enabled; result last_result; double last_optf; nlopt_result forced_stop_reason; public: // Constructors etc. opt() : o(NULL), xtmp(0), gradtmp(0), gradtmp0(0), exceptions_enabled(true), last_result(nlopt::FAILURE), last_optf(HUGE_VAL), forced_stop_reason(NLOPT_FORCED_STOP) {} ~opt() { nlopt_destroy(o); } opt(algorithm a, unsigned n) : o(nlopt_create(nlopt_algorithm(a), n)), xtmp(0), gradtmp(0), gradtmp0(0), exceptions_enabled(true), last_result(nlopt::FAILURE), last_optf(HUGE_VAL), forced_stop_reason(NLOPT_FORCED_STOP) { if (!o) throw std::bad_alloc(); nlopt_set_munge(o, free_myfunc_data, dup_myfunc_data); } opt(const char * algo_str, unsigned n) : o(NULL), xtmp(0), gradtmp(0), gradtmp0(0), exceptions_enabled(true), last_result(nlopt::FAILURE), last_optf(HUGE_VAL), forced_stop_reason(NLOPT_FORCED_STOP) { const nlopt_algorithm a = nlopt_algorithm_from_string(algo_str); if (a < 0) throw std::invalid_argument("wrong algorithm string"); o = nlopt_create(a, n); if (!o) throw std::bad_alloc(); nlopt_set_munge(o, free_myfunc_data, dup_myfunc_data); } opt(const opt& f) : o(nlopt_copy(f.o)), xtmp(f.xtmp), gradtmp(f.gradtmp), gradtmp0(0), exceptions_enabled(f.exceptions_enabled), last_result(f.last_result), last_optf(f.last_optf), forced_stop_reason(f.forced_stop_reason) { if (f.o && !o) throw std::bad_alloc(); } opt& operator=(opt const& f) { if (this == &f) return *this; // self-assignment nlopt_destroy(o); o = nlopt_copy(f.o); if (f.o && !o) throw std::bad_alloc(); xtmp = f.xtmp; gradtmp = f.gradtmp; exceptions_enabled = f.exceptions_enabled; last_result = f.last_result; last_optf = f.last_optf; forced_stop_reason = f.forced_stop_reason; return *this; } // Do the optimization: result optimize(std::vector &x, double &opt_f) { if (o && nlopt_get_dimension(o) != x.size()) throw std::invalid_argument("dimension mismatch"); forced_stop_reason = NLOPT_FORCED_STOP; nlopt_result ret = nlopt_optimize(o, x.empty() ? NULL : &x[0], &opt_f); last_result = result(ret); last_optf = opt_f; if (exceptions_enabled) { if (ret == NLOPT_FORCED_STOP) mythrow(forced_stop_reason); mythrow(ret); } return last_result; } // variant mainly useful for SWIG wrappers: std::vector optimize(const std::vector &x0) { std::vector x(x0); last_result = optimize(x, last_optf); return x; } result last_optimize_result() const { return last_result; } double last_optimum_value() const { return last_optf; } // accessors: algorithm get_algorithm() const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); return algorithm(nlopt_get_algorithm(o)); } const char *get_algorithm_name() const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); return nlopt_algorithm_name(nlopt_get_algorithm(o)); } unsigned get_dimension() const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); return nlopt_get_dimension(o); } // Set the objective function void set_min_objective(func f, void *f_data) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; mythrow(nlopt_set_min_objective(o, myfunc, d)); // d freed via o } void set_min_objective(vfunc vf, void *f_data) { myfunc_data *d = alloc_and_init_myfunc_data(); d->vf = vf; d->f_data = f_data; mythrow(nlopt_set_min_objective(o, myvfunc, d)); // d freed via o alloc_tmp(); } void set_min_objective(functor_type functor) { myfunc_data *d = alloc_and_init_myfunc_data(); d->functor = std::move(functor); mythrow(nlopt_set_min_objective(o, functor_wrapper, d)); // d freed via o } void set_max_objective(func f, void *f_data) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; mythrow(nlopt_set_max_objective(o, myfunc, d)); // d freed via o } void set_max_objective(vfunc vf, void *f_data) { myfunc_data *d = alloc_and_init_myfunc_data(); d->vf = vf; d->f_data = f_data; mythrow(nlopt_set_max_objective(o, myvfunc, d)); // d freed via o alloc_tmp(); } void set_max_objective(functor_type functor) { myfunc_data *d = alloc_and_init_myfunc_data(); d->functor = std::move(functor); mythrow(nlopt_set_max_objective(o, functor_wrapper, d)); // d freed via o } // for internal use in SWIG wrappers -- variant that // takes ownership of f_data, with munging for destroy/copy void set_min_objective(func f, void *f_data, nlopt_munge md, nlopt_munge mc) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_set_min_objective(o, myfunc, d)); // d freed via o } void set_max_objective(func f, void *f_data, nlopt_munge md, nlopt_munge mc) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_set_max_objective(o, myfunc, d)); // d freed via o } // Nonlinear constraints: void remove_inequality_constraints() { nlopt_result ret = nlopt_remove_inequality_constraints(o); mythrow(ret); } void add_inequality_constraint(func f, void *f_data, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; mythrow(nlopt_add_inequality_constraint(o, myfunc, d, tol)); } void add_inequality_constraint(vfunc vf, void *f_data, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->vf = vf; d->f_data = f_data; mythrow(nlopt_add_inequality_constraint(o, myvfunc, d, tol)); alloc_tmp(); } void add_inequality_mconstraint(mfunc mf, void *f_data, const std::vector &tol) { myfunc_data *d = alloc_and_init_myfunc_data(); d->mf = mf; d->f_data = f_data; mythrow(nlopt_add_inequality_mconstraint(o, static_cast(tol.size()), mymfunc, d, tol.empty() ? NULL : &tol[0])); } void remove_equality_constraints() { nlopt_result ret = nlopt_remove_equality_constraints(o); mythrow(ret); } void add_equality_constraint(func f, void *f_data, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; mythrow(nlopt_add_equality_constraint(o, myfunc, d, tol)); } void add_equality_constraint(vfunc vf, void *f_data, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->vf = vf; d->f_data = f_data; mythrow(nlopt_add_equality_constraint(o, myvfunc, d, tol)); alloc_tmp(); } void add_equality_mconstraint(mfunc mf, void *f_data, const std::vector &tol) { myfunc_data *d = alloc_and_init_myfunc_data(); d->mf = mf; d->f_data = f_data; mythrow(nlopt_add_equality_mconstraint(o, static_cast(tol.size()), mymfunc, d, tol.empty() ? NULL : &tol[0])); } // For internal use in SWIG wrappers (see also above) void add_inequality_constraint(func f, void *f_data, nlopt_munge md, nlopt_munge mc, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_add_inequality_constraint(o, myfunc, d, tol)); } void add_equality_constraint(func f, void *f_data, nlopt_munge md, nlopt_munge mc, double tol=0) { myfunc_data *d = alloc_and_init_myfunc_data(); d->f = f; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_add_equality_constraint(o, myfunc, d, tol)); } void add_inequality_mconstraint(mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc, const std::vector &tol) { myfunc_data *d = alloc_and_init_myfunc_data(); d->mf = mf; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_add_inequality_mconstraint(o, static_cast(tol.size()), mymfunc, d, tol.empty() ? NULL : &tol[0])); } void add_equality_mconstraint(mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc, const std::vector &tol) { myfunc_data *d = alloc_and_init_myfunc_data(); d->mf = mf; d->f_data = f_data; d->munge_destroy = md; d->munge_copy = mc; mythrow(nlopt_add_equality_mconstraint(o, static_cast(tol.size()), mymfunc, d, tol.empty() ? NULL : &tol[0])); } void set_param(const char *name, double val) { mythrow(nlopt_set_param(o, name, val)); } double get_param(const char *name, double defaultval) const { return nlopt_get_param(o, name, defaultval); } bool has_param(const char *name) const { return bool(nlopt_has_param(o, name)); } const char *nth_param(unsigned n) const { return nlopt_nth_param(o, n); } unsigned num_params() const { return nlopt_num_params(o); } #define NLOPT_GETSET_VEC(name) \ void set_##name(double val) { \ mythrow(nlopt_set_##name##1(o, val)); \ } \ void get_##name(std::vector &v) const { \ if (o && nlopt_get_dimension(o) != v.size()) \ throw std::invalid_argument("dimension mismatch"); \ mythrow(nlopt_get_##name(o, v.empty() ? NULL : &v[0])); \ } \ std::vector get_##name() const { \ if (!o) throw std::runtime_error("uninitialized nlopt::opt"); \ std::vector v(nlopt_get_dimension(o)); \ get_##name(v); \ return v; \ } \ void set_##name(const std::vector &v) { \ if (o && nlopt_get_dimension(o) != v.size()) \ throw std::invalid_argument("dimension mismatch"); \ mythrow(nlopt_set_##name(o, v.empty() ? NULL : &v[0])); \ } NLOPT_GETSET_VEC(lower_bounds) NLOPT_GETSET_VEC(upper_bounds) // stopping criteria: #define NLOPT_GETSET(T, name) \ T get_##name() const { \ if (!o) throw std::runtime_error("uninitialized nlopt::opt"); \ return nlopt_get_##name(o); \ } \ void set_##name(T name) { \ mythrow(nlopt_set_##name(o, name)); \ } NLOPT_GETSET(double, stopval) NLOPT_GETSET(double, ftol_rel) NLOPT_GETSET(double, ftol_abs) NLOPT_GETSET(double, xtol_rel) NLOPT_GETSET_VEC(xtol_abs) NLOPT_GETSET_VEC(x_weights) NLOPT_GETSET(int, maxeval) int get_numevals() const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); return nlopt_get_numevals(o); } NLOPT_GETSET(double, maxtime) NLOPT_GETSET(int, force_stop) void force_stop() { set_force_stop(1); } const char *get_errmsg() const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); return nlopt_get_errmsg(o); } // algorithm-specific parameters: void set_local_optimizer(const opt &lo) { nlopt_result ret = nlopt_set_local_optimizer(o, lo.o); mythrow(ret); } NLOPT_GETSET(unsigned, population) NLOPT_GETSET(unsigned, vector_storage) NLOPT_GETSET_VEC(initial_step) void set_default_initial_step(const std::vector &x) { nlopt_result ret = nlopt_set_default_initial_step(o, x.empty() ? NULL : &x[0]); mythrow(ret); } void get_initial_step(const std::vector &x, std::vector &dx) const { if (o && (nlopt_get_dimension(o) != x.size() || nlopt_get_dimension(o) != dx.size())) throw std::invalid_argument("dimension mismatch"); nlopt_result ret = nlopt_get_initial_step(o, x.empty() ? NULL : &x[0], dx.empty() ? NULL : &dx[0]); mythrow(ret); } std::vector get_initial_step_(const std::vector &x) const { if (!o) throw std::runtime_error("uninitialized nlopt::opt"); std::vector v(nlopt_get_dimension(o)); get_initial_step(x, v); return v; } // exceptions in opt::optimize: bool get_exceptions_enabled() const { return exceptions_enabled; } void set_exceptions_enabled(bool enable) { exceptions_enabled = enable; } }; #undef NLOPT_GETSET #undef NLOPT_GETSET_VEC ////////////////////////////////////////////////////////////////////// inline void srand(unsigned long seed) { nlopt_srand(seed); } inline void srand_time() { nlopt_srand_time(); } inline void version(int &major, int &minor, int &bugfix) { nlopt_version(&major, &minor, &bugfix); } inline int version_major() { int major, minor, bugfix; nlopt_version(&major, &minor, &bugfix); return major; } inline int version_minor() { int major, minor, bugfix; nlopt_version(&major, &minor, &bugfix); return minor; } inline int version_bugfix() { int major, minor, bugfix; nlopt_version(&major, &minor, &bugfix); return bugfix; } inline const char *algorithm_name(algorithm a) { return nlopt_algorithm_name(nlopt_algorithm(a)); } ////////////////////////////////////////////////////////////////////// } // namespace nlopt #endif /* NLOPT_HPP */ stevengj-nlopt-88c424d/src/api/nlopt-internal.h000066400000000000000000000120411521061417600215130ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NLOPT_INTERNAL_H #define NLOPT_INTERNAL_H #include "nlopt.h" #include "nlopt-util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*********************************************************************/ typedef struct { char *name; double val; } nlopt_opt_param; struct nlopt_opt_s { nlopt_algorithm algorithm; /* the optimization algorithm (immutable) */ unsigned n; /* the dimension of the problem (immutable) */ nlopt_func f; void *f_data; /* objective function to minimize */ nlopt_precond pre; /* optional preconditioner for f (NULL if none) */ int maximize; /* nonzero if we are maximizing, not minimizing */ nlopt_opt_param *params; unsigned nparams; double *lb, *ub; /* lower and upper bounds (length n) */ unsigned m; /* number of inequality constraints */ unsigned m_alloc; /* number of inequality constraints allocated */ nlopt_constraint *fc; /* inequality constraints, length m_alloc */ unsigned p; /* number of equality constraints */ unsigned p_alloc; /* number of inequality constraints allocated */ nlopt_constraint *h; /* equality constraints, length p_alloc */ nlopt_munge munge_on_destroy, munge_on_copy; /* hack for wrappers */ /* stopping criteria */ double stopval; /* stop when f reaches stopval or better */ double ftol_rel, ftol_abs; /* relative/absolute f tolerances */ double xtol_rel, *xtol_abs; /* rel/abs x tolerances */ double *x_weights; /* weights for relative x tolerance */ int maxeval; /* max # evaluations */ int numevals; /* number of evaluations */ double maxtime; /* max time (seconds) */ int force_stop; /* if nonzero, force a halt the next time we try to evaluate the objective during optimization */ /* when local optimization is used, we need a force_stop in the parent object to force a stop in child optimizations */ struct nlopt_opt_s *force_stop_child; /* algorithm-specific parameters */ nlopt_opt local_opt; /* local optimizer */ unsigned stochastic_population; /* population size for stochastic algs */ double *dx; /* initial step sizes (length n) for nonderivative algs */ unsigned vector_storage; /* max subspace dimension (0 for default) */ void *work; /* algorithm-specific workspace during optimization */ char *errmsg; /* description of most recent error */ }; /*********************************************************************/ extern void nlopt_srand_time_default(void); /* init the rand. seed only if unset */ /*********************************************************************/ /* global defaults set by deprecated API: */ extern nlopt_algorithm nlopt_local_search_alg_deriv; extern nlopt_algorithm nlopt_local_search_alg_nonderiv; extern int nlopt_local_search_maxeval; extern int nlopt_stochastic_population; /*********************************************************************/ #define RETURN_ERR(err, opt, msg) do { \ nlopt_set_errmsg(opt, msg); \ return err; \ } while (0) extern const char *nlopt_set_errmsg(nlopt_opt opt, const char *format, ...) #ifdef __GNUC__ __attribute__ ((format(printf, 2, 3))) #endif ; extern void nlopt_unset_errmsg(nlopt_opt opt); /*********************************************************************/ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* NLOPT_INTERNAL_H */ stevengj-nlopt-88c424d/src/api/nlopt.3000066400000000000000000000665401521061417600176310ustar00rootroot00000000000000.\" .\" Copyright (c) 2007 Massachusetts Institute of Technology .\" .\" Copying and distribution of this file, with or without modification, .\" are permitted in any medium without royalty provided the copyright .\" notice and this notice are preserved. .\" .TH NLOPT 3 2007-08-23 "MIT" "NLopt programming manual" .SH NAME nlopt \- Nonlinear optimization library .SH SYNOPSIS .nf .B #include .sp .BI "nlopt_opt " "opt" " = nlopt_create(" "algorithm" , " n" ); .BI "nlopt_set_min_objective(" "opt" , " f" , " f_data" ); .BI "nlopt_set_ftol_rel(" "opt" , " tol"); .BI "..." .BI "nlopt_optimize(" "opt" , " x " , " &opt_f" ); .BI "nlopt_destroy(" "opt" ); .sp The "..." indicates any number of calls to NLopt functions, below, to set parameters of the optimization, constraints, and stopping criteria. Here, \fBnlopt_set_ftol_rel\fR is merely an example of a possible stopping criterion. You should link the resulting program with the linker flags \-lnlopt \-lm on Unix. .fi .SH DESCRIPTION NLopt is a library for nonlinear optimization. It attempts to minimize (or maximize) a given nonlinear objective function .I f of .I n design variables, using the specified .IR algorithm , possibly subject to linear or nonlinear constraints. The optimum function value found is returned in \fIopt_f\fR (type double) with the corresponding design variable values returned in the (double) array .I x of length .IR n . The input values in .I x should be a starting guess for the optimum. .sp The parameters of the optimization are controlled via the object .I opt of type .BR nlopt_opt , which is created by the function .B nlopt_create and disposed of by .BR nlopt_destroy . By calling various functions in the NLopt library, one can specify stopping criteria (e.g., a relative tolerance on the objective function value is specified by .BR nlopt_set_ftol_rel ), upper and/or lower bounds on the design parameters .IR x , and even arbitrary nonlinear inequality and equality constraints. .sp By changing the parameter .I algorithm among several predefined constants described below, one can switch easily between a variety of minimization algorithms. Some of these algorithms require the gradient (derivatives) of the function to be supplied via .IR f , and other algorithms do not require derivatives. Some of the algorithms attempt to find a global optimum within the given bounds, and others find only a local optimum. Most of the algorithms only handle the case where there are no nonlinear constraints. The NLopt library is a wrapper around several free/open-source minimization packages, as well as some new implementations of published optimization algorithms. You could, of course, compile and call these packages separately, and in some cases this will provide greater flexibility than is available via NLopt. However, depending upon the specific function being optimized, the different algorithms will vary in effectiveness. The intent of NLopt is to allow you to quickly switch between algorithms in order to experiment with them for your problem, by providing a simple unified interface to these subroutines. .SH OBJECTIVE FUNCTION The objective function is specified by calling one of: .sp .BI " nlopt_result nlopt_set_min_objective(nlopt_opt " "opt" , .br .BI " nlopt_func " "f" , .br .BI " void* " "f_data" ); .br .BI " nlopt_result nlopt_set_max_objective(nlopt_opt " "opt" , .br .BI " nlopt_func " "f" , .br .BI " void* " "f_data" ); .sp depending on whether one wishes to minimize or maximize the objective function .IR f , respectively. The function .I f should be of the form: .sp .BI " double f(unsigned " "n" , .br .BI " const double* " "x" , .br .BI " double* " "grad" , .br .BI " void* " "f_data" ); .sp The return value should be the value of the function at the point .IR x , where .I x points to an array of length .I n of the design variables. The dimension .I n is identical to the one passed to .BR nlopt_create . .sp In addition, if the argument .I grad is not NULL, then .I grad points to an array of length .I n which should (upon return) be set to the gradient of the function with respect to the design variables at .IR x . That is, .IR grad[i] should upon return contain the partial derivative df/dx[i], for 0 <= i < n, if .I grad is non-NULL. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the .I grad argument will always be NULL and need never be computed. (For algorithms that do use gradient information, however, .I grad may still be NULL for some calls.) .sp The .I f_data argument is the same as the one passed to .B nlopt_set_min_objective or .BR nlopt_set_max_objective , and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from void* by a typecast.) .SH BOUND CONSTRAINTS Most of the algorithms in NLopt are designed for minimization of functions with simple bound constraints on the inputs. That is, the input vectors x[i] are constrainted to lie in a hyperrectangle lb[i] <= x[i] <= ub[i] for 0 <= i < n. These bounds are specified by passing arrays .I lb and .I ub of length .I n to one or both of the functions: .sp .BI " nlopt_result nlopt_set_lower_bounds(nlopt_opt " "opt" , .br .BI " const double* " "lb" ); .br .BI " nlopt_result nlopt_set_upper_bounds(nlopt_opt " "opt" , .br .BI " const double* " "ub" ); .sp If a lower/upper bound is not set, the default is no bound (unconstrained, i.e. a bound of infinity); it is possible to have lower bounds but not upper bounds or vice versa. Alternatively, the user can call one of the above functions and explicitly pass a lower bound of \-HUGE_VAL and/or an upper bound of +HUGE_VAL for some design variables to make them have no lower/upper bound, respectively. (HUGE_VAL is the standard C constant for a floating-point infinity, found in the math.h header file.) .sp Note, however, that some of the algorithms in NLopt, in particular most of the global-optimization algorithms, do not support unconstrained optimization and will return an error if you do not supply finite lower and upper bounds. .sp For convenience, the following two functions are supplied in order to set the lower/upper bounds for all design variables to a single constant (so that you don't have to fill an array with a constant value): .sp .BI " nlopt_result nlopt_set_lower_bounds1(nlopt_opt " "opt" , .br .BI " double " "lb" ); .br .BI " nlopt_result nlopt_set_upper_bounds1(nlopt_opt " "opt" , .br .BI " double " "ub" ); .sp .SH NONLINEAR CONSTRAINTS Several of the algorithms in NLopt (MMA and ORIG_DIRECT) also support arbitrary nonlinear inequality constraints, and some also allow nonlinear equality constraints (COBYLA, SLSQP, ISRES, and AUGLAG). For these algorithms, you can specify as many nonlinear constraints as you wish by calling the following functions multiple times. .sp In particular, a nonlinear inequality constraint of the form \fIfc\fR(\fIx\fR) <= 0, where the function .I fc is of the same form as the objective function described above, can be specified by calling: .sp .BI " nlopt_result nlopt_add_inequality_constraint(nlopt_opt " "opt" , .br .BI " nlopt_func " "fc" , .br .BI " void* " "fc_data" , .br .BI " double " "tol" ); .sp Just as for the objective function, .I fc_data is a pointer to arbitrary user data that will be passed through to the .I fc function whenever it is called. The parameter .I tol is a tolerance that is used for the purpose of stopping criteria only: a point .I x is considered feasible for judging whether to stop the optimization if \fIfc\fR(\fIx\fR) <= \fItol\fR. A tolerance of zero means that NLopt will try not to consider any \fIx\fR to be converged unless .I fc is strictly non-positive; generally, at least a small positive tolerance is advisable to reduce sensitivity to rounding errors. A nonlinear equality constraint of the form \fIh\fR(\fIx\fR) = 0, where the function .I h is of the same form as the objective function described above, can be specified by calling: .sp .BI " nlopt_result nlopt_add_equality_constraint(nlopt_opt " "opt" , .br .BI " nlopt_func " "h" , .br .BI " void* " "h_data" , .br .BI " double " "tol" ); .sp Just as for the objective function, .I h_data is a pointer to arbitrary user data that will be passed through to the .I h function whenever it is called. The parameter .I tol is a tolerance that is used for the purpose of stopping criteria only: a point .I x is considered feasible for judging whether to stop the optimization if |\fIh\fR(\fIx\fR)| <= \fItol\fR. For equality constraints, a small positive tolerance is strongly advised in order to allow NLopt to converge even if the equality constraint is slightly nonzero. .sp (For any algorithm listed as "derivative-free" below, the .I grad argument to \fIfc\fR or \fIh\fR will always be NULL and need never be computed.) .sp To remove all of the inequality and/or equality constraints from a given problem \fIopt\fR, you can call the following functions: .sp .BI " nlopt_result nlopt_remove_inequality_constraints(nlopt_opt " "opt" ); .br .BI " nlopt_result nlopt_remove_equality_constraints(nlopt_opt " "opt" ); .SH ALGORITHMS The .I algorithm parameter specifies the optimization algorithm (for more detail on these, see the README files in the source-code subdirectories), and can take on any of the following constant values. .sp Constants with .B _G{N,D}_ in their names refer to global optimization methods, whereas .B _L{N,D}_ refers to local optimization methods (that try to find a local optimum starting from the starting guess .IR x ). Constants with .B _{G,L}N_ refer to non-gradient (derivative-free) algorithms that do not require the objective function to supply a gradient, whereas .B _{G,L}D_ refers to derivative-based algorithms that require the objective function to supply a gradient. (Especially for local optimization, derivative-based algorithms are generally superior to derivative-free ones: the gradient is good to have .I if you can compute it cheaply, e.g. via an adjoint method.) .sp The algorithm specified for a given problem .I opt is returned by the function: .sp .BI " nlopt_algorithm nlopt_get_algorithm(nlopt_opt " "opt" ); .sp The available algorithms are: .TP .B NLOPT_GN_DIRECT_L Perform a global (G) derivative-free (N) optimization using the DIRECT-L search algorithm by Jones et al. as modified by Gablonsky et al. to be more weighted towards local search. Does not support unconstrainted optimization. There are also several other variants of the DIRECT algorithm that are supported: .BR NLOPT_GN_DIRECT , which is the original DIRECT algorithm; .BR NLOPT_GN_DIRECT_L_RAND , a slightly randomized version of DIRECT-L that may be better in high-dimensional search spaces; .BR NLOPT_GN_DIRECT_NOSCAL , .BR NLOPT_GN_DIRECT_L_NOSCAL , and .BR NLOPT_GN_DIRECT_L_RAND_NOSCAL , which are versions of DIRECT where the dimensions are not rescaled to a unit hypercube (which means that dimensions with larger bounds are given more weight). .TP .B NLOPT_GN_ORIG_DIRECT_L A global (G) derivative-free optimization using the DIRECT-L algorithm as above, along with .B NLOPT_GN_ORIG_DIRECT which is the original DIRECT algorithm. Unlike .B NLOPT_GN_DIRECT_L above, these two algorithms refer to code based on the original Fortran code of Gablonsky et al., which has some hard-coded limitations on the number of subdivisions etc. and does not support all of the NLopt stopping criteria, but on the other hand it supports arbitrary nonlinear inequality constraints. .TP .B NLOPT_GD_STOGO Global (G) optimization using the StoGO algorithm by Madsen et al. StoGO exploits gradient information (D) (which must be supplied by the objective) for its local searches, and performs the global search by a branch-and-bound technique. Only bound-constrained optimization is supported. There is also another variant of this algorithm, .BR NLOPT_GD_STOGO_RAND , which is a randomized version of the StoGO search scheme. The StoGO algorithms are only available if NLopt is compiled with C++ code enabled, and should be linked via \-lnlopt_cxx instead of \-lnlopt (via a C++ compiler, in order to link the C++ standard libraries). .TP .B NLOPT_LN_NELDERMEAD Perform a local (L) derivative-free (N) optimization, starting at .IR x , using the Nelder-Mead simplex algorithm, modified to support bound constraints. Nelder-Mead, while popular, is known to occasionally fail to converge for some objective functions, so it should be used with caution. Anecdotal evidence, on the other hand, suggests that it works fairly well for some cases that are hard to handle otherwise, e.g. noisy/discontinuous objectives. See also .B NLOPT_LN_SBPLX below. .TP .B NLOPT_LN_SBPLX Perform a local (L) derivative-free (N) optimization, starting at .IR x , using an algorithm based on the Subplex algorithm of Rowan et al., which is an improved variant of Nelder-Mead (above). Our implementation does not use Rowan's original code, and has some minor modifications such as explicit support for bound constraints. (Like Nelder-Mead, Subplex often works well in practice, even for noisy/discontinuous objectives, but there is no rigorous guarantee that it will converge.) .TP .B NLOPT_LN_PRAXIS Local (L) derivative-free (N) optimization using the principal-axis method, based on code by Richard Brent. Designed for unconstrained optimization, although bound constraints are supported too (via the inefficient method of returning +Inf when the constraints are violated). .TP .B NLOPT_LD_LBFGS Local (L) gradient-based (D) optimization using the limited-memory BFGS (L-BFGS) algorithm. (The objective function must supply the gradient.) Unconstrained optimization is supported in addition to simple bound constraints (see above). Based on an implementation by Luksan et al. .TP .B NLOPT_LD_VAR2 Local (L) gradient-based (D) optimization using a shifted limited-memory variable-metric method based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. .B NLOPT_LD_VAR2 uses a rank-2 method, while .B .B NLOPT_LD_VAR1 is another variant using a rank-1 method. .TP .B NLOPT_LD_TNEWTON_PRECOND_RESTART Local (L) gradient-based (D) optimization using an LBFGS-preconditioned truncated Newton method with steepest-descent restarting, based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. There are several other variants of this algorithm: .B NLOPT_LD_TNEWTON_PRECOND (same without restarting), .B NLOPT_LD_TNEWTON_RESTART (same without preconditioning), and .B NLOPT_LD_TNEWTON (same without restarting or preconditioning). .TP .B NLOPT_GN_CRS2_LM Global (G) derivative-free (N) optimization using the controlled random search (CRS2) algorithm of Price, with the "local mutation" (LM) modification suggested by Kaelo and Ali. .TP .B NLOPT_GN_ISRES Global (G) derivative-free (N) optimization using a genetic algorithm (mutation and differential evolution), using a stochastic ranking to handle nonlinear inequality and equality constraints as suggested by Runarsson and Yao. .TP \fBNLOPT_G_MLSL_LDS\fR, \fBNLOPT_G_MLSL\fR Global (G) optimization using the multi-level single-linkage (MLSL) algorithm with a low-discrepancy sequence (LDS) or pseudorandom numbers, respectively. This algorithm executes a low-discrepancy or pseudorandom sequence of local searches, with a clustering heuristic to avoid multiple local searches for the same local optimum. The local search algorithm must be specified, along with termination criteria/tolerances for the local searches, by \fInlopt_set_local_optimizer\fR. (This subsidiary algorithm can be with or without derivatives, and determines whether the objective function needs gradients.) .TP \fBNLOPT_LD_MMA\fR, \fBNLOPT_LD_CCSAQ\fR Local (L) gradient-based (D) optimization using the method of moving asymptotes (MMA), or rather a refined version of the algorithm as published by Svanberg (2002). (NLopt uses an independent free-software/open-source implementation of Svanberg's algorithm.) CCSAQ is a related algorithm from Svanberg's paper which uses a local quadratic approximation rather than the more-complicated MMA model; the two usually have similar convergence rates. The .B NLOPT_LD_MMA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear inequality (not equality) constraints as described above. .TP .B NLOPT_LD_SLSQP Local (L) gradient-based (D) optimization using sequential quadratic programming and BFGS updates, supporting arbitrary nonlinear inequality and equality constraints, based on the code by Dieter Kraft (1988) adapted for use by the SciPy project. Note that this algorithm uses dense-matrix methods requiring O(\fIn\fR^2) storage and O(\fIn\fR^3) time, making it less practical for problems involving more than a few thousand parameters. .TP .B NLOPT_LN_COBYLA Local (L) derivative-free (N) optimization using the COBYLA algorithm of Powell (Constrained Optimization BY Linear Approximations). The .B NLOPT_LN_COBYLA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear inequality/equality constraints as described above. .TP .B NLOPT_LN_NEWUOA Local (L) derivative-free (N) optimization using a variant of the NEWUOA algorithm of Powell, based on successive quadratic approximations of the objective function. We have modified the algorithm to support bound constraints. The original NEWUOA algorithm is also available, as .BR NLOPT_LN_NEWUOA , but this algorithm ignores the bound constraints .I lb and .IR ub , and so it should only be used for unconstrained problems. Mostly superseded by BOBYQA. .TP .B NLOPT_LN_BOBYQA Local (L) derivative-free (N) optimization using the BOBYQA algorithm of Powell, based on successive quadratic approximations of the objective function, supporting bound constraints. .TP .B NLOPT_AUGLAG Optimize an objective with nonlinear inequality/equality constraints via an unconstrained (or bound-constrained) optimization algorithm, using a gradually increasing "augmented Lagrangian" penalty for violated constraints. Requires you to specify another optimization algorithm for optimizing the objective+penalty function, using \fInlopt_set_local_optimizer\fR. (This subsidiary algorithm can be global or local and with or without derivatives, but you must specify its own termination criteria.) A variant, \fBNLOPT_AUGLAG_EQ\fR, only uses the penalty approach for equality constraints, while inequality constraints are handled directly by the subsidiary algorithm (restricting the choice of subsidiary algorithms to those that can handle inequality constraints). .SH STOPPING CRITERIA Multiple stopping criteria for the optimization are supported, as specified by the functions to modify a given optimization problem .BR opt . The optimization halts whenever any one of these criteria is satisfied. In some cases, the precise interpretation of the stopping criterion depends on the optimization algorithm above (although we have tried to make them as consistent as reasonably possible), and some algorithms do not support all of the stopping criteria. .sp Important: you do not need to use all of the stopping criteria! In most cases, you only need one or two, and can omit the remainder (all criteria are disabled by default). .TP .BI "nlopt_result nlopt_set_stopval(nlopt_opt " "opt" , .br .BI " double " stopval ); .sp Stop when an objective value of at least .I stopval is found: stop minimizing when a value <= \fIstopval\fR is found, or stop maximizing when a value >= \fIstopval\fR is found. (Setting \fIstopval\fR to \-HUGE_VAL for minimizing or +HUGE_VAL for maximizing disables this stopping criterion.) .TP .BI "nlopt_result nlopt_set_ftol_rel(nlopt_opt " "opt" , .br .BI " double " tol ); .sp Set relative tolerance on function value: stop when an optimization step (or an estimate of the optimum) changes the function value by less than .I tol multiplied by the absolute value of the function value. (If there is any chance that your optimum function value is close to zero, you might want to set an absolute tolerance with .B nlopt_set_ftol_abs as well.) Criterion is disabled if \fItol\fR is non-positive. .TP .BI "nlopt_result nlopt_set_ftol_abs(nlopt_opt " "opt" , .br .BI " double " tol ); .sp Set absolute tolerance on function value: stop when an optimization step (or an estimate of the optimum) changes the function value by less than .IR tol . Criterion is disabled if \fItol\fR is non-positive. .TP .BI "nlopt_result nlopt_set_xtol_rel(nlopt_opt " "opt" , .br .BI " double " tol ); .sp Set relative tolerance on design variables: stop when an optimization step (or an estimate of the optimum) changes every design variable by less than .I tol multiplied by the absolute value of the design variable. (If there is any chance that an optimal design variable is close to zero, you might want to set an absolute tolerance with .B nlopt_set_xtol_abs as well.) Criterion is disabled if \fItol\fR is non-positive. .TP .BI "nlopt_result nlopt_set_xtol_abs(nlopt_opt " "opt" , .br .BI " const double* " tol ); .sp Set absolute tolerances on design variables. \fItol\fR is a pointer to an array of length .I n giving the tolerances: stop when an optimization step (or an estimate of the optimum) changes every design variable .IR x [i] by less than .IR tol [i]. .sp For convenience, the following function may be used to set the absolute tolerances in all \fIn\fR design variables to the same value: .sp .BI " nlopt_result nlopt_set_xtol_abs1(nlopt_opt " "opt" , .br .BI " double " tol ); .sp Criterion is disabled if \fItol\fR is non-positive. .TP .BI "nlopt_result nlopt_set_maxeval(nlopt_opt " "opt" , .br .BI " int " maxeval ); .sp Stop when the number of function evaluations exceeds .IR maxeval . (This is not a strict maximum: the number of function evaluations may exceed .I maxeval slightly, depending upon the algorithm.) Criterion is disabled if \fImaxeval\fR is non-positive. .TP .BI "nlopt_result nlopt_set_maxtime(nlopt_opt " "opt" , .br .BI " double " maxtime ); .sp Stop when the optimization time (in seconds) exceeds .IR maxtime . (This is not a strict maximum: the time may exceed .I maxtime slightly, depending upon the algorithm and on how slow your function evaluation is.) Criterion is disabled if \fImaxtime\fR is non-positive. .SH RETURN VALUE Most of the NLopt functions return an enumerated constant of type .BR nlopt_result , which takes on one of the following values: .SS Successful termination (positive return values): .TP .B NLOPT_SUCCESS Generic success return value. .TP .B NLOPT_STOPVAL_REACHED Optimization stopped because .I stopval (above) was reached. .TP .B NLOPT_FTOL_REACHED Optimization stopped because .I ftol_rel or .I ftol_abs (above) was reached. .TP .B NLOPT_XTOL_REACHED Optimization stopped because .I xtol_rel or .I xtol_abs (above) was reached. .TP .B NLOPT_MAXEVAL_REACHED Optimization stopped because .I maxeval (above) was reached. .TP .B NLOPT_MAXTIME_REACHED Optimization stopped because .I maxtime (above) was reached. .SS Error codes (negative return values): .TP .B NLOPT_FAILURE Generic failure code. .TP .B NLOPT_INVALID_ARGS Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera). .TP .B NLOPT_OUT_OF_MEMORY Ran out of memory. .TP .B NLOPT_ROUNDOFF_LIMITED Halted because roundoff errors limited progress. .TP .B NLOPT_FORCED_STOP Halted because the user called \fBnlopt_force_stop\fR(\fIopt\fR) on the optimization's \fBnlopt_opt\fR object \fIopt\fR from the user's objective function. .SH LOCAL OPTIMIZER Some of the algorithms, especially MLSL and AUGLAG, use a different optimization algorithm as a subroutine, typically for local optimization. You can change the local search algorithm and its tolerances by calling: .sp .BI " nlopt_result nlopt_set_local_optimizer(nlopt_opt " "opt" , .br .BI " const nlopt_opt " "local_opt" ); .sp Here, \fIlocal_opt\fR is another \fBnlopt_opt\fR object whose parameters are used to determine the local search algorithm and stopping criteria. (The objective function, bounds, and nonlinear-constraint parameters of \fIlocal_opt\fR are ignored.) The dimension \fIn\fR of \fIlocal_opt\fR must match that of \fIopt\fR. .sp This function makes a copy of the \fIlocal_opt\fR object, so you can freely destroy your original \fIlocal_opt\fR afterwards. .SH INITIAL STEP SIZE For derivative-free local-optimization algorithms, the optimizer must somehow decide on some initial step size to perturb \fIx\fR by when it begins the optimization. This step size should be big enough that the value of the objective changes significantly, but not too big if you want to find the local optimum nearest to \fIx\fR. By default, NLopt chooses this initial step size heuristically from the bounds, tolerances, and other information, but this may not always be the best choice. .sp You can modify the initial step size by calling: .sp .BI " nlopt_result nlopt_set_initial_step(nlopt_opt " "opt" , .br .BI " const double* " "dx" ); .sp Here, \fIdx\fR is an array of length \fIn\fR containing the (nonzero) initial step size for each component of the design parameters \fIx\fR. For convenience, if you want to set the step sizes in every direction to be the same value, you can instead call: .sp .BI " nlopt_result nlopt_set_initial_step1(nlopt_opt " "opt" , .br .BI " double " "dx" ); .SH STOCHASTIC POPULATION Several of the stochastic search algorithms (e.g., CRS, MLSL, and ISRES) start by generating some initial "population" of random points \fIx\fR. By default, this initial population size is chosen heuristically in some algorithm-specific way, but the initial population can by changed by calling: .sp .BI " nlopt_result nlopt_set_population(nlopt_opt " "opt" , .br .BI " unsigned " "pop" ); .sp (A \fIpop\fR of zero implies that the heuristic default will be used.) .SH PSEUDORANDOM NUMBERS For stochastic optimization algorithms, we use pseudorandom numbers generated by the Mersenne Twister algorithm, based on code from Makoto Matsumoto. By default, the seed for the random numbers is generated from the system time, so that they will be different each time you run the program. If you want to use deterministic random numbers, you can set the seed by calling: .sp .BI " void nlopt_srand(unsigned long " "seed" ); .sp Some of the algorithms also support using low-discrepancy sequences (LDS), sometimes known as quasi-random numbers. NLopt uses the Sobol LDS, which is implemented for up to 1111 dimensions. .SH AUTHORS Written by Steven G. Johnson. .PP Copyright (c) 2007-2014 Massachusetts Institute of Technology. .SH "SEE ALSO" nlopt_minimize(3) stevengj-nlopt-88c424d/src/api/nlopt.h000066400000000000000000000367131521061417600177150ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NLOPT_H #define NLOPT_H #include /* for ptrdiff_t and size_t */ /* Change 0 to 1 to use stdcall convention under Win32 */ #if 0 && (defined(_WIN32) || defined(__WIN32__)) # if defined(__GNUC__) # define NLOPT_STDCALL __attribute__((stdcall)) # elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED) # define NLOPT_STDCALL __stdcall # else # define NLOPT_STDCALL # endif #else # define NLOPT_STDCALL #endif /* for Windows compilers, you should add a line #define NLOPT_DLL when using NLopt from a DLL, in order to do the proper Windows importing nonsense. */ #if defined(NLOPT_DLL) && (defined(_WIN32) || defined(__WIN32__)) && !defined(__LCC__) /* annoying Windows syntax for calling functions in a DLL */ # if defined(NLOPT_DLL_EXPORT) # define NLOPT_EXTERN(T) extern __declspec(dllexport) T NLOPT_STDCALL # else # define NLOPT_EXTERN(T) extern __declspec(dllimport) T NLOPT_STDCALL # endif #else # define NLOPT_EXTERN(T) extern T NLOPT_STDCALL #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef double (*nlopt_func) (unsigned n, const double *x, double *gradient, /* NULL if not needed */ void *func_data); typedef void (*nlopt_mfunc) (unsigned m, double *result, unsigned n, const double *x, double *gradient, /* NULL if not needed */ void *func_data); /* A preconditioner, which preconditions v at x to return vpre. (The meaning of "preconditioning" is algorithm-dependent.) */ typedef void (*nlopt_precond) (unsigned n, const double *x, const double *v, double *vpre, void *data); typedef enum { /* Naming conventions: NLOPT_{G/L}{D/N}_* = global/local derivative/no-derivative optimization, respectively *_RAND algorithms involve some randomization. *_NOSCAL algorithms are *not* scaled to a unit hypercube (i.e. they are sensitive to the units of x) */ NLOPT_GN_DIRECT = 0, NLOPT_GN_DIRECT_L, NLOPT_GN_DIRECT_L_RAND, NLOPT_GN_DIRECT_NOSCAL, NLOPT_GN_DIRECT_L_NOSCAL, NLOPT_GN_DIRECT_L_RAND_NOSCAL, NLOPT_GN_ORIG_DIRECT, NLOPT_GN_ORIG_DIRECT_L, NLOPT_GD_STOGO, NLOPT_GD_STOGO_RAND, NLOPT_LD_LBFGS_NOCEDAL, NLOPT_LD_LBFGS, NLOPT_LN_PRAXIS, NLOPT_LD_VAR1, NLOPT_LD_VAR2, NLOPT_LD_TNEWTON, NLOPT_LD_TNEWTON_RESTART, NLOPT_LD_TNEWTON_PRECOND, NLOPT_LD_TNEWTON_PRECOND_RESTART, NLOPT_GN_CRS2_LM, NLOPT_GN_MLSL, NLOPT_GD_MLSL, NLOPT_GN_MLSL_LDS, NLOPT_GD_MLSL_LDS, NLOPT_LD_MMA, NLOPT_LN_COBYLA, NLOPT_LN_NEWUOA, NLOPT_LN_NEWUOA_BOUND, NLOPT_LN_NELDERMEAD, NLOPT_LN_SBPLX, NLOPT_LN_AUGLAG, NLOPT_LD_AUGLAG, NLOPT_LN_AUGLAG_EQ, NLOPT_LD_AUGLAG_EQ, NLOPT_LN_BOBYQA, NLOPT_GN_ISRES, /* new variants that require local_optimizer to be set, not with older constants for backwards compatibility */ NLOPT_AUGLAG, NLOPT_AUGLAG_EQ, NLOPT_G_MLSL, NLOPT_G_MLSL_LDS, NLOPT_LD_SLSQP, NLOPT_LD_CCSAQ, NLOPT_GN_ESCH, NLOPT_GN_AGS, NLOPT_NUM_ALGORITHMS /* not an algorithm, just the number of them */ } nlopt_algorithm; NLOPT_EXTERN(const char *) nlopt_algorithm_name(nlopt_algorithm a); /* nlopt_algorithm enum <-> string conversion */ NLOPT_EXTERN(const char *) nlopt_algorithm_to_string(nlopt_algorithm algorithm); NLOPT_EXTERN(nlopt_algorithm) nlopt_algorithm_from_string(const char *name); typedef enum { NLOPT_FAILURE = -1, /* generic failure code */ NLOPT_INVALID_ARGS = -2, NLOPT_OUT_OF_MEMORY = -3, NLOPT_ROUNDOFF_LIMITED = -4, NLOPT_FORCED_STOP = -5, NLOPT_NUM_FAILURES = -6, /* not a result, just the number of possible failures */ NLOPT_SUCCESS = 1, /* generic success code */ NLOPT_STOPVAL_REACHED = 2, NLOPT_FTOL_REACHED = 3, NLOPT_XTOL_REACHED = 4, NLOPT_MAXEVAL_REACHED = 5, NLOPT_MAXTIME_REACHED = 6, NLOPT_NUM_RESULTS /* not a result, just the number of possible successes */ } nlopt_result; /* nlopt_result enum <-> string conversion */ NLOPT_EXTERN(const char *) nlopt_result_to_string(nlopt_result algorithm); NLOPT_EXTERN(nlopt_result) nlopt_result_from_string(const char *name); #define NLOPT_MINF_MAX_REACHED NLOPT_STOPVAL_REACHED NLOPT_EXTERN(void) nlopt_srand(unsigned long seed); NLOPT_EXTERN(void) nlopt_srand_time(void); NLOPT_EXTERN(void) nlopt_version(int *major, int *minor, int *bugfix); /*************************** OBJECT-ORIENTED API **************************/ /* The style here is that we create an nlopt_opt "object" (an opaque pointer), then set various optimization parameters, and then execute the algorithm. In this way, we can add more and more optimization parameters (including algorithm-specific ones) without breaking backwards compatibility, having functions with zillions of parameters, or relying non-reentrantly on global variables.*/ struct nlopt_opt_s; /* opaque structure, defined internally */ typedef struct nlopt_opt_s *nlopt_opt; /* the only immutable parameters of an optimization are the algorithm and the dimension n of the problem, since changing either of these could have side-effects on lots of other parameters */ NLOPT_EXTERN(nlopt_opt) nlopt_create(nlopt_algorithm algorithm, unsigned n); NLOPT_EXTERN(void) nlopt_destroy(nlopt_opt opt); NLOPT_EXTERN(nlopt_opt) nlopt_copy(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_optimize(nlopt_opt opt, double *x, double *opt_f); NLOPT_EXTERN(nlopt_result) nlopt_set_min_objective(nlopt_opt opt, nlopt_func f, void *f_data); NLOPT_EXTERN(nlopt_result) nlopt_set_max_objective(nlopt_opt opt, nlopt_func f, void *f_data); NLOPT_EXTERN(nlopt_result) nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data); NLOPT_EXTERN(nlopt_result) nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data); NLOPT_EXTERN(nlopt_algorithm) nlopt_get_algorithm(const nlopt_opt opt); NLOPT_EXTERN(unsigned) nlopt_get_dimension(const nlopt_opt opt); NLOPT_EXTERN(const char *) nlopt_get_errmsg(nlopt_opt opt); /* generic algorithm parameters: */ NLOPT_EXTERN(nlopt_result) nlopt_set_param(nlopt_opt opt, const char *name, double val); NLOPT_EXTERN(double) nlopt_get_param(const nlopt_opt opt, const char *name, double defaultval); NLOPT_EXTERN(int) nlopt_has_param(const nlopt_opt opt, const char *name); NLOPT_EXTERN(unsigned) nlopt_num_params(const nlopt_opt opt); NLOPT_EXTERN(const char *) nlopt_nth_param(const nlopt_opt opt, unsigned n); /* constraints: */ NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds(nlopt_opt opt, const double *lb); NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds1(nlopt_opt opt, double lb); NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bound(nlopt_opt opt, int i, double lb); NLOPT_EXTERN(nlopt_result) nlopt_get_lower_bounds(const nlopt_opt opt, double *lb); NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds(nlopt_opt opt, const double *ub); NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds1(nlopt_opt opt, double ub); NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bound(nlopt_opt opt, int i, double ub); NLOPT_EXTERN(nlopt_result) nlopt_get_upper_bounds(const nlopt_opt opt, double *ub); NLOPT_EXTERN(nlopt_result) nlopt_remove_inequality_constraints(nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_constraint(nlopt_opt opt, nlopt_func fc, void *fc_data, double tol); NLOPT_EXTERN(nlopt_result) nlopt_add_precond_inequality_constraint(nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data, double tol); NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc fc, void *fc_data, const double *tol); NLOPT_EXTERN(nlopt_result) nlopt_remove_equality_constraints(nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_add_equality_constraint(nlopt_opt opt, nlopt_func h, void *h_data, double tol); NLOPT_EXTERN(nlopt_result) nlopt_add_precond_equality_constraint(nlopt_opt opt, nlopt_func h, nlopt_precond pre, void *h_data, double tol); NLOPT_EXTERN(nlopt_result) nlopt_add_equality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc h, void *h_data, const double *tol); /* stopping criteria: */ NLOPT_EXTERN(nlopt_result) nlopt_set_stopval(nlopt_opt opt, double stopval); NLOPT_EXTERN(double) nlopt_get_stopval(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_rel(nlopt_opt opt, double tol); NLOPT_EXTERN(double) nlopt_get_ftol_rel(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_abs(nlopt_opt opt, double tol); NLOPT_EXTERN(double) nlopt_get_ftol_abs(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_rel(nlopt_opt opt, double tol); NLOPT_EXTERN(double) nlopt_get_xtol_rel(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs1(nlopt_opt opt, double tol); NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs(nlopt_opt opt, const double *tol); NLOPT_EXTERN(nlopt_result) nlopt_get_xtol_abs(const nlopt_opt opt, double *tol); NLOPT_EXTERN(nlopt_result) nlopt_set_x_weights1(nlopt_opt opt, double w); NLOPT_EXTERN(nlopt_result) nlopt_set_x_weights(nlopt_opt opt, const double *w); NLOPT_EXTERN(nlopt_result) nlopt_get_x_weights(const nlopt_opt opt, double *w); NLOPT_EXTERN(nlopt_result) nlopt_set_maxeval(nlopt_opt opt, int maxeval); NLOPT_EXTERN(int) nlopt_get_maxeval(const nlopt_opt opt); NLOPT_EXTERN(int) nlopt_get_numevals(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_maxtime(nlopt_opt opt, double maxtime); NLOPT_EXTERN(double) nlopt_get_maxtime(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_force_stop(nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_force_stop(nlopt_opt opt, int val); NLOPT_EXTERN(int) nlopt_get_force_stop(const nlopt_opt opt); /* more algorithm-specific parameters */ NLOPT_EXTERN(nlopt_result) nlopt_set_local_optimizer(nlopt_opt opt, const nlopt_opt local_opt); NLOPT_EXTERN(nlopt_result) nlopt_set_population(nlopt_opt opt, unsigned pop); NLOPT_EXTERN(unsigned) nlopt_get_population(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_vector_storage(nlopt_opt opt, unsigned dim); NLOPT_EXTERN(unsigned) nlopt_get_vector_storage(const nlopt_opt opt); NLOPT_EXTERN(nlopt_result) nlopt_set_default_initial_step(nlopt_opt opt, const double *x); NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step(nlopt_opt opt, const double *dx); NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step1(nlopt_opt opt, double dx); NLOPT_EXTERN(nlopt_result) nlopt_get_initial_step(const nlopt_opt opt, const double *x, double *dx); /* the following are functions mainly designed to be used internally by the Fortran and SWIG wrappers, allow us to tel nlopt_destroy and nlopt_copy to do something to the f_data pointers (e.g. free or duplicate them, respectively) */ typedef void *(*nlopt_munge) (void *p); NLOPT_EXTERN(void) nlopt_set_munge(nlopt_opt opt, nlopt_munge munge_on_destroy, nlopt_munge munge_on_copy); typedef void *(*nlopt_munge2) (void *p, void *data); NLOPT_EXTERN(void) nlopt_munge_data(nlopt_opt opt, nlopt_munge2 munge, void *data); /*************************** DEPRECATED API **************************/ /* The new "object-oriented" API is preferred, since it allows us to gracefully add new features and algorithm-specific options in a re-entrant way, and we can automatically assume reasonable defaults for unspecified parameters. */ /* Where possible (e.g. for gcc >= 3.1), enable a compiler warning for code that uses a deprecated function */ #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__==3 && __GNUC_MINOR__ > 0)) # define NLOPT_DEPRECATED __attribute__((deprecated)) #else # define NLOPT_DEPRECATED #endif typedef double (*nlopt_func_old) (int n, const double *x, double *gradient, /* NULL if not needed */ void *func_data); NLOPT_EXTERN(nlopt_result) nlopt_minimize(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, int maxeval, double maxtime) NLOPT_DEPRECATED; NLOPT_EXTERN(nlopt_result) nlopt_minimize_constrained(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, int maxeval, double maxtime) NLOPT_DEPRECATED; NLOPT_EXTERN(nlopt_result) nlopt_minimize_econstrained(nlopt_algorithm algorithm, int n, nlopt_func_old f, void *f_data, int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size, int p, nlopt_func_old h, void *h_data, ptrdiff_t h_datum_size, const double *lb, const double *ub, /* bounds */ double *x, /* in: initial guess, out: minimizer */ double *minf, /* out: minimum */ double minf_max, double ftol_rel, double ftol_abs, double xtol_rel, const double *xtol_abs, double htol_rel, double htol_abs, int maxeval, double maxtime) NLOPT_DEPRECATED; NLOPT_EXTERN(void) nlopt_get_local_search_algorithm(nlopt_algorithm * deriv, nlopt_algorithm * nonderiv, int *maxeval) NLOPT_DEPRECATED; NLOPT_EXTERN(void) nlopt_set_local_search_algorithm(nlopt_algorithm deriv, nlopt_algorithm nonderiv, int maxeval) NLOPT_DEPRECATED; NLOPT_EXTERN(int) nlopt_get_stochastic_population(void) NLOPT_DEPRECATED; NLOPT_EXTERN(void) nlopt_set_stochastic_population(int pop) NLOPT_DEPRECATED; /*********************************************************************/ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/api/nlopt_minimize.3000066400000000000000000000427611521061417600215310ustar00rootroot00000000000000.\" .\" Copyright (c) 2007 Massachusetts Institute of Technology .\" .\" Copying and distribution of this file, with or without modification, .\" are permitted in any medium without royalty provided the copyright .\" notice and this notice are preserved. .\" .TH NLOPT_MINIMIZE 3 2007-08-23 "MIT" "NLopt programming manual" .SH NAME nlopt_minimize \- Minimize a multivariate nonlinear function .SH SYNOPSIS .nf .B #include .sp .BI "nlopt_result nlopt_minimize(nlopt_algorithm " "algorithm" , .br .BI " int " "n" , .BI " nlopt_func " "f" , .BI " void* " "f_data" , .BI " const double* " "lb" , .BI " const double* " "ub" , .BI " double* " "x" , .BI " double* " "minf" , .BI " double " "minf_max" , .BI " double " "ftol_rel" , .BI " double " "ftol_abs" , .BI " double " "xtol_rel" , .BI " const double* " "xtol_abs" , .BI " int " "maxeval" , .BI " double " "maxtime" ); .sp You should link the resulting program with the linker flags -lnlopt -lm on Unix. .fi .SH DESCRIPTION .BR nlopt_minimize () attempts to minimize a nonlinear function .I f of .I n design variables using the specified .IR algorithm . The minimum function value found is returned in .IR minf , with the corresponding design variable values returned in the array .I x of length .IR n . The input values in .I x should be a starting guess for the optimum. The inputs .I lb and .I ub are arrays of length .I n containing lower and upper bounds, respectively, on the design variables .IR x . The other parameters specify stopping criteria (tolerances, the maximum number of function evaluations, etcetera) and other information as described in more detail below. The return value is a integer code indicating success (positive) or failure (negative), as described below. .PP By changing the parameter .I algorithm among several predefined constants described below, one can switch easily between a variety of minimization algorithms. Some of these algorithms require the gradient (derivatives) of the function to be supplied via .IR f , and other algorithms do not require derivatives. Some of the algorithms attempt to find a global minimum within the given bounds, and others find only a local minimum. .PP The .B nlopt_minimize function is a wrapper around several free/open-source minimization packages. as well as some new implementations of published optimization algorithms. You could, of course, compile and call these packages separately, and in some cases this will provide greater flexibility than is available via the .B nlopt_minimize interface. However, depending upon the specific function being minimized, the different algorithms will vary in effectiveness. The intent of .B nlopt_minimize is to allow you to quickly switch between algorithms in order to experiment with them for your problem, by providing a simple unified interface to these subroutines. .SH OBJECTIVE FUNCTION .BR nlopt_minimize () minimizes an objective function .I f of the form: .sp .BI " double f(int " "n" , .br .BI " const double* " "x" , .br .BI " double* " "grad" , .br .BI " void* " "f_data" ); .sp The return value should be the value of the function at the point .IR x , where .I x points to an array of length .I n of the design variables. The dimension .I n is identical to the one passed to .BR nlopt_minimize (). .sp In addition, if the argument .I grad is not NULL, then .I grad points to an array of length .I n which should (upon return) be set to the gradient of the function with respect to the design variables at .IR x . That is, .IR grad[i] should upon return contain the partial derivative df/dx[i], for 0 <= i < n, if .I grad is non-NULL. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the .I grad argument will always be NULL and need never be computed. (For algorithms that do use gradient information, however, .I grad may still be NULL for some calls.) .sp The .I f_data argument is the same as the one passed to .BR nlopt_minimize (), and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from void* by a typecast.) .sp .SH CONSTRAINTS Most of the algorithms in NLopt are designed for minimization of functions with simple bound constraints on the inputs. That is, the input vectors x[i] are constrainted to lie in a hyperrectangle lb[i] <= x[i] <= ub[i] for 0 <= i < n, where .I lb and .I ub are the two arrays passed to .BR nlopt_minimize (). .sp However, a few of the algorithms support partially or totally unconstrained optimization, as noted below, where a (totally or partially) unconstrained design variable is indicated by a lower bound equal to -Inf and/or an upper bound equal to +Inf. Here, Inf is the IEEE-754 floating-point infinity, which (in ANSI C99) is represented by the macro INFINITY in math.h. Alternatively, for older C versions you may also use the macro HUGE_VAL (also in math.h). .sp With some of the algorithms, especially those that do not require derivative information, a simple (but not especially efficient) way to implement arbitrary nonlinear constraints is to return Inf (see above) whenever the constraints are violated by a given input .IR x . More generally, there are various ways to implement constraints by adding "penalty terms" to your objective function, which are described in the optimization literature. A much more efficient way to specify nonlinear constraints is provided by the .BR nlopt_minimize_constrained () function (described in its own manual page). .SH ALGORITHMS The .I algorithm parameter specifies the optimization algorithm (for more detail on these, see the README files in the source-code subdirectories), and can take on any of the following constant values. Constants with .B _G{N,D}_ in their names refer to global optimization methods, whereas .B _L{N,D}_ refers to local optimization methods (that try to find a local minimum starting from the starting guess .IR x ). Constants with .B _{G,L}N_ refer to non-gradient (derivative-free) algorithms that do not require the objective function to supply a gradient, whereas .B _{G,L}D_ refers to derivative-based algorithms that require the objective function to supply a gradient. (Especially for local optimization, derivative-based algorithms are generally superior to derivative-free ones: the gradient is good to have .I if you can compute it cheaply, e.g. via an adjoint method.) .TP .B NLOPT_GN_DIRECT_L Perform a global (G) derivative-free (N) optimization using the DIRECT-L search algorithm by Jones et al. as modified by Gablonsky et al. to be more weighted towards local search. Does not support unconstrainted optimization. There are also several other variants of the DIRECT algorithm that are supported: .BR NLOPT_GN_DIRECT , which is the original DIRECT algorithm; .BR NLOPT_GN_DIRECT_L_RAND , a slightly randomized version of DIRECT-L that may be better in high-dimensional search spaces; .BR NLOPT_GN_DIRECT_NOSCAL , .BR NLOPT_GN_DIRECT_L_NOSCAL , and .BR NLOPT_GN_DIRECT_L_RAND_NOSCAL , which are versions of DIRECT where the dimensions are not rescaled to a unit hypercube (which means that dimensions with larger bounds are given more weight). .TP .B NLOPT_GN_ORIG_DIRECT_L A global (G) derivative-free optimization using the DIRECT-L algorithm as above, along with .B NLOPT_GN_ORIG_DIRECT which is the original DIRECT algorithm. Unlike .B NLOPT_GN_DIRECT_L above, these two algorithms refer to code based on the original Fortran code of Gablonsky et al., which has some hard-coded limitations on the number of subdivisions etc. and does not support all of the NLopt stopping criteria, but on the other hand supports arbitrary nonlinear constraints as described above. .TP .B NLOPT_GD_STOGO Global (G) optimization using the StoGO algorithm by Madsen et al. StoGO exploits gradient information (D) (which must be supplied by the objective) for its local searches, and performs the global search by a branch-and-bound technique. Only bound-constrained optimization is supported. There is also another variant of this algorithm, .BR NLOPT_GD_STOGO_RAND , which is a randomized version of the StoGO search scheme. The StoGO algorithms are only available if NLopt is compiled with C++ enabled, and should be linked via -lnlopt_cxx (via a C++ compiler, in order to link the C++ standard libraries). .TP .B NLOPT_LN_NELDERMEAD Perform a local (L) derivative-free (N) optimization, starting at .IR x , using the Nelder-Mead simplex algorithm, modified to support bound constraints. Nelder-Mead, while popular, is known to occasionally fail to converge for some objective functions, so it should be used with caution. Anecdotal evidence, on the other hand, suggests that it works fairly well for discontinuous objectives. See also .B NLOPT_LN_SBPLX below. .TP .B NLOPT_LN_SBPLX Perform a local (L) derivative-free (N) optimization, starting at .IR x , using an algorithm based on the Subplex algorithm of Rowan et al., which is an improved variant of Nelder-Mead (above). Our implementation does not use Rowan's original code, and has some minor modifications such as explicit support for bound constraints. (Like Nelder-Mead, Subplex often works well in practice, even for discontinuous objectives, but there is no rigorous guarantee that it will converge.) Nonlinear constraints can be crudely supported by returning +Inf when the constraints are violated, as explained above. .TP .B NLOPT_LN_PRAXIS Local (L) derivative-free (N) optimization using the principal-axis method, based on code by Richard Brent. Designed for unconstrained optimization, although bound constraints are supported too (via the inefficient method of returning +Inf when the constraints are violated). .TP .B NLOPT_LD_LBFGS Local (L) gradient-based (D) optimization using the limited-memory BFGS (L-BFGS) algorithm. (The objective function must supply the gradient.) Unconstrained optimization is supported in addition to simple bound constraints (see above). Based on an implementation by Luksan et al. .TP .B NLOPT_LD_VAR2 Local (L) gradient-based (D) optimization using a shifted limited-memory variable-metric method based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. .B NLOPT_LD_VAR2 uses a rank-2 method, while .B .B NLOPT_LD_VAR1 is another variant using a rank-1 method. .TP .B NLOPT_LD_TNEWTON_PRECOND_RESTART Local (L) gradient-based (D) optimization using an LBFGS-preconditioned truncated Newton method with steepest-descent restarting, based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. There are several other variants of this algorithm: .B NLOPT_LD_TNEWTON_PRECOND (same without restarting), .B NLOPT_LD_TNEWTON_RESTART (same without preconditioning), and .B NLOPT_LD_TNEWTON (same without restarting or preconditioning). .TP .B NLOPT_GN_CRS2_LM Global (G) derivative-free (N) optimization using the controlled random search (CRS2) algorithm of Price, with the "local mutation" (LM) modification suggested by Kaelo and Ali. .TP \fBNLOPT_GD_MLSL_LDS\fR, \fBNLOPT_GN_MLSL_LDS\fR Global (G) derivative-based (D) or derivative-free (N) optimization using the multi-level single-linkage (MLSL) algorithm with a low-discrepancy sequence (LDS). This algorithm executes a quasi-random (LDS) sequence of local searches, with a clustering heuristic to avoid multiple local searches for the same local minimum. The local search uses the derivative/nonderivative algorithm set by .I nlopt_set_local_search_algorithm (currently defaulting to .I NLOPT_LD_MMA and .I NLOPT_LN_COBYLA for derivative/nonderivative searches, respectively). There are also two other variants, \fBNLOPT_GD_MLSL\fR and \fBNLOPT_GN_MLSL\fR, which use pseudo-random numbers (instead of an LDS) as in the original MLSL algorithm. .TP .B NLOPT_LD_MMA Local (L) gradient-based (D) optimization using the method of moving asymptotes (MMA), or rather a refined version of the algorithm as published by Svanberg (2002). (NLopt uses an independent free-software/open-source implementation of Svanberg's algorithm.) The .B NLOPT_LD_MMA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear constraints via the .BR nlopt_minimize_constrained () function. .TP .B NLOPT_LN_COBYLA Local (L) derivative-free (N) optimization using the COBYLA algorithm of Powell (Constrained Optimization BY Linear Approximations). The .B NLOPT_LN_COBYLA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear constraints via the .BR nlopt_minimize_constrained () function. .TP .B NLOPT_LN_NEWUOA_BOUND Local (L) derivative-free (N) optimization using a variant of the the NEWUOA algorithm of Powell, based on successive quadratic approximations of the objective function. We have modified the algorithm to support bound constraints. The original NEWUOA algorithm is also available, as .BR NLOPT_LN_NEWUOA , but this algorithm ignores the bound constraints .I lb and .IR ub , and so it should only be used for unconstrained problems. .SH STOPPING CRITERIA Multiple stopping criteria for the optimization are supported, as specified by the following arguments to .BR nlopt_minimize (). The optimization halts whenever any one of these criteria is satisfied. In some cases, the precise interpretation of the stopping criterion depends on the optimization algorithm above (although we have tried to make them as consistent as reasonably possible), and some algorithms do not support all of the stopping criteria. .TP .B minf_max Stop when a function value less than or equal to .I minf_max is found. Set to -Inf or NaN (see constraints section above) to disable. .TP .B ftol_rel Relative tolerance on function value: stop when an optimization step (or an estimate of the minimum) changes the function value by less than .I ftol_rel multiplied by the absolute value of the function value. (If there is any chance that your minimum function value is close to zero, you might want to set an absolute tolerance with .I ftol_abs as well.) Disabled if non-positive. .TP .B ftol_abs Absolute tolerance on function value: stop when an optimization step (or an estimate of the minimum) changes the function value by less than .IR ftol_abs . Disabled if non-positive. .TP .B xtol_rel Relative tolerance on design variables: stop when an optimization step (or an estimate of the minimum) changes every design variable by less than .I xtol_rel multiplied by the absolute value of the design variable. (If there is any chance that an optimal design variable is close to zero, you might want to set an absolute tolerance with .I xtol_abs as well.) Disabled if non-positive. .TP .B xtol_abs Pointer to an array of length .I n giving absolute tolerances on design variables: stop when an optimization step (or an estimate of the minimum) changes every design variable .IR x [i] by less than .IR xtol_abs [i]. Disabled if non-positive, or if .I xtol_abs is NULL. .TP .B maxeval Stop when the number of function evaluations exceeds .IR maxeval . (This is not a strict maximum: the number of function evaluations may exceed .I maxeval slightly, depending upon the algorithm.) Disabled if non-positive. .TP .B maxtime Stop when the optimization time (in seconds) exceeds .IR maxtime . (This is not a strict maximum: the time may exceed .I maxtime slightly, depending upon the algorithm and on how slow your function evaluation is.) Disabled if non-positive. .SH RETURN VALUE The value returned is one of the following enumerated constants. .SS Successful termination (positive return values): .TP .B NLOPT_SUCCESS Generic success return value. .TP .B NLOPT_MINF_MAX_REACHED Optimization stopped because .I minf_max (above) was reached. .TP .B NLOPT_FTOL_REACHED Optimization stopped because .I ftol_rel or .I ftol_abs (above) was reached. .TP .B NLOPT_XTOL_REACHED Optimization stopped because .I xtol_rel or .I xtol_abs (above) was reached. .TP .B NLOPT_MAXEVAL_REACHED Optimization stopped because .I maxeval (above) was reached. .TP .B NLOPT_MAXTIME_REACHED Optimization stopped because .I maxtime (above) was reached. .SS Error codes (negative return values): .TP .B NLOPT_FAILURE Generic failure code. .TP .B NLOPT_INVALID_ARGS Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera). .TP .B NLOPT_OUT_OF_MEMORY Ran out of memory. .SH PSEUDORANDOM NUMBERS For stochastic optimization algorithms, we use pseudorandom numbers generated by the Mersenne Twister algorithm, based on code from Makoto Matsumoto. By default, the seed for the random numbers is generated from the system time, so that they will be different each time you run the program. If you want to use deterministic random numbers, you can set the seed by calling: .sp .BI " void nlopt_srand(unsigned long " "seed" ); .sp Some of the algorithms also support using low-discrepancy sequences (LDS), sometimes known as quasi-random numbers. NLopt uses the Sobol LDS, which is implemented for up to 1111 dimensions. .BR maxeval . .SH AUTHORS Written by Steven G. Johnson. .PP Copyright (c) 2007 Massachusetts Institute of Technology. .SH "SEE ALSO" nlopt_minimize_constrained(3) stevengj-nlopt-88c424d/src/api/nlopt_minimize_constrained.3000066400000000000000000000504561521061417600241220ustar00rootroot00000000000000.\" .\" Copyright (c) 2007 Massachusetts Institute of Technology .\" .\" Copying and distribution of this file, with or without modification, .\" are permitted in any medium without royalty provided the copyright .\" notice and this notice are preserved. .\" .TH NLOPT_MINIMIZE_CONSTRAINED 3 2007-08-23 "MIT" "NLopt programming manual" .SH NAME nlopt_minimize_constrained \- Minimize a multivariate nonlinear function subject to nonlinear constraints .SH SYNOPSIS .nf .B #include .sp .BI "nlopt_result nlopt_minimize_constrained(nlopt_algorithm " "algorithm" , .br .BI " int " "n" , .BI " nlopt_func " "f" , .BI " void* " "f_data" , .BI " int " "m" , .BI " nlopt_func " "fc" , .BI " void* " "fc_data" , .BI " ptrdiff_t " "fc_datum_size" , .BI " const double* " "lb" , .BI " const double* " "ub" , .BI " double* " "x" , .BI " double* " "minf" , .BI " double " "minf_max" , .BI " double " "ftol_rel" , .BI " double " "ftol_abs" , .BI " double " "xtol_rel" , .BI " const double* " "xtol_abs" , .BI " int " "maxeval" , .BI " double " "maxtime" ); .sp You should link the resulting program with the linker flags -lnlopt -lm on Unix. .fi .SH DESCRIPTION .BR nlopt_minimize_constrained () attempts to minimize a nonlinear function .I f of .I n design variables, subject to .I m nonlinear constraints described by the function .I fc (see below), using the specified .IR algorithm . The minimum function value found is returned in .IR minf , with the corresponding design variable values returned in the array .I x of length .IR n . The input values in .I x should be a starting guess for the optimum. The inputs .I lb and .I ub are arrays of length .I n containing lower and upper bounds, respectively, on the design variables .IR x . The other parameters specify stopping criteria (tolerances, the maximum number of function evaluations, etcetera) and other information as described in more detail below. The return value is a integer code indicating success (positive) or failure (negative), as described below. .PP By changing the parameter .I algorithm among several predefined constants described below, one can switch easily between a variety of minimization algorithms. Some of these algorithms require the gradient (derivatives) of the function to be supplied via .IR f , and other algorithms do not require derivatives. Some of the algorithms attempt to find a global minimum within the given bounds, and others find only a local minimum. Most of the algorithms only handle the case where .I m is zero (no explicit nonlinear constraints); the only algorithms that currently support positive .I m are .B NLOPT_LD_MMA and .BR NLOPT_LN_COBYLA . .PP The .B nlopt_minimize_constrained function is a wrapper around several free/open-source minimization packages, as well as some new implementations of published optimization algorithms. You could, of course, compile and call these packages separately, and in some cases this will provide greater flexibility than is available via the .B nlopt_minimize_constrained interface. However, depending upon the specific function being minimized, the different algorithms will vary in effectiveness. The intent of .B nlopt_minimize_constrained is to allow you to quickly switch between algorithms in order to experiment with them for your problem, by providing a simple unified interface to these subroutines. .SH OBJECTIVE FUNCTION .BR nlopt_minimize_constrained () minimizes an objective function .I f of the form: .sp .BI " double f(int " "n" , .br .BI " const double* " "x" , .br .BI " double* " "grad" , .br .BI " void* " "f_data" ); .sp The return value should be the value of the function at the point .IR x , where .I x points to an array of length .I n of the design variables. The dimension .I n is identical to the one passed to .BR nlopt_minimize_constrained (). .sp In addition, if the argument .I grad is not NULL, then .I grad points to an array of length .I n which should (upon return) be set to the gradient of the function with respect to the design variables at .IR x . That is, .IR grad[i] should upon return contain the partial derivative df/dx[i], for 0 <= i < n, if .I grad is non-NULL. Not all of the optimization algorithms (below) use the gradient information: for algorithms listed as "derivative-free," the .I grad argument will always be NULL and need never be computed. (For algorithms that do use gradient information, however, .I grad may still be NULL for some calls.) .sp The .I f_data argument is the same as the one passed to .BR nlopt_minimize_constrained (), and may be used to pass any additional data through to the function. (That is, it may be a pointer to some caller-defined data structure/type containing information your function needs, which you convert from void* by a typecast.) .sp .SH BOUND CONSTRAINTS Most of the algorithms in NLopt are designed for minimization of functions with simple bound constraints on the inputs. That is, the input vectors x[i] are constrainted to lie in a hyperrectangle lb[i] <= x[i] <= ub[i] for 0 <= i < n, where .I lb and .I ub are the two arrays passed to .BR nlopt_minimize_constrained (). .sp However, a few of the algorithms support partially or totally unconstrained optimization, as noted below, where a (totally or partially) unconstrained design variable is indicated by a lower bound equal to -Inf and/or an upper bound equal to +Inf. Here, Inf is the IEEE-754 floating-point infinity, which (in ANSI C99) is represented by the macro INFINITY in math.h. Alternatively, for older C versions you may also use the macro HUGE_VAL (also in math.h). .sp With some of the algorithms, especially those that do not require derivative information, a simple (but not especially efficient) way to implement arbitrary nonlinear constraints is to return Inf (see above) whenever the constraints are violated by a given input .IR x . More generally, there are various ways to implement constraints by adding "penalty terms" to your objective function, which are described in the optimization literature. A much more efficient way to specify nonlinear constraints is described below, but is only supported by a small subset of the algorithms. .SH NONLINEAR CONSTRAINTS The .B nlopt_minimize_constrained function also allows you to specify .I m nonlinear constraints via the function .IR fc , where .I m is any nonnegative integer. However, nonzero .I m is currently only supported by the .B NLOPT_LD_MMA and .B NLOPT_LN_COBYLA algorithms below. .sp In particular, the nonlinear constraints are of the form \fIfc\fR(\fIx\fR) <= 0, where the function .I fc is of the same form as the objective function described above: .sp .BI " double fc(int " "n" , .br .BI " const double* " "x" , .br .BI " double* " "grad" , .br .BI " void* " "fc_datum" ); .sp The return value should be the value of the constraint at the point .IR x , where the dimension .I n is identical to the one passed to .BR nlopt_minimize_constrained (). As for the objective function, if the argument .I grad is not NULL, then .I grad points to an array of length .I n which should (upon return) be set to the gradient of the function with respect to .IR x . (For any algorithm listed as "derivative-free" below, the .I grad argument will always be NULL and need never be computed.) .sp The .I fc_datum argument is based on the .I fc_data argument passed to .BR nlopt_minimize_constrained (), and may be used to pass any additional data through to the function, and is used to distinguish between different constraints. .sp In particular, the constraint function .I fc will be called (at most) .I m times for each .IR x , and the i-th constraint (0 <= i < .IR m ) will be passed an .I fc_datum argument equal to .I fc_data offset by i * .IR fc_datum_size . For example, suppose that you have a data structure of type "foo" that describes the data needed by each constraint, and you store the information for the constraints in an array "foo data[m]". In this case, you would pass "data" as the .I fc_data parameter to .BR nlopt_minimize_constrained , and "sizeof(foo)" as the .I fc_datum_size parameter. Then, your .I fc function would be called .I m times for each point, and be passed &data[0] through &data[m-1] in sequence. .SH ALGORITHMS The .I algorithm parameter specifies the optimization algorithm (for more detail on these, see the README files in the source-code subdirectories), and can take on any of the following constant values. Constants with .B _G{N,D}_ in their names refer to global optimization methods, whereas .B _L{N,D}_ refers to local optimization methods (that try to find a local minimum starting from the starting guess .IR x ). Constants with .B _{G,L}N_ refer to non-gradient (derivative-free) algorithms that do not require the objective function to supply a gradient, whereas .B _{G,L}D_ refers to derivative-based algorithms that require the objective function to supply a gradient. (Especially for local optimization, derivative-based algorithms are generally superior to derivative-free ones: the gradient is good to have .I if you can compute it cheaply, e.g. via an adjoint method.) .TP .B NLOPT_GN_DIRECT_L Perform a global (G) derivative-free (N) optimization using the DIRECT-L search algorithm by Jones et al. as modified by Gablonsky et al. to be more weighted towards local search. Does not support unconstrainted optimization. There are also several other variants of the DIRECT algorithm that are supported: .BR NLOPT_GN_DIRECT , which is the original DIRECT algorithm; .BR NLOPT_GN_DIRECT_L_RAND , a slightly randomized version of DIRECT-L that may be better in high-dimensional search spaces; .BR NLOPT_GN_DIRECT_NOSCAL , .BR NLOPT_GN_DIRECT_L_NOSCAL , and .BR NLOPT_GN_DIRECT_L_RAND_NOSCAL , which are versions of DIRECT where the dimensions are not rescaled to a unit hypercube (which means that dimensions with larger bounds are given more weight). .TP .B NLOPT_GN_ORIG_DIRECT_L A global (G) derivative-free optimization using the DIRECT-L algorithm as above, along with .B NLOPT_GN_ORIG_DIRECT which is the original DIRECT algorithm. Unlike .B NLOPT_GN_DIRECT_L above, these two algorithms refer to code based on the original Fortran code of Gablonsky et al., which has some hard-coded limitations on the number of subdivisions etc. and does not support all of the NLopt stopping criteria, but on the other hand supports arbitrary nonlinear constraints as described above. .TP .B NLOPT_GD_STOGO Global (G) optimization using the StoGO algorithm by Madsen et al. StoGO exploits gradient information (D) (which must be supplied by the objective) for its local searches, and performs the global search by a branch-and-bound technique. Only bound-constrained optimization is supported. There is also another variant of this algorithm, .BR NLOPT_GD_STOGO_RAND , which is a randomized version of the StoGO search scheme. The StoGO algorithms are only available if NLopt is compiled with C++ enabled, and should be linked via -lnlopt_cxx (via a C++ compiler, in order to link the C++ standard libraries). .TP .B NLOPT_LN_NELDERMEAD Perform a local (L) derivative-free (N) optimization, starting at .IR x , using the Nelder-Mead simplex algorithm, modified to support bound constraints. Nelder-Mead, while popular, is known to occasionally fail to converge for some objective functions, so it should be used with caution. Anecdotal evidence, on the other hand, suggests that it works fairly well for discontinuous objectives. See also .B NLOPT_LN_SBPLX below. .TP .B NLOPT_LN_SBPLX Perform a local (L) derivative-free (N) optimization, starting at .IR x , using an algorithm based on the Subplex algorithm of Rowan et al., which is an improved variant of Nelder-Mead (above). Our implementation does not use Rowan's original code, and has some minor modifications such as explicit support for bound constraints. (Like Nelder-Mead, Subplex often works well in practice, even for discontinuous objectives, but there is no rigorous guarantee that it will converge.) Nonlinear constraints can be crudely supported by returning +Inf when the constraints are violated, as explained above. .TP .B NLOPT_LN_PRAXIS Local (L) derivative-free (N) optimization using the principal-axis method, based on code by Richard Brent. Designed for unconstrained optimization, although bound constraints are supported too (via the inefficient method of returning +Inf when the constraints are violated). .TP .B NLOPT_LD_LBFGS Local (L) gradient-based (D) optimization using the limited-memory BFGS (L-BFGS) algorithm. (The objective function must supply the gradient.) Unconstrained optimization is supported in addition to simple bound constraints (see above). Based on an implementation by Luksan et al. .TP .B NLOPT_LD_VAR2 Local (L) gradient-based (D) optimization using a shifted limited-memory variable-metric method based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. .B NLOPT_LD_VAR2 uses a rank-2 method, while .B .B NLOPT_LD_VAR1 is another variant using a rank-1 method. .TP .B NLOPT_LD_TNEWTON_PRECOND_RESTART Local (L) gradient-based (D) optimization using an LBFGS-preconditioned truncated Newton method with steepest-descent restarting, based on code by Luksan et al., supporting both unconstrained and bound-constrained optimization. There are several other variants of this algorithm: .B NLOPT_LD_TNEWTON_PRECOND (same without restarting), .B NLOPT_LD_TNEWTON_RESTART (same without preconditioning), and .B NLOPT_LD_TNEWTON (same without restarting or preconditioning). .TP .B NLOPT_GN_CRS2_LM Global (G) derivative-free (N) optimization using the controlled random search (CRS2) algorithm of Price, with the "local mutation" (LM) modification suggested by Kaelo and Ali. .TP \fBNLOPT_GD_MLSL_LDS\fR, \fBNLOPT_GN_MLSL_LDS\fR Global (G) derivative-based (D) or derivative-free (N) optimization using the multi-level single-linkage (MLSL) algorithm with a low-discrepancy sequence (LDS). This algorithm executes a quasi-random (LDS) sequence of local searches, with a clustering heuristic to avoid multiple local searches for the same local minimum. The local search uses the derivative/nonderivative algorithm set by .I nlopt_set_local_search_algorithm (currently defaulting to .I NLOPT_LD_MMA and .I NLOPT_LN_COBYLA for derivative/nonderivative searches, respectively). There are also two other variants, \fBNLOPT_GD_MLSL\fR and \fBNLOPT_GN_MLSL\fR, which use pseudo-random numbers (instead of an LDS) as in the original MLSL algorithm. .TP .B NLOPT_LD_MMA Local (L) gradient-based (D) optimization using the method of moving asymptotes (MMA), or rather a refined version of the algorithm as published by Svanberg (2002). (NLopt uses an independent free-software/open-source implementation of Svanberg's algorithm.) The .B NLOPT_LD_MMA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear constraints as described above. .TP .B NLOPT_LN_COBYLA Local (L) derivative-free (N) optimization using the COBYLA algorithm of Powell (Constrained Optimization BY Linear Approximations). The .B NLOPT_LN_COBYLA algorithm supports both bound-constrained and unconstrained optimization, and also supports an arbitrary number (\fIm\fR) of nonlinear constraints as described above. .TP .B NLOPT_LN_NEWUOA Local (L) derivative-free (N) optimization using a variant of the the NEWUOA algorithm of Powell, based on successive quadratic approximations of the objective function. We have modified the algorithm to support bound constraints. The original NEWUOA algorithm is also available, as .BR NLOPT_LN_NEWUOA , but this algorithm ignores the bound constraints .I lb and .IR ub , and so it should only be used for unconstrained problems. .SH STOPPING CRITERIA Multiple stopping criteria for the optimization are supported, as specified by the following arguments to .BR nlopt_minimize_constrained (). The optimization halts whenever any one of these criteria is satisfied. In some cases, the precise interpretation of the stopping criterion depends on the optimization algorithm above (although we have tried to make them as consistent as reasonably possible), and some algorithms do not support all of the stopping criteria. .sp Important: you do not need to use all of the stopping criteria! In most cases, you only need one or two, and can set the remainder to values where they do nothing (as described below). .TP .B minf_max Stop when a function value less than or equal to .I minf_max is found. Set to -Inf or NaN (see constraints section above) to disable. .TP .B ftol_rel Relative tolerance on function value: stop when an optimization step (or an estimate of the minimum) changes the function value by less than .I ftol_rel multiplied by the absolute value of the function value. (If there is any chance that your minimum function value is close to zero, you might want to set an absolute tolerance with .I ftol_abs as well.) Disabled if non-positive. .TP .B ftol_abs Absolute tolerance on function value: stop when an optimization step (or an estimate of the minimum) changes the function value by less than .IR ftol_abs . Disabled if non-positive. .TP .B xtol_rel Relative tolerance on design variables: stop when an optimization step (or an estimate of the minimum) changes every design variable by less than .I xtol_rel multiplied by the absolute value of the design variable. (If there is any chance that an optimal design variable is close to zero, you might want to set an absolute tolerance with .I xtol_abs as well.) Disabled if non-positive. .TP .B xtol_abs Pointer to an array of length .I n giving absolute tolerances on design variables: stop when an optimization step (or an estimate of the minimum) changes every design variable .IR x [i] by less than .IR xtol_abs [i]. Disabled if non-positive, or if .I xtol_abs is NULL. .TP .B maxeval Stop when the number of function evaluations exceeds .IR maxeval . (This is not a strict maximum: the number of function evaluations may exceed .I maxeval slightly, depending upon the algorithm.) Disabled if non-positive. .TP .B maxtime Stop when the optimization time (in seconds) exceeds .IR maxtime . (This is not a strict maximum: the time may exceed .I maxtime slightly, depending upon the algorithm and on how slow your function evaluation is.) Disabled if non-positive. .SH RETURN VALUE The value returned is one of the following enumerated constants. .SS Successful termination (positive return values): .TP .B NLOPT_SUCCESS Generic success return value. .TP .B NLOPT_MINF_MAX_REACHED Optimization stopped because .I minf_max (above) was reached. .TP .B NLOPT_FTOL_REACHED Optimization stopped because .I ftol_rel or .I ftol_abs (above) was reached. .TP .B NLOPT_XTOL_REACHED Optimization stopped because .I xtol_rel or .I xtol_abs (above) was reached. .TP .B NLOPT_MAXEVAL_REACHED Optimization stopped because .I maxeval (above) was reached. .TP .B NLOPT_MAXTIME_REACHED Optimization stopped because .I maxtime (above) was reached. .SS Error codes (negative return values): .TP .B NLOPT_FAILURE Generic failure code. .TP .B NLOPT_INVALID_ARGS Invalid arguments (e.g. lower bounds are bigger than upper bounds, an unknown algorithm was specified, etcetera). .TP .B NLOPT_OUT_OF_MEMORY Ran out of memory. .SH PSEUDORANDOM NUMBERS For stochastic optimization algorithms, we use pseudorandom numbers generated by the Mersenne Twister algorithm, based on code from Makoto Matsumoto. By default, the seed for the random numbers is generated from the system time, so that they will be different each time you run the program. If you want to use deterministic random numbers, you can set the seed by calling: .sp .BI " void nlopt_srand(unsigned long " "seed" ); .sp Some of the algorithms also support using low-discrepancy sequences (LDS), sometimes known as quasi-random numbers. NLopt uses the Sobol LDS, which is implemented for up to 1111 dimensions. .SH AUTHORS Written by Steven G. Johnson. .PP Copyright (c) 2007-2014 Massachusetts Institute of Technology. .SH "SEE ALSO" nlopt_minimize(3) stevengj-nlopt-88c424d/src/api/optimize.c000066400000000000000000001134411521061417600204060ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "nlopt-internal.h" /*********************************************************************/ #include "praxis.h" #include "direct.h" #ifdef NLOPT_CXX #include "stogo.h" #include "ags.h" #endif #include "cdirect.h" #ifdef NLOPT_LUKSAN #include "luksan.h" #endif #include "crs.h" #include "mlsl.h" #include "mma.h" #include "cobyla.h" #include "newuoa.h" #include "neldermead.h" #include "auglag.h" #include "bobyqa.h" #include "isres.h" #include "esch.h" #include "slsqp.h" /*********************************************************************/ /* to emulate box constraint support with variable transform */ static void x_bound_inv(int n, double *x, const double *lb, const double *ub) { int i; double mid, width, v; if (!lb || !ub) return; for (i = 0; i < n; ++ i) { if (!nlopt_isinf(lb[i]) && !nlopt_isinf(ub[i])) { mid = (lb[i] + ub[i]) * 0.5; width = (ub[i] - lb[i]) * 0.5; v = (x[i] - mid) / width; if (v <= -1.0) v = -1.0 + 1e-12; if (v >= 1.0) v = 1.0 - 1e-12; x[i] = atanh(v); } else if (!nlopt_isinf(lb[i])) x[i] = (x[i] > lb[i]) ? sqrt(x[i] - lb[i]) : 0.0; else if (!nlopt_isinf(ub[i])) x[i] = (x[i] < ub[i]) ? sqrt(ub[i] - x[i]) : 0.0; } } static void x_bound(int n, double *x, const double *lb, const double *ub) { int i; double mid, width, th; if (!lb || !ub) return; for (i = 0; i < n; ++ i) { if (!nlopt_isinf(lb[i]) && !nlopt_isinf(ub[i])) { mid = (lb[i] + ub[i]) * 0.5; width = (ub[i] - lb[i]) * 0.5; th = tanh(x[i]); x[i] = mid + th * width; } else if (!nlopt_isinf(lb[i])) x[i] = lb[i] + x[i] * x[i]; else if (!nlopt_isinf(ub[i])) x[i] = ub[i] - x[i] * x[i]; } } static double f_bound(int n, const double *x, void *data_) { nlopt_opt data = (nlopt_opt) data_; double f; double *x_tr = NULL; x_tr = (double *) malloc(n * sizeof(double)); memcpy(x_tr, x, n * sizeof(double)); x_bound(n, x_tr, data->lb, data->ub); f = data->f((unsigned) n, x_tr, NULL, data->f_data); free(x_tr); return f; } /*********************************************************************/ static double f_noderiv(int n, const double *x, void *data_) { nlopt_opt data = (nlopt_opt) data_; return data->f((unsigned) n, x, NULL, data->f_data); } static double f_direct(int n, const double *x, int *undefined, void *data_) { nlopt_opt data = (nlopt_opt) data_; double *work = (double *) data->work; double f; unsigned i, j; f = data->f((unsigned) n, x, NULL, data->f_data); ++data->numevals; *undefined = nlopt_isnan(f) || nlopt_isinf(f); if (nlopt_get_force_stop(data)) return f; for (i = 0; i < data->m && !*undefined; ++i) { nlopt_eval_constraint(work, NULL, data->fc + i, (unsigned) n, x); if (nlopt_get_force_stop(data)) return f; for (j = 0; j < data->fc[i].m; ++j) if (work[j] > 0) *undefined = 1; } return f; } /*********************************************************************/ /* get min(dx) for algorithms requiring a scalar initial step size */ static nlopt_result initial_step(nlopt_opt opt, const double *x, double *step) { unsigned freedx = 0, i; if (!opt->dx) { freedx = 1; if (nlopt_set_default_initial_step(opt, x) != NLOPT_SUCCESS) return NLOPT_OUT_OF_MEMORY; } *step = HUGE_VAL; for (i = 0; i < opt->n; ++i) if (*step > fabs(opt->dx[i])) *step = fabs(opt->dx[i]); if (freedx) { free(opt->dx); opt->dx = NULL; } return NLOPT_SUCCESS; } /*********************************************************************/ /* return true if [lb,ub] is finite in every dimension (n dimensions) */ static int finite_domain(unsigned n, const double *lb, const double *ub) { unsigned i; for (i = 0; i < n; ++i) if (nlopt_isinf(ub[i] - lb[i])) return 0; return 1; } /*********************************************************************/ /* when we nest optimization objects, we need to connect them in a stack of force_stop_child nodes, so that if the user calls nlopt_set_force_stop on the original nlopt_opt object it will force all of the subsidiary optimization algorithms to stop. */ static void push_force_stop_child(nlopt_opt opt, nlopt_opt newchild) { /* assert: newchild != NULL && newchild->force_stop_child == NULL */ newchild->force_stop_child = opt->force_stop_child; opt->force_stop_child = newchild; } static nlopt_opt pop_force_stop_child(nlopt_opt opt) { /* assert: opt->force_stop_child != NULL */ nlopt_opt oldchild = opt->force_stop_child; opt->force_stop_child = oldchild->force_stop_child; oldchild->force_stop_child = NULL; return oldchild; } /*********************************************************************/ /* wrapper functions, only for derivative-free methods, that eliminate dimensions with lb == ub. (The gradient-based methods should handle this case directly, since they operate on much larger vectors where I am loathe to make copies unnecessarily.) */ typedef struct { nlopt_func f; nlopt_mfunc mf; void *f_data; unsigned n; /* true dimension */ double *x; /* scratch vector of length n */ double *grad; /* optional scratch vector of length n */ const double *lb, *ub; /* bounds, of length n */ } elimdim_data; static void *elimdim_makedata(nlopt_func f, nlopt_mfunc mf, void *f_data, unsigned n, double *x, const double *lb, const double *ub, double *grad) { elimdim_data *d = (elimdim_data *) malloc(sizeof(elimdim_data)); if (!d) return NULL; d->f = f; d->mf = mf; d->f_data = f_data; d->n = n; d->x = x; d->lb = lb; d->ub = ub; d->grad = grad; return d; } static double elimdim_func(unsigned n0, const double *x0, double *grad, void *d_) { elimdim_data *d = (elimdim_data *) d_; double *x = d->x; const double *lb = d->lb, *ub = d->ub; double val; unsigned n = d->n, i, j; (void) n0; /* unused */ for (i = j = 0; i < n; ++i) { if (lb[i] == ub[i]) x[i] = lb[i]; else /* assert: j < n0 */ x[i] = x0[j++]; } val = d->f(n, x, grad ? d->grad : NULL, d->f_data); if (grad) { /* assert: d->grad != NULL */ for (i = j = 0; i < n; ++i) if (lb[i] != ub[i]) grad[j++] = d->grad[i]; } return val; } static void elimdim_mfunc(unsigned m, double *result, unsigned n0, const double *x0, double *grad, void *d_) { elimdim_data *d = (elimdim_data *) d_; double *x = d->x; const double *lb = d->lb, *ub = d->ub; unsigned n = d->n, i, j; (void) n0; /* unused */ (void) grad; /* assert: grad == NULL */ for (i = j = 0; i < n; ++i) { if (lb[i] == ub[i]) x[i] = lb[i]; else /* assert: j < n0 */ x[i] = x0[j++]; } d->mf(m, result, n, x, NULL, d->f_data); } /* compute the eliminated dimension: number of dims with lb[i] != ub[i] */ static unsigned elimdim_dimension(unsigned n, const double *lb, const double *ub) { unsigned n0 = 0, i; for (i = 0; i < n; ++i) n0 += lb[i] != ub[i] ? 1U : 0; return n0; } /* modify v to "shrunk" version, with dimensions for lb[i] == ub[i] elim'ed */ static void elimdim_shrink(unsigned n, double *v, const double *lb, const double *ub) { unsigned i, j; if (v) for (i = j = 0; i < n; ++i) if (lb[i] != ub[i]) v[j++] = v[i]; } /* inverse of elimdim_shrink */ static void elimdim_expand(unsigned n, double *v, const double *lb, const double *ub) { unsigned i, j; if (v && n > 0) { j = elimdim_dimension(n, lb, ub) - 1; for (i = n - 1; i > 0; --i) { if (lb[i] != ub[i]) v[i] = v[j--]; else v[i] = lb[i]; } if (lb[0] == ub[0]) v[0] = lb[0]; } } /* given opt, create a new opt with equal-constraint dimensions eliminated */ static nlopt_opt elimdim_create(nlopt_opt opt) { nlopt_opt opt0; nlopt_munge munge_copy_save = opt->munge_on_copy; double *x, *grad = NULL; unsigned i; opt->munge_on_copy = 0; /* hack: since this is an internal copy, we can leave it un-munged; see issue #26 */ opt0 = nlopt_copy(opt); opt->munge_on_copy = munge_copy_save; if (!opt0) return NULL; x = (double *) malloc(sizeof(double) * opt->n); if (opt->n && !x) { nlopt_destroy(opt0); return NULL; } if (opt->algorithm == NLOPT_GD_STOGO || opt->algorithm == NLOPT_GD_STOGO_RAND) { grad = (double *) malloc(sizeof(double) * opt->n); if (opt->n && !grad) goto bad; } opt0->n = elimdim_dimension(opt->n, opt->lb, opt->ub); elimdim_shrink(opt->n, opt0->lb, opt->lb, opt->ub); elimdim_shrink(opt->n, opt0->ub, opt->lb, opt->ub); elimdim_shrink(opt->n, opt0->xtol_abs, opt->lb, opt->ub); elimdim_shrink(opt->n, opt0->dx, opt->lb, opt->ub); opt0->munge_on_destroy = opt0->munge_on_copy = NULL; opt0->f = elimdim_func; opt0->f_data = elimdim_makedata(opt->f, NULL, opt->f_data, opt->n, x, opt->lb, opt->ub, grad); if (!opt0->f_data) goto bad; for (i = 0; i < opt->m; ++i) { opt0->fc[i].f = opt0->fc[i].f ? elimdim_func : NULL; opt0->fc[i].mf = opt0->fc[i].mf ? elimdim_mfunc : NULL; opt0->fc[i].f_data = elimdim_makedata(opt->fc[i].f, opt->fc[i].mf, opt->fc[i].f_data, opt->n, x, opt->lb, opt->ub, NULL); if (!opt0->fc[i].f_data) goto bad; } for (i = 0; i < opt->p; ++i) { opt0->h[i].f = opt0->h[i].f ? elimdim_func : NULL; opt0->h[i].mf = opt0->h[i].mf ? elimdim_mfunc : NULL; opt0->h[i].f_data = elimdim_makedata(opt->h[i].f, opt->h[i].mf, opt->h[i].f_data, opt->n, x, opt->lb, opt->ub, NULL); if (!opt0->h[i].f_data) goto bad; } return opt0; bad: free(grad); free(x); nlopt_destroy(opt0); return NULL; } /* like nlopt_destroy, but also frees elimdim_data */ static void elimdim_destroy(nlopt_opt opt) { unsigned i; if (!opt) return; free(((elimdim_data *) opt->f_data)->x); free(((elimdim_data *) opt->f_data)->grad); free(opt->f_data); opt->f_data = NULL; for (i = 0; i < opt->m; ++i) { free(opt->fc[i].f_data); opt->fc[i].f_data = NULL; } for (i = 0; i < opt->p; ++i) { free(opt->h[i].f_data); opt->h[i].f_data = NULL; } nlopt_destroy(opt); } /* return whether to use elimdim wrapping. */ static int elimdim_wrapcheck(nlopt_opt opt) { if (!opt) return 0; if (elimdim_dimension(opt->n, opt->lb, opt->ub) == opt->n) return 0; switch (opt->algorithm) { case NLOPT_GN_DIRECT: case NLOPT_GN_DIRECT_L: case NLOPT_GN_DIRECT_L_RAND: case NLOPT_GN_DIRECT_NOSCAL: case NLOPT_GN_DIRECT_L_NOSCAL: case NLOPT_GN_DIRECT_L_RAND_NOSCAL: case NLOPT_GN_ORIG_DIRECT: case NLOPT_GN_ORIG_DIRECT_L: case NLOPT_GN_CRS2_LM: case NLOPT_LN_PRAXIS: case NLOPT_LN_COBYLA: case NLOPT_LN_NEWUOA: case NLOPT_LN_NEWUOA_BOUND: case NLOPT_LN_BOBYQA: case NLOPT_LN_NELDERMEAD: case NLOPT_LN_SBPLX: case NLOPT_GN_ISRES: case NLOPT_GN_ESCH: case NLOPT_GN_AGS: case NLOPT_GD_STOGO: case NLOPT_GD_STOGO_RAND: return 1; default: return 0; } } /*********************************************************************/ /* wrapper functions for algorithms not considering all evaluated points as candidates * or returning only the last evaluation which might not be optimum */ typedef struct { nlopt_func f; void *f_data; const double *lb, *ub; /* bounds, of length n */ double minf; double *bestx; } memoize_data; static double memoize_func(unsigned n, const double *x, double *grad, void *d_) { memoize_data *d = (memoize_data *) d_; const double *lb = d->lb, *ub = d->ub; double val; unsigned i, feasible = 1; val = d->f(n, x, grad, d->f_data); for (i = 0; i < n; ++ i) { if (lb && (x[i] < lb[i])) feasible = 0; if (ub && (x[i] > ub[i])) feasible = 0; } if (feasible && (val < d->minf)) { d->minf = val; memcpy(d->bestx, x, n * sizeof(double)); } return val; } /* return whether to use memoize wrapping. */ static int memoize_wrapcheck(nlopt_opt opt) { if (!opt) return 0; /* constraints not supported */ if ((opt->m > 0) || (opt->p > 0)) return 0; switch (opt->algorithm) { case NLOPT_LN_COBYLA: case NLOPT_LD_TNEWTON: case NLOPT_LD_TNEWTON_RESTART: case NLOPT_LD_TNEWTON_PRECOND: case NLOPT_LD_TNEWTON_PRECOND_RESTART: return 1; default: return 0; } } /*********************************************************************/ #define POP(defaultpop) (opt->stochastic_population > 0 ? (int)opt->stochastic_population : (nlopt_stochastic_population > 0 ? nlopt_stochastic_population : (defaultpop))) /* unlike nlopt_optimize() below, only handles minimization case */ static nlopt_result nlopt_optimize_(nlopt_opt opt, double *x, double *minf) { const double *lb, *ub; nlopt_algorithm algorithm; nlopt_func f; void *f_data; unsigned n, i; int ni; nlopt_stopping stop; if (!opt || !x || !minf || !opt->f || opt->maximize) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "NULL args to nlopt_optimize_"); /* copy a few params to local vars for convenience */ n = opt->n; ni = (int) n; /* most of the subroutines take "int" arg */ lb = opt->lb; ub = opt->ub; algorithm = opt->algorithm; f = opt->f; f_data = opt->f_data; if (n == 0) { /* trivial case: no degrees of freedom */ *minf = opt->f(n, x, NULL, opt->f_data); return NLOPT_SUCCESS; } *minf = HUGE_VAL; /* make sure rand generator is inited */ nlopt_srand_time_default(); /* default is non-deterministic */ /* check bound constraints */ for (i = 0; i < n; ++i) if (lb[i] > ub[i] || x[i] < lb[i] || x[i] > ub[i]) { nlopt_set_errmsg(opt, "bounds %d fail %g <= %g <= %g", i, lb[i], x[i], ub[i]); return NLOPT_INVALID_ARGS; } stop.n = n; stop.minf_max = opt->stopval; stop.ftol_rel = opt->ftol_rel; stop.ftol_abs = opt->ftol_abs; stop.xtol_rel = opt->xtol_rel; stop.xtol_abs = opt->xtol_abs; stop.x_weights = opt->x_weights; opt->numevals = 0; stop.nevals_p = &(opt->numevals); stop.maxeval = opt->maxeval; stop.maxtime = opt->maxtime; stop.start = nlopt_seconds(); stop.force_stop = &(opt->force_stop); stop.stop_msg = &(opt->errmsg); switch (algorithm) { case NLOPT_GN_DIRECT: case NLOPT_GN_DIRECT_L: case NLOPT_GN_DIRECT_L_RAND: if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return cdirect(ni, f, f_data, lb, ub, x, minf, &stop, nlopt_get_param(opt, "magic_eps", 0.0), (algorithm != NLOPT_GN_DIRECT) + 3 * (algorithm == NLOPT_GN_DIRECT_L_RAND ? 2 : (algorithm != NLOPT_GN_DIRECT)) + 9 * (algorithm == NLOPT_GN_DIRECT_L_RAND ? 1 : (algorithm != NLOPT_GN_DIRECT))); case NLOPT_GN_DIRECT_NOSCAL: case NLOPT_GN_DIRECT_L_NOSCAL: case NLOPT_GN_DIRECT_L_RAND_NOSCAL: if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return cdirect_unscaled(ni, f, f_data, lb, ub, x, minf, &stop, nlopt_get_param(opt, "magic_eps", 0.0), (algorithm != NLOPT_GN_DIRECT) + 3 * (algorithm == NLOPT_GN_DIRECT_L_RAND ? 2 : (algorithm != NLOPT_GN_DIRECT)) + 9 * (algorithm == NLOPT_GN_DIRECT_L_RAND ? 1 : (algorithm != NLOPT_GN_DIRECT))); case NLOPT_GN_ORIG_DIRECT: case NLOPT_GN_ORIG_DIRECT_L: { direct_return_code dret; if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); opt->work = malloc(sizeof(double) * nlopt_max_constraint_dim(opt->m, opt->fc)); if (!opt->work) return NLOPT_OUT_OF_MEMORY; dret = direct_optimize(f_direct, opt, ni, lb, ub, x, minf, stop.maxeval, -1, stop.start, stop.maxtime, nlopt_get_param(opt, "magic_eps", 0.0), nlopt_get_param(opt, "magic_eps_abs", 0.0), pow(stop.xtol_rel, (double) n), nlopt_get_param(opt, "sigma_reltol", -1.0), stop.force_stop, stop.minf_max, nlopt_get_param(opt, "fglobal_reltol", 0.0), NULL, algorithm == NLOPT_GN_ORIG_DIRECT ? DIRECT_ORIGINAL : DIRECT_GABLONSKY); free(opt->work); opt->work = NULL; switch (dret) { case DIRECT_INVALID_BOUNDS: RETURN_ERR(NLOPT_INVALID_ARGS, opt, "invalid bounds for DIRECT"); case DIRECT_MAXFEVAL_TOOBIG: RETURN_ERR(NLOPT_INVALID_ARGS, opt, "maxeval too big for DIRECT"); case DIRECT_INVALID_ARGS: return NLOPT_INVALID_ARGS; case DIRECT_INIT_FAILED: RETURN_ERR(NLOPT_FAILURE, opt, "init failed for DIRECT"); case DIRECT_SAMPLEPOINTS_FAILED: RETURN_ERR(NLOPT_FAILURE, opt, "sample-points failed for DIRECT"); case DIRECT_SAMPLE_FAILED: RETURN_ERR(NLOPT_FAILURE, opt, "sample failed for DIRECT"); case DIRECT_MAXFEVAL_EXCEEDED: case DIRECT_MAXITER_EXCEEDED: return NLOPT_MAXEVAL_REACHED; case DIRECT_MAXTIME_EXCEEDED: return NLOPT_MAXTIME_REACHED; case DIRECT_GLOBAL_FOUND: return NLOPT_MINF_MAX_REACHED; case DIRECT_VOLTOL: case DIRECT_SIGMATOL: return NLOPT_XTOL_REACHED; case DIRECT_OUT_OF_MEMORY: return NLOPT_OUT_OF_MEMORY; case DIRECT_FORCED_STOP: return NLOPT_FORCED_STOP; } break; } case NLOPT_GN_AGS: #ifdef NLOPT_CXX if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return ags_minimize(ni, f, f_data, opt->m, opt->fc, x, minf, lb, ub, &stop); break; #else return NLOPT_INVALID_ARGS; #endif case NLOPT_GD_STOGO: case NLOPT_GD_STOGO_RAND: #ifdef NLOPT_CXX if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); if (!stogo_minimize(ni, f, f_data, x, minf, lb, ub, &stop, algorithm == NLOPT_GD_STOGO ? 0 : POP(2 * (int)n))) return NLOPT_FAILURE; break; #else return NLOPT_INVALID_ARGS; #endif #if 0 /* lacking a free/open-source license, we no longer use Rowan's code, and instead use by "sbplx" re-implementation */ case NLOPT_LN_SUBPLEX: { int iret, freedx = 0; if (!opt->dx) { freedx = 1; if (nlopt_set_default_initial_step(opt, x) != NLOPT_SUCCESS) return NLOPT_OUT_OF_MEMORY; } iret = nlopt_subplex(f_bound, minf, x, n, opt, &stop, opt->dx); if (freedx) { free(opt->dx); opt->dx = NULL; } switch (iret) { case -2: return NLOPT_INVALID_ARGS; case -20: return NLOPT_FORCED_STOP; case -10: return NLOPT_MAXTIME_REACHED; case -1: return NLOPT_MAXEVAL_REACHED; case 0: return NLOPT_XTOL_REACHED; case 1: return NLOPT_SUCCESS; case 2: return NLOPT_MINF_MAX_REACHED; case 20: return NLOPT_FTOL_REACHED; case -200: return NLOPT_OUT_OF_MEMORY; default: return NLOPT_FAILURE; /* unknown return code */ } break; } #endif case NLOPT_LN_PRAXIS: { double step; nlopt_result result; if (initial_step(opt, x, &step) != NLOPT_SUCCESS) return NLOPT_OUT_OF_MEMORY; /* transform starting point into unbound space */ x_bound_inv(ni, x, opt->lb, opt->ub); result = praxis_(nlopt_get_param(opt, "t0_tol", 0.0), DBL_EPSILON, step, ni, x, f_bound, opt, &stop, minf); /* transform back optimal point to bounded space */ x_bound(ni, x, opt->lb, opt->ub); return result; } case NLOPT_LD_LBFGS: #ifdef NLOPT_LUKSAN return luksan_plis(ni, f, f_data, lb, ub, x, minf, &stop, opt->vector_storage, nlopt_get_param(opt, "tolg", 0.)); #else printf("ERROR - attempting to use NLOPT_LD_LBFGS, but Luksan code disabled\n"); return NLOPT_INVALID_ARGS; #endif case NLOPT_LD_VAR1: case NLOPT_LD_VAR2: #ifdef NLOPT_LUKSAN return luksan_plip(ni, f, f_data, lb, ub, x, minf, &stop, opt->vector_storage, algorithm == NLOPT_LD_VAR1 ? 1 : 2, nlopt_get_param(opt, "tolg", 0.)); #else printf("ERROR - attempting to use NLOPT_LD_VAR*, but Luksan code disabled\n"); return NLOPT_INVALID_ARGS; #endif case NLOPT_LD_TNEWTON: case NLOPT_LD_TNEWTON_RESTART: case NLOPT_LD_TNEWTON_PRECOND: case NLOPT_LD_TNEWTON_PRECOND_RESTART: #ifdef NLOPT_LUKSAN return luksan_pnet(ni, f, f_data, lb, ub, x, minf, &stop, opt->vector_storage, 1 + (algorithm - NLOPT_LD_TNEWTON) % 2, 1 + (algorithm - NLOPT_LD_TNEWTON) / 2, nlopt_get_param(opt, "tolg", 0.)); #else printf("ERROR - attempting to use NLOPT_LD_TNEWTON*, but Luksan code disabled\n"); return NLOPT_INVALID_ARGS; #endif case NLOPT_GN_CRS2_LM: if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return crs_minimize(ni, f, f_data, lb, ub, x, minf, &stop, POP(0), 0); case NLOPT_G_MLSL: case NLOPT_G_MLSL_LDS: case NLOPT_GN_MLSL: case NLOPT_GD_MLSL: case NLOPT_GN_MLSL_LDS: case NLOPT_GD_MLSL_LDS: { nlopt_opt local_opt = opt->local_opt; nlopt_result ret; if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); if (!local_opt && (algorithm == NLOPT_G_MLSL || algorithm == NLOPT_G_MLSL_LDS)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "local optimizer must be specified for G_MLSL"); if (!local_opt) { /* default */ nlopt_algorithm local_alg = (algorithm == NLOPT_GN_MLSL || algorithm == NLOPT_GN_MLSL_LDS) ? nlopt_local_search_alg_nonderiv : nlopt_local_search_alg_deriv; /* don't call MLSL recursively! */ if (local_alg >= NLOPT_GN_MLSL && local_alg <= NLOPT_GD_MLSL_LDS) local_alg = (algorithm == NLOPT_GN_MLSL || algorithm == NLOPT_GN_MLSL_LDS) ? NLOPT_LN_COBYLA : NLOPT_LD_MMA; local_opt = nlopt_create(local_alg, n); if (!local_opt) RETURN_ERR(NLOPT_FAILURE, opt, "failed to create local_opt"); nlopt_set_ftol_rel(local_opt, opt->ftol_rel); nlopt_set_ftol_abs(local_opt, opt->ftol_abs); nlopt_set_xtol_rel(local_opt, opt->xtol_rel); nlopt_set_xtol_abs(local_opt, opt->xtol_abs); nlopt_set_maxeval(local_opt, nlopt_local_search_maxeval); } if (opt->dx) nlopt_set_initial_step(local_opt, opt->dx); for (i = 0; i < n && stop.xtol_abs && stop.xtol_abs[i] > 0; ++i); if (local_opt->ftol_rel <= 0 && local_opt->ftol_abs <= 0 && local_opt->xtol_rel <= 0 && i < n) { /* it is not sensible to call MLSL without *some* nonzero tolerance for the local search */ nlopt_set_ftol_rel(local_opt, 1e-15); nlopt_set_xtol_rel(local_opt, 1e-7); } push_force_stop_child(opt, local_opt); ret = mlsl_minimize(ni, f, f_data, lb, ub, x, minf, &stop, local_opt, POP(0), algorithm >= NLOPT_GN_MLSL_LDS && algorithm != NLOPT_G_MLSL); pop_force_stop_child(opt); if (!opt->local_opt) nlopt_destroy(local_opt); return ret; } case NLOPT_LD_MMA: case NLOPT_LD_CCSAQ: { int inner_maxeval = (int)nlopt_get_param(opt, "inner_maxeval",0); int verbosity = (int)nlopt_get_param(opt, "verbosity",0); double rho_init = nlopt_get_param(opt, "rho_init",1.0); int inner_gradients = (int)nlopt_get_param(opt, "inner_gradients",1); int always_improve = (int)nlopt_get_param(opt, "always_improve",1); double sigma_min = nlopt_get_param(opt, "sigma_min",0.0); nlopt_opt dual_opt; nlopt_result ret; if (!(rho_init > 0) && !nlopt_isinf(rho_init)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "rho_init must be positive and finite"); if (inner_gradients != 0 && inner_gradients != 1) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "inner_gradients must be 0 or 1"); if (always_improve != 0 && always_improve != 1) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "always_improve must be 0 or 1"); if (sigma_min < 0.0) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "sigma_min must be non-negative"); verbosity = verbosity < 0 ? 0 : verbosity; #define LO(param, def) (opt->local_opt ? opt->local_opt->param : (def)) dual_opt = nlopt_create((nlopt_algorithm)nlopt_get_param(opt, "dual_algorithm", LO(algorithm, nlopt_local_search_alg_deriv)), nlopt_count_constraints(opt->m, opt->fc)); if (!dual_opt) RETURN_ERR(NLOPT_FAILURE, opt, "failed creating dual optimizer"); nlopt_set_ftol_rel(dual_opt, nlopt_get_param(opt, "dual_ftol_rel", LO(ftol_rel, 1e-14))); nlopt_set_ftol_abs(dual_opt, nlopt_get_param(opt, "dual_ftol_abs", LO(ftol_abs, 0.0))); nlopt_set_xtol_rel(dual_opt, nlopt_get_param(opt, "dual_xtol_rel", 0.0)); nlopt_set_xtol_abs1(dual_opt, nlopt_get_param(opt, "dual_xtol_abs", 0.0)); nlopt_set_maxeval(dual_opt, (int)nlopt_get_param(opt, "dual_maxeval", LO(maxeval, 100000))); #undef LO if (algorithm == NLOPT_LD_MMA) ret = mma_minimize(n, f, f_data, opt->m, opt->fc, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, sigma_min, opt->dx); else ret = ccsa_quadratic_minimize(n, f, f_data, opt->m, opt->fc, opt->pre, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, sigma_min, opt->dx); nlopt_destroy(dual_opt); return ret; } case NLOPT_LN_COBYLA: { nlopt_result ret; int freedx = 0; if (!opt->dx) { freedx = 1; if (nlopt_set_default_initial_step(opt, x) != NLOPT_SUCCESS) RETURN_ERR(NLOPT_OUT_OF_MEMORY, opt, "failed to allocate initial step"); } ret = cobyla_minimize(n, f, f_data, opt->m, opt->fc, opt->p, opt->h, lb, ub, x, minf, &stop, opt->dx); if (freedx) { free(opt->dx); opt->dx = NULL; } return ret; } case NLOPT_LN_NEWUOA: { double step; if (initial_step(opt, x, &step) != NLOPT_SUCCESS) RETURN_ERR(NLOPT_OUT_OF_MEMORY, opt, "failed to allocate initial step"); return newuoa(ni, 2 * n + 1, x, 0, 0, step, &stop, minf, f_noderiv, opt); } case NLOPT_LN_NEWUOA_BOUND: { double step; if (initial_step(opt, x, &step) != NLOPT_SUCCESS) RETURN_ERR(NLOPT_OUT_OF_MEMORY, opt, "failed to allocate initial step"); return newuoa(ni, 2 * n + 1, x, lb, ub, step, &stop, minf, f_noderiv, opt); } case NLOPT_LN_BOBYQA: { nlopt_result ret; int freedx = 0; if (!opt->dx) { freedx = 1; if (nlopt_set_default_initial_step(opt, x) != NLOPT_SUCCESS) RETURN_ERR(NLOPT_OUT_OF_MEMORY, opt, "failed to allocate initial step"); } ret = bobyqa(ni, 2 * n + 1, x, lb, ub, opt->dx, &stop, minf, opt->f, opt->f_data); if (freedx) { free(opt->dx); opt->dx = NULL; } return ret; } case NLOPT_LN_NELDERMEAD: case NLOPT_LN_SBPLX: { nlopt_result ret; int freedx = 0; if (!opt->dx) { freedx = 1; if (nlopt_set_default_initial_step(opt, x) != NLOPT_SUCCESS) RETURN_ERR(NLOPT_OUT_OF_MEMORY, opt, "failed to allocate initial step"); } if (algorithm == NLOPT_LN_NELDERMEAD) ret = nldrmd_minimize(ni, f, f_data, lb, ub, x, minf, opt->dx, &stop); else ret = sbplx_minimize(ni, f, f_data, lb, ub, x, minf, opt->dx, &stop); if (freedx) { free(opt->dx); opt->dx = NULL; } return ret; } case NLOPT_AUGLAG: case NLOPT_AUGLAG_EQ: case NLOPT_LN_AUGLAG: case NLOPT_LN_AUGLAG_EQ: case NLOPT_LD_AUGLAG: case NLOPT_LD_AUGLAG_EQ: { nlopt_opt local_opt = opt->local_opt; nlopt_result ret; if ((algorithm == NLOPT_AUGLAG || algorithm == NLOPT_AUGLAG_EQ) && !local_opt) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "local optimizer must be specified for AUGLAG"); if (!local_opt) { /* default */ local_opt = nlopt_create(algorithm == NLOPT_LN_AUGLAG || algorithm == NLOPT_LN_AUGLAG_EQ ? nlopt_local_search_alg_nonderiv : nlopt_local_search_alg_deriv, n); if (!local_opt) RETURN_ERR(NLOPT_FAILURE, opt, "failed to create local_opt"); nlopt_set_ftol_rel(local_opt, opt->ftol_rel); nlopt_set_ftol_abs(local_opt, opt->ftol_abs); nlopt_set_xtol_rel(local_opt, opt->xtol_rel); nlopt_set_xtol_abs(local_opt, opt->xtol_abs); nlopt_set_maxeval(local_opt, nlopt_local_search_maxeval); } if (opt->dx) nlopt_set_initial_step(local_opt, opt->dx); push_force_stop_child(opt, local_opt); ret = auglag_minimize(ni, f, f_data, opt->m, opt->fc, opt->p, opt->h, lb, ub, x, minf, &stop, local_opt, algorithm == NLOPT_AUGLAG_EQ || algorithm == NLOPT_LN_AUGLAG_EQ || algorithm == NLOPT_LD_AUGLAG_EQ); pop_force_stop_child(opt); if (!opt->local_opt) nlopt_destroy(local_opt); return ret; } case NLOPT_GN_ISRES: if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return isres_minimize(ni, f, f_data, (int) (opt->m), opt->fc, (int) (opt->p), opt->h, lb, ub, x, minf, &stop, POP(0)); case NLOPT_GN_ESCH: if (!finite_domain(n, lb, ub)) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "finite domain required for global algorithm"); return chevolutionarystrategy(n, f, f_data, lb, ub, x, minf, &stop, (unsigned) POP(0), (unsigned) (POP(0) * 1.5)); case NLOPT_LD_SLSQP: return nlopt_slsqp(n, f, f_data, opt->m, opt->fc, opt->p, opt->h, lb, ub, x, minf, &stop); default: return NLOPT_INVALID_ARGS; } return NLOPT_SUCCESS; /* never reached */ } /*********************************************************************/ typedef struct { nlopt_func f; nlopt_precond pre; void *f_data; } f_max_data; /* wrapper for maximizing: just flip the sign of f and grad */ static double f_max(unsigned n, const double *x, double *grad, void *data) { f_max_data *d = (f_max_data *) data; double val = d->f(n, x, grad, d->f_data); if (grad) { unsigned i; for (i = 0; i < n; ++i) grad[i] = -grad[i]; } return -val; } static void pre_max(unsigned n, const double *x, const double *v, double *vpre, void *data) { f_max_data *d = (f_max_data *) data; unsigned i; d->pre(n, x, v, vpre, d->f_data); for (i = 0; i < n; ++i) vpre[i] = -vpre[i]; } nlopt_result NLOPT_STDCALL nlopt_optimize(nlopt_opt opt, double *x, double *opt_f) { nlopt_func f; void *f_data; nlopt_precond pre; f_max_data fmd; memoize_data mmzd; int maximize; nlopt_result ret; nlopt_unset_errmsg(opt); if (!opt || !opt_f || !opt->f) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "NULL args to nlopt_optimize"); f = opt->f; f_data = opt->f_data; pre = opt->pre; /* reset stopping flag */ nlopt_set_force_stop(opt, 0); opt->force_stop_child = NULL; /* for maximizing, just minimize the f_max wrapper, which flips the sign of everything */ if ((maximize = opt->maximize)) { fmd.f = f; fmd.f_data = f_data; fmd.pre = pre; opt->f = f_max; opt->f_data = &fmd; if (opt->pre) opt->pre = pre_max; opt->stopval = -opt->stopval; opt->maximize = 0; } if (memoize_wrapcheck(opt)) { mmzd.f = opt->f; mmzd.f_data = opt->f_data; mmzd.lb = opt->lb; mmzd.ub = opt->ub; mmzd.minf = DBL_MAX; mmzd.bestx = (double *) malloc(opt->n * sizeof(double)); opt->f = memoize_func; opt->f_data = &mmzd; } { /* possibly eliminate lb == ub dimensions for some algorithms */ nlopt_opt elim_opt = opt; if (elimdim_wrapcheck(opt)) { elim_opt = elimdim_create(opt); if (!elim_opt) { nlopt_set_errmsg(opt, "failure allocating elim_opt"); ret = NLOPT_OUT_OF_MEMORY; goto done; } elimdim_shrink(opt->n, x, opt->lb, opt->ub); push_force_stop_child(opt, elim_opt); } ret = nlopt_optimize_(elim_opt, x, opt_f); if (elim_opt != opt) { opt->numevals = elim_opt->numevals; opt->errmsg = elim_opt->errmsg; elim_opt->errmsg = NULL; pop_force_stop_child(opt); elimdim_expand(opt->n, x, opt->lb, opt->ub); elimdim_destroy(elim_opt); } } done: if (memoize_wrapcheck(opt)) { memcpy(x, mmzd.bestx, opt->n * sizeof(double)); free(mmzd.bestx); *opt_f = mmzd.minf; opt->f = mmzd.f; opt->f_data = mmzd.f_data; } if (maximize) { /* restore original signs */ opt->maximize = maximize; opt->stopval = -opt->stopval; opt->f = f; opt->f_data = f_data; opt->pre = pre; *opt_f = -*opt_f; } return ret; } /*********************************************************************/ nlopt_result nlopt_optimize_limited(nlopt_opt opt, double *x, double *minf, int maxeval, double maxtime) { int save_maxeval; double save_maxtime; nlopt_result ret; nlopt_unset_errmsg(opt); if (!opt) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "NULL opt arg"); save_maxeval = nlopt_get_maxeval(opt); save_maxtime = nlopt_get_maxtime(opt); /* override opt limits if maxeval and/or maxtime are more stringent */ if (save_maxeval <= 0 || (maxeval > 0 && maxeval < save_maxeval)) nlopt_set_maxeval(opt, maxeval); if (save_maxtime <= 0 || (maxtime > 0 && maxtime < save_maxtime)) nlopt_set_maxtime(opt, maxtime); ret = nlopt_optimize(opt, x, minf); nlopt_set_maxeval(opt, save_maxeval); nlopt_set_maxtime(opt, save_maxtime); return ret; } /*********************************************************************/ stevengj-nlopt-88c424d/src/api/options.c000066400000000000000000001006071521061417600202410ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include "nlopt-internal.h" #define ERR(err, opt, msg) (nlopt_set_errmsg(opt, msg) ? err : err) /*************************************************************************/ void NLOPT_STDCALL nlopt_destroy(nlopt_opt opt) { if (opt) { unsigned i; if (opt->munge_on_destroy) { nlopt_munge munge = opt->munge_on_destroy; munge(opt->f_data); for (i = 0; i < opt->m; ++i) munge(opt->fc[i].f_data); for (i = 0; i < opt->p; ++i) munge(opt->h[i].f_data); } for (i = 0; i < opt->m; ++i) free(opt->fc[i].tol); for (i = 0; i < opt->p; ++i) free(opt->h[i].tol); for (i = 0; i < opt->nparams; ++i) free(opt->params[i].name); free(opt->params); free(opt->lb); free(opt->ub); free(opt->xtol_abs); free(opt->x_weights); free(opt->fc); free(opt->h); nlopt_destroy(opt->local_opt); free(opt->dx); free(opt->work); free(opt->errmsg); free(opt); } } nlopt_opt NLOPT_STDCALL nlopt_create(nlopt_algorithm algorithm, unsigned n) { nlopt_opt opt; if (((int) algorithm) < 0 || algorithm >= NLOPT_NUM_ALGORITHMS) return NULL; opt = (nlopt_opt) malloc(sizeof(struct nlopt_opt_s)); if (opt) { opt->algorithm = algorithm; opt->n = n; opt->f = NULL; opt->f_data = NULL; opt->pre = NULL; opt->maximize = 0; opt->munge_on_destroy = opt->munge_on_copy = NULL; opt->lb = opt->ub = NULL; opt->m = opt->m_alloc = 0; opt->fc = NULL; opt->p = opt->p_alloc = 0; opt->h = NULL; opt->params = NULL; opt->nparams = 0; opt->stopval = -HUGE_VAL; opt->ftol_rel = opt->ftol_abs = 0; opt->xtol_rel = 0; opt->x_weights = NULL; opt->xtol_abs = NULL; opt->maxeval = 0; opt->numevals = 0; opt->maxtime = 0; opt->force_stop = 0; opt->force_stop_child = NULL; opt->local_opt = NULL; opt->stochastic_population = 0; opt->vector_storage = 0; opt->dx = NULL; opt->work = NULL; opt->errmsg = NULL; if (n > 0) { opt->lb = (double *) calloc(n, sizeof(double)); if (!opt->lb) goto oom; opt->ub = (double *) calloc(n, sizeof(double)); if (!opt->ub) goto oom; nlopt_set_lower_bounds1(opt, -HUGE_VAL); nlopt_set_upper_bounds1(opt, +HUGE_VAL); } } return opt; oom: nlopt_destroy(opt); return NULL; } nlopt_opt NLOPT_STDCALL nlopt_copy(const nlopt_opt opt) { nlopt_opt nopt = NULL; unsigned i; if (opt) { nlopt_munge munge; nopt = (nlopt_opt) malloc(sizeof(struct nlopt_opt_s)); *nopt = *opt; nopt->lb = nopt->ub = nopt->xtol_abs = nopt->x_weights = NULL; nopt->fc = nopt->h = NULL; nopt->m_alloc = nopt->p_alloc = 0; nopt->local_opt = NULL; nopt->dx = NULL; nopt->work = NULL; nopt->errmsg = NULL; nopt->force_stop_child = NULL; nopt->params = NULL; nopt->nparams = 0; munge = nopt->munge_on_copy; if (munge && nopt->f_data) if (!(nopt->f_data = munge(nopt->f_data))) goto oom; if (opt->n > 0) { nopt->lb = (double *) malloc(sizeof(double) * (opt->n)); if (!opt->lb) goto oom; nopt->ub = (double *) malloc(sizeof(double) * (opt->n)); if (!opt->ub) goto oom; if (opt->xtol_abs) { nopt->xtol_abs = (double *) malloc(sizeof(double) * (opt->n)); if (!opt->xtol_abs) goto oom; } if (opt->x_weights) { nopt->x_weights = (double *) malloc(sizeof(double) * (opt->n)); if (!opt->x_weights) goto oom; memcpy(nopt->x_weights, opt->x_weights, sizeof(double) * (opt->n)); } memcpy(nopt->lb, opt->lb, sizeof(double) * (opt->n)); memcpy(nopt->ub, opt->ub, sizeof(double) * (opt->n)); if (opt->xtol_abs) { memcpy(nopt->xtol_abs, opt->xtol_abs, sizeof(double) * (opt->n)); } } if (opt->m) { nopt->m_alloc = opt->m; nopt->fc = (nlopt_constraint *) malloc(sizeof(nlopt_constraint) * (opt->m)); if (!nopt->fc) goto oom; memcpy(nopt->fc, opt->fc, sizeof(nlopt_constraint) * (opt->m)); for (i = 0; i < opt->m; ++i) nopt->fc[i].tol = NULL; if (munge) for (i = 0; i < opt->m; ++i) if (nopt->fc[i].f_data && !(nopt->fc[i].f_data = munge(nopt->fc[i].f_data))) goto oom; for (i = 0; i < opt->m; ++i) if (opt->fc[i].tol) { nopt->fc[i].tol = (double *) malloc(sizeof(double) * nopt->fc[i].m); if (!nopt->fc[i].tol) goto oom; memcpy(nopt->fc[i].tol, opt->fc[i].tol, sizeof(double) * nopt->fc[i].m); } } if (opt->p) { nopt->p_alloc = opt->p; nopt->h = (nlopt_constraint *) malloc(sizeof(nlopt_constraint) * (opt->p)); if (!nopt->h) goto oom; memcpy(nopt->h, opt->h, sizeof(nlopt_constraint) * (opt->p)); for (i = 0; i < opt->p; ++i) nopt->h[i].tol = NULL; if (munge) for (i = 0; i < opt->p; ++i) if (nopt->h[i].f_data && !(nopt->h[i].f_data = munge(nopt->h[i].f_data))) goto oom; for (i = 0; i < opt->p; ++i) if (opt->h[i].tol) { nopt->h[i].tol = (double *) malloc(sizeof(double) * nopt->h[i].m); if (!nopt->h[i].tol) goto oom; memcpy(nopt->h[i].tol, opt->h[i].tol, sizeof(double) * nopt->h[i].m); } } if (opt->nparams) { nopt->nparams = opt->nparams; nopt->params = (nlopt_opt_param *) calloc(opt->nparams, sizeof(nlopt_opt_param)); if (!nopt->params) goto oom; for (i = 0; i < opt->nparams; ++i) { size_t len = strlen(opt->params[i].name) + 1; nopt->params[i].name = (char *) malloc(len); if (!nopt->params[i].name) goto oom; memcpy(nopt->params[i].name, opt->params[i].name, len); nopt->params[i].val = opt->params[i].val; } } if (opt->local_opt) { nopt->local_opt = nlopt_copy(opt->local_opt); if (!nopt->local_opt) goto oom; } if (opt->dx) { nopt->dx = (double *) malloc(sizeof(double) * (opt->n)); if (!nopt->dx) goto oom; memcpy(nopt->dx, opt->dx, sizeof(double) * (opt->n)); } } return nopt; oom: nopt->munge_on_destroy = NULL; /* better to leak mem than crash */ nlopt_destroy(nopt); return NULL; } /*************************************************************************/ /* generic algorithm parameters, implemented as a simple array of (name,val) pairs that can interpreted as needed by individual algorithms. (No point in a fancier data structure since only a handful of these should be set in practice). */ nlopt_result nlopt_set_param(nlopt_opt opt, const char *name, double val) { size_t len; unsigned i; if (!opt) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "invalid NULL opt"); if (!name) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "invalid NULL parameter name"); len = strnlen(name, 1024) + 1; if (len > 1024) RETURN_ERR(NLOPT_INVALID_ARGS, opt, "parameter name must be < 1024 bytes"); for (i = 0; i < opt->nparams; ++i) if (!strcmp(name, opt->params[i].name)) break; if (i == opt->nparams) { /* allocate new parameter */ opt->nparams++; opt->params = (nlopt_opt_param *) realloc(opt->params, sizeof(nlopt_opt_param) * opt->nparams); if (!opt->params) return NLOPT_OUT_OF_MEMORY; opt->params[i].name = (char *) malloc(len); if (!opt->params[i].name) return NLOPT_OUT_OF_MEMORY; memcpy(opt->params[i].name, name, len); } opt->params[i].val = val; return NLOPT_SUCCESS; } double nlopt_get_param(const nlopt_opt opt, const char *name, double defaultval) { unsigned i; if (!opt || !name || strnlen(name, 1024) == 1024) return defaultval; for (i = 0; i < opt->nparams; ++i) if (!strcmp(name, opt->params[i].name)) return opt->params[i].val; return defaultval; } int nlopt_has_param(const nlopt_opt opt, const char *name) { unsigned i; if (!opt || !name || strnlen(name, 1024) == 1024) return 0; for (i = 0; i < opt->nparams; ++i) if (!strcmp(name, opt->params[i].name)) return 1; return 0; } unsigned nlopt_num_params(const nlopt_opt opt) { return opt ? opt->nparams : 0; } const char *nlopt_nth_param(const nlopt_opt opt, unsigned n) { return opt && n < opt->nparams ? opt->params[n].name : NULL; } /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data) { if (opt) { nlopt_unset_errmsg(opt); if (opt->munge_on_destroy) opt->munge_on_destroy(opt->f_data); opt->f = f; opt->f_data = f_data; opt->pre = pre; opt->maximize = 0; if (nlopt_isinf(opt->stopval) && opt->stopval > 0) opt->stopval = -HUGE_VAL; /* switch default from max to min */ return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_min_objective(nlopt_opt opt, nlopt_func f, void *f_data) { return nlopt_set_precond_min_objective(opt, f, NULL, f_data); } nlopt_result NLOPT_STDCALL nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data) { if (opt) { nlopt_unset_errmsg(opt); if (opt->munge_on_destroy) opt->munge_on_destroy(opt->f_data); opt->f = f; opt->f_data = f_data; opt->pre = pre; opt->maximize = 1; if (nlopt_isinf(opt->stopval) && opt->stopval < 0) opt->stopval = +HUGE_VAL; /* switch default from min to max */ return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_max_objective(nlopt_opt opt, nlopt_func f, void *f_data) { return nlopt_set_precond_max_objective(opt, f, NULL, f_data); } /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_set_lower_bounds(nlopt_opt opt, const double *lb) { nlopt_unset_errmsg(opt); if (opt && (opt->n == 0 || lb)) { unsigned int i; if (opt->n > 0) memcpy(opt->lb, lb, sizeof(double) * (opt->n)); for (i = 0; i < opt->n; ++i) if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->lb[i] = opt->ub[i]; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_lower_bounds1(nlopt_opt opt, double lb) { nlopt_unset_errmsg(opt); if (opt) { unsigned i; for (i = 0; i < opt->n; ++i) { opt->lb[i] = lb; if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->lb[i] = opt->ub[i]; } return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_lower_bound(nlopt_opt opt, int i, double lb) { nlopt_unset_errmsg(opt); if (opt) { if (i < 0 || i >= (int) opt->n) return ERR(NLOPT_INVALID_ARGS, opt, "invalid bound index"); opt->lb[i] = lb; if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->lb[i] = opt->ub[i]; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_get_lower_bounds(const nlopt_opt opt, double *lb) { nlopt_unset_errmsg(opt); if (opt && (opt->n == 0 || lb)) { memcpy(lb, opt->lb, sizeof(double) * (opt->n)); return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_upper_bounds(nlopt_opt opt, const double *ub) { nlopt_unset_errmsg(opt); if (opt && (opt->n == 0 || ub)) { unsigned int i; if (opt->n > 0) memcpy(opt->ub, ub, sizeof(double) * (opt->n)); for (i = 0; i < opt->n; ++i) if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->ub[i] = opt->lb[i]; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_upper_bounds1(nlopt_opt opt, double ub) { nlopt_unset_errmsg(opt); if (opt) { unsigned i; for (i = 0; i < opt->n; ++i) { opt->ub[i] = ub; if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->ub[i] = opt->lb[i]; } return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_upper_bound(nlopt_opt opt, int i, double ub) { nlopt_unset_errmsg(opt); if (opt) { if (i < 0 || i >= (int) opt->n) return ERR(NLOPT_INVALID_ARGS, opt, "invalid bound index"); opt->ub[i] = ub; if (opt->lb[i] < opt->ub[i] && nlopt_istiny(opt->ub[i] - opt->lb[i])) opt->ub[i] = opt->lb[i]; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_get_upper_bounds(const nlopt_opt opt, double *ub) { nlopt_unset_errmsg(opt); if (opt && (opt->n == 0 || ub)) { memcpy(ub, opt->ub, sizeof(double) * (opt->n)); return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } /*************************************************************************/ #define AUGLAG_ALG(a) ((a) == NLOPT_AUGLAG || \ (a) == NLOPT_AUGLAG_EQ || \ (a) == NLOPT_LN_AUGLAG || \ (a) == NLOPT_LN_AUGLAG_EQ || \ (a) == NLOPT_LD_AUGLAG || \ (a) == NLOPT_LD_AUGLAG_EQ) nlopt_result NLOPT_STDCALL nlopt_remove_inequality_constraints(nlopt_opt opt) { unsigned i; nlopt_unset_errmsg(opt); if (!opt) return NLOPT_INVALID_ARGS; if (opt->munge_on_destroy) { nlopt_munge munge = opt->munge_on_destroy; for (i = 0; i < opt->m; ++i) munge(opt->fc[i].f_data); } for (i = 0; i < opt->m; ++i) free(opt->fc[i].tol); free(opt->fc); opt->fc = NULL; opt->m = opt->m_alloc = 0; return NLOPT_SUCCESS; } static nlopt_result add_constraint(nlopt_opt opt, unsigned *m, unsigned *m_alloc, nlopt_constraint ** c, unsigned fm, nlopt_func fc, nlopt_mfunc mfc, nlopt_precond pre, void *fc_data, const double *tol) { double *tolcopy; unsigned i; if ((fc && mfc) || (fc && fm != 1) || (!fc && !mfc)) return NLOPT_INVALID_ARGS; if (tol) for (i = 0; i < fm; ++i) if (tol[i] < 0) return ERR(NLOPT_INVALID_ARGS, opt, "negative constraint tolerance"); tolcopy = (double *) malloc(sizeof(double) * fm); if (fm && !tolcopy) return NLOPT_OUT_OF_MEMORY; if (tol) memcpy(tolcopy, tol, sizeof(double) * fm); else for (i = 0; i < fm; ++i) tolcopy[i] = 0; *m += 1; if (*m > *m_alloc) { /* allocate by repeated doubling so that we end up with O(log m) mallocs rather than O(m). */ *m_alloc = 2 * (*m); *c = (nlopt_constraint *) realloc(*c, sizeof(nlopt_constraint) * (*m_alloc)); if (!*c) { *m_alloc = *m = 0; free(tolcopy); return NLOPT_OUT_OF_MEMORY; } } (*c)[*m - 1].m = fm; (*c)[*m - 1].f = fc; (*c)[*m - 1].pre = pre; (*c)[*m - 1].mf = mfc; (*c)[*m - 1].f_data = fc_data; (*c)[*m - 1].tol = tolcopy; return NLOPT_SUCCESS; } static int inequality_ok(nlopt_algorithm algorithm) { /* nonlinear constraints are only supported with some algorithms */ return (algorithm == NLOPT_LD_MMA || algorithm == NLOPT_LD_CCSAQ || algorithm == NLOPT_LD_SLSQP || algorithm == NLOPT_LN_COBYLA || AUGLAG_ALG(algorithm) || algorithm == NLOPT_GN_ISRES || algorithm == NLOPT_GN_ORIG_DIRECT || algorithm == NLOPT_GN_ORIG_DIRECT_L || algorithm == NLOPT_GN_AGS); } nlopt_result NLOPT_STDCALL nlopt_add_inequality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc fc, void *fc_data, const double *tol) { nlopt_result ret; nlopt_unset_errmsg(opt); if (!m) { /* empty constraints are always ok */ if (opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return NLOPT_SUCCESS; } if (!opt) ret = NLOPT_INVALID_ARGS; else if (!inequality_ok(opt->algorithm)) ret = ERR(NLOPT_INVALID_ARGS, opt, "invalid algorithm for constraints"); else ret = add_constraint(opt, &opt->m, &opt->m_alloc, &opt->fc, m, NULL, fc, NULL, fc_data, tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; } nlopt_result NLOPT_STDCALL nlopt_add_precond_inequality_constraint(nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data, double tol) { nlopt_result ret; nlopt_unset_errmsg(opt); if (!opt) ret = NLOPT_INVALID_ARGS; else if (!inequality_ok(opt->algorithm)) ret = ERR(NLOPT_INVALID_ARGS, opt, "invalid algorithm for constraints"); else ret = add_constraint(opt, &opt->m, &opt->m_alloc, &opt->fc, 1, fc, NULL, pre, fc_data, &tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; } nlopt_result NLOPT_STDCALL nlopt_add_inequality_constraint(nlopt_opt opt, nlopt_func fc, void *fc_data, double tol) { return nlopt_add_precond_inequality_constraint(opt, fc, NULL, fc_data, tol); } nlopt_result NLOPT_STDCALL nlopt_remove_equality_constraints(nlopt_opt opt) { unsigned i; nlopt_unset_errmsg(opt); if (!opt) return NLOPT_INVALID_ARGS; if (opt->munge_on_destroy) { nlopt_munge munge = opt->munge_on_destroy; for (i = 0; i < opt->p; ++i) munge(opt->h[i].f_data); } for (i = 0; i < opt->p; ++i) free(opt->h[i].tol); free(opt->h); opt->h = NULL; opt->p = opt->p_alloc = 0; return NLOPT_SUCCESS; } static int equality_ok(nlopt_algorithm algorithm) { /* equality constraints (h(x) = 0) only via some algorithms */ return (AUGLAG_ALG(algorithm) || algorithm == NLOPT_LD_SLSQP || algorithm == NLOPT_GN_ISRES || algorithm == NLOPT_LN_COBYLA); } nlopt_result NLOPT_STDCALL nlopt_add_equality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc fc, void *fc_data, const double *tol) { nlopt_result ret; nlopt_unset_errmsg(opt); if (!m) { /* empty constraints are always ok */ if (opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return NLOPT_SUCCESS; } if (!opt) ret = NLOPT_INVALID_ARGS; else if (!equality_ok(opt->algorithm)) ret = ERR(NLOPT_INVALID_ARGS, opt, "invalid algorithm for constraints"); else ret = add_constraint(opt, &opt->p, &opt->p_alloc, &opt->h, m, NULL, fc, NULL, fc_data, tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; } nlopt_result NLOPT_STDCALL nlopt_add_precond_equality_constraint(nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data, double tol) { nlopt_result ret; nlopt_unset_errmsg(opt); if (!opt) ret = NLOPT_INVALID_ARGS; else if (!equality_ok(opt->algorithm)) ret = ERR(NLOPT_INVALID_ARGS, opt, "invalid algorithm for constraints"); else ret = add_constraint(opt, &opt->p, &opt->p_alloc, &opt->h, 1, fc, NULL, pre, fc_data, &tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; } nlopt_result NLOPT_STDCALL nlopt_add_equality_constraint(nlopt_opt opt, nlopt_func fc, void *fc_data, double tol) { return nlopt_add_precond_equality_constraint(opt, fc, NULL, fc_data, tol); } /*************************************************************************/ #define SET(param, T, arg) \ nlopt_result NLOPT_STDCALL nlopt_set_##param(nlopt_opt opt, T arg) \ { \ if (opt) { \ nlopt_unset_errmsg(opt); \ opt->arg = arg; \ return NLOPT_SUCCESS; \ } \ return NLOPT_INVALID_ARGS; \ } #define GET(param, T, arg) T NLOPT_STDCALL \ nlopt_get_##param(const nlopt_opt opt) { \ return opt->arg; \ } #define GETSET(param, T, arg) GET(param, T, arg) SET(param, T, arg) GETSET(stopval, double, stopval) GETSET(ftol_rel, double, ftol_rel) GETSET(ftol_abs, double, ftol_abs) GETSET(xtol_rel, double, xtol_rel) nlopt_result NLOPT_STDCALL nlopt_set_xtol_abs(nlopt_opt opt, const double *xtol_abs) { if (opt) { nlopt_unset_errmsg(opt); if (!xtol_abs) { free(opt->xtol_abs); opt->xtol_abs = NULL; return NLOPT_SUCCESS; } if (!opt->xtol_abs && opt->n > 0) { opt->xtol_abs = (double *) calloc(opt->n, sizeof(double)); if (!opt->xtol_abs) return NLOPT_OUT_OF_MEMORY; } memcpy(opt->xtol_abs, xtol_abs, opt->n * sizeof(double)); return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_xtol_abs1(nlopt_opt opt, double xtol_abs) { if (opt) { unsigned i; nlopt_unset_errmsg(opt); if (!opt->xtol_abs && opt->n > 0) { opt->xtol_abs = (double *) calloc(opt->n, sizeof(double)); if (!opt->xtol_abs) return NLOPT_OUT_OF_MEMORY; } for (i = 0; i < opt->n; ++i) opt->xtol_abs[i] = xtol_abs; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_get_xtol_abs(const nlopt_opt opt, double *xtol_abs) { nlopt_unset_errmsg(opt); if (opt && (opt->n == 0 || xtol_abs)) { if (opt->xtol_abs) { memcpy(xtol_abs, opt->xtol_abs, sizeof(double) * (opt->n)); } else { unsigned i; for (i = 0; i < opt->n; ++i) xtol_abs[i] = 0; } return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_x_weights(nlopt_opt opt, const double *x_weights) { if (opt) { unsigned i; nlopt_unset_errmsg(opt); if (!x_weights) { free(opt->x_weights); opt->x_weights = NULL; return NLOPT_SUCCESS; } for (i = 0; i < opt->n; i++) if (x_weights[i] < 0) return ERR(NLOPT_INVALID_ARGS, opt, "invalid negative weight"); if (!opt->x_weights && opt->n > 0) { opt->x_weights = (double *) calloc(opt->n, sizeof(double)); if (!opt->x_weights) return NLOPT_OUT_OF_MEMORY; } if (opt->n > 0) memcpy(opt->x_weights, x_weights, opt->n * sizeof(double)); return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_set_x_weights1(nlopt_opt opt, double x_weight) { if (opt) { unsigned i; if (x_weight < 0) return ERR(NLOPT_INVALID_ARGS, opt, "invalid negative weight"); nlopt_unset_errmsg(opt); if (!opt->x_weights && opt->n > 0) { opt->x_weights = (double *) calloc(opt->n, sizeof(double)); if (!opt->x_weights) return NLOPT_OUT_OF_MEMORY; } for (i = 0; i < opt->n; ++i) opt->x_weights[i] = x_weight; return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } nlopt_result NLOPT_STDCALL nlopt_get_x_weights(const nlopt_opt opt, double *x_weights) { if (opt) { if (opt->n > 0 && !x_weights) return ERR(NLOPT_INVALID_ARGS, opt, "invalid NULL weights"); nlopt_unset_errmsg(opt); if (opt->x_weights) { memcpy(x_weights, opt->x_weights, sizeof(double) * (opt->n)); } else { unsigned i; for (i = 0; i < opt->n; ++i) x_weights[i] = 1; } return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } GETSET(maxeval, int, maxeval) GET(numevals, int, numevals) GETSET(maxtime, double, maxtime) /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_set_force_stop(nlopt_opt opt, int force_stop) { if (opt) { nlopt_unset_errmsg(opt); opt->force_stop = force_stop; if (opt->force_stop_child) return nlopt_set_force_stop(opt->force_stop_child, force_stop); return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } GET(force_stop, int, force_stop) nlopt_result NLOPT_STDCALL nlopt_force_stop(nlopt_opt opt) { return nlopt_set_force_stop(opt, 1); } /*************************************************************************/ GET(algorithm, nlopt_algorithm, algorithm) GET(dimension, unsigned, n) /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_set_local_optimizer(nlopt_opt opt, const nlopt_opt local_opt) { if (opt) { nlopt_unset_errmsg(opt); if (local_opt && local_opt->n != opt->n) return ERR(NLOPT_INVALID_ARGS, opt, "dimension mismatch in local optimizer"); nlopt_destroy(opt->local_opt); opt->local_opt = nlopt_copy(local_opt); if (local_opt) { if (!opt->local_opt) return NLOPT_OUT_OF_MEMORY; nlopt_set_lower_bounds(opt->local_opt, opt->lb); nlopt_set_upper_bounds(opt->local_opt, opt->ub); nlopt_remove_inequality_constraints(opt->local_opt); nlopt_remove_equality_constraints(opt->local_opt); nlopt_set_min_objective(opt->local_opt, NULL, NULL); nlopt_set_munge(opt->local_opt, NULL, NULL); opt->local_opt->force_stop = 0; } return NLOPT_SUCCESS; } return NLOPT_INVALID_ARGS; } /*************************************************************************/ GETSET(population, unsigned, stochastic_population) GETSET(vector_storage, unsigned, vector_storage) /*************************************************************************/ nlopt_result NLOPT_STDCALL nlopt_set_initial_step1(nlopt_opt opt, double dx) { unsigned i; if (!opt) return NLOPT_INVALID_ARGS; nlopt_unset_errmsg(opt); if (dx == 0) return ERR(NLOPT_INVALID_ARGS, opt, "zero step size"); if (!opt->dx && opt->n > 0) { opt->dx = (double *) malloc(sizeof(double) * (opt->n)); if (!opt->dx) return NLOPT_OUT_OF_MEMORY; } for (i = 0; i < opt->n; ++i) opt->dx[i] = dx; return NLOPT_SUCCESS; } nlopt_result NLOPT_STDCALL nlopt_set_initial_step(nlopt_opt opt, const double *dx) { unsigned i; if (!opt) return NLOPT_INVALID_ARGS; nlopt_unset_errmsg(opt); if (!dx) { free(opt->dx); opt->dx = NULL; return NLOPT_SUCCESS; } for (i = 0; i < opt->n; ++i) if (dx[i] == 0) return ERR(NLOPT_INVALID_ARGS, opt, "zero step size"); if (!opt->dx && nlopt_set_initial_step1(opt, 1) == NLOPT_OUT_OF_MEMORY) return NLOPT_OUT_OF_MEMORY; memcpy(opt->dx, dx, sizeof(double) * (opt->n)); return NLOPT_SUCCESS; } nlopt_result NLOPT_STDCALL nlopt_get_initial_step(const nlopt_opt opt, const double *x, double *dx) { if (!opt) return NLOPT_INVALID_ARGS; nlopt_unset_errmsg(opt); if (!opt->n) return NLOPT_SUCCESS; if (!opt->dx) { nlopt_opt o = (nlopt_opt) opt; /* discard const temporarily */ nlopt_result ret = nlopt_set_default_initial_step(o, x); if (ret != NLOPT_SUCCESS) return ret; memcpy(dx, o->dx, sizeof(double) * (opt->n)); free(o->dx); o->dx = NULL; /* don't save, since x-dependent */ } else memcpy(dx, opt->dx, sizeof(double) * (opt->n)); return NLOPT_SUCCESS; } nlopt_result NLOPT_STDCALL nlopt_set_default_initial_step(nlopt_opt opt, const double *x) { const double *lb, *ub; unsigned i; nlopt_unset_errmsg(opt); if (!opt || !x) return NLOPT_INVALID_ARGS; lb = opt->lb; ub = opt->ub; if (!opt->dx && nlopt_set_initial_step1(opt, 1) == NLOPT_OUT_OF_MEMORY) return NLOPT_OUT_OF_MEMORY; /* crude heuristics for initial step size of nonderivative algorithms */ for (i = 0; i < opt->n; ++i) { double step = HUGE_VAL; if (!nlopt_isinf(ub[i]) && !nlopt_isinf(lb[i]) && (ub[i] - lb[i]) * 0.25 < step && ub[i] > lb[i]) step = (ub[i] - lb[i]) * 0.25; if (!nlopt_isinf(ub[i]) && ub[i] - x[i] < step && ub[i] > x[i]) step = (ub[i] - x[i]) * 0.75; if (!nlopt_isinf(lb[i]) && x[i] - lb[i] < step && x[i] > lb[i]) step = (x[i] - lb[i]) * 0.75; if (nlopt_isinf(step)) { if (!nlopt_isinf(ub[i]) && fabs(ub[i] - x[i]) < fabs(step)) step = (ub[i] - x[i]) * 1.1; if (!nlopt_isinf(lb[i]) && fabs(x[i] - lb[i]) < fabs(step)) step = (x[i] - lb[i]) * 1.1; } if (nlopt_isinf(step) || nlopt_istiny(step)) { step = x[i]; } if (nlopt_isinf(step) || step == 0.0) step = 1; opt->dx[i] = step; } return NLOPT_SUCCESS; } /*************************************************************************/ void NLOPT_STDCALL nlopt_set_munge(nlopt_opt opt, nlopt_munge munge_on_destroy, nlopt_munge munge_on_copy) { if (opt) { opt->munge_on_destroy = munge_on_destroy; opt->munge_on_copy = munge_on_copy; } } void NLOPT_STDCALL nlopt_munge_data(nlopt_opt opt, nlopt_munge2 munge, void *data) { if (opt && munge) { unsigned i; opt->f_data = munge(opt->f_data, data); for (i = 0; i < opt->m; ++i) opt->fc[i].f_data = munge(opt->fc[i].f_data, data); for (i = 0; i < opt->p; ++i) opt->h[i].f_data = munge(opt->h[i].f_data, data); } } /*************************************************************************/ const char *nlopt_set_errmsg(nlopt_opt opt, const char *format, ...) { va_list ap; va_start(ap, format); opt->errmsg = nlopt_vsprintf(opt->errmsg, format, ap); va_end(ap); return opt->errmsg; } void nlopt_unset_errmsg(nlopt_opt opt) { if (opt) { free(opt->errmsg); opt->errmsg = NULL; } } const char *nlopt_get_errmsg(nlopt_opt opt) { return opt->errmsg; } /*************************************************************************/ stevengj-nlopt-88c424d/src/octave/000077500000000000000000000000001521061417600171065ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/octave/CMakeLists.txt000066400000000000000000000060371521061417600216540ustar00rootroot00000000000000set (MFILES NLOPT_GN_DIRECT.m NLOPT_GN_DIRECT_L.m NLOPT_GN_DIRECT_L_RAND.m NLOPT_GN_DIRECT_NOSCAL.m NLOPT_GN_DIRECT_L_NOSCAL.m NLOPT_GN_DIRECT_L_RAND_NOSCAL.m NLOPT_GN_ORIG_DIRECT.m NLOPT_GN_ORIG_DIRECT_L.m NLOPT_GD_STOGO.m NLOPT_GD_STOGO_RAND.m NLOPT_LD_LBFGS.m NLOPT_LN_PRAXIS.m NLOPT_LD_VAR1.m NLOPT_LD_VAR2.m NLOPT_LD_TNEWTON.m NLOPT_LD_TNEWTON_RESTART.m NLOPT_LD_TNEWTON_PRECOND.m NLOPT_LD_TNEWTON_PRECOND_RESTART.m NLOPT_GN_CRS2_LM.m NLOPT_GN_MLSL.m NLOPT_GD_MLSL.m NLOPT_GN_MLSL_LDS.m NLOPT_GD_MLSL_LDS.m NLOPT_LD_MMA.m NLOPT_LN_COBYLA.m NLOPT_LN_NEWUOA.m NLOPT_LN_NEWUOA_BOUND.m NLOPT_LN_NELDERMEAD.m NLOPT_LN_SBPLX.m NLOPT_LN_AUGLAG.m NLOPT_LD_AUGLAG.m NLOPT_LN_AUGLAG_EQ.m NLOPT_LD_AUGLAG_EQ.m NLOPT_LN_BOBYQA.m NLOPT_GN_ISRES.m NLOPT_AUGLAG.m NLOPT_AUGLAG_EQ.m NLOPT_G_MLSL.m NLOPT_G_MLSL_LDS.m NLOPT_LD_SLSQP.m NLOPT_LD_CCSAQ.m NLOPT_GN_ESCH.m NLOPT_GN_AGS.m) set (M_DATA ${MFILES} nlopt_minimize.m nlopt_minimize_constrained.m) if (Matlab_FOUND AND Matlab_MX_LIBRARY) matlab_add_mex (NAME nlopt_optimize-mex SRC nlopt_optimize-mex.c OUTPUT_NAME nlopt_optimize LINK_TO ${nlopt_lib}) target_include_directories (nlopt_optimize-mex PRIVATE ${PROJECT_SOURCE_DIR}/src/api) if (NLOPT_CXX) set_target_properties (nlopt_optimize-mex PROPERTIES LINKER_LANGUAGE CXX) endif () set (NLOPT_INSTALL_MEXDIR ${NLOPT_INSTALL_LIBDIR}/matlab CACHE STRING "mex dir") install (TARGETS nlopt_optimize-mex DESTINATION ${NLOPT_INSTALL_MEXDIR}) set (NLOPT_INSTALL_MDIR ${NLOPT_INSTALL_LIBDIR}/matlab CACHE STRING "m dir") install (FILES ${M_DATA} DESTINATION ${NLOPT_INSTALL_MDIR}) endif () if (OCTAVE_FOUND) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "#define NLOPT_OPTIMIZE_USAGE \\\n") file (STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt_optimize.m INPUT_LINES) foreach (INPUT_LINE ${INPUT_LINES}) string (REGEX REPLACE "^% " "" INPUT_LINE ${INPUT_LINE}) string (REGEX REPLACE "^%" "" INPUT_LINE ${INPUT_LINE}) foreach (repl_expr "tolerance" "help NLOPT_LN_SBPLX" "population") string (REGEX REPLACE "\"${repl_expr}\"" "${repl_expr}" INPUT_LINE "${INPUT_LINE}") endforeach () file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\"${INPUT_LINE}\\n\" \\\n") endforeach () file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\n") octave_add_oct (nlopt_optimize SOURCES nlopt_optimize-oct.cc ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h LINK_LIBRARIES ${nlopt_lib}) target_include_directories (nlopt_optimize PRIVATE ${OCTAVE_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/src/api) if (OCTAVE_VERSION_MAJOR GREATER 10) target_compile_features(nlopt_optimize PRIVATE cxx_std_17) endif() if (NOT DEFINED INSTALL_OCT_DIR) file (RELATIVE_PATH INSTALL_OCT_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_OCT_SITE_DIR}) endif () install (TARGETS nlopt_optimize DESTINATION ${INSTALL_OCT_DIR}) if (NOT DEFINED INSTALL_M_DIR) file (RELATIVE_PATH INSTALL_M_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_M_SITE_DIR}) endif () install (FILES ${M_DATA} DESTINATION ${INSTALL_M_DIR}) endif () stevengj-nlopt-88c424d/src/octave/NLOPT_AUGLAG.m000066400000000000000000000002271521061417600212010ustar00rootroot00000000000000% NLOPT_AUGLAG: Augmented Lagrangian method (needs sub-algorithm) % % See nlopt_minimize for more information. function val = NLOPT_AUGLAG val = 36; stevengj-nlopt-88c424d/src/octave/NLOPT_AUGLAG_EQ.m000066400000000000000000000002661521061417600215710ustar00rootroot00000000000000% NLOPT_AUGLAG_EQ: Augmented Lagrangian method for equality constraints (needs sub-algorithm) % % See nlopt_minimize for more information. function val = NLOPT_AUGLAG_EQ val = 37; stevengj-nlopt-88c424d/src/octave/NLOPT_GD_MLSL.m000066400000000000000000000002461521061417600213630ustar00rootroot00000000000000% NLOPT_GD_MLSL: Multi-level single-linkage (MLSL), random (global, derivative) % % See nlopt_minimize for more information. function val = NLOPT_GD_MLSL val = 21; stevengj-nlopt-88c424d/src/octave/NLOPT_GD_MLSL_LDS.m000066400000000000000000000002641521061417600220650ustar00rootroot00000000000000% NLOPT_GD_MLSL_LDS: Multi-level single-linkage (MLSL), quasi-random (global, derivative) % % See nlopt_minimize for more information. function val = NLOPT_GD_MLSL_LDS val = 23; stevengj-nlopt-88c424d/src/octave/NLOPT_GD_STOGO.m000066400000000000000000000002111521061417600214770ustar00rootroot00000000000000% NLOPT_GD_STOGO: StoGO (global, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_GD_STOGO val = 8; stevengj-nlopt-88c424d/src/octave/NLOPT_GD_STOGO_RAND.m000066400000000000000000000002521521061417600223100ustar00rootroot00000000000000% NLOPT_GD_STOGO_RAND: StoGO with randomized search (global, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_GD_STOGO_RAND val = 9; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_AGS.m000066400000000000000000000002621521061417600212360ustar00rootroot00000000000000% NLOPT_GN_AGS: global derivative-free optimization % with nonlinear inequality constraints. % % See nlopt_minimize for more information. function val = NLOPT_GN_AGS val = 43; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_CRS2_LM.m000066400000000000000000000002711521061417600217250ustar00rootroot00000000000000% NLOPT_GN_CRS2_LM: Controlled random search (CRS2) with local mutation (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_CRS2_LM val = 19; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT.m000066400000000000000000000002111521061417600215700ustar00rootroot00000000000000% NLOPT_GN_DIRECT: DIRECT (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT val = 0; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT_L.m000066400000000000000000000002171521061417600220510ustar00rootroot00000000000000% NLOPT_GN_DIRECT_L: DIRECT-L (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT_L val = 1; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT_L_NOSCAL.m000066400000000000000000000002461521061417600231120ustar00rootroot00000000000000% NLOPT_GN_DIRECT_L_NOSCAL: Unscaled DIRECT-L (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT_L_NOSCAL val = 4; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT_L_RAND.m000066400000000000000000000002441521061417600226550ustar00rootroot00000000000000% NLOPT_GN_DIRECT_L_RAND: Randomized DIRECT-L (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT_L_RAND val = 2; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT_L_RAND_NOSCAL.m000066400000000000000000000002731521061417600237160ustar00rootroot00000000000000% NLOPT_GN_DIRECT_L_RAND_NOSCAL: Unscaled Randomized DIRECT-L (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT_L_RAND_NOSCAL val = 5; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_DIRECT_NOSCAL.m000066400000000000000000000002401521061417600226310ustar00rootroot00000000000000% NLOPT_GN_DIRECT_NOSCAL: Unscaled DIRECT (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_DIRECT_NOSCAL val = 3; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_ESCH.m000066400000000000000000000002021521061417600213400ustar00rootroot00000000000000% NLOPT_GN_ESCH: ESCH evolutionary strategy % % See nlopt_minimize for more information. function val = NLOPT_GN_ESCH val = 42; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_ISRES.m000066400000000000000000000002551521061417600215130ustar00rootroot00000000000000% NLOPT_GN_ISRES: ISRES evolutionary constrained optimization (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_ISRES val = 35; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_MLSL.m000066400000000000000000000002511521061417600213710ustar00rootroot00000000000000% NLOPT_GN_MLSL: Multi-level single-linkage (MLSL), random (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_MLSL val = 20; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_MLSL_LDS.m000066400000000000000000000002671521061417600221020ustar00rootroot00000000000000% NLOPT_GN_MLSL_LDS: Multi-level single-linkage (MLSL), quasi-random (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_MLSL_LDS val = 22; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_ORIG_DIRECT.m000066400000000000000000000002441521061417600224160ustar00rootroot00000000000000% NLOPT_GN_ORIG_DIRECT: Original DIRECT version (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_ORIG_DIRECT val = 6; stevengj-nlopt-88c424d/src/octave/NLOPT_GN_ORIG_DIRECT_L.m000066400000000000000000000002521521061417600226700ustar00rootroot00000000000000% NLOPT_GN_ORIG_DIRECT_L: Original DIRECT-L version (global, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_GN_ORIG_DIRECT_L val = 7; stevengj-nlopt-88c424d/src/octave/NLOPT_G_MLSL.m000066400000000000000000000002551521061417600212570ustar00rootroot00000000000000% NLOPT_G_MLSL: Multi-level single-linkage (MLSL), random (global, needs sub-algorithm) % % See nlopt_minimize for more information. function val = NLOPT_G_MLSL val = 38; stevengj-nlopt-88c424d/src/octave/NLOPT_G_MLSL_LDS.m000066400000000000000000000002731521061417600217610ustar00rootroot00000000000000% NLOPT_G_MLSL_LDS: Multi-level single-linkage (MLSL), quasi-random (global, needs sub-algorithm) % % See nlopt_minimize for more information. function val = NLOPT_G_MLSL_LDS val = 39; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_AUGLAG.m000066400000000000000000000002331521061417600215550ustar00rootroot00000000000000% NLOPT_LD_AUGLAG: Augmented Lagrangian method (local, derivative) % % See nlopt_minimize for more information. function val = NLOPT_LD_AUGLAG val = 31; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_AUGLAG_EQ.m000066400000000000000000000002721521061417600221450ustar00rootroot00000000000000% NLOPT_LD_AUGLAG_EQ: Augmented Lagrangian method for equality constraints (local, derivative) % % See nlopt_minimize for more information. function val = NLOPT_LD_AUGLAG_EQ val = 33; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_CCSAQ.m000066400000000000000000000003261521061417600214520ustar00rootroot00000000000000% NLOPT_LD_CCSAQ: CCSA (Conservative Convex Separable Approximations) with simple quadratic approximations (local, derivative) % % See nlopt_minimize for more information. function val = NLOPT_LD_CCSAQ val = 41; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_LBFGS.m000066400000000000000000000002401521061417600214500ustar00rootroot00000000000000% NLOPT_LD_LBFGS: Limited-memory BFGS (L-BFGS) (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_LBFGS val = 11; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_MMA.m000066400000000000000000000002331521061417600212270ustar00rootroot00000000000000% NLOPT_LD_MMA: Method of Moving Asymptotes (MMA) (local, derivative) % % See nlopt_minimize for more information. function val = NLOPT_LD_MMA val = 24; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_SLSQP.m000066400000000000000000000002441521061417600215210ustar00rootroot00000000000000% NLOPT_LD_SLSQP: Sequential Quadratic Programming (SQP) (local, derivative) % % See nlopt_minimize for more information. function val = NLOPT_LD_SLSQP val = 40; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_TNEWTON.m000066400000000000000000000002301521061417600217500ustar00rootroot00000000000000% NLOPT_LD_TNEWTON: Truncated Newton (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_TNEWTON val = 15; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_TNEWTON_PRECOND.m000066400000000000000000000002671521061417600231340ustar00rootroot00000000000000% NLOPT_LD_TNEWTON_PRECOND: Preconditioned truncated Newton (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_TNEWTON_PRECOND val = 17; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_TNEWTON_PRECOND_RESTART.m000066400000000000000000000003271521061417600243350ustar00rootroot00000000000000% NLOPT_LD_TNEWTON_PRECOND_RESTART: Preconditioned truncated Newton with restarting (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_TNEWTON_PRECOND_RESTART val = 18; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_TNEWTON_RESTART.m000066400000000000000000000002701521061417600231600ustar00rootroot00000000000000% NLOPT_LD_TNEWTON_RESTART: Truncated Newton with restarting (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_TNEWTON_RESTART val = 16; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_VAR1.m000066400000000000000000000002501521061417600213250ustar00rootroot00000000000000% NLOPT_LD_VAR1: Limited-memory variable-metric, rank 1 (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_VAR1 val = 13; stevengj-nlopt-88c424d/src/octave/NLOPT_LD_VAR2.m000066400000000000000000000002501521061417600213260ustar00rootroot00000000000000% NLOPT_LD_VAR2: Limited-memory variable-metric, rank 2 (local, derivative-based) % % See nlopt_minimize for more information. function val = NLOPT_LD_VAR2 val = 14; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_AUGLAG.m000066400000000000000000000002361521061417600215720ustar00rootroot00000000000000% NLOPT_LN_AUGLAG: Augmented Lagrangian method (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_AUGLAG val = 30; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_AUGLAG_EQ.m000066400000000000000000000002751521061417600221620ustar00rootroot00000000000000% NLOPT_LN_AUGLAG_EQ: Augmented Lagrangian method for equality constraints (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_AUGLAG_EQ val = 32; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_BOBYQA.m000066400000000000000000000002751521061417600216120ustar00rootroot00000000000000% NLOPT_LN_BOBYQA: BOBYQA bound-constrained optimization via quadratic models (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_BOBYQA val = 34; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_COBYLA.m000066400000000000000000000002751521061417600216060ustar00rootroot00000000000000% NLOPT_LN_COBYLA: COBYLA (Constrained Optimization BY Linear Approximations) (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_COBYLA val = 25; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_NELDERMEAD.m000066400000000000000000000002501521061417600222260ustar00rootroot00000000000000% NLOPT_LN_NELDERMEAD: Nelder-Mead simplex algorithm (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_NELDERMEAD val = 28; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_NEWUOA.m000066400000000000000000000002711521061417600216270ustar00rootroot00000000000000% NLOPT_LN_NEWUOA: NEWUOA unconstrained optimization via quadratic models (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_NEWUOA val = 26; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_NEWUOA_BOUND.m000066400000000000000000000003171521061417600225570ustar00rootroot00000000000000% NLOPT_LN_NEWUOA_BOUND: Bound-constrained optimization via NEWUOA-based quadratic models (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_NEWUOA_BOUND val = 27; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_PRAXIS.m000066400000000000000000000002311521061417600216330ustar00rootroot00000000000000% NLOPT_LN_PRAXIS: Principal-axis, praxis (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_PRAXIS val = 12; stevengj-nlopt-88c424d/src/octave/NLOPT_LN_SBPLX.m000066400000000000000000000003041521061417600215160ustar00rootroot00000000000000% NLOPT_LN_SBPLX: Sbplx variant of Nelder-Mead (re-implementation of Rowan's Subplex) (local, no-derivative) % % See nlopt_minimize for more information. function val = NLOPT_LN_SBPLX val = 29; stevengj-nlopt-88c424d/src/octave/dummy.c000066400000000000000000000001121521061417600203770ustar00rootroot00000000000000#include int main(void) { printf("Hello world.\n"); return 0; } stevengj-nlopt-88c424d/src/octave/mkconstants.sh000077500000000000000000000013311521061417600220070ustar00rootroot00000000000000#!/bin/sh names=`egrep 'NLOPT_[LG][ND]|NLOPT_AUGLAG|NLOPT_G_MLSL' ../api/nlopt.h |sed 's/ //g' |tr = , |cut -d, -f1` i=0 gcc -I../util -I.. -E ../api/general.c | perl -pe 's/^ *\n//' > foo.c desc_start=`grep -n nlopt_algorithm_names foo.c |cut -d: -f1 |head -1` for n in $names; do if test -r $n.m; then perl -pi -e "s/val = [0-9]+;/val = $i;/" $n.m else descline=`expr $i + $desc_start + 1` desc=`tail -n +$descline foo.c |head -1 |cut -d\" -f2` cat > $n.m < 0 indicates verbose output % Minimization stops when any one of these conditions is met; any % condition that is omitted from stop will be ignored. WARNING: % not all algorithms interpret the stopping criteria in exactly the % same way, and in any case ftol/xtol specify only a crude estimate % for the accuracy of the minimum function value/x. % % The algorithm should be one of the following constants (name and % interpretation are the same as for the C function). Names with % _G*_ are global optimization, and names with _L*_ are local % optimization. Names with _*N_ are derivative-free, while names % with _*D_ are gradient-based algorithms. Algorithms: % % NLOPT_GD_MLSL_LDS, NLOPT_GD_MLSL, NLOPT_GD_STOGO, NLOPT_GD_STOGO_RAND, % NLOPT_GN_CRS2_LM, NLOPT_GN_DIRECT_L, NLOPT_GN_DIRECT_L_NOSCAL, % NLOPT_GN_DIRECT_L_RAND, NLOPT_GN_DIRECT_L_RAND_NOSCAL, NLOPT_GN_DIRECT, % NLOPT_GN_DIRECT_NOSCAL, NLOPT_GN_ISRES, NLOPT_GN_MLSL_LDS, NLOPT_GN_MLSL, % NLOPT_GN_ORIG_DIRECT_L, NLOPT_GN_ORIG_DIRECT, NLOPT_LD_AUGLAG_EQ, % NLOPT_LD_AUGLAG, NLOPT_LD_LBFGS, NLOPT_LD_LBFGS_NOCEDAL, NLOPT_LD_MMA, % NLOPT_LD_TNEWTON, NLOPT_LD_TNEWTON_PRECOND, % NLOPT_LD_TNEWTON_PRECOND_RESTART, NLOPT_LD_TNEWTON_RESTART, % NLOPT_LD_VAR1, NLOPT_LD_VAR2, NLOPT_LN_AUGLAG_EQ, NLOPT_LN_AUGLAG, % NLOPT_LN_BOBYQA, NLOPT_LN_COBYLA, NLOPT_LN_NELDERMEAD, % NLOPT_LN_NEWUOA_BOUND, NLOPT_LN_NEWUOA, NLOPT_LN_PRAXIS, NLOPT_LN_SBPLX % % For more information on individual algorithms, see their individual % help pages (e.g. "help NLOPT_LN_SBPLX"). function [xopt, fmin, retcode] = nlopt_minimize(algorithm, f, f_data, lb, ub, xinit, stop) [xopt, fmin, retcode] = nlopt_minimize_constrained(algorithm, f, f_data, {}, {}, lb, ub, xinit, stop); stevengj-nlopt-88c424d/src/octave/nlopt_minimize_constrained.m000066400000000000000000000120661521061417600247170ustar00rootroot00000000000000% Usage: [xopt, fmin, retcode] = nlopt_minimize_constrained % (algorithm, f, f_data, % fc, fc_data, lb, ub, % xinit, stop) % % Minimizes a nonlinear multivariable function f(x, f_data{:}), subject % to nonlinear constraints described by fc and fc_data (see below), where % x is a row vector, returning the optimal x found (xopt) along with % the minimum function value (fmin = f(xopt)) and a return code (retcode). % A variety of local and global optimization algorithms can be used, % as specified by the algorithm parameter described below. lb and ub % are row vectors giving the upper and lower bounds on x, xinit is % a row vector giving the initial guess for x, and stop is a struct % containing termination conditions (see below). % % This function is a front-end for the external routine % nlopt_minimize_constrained in the free NLopt nonlinear-optimization % library, which is a wrapper around a number of free/open-source % optimization subroutines. More details can be found on the NLopt % web page (ab-initio.mit.edu/nlopt) and also under % 'man nlopt_minimize_constrained' on Unix. % % f should be a handle (@) to a function of the form: % % [val, gradient] = f(x, ...) % % where x is a row vector, val is the function value f(x), and gradient % is a row vector giving the gradient of the function with respect to x. % The gradient is only used for gradient-based optimization algorithms; % some of the algorithms (below) are derivative-free and only require % f to return val (its value). f can take additional arguments (...) % which are passed via the argument f_data: f_data is a cell array % of the additional arguments to pass to f. (Recall that cell arrays % are specified by curly brackets { ... }. For example, pass f_data={} % for functions that require no additional arguments.) % % A few of the algorithms (below) support nonlinear constraints, % in particular NLOPT_LD_MMA and NLOPT_LN_COBYLA. These (if any) % are specified by fc and fc_data. fc is a cell array of % function handles, and fc_data is a cell array of cell arrays of the % corresponding arguments. Both must have the same length m, the % number of nonlinear constraints. That is, fc{i} is a handle % to a function of the form: % % [val, gradient] = fc(x, ...) % % (where the gradient is only used for gradient-based algorithms), % and the ... arguments are given by fc_data{i}{:}. % % If you have no nonlinear constraints, i.e. fc = fc_data = {}, then % it is equivalent to calling the the nlopt_minimize() function, % which omits the fc and fc_data arguments. % % stop describes the termination criteria, and is a struct with a % number of optional fields: % stop.ftol_rel = fractional tolerance on function value % stop.ftol_abs = absolute tolerance on function value % stop.xtol_rel = fractional tolerance on x % stop.xtol_abs = row vector of absolute tolerances on x components % stop.fmin_max = stop when f < fmin_max is found % stop.maxeval = maximum number of function evaluations % stop.maxtime = maximum run time in seconds % stop.verbose = > 0 indicates verbose output % Minimization stops when any one of these conditions is met; any % condition that is omitted from stop will be ignored. WARNING: % not all algorithms interpret the stopping criteria in exactly the % same way, and in any case ftol/xtol specify only a crude estimate % for the accuracy of the minimum function value/x. % % The algorithm should be one of the following constants (name and % interpretation are the same as for the C function). Names with % _G*_ are global optimization, and names with _L*_ are local % optimization. Names with _*N_ are derivative-free, while names % with _*D_ are gradient-based algorithms. Algorithms: % % NLOPT_GD_MLSL_LDS, NLOPT_GD_MLSL, NLOPT_GD_STOGO, NLOPT_GD_STOGO_RAND, % NLOPT_GN_CRS2_LM, NLOPT_GN_DIRECT_L, NLOPT_GN_DIRECT_L_NOSCAL, % NLOPT_GN_DIRECT_L_RAND, NLOPT_GN_DIRECT_L_RAND_NOSCAL, NLOPT_GN_DIRECT, % NLOPT_GN_DIRECT_NOSCAL, NLOPT_GN_ISRES, NLOPT_GN_MLSL_LDS, NLOPT_GN_MLSL, % NLOPT_GN_ORIG_DIRECT_L, NLOPT_GN_ORIG_DIRECT, NLOPT_LD_AUGLAG_EQ, % NLOPT_LD_AUGLAG, NLOPT_LD_LBFGS, NLOPT_LD_LBFGS_NOCEDAL, NLOPT_LD_MMA, % NLOPT_LD_TNEWTON, NLOPT_LD_TNEWTON_PRECOND, % NLOPT_LD_TNEWTON_PRECOND_RESTART, NLOPT_LD_TNEWTON_RESTART, % NLOPT_LD_VAR1, NLOPT_LD_VAR2, NLOPT_LN_AUGLAG_EQ, NLOPT_LN_AUGLAG, % NLOPT_LN_BOBYQA, NLOPT_LN_COBYLA, NLOPT_LN_NELDERMEAD, % NLOPT_LN_NEWUOA_BOUND, NLOPT_LN_NEWUOA, NLOPT_LN_PRAXIS, NLOPT_LN_SBPLX % % For more information on individual algorithms, see their individual % help pages (e.g. "help NLOPT_LN_SBPLX"). function [xopt, fmin, retcode] = nlopt_minimize_constrained(algorithm, f, f_data, fc, fc_data, lb, ub, xinit, stop) opt = stop; if (isfield(stop, 'minf_max')) opt.stopval = stop.minf_max; end opt.algorithm = algorithm; opt.min_objective = @(x) f(x, f_data{:}); opt.lower_bounds = lb; opt.upper_bounds = ub; for i = 1:length(fc) opt.fc{i} = @(x) fc{i}(x, fc_data{i}{:}); end [xopt, fmin, retcode] = nlopt_optimize(opt, xinit); stevengj-nlopt-88c424d/src/octave/nlopt_optimize-mex.c000066400000000000000000000303541521061417600231220ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Matlab MEX interface to NLopt, and in particular to nlopt_optimize */ #include #include #include #include #include #include "nlopt.h" #define CHECK0(cond, msg) if (!(cond)) mexErrMsgTxt(msg); static double struct_val_default(const mxArray *s, const char *name, double dflt) { mxArray *val = mxGetField(s, 0, name); if (val) { CHECK0(mxIsNumeric(val) && !mxIsComplex(val) && mxGetM(val) * mxGetN(val) == 1, "opt fields, other than xtol_abs, must be real scalars"); return mxGetScalar(val); } return dflt; } static double *struct_arrval(const mxArray *s, const char *name, unsigned n, double *dflt) { mxArray *val = mxGetField(s, 0, name); if (val) { CHECK0(mxIsNumeric(val) && !mxIsComplex(val) && mxGetM(val) * mxGetN(val) == n, "opt vector field is not of length n"); return mxGetPr(val); } return dflt; } static mxArray *struct_funcval(const mxArray *s, const char *name) { mxArray *val = mxGetField(s, 0, name); if (val) { CHECK0(mxIsChar(val) || mxIsFunctionHandle(val), "opt function field is not a function handle/name"); return val; } return NULL; } static double *fill(double *arr, unsigned n, double val) { unsigned i; for (i = 0; i < n; ++i) arr[i] = val; return arr; } #define FLEN 128 /* max length of user function name */ #define MAXRHS 3 /* max nrhs for user function */ typedef struct user_function_data_s { char f[FLEN]; mxArray *plhs[2]; mxArray *prhs[MAXRHS]; int xrhs, nrhs; int verbose, neval; struct user_function_data_s *dpre; nlopt_opt opt; } user_function_data; static double user_function(unsigned n, const double *x, double *gradient, /* NULL if not needed */ void *d_) { user_function_data *d = (user_function_data *) d_; double f; d->plhs[0] = d->plhs[1] = NULL; memcpy(mxGetPr(d->prhs[d->xrhs]), x, n * sizeof(double)); CHECK0(0 == mexCallMATLAB(gradient ? 2 : 1, d->plhs, d->nrhs, d->prhs, d->f), "error calling user function"); CHECK0(mxIsNumeric(d->plhs[0]) && !mxIsComplex(d->plhs[0]) && mxGetM(d->plhs[0]) * mxGetN(d->plhs[0]) == 1, "user function must return real scalar"); f = mxGetScalar(d->plhs[0]); mxDestroyArray(d->plhs[0]); if (gradient) { CHECK0(mxIsDouble(d->plhs[1]) && !mxIsComplex(d->plhs[1]) && (mxGetM(d->plhs[1]) == 1 || mxGetN(d->plhs[1]) == 1) && mxGetM(d->plhs[1]) * mxGetN(d->plhs[1]) == n, "gradient vector from user function is the wrong size"); memcpy(gradient, mxGetPr(d->plhs[1]), n * sizeof(double)); mxDestroyArray(d->plhs[1]); } d->neval++; if (d->verbose) mexPrintf("nlopt_optimize eval #%d: %g\n", d->neval, f); if (mxIsNaN(f)) nlopt_force_stop(d->opt); return f; } static void user_pre(unsigned n, const double *x, const double *v, double *vpre, void *d_) { user_function_data *d = ((user_function_data *) d_)->dpre; d->plhs[0] = d->plhs[1] = NULL; memcpy(mxGetPr(d->prhs[d->xrhs]), x, n * sizeof(double)); memcpy(mxGetPr(d->prhs[d->xrhs + 1]), v, n * sizeof(double)); CHECK0(0 == mexCallMATLAB(1, d->plhs, d->nrhs, d->prhs, d->f), "error calling user function"); CHECK0(mxIsDouble(d->plhs[0]) && !mxIsComplex(d->plhs[0]) && (mxGetM(d->plhs[0]) == 1 || mxGetN(d->plhs[0]) == 1) && mxGetM(d->plhs[0]) * mxGetN(d->plhs[0]) == n, "vpre vector from user function is the wrong size"); memcpy(vpre, mxGetPr(d->plhs[0]), n * sizeof(double)); mxDestroyArray(d->plhs[0]); d->neval++; if (d->verbose) mexPrintf("nlopt_optimize precond eval #%d\n", d->neval); } #define CHECK1(cond, msg) if (!(cond)) { mxFree(tmp); nlopt_destroy(opt); nlopt_destroy(local_opt); mexWarnMsgTxt(msg); return NULL; }; nlopt_opt make_opt(const mxArray *opts, unsigned n) { nlopt_opt opt = NULL, local_opt = NULL; nlopt_algorithm algorithm; double *tmp = NULL; unsigned i; algorithm = (nlopt_algorithm) struct_val_default(opts, "algorithm", NLOPT_NUM_ALGORITHMS); CHECK1(((int)algorithm) >= 0 && algorithm < NLOPT_NUM_ALGORITHMS, "invalid opt.algorithm"); tmp = (double *) mxCalloc(n, sizeof(double)); opt = nlopt_create(algorithm, n); CHECK1(opt, "nlopt: out of memory"); nlopt_set_lower_bounds(opt, struct_arrval(opts, "lower_bounds", n, fill(tmp, n, -HUGE_VAL))); nlopt_set_upper_bounds(opt, struct_arrval(opts, "upper_bounds", n, fill(tmp, n, +HUGE_VAL))); nlopt_set_stopval(opt, struct_val_default(opts, "stopval", -HUGE_VAL)); nlopt_set_ftol_rel(opt, struct_val_default(opts, "ftol_rel", 0.0)); nlopt_set_ftol_abs(opt, struct_val_default(opts, "ftol_abs", 0.0)); nlopt_set_xtol_rel(opt, struct_val_default(opts, "xtol_rel", 0.0)); nlopt_set_xtol_abs(opt, struct_arrval(opts, "xtol_abs", n, fill(tmp, n, 0.0))); nlopt_set_x_weights(opt, struct_arrval(opts, "x_weights", n, fill(tmp, n, 1.0))); nlopt_set_maxeval(opt, struct_val_default(opts, "maxeval", 0.0) < 0 ? 0 : struct_val_default(opts, "maxeval", 0.0)); nlopt_set_maxtime(opt, struct_val_default(opts, "maxtime", 0.0)); nlopt_set_population(opt, struct_val_default(opts, "population", 0)); nlopt_set_vector_storage(opt, struct_val_default(opts, "vector_storage", 0)); if (struct_arrval(opts, "initial_step", n, NULL)) nlopt_set_initial_step(opt, struct_arrval(opts, "initial_step", n, NULL)); if (mxGetField(opts, 0, "local_optimizer")) { const mxArray *local_opts = mxGetField(opts, 0, "local_optimizer"); CHECK1(mxIsStruct(local_opts), "opt.local_optimizer must be a structure"); CHECK1(local_opt = make_opt(local_opts, n), "error initializing local optimizer"); nlopt_set_local_optimizer(opt, local_opt); nlopt_destroy(local_opt); local_opt = NULL; } mxFree(tmp); return opt; } #define CHECK(cond, msg) if (!(cond)) { mxFree(dh); mxFree(dfc); nlopt_destroy(opt); mexErrMsgTxt(msg); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { unsigned n; double *x, *x0, opt_f; nlopt_result ret; mxArray *x_mx, *mx; user_function_data d, dpre, *dfc = NULL, *dh = NULL; nlopt_opt opt = NULL; CHECK(nrhs == 2 && nlhs <= 3, "wrong number of arguments"); /* options = prhs[0] */ CHECK(mxIsStruct(prhs[0]), "opt must be a struct"); /* x0 = prhs[1] */ CHECK(mxIsDouble(prhs[1]) && !mxIsComplex(prhs[1]) && (mxGetM(prhs[1]) == 1 || mxGetN(prhs[1]) == 1), "x must be real row or column vector"); n = mxGetM(prhs[1]) * mxGetN(prhs[1]), x0 = mxGetPr(prhs[1]); CHECK(opt = make_opt(prhs[0], n), "error initializing nlopt options"); d.neval = 0; d.verbose = (int) struct_val_default(prhs[0], "verbose", 0); d.opt = opt; /* function f = prhs[1] */ mx = struct_funcval(prhs[0], "min_objective"); if (!mx) mx = struct_funcval(prhs[0], "max_objective"); CHECK(mx, "either opt.min_objective or opt.max_objective must exist"); if (mxIsChar(mx)) { CHECK(mxGetString(mx, d.f, FLEN) == 0, "error reading function name string (too long?)"); d.nrhs = 1; d.xrhs = 0; } else { d.prhs[0] = mx; strcpy(d.f, "feval"); d.nrhs = 2; d.xrhs = 1; } d.prhs[d.xrhs] = mxCreateDoubleMatrix(1, n, mxREAL); if ((mx = struct_funcval(prhs[0], "pre"))) { CHECK(mxIsChar(mx) || mxIsFunctionHandle(mx), "pre must contain function handles or function names"); if (mxIsChar(mx)) { CHECK(mxGetString(mx, dpre.f, FLEN) == 0, "error reading function name string (too long?)"); dpre.nrhs = 2; dpre.xrhs = 0; } else { dpre.prhs[0] = mx; strcpy(dpre.f, "feval"); dpre.nrhs = 3; dpre.xrhs = 1; } dpre.verbose = d.verbose > 2; dpre.opt = opt; dpre.neval = 0; dpre.prhs[dpre.xrhs] = d.prhs[d.xrhs]; dpre.prhs[d.xrhs+1] = mxCreateDoubleMatrix(1, n, mxREAL); d.dpre = &dpre; if (struct_funcval(prhs[0], "min_objective")) nlopt_set_precond_min_objective(opt, user_function,user_pre,&d); else nlopt_set_precond_max_objective(opt, user_function,user_pre,&d); } else { dpre.nrhs = 0; if (struct_funcval(prhs[0], "min_objective")) nlopt_set_min_objective(opt, user_function, &d); else nlopt_set_max_objective(opt, user_function, &d); } if ((mx = mxGetField(prhs[0], 0, "fc"))) { int j, m; double *fc_tol; CHECK(mxIsCell(mx), "fc must be a Cell array"); m = mxGetM(mx) * mxGetN(mx);; dfc = (user_function_data *) mxCalloc(m, sizeof(user_function_data)); fc_tol = struct_arrval(prhs[0], "fc_tol", m, NULL); for (j = 0; j < m; ++j) { mxArray *fc = mxGetCell(mx, j); CHECK(mxIsChar(fc) || mxIsFunctionHandle(fc), "fc must contain function handles or function names"); if (mxIsChar(fc)) { CHECK(mxGetString(fc, dfc[j].f, FLEN) == 0, "error reading function name string (too long?)"); dfc[j].nrhs = 1; dfc[j].xrhs = 0; } else { dfc[j].prhs[0] = fc; strcpy(dfc[j].f, "feval"); dfc[j].nrhs = 2; dfc[j].xrhs = 1; } dfc[j].verbose = d.verbose > 1; dfc[j].opt = opt; dfc[j].neval = 0; dfc[j].prhs[dfc[j].xrhs] = d.prhs[d.xrhs]; CHECK(nlopt_add_inequality_constraint(opt, user_function, dfc + j, fc_tol ? fc_tol[j] : 0) > 0, "nlopt error adding inequality constraint"); } } if ((mx = mxGetField(prhs[0], 0, "h"))) { int j, m; double *h_tol; CHECK(mxIsCell(mx), "h must be a Cell array"); m = mxGetM(mx) * mxGetN(mx);; dh = (user_function_data *) mxCalloc(m, sizeof(user_function_data)); h_tol = struct_arrval(prhs[0], "h_tol", m, NULL); for (j = 0; j < m; ++j) { mxArray *h = mxGetCell(mx, j); CHECK(mxIsChar(h) || mxIsFunctionHandle(h), "h must contain function handles or function names"); if (mxIsChar(h)) { CHECK(mxGetString(h, dh[j].f, FLEN) == 0, "error reading function name string (too long?)"); dh[j].nrhs = 1; dh[j].xrhs = 0; } else { dh[j].prhs[0] = h; strcpy(dh[j].f, "feval"); dh[j].nrhs = 2; dh[j].xrhs = 1; } dh[j].verbose = d.verbose > 1; dh[j].opt = opt; dh[j].neval = 0; dh[j].prhs[dh[j].xrhs] = d.prhs[d.xrhs]; CHECK(nlopt_add_equality_constraint(opt, user_function, dh + j, h_tol ? h_tol[j] : 0) > 0, "nlopt error adding equality constraint"); } } x_mx = mxCreateDoubleMatrix(mxGetM(prhs[1]), mxGetN(prhs[1]), mxREAL); x = mxGetPr(x_mx); memcpy(x, x0, sizeof(double) * n); ret = nlopt_optimize(opt, x, &opt_f); mxFree(dh); mxFree(dfc); mxDestroyArray(d.prhs[d.xrhs]); if (dpre.nrhs > 0) mxDestroyArray(dpre.prhs[d.xrhs+1]); nlopt_destroy(opt); plhs[0] = x_mx; if (nlhs > 1) { plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL); *(mxGetPr(plhs[1])) = opt_f; } if (nlhs > 2) { plhs[2] = mxCreateDoubleMatrix(1, 1, mxREAL); *(mxGetPr(plhs[2])) = (int) ret; } } stevengj-nlopt-88c424d/src/octave/nlopt_optimize-oct.cc000066400000000000000000000262411521061417600232610ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include "nlopt.h" #include "nlopt_optimize_usage.h" #include #if OCTAVE_MAJOR_VERSION < 3 || (OCTAVE_MAJOR_VERSION == 3 && OCTAVE_MINOR_VERSION < 8) # define octave_map Octave_map #endif #if OCTAVE_MAJOR_VERSION < 4 || (OCTAVE_MAJOR_VERSION == 4 && OCTAVE_MINOR_VERSION < 2) # define err_user_supplied_eval gripe_user_supplied_eval # define err_user_returned_invalid gripe_user_returned_invalid # define numel length #endif #if OCTAVE_MAJOR_VERSION < 4 || (OCTAVE_MAJOR_VERSION == 4 && OCTAVE_MINOR_VERSION < 4) # define iscell is_cell # define isstruct is_map #endif static int struct_val_default(octave_map &m, const std::string& k, int dflt) { if (m.contains(k)) { if (m.contents(k).numel() == 1 && (m.contents(k))(0).is_real_scalar()) return (m.contents(k))(0).int_value(); } return dflt; } static double struct_val_default(octave_map &m, const std::string& k, double dflt) { if (m.contains(k)) { if (m.contents(k).numel() == 1 && (m.contents(k))(0).is_real_scalar()) return (m.contents(k))(0).double_value(); } return dflt; } static Matrix struct_val_default(octave_map &m, const std::string& k, Matrix &dflt) { if (m.contains(k)) { if ((m.contents(k)).numel() == 1) { if ((m.contents(k))(0).is_real_scalar()) return Matrix(1, dflt.numel(), (m.contents(k))(0).double_value()); else if ((m.contents(k))(0).is_real_matrix()) return (m.contents(k))(0).matrix_value(); } } return dflt; } typedef struct { octave_value f; int neval, verbose; nlopt_opt opt; } user_function_data; static double user_function(unsigned n, const double *x, double *gradient, /* NULL if not needed */ void *data_) { user_function_data *data = static_cast(data_); octave_value_list args(1, 0); Matrix xm(1,n); for (unsigned i = 0; i < n; ++i) xm(i) = x[i]; args(0) = xm; octave_value_list res #if OCTAVE_MAJOR_VERSION > 4 || (OCTAVE_MAJOR_VERSION == 4 && OCTAVE_MINOR_VERSION > 2) = octave::feval(data->f, args, gradient ? 2 : 1); #else = data->f.do_multi_index_op(gradient ? 2 : 1, args); #endif if (res.length() < (gradient ? 2 : 1)) err_user_supplied_eval("nlopt_optimize"); else if (!res(0).is_real_scalar() || (gradient && !res(1).is_real_matrix() && !(n == 1 && res(1).is_real_scalar()))) err_user_returned_invalid("nlopt_optimize"); else { if (gradient) { if (n == 1 && res(1).is_real_scalar()) gradient[0] = res(1).double_value(); else { Matrix grad = res(1).matrix_value(); for (unsigned i = 0; i < n; ++i) gradient[i] = grad(i); } } data->neval++; if (data->verbose) printf("nlopt_optimize eval #%d: %g\n", data->neval, res(0).double_value()); double f = res(0).double_value(); if (f != f /* isnan(f) */) nlopt_force_stop(data->opt); return f; } return 0; } static double user_function1(unsigned n, const double *x, double *gradient, /* NULL if not needed */ void *data_) { octave_value* f = static_cast(data_); octave_value_list args(1, 0); Matrix xm(1,n); for (unsigned i = 0; i < n; ++i) xm(i) = x[i]; args(0) = xm; octave_value_list res #if OCTAVE_MAJOR_VERSION > 4 || (OCTAVE_MAJOR_VERSION == 4 && OCTAVE_MINOR_VERSION > 2) = octave::feval(*f, args, gradient ? 2 : 1); #else = f->do_multi_index_op(gradient ? 2 : 1, args); #endif if (res.length() < (gradient ? 2 : 1)) err_user_supplied_eval("nlopt_optimize"); else if (!res(0).is_real_scalar() || (gradient && !res(1).is_real_matrix() && !(n == 1 && res(1).is_real_scalar()))) err_user_returned_invalid("nlopt_optimize"); else { if (gradient) { if (n == 1 && res(1).is_real_scalar()) gradient[0] = res(1).double_value(); else { Matrix grad = res(1).matrix_value(); for (unsigned i = 0; i < n; ++i) gradient[i] = grad(i); } } return res(0).double_value(); } return 0; } #define CHECK1(cond, msg) if (!(cond)) { fprintf(stderr, msg "\n\n"); nlopt_destroy(opt); nlopt_destroy(local_opt); return NULL; } nlopt_opt make_opt(octave_map &opts, int n) { nlopt_opt opt = NULL, local_opt = NULL; nlopt_algorithm algorithm = nlopt_algorithm(struct_val_default(opts, "algorithm", NLOPT_NUM_ALGORITHMS)); CHECK1(((int)algorithm) >= 0 && algorithm < NLOPT_NUM_ALGORITHMS, "invalid opt.algorithm"); opt = nlopt_create(algorithm, n); CHECK1(opt, "nlopt: out of memory"); Matrix m_inf(1, n, -HUGE_VAL); Matrix lb = struct_val_default(opts, "lower_bounds", m_inf); CHECK1(n == lb.numel(), "wrong length of opt.lower_bounds"); CHECK1(nlopt_set_lower_bounds(opt, lb.data()) > 0, "nlopt: out of memory"); Matrix p_inf(1, n, +HUGE_VAL); Matrix ub = struct_val_default(opts, "upper_bounds", p_inf); CHECK1(n == ub.numel(), "wrong length of opt.upper_bounds"); CHECK1(nlopt_set_upper_bounds(opt, ub.data()) > 0, "nlopt: out of memory"); nlopt_set_stopval(opt, struct_val_default(opts, "stopval", -HUGE_VAL)); nlopt_set_ftol_rel(opt, struct_val_default(opts, "ftol_rel", 0.0)); nlopt_set_ftol_abs(opt, struct_val_default(opts, "ftol_abs", 0.0)); nlopt_set_xtol_rel(opt, struct_val_default(opts, "xtol_rel", 0.0)); { Matrix zeros(1, n, 0.0); Matrix xtol_abs = struct_val_default(opts, "xtol_abs", zeros); CHECK1(n == xtol_abs.numel(), "stop.xtol_abs must have same length as x"); CHECK1(nlopt_set_xtol_abs(opt, xtol_abs.data())>0, "nlopt: out of memory"); } { Matrix ones(1, n, 1.0); Matrix x_weights = struct_val_default(opts, "x_weights", ones); CHECK1(n == x_weights.numel(), "stop.x_weights must have same length as x"); CHECK1(nlopt_set_x_weights(opt, x_weights.data())>0, "nlopt: invalid x_weights or out of memory"); } nlopt_set_maxeval(opt, struct_val_default(opts, "maxeval", 0) < 0 ? 0 : struct_val_default(opts, "maxeval", 0)); nlopt_set_maxtime(opt, struct_val_default(opts, "maxtime", 0.0)); nlopt_set_population(opt, struct_val_default(opts, "population", 0)); nlopt_set_vector_storage(opt, struct_val_default(opts, "vector_storage", 0)); if (opts.contains("initial_step")) { Matrix zeros(1, n, 0.0); Matrix initial_step = struct_val_default(opts, "initial_step", zeros); CHECK1(n == initial_step.numel(), "stop.initial_step must have same length as x"); CHECK1(nlopt_set_initial_step(opt, initial_step.data()) > 0, "nlopt: out of memory"); } if (opts.contains("local_optimizer")) { CHECK1(opts.contents("local_optimizer").numel() == 1 && (opts.contents("local_optimizer"))(0).isstruct(), "opt.local_optimizer must be a structure"); octave_map local_opts = (opts.contents("local_optimizer"))(0).map_value(); CHECK1((local_opt = make_opt(local_opts, n)), "error initializing local optimizer"); nlopt_set_local_optimizer(opt, local_opt); nlopt_destroy(local_opt); local_opt = NULL; } return opt; } #define CHECK(cond, msg) if (!(cond)) { fprintf(stderr, msg "\n\n"); nlopt_destroy(opt); return retval; } DEFUN_DLD(nlopt_optimize, args, nargout, NLOPT_OPTIMIZE_USAGE) { octave_value_list retval; nlopt_opt opt = NULL; CHECK(args.length() == 2 && nargout <= 3, "wrong number of args"); CHECK(args(0).isstruct(), "opt must be structure") octave_map opts = args(0).map_value(); CHECK(args(1).is_real_matrix() || args(1).is_real_scalar(), "x must be real vector"); Matrix x = args(1).is_real_scalar() ? Matrix(1, 1, args(1).double_value()) : args(1).matrix_value(); int n = x.numel(); CHECK((opt = make_opt(opts, n)), "error initializing nlopt options"); user_function_data d; d.neval = 0; d.verbose = struct_val_default(opts, "verbose", 0); d.opt = opt; if (opts.contains("min_objective")) { CHECK(opts.contents("min_objective").numel() == 1 && (opts.contents("min_objective"))(0).is_function_handle(), "opt.min_objective must be a function"); d.f = (opts.contents("min_objective"))(0); nlopt_set_min_objective(opt, user_function, &d); } else if (opts.contains("max_objective")) { CHECK(opts.contents("max_objective").numel() == 1 && (opts.contents("max_objective"))(0).is_function_handle(), "opt.max_objective must be a function"); d.f = (opts.contents("max_objective"))(0); nlopt_set_max_objective(opt, user_function, &d); } else { CHECK(0,"either opt.min_objective or opt.max_objective must exist"); } Cell fc, h; if (opts.contains("fc") && opts.contents("fc").numel() == 1) { CHECK((opts.contents("fc"))(0).iscell(), "opt.fc must be cell array"); fc = (opts.contents("fc"))(0).cell_value(); Matrix zeros(1, fc.numel(), 0.0); Matrix fc_tol = struct_val_default(opts, "fc_tol", zeros); CHECK(fc_tol.numel() == fc.numel(), "opt.fc must have same length as opt.fc_tol"); for (int i = 0; i < fc.numel(); ++i) { CHECK(fc(i).is_function() || fc(i).is_function_handle(), "opt.fc must be a cell array of function handles"); CHECK(nlopt_add_inequality_constraint(opt, user_function1, &fc(i), fc_tol(i)) > 0, "nlopt error adding inequality constraint"); } } if (opts.contains("h") && opts.contents("h").numel() == 1) { CHECK((opts.contents("h"))(0).iscell(), "opt.h must be cell array"); h = (opts.contents("h"))(0).cell_value(); Matrix zeros(1, h.numel(), 0.0); Matrix h_tol = struct_val_default(opts, "h_tol", zeros); CHECK(h_tol.numel() == h.numel(), "opt.h must have same length as opt.h_tol"); for (int i = 0; i < h.numel(); ++i) { CHECK(h(i).is_function() || h(i).is_function_handle(), "opt.h must be a cell array of function handles"); CHECK(nlopt_add_equality_constraint(opt, user_function1, &h(i), h_tol(i)) > 0, "nlopt error adding equality constraint"); } } double opt_f; nlopt_result ret = nlopt_optimize(opt, x.fortran_vec(), &opt_f); retval(0) = x; if (nargout > 1) retval(1) = opt_f; if (nargout > 2) retval(2) = int(ret); nlopt_destroy(opt); return retval; } stevengj-nlopt-88c424d/src/octave/nlopt_optimize.m000066400000000000000000000212641521061417600223450ustar00rootroot00000000000000% Usage: [xopt, fopt, retcode] = nlopt_optimize(opt, xinit) % % Optimizes (minimizes or maximizes) a nonlinear function under % nonlinear constraints from the starting guess xinit, where the % objective, constraints, stopping criteria, and other options are % specified in the structure opt described below. A variety of local % and global optimization algorithms can be used, as specified by the % opt.algorithm parameter described below. Returns the optimum % function value fopt, the location xopt of the optimum, and a % return code retcode described below (> 0 on success). % % The dimension (n) of the problem, i.e. the number of design variables, % is specified implicitly via the length of xinit. % % This function is a front-end for the external routine nlopt_optimize % in the free NLopt nonlinear-optimization library, which is a wrapper % around a number of free/open-source optimization subroutines. More % details can be found on the NLopt web page (ab-initio.mit.edu/nlopt) % and also under 'man nlopt_minimize' on Unix. % % OBJECTIVE FUNCTION: % % The objective function f is specified via opt.min_objective or % opt.max_objective for minimization or maximization, respectively. % opt.min/max_objective should be a handle (@) to a function of the form: % % [val, gradient] = f(x) % % where x is a row vector, val is the function value f(x), and gradient % is a row vector giving the gradient of the function with respect to x. % The gradient is only used for gradient-based optimization algorithms; % some of the algorithms (below) are derivative-free and only require % f to return val (its value). % % BOUND CONSTRAINTS: % % Lower and/or upper bounds for the design variables x are specified % via opt.lower_bounds and/or opt.upper_bounds, respectively: these % are vectors (of the same length as xinit, above) giving the bounds % in each component. An unbounded component may be specified by a % lower/upper bound of -inf/+inf, respectively. If opt.lower_bounds % and/or opt.upper_bounds are not specified, the default bounds are % -inf/+inf (i.e. unbounded), respectively. % % NONLINEAR CONSTRAINTS: % % Several of the algorithms in NLopt (MMA, COBYLA, and ORIG_DIRECT) also % support arbitrary nonlinear inequality constraints, and some also allow % nonlinear equality constraints (ISRES and AUGLAG). For these % algorithms, you can specify as many nonlinear constraints as you wish. % (The default is no nonlinear constraints.) % % Inequality constraints of the form fc{i}(x) <= 0 are specified via opt.fc, % which is a cell array of function handles (@) of the same form as % the objective function above (i.e., returning the value and optionally % the gradient of the constraint function fc{i}, where the gradient is % only needed for gradient-based algorithms). % % Equality constraints of the form h{i}(x) = 0 are specified via opt.h, % which is a cell array of function handles (@) of the same form as % the objective function above (i.e., returning the value and optionally % the gradient of the constraint function h{i}, where the gradient is % only needed for gradient-based algorithms). % % For both inequality and equality constraints, you can supply a % "tolerance" for each constraint: this tolerance is used for convergence % tests only, and a point x is considered feasible for purposes of % convergence if the constraint is violated by the given tolerance. % The tolerances are specified via opt.fc_tol and opt.h_tol, respectively, % which must be vectors of the same length as opt.fc and opt.h, so % that opt.fc_tol(i) is the tolerance for opt.fc{i} and opt.h_tol(i) % is the tolerance for opt.h{i}. These tolerances default to zero; a % small nonzero tolerance is recommended, however, especially for h_tol. % % ALGORITHMS % % The optimization algorithm must be specified via opt.algorithm. % % The algorithm should be one of the following constants (name and % interpretation are the same as for the C language interface). Names % with _G*_ are global optimization, and names with _L*_ are local % optimization. Names with _*N_ are derivative-free, while names % with _*D_ are gradient-based algorithms. Algorithms: % % NLOPT_GD_MLSL_LDS, NLOPT_GD_MLSL, NLOPT_GD_STOGO, NLOPT_GD_STOGO_RAND, % NLOPT_GN_CRS2_LM, NLOPT_GN_DIRECT_L, NLOPT_GN_DIRECT_L_NOSCAL, % NLOPT_GN_DIRECT_L_RAND, NLOPT_GN_DIRECT_L_RAND_NOSCAL, NLOPT_GN_DIRECT, % NLOPT_GN_DIRECT_NOSCAL, NLOPT_GN_ISRES, NLOPT_GN_MLSL_LDS, NLOPT_GN_MLSL, % NLOPT_GN_ORIG_DIRECT_L, NLOPT_GN_ORIG_DIRECT, NLOPT_LD_AUGLAG_EQ, % NLOPT_LD_AUGLAG, NLOPT_LD_LBFGS, NLOPT_LD_LBFGS_NOCEDAL, NLOPT_LD_MMA, % NLOPT_LD_TNEWTON, NLOPT_LD_TNEWTON_PRECOND, % NLOPT_LD_TNEWTON_PRECOND_RESTART, NLOPT_LD_TNEWTON_RESTART, % NLOPT_LD_VAR1, NLOPT_LD_VAR2, NLOPT_LN_AUGLAG_EQ, NLOPT_LN_AUGLAG, % NLOPT_LN_BOBYQA, NLOPT_LN_COBYLA, NLOPT_LN_NELDERMEAD, % NLOPT_LN_NEWUOA_BOUND, NLOPT_LN_NEWUOA, NLOPT_LN_PRAXIS, NLOPT_LN_SBPLX % % For more information on individual algorithms, see their individual % help pages (e.g. "help NLOPT_LN_SBPLX"). % % STOPPING CRITERIA: % % Multiple stopping criteria can be specified by setting one or more of % the following fields of opt. The optimization halts whenever any % one of the given criteria is satisfied. % % opt.stopval: Stop when an objective value of at least stopval is found. % That is, stop minimizing when a value <= stopval is found, or stop % maximizing when a value >= stopval is found. % % opt.ftol_rel: Relative tolerance on function value, to stop when % an optimization step (or an estimate of the optimum) changes % the function value by less than opt.ftol_rel multiplied by % the absolute value of the function. % % opt.ftol_abs: Absolute tolerance on function value, to stop when % an optimization step (or an estimate of the optimum) changes % the function value by less than opt.ftol_abs. % % opt.xtol_rel: Relative tolerance on function value, to stop when % an optimization step (or an estimate of the optimum) changes % every component of x by less than opt.xtol_rel multiplied by % the absolute value of that component of x. % % opt.xtol_abs: Absolute tolerance on function value, to stop when % an optimization step (or an estimate of the optimum) changes % every component of x by less than that component of opt.xtol_abs % -- should be a vector of same length as x. % % opt.maxeval: Maximum number of function evaluations. % % opt.maxtime: Maximum runtime (in seconds) for the optimization. % % RETURN CODE: % % The retcode result is positive upon successful completion, and % negative for an error. The specific values are: % % generic success code: +1 % stopval reached: +2 % ftol reached: +3 % xtol reached: +4 % maxeval reached: +5 % maxtime reached: +6 % generic failure code: -1 % invalid arguments: -2 % out of memory: -3 % roundoff-limited: -4 % % LOCAL OPTIMIZER: % % Some of the algorithms, especially MLSL and AUGLAG, use a different % optimization algorithm as a subroutine, typically for local optimization. % By default, they use MMA or COBYLA for gradient-based or derivative-free % searching, respectively. However, you can change this by specifying % opt.local_optimizer: this is a structure with the same types of fields as opt % (stopping criteria, algorithm, etcetera). The objective function % and nonlinear constraint parameters of opt.local_optimizer are ignored. % % INITIAL STEP SIZE: % % For derivative-free local-optimization algorithms, the optimizer must % somehow decide on some initial step size to perturb x by when it begins % the optimization. This step size should be big enough that the value % of the objective changes significantly, but not too big if you want to % find the local optimum nearest to x. By default, NLopt chooses this % initial step size heuristically from the bounds, tolerances, and other % information, but this may not always be the best choice. % % You can modify the initial step by setting opt.initial_step, which % is a vector of the same length as x containing the (nonzero) initial % step size for each component of x. % % STOCHASTIC POPULATION: % % Several of the stochastic search algorithms (e.g., CRS, MLSL, and % ISRES) start by generating some initial "population" of random points % x. By default, this initial population size is chosen heuristically in % some algorithm-specific way, but the initial population can by changed % by setting opt.population to the desired initial population size. % % VERBOSE OUTPUT: % % If opt.verbose is set to a nonzero value, then nlopt_optimize % will print out verbose output; for example, it will print the % value of the objective function after each evaluation. % % MORE INFORMATION: % % For more documentation, such as a detailed description of all the % algorithms, see the NLopt home page: http://ab-initio.mit.edu/nlopt stevengj-nlopt-88c424d/src/swig/000077500000000000000000000000001521061417600165765ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/swig/CMakeLists.txt000066400000000000000000000121331521061417600213360ustar00rootroot00000000000000# clean up old generated source files before running SWIG, useful for Java set(UseSWIG_MODULE_VERSION 2) include (UseSWIG) # allows one set C++ flags for swig wrappers set (SWIG_COMPILE_FLAGS "" CACHE STRING "C++ compiler flags used for wrapper code") if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-enum-renames.i) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt-enum-renames.i "// AUTOMATICALLY GENERATED -- DO NOT EDIT\n") file (STRINGS ${PROJECT_SOURCE_DIR}/src/api/nlopt.h NLOPT_H_LINES REGEX " NLOPT_[A-Z0-9_]+") foreach (NLOPT_H_LINE ${NLOPT_H_LINES}) string (REGEX REPLACE ".*NLOPT_([A-Z0-9_]+).*" "%rename(NLOPT_\\1) nlopt::\\1;\n" ENUM_LINE ${NLOPT_H_LINE}) file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt-enum-renames.i "${ENUM_LINE}") endforeach () endif () include_directories (${NLOPT_PRIVATE_INCLUDE_DIRS}) set_source_files_properties (nlopt.i PROPERTIES CPLUSPLUS ON) if (Python_NumPy_FOUND AND NLOPT_CXX) set (SWIG_MODULE_nlopt_python_EXTRA_DEPS nlopt-python.i numpy.i generate-cpp) swig_add_library (nlopt_python LANGUAGE python SOURCES nlopt.i OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/python OUTFILE_DIR ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries (nlopt_python PRIVATE ${nlopt_lib}) target_link_libraries (nlopt_python PRIVATE Python::NumPy) target_link_libraries (nlopt_python PRIVATE Python::Module) set_target_properties (nlopt_python PROPERTIES OUTPUT_NAME nlopt) set_target_properties (nlopt_python PROPERTIES COMPILE_FLAGS "${SWIG_COMPILE_FLAGS}") install (FILES ${CMAKE_CURRENT_BINARY_DIR}/python/nlopt.py DESTINATION ${INSTALL_PYTHON_DIR}) install (TARGETS nlopt_python DESTINATION ${INSTALL_PYTHON_DIR}) configure_file (METADATA.in METADATA @ONLY) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/METADATA DESTINATION ${INSTALL_PYTHON_DIR}/nlopt-${NLOPT_VERSION_STRING}.dist-info) endif () if (GUILE_FOUND AND NLOPT_CXX) set (SWIG_MODULE_nlopt_guile_EXTRA_DEPS nlopt-guile.i generate-cpp) set (CMAKE_SWIG_FLAGS -scmstub) swig_add_library (nlopt_guile LANGUAGE guile SOURCES nlopt.i OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/guile OUTFILE_DIR ${CMAKE_CURRENT_BINARY_DIR}) set (CMAKE_SWIG_FLAGS) target_include_directories (nlopt_guile PRIVATE ${GUILE_INCLUDE_DIRS}) target_link_libraries (nlopt_guile PRIVATE ${nlopt_lib}) target_link_libraries (nlopt_guile PRIVATE ${GUILE_LIBRARIES}) set_target_properties (nlopt_guile PROPERTIES COMPILE_FLAGS "${SWIG_COMPILE_FLAGS}") file (RELATIVE_PATH _REL_GUILE_SITE_PATH ${GUILE_ROOT_DIR} ${GUILE_SITE_DIR}) set (GUILE_SITE_PATH ${_REL_GUILE_SITE_PATH}) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/guile/nlopt.scm DESTINATION ${GUILE_SITE_PATH}) file (RELATIVE_PATH _REL_GUILE_EXTENSION_PATH ${GUILE_ROOT_DIR} ${GUILE_EXTENSION_DIR}) set (GUILE_EXTENSION_PATH ${_REL_GUILE_EXTENSION_PATH}) install (TARGETS nlopt_guile LIBRARY DESTINATION ${GUILE_EXTENSION_PATH}) endif () if (JNI_FOUND AND Java_FOUND AND SWIG_FOUND AND NLOPT_CXX) include (UseJava) set (SWIG_MODULE_nlopt_java_EXTRA_DEPS nlopt-java.i generate-cpp) set (CMAKE_SWIG_FLAGS -package nlopt) # OUTPUT_DIR is ${CMAKE_CURRENT_BINARY_DIR}/java/ + the -package above (with # any '.' replaced by '/'). It must also match the GLOB in glob_java.cmake. swig_add_library (nlopt_java LANGUAGE java SOURCES nlopt.i OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/java/nlopt OUTFILE_DIR ${CMAKE_CURRENT_BINARY_DIR}) set (CMAKE_SWIG_FLAGS) target_link_libraries (nlopt_java PRIVATE ${nlopt_lib}) target_link_libraries (nlopt_java PRIVATE JNI::JNI) set_target_properties (nlopt_java PROPERTIES OUTPUT_NAME nloptjni) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") set_target_properties (nlopt_java PROPERTIES COMPILE_OPTIONS "-fno-strict-aliasing") endif () # MODULE libraries are always installed to the LIBRARY DESTINATION. if (CMAKE_HOST_SYSTEM_NAME MATCHES Windows) install (TARGETS nlopt_java LIBRARY DESTINATION ${NLOPT_INSTALL_BINDIR}) else() install (TARGETS nlopt_java LIBRARY DESTINATION ${NLOPT_INSTALL_LIBDIR}) endif() # unfortunately, SWIG will not tell us which .java files it generated, so we # have to find out ourselves - this is the only portable way to do so # (The nlopt*.i dependencies are there to force updating the list of sources # on any changes to the SWIG interface code, they are not direct inputs.) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/java_sources.txt COMMAND ${CMAKE_COMMAND} -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/glob_java.cmake DEPENDS "${swig_generated_file_fullname}" nlopt.i nlopt-exceptions.i nlopt-java.i nlopt_java_swig_compilation glob_java.cmake) add_jar (nlopt_jar SOURCES @${CMAKE_CURRENT_BINARY_DIR}/java_sources.txt OUTPUT_NAME nlopt) install_jar (nlopt_jar ${CMAKE_INSTALL_DATADIR}/java) endif () stevengj-nlopt-88c424d/src/swig/METADATA.in000066400000000000000000000001021521061417600202770ustar00rootroot00000000000000Metadata-Version: 1.2 Name: nlopt Version: @NLOPT_VERSION_STRING@ stevengj-nlopt-88c424d/src/swig/glob_java.cmake000066400000000000000000000016041521061417600215250ustar00rootroot00000000000000# This file(GLOB ...) must run at build (make) time, after the SWIG run. So it # cannot be invoked directly from CMakeLists.txt, but must be invoked through # cmake -P at the correct spot of the build, using add_custom_command. file(GLOB JAVA_SOURCES ${BINARY_DIR}/java/nlopt/*.java) list(JOIN JAVA_SOURCES "\n" JAVA_SOURCES_LINES) file(WRITE ${BINARY_DIR}/java_sources.txt ${JAVA_SOURCES_LINES}) # SWIG hardcodes non-vararg initial elements for std::vector wrappers, # probably to support Java versions older than 1.5. We do not really care # about supporting a Java that old, so fix the generated code. # See: https://github.com/swig/swig/issues/3085 file(READ ${BINARY_DIR}/java/nlopt/DoubleVector.java FILE_CONTENTS) string(REPLACE "double[] initialElements" "double... initialElements" FILE_CONTENTS "${FILE_CONTENTS}") file(WRITE ${BINARY_DIR}/java/nlopt/DoubleVector.java "${FILE_CONTENTS}") stevengj-nlopt-88c424d/src/swig/nlopt-exceptions.i000066400000000000000000000114211521061417600222620ustar00rootroot00000000000000// since exception specifications in C++ are evil, we instead provide // %catches specifications here so that SWIG can generate language-specific // exceptions (at least for exceptions explicitly thrown by NLopt) // // manually doing this stuff is annoying %catches(std::bad_alloc) nlopt::opt::opt(); %catches(std::bad_alloc) nlopt::opt::opt(algorithm a, unsigned n); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::opt(const char *algo_str, unsigned n); %catches(std::bad_alloc) nlopt::opt::opt(const opt& f); %catches(std::bad_alloc) nlopt::opt::operator=(opt const& f); %catches(nlopt::roundoff_limited,nlopt::forced_stop,std::runtime_error,std::bad_alloc,std::invalid_argument) nlopt::opt::optimize(std::vector &x, double &opt_f); %catches(nlopt::roundoff_limited,nlopt::forced_stop,std::runtime_error,std::bad_alloc,std::invalid_argument) nlopt::opt::optimize(const std::vector &x0); %catches(std::runtime_error) nlopt::opt::get_algorithm(); %catches(std::runtime_error) nlopt::opt::get_algorithm_name(); %catches(std::runtime_error) nlopt::opt::get_dimension(); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_min_objective(func f, void *f_data); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_min_objective(vfunc vf, void *f_data); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_max_objective(func f, void *f_data); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_max_objective(vfunc vf, void *f_data); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_min_objective(func f, void *f_data, nlopt_munge md, nlopt_munge mc); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_max_objective(func f, void *f_data, nlopt_munge md, nlopt_munge mc); %catches(std::invalid_argument) nlopt::opt::remove_inequality_constraints(); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_inequality_constraint(func f, void *f_data, double tol=0); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_inequality_constraint(vfunc vf, void *f_data, double tol=0); %catches(std::invalid_argument) nlopt::opt::remove_equality_constraints(); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_equality_constraint(func f, void *f_data, double tol=0); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_equality_constraint(vfunc vf, void *f_data, double tol=0); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_inequality_mconstraint(mfunc mf, void *f_data, const std::vector &tol); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_equality_mconstraint(mfunc mf, void *f_data, const std::vector &tol); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_inequality_constraint(func f, void *f_data, nlopt_munge md, nlopt_munge mc, double tol=0); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_equality_constraint(func f, void *f_data, nlopt_munge md, nlopt_munge mc, double tol=0); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_inequality_mconstraint(mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc, const std::vector &tol); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::add_equality_mconstraint(mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc, const std::vector &tol); #define SET_EXCEPT(name, T) %catches(std::invalid_argument) nlopt::opt::set_##name(T val); #define GET_EXCEPT(name) %catches(std::invalid_argument) nlopt::opt::get_##name(); #define SETVEC_EXCEPT(name) %catches(std::invalid_argument) nlopt::opt::set_##name(const std::vector &v); #define GETVEC_EXCEPT(name) %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::get_##name(std::vector &v); #define GETSET_EXCEPT(name, T) GET_EXCEPT(name) SET_EXCEPT(name, T) #define GETSETVEC_EXCEPT(name) GET_EXCEPT(name) SET_EXCEPT(name, double) GETVEC_EXCEPT(name) SETVEC_EXCEPT(name) GETSETVEC_EXCEPT(lower_bounds) GETSETVEC_EXCEPT(upper_bounds) GETSET_EXCEPT(stopval, double) GETSET_EXCEPT(ftol_rel, double) GETSET_EXCEPT(ftol_abs, double) GETSET_EXCEPT(xtol_rel, double) GETSETVEC_EXCEPT(xtol_abs) GETSETVEC_EXCEPT(x_weights) GETSET_EXCEPT(maxeval, int) GETSET_EXCEPT(maxtime, double) GETSET_EXCEPT(force_stop, int) %catches(std::invalid_argument) nlopt::opt::force_stop(); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_local_optimizer(const opt &lo); GETSET_EXCEPT(population, unsigned) GETSET_EXCEPT(vector_storage, unsigned) GETSETVEC_EXCEPT(initial_step) %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::set_default_initial_step(const std::vector &x); %catches(std::invalid_argument) nlopt::opt::get_initial_step(const std::vector &x, std::vector &dx); %catches(std::bad_alloc,std::invalid_argument) nlopt::opt::get_initial_step_(const std::vector &x); stevengj-nlopt-88c424d/src/swig/nlopt-guile.i000066400000000000000000000050711521061417600212120ustar00rootroot00000000000000// -*- C++ -*- %{ // work around obsolete stuff used by swig guile #if SCM_MAJOR_VERSION >= 2 # define gh_symbol2scm scm_from_latin1_symbol # undef scm_listify # define scm_listify scm_list_n #else # define gh_symbol2scm scm_str2symbol #endif %} %typemap(throws) std::runtime_error %{ scm_throw(gh_symbol2scm("runtime-error"), scm_list_1(scm_from_locale_string(($1).what()))); %} %typemap(throws) std::bad_alloc %{ scm_throw(gh_symbol2scm("bad-alloc"), scm_list_1(scm_from_locale_string(($1).what()))); %} %typemap(throws) std::invalid_argument %{ scm_throw(gh_symbol2scm("invalid-argument"), scm_list_1(scm_from_locale_string(($1).what()))); %} %typemap(throws) nlopt::forced_stop %{ scm_throw(gh_symbol2scm("forced-stop"), SCM_EOL); %} %typemap(throws) nlopt::roundoff_limited %{ scm_throw(gh_symbol2scm("roundoff-limited"), SCM_EOL); %} %{ // because our f_data pointer to the Scheme function is stored on the // heap, rather than the stack, it may be missed by the Guile garbage // collection and be accidentally freed. Hence, use NLopts munge // feature to prevent this, by incrementing Guile's reference count. static void *free_guilefunc(void *p) { scm_gc_unprotect_object((SCM) p); return p; } static void *dup_guilefunc(void *p) { scm_gc_protect_object((SCM) p); return p; } // func wrapper around Guile function val = f(x, grad) static double func_guile(unsigned n, const double *x, double *grad, void *f) { SCM xscm = scm_c_make_vector(n, SCM_UNSPECIFIED); for (unsigned i = 0; i < n; ++i) SCM_SIMPLE_VECTOR_SET(xscm, i, scm_from_double(x[i])); SCM grad_scm = grad ? scm_c_make_vector(n, SCM_UNSPECIFIED) : SCM_BOOL_F; SCM ret = scm_call_2((SCM) f, xscm, grad_scm); if (!scm_is_real(ret)) throw std::invalid_argument("invalid result passed to nlopt"); if (grad) { for (unsigned i = 0; i < n; ++i) { if (!scm_is_real(ret)) throw std::invalid_argument("invalid gradient passed to nlopt"); grad[i] = scm_to_double(SCM_SIMPLE_VECTOR_REF(grad_scm, i)); } } return scm_to_double(ret); } %} %typemap(in)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = func_guile; $2 = dup_guilefunc((void*) $input); // input = SCM pointer to Scheme function $3 = free_guilefunc; $4 = dup_guilefunc; } %typecheck(SWIG_TYPECHECK_POINTER)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = scm_is_true(scm_procedure_p($input)); } // export constants as variables, rather than as functions returning the value %feature("constasvar", "1"); %scheme %{ (load-extension "nlopt_guile" "SWIG_init") %} stevengj-nlopt-88c424d/src/swig/nlopt-java.i000066400000000000000000000156011521061417600210260ustar00rootroot00000000000000// -*- C++ -*- // kate: hl c++ // use Java naming conventions %rename("%(camelcase)s", match="enum") ""; %rename("%(camelcase)s", match="class") ""; %rename("%(lowercamelcase)s", %$isfunction) ""; // use proper Java enums %include "enums.swg" // use Java code for the constants in the enums instead of calling a C function %javaconst(1); // pointer-based API not supported, use version_{major,minor,bugfix} instead %ignore version; // pointer-based API not supported, use the other overload instead %ignore optimize(std::vector &, double &); // unsupported function APIs, use the ones with nlopt_munge instead %ignore set_min_objective(func, void *); %ignore set_min_objective(vfunc, void *); %ignore set_min_objective(functor_type); %ignore set_max_objective(func, void *); %ignore set_max_objective(vfunc, void *); %ignore set_max_objective(functor_type); %ignore add_inequality_constraint(func, void *); %ignore add_inequality_constraint(func, void *, double); %ignore add_inequality_constraint(vfunc, void *); %ignore add_inequality_constraint(vfunc, void *, double); %ignore add_inequality_mconstraint(mfunc, void *, const std::vector &); %ignore add_equality_constraint(func, void *); %ignore add_equality_constraint(func, void *, double); %ignore add_equality_constraint(vfunc, void *); %ignore add_equality_constraint(vfunc, void *, double); %ignore add_equality_mconstraint(mfunc, void *, const std::vector &); // Munge function types %extend nlopt::opt { %proxycode { public static interface Func { public double apply(double[] x, double[] gradient); } public static interface MFunc { public double[] apply(double[] x, double[] gradient); } } } %{ struct jfunc { JNIEnv *jenv; jobject func; jmethodID method; }; static void *free_jfunc(void *p) { ((jfunc *) p)->jenv->DeleteGlobalRef(((jfunc *) p)->func); delete (jfunc *) p; return (void *) 0; } static void *dup_jfunc(void *p) { jfunc *q = new jfunc; q->jenv = ((jfunc *) p)->jenv; q->func = q->jenv->NewGlobalRef(((jfunc *) p)->func); q->method = ((jfunc *) p)->method; return (void *) q; } static double func_java(unsigned n, const double *x, double *grad, void *f) { JNIEnv *jenv = ((jfunc *) f)->jenv; jobject func = ((jfunc *) f)->func; jmethodID method = ((jfunc *) f)->method; jdoubleArray jx = jenv->NewDoubleArray(n); if (!jx || jenv->ExceptionCheck()) { throw nlopt::forced_stop(); } jenv->SetDoubleArrayRegion(jx, 0, n, x); jdoubleArray jgrad = (jdoubleArray) 0; if (grad) { jgrad = jenv->NewDoubleArray(n); if (!jgrad || jenv->ExceptionCheck()) { jenv->DeleteLocalRef(jx); throw nlopt::forced_stop(); } jenv->SetDoubleArrayRegion(jgrad, 0, n, grad); } jdouble res = jenv->CallDoubleMethod(func, method, jx, jgrad); jenv->DeleteLocalRef(jx); if (jenv->ExceptionCheck()) { if (jgrad) { jenv->DeleteLocalRef(jgrad); } throw nlopt::forced_stop(); } if (grad) { jenv->GetDoubleArrayRegion(jgrad, 0, n, grad); jenv->DeleteLocalRef(jgrad); } return res; } static void mfunc_java(unsigned m, double *result, unsigned n, const double *x, double *grad, void *f) { JNIEnv *jenv = ((jfunc *) f)->jenv; jobject func = ((jfunc *) f)->func; jmethodID method = ((jfunc *) f)->method; jdoubleArray jx = jenv->NewDoubleArray(n); if (!jx || jenv->ExceptionCheck()) { throw nlopt::forced_stop(); } jenv->SetDoubleArrayRegion(jx, 0, n, x); jdoubleArray jgrad = (jdoubleArray) 0; if (grad) { jgrad = jenv->NewDoubleArray(m * n); if (!jgrad || jenv->ExceptionCheck()) { jenv->DeleteLocalRef(jx); throw nlopt::forced_stop(); } jenv->SetDoubleArrayRegion(jgrad, 0, m * n, grad); } jdoubleArray res = (jdoubleArray) jenv->CallObjectMethod(func, method, jx, jgrad); jenv->DeleteLocalRef(jx); if (!res || jenv->ExceptionCheck()) { if (jgrad) { jenv->DeleteLocalRef(jgrad); } if (res) { jenv->DeleteLocalRef(res); } throw nlopt::forced_stop(); } jenv->GetDoubleArrayRegion(res, 0, m, result); jenv->DeleteLocalRef(res); if (grad) { jenv->GetDoubleArrayRegion(jgrad, 0, m * n, grad); jenv->DeleteLocalRef(jgrad); } } %} %typemap(jni)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) "jobject" %typemap(jtype)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) "java.lang.Object" %typemap(jstype)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) "Func" %typemap(in)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = func_java; jfunc jf = {jenv, $input, jenv->GetMethodID(jenv->FindClass("nlopt/Opt$Func"), "apply", "([D[D)D")}; $2 = dup_jfunc((void *) &jf); $3 = free_jfunc; $4 = dup_jfunc; } %typemap(javain)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) "$javainput" %typemap(jni)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) "jobject" %typemap(jtype)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) "java.lang.Object" %typemap(jstype)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) "MFunc" %typemap(in)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = mfunc_java; jfunc jf = {jenv, $input, jenv->GetMethodID(jenv->FindClass("nlopt/Opt$MFunc"), "apply", "([D[D)[D")}; $2 = dup_jfunc((void *) &jf); $3 = free_jfunc; $4 = dup_jfunc; } %typemap(javain)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) "$javainput" // Make exception classes Java-compliant %rename(ForcedStopException) nlopt::forced_stop; %typemap(javabase) nlopt::forced_stop "java.lang.RuntimeException" %typemap(javabody) nlopt::forced_stop "" %typemap(javadestruct) nlopt::forced_stop "" %typemap(javafinalize) nlopt::forced_stop "" %ignore nlopt::forced_stop::forced_stop; %extend nlopt::forced_stop { %proxycode { public ForcedStopException(String message) { super(message); } } } %rename(RoundoffLimitedException) nlopt::roundoff_limited; %typemap(javabase) nlopt::roundoff_limited "java.lang.RuntimeException" %typemap(javabody) nlopt::roundoff_limited "" %typemap(javadestruct) nlopt::roundoff_limited "" %typemap(javafinalize) nlopt::roundoff_limited "" %ignore nlopt::roundoff_limited::roundoff_limited; %extend nlopt::roundoff_limited { %proxycode { public RoundoffLimitedException(String message) { super(message); } } } // Map exceptions %typemap(throws) std::bad_alloc %{ SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, $1.what()); return $null; %} %typemap(throws) nlopt::forced_stop %{ if (!jenv->ExceptionCheck()) { jclass excep = jenv->FindClass("nlopt/ForcedStopException"); if (excep) jenv->ThrowNew(excep, $1.what()); } return $null; %} %typemap(throws) nlopt::roundoff_limited %{ if (!jenv->ExceptionCheck()) { jclass excep = jenv->FindClass("nlopt/RoundoffLimitedException"); if (excep) jenv->ThrowNew(excep, $1.what()); } return $null; %} stevengj-nlopt-88c424d/src/swig/nlopt-python.i000066400000000000000000000154111521061417600214250ustar00rootroot00000000000000// -*- C++ -*- ////////////////////////////////////////////////////////////////////////////// // Converting NLopt/C++ exceptions to Python exceptions %{ #ifndef Py_LIMITED_API #define ExceptionSubclass(EXCNAME, EXCDOC) \ static PyTypeObject MyExc_ ## EXCNAME = { \ PyVarObject_HEAD_INIT(NULL, 0) \ "nlopt." # EXCNAME, \ sizeof(PyBaseExceptionObject), \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ Py_TPFLAGS_DEFAULT, \ PyDoc_STR(EXCDOC) \ }; \ static void init_ ## EXCNAME(PyObject *m) { \ MyExc_ ## EXCNAME .tp_base = (PyTypeObject *) PyExc_Exception; \ PyType_Ready(&MyExc_ ## EXCNAME); \ Py_INCREF(&MyExc_ ## EXCNAME); \ PyModule_AddObject(m, # EXCNAME, (PyObject *) &MyExc_ ## EXCNAME); \ } ExceptionSubclass(ForcedStop, "Python version of nlopt::forced_stop exception.") ExceptionSubclass(RoundoffLimited, "Python version of nlopt::roundoff_limited exception.") #endif %} %init %{ #ifndef Py_LIMITED_API init_ForcedStop(m); init_RoundoffLimited(m); #endif %} %pythoncode %{ try: ForcedStop = _nlopt.ForcedStop RoundoffLimited = _nlopt.RoundoffLimited except AttributeError: ForcedStop = RuntimeError RoundoffLimited = RuntimeError __version__ = str(_nlopt.version_major())+'.'+str(_nlopt.version_minor())+'.'+str(_nlopt.version_bugfix()) %} %typemap(throws) std::bad_alloc %{ PyErr_SetString(PyExc_MemoryError, ($1).what()); SWIG_fail; %} %typemap(throws) nlopt::forced_stop %{ if (!PyErr_Occurred()) #ifndef Py_LIMITED_API PyErr_SetString((PyObject*)&MyExc_ForcedStop, "NLopt forced stop"); #else PyErr_SetString(PyExc_RuntimeError, "NLopt forced stop"); #endif SWIG_fail; %} %typemap(throws) nlopt::roundoff_limited %{ if (!PyErr_Occurred()) #ifndef Py_LIMITED_API PyErr_SetString((PyObject*)&MyExc_RoundoffLimited, "NLopt roundoff-limited"); #else PyErr_SetString(PyExc_RuntimeError, "NLopt roundoff-limited"); #endif SWIG_fail; %} ////////////////////////////////////////////////////////////////////////////// %{ #define SWIG_FILE_WITH_INIT %} %include "numpy.i" %init %{ import_array(); %} %numpy_typemaps(double, NPY_DOUBLE, unsigned) ////////////////////////////////////////////////////////////////////////////// // numpy.i does not include maps for std::vector, so I add them here, // taking advantage of the conversion functions provided by numpy.i // Typemap for input arguments of type const std::vector & %typecheck(SWIG_TYPECHECK_POINTER, fragment="NumPy_Macros") const std::vector & { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") const std::vector & (PyArrayObject* array=NULL, int is_new_object=0, std::vector arrayv) { npy_intp size[1] = { -1 }; array = obj_to_array_allow_conversion($input, NPY_DOUBLE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; arrayv = std::vector(array_size(array,0)); $1 = &arrayv; { double *arr_data = (double *) array_data(array); int arr_i, arr_s = array_stride(array,0) / sizeof(double); int arr_sz = array_size(array,0); for (arr_i = 0; arr_i < arr_sz; ++arr_i) arrayv[arr_i] = arr_data[arr_i * arr_s]; } } %typemap(freearg) const std::vector & { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } // Typemap for return values of type std::vector %typemap(out, fragment="NumPy_Fragments") std::vector { npy_intp sz = $1.size(); $result = PyArray_SimpleNew(1, &sz, NPY_DOUBLE); if (!$1.empty()) { std::memcpy(array_data($result), &$1[0], sizeof(double) * sz); } } ////////////////////////////////////////////////////////////////////////////// // Wrapper for objective function callbacks %{ static void *free_pyfunc(void *p) { Py_DECREF((PyObject*) p); return p; } static void *dup_pyfunc(void *p) { Py_INCREF((PyObject*) p); return p; } #if NPY_API_VERSION < 0x00000007 # define NPY_ARRAY_C_CONTIGUOUS NPY_C_CONTIGUOUS # define NPY_ARRAY_ALIGNED NPY_ALIGNED #endif static double func_python(unsigned n, const double *x, double *grad, void *f) { npy_intp sz = npy_intp(n), sz0 = 0, stride1 = sizeof(double); PyObject *xpy = PyArray_New(&PyArray_Type, 1, &sz, NPY_DOUBLE, &stride1, const_cast(x), // not NPY_WRITEABLE 0, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED, NULL); PyObject *gradpy = grad ? PyArray_SimpleNewFromData(1, &sz, NPY_DOUBLE, grad) : PyArray_SimpleNew(1, &sz0, NPY_DOUBLE); PyObject *arglist = Py_BuildValue("OO", xpy, gradpy); PyObject *result = PyObject_Call((PyObject *) f, arglist, NULL); Py_DECREF(arglist); Py_DECREF(gradpy); Py_DECREF(xpy); double val = HUGE_VAL; if (PyErr_Occurred()) { Py_XDECREF(result); throw nlopt::forced_stop(); // just stop, don't call PyErr_Clear() } else if (result && PyFloat_Check(result)) { val = PyFloat_AsDouble(result); Py_DECREF(result); } else if (result && PyLong_Check(result)) { val = PyLong_AsUnsignedLong(result); Py_DECREF(result); } else { Py_XDECREF(result); throw std::invalid_argument("invalid result passed to nlopt"); } return val; } static void mfunc_python(unsigned m, double *result, unsigned n, const double *x, double *grad, void *f) { npy_intp nsz = npy_intp(n), msz = npy_intp(m); npy_intp mnsz[2] = {msz, nsz}; npy_intp sz0 = 0, stride1 = sizeof(double); PyObject *xpy = PyArray_New(&PyArray_Type, 1, &nsz, NPY_DOUBLE, &stride1, const_cast(x), // not NPY_WRITEABLE 0, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED, NULL); PyObject *rpy = PyArray_SimpleNewFromData(1, &msz, NPY_DOUBLE, result); PyObject *gradpy = grad ? PyArray_SimpleNewFromData(2, mnsz, NPY_DOUBLE, grad) : PyArray_SimpleNew(1, &sz0, NPY_DOUBLE); PyObject *arglist = Py_BuildValue("OOO", rpy, xpy, gradpy); PyObject *res = PyObject_Call((PyObject *) f, arglist, NULL); Py_XDECREF(res); Py_DECREF(arglist); Py_DECREF(gradpy); Py_DECREF(rpy); Py_DECREF(xpy); if (PyErr_Occurred()) { throw nlopt::forced_stop(); // just stop, don't call PyErr_Clear() } } %} %typemap(in)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = func_python; $2 = dup_pyfunc((void*) $input); $3 = free_pyfunc; $4 = dup_pyfunc; } %typecheck(SWIG_TYPECHECK_POINTER)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = PyCallable_Check($input); } %typemap(in)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = mfunc_python; $2 = dup_pyfunc((void*) $input); $3 = free_pyfunc; $4 = dup_pyfunc; } %typecheck(SWIG_TYPECHECK_POINTER)(nlopt::mfunc mf, void *f_data, nlopt_munge md, nlopt_munge mc) { $1 = PyCallable_Check($input); } stevengj-nlopt-88c424d/src/swig/nlopt.i000066400000000000000000000034351521061417600201110ustar00rootroot00000000000000// -*- C++ -*- // kate: hl c++ %define DOCSTRING "NLopt is a multi-language library for nonlinear optimization (local or global, with or without derivatives, and supporting nonlinear constraints). Complete documentation, including a Python tutorial, can be found at the NLopt web page: http://ab-initio.mit.edu/nlopt" %enddef #ifdef SWIGJAVA %module(docstring=DOCSTRING) NLopt #else %module(docstring=DOCSTRING) nlopt #endif %{ #include "nlopt.hpp" %} #define SWIG_STD_EXCEPTIONS_AS_CLASSES %include "std_string.i" %include "std_except.i" %include "std_vector.i" namespace std { #ifdef SWIGJAVA %template(DoubleVector) vector; #else %template(nlopt_doublevector) vector; #endif }; %ignore nlopt::opt::myfunc_data; %ignore nlopt::opt::operator=; // dont use the in-place version of get_initial_step %ignore nlopt_get_initial_step; %ignore nlopt::opt::get_initial_step; #ifdef SWIGJAVA %rename(getInitialStep) nlopt::opt::get_initial_step_; #else %rename(get_initial_step) nlopt::opt::get_initial_step_; #endif // prepend "nlopt_" in Guile to substitute for namespace #if defined(SWIGGUILE) %rename(nlopt_opt) nlopt::opt; %rename(nlopt_roundoff_limited) nlopt::roundoff_limited; %rename(nlopt_forced_stop) nlopt::forced_stop; %rename(nlopt_srand) nlopt::srand; %rename(nlopt_srand_time) nlopt::srand_time; %rename(nlopt_version) nlopt::version; %rename(nlopt_version_major) nlopt::version_major; %rename(nlopt_version_minor) nlopt::version_minor; %rename(nlopt_version_bugfix) nlopt::version_bugfix; %rename(nlopt_algorithm_name) nlopt::algorithm_name; %include "nlopt-enum-renames.i" #endif %include "nlopt-exceptions.i" #ifdef SWIGGUILE %include "nlopt-guile.i" #endif #ifdef SWIGPYTHON %include "nlopt-python.i" #endif #ifdef SWIGJAVA %include "nlopt-java.i" #endif %include "nlopt.hpp" stevengj-nlopt-88c424d/src/swig/numpy.i000066400000000000000000003112661521061417600201310ustar00rootroot00000000000000/* -*- C -*- (not really, but good for syntax highlighting) */ /* * Copyright (c) 2005-2015, NumPy Developers. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * * Neither the name of the NumPy Developers nor the names of any * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef SWIGPYTHON %{ #ifndef SWIG_FILE_WITH_INIT #define NO_IMPORT_ARRAY #endif #include "stdio.h" #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include %} /**********************************************************************/ %fragment("NumPy_Backward_Compatibility", "header") { %#if NPY_API_VERSION < NPY_1_7_API_VERSION %#define NPY_ARRAY_DEFAULT NPY_DEFAULT %#define NPY_ARRAY_FARRAY NPY_FARRAY %#define NPY_FORTRANORDER NPY_FORTRAN %#endif } /**********************************************************************/ /* The following code originally appeared in * enthought/kiva/agg/src/numeric.i written by Eric Jones. It was * translated from C++ to C by John Hunter. Bill Spotz has modified * it to fix some minor bugs, upgrade from Numeric to numpy (all * versions), add some comments and functionality, and convert from * direct code insertion to SWIG fragments. */ %fragment("NumPy_Macros", "header") { /* Macros to extract array attributes. */ %#if NPY_API_VERSION < NPY_1_7_API_VERSION %#define is_array(a) ((a) && PyArray_Check((PyArrayObject*)a)) %#define array_type(a) (int)(PyArray_TYPE((PyArrayObject*)a)) %#define array_numdims(a) (((PyArrayObject*)a)->nd) %#define array_dimensions(a) (((PyArrayObject*)a)->dimensions) %#define array_size(a,i) (((PyArrayObject*)a)->dimensions[i]) %#define array_strides(a) (((PyArrayObject*)a)->strides) %#define array_stride(a,i) (((PyArrayObject*)a)->strides[i]) %#define array_data(a) (((PyArrayObject*)a)->data) %#define array_descr(a) (((PyArrayObject*)a)->descr) %#define array_flags(a) (((PyArrayObject*)a)->flags) %#define array_clearflags(a,f) (((PyArrayObject*)a)->flags) &= ~f %#define array_enableflags(a,f) (((PyArrayObject*)a)->flags) = f %#define array_is_fortran(a) (PyArray_ISFORTRAN((PyArrayObject*)a)) %#else %#define is_array(a) ((a) && PyArray_Check(a)) %#define array_type(a) PyArray_TYPE((PyArrayObject*)a) %#define array_numdims(a) PyArray_NDIM((PyArrayObject*)a) %#define array_dimensions(a) PyArray_DIMS((PyArrayObject*)a) %#define array_strides(a) PyArray_STRIDES((PyArrayObject*)a) %#define array_stride(a,i) PyArray_STRIDE((PyArrayObject*)a,i) %#define array_size(a,i) PyArray_DIM((PyArrayObject*)a,i) %#define array_data(a) PyArray_DATA((PyArrayObject*)a) %#define array_descr(a) PyArray_DESCR((PyArrayObject*)a) %#define array_flags(a) PyArray_FLAGS((PyArrayObject*)a) %#define array_enableflags(a,f) PyArray_ENABLEFLAGS((PyArrayObject*)a,f) %#define array_clearflags(a,f) PyArray_CLEARFLAGS((PyArrayObject*)a,f) %#define array_is_fortran(a) (PyArray_IS_F_CONTIGUOUS((PyArrayObject*)a)) %#endif %#define array_is_contiguous(a) (PyArray_ISCONTIGUOUS((PyArrayObject*)a)) %#define array_is_native(a) (PyArray_ISNOTSWAPPED((PyArrayObject*)a)) } /**********************************************************************/ %fragment("NumPy_Utilities", "header") { /* Given a PyObject, return a string describing its type. */ const char* pytype_string(PyObject* py_obj) { if (py_obj == NULL ) return "C NULL value"; if (py_obj == Py_None ) return "Python None" ; if (PyCallable_Check(py_obj)) return "callable" ; if (PyBytes_Check( py_obj)) return "string" ; if (PyLong_Check( py_obj)) return "int" ; if (PyFloat_Check( py_obj)) return "float" ; if (PyDict_Check( py_obj)) return "dict" ; if (PyList_Check( py_obj)) return "list" ; if (PyTuple_Check( py_obj)) return "tuple" ; return "unknown type"; } /* Given a NumPy typecode, return a string describing the type. */ const char* typecode_string(int typecode) { static const char* type_names[25] = {"bool", "byte", "unsigned byte", "short", "unsigned short", "int", "unsigned int", "long", "unsigned long", "long long", "unsigned long long", "float", "double", "long double", "complex float", "complex double", "complex long double", "object", "string", "unicode", "void", "ntypes", "notype", "char", "unknown"}; return typecode < 24 ? type_names[typecode] : type_names[24]; } /* Make sure input has correct numpy type. This now just calls PyArray_EquivTypenums(). */ int type_match(int actual_type, int desired_type) { return PyArray_EquivTypenums(actual_type, desired_type); } void free_cap(PyObject * cap) { void* array = (void*) PyCapsule_GetPointer(cap,SWIGPY_CAPSULE_NAME); if (array != NULL) free(array); } } /**********************************************************************/ %fragment("NumPy_Object_to_Array", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros", fragment="NumPy_Utilities") { /* Given a PyObject pointer, cast it to a PyArrayObject pointer if * legal. If not, set the python error string appropriately and * return NULL. */ PyArrayObject* obj_to_array_no_conversion(PyObject* input, int typecode) { PyArrayObject* ary = NULL; if (is_array(input) && (typecode == NPY_NOTYPE || PyArray_EquivTypenums(array_type(input), typecode))) { ary = (PyArrayObject*) input; } else if is_array(input) { const char* desired_type = typecode_string(typecode); const char* actual_type = typecode_string(array_type(input)); PyErr_Format(PyExc_TypeError, "Array of type '%s' required. Array of type '%s' given", desired_type, actual_type); ary = NULL; } else { const char* desired_type = typecode_string(typecode); const char* actual_type = pytype_string(input); PyErr_Format(PyExc_TypeError, "Array of type '%s' required. A '%s' was given", desired_type, actual_type); ary = NULL; } return ary; } /* Convert the given PyObject to a NumPy array with the given * typecode. On success, return a valid PyArrayObject* with the * correct type. On failure, the python error string will be set and * the routine returns NULL. */ PyArrayObject* obj_to_array_allow_conversion(PyObject* input, int typecode, int* is_new_object) { PyArrayObject* ary = NULL; PyObject* py_obj; if (is_array(input) && (typecode == NPY_NOTYPE || PyArray_EquivTypenums(array_type(input),typecode))) { ary = (PyArrayObject*) input; *is_new_object = 0; } else { py_obj = PyArray_FROMANY(input, typecode, 0, 0, NPY_ARRAY_DEFAULT); /* If NULL, PyArray_FromObject will have set python error value.*/ ary = (PyArrayObject*) py_obj; *is_new_object = 1; } return ary; } /* Given a PyArrayObject, check to see if it is contiguous. If so, * return the input pointer and flag it as not a new object. If it is * not contiguous, create a new PyArrayObject using the original data, * flag it as a new object and return the pointer. */ PyArrayObject* make_contiguous(PyArrayObject* ary, int* is_new_object, int min_dims, int max_dims) { PyArrayObject* result; if (array_is_contiguous(ary)) { result = ary; *is_new_object = 0; } else { result = (PyArrayObject*) PyArray_ContiguousFromObject((PyObject*)ary, array_type(ary), min_dims, max_dims); *is_new_object = 1; } return result; } /* Given a PyArrayObject, check to see if it is Fortran-contiguous. * If so, return the input pointer, but do not flag it as not a new * object. If it is not Fortran-contiguous, create a new * PyArrayObject using the original data, flag it as a new object * and return the pointer. */ PyArrayObject* make_fortran(PyArrayObject* ary, int* is_new_object) { PyArrayObject* result; if (array_is_fortran(ary)) { result = ary; *is_new_object = 0; } else { Py_INCREF(array_descr(ary)); result = (PyArrayObject*) PyArray_FromArray(ary, array_descr(ary), %#if NPY_API_VERSION < NPY_1_7_API_VERSION NPY_FORTRANORDER); %#else NPY_ARRAY_F_CONTIGUOUS); %#endif *is_new_object = 1; } return result; } /* Convert a given PyObject to a contiguous PyArrayObject of the * specified type. If the input object is not a contiguous * PyArrayObject, a new one will be created and the new object flag * will be set. */ PyArrayObject* obj_to_array_contiguous_allow_conversion(PyObject* input, int typecode, int* is_new_object) { int is_new1 = 0; int is_new2 = 0; PyArrayObject* ary2; PyArrayObject* ary1 = obj_to_array_allow_conversion(input, typecode, &is_new1); if (ary1) { ary2 = make_contiguous(ary1, &is_new2, 0, 0); if ( is_new1 && is_new2) { Py_DECREF(ary1); } ary1 = ary2; } *is_new_object = is_new1 || is_new2; return ary1; } /* Convert a given PyObject to a Fortran-ordered PyArrayObject of the * specified type. If the input object is not a Fortran-ordered * PyArrayObject, a new one will be created and the new object flag * will be set. */ PyArrayObject* obj_to_array_fortran_allow_conversion(PyObject* input, int typecode, int* is_new_object) { int is_new1 = 0; int is_new2 = 0; PyArrayObject* ary2; PyArrayObject* ary1 = obj_to_array_allow_conversion(input, typecode, &is_new1); if (ary1) { ary2 = make_fortran(ary1, &is_new2); if (is_new1 && is_new2) { Py_DECREF(ary1); } ary1 = ary2; } *is_new_object = is_new1 || is_new2; return ary1; } } /* end fragment */ /**********************************************************************/ %fragment("NumPy_Array_Requirements", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros") { /* Test whether a python object is contiguous. If array is * contiguous, return 1. Otherwise, set the python error string and * return 0. */ int require_contiguous(PyArrayObject* ary) { int contiguous = 1; if (!array_is_contiguous(ary)) { PyErr_SetString(PyExc_TypeError, "Array must be contiguous. A non-contiguous array was given"); contiguous = 0; } return contiguous; } /* Test whether a python object is (C_ or F_) contiguous. If array is * contiguous, return 1. Otherwise, set the python error string and * return 0. */ int require_c_or_f_contiguous(PyArrayObject* ary) { int contiguous = 1; if (!(array_is_contiguous(ary) || array_is_fortran(ary))) { PyErr_SetString(PyExc_TypeError, "Array must be contiguous (C_ or F_). A non-contiguous array was given"); contiguous = 0; } return contiguous; } /* Require that a numpy array is not byte-swapped. If the array is * not byte-swapped, return 1. Otherwise, set the python error string * and return 0. */ int require_native(PyArrayObject* ary) { int native = 1; if (!array_is_native(ary)) { PyErr_SetString(PyExc_TypeError, "Array must have native byteorder. " "A byte-swapped array was given"); native = 0; } return native; } /* Require the given PyArrayObject to have a specified number of * dimensions. If the array has the specified number of dimensions, * return 1. Otherwise, set the python error string and return 0. */ int require_dimensions(PyArrayObject* ary, int exact_dimensions) { int success = 1; if (array_numdims(ary) != exact_dimensions) { PyErr_Format(PyExc_TypeError, "Array must have %d dimensions. Given array has %d dimensions", exact_dimensions, array_numdims(ary)); success = 0; } return success; } /* Require the given PyArrayObject to have one of a list of specified * number of dimensions. If the array has one of the specified number * of dimensions, return 1. Otherwise, set the python error string * and return 0. */ int require_dimensions_n(PyArrayObject* ary, int* exact_dimensions, int n) { int success = 0; int i; char dims_str[255] = ""; char s[255]; for (i = 0; i < n && !success; i++) { if (array_numdims(ary) == exact_dimensions[i]) { success = 1; } } if (!success) { for (i = 0; i < n-1; i++) { sprintf(s, "%d, ", exact_dimensions[i]); strcat(dims_str,s); } sprintf(s, " or %d", exact_dimensions[n-1]); strcat(dims_str,s); PyErr_Format(PyExc_TypeError, "Array must have %s dimensions. Given array has %d dimensions", dims_str, array_numdims(ary)); } return success; } /* Require the given PyArrayObject to have a specified shape. If the * array has the specified shape, return 1. Otherwise, set the python * error string and return 0. */ int require_size(PyArrayObject* ary, npy_intp* size, int n) { int i; int success = 1; size_t len; char desired_dims[255] = "["; char s[255]; char actual_dims[255] = "["; for(i=0; i < n;i++) { if (size[i] != -1 && size[i] != array_size(ary,i)) { success = 0; } } if (!success) { for (i = 0; i < n; i++) { if (size[i] == -1) { sprintf(s, "*,"); } else { sprintf(s, "%ld,", (long int)size[i]); } strcat(desired_dims,s); } len = strlen(desired_dims); desired_dims[len-1] = ']'; for (i = 0; i < n; i++) { sprintf(s, "%ld,", (long int)array_size(ary,i)); strcat(actual_dims,s); } len = strlen(actual_dims); actual_dims[len-1] = ']'; PyErr_Format(PyExc_TypeError, "Array must have shape of %s. Given array has shape of %s", desired_dims, actual_dims); } return success; } /* Require the given PyArrayObject to be Fortran ordered. If the * the PyArrayObject is already Fortran ordered, do nothing. Else, * set the Fortran ordering flag and recompute the strides. */ int require_fortran(PyArrayObject* ary) { int success = 1; int nd = array_numdims(ary); int i; npy_intp * strides = array_strides(ary); if (array_is_fortran(ary)) return success; int n_non_one = 0; /* Set the Fortran ordered flag */ const npy_intp *dims = array_dimensions(ary); for (i=0; i < nd; ++i) n_non_one += (dims[i] != 1) ? 1 : 0; if (n_non_one > 1) array_clearflags(ary,NPY_ARRAY_CARRAY); array_enableflags(ary,NPY_ARRAY_FARRAY); /* Recompute the strides */ strides[0] = strides[nd-1]; for (i=1; i < nd; ++i) strides[i] = strides[i-1] * array_size(ary,i-1); return success; } } /* Combine all NumPy fragments into one for convenience */ %fragment("NumPy_Fragments", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros", fragment="NumPy_Utilities", fragment="NumPy_Object_to_Array", fragment="NumPy_Array_Requirements") { } /* End John Hunter translation (with modifications by Bill Spotz) */ /* %numpy_typemaps() macro * * This macro defines a family of 75 typemaps that allow C arguments * of the form * * 1. (DATA_TYPE IN_ARRAY1[ANY]) * 2. (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) * 3. (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) * * 4. (DATA_TYPE IN_ARRAY2[ANY][ANY]) * 5. (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * 6. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) * 7. (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * 8. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) * * 9. (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) * 10. (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 11. (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 12. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) * 13. (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 14. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) * * 15. (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY]) * 16. (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 17. (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 18. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, , DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4) * 19. (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 20. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4) * * 21. (DATA_TYPE INPLACE_ARRAY1[ANY]) * 22. (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) * 23. (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) * * 24. (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) * 25. (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * 26. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) * 27. (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * 28. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) * * 29. (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) * 30. (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 31. (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 32. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) * 33. (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * 34. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) * * 35. (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY]) * 36. (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 37. (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 38. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4) * 39. (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) * 40. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4) * * 41. (DATA_TYPE ARGOUT_ARRAY1[ANY]) * 42. (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) * 43. (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) * * 44. (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) * * 45. (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) * * 46. (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY]) * * 47. (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) * 48. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) * * 49. (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * 50. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) * 51. (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * 52. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) * * 53. (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * 54. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) * 55. (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * 56. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) * * 57. (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) * 58. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4) * 59. (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) * 60. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4) * * 61. (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1) * 62. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1) * * 63. (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * 64. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2) * 65. (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * 66. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2) * * 67. (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * 68. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3) * 69. (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * 70. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3) * * 71. (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) * 72. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4) * 73. (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) * 74. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4) * * 75. (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT) * * where "DATA_TYPE" is any type supported by the NumPy module, and * "DIM_TYPE" is any int-like type suitable for specifying dimensions. * The difference between "ARRAY" typemaps and "FARRAY" typemaps is * that the "FARRAY" typemaps expect Fortran ordering of * multidimensional arrays. In python, the dimensions will not need * to be specified (except for the "DATA_TYPE* ARGOUT_ARRAY1" * typemaps). The IN_ARRAYs can be a numpy array or any sequence that * can be converted to a numpy array of the specified type. The * INPLACE_ARRAYs must be numpy arrays of the appropriate type. The * ARGOUT_ARRAYs will be returned as new numpy arrays of the * appropriate type. * * These typemaps can be applied to existing functions using the * %apply directive. For example: * * %apply (double* IN_ARRAY1, int DIM1) {(double* series, int length)}; * double prod(double* series, int length); * * %apply (int DIM1, int DIM2, double* INPLACE_ARRAY2) * {(int rows, int cols, double* matrix )}; * void floor(int rows, int cols, double* matrix, double f); * * %apply (double IN_ARRAY3[ANY][ANY][ANY]) * {(double tensor[2][2][2] )}; * %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY]) * {(double low[2][2][2] )}; * %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY]) * {(double upp[2][2][2] )}; * void luSplit(double tensor[2][2][2], * double low[2][2][2], * double upp[2][2][2] ); * * or directly with * * double prod(double* IN_ARRAY1, int DIM1); * * void floor(int DIM1, int DIM2, double* INPLACE_ARRAY2, double f); * * void luSplit(double IN_ARRAY3[ANY][ANY][ANY], * double ARGOUT_ARRAY3[ANY][ANY][ANY], * double ARGOUT_ARRAY3[ANY][ANY][ANY]); */ %define %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE) /************************/ /* Input Array Typemaps */ /************************/ /* Typemap suite for (DATA_TYPE IN_ARRAY1[ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY1[ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY1[ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = { $1_dim0 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY1[ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = { -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); } %typemap(freearg) (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = {-1}; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE IN_ARRAY2[ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY2[ANY][ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY2[ANY][ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { $1_dim0, $1_dim1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY2[ANY][ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } %typemap(freearg) (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } %typemap(freearg) (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } %typemap(freearg) (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { /* for now, only concerned with lists */ $1 = PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL) { npy_intp size[2] = { -1, -1 }; PyArrayObject* temp_array; Py_ssize_t i; int is_new_object; /* length of the list */ $2 = PyList_Size($input); /* the arrays */ array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *)); object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *)); is_new_object_array = (int *)calloc($2,sizeof(int)); if (array == NULL || object_array == NULL || is_new_object_array == NULL) { SWIG_fail; } for (i=0; i<$2; i++) { temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object); /* the new array must be stored so that it can be destroyed in freearg */ object_array[i] = temp_array; is_new_object_array[i] = is_new_object; if (!temp_array || !require_dimensions(temp_array, 2)) SWIG_fail; /* store the size of the first array in the list, then use that for comparison. */ if (i == 0) { size[0] = array_size(temp_array,0); size[1] = array_size(temp_array,1); } if (!require_size(temp_array, size, 2)) SWIG_fail; array[i] = (DATA_TYPE*) array_data(temp_array); } $1 = (DATA_TYPE**) array; $3 = (DIM_TYPE) size[0]; $4 = (DIM_TYPE) size[1]; } %typemap(freearg) (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { Py_ssize_t i; if (array$argnum!=NULL) free(array$argnum); /*freeing the individual arrays if needed */ if (object_array$argnum!=NULL) { if (is_new_object_array$argnum!=NULL) { for (i=0; i<$2; i++) { if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i]) { Py_DECREF(object_array$argnum[i]); } } free(is_new_object_array$argnum); } free(object_array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* IN_ARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3) | !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } %typemap(freearg) (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* IN_FARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3}; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 4) || !require_size(array, size, 4)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[4] = { -1, -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 4) || !require_size(array, size, 4)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); $5 = (DIM_TYPE) array_size(array,3); } %typemap(freearg) (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { /* for now, only concerned with lists */ $1 = PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL) { npy_intp size[3] = { -1, -1, -1 }; PyArrayObject* temp_array; Py_ssize_t i; int is_new_object; /* length of the list */ $2 = PyList_Size($input); /* the arrays */ array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *)); object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *)); is_new_object_array = (int *)calloc($2,sizeof(int)); if (array == NULL || object_array == NULL || is_new_object_array == NULL) { SWIG_fail; } for (i=0; i<$2; i++) { temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object); /* the new array must be stored so that it can be destroyed in freearg */ object_array[i] = temp_array; is_new_object_array[i] = is_new_object; if (!temp_array || !require_dimensions(temp_array, 3)) SWIG_fail; /* store the size of the first array in the list, then use that for comparison. */ if (i == 0) { size[0] = array_size(temp_array,0); size[1] = array_size(temp_array,1); size[2] = array_size(temp_array,2); } if (!require_size(temp_array, size, 3)) SWIG_fail; array[i] = (DATA_TYPE*) array_data(temp_array); } $1 = (DATA_TYPE**) array; $3 = (DIM_TYPE) size[0]; $4 = (DIM_TYPE) size[1]; $5 = (DIM_TYPE) size[2]; } %typemap(freearg) (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { Py_ssize_t i; if (array$argnum!=NULL) free(array$argnum); /*freeing the individual arrays if needed */ if (object_array$argnum!=NULL) { if (is_new_object_array$argnum!=NULL) { for (i=0; i<$2; i++) { if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i]) { Py_DECREF(object_array$argnum[i]); } } free(is_new_object_array$argnum); } free(object_array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, * DATA_TYPE* IN_ARRAY4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[4] = { -1, -1, -1 , -1}; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 4) || !require_size(array, size, 4)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DIM_TYPE) array_size(array,3); $5 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[4] = { -1, -1, -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 4) || !require_size(array, size, 4) | !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); $5 = (DIM_TYPE) array_size(array,3); } %typemap(freearg) (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, * DATA_TYPE* IN_FARRAY4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[4] = { -1, -1, -1 , -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 4) || !require_size(array, size, 4) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DIM_TYPE) array_size(array,3); $5 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /***************************/ /* In-Place Array Typemaps */ /***************************/ /* Typemap suite for (DATA_TYPE INPLACE_ARRAY1[ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY1[ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY1[ANY]) (PyArrayObject* array=NULL) { npy_intp size[1] = { $1_dim0 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_size(array, size, 1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) (PyArrayObject* array=NULL, int i=1) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = 1; for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i); } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) (PyArrayObject* array=NULL, int i=0) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = 1; for (i=0; i < array_numdims(array); ++i) $1 *= array_size(array,i); $2 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) (PyArrayObject* array=NULL) { npy_intp size[2] = { $1_dim0, $1_dim1 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_size(array, size, 2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) (PyArrayObject* array=NULL) { npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_size(array, size, 3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } /* Typemap suite for (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL) { npy_intp size[2] = { -1, -1 }; PyArrayObject* temp_array; Py_ssize_t i; /* length of the list */ $2 = PyList_Size($input); /* the arrays */ array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *)); object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *)); if (array == NULL || object_array == NULL) { SWIG_fail; } for (i=0; i<$2; i++) { temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE); /* the new array must be stored so that it can be destroyed in freearg */ object_array[i] = temp_array; if ( !temp_array || !require_dimensions(temp_array, 2) || !require_contiguous(temp_array) || !require_native(temp_array) || !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE) ) SWIG_fail; /* store the size of the first array in the list, then use that for comparison. */ if (i == 0) { size[0] = array_size(temp_array,0); size[1] = array_size(temp_array,1); } if (!require_size(temp_array, size, 2)) SWIG_fail; array[i] = (DATA_TYPE*) array_data(temp_array); } $1 = (DATA_TYPE**) array; $3 = (DIM_TYPE) size[0]; $4 = (DIM_TYPE) size[1]; } %typemap(freearg) (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { if (array$argnum!=NULL) free(array$argnum); if (object_array$argnum!=NULL) free(object_array$argnum); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* INPLACE_ARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* INPLACE_FARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY]) (PyArrayObject* array=NULL) { npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,4) || !require_size(array, size, 4) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,4) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); $5 = (DIM_TYPE) array_size(array,3); } /* Typemap suite for (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { $1 = PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL) { npy_intp size[3] = { -1, -1, -1 }; PyArrayObject* temp_array; Py_ssize_t i; /* length of the list */ $2 = PyList_Size($input); /* the arrays */ array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *)); object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *)); if (array == NULL || object_array == NULL) { SWIG_fail; } for (i=0; i<$2; i++) { temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE); /* the new array must be stored so that it can be destroyed in freearg */ object_array[i] = temp_array; if ( !temp_array || !require_dimensions(temp_array, 3) || !require_contiguous(temp_array) || !require_native(temp_array) || !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE) ) SWIG_fail; /* store the size of the first array in the list, then use that for comparison. */ if (i == 0) { size[0] = array_size(temp_array,0); size[1] = array_size(temp_array,1); size[2] = array_size(temp_array,2); } if (!require_size(temp_array, size, 3)) SWIG_fail; array[i] = (DATA_TYPE*) array_data(temp_array); } $1 = (DATA_TYPE**) array; $3 = (DIM_TYPE) size[0]; $4 = (DIM_TYPE) size[1]; $5 = (DIM_TYPE) size[2]; } %typemap(freearg) (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { if (array$argnum!=NULL) free(array$argnum); if (object_array$argnum!=NULL) free(object_array$argnum); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, * DATA_TYPE* INPLACE_ARRAY4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,4) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DIM_TYPE) array_size(array,3); $5 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3, DIM_TYPE DIM4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,4) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); $5 = (DIM_TYPE) array_size(array,3); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* INPLACE_FARRAY4) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,4) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DIM_TYPE) array_size(array,3); $5 = (DATA_TYPE*) array_data(array); } /*************************/ /* Argout Array Typemaps */ /*************************/ /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY1[ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY1[ANY]) (PyObject* array = NULL) { npy_intp dims[1] = { $1_dim0 }; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY1[ANY]) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /* Typemap suite for (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) */ %typemap(in,numinputs=1, fragment="NumPy_Fragments") (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) (PyObject* array = NULL) { npy_intp dims[1]; if (!PyLong_Check($input)) { const char* typestring = pytype_string($input); PyErr_Format(PyExc_TypeError, "Int dimension expected. '%s' given.", typestring); SWIG_fail; } $2 = (DIM_TYPE) PyLong_AsSsize_t($input); if ($2 == -1 && PyErr_Occurred()) SWIG_fail; dims[0] = (npy_intp) $2; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); } %typemap(argout) (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) */ %typemap(in,numinputs=1, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) (PyObject* array = NULL) { npy_intp dims[1]; if (!PyLong_Check($input)) { const char* typestring = pytype_string($input); PyErr_Format(PyExc_TypeError, "Int dimension expected. '%s' given.", typestring); SWIG_fail; } $1 = (DIM_TYPE) PyLong_AsSsize_t($input); if ($1 == -1 && PyErr_Occurred()) SWIG_fail; dims[0] = (npy_intp) $1; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $2 = (DATA_TYPE*) array_data(array); } %typemap(argout) (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) (PyObject* array = NULL) { npy_intp dims[2] = { $1_dim0, $1_dim1 }; array = PyArray_SimpleNew(2, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) (PyObject* array = NULL) { npy_intp dims[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = PyArray_SimpleNew(3, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY]) (PyObject* array = NULL) { npy_intp dims[4] = { $1_dim0, $1_dim1, $1_dim2, $1_dim3 }; array = PyArray_SimpleNew(4, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY]) { $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum); } /*****************************/ /* Argoutview Array Typemaps */ /*****************************/ /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim_temp) { $1 = &data_temp; $2 = &dim_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) { npy_intp dims[1] = { *$2 }; PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DATA_TYPE** ARGOUTVIEW_ARRAY1) (DIM_TYPE dim_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim_temp; $2 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) { npy_intp dims[1] = { *$1 }; PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEW_ARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEW_FARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DATA_TYPE** ARGOUTVIEW_FARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; $5 = &dim4_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) { npy_intp dims[4] = { *$2, *$3, *$4 , *$5 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 , DATA_TYPE** ARGOUTVIEW_ARRAY4) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &dim4_temp; $5 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4) { npy_intp dims[4] = { *$1, *$2, *$3 , *$4 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; $5 = &dim4_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) { npy_intp dims[4] = { *$2, *$3, *$4 , *$5 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 , DATA_TYPE** ARGOUTVIEW_FARRAY4) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &dim4_temp; $5 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4) { npy_intp dims[4] = { *$1, *$2, *$3 , *$4 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /*************************************/ /* Managed Argoutview Array Typemaps */ /*************************************/ /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim_temp) { $1 = &data_temp; $2 = &dim_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1) { npy_intp dims[1] = { *$2 }; PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DATA_TYPE** ARGOUTVIEWM_ARRAY1) (DIM_TYPE dim_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim_temp; $2 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1) { npy_intp dims[1] = { *$1 }; PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$2), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEWM_ARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$3), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEWM_FARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$3), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DATA_TYPE** ARGOUTVIEWM_ARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject* obj= PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$4), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DATA_TYPE** ARGOUTVIEWM_FARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$4), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; $5 = &dim4_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) { npy_intp dims[4] = { *$2, *$3, *$4 , *$5 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 , DATA_TYPE** ARGOUTVIEWM_ARRAY4) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &dim4_temp; $5 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4) { npy_intp dims[4] = { *$1, *$2, *$3 , *$4 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5)); PyArrayObject* array = (PyArrayObject*) obj; if (!array) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$5), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 ) (DATA_TYPE* data_temp = NULL , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; $5 = &dim4_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4) { npy_intp dims[4] = { *$2, *$3, *$4 , *$5 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DIM_TYPE* DIM3 , DIM_TYPE* DIM4 , DATA_TYPE** ARGOUTVIEWM_FARRAY4) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &dim4_temp; $5 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4) { npy_intp dims[4] = { *$1, *$2, *$3 , *$4 }; PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5)); PyArrayObject* array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; PyObject* cap = PyCapsule_New((void*)(*$5), SWIGPY_CAPSULE_NAME, free_cap); %#if NPY_API_VERSION < NPY_1_7_API_VERSION PyArray_BASE(array) = cap; %#else PyArray_SetBaseObject(array,cap); %#endif $result = SWIG_Python_AppendOutput($result,obj); } /**************************************/ /* In-Place Array Typemap - flattened */ /**************************************/ /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT) (PyArrayObject* array=NULL, int i=1) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_c_or_f_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = 1; for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i); } %enddef /* %numpy_typemaps() macro */ /* *************************************************************** */ /* Concrete instances of the %numpy_typemaps() macro: Each invocation * below applies all of the typemaps above to the specified data type. */ %numpy_typemaps(signed char , NPY_BYTE , int) %numpy_typemaps(unsigned char , NPY_UBYTE , int) %numpy_typemaps(short , NPY_SHORT , int) %numpy_typemaps(unsigned short , NPY_USHORT , int) %numpy_typemaps(int , NPY_INT , int) %numpy_typemaps(unsigned int , NPY_UINT , int) %numpy_typemaps(long , NPY_LONG , int) %numpy_typemaps(unsigned long , NPY_ULONG , int) %numpy_typemaps(long long , NPY_LONGLONG , int) %numpy_typemaps(unsigned long long, NPY_ULONGLONG, int) %numpy_typemaps(float , NPY_FLOAT , int) %numpy_typemaps(double , NPY_DOUBLE , int) %numpy_typemaps(int8_t , NPY_INT8 , int) %numpy_typemaps(int16_t , NPY_INT16 , int) %numpy_typemaps(int32_t , NPY_INT32 , int) %numpy_typemaps(int64_t , NPY_INT64 , int) %numpy_typemaps(uint8_t , NPY_UINT8 , int) %numpy_typemaps(uint16_t , NPY_UINT16 , int) %numpy_typemaps(uint32_t , NPY_UINT32 , int) %numpy_typemaps(uint64_t , NPY_UINT64 , int) /* *************************************************************** * The follow macro expansion does not work, because C++ bool is 4 * bytes and NPY_BOOL is 1 byte * * %numpy_typemaps(bool, NPY_BOOL, int) */ /* *************************************************************** * On my Mac, I get the following warning for this macro expansion: * 'swig/python detected a memory leak of type 'long double *', no destructor found.' * * %numpy_typemaps(long double, NPY_LONGDOUBLE, int) */ #ifdef __cplusplus %include %numpy_typemaps(std::complex, NPY_CFLOAT , int) %numpy_typemaps(std::complex, NPY_CDOUBLE, int) #endif #endif /* SWIGPYTHON */ stevengj-nlopt-88c424d/src/util/000077500000000000000000000000001521061417600166025ustar00rootroot00000000000000stevengj-nlopt-88c424d/src/util/mt19937ar.c000066400000000000000000000164621521061417600203370ustar00rootroot00000000000000/* A C-program for MT19937, with initialization improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Before using, initialize the state by using nlopt_init_genrand(seed) or nlopt_init_by_array(init_key, key_length). Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Modified 2007 by Steven G. Johnson for use with NLopt (to avoid namespace pollution, use uint32_t instead of unsigned long, and add the urand function). Modified 2009 to add normal-distributed random numbers. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ #include "nlopt-util.h" #if defined(HAVE_STDINT_H) # include #endif #ifndef HAVE_UINT32_T # if SIZEOF_UNSIGNED_LONG == 4 typedef unsigned long uint32_t; # elif SIZEOF_UNSIGNED_INT == 4 typedef unsigned int uint32_t; # else # error No 32-bit unsigned integer type # endif #endif /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ /* SGJ 2010: make RNG thread-safe by declaring the RNG state as thread-local storage, at least for GCC, MSVC, and Intel C++ */ static THREADLOCAL uint32_t mt[N]; /* the array for the state vector */ static THREADLOCAL int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ /* initializes mt[N] with a seed */ void nlopt_init_genrand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ mt[mti] &= 0xffffffffUL; /* for >32 bit machines */ } } /* generates a random number on [0,0xffffffff]-interval */ static uint32_t nlopt_genrand_int32(void) { uint32_t y; static uint32_t mag01[2]={0x0UL, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ nlopt_init_genrand(5489UL); /* a default initial seed is used */ for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; } for (;kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } #if 0 /* not used in NLopt */ /* initialize by an array with array-length */ /* init_key is the array for initializing keys */ /* key_length is its length */ /* slight change for C++, 2004/2/26 */ static void nlopt_init_by_array(uint32_t init_key[], int key_length) { int i, j, k; nlopt_init_genrand(19650218UL); i=1; j=0; k = (N>key_length ? N : key_length); for (; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; j++; if (i>=N) { mt[0] = mt[N-1]; i=1; } if (j>=key_length) j=0; } for (k=N-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; if (i>=N) { mt[0] = mt[N-1]; i=1; } } mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ } /* generates a random number on [0,0x7fffffff]-interval */ static long nlopt_genrand_int31(void) { return (long)(nlopt_genrand_int32()>>1); } /* generates a random number on [0,1]-real-interval */ static double nlopt_genrand_real1(void) { return nlopt_genrand_int32()*(1.0/4294967295.0); /* divided by 2^32-1 */ } /* generates a random number on [0,1)-real-interval */ static double nlopt_genrand_real2(void) { return nlopt_genrand_int32()*(1.0/4294967296.0); /* divided by 2^32 */ } /* generates a random number on (0,1)-real-interval */ static double nlopt_genrand_real3(void) { return (((double)nlopt_genrand_int32()) + 0.5)*(1.0/4294967296.0); /* divided by 2^32 */ } #endif /* generates a random number on [0,1) with 53-bit resolution*/ static double nlopt_genrand_res53(void) { uint32_t a=nlopt_genrand_int32()>>5, b=nlopt_genrand_int32()>>6; return(a*67108864.0+b)*(1.0/9007199254740992.0); } /* These real versions are due to Isaku Wada, 2002/01/09 added */ /* generate uniform random number in [a,b) with 53-bit resolution, added by SGJ */ double nlopt_urand(double a, double b) { return(a + (b - a) * nlopt_genrand_res53()); } /* generate a uniform random number in [0,n), added by SGJ */ int nlopt_iurand(int n) { return(nlopt_genrand_int32() % n); } /* normal-distributed random numbers with the given mean and std. deviation, added by SGJ */ double nlopt_nrand(double mean, double stddev) { /* Box-Muller algorithm to generate Gaussian from uniform see Knuth vol II algorithm P, sec. 3.4.1 */ double v1, v2, s; do { v1 = nlopt_urand(-1, 1); v2 = nlopt_urand(-1, 1); s = v1*v1 + v2*v2; } while (s >= 1.0); if (s == 0) { return mean; } else { return mean + v1 * sqrt(-2 * log(s) / s) * stddev; } } stevengj-nlopt-88c424d/src/util/mt19937ar_test.c000066400000000000000000000011471521061417600213700ustar00rootroot00000000000000#include #include "nlopt-util.h" int main(void) { int i; /* uint32_t init[4]={0x123, 0x234, 0x345, 0x456}, length=4; nlopt_init_by_array(init, length); */ nlopt_init_genrand(5489UL); /* nlopt_genrand_int32 */ printf("1000 outputs of nlopt_iurand()\n"); for (i=0; i<1000; i++) { printf("%10d ", nlopt_iurand(0x7fff)); if (i%5==4) printf("\n"); } /* genrand_real2 */ printf("\n1000 outputs of nlopt_urand()\n"); for (i=0; i<1000; i++) { printf("%10.8f ", nlopt_urand(0,1)); if (i%5==4) printf("\n"); } return 0; } stevengj-nlopt-88c424d/src/util/nlopt-getopt.c000066400000000000000000000043151521061417600214050ustar00rootroot00000000000000#include #include #include "nlopt-getopt.h" int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(int nargc, char *const nargv[], const char *ostr) { static char *place = EMSG; /* option letter processing */ const char *oli; /* option letter list index */ if (optreset || !*place) { /* update scanning pointer */ optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } if (place[1] && *++place == '-') { /* found "--" */ ++optind; place = EMSG; return (-1); } } /* option letter okay? */ if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) { /* if the user didn't specify '-' as an option, assume it means -1. */ if (optopt == (int) '-') return (-1); if (!*place) ++optind; if (opterr && *ostr != ':') (void) printf("illegal option -- %c\n", optopt); return (BADCH); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void) printf("option requires an argument -- %c\n", optopt); return (BADCH); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return (optopt); /* dump back option letter */ } stevengj-nlopt-88c424d/src/util/nlopt-getopt.h000066400000000000000000000045151521061417600214140ustar00rootroot00000000000000/* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef NLOPT_GETOPT_H #define NLOPT_GETOPT_H /* avoid linker conflicts if we use nlopt-getopt.c with a libc that has getopt */ #define opterr nlopt_opterr #define optind nlopt_optind #define optopt nlopt_optopt #define optreset nlopt_optreset #define optarg nlopt_optarg #define getopt nlopt_getopt #ifdef __cplusplus extern "C" { #endif extern int opterr, optind, optopt, optreset; extern char *optarg; extern int getopt(int nargc, char *const nargv[], const char *ostr); #ifdef __cplusplus } #endif #endif stevengj-nlopt-88c424d/src/util/nlopt-util.h000066400000000000000000000140251521061417600210640ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NLOPT_UTIL_H #define NLOPT_UTIL_H #include #include #include #include "nlopt_config.h" #include "nlopt.h" /* workaround for Solaris + gcc 3.4.x bug (see configure.ac) */ #if defined(__GNUC__) && defined(REPLACEMENT_HUGE_VAL) # undef HUGE_VAL # define HUGE_VAL REPLACEMENT_HUGE_VAL #endif #ifndef HAVE_COPYSIGN #if !defined(__cplusplus) && __STDC_VERSION__ < 199901 /* not quite right for y == -0, but good enough for us */ # define copysign(x, y) ((y) < 0 ? -fabs(x) : fabs(x)) #else extern double copysign(double x, double y); /* may not be declared in C89 */ #endif #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int nlopt_isinf(double x); int nlopt_isfinite(double x); int nlopt_istiny(double x); int nlopt_isnan(double x); /* re-entrant qsort, uses the BSD convention */ extern void nlopt_qsort_r(void *base_, size_t nmemb, size_t size, void *thunk, int (*compar) (void *, const void *, const void *)); /* seconds timer */ extern double nlopt_seconds(void); extern unsigned long nlopt_time_seed(void); /* pseudorandom number generation by Mersenne twister algorithm */ extern void nlopt_init_genrand(unsigned long s); extern double nlopt_urand(double a, double b); extern int nlopt_iurand(int n); extern double nlopt_nrand(double mean, double stddev); /* Sobol' low-discrepancy-sequence generation */ typedef struct nlopt_soboldata_s *nlopt_sobol; extern nlopt_sobol nlopt_sobol_create(unsigned sdim); extern void nlopt_sobol_destroy(nlopt_sobol s); extern void nlopt_sobol_next01(nlopt_sobol s, double *x); extern void nlopt_sobol_next(nlopt_sobol s, double *x, const double *lb, const double *ub); extern void nlopt_sobol_skip(nlopt_sobol s, unsigned n, double *x); /* stopping criteria */ typedef struct { unsigned n; double minf_max; double ftol_rel; double ftol_abs; double xtol_rel; const double *xtol_abs; const double *x_weights; int *nevals_p, maxeval; double maxtime, start; int *force_stop; char **stop_msg; /* pointer to msg string to update */ } nlopt_stopping; extern int nlopt_stop_f(const nlopt_stopping * stop, double f, double oldf); extern int nlopt_stop_ftol(const nlopt_stopping * stop, double f, double oldf); extern int nlopt_stop_x(const nlopt_stopping * stop, const double *x, const double *oldx); extern int nlopt_stop_dx(const nlopt_stopping * stop, const double *x, const double *dx); extern int nlopt_stop_xs(const nlopt_stopping * stop, const double *xs, const double *oldxs, const double *scale_min, const double *scale_max); extern int nlopt_stop_evals(const nlopt_stopping * stop); extern int nlopt_stop_time_(double start, double maxtime); extern int nlopt_stop_time(const nlopt_stopping * stop); extern int nlopt_stop_evalstime(const nlopt_stopping * stop); extern int nlopt_stop_forced(const nlopt_stopping * stop); /* like vsprintf, but reallocs p to whatever size is needed */ extern char *nlopt_vsprintf(char *p, const char *format, va_list ap); extern void nlopt_stop_msg(const nlopt_stopping * s, const char *format, ...) #ifdef __GNUC__ __attribute__ ((format(printf, 2, 3))) #endif ; /* for local optimizations, temporarily setting eval/time limits */ extern nlopt_result nlopt_optimize_limited(nlopt_opt opt, double *x, double *minf, int maxevals, double maxtime); /* data structure for nonlinear inequality or equality constraint (f <= 0 or f = 0, respectively). tol (>= 0) is a tolerance that is used for stopping criteria -- the point is considered "feasible" for purposes of stopping if the constraint is violated by at most tol. */ typedef struct { unsigned m; /* dimensional of constraint: mf maps R^n -> R^m */ nlopt_func f; /* one-dimensional constraint, requires m == 1 */ nlopt_mfunc mf; nlopt_precond pre; /* preconditioner for f (NULL if none or if mf) */ void *f_data; double *tol; } nlopt_constraint; extern unsigned nlopt_count_constraints(unsigned p, const nlopt_constraint * c); extern unsigned nlopt_max_constraint_dim(unsigned p, const nlopt_constraint * c); extern void nlopt_eval_constraint(double *result, double *grad, const nlopt_constraint * c, unsigned n, const double *x); /* rescale.c: */ double *nlopt_compute_rescaling(unsigned n, const double *dx); double *nlopt_new_rescaled(unsigned n, const double *s, const double *x); void nlopt_rescale(unsigned n, const double *s, const double *x, double *xs); void nlopt_unscale(unsigned n, const double *s, const double *x, double *xs); void nlopt_reorder_bounds(unsigned n, double *lb, double *ub); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/util/qsort_r.c000066400000000000000000000123411521061417600204400ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nlopt-util.h" #include #include typedef int cmp_t(void *, const void *, const void *); static char *med3(char *, char *, char *, cmp_t *, void *); #define MIN(a, b) ((a) < (b) ? a : b) /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". */ static void swapfunc(char *a, char *b, size_t es) { char t; do { t = *a; *a++ = *b; *b++ = t; } while (--es > 0); } #define vecswap(a, b, n) \ if ((n) > 0) swapfunc(a, b, n) #define CMP(t, x, y) (cmp((t), (x), (y))) static char * med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk) { return CMP(thunk, a, b) < 0 ? (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); } void qsort_r_fallback(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) { char *pa, *pb, *pc, *pd, *pl, *pm, *pn; size_t d1, d2; int cmp_result; int swap_cnt; loop: swap_cnt = 0; if (n < 7) { for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swapfunc(pl, pl - es, es); return; } pm = (char *)a + (n / 2) * es; if (n > 7) { pl = a; pn = (char *)a + (n - 1) * es; if (n > 40) { size_t d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); pm = med3(pm - d, pm, pm + d, cmp, thunk); pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); } pm = med3(pl, pm, pn, cmp, thunk); } swapfunc(a, pm, es); pa = pb = (char *)a + es; pc = pd = (char *)a + (n - 1) * es; for (;;) { while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) { if (cmp_result == 0) { swap_cnt = 1; swapfunc(pa, pb, es); pa += es; } pb += es; } while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) { if (cmp_result == 0) { swap_cnt = 1; swapfunc(pc, pd, es); pd -= es; } pc -= es; } if (pb > pc) break; swapfunc(pb, pc, es); swap_cnt = 1; pb += es; pc -= es; } if (swap_cnt == 0) { /* Switch to insertion sort */ for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swapfunc(pl, pl - es, es); return; } pn = (char *)a + n * es; d1 = MIN(pa - (char *)a, pb - pa); vecswap(a, pb - d1, d1); d1 = MIN(pd - pc, (ptrdiff_t) (pn - pd - es)); vecswap(pb, pn - d1, d1); d1 = pb - pa; d2 = pd - pc; if (d1 <= d2) { /* Recurse on left partition, then iterate on right partition */ if (d1 > es) { qsort_r_fallback(a, d1 / es, es, thunk, cmp); } if (d2 > es) { /* Iterate rather than recurse to save stack space */ /* qsort(pn - d2, d2 / es, es, cmp); */ a = pn - d2; n = d2 / es; goto loop; } } else { /* Recurse on right partition, then iterate on left partition */ if (d2 > es) { qsort_r_fallback(pn - d2, d2 / es, es, thunk, cmp); } if (d1 > es) { /* Iterate rather than recurse to save stack space */ /* qsort(a, d1 / es, es, cmp); */ n = d1 / es; goto loop; } } } /* these are required for GNU api compatibility as nlopt uses the BSD arguments ordering */ typedef struct { cmp_t* compar; void *thunk; } qsort_wrapper; #if defined(HAVE_QSORT_R) && defined(__linux__) static int qsort_cmp_wrap(const void *a, const void *b, void *thunk) { qsort_wrapper *wrap = (qsort_wrapper *) thunk; return (*wrap->compar)(wrap->thunk, a, b); } extern void qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *arg); #endif void nlopt_qsort_r(void *base_, size_t nmemb, size_t size, void *thunk, cmp_t* compar) { #if defined(HAVE_QSORT_R) && (defined(__APPLE__) || defined(__FreeBSD__)) qsort_r(base_, nmemb, size, thunk, compar); #elif defined(HAVE_QSORT_R) && defined(__linux__) qsort_wrapper wrapper; wrapper.compar = compar; wrapper.thunk = thunk; qsort_r(base_, nmemb, size, qsort_cmp_wrap, &wrapper); /*#elif defined(_WIN32) qsort_s(base_, nmemb, size, compar, thunk);*/ #else qsort_r_fallback(base_, nmemb, size, thunk, compar); #endif } stevengj-nlopt-88c424d/src/util/redblack.c000066400000000000000000000276461521061417600205340ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* simple implementation of red-black trees optimized for use with DIRECT */ #include #include #include "redblack.h" /* it is convenient to use an explicit node for NULL nodes ... we need to be careful never to change this node indirectly via one of our pointers! */ rb_node nil = { &nil, &nil, &nil, 0, BLACK }; #define NIL (&nil) void nlopt_rb_tree_init(rb_tree * t, rb_compare compare) { t->compare = compare; t->root = NIL; t->N = 0; } static void destroy(rb_node * n) { if (n != NIL) { destroy(n->l); destroy(n->r); free(n); } } void nlopt_rb_tree_destroy(rb_tree * t) { destroy(t->root); t->root = NIL; } void nlopt_rb_tree_destroy_with_keys(rb_tree * t) { rb_node *n = nlopt_rb_tree_min(t); while (n) { free(n->k); n->k = NULL; n = nlopt_rb_tree_succ(n); } nlopt_rb_tree_destroy(t); } static void rotate_left(rb_node * p, rb_tree * t) { rb_node *n = p->r; /* must be non-NIL */ p->r = n->l; n->l = p; if (p->p != NIL) { if (p == p->p->l) p->p->l = n; else p->p->r = n; } else t->root = n; n->p = p->p; p->p = n; if (p->r != NIL) p->r->p = p; } static void rotate_right(rb_node * p, rb_tree * t) { rb_node *n = p->l; /* must be non-NIL */ p->l = n->r; n->r = p; if (p->p != NIL) { if (p == p->p->l) p->p->l = n; else p->p->r = n; } else t->root = n; n->p = p->p; p->p = n; if (p->l != NIL) p->l->p = p; } static void insert_node(rb_tree * t, rb_node * n) { rb_compare compare = t->compare; rb_key k = n->k; rb_node *p = t->root; n->c = RED; n->p = n->l = n->r = NIL; t->N++; if (p == NIL) { t->root = n; n->c = BLACK; return; } /* insert (RED) node into tree */ while (1) { if (compare(k, p->k) <= 0) { /* k <= p->k */ if (p->l != NIL) p = p->l; else { p->l = n; n->p = p; break; } } else { if (p->r != NIL) p = p->r; else { p->r = n; n->p = p; break; } } } fixtree: if (n->p->c == RED) { /* red cannot have red child */ rb_node *u = p == p->p->l ? p->p->r : p->p->l; if (u != NIL && u->c == RED) { p->c = u->c = BLACK; n = p->p; if ((p = n->p) != NIL) { n->c = RED; goto fixtree; } } else { if (n == p->r && p == p->p->l) { rotate_left(p, t); p = n; n = n->l; } else if (n == p->l && p == p->p->r) { rotate_right(p, t); p = n; n = n->r; } p->c = BLACK; p->p->c = RED; if (n == p->l && p == p->p->l) rotate_right(p->p, t); else if (n == p->r && p == p->p->r) rotate_left(p->p, t); } } } rb_node *nlopt_rb_tree_insert(rb_tree * t, rb_key k) { rb_node *n = (rb_node *) malloc(sizeof(rb_node)); if (!n) return NULL; n->k = k; insert_node(t, n); return n; } static int check_node(rb_node * n, int *nblack, rb_tree * t) { int nbl, nbr; rb_compare compare = t->compare; if (n == NIL) { *nblack = 0; return 1; } if (n->r != NIL && n->r->p != n) return 0; if (n->r != NIL && compare(n->r->k, n->k) < 0) return 0; if (n->l != NIL && n->l->p != n) return 0; if (n->l != NIL && compare(n->l->k, n->k) > 0) return 0; if (n->c == RED) { if (n->r != NIL && n->r->c == RED) return 0; if (n->l != NIL && n->l->c == RED) return 0; } if (!(check_node(n->r, &nbl, t) && check_node(n->l, &nbr, t))) return 0; if (nbl != nbr) return 0; *nblack = nbl + (n->c == BLACK); return 1; } int nlopt_rb_tree_check(rb_tree * t) { int nblack; if (nil.c != BLACK) return 0; if (nil.p != NIL || nil.r != NIL || nil.l != NIL) return 0; if (t->root == NIL) return 1; if (t->root->c != BLACK) return 0; return check_node(t->root, &nblack, t); } rb_node *nlopt_rb_tree_find(rb_tree * t, rb_key k) { rb_compare compare = t->compare; rb_node *p = t->root; while (p != NIL) { int comp = compare(k, p->k); if (!comp) return p; p = comp <= 0 ? p->l : p->r; } return NULL; } /* find greatest point in subtree p that is <= k */ static rb_node *find_le(rb_node * p, rb_key k, rb_tree * t) { rb_compare compare = t->compare; while (p != NIL) { if (compare(p->k, k) <= 0) { /* p->k <= k */ rb_node *r = find_le(p->r, k, t); if (r) return r; else return p; } else /* p->k > k */ p = p->l; } return NULL; /* k < everything in subtree */ } /* find greatest point in t <= k */ rb_node *nlopt_rb_tree_find_le(rb_tree * t, rb_key k) { return find_le(t->root, k, t); } /* find greatest point in subtree p that is < k */ static rb_node *find_lt(rb_node * p, rb_key k, rb_tree * t) { rb_compare compare = t->compare; while (p != NIL) { if (compare(p->k, k) < 0) { /* p->k < k */ rb_node *r = find_lt(p->r, k, t); if (r) return r; else return p; } else /* p->k >= k */ p = p->l; } return NULL; /* k <= everything in subtree */ } /* find greatest point in t < k */ rb_node *nlopt_rb_tree_find_lt(rb_tree * t, rb_key k) { return find_lt(t->root, k, t); } /* find least point in subtree p that is > k */ static rb_node *find_gt(rb_node * p, rb_key k, rb_tree * t) { rb_compare compare = t->compare; while (p != NIL) { if (compare(p->k, k) > 0) { /* p->k > k */ rb_node *l = find_gt(p->l, k, t); if (l) return l; else return p; } else /* p->k <= k */ p = p->r; } return NULL; /* k >= everything in subtree */ } /* find least point in t > k */ rb_node *nlopt_rb_tree_find_gt(rb_tree * t, rb_key k) { return find_gt(t->root, k, t); } rb_node *nlopt_rb_tree_min(rb_tree * t) { rb_node *n = t->root; while (n != NIL && n->l != NIL) n = n->l; return (n == NIL ? NULL : n); } rb_node *nlopt_rb_tree_max(rb_tree * t) { rb_node *n = t->root; while (n != NIL && n->r != NIL) n = n->r; return (n == NIL ? NULL : n); } rb_node *nlopt_rb_tree_succ(rb_node * n) { if (!n) return NULL; if (n->r == NIL) { rb_node *prev; do { prev = n; n = n->p; } while (prev == n->r && n != NIL); return n == NIL ? NULL : n; } else { n = n->r; while (n->l != NIL) n = n->l; return n; } } rb_node *nlopt_rb_tree_pred(rb_node * n) { if (!n) return NULL; if (n->l == NIL) { rb_node *prev; do { prev = n; n = n->p; } while (prev == n->l && n != NIL); return n == NIL ? NULL : n; } else { n = n->l; while (n->r != NIL) n = n->r; return n; } } rb_node *nlopt_rb_tree_remove(rb_tree * t, rb_node * n) { rb_key k = n->k; rb_node *m, *mp; if (n->l != NIL && n->r != NIL) { rb_node *lmax = n->l; while (lmax->r != NIL) lmax = lmax->r; n->k = lmax->k; n = lmax; } m = n->l != NIL ? n->l : n->r; if (n->p != NIL) { if (n->p->r == n) n->p->r = m; else n->p->l = m; } else t->root = m; mp = n->p; if (m != NIL) m->p = mp; if (n->c == BLACK) { if (m->c == RED) m->c = BLACK; else { deleteblack: if (mp != NIL) { rb_node *s = m == mp->l ? mp->r : mp->l; if (s->c == RED) { mp->c = RED; s->c = BLACK; if (m == mp->l) rotate_left(mp, t); else rotate_right(mp, t); s = m == mp->l ? mp->r : mp->l; } if (mp->c == BLACK && s->c == BLACK && s->l->c == BLACK && s->r->c == BLACK) { if (s != NIL) s->c = RED; m = mp; mp = m->p; goto deleteblack; } else if (mp->c == RED && s->c == BLACK && s->l->c == BLACK && s->r->c == BLACK) { if (s != NIL) s->c = RED; mp->c = BLACK; } else { if (m == mp->l && s->c == BLACK && s->l->c == RED && s->r->c == BLACK) { s->c = RED; s->l->c = BLACK; rotate_right(s, t); s = m == mp->l ? mp->r : mp->l; } else if (m == mp->r && s->c == BLACK && s->r->c == RED && s->l->c == BLACK) { s->c = RED; s->r->c = BLACK; rotate_left(s, t); s = m == mp->l ? mp->r : mp->l; } s->c = mp->c; mp->c = BLACK; if (m == mp->l) { s->r->c = BLACK; rotate_left(mp, t); } else { s->l->c = BLACK; rotate_right(mp, t); } } } } } t->N--; n->k = k; /* n may have changed during remove */ return n; /* the node that was deleted may be different from initial n */ } rb_node *nlopt_rb_tree_resort(rb_tree * t, rb_node * n) { n = nlopt_rb_tree_remove(t, n); insert_node(t, n); return n; } /* shift all key pointers by kshift ... this is useful when the keys are pointers into another array, that has been resized with realloc */ static void shift_keys(rb_node * n, ptrdiff_t kshift) { /* assumes n != NIL */ n->k += kshift; if (n->l != NIL) shift_keys(n->l, kshift); if (n->r != NIL) shift_keys(n->r, kshift); } void nlopt_rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift) { if (t->root != NIL) shift_keys(t->root, kshift); } stevengj-nlopt-88c424d/src/util/redblack.h000066400000000000000000000062701521061417600205270ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef REDBLACK_H #define REDBLACK_H #include /* for ptrdiff_t */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef double *rb_key; /* key type ... double* is convenient for us, but of course this could be cast to anything desired (although void* would look more generic) */ typedef enum { RED, BLACK } rb_color; typedef struct rb_node_s { struct rb_node_s *p, *r, *l; /* parent, right, left */ rb_key k; /* key (and data) */ rb_color c; } rb_node; typedef int (*rb_compare) (rb_key k1, rb_key k2); typedef struct { rb_compare compare; rb_node *root; int N; /* number of nodes */ } rb_tree; extern void nlopt_rb_tree_init(rb_tree * t, rb_compare compare); extern void nlopt_rb_tree_destroy(rb_tree * t); extern void nlopt_rb_tree_destroy_with_keys(rb_tree * t); extern rb_node *nlopt_rb_tree_insert(rb_tree * t, rb_key k); extern int nlopt_rb_tree_check(rb_tree * t); extern rb_node *nlopt_rb_tree_find(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_le(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_lt(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_gt(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_resort(rb_tree * t, rb_node * n); extern rb_node *nlopt_rb_tree_min(rb_tree * t); extern rb_node *nlopt_rb_tree_max(rb_tree * t); extern rb_node *nlopt_rb_tree_succ(rb_node * n); extern rb_node *nlopt_rb_tree_pred(rb_node * n); extern void nlopt_rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift); /* To change a key, use nlopt_rb_tree_find+resort. Removing a node currently wastes memory unless you change the allocation scheme in redblack.c */ extern rb_node *nlopt_rb_tree_remove(rb_tree * t, rb_node * n); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/src/util/redblack_test.c000066400000000000000000000145541521061417600215650ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "redblack.h" #include "nlopt_config.h" /* workaround for Solaris + gcc 3.4.x bug (see configure.ac) */ #if defined(__GNUC__) && defined(REPLACEMENT_HUGE_VAL) # undef HUGE_VAL # define HUGE_VAL REPLACEMENT_HUGE_VAL #endif static int comp(rb_key k1, rb_key k2) { if (*k1 < *k2) return -1; if (*k1 > *k2) return +1; return 0; } int main(int argc, char **argv) { int N, M; int *k; double kd; rb_tree t; rb_node *n; int i, j; if (argc < 2) { fprintf(stderr, "Usage: redblack_test Ntest [rand seed]\n"); return 1; } N = atoi(argv[1]); k = (int *) malloc(N * sizeof(int)); nlopt_rb_tree_init(&t, comp); srand((unsigned) (argc > 2 ? atoi(argv[2]) : time(NULL))); for (i = 0; i < N; ++i) { double *newk = (double *) malloc(sizeof(double)); *newk = (k[i] = rand() % N); if (!nlopt_rb_tree_insert(&t, newk)) { fprintf(stderr, "error in nlopt_rb_tree_insert\n"); return 1; } if (!nlopt_rb_tree_check(&t)) { fprintf(stderr, "nlopt_rb_tree_check_failed after insert!\n"); return 1; } } if (t.N != N) { fprintf(stderr, "incorrect N (%d) in tree (vs. %d)\n", t.N, N); return 1; } for (i = 0; i < N; ++i) { kd = k[i]; if (!nlopt_rb_tree_find(&t, &kd)) { fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]); return 1; } } n = nlopt_rb_tree_min(&t); for (i = 0; i < N; ++i) { if (!n) { fprintf(stderr, "not enough successors %d\n!", i); return 1; } printf("%d: %g\n", i, n->k[0]); n = nlopt_rb_tree_succ(n); } if (n) { fprintf(stderr, "too many successors!\n"); return 1; } n = nlopt_rb_tree_max(&t); for (i = 0; i < N; ++i) { if (!n) { fprintf(stderr, "not enough predecessors %d\n!", i); return 1; } printf("%d: %g\n", i, n->k[0]); n = nlopt_rb_tree_pred(n); } if (n) { fprintf(stderr, "too many predecessors!\n"); return 1; } for (M = N; M > 0; --M) { int knew = rand() % N; /* random new key */ j = rand() % M; /* random original key to replace */ for (i = 0; i < N; ++i) if (k[i] >= 0) if (j-- == 0) break; if (i >= N) abort(); kd = k[i]; if (!(n = nlopt_rb_tree_find(&t, &kd))) { fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]); return 1; } n->k[0] = knew; if (!nlopt_rb_tree_resort(&t, n)) { fprintf(stderr, "error in nlopt_rb_tree_resort\n"); return 1; } if (!nlopt_rb_tree_check(&t)) { fprintf(stderr, "nlopt_rb_tree_check_failed after change %d!\n", N - M + 1); return 1; } k[i] = -1 - knew; } if (t.N != N) { fprintf(stderr, "incorrect N (%d) in tree (vs. %d)\n", t.N, N); return 1; } for (i = 0; i < N; ++i) k[i] = -1 - k[i]; /* undo negation above */ for (i = 0; i < N; ++i) { rb_node *le, *gt; double lek, gtk; kd = 0.01 * (rand() % (N * 150) - N * 25); le = nlopt_rb_tree_find_le(&t, &kd); gt = nlopt_rb_tree_find_gt(&t, &kd); n = nlopt_rb_tree_min(&t); lek = le ? le->k[0] : -HUGE_VAL; gtk = gt ? gt->k[0] : +HUGE_VAL; printf("%g <= %g < %g\n", lek, kd, gtk); if (n->k[0] > kd) { if (le) { fprintf(stderr, "found invalid le %g for %g\n", lek, kd); return 1; } if (gt != n) { fprintf(stderr, "gt is not first node for k=%g\n", kd); return 1; } } else { rb_node *succ = n; do { n = succ; succ = nlopt_rb_tree_succ(n); } while (succ && succ->k[0] <= kd); if (n != le) { fprintf(stderr, "nlopt_rb_tree_find_le gave wrong result for k=%g\n", kd); return 1; } if (succ != gt) { fprintf(stderr, "nlopt_rb_tree_find_gt gave wrong result for k=%g\n", kd); return 1; } } } for (M = N; M > 0; --M) { j = rand() % M; for (i = 0; i < N; ++i) if (k[i] >= 0) if (j-- == 0) break; if (i >= N) abort(); kd = k[i]; if (!(n = nlopt_rb_tree_find(&t, &kd))) { fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]); return 1; } n = nlopt_rb_tree_remove(&t, n); free(n->k); free(n); if (!nlopt_rb_tree_check(&t)) { fprintf(stderr, "nlopt_rb_tree_check_failed after remove!\n"); return 1; } k[i] = -1 - k[i]; } if (t.N != 0) { fprintf(stderr, "nonzero N (%d) in tree at end\n", t.N); return 1; } nlopt_rb_tree_destroy(&t); free(k); printf("SUCCESS.\n"); return 0; } stevengj-nlopt-88c424d/src/util/rescale.c000066400000000000000000000061411521061417600203660ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include "nlopt-util.h" /* Return a new array of length n (> 0) that gives a rescaling factor for each dimension, or NULL if out of memory, with dx being the array of nonzero initial steps in each dimension. */ double *nlopt_compute_rescaling(unsigned n, const double *dx) { double *s = (double *) malloc(sizeof(double) * n); unsigned i; if (!s) return NULL; for (i = 0; i < n; ++i) s[i] = 1.0; /* default: no rescaling */ if (n == 1) return s; for (i = 1; i < n && dx[i] == dx[i - 1]; ++i); if (i < n) { /* unequal initial steps, rescale to make equal to dx[0] */ for (i = 1; i < n; ++i) s[i] = dx[i] / dx[0]; } return s; } void nlopt_rescale(unsigned n, const double *s, const double *x, double *xs) { unsigned i; if (!s) { for (i = 0; i < n; ++i) xs[i] = x[i]; } else { for (i = 0; i < n; ++i) xs[i] = x[i] / s[i]; } } void nlopt_unscale(unsigned n, const double *s, const double *x, double *xs) { unsigned i; if (!s) { for (i = 0; i < n; ++i) xs[i] = x[i]; } else { for (i = 0; i < n; ++i) xs[i] = x[i] * s[i]; } } /* return a new array of length n equal to the original array x divided by the scale factors s, or NULL on a memory error */ double *nlopt_new_rescaled(unsigned n, const double *s, const double *x) { double *xs = (double *) malloc(sizeof(double) * n); if (!xs) return NULL; nlopt_rescale(n, s, x, xs); return xs; } /* since rescaling can flip the signs of the x components and the bounds, we may have to re-order the bounds in order to ensure that they remain in the correct order */ void nlopt_reorder_bounds(unsigned n, double *lb, double *ub) { unsigned i; for (i = 0; i < n; ++i) if (lb[i] > ub[i]) { double t = lb[i]; lb[i] = ub[i]; ub[i] = t; } } stevengj-nlopt-88c424d/src/util/soboldata.h000066400000000000000000002141231521061417600207260ustar00rootroot00000000000000/* Copyright (c) 2007 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef SOBOLSEQ_H #define SOBOLSEQ_H /* Data on the primitive binary polynomials (a) and the corresponding starting values m, for Sobol sequences in up to 1111 dimensions, taken from: P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. Math. Soft. 14 (1), 88-100 (1988), as modified by: S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). */ #define MAXDIM 1111 #define MAXDEG 12 /* successive primitive binary-coefficient polynomials p(z) = a_0 + a_1 z + a_2 z^2 + ... a_31 z^31, where a_i is the i-th bit of sobol_a[j] for the j-th polynomial. */ static const uint32_t sobol_a[MAXDIM - 1] = { 3, 7, 11, 13, 19, 25, 37, 59, 47, 61, 55, 41, 67, 97, 91, 109, 103, 115, 131, 193, 137, 145, 143, 241, 157, 185, 167, 229, 171, 213, 191, 253, 203, 211, 239, 247, 285, 369, 299, 301, 333, 351, 355, 357, 361, 391, 397, 425, 451, 463, 487, 501, 529, 539, 545, 557, 563, 601, 607, 617, 623, 631, 637, 647, 661, 675, 677, 687, 695, 701, 719, 721, 731, 757, 761, 787, 789, 799, 803, 817, 827, 847, 859, 865, 875, 877, 883, 895, 901, 911, 949, 953, 967, 971, 973, 981, 985, 995, 1001, 1019, 1033, 1051, 1063, 1069, 1125, 1135, 1153, 1163, 1221, 1239, 1255, 1267, 1279, 1293, 1305, 1315, 1329, 1341, 1347, 1367, 1387, 1413, 1423, 1431, 1441, 1479, 1509, 1527, 1531, 1555, 1557, 1573, 1591, 1603, 1615, 1627, 1657, 1663, 1673, 1717, 1729, 1747, 1759, 1789, 1815, 1821, 1825, 1849, 1863, 1869, 1877, 1881, 1891, 1917, 1933, 1939, 1969, 2011, 2035, 2041, 2053, 2071, 2091, 2093, 2119, 2147, 2149, 2161, 2171, 2189, 2197, 2207, 2217, 2225, 2255, 2257, 2273, 2279, 2283, 2293, 2317, 2323, 2341, 2345, 2363, 2365, 2373, 2377, 2385, 2395, 2419, 2421, 2431, 2435, 2447, 2475, 2477, 2489, 2503, 2521, 2533, 2551, 2561, 2567, 2579, 2581, 2601, 2633, 2657, 2669, 2681, 2687, 2693, 2705, 2717, 2727, 2731, 2739, 2741, 2773, 2783, 2793, 2799, 2801, 2811, 2819, 2825, 2833, 2867, 2879, 2881, 2891, 2905, 2911, 2917, 2927, 2941, 2951, 2955, 2963, 2965, 2991, 2999, 3005, 3017, 3035, 3037, 3047, 3053, 3083, 3085, 3097, 3103, 3159, 3169, 3179, 3187, 3205, 3209, 3223, 3227, 3229, 3251, 3263, 3271, 3277, 3283, 3285, 3299, 3305, 3319, 3331, 3343, 3357, 3367, 3373, 3393, 3399, 3413, 3417, 3427, 3439, 3441, 3475, 3487, 3497, 3515, 3517, 3529, 3543, 3547, 3553, 3559, 3573, 3589, 3613, 3617, 3623, 3627, 3635, 3641, 3655, 3659, 3669, 3679, 3697, 3707, 3709, 3713, 3731, 3743, 3747, 3771, 3791, 3805, 3827, 3833, 3851, 3865, 3889, 3895, 3933, 3947, 3949, 3957, 3971, 3985, 3991, 3995, 4007, 4013, 4021, 4045, 4051, 4069, 4073, 4179, 4201, 4219, 4221, 4249, 4305, 4331, 4359, 4383, 4387, 4411, 4431, 4439, 4449, 4459, 4485, 4531, 4569, 4575, 4621, 4663, 4669, 4711, 4723, 4735, 4793, 4801, 4811, 4879, 4893, 4897, 4921, 4927, 4941, 4977, 5017, 5027, 5033, 5127, 5169, 5175, 5199, 5213, 5223, 5237, 5287, 5293, 5331, 5391, 5405, 5453, 5523, 5573, 5591, 5597, 5611, 5641, 5703, 5717, 5721, 5797, 5821, 5909, 5913, 5955, 5957, 6005, 6025, 6061, 6067, 6079, 6081, 6231, 6237, 6289, 6295, 6329, 6383, 6427, 6453, 6465, 6501, 6523, 6539, 6577, 6589, 6601, 6607, 6631, 6683, 6699, 6707, 6761, 6795, 6865, 6881, 6901, 6923, 6931, 6943, 6999, 7057, 7079, 7103, 7105, 7123, 7173, 7185, 7191, 7207, 7245, 7303, 7327, 7333, 7355, 7365, 7369, 7375, 7411, 7431, 7459, 7491, 7505, 7515, 7541, 7557, 7561, 7701, 7705, 7727, 7749, 7761, 7783, 7795, 7823, 7907, 7953, 7963, 7975, 8049, 8089, 8123, 8125, 8137, 8219, 8231, 8245, 8275, 8293, 8303, 8331, 8333, 8351, 8357, 8367, 8379, 8381, 8387, 8393, 8417, 8435, 8461, 8469, 8489, 8495, 8507, 8515, 8551, 8555, 8569, 8585, 8599, 8605, 8639, 8641, 8647, 8653, 8671, 8675, 8689, 8699, 8729, 8741, 8759, 8765, 8771, 8795, 8797, 8825, 8831, 8841, 8855, 8859, 8883, 8895, 8909, 8943, 8951, 8955, 8965, 8999, 9003, 9031, 9045, 9049, 9071, 9073, 9085, 9095, 9101, 9109, 9123, 9129, 9137, 9143, 9147, 9185, 9197, 9209, 9227, 9235, 9247, 9253, 9257, 9277, 9297, 9303, 9313, 9325, 9343, 9347, 9371, 9373, 9397, 9407, 9409, 9415, 9419, 9443, 9481, 9495, 9501, 9505, 9517, 9529, 9555, 9557, 9571, 9585, 9591, 9607, 9611, 9621, 9625, 9631, 9647, 9661, 9669, 9679, 9687, 9707, 9731, 9733, 9745, 9773, 9791, 9803, 9811, 9817, 9833, 9847, 9851, 9863, 9875, 9881, 9905, 9911, 9917, 9923, 9963, 9973, 10003, 10025, 10043, 10063, 10071, 10077, 10091, 10099, 10105, 10115, 10129, 10145, 10169, 10183, 10187, 10207, 10223, 10225, 10247, 10265, 10271, 10275, 10289, 10299, 10301, 10309, 10343, 10357, 10373, 10411, 10413, 10431, 10445, 10453, 10463, 10467, 10473, 10491, 10505, 10511, 10513, 10523, 10539, 10549, 10559, 10561, 10571, 10581, 10615, 10621, 10625, 10643, 10655, 10671, 10679, 10685, 10691, 10711, 10739, 10741, 10755, 10767, 10781, 10785, 10803, 10805, 10829, 10857, 10863, 10865, 10875, 10877, 10917, 10921, 10929, 10949, 10967, 10971, 10987, 10995, 11009, 11029, 11043, 11045, 11055, 11063, 11075, 11081, 11117, 11135, 11141, 11159, 11163, 11181, 11187, 11225, 11237, 11261, 11279, 11297, 11307, 11309, 11327, 11329, 11341, 11377, 11403, 11405, 11413, 11427, 11439, 11453, 11461, 11473, 11479, 11489, 11495, 11499, 11533, 11545, 11561, 11567, 11575, 11579, 11589, 11611, 11623, 11637, 11657, 11663, 11687, 11691, 11701, 11747, 11761, 11773, 11783, 11795, 11797, 11817, 11849, 11855, 11867, 11869, 11873, 11883, 11919, 11921, 11927, 11933, 11947, 11955, 11961, 11999, 12027, 12029, 12037, 12041, 12049, 12055, 12095, 12097, 12107, 12109, 12121, 12127, 12133, 12137, 12181, 12197, 12207, 12209, 12239, 12253, 12263, 12269, 12277, 12287, 12295, 12309, 12313, 12335, 12361, 12367, 12391, 12409, 12415, 12433, 12449, 12469, 12479, 12481, 12499, 12505, 12517, 12527, 12549, 12559, 12597, 12615, 12621, 12639, 12643, 12657, 12667, 12707, 12713, 12727, 12741, 12745, 12763, 12769, 12779, 12781, 12787, 12799, 12809, 12815, 12829, 12839, 12857, 12875, 12883, 12889, 12901, 12929, 12947, 12953, 12959, 12969, 12983, 12987, 12995, 13015, 13019, 13031, 13063, 13077, 13103, 13137, 13149, 13173, 13207, 13211, 13227, 13241, 13249, 13255, 13269, 13283, 13285, 13303, 13307, 13321, 13339, 13351, 13377, 13389, 13407, 13417, 13431, 13435, 13447, 13459, 13465, 13477, 13501, 13513, 13531, 13543, 13561, 13581, 13599, 13605, 13617, 13623, 13637, 13647, 13661, 13677, 13683, 13695, 13725, 13729, 13753, 13773, 13781, 13785, 13795, 13801, 13807, 13825, 13835, 13855, 13861, 13871, 13883, 13897, 13905, 13915, 13939, 13941, 13969, 13979, 13981, 13997, 14027, 14035, 14037, 14051, 14063, 14085, 14095, 14107, 14113, 14125, 14137, 14145, 14151, 14163, 14193, 14199, 14219, 14229, 14233, 14243, 14277, 14287, 14289, 14295, 14301, 14305, 14323, 14339, 14341, 14359, 14365, 14375, 14387, 14411, 14425, 14441, 14449, 14499, 14513, 14523, 14537, 14543, 14561, 14579, 14585, 14593, 14599, 14603, 14611, 14641, 14671, 14695, 14701, 14723, 14725, 14743, 14753, 14759, 14765, 14795, 14797, 14803, 14831, 14839, 14845, 14855, 14889, 14895, 14909, 14929, 14941, 14945, 14951, 14963, 14965, 14985, 15033, 15039, 15053, 15059, 15061, 15071, 15077, 15081, 15099, 15121, 15147, 15149, 15157, 15167, 15187, 15193, 15203, 15205, 15215, 15217, 15223, 15243, 15257, 15269, 15273, 15287, 15291, 15313, 15335, 15347, 15359, 15373, 15379, 15381, 15391, 15395, 15397, 15419, 15439, 15453, 15469, 15491, 15503, 15517, 15527, 15531, 15545, 15559, 15593, 15611, 15613, 15619, 15639, 15643, 15649, 15661, 15667, 15669, 15681, 15693, 15717, 15721, 15741, 15745, 15765, 15793, 15799, 15811, 15825, 15835, 15847, 15851, 15865, 15877, 15881, 15887, 15899, 15915, 15935, 15937, 15955, 15973, 15977, 16011, 16035, 16061, 16069, 16087, 16093, 16097, 16121, 16141, 16153, 16159, 16165, 16183, 16189, 16195, 16197, 16201, 16209, 16215, 16225, 16259, 16265, 16273, 16299, 16309, 16355, 16375, 16381, }; /* starting direction #'s m[i] = sobol_minit[i][j] for i=0..d of the * degree-d primitive polynomial sobol_a[j]. */ static const uint32_t sobol_minit[MAXDEG + 1][MAXDIM - 1] = { /* [0][*] */ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* [1][*] */ {0, 1, 3, 1, 3, 1, 3, 3, 1, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 1, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 3, 1, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 3, 1, 3, 3, 3, 3, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, 3, 3, 3, 1, 1, 3, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, 3, 1, 1, 1, 3, 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 3, 3, 1, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 1, 1, 1, 3, 1, 3, 1, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 1, 3, 3, 3, 1, 1, 3, 3, 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, 3, 3, 3, 3, 1, 1, 3, 1, 3, 3, 1, 3, 3, 1, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 1, 3, 1, 3, 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 3, 1, 1, 3, 3, 1, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 3, 3, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 1, 3, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 3, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 1, 1, 3, 1, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 1, 1, 3, 1, 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 3, 1, 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1, 1, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 1, 3, 3, 3, 3, 3, 1, 3, 1, 1, 3, 3, 3, 3, 1, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 1, 3, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 1, 3, 3, 3, 1, 3, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1, 1, 3, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 3, 1, 3, 3, 3, 3, 3, 1}, /* [2][*] */ {0, 0, 7, 5, 1, 3, 3, 7, 5, 5, 7, 7, 1, 3, 3, 7, 5, 1, 1, 5, 3, 7, 1, 7, 5, 1, 3, 7, 7, 1, 1, 1, 5, 7, 7, 5, 1, 3, 3, 7, 5, 5, 5, 3, 3, 3, 1, 1, 5, 1, 1, 5, 3, 3, 3, 3, 1, 3, 7, 5, 7, 3, 7, 1, 3, 3, 5, 1, 3, 5, 5, 7, 7, 7, 1, 1, 3, 3, 1, 1, 5, 1, 5, 7, 5, 1, 7, 5, 3, 3, 1, 5, 7, 1, 7, 5, 1, 7, 3, 1, 7, 1, 7, 3, 3, 5, 7, 3, 3, 5, 1, 3, 3, 1, 3, 5, 1, 3, 3, 3, 7, 1, 1, 7, 3, 1, 3, 7, 5, 5, 7, 5, 5, 3, 1, 3, 3, 3, 1, 3, 3, 7, 3, 3, 1, 7, 5, 1, 7, 7, 5, 7, 5, 1, 3, 1, 7, 3, 7, 3, 5, 7, 3, 1, 3, 3, 3, 1, 5, 7, 3, 3, 7, 7, 7, 5, 3, 1, 7, 1, 3, 7, 5, 3, 3, 3, 7, 1, 1, 3, 1, 5, 7, 1, 3, 5, 3, 5, 3, 3, 7, 5, 5, 3, 3, 1, 3, 7, 7, 7, 1, 5, 7, 1, 3, 1, 1, 7, 1, 3, 1, 7, 1, 5, 3, 5, 3, 1, 1, 5, 5, 3, 3, 5, 7, 1, 5, 3, 7, 7, 3, 5, 3, 3, 1, 7, 3, 1, 3, 5, 7, 1, 3, 7, 1, 5, 1, 3, 1, 5, 3, 1, 7, 1, 5, 5, 5, 3, 7, 1, 1, 7, 3, 1, 1, 7, 5, 7, 5, 7, 7, 3, 7, 1, 3, 7, 7, 3, 5, 1, 1, 7, 1, 5, 5, 5, 1, 5, 1, 7, 5, 5, 7, 1, 1, 7, 1, 7, 7, 1, 1, 3, 3, 3, 7, 7, 5, 3, 7, 3, 1, 3, 7, 5, 3, 3, 5, 7, 1, 1, 5, 5, 7, 7, 1, 1, 1, 1, 5, 5, 5, 7, 5, 7, 1, 1, 3, 5, 1, 3, 3, 7, 3, 7, 5, 3, 5, 3, 1, 7, 1, 7, 7, 1, 1, 7, 7, 7, 5, 5, 1, 1, 7, 5, 5, 7, 5, 1, 1, 5, 5, 5, 5, 5, 5, 1, 3, 1, 5, 7, 3, 3, 5, 7, 3, 7, 1, 7, 7, 1, 3, 5, 1, 5, 5, 3, 7, 3, 7, 7, 5, 7, 5, 7, 1, 1, 5, 3, 5, 1, 5, 3, 7, 1, 5, 7, 7, 3, 5, 1, 3, 5, 1, 5, 3, 3, 3, 7, 3, 5, 1, 3, 7, 7, 3, 7, 5, 3, 3, 1, 7, 5, 1, 1, 3, 7, 1, 7, 1, 7, 3, 7, 3, 5, 7, 3, 5, 3, 1, 1, 1, 5, 7, 7, 3, 3, 1, 1, 1, 5, 5, 7, 3, 1, 1, 3, 3, 7, 3, 3, 5, 1, 3, 7, 3, 3, 7, 3, 5, 7, 5, 7, 7, 3, 3, 5, 1, 3, 5, 3, 1, 3, 5, 1, 1, 3, 7, 7, 1, 5, 1, 3, 7, 3, 7, 3, 5, 1, 7, 1, 1, 3, 5, 3, 7, 1, 5, 5, 1, 1, 3, 1, 3, 3, 7, 1, 7, 3, 1, 7, 3, 1, 7, 3, 5, 3, 5, 7, 3, 3, 3, 5, 1, 7, 7, 1, 3, 1, 3, 7, 7, 1, 3, 7, 3, 1, 5, 3, 1, 1, 1, 5, 3, 3, 7, 1, 5, 3, 5, 1, 3, 1, 3, 1, 5, 7, 7, 1, 1, 5, 3, 1, 5, 1, 1, 7, 7, 3, 5, 5, 1, 7, 1, 5, 1, 1, 3, 1, 5, 7, 5, 7, 7, 1, 5, 1, 1, 3, 5, 1, 5, 5, 3, 1, 3, 1, 5, 5, 3, 3, 3, 3, 1, 1, 3, 1, 3, 5, 5, 7, 5, 5, 7, 5, 7, 1, 3, 7, 7, 3, 5, 5, 7, 5, 5, 3, 3, 3, 1, 7, 1, 5, 5, 5, 3, 3, 5, 1, 3, 1, 3, 3, 3, 7, 1, 7, 7, 3, 7, 1, 1, 5, 7, 1, 7, 1, 7, 7, 1, 3, 7, 5, 1, 3, 5, 5, 5, 1, 1, 7, 1, 7, 1, 7, 7, 3, 1, 1, 5, 1, 5, 1, 5, 3, 5, 5, 5, 5, 5, 3, 3, 7, 3, 3, 5, 5, 3, 7, 1, 5, 7, 5, 1, 5, 5, 3, 5, 5, 7, 5, 3, 5, 5, 5, 1, 5, 5, 5, 5, 1, 3, 5, 3, 1, 7, 5, 5, 7, 1, 5, 3, 3, 1, 5, 3, 7, 1, 7, 5, 1, 1, 3, 1, 1, 7, 1, 5, 5, 3, 7, 3, 7, 5, 3, 1, 1, 3, 1, 3, 5, 5, 7, 5, 3, 7, 7, 7, 3, 7, 3, 7, 1, 3, 1, 7, 7, 1, 7, 3, 7, 3, 7, 3, 7, 3, 5, 1, 1, 7, 3, 1, 5, 5, 7, 1, 5, 5, 5, 7, 1, 5, 5, 1, 5, 5, 3, 1, 3, 1, 7, 3, 1, 3, 5, 7, 7, 7, 1, 1, 7, 3, 1, 5, 5, 5, 1, 1, 1, 1, 1, 5, 3, 5, 1, 3, 5, 3, 1, 1, 1, 1, 3, 7, 3, 7, 5, 7, 1, 5, 5, 7, 5, 3, 3, 7, 5, 3, 1, 1, 3, 1, 3, 1, 1, 3, 7, 1, 7, 1, 1, 5, 1, 7, 5, 3, 7, 3, 5, 3, 1, 1, 5, 5, 1, 7, 7, 3, 7, 3, 7, 1, 5, 1, 5, 3, 7, 3, 5, 7, 7, 7, 3, 3, 1, 1, 5, 5, 3, 7, 1, 1, 1, 3, 5, 3, 1, 1, 3, 3, 7, 5, 1, 1, 3, 7, 1, 5, 7, 3, 7, 5, 5, 7, 3, 5, 3, 1, 5, 3, 1, 1, 7, 5, 1, 7, 3, 7, 5, 1, 7, 1, 7, 7, 1, 1, 7, 1, 5, 5, 1, 1, 7, 5, 7, 1, 5, 3, 5, 3, 3, 7, 1, 5, 1, 1, 5, 5, 3, 3, 7, 5, 5, 1, 1, 1, 3, 1, 5, 7, 7, 1, 7, 5, 7, 3, 7, 3, 1, 3, 7, 3, 1, 5, 5, 3, 5, 1, 3, 5, 5, 5, 1, 1, 7, 7, 1, 5, 5, 1, 3, 5, 1, 5, 3, 5, 3, 3, 7, 5, 7, 3, 7, 3, 1, 3, 7, 7, 3, 3, 1, 1, 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, 1, 3, 5, 7, 7, 1, 5, 7, 3, 7, 1, 1, 3, 5, 7, 5, 3, 3, 3}, /* [3][*] */ {0, 0, 0, 0, 1, 7, 9, 13, 11, 1, 3, 7, 9, 5, 13, 13, 11, 3, 15, 5, 3, 15, 7, 9, 13, 9, 1, 11, 7, 5, 15, 1, 15, 11, 5, 11, 1, 7, 9, 7, 7, 1, 15, 15, 15, 13, 3, 3, 15, 5, 9, 7, 13, 3, 7, 5, 11, 9, 1, 9, 1, 5, 7, 13, 9, 9, 1, 7, 3, 5, 1, 11, 11, 13, 7, 7, 9, 9, 1, 1, 3, 9, 15, 1, 5, 13, 1, 9, 9, 9, 9, 9, 13, 11, 3, 5, 11, 11, 13, 5, 3, 15, 1, 11, 11, 7, 13, 15, 11, 13, 9, 11, 15, 15, 13, 3, 15, 7, 9, 11, 13, 11, 9, 9, 5, 13, 9, 1, 13, 7, 7, 7, 7, 7, 5, 9, 7, 13, 11, 9, 11, 15, 3, 13, 11, 1, 11, 3, 3, 9, 11, 1, 7, 1, 15, 15, 3, 1, 9, 1, 7, 13, 11, 3, 13, 11, 7, 3, 3, 5, 13, 11, 5, 11, 1, 3, 9, 7, 15, 7, 5, 13, 7, 9, 13, 15, 13, 9, 7, 15, 7, 9, 5, 11, 11, 13, 13, 9, 3, 5, 13, 9, 11, 15, 11, 7, 1, 7, 13, 3, 13, 3, 13, 9, 15, 7, 13, 13, 3, 13, 15, 15, 11, 9, 13, 9, 15, 1, 1, 15, 11, 11, 7, 1, 11, 13, 9, 13, 3, 5, 11, 13, 9, 9, 13, 1, 11, 15, 13, 3, 13, 7, 15, 1, 15, 3, 3, 11, 7, 13, 7, 7, 9, 7, 5, 15, 9, 5, 5, 7, 15, 13, 15, 5, 15, 5, 3, 1, 11, 7, 1, 5, 7, 9, 3, 11, 1, 15, 1, 3, 15, 11, 13, 5, 13, 1, 7, 1, 15, 7, 5, 1, 1, 15, 13, 11, 11, 13, 5, 11, 7, 9, 7, 1, 5, 3, 9, 5, 5, 11, 5, 1, 7, 1, 11, 7, 9, 13, 15, 13, 3, 1, 11, 13, 15, 1, 1, 11, 9, 13, 3, 13, 11, 15, 13, 9, 9, 9, 5, 5, 5, 5, 1, 15, 5, 9, 11, 7, 15, 5, 3, 13, 5, 3, 11, 5, 1, 11, 13, 9, 11, 3, 7, 13, 15, 1, 7, 11, 1, 13, 1, 15, 1, 9, 7, 3, 9, 11, 1, 9, 13, 13, 3, 11, 7, 9, 1, 7, 15, 9, 1, 5, 13, 5, 11, 3, 9, 15, 11, 13, 5, 1, 7, 7, 5, 13, 7, 7, 9, 5, 11, 11, 1, 1, 15, 3, 13, 9, 13, 9, 9, 11, 5, 5, 13, 15, 3, 9, 15, 3, 11, 11, 15, 15, 3, 11, 15, 15, 3, 1, 3, 1, 3, 3, 1, 3, 13, 1, 11, 5, 15, 7, 15, 9, 1, 7, 1, 9, 11, 15, 1, 13, 9, 13, 11, 7, 3, 7, 3, 13, 7, 9, 7, 7, 3, 3, 9, 9, 7, 5, 11, 13, 13, 7, 7, 15, 9, 5, 5, 3, 3, 13, 3, 9, 3, 1, 11, 1, 3, 11, 15, 11, 11, 11, 9, 13, 7, 9, 15, 9, 11, 1, 3, 3, 9, 7, 15, 13, 13, 7, 15, 9, 13, 9, 15, 13, 15, 9, 13, 1, 11, 7, 11, 3, 13, 5, 1, 7, 15, 3, 13, 7, 13, 13, 11, 3, 5, 3, 13, 11, 9, 9, 3, 11, 11, 7, 9, 13, 11, 7, 15, 13, 7, 5, 3, 1, 5, 15, 15, 3, 11, 1, 7, 3, 15, 11, 5, 5, 3, 5, 5, 1, 15, 5, 1, 5, 3, 7, 5, 11, 3, 13, 9, 13, 15, 5, 3, 5, 9, 5, 3, 11, 1, 13, 9, 15, 3, 5, 11, 9, 1, 3, 15, 9, 9, 9, 11, 7, 5, 13, 1, 15, 3, 13, 9, 13, 5, 1, 5, 1, 13, 13, 7, 7, 1, 9, 5, 11, 9, 11, 13, 3, 15, 15, 13, 15, 7, 5, 7, 9, 7, 9, 9, 9, 11, 9, 3, 11, 15, 13, 13, 5, 9, 15, 1, 1, 9, 5, 13, 3, 13, 15, 3, 1, 3, 11, 13, 1, 15, 9, 9, 3, 1, 9, 1, 9, 1, 13, 11, 15, 7, 11, 15, 13, 15, 1, 9, 9, 7, 3, 5, 11, 7, 3, 9, 5, 15, 7, 5, 3, 13, 7, 1, 1, 9, 15, 15, 15, 11, 3, 5, 15, 13, 7, 15, 15, 11, 11, 9, 5, 15, 9, 7, 3, 13, 1, 1, 5, 1, 3, 1, 7, 1, 1, 5, 1, 11, 11, 9, 9, 5, 13, 7, 7, 7, 1, 1, 9, 9, 11, 11, 15, 7, 5, 5, 3, 11, 1, 3, 7, 13, 7, 7, 7, 3, 15, 15, 11, 9, 3, 9, 3, 15, 13, 5, 3, 3, 3, 5, 9, 15, 9, 9, 1, 5, 9, 9, 15, 5, 15, 7, 9, 1, 9, 9, 5, 11, 5, 15, 15, 11, 7, 7, 7, 1, 1, 11, 11, 13, 15, 3, 13, 5, 1, 7, 1, 11, 3, 13, 15, 3, 5, 3, 5, 7, 3, 9, 9, 5, 1, 7, 11, 9, 3, 5, 11, 13, 13, 13, 9, 15, 5, 7, 1, 15, 11, 9, 15, 15, 13, 13, 13, 1, 11, 9, 15, 9, 5, 15, 5, 7, 3, 11, 3, 15, 7, 13, 11, 7, 3, 7, 13, 5, 13, 15, 5, 13, 9, 1, 15, 11, 5, 5, 1, 11, 3, 3, 7, 1, 9, 7, 15, 9, 9, 3, 11, 15, 7, 1, 3, 1, 1, 1, 9, 1, 5, 15, 15, 7, 5, 5, 7, 9, 7, 15, 13, 13, 11, 1, 9, 11, 1, 13, 1, 7, 15, 15, 5, 5, 1, 11, 3, 9, 11, 9, 9, 9, 1, 9, 3, 5, 15, 1, 1, 9, 7, 3, 3, 1, 9, 9, 11, 9, 9, 13, 13, 3, 13, 11, 13, 5, 1, 5, 5, 9, 9, 3, 13, 13, 9, 15, 9, 11, 7, 11, 9, 13, 9, 1, 15, 9, 7, 7, 1, 7, 9, 9, 15, 1, 11, 1, 13, 13, 15, 9, 13, 7, 15, 3, 9, 3, 1, 13, 7, 5, 9, 3, 1, 7, 1, 1, 13, 3, 3, 11, 1, 7, 13, 15, 15, 5, 7, 13, 13, 15, 11, 13, 1, 13, 13, 3, 9, 15, 15, 11, 15, 9, 15, 1, 13, 15, 1, 1, 5, 11, 5, 1, 11, 11, 5, 3, 9, 1, 3, 5, 13, 9, 7, 7, 1, 9, 9, 15, 7, 5, 5, 15, 13, 9, 7, 13, 3, 13, 11, 13, 7, 9, 13, 13, 13, 15, 9, 5, 5, 3, 3, 3, 1, 3, 15}, /* [4][*] */ {0, 0, 0, 0, 0, 0, 9, 3, 27, 15, 29, 21, 23, 19, 11, 25, 7, 13, 17, 1, 25, 29, 3, 31, 11, 5, 23, 27, 19, 21, 5, 1, 17, 13, 7, 15, 9, 31, 25, 3, 5, 23, 7, 3, 17, 23, 3, 3, 21, 25, 25, 23, 11, 19, 3, 11, 31, 7, 9, 5, 17, 23, 17, 17, 25, 13, 11, 31, 27, 19, 17, 23, 7, 5, 11, 19, 19, 7, 13, 21, 21, 7, 9, 11, 1, 5, 21, 11, 13, 25, 9, 7, 7, 27, 15, 25, 15, 21, 17, 19, 19, 21, 5, 11, 3, 5, 29, 31, 29, 5, 5, 1, 31, 27, 11, 13, 1, 3, 7, 11, 7, 3, 23, 13, 31, 17, 1, 27, 11, 25, 1, 23, 29, 17, 25, 7, 25, 27, 17, 13, 17, 23, 5, 17, 5, 13, 11, 21, 5, 11, 5, 9, 31, 19, 17, 9, 9, 27, 21, 15, 15, 1, 1, 29, 5, 31, 11, 17, 23, 19, 21, 25, 15, 11, 5, 5, 1, 19, 19, 19, 7, 13, 21, 17, 17, 25, 23, 19, 23, 15, 13, 5, 19, 25, 9, 7, 3, 21, 17, 25, 1, 27, 25, 27, 25, 9, 13, 3, 17, 25, 23, 9, 25, 9, 13, 17, 17, 3, 15, 7, 7, 29, 3, 19, 29, 29, 19, 29, 13, 15, 25, 27, 1, 3, 9, 9, 13, 31, 29, 31, 5, 15, 29, 1, 19, 5, 9, 19, 5, 15, 3, 5, 7, 15, 17, 17, 23, 11, 9, 23, 19, 3, 17, 1, 27, 9, 9, 17, 13, 25, 29, 23, 29, 11, 31, 25, 21, 29, 19, 27, 31, 3, 5, 3, 3, 13, 21, 9, 29, 3, 17, 11, 11, 9, 21, 19, 7, 17, 31, 25, 1, 27, 5, 15, 27, 29, 29, 29, 25, 27, 25, 3, 21, 17, 25, 13, 15, 17, 13, 23, 9, 3, 11, 7, 9, 9, 7, 17, 7, 1, 27, 1, 9, 5, 31, 21, 25, 25, 21, 11, 1, 23, 19, 27, 15, 3, 5, 23, 9, 25, 7, 29, 11, 9, 13, 5, 11, 1, 3, 31, 27, 3, 17, 27, 11, 13, 15, 29, 15, 1, 15, 23, 25, 13, 21, 15, 3, 29, 29, 5, 25, 17, 11, 7, 15, 5, 21, 7, 31, 13, 11, 23, 5, 7, 23, 27, 21, 29, 15, 7, 27, 27, 19, 7, 15, 27, 27, 19, 19, 9, 15, 1, 3, 29, 29, 5, 27, 31, 9, 1, 7, 3, 19, 19, 29, 9, 3, 21, 31, 29, 25, 1, 3, 9, 27, 5, 27, 25, 21, 11, 29, 31, 27, 21, 29, 17, 9, 17, 13, 11, 25, 15, 21, 11, 19, 31, 3, 19, 5, 3, 3, 9, 13, 13, 3, 29, 7, 5, 9, 23, 13, 21, 23, 21, 31, 11, 7, 7, 3, 23, 1, 23, 5, 9, 17, 21, 1, 17, 29, 7, 5, 17, 13, 25, 17, 9, 19, 9, 5, 7, 21, 19, 13, 9, 7, 3, 9, 3, 15, 31, 29, 29, 25, 13, 9, 21, 9, 31, 7, 15, 5, 31, 7, 15, 27, 25, 19, 9, 9, 25, 25, 23, 1, 9, 7, 11, 15, 19, 15, 27, 17, 11, 11, 31, 13, 25, 25, 9, 7, 13, 29, 19, 5, 19, 31, 25, 13, 25, 15, 5, 9, 29, 31, 9, 29, 27, 25, 27, 11, 17, 5, 17, 3, 23, 15, 9, 9, 17, 17, 31, 11, 19, 25, 13, 23, 15, 25, 21, 31, 19, 3, 11, 25, 7, 15, 19, 7, 5, 3, 13, 13, 1, 23, 5, 25, 11, 25, 15, 13, 21, 11, 23, 29, 5, 17, 27, 9, 19, 15, 5, 29, 23, 19, 1, 27, 3, 23, 21, 19, 27, 11, 17, 13, 27, 11, 31, 23, 5, 9, 21, 31, 29, 11, 21, 17, 15, 7, 15, 7, 9, 21, 27, 25, 29, 11, 3, 21, 13, 23, 19, 27, 17, 29, 25, 17, 9, 1, 19, 23, 5, 23, 1, 17, 17, 13, 27, 23, 7, 7, 11, 13, 17, 13, 11, 21, 13, 23, 1, 27, 13, 9, 7, 1, 27, 29, 5, 13, 25, 21, 3, 31, 15, 13, 3, 19, 13, 1, 27, 15, 17, 1, 3, 13, 13, 13, 31, 29, 27, 7, 7, 21, 29, 15, 17, 17, 21, 19, 17, 3, 15, 5, 27, 27, 3, 31, 31, 7, 21, 3, 13, 11, 17, 27, 25, 1, 9, 7, 29, 27, 21, 23, 13, 25, 29, 15, 17, 29, 9, 15, 3, 21, 15, 17, 17, 31, 9, 9, 23, 19, 25, 3, 1, 11, 27, 29, 1, 31, 29, 25, 29, 1, 23, 29, 25, 13, 3, 31, 25, 5, 5, 11, 3, 21, 9, 23, 7, 11, 23, 11, 1, 1, 3, 23, 25, 23, 1, 23, 3, 27, 9, 27, 3, 23, 25, 19, 29, 29, 13, 27, 5, 9, 29, 29, 13, 17, 3, 23, 19, 7, 13, 3, 19, 23, 5, 29, 29, 13, 13, 5, 19, 5, 17, 9, 11, 11, 29, 27, 23, 19, 17, 25, 13, 1, 13, 3, 11, 1, 17, 29, 1, 13, 17, 9, 17, 21, 1, 11, 1, 1, 25, 5, 7, 29, 29, 19, 19, 1, 29, 13, 3, 1, 31, 15, 13, 3, 1, 11, 19, 5, 29, 13, 29, 23, 3, 1, 31, 13, 19, 17, 5, 5, 1, 29, 23, 3, 19, 25, 19, 27, 9, 27, 13, 15, 29, 23, 13, 25, 25, 17, 19, 17, 15, 27, 3, 25, 17, 27, 3, 27, 31, 23, 13, 31, 11, 15, 7, 21, 19, 27, 19, 21, 29, 7, 31, 13, 9, 9, 7, 21, 13, 11, 9, 11, 29, 19, 11, 19, 21, 5, 29, 13, 7, 19, 19, 27, 23, 31, 1, 27, 21, 7, 3, 7, 11, 23, 13, 29, 11, 31, 19, 1, 5, 5, 11, 5, 3, 27, 5, 7, 11, 31, 1, 27, 31, 31, 23, 5, 21, 27, 9, 25, 3, 15, 19, 1, 19, 9, 5, 25, 21, 15, 25, 29, 15, 21, 11, 19, 15, 3, 7, 13, 11, 25, 17, 1, 5, 31, 13, 29, 23, 9, 5, 29, 7, 17, 27, 7, 17, 31, 9, 31, 9, 9, 7, 21, 3, 3, 3, 9, 11, 21, 11, 31, 9, 25, 5, 1, 31, 13, 29, 9, 29, 1, 11, 19, 7, 27, 13, 31, 7, 31, 7, 25, 23, 21, 29, 11, 11, 13, 11, 27, 1, 23, 31, 21, 23, 21, 19, 31, 5, 31, 25, 25, 19, 17, 11, 25, 7, 13, 1, 29, 17, 23, 15, 7, 29, 17, 13, 3, 17}, /* [5][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 33, 7, 5, 11, 39, 63, 59, 17, 15, 23, 29, 3, 21, 13, 31, 25, 9, 49, 33, 19, 29, 11, 19, 27, 15, 25, 63, 55, 17, 63, 49, 19, 41, 59, 3, 57, 33, 49, 53, 57, 57, 39, 21, 7, 53, 9, 55, 15, 59, 19, 49, 31, 3, 39, 5, 5, 41, 9, 19, 9, 57, 25, 1, 15, 51, 11, 19, 61, 53, 29, 19, 11, 9, 21, 19, 43, 13, 13, 41, 25, 31, 9, 11, 19, 5, 53, 37, 7, 51, 45, 7, 7, 61, 23, 45, 7, 59, 41, 1, 29, 61, 37, 27, 47, 15, 31, 35, 31, 17, 51, 13, 25, 45, 5, 5, 33, 39, 5, 47, 29, 35, 47, 63, 45, 37, 47, 59, 21, 59, 33, 51, 9, 27, 13, 25, 43, 3, 17, 21, 59, 61, 27, 47, 57, 11, 17, 39, 1, 63, 21, 59, 17, 13, 31, 3, 31, 7, 9, 27, 37, 23, 31, 9, 45, 43, 31, 63, 21, 39, 51, 27, 7, 53, 11, 1, 59, 39, 23, 49, 23, 7, 55, 59, 3, 19, 35, 13, 9, 13, 15, 23, 9, 7, 43, 55, 3, 19, 9, 27, 33, 27, 49, 23, 47, 19, 7, 11, 55, 27, 35, 5, 5, 55, 35, 37, 9, 33, 29, 47, 25, 11, 47, 53, 61, 59, 3, 53, 47, 5, 19, 59, 5, 47, 23, 45, 53, 3, 49, 61, 47, 39, 29, 17, 57, 5, 17, 31, 23, 41, 39, 5, 27, 7, 29, 29, 33, 31, 41, 31, 29, 17, 29, 29, 9, 9, 31, 27, 53, 35, 5, 61, 1, 49, 13, 57, 29, 5, 21, 43, 25, 57, 49, 37, 27, 11, 61, 37, 49, 5, 63, 63, 3, 45, 37, 63, 21, 21, 19, 27, 59, 21, 45, 23, 13, 15, 3, 43, 63, 39, 19, 63, 31, 41, 41, 15, 43, 63, 53, 1, 63, 31, 7, 17, 11, 61, 31, 51, 37, 29, 59, 25, 63, 59, 47, 15, 27, 19, 29, 45, 35, 55, 39, 19, 43, 21, 19, 13, 17, 51, 37, 5, 33, 35, 49, 25, 45, 1, 63, 47, 9, 63, 15, 25, 25, 15, 41, 13, 3, 19, 51, 49, 37, 25, 49, 13, 53, 47, 23, 35, 29, 33, 21, 35, 23, 3, 43, 31, 63, 9, 1, 61, 43, 3, 11, 55, 11, 35, 1, 63, 35, 49, 19, 45, 9, 57, 51, 1, 47, 41, 9, 11, 37, 19, 55, 23, 55, 55, 13, 7, 47, 37, 11, 43, 17, 3, 25, 19, 55, 59, 37, 33, 43, 1, 5, 21, 5, 63, 49, 61, 21, 51, 15, 19, 43, 47, 17, 9, 53, 45, 11, 51, 25, 11, 25, 47, 47, 1, 43, 29, 17, 31, 15, 59, 27, 63, 11, 41, 51, 29, 7, 27, 63, 31, 43, 3, 29, 39, 3, 59, 59, 1, 53, 63, 23, 63, 47, 51, 23, 61, 39, 47, 21, 39, 15, 3, 9, 57, 61, 39, 37, 21, 51, 1, 23, 43, 27, 25, 11, 13, 21, 43, 7, 11, 33, 55, 1, 37, 35, 27, 61, 39, 5, 19, 61, 61, 57, 59, 21, 59, 61, 57, 25, 55, 27, 31, 41, 33, 63, 19, 57, 35, 13, 63, 35, 17, 11, 11, 49, 41, 55, 5, 45, 17, 35, 5, 31, 31, 37, 17, 45, 51, 1, 39, 49, 55, 19, 41, 13, 5, 51, 5, 49, 1, 21, 13, 17, 59, 51, 11, 3, 61, 1, 33, 37, 33, 61, 25, 27, 59, 7, 49, 13, 63, 3, 33, 3, 15, 9, 13, 35, 39, 11, 59, 59, 1, 57, 11, 5, 57, 13, 31, 13, 11, 55, 45, 9, 55, 55, 19, 25, 41, 23, 45, 29, 63, 59, 27, 39, 21, 37, 7, 61, 49, 35, 39, 9, 29, 7, 25, 23, 57, 5, 19, 15, 33, 49, 37, 25, 17, 45, 29, 15, 25, 3, 3, 49, 11, 39, 15, 19, 57, 39, 15, 11, 3, 57, 31, 55, 61, 19, 5, 41, 35, 59, 61, 39, 41, 53, 53, 63, 31, 9, 59, 13, 35, 55, 41, 49, 5, 41, 25, 27, 43, 5, 5, 43, 5, 5, 17, 5, 15, 27, 29, 17, 9, 3, 55, 31, 1, 45, 45, 13, 57, 17, 3, 61, 15, 49, 15, 47, 9, 37, 45, 9, 51, 61, 21, 33, 11, 21, 63, 63, 47, 57, 61, 49, 9, 59, 19, 29, 21, 23, 55, 23, 43, 41, 57, 9, 39, 27, 41, 35, 61, 29, 57, 63, 21, 31, 59, 35, 49, 3, 49, 47, 49, 33, 21, 19, 21, 35, 11, 17, 37, 23, 59, 13, 37, 35, 55, 57, 1, 29, 45, 11, 1, 15, 9, 33, 19, 53, 43, 39, 23, 7, 13, 13, 1, 19, 41, 55, 1, 13, 15, 59, 55, 15, 3, 57, 37, 31, 17, 1, 3, 21, 29, 25, 55, 9, 37, 33, 53, 41, 51, 19, 57, 13, 63, 43, 19, 7, 13, 37, 33, 19, 15, 63, 51, 11, 49, 23, 57, 47, 51, 15, 53, 41, 1, 15, 37, 61, 11, 35, 29, 33, 23, 55, 11, 59, 19, 61, 61, 45, 13, 49, 13, 63, 5, 61, 5, 31, 17, 61, 63, 13, 27, 57, 1, 21, 5, 11, 39, 57, 51, 53, 39, 25, 41, 39, 37, 23, 31, 25, 33, 17, 57, 29, 27, 23, 47, 41, 29, 19, 47, 41, 25, 5, 51, 43, 39, 29, 7, 31, 45, 51, 49, 55, 17, 43, 49, 45, 9, 29, 3, 5, 47, 9, 15, 19, 51, 45, 57, 63, 9, 21, 59, 3, 9, 13, 45, 23, 15, 31, 21, 15, 51, 35, 9, 11, 61, 23, 53, 29, 51, 45, 31, 29, 5, 35, 29, 53, 35, 17, 59, 55, 27, 51, 59, 27, 47, 15, 29, 37, 7, 49, 55, 5, 19, 45, 29, 19, 57, 33, 53, 45, 21, 9, 3, 35, 29, 43, 31, 39, 3, 45, 1, 41, 29, 5, 59, 41, 33, 35, 27, 19, 13, 25, 27, 43, 33, 35, 17, 17, 23, 7, 35, 15, 61, 61, 53, 5, 15, 23, 11, 13, 43, 55, 47, 25, 43, 15, 57, 45, 1, 49, 63, 57, 15, 31, 31, 7, 53, 27, 15, 47, 23, 7, 29, 53, 47, 9, 53, 3, 25, 55, 45, 63, 21, 17, 23, 31, 27, 27, 43, 63, 55, 63, 45, 51, 15, 27, 5, 37, 43, 11, 27, 5, 27, 59, 21, 7, 39, 27, 63, 35, 47, 55, 17, 17, 17, 3, 19, 21, 13, 49, 61, 39, 15}, /* [6][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 33, 115, 41, 79, 17, 29, 119, 75, 73, 105, 7, 59, 65, 21, 3, 113, 61, 89, 45, 107, 21, 71, 79, 19, 71, 61, 41, 57, 121, 87, 119, 55, 85, 121, 119, 11, 23, 61, 11, 35, 33, 43, 107, 113, 101, 29, 87, 119, 97, 29, 17, 89, 5, 127, 89, 119, 117, 103, 105, 41, 83, 25, 41, 55, 69, 117, 49, 127, 29, 1, 99, 53, 83, 15, 31, 73, 115, 35, 21, 89, 5, 1, 91, 53, 35, 95, 83, 19, 85, 55, 51, 101, 33, 41, 55, 45, 95, 61, 27, 37, 89, 75, 57, 61, 15, 117, 15, 21, 27, 25, 27, 123, 39, 109, 93, 51, 21, 91, 109, 107, 45, 15, 93, 127, 3, 53, 81, 79, 107, 79, 87, 35, 109, 73, 35, 83, 107, 1, 51, 7, 59, 33, 115, 43, 111, 45, 121, 105, 125, 87, 101, 41, 95, 75, 1, 57, 117, 21, 27, 67, 29, 53, 117, 63, 1, 77, 89, 115, 49, 127, 15, 79, 81, 29, 65, 103, 33, 73, 79, 29, 21, 113, 31, 33, 107, 95, 111, 59, 99, 117, 63, 63, 99, 39, 9, 35, 63, 125, 99, 45, 93, 33, 93, 9, 105, 75, 51, 115, 11, 37, 17, 41, 21, 43, 73, 19, 93, 7, 95, 81, 93, 79, 81, 55, 9, 51, 63, 45, 89, 73, 19, 115, 39, 47, 81, 39, 5, 5, 45, 53, 65, 49, 17, 105, 13, 107, 5, 5, 19, 73, 59, 43, 83, 97, 115, 27, 1, 69, 103, 3, 99, 103, 63, 67, 25, 121, 97, 77, 13, 83, 103, 41, 11, 27, 81, 37, 33, 125, 71, 41, 41, 59, 41, 87, 123, 43, 101, 63, 45, 39, 21, 97, 15, 97, 111, 21, 49, 13, 17, 79, 91, 65, 105, 75, 1, 45, 67, 83, 107, 125, 87, 15, 81, 95, 105, 65, 45, 59, 103, 23, 103, 99, 67, 99, 47, 117, 71, 89, 35, 53, 73, 9, 115, 49, 37, 1, 35, 9, 45, 81, 19, 127, 17, 17, 105, 89, 49, 101, 7, 37, 33, 11, 95, 95, 17, 111, 105, 41, 115, 5, 69, 101, 27, 27, 101, 103, 53, 9, 21, 43, 79, 91, 65, 117, 87, 125, 55, 45, 63, 85, 83, 97, 45, 83, 87, 113, 93, 95, 5, 17, 77, 77, 127, 123, 45, 81, 85, 121, 119, 27, 85, 41, 49, 15, 107, 21, 51, 119, 11, 87, 101, 115, 63, 63, 37, 121, 109, 7, 43, 69, 19, 77, 49, 71, 59, 35, 7, 13, 55, 101, 127, 103, 85, 109, 29, 61, 67, 21, 111, 67, 23, 57, 75, 71, 101, 123, 41, 107, 101, 107, 125, 27, 47, 119, 41, 19, 127, 33, 31, 109, 7, 91, 91, 39, 125, 105, 47, 125, 123, 91, 9, 103, 45, 23, 117, 9, 125, 73, 11, 37, 61, 79, 21, 5, 47, 117, 67, 53, 85, 33, 81, 121, 47, 61, 51, 127, 29, 65, 45, 41, 95, 57, 73, 33, 117, 61, 111, 59, 123, 65, 47, 105, 23, 29, 107, 37, 81, 67, 29, 115, 119, 75, 73, 99, 103, 7, 57, 45, 61, 95, 49, 101, 101, 35, 47, 119, 39, 67, 31, 103, 7, 61, 127, 87, 3, 35, 29, 73, 95, 103, 71, 75, 51, 87, 57, 97, 11, 105, 87, 41, 73, 109, 69, 35, 121, 39, 111, 1, 77, 39, 47, 53, 91, 3, 17, 51, 83, 39, 125, 85, 111, 21, 69, 85, 29, 55, 11, 117, 1, 47, 17, 65, 63, 47, 117, 17, 115, 51, 25, 33, 123, 123, 83, 51, 113, 95, 121, 51, 91, 109, 43, 55, 35, 55, 87, 33, 37, 5, 3, 45, 21, 105, 127, 35, 17, 35, 37, 97, 97, 21, 77, 123, 17, 89, 53, 105, 75, 25, 125, 13, 47, 21, 125, 23, 55, 63, 61, 5, 17, 93, 57, 121, 69, 73, 93, 121, 105, 75, 91, 67, 95, 75, 9, 69, 97, 99, 93, 11, 53, 19, 73, 5, 33, 79, 107, 65, 69, 79, 125, 25, 93, 55, 61, 17, 117, 69, 97, 87, 111, 37, 93, 59, 79, 95, 53, 115, 53, 85, 85, 65, 59, 23, 75, 21, 67, 27, 99, 79, 27, 3, 95, 27, 69, 19, 75, 47, 59, 41, 85, 77, 99, 55, 49, 93, 93, 119, 51, 125, 63, 13, 15, 45, 61, 19, 105, 115, 17, 83, 7, 7, 11, 61, 37, 63, 89, 95, 119, 113, 67, 123, 91, 33, 37, 99, 43, 11, 33, 65, 81, 79, 81, 107, 63, 63, 55, 89, 91, 25, 93, 101, 27, 55, 75, 121, 79, 43, 125, 73, 27, 109, 35, 21, 71, 113, 89, 59, 95, 41, 45, 113, 119, 113, 39, 59, 73, 15, 13, 59, 67, 121, 27, 7, 105, 15, 59, 59, 35, 91, 89, 23, 125, 97, 53, 41, 91, 111, 29, 31, 3, 103, 61, 71, 35, 7, 119, 29, 45, 49, 111, 41, 109, 59, 125, 13, 27, 19, 79, 9, 75, 83, 81, 33, 91, 109, 33, 29, 107, 111, 101, 107, 109, 65, 59, 43, 37, 1, 9, 15, 109, 37, 111, 113, 119, 79, 73, 65, 71, 93, 17, 101, 87, 97, 43, 23, 75, 109, 41, 49, 53, 31, 97, 105, 109, 119, 51, 9, 53, 113, 97, 73, 89, 79, 49, 61, 105, 13, 99, 53, 71, 7, 87, 21, 101, 5, 71, 31, 123, 121, 121, 73, 79, 115, 13, 39, 101, 19, 37, 51, 83, 97, 55, 81, 91, 127, 105, 89, 63, 47, 49, 75, 37, 77, 15, 49, 107, 23, 23, 35, 19, 69, 17, 59, 63, 73, 29, 125, 61, 65, 95, 101, 81, 57, 69, 83, 37, 11, 37, 95, 1, 73, 27, 29, 57, 7, 65, 83, 99, 69, 19, 103, 43, 95, 25, 19, 103, 41, 125, 97, 71, 105, 83, 83, 61, 39, 9, 45, 117, 63, 31, 5, 117, 67, 125, 41, 117, 43, 77, 97, 15, 29, 5, 59, 25, 63, 87, 39, 39, 77, 85, 37, 81, 73, 89, 29, 125, 109, 21, 23, 119, 105, 43, 93, 97, 15, 125, 29, 51, 69, 37, 45, 31, 75, 109, 119, 53, 5, 101, 125, 121, 35, 29, 7, 63, 17, 63, 13, 69, 15, 105, 51, 127, 105, 9, 57, 95, 59, 109, 35, 49, 23, 33, 107, 55, 33, 57, 79, 73, 69, 59, 107, 55, 11, 63, 95, 103, 23, 125, 91, 31, 91, 51, 65, 61, 75, 69, 107, 65, 101, 59, 35, 15}, /* [7][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 23, 39, 217, 141, 27, 53, 181, 169, 35, 15, 207, 45, 247, 185, 117, 41, 81, 223, 151, 81, 189, 61, 95, 185, 23, 73, 113, 239, 85, 9, 201, 83, 53, 183, 203, 91, 149, 101, 13, 111, 239, 3, 205, 253, 247, 121, 189, 169, 179, 197, 175, 217, 249, 195, 95, 63, 19, 7, 5, 75, 217, 245, 111, 189, 165, 169, 141, 221, 249, 159, 253, 207, 249, 219, 23, 49, 127, 237, 5, 25, 177, 37, 103, 65, 167, 81, 87, 119, 45, 79, 143, 57, 79, 187, 143, 183, 75, 97, 211, 149, 175, 37, 135, 189, 225, 241, 63, 33, 43, 13, 73, 213, 57, 239, 183, 117, 21, 29, 115, 43, 205, 223, 15, 3, 159, 51, 101, 127, 99, 239, 171, 113, 171, 119, 189, 245, 201, 27, 185, 229, 105, 153, 189, 33, 35, 137, 77, 97, 17, 181, 55, 197, 201, 155, 37, 197, 137, 223, 25, 179, 91, 23, 235, 53, 253, 49, 181, 249, 53, 173, 97, 247, 67, 115, 103, 159, 239, 69, 173, 217, 95, 221, 247, 97, 91, 123, 223, 213, 129, 181, 87, 239, 85, 89, 249, 141, 39, 57, 249, 71, 101, 159, 33, 137, 189, 71, 253, 205, 171, 13, 249, 109, 131, 199, 189, 179, 31, 99, 113, 41, 173, 23, 189, 197, 3, 135, 9, 95, 195, 27, 183, 1, 123, 73, 53, 99, 197, 59, 27, 101, 55, 193, 31, 61, 119, 11, 7, 255, 233, 53, 157, 193, 97, 83, 65, 81, 239, 167, 69, 71, 109, 97, 137, 71, 193, 189, 115, 79, 205, 37, 227, 53, 33, 91, 229, 245, 105, 77, 229, 161, 103, 93, 13, 161, 229, 223, 69, 15, 25, 23, 233, 93, 25, 217, 247, 61, 75, 27, 9, 223, 213, 55, 197, 145, 89, 199, 41, 201, 5, 149, 35, 119, 183, 53, 11, 13, 3, 179, 229, 43, 55, 187, 233, 47, 133, 91, 47, 71, 93, 105, 145, 45, 255, 221, 115, 175, 19, 129, 5, 209, 197, 57, 177, 115, 187, 119, 77, 211, 111, 33, 113, 23, 87, 137, 41, 7, 83, 43, 121, 145, 5, 219, 27, 11, 111, 207, 55, 97, 63, 229, 53, 33, 149, 23, 187, 153, 91, 193, 183, 59, 211, 93, 139, 59, 179, 163, 209, 77, 39, 111, 79, 229, 85, 237, 199, 137, 147, 25, 73, 121, 129, 83, 87, 93, 205, 167, 53, 107, 229, 213, 95, 219, 109, 175, 13, 209, 97, 61, 147, 19, 13, 123, 73, 35, 141, 81, 19, 171, 255, 111, 107, 233, 113, 133, 89, 9, 231, 95, 69, 33, 1, 253, 219, 253, 247, 129, 11, 251, 221, 153, 35, 103, 239, 7, 27, 235, 181, 5, 207, 53, 149, 155, 225, 165, 137, 155, 201, 97, 245, 203, 47, 39, 35, 105, 239, 49, 15, 253, 7, 237, 213, 55, 87, 199, 27, 175, 49, 41, 229, 85, 3, 149, 179, 129, 185, 249, 197, 15, 97, 197, 139, 203, 63, 33, 251, 217, 199, 199, 99, 249, 33, 229, 177, 13, 209, 147, 97, 31, 125, 177, 137, 187, 11, 91, 223, 29, 169, 231, 59, 31, 163, 41, 57, 87, 247, 25, 127, 101, 207, 187, 73, 61, 105, 27, 91, 171, 243, 33, 3, 1, 21, 229, 93, 71, 61, 37, 183, 65, 211, 53, 11, 151, 165, 47, 5, 129, 79, 101, 147, 169, 181, 19, 95, 77, 139, 197, 219, 97, 239, 183, 143, 9, 13, 209, 23, 215, 53, 137, 203, 19, 151, 171, 133, 219, 231, 3, 15, 253, 225, 33, 111, 183, 213, 169, 119, 111, 15, 201, 123, 121, 225, 113, 113, 225, 161, 165, 1, 139, 55, 3, 93, 217, 193, 97, 29, 69, 231, 161, 93, 69, 143, 137, 9, 87, 183, 113, 183, 73, 215, 137, 89, 251, 163, 41, 227, 145, 57, 81, 57, 11, 135, 145, 161, 175, 159, 25, 55, 167, 157, 211, 97, 247, 249, 23, 129, 159, 71, 197, 127, 141, 219, 5, 233, 131, 217, 101, 131, 33, 157, 173, 69, 207, 239, 81, 205, 11, 41, 169, 65, 193, 77, 201, 173, 1, 221, 157, 1, 15, 113, 147, 137, 205, 225, 73, 45, 49, 149, 113, 253, 99, 17, 119, 105, 117, 129, 243, 75, 203, 53, 29, 247, 35, 247, 171, 31, 199, 213, 29, 251, 7, 251, 187, 91, 11, 149, 13, 205, 37, 249, 137, 139, 9, 7, 113, 183, 205, 187, 39, 3, 79, 155, 227, 89, 185, 51, 127, 63, 83, 41, 133, 183, 181, 127, 19, 255, 219, 59, 251, 3, 187, 57, 217, 115, 217, 229, 181, 185, 149, 83, 115, 11, 123, 19, 109, 165, 103, 123, 219, 129, 155, 207, 177, 9, 49, 181, 231, 33, 233, 67, 155, 41, 9, 95, 123, 65, 117, 249, 85, 169, 129, 241, 173, 251, 225, 147, 165, 69, 81, 239, 95, 23, 83, 227, 249, 143, 171, 193, 9, 21, 57, 73, 97, 57, 29, 239, 151, 159, 191, 47, 51, 1, 223, 251, 251, 151, 41, 119, 127, 131, 33, 209, 123, 53, 241, 25, 31, 183, 107, 25, 115, 39, 11, 213, 239, 219, 109, 185, 35, 133, 123, 185, 27, 55, 245, 61, 75, 205, 213, 169, 163, 63, 55, 49, 83, 195, 51, 31, 41, 15, 203, 41, 63, 127, 161, 5, 143, 7, 199, 251, 95, 75, 101, 15, 43, 237, 197, 117, 167, 155, 21, 83, 205, 255, 49, 101, 213, 237, 135, 135, 21, 73, 93, 115, 7, 85, 223, 237, 79, 89, 5, 57, 239, 67, 65, 201, 155, 71, 85, 195, 89, 181, 119, 135, 147, 237, 173, 41, 155, 67, 113, 111, 21, 183, 23, 103, 207, 253, 69, 219, 205, 195, 43, 197, 229, 139, 177, 129, 69, 97, 201, 163, 189, 11, 99, 91, 253, 239, 91, 145, 19, 179, 231, 121, 7, 225, 237, 125, 191, 119, 59, 175, 237, 131, 79, 43, 45, 205, 199, 251, 153, 207, 37, 179, 113, 255, 107, 217, 61, 7, 181, 247, 31, 13, 113, 145, 107, 233, 233, 43, 79, 23, 169, 137, 129, 183, 53, 91, 55, 103, 223, 87, 177, 157, 79, 213, 139, 183, 231, 205, 143, 129, 243, 205, 93, 59, 15, 89, 9, 11, 47, 133, 227, 75, 9, 91, 19, 171, 163, 79, 7, 103, 5, 119, 155, 75, 11, 71, 95, 17, 13, 243, 207, 187}, /* [8][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 307, 495, 417, 57, 151, 19, 119, 375, 451, 55, 449, 501, 53, 185, 317, 17, 21, 487, 13, 347, 393, 15, 391, 307, 189, 381, 71, 163, 99, 467, 167, 433, 337, 257, 179, 47, 385, 23, 117, 369, 425, 207, 433, 301, 147, 333, 85, 221, 423, 49, 3, 43, 229, 227, 201, 383, 281, 229, 207, 21, 343, 251, 397, 173, 507, 421, 443, 399, 53, 345, 77, 385, 317, 155, 187, 269, 501, 19, 169, 235, 415, 61, 247, 183, 5, 257, 401, 451, 95, 455, 49, 489, 75, 459, 377, 87, 463, 155, 233, 115, 429, 211, 419, 143, 487, 195, 209, 461, 193, 157, 193, 363, 181, 271, 445, 381, 231, 135, 327, 403, 171, 197, 181, 343, 113, 313, 393, 311, 415, 267, 247, 425, 233, 289, 55, 39, 247, 327, 141, 5, 189, 183, 27, 337, 341, 327, 87, 429, 357, 265, 251, 437, 201, 29, 339, 257, 377, 17, 53, 327, 47, 375, 393, 369, 403, 125, 429, 257, 157, 217, 85, 267, 117, 337, 447, 219, 501, 41, 41, 193, 509, 131, 207, 505, 421, 149, 111, 177, 167, 223, 291, 91, 29, 305, 151, 177, 337, 183, 361, 435, 307, 507, 77, 181, 507, 315, 145, 423, 71, 103, 493, 271, 469, 339, 237, 437, 483, 31, 219, 61, 131, 391, 233, 219, 69, 57, 459, 225, 421, 7, 461, 111, 451, 277, 185, 193, 125, 251, 199, 73, 71, 7, 409, 417, 149, 193, 53, 437, 29, 467, 229, 31, 35, 75, 105, 503, 75, 317, 401, 367, 131, 365, 441, 433, 93, 377, 405, 465, 259, 283, 443, 143, 445, 3, 461, 329, 309, 77, 323, 155, 347, 45, 381, 315, 463, 207, 321, 157, 109, 479, 313, 345, 167, 439, 307, 235, 473, 79, 101, 245, 19, 381, 251, 35, 25, 107, 187, 115, 113, 321, 115, 445, 61, 77, 293, 405, 13, 53, 17, 171, 299, 41, 79, 3, 485, 331, 13, 257, 59, 201, 497, 81, 451, 199, 171, 81, 253, 365, 75, 451, 149, 483, 81, 453, 469, 485, 305, 163, 401, 15, 91, 3, 129, 35, 239, 355, 211, 387, 101, 299, 67, 375, 405, 357, 267, 363, 79, 83, 437, 457, 39, 97, 473, 289, 179, 57, 23, 49, 79, 71, 341, 287, 95, 229, 271, 475, 49, 241, 261, 495, 353, 381, 13, 291, 37, 251, 105, 399, 81, 89, 265, 507, 205, 145, 331, 129, 119, 503, 249, 1, 289, 463, 163, 443, 63, 123, 361, 261, 49, 429, 137, 355, 175, 507, 59, 277, 391, 25, 185, 381, 197, 39, 5, 429, 119, 247, 177, 329, 465, 421, 271, 467, 151, 45, 429, 137, 471, 11, 17, 409, 347, 199, 463, 177, 11, 51, 361, 95, 497, 163, 351, 127, 395, 511, 327, 353, 49, 105, 151, 321, 331, 329, 509, 107, 109, 303, 467, 287, 161, 45, 385, 289, 363, 331, 265, 407, 37, 433, 315, 343, 63, 51, 185, 71, 27, 267, 503, 239, 293, 245, 281, 297, 75, 461, 371, 129, 189, 189, 339, 287, 111, 111, 379, 93, 27, 185, 347, 337, 247, 507, 161, 231, 43, 499, 73, 327, 263, 331, 249, 493, 37, 25, 115, 3, 167, 197, 127, 357, 497, 103, 125, 191, 165, 55, 101, 95, 79, 351, 341, 43, 125, 135, 173, 289, 373, 133, 421, 241, 281, 213, 177, 363, 151, 227, 145, 363, 239, 431, 81, 397, 241, 67, 291, 255, 405, 421, 399, 75, 399, 105, 329, 41, 425, 7, 283, 375, 475, 427, 277, 209, 411, 3, 137, 195, 289, 509, 121, 55, 147, 275, 251, 19, 129, 285, 415, 487, 491, 193, 219, 403, 23, 97, 65, 285, 75, 21, 373, 261, 339, 239, 495, 415, 333, 107, 435, 297, 213, 149, 463, 199, 323, 45, 19, 301, 121, 499, 187, 229, 63, 425, 99, 281, 35, 125, 349, 87, 101, 59, 195, 511, 355, 73, 263, 243, 101, 165, 141, 11, 389, 219, 187, 449, 447, 393, 477, 305, 221, 51, 355, 209, 499, 479, 265, 377, 145, 411, 173, 11, 433, 483, 135, 385, 341, 89, 209, 391, 33, 395, 319, 451, 119, 341, 227, 375, 61, 331, 493, 411, 293, 47, 203, 375, 167, 395, 155, 5, 237, 361, 489, 127, 21, 345, 101, 371, 233, 431, 109, 119, 277, 125, 263, 73, 135, 123, 83, 123, 405, 69, 75, 287, 401, 23, 283, 393, 41, 379, 431, 11, 475, 505, 19, 365, 265, 271, 499, 489, 443, 165, 91, 83, 291, 319, 199, 107, 245, 389, 143, 137, 89, 125, 281, 381, 215, 131, 299, 249, 375, 455, 43, 73, 281, 217, 297, 229, 431, 357, 81, 357, 171, 451, 481, 13, 387, 491, 489, 439, 385, 487, 177, 393, 33, 71, 375, 443, 129, 407, 395, 127, 65, 333, 309, 119, 197, 435, 497, 373, 71, 379, 509, 387, 159, 265, 477, 463, 449, 47, 353, 249, 335, 505, 89, 141, 55, 235, 187, 87, 363, 93, 363, 101, 67, 215, 321, 331, 305, 261, 411, 491, 479, 65, 307, 469, 415, 131, 315, 487, 83, 455, 19, 113, 163, 503, 99, 499, 251, 239, 81, 167, 391, 255, 317, 363, 359, 395, 419, 307, 251, 267, 171, 461, 183, 465, 165, 163, 293, 477, 223, 403, 389, 97, 335, 357, 297, 19, 469, 501, 249, 85, 213, 311, 265, 379, 297, 283, 393, 449, 463, 289, 159, 289, 499, 407, 129, 137, 221, 43, 89, 403, 271, 75, 83, 445, 453, 389, 149, 143, 423, 499, 317, 445, 157, 137, 453, 163, 87, 23, 391, 119, 427, 323, 173, 89, 259, 377, 511, 249, 31, 363, 229, 353, 329, 493, 427, 57, 205, 389, 91, 83, 13, 219, 439, 45, 35, 371, 441, 17, 267, 501, 53, 25, 333, 17, 201, 475, 257, 417, 345, 381, 377, 55, 403, 77, 389, 347, 363, 211, 413, 419, 5, 167, 219, 201, 285, 425, 11, 77, 269, 489, 281, 403, 79, 425, 125, 81, 331, 437, 271, 397, 299, 475, 271, 249, 413, 233, 261, 495, 171, 69, 27, 409, 21, 421, 367, 81, 483, 255, 15, 219, 365, 497, 181, 75, 431, 99, 325, 407, 229, 281, 63, 83, 493, 5, 113, 15, 271, 37, 87, 451, 299, 83, 451, 311, 441, 47, 455, 47, 253, 13, 109, 369, 347, 11, 409, 275, 63, 441, 15}, /* [9][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 519, 307, 931, 1023, 517, 771, 151, 1023, 539, 725, 45, 927, 707, 29, 125, 371, 275, 279, 817, 389, 453, 989, 1015, 29, 169, 743, 99, 923, 981, 181, 693, 309, 227, 111, 219, 897, 377, 425, 609, 227, 19, 221, 143, 581, 147, 919, 127, 725, 793, 289, 411, 835, 921, 957, 443, 349, 813, 5, 105, 457, 393, 539, 101, 197, 697, 27, 343, 515, 69, 485, 383, 855, 693, 133, 87, 743, 747, 475, 87, 469, 763, 721, 345, 479, 965, 527, 121, 271, 353, 467, 177, 245, 627, 113, 357, 7, 691, 725, 355, 889, 635, 737, 429, 545, 925, 357, 873, 187, 351, 677, 999, 921, 477, 233, 765, 495, 81, 953, 479, 89, 173, 473, 131, 961, 411, 291, 967, 65, 511, 13, 805, 945, 369, 827, 295, 163, 835, 259, 207, 331, 29, 315, 999, 133, 967, 41, 117, 677, 471, 717, 881, 755, 351, 723, 259, 879, 455, 721, 289, 149, 199, 805, 987, 851, 423, 597, 129, 11, 733, 549, 153, 285, 451, 559, 377, 109, 357, 143, 693, 615, 677, 701, 475, 767, 85, 229, 509, 547, 151, 389, 711, 785, 657, 319, 509, 99, 1007, 775, 359, 697, 677, 85, 497, 105, 615, 891, 71, 449, 835, 609, 377, 693, 665, 627, 215, 911, 503, 729, 131, 19, 895, 199, 161, 239, 633, 1013, 537, 255, 23, 149, 679, 1021, 595, 199, 557, 659, 251, 829, 727, 439, 495, 647, 223, 949, 625, 87, 481, 85, 799, 917, 769, 949, 739, 115, 499, 945, 547, 225, 1015, 469, 737, 495, 353, 103, 17, 665, 639, 525, 75, 447, 185, 43, 729, 577, 863, 735, 317, 99, 17, 477, 893, 537, 519, 1017, 375, 297, 325, 999, 353, 343, 729, 135, 489, 859, 267, 141, 831, 141, 893, 249, 807, 53, 613, 131, 547, 977, 131, 999, 175, 31, 341, 739, 467, 675, 241, 645, 247, 391, 583, 183, 973, 433, 367, 131, 467, 571, 309, 385, 977, 111, 917, 935, 473, 345, 411, 313, 97, 149, 959, 841, 839, 669, 431, 51, 41, 301, 247, 1015, 377, 329, 945, 269, 67, 979, 581, 643, 823, 557, 91, 405, 117, 801, 509, 347, 893, 303, 227, 783, 555, 867, 99, 703, 111, 797, 873, 541, 919, 513, 343, 319, 517, 135, 871, 917, 285, 663, 301, 15, 763, 89, 323, 757, 317, 807, 309, 1013, 345, 499, 279, 711, 915, 411, 281, 193, 739, 365, 315, 375, 809, 469, 487, 621, 857, 975, 537, 939, 585, 129, 625, 447, 129, 1017, 133, 83, 3, 415, 661, 53, 115, 903, 49, 79, 55, 385, 261, 345, 297, 199, 385, 617, 25, 515, 275, 849, 401, 471, 377, 661, 535, 505, 939, 465, 225, 929, 219, 955, 659, 441, 117, 527, 427, 515, 287, 191, 33, 389, 197, 825, 63, 417, 949, 35, 571, 9, 131, 609, 439, 95, 19, 569, 893, 451, 397, 971, 801, 125, 471, 187, 257, 67, 949, 621, 453, 411, 621, 955, 309, 783, 893, 597, 377, 753, 145, 637, 941, 593, 317, 555, 375, 575, 175, 403, 571, 555, 109, 377, 931, 499, 649, 653, 329, 279, 271, 647, 721, 665, 429, 957, 803, 767, 425, 477, 995, 105, 495, 575, 687, 385, 227, 923, 563, 723, 481, 717, 111, 633, 113, 369, 955, 253, 321, 409, 909, 367, 33, 967, 453, 863, 449, 539, 781, 911, 113, 7, 219, 725, 1015, 971, 1021, 525, 785, 873, 191, 893, 297, 507, 215, 21, 153, 645, 913, 755, 371, 881, 113, 903, 225, 49, 587, 201, 927, 429, 599, 513, 97, 319, 331, 833, 325, 887, 139, 927, 399, 163, 307, 803, 169, 1019, 869, 537, 907, 479, 335, 697, 479, 353, 769, 787, 1023, 855, 493, 883, 521, 735, 297, 1011, 991, 879, 855, 591, 415, 917, 375, 453, 553, 189, 841, 339, 211, 601, 57, 765, 745, 621, 209, 875, 639, 7, 595, 971, 263, 1009, 201, 23, 77, 621, 33, 535, 963, 661, 523, 263, 917, 103, 623, 231, 47, 301, 549, 337, 675, 189, 357, 1005, 789, 189, 319, 721, 1005, 525, 675, 539, 191, 813, 917, 51, 167, 415, 579, 755, 605, 721, 837, 529, 31, 327, 799, 961, 279, 409, 847, 649, 241, 285, 545, 407, 161, 591, 73, 313, 811, 17, 663, 269, 261, 37, 783, 127, 917, 231, 577, 975, 793, 921, 343, 751, 139, 221, 79, 817, 393, 545, 11, 781, 71, 1, 699, 767, 917, 9, 107, 341, 587, 903, 965, 599, 507, 843, 739, 579, 397, 397, 325, 775, 565, 925, 75, 55, 979, 931, 93, 957, 857, 753, 965, 795, 67, 5, 87, 909, 97, 995, 271, 875, 671, 613, 33, 351, 69, 811, 669, 729, 401, 647, 241, 435, 447, 721, 271, 745, 53, 775, 99, 343, 451, 427, 593, 339, 845, 243, 345, 17, 573, 421, 517, 971, 499, 435, 769, 75, 203, 793, 985, 343, 955, 735, 523, 659, 703, 303, 421, 951, 405, 631, 825, 735, 433, 841, 485, 49, 749, 107, 669, 211, 497, 143, 99, 57, 277, 969, 107, 397, 563, 551, 447, 381, 187, 57, 405, 731, 769, 923, 955, 915, 737, 595, 341, 253, 823, 197, 321, 315, 181, 885, 497, 159, 571, 981, 899, 785, 947, 217, 217, 135, 753, 623, 565, 717, 903, 581, 955, 621, 361, 869, 87, 943, 907, 853, 353, 335, 197, 771, 433, 743, 195, 91, 1023, 63, 301, 647, 205, 485, 927, 1003, 987, 359, 577, 147, 141, 1017, 701, 273, 89, 589, 487, 859, 343, 91, 847, 341, 173, 287, 1003, 289, 639, 983, 685, 697, 35, 701, 645, 911, 501, 705, 873, 763, 745, 657, 559, 699, 315, 347, 429, 197, 165, 955, 859, 167, 303, 833, 531, 473, 635, 641, 195, 589, 821, 205, 3, 635, 371, 891, 249, 123, 77, 623, 993, 401, 525, 427, 71, 655, 951, 357, 851, 899, 535, 493, 323, 1003, 343, 515, 859, 1017, 5, 423, 315, 1011, 703, 41, 777, 163, 95, 831, 79, 975, 235, 633, 723, 297, 589, 317, 679, 981, 195, 399, 1003, 121, 501, 155}, /* [10][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2011, 1001, 49, 825, 415, 1441, 383, 1581, 623, 1621, 1319, 1387, 619, 839, 217, 75, 1955, 505, 281, 1629, 1379, 53, 1111, 1399, 301, 209, 49, 155, 1647, 631, 129, 1569, 335, 67, 1955, 1611, 2021, 1305, 121, 37, 877, 835, 1457, 669, 1405, 935, 1735, 665, 551, 789, 1543, 1267, 1027, 1, 1911, 163, 1929, 67, 1975, 1681, 1413, 191, 1711, 1307, 401, 725, 1229, 1403, 1609, 2035, 917, 921, 1789, 41, 2003, 187, 67, 1635, 717, 1449, 277, 1903, 1179, 363, 1211, 1231, 647, 1261, 1029, 1485, 1309, 1149, 317, 1335, 171, 243, 271, 1055, 1601, 1129, 1653, 205, 1463, 1681, 1621, 197, 951, 573, 1697, 1265, 1321, 1805, 1235, 1853, 1307, 945, 1197, 1411, 833, 273, 1517, 1747, 1095, 1345, 869, 57, 1383, 221, 1713, 335, 1751, 1141, 839, 523, 1861, 1105, 389, 1177, 1877, 805, 93, 1591, 423, 1835, 99, 1781, 1515, 1909, 1011, 303, 385, 1635, 357, 973, 1781, 1707, 1363, 1053, 649, 1469, 623, 1429, 1241, 1151, 1055, 503, 921, 3, 349, 1149, 293, 45, 303, 877, 1565, 1583, 1001, 663, 1535, 395, 1141, 1481, 1797, 643, 1507, 465, 2027, 1695, 367, 937, 719, 545, 1991, 83, 819, 239, 1791, 1461, 1647, 1501, 1161, 1629, 139, 1595, 1921, 1267, 1415, 509, 347, 777, 1083, 363, 269, 1015, 1809, 1105, 1429, 1471, 2019, 381, 2025, 1223, 827, 1733, 887, 1321, 803, 1951, 1297, 1995, 833, 1107, 1135, 1181, 1251, 983, 1389, 1565, 273, 137, 71, 735, 1005, 933, 67, 1471, 551, 457, 1667, 1729, 919, 285, 1629, 1815, 653, 1919, 1039, 531, 393, 1411, 359, 221, 699, 1485, 471, 1357, 1715, 595, 1677, 153, 1903, 1281, 215, 781, 543, 293, 1807, 965, 1695, 443, 1985, 321, 879, 1227, 1915, 839, 1945, 1993, 1165, 51, 557, 723, 1491, 817, 1237, 947, 1215, 1911, 1225, 1965, 1889, 1503, 1177, 73, 1767, 303, 177, 1897, 1401, 321, 921, 217, 1779, 327, 1889, 333, 615, 1665, 1825, 1639, 237, 1205, 361, 129, 1655, 983, 1089, 1171, 401, 677, 643, 749, 303, 1407, 1873, 1579, 1491, 1393, 1247, 789, 763, 49, 5, 1607, 1891, 735, 1557, 1909, 1765, 1777, 1127, 813, 695, 97, 731, 1503, 1751, 333, 769, 865, 693, 377, 1919, 957, 1359, 1627, 1039, 1783, 1065, 1665, 1917, 1947, 991, 1997, 841, 459, 221, 327, 1595, 1881, 1269, 1007, 129, 1413, 475, 1105, 791, 1983, 1359, 503, 691, 659, 691, 343, 1375, 1919, 263, 1373, 603, 1383, 297, 781, 145, 285, 767, 1739, 1715, 715, 317, 1333, 85, 831, 1615, 81, 1667, 1467, 1457, 1453, 1825, 109, 387, 1207, 2039, 213, 1351, 1329, 1173, 57, 1769, 951, 183, 23, 451, 1155, 1551, 2037, 811, 635, 1671, 1451, 863, 1499, 1673, 363, 1029, 1077, 1525, 277, 1023, 655, 665, 1869, 1255, 965, 277, 1601, 329, 1603, 1901, 395, 65, 1307, 2029, 21, 1321, 543, 1569, 1185, 1905, 1701, 413, 2041, 1697, 725, 1417, 1847, 411, 211, 915, 1891, 17, 1877, 1699, 687, 1089, 1973, 1809, 851, 1495, 1257, 63, 1323, 1307, 609, 881, 1543, 177, 617, 1505, 1747, 1537, 925, 183, 77, 1723, 1877, 1703, 397, 459, 521, 257, 1177, 389, 1947, 1553, 1583, 1831, 261, 485, 289, 1281, 1543, 1591, 1123, 573, 821, 1065, 1933, 1373, 2005, 905, 207, 173, 1573, 1597, 573, 1883, 1795, 1499, 1743, 553, 335, 333, 1645, 791, 871, 1157, 969, 557, 141, 223, 1129, 1685, 423, 1069, 391, 99, 95, 1847, 531, 1859, 1833, 1833, 341, 237, 1997, 1799, 409, 431, 1917, 363, 335, 1039, 1085, 1657, 1975, 1527, 1111, 659, 389, 899, 595, 1439, 1861, 1979, 1569, 1087, 1009, 165, 1895, 1481, 1583, 29, 1193, 1673, 1075, 301, 1081, 1377, 1747, 1497, 1103, 1789, 887, 739, 1577, 313, 1367, 1299, 1801, 1131, 1837, 73, 1865, 1065, 843, 635, 55, 1655, 913, 1037, 223, 1871, 1161, 461, 479, 511, 1721, 1107, 389, 151, 35, 375, 1099, 937, 1185, 1701, 769, 639, 1633, 1609, 379, 1613, 2031, 685, 289, 975, 671, 1599, 1447, 871, 647, 99, 139, 1427, 959, 89, 117, 841, 891, 1959, 223, 1697, 1145, 499, 1435, 1809, 1413, 1445, 1675, 171, 1073, 1349, 1545, 2039, 1027, 1563, 859, 215, 1673, 1919, 1633, 779, 411, 1845, 1477, 1489, 447, 1545, 351, 1989, 495, 183, 1639, 1385, 1805, 1097, 1249, 1431, 1571, 591, 697, 1509, 709, 31, 1563, 165, 513, 1425, 1299, 1081, 145, 1841, 1211, 941, 609, 845, 1169, 1865, 1593, 347, 293, 1277, 157, 211, 93, 1679, 1799, 527, 41, 473, 563, 187, 1525, 575, 1579, 857, 703, 1211, 647, 709, 981, 285, 697, 163, 981, 153, 1515, 47, 1553, 599, 225, 1147, 381, 135, 821, 1965, 609, 1033, 983, 503, 1117, 327, 453, 2005, 1257, 343, 1649, 1199, 599, 1877, 569, 695, 1587, 1475, 187, 973, 233, 511, 51, 1083, 665, 1321, 531, 1875, 1939, 859, 1507, 1979, 1203, 1965, 737, 921, 1565, 1943, 819, 223, 365, 167, 1705, 413, 1577, 745, 1573, 655, 1633, 1003, 91, 1123, 477, 1741, 1663, 35, 715, 37, 1513, 815, 941, 1379, 263, 1831, 1735, 1111, 1449, 353, 1941, 1655, 1349, 877, 285, 1723, 125, 1753, 985, 723, 175, 439, 791, 1051, 1261, 717, 1555, 1757, 1777, 577, 1583, 1957, 873, 331, 1163, 313, 1, 1963, 963, 1905, 821, 1677, 185, 709, 545, 1723, 215, 1885, 1249, 583, 1803, 839, 885, 485, 413, 1767, 425, 129, 1035, 329, 1263, 1881, 1779, 1565, 359, 367, 453, 707, 1419, 831, 1889, 887, 1871, 1869, 747, 223, 1547, 1799, 433, 1441, 553, 2021, 1303, 1505, 1735, 1619, 1065, 1161, 2047, 347, 867, 881, 1447, 329, 781, 1065, 219, 589, 645, 1257, 1833, 749, 1841, 1733, 1179, 1191, 1025, 1639, 1955, 1423, 1685, 1711, 493, 549, 783, 1653, 397, 895, 233, 759, 1505, 677, 1449, 1573, 1297, 1821, 1691, 791, 289, 1187, 867, 1535, 575, 183}, /* [11][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3915, 97, 3047, 937, 2897, 953, 127, 1201, 3819, 193, 2053, 3061, 3759, 1553, 2007, 2493, 603, 3343, 3751, 1059, 783, 1789, 1589, 283, 1093, 3919, 2747, 277, 2605, 2169, 2905, 721, 4069, 233, 261, 1137, 3993, 3619, 2881, 1275, 3865, 1299, 3757, 1193, 733, 993, 1153, 2945, 3163, 3179, 437, 271, 3493, 3971, 1005, 2615, 2253, 1131, 585, 2775, 2171, 2383, 2937, 2447, 1745, 663, 1515, 3767, 2709, 1767, 3185, 3017, 2815, 1829, 87, 3341, 793, 2627, 2169, 1875, 3745, 367, 3783, 783, 827, 3253, 2639, 2955, 3539, 1579, 2109, 379, 2939, 3019, 1999, 2253, 2911, 3733, 481, 1767, 1055, 4019, 4085, 105, 1829, 2097, 2379, 1567, 2713, 737, 3423, 3941, 2659, 3961, 1755, 3613, 1937, 1559, 2287, 2743, 67, 2859, 325, 2601, 1149, 3259, 2403, 3947, 2011, 175, 3389, 3915, 1315, 2447, 141, 359, 3609, 3933, 729, 2051, 1755, 2149, 2107, 1741, 1051, 3681, 471, 1055, 845, 257, 1559, 1061, 2803, 2219, 1315, 1369, 3211, 4027, 105, 11, 1077, 2857, 337, 3553, 3503, 3917, 2665, 3823, 3403, 3711, 2085, 1103, 1641, 701, 4095, 2883, 1435, 653, 2363, 1597, 767, 869, 1825, 1117, 1297, 501, 505, 149, 873, 2673, 551, 1499, 2793, 3277, 2143, 3663, 533, 3991, 575, 1877, 1009, 3929, 473, 3009, 2595, 3249, 675, 3593, 2453, 1567, 973, 595, 1335, 1715, 589, 85, 2265, 3069, 461, 1659, 2627, 1307, 1731, 1501, 1699, 3545, 3803, 2157, 453, 2813, 2047, 2999, 3841, 2361, 1079, 573, 69, 1363, 1597, 3427, 2899, 2771, 1327, 1117, 1523, 3521, 2393, 2537, 1979, 3179, 683, 2453, 453, 1227, 779, 671, 3483, 2135, 3139, 3381, 3945, 57, 1541, 3405, 3381, 2371, 2879, 1985, 987, 3017, 3031, 3839, 1401, 3749, 2977, 681, 1175, 1519, 3355, 907, 117, 771, 3741, 3337, 1743, 1227, 3335, 2755, 1909, 3603, 2397, 653, 87, 2025, 2617, 3257, 287, 3051, 3809, 897, 2215, 63, 2043, 1757, 3671, 297, 3131, 1305, 293, 3865, 3173, 3397, 2269, 3673, 717, 3041, 3341, 3595, 3819, 2871, 3973, 1129, 513, 871, 1485, 3977, 2473, 1171, 1143, 3063, 3547, 2183, 3993, 133, 2529, 2699, 233, 2355, 231, 3241, 611, 1309, 3829, 1839, 1495, 301, 1169, 1613, 2673, 243, 3601, 3669, 2813, 2671, 2679, 3463, 2477, 1795, 617, 2317, 1855, 1057, 1703, 1761, 2515, 801, 1205, 1311, 473, 3963, 697, 1221, 251, 381, 3887, 1761, 3093, 3721, 2079, 4085, 379, 3601, 3845, 433, 1781, 29, 1897, 1599, 2163, 75, 3475, 3957, 1641, 3911, 2959, 2833, 1279, 1099, 403, 799, 2183, 2699, 1711, 2037, 727, 289, 1785, 1575, 3633, 2367, 1261, 3953, 1735, 171, 1959, 2867, 859, 2951, 3211, 15, 1279, 1323, 599, 1651, 3951, 1011, 315, 3513, 3351, 1725, 3793, 2399, 287, 4017, 3571, 1007, 541, 3115, 429, 1585, 1285, 755, 1211, 3047, 915, 3611, 2697, 2129, 3669, 81, 3939, 2437, 915, 779, 3567, 3701, 2479, 3807, 1893, 3927, 2619, 2543, 3633, 2007, 3857, 3837, 487, 1769, 3759, 3105, 2727, 3155, 2479, 1341, 1657, 2767, 2541, 577, 2105, 799, 17, 2871, 3637, 953, 65, 69, 2897, 3841, 3559, 4067, 2335, 3409, 1087, 425, 2813, 1705, 1701, 1237, 821, 1375, 3673, 2693, 3925, 1541, 1871, 2285, 847, 4035, 1101, 2029, 855, 2733, 2503, 121, 2855, 1069, 3463, 3505, 1539, 607, 1349, 575, 2301, 2321, 1101, 333, 291, 2171, 4085, 2173, 2541, 1195, 925, 4039, 1379, 699, 1979, 275, 953, 1755, 1643, 325, 101, 2263, 3329, 3673, 3413, 1977, 2727, 2313, 1419, 887, 609, 2475, 591, 2613, 2081, 3805, 3435, 2409, 111, 3557, 3607, 903, 231, 3059, 473, 2959, 2925, 3861, 2043, 3887, 351, 2865, 369, 1377, 2639, 1261, 3625, 3279, 2201, 2949, 3049, 449, 1297, 897, 1891, 411, 2773, 749, 2753, 1825, 853, 2775, 3547, 3923, 3923, 987, 3723, 2189, 3877, 3577, 297, 2763, 1845, 3083, 2951, 483, 2169, 3985, 245, 3655, 3441, 1023, 235, 835, 3693, 3585, 327, 1003, 543, 3059, 2637, 2923, 87, 3617, 1031, 1043, 903, 2913, 2177, 2641, 3279, 389, 2009, 525, 4085, 3299, 987, 2409, 813, 2683, 373, 2695, 3775, 2375, 1119, 2791, 223, 325, 587, 1379, 2877, 2867, 3793, 655, 831, 3425, 1663, 1681, 2657, 1865, 3943, 2977, 1979, 2271, 3247, 1267, 1747, 811, 159, 429, 2001, 1195, 3065, 553, 1499, 3529, 1081, 2877, 3077, 845, 1793, 2409, 3995, 2559, 4081, 1195, 2955, 1117, 1409, 785, 287, 1521, 1607, 85, 3055, 3123, 2533, 2329, 3477, 799, 3683, 3715, 337, 3139, 3311, 431, 3511, 2299, 365, 2941, 3067, 1331, 1081, 1097, 2853, 2299, 495, 1745, 749, 3819, 619, 1059, 3559, 183, 3743, 723, 949, 3501, 733, 2599, 3983, 3961, 911, 1899, 985, 2493, 1795, 653, 157, 433, 2361, 3093, 3119, 3679, 2367, 1701, 1445, 1321, 2397, 1241, 3305, 3985, 2349, 4067, 3805, 3073, 2837, 1567, 3783, 451, 2441, 1181, 487, 543, 1201, 3735, 2517, 733, 1535, 2175, 3613, 3019}, /* [12][*] */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2319, 653, 1379, 1675, 1951, 7075, 2087, 7147, 1427, 893, 171, 2019, 7235, 5697, 3615, 1961, 7517, 6849, 2893, 1883, 2863, 2173, 4543, 73, 381, 3893, 6045, 1643, 7669, 1027, 1549, 3983, 1985, 6589, 7497, 2745, 2375, 7047, 1117, 1171, 1975, 5199, 3915, 3695, 8113, 4303, 3773, 7705, 6855, 1675, 2245, 2817, 1719, 569, 1021, 2077, 5945, 1833, 2631, 4851, 6371, 833, 7987, 331, 1899, 8093, 6719, 6903, 5903, 5657, 5007, 2689, 6637, 2675, 1645, 1819, 689, 6709, 7717, 6295, 7013, 7695, 3705, 7069, 2621, 3631, 6571, 6259, 7261, 3397, 7645, 1115, 4753, 2047, 7579, 2271, 5403, 4911, 7629, 4225, 1209, 6955, 6951, 1829, 5579, 5231, 1783, 4285, 7425, 599, 5785, 3275, 5643, 2263, 657, 6769, 6261, 1251, 3249, 4447, 4111, 3991, 1215, 131, 4397, 3487, 7585, 5565, 7199, 3573, 7105, 7409, 1671, 949, 3889, 5971, 3333, 225, 3647, 5403, 3409, 7459, 6879, 5789, 6567, 5581, 4919, 1927, 4407, 8085, 4691, 611, 3005, 591, 753, 589, 171, 5729, 5891, 1033, 3049, 6567, 5257, 8003, 1757, 4489, 4923, 6379, 5171, 1757, 689, 3081, 1389, 4113, 455, 2761, 847, 7575, 5829, 633, 6629, 1103, 7635, 803, 6175, 6587, 2711, 3879, 67, 1179, 4761, 7281, 1557, 3379, 2459, 4273, 4127, 7147, 35, 3549, 395, 3735, 5787, 4179, 5889, 5057, 7473, 4713, 2133, 2897, 1841, 2125, 1029, 1695, 6523, 1143, 5105, 7133, 3351, 2775, 3971, 4503, 7589, 5155, 4305, 1641, 4717, 2427, 5617, 1267, 399, 5831, 4305, 4241, 3395, 3045, 4899, 1713, 171, 411, 7099, 5473, 5209, 1195, 1077, 1309, 2953, 7343, 4887, 3229, 6759, 6721, 6775, 675, 4039, 2493, 7511, 3269, 4199, 6625, 7943, 2013, 4145, 667, 513, 2303, 4591, 7941, 2741, 987, 8061, 3161, 5951, 1431, 831, 5559, 7405, 1357, 4319, 4235, 5421, 2559, 4415, 2439, 823, 1725, 6219, 4903, 6699, 5451, 349, 7703, 2927, 7809, 6179, 1417, 5987, 3017, 4983, 3479, 4525, 4643, 4911, 227, 5475, 2287, 5581, 6817, 1937, 1421, 4415, 7977, 1789, 3907, 6815, 6789, 6003, 5609, 4507, 337, 7427, 7943, 3075, 6427, 1019, 7121, 4763, 81, 3587, 2929, 1795, 8067, 2415, 1265, 4025, 5599, 4771, 3025, 2313, 6129, 7611, 6881, 5253, 4413, 7869, 105, 3173, 1629, 2537, 1023, 4409, 7209, 4413, 7107, 7469, 33, 1955, 2881, 5167, 6451, 4211, 179, 5573, 7879, 3387, 7759, 5455, 7157, 1891, 5683, 5689, 6535, 3109, 6555, 6873, 1249, 4251, 6437, 49, 2745, 1201, 7327, 4179, 6783, 623, 2779, 5963, 2585, 6927, 5333, 4033, 285, 7467, 4443, 4917, 3, 4319, 5517, 3449, 813, 5499, 2515, 5771, 3357, 2073, 4395, 4925, 2643, 7215, 5817, 1199, 1597, 1619, 7535, 4833, 609, 4797, 8171, 6847, 793, 6757, 8165, 3371, 2431, 5235, 4739, 7703, 7223, 6525, 5891, 5605, 4433, 3533, 5267, 5125, 5037, 225, 6717, 1121, 5741, 2013, 4327, 4839, 569, 5227, 7677, 4315, 2391, 5551, 859, 3627, 6377, 3903, 4311, 6527, 7573, 4905, 7731, 1909, 1555, 3279, 1949, 1887, 6675, 5509, 2033, 5473, 3539, 5033, 5935, 6095, 4761, 1771, 1271, 1717, 4415, 5083, 6277, 3147, 7695, 2461, 4783, 4539, 5833, 5583, 651, 1419, 2605, 5511, 3913, 5795, 2333, 2329, 4431, 3725, 6069, 2699, 7055, 6879, 1017, 3121, 2547, 4603, 2385, 6915, 6103, 5669, 7833, 2001, 4287, 6619, 955, 2761, 5711, 6291, 3415, 3909, 2841, 5627, 4939, 7671, 6059, 6275, 6517, 1931, 4583, 7301, 1267, 7509, 1435, 2169, 6939, 3515, 2985, 2787, 2123, 1969, 3307, 353, 4359, 7059, 5273, 5873, 6657, 6765, 6229, 3179, 1583, 6237, 2155, 371, 273, 7491, 3309, 6805, 3015, 6831, 7819, 713, 4747, 3935, 4109, 1311, 709, 3089, 7059, 4247, 2989, 1509, 4919, 1841, 3045, 3821, 6929, 4655, 1333, 6429, 6649, 2131, 5265, 1051, 261, 8057, 3379, 2179, 1993, 5655, 3063, 6381, 3587, 7417, 1579, 1541, 2107, 5085, 2873, 6141, 955, 3537, 2157, 841, 1999, 1465, 5171, 5651, 1535, 7235, 4349, 1263, 1453, 1005, 6893, 2919, 1947, 1635, 3963, 397, 969, 4569, 655, 6737, 2995, 7235, 7713, 973, 4821, 2377, 1673, 1, 6541} }; #endif stevengj-nlopt-88c424d/src/util/sobolseq.c000066400000000000000000000206651521061417600206060ustar00rootroot00000000000000/* Copyright (c) 2007 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Generation of Sobol sequences in up to 1111 dimensions, based on the algorithms described in: P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. Math. Soft. 14 (1), 88-100 (1988), as modified by: S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). Note that the code below was written without even looking at the Fortran code from the TOMS paper, which is only semi-free (being under the restrictive ACM copyright terms). Then I went to the Fortran code and took out the table of primitive polynomials and starting direction #'s ... since this is just a table of numbers generated by a deterministic algorithm, it is not copyrightable. (Obviously, the format of these tables then necessitated some slight modifications to the code.) For the test integral of Joe and Kuo (see the main() program below), I get exactly the same results for integrals up to 1111 dimensions compared to the table of published numbers (to the 5 published significant digits). This is not to say that the authors above should not be credited for their clear description of the algorithm (and their tabulation of the critical numbers). Please cite them. Just that I needed a free/open-source implementation. */ #include #include #include "nlopt-util.h" #if defined(HAVE_STDINT_H) # include #endif #ifndef HAVE_UINT32_T # if SIZEOF_UNSIGNED_LONG == 4 typedef unsigned long uint32_t; # elif SIZEOF_UNSIGNED_INT == 4 typedef unsigned int uint32_t; # else # error No 32-bit unsigned integer type # endif #endif typedef struct nlopt_soboldata_s { unsigned sdim; /* dimension of sequence being generated */ uint32_t *mdata; /* array of length 32 * sdim */ uint32_t *m[32]; /* more convenient pointers to mdata, of direction #s */ uint32_t *x; /* previous x = x_n, array of length sdim */ unsigned *b; /* position of fixed point in x[i] is after bit b[i] */ uint32_t n; /* number of x's generated so far */ } soboldata; /* Return position (0, 1, ...) of rightmost (least-significant) zero bit in n. * * This code uses a 32-bit version of algorithm to find the rightmost * one bit in Knuth, _The Art of Computer Programming_, volume 4A * (draft fascicle), section 7.1.3, "Bitwise tricks and * techniques." * * Assumes n has a zero bit, i.e. n < 2^32 - 1. * */ static unsigned rightzero32(uint32_t n) { #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ > 3) return __builtin_ctz(~n); /* gcc builtin for version >= 3.4 */ #else const uint32_t a = 0x05f66a47; /* magic number, found by brute force */ static const unsigned decode[32] = { 0, 1, 2, 26, 23, 3, 15, 27, 24, 21, 19, 4, 12, 16, 28, 6, 31, 25, 22, 14, 20, 18, 11, 5, 30, 13, 17, 10, 29, 9, 8, 7 }; n = ~n; /* change to rightmost-one problem */ #ifdef _MSC_VER #pragma warning(suppress:4146) n = a * (n & (-n)); /* same as below, but suppress spurious warning/error with MS compiler about negating unsigned int */ #else n = a * (n & (-n)); /* store in n to make sure mult. is 32 bits */ #endif return decode[n >> 27]; #endif } /* generate the next term x_{n+1} in the Sobol sequence, as an array x[sdim] of numbers in (0,1). Returns 1 on success, 0 on failure (if too many #'s generated) */ static int sobol_gen(soboldata * sd, double *x) { unsigned c, b, i, sdim; if (sd->n == 4294967295U) return 0; /* n == 2^32 - 1 ... we would need to switch to a 64-bit version to generate more terms. */ c = rightzero32(sd->n++); sdim = sd->sdim; for (i = 0; i < sdim; ++i) { b = sd->b[i]; if (b >= c) { sd->x[i] ^= sd->m[c][i] << (b - c); x[i] = ((double) (sd->x[i])) / (1U << (b + 1)); } else { sd->x[i] = (sd->x[i] << (c - b)) ^ sd->m[c][i]; sd->b[i] = c; x[i] = ((double) (sd->x[i])) / (1U << (c + 1)); } } return 1; } #include "soboldata.h" static int sobol_init(soboldata * sd, unsigned sdim) { unsigned i, j; if (!sdim || sdim > MAXDIM) return 0; sd->mdata = (uint32_t *) malloc(sizeof(uint32_t) * (sdim * 32)); if (!sd->mdata) return 0; for (j = 0; j < 32; ++j) { sd->m[j] = sd->mdata + j * sdim; sd->m[j][0] = 1; /* special-case Sobol sequence */ } for (i = 1; i < sdim; ++i) { uint32_t a = sobol_a[i - 1]; unsigned d = 0, k; while (a) { ++d; a >>= 1; } d--; /* d is now degree of poly */ /* set initial values of m from table */ for (j = 0; j < d; ++j) sd->m[j][i] = sobol_minit[j][i - 1]; /* fill in remaining values using recurrence */ for (j = d; j < 32; ++j) { a = sobol_a[i - 1]; sd->m[j][i] = sd->m[j - d][i]; for (k = 0; k < d; ++k) { sd->m[j][i] ^= ((a & 1) * sd->m[j - d + k][i]) << (d - k); a >>= 1; } } } sd->x = (uint32_t *) malloc(sizeof(uint32_t) * sdim); if (!sd->x) { free(sd->mdata); return 0; } sd->b = (unsigned *) malloc(sizeof(unsigned) * sdim); if (!sd->b) { free(sd->x); free(sd->mdata); return 0; } for (i = 0; i < sdim; ++i) { sd->x[i] = 0; sd->b[i] = 0; } sd->n = 0; sd->sdim = sdim; return 1; } static void sobol_destroy(soboldata * sd) { free(sd->mdata); free(sd->x); free(sd->b); } /************************************************************************/ /* NLopt API to Sobol sequence creation, which hides soboldata structure behind an opaque pointer */ nlopt_sobol nlopt_sobol_create(unsigned sdim) { nlopt_sobol s = (nlopt_sobol) malloc(sizeof(soboldata)); if (!s) return NULL; if (!sobol_init(s, sdim)) { free(s); return NULL; } return s; } extern void nlopt_sobol_destroy(nlopt_sobol s) { if (s) { sobol_destroy(s); free(s); } } /* next vector x[sdim] in Sobol sequence, with each x[i] in (0,1) */ void nlopt_sobol_next01(nlopt_sobol s, double *x) { if (!sobol_gen(s, x)) { /* fall back on pseudo random numbers in the unlikely event that we exceed 2^32-1 points */ unsigned i; for (i = 0; i < s->sdim; ++i) x[i] = nlopt_urand(0.0, 1.0); } } /* next vector in Sobol sequence, scaled to (lb[i], ub[i]) interval */ void nlopt_sobol_next(nlopt_sobol s, double *x, const double *lb, const double *ub) { unsigned i, sdim; nlopt_sobol_next01(s, x); for (sdim = s->sdim, i = 0; i < sdim; ++i) x[i] = lb[i] + (ub[i] - lb[i]) * x[i]; } /* if we know in advance how many points (n) we want to compute, then adopt the suggestion of the Joe and Kuo paper, which in turn is taken from Acworth et al (1998), of skipping a number of points equal to the largest power of 2 smaller than n */ void nlopt_sobol_skip(nlopt_sobol s, unsigned n, double *x) { if (s) { unsigned k = 1; while (k * 2 < n) k *= 2; while (k-- > 0) sobol_gen(s, x); } } stevengj-nlopt-88c424d/src/util/sobolseq_test.c000066400000000000000000000051711521061417600216400ustar00rootroot00000000000000/* Copyright (c) 2007 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "nlopt-util.h" #define MAXDIM 1111 /* test integrand from Joe and Kuo paper ... integrates to 1 */ static double testfunc(unsigned n, const double *x) { double f = 1; unsigned j; for (j = 1; j <= n; ++j) { double cj = pow((double) j, 0.3333333333333333333); f *= (fabs(4 * x[j - 1] - 2) + cj) / (1 + cj); } return f; } int main(int argc, char **argv) { unsigned n, j, i, sdim; static double x[MAXDIM]; double testint_sobol = 0, testint_rand = 0; nlopt_sobol s; if (argc < 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } nlopt_init_genrand(time(NULL)); sdim = atoi(argv[1]); s = nlopt_sobol_create(sdim); n = atoi(argv[2]); nlopt_sobol_skip(s, n, x); for (j = 1; j <= n; ++j) { nlopt_sobol_next01(s, x); testint_sobol += testfunc(sdim, x); if (j < 100) { printf("x[%u]: %g", j, x[0]); for (i = 1; i < sdim; ++i) printf(", %g", x[i]); printf("\n"); } for (i = 0; i < sdim; ++i) x[i] = nlopt_urand(0., 1.); testint_rand += testfunc(sdim, x); } nlopt_sobol_destroy(s); printf("Test integral = %g using Sobol, %g using pseudorandom.\n", testint_sobol / n, testint_rand / n); printf(" error = %g using Sobol, %g using pseudorandom.\n", testint_sobol / n - 1, testint_rand / n - 1); return 0; } stevengj-nlopt-88c424d/src/util/stop.c000066400000000000000000000174311521061417600177410ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include "nlopt-util.h" /* utility routines to implement the various stopping criteria */ static double sc(double x, double smin, double smax) { return smin + x * (smax - smin); } static double vector_norm(unsigned n, const double *vec, const double *w, const double *scale_min, const double *scale_max) { unsigned i; double ret = 0; if (scale_min && scale_max) { if (w) for (i = 0; i < n; i++) ret += w[i] * fabs(sc(vec[i], scale_min[i], scale_max[i])); else for (i = 0; i < n; i++) ret += fabs(sc(vec[i], scale_min[i], scale_max[i])); } else { if (w) for (i = 0; i < n; i++) ret += w[i] * fabs(vec[i]); else for (i = 0; i < n; i++) ret += fabs(vec[i]); } return ret; } static double diff_norm(unsigned n, const double *x, const double *oldx, const double *w, const double *scale_min, const double *scale_max) { unsigned i; double ret = 0; if (scale_min && scale_max) { if (w) for (i = 0; i < n; i++) ret += w[i] * fabs(sc(x[i], scale_min[i], scale_max[i]) - sc(oldx[i], scale_min[i], scale_max[i])); else for (i = 0; i < n; i++) ret += fabs(sc(x[i], scale_min[i], scale_max[i]) - sc(oldx[i], scale_min[i], scale_max[i])); } else { if (w) for (i = 0; i < n; i++) ret += w[i] * fabs(x[i] - oldx[i]); else for (i = 0; i < n; i++) ret += fabs(x[i] - oldx[i]); } return ret; } static int relstop(double vold, double vnew, double reltol, double abstol) { if (nlopt_isinf(vold)) return 0; return (fabs(vnew - vold) < abstol || fabs(vnew - vold) < reltol * (fabs(vnew) + fabs(vold)) * 0.5 || (reltol > 0 && vnew == vold)); /* catch vnew == vold == 0 */ } int nlopt_stop_ftol(const nlopt_stopping * s, double f, double oldf) { return (relstop(oldf, f, s->ftol_rel, s->ftol_abs)); } int nlopt_stop_f(const nlopt_stopping * s, double f, double oldf) { return (f <= s->minf_max || nlopt_stop_ftol(s, f, oldf)); } int nlopt_stop_x(const nlopt_stopping * s, const double *x, const double *oldx) { unsigned i; if (diff_norm(s->n, x, oldx, s->x_weights, NULL, NULL) < s->xtol_rel * vector_norm(s->n, x, s->x_weights, NULL, NULL)) return 1; if (!s->xtol_abs) return 0; for (i = 0; i < s->n; ++i) if (fabs(x[i] - oldx[i]) >= s->xtol_abs[i]) return 0; return 1; } int nlopt_stop_dx(const nlopt_stopping * s, const double *x, const double *dx) { unsigned i; if (vector_norm(s->n, dx, s->x_weights, NULL, NULL) < s->xtol_rel * vector_norm(s->n, x, s->x_weights, NULL, NULL)) return 1; if (!s->xtol_abs) return 0; for (i = 0; i < s->n; ++i) if (fabs(dx[i]) >= s->xtol_abs[i]) return 0; return 1; } /* some of the algorithms rescale x to a unit hypercube, so we need to scale back before we can compare to the tolerances */ int nlopt_stop_xs(const nlopt_stopping * s, const double *xs, const double *oldxs, const double *scale_min, const double *scale_max) { unsigned i; if (diff_norm(s->n, xs, oldxs, s->x_weights, scale_min, scale_max) < s->xtol_rel * vector_norm(s->n, xs, s->x_weights, scale_min, scale_max)) return 1; if (!s->xtol_abs) return 0; for (i = 0; i < s->n; ++i) if (fabs(sc(xs[i], scale_min[i], scale_max[i]) - sc(oldxs[i], scale_min[i], scale_max[i])) >= s->xtol_abs[i]) return 0; return 1; } int nlopt_stop_evals(const nlopt_stopping * s) { return (s->maxeval > 0 && *(s->nevals_p) >= s->maxeval); } int nlopt_stop_time_(double start, double maxtime) { return (maxtime > 0 && nlopt_seconds() - start >= maxtime); } int nlopt_stop_time(const nlopt_stopping * s) { return nlopt_stop_time_(s->start, s->maxtime); } int nlopt_stop_evalstime(const nlopt_stopping * stop) { return nlopt_stop_evals(stop) || nlopt_stop_time(stop); } int nlopt_stop_forced(const nlopt_stopping * stop) { return stop->force_stop && *(stop->force_stop); } unsigned nlopt_count_constraints(unsigned p, const nlopt_constraint * c) { unsigned i, count = 0; for (i = 0; i < p; ++i) count += c[i].m; return count; } unsigned nlopt_max_constraint_dim(unsigned p, const nlopt_constraint * c) { unsigned i, max_dim = 0; for (i = 0; i < p; ++i) if (c[i].m > max_dim) max_dim = c[i].m; return max_dim; } void nlopt_eval_constraint(double *result, double *grad, const nlopt_constraint * c, unsigned n, const double *x) { if (c->f) result[0] = c->f(n, x, grad, c->f_data); else c->mf(c->m, result, n, x, grad, c->f_data); } char *nlopt_vsprintf(char *p, const char *format, va_list ap) { size_t len = strlen(format) + 128; int ret; p = (char *) realloc(p, len); if (!p) abort(); /* TODO: check HAVE_VSNPRINTF, and fallback to vsprintf otherwise */ while ((ret = vsnprintf(p, len, format, ap)) < 0 || (size_t) ret >= len) { /* C99 vsnprintf returns the required number of bytes (excluding \0) if the buffer is too small; older versions (e.g. MS) return -1 */ len = ret >= 0 ? (size_t) (ret + 1) : (len * 3) >> 1; p = (char *) realloc(p, len); if (!p) abort(); } return p; } void nlopt_stop_msg(const nlopt_stopping * s, const char *format, ...) { va_list ap; if (s->stop_msg) { va_start(ap, format); *(s->stop_msg) = nlopt_vsprintf(*(s->stop_msg), format, ap); va_end(ap); } } /*************************************************************************/ int nlopt_isinf(double x) { return (fabs(x) >= HUGE_VAL * 0.99) #if defined(HAVE_ISINF) || isinf(x) #else || (!nlopt_isnan(x) && nlopt_isnan(x - x)) #endif ; } int nlopt_isfinite(double x) { return (fabs(x) <= DBL_MAX) #if defined(HAVE_ISFINITE) || isfinite(x) #elif defined(_WIN32) || _finite(x) #endif ; } int nlopt_istiny(double x) { if (x == 0.0) return 1; else { #if defined(HAVE_FPCLASSIFY) return fpclassify(x) == FP_SUBNORMAL; #elif defined(_WIN32) int c = _fpclass(x); return c == _FPCLASS_ND || c == _FPCLASS_PD; #else return fabs(x) < 2.2250738585072014e-308; /* assume IEEE 754 double */ #endif } } int nlopt_isnan(double x) { #if defined(HAVE_ISNAN) return isnan(x); #elif defined(_WIN32) return _isnan(x); #else return (x != x); /* might fail with aggressive optimization */ #endif } stevengj-nlopt-88c424d/src/util/timer.c000066400000000000000000000060701521061417600200710ustar00rootroot00000000000000/* Copyright (c) 2007-2014 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "nlopt-util.h" #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #if defined(_WIN32) || defined(__WIN32__) # include #endif /* return time in seconds since some arbitrary point in the past */ double nlopt_seconds(void) { static THREADLOCAL int start_inited = 0; /* whether start time has been initialized */ #if defined(HAVE_GETTIMEOFDAY) static THREADLOCAL struct timeval start; struct timeval tv; if (!start_inited) { start_inited = 1; gettimeofday(&start, NULL); } gettimeofday(&tv, NULL); return (tv.tv_sec - start.tv_sec) + 1.e-6 * (tv.tv_usec - start.tv_usec); #elif defined(HAVE_TIME) return (double)time(NULL); #elif defined(_WIN32) || defined(__WIN32__) static THREADLOCAL ULONGLONG start; FILETIME ft; if (!start_inited) { start_inited = 1; GetSystemTimeAsFileTime(&ft); start = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime; } GetSystemTimeAsFileTime(&ft); return 100e-9 * (((((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime) - start); #else /* use clock() as a fallback... this is somewhat annoying because clock() may wrap around with a fairly short period */ static THREADLOCAL clock_t start; if (!start_inited) { start_inited = 1; start = clock(); } return (clock() - start) * 1.0 / CLOCKS_PER_SEC; #endif } /* number based on time for use as random seed */ unsigned long nlopt_time_seed(void) { #if defined(HAVE_GETTIMEOFDAY) struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec ^ tv.tv_usec); #elif defined(HAVE_TIME) return (unsigned long)time(NULL); #elif defined(_WIN32) || defined(__WIN32__) FILETIME ft; GetSystemTimeAsFileTime(&ft); return ft.dwHighDateTime ^ ft.dwLowDateTime; #else return clock(); #endif } stevengj-nlopt-88c424d/test/000077500000000000000000000000001521061417600160155ustar00rootroot00000000000000stevengj-nlopt-88c424d/test/CMakeLists.txt000066400000000000000000000131041521061417600205540ustar00rootroot00000000000000add_custom_target (tests) macro(NLOPT_add_cpp_test test_name) if (NLOPT_CXX) add_executable (${test_name} ${test_name}.cxx) target_link_libraries (${test_name} PRIVATE ${nlopt_lib}) add_dependencies (tests ${test_name}) target_include_directories (${test_name} PRIVATE ${NLOPT_PRIVATE_INCLUDE_DIRS}) foreach(arg IN ITEMS ${ARGN}) add_test (NAME check_${test_name}_${arg} COMMAND ${test_name} ${arg}) if (CMAKE_HOST_SYSTEM_NAME MATCHES Windows) set_tests_properties (check_${test_name}_${arg} PROPERTIES ENVIRONMENT "PATH=${PROJECT_BINARY_DIR}\\${CMAKE_BUILD_TYPE};$ENV{PATH}") # to load dll endif () endforeach() endif () endmacro() NLOPT_add_cpp_test(t_tutorial 24 25 31 40) NLOPT_add_cpp_test(cpp_functor 0) NLOPT_add_cpp_test(t_fbound 0) NLOPT_add_cpp_test(t_except 1 0) NLOPT_add_cpp_test(t_bounded 0 1 2 3 4 5 6 7 8 19 35 42 43) # have to add timer.c and mt19937ar.c as symbols are declared extern set (testopt_sources testfuncs.c testfuncs.h testopt.c ${PROJECT_SOURCE_DIR}/src/util/timer.c ${PROJECT_SOURCE_DIR}/src/util/mt19937ar.c) if (NOT HAVE_GETOPT OR NOT HAVE_GETOPT_H) list (APPEND testopt_sources ${PROJECT_SOURCE_DIR}/src/util/nlopt-getopt.c) endif () add_executable (testopt ${testopt_sources}) target_link_libraries (testopt PRIVATE ${nlopt_lib}) target_include_directories (testopt PRIVATE ${NLOPT_PRIVATE_INCLUDE_DIRS}) add_dependencies (tests testopt) if (NLOPT_CXX) set_target_properties(testopt PROPERTIES LINKER_LANGUAGE CXX) endif () foreach (algo_index RANGE 28) # 42 foreach (obj_index RANGE 1) # 21 set (enable_ TRUE) # cxx ags/stogo if (NOT NLOPT_CXX) if (algo_index STREQUAL 8 OR algo_index STREQUAL 9 OR algo_index STREQUAL 42) set (enable_ FALSE) endif () endif () # nocedal if (algo_index STREQUAL 10) set (enable_ FALSE) endif () if (enable_) add_test (NAME testopt_algo${algo_index}_obj${obj_index} COMMAND testopt -r 0 -a ${algo_index} -o ${obj_index}) if (CMAKE_HOST_SYSTEM_NAME MATCHES Windows) set_tests_properties (testopt_algo${algo_index}_obj${obj_index} PROPERTIES ENVIRONMENT "PATH=${PROJECT_BINARY_DIR}\\${CMAKE_BUILD_TYPE};$ENV{PATH}") # to load dll endif () # Check if LUKSAN targets are available. if (NOT NLOPT_LUKSAN) set (list_of_algorithms_requiring_luksan 10 11 12 13 14 15 16 17 18) if (algo_index IN_LIST list_of_algorithms_requiring_luksan) set_tests_properties (testopt_algo${algo_index}_obj${obj_index} PROPERTIES DISABLED TRUE) endif() endif() endif () endforeach () endforeach () if (TARGET nlopt_python) set (PYINSTALLCHECK_ENVIRONMENT "LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/src/swig" "PYTHONPATH=$" ) foreach (algo_index 24 25 31 40) add_test (NAME test_python${algo_index} COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_python.py ${algo_index}) set_tests_properties (test_python${algo_index} PROPERTIES ENVIRONMENT "${PYINSTALLCHECK_ENVIRONMENT}") endforeach() add_test (NAME test_memoize COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_memoize.py ${algo_index}) set_tests_properties (test_memoize PROPERTIES ENVIRONMENT "${PYINSTALLCHECK_ENVIRONMENT}") endif () # The test uses lambdas and the :: operator, which were introduced in Java 1.8. # The binding itself should also compile with more ancient Java versions that # have already reached their end of life, but it is not worth uglifying the test # code for them, because people will then cargo-cult the legacy boilerplate. if (TARGET nlopt_java AND NOT Java_VERSION VERSION_LESS 1.8) include (UseJava) add_jar (t_java SOURCES t_java.java INCLUDE_JARS nlopt_jar ENTRY_POINT t_java) get_property (t_java_jar TARGET t_java PROPERTY JAR_FILE) get_property (nlopt_jar_jar TARGET nlopt_jar PROPERTY JAR_FILE) set (nlopt_java_dir $) foreach (algo_index 24 25 31 40) add_test (NAME test_java${algo_index} COMMAND ${Java_JAVA_EXECUTABLE} -cp "$" -Djava.library.path=${nlopt_java_dir} t_java ${algo_index}) endforeach() endif () if (TARGET nlopt_optimize) add_test (NAME test_octave COMMAND ${OCTAVE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_octave.m ${PROJECT_SOURCE_DIR}/src/octave ${PROJECT_BINARY_DIR}/src/octave) endif () if (TARGET nlopt_optimize-mex) add_test (NAME test_matlab COMMAND ${Matlab_MAIN_PROGRAM} -nodesktop -nosplash -r "addpath('${PROJECT_SOURCE_DIR}/src/octave'); addpath('${PROJECT_BINARY_DIR}/src/octave'); try; run('${CMAKE_CURRENT_SOURCE_DIR}/t_matlab.m'); catch; exit(1); end; quit") endif () if (TARGET nlopt_guile) set (GUILECHECK_ENVIRONMENT "LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/src/swig" "GUILE_LOAD_PATH=$" "GUILE_AUTO_COMPILE=0") add_test (NAME test_guile COMMAND ${GUILE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_guile.scm WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/src/swig) set_tests_properties (test_guile PROPERTIES ENVIRONMENT "${GUILECHECK_ENVIRONMENT}") endif () if (NLOPT_FORTRAN) add_executable (t_fortran t_fortran.f90) target_link_libraries (t_fortran PRIVATE ${nlopt_lib}) target_include_directories (t_fortran PRIVATE ${NLOPT_PRIVATE_INCLUDE_DIRS}) add_test (NAME test_fortran COMMAND t_fortran) endif () stevengj-nlopt-88c424d/test/box.c000066400000000000000000000125731521061417600167610ustar00rootroot00000000000000#include #include #include "nlopt.h" /****************************************************************************/ /* test function from M. J. Box, "A new method of constrained optimization and a comparison with other methods," Computer J. 8 (1), 42-52 (1965) */ int testfuncs_verbose = 1; int testfuncs_counter = 0; static double testfuncs_status(int n, const double *x, double f) { ++testfuncs_counter; if (testfuncs_verbose) { int i; printf("f_%d (%g", testfuncs_counter, x[0]); for (i = 1; i < n; ++i) printf(", %g", x[i]); printf(") = %g\n", f); } return f; } #define RETURN(f) return testfuncs_status(n, x, f); static const double k1 = -145421.402, k2 = 2931.1506, k3 = -40.427932, k4 = 5106.192, k5 = 15711.36, k6 = -161622.577, k7 = 4176.15328, k8 = 2.8260078, k9 = 9200.476, k10 = 13160.295, k11 = -21686.9194, k12 = 123.56928, k13 = -21.1188894, k14 = 706.834, k15 = 2898.573, k16 = 28298.388, k17 = 60.81096, k18 = 31.242116, k19 = 329.574, k20 = -2882.082, k21 = 74095.3845, k22 = -306.262544, k23 = 16.243649, k24 = -3094.252, k25 = -5566.2628, k26 = -26237, k27 = 99, k28 = -0.42, k29 = 1300, k30 = 2100, k31 = 925548.252, k32 = -61968.8432, k33 = 23.3088196, k34 = -27096.648, k35 = -50843.766; static double box(int n, const double *x, double *grad, void *data) { double x1 = x[0], x2 = x[1], x3 = x[2], x4 = x[3], x5 = x[4]; double b, x6, y1, y2, y3, y4, u; const double a0 = 9, a1 = 15, a2 = 50, a3 = 9.583, a4 = 20, a5 = 15, a6 = 6, a7 = 0.75; b = x2 + 0.01 * x3; x6 = (k1 + k2 * x2 + k3 * x3 + k4 * x4 + k5 * x5) * x1; y1 = k6 + k7 * x2 + k8 * x3 + k9 * x4 + k10 * x5; y2 = k11 + k12 * x2 + k13 * x3 + k14 * x4 + k15 * x5; y3 = k16 + k17 * x2 + k18 * x3 + k19 * x4 + k20 * x5; y4 = k21 + k22 * x2 + k23 * x3 + k24 * x4 + k25 * x5; u = a2 * y1 + a3 * y2 + a4 * y3 + a5 * y4 + 7840 * a6 - 100000 * a0 - 50800 * b * a7 + k31 + k32 * x2 + k33 * x3 + k34 * x4 + k35 * x5; if (grad) { int i; grad[0] = u + a1 * (k1 + k2 * x2 + k3 * x3 + k4 * x4 + k5 * x5); grad[1] = x1 * (a2 * k7 + a3 * k12 + a4 * k17 + a5 * k22 - 50800 * a7 + k32) + a1 * (k2 * x1); grad[2] = x1 * (a2 * k8 + a3 * k13 + a4 * k18 + a5 * k23 - 50800 * a7 * 0.01) + a1 * x1 * k3; grad[3] = x1 * (a2 * k9 + a3 * k14 + a4 * k19 + a5 * k24) + a1 * x1 * k4; grad[4] = x1 * (a2 * k10 + a3 * k15 + a4 * k20 + a5 * k25) + a1 * x1 * k5; for (i = 0; i < 5; ++i) grad[i] = -grad[i]; } RETURN(-(u * x1 - 24345 + a1 * x6)); } static double box_constraint(int n, const double *x, double *grad, void *data) { int which_constraint = *((int *) data); double x1 = x[0], x2 = x[1], x3 = x[2], x4 = x[3], x5 = x[4]; double x6, y1, y2, y3, x7, x8; int i; x6 = (k1 + k2 * x2 + k3 * x3 + k4 * x4 + k5 * x5) * x1; y1 = k6 + k7 * x2 + k8 * x3 + k9 * x4 + k10 * x5; y2 = k11 + k12 * x2 + k13 * x3 + k14 * x4 + k15 * x5; y3 = k16 + k17 * x2 + k18 * x3 + k19 * x4 + k20 * x5; x7 = (y1 + y2 + y3) * x1; x8 = (k26 + k27 * x2 + k28 * x3 + k29 * x4 + k30 * x5) * x1 + x6 + x7; if (grad) { grad[0] = grad[1] = grad[2] = grad[3] = grad[4] = 0; if (which_constraint != 2 && which_constraint != -2) { /* grad x6 */ grad[0] += (k1 + k2 * x2 + k3 * x3 + k4 * x4 + k5 * x5); grad[1] += x1 * k2; grad[2] += x1 * k3; grad[3] += x1 * k4; grad[4] += x1 * k5; } if (which_constraint != 1 && which_constraint != -1) { /* grad x7 */ grad[0] += (y1 + y2 + y3); grad[1] += x1 * (k7 + k12 + k17); grad[2] += x1 * (k8 + k13 + k18); grad[3] += x1 * (k9 + k14 + k19); grad[4] += x1 * (k10 + k15 + k20); } if (which_constraint == 3 || which_constraint == -3) { /* grad (x8 - x6 - x7) */ grad[0] += k26 + k27 * x2 + k28 * x3 + k29 * x4 + k30 * x5; grad[1] += x1 * k27; grad[2] += x1 * k28; grad[3] += x1 * k29; grad[4] += x1 * k30; } } if (which_constraint == -1) { if (grad) for (i = 0; i < 5; ++i) grad[i] = -grad[i]; return -x6; } else if (which_constraint == 1) { return x6 - 294000; } else if (which_constraint == -2) { if (grad) for (i = 0; i < 5; ++i) grad[i] = -grad[i]; return -x7; } else if (which_constraint == 2) { return x7 - 294000; } else if (which_constraint == -3) { if (grad) for (i = 0; i < 5; ++i) grad[i] = -grad[i]; return -x8; } else if (which_constraint == 3) { return x8 - 277200; } return 0; } int main(void) { const double box_lb[5] = { 0, 1.2, 20, 9, 6.5 }; const double box_ub[5] = { HUGE_VAL, 2.4, 60, 9.3, 7.0 }; const double box_xmin[5] = { 4.53743, 2.4, 60, 9.3, 7.0 }; int cdata[6] = { -1, 1, -2, 2, -3, 3 }; double x[5] = { 2.52, 2, 37.5, 9.25, 6.8 }; double minf; nlopt_minimize_constrained(NLOPT_LN_COBYLA, 5, box, NULL, 6, box_constraint, cdata, sizeof(int), box_lb, box_ub, x, &minf, -HUGE_VAL, 1e-10, 0, 0, NULL, 0, 0); printf("found f(%g,%g,%g,%g,%g) = %0.8f after %d iters\n", x[0], x[1], x[2], x[3], x[4], minf, testfuncs_counter); return 0; } stevengj-nlopt-88c424d/test/cpp_functor.cxx000066400000000000000000000121561521061417600210700ustar00rootroot00000000000000#include #include #include // setprecision #include // to_string #include // inner_product #include // move #include // copy #include // assert #include // sin, cos #include typedef std::vector Vector; class QuadraticForm { /* * This class represents a quadratic form (½ xᵀAx + bᵀx) and provides two * methods to compute itself and its gradient. * * Input is always a (const double*) which has appropriate dimension. */ private: Vector A; // symmetric matrix Vector b; // bias size_t dimension; Vector compute_A_times_x(const double* x) const { Vector A_times_x(dimension); for (size_t row = 0; row < dimension; ++row) { A_times_x[row] = dot(x, A, row * dimension); } return A_times_x; } double compute_quadratic_term(const double* x) const { auto A_times_x = compute_A_times_x(x); return 0.5 * dot(x, A_times_x); } double compute_linear_term(const double* x) const { return dot(x, b); } double dot(const double* x, const Vector& y, const size_t offset = 0) const { return std::inner_product( x, x + dimension, std::begin(y) + offset, double(0)); } public: QuadraticForm() = delete; QuadraticForm(Vector A_, Vector b_) : A(std::move(A_)), b(std::move(b_)) { if (A.size() != b.size() * b.size()) { throw std::runtime_error( "[QuadraticForm] matrix and bias dimension mismatch: " + std::to_string(A.size()) + " != " + std::to_string(b.size() * b.size())); } dimension = b.size(); } double compute_form(const double* x) const { // ½ xᵀAx + bᵀx return compute_quadratic_term(x) + compute_linear_term(x); } void compute_gradient_in_place(const double* x, double* grad_array) const { // matrix is assumed symmetric, hence gradient is (Ax + b) Vector grad_vec = compute_A_times_x(x); auto b_iterator = std::begin(b); for (auto it = std::begin(grad_vec); it != std::end(grad_vec); ) { *it++ += *b_iterator++; } std::copy(std::begin(grad_vec), std::end(grad_vec), grad_array); } }; // QuadraticForm class LinearRegression { private: QuadraticForm quadratic_form; public: LinearRegression() = delete; LinearRegression(QuadraticForm quadratic_form_) : quadratic_form(std::move(quadratic_form_)) {} double operator()(unsigned /*n*/, const double* x, double* grad) const { const double result = quadratic_form.compute_form(x); if (!!grad) { quadratic_form.compute_gradient_in_place(x, grad); } return result; } }; // LinearRegression class SineRegression { private: QuadraticForm quadratic_form; public: SineRegression() = delete; SineRegression(QuadraticForm quadratic_form_) : quadratic_form(std::move(quadratic_form_)) {} double operator()(unsigned n, const double* x, double* grad) const { const double form_result = quadratic_form.compute_form(x); const double result = sin(form_result); if (!!grad) { const double grad_coefficient = cos(form_result); quadratic_form.compute_gradient_in_place(x, grad); for (size_t i = 0; i < n; ++i) { grad[i] *= grad_coefficient; } } return result; } }; // SineRegression int main() { // quadratic form is positive-definite for tau ∈ [-1, 2] constexpr double tau = 1.5; constexpr size_t dimension = 3; Vector A = { 2, -1, tau, -1, 2, -1, tau, -1, 2 }; Vector b = { -3, 8, 1 }; assert(b.size() == dimension); assert(A.size() == dimension * dimension); QuadraticForm form(std::move(A), std::move(b)); LinearRegression objective_1(form); SineRegression objective_2(std::move(form)); nlopt::opt optimizer("LD_MMA", dimension); optimizer.set_xtol_rel(1e-4); optimizer.set_maxeval(1000); // linear regression optimization optimizer.set_min_objective(std::move(objective_1)); double minimum = 0.0; Vector x0 = {-1.0, 0.0, 0.1}; try { optimizer.optimize(x0, minimum); } catch (const std::exception& e) { std::cerr << "NLopt failed: " << e.what() << std::endl; return EXIT_FAILURE; } std::cout << "-- Linear regression --" << std::endl; std::cout << "found minimum at f(" << x0[0] << "," << x0[1] << "," << x0[2] << ") = " << std::setprecision(10) << minimum << std::endl << std::endl; // sine regression optimization optimizer.set_min_objective(std::move(objective_2)); minimum = 0.0; x0 = {-1.0, 0.0, 0.1}; try { optimizer.optimize(x0, minimum); } catch (const std::exception& e) { std::cerr << "NLopt failed: " << e.what() << std::endl; return EXIT_FAILURE; } std::cout << "-- Sine regression --" << std::endl; std::cout << "found minimum at f(" << x0[0] << "," << x0[1] << "," << x0[2] << ") = " << std::setprecision(10) << minimum << std::endl; return 0; } stevengj-nlopt-88c424d/test/lorentzfit.c000066400000000000000000000053471521061417600203720ustar00rootroot00000000000000#include #include #include #include typedef struct { int N; double *x, *y; /* length N; */ } lorentzdata; static double sqr(double x) { return x * x; } static int count = 0; static double lorentzerr(int n, const double *p, double *grad, void *data) { lorentzdata *d = (lorentzdata *) data; int N = d->N; const double *xs = d->x; const double *ys = d->y; double val = 0; int i, j; for (i = 0; i < N; ++i) { double x = xs[i], y = ys[i]; double lorsum = 0; for (j = 0; j < n; j += 3) { double A = p[j + 0]; double w = p[j + 1]; double G = p[j + 2]; double lor = A / (sqr(x - w) + G * G); lorsum += lor; } val += sqr(y - lorsum); if (grad) for (j = 0; j < n; j += 3) { double A = p[j + 0]; double w = p[j + 1]; double G = p[j + 2]; double deninv = 1.0 / (sqr(x - w) + G * G); grad[j + 0] += -2 * (y - lorsum) * deninv; grad[j + 1] += 4 * A * (w - x) * (y - lorsum) * sqr(deninv); grad[j + 2] += 4 * A * G * (y - lorsum) * sqr(deninv); } } ++count; // printf("%d: f(%g,%g,%g) = %g\n", count, p[0],p[1],p[2], val); return val; } extern double nlopt_urand(double a, double b); int main(void) { lorentzdata d; int i; double A = 1, w = 0, G = 1, noise = 0.01; double lb[3] = { -HUGE_VAL, -HUGE_VAL, 0 }; double ub[3] = { HUGE_VAL, HUGE_VAL, HUGE_VAL }; double p[3] = { 0, 1, 2 }, minf; nlopt_srand_time(); d.N = 200; d.x = (double *) malloc(sizeof(double) * d.N * 2); d.y = d.x + d.N; for (i = 0; i < d.N; ++i) { d.x[i] = nlopt_urand(-0.5, 0.5) * 8 * G + w; d.y[i] = 2 * noise * nlopt_urand(-0.5, 0.5) + A / (sqr(d.x[i] - w) + G * G); } nlopt_minimize(NLOPT_LN_NEWUOA_BOUND, 3, lorentzerr, &d, lb, ub, p, &minf, -HUGE_VAL, 0, 0, 1e-6, NULL, 0, 0); printf("%d minf=%g at A=%g, w=%g, G=%g\n", count, minf, p[0], p[1], p[2]); count = 0; nlopt_minimize(NLOPT_LN_COBYLA, 3, lorentzerr, &d, lb, ub, p, &minf, -HUGE_VAL, 0, 0, 1e-6, NULL, 0, 0); printf("%d minf=%g at A=%g, w=%g, G=%g\n", count, minf, p[0], p[1], p[2]); count = 0; nlopt_minimize(NLOPT_LN_NELDERMEAD, 3, lorentzerr, &d, lb, ub, p, &minf, -HUGE_VAL, 0, 0, 1e-6, NULL, 0, 0); printf("%d minf=%g at A=%g, w=%g, G=%g\n", count, minf, p[0], p[1], p[2]); count = 0; nlopt_minimize(NLOPT_LN_SBPLX, 3, lorentzerr, &d, lb, ub, p, &minf, -HUGE_VAL, 0, 0, 1e-6, NULL, 0, 0); printf("%d minf=%g at A=%g, w=%g, G=%g\n", count, minf, p[0], p[1], p[2]); return 0; } stevengj-nlopt-88c424d/test/myconstraint.m000066400000000000000000000002361521061417600207260ustar00rootroot00000000000000function [val, gradient] = myconstraint(x,a,b) val = (a*x(1) + b)^3 - x(2); if (nargout > 1) gradient = [3*a*(a*x(1) + b)^2, -1]; end end stevengj-nlopt-88c424d/test/myfunc.m000066400000000000000000000001771521061417600175010ustar00rootroot00000000000000function [val, gradient] = myfunc(x) val = sqrt(x(2)); if (nargout > 1) gradient = [0, 0.5 / val]; end end stevengj-nlopt-88c424d/test/t_bounded.cxx000066400000000000000000000020431521061417600205030ustar00rootroot00000000000000#include #include #include #include #include #include double myvfunc(const std::vector &x, std::vector &grad, void *data) { (void)data; if (!grad.empty()) { grad[0] = 2.0 * x[0]; grad[1] = 2.0 * x[1]; } return x[0]*x[0]+x[1]*x[1]; } int main(int argc, char *argv[]) { nlopt::opt opt(argc < 2 ? nlopt::GD_STOGO : (nlopt::algorithm)atoi(argv[1]), 2); opt.set_lower_bounds(0.0); opt.set_upper_bounds(1.0); opt.set_max_objective(myvfunc, nullptr); opt.set_maxeval(100000); std::vector x = {0.5, 0.5}; double minf = 0.0; std::cout << "algo: " << opt.get_algorithm_name() << std::endl; try{ opt.optimize(x, minf); std::cout << "found minimum at f(" << x[0] << "," << x[1] << ") = " << std::setprecision(10) << minf < #include #include #include #include #include /** * Test exception handling. Contributed by Kevin Kofler . * This tests a test case known to fail (t_bounded.cxx on LD_SLSQP) with * set_exceptions_enabled set to true if the argument is 1, false if the * argument is 0, and verifies that the exception is thrown resp. not thrown, * as expected. */ double myvfunc(const std::vector &x, std::vector &grad, void *data) { (void)data; if (!grad.empty()) { grad[0] = 2.0 * x[0]; grad[1] = 2.0 * x[1]; } return x[0]*x[0]+x[1]*x[1]; } int main(int argc, char *argv[]) { nlopt::opt opt(nlopt::LD_SLSQP, 2); if (argc >= 2) { bool enable = (bool) atoi(argv[1]); opt.set_exceptions_enabled(enable); if (opt.get_exceptions_enabled() != enable) { std::cerr << "set_exceptions_enabled(" << (enable ? "true" : "false") << ") failed" << std::endl; return EXIT_FAILURE; } } opt.set_lower_bounds(0.0); opt.set_upper_bounds(1.0); opt.set_max_objective(myvfunc, nullptr); opt.set_maxeval(100000); std::vector x = {0.5, 0.5}; double minf = 0.0; std::cout << "exceptions enabled: " << (opt.get_exceptions_enabled() ? "true" : "false") << std::endl; try{ opt.optimize(x, minf); std::cout << "no exception was thrown" << std::endl; return opt.get_exceptions_enabled() ? EXIT_FAILURE : EXIT_SUCCESS; } catch(std::exception &e) { std::cerr << "exception: " << e.what() << std::endl; return opt.get_exceptions_enabled() ? EXIT_SUCCESS : EXIT_FAILURE; } } stevengj-nlopt-88c424d/test/t_fbound.cxx000066400000000000000000000022121521061417600203360ustar00rootroot00000000000000#include #include #include #include #include #include double myvfunc(const std::vector &x, std::vector &grad, void *data) { (void)data; if (!grad.empty()) { grad[0] = 2*x[0]; grad[1] = 2*x[1]; } if (std::isnan(x[0])) throw std::invalid_argument("nan"); return -x[0]*x[0]-x[1]*x[1]; } int main() { nlopt::srand(0); for (int repeat = 0; repeat < 100; ++repeat) { std::cout << "repeat="< lb = {-1.0, -10.0}; std::vector ub = {10.0, 1.0}; opt.set_lower_bounds(lb); opt.set_upper_bounds(ub); opt.set_min_objective(myvfunc, NULL); opt.set_ftol_rel(1e-6); std::vector x = {0.5, 0.5}; double minf; try{ opt.optimize(x, minf); std::cout << "found optimum at f(" << x[0] << "," << x[1] << ") = " << std::setprecision(10) << minf < 0: # raise ValueError('Cannot suppply gradient values') grad[0] = 2.0 * (10000. * x1 * x2 - 1.) * 10000. * x2 + 2.0 * (m.exp(-x1) + m.exp(-x2) - 1.0001) * -1.0 grad[1] = 2.0 * (10000. * x1 * x2 - 1.) * 10000. * x1 + 2.0 * (m.exp(-x1) + m.exp(-x2) - 1.0001) * -1.0 # print("myfunc: x:", x, ", val:", retval) if retval < minf_ext[0]: minf_ext[0] = retval return retval for algo in range(nlopt.NUM_ALGORITHMS): if algo in [nlopt.LD_LBFGS, nlopt.LD_VAR1, nlopt.LD_VAR2]: continue opt = nlopt.opt(algo, 2) print('-'*40) print("Algo:", opt.get_algorithm_name(), algo) numFuncEval[0] = 0 minf_ext = [1e300] opt.set_min_objective(myfunc) opt.set_lower_bounds(lb) opt.set_upper_bounds(ub) opt.set_maxeval(int(1e4)) opt.set_xtol_rel(1e-4) local_opt = nlopt.opt(nlopt.LD_MMA, 2) opt.set_local_optimizer(local_opt) x0 = [0.0, 0.0] print("x0:", x0) try: x = opt.optimize(x0) minf = opt.last_optimum_value() print("optimum at ", x[0], x[1]) print("minimum value = ", minf) print("result code = ", opt.last_optimize_result()) print("num function evaluations:", numFuncEval[0]) if minf_ext[0] < minf: raise ValueError(f"minimum value {minf} is not the true minimum {minf_ext[0]}") except nlopt.invalid_argument: # stogo/ags might not be enabled pass stevengj-nlopt-88c424d/test/t_octave.m000066400000000000000000000015101521061417600177740ustar00rootroot00000000000000 arg_list = argv (); for i = 1:nargin loadpath = arg_list{i}; printf ('-- adding path: %s\n', loadpath); addpath (loadpath); endfor function [val, gradient] = myfunc(x) val = sqrt(x(2)); if (nargout > 1) gradient = [0, 0.5 / val]; end endfunction function [val, gradient] = myconstraint(x,a,b) val = (a*x(1) + b)^3 - x(2); if (nargout > 1) gradient = [3*a*(a*x(1) + b)^2, -1]; end endfunction opt.algorithm = NLOPT_LD_MMA; % opt.algorithm = NLOPT_LN_COBYLA opt.lower_bounds = [-inf, 0]; opt.min_objective = @myfunc; opt.fc = { (@(x) myconstraint(x,2,0)), (@(x) myconstraint(x,-1,1)) }; opt.fc_tol = [1e-8, 1e-8]; opt.xtol_rel = 1e-4; [xopt, fmin, retcode] = nlopt_optimize(opt, [1.234 5.678]) assert (retcode, 4); assert (fmin, 0.5443, 1e-4); assert (xopt, [0.3333, 0.2963], 1e-4); stevengj-nlopt-88c424d/test/t_python.py000066400000000000000000000020601521061417600202310ustar00rootroot00000000000000#!/usr/bin/env python import nlopt import math as m import sys def myfunc(x, grad): if grad.size > 0: grad[0] = 0.0 grad[1] = 0.5 / m.sqrt(x[1]) return m.sqrt(x[1]) def myconstraint(x, grad, a, b): if grad.size > 0: grad[0] = 3 * a * (a*x[0] + b)**2 grad[1] = -1.0 return (a*x[0] + b)**3 - x[1] algo = nlopt.LD_MMA if len(sys.argv) < 2 else int(sys.argv[1]) opt = nlopt.opt(algo, 2) print(f"algo: {opt.get_algorithm_name()}") opt.set_lower_bounds([-float('inf'), 1e-6]) opt.set_min_objective(myfunc) opt.add_inequality_constraint(lambda x, grad: myconstraint(x, grad, 2, 0), 1e-8) opt.add_inequality_constraint(lambda x, grad: myconstraint(x, grad, -1, 1), 1e-8) opt.set_xtol_rel(1e-4) x0 = [1.234, 5.678] x = opt.optimize(x0) minf = opt.last_optimum_value() print(f"optimum at {x}") print(f"minimum value: {minf:.7g}") print(f"result code: {opt.last_optimize_result()}") print(f"nevals: {opt.get_numevals()}") print(f"initial step: {opt.get_initial_step(x0)}") assert m.fabs(minf - 0.544331) < 1e-3, "wrong optimum" stevengj-nlopt-88c424d/test/t_tutorial.cxx000066400000000000000000000040251521061417600207300ustar00rootroot00000000000000#include #include #include #include #include #include double myvfunc(const std::vector &x, std::vector &grad, void *data) { (void)data; if (!grad.empty()) { grad[0] = 0.0; grad[1] = 0.5 / sqrt(x[1]); } return sqrt(x[1]); } typedef struct { double a, b; } my_constraint_data; double myvconstraint(const std::vector &x, std::vector &grad, void *data) { my_constraint_data *d = reinterpret_cast(data); double a = d->a, b = d->b; if (!grad.empty()) { grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b); grad[1] = -1.0; } return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]); } int main(int argc, char *argv[]) { nlopt::opt opt(argc < 2 ? nlopt::LD_MMA : (nlopt::algorithm)atoi(argv[1]), 2); const std::vector lb = {-HUGE_VAL, 1e-6}; opt.set_lower_bounds(lb); opt.set_min_objective(myvfunc, NULL); my_constraint_data data[2] = { {2,0}, {-1,1} }; opt.add_inequality_constraint(myvconstraint, &data[0], 1e-8); opt.add_inequality_constraint(myvconstraint, &data[1], 1e-8); opt.set_xtol_rel(1e-4); // try setting an algorithm parameter: */ opt.set_param("inner_maxeval", 123); if (opt.get_param("inner_maxeval", 1234) != 123 || opt.get_param("not a param", 1234) != 1234 || opt.num_params() != 1 || std::string(opt.nth_param(0)) != "inner_maxeval") { std::cerr << "failed to retrieve nlopt parameter" << std::endl; return EXIT_FAILURE; } // set a couple of other parameters opt.set_param("rho_init", 0.5); opt.set_initial_step(0.1); std::vector x = {1.234, 5.678}; double minf = 0.0; try{ opt.optimize(x, minf); std::cout << "found minimum at f(" << x[0] << "," << x[1] << ") = " << std::setprecision(10) << minf < #include #include "testfuncs.h" #include "nlopt_config.h" #define UNUSED(x) (void) x static double sqr(double x) { return x * x; } int testfuncs_verbose = 0; int testfuncs_counter = 0; static double testfuncs_status(unsigned n, const double *x, double f) { ++testfuncs_counter; if (testfuncs_verbose) { unsigned i; printf("f_%d (%g", testfuncs_counter, x[0]); for (i = 1; i < n; ++i) printf(", %g", x[i]); printf(") = %g\n", f); } return f; } #define RETURN(f) return testfuncs_status(n, x, f); #define PI2 6.283185307179586 /* 2*pi */ #define PI3 9.424777960769379 /* 3*pi */ #define PI4 12.5663706143592 /* 4*pi */ /****************************************************************************/ static double rosenbrock_f(unsigned n, const double *x, double *grad, void *data) { double a = x[1] - x[0] * x[0], b = 1 - x[0]; UNUSED(data); if (grad) { grad[0] = -400 * a * x[0] - 2 * b; grad[1] = 200 * a; } RETURN(100 * sqr(a) + sqr(b)); } static const double rosenbrock_lb[2] = { -2, -2 }; static const double rosenbrock_ub[2] = { 2, 2 }; static const double rosenbrock_xmin[2] = { 1, 1 }; /****************************************************************************/ static double mccormic_f(unsigned n, const double *x, double *grad, void *data) { double a = x[0] + x[1], b = x[0] - x[1]; UNUSED(data); if (grad) { grad[0] = cos(a) + 2 * b - 1.5; grad[1] = cos(a) - 2 * b + 2.5; } RETURN(sin(a) + sqr(b) - 1.5 * x[0] + 2.5 * x[1] + 1); } static const double mccormic_lb[2] = { -1.5, -3 }; static const double mccormic_ub[2] = { 4, 4 }; static const double mccormic_xmin[2] = { -0.547197553, -1.54719756 }; /****************************************************************************/ static double boxbetts_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double f = 0; UNUSED(data); if (grad) grad[0] = grad[1] = grad[2] = 0; for (i = 1; i <= 10; ++i) { double e0 = exp(-0.1 * i * x[0]); double e1 = exp(-0.1 * i * x[1]); double e2 = exp(-0.1 * i) - exp(-1.0 * i); double g = e0 - e1 - e2 * x[2]; f += sqr(g); if (grad) { grad[0] += (2 * g) * (-0.1 * i * e0); grad[1] += (2 * g) * (0.1 * i * e1); grad[2] += -(2 * g) * e2; } } RETURN(f); } static const double boxbetts_lb[3] = { 0.9, 9, 0.9 }; static const double boxbetts_ub[3] = { 1.2, 11.2, 1.2 }; static const double boxbetts_xmin[3] = { 1, 10, 1 }; /****************************************************************************/ static double paviani_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double f = 0, prod = 1; UNUSED(data); if (grad) for (i = 0; i < 10; ++i) grad[i] = 0; for (i = 0; i < 10; ++i) { double ln1 = log(x[i] - 2); double ln2 = log(10 - x[i]); f += sqr(ln1) + sqr(ln2); if (grad) grad[i] += 2 * ln1 / (x[i] - 2) - 2 * ln2 / (10 - x[i]); prod *= x[i]; } f -= (prod = pow(prod, 0.2)); if (grad) for (i = 0; i < 10; ++i) grad[i] -= 0.2 * prod / x[i]; RETURN(f); } static const double paviani_lb[10] = { 2.001, 2.001, 2.001, 2.001, 2.001, 2.001, 2.001, 2.001, 2.001, 2.001 }; static const double paviani_ub[10] = { 9.999, 9.999, 9.999, 9.999, 9.999, 9.999, 9.999, 9.999, 9.999, 9.999 }; static const double paviani_xmin[10] = { 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583, 9.35026583 }; /****************************************************************************/ static double grosenbrock_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double f = 0; UNUSED(data); if (grad) grad[0] = 0; for (i = 0; i < 29; ++i) { double a = x[i + 1] - x[i] * x[i], b = 1 - x[i]; if (grad) { grad[i] += -400 * a * x[i] - 2 * b; grad[i + 1] = 200 * a; } f += 100 * sqr(a) + sqr(b); } RETURN(f); } static const double grosenbrock_lb[30] = { -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30 }; static const double grosenbrock_ub[30] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 }; static const double grosenbrock_xmin[30] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; /****************************************************************************/ static double goldsteinprice_f(unsigned n, const double *x, double *grad, void *data) { double x0, x1, a1, a12, a2, b1, b12, b2; x0 = x[0]; x1 = x[1]; a1 = x0 + x1 + 1; a12 = sqr(a1); a2 = 19 - 14 * x0 + 3 * x0 * x0 - 14 * x1 + 6 * x0 * x1 + 3 * x1 * x1; b1 = 2 * x0 - 3 * x1; b12 = sqr(b1); b2 = 18 - 32 * x0 + 12 * x0 * x0 + 48 * x1 - 36 * x0 * x1 + 27 * x1 * x1; UNUSED(data); if (grad) { grad[0] = (1 + a12 * a2) * (2 * b1 * 2 * b2 + b12 * (-32 + 24 * x0 - 36 * x1)) + (2 * a1 * a2 + a12 * (-14 + 6 * x0 + 6 * x1)) * (30 + b12 * b2); grad[1] = (1 + a12 * a2) * (2 * b1 * (-3) * b2 + b12 * (48 - 36 * x0 + 54 * x1)) + (2 * a1 * a2 + a12 * (-14 + 6 * x0 + 6 * x1)) * (30 + b12 * b2); } RETURN((1 + a12 * a2) * (30 + b12 * b2)); } static const double goldsteinprice_lb[2] = { -2, -2 }; static const double goldsteinprice_ub[2] = { 2, 2 }; static const double goldsteinprice_xmin[2] = { 0, -1 }; /****************************************************************************/ static double shekel_f(unsigned n, const double *x, double *grad, void *data) { static const double A[10][4] = { {4, 4, 4, 4}, {1, 1, 1, 1}, {8, 8, 8, 8}, {6, 6, 6, 6}, {3, 7, 3, 7}, {2, 9, 2, 9}, {5, 5, 3, 3}, {8, 1, 8, 1}, {6, 2, 6, 2}, {7, 3.6, 7, 3.6} }; static const double c[10] = { .1, .2, .2, .4, .4, .6, .3, .7, .5, .5 }; unsigned i; double f = 0; unsigned m = *((unsigned *) data); if (grad) for (i = 0; i < n; ++i) grad[i] = 0; for (i = 0; i < m; ++i) { double fi = 1.0 / (c[i] + sqr(x[0] - A[i][0]) + sqr(x[1] - A[i][1]) + sqr(x[2] - A[i][2]) + sqr(x[3] - A[i][3])); f -= fi; if (grad) { grad[0] += (2 * fi * fi) * (x[0] - A[i][0]); grad[1] += (2 * fi * fi) * (x[1] - A[i][1]); grad[2] += (2 * fi * fi) * (x[2] - A[i][2]); grad[3] += (2 * fi * fi) * (x[3] - A[i][3]); } } RETURN(f); } static unsigned shekel_m[3] = { 5, 7, 10 }; static const double shekel_lb[4] = { 0, 0, 0, 0 }; static const double shekel_ub[4] = { 10, 10, 10, 10 }; static const double shekel0_xmin[4] = { 4.000037154, 4.000133276, 4.000037154, 4.000133276 }; static const double shekel1_xmin[4] = { 4.000572917, 4.000689366, 3.999489709, 3.999606158 }; static const double shekel2_xmin[4] = { 4.000746531, 4.000592935, 3.999663399, 3.999509801 }; /****************************************************************************/ static double levy_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double a = x[n - 1] - 1, b = 1 + sqr(sin(PI2 * x[n - 1])); double f = sqr(sin(PI3 * x[0])) + a * b; UNUSED(data); if (grad) { for (i = 0; i < n; ++i) grad[i] = 0; grad[0] = 2 * PI3 * sin(PI3 * x[0]) * cos(PI3 * x[0]); grad[n - 1] += b + a * 2 * PI2 * sin(PI2 * x[n - 1]) * cos(PI2 * x[n - 1]); } for (i = 0; i < n - 1; ++i) { a = x[i] - 1; b = 1 + sqr(sin(PI3 * x[i + 1])); f += sqr(a) * b; if (grad) { grad[i] += 2 * a * b; grad[i + 1] += 2 * PI3 * sqr(a) * sin(PI3 * x[i + 1]) * cos(PI3 * x[i + 1]); } } RETURN(f); } static const double levy_lb[7] = { -5, -5, -5, -5, -5, -5, -5 }; static const double levy_ub[7] = { 5, 5, 5, 5, 5, 5, 5 }; static const double levy_xmin[7] = { 1, 1, 1, 1, 1, 1, -4.75440246 }; static const double levy4_lb[4] = { -10, -10, -10, -10 }; static const double levy4_ub[4] = { 10, 10, 10, 10 }; static const double levy4_xmin[4] = { 1, 1, 1, -9.75235596 }; /****************************************************************************/ static double griewank_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double f = 1, p = 1; UNUSED(data); for (i = 0; i < n; ++i) { f += sqr(x[i]) * 0.00025; p *= cos(x[i] / sqrt(i + 1.)); if (grad) grad[i] = x[i] * 0.0005; } f -= p; if (grad) for (i = 0; i < n; ++i) grad[i] += p * tan(x[i] / sqrt(i + 1.)) / sqrt(i + 1.); RETURN(f); } static const double griewank_lb[10] = { -500, -500, -500, -500, -500, -500, -500, -500, -500, -500 }; static const double griewank_ub[10] = { 600, 600, 600, 600, 600, 600, 600, 600, 600, 600 }; static const double griewank_xmin[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /****************************************************************************/ static double sixhumpcamel_f(unsigned n, const double *x, double *grad, void *data) { UNUSED(data); if (grad) { grad[0] = 8 * x[0] - 2.1 * 4 * pow(x[0], 3.) + 2 * pow(x[0], 5.) + x[1]; grad[1] = x[0] - 8 * x[1] + 16 * pow(x[1], 3.); } RETURN(4 * sqr(x[0]) - 2.1 * pow(x[0], 4.) + pow(x[0], 6.) / 3. + x[0] * x[1] - 4 * sqr(x[1]) + 4 * pow(x[1], 4.)); } static const double sixhumpcamel_lb[2] = { -5, -5 }; static const double sixhumpcamel_ub[2] = { 5, 5 }; static const double sixhumpcamel_xmin[2] = { 0.08984201317, -0.7126564032 }; /****************************************************************************/ static double convexcosh_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double f = 1; UNUSED(data); for (i = 0; i < n; ++i) f *= cosh((x[i] - i) * (i + 1)); if (grad) for (i = 0; i < n; ++i) grad[i] = f * tanh((x[i] - i) * (i + 1)) * (i + 1); RETURN(f); } static const double convexcosh_lb[10] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const double convexcosh_ub[10] = { 2, 3, 6, 7, 8, 10, 11, 13, 14, 16 }; static const double convexcosh_xmin[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; /****************************************************************************/ static double branin_f(unsigned n, const double *x, double *grad, void *data) { double a = 1 - 2 * x[1] + 0.05 * sin(PI4 * x[1]) - x[0]; double b = x[1] - 0.5 * sin(PI2 * x[0]); UNUSED(data); if (grad) { grad[0] = -2 * a - cos(PI2 * x[0]) * PI2 * b; grad[1] = 2 * a * (0.05 * PI4 * cos(PI4 * x[1]) - 2) + 2 * b; } RETURN(sqr(a) + sqr(b)); } static const double branin_lb[2] = { -10, -10 }; static const double branin_ub[2] = { 10, 10 }; static const double branin_xmin[2] = { 1, 0 }; /****************************************************************************/ static double shubert_f(unsigned n, const double *x, double *grad, void *data) { unsigned i, j; double f = 0; UNUSED(data); for (j = 1; j <= 5; ++j) for (i = 0; i < n; ++i) f -= j * sin((j + 1) * x[i] + j); if (grad) { for (i = 0; i < n; ++i) { grad[i] = 0; for (j = 1; j <= 5; ++j) grad[i] -= j * (j + 1) * cos((j + 1) * x[i] + j); } } RETURN(f); } static const double shubert_lb[2] = { -10, -10 }; static const double shubert_ub[2] = { 10, 10 }; static const double shubert_xmin[2] = { -6.774576143, -6.774576143 }; /****************************************************************************/ static double hansen_f(unsigned n, const double *x, double *grad, void *data) { unsigned i; double a = 0, b = 0; UNUSED(data); for (i = 1; i <= 5; ++i) a += i * cos((i - 1) * x[0] + i); for (i = 1; i <= 5; ++i) b += i * cos((i + 1) * x[1] + i); if (grad) { grad[0] = 0; for (i = 1; i <= 5; ++i) grad[0] -= i * (i - 1) * sin((i - 1) * x[0] + i); grad[0] *= b; grad[1] = 0; for (i = 1; i <= 5; ++i) grad[1] -= i * (i + 1) * sin((i + 1) * x[1] + i); grad[1] *= a; } RETURN(a * b); } static const double hansen_lb[2] = { -10, -10 }; static const double hansen_ub[2] = { 10, 10 }; static const double hansen_xmin[2] = { -1.306707704, -1.425128429 }; /****************************************************************************/ static double osc1d_f(unsigned n, const double *x, double *grad, void *data) { double y = *x - 1.23456789; UNUSED(data); if (grad) grad[0] = y * 0.02 + sin(y - 2 * sin(3 * y)) * (1 - 6 * cos(3 * y)); RETURN(sqr(y * 0.1) - cos(y - 2 * sin(3 * y))); } static const double osc1d_lb[1] = { -5 }; static const double osc1d_ub[1] = { 5 }; static const double osc1d_xmin[1] = { 1.23456789 }; /****************************************************************************/ static double corner4d_f(unsigned n, const double *x, double *grad, void *data) { double u = x[0] + x[1] * x[2] * sin(2 * x[3]); double v = x[0] + 2 * sin(u); UNUSED(data); UNUSED(n); if (grad) { grad[0] = 2 * v * (1 + 2 * cos(u)); grad[1] = 2 * v * 2 * cos(u) * x[2] * sin(2 * x[3]) + 0.1; grad[2] = 2 * v * 2 * cos(u) * x[1] * sin(2 * x[3]) + 0.1; grad[3] = 2 * v * 2 * cos(u) * x[1] * x[2] * cos(2 * x[3]) * 2 + 0.1; } RETURN(1 + v * v + 0.1 * (x[1] + x[2] + x[3])); } static const double corner4d_lb[4] = { 0, 0, 0, 0 }; static const double corner4d_ub[4] = { 1, 1, 1, 1 }; static const double corner4d_xmin[4] = { 0, 0, 0, 0 }; /****************************************************************************/ static double side4d_f(unsigned n, const double *x, double *grad, void *data) { double x0, x1, x2, x3, d0, d1, d2, d3; const double w0 = 0.1, w1 = 0.2, w2 = 0.3, w3 = 0.4; UNUSED(data); UNUSED(n); x0 = +0.4977 * x[0] - 0.3153 * x[1] - 0.5066 * x[2] - 0.4391 * x[3]; x1 = -0.3153 * x[0] + 0.3248 * x[1] - 0.4382 * x[2] - 0.4096 * x[3]; x2 = -0.5066 * x[0] - 0.4382 * x[1] + 0.3807 * x[2] - 0.4543 * x[3]; x3 = -0.4391 * x[0] - 0.4096 * x[1] - 0.4543 * x[2] + 0.5667 * x[3]; d0 = -1. / (x0 * x0 + w0 * w0); d1 = -1. / (x1 * x1 + w1 * w1); d2 = -1. / (x2 * x2 + w2 * w2); d3 = -1. / (x3 * x3 + w3 * w3); if (grad) { grad[0] = 2 * (x0 * d0 * d0 * +0.4977 + x1 * d1 * d1 * -0.3153 + x2 * d2 * d2 * -0.5066 + x3 * d3 * d3 * -0.4391); grad[1] = 2 * (x0 * d0 * d0 * -0.3153 + x1 * d1 * d1 * +0.3248 + x2 * d2 * d2 * -0.4382 + x3 * d3 * d3 * -0.4096); grad[2] = 2 * (x0 * d0 * d0 * -0.5066 + x1 * d1 * d1 * -0.4382 + x2 * d2 * d2 * +0.3807 + x3 * d3 * d3 * -0.4543); grad[3] = 2 * (x0 * d0 * d0 * -0.4391 + x1 * d1 * d1 * -0.4096 + x2 * d2 * d2 * -0.4543 + x3 * d3 * d3 * +0.5667); } RETURN(d0 + d1 + d2 + d3); } static const double side4d_lb[4] = { 0.1, -1, -1, -1 }; static const double side4d_ub[4] = { 1, 1, 1, 1 }; static const double side4d_xmin[4] = { 0.1, 0.102971169, 0.0760520641, -0.0497098571 }; /****************************************************************************/ /****************************************************************************/ const testfunc testfuncs[NTESTFUNCS] = { {rosenbrock_f, NULL, 1, 2, rosenbrock_lb, rosenbrock_ub, rosenbrock_xmin, 0.0, "Rosenbrock function"}, {mccormic_f, NULL, 1, 2, mccormic_lb, mccormic_ub, mccormic_xmin, -1.91322295, "McCormic function"}, {boxbetts_f, NULL, 1, 3, boxbetts_lb, boxbetts_ub, boxbetts_xmin, 0.0, "Box and Betts exponential quadratic sum"}, {paviani_f, NULL, 1, 10, paviani_lb, paviani_ub, paviani_xmin, -45.7784697, "Paviani function"}, {grosenbrock_f, NULL, 1, 30, grosenbrock_lb, grosenbrock_ub, grosenbrock_xmin, 0.0, "Generalized Rosenbrock function"}, {goldsteinprice_f, NULL, 1, 2, goldsteinprice_lb, goldsteinprice_ub, goldsteinprice_xmin, 3.0, "Goldstein and Price function"}, {shekel_f, shekel_m + 0, 1, 4, shekel_lb, shekel_ub, shekel0_xmin, -10.15319968, "Shekel m=5 function"}, {shekel_f, shekel_m + 1, 1, 4, shekel_lb, shekel_ub, shekel1_xmin, -10.40294057, "Shekel m=7 function"}, {shekel_f, shekel_m + 2, 1, 4, shekel_lb, shekel_ub, shekel2_xmin, -10.53640982, "Shekel m=10 function"}, {levy_f, NULL, 1, 4, levy4_lb, levy4_ub, levy4_xmin, -21.50235596, "Levy n=4 function"}, {levy_f, NULL, 1, 5, levy_lb, levy_ub, levy_xmin + 2, -11.50440302, "Levy n=5 function"}, {levy_f, NULL, 1, 6, levy_lb, levy_ub, levy_xmin + 1, -11.50440302, "Levy n=6 function"}, {levy_f, NULL, 1, 7, levy_lb, levy_ub, levy_xmin, -11.50440302, "Levy n=7 function"}, {griewank_f, NULL, 1, 10, griewank_lb, griewank_ub, griewank_xmin, 0.0, "Griewank function"}, {sixhumpcamel_f, NULL, 1, 2, sixhumpcamel_lb, sixhumpcamel_ub, sixhumpcamel_xmin, -1.031628453, "Six-hump camel back function"}, {convexcosh_f, NULL, 1, 10, convexcosh_lb, convexcosh_ub, convexcosh_xmin, 1.0, "Convex product of cosh functions"}, {branin_f, NULL, 1, 2, branin_lb, branin_ub, branin_xmin, -.0, "Branin function"}, {shubert_f, NULL, 1, 2, shubert_lb, shubert_ub, shubert_xmin, -24.06249888, "Shubert function"}, {hansen_f, NULL, 1, 2, hansen_lb, hansen_ub, hansen_xmin, -176.5417931367, "Hansen function"}, {osc1d_f, NULL, 1, 1, osc1d_lb, osc1d_ub, osc1d_xmin, -1.0, "1d oscillating function with a single minimum"}, {corner4d_f, NULL, 1, 4, corner4d_lb, corner4d_ub, corner4d_xmin, 1.0, "4d function with minimum at corner"}, {side4d_f, NULL, 1, 4, side4d_lb, side4d_ub, side4d_xmin, -141.285020472, "4d function with minimum at side"} }; stevengj-nlopt-88c424d/test/testfuncs.h000066400000000000000000000011521521061417600202030ustar00rootroot00000000000000#ifndef TESTFUNCS_H #define TESTFUNCS_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "nlopt.h" typedef struct { nlopt_func f; void *f_data; int has_gradient; int n; const double *lb, *ub, *xmin; double minf; const char *name; } testfunc; #define NTESTFUNCS 22 extern const testfunc testfuncs[NTESTFUNCS]; extern int testfuncs_verbose; extern int testfuncs_counter; #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif stevengj-nlopt-88c424d/test/testopt.c000066400000000000000000000342261521061417600176720ustar00rootroot00000000000000/* Copyright (c) 2007-2011 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "nlopt_config.h" #ifdef HAVE_UNISTD_H # include #endif #if defined(HAVE_GETOPT_H) && defined(HAVE_GETOPT) # include #else # include "nlopt-getopt.h" #endif #define USE_FEENABLEEXCEPT 0 #if USE_FEENABLEEXCEPT # include extern "C" int feenableexcept(int EXCEPTS); #endif #include "nlopt.h" #include "nlopt-util.h" #include "testfuncs.h" static nlopt_algorithm algorithm = NLOPT_GN_DIRECT_L; static double ftol_rel = 0, ftol_abs = 0, xtol_rel = 0, xtol_abs = 0, minf_max_delta; static double initial_step = 0; static int maxeval = 1000, iterations = 1, center_start = 0; static double maxtime = 0.0; static double xinit_tol = -1; static int force_constraints = 0; static int fix_bounds[100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static void listalgs(FILE * f) { int i; fprintf(f, "Available algorithms:\n"); for (i = 0; i < NLOPT_NUM_ALGORITHMS; ++i) fprintf(f, " %2d: %s\n", i, nlopt_algorithm_name((nlopt_algorithm) i)); } static void listfuncs(FILE * f) { int i; fprintf(f, "Available objective functions:\n"); for (i = 0; i < NTESTFUNCS; ++i) fprintf(f, " %2d: %s (%d dims)\n", i, testfuncs[i].name, testfuncs[i].n); } typedef struct { const double *lb, *ub; nlopt_func f; void *f_data; } bounds_wrap_data; static double bounds_wrap_func(unsigned n, const double *x, double *grad, void *d_) { bounds_wrap_data *d = (bounds_wrap_data *) d_; unsigned i; double b = 0; for (i = 0; i < n; ++i) { if (x[i] < d->lb[i]) { b = d->lb[i]; break; } else if (x[i] > d->ub[i]) { b = d->ub[i]; break; } } if (i < n) fprintf(stderr, "WARNING: bounds violated by x[%u] = %g = %g + %g\n", i, x[i], b, x[i] - b); return d->f(n, x, grad, d->f_data); } static int test_function(int ifunc) { nlopt_opt opt; testfunc func; int i, iter; double *x, minf, minf_max, f0, *xtabs, *lb, *ub; nlopt_result ret; double start = nlopt_seconds(); int total_count = 0, max_count = 0, min_count = 1 << 30; double total_err = 0, max_err = 0; bounds_wrap_data bw; if (ifunc < 0 || ifunc >= NTESTFUNCS) { fprintf(stderr, "testopt: invalid function %d\n", ifunc); listfuncs(stderr); return 0; } func = testfuncs[ifunc]; x = (double *) malloc(sizeof(double) * func.n * 5); if (!x) { fprintf(stderr, "testopt: Out of memory!\n"); return 0; } lb = x + func.n * 3; ub = lb + func.n; xtabs = x + func.n * 2; bw.lb = lb; bw.ub = ub; bw.f = func.f; bw.f_data = func.f_data; for (i = 0; i < func.n; ++i) xtabs[i] = xtol_abs; minf_max = minf_max_delta > (-HUGE_VAL) ? minf_max_delta + func.minf : (-HUGE_VAL); printf("-----------------------------------------------------------\n"); printf("Optimizing %s (%d dims) using %s algorithm\n", func.name, func.n, nlopt_algorithm_name(algorithm)); printf("lower bounds at lb = ["); for (i = 0; i < func.n; ++i) printf(" %g", func.lb[i]); printf("]\n"); printf("upper bounds at ub = ["); for (i = 0; i < func.n; ++i) printf(" %g", func.ub[i]); printf("]\n"); memcpy(lb, func.lb, func.n * sizeof(double)); memcpy(ub, func.ub, func.n * sizeof(double)); for (i = 0; i < func.n; ++i) if (fix_bounds[i]) { printf("fixing bounds for dim[%d] to xmin[%d]=%g\n", i, i, func.xmin[i]); lb[i] = ub[i] = func.xmin[i]; } if (force_constraints) { for (i = 0; i < func.n; ++i) { if (nlopt_iurand(2) == 0) ub[i] = nlopt_urand(lb[i], func.xmin[i]); else lb[i] = nlopt_urand(func.xmin[i], ub[i]); } printf("adjusted lower bounds at lb = ["); for (i = 0; i < func.n; ++i) printf(" %g", lb[i]); printf("]\n"); printf("adjusted upper bounds at ub = ["); for (i = 0; i < func.n; ++i) printf(" %g", ub[i]); printf("]\n"); } if (fabs(func.f(func.n, func.xmin, 0, func.f_data) - func.minf) > 1e-8) { fprintf(stderr, "BUG: function does not achieve given lower bound!\n"); fprintf(stderr, "f(%g", func.xmin[0]); for (i = 1; i < func.n; ++i) fprintf(stderr, ", %g", func.xmin[i]); fprintf(stderr, ") = %0.16g instead of %0.16g, |diff| = %g\n", func.f(func.n, func.xmin, 0, func.f_data), func.minf, fabs(func.f(func.n, func.xmin, 0, func.f_data) - func.minf)); free(x); return 0; } for (iter = 0; iter < iterations; ++iter) { double val; testfuncs_counter = 0; printf("Starting guess x = ["); for (i = 0; i < func.n; ++i) { if (center_start) x[i] = (ub[i] + lb[i]) * 0.5; else if (xinit_tol < 0) { /* random starting point near center of box */ double dx = (ub[i] - lb[i]) * 0.25; double xm = 0.5 * (ub[i] + lb[i]); x[i] = nlopt_urand(xm - dx, xm + dx); } else { x[i] = nlopt_urand(-xinit_tol, xinit_tol) + (1 + nlopt_urand(-xinit_tol, xinit_tol)) * func.xmin[i]; if (x[i] > ub[i]) x[i] = ub[i]; else if (x[i] < lb[i]) x[i] = lb[i]; } printf(" %g", x[i]); } printf("]\n"); f0 = func.f(func.n, x, x + func.n, func.f_data); printf("Starting function value = %g\n", f0); if (iter == 0 && testfuncs_verbose && func.has_gradient) { printf("checking gradient:\n"); for (i = 0; i < func.n; ++i) { double f; x[i] *= 1 + 1e-6; f = func.f(func.n, x, NULL, func.f_data); x[i] /= 1 + 1e-6; printf(" grad[%d] = %g vs. numerical derivative %g\n", i, x[i + func.n], (f - f0) / (x[i] * 1e-6)); } } testfuncs_counter = 0; opt = nlopt_create(algorithm, func.n); nlopt_set_min_objective(opt, bounds_wrap_func, &bw); nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); nlopt_set_stopval(opt, minf_max); nlopt_set_ftol_rel(opt, ftol_rel); nlopt_set_ftol_abs(opt, ftol_abs); nlopt_set_xtol_rel(opt, xtol_rel); nlopt_set_xtol_abs(opt, xtabs); nlopt_set_maxeval(opt, maxeval); nlopt_set_maxtime(opt, maxtime); if (initial_step != 0) nlopt_set_initial_step1(opt, initial_step); ret = nlopt_optimize(opt, x, &minf); printf("finished after %g seconds.\n", nlopt_seconds() - start); printf("return code %d from nlopt_minimize\n", ret); if (ret < 0 && ret != NLOPT_ROUNDOFF_LIMITED && ret != NLOPT_FORCED_STOP) { fprintf(stderr, "testopt: error in nlopt_minimize\n"); free(x); return 0; } printf("Found minimum f = %g after %d evaluations (numevals = %d).\n", minf, testfuncs_counter, nlopt_get_numevals(opt)); nlopt_destroy(opt); total_count += testfuncs_counter; if (testfuncs_counter > max_count) max_count = testfuncs_counter; if (testfuncs_counter < min_count) min_count = testfuncs_counter; printf("Minimum at x = ["); for (i = 0; i < func.n; ++i) printf(" %g", x[i]); printf("]\n"); if (func.minf == 0) printf("|f - minf| = %g\n", fabs(minf - func.minf)); else printf("|f - minf| = %g, |f - minf| / |minf| = %e\n", fabs(minf - func.minf), fabs(minf - func.minf) / fabs(func.minf)); total_err += fabs(minf - func.minf); if (fabs(minf - func.minf) > max_err) max_err = fabs(minf - func.minf); printf("vs. global minimum f = %g at x = [", func.minf); for (i = 0; i < func.n; ++i) printf(" %g", func.xmin[i]); printf("]\n"); val = func.f(func.n, x, NULL, func.f_data); if (fabs(val - minf) > 1e-12) { fprintf(stderr, "Mismatch %g between returned minf=%g and f(x) = %g\n", minf - val, minf, val); free(x); return 0; } } if (iterations > 1) printf("average #evaluations = %g (%d-%d)\naverage |f-minf| = %g, max |f-minf| = %g\n", total_count * 1.0 / iterations, min_count, max_count, total_err / iterations, max_err); free(x); return 1; } static void usage(FILE * f) { fprintf(f, "Usage: testopt [OPTIONS]\n" "Options:\n" " -h : print this help\n" " -L : list available algorithms and objective functions\n" " -v : verbose mode\n" " -a : use optimization algorithm \n" " -o : use objective function \n" " -0 : starting guess within + (1+) * optimum\n" " -S : initial step size dx (default: none)\n" " -b : eliminate given dims by equating bounds\n"); fprintf(f, " -c : starting guess at center of cell\n" " -C : put optimum outside of bound constraints\n" " -e : use at most evals (default: %d, 0 to disable)\n" " -t : use at most seconds (default: disabled)\n" " -x : relative tolerance on x (default: disabled)\n" " -X : absolute tolerance on x (default: disabled)\n", maxeval); fprintf(f, " -f : relative tolerance on f (default: disabled)\n" " -F : absolute tolerance on f (default: disabled)\n" " -m : stop when minf+ is reached (default: disabled)\n" " -i : iterate optimization times (default: 1)\n" " -r : use random seed for starting guesses\n"); } int main(int argc, char **argv) { int c; nlopt_srand_time(); testfuncs_verbose = 0; minf_max_delta = -HUGE_VAL; if (argc <= 1) usage(stdout); #if USE_FEENABLEEXCEPT feenableexcept(FE_INVALID); #endif while ((c = getopt(argc, argv, "hLvVCc0:r:a:o:i:e:t:x:X:f:F:m:b:S:")) != -1) switch (c) { case 'h': usage(stdout); return EXIT_SUCCESS; case 'L': listalgs(stdout); listfuncs(stdout); return EXIT_SUCCESS; case 'v': testfuncs_verbose = 1; break; case 'V': { int major, minor, patch; nlopt_version(&major, &minor, &patch); printf("NLopt version %d.%d.%d\n", major, minor, patch); return EXIT_SUCCESS; } case 'C': force_constraints = 1; break; case 'r': nlopt_srand((unsigned long) atoi(optarg)); break; case 'a': c = atoi(optarg); if (c < 0 || c >= NLOPT_NUM_ALGORITHMS) { fprintf(stderr, "testopt: invalid algorithm %d\n", c); listalgs(stderr); return EXIT_FAILURE; } algorithm = (nlopt_algorithm) c; break; case 'o': if (!test_function(atoi(optarg))) return EXIT_FAILURE; break; case 'e': maxeval = atoi(optarg); break; case 'i': iterations = atoi(optarg); break; case 't': maxtime = atof(optarg); break; case 'x': xtol_rel = atof(optarg); break; case 'X': xtol_abs = atof(optarg); break; case 'f': ftol_rel = atof(optarg); break; case 'F': ftol_abs = atof(optarg); break; case 'm': minf_max_delta = atof(optarg); break; case 'c': center_start = 1; break; case '0': center_start = 0; xinit_tol = atof(optarg); break; case 'S': initial_step = atof(optarg); break; case 'b':{ const char *s = optarg; while (s && *s) { int b = atoi(s); if (b < 0 || b >= 100) { fprintf(stderr, "invalid -b argument"); return EXIT_FAILURE; } fix_bounds[b] = 1; s = strchr(s, ','); if (s) ++s; } break; } default: fprintf(stderr, "harminv: invalid argument -%c\n", c); usage(stderr); return EXIT_FAILURE; } return EXIT_SUCCESS; }